155 lines
4.9 KiB
PowerShell
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 |