$ErrorActionPreference = "Stop" $Project = Join-Path $PSScriptRoot "brain-h5" $Launcher = Join-Path $Project "scripts\start-local.cmd" $LocalUrl = "http://127.0.0.1:4173/" $LanIp = ([System.Net.Dns]::GetHostAddresses([System.Net.Dns]::GetHostName()) | Where-Object { $_.AddressFamily -eq [System.Net.Sockets.AddressFamily]::InterNetwork -and $_.IPAddressToString -notlike "127.*" -and $_.IPAddressToString -notlike "169.254.*" } | Select-Object -First 1).IPAddressToString $PhoneUrl = if ($LanIp) { "http://$LanIp`:4173/" } else { "" } if (-not (Test-Path -LiteralPath $Project)) { throw "Project folder not found: $Project" } if (-not (Test-Path -LiteralPath $Launcher)) { throw "Launcher not found: $Launcher" } Write-Host "Starting Brain H5..." Write-Host "Project: $Project" Write-Host "Computer url: $LocalUrl" if ($PhoneUrl) { Write-Host "Phone url on same Wi-Fi: $PhoneUrl" } $server = [System.Diagnostics.ProcessStartInfo]::new() $server.FileName = "cmd.exe" $server.Arguments = "/k `"$Launcher`"" $server.WorkingDirectory = $Project $server.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Minimized $server.UseShellExecute = $true [System.Diagnostics.Process]::Start($server) | Out-Null $deadline = (Get-Date).AddMinutes(6) do { try { $response = Invoke-WebRequest -UseBasicParsing -Uri $LocalUrl -TimeoutSec 2 if ($response.StatusCode -eq 200) { Write-Host "Brain H5 is ready. Opening browser..." Write-Host "Computer url: $LocalUrl" if ($PhoneUrl) { Write-Host "Phone url on same Wi-Fi: $PhoneUrl" } Start-Process $LocalUrl exit 0 } } catch { Start-Sleep -Seconds 1 } } while ((Get-Date) -lt $deadline) Write-Host "" Write-Host "Startup timed out. Check the minimized server window for errors." Write-Host "You can also open this URL after the server is ready: $LocalUrl" if ($PhoneUrl) { Write-Host "Phone url on same Wi-Fi: $PhoneUrl" } exit 1