param( [int]$TimeoutSeconds = 90, [switch]$OpenBrowser ) . "$PSScriptRoot\env.ps1" function Wait-HttpReady { param( [Parameter(Mandatory = $true)] [string]$Name, [Parameter(Mandatory = $true)] [string]$Url, [Parameter(Mandatory = $true)] [datetime]$Deadline ) Write-Host "Waiting for ${Name}: $Url" while ((Get-Date) -lt $Deadline) { try { $response = Invoke-WebRequest -UseBasicParsing -Uri $Url -TimeoutSec 2 if ($response.StatusCode -ge 200 -and $response.StatusCode -lt 500) { Write-Host "$Name is ready: $Url" return } } catch { Start-Sleep -Milliseconds 700 } } throw "Timed out waiting for ${Name}: $Url" } & "$PSScriptRoot\start-all.ps1" if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } $deadline = (Get-Date).AddSeconds($TimeoutSeconds) Wait-HttpReady -Name "backend" -Url "$BackendPublicBaseUrl/api/health" -Deadline $deadline Wait-HttpReady -Name "frontend" -Url "$FrontendPublicBaseUrl/" -Deadline $deadline Write-Host "" Write-Host "DeerFlow is ready." Write-Host "Frontend: $FrontendPublicBaseUrl/" Write-Host "Backend: $BackendPublicBaseUrl" Write-Host "" Write-Host "Logs:" Write-Host " Backend: $(Join-Path $LogDir 'backend.log')" Write-Host " Frontend: $(Join-Path $LogDir 'frontend.log')" if ($OpenBrowser) { Start-Process "$FrontendPublicBaseUrl/" }