Files
OpenQode/start-unified.ps1
2025-12-14 00:40:14 +04:00

155 lines
4.9 KiB
PowerShell

# OpenQode Unified Startup Script
# Starts both frontend and backend with proper instance management
param(
[int]$Port = 0
)
# Function to check and kill existing OpenQode processes
function Stop-ExistingInstances {
Write-Host "Checking for existing OpenQode processes..." -ForegroundColor Yellow
# Get all node processes and check if they're running OpenQode server.js
$nodeProcesses = Get-Process node -ErrorAction SilentlyContinue
if ($nodeProcesses) {
foreach ($proc in $nodeProcesses) {
try {
$cmdLine = $proc.CommandLine
if ($cmdLine -and $cmdLine -like "*server.js*") {
Stop-Process -Id $proc.Id -Force
Write-Host "Stopped process ID: $($proc.Id)" -ForegroundColor Green
}
} catch {
# Process might already be stopped
}
}
}
}
# Function to find a free port
function Get-FreePort {
param([int]$StartPort = 3000)
$port = $StartPort
while ($port -le 65535) {
$portOpen = $false
try {
$listener = [System.Net.Sockets.TcpListener]::new([System.Net.IPAddress]::Loopback, $port)
$listener.Start()
$listener.Stop()
} catch {
$portOpen = $true
}
if (-not $portOpen) {
return $port
}
$port++
}
return 3000 # Default fallback
}
# Main script starts here
$OpenQodeDir = Split-Path -Parent $MyInvocation.MyCommand.Path
$ServerPath = Join-Path $OpenQodeDir "server.js"
Write-Host "OpenQode Unified Startup v1.01" -ForegroundColor Cyan
Write-Host "=================================" -ForegroundColor Cyan
if ($Port -eq 0) {
$PortInput = Read-Host "Enter port for Web GUI (default: 3000, or press Enter for auto)"
if ([string]::IsNullOrWhiteSpace($PortInput)) {
$Port = 3000
Write-Host "Using default port: $Port" -ForegroundColor Yellow
} elseif (-not [int]::TryParse($PortInput, [ref][int]$null)) {
Write-Host "Invalid port number. Using default port 3000." -ForegroundColor Yellow
$Port = 3000
} else {
$Port = [int]$PortInput
}
}
# Check if port is available
$FreePort = Get-FreePort $Port
if ($FreePort -ne $Port) {
Write-Host "Port $Port is already in use. Using available port: $FreePort" -ForegroundColor Yellow
$Port = $FreePort
} else {
Write-Host "Using port: $Port" -ForegroundColor Green
}
# Stop existing instances
Stop-ExistingInstances
# Check if Node.js is available
try {
node --version 2>$null | Out-Null
if ($LASTEXITCODE -ne 0) {
throw "Node.js not found"
}
} catch {
Write-Host "[ERROR] Node.js is required but not found." -ForegroundColor Red
Write-Host "Please install Node.js from https://nodejs.org/" -ForegroundColor Yellow
pause
exit 1
}
Write-Host ""
Write-Host "Starting OpenQode backend server on port $Port..." -ForegroundColor Green
# Start the server in a background job
$ServerJob = Start-Job -ScriptBlock {
param($ServerPath, $Port)
Set-Location (Split-Path $ServerPath -Parent)
node $ServerPath $Port
} -ArgumentList $ServerPath, $Port
# Wait a moment for server to start
Write-Host "Waiting for server to initialize..." -ForegroundColor Yellow
Start-Sleep -Seconds 5
# Verify server is running
$ServerRunning = $false
try {
$response = Invoke-WebRequest -Uri "http://localhost:$Port" -TimeoutSec 10 -UseBasicParsing -ErrorAction Stop
$ServerRunning = $true
Write-Host "Server is running and responding!" -ForegroundColor Green
} catch {
Write-Host "Server might still be starting up, continuing..." -ForegroundColor Yellow
Start-Sleep -Seconds 3
$ServerRunning = $true # Assume it's starting up
}
if ($ServerRunning) {
$Url = "http://localhost:$Port"
Write-Host "Opening OpenQode Web Interface at: $Url" -ForegroundColor Green
Start-Process $Url
Write-Host ""
Write-Host "OpenQode is now running!" -ForegroundColor Cyan
Write-Host "Backend: http://localhost:$Port" -ForegroundColor Cyan
Write-Host "Frontend: http://localhost:$Port" -ForegroundColor Cyan
Write-Host ""
Write-Host "Press Ctrl+C in this window to stop the server." -ForegroundColor Gray
Write-Host "Server PID: $($ServerJob.Id)" -ForegroundColor Gray
Write-Host ""
try {
# Wait for the server job (this will block until the job is stopped)
Wait-Job $ServerJob
} catch {
Write-Host "Error occurred: $($_.Exception.Message)" -ForegroundColor Red
}
} else {
Write-Host "Server failed to start properly." -ForegroundColor Red
}
# Cleanup
if ($ServerJob) {
Stop-Job $ServerJob -ErrorAction SilentlyContinue
Remove-Job $ServerJob -ErrorAction SilentlyContinue
}
Write-Host ""
Write-Host "OpenQode server stopped." -ForegroundColor Cyan
Write-Host "Goodbye!" -ForegroundColor Green