Files
NexusOS/launch_nexus.ps1
T
janvanwan 42eaed647a feat: sync with upstream — v1.2.0, in-app updates, Projects, modules
Brings the public tree back in line with the development repo after several
weeks of drift caused by a stale publish include list.

New:
- In-app update path: GET /update/check compares the checkout against
  origin/main and POST /update/apply runs `ncp upgrade` detached (pull,
  rebuild, restart). The sidebar shows the version, checks on click, and
  offers an "update available" pill.
- Projects: a project workspace groups chats and RAG documents, with
  per-project instructions and document retrieval scoped to the active
  project. Replaces the standalone Documents page.
- modules/: auto-discovered feature plugins (mail, network) with their
  frontend counterparts and tests.
- Memory curation runs in-process (synapse/memory/curator.py) on the chat
  model when a conversation goes idle. The separate memory service on :8001
  is gone, along with the launcher lines that started it.

Also: the KDE theme, panel and Promethean terminal assets, the full test
suite, and VERSION 1.2.0.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
2026-08-25 09:13:55 -05:00

72 lines
3.4 KiB
PowerShell

# 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 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.
$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 the backend still
# coming up. bin\nexus_window.py opens on its own loading page and polls
# :8000 itself, updating that page's status line live as it
# 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() }
# Shut the services down.
Write-Host "Stopping NexusOS..." -ForegroundColor Cyan
foreach ($p in @($backend)) {
if ($p -and -not $p.HasExited) { Stop-Process -Id $p.Id -Force -ErrorAction SilentlyContinue }
}