# NexusOS launcher for Windows (native, no Vite). # # Single-process app: the backend on :8000 serves the built web UI itself, so # this starts only the memory service + backend, opening a native app window # (bin\nexus_window.py, pywebview/WebView2) immediately alongside them with its # own live-updating loading screen. The AI (Ollama) does NOT auto-start - turn # it on from the UI's Start AI button. Closing the app window stops the # services. # # Right-click -> Run with PowerShell (or: powershell -File launch_nexus.ps1) $ErrorActionPreference = "Stop" $ProgressPreference = "SilentlyContinue" # Invoke-WebRequest's progress bar adds real latency for no benefit here $Root = $PSScriptRoot $Py = Join-Path $Root "Promethean\Scripts\python.exe" if (-not (Test-Path $Py)) { $Py = "python" } # fall back to PATH $PyW = Join-Path $Root "Promethean\Scripts\pythonw.exe" if (-not (Test-Path $PyW)) { $PyW = "pythonw" } # fall back to PATH $Runtime = Join-Path $Root "runtime" $Logs = Join-Path $Runtime "logs" New-Item -ItemType Directory -Force -Path $Runtime, $Logs | Out-Null function Start-Svc($log, $argList) { return Start-Process -FilePath $Py -ArgumentList $argList ` -WorkingDirectory $Root -WindowStyle Hidden -PassThru ` -RedirectStandardOutput $log -RedirectStandardError "$log.err" } function Test-ServiceUp($url) { try { $r = Invoke-WebRequest -Uri $url -TimeoutSec 2 -UseBasicParsing return $r.StatusCode -eq 200 } catch { return $false } } Write-Host "Starting NexusOS..." -ForegroundColor Cyan # Only reuse a port if something actually answers there. A bare port-listen # check isn't enough: a wedged process left over from a prior crashed launch # can be squatting the port without ever responding, and treating that as # "already running" skips starting a real service - the window then sits on # its loading screen for the full 40s with no way to tell why. $memory = $null if (-not (Test-ServiceUp "http://127.0.0.1:8001/")) { $memory = Start-Svc (Join-Path $Runtime "memory.log") @("-m","uvicorn","synapse.memory.service:app","--host","127.0.0.1","--port","8001") } $backend = $null if (-not (Test-ServiceUp "http://127.0.0.1:8000/status")) { $backend = Start-Svc (Join-Path $Runtime "backend.log") @("-m","uvicorn","synapse.main:sio_app","--host","127.0.0.1","--port","8000") } # Open the UI in a native window (pywebview / WebView2) - no browser, no Edge # profile cold-start - IMMEDIATELY, in parallel with memory/backend still # coming up. bin\nexus_window.py opens on its own loading page and polls # :8001 then :8000 itself, updating that page's status line live as each # comes up, so the window is on screen from the first instant instead of # this script blocking silently (in a hidden window) for up to 30s first and # only then showing anything. It blocks until the window is closed and falls # back to the default browser if WebView2 is unavailable. $WindowScript = Join-Path $Root "bin\nexus_window.py" $app = Start-Process -FilePath $PyW -ArgumentList "`"$WindowScript`"" ` -WorkingDirectory $Root -PassThru Write-Host "NexusOS window opened; services are starting at http://localhost:8000 (AI is off - start it in the UI)" -ForegroundColor Green # Block until the app window (or a service we started) exits, so this process # stays alive to hold and later stop the services. No blind Read-Host: the # shortcut runs hidden, where a prompt no one can answer would hang forever. if ($app) { $app.WaitForExit() } elseif ($backend) { $backend.WaitForExit() } elseif ($memory) { $memory.WaitForExit() } # Shut the services down. Write-Host "Stopping NexusOS..." -ForegroundColor Cyan foreach ($p in @($backend, $memory)) { if ($p -and -not $p.HasExited) { Stop-Process -Id $p.Id -Force -ErrorAction SilentlyContinue } }