From 138772e66e458acfdc96c4537f4b7181f5da94aa Mon Sep 17 00:00:00 2001 From: Iuliia Ivashko Date: Tue, 17 Feb 2026 18:01:57 +0200 Subject: [PATCH] fix(managed-runtime): secure auth and lifecycle control across runtimes (#437) * feat: add OpenCode server authentication with auto-generated passwords * fix(auth): separate user env and managed OpenCode password state * fix(auth): enforce env precedence and managed password rotation across runtimes * fix(vscode): rotate managed auth on startup and harden webview proxy * build: add dev icons and config for Tauri desktop development * fix(runtime): start managed OpenCode via CLI and expose active API port * fix(managed-runtime): control OpenCode lifecycle and surface secure diagnostics * docs: remove VS Code plugin test runbook --- packages/desktop/scripts/desktop-dev.mjs | 11 +- packages/desktop/src-tauri/Cargo.lock | 2 + packages/desktop/src-tauri/Cargo.toml | 2 +- .../desktop/src-tauri/icons/dev-icon.icns | Bin 0 -> 173094 bytes packages/desktop/src-tauri/icons/dev-icon.png | Bin 0 -> 66751 bytes packages/desktop/src-tauri/src/main.rs | 25 ++ .../desktop/src-tauri/tauri.dev.conf.json | 9 + .../ui/src/components/layout/VSCodeLayout.tsx | 46 ++- packages/ui/src/hooks/useEventStream.ts | 2 +- packages/ui/src/lib/debug.ts | 20 +- packages/ui/src/lib/openCodeStatus.ts | 27 ++ packages/ui/src/stores/messageStore.ts | 14 +- .../vscode/src/AgentManagerPanelProvider.ts | 5 +- packages/vscode/src/ChatViewProvider.ts | 5 +- .../vscode/src/SessionEditorPanelProvider.ts | 5 +- packages/vscode/src/bridge.ts | 10 +- packages/vscode/src/extension.ts | 11 +- packages/vscode/src/opencode.ts | 282 +++++++++++++++--- packages/vscode/src/sessionActivityWatcher.ts | 2 + packages/vscode/webview/main.tsx | 60 +++- packages/web/bin/cli.js | 21 ++ packages/web/server/index.js | 246 +++++++++++++-- 22 files changed, 717 insertions(+), 88 deletions(-) create mode 100644 packages/desktop/src-tauri/icons/dev-icon.icns create mode 100644 packages/desktop/src-tauri/icons/dev-icon.png create mode 100644 packages/desktop/src-tauri/tauri.dev.conf.json diff --git a/packages/desktop/scripts/desktop-dev.mjs b/packages/desktop/scripts/desktop-dev.mjs index a52dfd61..f7315b47 100644 --- a/packages/desktop/scripts/desktop-dev.mjs +++ b/packages/desktop/scripts/desktop-dev.mjs @@ -18,7 +18,16 @@ function spawnProcess(command, args, opts = {}) { } async function main() { - const tauriProcess = spawnProcess('bun', ['--cwd', desktopDir, 'tauri', 'dev', '--features', 'devtools']); + const tauriProcess = spawnProcess('bun', [ + '--cwd', + desktopDir, + 'tauri', + 'dev', + '--features', + 'devtools', + '--config', + './src-tauri/tauri.dev.conf.json', + ]); let cleaning = false; diff --git a/packages/desktop/src-tauri/Cargo.lock b/packages/desktop/src-tauri/Cargo.lock index c4739030..74066bc4 100644 --- a/packages/desktop/src-tauri/Cargo.lock +++ b/packages/desktop/src-tauri/Cargo.lock @@ -1187,6 +1187,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2dff15bf788c671c1934e366d07e30c1814a8ef514e1af724a602e8a2fbe1b10" dependencies = [ "futures-core", + "futures-sink", ] [[package]] @@ -3411,6 +3412,7 @@ checksum = "9d0946410b9f7b082a427e4ef5c8ff541a88b357bc6c637c40db3a68ac70a36f" dependencies = [ "base64 0.22.1", "bytes", + "futures-channel", "futures-core", "futures-util", "http", diff --git a/packages/desktop/src-tauri/Cargo.toml b/packages/desktop/src-tauri/Cargo.toml index fc3715e4..170581a2 100644 --- a/packages/desktop/src-tauri/Cargo.toml +++ b/packages/desktop/src-tauri/Cargo.toml @@ -16,7 +16,7 @@ devtools = ["tauri/devtools"] anyhow = "1.0.86" base64 = "0.22.1" log = "0.4.28" -reqwest = { version = "0.12.4", default-features = false, features = ["rustls-tls"] } +reqwest = { version = "0.12.4", default-features = false, features = ["rustls-tls", "blocking"] } serde = { version = "1.0.210", features = ["derive"] } serde_json = "1.0.143" tauri = { version = "2.9.4", features = ["macos-private-api"] } diff --git a/packages/desktop/src-tauri/icons/dev-icon.icns b/packages/desktop/src-tauri/icons/dev-icon.icns new file mode 100644 index 0000000000000000000000000000000000000000..04ac8d54096e7a3d66a5d9ffec0d34e7399ace29 GIT binary patch literal 173094 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/icons/dev-icon.png b/packages/desktop/src-tauri/icons/dev-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..bab0ca21ca11b65f91c81829863ba035857cb782 GIT binary patch literal 66751 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 ?)ZU+`JF{HUMVq3#D6a;` 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 z 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 literal 0 HcmV?d00001 diff --git a/packages/desktop/src-tauri/src/main.rs b/packages/desktop/src-tauri/src/main.rs index 138633ce..d361738e 100644 --- a/packages/desktop/src-tauri/src/main.rs +++ b/packages/desktop/src-tauri/src/main.rs @@ -1476,10 +1476,27 @@ fn kill_sidecar(app: tauri::AppHandle) { return; }; + let sidecar_url = state.url.lock().expect("sidecar url mutex").clone(); + if let Some(url) = sidecar_url { + let shutdown_url = format!("{}/api/system/shutdown", url.trim_end_matches('/')); + if let Ok(client) = reqwest::blocking::Client::builder() + .no_proxy() + .timeout(Duration::from_millis(1500)) + .build() + { + if let Ok(resp) = client.post(shutdown_url).send() { + if resp.status().is_success() { + std::thread::sleep(Duration::from_millis(100)); + } + } + } + } + let mut guard = state.child.lock().expect("sidecar mutex"); if let Some(child) = guard.take() { let _ = child.kill(); } + *state.url.lock().expect("sidecar url mutex") = None; } fn build_local_url(port: u16) -> String { @@ -1627,6 +1644,7 @@ async fn spawn_local_server(app: &tauri::AppHandle) -> Result { .args(["--port", &port.to_string()]) .env("OPENCHAMBER_HOST", "127.0.0.1") .env("OPENCHAMBER_DIST_DIR", dist_dir.clone()) + .env("OPENCHAMBER_RUNTIME", "desktop") .env("OPENCHAMBER_DESKTOP_NOTIFY", "true") .env("PATH", augmented_path.clone()) .env("NO_PROXY", no_proxy) @@ -1643,6 +1661,13 @@ async fn spawn_local_server(app: &tauri::AppHandle) -> Result { } } + if let Ok(password) = env::var("OPENCODE_SERVER_PASSWORD") { + let trimmed = password.trim(); + if !trimmed.is_empty() { + cmd = cmd.env("OPENCODE_SERVER_PASSWORD", trimmed); + } + } + let (rx, child) = match cmd.spawn() { Ok(v) => v, Err(err) => { diff --git a/packages/desktop/src-tauri/tauri.dev.conf.json b/packages/desktop/src-tauri/tauri.dev.conf.json new file mode 100644 index 00000000..79324ff9 --- /dev/null +++ b/packages/desktop/src-tauri/tauri.dev.conf.json @@ -0,0 +1,9 @@ +{ + "$schema": "../node_modules/@tauri-apps/cli/schema.json", + "bundle": { + "icon": [ + "icons/dev-icon.icns", + "icons/dev-icon.png" + ] + } +} diff --git a/packages/ui/src/components/layout/VSCodeLayout.tsx b/packages/ui/src/components/layout/VSCodeLayout.tsx index a0476ed3..7854e1cb 100644 --- a/packages/ui/src/components/layout/VSCodeLayout.tsx +++ b/packages/ui/src/components/layout/VSCodeLayout.tsx @@ -91,6 +91,19 @@ export const VSCodeLayout: React.FC = () => { return sessions.find((session) => session.id === currentSessionId)?.title || 'Session'; }, [currentSessionId, sessions]); const newSessionDraftOpen = useSessionStore((state) => Boolean(state.newSessionDraft?.open)); + const isSyncingMessages = useSessionStore((state) => state.isSyncing); + const hasActiveSessionWork = useSessionStore((state) => { + const statuses = state.sessionStatus; + if (!statuses || statuses.size === 0) { + return false; + } + for (const status of statuses.values()) { + if (status?.type === 'busy' || status?.type === 'retry') { + return true; + } + } + return false; + }); const openNewSessionDraft = useSessionStore((state) => state.openNewSessionDraft); const [connectionStatus, setConnectionStatus] = React.useState<'connecting' | 'connected' | 'error' | 'disconnected'>( () => (typeof window !== 'undefined' @@ -129,10 +142,37 @@ export const VSCodeLayout: React.FC = () => { return; } - if (!currentSessionId && !newSessionDraftOpen && currentView === 'chat') { - setCurrentView('sessions'); + if (currentView !== 'chat') { + return; } - }, [currentSessionId, newSessionDraftOpen, currentView, viewMode]); + + if (currentSessionId || newSessionDraftOpen || isSyncingMessages || hasActiveSessionWork) { + return; + } + + const timeoutId = window.setTimeout(() => { + const state = useSessionStore.getState(); + const stillNoSession = !state.currentSessionId; + const draftStillClosed = !state.newSessionDraft?.open; + const stillSyncing = state.isSyncing; + const stillActiveWork = (() => { + const statuses = state.sessionStatus; + if (!statuses || statuses.size === 0) return false; + for (const status of statuses.values()) { + if (status?.type === 'busy' || status?.type === 'retry') return true; + } + return false; + })(); + + if (stillNoSession && draftStillClosed && !stillSyncing && !stillActiveWork) { + setCurrentView('sessions'); + } + }, 900); + + return () => { + window.clearTimeout(timeoutId); + }; + }, [currentSessionId, newSessionDraftOpen, currentView, viewMode, isSyncingMessages, hasActiveSessionWork]); const handleBackToSessions = React.useCallback(() => { setCurrentView('sessions'); diff --git a/packages/ui/src/hooks/useEventStream.ts b/packages/ui/src/hooks/useEventStream.ts index fd5a096f..18b07601 100644 --- a/packages/ui/src/hooks/useEventStream.ts +++ b/packages/ui/src/hooks/useEventStream.ts @@ -486,7 +486,7 @@ export const useEventStream = () => { // Note: needs_attention logic is now handled by the server // Server maintains authoritative state based on view tracking and message events - if (prevType !== nextType) { + if (process.env.NODE_ENV === 'development' && prevType !== nextType) { try { console.info('[SESSION-STATUS]', { sessionId, diff --git a/packages/ui/src/lib/debug.ts b/packages/ui/src/lib/debug.ts index 28a3e92b..5e0620a0 100644 --- a/packages/ui/src/lib/debug.ts +++ b/packages/ui/src/lib/debug.ts @@ -264,11 +264,29 @@ export const debugUtils = { const resp = await fetch('/api/health'); const contentType = resp.headers.get('content-type') || ''; const body = await safeText(resp); + const isJson = contentType.toLowerCase().includes('application/json'); + let parsed: Record | null = null; + if (isJson && body) { + try { + const candidate = JSON.parse(body) as unknown; + if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) { + parsed = candidate as Record; + } + } catch { + parsed = null; + } + } opencodeHealth = { status: resp.status, ok: resp.ok, contentType, - type: contentType.includes('application/json') ? 'json' : 'html', + type: isJson ? 'json' : 'html', + openCodePort: parsed?.openCodePort ?? null, + openCodeRunning: parsed?.openCodeRunning ?? null, + openCodeSecureConnection: parsed?.openCodeSecureConnection ?? null, + openCodeAuthSource: parsed?.openCodeAuthSource ?? null, + isOpenCodeReady: parsed?.isOpenCodeReady ?? null, + lastOpenCodeError: parsed?.lastOpenCodeError ?? null, preview: body ? body.slice(0, 120) : null, }; } catch (error) { diff --git a/packages/ui/src/lib/openCodeStatus.ts b/packages/ui/src/lib/openCodeStatus.ts index 959cce49..0527d2b5 100644 --- a/packages/ui/src/lib/openCodeStatus.ts +++ b/packages/ui/src/lib/openCodeStatus.ts @@ -13,6 +13,8 @@ type ProbeResult = { type OpenChamberHealthSnapshot = { openCodePort?: unknown; openCodeRunning?: unknown; + openCodeSecureConnection?: unknown; + openCodeAuthSource?: unknown; isOpenCodeReady?: unknown; lastOpenCodeError?: unknown; opencodeBinaryResolved?: unknown; @@ -100,6 +102,19 @@ const formatIso = (timestamp: number | null | undefined): string => { } }; +const normalizePort = (value: unknown): number | null => { + if (typeof value === 'number' && Number.isFinite(value) && value > 0) { + return Math.trunc(value); + } + if (typeof value === 'string') { + const parsed = Number.parseInt(value, 10); + if (Number.isFinite(parsed) && parsed > 0) { + return parsed; + } + } + return null; +}; + export const buildOpenCodeStatusReport = async (): Promise => { const now = new Date(); const appVersion = typeof __APP_VERSION__ !== 'undefined' ? __APP_VERSION__ : '(unknown)'; @@ -215,6 +230,18 @@ export const buildOpenCodeStatusReport = async (): Promise => { lines.push(`Directory: ${directory || '(none)'}`); lines.push(`Platform: ${platform}`); + const runtimeOpenCodePort = normalizePort(openChamberHealth?.openCodePort); + lines.push(`OpenCode runtime port: ${runtimeOpenCodePort ?? '(unknown)'}`); + if (typeof openChamberHealth?.openCodeRunning === 'boolean') { + lines.push(`OpenCode runtime running: ${openChamberHealth.openCodeRunning ? 'yes' : 'no'}`); + } + if (typeof openChamberHealth?.openCodeSecureConnection === 'boolean') { + lines.push(`Secure OpenCode connection: ${openChamberHealth.openCodeSecureConnection ? 'true' : 'false'}`); + } + if (typeof openChamberHealth?.openCodeAuthSource === 'string' && openChamberHealth.openCodeAuthSource.trim()) { + lines.push(`OpenCode auth source: ${openChamberHealth.openCodeAuthSource}`); + } + if (typeof window !== 'undefined') { const injected = (window as unknown as { __OPENCHAMBER_MACOS_MAJOR__?: unknown }).__OPENCHAMBER_MACOS_MAJOR__; if (typeof injected === 'number' && Number.isFinite(injected) && injected > 0) { diff --git a/packages/ui/src/stores/messageStore.ts b/packages/ui/src/stores/messageStore.ts index d2b99481..3ab582ef 100644 --- a/packages/ui/src/stores/messageStore.ts +++ b/packages/ui/src/stores/messageStore.ts @@ -1707,12 +1707,14 @@ export const useMessageStore = create()( }; if (messageIndex === -1) { - console.info("[MESSAGE-DEBUG] updateMessageInfo: messageIndex === -1", { - sessionId, - messageId, - messageInfo, - existingCount: normalizedSessionMessages.length, - }); + if (process.env.NODE_ENV === 'development') { + console.info("[MESSAGE-DEBUG] updateMessageInfo: messageIndex === -1", { + sessionId, + messageId, + messageInfo, + existingCount: normalizedSessionMessages.length, + }); + } if (normalizedSessionMessages.length > 0) { const firstMessage = normalizedSessionMessages[0]; diff --git a/packages/vscode/src/AgentManagerPanelProvider.ts b/packages/vscode/src/AgentManagerPanelProvider.ts index 6d6b2581..1ca10988 100644 --- a/packages/vscode/src/AgentManagerPanelProvider.ts +++ b/packages/vscode/src/AgentManagerPanelProvider.ts @@ -176,7 +176,10 @@ export class AgentManagerPanelProvider { let response: Response; let wrapAsGlobal = false; - const requestHeaders = this._buildSseHeaders(headers || {}); + const requestHeaders = this._buildSseHeaders({ + ...(headers || {}), + ...(this._openCodeManager?.getOpenCodeAuthHeaders() || {}), + }); try { response = await fetch(targetUrl, { diff --git a/packages/vscode/src/ChatViewProvider.ts b/packages/vscode/src/ChatViewProvider.ts index 545be6e8..6fdaf8c1 100644 --- a/packages/vscode/src/ChatViewProvider.ts +++ b/packages/vscode/src/ChatViewProvider.ts @@ -204,7 +204,10 @@ export class ChatViewProvider implements vscode.WebviewViewProvider { let response: Response; let wrapAsGlobal = false; - const requestHeaders = this._buildSseHeaders(headers || {}); + const requestHeaders = this._buildSseHeaders({ + ...(headers || {}), + ...(this._openCodeManager?.getOpenCodeAuthHeaders() || {}), + }); try { response = await fetch(targetUrl, { diff --git a/packages/vscode/src/SessionEditorPanelProvider.ts b/packages/vscode/src/SessionEditorPanelProvider.ts index 70f2f40f..5790c3fc 100644 --- a/packages/vscode/src/SessionEditorPanelProvider.ts +++ b/packages/vscode/src/SessionEditorPanelProvider.ts @@ -199,7 +199,10 @@ export class SessionEditorPanelProvider { let response: Response; let wrapAsGlobal = false; - const requestHeaders = this._buildSseHeaders(headers || {}); + const requestHeaders = this._buildSseHeaders({ + ...(headers || {}), + ...(this._openCodeManager?.getOpenCodeAuthHeaders() || {}), + }); try { response = await fetch(targetUrl, { diff --git a/packages/vscode/src/bridge.ts b/packages/vscode/src/bridge.ts index 8e3e6881..c79bc8e3 100644 --- a/packages/vscode/src/bridge.ts +++ b/packages/vscode/src/bridge.ts @@ -806,7 +806,10 @@ export async function handleBridgeMessage(message: BridgeRequest, ctx?: BridgeCo const base = `${apiUrl.replace(/\/+$/, '')}/`; const targetUrl = new URL(normalizedPath.replace(/^\/+/, ''), base).toString(); - const requestHeaders: Record = sanitizeForwardHeaders(headers); + const requestHeaders: Record = { + ...sanitizeForwardHeaders(headers), + ...ctx?.manager?.getOpenCodeAuthHeaders(), + }; // Ensure SSE requests are negotiated correctly. if (normalizedPath === '/event' || normalizedPath === '/global/event') { @@ -875,7 +878,10 @@ export async function handleBridgeMessage(message: BridgeRequest, ctx?: BridgeCo const base = `${apiUrl.replace(/\/+$/, '')}/`; const targetUrl = new URL(normalizedPath.replace(/^\/+/, ''), base).toString(); - const requestHeaders: Record = sanitizeForwardHeaders(headers); + const requestHeaders: Record = { + ...sanitizeForwardHeaders(headers), + ...ctx?.manager?.getOpenCodeAuthHeaders(), + }; try { const response = await fetch(targetUrl, { diff --git a/packages/vscode/src/extension.ts b/packages/vscode/src/extension.ts index 04352756..1a7e7152 100644 --- a/packages/vscode/src/extension.ts +++ b/packages/vscode/src/extension.ts @@ -362,10 +362,11 @@ export async function activate(context: vscode.ExtensionContext) { const controller = new AbortController(); const timeout = setTimeout(() => controller.abort(), timeoutMs); const startedAt = Date.now(); + const openCodeAuthHeaders = openCodeManager?.getOpenCodeAuthHeaders() || {}; try { const resp = await fetch(input, { method: 'GET', - headers: { Accept: 'application/json' }, + headers: { Accept: 'application/json', ...openCodeAuthHeaders }, signal: controller.signal, }); const elapsedMs = Date.now() - startedAt; @@ -465,7 +466,13 @@ export async function activate(context: vscode.ExtensionContext) { ? `OpenCode mode: ${debug.mode} (starts=${debug.startCount}, restarts=${debug.restartCount})` : `OpenCode mode: (unknown)`, debug - ? `OpenCode CLI path: ${debug.cliPath || '(not found - SDK manages process)'}` + ? `Secure OpenCode connection: ${debug.secureConnection ? 'true' : 'false'}` + : `Secure OpenCode connection: (unknown)`, + debug + ? `OpenCode auth source: ${debug.authSource ?? '(none)'}` + : `OpenCode auth source: (unknown)`, + debug + ? `OpenCode CLI path: ${debug.cliPath || '(not found)'}` : `OpenCode CLI path: (unknown)`, debug ? `OpenCode detected port: ${debug.detectedPort ?? '(none)'}` diff --git a/packages/vscode/src/opencode.ts b/packages/vscode/src/opencode.ts index adbdddc2..65f920af 100644 --- a/packages/vscode/src/opencode.ts +++ b/packages/vscode/src/opencode.ts @@ -2,12 +2,13 @@ import * as vscode from 'vscode'; import * as os from 'os'; import * as path from 'path'; import * as fs from 'fs'; +import * as net from 'net'; import { execSync } from 'child_process'; import { spawnSync } from 'child_process'; -import { createOpencodeServer } from '@opencode-ai/sdk/v2/server'; +import { spawn } from 'child_process'; +import { randomBytes } from 'crypto'; const READY_CHECK_TIMEOUT_MS = 30000; - export type ConnectionStatus = 'disconnected' | 'connecting' | 'connected' | 'error'; export type OpenCodeDebugInfo = { @@ -32,6 +33,8 @@ export type OpenCodeDebugInfo = { lastReadyAttempts: number | null; lastStartAttempts: number | null; version: string | null; + secureConnection: boolean; + authSource: 'user-env' | 'generated' | 'rotated' | null; }; export interface OpenCodeManager { @@ -41,12 +44,43 @@ export interface OpenCodeManager { setWorkingDirectory(path: string): Promise<{ success: boolean; restarted: boolean; path: string }>; getStatus(): ConnectionStatus; getApiUrl(): string | null; + getOpenCodeAuthHeaders(): Record; getWorkingDirectory(): string; isCliAvailable(): boolean; getDebugInfo(): OpenCodeDebugInfo; onStatusChange(callback: (status: ConnectionStatus, error?: string) => void): vscode.Disposable; } +function generateSecureOpenCodePassword(): string { + return randomBytes(32) + .toString('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/g, ''); +} + +function buildOpenCodeAuthHeader(password: string): string { + return `Basic ${Buffer.from(`opencode:${password}`, 'utf8').toString('base64')}`; +} + +function isValidOpenCodePassword(password: string): boolean { + return typeof password === 'string' && password.trim().length > 0; +} + +function readOpenChamberSettings(): Record { + const settingsPath = path.join(os.homedir(), '.config', 'openchamber', 'settings.json'); + try { + const raw = fs.readFileSync(settingsPath, 'utf8'); + const parsed = JSON.parse(raw) as unknown; + if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) { + return parsed as Record; + } + return {}; + } catch { + return {}; + } +} + function resolvePortFromUrl(url: string): number | null { try { const parsed = new URL(url); @@ -110,13 +144,8 @@ function resolveOpencodeCliPath(): string | null { const sharedFromOpenChamber = (() => { try { - const settingsPath = path.join(os.homedir(), '.config', 'openchamber', 'settings.json'); - const raw = fs.readFileSync(settingsPath, 'utf8'); - const parsed = JSON.parse(raw) as unknown; - if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) { - return null; - } - const candidate = (parsed as Record).opencodeBinary; + const settings = readOpenChamberSettings(); + const candidate = settings.opencodeBinary; if (typeof candidate !== 'string') { return null; } @@ -258,7 +287,11 @@ function getCandidateBaseUrls(serverUrl: string): string[] { } } -async function waitForReady(serverUrl: string, timeoutMs = 15000): Promise { +async function waitForReady( + serverUrl: string, + timeoutMs = 15000, + authHeaders: Record = {} +): Promise { const outputChannel = vscode.window.createOutputChannel('OpenChamberManager'); const start = Date.now(); const candidates = getCandidateBaseUrls(serverUrl); @@ -275,7 +308,7 @@ async function waitForReady(serverUrl: string, timeoutMs = 15000): Promise void }> { + const binary = (process.env.OPENCODE_BINARY || 'opencode').trim() || 'opencode'; + const args = ['serve', '--hostname', '127.0.0.1', '--port', String(port)]; + const child = spawn(binary, args, { + cwd: workingDirectory, + env: { ...process.env }, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + const url = await new Promise((resolve, reject) => { + let output = ''; + let settled = false; + + const cleanup = () => { + if (settled) return; + settled = true; + clearTimeout(timer); + child.stdout?.off('data', onStdout); + child.stderr?.off('data', onStderr); + child.off('exit', onExit); + child.off('error', onError); + }; + + const onStdout = (chunk: Buffer) => { + output += chunk.toString(); + const lines = output.split('\n'); + for (const line of lines) { + if (!line.startsWith('opencode server listening')) continue; + const match = line.match(/on\s+(https?:\/\/[^\s]+)/); + if (!match) { + cleanup(); + reject(new Error(`Failed to parse server url from output: ${line}`)); + return; + } + cleanup(); + resolve(match[1]); + return; + } + }; + + const onStderr = (chunk: Buffer) => { + output += chunk.toString(); + }; + + const onExit = (code: number | null) => { + cleanup(); + reject(new Error(`OpenCode exited with code ${code}. Output: ${output}`)); + }; + + const onError = (error: Error) => { + cleanup(); + reject(error); + }; + + const timer = setTimeout(() => { + cleanup(); + reject(new Error(`Timeout waiting for server to start after ${timeoutMs}ms`)); + }, timeoutMs); + + child.stdout?.on('data', onStdout); + child.stderr?.on('data', onStderr); + child.on('exit', onExit); + child.on('error', onError); + }); + + return { + url, + close: () => { + try { + child.kill('SIGTERM'); + } catch { + // ignore + } + }, + }; +} + +async function allocateManagedOpenCodePort(): Promise { + return await new Promise((resolve, reject) => { + const server = net.createServer(); + + server.once('error', (error) => { + reject(error); + }); + + server.once('listening', () => { + const address = server.address(); + const port = address && typeof address === 'object' ? address.port : 0; + server.close(() => { + if (port > 0) { + resolve(port); + return; + } + reject(new Error('Failed to allocate OpenCode port')); + }); + }); + + server.listen(0, '127.0.0.1'); + }); +} + export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCodeManager { - // Discard unused parameter - reserved for future use (state persistence, subscriptions) void _context; let server: { url: string; close: () => void } | null = null; let managedApiUrlOverride: string | null = null; + let managedPassword: string | null = null; + let managedPasswordSource: 'user-env' | 'generated' | 'rotated' | null = null; + const userProvidedEnvPassword = (() => { + const normalized = (process.env.OPENCODE_SERVER_PASSWORD || '').trim(); + return isValidOpenCodePassword(normalized) ? normalized : null; + })(); let status: ConnectionStatus = 'disconnected'; let lastError: string | undefined; const listeners = new Set<(status: ConnectionStatus, error?: string) => void>(); @@ -375,7 +518,48 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo return null; }; - async function startInternal(workdir?: string): Promise { + const getOpenCodeAuthHeaders = (): Record => { + const password = (managedPassword || userProvidedEnvPassword || process.env.OPENCODE_SERVER_PASSWORD || '').trim(); + if (!password) { + return {}; + } + return { Authorization: buildOpenCodeAuthHeader(password) }; + }; + + const setManagedPasswordState = ( + password: string, + source: 'user-env' | 'generated' | 'rotated' + ): string => { + const normalized = password.trim(); + managedPassword = normalized; + managedPasswordSource = source; + process.env.OPENCODE_SERVER_PASSWORD = normalized; + return normalized; + }; + + const ensureManagedOpenCodeServerPassword = async ({ rotateManaged = false }: { rotateManaged?: boolean } = {}): Promise => { + if (userProvidedEnvPassword) { + return setManagedPasswordState(userProvidedEnvPassword, 'user-env'); + } + + if (rotateManaged) { + return setManagedPasswordState(generateSecureOpenCodePassword(), 'rotated'); + } + + if (managedPassword && isValidOpenCodePassword(managedPassword)) { + return setManagedPasswordState( + managedPassword, + managedPasswordSource || 'generated' + ); + } + + return setManagedPasswordState(generateSecureOpenCodePassword(), 'generated'); + }; + + async function startInternal( + workdir?: string, + options: { rotateManaged?: boolean } = {} + ): Promise { startCount += 1; setStatus('connecting'); lastStartAt = Date.now(); @@ -418,18 +602,19 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo process.env.OPENCODE_BINARY = resolvedCli; } + const password = await ensureManagedOpenCodeServerPassword({ + rotateManaged: options.rotateManaged === true, + }); + process.env.OPENCODE_SERVER_PASSWORD = password; + // SDK spawns `opencode serve` in current process cwd. // Some OpenCode endpoints behave differently based on server process cwd, // so ensure we start it from the workspace directory. const originalCwd = process.cwd(); try { process.chdir(workingDirectory); - server = await createOpencodeServer({ - hostname: '127.0.0.1', - port: 0, - timeout: READY_CHECK_TIMEOUT_MS, - signal: undefined, - }); + const port = await allocateManagedOpenCodePort(); + server = await spawnManagedOpenCodeServer(workingDirectory, port, READY_CHECK_TIMEOUT_MS); } finally { try { process.chdir(originalCwd); @@ -440,7 +625,7 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo if (server && server.url) { // Validate readiness for the current workspace context. - const ready = await waitForReady(server.url, READY_CHECK_TIMEOUT_MS); + const ready = await waitForReady(server.url, READY_CHECK_TIMEOUT_MS, getOpenCodeAuthHeaders()); lastReadyElapsedMs = ready.elapsedMs; lastReadyAttempts = ready.attempts; if (ready.ok) { @@ -496,7 +681,6 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo server = null; } - // SDK's proc.kill() only kills the Node wrapper, not the actual opencode binary. // Kill any process listening on our port to clean up orphaned children. if (portToKill) { try { @@ -530,7 +714,7 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo restartCount += 1; await stopInternal(); await new Promise(r => setTimeout(r, 250)); - await startInternal(); + await startInternal(undefined, { rotateManaged: true }); } async function start(workdir?: string): Promise { @@ -541,7 +725,7 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo } } lastStartAttempts = 1; - pendingOperation = startInternal(workdir); + pendingOperation = startInternal(workdir, { rotateManaged: true }); try { await pendingOperation; } finally { @@ -603,31 +787,37 @@ export function createOpenCodeManager(_context: vscode.ExtensionContext): OpenCo setWorkingDirectory, getStatus: () => status, getApiUrl, + getOpenCodeAuthHeaders, getWorkingDirectory: () => workingDirectory, isCliAvailable: () => !cliMissing, - getDebugInfo: () => ({ - mode: useConfiguredUrl && configuredApiUrl ? 'external' : 'managed', - status, - lastError, - workingDirectory, - cliAvailable: !cliMissing, - cliPath, - configuredApiUrl: useConfiguredUrl && configuredApiUrl ? configuredApiUrl.replace(/\/+$/, '') : null, - configuredPort, - detectedPort, - apiPrefix: '', - apiPrefixDetected: true, - startCount, - restartCount, - lastStartAt, - lastConnectedAt, - lastExitCode, - serverUrl: getApiUrl(), - lastReadyElapsedMs, - lastReadyAttempts, - lastStartAttempts, - version, - }), + getDebugInfo: () => { + const secureConnection = Boolean(getOpenCodeAuthHeaders().Authorization); + return { + mode: useConfiguredUrl && configuredApiUrl ? 'external' : 'managed', + status, + lastError, + workingDirectory, + cliAvailable: !cliMissing, + cliPath, + configuredApiUrl: useConfiguredUrl && configuredApiUrl ? configuredApiUrl.replace(/\/+$/, '') : null, + configuredPort, + detectedPort, + apiPrefix: '', + apiPrefixDetected: true, + startCount, + restartCount, + lastStartAt, + lastConnectedAt, + lastExitCode, + serverUrl: getApiUrl(), + lastReadyElapsedMs, + lastReadyAttempts, + lastStartAttempts, + version, + secureConnection, + authSource: managedPasswordSource || (userProvidedEnvPassword ? 'user-env' : null), + }; + }, onStatusChange(callback) { listeners.add(callback); callback(status, lastError); diff --git a/packages/vscode/src/sessionActivityWatcher.ts b/packages/vscode/src/sessionActivityWatcher.ts index 8f82b68e..82423d3e 100644 --- a/packages/vscode/src/sessionActivityWatcher.ts +++ b/packages/vscode/src/sessionActivityWatcher.ts @@ -191,11 +191,13 @@ export const startGlobalEventWatcher = async ( } const url = buildOpenCodeUrl('/global/event', baseUrl); + const authHeaders = manager.getOpenCodeAuthHeaders(); upstream = await fetch(url, { headers: { Accept: 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive', + ...authHeaders, }, signal, }); diff --git a/packages/vscode/webview/main.tsx b/packages/vscode/webview/main.tsx index 16ff0ad2..f7ff5e88 100644 --- a/packages/vscode/webview/main.tsx +++ b/packages/vscode/webview/main.tsx @@ -303,6 +303,19 @@ const decodeBase64 = (value: string): Uint8Array => { return bytes; }; +const isNullBodyStatus = (status: number): boolean => status === 204 || status === 205 || status === 304; + +const buildProxiedResponse = ( + proxied: { status: number; headers: Record; bodyBase64?: string } +): Response => { + if (isNullBodyStatus(proxied.status)) { + return new Response(null, { status: proxied.status, headers: proxied.headers }); + } + + const body = proxied.bodyBase64 ? decodeBase64(proxied.bodyBase64) : new Uint8Array(); + return new Response(body, { status: proxied.status, headers: proxied.headers }); +}; + const encodeBase64 = (bytes: Uint8Array): string => { const CHUNK = 0x8000; let binary = ''; @@ -375,6 +388,47 @@ const isSessionMessageApiPath = (pathname: string) => /^\/api\/session\/[^/]+\/m const handleLocalApiRequest = async (url: URL, init?: RequestInit) => { const pathname = url.pathname; + const normalizedPathname = pathname !== '/' ? pathname.replace(/\/+$/, '') : pathname; + const method = ((init?.method || 'GET') as string).toUpperCase(); + + if (normalizedPathname === '/api/sessions/snapshot' && method === 'GET') { + return new Response(JSON.stringify({ + statusSessions: {}, + attentionSessions: {}, + serverTime: Date.now(), + }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } + + if (/^\/api\/sessions\/[^/]+\/(view|unview)$/.test(normalizedPathname) && method === 'POST') { + return new Response(JSON.stringify({ success: true }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } + + if (normalizedPathname === '/api/tts/status' && method === 'GET') { + return new Response(JSON.stringify({ available: false }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } + + if (normalizedPathname === '/api/tts/say/status' && method === 'GET') { + return new Response(JSON.stringify({ available: false, voices: [] }), { + status: 200, + headers: { 'Content-Type': 'application/json' }, + }); + } + + if ((pathname === '/api/tts/speak' || pathname === '/api/tts/say/speak' || pathname === '/api/tts/summarize') && method === 'POST') { + return new Response(JSON.stringify({ error: 'TTS endpoints are not available in VS Code runtime' }), { + status: 501, + headers: { 'Content-Type': 'application/json' }, + }); + } // Health endpoints: reflect actual connection status if (pathname === '/health' || pathname === '/api/health') { @@ -792,8 +846,7 @@ window.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { if (method === 'POST' && isSessionMessageApiPath(targetUrl.pathname)) { const bodyText = await extractBodyText(input, init, method); const proxied = await proxySessionMessageRequest({ path: suffixPath, headers, bodyText }); - const body = proxied.bodyBase64 ? decodeBase64(proxied.bodyBase64) : new Uint8Array(); - const response = new Response(body, { status: proxied.status, headers: proxied.headers }); + const response = buildProxiedResponse(proxied); recordBootstrapFetch(targetUrl.pathname, response.ok); maybeHideLoadingOverlay(); return response; @@ -801,8 +854,7 @@ window.fetch = async (input: RequestInfo | URL, init?: RequestInit) => { const bodyBase64 = await extractBodyBase64(input, init, method); const proxied = await proxyApiRequest({ method, path: suffixPath, headers, bodyBase64 }); - const body = proxied.bodyBase64 ? decodeBase64(proxied.bodyBase64) : new Uint8Array(); - const response = new Response(body, { status: proxied.status, headers: proxied.headers }); + const response = buildProxiedResponse(proxied); recordBootstrapFetch(targetUrl.pathname, response.ok); maybeHideLoadingOverlay(); return response; diff --git a/packages/web/bin/cli.js b/packages/web/bin/cli.js index aeb7572e..34396026 100755 --- a/packages/web/bin/cli.js +++ b/packages/web/bin/cli.js @@ -450,6 +450,23 @@ function isProcessRunning(pid) { } } +async function requestServerShutdown(port) { + if (!Number.isFinite(port) || port <= 0) return false; + const controller = new AbortController(); + const timeout = setTimeout(() => controller.abort(), 1500); + try { + const resp = await fetch(`http://127.0.0.1:${port}/api/system/shutdown`, { + method: 'POST', + signal: controller.signal, + }); + return resp.ok; + } catch { + return false; + } finally { + clearTimeout(timeout); + } +} + const commands = { async serve(options) { options.port = await resolveAvailablePort(options.port); @@ -675,6 +692,7 @@ const commands = { console.log(`Stopping OpenChamber (PID: ${targetInstance.pid}, Port: ${targetInstance.port})...`); try { + await requestServerShutdown(targetInstance.port); process.kill(targetInstance.pid, 'SIGTERM'); let attempts = 0; @@ -709,6 +727,7 @@ const commands = { console.log(` Stopping instance on port ${instance.port} (PID: ${instance.pid})...`); try { + await requestServerShutdown(instance.port); process.kill(instance.pid, 'SIGTERM'); let attempts = 0; @@ -814,6 +833,7 @@ const commands = { // Stop the instance try { + await requestServerShutdown(instance.port); process.kill(instance.pid, 'SIGTERM'); // Wait for it to stop let attempts = 0; @@ -970,6 +990,7 @@ const commands = { console.log(`\nStopping ${runningInstances.length} running instance(s) before update...`); for (const instance of runningInstances) { try { + await requestServerShutdown(instance.port); process.kill(instance.pid, 'SIGTERM'); let attempts = 0; while (isProcessRunning(instance.pid) && attempts < 20) { diff --git a/packages/web/server/index.js b/packages/web/server/index.js index f412becb..ae6ee87b 100644 --- a/packages/web/server/index.js +++ b/packages/web/server/index.js @@ -3,6 +3,7 @@ import path from 'path'; import { spawn, spawnSync } from 'child_process'; import fs from 'fs'; import http from 'http'; +import net from 'net'; import { WebSocketServer } from 'ws'; import { fileURLToPath } from 'url'; import os from 'os'; @@ -20,7 +21,6 @@ import { pruneRebindTimestamps, readTerminalInputWsControlFrame, } from './lib/terminal-input-ws-protocol.js'; -import { createOpencodeServer } from '@opencode-ai/sdk/server'; import webPush from 'web-push'; const __filename = fileURLToPath(import.meta.url); @@ -2734,15 +2734,30 @@ const getHmrState = () => { globalThis[HMR_STATE_KEY] = { openCodeProcess: null, openCodePort: null, - openCodeWorkingDirectory: os.homedir(), - isShuttingDown: false, - signalsAttached: false, - }; + openCodeWorkingDirectory: os.homedir(), + isShuttingDown: false, + signalsAttached: false, + userProvidedOpenCodePassword: undefined, + openCodeAuthPassword: null, + openCodeAuthSource: null, + }; } return globalThis[HMR_STATE_KEY]; }; const hmrState = getHmrState(); +const normalizeOpenCodePassword = (value) => { + if (typeof value !== 'string') { + return ''; + } + return value.trim(); +}; + +if (typeof hmrState.userProvidedOpenCodePassword === 'undefined') { + const initialPassword = normalizeOpenCodePassword(process.env.OPENCODE_SERVER_PASSWORD); + hmrState.userProvidedOpenCodePassword = initialPassword || null; +} + // Non-HMR state (safe to reset on reload) let healthCheckInterval = null; let server = null; @@ -2762,6 +2777,18 @@ let exitOnShutdown = true; let uiAuthController = null; let cloudflareTunnelController = null; let terminalInputWsServer = null; +const userProvidedOpenCodePassword = + typeof hmrState.userProvidedOpenCodePassword === 'string' && hmrState.userProvidedOpenCodePassword.length > 0 + ? hmrState.userProvidedOpenCodePassword + : null; +let openCodeAuthPassword = + typeof hmrState.openCodeAuthPassword === 'string' && hmrState.openCodeAuthPassword.length > 0 + ? hmrState.openCodeAuthPassword + : userProvidedOpenCodePassword; +let openCodeAuthSource = + typeof hmrState.openCodeAuthSource === 'string' && hmrState.openCodeAuthSource.length > 0 + ? hmrState.openCodeAuthSource + : (userProvidedOpenCodePassword ? 'user-env' : null); // Sync helper - call after modifying any HMR state variable const syncToHmrState = () => { @@ -2770,6 +2797,8 @@ const syncToHmrState = () => { hmrState.isShuttingDown = isShuttingDown; hmrState.signalsAttached = signalsAttached; hmrState.openCodeWorkingDirectory = openCodeWorkingDirectory; + hmrState.openCodeAuthPassword = openCodeAuthPassword; + hmrState.openCodeAuthSource = openCodeAuthSource; }; // Sync helper - call to restore state from HMR (e.g., on module reload) @@ -2779,6 +2808,14 @@ const syncFromHmrState = () => { isShuttingDown = hmrState.isShuttingDown; signalsAttached = hmrState.signalsAttached; openCodeWorkingDirectory = hmrState.openCodeWorkingDirectory; + openCodeAuthPassword = + typeof hmrState.openCodeAuthPassword === 'string' && hmrState.openCodeAuthPassword.length > 0 + ? hmrState.openCodeAuthPassword + : userProvidedOpenCodePassword; + openCodeAuthSource = + typeof hmrState.openCodeAuthSource === 'string' && hmrState.openCodeAuthSource.length > 0 + ? hmrState.openCodeAuthSource + : (userProvidedOpenCodePassword ? 'user-env' : null); }; // Module-level variables that shadow HMR state @@ -2858,18 +2895,13 @@ const ENV_SKIP_OPENCODE_START = process.env.OPENCODE_SKIP_START === 'true' || const ENV_DESKTOP_NOTIFY = process.env.OPENCHAMBER_DESKTOP_NOTIFY === 'true'; // OpenCode server authentication (Basic Auth with username "opencode") -const ENV_OPENCODE_SERVER_PASSWORD = (() => { - const pwd = process.env.OPENCODE_SERVER_PASSWORD; - return typeof pwd === 'string' && pwd.length > 0 ? pwd : null; -})(); /** * Returns auth headers for OpenCode server requests if OPENCODE_SERVER_PASSWORD is set. * Uses Basic Auth with username "opencode" and the password from the env variable. */ function getOpenCodeAuthHeaders() { - // Re-read from env each time in case it wasn't set at module load (HMR issue) - const password = ENV_OPENCODE_SERVER_PASSWORD || process.env.OPENCODE_SERVER_PASSWORD; + const password = normalizeOpenCodePassword(openCodeAuthPassword || process.env.OPENCODE_SERVER_PASSWORD || ''); if (!password) { return {}; @@ -2879,6 +2911,60 @@ function getOpenCodeAuthHeaders() { return { Authorization: `Basic ${credentials}` }; } +function isOpenCodeConnectionSecure() { + return Object.prototype.hasOwnProperty.call(getOpenCodeAuthHeaders(), 'Authorization'); +} + +function generateSecureOpenCodePassword() { + return crypto + .randomBytes(32) + .toString('base64') + .replace(/\+/g, '-') + .replace(/\//g, '_') + .replace(/=+$/g, ''); +} + +function isValidOpenCodePassword(password) { + return typeof password === 'string' && password.trim().length > 0; +} + +function setOpenCodeAuthState(password, source) { + const normalized = normalizeOpenCodePassword(password); + if (!isValidOpenCodePassword(normalized)) { + openCodeAuthPassword = null; + openCodeAuthSource = null; + delete process.env.OPENCODE_SERVER_PASSWORD; + syncToHmrState(); + return null; + } + + openCodeAuthPassword = normalized; + openCodeAuthSource = source; + process.env.OPENCODE_SERVER_PASSWORD = normalized; + syncToHmrState(); + return normalized; +} + +async function ensureLocalOpenCodeServerPassword({ rotateManaged = false } = {}) { + if (isValidOpenCodePassword(userProvidedOpenCodePassword)) { + return setOpenCodeAuthState(userProvidedOpenCodePassword, 'user-env'); + } + + if (rotateManaged) { + const rotatedPassword = setOpenCodeAuthState(generateSecureOpenCodePassword(), 'rotated'); + console.log('Rotated secure password for managed local OpenCode instance'); + return rotatedPassword; + } + + if (isValidOpenCodePassword(openCodeAuthPassword)) { + return setOpenCodeAuthState(openCodeAuthPassword, openCodeAuthSource || 'generated'); + } + + const generatedPassword = setOpenCodeAuthState(generateSecureOpenCodePassword(), 'generated'); + console.log('Generated secure password for managed local OpenCode instance'); + return generatedPassword; +} + const ENV_CONFIGURED_API_PREFIX = normalizeApiPrefix( process.env.OPENCODE_API_PREFIX || process.env.OPENCHAMBER_API_PREFIX || '' ); @@ -4422,7 +4508,6 @@ function parseArgs(argv = process.argv.slice(2)) { function killProcessOnPort(port) { if (!port) return; try { - // SDK's proc.kill() only kills the Node wrapper, not the actual opencode binary. // Kill any process listening on our port to clean up orphaned children. const result = spawnSync('lsof', ['-ti', `:${port}`], { encoding: 'utf8', timeout: 5000 }); const output = result.stdout || ''; @@ -4442,27 +4527,143 @@ function killProcessOnPort(port) { } } +async function createManagedOpenCodeServerProcess({ + hostname, + port, + timeout, + cwd, + env, +}) { + const binary = (process.env.OPENCODE_BINARY || 'opencode').trim() || 'opencode'; + const args = ['serve', '--hostname', hostname, '--port', String(port)]; + const child = spawn(binary, args, { + cwd, + env, + stdio: ['ignore', 'pipe', 'pipe'], + }); + + const url = await new Promise((resolve, reject) => { + let output = ''; + let done = false; + const finish = (handler, value) => { + if (done) return; + done = true; + clearTimeout(timer); + child.stdout?.off('data', onStdout); + child.stderr?.off('data', onStderr); + child.off('exit', onExit); + child.off('error', onError); + handler(value); + }; + + const onStdout = (chunk) => { + output += chunk.toString(); + const lines = output.split('\n'); + for (const line of lines) { + if (!line.startsWith('opencode server listening')) continue; + const match = line.match(/on\s+(https?:\/\/[^\s]+)/); + if (!match) { + finish(reject, new Error(`Failed to parse server url from output: ${line}`)); + return; + } + finish(resolve, match[1]); + return; + } + }; + + const onStderr = (chunk) => { + output += chunk.toString(); + }; + + const onExit = (code) => { + finish(reject, new Error(`OpenCode exited with code ${code}. Output: ${output}`)); + }; + + const onError = (error) => { + finish(reject, error); + }; + + const timer = setTimeout(() => { + finish(reject, new Error(`Timeout waiting for OpenCode to start after ${timeout}ms`)); + }, timeout); + + child.stdout?.on('data', onStdout); + child.stderr?.on('data', onStderr); + child.on('exit', onExit); + child.on('error', onError); + }); + + return { + url, + close() { + try { + child.kill('SIGTERM'); + } catch { + // ignore + } + }, + }; +} + +async function resolveManagedOpenCodePort(requestedPort) { + if (typeof requestedPort === 'number' && Number.isFinite(requestedPort) && requestedPort > 0) { + return requestedPort; + } + + return await new Promise((resolve, reject) => { + const server = net.createServer(); + const cleanup = () => { + server.removeAllListeners('error'); + server.removeAllListeners('listening'); + }; + + server.once('error', (error) => { + cleanup(); + reject(error); + }); + + server.once('listening', () => { + const address = server.address(); + const port = address && typeof address === 'object' ? address.port : 0; + server.close(() => { + cleanup(); + if (port > 0) { + resolve(port); + return; + } + reject(new Error('Failed to allocate OpenCode port')); + }); + }); + + server.listen(0, '127.0.0.1'); + }); +} + async function startOpenCode() { const desiredPort = ENV_CONFIGURED_OPENCODE_PORT ?? 0; + const spawnPort = await resolveManagedOpenCodePort(desiredPort); console.log( desiredPort > 0 ? `Starting OpenCode on requested port ${desiredPort}...` - : 'Starting OpenCode with dynamic port assignment...' + : `Starting OpenCode on allocated port ${spawnPort}...` ); - // Note: SDK starts in current process CWD. openCodeWorkingDirectory is tracked but not used for spawn in SDK. await applyOpencodeBinaryFromSettings(); ensureOpencodeCliEnv(); + const openCodePassword = await ensureLocalOpenCodeServerPassword({ + rotateManaged: true, + }); try { - const serverInstance = await createOpencodeServer({ + const serverInstance = await createManagedOpenCodeServerProcess({ hostname: '127.0.0.1', - port: desiredPort, + port: spawnPort, timeout: 30000, + cwd: openCodeWorkingDirectory, env: { ...process.env, - // Pass minimal config to avoid pollution, but inherit PATH etc - } + OPENCODE_SERVER_PASSWORD: openCodePassword, + }, }); if (!serverInstance || !serverInstance.url) { @@ -5350,6 +5551,8 @@ async function main(options = {}) { timestamp: new Date().toISOString(), openCodePort: openCodePort, openCodeRunning: Boolean(openCodePort && isOpenCodeReady && !isRestartingOpenCode), + openCodeSecureConnection: isOpenCodeConnectionSecure(), + openCodeAuthSource: openCodeAuthSource || null, openCodeApiPrefix: '', openCodeApiPrefixDetected: true, isOpenCodeReady, @@ -5362,6 +5565,13 @@ async function main(options = {}) { }); }); + app.post('/api/system/shutdown', (req, res) => { + res.json({ ok: true }); + gracefulShutdown({ exitProcess: false }).catch((error) => { + console.error('Shutdown request failed:', error?.message || error); + }); + }); + app.use((req, res, next) => { if ( req.path.startsWith('/api/config/agents') ||