codexui-android 0.1.109 → 0.1.110

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/cli/index.ts","../src/commandResolution.ts","../src/server/appServerRuntimeConfig.ts","../src/server/httpServer.ts","../src/server/codexAppServerBridge.ts","../src/server/accountRoutes.ts","../src/server/reviewGit.ts","../src/server/skillsRoutes.ts","../src/utils/commandInvocation.ts","../src/server/telegramThreadBridge.ts","../src/server/freeMode.ts","../src/server/unifiedResponsesProxy.ts","../src/server/openRouterProxy.ts","../src/server/zenProxy.ts","../src/server/customEndpointProxy.ts","../src/server/terminalManager.ts","../src/server/authMiddleware.ts","../src/server/localBrowseUi.ts","../src/server/password.ts"],"sourcesContent":["import { createServer } from 'node:http'\nimport { chmodSync, createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { readFile, stat, writeFile } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { spawn } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\nimport { dirname } from 'node:path'\nimport { get as httpsGet } from 'node:https'\nimport { Command } from 'commander'\nimport qrcode from 'qrcode-terminal'\nimport {\n canRunCommand,\n getNpmGlobalBinDir,\n getUserNpmPrefix,\n prependPathEntry,\n resolveCodexCommand,\n} from '../commandResolution.js'\nimport {\n parseApprovalPolicy,\n parseSandboxMode,\n resolveAppServerRuntimeConfig,\n} from '../server/appServerRuntimeConfig.js'\nimport { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\nimport { spawnSyncCommand } from '../utils/commandInvocation.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nlet hasPromptedCloudflaredInstall = false\n\nfunction getCodexHomePath(): string {\n return process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\n}\n\nfunction getCloudflaredPromptMarkerPath(): string {\n return join(getCodexHomePath(), '.cloudflared-install-prompted')\n}\n\nfunction hasPromptedCloudflaredInstallPersisted(): boolean {\n return existsSync(getCloudflaredPromptMarkerPath())\n}\n\nasync function persistCloudflaredInstallPrompted(): Promise<void> {\n const codexHome = getCodexHomePath()\n mkdirSync(codexHome, { recursive: true })\n await writeFile(getCloudflaredPromptMarkerPath(), `${Date.now()}\\n`, 'utf8')\n}\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = join(__dirname, '..', 'package.json')\n const raw = await readFile(packageJsonPath, 'utf8')\n const parsed = JSON.parse(raw) as { version?: unknown }\n return typeof parsed.version === 'string' ? parsed.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nfunction isTermuxRuntime(): boolean {\n return Boolean(process.env.TERMUX_VERSION || process.env.PREFIX?.includes('/com.termux/'))\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`${label} failed with exit code ${String(result.status ?? -1)}`)\n }\n}\n\nfunction runWithStatus(command: string, args: string[]): number {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRunCommand('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRunCommand(localCandidate, ['--version'])) {\n return localCandidate\n }\n return null\n}\n\nfunction mapCloudflaredLinuxArch(arch: NodeJS.Architecture): string | null {\n if (arch === 'x64') {\n return 'amd64'\n }\n if (arch === 'arm64') {\n return 'arm64'\n }\n return null\n}\n\nfunction downloadFile(url: string, destination: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = (currentUrl: string) => {\n httpsGet(currentUrl, (response) => {\n const code = response.statusCode ?? 0\n if (code >= 300 && code < 400 && response.headers.location) {\n response.resume()\n request(response.headers.location)\n return\n }\n if (code !== 200) {\n response.resume()\n reject(new Error(`Download failed with HTTP status ${String(code)}`))\n return\n }\n const file = createWriteStream(destination, { mode: 0o755 })\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n resolve()\n })\n file.on('error', reject)\n }).on('error', reject)\n }\n\n request(url)\n })\n}\n\nasync function ensureCloudflaredInstalledLinux(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n if (process.platform !== 'linux') {\n return null\n }\n\n const mappedArch = mapCloudflaredLinuxArch(process.arch)\n if (!mappedArch) {\n throw new Error(`cloudflared auto-install is not supported for Linux architecture: ${process.arch}`)\n }\n\n const userBinDir = join(homedir(), '.local', 'bin')\n mkdirSync(userBinDir, { recursive: true })\n const destination = join(userBinDir, 'cloudflared')\n const downloadUrl = `https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${mappedArch}`\n\n console.log('\\ncloudflared not found. Installing to ~/.local/bin...\\n')\n await downloadFile(downloadUrl, destination)\n chmodSync(destination, 0o755)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', userBinDir)\n\n const installed = resolveCloudflaredCommand()\n if (!installed) {\n throw new Error('cloudflared download completed but executable is still not available')\n }\n console.log('\\ncloudflared installed.\\n')\n return installed\n}\n\nasync function shouldInstallCloudflaredInteractively(): Promise<boolean> {\n if (hasPromptedCloudflaredInstall || hasPromptedCloudflaredInstallPersisted()) {\n return false\n }\n hasPromptedCloudflaredInstall = true\n await persistCloudflaredInstallPrompted()\n\n if (process.platform === 'win32') {\n return false\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.warn('\\n[cloudflared] cloudflared is missing and terminal is non-interactive, skipping install.')\n return false\n }\n\n const prompt = createInterface({ input: process.stdin, output: process.stdout })\n try {\n const answer = await prompt.question('cloudflared is not installed. Install it now to ~/.local/bin? [y/N] ')\n const normalized = answer.trim().toLowerCase()\n return normalized === 'y' || normalized === 'yes'\n } finally {\n prompt.close()\n }\n}\n\nasync function resolveCloudflaredForTunnel(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n\n if (process.platform === 'win32') {\n return null\n }\n\n const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = getCodexHomePath()\n return existsSync(join(codexHome, 'auth.json'))\n}\n\nfunction ensureCodexInstalled(): string | null {\n let codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n const installWithFallback = (pkg: string, label: string): void => {\n const status = runWithStatus('npm', ['install', '-g', pkg])\n if (status === 0) {\n return\n }\n if (isTermuxRuntime()) {\n throw new Error(`${label} failed with exit code ${String(status)}`)\n }\n const userPrefix = getUserNpmPrefix()\n console.log(`\\nGlobal npm install requires elevated permissions. Retrying with --prefix ${userPrefix}...\\n`)\n runOrFail('npm', ['install', '-g', '--prefix', userPrefix, pkg], `${label} (user prefix)`)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', getNpmGlobalBinDir(userPrefix))\n }\n\n if (isTermuxRuntime()) {\n console.log('\\nCodex CLI not found. Installing Termux-compatible Codex CLI from npm...\\n')\n installWithFallback('@mmmbuto/codex-cli-termux', 'Codex CLI install')\n codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n console.log('\\nTermux npm package did not expose `codex`. Installing official CLI fallback...\\n')\n installWithFallback('@openai/codex', 'Codex CLI fallback install')\n }\n } else {\n console.log('\\nCodex CLI not found. Installing official Codex CLI from npm...\\n')\n installWithFallback('@openai/codex', 'Codex CLI install')\n }\n\n codexCommand = resolveCodexCommand()\n if (!codexCommand && !isTermuxRuntime()) {\n // Non-Termux path should resolve after official package install.\n throw new Error('Official Codex CLI install completed but binary is still not available in PATH')\n }\n if (!codexCommand && isTermuxRuntime()) {\n codexCommand = resolveCodexCommand()\n }\n if (!codexCommand) {\n throw new Error('Codex CLI install completed but binary is still not available in PATH')\n }\n console.log('\\nCodex CLI installed.\\n')\n }\n return codexCommand\n}\n\ntype PasswordResolution = {\n password: string | undefined\n generated: boolean\n}\n\nfunction resolvePassword(input: string | boolean): PasswordResolution {\n if (input === false) {\n return { password: undefined, generated: false }\n }\n if (typeof input === 'string') {\n return { password: input, generated: false }\n }\n return { password: generatePassword(), generated: true }\n}\n\nfunction getGeneratedPasswordPath(): string {\n return join(getCodexHomePath(), 'codexui-password')\n}\n\nasync function persistGeneratedPassword(password: string): Promise<string> {\n const codexHome = getCodexHomePath()\n mkdirSync(codexHome, { recursive: true })\n const passwordPath = getGeneratedPasswordPath()\n await writeFile(passwordPath, `${password}\\n`, { encoding: 'utf8', mode: 0o600 })\n chmodSync(passwordPath, 0o600)\n return passwordPath\n}\n\nfunction printTermuxKeepAlive(lines: string[]): void {\n if (!isTermuxRuntime()) {\n return\n }\n lines.push('')\n lines.push(' Android/Termux keep-alive:')\n lines.push(' 1) Keep this Termux session open (do not swipe it away).')\n lines.push(' 2) Disable battery optimization for Termux in Android settings.')\n lines.push(' 3) Optional: run `termux-wake-lock` in another shell.')\n}\n\nfunction openBrowser(url: string): void {\n const command = process.platform === 'darwin'\n ? { cmd: 'open', args: [url] }\n : process.platform === 'win32'\n ? { cmd: 'cmd', args: ['/c', 'start', '', url] }\n : { cmd: 'xdg-open', args: [url] }\n\n const child = spawn(command.cmd, command.args, { detached: true, stdio: 'ignore' })\n child.on('error', () => {})\n child.unref()\n}\n\nfunction buildTunnelAutologinUrl(tunnelUrl: string, _password: string | undefined): string {\n return tunnelUrl\n}\n\nfunction parseCloudflaredUrl(chunk: string): string | null {\n const urlMatch = chunk.match(/https:\\/\\/[a-zA-Z0-9-]+\\.trycloudflare\\.com/g)\n if (!urlMatch || urlMatch.length === 0) {\n return null\n }\n return urlMatch[urlMatch.length - 1] ?? null\n}\n\nfunction getAccessibleUrls(port: number): string[] {\n const urls = new Set<string>([`http://localhost:${String(port)}`])\n try {\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) {\n continue\n }\n for (const entry of entries) {\n if (entry.internal) {\n continue\n }\n if (entry.family === 'IPv4') {\n urls.add(`http://${entry.address}:${String(port)}`)\n }\n }\n }\n } catch {}\n return Array.from(urls)\n}\n\nfunction isTailscaleIPv4Address(address: string): boolean {\n const parts = address.split('.')\n if (parts.length !== 4) return false\n const octets = parts.map((part) => Number.parseInt(part, 10))\n if (octets.some((value) => Number.isNaN(value) || value < 0 || value > 255)) return false\n return octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127\n}\n\nfunction isTailscaleIPv6Address(address: string): boolean {\n const normalized = address.toLowerCase()\n return normalized.startsWith('fd7a:115c:a1e0:')\n}\n\nfunction hasDetectedTailscaleIp(): boolean {\n try {\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) continue\n for (const entry of entries) {\n if (entry.internal) continue\n if (entry.family === 'IPv4' && isTailscaleIPv4Address(entry.address)) return true\n if (entry.family === 'IPv6' && isTailscaleIPv6Address(entry.address)) return true\n }\n }\n } catch {}\n return false\n}\n\nasync function startCloudflaredTunnel(command: string, localPort: number): Promise<{\n process: ReturnType<typeof spawn>\n url: string\n}> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, ['tunnel', '--url', `http://localhost:${String(localPort)}`], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n reject(new Error('Timed out waiting for cloudflared tunnel URL'))\n }, 20000)\n\n const handleData = (value: Buffer | string) => {\n const text = String(value)\n const parsedUrl = parseCloudflaredUrl(text)\n if (!parsedUrl) {\n return\n }\n clearTimeout(timeout)\n child.stdout?.off('data', handleData)\n child.stderr?.off('data', handleData)\n resolve({ process: child, url: parsedUrl })\n }\n\n const onError = (error: Error) => {\n clearTimeout(timeout)\n reject(new Error(`Failed to start cloudflared: ${error.message}`))\n }\n\n child.once('error', onError)\n child.stdout?.on('data', handleData)\n child.stderr?.on('data', handleData)\n\n child.once('exit', (code) => {\n if (code === 0) {\n return\n }\n clearTimeout(timeout)\n reject(new Error(`cloudflared exited before providing a URL (code ${String(code)})`))\n })\n })\n}\n\nfunction listenWithFallback(server: ReturnType<typeof createServer>, startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const attempt = (port: number) => {\n const onError = (error: NodeJS.ErrnoException) => {\n server.off('listening', onListening)\n if (error.code === 'EADDRINUSE' || error.code === 'EACCES') {\n attempt(port + 1)\n return\n }\n reject(error)\n }\n const onListening = () => {\n server.off('error', onError)\n resolve(port)\n }\n\n server.once('error', onError)\n server.once('listening', onListening)\n server.listen(port, '0.0.0.0')\n }\n\n attempt(startPort)\n })\n}\n\nfunction getCodexGlobalStatePath(): string {\n const codexHome = getCodexHomePath()\n return join(codexHome, '.codex-global-state.json')\n}\n\nfunction normalizeUniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const next: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') continue\n const trimmed = item.trim()\n if (!trimmed || next.includes(trimmed)) continue\n next.push(trimmed)\n }\n return next\n}\n\nasync function persistLaunchProject(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) return\n const normalizedPath = isAbsolute(trimmed) ? trimmed : resolve(trimmed)\n const directoryInfo = await stat(normalizedPath)\n if (!directoryInfo.isDirectory()) {\n throw new Error(`Not a directory: ${normalizedPath}`)\n }\n\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n payload = parsed as Record<string, unknown>\n }\n } catch {\n payload = {}\n }\n\n const roots = normalizeUniqueStrings(payload['electron-saved-workspace-roots'])\n const activeRoots = normalizeUniqueStrings(payload['active-workspace-roots'])\n payload['electron-saved-workspace-roots'] = [\n normalizedPath,\n ...roots.filter((value) => value !== normalizedPath),\n ]\n payload['active-workspace-roots'] = [\n normalizedPath,\n ...activeRoots.filter((value) => value !== normalizedPath),\n ]\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function addProjectOnly(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) {\n throw new Error('Missing project path')\n }\n await persistLaunchProject(trimmed)\n}\n\nasync function startServer(options: {\n port: string\n password: string | boolean\n tunnel: boolean\n open: boolean\n login: boolean\n sandboxMode?: string\n approvalPolicy?: string\n projectPath?: string\n}) {\n const version = await readCliVersion()\n const projectPath = options.projectPath?.trim() ?? ''\n if (projectPath.length > 0) {\n try {\n await persistLaunchProject(projectPath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[project] Could not open launch project: ${message}\\n`)\n }\n }\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (codexCommand) {\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n }\n if (options.sandboxMode) {\n process.env.CODEXUI_SANDBOX_MODE = options.sandboxMode\n }\n if (options.approvalPolicy) {\n process.env.CODEXUI_APPROVAL_POLICY = options.approvalPolicy\n }\n const runtimeConfig = resolveAppServerRuntimeConfig()\n if (options.login && !hasCodexAuth()) {\n console.log('\\nCodex is not logged in. You can log in later via settings or run `codexui login`.\\n')\n }\n const requestedPort = parseInt(options.port, 10)\n const passwordResolution = resolvePassword(options.password)\n const password = passwordResolution.password\n const generatedPasswordPath = password && passwordResolution.generated\n ? await persistGeneratedPassword(password)\n : null\n const { app, dispose, attachWebSocket } = createApp({ password })\n const server = createServer(app)\n attachWebSocket(server)\n const port = await listenWithFallback(server, requestedPort)\n let tunnelChild: ReturnType<typeof spawn> | null = null\n let tunnelUrl: string | null = null\n\n if (options.tunnel) {\n try {\n const cloudflaredCommand = await resolveCloudflaredForTunnel()\n if (!cloudflaredCommand) {\n throw new Error('cloudflared is not installed')\n }\n const tunnel = await startCloudflaredTunnel(cloudflaredCommand, port)\n tunnelChild = tunnel.process\n tunnelUrl = tunnel.url\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[cloudflared] Tunnel not started: ${message}`)\n }\n }\n\n const lines = [\n '',\n 'Codex Web Local is running!',\n ` Version: ${version}`,\n ' GitHub: https://github.com/friuns2/codexui',\n '',\n ` Bind: http://0.0.0.0:${String(port)}`,\n ` Codex sandbox: ${runtimeConfig.sandboxMode}`,\n ` Approval policy: ${runtimeConfig.approvalPolicy}`,\n ]\n const accessUrls = getAccessibleUrls(port)\n if (accessUrls.length > 0) {\n lines.push(` Local: ${accessUrls[0]}`)\n for (const accessUrl of accessUrls.slice(1)) {\n lines.push(` Network: ${accessUrl}`)\n }\n }\n\n if (port !== requestedPort) {\n lines.push(` Requested port ${String(requestedPort)} was unavailable; using ${String(port)}.`)\n }\n\n if (generatedPasswordPath) {\n lines.push(` Generated password file: ${generatedPasswordPath}`)\n lines.push(' Use that file to retrieve the password for untrusted origins.')\n }\n\n const tunnelQrUrl = tunnelUrl ? buildTunnelAutologinUrl(tunnelUrl, password) : null\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelQrUrl ?? tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelQrUrl) {\n qrcode.generate(tunnelQrUrl, { small: true })\n console.log('')\n }\n if (options.open) openBrowser(`http://localhost:${String(port)}`)\n\n function shutdown() {\n console.log('\\nShutting down...')\n if (tunnelChild && !tunnelChild.killed) {\n tunnelChild.kill('SIGTERM')\n }\n server.close(() => {\n dispose()\n process.exit(0)\n })\n // Force exit after timeout\n setTimeout(() => {\n dispose()\n process.exit(1)\n }, 5000).unref()\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n}\n\nasync function runLogin() {\n const codexCommand = ensureCodexInstalled() ?? 'codex'\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .argument('[projectPath]', 'project directory to open on launch')\n .option('--open-project <path>', 'open project directory on launch (Codex desktop parity)')\n .option('-p, --port <port>', 'port to listen on', '5900')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel (default is auto by Tailscale detection)', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .option('--open', 'open browser on startup', true)\n .option('--no-open', 'do not open browser on startup')\n .option('--login', 'run automatic Codex login bootstrap', true)\n .option('--no-login', 'skip automatic Codex login bootstrap')\n .option('--sandbox-mode <mode>', 'Codex sandbox mode: read-only, workspace-write, danger-full-access')\n .option('--approval-policy <policy>', 'Codex approval policy: untrusted, on-failure, on-request, never')\n .action(async (\n projectPath: string | undefined,\n opts: {\n port: string\n password: string | boolean\n tunnel: boolean\n open: boolean\n login: boolean\n sandboxMode?: string\n approvalPolicy?: string\n openProject?: string\n },\n ) => {\n const rawArgv = process.argv.slice(2)\n const openProjectFlagIndex = rawArgv.findIndex((arg) => arg === '--open-project' || arg.startsWith('--open-project='))\n const tunnelFlagExplicit = rawArgv.some((arg) => (\n arg === '--tunnel'\n || arg === '--no-tunnel'\n || arg.startsWith('--tunnel=')\n || arg.startsWith('--no-tunnel=')\n ))\n const effectiveTunnel = tunnelFlagExplicit ? opts.tunnel : hasDetectedTailscaleIp()\n\n let openProjectOnly = (opts.openProject ?? '').trim()\n if (!openProjectOnly && openProjectFlagIndex >= 0 && projectPath?.trim()) {\n // Commander may map \"--open-project .\" to the positional arg in this command layout.\n openProjectOnly = projectPath.trim()\n }\n if (openProjectOnly.length > 0) {\n await addProjectOnly(openProjectOnly)\n console.log(`Added project: ${openProjectOnly}`)\n return\n }\n\n const launchProject = (projectPath ?? '').trim()\n if (opts.sandboxMode) {\n const parsedSandboxMode = parseSandboxMode(opts.sandboxMode)\n if (!parsedSandboxMode) {\n throw new Error(`Invalid sandbox mode: ${opts.sandboxMode}`)\n }\n opts.sandboxMode = parsedSandboxMode\n }\n if (opts.approvalPolicy) {\n const parsedApprovalPolicy = parseApprovalPolicy(opts.approvalPolicy)\n if (!parsedApprovalPolicy) {\n throw new Error(`Invalid approval policy: ${opts.approvalPolicy}`)\n }\n opts.approvalPolicy = parsedApprovalPolicy\n }\n await startServer({ ...opts, tunnel: effectiveTunnel, projectPath: launchProject })\n })\n\nprogram.command('login').description('Install/check Codex CLI and run `codex login`').action(runLogin)\n\nprogram.command('help').description('Show codexui command help').action(() => {\n program.outputHelp()\n})\n\nprogram.parseAsync(process.argv).catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\\nFailed to run codexui: ${message}`)\n process.exit(1)\n})\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\n\nexport type CommandInvocation = {\n command: string\n args: string[]\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n const unique: string[] = []\n for (const value of values) {\n const normalized = value?.trim()\n if (!normalized || unique.includes(normalized)) continue\n unique.push(normalized)\n }\n return unique\n}\n\nfunction isPathLike(command: string): boolean {\n return command.includes('/') || command.includes('\\\\') || /^[a-zA-Z]:/.test(command)\n}\n\nfunction isRunnableCommand(command: string, args: string[] = []): boolean {\n if (isPathLike(command) && !existsSync(command)) {\n return false\n }\n return canRunCommand(command, args)\n}\n\nfunction getWindowsAppDataNpmPrefix(): string | null {\n const appData = process.env.APPDATA?.trim()\n return appData ? join(appData, 'npm') : null\n}\n\nfunction getPotentialNpmPrefixes(): string[] {\n return uniqueStrings([\n process.env.npm_config_prefix,\n process.env.PREFIX,\n getUserNpmPrefix(),\n process.platform === 'win32' ? getWindowsAppDataNpmPrefix() : null,\n ])\n}\n\nfunction getPotentialCodexPackageDirs(prefix: string): string[] {\n const dirs = [join(prefix, 'node_modules', '@openai', 'codex')]\n if (process.platform !== 'win32') {\n dirs.push(join(prefix, 'lib', 'node_modules', '@openai', 'codex'))\n }\n return dirs\n}\n\nfunction getPotentialCodexExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'codex',\n 'codex.exe',\n )\n : join(packageDir, 'bin', 'codex')\n ))\n}\n\nfunction getPotentialRipgrepExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'path',\n 'rg.exe',\n )\n : join(packageDir, 'bin', 'rg')\n ))\n}\n\nexport function canRunCommand(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, {\n stdio: 'ignore',\n windowsHide: true,\n })\n return !result.error && result.status === 0\n}\n\nexport function getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nexport function getNpmGlobalBinDir(prefix: string): string {\n return process.platform === 'win32' ? prefix : join(prefix, 'bin')\n}\n\nexport function prependPathEntry(existingPath: string, entry: string): string {\n const normalizedEntry = entry.trim()\n if (!normalizedEntry) return existingPath\n\n const parts = existingPath\n .split(delimiter)\n .map((value) => value.trim())\n .filter(Boolean)\n\n if (parts.includes(normalizedEntry)) {\n return existingPath\n }\n\n return existingPath ? `${normalizedEntry}${delimiter}${existingPath}` : normalizedEntry\n}\n\nexport function resolveCodexCommand(): string | null {\n const explicit = process.env.CODEXUI_CODEX_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialCodexExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'codex']\n : ['codex', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveRipgrepCommand(): string | null {\n const explicit = process.env.CODEXUI_RG_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialRipgrepExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'rg']\n : ['rg', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolvePythonCommand(): CommandInvocation | null {\n const candidates: CommandInvocation[] = process.platform === 'win32'\n ? [\n { command: 'python', args: [] },\n { command: 'py', args: ['-3'] },\n { command: 'python3', args: [] },\n ]\n : [\n { command: 'python3', args: [] },\n { command: 'python', args: [] },\n ]\n\n for (const candidate of candidates) {\n if (isRunnableCommand(candidate.command, [...candidate.args, '--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveSkillInstallerScriptPath(codexHome?: string): string | null {\n const normalizedCodexHome = codexHome?.trim()\n const candidates = uniqueStrings([\n normalizedCodexHome\n ? join(normalizedCodexHome, 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n process.env.CODEX_HOME?.trim()\n ? join(process.env.CODEX_HOME.trim(), 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n join(homedir(), '.codex', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n join(homedir(), '.cursor', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n ])\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n","const SANDBOX_MODES = new Set([\n 'read-only',\n 'workspace-write',\n 'danger-full-access',\n] as const)\n\nconst APPROVAL_POLICIES = new Set([\n 'untrusted',\n 'on-failure',\n 'on-request',\n 'never',\n] as const)\n\nexport type CodexSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'\nexport type CodexApprovalPolicy = 'untrusted' | 'on-failure' | 'on-request' | 'never'\n\ntype AppServerRuntimeConfig = {\n sandboxMode: CodexSandboxMode\n approvalPolicy: CodexApprovalPolicy\n}\n\nconst DEFAULT_RUNTIME_CONFIG: AppServerRuntimeConfig = {\n sandboxMode: 'danger-full-access',\n approvalPolicy: 'never',\n}\n\nfunction normalizeRuntimeValue(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? ''\n}\n\nfunction readSandboxModeFromEnv(): CodexSandboxMode {\n const candidate = normalizeRuntimeValue(process.env.CODEXUI_SANDBOX_MODE)\n if (SANDBOX_MODES.has(candidate as CodexSandboxMode)) {\n return candidate as CodexSandboxMode\n }\n return DEFAULT_RUNTIME_CONFIG.sandboxMode\n}\n\nfunction readApprovalPolicyFromEnv(): CodexApprovalPolicy {\n const candidate = normalizeRuntimeValue(process.env.CODEXUI_APPROVAL_POLICY)\n if (APPROVAL_POLICIES.has(candidate as CodexApprovalPolicy)) {\n return candidate as CodexApprovalPolicy\n }\n return DEFAULT_RUNTIME_CONFIG.approvalPolicy\n}\n\nexport function resolveAppServerRuntimeConfig(): AppServerRuntimeConfig {\n return {\n sandboxMode: readSandboxModeFromEnv(),\n approvalPolicy: readApprovalPolicyFromEnv(),\n }\n}\n\nexport function buildAppServerArgs(): string[] {\n const config = resolveAppServerRuntimeConfig()\n return [\n 'app-server',\n '-c',\n `approval_policy=\"${config.approvalPolicy}\"`,\n '-c',\n `sandbox_mode=\"${config.sandboxMode}\"`,\n ]\n}\n\nexport function parseSandboxMode(value: string): CodexSandboxMode | null {\n const candidate = value.trim().toLowerCase()\n return SANDBOX_MODES.has(candidate as CodexSandboxMode) ? candidate as CodexSandboxMode : null\n}\n\nexport function parseApprovalPolicy(value: string): CodexApprovalPolicy | null {\n const candidate = value.trim().toLowerCase()\n return APPROVAL_POLICIES.has(candidate as CodexApprovalPolicy) ? candidate as CodexApprovalPolicy : null\n}\n","import { fileURLToPath } from 'node:url'\nimport { dirname, extname, isAbsolute, join } from 'node:path'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport { existsSync } from 'node:fs'\nimport { writeFile, stat } from 'node:fs/promises'\nimport express, { type Express } from 'express'\nimport { createCodexBridgeMiddleware } from './codexAppServerBridge.js'\nimport { createAuthSession } from './authMiddleware.js'\nimport { createDirectoryListingHtml, createTextEditorHtml, decodeBrowsePath, getLocalDirectoryListing, isTextEditableFile, normalizeLocalPath } from './localBrowseUi.js'\nimport { WebSocketServer, type WebSocket } from 'ws'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst distDir = join(__dirname, '..', 'dist')\nconst spaEntryFile = join(distDir, 'index.html')\n\nexport type ServerOptions = {\n password?: string\n}\n\nexport type ServerInstance = {\n app: Express\n dispose: () => void\n attachWebSocket: (server: HttpServer) => void\n}\n\nconst IMAGE_CONTENT_TYPES: Record<string, string> = {\n '.avif': 'image/avif',\n '.bmp': 'image/bmp',\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n}\n\nfunction renderFrontendMissingHtml(message: string, details?: string[]): string {\n const lines = details && details.length > 0 ? `<pre>${details.join('\\n')}</pre>` : ''\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head><meta charset=\"utf-8\"><title>Codex Web UI Error</title></head>',\n '<body>',\n `<h1>${message}</h1>`,\n lines,\n '<p>Redirecting to chat in 3 seconds...</p>',\n '<p><a href=\"/\">Back to chat</a></p>',\n '<script>',\n 'setTimeout(() => { window.location.assign(\"/\") }, 3000)',\n '</script>',\n '</body>',\n '</html>',\n ].join('')\n}\n\nfunction normalizeLocalImagePath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nfunction readWildcardPathParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value.join('/')\n return ''\n}\n\nexport function createServer(options: ServerOptions = {}): ServerInstance {\n const app = express()\n const bridge = createCodexBridgeMiddleware()\n const authSession = options.password ? createAuthSession(options.password) : null\n\n // 1. Auth middleware (if password is set)\n if (authSession) {\n app.use(authSession.middleware)\n }\n\n // 2. Bridge middleware for /codex-api/*\n app.use(bridge)\n\n // 3. Serve local images referenced in markdown (desktop parity for absolute image paths)\n app.get('/codex-local-image', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalImagePath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n const contentType = IMAGE_CONTENT_TYPES[extname(localPath).toLowerCase()]\n if (!contentType) {\n res.status(415).json({ error: 'Unsupported image type.' })\n return\n }\n\n res.type(contentType)\n res.setHeader('Cache-Control', 'private, max-age=300')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'Image file not found.' })\n })\n })\n\n // 4. Serve local files inline for direct file open.\n app.get('/codex-local-file', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n res.setHeader('Cache-Control', 'private, no-store')\n res.setHeader('Content-Disposition', 'inline')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n })\n\n // 5. Return JSON directory listings for the integrated folder picker.\n app.get('/codex-local-directories', async (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const showHidden = typeof req.query.showHidden === 'string'\n && ['1', 'true', 'yes', 'on'].includes(req.query.showHidden.toLowerCase())\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local directory path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isDirectory()) {\n res.status(400).json({ error: 'Expected directory path.' })\n return\n }\n const data = await getLocalDirectoryListing(localPath, { showHidden })\n res.status(200).json({ data })\n } catch {\n res.status(404).json({ error: 'Directory not found.' })\n }\n })\n\n // 6. Serve local files by path to preserve relative asset loading for HTML.\n app.get('/codex-local-browse/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n const newProjectName = typeof req.query.newProjectName === 'string' ? req.query.newProjectName : ''\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n res.setHeader('Cache-Control', 'private, no-store')\n if (fileStat.isDirectory()) {\n const html = await createDirectoryListingHtml(localPath, { newProjectName })\n res.status(200).type('text/html; charset=utf-8').send(html)\n return\n }\n\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n // 7. Edit text-like local files.\n app.get('/codex-local-edit/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) {\n res.status(400).json({ error: 'Expected file path.' })\n return\n }\n const html = await createTextEditorHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n app.put('/codex-local-edit/*path', express.text({ type: '*/*', limit: '10mb' }), async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n if (!(await isTextEditableFile(localPath))) {\n res.status(415).json({ error: 'Only text-like files are editable.' })\n return\n }\n const body = typeof req.body === 'string' ? req.body : ''\n try {\n await writeFile(localPath, body, 'utf8')\n res.status(200).json({ ok: true })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n const hasFrontendAssets = existsSync(spaEntryFile)\n\n // 8. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 9. SPA fallback\n app.use((_req, res) => {\n if (!hasFrontendAssets) {\n res\n .status(503)\n .type('text/html; charset=utf-8')\n .send(\n renderFrontendMissingHtml('Codex web UI assets are missing.', [\n `Expected: ${spaEntryFile}`,\n 'If running from source, build frontend assets with: pnpm run build:frontend',\n 'If running with npx, clear the npx cache and reinstall codexapp.',\n ]),\n )\n return\n }\n\n res.sendFile(spaEntryFile, (error) => {\n if (!error) return\n if (!res.headersSent) {\n res.status(404).type('text/html; charset=utf-8').send(renderFrontendMissingHtml('Frontend entry file not found.'))\n }\n })\n })\n\n return {\n app,\n dispose: () => bridge.dispose(),\n attachWebSocket: (server: HttpServer) => {\n const wss = new WebSocketServer({ noServer: true })\n\n server.on('upgrade', (req: IncomingMessage, socket, head) => {\n const url = new URL(req.url ?? '', 'http://localhost')\n if (url.pathname !== '/codex-api/ws') {\n return\n }\n\n if (authSession && !authSession.isRequestAuthorized(req)) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n')\n socket.destroy()\n return\n }\n\n wss.handleUpgrade(req, socket, head, (ws: WebSocket) => {\n wss.emit('connection', ws, req)\n })\n })\n\n wss.on('connection', (ws: WebSocket) => {\n ws.send(JSON.stringify({ method: 'ready', params: { ok: true }, atIso: new Date().toISOString() }))\n const unsubscribe = bridge.subscribeNotifications((notification) => {\n if (ws.readyState !== 1) return\n ws.send(JSON.stringify(notification))\n })\n\n ws.on('close', unsubscribe)\n ws.on('error', unsubscribe)\n })\n },\n }\n}\n","import { spawn, spawnSync, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rename, rm, mkdir, stat, cp, lstat, readlink, symlink } from 'node:fs/promises'\nimport { createReadStream, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpRequest } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { writeFile } from 'node:fs/promises'\nimport { handleAccountRoutes } from './accountRoutes.js'\nimport { buildAppServerArgs } from './appServerRuntimeConfig.js'\nimport { handleReviewRoutes } from './reviewGit.js'\nimport { handleSkillsRoutes, initializeSkillsSyncOnStartup } from './skillsRoutes.js'\nimport { TelegramThreadBridge } from './telegramThreadBridge.js'\nimport {\n getRandomFreeKey,\n getFreeKeyCount,\n FREE_MODE_PROVIDER_ID,\n FREE_MODE_DEFAULT_MODEL,\n getCachedFreeModels,\n getFreeModels,\n refreshFreeModelsInBackground,\n FREE_MODE_STATE_FILE,\n createDefaultOpenCodeZenFreeModeState,\n getFreeModeConfigArgs,\n getFreeModeEnvVars,\n shouldCreateDefaultFreeModeStateForMissingAuth,\n type FreeModeState,\n} from './freeMode.js'\nimport { handleOpenRouterProxyRequest } from './openRouterProxy.js'\nimport { handleZenProxyRequest } from './zenProxy.js'\nimport { handleCustomEndpointProxyRequest } from './customEndpointProxy.js'\nimport { ThreadTerminalManager } from './terminalManager.js'\nimport { getSpawnInvocation } from '../utils/commandInvocation.js'\nimport {\n resolveCodexCommand,\n resolveRipgrepCommand,\n} from '../commandResolution.js'\nimport type { CollaborationModeKind, ReasoningEffort } from '../types/codex.js'\n\ntype JsonRpcCall = {\n jsonrpc: '2.0'\n id: number\n method: string\n params?: unknown\n}\n\ntype JsonRpcResponse = {\n id?: number\n result?: unknown\n error?: {\n code: number\n message: string\n }\n method?: string\n params?: unknown\n}\n\ntype RpcProxyRequest = {\n method: string\n params?: unknown\n}\n\ntype RpcExecutor = {\n rpc: (method: string, params: unknown) => Promise<unknown>\n}\n\ntype ServerRequestReply = {\n result?: unknown\n error?: {\n code: number\n message: string\n }\n}\n\ntype WorkspaceRootsState = {\n order: string[]\n labels: Record<string, string>\n active: string[]\n projectOrder: string[]\n remoteProjects: Array<{\n id: string\n hostId: string\n remotePath: string\n label: string\n }>\n}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\n}\n\ntype ChatgptAuthTokensRefreshParams = {\n reason?: string\n previousAccountId?: string | null\n}\n\ntype ChatgptAuthTokensRefreshResponse = {\n accessToken: string\n chatgptAccountId: string\n chatgptPlanType: string | null\n}\n\ntype ThreadSearchDocument = {\n id: string\n title: string\n preview: string\n messageText: string\n searchableText: string\n}\n\ntype ThreadSearchIndex = {\n docsById: Map<string, ThreadSearchDocument>\n}\n\ntype ProviderModelsResponse = {\n data: string[]\n providerId: string\n source: 'provider'\n}\n\ntype ComposioUserData = {\n apiKey: string\n baseUrl: string\n webUrl: string\n orgId: string\n testUserId: string\n}\n\ntype ComposioStatusResponse = {\n available: boolean\n authenticated: boolean\n cliVersion: string\n email: string\n defaultOrgName: string\n defaultOrgId: string\n webUrl: string\n baseUrl: string\n testUserId: string\n}\n\ntype ComposioConnectionSummary = {\n id: string\n wordId: string\n alias: string\n status: string\n authScheme: string\n createdAt: string\n updatedAt: string\n isComposioManaged: boolean\n isDisabled: boolean\n}\n\ntype ComposioConnectorSummary = {\n slug: string\n name: string\n description: string\n logoUrl: string\n latestVersion: string\n toolsCount: number\n triggersCount: number\n isNoAuth: boolean\n enabled: boolean\n authModes: string[]\n activeCount: number\n totalConnections: number\n connectionStatuses: string[]\n}\n\ntype ComposioToolSummary = {\n slug: string\n name: string\n description: string\n}\n\ntype ComposioConnectorDetail = {\n connector: ComposioConnectorSummary\n connections: ComposioConnectionSummary[]\n tools: ComposioToolSummary[]\n dashboardUrl: string\n}\n\ntype ComposioLinkResult = {\n status: string\n message: string\n connectedAccountId: string\n redirectUrl: string\n toolkit: string\n projectType: string\n}\n\ntype ComposioLoginResult = {\n status: string\n message: string\n loginUrl: string\n cliKey: string\n expiresAt: string\n}\n\ntype ComposioInstallResult = {\n ok: boolean\n command: string\n output: string\n}\n\ntype ComposioConnectorPage = {\n data: ComposioConnectorSummary[]\n nextCursor: string | null\n total: number\n}\n\nconst COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX = 1000\n\nconst PROVIDER_MODELS_FETCH_TIMEOUT_MS = 5_000\n\nconst THREAD_RESPONSE_TURN_LIMIT = 10\nconst THREAD_TURN_PAGE_READ_CACHE_TTL_MS = 30_000\nconst THREAD_METHODS_WITH_TURNS = new Set(['thread/read', 'thread/resume', 'thread/fork', 'thread/rollback'])\nconst THREAD_SEARCH_FULL_TEXT_THREAD_LIMIT = 100\nconst PROJECTLESS_THREAD_DIRECTORY_MAX_ATTEMPTS = 100\nconst PROJECTLESS_THREAD_SLUG_MAX_LENGTH = 80\nconst API_PERF_LOGGING_ENV_KEY = 'CODEXUI_API_PERF_LOGGING'\nconst API_PERF_MS_THRESHOLD_ENV_KEY = 'CODEXUI_API_PERF_MS_THRESHOLD'\nconst API_PERF_BODY_MB_THRESHOLD_ENV_KEY = 'CODEXUI_API_PERF_BODY_MB_THRESHOLD'\nconst DEFAULT_API_PERF_MS_THRESHOLD = 300\nconst DEFAULT_API_PERF_BODY_MB_THRESHOLD = 1\nconst MB_DIVISOR = 1024 * 1024\nconst COMPOSIO_USER_DATA_PATH = join(homedir(), '.composio', 'user_data.json')\n\ntype SessionRecoveredFileChange = {\n path: string\n operation: 'add' | 'delete' | 'update'\n movedToPath: string | null\n diff: string\n addedLineCount: number\n removedLineCount: number\n}\n\ntype SessionRecoveredTurnFileChanges = {\n turnId: string\n turnIndex: number\n fileChanges: SessionRecoveredFileChange[]\n}\n\ntype SessionRecoveredSkillInput = {\n name: string\n path: string\n}\n\ntype SessionSkillInputCacheEntry = {\n size: number\n mtimeMs: number\n skillsByTurnId: Map<string, SessionRecoveredSkillInput[]>\n}\n\nconst SESSION_SKILL_INPUT_CACHE_LIMIT = 64\nconst sessionSkillInputCache = new Map<string, SessionSkillInputCacheEntry>()\n\nfunction parseSessionSkillText(value: string): SessionRecoveredSkillInput | null {\n const trimmed = value.trim()\n if (!trimmed.startsWith('<skill>')) return null\n const name = trimmed.match(/<name>\\s*([\\s\\S]*?)\\s*<\\/name>/u)?.[1]?.trim() ?? ''\n const path = trimmed.match(/<path>\\s*([\\s\\S]*?)\\s*<\\/path>/u)?.[1]?.trim() ?? ''\n if (!name || !path) return null\n return { name, path }\n}\n\nfunction buildSessionSkillInputsByTurn(sessionLogRaw: string): Map<string, SessionRecoveredSkillInput[]> {\n let currentTurnId = ''\n const skillsByTurnId = new Map<string, SessionRecoveredSkillInput[]>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const payloadRecord = asRecord(row.payload)\n currentTurnId = readNonEmptyString(payloadRecord?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const payloadRecord = asRecord(row.payload)\n if (payloadRecord?.type === 'task_started') {\n currentTurnId = readNonEmptyString(payloadRecord.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId) continue\n const payloadRecord = asRecord(row.payload)\n if (payloadRecord?.type !== 'message' || payloadRecord.role !== 'user') continue\n const content = Array.isArray(payloadRecord.content) ? payloadRecord.content : []\n\n for (const contentItem of content) {\n const contentRecord = asRecord(contentItem)\n if (contentRecord?.type !== 'input_text' || typeof contentRecord.text !== 'string') continue\n const skill = parseSessionSkillText(contentRecord.text)\n if (!skill) continue\n const existing = skillsByTurnId.get(currentTurnId) ?? []\n if (!existing.some((item) => item.path === skill.path)) {\n existing.push(skill)\n skillsByTurnId.set(currentTurnId, existing)\n }\n }\n }\n\n return skillsByTurnId\n}\n\nasync function readCachedSessionSkillInputsByTurn(sessionPath: string): Promise<Map<string, SessionRecoveredSkillInput[]>> {\n const sessionStat = await stat(sessionPath)\n const cached = sessionSkillInputCache.get(sessionPath)\n if (cached && cached.size === sessionStat.size && cached.mtimeMs === sessionStat.mtimeMs) {\n return cached.skillsByTurnId\n }\n\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n const skillsByTurnId = buildSessionSkillInputsByTurn(sessionLogRaw)\n sessionSkillInputCache.set(sessionPath, {\n size: sessionStat.size,\n mtimeMs: sessionStat.mtimeMs,\n skillsByTurnId,\n })\n if (sessionSkillInputCache.size > SESSION_SKILL_INPUT_CACHE_LIMIT) {\n const oldestKey = sessionSkillInputCache.keys().next().value\n if (oldestKey) sessionSkillInputCache.delete(oldestKey)\n }\n return skillsByTurnId\n}\n\nfunction mergeSessionSkillInputsIntoTurnsFromMap(\n turns: unknown[],\n skillsByTurnId: Map<string, SessionRecoveredSkillInput[]>,\n): unknown[] {\n const turnIds = new Set<string>()\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) turnIds.add(turnId)\n }\n if (turnIds.size === 0) return turns\n\n if (skillsByTurnId.size === 0) return turns\n\n let changed = false\n const nextTurns = turns.map((turn) => {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n const skills = turnId ? skillsByTurnId.get(turnId) : undefined\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : null\n if (!turnRecord || !skills || skills.length === 0 || !items) return turn\n\n let targetUserMessageIndex = -1\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const itemRecord = asRecord(items[index])\n if (itemRecord?.type === 'userMessage' && Array.isArray(itemRecord.content)) {\n targetUserMessageIndex = index\n break\n }\n }\n if (targetUserMessageIndex < 0) return turn\n\n let addedToMessage = false\n const nextItems = items.map((item, index) => {\n const itemRecord = asRecord(item)\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : null\n if (index !== targetUserMessageIndex || itemRecord?.type !== 'userMessage' || !content) return item\n\n const existingSkillPaths = new Set(\n content.flatMap((contentItem) => {\n const contentRecord = asRecord(contentItem)\n const path = typeof contentRecord?.path === 'string' ? contentRecord.path.trim() : ''\n return contentRecord?.type === 'skill' && path ? [path] : []\n }),\n )\n const missingSkills = skills.filter((skill) => !existingSkillPaths.has(skill.path))\n if (missingSkills.length === 0) return item\n\n addedToMessage = true\n changed = true\n return {\n ...itemRecord,\n content: [\n ...content,\n ...missingSkills.map((skill) => ({ type: 'skill', name: skill.name, path: skill.path })),\n ],\n }\n })\n\n return addedToMessage ? { ...turnRecord, items: nextItems } : turn\n })\n\n return changed ? nextTurns : turns\n}\n\nexport function mergeSessionSkillInputsIntoTurns(turns: unknown[], sessionLogRaw: string): unknown[] {\n return mergeSessionSkillInputsIntoTurnsFromMap(turns, buildSessionSkillInputsByTurn(sessionLogRaw))\n}\n\nasync function mergeSessionSkillInputsIntoThreadResult(result: unknown): Promise<unknown> {\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n const sessionPath = readNonEmptyString(thread?.path)\n if (!record || !thread || !turns || turns.length === 0 || !sessionPath || !isAbsolute(sessionPath)) {\n return result\n }\n\n try {\n const skillsByTurnId = await readCachedSessionSkillInputsByTurn(sessionPath)\n const mergedTurns = mergeSessionSkillInputsIntoTurnsFromMap(turns, skillsByTurnId)\n if (mergedTurns === turns) return result\n return {\n ...record,\n thread: {\n ...thread,\n turns: mergedTurns,\n },\n }\n } catch {\n return result\n }\n}\n\nfunction readEnvValueFromFile(filePath: string, key: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf8')\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const match = content.match(new RegExp(`^\\\\s*${escapedKey}\\\\s*=\\\\s*(.+)\\\\s*$`, 'm'))\n if (!match) return null\n const rawValue = match[1]?.trim() ?? ''\n if (!rawValue) return null\n if ((rawValue.startsWith('\"') && rawValue.endsWith('\"')) || (rawValue.startsWith('\\'') && rawValue.endsWith('\\''))) {\n return rawValue.slice(1, -1).trim()\n }\n return rawValue\n } catch {\n return null\n }\n}\n\nfunction parseBooleanEnvFlag(value: string | null | undefined): boolean | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n return null\n}\n\nfunction resolveApiPerfLoggingEnabled(): boolean {\n const explicitValue = parseBooleanEnvFlag(process.env[API_PERF_LOGGING_ENV_KEY])\n if (explicitValue !== null) return explicitValue\n\n const fromEnvLocal = parseBooleanEnvFlag(readEnvValueFromFile('.env.local', API_PERF_LOGGING_ENV_KEY))\n if (fromEnvLocal !== null) return fromEnvLocal\n\n const fromEnv = parseBooleanEnvFlag(readEnvValueFromFile('.env', API_PERF_LOGGING_ENV_KEY))\n if (fromEnv !== null) return fromEnv\n\n return false\n}\n\nconst API_PERF_LOGGING_ENABLED = resolveApiPerfLoggingEnabled()\n\nfunction parseNumberEnvFlag(value: string | null | undefined): number | null {\n if (!value) return null\n const parsed = Number.parseFloat(value.trim())\n if (!Number.isFinite(parsed)) return null\n return parsed\n}\n\nfunction resolveNumericEnvConfig(envKey: string, fallback: number): number {\n const fromProcess = parseNumberEnvFlag(process.env[envKey])\n if (fromProcess !== null) return fromProcess\n\n const fromEnvLocal = parseNumberEnvFlag(readEnvValueFromFile('.env.local', envKey))\n if (fromEnvLocal !== null) return fromEnvLocal\n\n const fromEnv = parseNumberEnvFlag(readEnvValueFromFile('.env', envKey))\n if (fromEnv !== null) return fromEnv\n\n return fallback\n}\n\nconst API_PERF_MS_THRESHOLD = resolveNumericEnvConfig(API_PERF_MS_THRESHOLD_ENV_KEY, DEFAULT_API_PERF_MS_THRESHOLD)\nconst API_PERF_BODY_MB_THRESHOLD = resolveNumericEnvConfig(API_PERF_BODY_MB_THRESHOLD_ENV_KEY, DEFAULT_API_PERF_BODY_MB_THRESHOLD)\n\nfunction getChunkByteLength(chunk: unknown, encoding?: BufferEncoding): number {\n if (typeof chunk === 'string') {\n return Buffer.byteLength(chunk, encoding)\n }\n if (chunk instanceof Uint8Array) {\n return chunk.byteLength\n }\n if (ArrayBuffer.isView(chunk)) {\n return chunk.byteLength\n }\n if (chunk instanceof ArrayBuffer) {\n return chunk.byteLength\n }\n return 0\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction isInlineDataUrl(value: string): boolean {\n return /^data:/iu.test(value.trim())\n}\n\nfunction inferImageMimeTypeFromBytes(bytes: Uint8Array): string | null {\n if (\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a\n ) {\n return 'image/png'\n }\n if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return 'image/jpeg'\n }\n if (\n bytes.length >= 12 &&\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n ) {\n return 'image/webp'\n }\n if (\n bytes.length >= 6 &&\n bytes[0] === 0x47 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x38 &&\n (bytes[4] === 0x37 || bytes[4] === 0x39) &&\n bytes[5] === 0x61\n ) {\n return 'image/gif'\n }\n return null\n}\n\nfunction inferImageMimeTypeFromBase64(value: string): string | null {\n const compact = value.trim().replace(/\\s+/gu, '')\n if (compact.length < 32 || !/^[A-Za-z0-9+/]+={0,2}$/u.test(compact)) return null\n try {\n return inferImageMimeTypeFromBytes(Buffer.from(compact.slice(0, 64), 'base64'))\n } catch {\n return null\n }\n}\n\nfunction normalizeBase64ImageDataUrl(value: string, mimeType: string): string | null {\n const trimmed = value.trim()\n if (!trimmed) return null\n if (isInlineDataUrl(trimmed)) {\n return /^data:image\\//iu.test(trimmed) ? trimmed : null\n }\n const compact = trimmed.replace(/\\s+/gu, '')\n const inferredMimeType = inferImageMimeTypeFromBase64(compact)\n if (!inferredMimeType) return null\n const normalizedMimeType = mimeType.trim().toLowerCase()\n const finalMimeType = normalizedMimeType.startsWith('image/') && normalizedMimeType !== 'image/*'\n ? normalizedMimeType\n : inferredMimeType\n return `data:${finalMimeType};base64,${compact}`\n}\n\nfunction extensionFromMimeType(mimeType: string): string {\n const normalized = mimeType.trim().toLowerCase()\n if (normalized === 'image/png') return '.png'\n if (normalized === 'image/jpeg') return '.jpg'\n if (normalized === 'image/webp') return '.webp'\n if (normalized === 'image/gif') return '.gif'\n if (normalized === 'image/svg+xml') return '.svg'\n if (normalized === 'application/pdf') return '.pdf'\n return ''\n}\n\nfunction asNonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction toAttachmentLinkTarget(block: Record<string, unknown>, fallback: string): string {\n const candidate = asNonEmptyString(block.path)\n ?? asNonEmptyString(block.file_path)\n ?? asNonEmptyString(block.filename)\n ?? asNonEmptyString(block.file_id)\n ?? fallback\n if (candidate.startsWith('file://')) return candidate\n if (candidate.startsWith('/')) return `file://${candidate}`\n return `attachment://${candidate}`\n}\n\nasync function persistInlineDataUrlToLocalFile(dataUrl: string, baseName: string): Promise<string | null> {\n const trimmed = dataUrl.trim()\n const match = /^data:([^;,]*)(;base64)?,(.*)$/isu.exec(trimmed)\n if (!match) return null\n const mimeType = (match[1] ?? '').trim().toLowerCase()\n const encodedPayload = match[3] ?? ''\n let bytes: Buffer\n try {\n bytes = match[2]\n ? Buffer.from(encodedPayload, 'base64')\n : Buffer.from(decodeURIComponent(encodedPayload), 'utf8')\n } catch {\n return null\n }\n if (bytes.length === 0) return null\n\n const hash = createHash('sha1').update(bytes).digest('hex')\n const ext = extensionFromMimeType(mimeType)\n const mediaDir = join(tmpdir(), 'codex-web-inline-media')\n await mkdir(mediaDir, { recursive: true })\n const fileName = `${baseName}-${hash}${ext}`\n const filePath = join(mediaDir, fileName)\n try {\n await stat(filePath)\n } catch {\n await writeFile(filePath, bytes)\n }\n return filePath\n}\n\nfunction toLocalImageProxyUrl(path: string): string {\n return `/codex-local-image?path=${encodeURIComponent(path)}`\n}\n\nconst INLINE_IMAGE_FIELD_NAMES = new Set([\n 'b64_json',\n 'image',\n 'image_url',\n 'images',\n 'result',\n 'url',\n])\n\ntype InlinePayloadSanitizeContext = {\n turnId: string\n itemId: string\n blockIndex: number\n fieldName?: string\n}\n\nfunction isPotentialInlineImageField(fieldName: string | undefined): boolean {\n return typeof fieldName === 'string' && INLINE_IMAGE_FIELD_NAMES.has(fieldName)\n}\n\nasync function sanitizeInlineImageString(\n value: string,\n context: InlinePayloadSanitizeContext,\n): Promise<{ value: string; changed: boolean }> {\n if (!isPotentialInlineImageField(context.fieldName)) {\n return { value, changed: false }\n }\n\n const dataUrl = normalizeBase64ImageDataUrl(value, 'image/*')\n if (!dataUrl) return { value, changed: false }\n\n const localUrl = await persistInlineDataUrlToLocalFile(\n dataUrl,\n `inline-image-${context.turnId}-${context.itemId}-${context.fieldName}-${String(context.blockIndex)}`,\n )\n if (!localUrl) return { value, changed: false }\n\n return { value: toLocalImageProxyUrl(localUrl), changed: true }\n}\n\nasync function sanitizeInlineUserContentBlock(\n block: unknown,\n context: InlinePayloadSanitizeContext,\n): Promise<unknown> {\n const record = asRecord(block)\n if (!record) return block\n\n const type = asNonEmptyString(record.type) ?? ''\n const imageUrl = asNonEmptyString(record.url) ?? asNonEmptyString(record.image_url)\n if (imageUrl && isInlineDataUrl(imageUrl)) {\n const localUrl = await persistInlineDataUrlToLocalFile(imageUrl, `inline-image-${context.turnId}-${context.itemId}-${String(context.blockIndex)}`)\n if (localUrl) {\n const nextRecord = { ...record }\n if (typeof record.url === 'string') {\n nextRecord.url = toLocalImageProxyUrl(localUrl)\n }\n if (typeof record.image_url === 'string') {\n nextRecord.image_url = toLocalImageProxyUrl(localUrl)\n }\n return {\n ...nextRecord,\n type: 'image',\n }\n }\n const target = toAttachmentLinkTarget(record, `inline-image/${context.turnId}/${context.itemId}/${String(context.blockIndex)}`)\n return {\n type: 'text',\n text: `Image attachment: ${target}`,\n }\n }\n\n if (type === 'imageGeneration' || type === 'image_generation') {\n const rawResult = asNonEmptyString(record.result)\n ?? asNonEmptyString(record.b64_json)\n ?? asNonEmptyString(record.image)\n const mimeType = asNonEmptyString(record.mime_type)\n ?? asNonEmptyString(record.mimeType)\n ?? 'image/png'\n const dataUrl = rawResult ? normalizeBase64ImageDataUrl(rawResult, mimeType) : null\n if (dataUrl) {\n const localUrl = await persistInlineDataUrlToLocalFile(dataUrl, `generated-image-${context.turnId}-${context.itemId}`)\n if (localUrl) {\n return {\n ...record,\n type: 'imageView',\n path: localUrl,\n }\n }\n }\n }\n\n const inlineFileData = asNonEmptyString(record.file_data)\n ?? asNonEmptyString(record.data)\n ?? asNonEmptyString(record.base64)\n if ((type.includes('file') || type === 'input_file' || type === 'file') && inlineFileData) {\n const mimeType = asNonEmptyString(record.mime_type) ?? 'application/octet-stream'\n const fileDataUrl = `data:${mimeType};base64,${inlineFileData}`\n const localUrl = await persistInlineDataUrlToLocalFile(fileDataUrl, `inline-file-${context.turnId}-${context.itemId}-${String(context.blockIndex)}`)\n if (localUrl) {\n return {\n type: 'text',\n text: `File attachment: ${localUrl}`,\n }\n }\n const target = toAttachmentLinkTarget(record, `inline-file/${context.turnId}/${context.itemId}/${String(context.blockIndex)}`)\n return {\n type: 'text',\n text: `File attachment: ${target}`,\n }\n }\n\n return block\n}\n\nasync function sanitizeInlinePayloadDeep(\n value: unknown,\n context: InlinePayloadSanitizeContext,\n): Promise<{ value: unknown; changed: boolean }> {\n const maybeBlock = await sanitizeInlineUserContentBlock(value, context)\n if (maybeBlock !== value) {\n return { value: maybeBlock, changed: true }\n }\n\n if (typeof value === 'string') {\n return sanitizeInlineImageString(value, context)\n }\n\n if (Array.isArray(value)) {\n let changed = false\n const nextArray: unknown[] = []\n for (let index = 0; index < value.length; index += 1) {\n const nested = await sanitizeInlinePayloadDeep(value[index], {\n turnId: context.turnId,\n itemId: context.itemId,\n blockIndex: index,\n fieldName: context.fieldName,\n })\n if (nested.changed) changed = true\n nextArray.push(nested.value)\n }\n return changed ? { value: nextArray, changed: true } : { value, changed: false }\n }\n\n const record = asRecord(value)\n if (!record) return { value, changed: false }\n\n let changed = false\n const nextRecord: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(record)) {\n const nested = await sanitizeInlinePayloadDeep(nestedValue, {\n turnId: context.turnId,\n itemId: context.itemId,\n blockIndex: context.blockIndex,\n fieldName: key,\n })\n if (nested.changed) changed = true\n nextRecord[key] = nested.value\n }\n\n return changed ? { value: nextRecord, changed: true } : { value, changed: false }\n}\n\nexport async function sanitizeThreadTurnsInlinePayloads(method: string, result: unknown): Promise<unknown> {\n if (!THREAD_METHODS_WITH_TURNS.has(method)) return result\n\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n if (!record || !thread || !turns || turns.length === 0) return result\n\n let changed = false\n const nextTurns: unknown[] = []\n for (let turnIndex = 0; turnIndex < turns.length; turnIndex += 1) {\n const turn = turns[turnIndex]\n const turnRecord = asRecord(turn)\n const turnId = asNonEmptyString(turnRecord?.id) ?? 'turn'\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : null\n if (!turnRecord || !items) {\n nextTurns.push(turn)\n continue\n }\n\n let itemChanged = false\n const nextItems: unknown[] = []\n for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) {\n const item = items[itemIndex]\n const itemRecord = asRecord(item)\n const itemId = asNonEmptyString(itemRecord?.id) ?? 'item'\n if (!itemRecord) {\n nextItems.push(item)\n continue\n }\n const sanitizedItem = await sanitizeInlinePayloadDeep(item, {\n turnId,\n itemId,\n blockIndex: itemIndex + turnIndex,\n })\n if (!sanitizedItem.changed) {\n nextItems.push(item)\n continue\n }\n itemChanged = true\n nextItems.push(sanitizedItem.value)\n }\n\n if (!itemChanged) {\n nextTurns.push(turn)\n continue\n }\n changed = true\n nextTurns.push({\n ...turnRecord,\n items: nextItems,\n })\n }\n\n if (!changed) return result\n return {\n ...record,\n thread: {\n ...thread,\n turns: nextTurns,\n },\n }\n}\n\nfunction trimThreadTurnsInRpcResult(method: string, result: unknown): unknown {\n if (!THREAD_METHODS_WITH_TURNS.has(method)) return result\n\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n if (!record || !thread || !turns || turns.length <= THREAD_RESPONSE_TURN_LIMIT) return result\n const startTurnIndex = Math.max(0, turns.length - THREAD_RESPONSE_TURN_LIMIT)\n\n return {\n ...record,\n threadTurnStartIndex: startTurnIndex,\n thread: {\n ...thread,\n turns: turns.slice(startTurnIndex),\n },\n }\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction logProviderModelDiscoveryWarning(message: string, details: Record<string, unknown>): void {\n console.warn('[codex-provider-models]', message, details)\n}\n\nfunction isTimeoutError(payload: unknown): boolean {\n return payload instanceof Error && (payload.name === 'AbortError' || payload.name === 'TimeoutError')\n}\n\nfunction formatProjectlessDateSegment(date = new Date()): string {\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${date.getFullYear()}-${month}-${day}`\n}\n\nfunction buildProjectlessPromptSlug(prompt: string | null): string {\n const slug = prompt\n ?.toLowerCase()\n .match(/[a-z0-9]+/g)\n ?.slice(0, 6)\n .join('-')\n .slice(0, PROJECTLESS_THREAD_SLUG_MAX_LENGTH)\n return slug && slug.length > 0 ? slug : 'new-chat'\n}\n\nasync function ensureRealDirectory(path: string, label: string): Promise<void> {\n const info = await lstat(path)\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw new Error(`${label} must be a real directory`)\n }\n}\n\nasync function createProjectlessThreadDirectory(prompt: string | null): Promise<{ cwd: string; outputDirectory: string; workspaceRoot: string }> {\n const workspaceRoot = join(homedir(), 'Documents', 'Codex')\n await mkdir(workspaceRoot, { recursive: true })\n await ensureRealDirectory(workspaceRoot, 'Projectless workspace root')\n\n const dateDir = join(workspaceRoot, formatProjectlessDateSegment())\n await mkdir(dateDir, { recursive: true })\n await ensureRealDirectory(dateDir, 'Projectless thread date directory')\n\n const slug = buildProjectlessPromptSlug(prompt)\n for (let index = 0; index < PROJECTLESS_THREAD_DIRECTORY_MAX_ATTEMPTS; index += 1) {\n const folderName = index === 0 ? slug : `${slug}-${index + 1}`\n const cwd = join(dateDir, folderName)\n try {\n await mkdir(cwd, { recursive: false })\n return { cwd, outputDirectory: cwd, workspaceRoot }\n } catch {\n try {\n await stat(cwd)\n } catch {\n throw new Error('Failed to create new chat folder')\n }\n }\n }\n\n throw new Error('Unable to create a unique new chat folder')\n}\n\nfunction normalizeGithubCloneUrl(rawUrl: string): { url: string; repoName: string } {\n const trimmedUrl = rawUrl.trim()\n if (!trimmedUrl) throw new Error('Missing GitHub repository URL')\n\n const sshMatch = trimmedUrl.match(/^git@github\\.com:([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+?)(?:\\.git)?$/u)\n if (sshMatch) {\n const repoName = sshMatch[2]\n return { url: `git@github.com:${sshMatch[1]}/${repoName}.git`, repoName }\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmedUrl)\n } catch {\n throw new Error('Enter a valid GitHub repository URL')\n }\n if (parsed.hostname.toLowerCase() !== 'github.com') {\n throw new Error('Only github.com repository URLs are supported')\n }\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 2) {\n throw new Error('Enter a GitHub repository URL with owner and repository name')\n }\n const owner = segments[0]\n const repoName = segments[1].replace(/\\.git$/iu, '')\n if (!/^[A-Za-z0-9_.-]+$/u.test(owner) || !/^[A-Za-z0-9_.-]+$/u.test(repoName)) {\n throw new Error('GitHub repository owner or name contains unsupported characters')\n }\n return { url: `https://github.com/${owner}/${repoName}.git`, repoName }\n}\n\nasync function cloneGithubRepositoryIntoBase(rawUrl: string, rawBasePath: string): Promise<string> {\n const basePath = rawBasePath.trim()\n if (!basePath) throw new Error('Missing clone destination folder')\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n await ensureRealDirectory(normalizedBasePath, 'Clone destination folder')\n\n const { url, repoName } = normalizeGithubCloneUrl(rawUrl)\n const targetPath = join(normalizedBasePath, repoName)\n try {\n await stat(targetPath)\n throw new Error(`Destination already exists: ${targetPath}`)\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code !== 'ENOENT') throw error\n }\n\n try {\n await runCommand('git', ['clone', url, targetPath], { cwd: normalizedBasePath, timeoutMs: 5 * 60_000 })\n } catch (error) {\n await rm(targetPath, { recursive: true, force: true }).catch(() => undefined)\n throw error\n }\n await persistWorkspaceRoot(targetPath, '')\n return targetPath\n}\n\nfunction normalizeHeaderValue(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n return null\n}\n\nfunction normalizeQueryParams(value: unknown): URLSearchParams {\n const params = new URLSearchParams()\n const record = asRecord(value)\n if (!record) return params\n\n for (const [key, rawValue] of Object.entries(record)) {\n const normalized = normalizeHeaderValue(rawValue)\n if (!normalized) continue\n params.set(key, normalized)\n }\n\n return params\n}\n\nfunction buildProviderModelsUrl(baseUrl: string, queryParams: unknown): URL {\n const url = new URL(baseUrl)\n url.pathname = url.pathname.endsWith('/') ? `${url.pathname}models` : `${url.pathname}/models`\n const extraParams = normalizeQueryParams(queryParams)\n for (const [key, value] of extraParams.entries()) {\n url.searchParams.set(key, value)\n }\n return url\n}\n\nfunction normalizeProviderModelsData(payload: unknown): string[] {\n const record = asRecord(payload)\n const rows = Array.isArray(record?.data) ? record.data : null\n if (!rows) {\n throw new Error('provider /models payload is missing a data array')\n }\n\n const ids: string[] = []\n for (const row of rows) {\n const entry = asRecord(row)\n const candidate = readNonEmptyString(entry?.id)\n if (!candidate || ids.includes(candidate)) continue\n ids.push(candidate)\n }\n return ids\n}\n\nasync function fetchCustomEndpointDefaultModel(baseUrl: string, apiKey: string): Promise<string> {\n const normalizedBaseUrl = baseUrl.trim()\n if (!normalizedBaseUrl) return ''\n\n try {\n const modelsUrl = buildProviderModelsUrl(normalizedBaseUrl, null)\n const headers: Record<string, string> = apiKey ? { Authorization: `Bearer ${apiKey}` } : {}\n const response = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(PROVIDER_MODELS_FETCH_TIMEOUT_MS) })\n if (!response.ok) return ''\n const payload = await response.json() as unknown\n const modelIds = normalizeProviderModelsData(payload)\n return modelIds[0] ?? ''\n } catch {\n return ''\n }\n}\n\nasync function readProviderBackedModelIds(appServer: AppServerProcess): Promise<ProviderModelsResponse> {\n const configPayload = asRecord(await appServer.rpc('config/read', {}))\n const config = asRecord(configPayload?.config)\n const providerId = readNonEmptyString(config?.model_provider)\n if (!providerId) {\n return { data: [], providerId: '', source: 'provider' }\n }\n\n const providers = asRecord(config?.model_providers)\n const provider = asRecord(providers?.[providerId])\n if (!provider) {\n logProviderModelDiscoveryWarning('configured provider is missing from model_providers', { providerId })\n return { data: [], providerId, source: 'provider' }\n }\n\n const wireApi = readNonEmptyString(provider.wire_api)\n if (wireApi !== 'responses') {\n return { data: [], providerId, source: 'provider' }\n }\n\n const baseUrl = readNonEmptyString(provider.base_url)\n if (!baseUrl) {\n logProviderModelDiscoveryWarning('responses provider is missing base_url', { providerId })\n return { data: [], providerId, source: 'provider' }\n }\n\n const headers = new Headers()\n const configuredHeaders = asRecord(provider.http_headers)\n if (configuredHeaders) {\n for (const [key, rawValue] of Object.entries(configuredHeaders)) {\n const normalized = normalizeHeaderValue(rawValue)\n if (!normalized) continue\n headers.set(key, normalized)\n }\n }\n\n const bearerToken = readNonEmptyString(provider.experimental_bearer_token)\n if (bearerToken && !headers.has('Authorization')) {\n headers.set('Authorization', `Bearer ${bearerToken}`)\n }\n\n const envKey = readNonEmptyString(provider.env_key)\n const envHttpHeaders = asRecord(provider.env_http_headers)\n if (envKey || envHttpHeaders) {\n logProviderModelDiscoveryWarning('provider discovery skipped env-backed auth/header expansion', {\n providerId,\n hasEnvKey: Boolean(envKey),\n hasEnvHttpHeaders: Boolean(envHttpHeaders),\n })\n }\n\n let requestUrl: URL\n try {\n requestUrl = buildProviderModelsUrl(baseUrl, provider.query_params)\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models URL was invalid', {\n providerId,\n error: getErrorMessage(error, 'invalid url'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n let response: Response\n try {\n response = await fetch(requestUrl, {\n method: 'GET',\n headers,\n signal: AbortSignal.timeout(PROVIDER_MODELS_FETCH_TIMEOUT_MS),\n })\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models request failed', {\n providerId,\n error: isTimeoutError(error) ? `request timed out after ${PROVIDER_MODELS_FETCH_TIMEOUT_MS}ms` : getErrorMessage(error, 'network error'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n let payload: unknown = null\n try {\n payload = await response.json()\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models response was not valid JSON', {\n providerId,\n status: response.status,\n error: getErrorMessage(error, 'invalid json'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n if (!response.ok) {\n logProviderModelDiscoveryWarning('provider /models request returned non-2xx', {\n providerId,\n status: response.status,\n statusText: response.statusText,\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n try {\n return {\n data: normalizeProviderModelsData(payload),\n providerId,\n source: 'provider',\n }\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models payload was invalid', {\n providerId,\n error: getErrorMessage(error, 'invalid payload'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n}\n\nfunction extractThreadMessageText(threadReadPayload: unknown): string {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const parts: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim().length > 0) {\n parts.push(itemRecord.text.trim())\n continue\n }\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim().length > 0) {\n parts.push(blockRecord.text.trim())\n }\n }\n continue\n }\n if (type === 'commandExecution') {\n const command = typeof itemRecord?.command === 'string' ? itemRecord.command.trim() : ''\n const output = typeof itemRecord?.aggregatedOutput === 'string' ? itemRecord.aggregatedOutput.trim() : ''\n if (command) parts.push(command)\n if (output) parts.push(output)\n }\n }\n }\n\n return parts.join('\\n').trim()\n}\n\nfunction readNonEmptyString(value: unknown): string {\n return typeof value === 'string' && value.trim().length > 0 ? value : ''\n}\n\nfunction readThreadArchiveFallbackName(threadReadResult: unknown): string {\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n return (\n readNonEmptyString(thread?.name)\n || readNonEmptyString(thread?.title)\n || readNonEmptyString(thread?.preview)\n || 'Untitled thread'\n )\n}\n\nfunction isArchivedThreadReadResult(threadReadResult: unknown): boolean {\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n const sessionPath = readNonEmptyString(thread?.path)\n return sessionPath.split(/[\\\\/]+/u).includes('archived_sessions')\n}\n\nexport async function callRpcWithArchiveRecovery(\n appServer: RpcExecutor,\n method: string,\n params: unknown,\n): Promise<unknown> {\n try {\n return await appServer.rpc(method, params ?? null)\n } catch (error) {\n if (method !== 'thread/archive') {\n throw error\n }\n\n const paramsRecord = asRecord(params)\n const threadId = readNonEmptyString(paramsRecord?.threadId)\n const errorMessage = getErrorMessage(error, '')\n if (!threadId || !errorMessage.includes('no rollout found')) {\n throw error\n }\n\n let threadReadResult: unknown = null\n try {\n threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: false,\n })\n if (isArchivedThreadReadResult(threadReadResult)) {\n return null\n }\n } catch {\n // If metadata cannot be read, still try materializing a title before retrying archive.\n }\n\n await appServer.rpc('thread/name/set', {\n threadId,\n name: readThreadArchiveFallbackName(threadReadResult),\n })\n return appServer.rpc(method, params ?? null)\n }\n}\n\ntype TerminalQuickCommand = {\n label: string\n value: string\n source: 'package' | 'script' | 'make'\n}\n\nasync function listTerminalQuickCommands(cwd: string): Promise<TerminalQuickCommand[]> {\n const normalizedCwd = isAbsolute(cwd) ? cwd : resolve(cwd)\n const info = await stat(normalizedCwd)\n if (!info.isDirectory()) {\n throw new Error('Terminal cwd is not a directory')\n }\n\n const commands: TerminalQuickCommand[] = []\n const seen = new Set<string>()\n const addCommand = (command: TerminalQuickCommand) => {\n if (!command.value || seen.has(command.value)) return\n seen.add(command.value)\n commands.push(command)\n }\n\n await addPackageJsonCommands(normalizedCwd, addCommand)\n await addMakefileCommands(normalizedCwd, addCommand)\n await addRootScriptCommands(normalizedCwd, addCommand)\n await addScriptsDirectoryCommands(normalizedCwd, addCommand)\n return commands\n}\n\nasync function addPackageJsonCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n try {\n const raw = await readFile(join(cwd, 'package.json'), 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const record = asRecord(parsed)\n const scripts = asRecord(record?.scripts)\n if (!scripts) return\n const packageManager = resolvePackageManager(cwd)\n for (const scriptName of Object.keys(scripts)) {\n if (typeof scripts[scriptName] !== 'string') continue\n const value = formatPackageScriptCommand(packageManager, scriptName)\n addCommand({\n label: value,\n value,\n source: 'package',\n })\n }\n } catch {\n // A project without package.json simply has no package quick commands.\n }\n}\n\nasync function addMakefileCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n const makefilePath = existsSync(join(cwd, 'Makefile'))\n ? join(cwd, 'Makefile')\n : existsSync(join(cwd, 'makefile'))\n ? join(cwd, 'makefile')\n : ''\n if (!makefilePath) return\n\n try {\n const raw = await readFile(makefilePath, 'utf8')\n for (const line of raw.split(/\\r?\\n/)) {\n const match = /^([A-Za-z0-9_.@%/+~-][A-Za-z0-9_.@%/+~-]*)\\s*:(?![=])/.exec(line)\n if (!match) continue\n const target = match[1]\n if (!target || target.startsWith('.')) continue\n const value = `make ${quoteShellTokenIfNeeded(target)}`\n addCommand({\n label: value,\n value,\n source: 'make',\n })\n }\n } catch {\n // Ignore unreadable Makefiles for quick-command discovery.\n }\n}\n\nasync function addRootScriptCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n await addScriptFileCommands(cwd, '.', addCommand)\n}\n\nasync function addScriptsDirectoryCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n await addScriptFileCommands(join(cwd, 'scripts'), './scripts', addCommand)\n}\n\nasync function addScriptFileCommands(\n directory: string,\n commandPrefix: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n try {\n const entries = await readdir(directory, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isFile()) continue\n if (!entry.name.endsWith('.sh') && !entry.name.endsWith('.cmd')) continue\n const value = `${commandPrefix}/${quoteShellTokenIfNeeded(entry.name)}`\n addCommand({\n label: value,\n value,\n source: 'script',\n })\n }\n } catch {\n // A project without script files simply has no script-file quick commands.\n }\n}\n\nfunction resolvePackageManager(cwd: string): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn'\n if (existsSync(join(cwd, 'bun.lock')) || existsSync(join(cwd, 'bun.lockb'))) return 'bun'\n return 'npm'\n}\n\nfunction formatPackageScriptCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun', scriptName: string): string {\n const quoted = quoteShellTokenIfNeeded(scriptName)\n if (packageManager === 'npm') return `npm run ${quoted}`\n if (packageManager === 'pnpm') return `pnpm run ${quoted}`\n if (packageManager === 'bun') return `bun run ${quoted}`\n return `yarn ${quoted}`\n}\n\nfunction quoteShellTokenIfNeeded(value: string): string {\n return /^[A-Za-z0-9_./:@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\\\''`)}'`\n}\n\nfunction readBoolean(value: unknown): boolean {\n return value === true\n}\n\nfunction readNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\ntype ComposioCliInvocation = { command: string; args: string[]; displayCommand: string }\n\nfunction buildComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const overrideCommand = process.env.CODEXUI_COMPOSIO_COMMAND?.trim()\n if (overrideCommand) {\n const invocation = getSpawnInvocation(overrideCommand, args)\n return {\n command: invocation.command,\n args: invocation.args,\n displayCommand: `${overrideCommand} ${args.map(quoteShellTokenIfNeeded).join(' ')}`.trim(),\n }\n }\n return buildInstalledComposioInvocation(args)\n}\n\nfunction buildInstalledComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const candidates = [\n join(homedir(), '.composio', 'composio'),\n 'composio',\n ]\n for (const candidate of candidates) {\n if ((candidate.includes('/') || candidate.includes('\\\\')) && !existsSync(candidate)) continue\n const invocation = getSpawnInvocation(candidate, args)\n return {\n command: invocation.command,\n args: invocation.args,\n displayCommand: `${candidate} ${args.map(quoteShellTokenIfNeeded).join(' ')}`.trim(),\n }\n }\n return null\n}\n\nfunction probeComposioInvocation(invocation: ComposioCliInvocation): { available: boolean; cliVersion: string; output: string } {\n const probe = spawnSync(invocation.command, invocation.args, {\n encoding: 'utf8',\n env: process.env,\n windowsHide: true,\n })\n const output = `${probe.stdout ?? ''}${probe.stderr ?? ''}`.trim()\n return {\n available: !probe.error && probe.status === 0,\n cliVersion: probe.status === 0 ? (probe.stdout ?? '').trim() : '',\n output,\n }\n}\n\nfunction resolveComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const invocation = buildComposioInvocation(args)\n const versionInvocation = buildComposioInvocation(['--version'])\n if (invocation && versionInvocation && probeComposioInvocation(versionInvocation).available) return invocation\n return null\n}\n\nfunction parseComposioJson<T>(stdout: string, fallback: string): T {\n const trimmed = stdout.trim()\n if (!trimmed) {\n throw new Error(fallback)\n }\n return JSON.parse(trimmed) as T\n}\n\nasync function runComposioJson<T>(args: string[], fallback: string): Promise<T> {\n const invocation = resolveComposioInvocation(args)\n if (!invocation) {\n throw new Error('Composio CLI is not installed')\n }\n const child = spawn(invocation.command, invocation.args, {\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.setEncoding('utf8')\n child.stderr.setEncoding('utf8')\n child.stdout.on('data', (chunk) => { stdout += chunk })\n child.stderr.on('data', (chunk) => { stderr += chunk })\n\n const exitCode = await new Promise<number>((resolveExit, reject) => {\n child.once('error', reject)\n child.once('close', (code) => resolveExit(code ?? 0))\n })\n\n if (exitCode !== 0) {\n throw new Error(stderr.trim() || stdout.trim() || fallback)\n }\n\n try {\n return parseComposioJson<T>(stdout, fallback)\n } catch (error) {\n const details = stderr.trim() || stdout.trim()\n throw new Error(details || getErrorMessage(error, fallback))\n }\n}\n\nasync function readComposioUserData(): Promise<ComposioUserData | null> {\n try {\n const raw = await readFile(COMPOSIO_USER_DATA_PATH, 'utf8')\n const payload = asRecord(JSON.parse(raw))\n if (!payload) return null\n return {\n apiKey: readNonEmptyString(payload.api_key),\n baseUrl: readNonEmptyString(payload.base_url),\n webUrl: readNonEmptyString(payload.web_url),\n orgId: readNonEmptyString(payload.org_id),\n testUserId: readNonEmptyString(payload.test_user_id),\n }\n } catch {\n return null\n }\n}\n\nfunction normalizeComposioConnection(value: unknown): ComposioConnectionSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const authConfig = asRecord(record.auth_config)\n return {\n id: readNonEmptyString(record.id),\n wordId: readNonEmptyString(record.word_id),\n alias: readNonEmptyString(record.alias),\n status: readNonEmptyString(record.status),\n authScheme: readNonEmptyString(record.authScheme || authConfig?.auth_scheme),\n createdAt: readNonEmptyString(record.created_at),\n updatedAt: readNonEmptyString(record.updated_at),\n isComposioManaged: readBoolean(authConfig?.is_composio_managed),\n isDisabled: readBoolean(record.is_disabled),\n }\n}\n\nfunction normalizeComposioToolkit(value: unknown, connectionsBySlug: Map<string, ComposioConnectionSummary[]>): ComposioConnectorSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const slug = readNonEmptyString(record.slug)\n if (!slug) return null\n const connectionRows = connectionsBySlug.get(slug) ?? []\n return {\n slug,\n name: readNonEmptyString(record.name),\n description: readNonEmptyString(record.description),\n logoUrl: readNonEmptyString(record.logo || record.meta && asRecord(record.meta)?.logo),\n latestVersion: readNonEmptyString(record.latest_version || record.latestVersion),\n toolsCount: readNumber(record.tools_count),\n triggersCount: readNumber(record.triggers_count),\n isNoAuth: readBoolean(record.is_no_auth),\n enabled: record.enabled !== false,\n authModes: Array.isArray(record.auth_modes) ? record.auth_modes.map(readNonEmptyString).filter(Boolean) : [],\n activeCount: connectionRows.filter((row) => row.status === 'ACTIVE' && !row.isDisabled).length,\n totalConnections: connectionRows.length,\n connectionStatuses: [...new Set(connectionRows.map((row) => row.status).filter(Boolean))],\n }\n}\n\nfunction normalizeComposioTool(value: unknown): ComposioToolSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const slug = readNonEmptyString(record.slug)\n if (!slug) return null\n return {\n slug,\n name: readNonEmptyString(record.name),\n description: readNonEmptyString(record.description),\n }\n}\n\nasync function readComposioConnectionsBySlug(): Promise<Map<string, ComposioConnectionSummary[]>> {\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['connections', 'list'], 'Failed to list Composio connections'))\n const bySlug = new Map<string, ComposioConnectionSummary[]>()\n for (const [slug, rawRows] of Object.entries(payload ?? {})) {\n if (!Array.isArray(rawRows)) continue\n const rows = rawRows.map(normalizeComposioConnection).filter((row): row is ComposioConnectionSummary => row !== null)\n bySlug.set(slug, rows)\n }\n return bySlug\n}\n\nasync function readComposioStatus(): Promise<ComposioStatusResponse> {\n const versionInvocation = buildComposioInvocation(['--version'])\n const probe = versionInvocation\n ? probeComposioInvocation(versionInvocation)\n : { available: false, cliVersion: '', output: '' }\n const available = probe.available\n const cliVersion = probe.cliVersion\n const userData = await readComposioUserData()\n if (!available) {\n return {\n available: false,\n authenticated: false,\n cliVersion,\n email: '',\n defaultOrgName: '',\n defaultOrgId: userData?.orgId ?? '',\n webUrl: userData?.webUrl ?? '',\n baseUrl: userData?.baseUrl ?? '',\n testUserId: userData?.testUserId ?? '',\n }\n }\n\n try {\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['whoami'], 'Failed to read Composio account status'))\n return {\n available: true,\n authenticated: true,\n cliVersion,\n email: readNonEmptyString(payload?.email),\n defaultOrgName: readNonEmptyString(payload?.default_org_name),\n defaultOrgId: readNonEmptyString(payload?.default_org_id) || userData?.orgId || '',\n webUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n baseUrl: userData?.baseUrl || 'https://backend.composio.dev',\n testUserId: readNonEmptyString(payload?.test_user_id) || userData?.testUserId || '',\n }\n } catch {\n return {\n available: true,\n authenticated: false,\n cliVersion,\n email: '',\n defaultOrgName: '',\n defaultOrgId: userData?.orgId ?? '',\n webUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n baseUrl: userData?.baseUrl || 'https://backend.composio.dev',\n testUserId: userData?.testUserId ?? '',\n }\n }\n}\n\nasync function listComposioConnectors(query: string, cursor: string | null = null, limit = 50): Promise<ComposioConnectorPage> {\n const args = ['dev', 'toolkits', 'list', '--limit', String(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX)]\n const trimmedQuery = query.trim()\n if (trimmedQuery) {\n args.push('--query', trimmedQuery)\n }\n const [payload, connectionsBySlug] = await Promise.all([\n runComposioJson<unknown[]>(args, 'Failed to list Composio toolkits'),\n readComposioConnectionsBySlug(),\n ])\n const allRows = payload\n .map((item) => normalizeComposioToolkit(item, connectionsBySlug))\n .filter((row): row is ComposioConnectorSummary => row !== null)\n const safeLimit = Number.isFinite(limit) ? Math.max(1, Math.min(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX, Math.floor(limit))) : 50\n const safeCursor = parseComposioCursor(cursor, allRows.length)\n return {\n data: allRows.slice(safeCursor, safeCursor + safeLimit),\n nextCursor: safeCursor + safeLimit < allRows.length ? String(safeCursor + safeLimit) : null,\n total: allRows.length,\n }\n}\n\nfunction parseComposioCursor(cursor: string | null | undefined, maxLength: number): number {\n const trimmed = cursor?.trim() ?? ''\n const parsed = Number.parseInt(trimmed, 10)\n if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) return 0\n if (parsed >= maxLength) return maxLength\n return parsed\n}\n\nfunction parseComposioLimit(rawLimit: string | null): number {\n const parsed = Number.parseInt((rawLimit ?? '').trim(), 10)\n if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) return 50\n return Math.max(1, Math.min(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX, parsed))\n}\n\nasync function readComposioConnectorDetail(slug: string): Promise<ComposioConnectorDetail> {\n const normalizedSlug = slug.trim()\n if (!normalizedSlug) {\n throw new Error('Missing Composio connector slug')\n }\n\n const [infoPayload, toolsPayload, connectionsPayload, userData] = await Promise.all([\n runComposioJson<Record<string, unknown>>(['dev', 'toolkits', 'info', normalizedSlug], `Failed to load Composio toolkit ${normalizedSlug}`),\n runComposioJson<unknown[]>(['tools', 'list', normalizedSlug, '--limit', '10'], `Failed to list tools for ${normalizedSlug}`),\n runComposioJson<{ toolkit?: string; items?: unknown[] }>(['link', normalizedSlug, '--list'], `Failed to list connections for ${normalizedSlug}`),\n readComposioUserData(),\n ])\n\n const connections = Array.isArray(connectionsPayload.items)\n ? connectionsPayload.items.map(normalizeComposioConnection).filter((row): row is ComposioConnectionSummary => row !== null)\n : []\n const connector = normalizeComposioToolkit(infoPayload, new Map([[normalizedSlug, connections]]))\n if (!connector) {\n throw new Error(`Unknown Composio connector: ${normalizedSlug}`)\n }\n\n return {\n connector,\n connections,\n tools: Array.isArray(toolsPayload)\n ? toolsPayload.map(normalizeComposioTool).filter((row): row is ComposioToolSummary => row !== null)\n : [],\n dashboardUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n }\n}\n\nasync function startComposioLink(slug: string): Promise<ComposioLinkResult> {\n const normalizedSlug = slug.trim()\n if (!normalizedSlug) {\n throw new Error('Missing Composio connector slug')\n }\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['link', normalizedSlug, '--no-wait'], `Failed to start Composio link for ${normalizedSlug}`))\n return {\n status: readNonEmptyString(payload?.status),\n message: readNonEmptyString(payload?.message),\n connectedAccountId: readNonEmptyString(payload?.connected_account_id),\n redirectUrl: readNonEmptyString(payload?.redirect_url),\n toolkit: readNonEmptyString(payload?.toolkit),\n projectType: readNonEmptyString(payload?.project_type),\n }\n}\n\nasync function startComposioLogin(): Promise<ComposioLoginResult> {\n const invocation = resolveComposioInvocation(['login', '--no-browser', '-y'])\n if (!invocation) {\n throw new Error('Composio CLI is not installed')\n }\n const proc = spawn(invocation.command, invocation.args, {\n cwd: process.cwd(),\n env: process.env,\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n })\n proc.unref()\n\n let stdout = ''\n let stderr = ''\n proc.stdout.setEncoding('utf8')\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', (chunk) => { stderr += chunk })\n\n const loginUrl = await new Promise<string>((resolveLoginUrl, reject) => {\n const timeout = setTimeout(() => {\n proc.kill('SIGTERM')\n reject(new Error(stderr.trim() || stdout.trim() || 'Timed out waiting for Composio CLI login URL'))\n }, 10_000)\n const finish = (url: string) => {\n clearTimeout(timeout)\n proc.stdout.destroy()\n proc.stderr.destroy()\n resolveLoginUrl(url)\n }\n proc.once('error', (error) => {\n clearTimeout(timeout)\n reject(error)\n })\n proc.once('close', (code) => {\n clearTimeout(timeout)\n reject(new Error(stderr.trim() || stdout.trim() || `Composio CLI login exited with code ${code ?? 0}`))\n })\n proc.stdout.on('data', (chunk) => {\n stdout += chunk\n const url = stdout.match(/https?:\\/\\/\\S+/)?.[0] ?? ''\n if (url) finish(url)\n })\n })\n\n const cliKey = loginUrl ? (new URL(loginUrl).searchParams.get('cliKey') ?? '') : ''\n return {\n status: 'started',\n message: 'Composio CLI login URL created',\n loginUrl,\n cliKey,\n expiresAt: '',\n }\n}\n\nasync function installComposioCli(): Promise<ComposioInstallResult> {\n const command = 'bash'\n const installScriptUrl = 'https://composio.dev/install'\n const args = ['-lc', `curl -fsSL ${installScriptUrl} | bash`]\n const invocation = getSpawnInvocation(command, args)\n const env = {\n ...process.env,\n COMPOSIO_INSTALL_DIR: process.env.COMPOSIO_INSTALL_DIR?.trim() || join(homedir(), '.composio'),\n }\n const result = spawnSync(invocation.command, invocation.args, {\n encoding: 'utf8',\n env,\n windowsHide: true,\n })\n const output = `${result.stdout ?? ''}${result.stderr ?? ''}`.trim()\n if (result.error || result.status !== 0) {\n throw new Error(output || result.error?.message || 'Failed to install Composio CLI')\n }\n return {\n ok: true,\n command: `curl -fsSL ${installScriptUrl} | bash`,\n output,\n }\n}\n\nfunction countRecoveredContentLines(value: string): number {\n if (!value) return 0\n const normalized = value.replace(/\\r\\n/g, '\\n')\n const trimmed = normalized.endsWith('\\n') ? normalized.slice(0, -1) : normalized\n if (!trimmed) return 0\n return trimmed.split('\\n').length\n}\n\nfunction countRecoveredPatchLines(value: string): { addedLineCount: number; removedLineCount: number } {\n let addedLineCount = 0\n let removedLineCount = 0\n\n for (const line of value.replace(/\\r\\n/g, '\\n').split('\\n')) {\n if (!line) continue\n if (line.startsWith('+++') || line.startsWith('---') || line.startsWith('@@')) continue\n if (line.startsWith('+')) {\n addedLineCount += 1\n continue\n }\n if (line.startsWith('-')) {\n removedLineCount += 1\n }\n }\n\n return { addedLineCount, removedLineCount }\n}\n\nfunction mergeRecoveredDiff(first: string, second: string): string {\n if (!first) return second\n if (!second || first === second) return first\n return `${first}\\n${second}`.trim()\n}\n\nfunction mergeRecoveredFileChange(first: SessionRecoveredFileChange, second: SessionRecoveredFileChange): SessionRecoveredFileChange {\n const operation = first.operation === 'add' || second.operation === 'add'\n ? 'add'\n : first.operation === 'delete' || second.operation === 'delete'\n ? 'delete'\n : 'update'\n\n return {\n path: second.path || first.path,\n operation,\n movedToPath: second.movedToPath ?? first.movedToPath ?? null,\n diff: mergeRecoveredDiff(first.diff, second.diff),\n addedLineCount: first.addedLineCount + second.addedLineCount,\n removedLineCount: first.removedLineCount + second.removedLineCount,\n }\n}\n\nfunction isApplyPatchSectionBoundary(value: string): boolean {\n return value.startsWith('*** Update File: ')\n || value.startsWith('*** Add File: ')\n || value.startsWith('*** Delete File: ')\n || value === '*** End Patch'\n}\n\nfunction parseApplyPatchInput(input: string): SessionRecoveredFileChange[] {\n const normalized = input.replace(/\\r\\n/g, '\\n')\n const lines = normalized.split('\\n')\n const changes: SessionRecoveredFileChange[] = []\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n\n if (line.startsWith('*** Add File: ')) {\n const path = line.slice('*** Add File: '.length).trim()\n const contentLines: string[] = []\n for (index += 1; index < lines.length; index += 1) {\n const nextLine = lines[index] ?? ''\n if (isApplyPatchSectionBoundary(nextLine)) {\n index -= 1\n break\n }\n contentLines.push(nextLine.startsWith('+') ? nextLine.slice(1) : nextLine)\n }\n const diff = contentLines.join('\\n').trimEnd()\n if (path) {\n changes.push({\n path,\n operation: 'add',\n movedToPath: null,\n diff,\n addedLineCount: countRecoveredContentLines(diff),\n removedLineCount: 0,\n })\n }\n continue\n }\n\n if (line.startsWith('*** Delete File: ')) {\n const path = line.slice('*** Delete File: '.length).trim()\n if (path) {\n changes.push({\n path,\n operation: 'delete',\n movedToPath: null,\n diff: '',\n addedLineCount: 0,\n removedLineCount: 0,\n })\n }\n continue\n }\n\n if (line.startsWith('*** Update File: ')) {\n const path = line.slice('*** Update File: '.length).trim()\n let movedToPath: string | null = null\n const diffLines: string[] = []\n\n for (index += 1; index < lines.length; index += 1) {\n const nextLine = lines[index] ?? ''\n if (nextLine.startsWith('*** Move to: ')) {\n const moved = nextLine.slice('*** Move to: '.length).trim()\n movedToPath = moved || null\n continue\n }\n if (isApplyPatchSectionBoundary(nextLine)) {\n index -= 1\n break\n }\n diffLines.push(nextLine)\n }\n\n const diff = diffLines.join('\\n').trimEnd()\n const counts = countRecoveredPatchLines(diff)\n if (path) {\n changes.push({\n path,\n operation: 'update',\n movedToPath,\n diff,\n ...counts,\n })\n }\n }\n }\n\n return changes\n}\n\nfunction buildSessionFileChangeFallback(threadReadPayload: unknown, sessionLogRaw: string): SessionRecoveredTurnFileChanges[] {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const turnIndexById = new Map<string, number>()\n\n for (let turnIndex = 0; turnIndex < turns.length; turnIndex += 1) {\n const turnRecord = asRecord(turns[turnIndex])\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) {\n turnIndexById.set(turnId, turnIndex)\n }\n }\n\n const collectedByTurnId = new Map<string, SessionRecoveredFileChange[]>()\n let currentTurnId = ''\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const payloadRecord = asRecord(row.payload)\n currentTurnId = readNonEmptyString(payloadRecord?.turn_id) || currentTurnId\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIndexById.has(currentTurnId)) {\n continue\n }\n\n const payloadRecord = asRecord(row.payload)\n if (\n payloadRecord?.type !== 'custom_tool_call'\n || payloadRecord.name !== 'apply_patch'\n || payloadRecord.status !== 'completed'\n ) {\n continue\n }\n\n const input = readNonEmptyString(payloadRecord.input)\n if (!input) continue\n\n const parsedChanges = parseApplyPatchInput(input)\n if (parsedChanges.length === 0) continue\n\n const previous = collectedByTurnId.get(currentTurnId) ?? []\n previous.push(...parsedChanges)\n collectedByTurnId.set(currentTurnId, previous)\n }\n\n const recovered: SessionRecoveredTurnFileChanges[] = []\n for (const [turnId, fileChanges] of collectedByTurnId.entries()) {\n const turnIndex = turnIndexById.get(turnId)\n if (typeof turnIndex !== 'number' || fileChanges.length === 0) continue\n\n const mergedByPath = new Map<string, SessionRecoveredFileChange>()\n for (const fileChange of fileChanges) {\n const key = `${fileChange.path}\\u0000${fileChange.movedToPath ?? ''}`\n const previous = mergedByPath.get(key)\n mergedByPath.set(key, previous ? mergeRecoveredFileChange(previous, fileChange) : { ...fileChange })\n }\n\n recovered.push({\n turnId,\n turnIndex,\n fileChanges: Array.from(mergedByPath.values()),\n })\n }\n\n return recovered.sort((first, second) => first.turnIndex - second.turnIndex)\n}\n\ntype SessionRecoveredCommand = {\n id: string\n type: 'commandExecution'\n command: string\n cwd: string | null\n status: 'completed' | 'failed'\n aggregatedOutput: string\n exitCode: number | null\n durationMs: number | null\n}\n\nfunction parseExecCommandOutput(output: string): { exitCode: number | null; wallTime: number | null; cleanOutput: string } {\n let exitCode: number | null = null\n let wallTime: number | null = null\n const outputLines: string[] = []\n let pastHeader = false\n\n for (const line of output.split('\\n')) {\n if (!pastHeader) {\n const exitMatch = line.match(/^Process exited with code (\\d+)/)\n if (exitMatch) {\n exitCode = Number.parseInt(exitMatch[1]!, 10)\n continue\n }\n const wallMatch = line.match(/^Wall time:\\s+([\\d.]+)\\s+seconds/)\n if (wallMatch) {\n wallTime = Math.round(Number.parseFloat(wallMatch[1]!) * 1000)\n continue\n }\n if (line.startsWith('Command:') || line.startsWith('Chunk ID:') || line.startsWith('Original token count:')) {\n continue\n }\n if (line === 'Output:') {\n pastHeader = true\n continue\n }\n }\n outputLines.push(line)\n }\n\n return { exitCode, wallTime, cleanOutput: outputLines.join('\\n').trimEnd() }\n}\n\ntype SessionRecoveredFileChangeItem = {\n id: string\n type: 'fileChange'\n status: 'completed'\n changes: Record<string, unknown>[]\n}\n\ntype SessionItemSlot = {\n type: 'agentMessage' | 'commandExecution' | 'fileChange'\n command?: SessionRecoveredCommand\n fileChange?: SessionRecoveredFileChangeItem\n}\n\nfunction buildSessionItemOrder(sessionLogRaw: string, turnIds: Set<string>): Map<string, SessionItemSlot[]> {\n let currentTurnId = ''\n const orderByTurnId = new Map<string, SessionItemSlot[]>()\n const callIdToCommand = new Map<string, SessionRecoveredCommand>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const p = asRecord(row.payload)\n currentTurnId = readNonEmptyString(p?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const p = asRecord(row.payload)\n if (p?.type === 'task_started') {\n currentTurnId = readNonEmptyString(p.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIds.has(currentTurnId)) continue\n const payload = asRecord(row.payload)\n if (!payload) continue\n\n let slots = orderByTurnId.get(currentTurnId)\n if (!slots) {\n slots = []\n orderByTurnId.set(currentTurnId, slots)\n }\n\n if (payload.type === 'message' && payload.role === 'assistant') {\n slots.push({ type: 'agentMessage' })\n continue\n }\n\n if (payload.type === 'function_call' && payload.name === 'exec_command') {\n const callId = readNonEmptyString(payload.call_id)\n if (!callId) continue\n let cmd = ''\n try {\n const args = JSON.parse(payload.arguments as string) as Record<string, unknown>\n cmd = typeof args.cmd === 'string' ? args.cmd : ''\n } catch { /* empty */ }\n const command: SessionRecoveredCommand = {\n id: `session-cmd-${callId}`,\n type: 'commandExecution',\n command: cmd,\n cwd: null,\n status: 'completed',\n aggregatedOutput: '',\n exitCode: null,\n durationMs: null,\n }\n callIdToCommand.set(callId, command)\n slots.push({ type: 'commandExecution', command })\n continue\n }\n\n if (payload.type === 'function_call_output') {\n const callId = readNonEmptyString(payload.call_id)\n if (!callId) continue\n const existing = callIdToCommand.get(callId)\n if (!existing) continue\n const rawOutput = typeof payload.output === 'string' ? payload.output : ''\n const parsed = parseExecCommandOutput(rawOutput)\n existing.aggregatedOutput = parsed.cleanOutput\n existing.exitCode = parsed.exitCode\n existing.durationMs = parsed.wallTime\n existing.status = parsed.exitCode === 0 || parsed.exitCode === null ? 'completed' : 'failed'\n }\n\n if (payload.type === 'custom_tool_call' && payload.name === 'apply_patch' && payload.status === 'completed') {\n const input = typeof payload.input === 'string' ? payload.input : ''\n const callId = readNonEmptyString(payload.call_id)\n if (!input || !callId) continue\n const parsedChanges = parseApplyPatchInput(input)\n if (parsedChanges.length === 0) continue\n const fcItem: SessionRecoveredFileChangeItem = {\n id: `session-fc-${callId}`,\n type: 'fileChange',\n status: 'completed',\n changes: parsedChanges.map((fc) => ({\n ...fc,\n kind: { type: fc.operation, ...(fc.movedToPath ? { move_path: fc.movedToPath } : {}) },\n })),\n }\n slots.push({ type: 'fileChange', fileChange: fcItem })\n }\n }\n\n return orderByTurnId\n}\n\nfunction extractFilePathsFromCommand(cmd: string, cwd: string): string[] {\n const paths: string[] = []\n const absPathPattern = /(?:^|\\s|>>|>|<)(\\/?(?:Users|home|tmp|var|etc|root)\\/[^\\s;|&><\"']+)/g\n let match: RegExpExecArray | null\n while ((match = absPathPattern.exec(cmd)) !== null) {\n const p = match[1]?.trim()\n if (p && !p.endsWith('/') && !p.startsWith('-')) paths.push(p)\n }\n\n const redirectPattern = /(?:>>?|cat\\s*>\\s*)([^\\s;|&><\"']+)/g\n while ((match = redirectPattern.exec(cmd)) !== null) {\n const p = match[1]?.trim()\n if (p && !p.startsWith('-') && !p.startsWith('/dev/')) {\n paths.push(isAbsolute(p) ? p : join(cwd, p))\n }\n }\n\n return [...new Set(paths)]\n}\n\ntype CollectedTurnFileInfo = {\n patchInputs: { callId: string; input: string }[]\n commandFilePaths: string[]\n}\n\nfunction collectFileChangesForTurns(\n sessionLogRaw: string,\n turnIdsToRevert: Set<string>,\n cwd: string,\n): Map<string, CollectedTurnFileInfo> {\n let currentTurnId = ''\n const infoByTurnId = new Map<string, CollectedTurnFileInfo>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const p = asRecord(row.payload)\n currentTurnId = readNonEmptyString(p?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const p = asRecord(row.payload)\n if (p?.type === 'task_started') {\n currentTurnId = readNonEmptyString(p.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIdsToRevert.has(currentTurnId)) continue\n const payload = asRecord(row.payload)\n if (!payload) continue\n\n let info = infoByTurnId.get(currentTurnId)\n if (!info) {\n info = { patchInputs: [], commandFilePaths: [] }\n infoByTurnId.set(currentTurnId, info)\n }\n\n if (payload.type === 'custom_tool_call' && payload.name === 'apply_patch' && payload.status === 'completed') {\n const input = typeof payload.input === 'string' ? payload.input : ''\n const callId = readNonEmptyString(payload.call_id)\n if (input && callId) {\n info.patchInputs.push({ callId, input })\n }\n }\n\n if (payload.type === 'function_call' && payload.name === 'exec_command') {\n let cmd = ''\n try {\n const args = JSON.parse(payload.arguments as string) as Record<string, unknown>\n cmd = typeof args.cmd === 'string' ? args.cmd : ''\n } catch { /* empty */ }\n if (cmd) {\n const extracted = extractFilePathsFromCommand(cmd, cwd)\n for (const p of extracted) {\n if (!info.commandFilePaths.includes(p)) info.commandFilePaths.push(p)\n }\n }\n }\n }\n\n return infoByTurnId\n}\n\nfunction reverseV4aDiff(fileContent: string, diffText: string): string | null {\n const fileLines = fileContent.split('\\n')\n const rawDiffLines = diffText.split('\\n')\n while (rawDiffLines.length > 0 && rawDiffLines[rawDiffLines.length - 1]?.trim() === '') rawDiffLines.pop()\n const diffLines = rawDiffLines\n const result = [...fileLines]\n\n type DiffEntry = { type: 'context' | 'add' | 'remove'; text: string }\n const hunks: DiffEntry[][] = []\n let currentHunk: DiffEntry[] | null = null\n\n for (const dl of diffLines) {\n if (dl.startsWith('@@')) {\n if (currentHunk) hunks.push(currentHunk)\n currentHunk = []\n continue\n }\n if (!currentHunk) continue\n if (dl.startsWith('+')) {\n currentHunk.push({ type: 'add', text: dl.slice(1) })\n } else if (dl.startsWith('-')) {\n currentHunk.push({ type: 'remove', text: dl.slice(1) })\n } else if (dl.startsWith(' ')) {\n currentHunk.push({ type: 'context', text: dl.slice(1) })\n } else {\n currentHunk.push({ type: 'context', text: dl })\n }\n }\n if (currentHunk) hunks.push(currentHunk)\n\n for (let hi = hunks.length - 1; hi >= 0; hi--) {\n const hunk = hunks[hi]!\n const expectedSequence = hunk\n .filter((e) => e.type === 'context' || e.type === 'add')\n .map((e) => e.text)\n\n if (expectedSequence.length === 0) continue\n\n let seqStart = -1\n outer: for (let ri = result.length - expectedSequence.length; ri >= 0; ri--) {\n for (let si = 0; si < expectedSequence.length; si++) {\n if (result[ri + si] !== expectedSequence[si]) continue outer\n }\n seqStart = ri\n break\n }\n\n if (seqStart < 0) return null\n\n const newLines: string[] = []\n let seqIdx = 0\n for (const entry of hunk) {\n if (entry.type === 'context') {\n newLines.push(result[seqStart + seqIdx]!)\n seqIdx++\n } else if (entry.type === 'add') {\n seqIdx++\n } else if (entry.type === 'remove') {\n newLines.push(entry.text)\n }\n }\n\n result.splice(seqStart, expectedSequence.length, ...newLines)\n }\n\n return result.join('\\n')\n}\n\nasync function revertTurnFileChanges(\n cwd: string,\n turnInfos: Map<string, CollectedTurnFileInfo>,\n): Promise<{ reverted: number; errors: string[] }> {\n if (turnInfos.size === 0) return { reverted: 0, errors: [] }\n\n let reverted = 0\n const errors: string[] = []\n\n const allEntries = [...turnInfos.values()]\n const allPatchInputs = allEntries.flatMap((info) => info.patchInputs).reverse()\n const allCommandPaths = new Set(allEntries.flatMap((info) => info.commandFilePaths))\n\n let isGitRepo = false\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n isGitRepo = !!gitRoot\n } catch { /* not a git repo */ }\n\n const trackedFiles = new Set<string>()\n if (isGitRepo) {\n try {\n const tracked = await runCommandCapture('git', ['ls-files', '--full-name'], { cwd: gitRoot })\n for (const f of tracked.split('\\n')) {\n if (f.trim()) trackedFiles.add(join(gitRoot, f.trim()))\n }\n } catch { /* empty */ }\n }\n\n const patchRevertedPaths = new Set<string>()\n\n for (const patch of allPatchInputs) {\n const changes = parseApplyPatchInput(patch.input)\n for (let ci = changes.length - 1; ci >= 0; ci--) {\n const change = changes[ci]!\n const filePath = isAbsolute(change.path) ? change.path : join(cwd, change.path)\n\n try {\n if (change.operation === 'add') {\n const fileStat = await stat(filePath).catch(() => null)\n if (fileStat) {\n await rm(filePath, { force: true })\n reverted++\n patchRevertedPaths.add(filePath)\n }\n } else if (change.operation === 'update' && change.diff) {\n let reversed = false\n try {\n const currentContent = await readFile(filePath, 'utf8')\n const newContent = reverseV4aDiff(currentContent, change.diff)\n if (newContent !== null && newContent !== currentContent) {\n const { writeFile } = await import('node:fs/promises')\n await writeFile(filePath, newContent)\n reverted++\n patchRevertedPaths.add(filePath)\n reversed = true\n }\n } catch { /* file read/write failed */ }\n\n if (!reversed) {\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n patchRevertedPaths.add(filePath)\n } catch {\n errors.push(`Could not revert: ${filePath}`)\n }\n } else {\n errors.push(`Could not reverse patch for untracked file: ${filePath}`)\n }\n }\n } else if (change.operation === 'delete') {\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n patchRevertedPaths.add(filePath)\n } catch {\n errors.push(`Could not restore deleted file: ${filePath}`)\n }\n }\n }\n } catch (err) {\n errors.push(`Failed to revert patch for ${filePath}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n }\n\n for (const filePath of allCommandPaths) {\n if (patchRevertedPaths.has(filePath)) continue\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n } catch {\n errors.push(`Could not restore command-modified file: ${filePath}`)\n }\n }\n }\n\n return { reverted, errors }\n}\n\nfunction mergeSessionCommandsIntoTurns(turns: unknown[], sessionLogRaw: string): unknown[] {\n const turnIds = new Set<string>()\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) turnIds.add(turnId)\n }\n\n if (turnIds.size === 0) return turns\n\n const orderByTurnId = buildSessionItemOrder(sessionLogRaw, turnIds)\n if (orderByTurnId.size === 0) return turns\n\n return turns.map((turn) => {\n const turnRecord = asRecord(turn)\n if (!turnRecord) return turn\n const turnId = readNonEmptyString(turnRecord.id)\n if (!turnId) return turn\n\n const slots = orderByTurnId.get(turnId)\n if (!slots || slots.length === 0) return turn\n\n const existingItems = Array.isArray(turnRecord.items) ? (turnRecord.items as Record<string, unknown>[]) : []\n const alreadyHasRecoveredItems = existingItems.some((it) => it.type === 'commandExecution' || it.type === 'fileChange')\n if (alreadyHasRecoveredItems) return turn\n\n const agentMessages = existingItems.filter((it) => it.type === 'agentMessage')\n const nonAgentNonUserItems = existingItems.filter((it) => it.type !== 'agentMessage' && it.type !== 'userMessage')\n const userMessages = existingItems.filter((it) => it.type === 'userMessage')\n\n let agentIdx = 0\n const interleaved: Record<string, unknown>[] = [...userMessages]\n\n for (const slot of slots) {\n if (slot.type === 'agentMessage') {\n if (agentIdx < agentMessages.length) {\n interleaved.push(agentMessages[agentIdx]!)\n agentIdx++\n }\n } else if (slot.type === 'commandExecution' && slot.command) {\n interleaved.push(slot.command as unknown as Record<string, unknown>)\n } else if (slot.type === 'fileChange' && slot.fileChange) {\n interleaved.push(slot.fileChange as unknown as Record<string, unknown>)\n }\n }\n\n while (agentIdx < agentMessages.length) {\n interleaved.push(agentMessages[agentIdx]!)\n agentIdx++\n }\n\n interleaved.push(...nonAgentNonUserItems)\n\n return {\n ...turnRecord,\n items: interleaved,\n }\n })\n}\n\nfunction isExactPhraseMatch(query: string, doc: ThreadSearchDocument): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return false\n return (\n doc.title.toLowerCase().includes(q) ||\n doc.preview.toLowerCase().includes(q) ||\n doc.messageText.toLowerCase().includes(q)\n )\n}\n\nfunction scoreFileCandidate(path: string, query: string): number {\n if (!query) return 0\n const lowerPath = path.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const baseName = lowerPath.slice(lowerPath.lastIndexOf('/') + 1)\n if (baseName === lowerQuery) return 0\n if (baseName.startsWith(lowerQuery)) return 1\n if (baseName.includes(lowerQuery)) return 2\n if (lowerPath.includes(`/${lowerQuery}`)) return 3\n if (lowerPath.includes(lowerQuery)) return 4\n return 10\n}\n\nasync function listFilesWithRipgrep(cwd: string): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const ripgrepCommand = resolveRipgrepCommand()\n if (!ripgrepCommand) {\n reject(new Error('ripgrep (rg) is not available'))\n return\n }\n\n const proc = spawn(ripgrepCommand, ['--files', '--hidden', '-g', '!.git', '-g', '!node_modules'], {\n cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n const rows = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n resolve(rows)\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n reject(new Error(details || 'rg --files failed'))\n })\n })\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nfunction getPromptsDir(): string {\n return join(getCodexHomeDir(), 'prompts')\n}\n\ntype ComposerPromptRecord = {\n name: string\n path: string\n content: string\n description: string\n}\n\nfunction promptNameToFileName(name: string): string {\n const trimmed = name.trim()\n const withoutExtension = trimmed.replace(/\\.md$/i, '')\n const sanitized = withoutExtension\n .replace(/[\\/\\\\:*?\"<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n return `${sanitized || 'prompt'}.md`\n}\n\nfunction buildPromptDescription(content: string): string {\n const firstNonEmptyLine = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? ''\n return firstNonEmptyLine.slice(0, 120)\n}\n\nasync function listComposerPrompts(): Promise<ComposerPromptRecord[]> {\n const promptsDir = getPromptsDir()\n try {\n const entries = await readdir(promptsDir, { withFileTypes: true })\n const prompts = await Promise.all(entries\n .filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith('.md'))\n .map(async (entry) => {\n const promptPath = join(promptsDir, entry.name)\n const content = await readFile(promptPath, 'utf8')\n return {\n name: entry.name.replace(/\\.md$/i, ''),\n path: promptPath,\n content,\n description: buildPromptDescription(content),\n } satisfies ComposerPromptRecord\n }))\n return prompts.sort((a, b) => a.name.localeCompare(b.name))\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') return []\n throw error\n }\n}\n\nasync function createComposerPromptFile(name: string, content: string): Promise<ComposerPromptRecord> {\n const trimmedName = name.trim()\n if (!trimmedName) throw new Error('Prompt name is required')\n const trimmedContent = content.trim()\n if (!trimmedContent) throw new Error('Prompt content is required')\n const promptsDir = getPromptsDir()\n await mkdir(promptsDir, { recursive: true })\n\n const baseFileName = promptNameToFileName(trimmedName)\n let targetPath = join(promptsDir, baseFileName)\n let suffix = 2\n while (existsSync(targetPath)) {\n const nextFileName = `${baseFileName.replace(/\\.md$/i, '')}-${suffix}.md`\n targetPath = join(promptsDir, nextFileName)\n suffix += 1\n }\n\n await writeFile(targetPath, `${trimmedContent}\\n`, 'utf8')\n return {\n name: basename(targetPath).replace(/\\.md$/i, ''),\n path: targetPath,\n content: `${trimmedContent}\\n`,\n description: buildPromptDescription(trimmedContent),\n }\n}\n\nasync function removeComposerPromptFile(promptPath: string): Promise<boolean> {\n const resolvedPath = resolve(promptPath)\n const promptsDir = resolve(getPromptsDir())\n const relative = resolvedPath.startsWith(`${promptsDir}/`) ? resolvedPath.slice(promptsDir.length + 1) : ''\n if (!relative || relative.includes('..') || !resolvedPath.toLowerCase().endsWith('.md')) {\n throw new Error('Invalid prompt path')\n }\n try {\n await rm(resolvedPath, { force: false })\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') return false\n throw error\n }\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n let timedOut = false\n let closed = false\n const timeout =\n typeof options.timeoutMs === 'number' && Number.isFinite(options.timeoutMs) && options.timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n proc.kill('SIGTERM')\n setTimeout(() => {\n if (!closed) proc.kill('SIGKILL')\n }, 5_000).unref()\n }, options.timeoutMs)\n : null\n timeout?.unref()\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (error) => {\n if (timeout) clearTimeout(timeout)\n reject(error)\n })\n proc.on('close', (code) => {\n closed = true\n if (timeout) clearTimeout(timeout)\n if (timedOut) {\n reject(new Error(`Command timed out after ${options.timeoutMs}ms (${command} ${args.join(' ')})`))\n return\n }\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"not a valid object name: 'head'\") ||\n message.includes('not a valid object name: head') ||\n message.includes('invalid reference: head')\n )\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nasync function ensureRepoHasInitialCommit(repoRoot: string): Promise<void> {\n const agentsPath = join(repoRoot, 'AGENTS.md')\n try {\n await stat(agentsPath)\n } catch {\n await writeFile(agentsPath, '', 'utf8')\n }\n\n await runCommand('git', ['add', 'AGENTS.md'], { cwd: repoRoot })\n await runCommand(\n 'git',\n ['-c', 'user.name=Codex', '-c', 'user.email=codex@local', 'commit', '-m', 'Initialize repository for worktree support'],\n { cwd: repoRoot },\n )\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction normalizeBranchRefName(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('refs/heads/')) return trimmed.slice('refs/heads/'.length)\n if (trimmed.startsWith('refs/remotes/')) return trimmed.slice('refs/remotes/'.length)\n return trimmed\n}\n\nfunction toHeaderGitResetHistoryRef(branchName: string, commitSha: string): string {\n return `refs/codex/header-git-reset-history/${branchName}/${commitSha}`\n}\n\nconst HEADER_GIT_RESET_HISTORY_REF_LIMIT = 25\n\nasync function assertLocalGitBranch(repoRoot: string, branchName: string): Promise<void> {\n await runCommandCapture('git', ['show-ref', '--verify', `refs/heads/${branchName}`], { cwd: repoRoot })\n}\n\nasync function checkoutGitBranchWithWorktreeRecovery(repoRoot: string, branchName: string): Promise<void> {\n try {\n await runCommand('git', ['checkout', branchName], { cwd: repoRoot })\n } catch (checkoutError) {\n const blockingWorktreePath = extractBranchLockedWorktreePath(checkoutError, branchName)\n if (!blockingWorktreePath) {\n throw checkoutError\n }\n await runCommand('git', ['checkout', '--detach'], { cwd: blockingWorktreePath })\n await runCommand('git', ['checkout', branchName], { cwd: repoRoot })\n }\n}\n\nasync function pruneHeaderGitResetHistoryRefs(repoRoot: string, branchName: string): Promise<void> {\n const resetHistoryRefPrefix = `refs/codex/header-git-reset-history/${branchName}/`\n const refsRaw = await runCommandCapture(\n 'git',\n ['for-each-ref', '--sort=-creatordate', '--format=%(refname)', resetHistoryRefPrefix],\n { cwd: repoRoot },\n ).catch(() => '')\n const refs = refsRaw\n .split('\\n')\n .map((entry) => entry.trim())\n .filter(Boolean)\n const staleRefs = refs.slice(HEADER_GIT_RESET_HISTORY_REF_LIMIT)\n for (const refName of staleRefs) {\n await runCommand('git', ['update-ref', '-d', refName], { cwd: repoRoot })\n }\n}\n\nasync function readGitHeaderState(cwd: string): Promise<{\n currentBranch: string | null\n headSha: string | null\n headSubject: string | null\n headDate: string | null\n detached: boolean\n dirty: boolean\n gitRoot: string\n}> {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n const currentBranchRaw = await runCommandCapture('git', ['branch', '--show-current'], { cwd: gitRoot })\n const currentBranch = currentBranchRaw.trim() || null\n const headShaRaw = await runCommandCapture('git', ['rev-parse', '--short=12', 'HEAD'], { cwd: gitRoot })\n const headCommitRaw = await runCommandCapture('git', ['show', '-s', '--date=short', '--format=%cd%x09%s', 'HEAD'], { cwd: gitRoot })\n const [headDate = '', ...headSubjectParts] = headCommitRaw.split('\\t')\n const statusRaw = await runCommandCapture('git', ['status', '--porcelain'], { cwd: gitRoot })\n return {\n currentBranch,\n headSha: headShaRaw.trim() || null,\n headSubject: headSubjectParts.join('\\t').trim() || null,\n headDate: headDate.trim() || null,\n detached: !currentBranch,\n dirty: statusRaw.trim().length > 0,\n gitRoot,\n }\n}\n\nasync function assertNoTrackedGitChanges(repoRoot: string): Promise<void> {\n const statusRaw = await runCommandCapture('git', ['status', '--porcelain'], { cwd: repoRoot })\n const trackedChanges = statusRaw\n .split('\\n')\n .map((line) => line.trimEnd())\n .filter((line) => line && !line.startsWith('?? '))\n if (trackedChanges.length > 0) {\n throw new Error('Cannot switch branches or reset with tracked uncommitted changes. Commit, stash, or discard tracked changes first. Untracked files are allowed unless Git would overwrite them.')\n }\n}\n\nfunction extractBranchLockedWorktreePath(error: unknown, branchName: string): string {\n const message = getErrorMessage(error, '')\n if (!message || !branchName) return ''\n const escapedBranch = branchName.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&')\n const pattern = new RegExp(`'${escapedBranch}' is already checked out at '([^']+)'`, 'u')\n const match = pattern.exec(message)\n return match?.[1]?.trim() ?? ''\n}\n\nfunction toPermanentWorktreeBranchNameDraft(worktreeName: string): string {\n const sanitized = worktreeName\n .trim()\n .replace(/[^A-Za-z0-9._-]+/gu, '-')\n .replace(/\\.+/gu, '.')\n .replace(/-+/gu, '-')\n .replace(/^[.-]+|[.-]+$/gu, '')\n return sanitized || 'worktree'\n}\n\nasync function isValidGitBranchName(gitRoot: string, branchName: string): Promise<boolean> {\n try {\n await runCommand('git', ['check-ref-format', '--branch', branchName], { cwd: gitRoot })\n return true\n } catch {\n return false\n }\n}\n\nasync function doesLocalGitBranchExist(gitRoot: string, branchName: string): Promise<boolean> {\n try {\n await runCommand('git', ['show-ref', '--verify', '--quiet', `refs/heads/${branchName}`], { cwd: gitRoot })\n return true\n } catch {\n return false\n }\n}\n\nasync function allocatePermanentWorktreeBranchName(gitRoot: string, worktreeName: string): Promise<string> {\n const base = toPermanentWorktreeBranchNameDraft(worktreeName)\n for (let attempt = 0; attempt < 50; attempt += 1) {\n const candidate = attempt === 0 ? base : `${base}-${attempt + 1}`\n if (!await isValidGitBranchName(gitRoot, candidate)) continue\n if (!await doesLocalGitBranchExist(gitRoot, candidate)) return candidate\n }\n throw new Error('Failed to allocate a unique branch name for worktree')\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item === 'string' && item.length > 0 && !normalized.includes(item)) {\n normalized.push(item)\n }\n }\n return normalized\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const next: Record<string, string> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n if (typeof key === 'string' && key.length > 0 && typeof item === 'string') {\n next[key] = item\n }\n }\n return next\n}\n\nfunction normalizeRemoteProjects(value: unknown): WorkspaceRootsState['remoteProjects'] {\n if (!Array.isArray(value)) return []\n const next: WorkspaceRootsState['remoteProjects'] = []\n const seen = new Set<string>()\n for (const item of value) {\n const record = asRecord(item)\n if (!record) continue\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n if (!id || seen.has(id)) continue\n seen.add(id)\n next.push({\n id,\n hostId: typeof record.hostId === 'string' ? record.hostId.trim() : '',\n remotePath: typeof record.remotePath === 'string' ? record.remotePath.trim() : '',\n label: typeof record.label === 'string' ? record.label.trim() : '',\n })\n }\n return next\n}\n\n\n\nfunction getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n auth_mode?: string\n last_refresh?: number\n tokens?: {\n access_token?: string\n refresh_token?: string\n id_token?: string\n account_id?: string\n }\n}\n\nconst CODEX_CHATGPT_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\nconst DEFAULT_CODEX_REFRESH_TOKEN_URL = 'https://auth.openai.com/oauth/token'\n\nfunction decodeBase64UrlJson(value: string): Record<string, unknown> | null {\n try {\n const padded = `${value}${'='.repeat((4 - (value.length % 4)) % 4)}`\n const decoded = Buffer.from(padded.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8')\n const parsed = JSON.parse(decoded) as unknown\n return asRecord(parsed)\n } catch {\n return null\n }\n}\n\nfunction decodeJwtPayload(token: string | undefined): Record<string, unknown> | null {\n if (!token) return null\n const parts = token.split('.')\n if (parts.length < 2) return null\n return decodeBase64UrlJson(parts[1] ?? '')\n}\n\nfunction extractChatgptTokenMetadata(accessToken: string | undefined): {\n chatgptAccountId: string | null\n chatgptPlanType: string | null\n} {\n const payload = decodeJwtPayload(accessToken)\n const auth = asRecord(payload?.['https://api.openai.com/auth'])\n return {\n chatgptAccountId: readNonEmptyString(auth?.chatgpt_account_id) || null,\n chatgptPlanType: readNonEmptyString(auth?.chatgpt_plan_type) || null,\n }\n}\n\nfunction readTokenErrorMessage(payload: unknown, fallback: string): string {\n const record = asRecord(payload)\n const message = readNonEmptyString(record?.message)\n if (message) return message\n const error = record?.error\n if (typeof error === 'string' && error.trim().length > 0) return error.trim()\n const nestedError = asRecord(error)\n return readNonEmptyString(nestedError?.message)\n || readNonEmptyString(nestedError?.error_description)\n || readNonEmptyString(record?.error_description)\n || fallback\n}\n\nfunction readTokenResponseString(payload: Record<string, unknown> | null, ...keys: string[]): string | null {\n if (!payload) return null\n for (const key of keys) {\n const value = readNonEmptyString(payload[key])\n if (value) return value\n }\n return null\n}\n\nexport async function refreshChatgptAuthTokensForExternalAuth(\n params: ChatgptAuthTokensRefreshParams = {},\n): Promise<ChatgptAuthTokensRefreshResponse> {\n const authPath = getCodexAuthPath()\n const raw = await readFile(authPath, 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const currentRefreshToken = auth.tokens?.refresh_token?.trim() ?? ''\n if (!currentRefreshToken) {\n throw new Error('No ChatGPT refresh token is available. Please sign in again.')\n }\n\n const refreshUrl = process.env.CODEX_REFRESH_TOKEN_URL_OVERRIDE?.trim() || DEFAULT_CODEX_REFRESH_TOKEN_URL\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: currentRefreshToken,\n client_id: CODEX_CHATGPT_CLIENT_ID,\n })\n\n const response = await fetch(refreshUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n signal: AbortSignal.timeout(25_000),\n })\n\n const text = await response.text()\n let payload: Record<string, unknown> | null = null\n try {\n payload = asRecord(JSON.parse(text))\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n throw new Error(readTokenErrorMessage(payload, `ChatGPT token refresh failed with HTTP ${String(response.status)}`))\n }\n\n const accessToken = readTokenResponseString(payload, 'access_token', 'accessToken')\n if (!accessToken) {\n throw new Error('ChatGPT token refresh response did not include an access token.')\n }\n\n const nextRefreshToken = readTokenResponseString(payload, 'refresh_token', 'refreshToken') ?? currentRefreshToken\n const nextIdToken = readTokenResponseString(payload, 'id_token', 'idToken') ?? auth.tokens?.id_token\n const metadata = extractChatgptTokenMetadata(accessToken)\n const chatgptAccountId =\n metadata.chatgptAccountId\n || readTokenResponseString(payload, 'chatgpt_account_id', 'chatgptAccountId')\n || readNonEmptyString(params.previousAccountId)\n || readNonEmptyString(auth.tokens?.account_id)\n if (!chatgptAccountId) {\n throw new Error('ChatGPT token refresh response did not include account metadata.')\n }\n\n const nextAuth: CodexAuth = {\n ...auth,\n auth_mode: auth.auth_mode || 'chatgpt',\n last_refresh: Date.now(),\n tokens: {\n ...auth.tokens,\n access_token: accessToken,\n refresh_token: nextRefreshToken,\n account_id: chatgptAccountId,\n ...(nextIdToken ? { id_token: nextIdToken } : {}),\n },\n }\n await writeFile(authPath, JSON.stringify(nextAuth, null, 2), { encoding: 'utf8', mode: 0o600 })\n\n return {\n accessToken,\n chatgptAccountId,\n chatgptPlanType: metadata.chatgptPlanType,\n }\n}\n\nasync function readCodexAuth(): Promise<{ accessToken: string; accountId?: string } | null> {\n try {\n const raw = await readFile(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const token = auth.tokens?.access_token\n if (!token) return null\n return { accessToken: token, accountId: auth.tokens?.account_id ?? undefined }\n } catch {\n return null\n }\n}\n\nfunction hasUsableCodexAuthSync(): boolean {\n try {\n const raw = readFileSync(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n return Boolean(auth.tokens?.access_token?.trim())\n } catch {\n return false\n }\n}\n\nfunction readFreeModeStateSync(statePath: string): FreeModeState | null {\n try {\n return JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n } catch {\n return null\n }\n}\n\nfunction ensureDefaultFreeModeStateForMissingAuthSync(statePath: string): FreeModeState | null {\n const current = readFreeModeStateSync(statePath)\n if (!shouldCreateDefaultFreeModeStateForMissingAuth(current, hasUsableCodexAuthSync())) {\n return current\n }\n\n const fallback = createDefaultOpenCodeZenFreeModeState()\n\n mkdirSync(dirname(statePath), { recursive: true })\n writeFileSync(statePath, JSON.stringify(fallback), { encoding: 'utf8', mode: 0o600 })\n return fallback\n}\n\nfunction isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean {\n if (!remoteAddress) return false\n const normalized = remoteAddress.startsWith('::ffff:')\n ? remoteAddress.slice('::ffff:'.length)\n : remoteAddress\n return normalized === '127.0.0.1' || normalized === '::1'\n}\n\nfunction getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\nfunction getTelegramBridgeConfigPath(): string {\n return join(getCodexHomeDir(), 'telegram-bridge.json')\n}\n\nfunction getCodexSessionIndexPath(): string {\n return join(getCodexHomeDir(), 'session_index.jsonl')\n}\n\nfunction getCodexAutomationsDir(): string {\n return join(getCodexHomeDir(), 'automations')\n}\n\ntype ThreadAutomationStatus = 'ACTIVE' | 'PAUSED'\n\ntype ThreadAutomationRecord = {\n id: string\n kind: 'heartbeat' | 'cron'\n name: string\n prompt: string\n rrule: string\n status: ThreadAutomationStatus\n targetThreadId: string | null\n createdAtMs: number | null\n updatedAtMs: number | null\n nextRunAtMs: number | null\n}\n\nfunction readTomlString(value: string): string {\n const trimmed = value.trim()\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith('\\'') && trimmed.endsWith('\\''))) {\n try {\n return JSON.parse(trimmed)\n } catch {\n return trimmed.slice(1, -1)\n }\n }\n return trimmed\n}\n\nfunction serializeTomlString(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction parseAutomationToml(raw: string): ThreadAutomationRecord | null {\n const values: Record<string, string> = {}\n for (const line of raw.split(/\\r?\\n/u)) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#') || !trimmed.includes('=')) continue\n const separatorIndex = trimmed.indexOf('=')\n const key = trimmed.slice(0, separatorIndex).trim()\n const value = trimmed.slice(separatorIndex + 1).trim()\n if (key) values[key] = value\n }\n\n const id = readTomlString(values.id ?? '')\n const kindValue = readTomlString(values.kind ?? 'heartbeat')\n const name = readTomlString(values.name ?? '')\n const prompt = readTomlString(values.prompt ?? '')\n const rrule = readTomlString(values.rrule ?? '')\n const statusValue = readTomlString(values.status ?? 'ACTIVE')\n const targetThreadId = readTomlString(values.target_thread_id ?? '') || null\n const createdAtMs = Number.parseInt(values.created_at ?? '', 10)\n const updatedAtMs = Number.parseInt(values.updated_at ?? '', 10)\n\n if (!id || !name || !prompt || !rrule) return null\n if (kindValue !== 'heartbeat' && kindValue !== 'cron') return null\n if (statusValue !== 'ACTIVE' && statusValue !== 'PAUSED') return null\n\n return {\n id,\n kind: kindValue,\n name,\n prompt,\n rrule,\n status: statusValue,\n targetThreadId,\n createdAtMs: Number.isFinite(createdAtMs) ? createdAtMs : null,\n updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : null,\n nextRunAtMs: null,\n }\n}\n\nfunction serializeAutomationToml(record: ThreadAutomationRecord): string {\n const lines = [\n 'version = 1',\n `id = ${serializeTomlString(record.id)}`,\n `kind = ${serializeTomlString(record.kind)}`,\n `name = ${serializeTomlString(record.name)}`,\n `prompt = ${serializeTomlString(record.prompt)}`,\n `status = ${serializeTomlString(record.status)}`,\n `rrule = ${serializeTomlString(record.rrule)}`,\n `target_thread_id = ${serializeTomlString(record.targetThreadId ?? '')}`,\n `created_at = ${String(record.createdAtMs ?? Date.now())}`,\n `updated_at = ${String(record.updatedAtMs ?? Date.now())}`,\n ]\n return `${lines.join('\\n')}\\n`\n}\n\nfunction slugifyAutomationId(threadId: string, name: string): string {\n const preferred = name.trim().toLowerCase().replace(/[^a-z0-9]+/gu, '-').replace(/^-+|-+$/gu, '')\n if (preferred) return preferred.slice(0, 48)\n const fallback = threadId.trim().toLowerCase().replace(/[^a-z0-9]+/gu, '-').replace(/^-+|-+$/gu, '')\n return `heartbeat-${fallback.slice(0, 24) || randomBytes(4).toString('hex')}`\n}\n\nasync function readAutomationRecordFromFile(filePath: string): Promise<ThreadAutomationRecord | null> {\n try {\n return parseAutomationToml(await readFile(filePath, 'utf8'))\n } catch {\n return null\n }\n}\n\nasync function listThreadHeartbeatAutomations(): Promise<Record<string, ThreadAutomationRecord[]>> {\n const automationRoot = getCodexAutomationsDir()\n const next: Record<string, ThreadAutomationRecord[]> = {}\n let entries\n try {\n entries = await readdir(automationRoot, { withFileTypes: true })\n } catch {\n return next\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const automation = await readAutomationRecordFromFile(join(automationRoot, entry.name, 'automation.toml'))\n if (!automation || automation.kind !== 'heartbeat' || !automation.targetThreadId) continue\n next[automation.targetThreadId] = [...(next[automation.targetThreadId] ?? []), automation]\n }\n\n for (const automations of Object.values(next)) {\n automations.sort((first, second) => {\n const firstCreatedAt = first.createdAtMs ?? 0\n const secondCreatedAt = second.createdAtMs ?? 0\n if (firstCreatedAt !== secondCreatedAt) return firstCreatedAt - secondCreatedAt\n return first.id.localeCompare(second.id)\n })\n }\n\n return next\n}\n\nasync function readThreadHeartbeatAutomations(threadId: string): Promise<ThreadAutomationRecord[]> {\n const all = await listThreadHeartbeatAutomations()\n return all[threadId] ?? []\n}\n\nasync function readThreadHeartbeatAutomation(threadId: string, automationId = ''): Promise<ThreadAutomationRecord | null> {\n const automations = await readThreadHeartbeatAutomations(threadId)\n if (automationId) return automations.find((automation) => automation.id === automationId) ?? null\n return automations[0] ?? null\n}\n\nfunction resolveUniqueAutomationId(existingIds: Set<string>, threadId: string, name: string): string {\n const baseId = slugifyAutomationId(threadId, name)\n if (!existingIds.has(baseId)) return baseId\n for (let index = 2; index < 1000; index += 1) {\n const candidate = `${baseId}-${index}`\n if (!existingIds.has(candidate)) return candidate\n }\n return `${baseId}-${randomBytes(4).toString('hex')}`\n}\n\nasync function writeThreadHeartbeatAutomation(input: {\n threadId: string\n id?: string\n name: string\n prompt: string\n rrule: string\n status: ThreadAutomationStatus\n}): Promise<ThreadAutomationRecord> {\n const threadId = input.threadId.trim()\n const name = input.name.trim()\n const prompt = input.prompt.trim()\n const rrule = input.rrule.trim()\n if (!threadId || !name || !prompt || !rrule) {\n throw new Error('threadId, name, prompt, and rrule are required')\n }\n\n const automationRoot = getCodexAutomationsDir()\n await mkdir(automationRoot, { recursive: true })\n const existing = input.id ? await readThreadHeartbeatAutomation(threadId, input.id.trim()) : null\n const entries = await readdir(automationRoot, { withFileTypes: true }).catch(() => [])\n const existingIds = new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name))\n const id = existing?.id ?? resolveUniqueAutomationId(existingIds, threadId, name)\n const automationDir = join(automationRoot, id)\n const now = Date.now()\n const record: ThreadAutomationRecord = {\n id,\n kind: 'heartbeat',\n name,\n prompt,\n rrule,\n status: input.status,\n targetThreadId: threadId,\n createdAtMs: existing?.createdAtMs ?? now,\n updatedAtMs: now,\n nextRunAtMs: null,\n }\n\n await mkdir(automationDir, { recursive: true })\n await writeFile(join(automationDir, 'automation.toml'), serializeAutomationToml(record), 'utf8')\n const memoryPath = join(automationDir, 'memory.md')\n try {\n await stat(memoryPath)\n } catch {\n await writeFile(memoryPath, '', 'utf8')\n }\n return record\n}\n\nasync function deleteThreadHeartbeatAutomation(threadId: string, automationId = ''): Promise<boolean> {\n const normalizedThreadId = threadId.trim()\n const normalizedAutomationId = automationId.trim()\n if (normalizedAutomationId) {\n const automation = await readThreadHeartbeatAutomation(normalizedThreadId, normalizedAutomationId)\n if (!automation) return false\n await rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })\n return true\n }\n\n const automations = await readThreadHeartbeatAutomations(normalizedThreadId)\n if (automations.length === 0) return false\n await Promise.all(automations.map((automation) => rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })))\n return true\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\nconst EMPTY_THREAD_TITLE_CACHE: ThreadTitleCache = { titles: {}, order: [] }\nconst PINNED_THREAD_IDS_KEY = 'pinned-thread-ids'\n\ntype SessionIndexThreadTitleCacheState = {\n fileSignature: string | null\n cache: ThreadTitleCache\n}\n\nlet sessionIndexThreadTitleCacheState: SessionIndexThreadTitleCacheState = {\n fileSignature: null,\n cache: EMPTY_THREAD_TITLE_CACHE,\n}\n\ntype TelegramBridgeConfigState = {\n botToken: string\n chatIds: number[]\n allowedUserIds: Array<number | '*'>\n}\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return EMPTY_THREAD_TITLE_CACHE\n const rawTitles = asRecord(record.titles)\n const titles: Record<string, string> = {}\n if (rawTitles) {\n for (const [k, v] of Object.entries(rawTitles)) {\n if (typeof v === 'string' && v.length > 0) titles[k] = v\n }\n }\n const order = normalizeStringArray(record.order)\n return { titles, order }\n}\n\nfunction normalizePinnedThreadIds(value: unknown): string[] {\n return normalizeStringArray(value)\n}\n\nfunction updateThreadTitleCache(cache: ThreadTitleCache, id: string, title: string): ThreadTitleCache {\n const titles = { ...cache.titles, [id]: title }\n const order = [id, ...cache.order.filter((o) => o !== id)]\n while (order.length > MAX_THREAD_TITLES) {\n const removed = order.pop()\n if (removed) delete titles[removed]\n }\n return { titles, order }\n}\n\nfunction removeFromThreadTitleCache(cache: ThreadTitleCache, id: string): ThreadTitleCache {\n const { [id]: _, ...titles } = cache.titles\n return { titles, order: cache.order.filter((o) => o !== id) }\n}\n\ntype SessionIndexThreadTitle = {\n id: string\n title: string\n updatedAtMs: number\n}\n\nfunction normalizeSessionIndexThreadTitle(value: unknown): SessionIndexThreadTitle | null {\n const record = asRecord(value)\n if (!record) return null\n\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n const title = typeof record.thread_name === 'string' ? record.thread_name.trim() : ''\n const updatedAtIso = typeof record.updated_at === 'string' ? record.updated_at.trim() : ''\n const updatedAtMs = updatedAtIso ? Date.parse(updatedAtIso) : Number.NaN\n\n if (!id || !title) return null\n return {\n id,\n title,\n updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,\n }\n}\n\nfunction trimThreadTitleCache(cache: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...cache.titles }\n const order = cache.order.filter((id) => {\n if (!titles[id]) return false\n return true\n }).slice(0, MAX_THREAD_TITLES)\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n delete titles[id]\n }\n }\n\n return { titles, order }\n}\n\nfunction mergeThreadTitleCaches(base: ThreadTitleCache, overlay: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...base.titles, ...overlay.titles }\n const order: string[] = []\n\n for (const id of [...overlay.order, ...base.order]) {\n if (!titles[id] || order.includes(id)) continue\n order.push(id)\n }\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n order.push(id)\n }\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitleCache(): Promise<ThreadTitleCache> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadTitleCache(payload['thread-titles'])\n } catch {\n return EMPTY_THREAD_TITLE_CACHE\n }\n}\n\nasync function writeThreadTitleCache(cache: ThreadTitleCache): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload['thread-titles'] = cache\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function readPinnedThreadIds(): Promise<string[]> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizePinnedThreadIds(payload[PINNED_THREAD_IDS_KEY])\n } catch {\n return []\n }\n}\n\nasync function writePinnedThreadIds(threadIds: string[]): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload[PINNED_THREAD_IDS_KEY] = normalizePinnedThreadIds(threadIds)\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nconst FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY = 'first-launch-plugins-card-dismissed'\nconst THREAD_QUEUE_STATE_KEY = 'thread-queue-state'\n\ntype StoredQueuedMessage = {\n id: string\n text: string\n imageUrls: string[]\n skills: Array<{ name: string; path: string }>\n fileAttachments: Array<{ label: string; path: string; fsPath: string }>\n collaborationMode: 'default' | 'plan'\n}\n\ntype ThreadQueueState = Record<string, StoredQueuedMessage[]>\n\ntype BackendQueuedTurn = {\n threadId: string\n message: StoredQueuedMessage\n}\n\ntype ThreadQueueStateUpdate<T> = {\n nextState: ThreadQueueState\n result: T\n}\n\ntype ResolvedCollaborationModeSettings = {\n model: string\n reasoningEffort: ReasoningEffort | null\n}\n\nfunction normalizeStoredQueuedMessage(value: unknown): StoredQueuedMessage | null {\n const record = asRecord(value)\n if (!record) return null\n\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n if (!id) return null\n\n const normalizeNamedPathItems = (items: unknown): Array<{ name: string; path: string }> => {\n if (!Array.isArray(items)) return []\n return items.flatMap((item) => {\n const itemRecord = asRecord(item)\n if (!itemRecord) return []\n const name = typeof itemRecord.name === 'string' ? itemRecord.name.trim() : ''\n const path = typeof itemRecord.path === 'string' ? itemRecord.path.trim() : ''\n return name && path ? [{ name, path }] : []\n })\n }\n\n const normalizeFileAttachments = (items: unknown): Array<{ label: string; path: string; fsPath: string }> => {\n if (!Array.isArray(items)) return []\n return items.flatMap((item) => {\n const itemRecord = asRecord(item)\n if (!itemRecord) return []\n const label = typeof itemRecord.label === 'string' ? itemRecord.label.trim() : ''\n const path = typeof itemRecord.path === 'string' ? itemRecord.path.trim() : ''\n const fsPath = typeof itemRecord.fsPath === 'string' ? itemRecord.fsPath.trim() : ''\n return label && path && fsPath ? [{ label, path, fsPath }] : []\n })\n }\n\n return {\n id,\n text: typeof record.text === 'string' ? record.text : '',\n imageUrls: normalizeStringArray(record.imageUrls),\n skills: normalizeNamedPathItems(record.skills),\n fileAttachments: normalizeFileAttachments(record.fileAttachments),\n collaborationMode: record.collaborationMode === 'plan' ? 'plan' : 'default',\n }\n}\n\nfunction normalizeThreadQueueState(value: unknown): ThreadQueueState {\n const record = asRecord(value)\n if (!record) return {}\n\n const state: ThreadQueueState = {}\n for (const [threadId, rawMessages] of Object.entries(record)) {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId || !Array.isArray(rawMessages)) continue\n const messages = rawMessages.flatMap((item) => {\n const message = normalizeStoredQueuedMessage(item)\n return message ? [message] : []\n })\n if (messages.length > 0) {\n state[normalizedThreadId] = messages\n }\n }\n return state\n}\n\nlet threadQueueMutationChain: Promise<unknown> = Promise.resolve()\n\nasync function readThreadQueueState(): Promise<ThreadQueueState> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadQueueState(payload[THREAD_QUEUE_STATE_KEY])\n } catch {\n return {}\n }\n}\n\nasync function writeThreadQueueStateUnlocked(nextState: ThreadQueueState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n const normalized = normalizeThreadQueueState(nextState)\n if (Object.keys(normalized).length > 0) {\n payload[THREAD_QUEUE_STATE_KEY] = normalized\n } else {\n delete payload[THREAD_QUEUE_STATE_KEY]\n }\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function withThreadQueueStateUpdate<T>(\n update: (state: ThreadQueueState) => ThreadQueueStateUpdate<T> | Promise<ThreadQueueStateUpdate<T>>,\n): Promise<T> {\n const run = threadQueueMutationChain.then(async () => {\n const currentState = await readThreadQueueState()\n const { nextState, result } = await update(currentState)\n await writeThreadQueueStateUnlocked(nextState)\n return result\n })\n threadQueueMutationChain = run.catch(() => {})\n return run\n}\n\nasync function writeThreadQueueState(nextState: ThreadQueueState): Promise<void> {\n await withThreadQueueStateUpdate(() => ({\n nextState: normalizeThreadQueueState(nextState),\n result: undefined,\n }))\n}\n\nasync function appendThreadQueuedMessage(threadId: string, message: StoredQueuedMessage): Promise<void> {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId) throw new Error('threadId is required')\n await withThreadQueueStateUpdate((state) => ({\n nextState: {\n ...state,\n [normalizedThreadId]: [...(state[normalizedThreadId] ?? []), message],\n },\n result: undefined,\n }))\n}\n\nfunction normalizeReasoningEffort(value: unknown): ReasoningEffort | '' {\n const allowed: ReasoningEffort[] = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh']\n return typeof value === 'string' && allowed.includes(value as ReasoningEffort)\n ? (value as ReasoningEffort)\n : ''\n}\n\nfunction normalizeCollaborationModeReasoningEffort(value: ReasoningEffort | '' | null | undefined): ReasoningEffort | null {\n return value && value.length > 0 ? value : null\n}\n\nfunction extractLocalImagePathFromUrl(value: string): string | null {\n if (!value) return null\n try {\n const parsed = new URL(value, 'http://localhost')\n if (parsed.pathname !== '/codex-local-image') return null\n const path = parsed.searchParams.get('path')?.trim() ?? ''\n return path.length > 0 ? path : null\n } catch {\n return null\n }\n}\n\nfunction buildTextWithAttachments(prompt: string, files: StoredQueuedMessage['fileAttachments']): string {\n if (files.length === 0) return prompt\n let prefix = '# Files mentioned by the user:\\n'\n for (const f of files) {\n prefix += `\\n## ${f.label}: ${f.path}\\n`\n }\n return `${prefix}\\n## My request for Codex:\\n\\n${prompt}\\n`\n}\n\nfunction escapeHeartbeatXmlText(value: string): string {\n return value\n .replace(/&/gu, '&amp;')\n .replace(/</gu, '&lt;')\n .replace(/>/gu, '&gt;')\n}\n\nfunction buildHeartbeatQueuedMessage(automation: ThreadAutomationRecord): StoredQueuedMessage {\n return {\n id: `automation-${automation.id}-${Date.now()}-${randomBytes(3).toString('hex')}`,\n text: `<heartbeat>\n<automation_id>${escapeHeartbeatXmlText(automation.id)}</automation_id>\n<current_time_iso>${new Date().toISOString()}</current_time_iso>\n<instructions>\n${escapeHeartbeatXmlText(automation.prompt)}\n</instructions>\n</heartbeat>`,\n imageUrls: [],\n skills: [],\n fileAttachments: [],\n collaborationMode: 'default',\n }\n}\n\nfunction fileNameFromPath(pathValue: string): string {\n const normalized = pathValue.replace(/\\\\/g, '/')\n const segments = normalized.split('/').filter(Boolean)\n return segments.at(-1) ?? normalized\n}\n\nfunction extractThreadIdFromNotificationParams(params: unknown): string {\n const record = asRecord(params)\n if (!record) return ''\n const threadId =\n (typeof record.threadId === 'string' ? record.threadId : '') ||\n (typeof record.thread_id === 'string' ? record.thread_id : '') ||\n (typeof record.conversationId === 'string' ? record.conversationId : '') ||\n (typeof record.conversation_id === 'string' ? record.conversation_id : '')\n if (threadId) return threadId\n const thread = asRecord(record.thread)\n if (thread && typeof thread.id === 'string') return thread.id\n const turn = asRecord(record.turn)\n if (turn) {\n const turnThreadId =\n (typeof turn.threadId === 'string' ? turn.threadId : '') ||\n (typeof turn.thread_id === 'string' ? turn.thread_id : '')\n if (turnThreadId) return turnThreadId\n }\n return ''\n}\n\nfunction isTurnCompletedNotification(notification: { method: string; params: unknown }): boolean {\n return notification.method === 'turn/completed'\n}\n\nasync function readFirstLaunchPluginsCardDismissed(): Promise<boolean> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return payload[FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY] === true\n } catch {\n return false\n }\n}\n\nasync function writeFirstLaunchPluginsCardDismissed(dismissed: boolean): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload[FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY] = dismissed === true\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nfunction getSessionIndexFileSignature(stats: { mtimeMs: number; size: number }): string {\n return `${String(stats.mtimeMs)}:${String(stats.size)}`\n}\n\nasync function parseThreadTitlesFromSessionIndex(sessionIndexPath: string): Promise<ThreadTitleCache> {\n const latestById = new Map<string, SessionIndexThreadTitle>()\n const input = createReadStream(sessionIndexPath, { encoding: 'utf8' })\n const lines = createInterface({\n input,\n crlfDelay: Infinity,\n })\n\n try {\n for await (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n\n try {\n const entry = normalizeSessionIndexThreadTitle(JSON.parse(trimmed) as unknown)\n if (!entry) continue\n\n const previous = latestById.get(entry.id)\n if (!previous || entry.updatedAtMs >= previous.updatedAtMs) {\n latestById.set(entry.id, entry)\n }\n } catch {\n // Skip malformed lines and keep scanning the rest of the index.\n }\n }\n } finally {\n lines.close()\n input.close()\n }\n\n const entries = Array.from(latestById.values()).sort((first, second) => second.updatedAtMs - first.updatedAtMs)\n const titles: Record<string, string> = {}\n const order: string[] = []\n for (const entry of entries) {\n titles[entry.id] = entry.title\n order.push(entry.id)\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitlesFromSessionIndex(): Promise<ThreadTitleCache> {\n const sessionIndexPath = getCodexSessionIndexPath()\n\n try {\n const stats = await stat(sessionIndexPath)\n const fileSignature = getSessionIndexFileSignature(stats)\n if (sessionIndexThreadTitleCacheState.fileSignature === fileSignature) {\n return sessionIndexThreadTitleCacheState.cache\n }\n\n const cache = await parseThreadTitlesFromSessionIndex(sessionIndexPath)\n sessionIndexThreadTitleCacheState = { fileSignature, cache }\n return cache\n } catch {\n sessionIndexThreadTitleCacheState = {\n fileSignature: 'missing',\n cache: EMPTY_THREAD_TITLE_CACHE,\n }\n return sessionIndexThreadTitleCacheState.cache\n }\n}\n\nasync function readMergedThreadTitleCache(): Promise<ThreadTitleCache> {\n const [sessionIndexCache, persistedCache] = await Promise.all([\n readThreadTitlesFromSessionIndex(),\n readThreadTitleCache(),\n ])\n return mergeThreadTitleCaches(persistedCache, sessionIndexCache)\n}\n\nasync function readWorkspaceRootsState(): Promise<WorkspaceRootsState> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n payload = asRecord(parsed) ?? {}\n } catch {\n payload = {}\n }\n\n return {\n order: normalizeStringArray(payload['electron-saved-workspace-roots']),\n labels: normalizeStringRecord(payload['electron-workspace-root-labels']),\n active: normalizeStringArray(payload['active-workspace-roots']),\n projectOrder: normalizeStringArray(payload['project-order']),\n remoteProjects: normalizeRemoteProjects(payload['remote-projects']),\n }\n}\n\nasync function writeWorkspaceRootsState(nextState: WorkspaceRootsState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload['electron-saved-workspace-roots'] = normalizeStringArray(nextState.order)\n payload['electron-workspace-root-labels'] = normalizeStringRecord(nextState.labels)\n payload['active-workspace-roots'] = normalizeStringArray(nextState.active)\n payload['project-order'] = normalizeStringArray(nextState.projectOrder)\n\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nlet workspaceRootsMutation: Promise<void> = Promise.resolve()\n\nfunction queueWorkspaceRootsMutation<T>(mutation: () => Promise<T>): Promise<T> {\n const run = workspaceRootsMutation.catch(() => undefined).then(mutation)\n workspaceRootsMutation = run.then(\n () => undefined,\n () => undefined,\n )\n return run\n}\n\nfunction prependUniqueString(value: string, items: string[]): string[] {\n return [value, ...items.filter((item) => item !== value)]\n}\n\nasync function updateWorkspaceRootsState(\n updater: (existingState: WorkspaceRootsState) => WorkspaceRootsState,\n): Promise<void> {\n await queueWorkspaceRootsMutation(async () => {\n const existingState = await readWorkspaceRootsState()\n await writeWorkspaceRootsState(updater(existingState))\n })\n}\n\nasync function persistWorkspaceRoot(workspaceRoot: string, label = ''): Promise<void> {\n const normalizedRoot = workspaceRoot.trim()\n if (!normalizedRoot) return\n\n await updateWorkspaceRootsState((existingState) => {\n const nextLabels = { ...existingState.labels }\n const trimmedLabel = label.trim()\n if (trimmedLabel.length > 0) {\n nextLabels[normalizedRoot] = trimmedLabel\n }\n return {\n order: prependUniqueString(normalizedRoot, existingState.order),\n labels: nextLabels,\n active: prependUniqueString(normalizedRoot, existingState.active),\n projectOrder: prependUniqueString(normalizedRoot, existingState.projectOrder),\n remoteProjects: existingState.remoteProjects,\n }\n })\n}\n\nasync function rollbackCreatedWorktree(\n gitRoot: string,\n worktreeCwd: string,\n cleanupDirectory?: string,\n branchName?: string,\n): Promise<void> {\n try {\n await runCommand('git', ['worktree', 'remove', '--force', worktreeCwd], { cwd: gitRoot })\n } catch {\n await rm(worktreeCwd, { recursive: true, force: true }).catch(() => undefined)\n }\n\n if (cleanupDirectory && cleanupDirectory !== worktreeCwd) {\n await rm(cleanupDirectory, { recursive: true, force: true }).catch(() => undefined)\n }\n\n if (branchName) {\n await runCommand('git', ['branch', '-D', branchName], { cwd: gitRoot }).catch(() => undefined)\n }\n}\n\nfunction normalizeTelegramBridgeConfig(value: unknown): TelegramBridgeConfigState {\n const record = asRecord(value)\n if (!record) return { botToken: '', chatIds: [], allowedUserIds: [] }\n const botToken = typeof record.botToken === 'string' ? record.botToken.trim() : ''\n const rawChatIds = Array.isArray(record.chatIds) ? record.chatIds : []\n const chatIds = Array.from(new Set(rawChatIds\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value))\n .map((value) => Math.trunc(value)))).slice(0, 50)\n const rawAllowedUserIds = Array.isArray(record.allowedUserIds) ? record.allowedUserIds : []\n const allowAllUsers = rawAllowedUserIds.some((value) => typeof value === 'string' && value.trim() === '*')\n const normalizedAllowedUserIds = Array.from(new Set(rawAllowedUserIds\n .map((value) => {\n if (typeof value === 'number' && Number.isFinite(value)) return Math.trunc(value)\n if (typeof value === 'string') {\n const normalized = value.trim().replace(/^(telegram|tg):/i, '').trim()\n if (/^-?\\d+$/.test(normalized)) {\n return Number.parseInt(normalized, 10)\n }\n }\n return Number.NaN\n })\n .filter((value) => Number.isFinite(value)))).slice(0, 100)\n const allowedUserIds: Array<number | '*'> = allowAllUsers\n ? ['*' as const, ...normalizedAllowedUserIds]\n : normalizedAllowedUserIds\n return { botToken, chatIds, allowedUserIds }\n}\n\nasync function readTelegramBridgeConfig(): Promise<TelegramBridgeConfigState> {\n const telegramConfigPath = getTelegramBridgeConfigPath()\n try {\n const raw = await readFile(telegramConfigPath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeTelegramBridgeConfig(payload)\n } catch {\n return { botToken: '', chatIds: [], allowedUserIds: [] }\n }\n}\n\nasync function writeTelegramBridgeConfig(nextState: TelegramBridgeConfigState): Promise<void> {\n const normalized = normalizeTelegramBridgeConfig(nextState)\n const telegramConfigPath = getTelegramBridgeConfigPath()\n await writeFile(telegramConfigPath, JSON.stringify({\n botToken: normalized.botToken,\n chatIds: normalized.chatIds,\n allowedUserIds: normalized.allowedUserIds,\n }), 'utf8')\n}\n\nlet telegramBridgeConfigMutation: Promise<void> = Promise.resolve()\n\nfunction rememberTelegramChatId(chatId: number): Promise<void> {\n const normalizedChatId = Math.trunc(chatId)\n if (!Number.isFinite(normalizedChatId)) return Promise.resolve()\n\n telegramBridgeConfigMutation = telegramBridgeConfigMutation.then(async () => {\n const current = await readTelegramBridgeConfig()\n if (current.chatIds.includes(normalizedChatId)) return\n const next = {\n ...current,\n chatIds: [normalizedChatId, ...current.chatIds].slice(0, 50),\n }\n await writeTelegramBridgeConfig(next)\n })\n return telegramBridgeConfigMutation\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const raw = await readRawBody(req)\n if (raw.length === 0) return null\n const text = raw.toString('utf8').trim()\n if (text.length === 0) return null\n return JSON.parse(text) as unknown\n}\n\nasync function readRawBody(req: IncomingMessage): Promise<Buffer> {\n const chunks: Uint8Array[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nfunction bufferIndexOf(buf: Buffer, needle: Buffer, start = 0): number {\n for (let i = start; i <= buf.length - needle.length; i++) {\n let match = true\n for (let j = 0; j < needle.length; j++) {\n if (buf[i + j] !== needle[j]) { match = false; break }\n }\n if (match) return i\n }\n return -1\n}\n\nfunction handleFileUpload(req: IncomingMessage, res: ServerResponse): void {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', async () => {\n try {\n const body = Buffer.concat(chunks)\n const contentType = req.headers['content-type'] ?? ''\n const boundaryMatch = contentType.match(/boundary=(.+)/i)\n if (!boundaryMatch) { setJson(res, 400, { error: 'Missing multipart boundary' }); return }\n const boundary = boundaryMatch[1]\n const boundaryBuf = Buffer.from(`--${boundary}`)\n const parts: Buffer[] = []\n let searchStart = 0\n while (searchStart < body.length) {\n const idx = body.indexOf(boundaryBuf, searchStart)\n if (idx < 0) break\n if (searchStart > 0) parts.push(body.subarray(searchStart, idx))\n searchStart = idx + boundaryBuf.length\n if (body[searchStart] === 0x0d && body[searchStart + 1] === 0x0a) searchStart += 2\n }\n let fileName = 'uploaded-file'\n let fileData: Buffer | null = null\n const headerSep = Buffer.from('\\r\\n\\r\\n')\n for (const part of parts) {\n const headerEnd = bufferIndexOf(part, headerSep)\n if (headerEnd < 0) continue\n const headers = part.subarray(0, headerEnd).toString('utf8')\n const fnMatch = headers.match(/filename=\"([^\"]+)\"/i)\n if (!fnMatch) continue\n fileName = fnMatch[1].replace(/[/\\\\]/g, '_')\n let end = part.length\n if (end >= 2 && part[end - 2] === 0x0d && part[end - 1] === 0x0a) end -= 2\n fileData = part.subarray(headerEnd + 4, end)\n break\n }\n if (!fileData) { setJson(res, 400, { error: 'No file in request' }); return }\n const uploadDir = join(tmpdir(), 'codex-web-uploads')\n await mkdir(uploadDir, { recursive: true })\n const destDir = await mkdtemp(join(uploadDir, 'f-'))\n const destPath = join(destDir, fileName)\n await writeFile(destPath, fileData)\n setJson(res, 200, { path: destPath })\n } catch (err) {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload failed') })\n }\n })\n req.on('error', (err: Error) => {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload stream error') })\n })\n}\n\nfunction httpPost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n const doRequest = url.startsWith('http://') ? httpRequest : httpsRequest\n return new Promise((resolve, reject) => {\n const req = doRequest(url, { method: 'POST', headers }, (res) => {\n const chunks: Buffer[] = []\n res.on('data', (c: Buffer) => chunks.push(c))\n res.on('end', () => resolve({ status: res.statusCode ?? 500, body: Buffer.concat(chunks).toString('utf8') }))\n res.on('error', reject)\n })\n req.on('error', reject)\n req.write(body)\n req.end()\n })\n}\n\nlet curlImpersonateAvailable: boolean | null = null\n\nfunction curlImpersonatePost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n return new Promise((resolve, reject) => {\n const args = ['-s', '-w', '\\n%{http_code}', '-X', 'POST', url]\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'content-length') continue\n args.push('-H', `${k}: ${String(v)}`)\n }\n args.push('--data-binary', '@-')\n const proc = spawn('curl-impersonate-chrome', args, {\n env: { ...process.env, CURL_IMPERSONATE: 'chrome116' },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const chunks: Buffer[] = []\n proc.stdout.on('data', (c: Buffer) => chunks.push(c))\n proc.on('error', (e) => {\n curlImpersonateAvailable = false\n reject(e)\n })\n proc.on('close', (code) => {\n const raw = Buffer.concat(chunks).toString('utf8')\n const lastNewline = raw.lastIndexOf('\\n')\n const statusStr = lastNewline >= 0 ? raw.slice(lastNewline + 1).trim() : ''\n const responseBody = lastNewline >= 0 ? raw.slice(0, lastNewline) : raw\n const status = parseInt(statusStr, 10) || (code === 0 ? 200 : 500)\n curlImpersonateAvailable = true\n resolve({ status, body: responseBody })\n })\n proc.stdin.write(body)\n proc.stdin.end()\n })\n}\n\nasync function proxyTranscribe(\n body: Buffer,\n contentType: string,\n authToken: string,\n accountId?: string,\n): Promise<{ status: number; body: string }> {\n const chatgptHeaders: Record<string, string | number> = {\n 'Content-Type': contentType,\n 'Content-Length': body.length,\n Authorization: `Bearer ${authToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n }\n if (accountId) chatgptHeaders['ChatGPT-Account-Id'] = accountId\n\n const postFn = curlImpersonateAvailable !== false ? curlImpersonatePost : httpPost\n let result: { status: number; body: string }\n try {\n result = await postFn('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n } catch {\n result = await httpPost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n }\n\n if (result.status === 403 && result.body.includes('cf_chl')) {\n if (curlImpersonateAvailable !== false && postFn !== curlImpersonatePost) {\n try {\n const ciResult = await curlImpersonatePost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n if (ciResult.status !== 403) return ciResult\n } catch {}\n }\n return { status: 503, body: JSON.stringify({ error: 'Transcription blocked by Cloudflare. Install curl-impersonate-chrome.' }) }\n }\n\n return result\n}\n\nfunction parseConnectorLogoUrl(rawUrl: string): { connectorId: string; theme: 'light' | 'dark' } | null {\n const trimmed = rawUrl.trim()\n if (!trimmed.startsWith('connectors://')) return null\n const rest = trimmed.slice('connectors://'.length)\n const connectorId = (rest.split(/[/?#]/u)[0] ?? '').trim()\n if (!connectorId) return null\n const query = rest.includes('?') ? rest.slice(rest.indexOf('?') + 1).split('#')[0] ?? '' : ''\n const theme = new URLSearchParams(query).get('theme')?.toLowerCase() === 'dark' ? 'dark' : 'light'\n return { connectorId, theme }\n}\n\nasync function fetchConnectorLogo(rawUrl: string): Promise<{ contentType: string; body: Buffer }> {\n const parsed = parseConnectorLogoUrl(rawUrl)\n if (!parsed) throw new Error('Unsupported connector logo URL')\n const auth = await readCodexAuth()\n if (!auth) throw new Error('No auth token available for connector logo')\n\n const endpoint = `https://chatgpt.com/backend-api/aip/connectors/${encodeURIComponent(parsed.connectorId)}/logo?theme=${parsed.theme}`\n const response = await fetch(endpoint, {\n headers: {\n Authorization: `Bearer ${auth.accessToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n ...(auth.accountId ? { 'ChatGPT-Account-Id': auth.accountId } : {}),\n },\n signal: AbortSignal.timeout(10_000),\n })\n if (!response.ok) throw new Error(`Connector logo fetch failed (${response.status})`)\n\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n const payload = asRecord(await response.json())\n const body = asRecord(payload?.body)\n const base64 = readNonEmptyString(body?.base64)\n const nestedContentType = readNonEmptyString(body?.contentType) ?? readNonEmptyString(body?.content_type)\n if (!base64 || !nestedContentType) throw new Error('Connector logo response was missing image data')\n return { contentType: nestedContentType, body: Buffer.from(base64, 'base64') }\n }\n\n return {\n contentType: contentType || 'image/png',\n body: Buffer.from(await response.arrayBuffer()),\n }\n}\n\nconst STREAM_EVENT_BUFFER_LIMIT = 400\n\ntype StreamEventFrame = {\n method: string\n params: unknown\n atIso: string\n}\n\ntype CapturedItem = {\n id: string\n type: string\n turnId: string\n data: Record<string, unknown>\n completed: boolean\n}\n\nconst MERGEABLE_ITEM_TYPES = new Set([\n 'commandExecution',\n 'fileChange',\n])\n\nclass AppServerProcess {\n private process: ChildProcessWithoutNullStreams | null = null\n private initialized = false\n private initializePromise: Promise<void> | null = null\n private readBuffer = ''\n private nextId = 1\n private stopping = false\n private readonly pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n private readonly notificationListeners = new Set<(value: { method: string; params: unknown }) => void>()\n private readonly pendingServerRequests = new Map<number, PendingServerRequest>()\n private readonly appServerArgs = buildAppServerArgs()\n private readonly streamEventsByThreadId = new Map<string, StreamEventFrame[]>()\n private readonly lastThreadReadSnapshotByThreadId = new Map<string, unknown>()\n private readonly threadTurnPageReadCacheByThreadId = new Map<string, { result: unknown; expiresAt: number }>()\n private readonly threadTurnPageReadPromiseByThreadId = new Map<string, Promise<unknown>>()\n private readonly capturedItemsByThreadId = new Map<string, Map<string, CapturedItem>>()\n private readonly liveStateCache = new Map<string, { data: unknown; turnCount: number; sessionSize: number }>()\n private chatgptAuthRefreshPromise: Promise<ChatgptAuthTokensRefreshResponse> | null = null\n\n\n private getCodexCommand(): string {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n throw new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.')\n }\n return codexCommand\n }\n\n private buildAppServerConfig(): { args: string[]; env: Record<string, string> } {\n const args = [\n 'app-server',\n '-c', 'approval_policy=\"never\"',\n '-c', 'sandbox_mode=\"danger-full-access\"',\n ]\n let extraEnv: Record<string, string> = {}\n const serverPort = parseInt(process.env.CODEXUI_SERVER_PORT ?? '', 10) || undefined\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n try {\n const state = ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n if (state) {\n args.push(...getFreeModeConfigArgs(state, serverPort))\n extraEnv = getFreeModeEnvVars(state)\n }\n } catch {\n // No free-mode state or invalid — use defaults\n }\n return { args, env: extraEnv }\n }\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const config = this.buildAppServerConfig()\n const invocation = getSpawnInvocation(this.getCodexCommand(), config.args)\n const spawnEnv = Object.keys(config.env).length > 0\n ? { ...process.env, ...config.env }\n : undefined\n const proc = spawn(invocation.command, invocation.args, { stdio: ['pipe', 'pipe', 'pipe'], ...(spawnEnv ? { env: spawnEnv } : {}) })\n this.process = proc\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n this.readBuffer += chunk\n\n let lineEnd = this.readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = this.readBuffer.slice(0, lineEnd).trim()\n this.readBuffer = this.readBuffer.slice(lineEnd + 1)\n\n if (line.length > 0) {\n this.handleLine(line)\n }\n\n lineEnd = this.readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // Keep stderr silent in dev middleware; JSON-RPC errors are forwarded via responses.\n })\n\n proc.on('exit', () => {\n if (this.process !== proc) {\n return\n }\n\n const failure = new Error(this.stopping ? 'codex app-server stopped' : 'codex app-server exited unexpectedly')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n\n this.pending.clear()\n this.pendingServerRequests.clear()\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n })\n }\n\n private sendLine(payload: Record<string, unknown>): void {\n if (!this.process) {\n throw new Error('codex app-server is not running')\n }\n\n this.process.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n private handleLine(line: string): void {\n let message: JsonRpcResponse\n try {\n message = JSON.parse(line) as JsonRpcResponse\n } catch {\n return\n }\n\n if (typeof message.id === 'number' && this.pending.has(message.id)) {\n const pendingRequest = this.pending.get(message.id)\n this.pending.delete(message.id)\n\n if (!pendingRequest) return\n\n if (message.error) {\n pendingRequest.reject(new Error(message.error.message))\n } else {\n pendingRequest.resolve(message.result)\n }\n return\n }\n\n if (typeof message.method === 'string' && typeof message.id !== 'number') {\n this.emitNotification({\n method: message.method,\n params: message.params ?? null,\n })\n return\n }\n\n // Handle server-initiated JSON-RPC requests (approvals, dynamic tool calls, etc.).\n if (typeof message.id === 'number' && typeof message.method === 'string') {\n this.handleServerRequest(message.id, message.method, message.params ?? null)\n }\n }\n\n private emitNotification(notification: { method: string; params: unknown }): void {\n this.recordStreamEvent(notification)\n this.captureItemFromNotification(notification)\n const nThreadId = this.extractThreadIdFromParams(notification.params)\n if (nThreadId) {\n this.invalidateLiveStateCache(nThreadId)\n this.threadTurnPageReadCacheByThreadId.delete(nThreadId)\n }\n for (const listener of this.notificationListeners) {\n listener(notification)\n }\n }\n\n private extractThreadIdFromParams(params: unknown): string {\n const record = asRecord(params)\n if (!record) return ''\n const threadId =\n (typeof record.threadId === 'string' ? record.threadId : '') ||\n (typeof record.thread_id === 'string' ? record.thread_id : '') ||\n (typeof record.conversationId === 'string' ? record.conversationId : '') ||\n (typeof record.conversation_id === 'string' ? record.conversation_id : '')\n if (threadId) return threadId\n const thread = asRecord(record.thread)\n if (thread && typeof thread.id === 'string') return thread.id\n const turn = asRecord(record.turn)\n if (turn) {\n const turnThreadId =\n (typeof turn.threadId === 'string' ? turn.threadId : '') ||\n (typeof turn.thread_id === 'string' ? turn.thread_id : '')\n if (turnThreadId) return turnThreadId\n }\n return ''\n }\n\n private recordStreamEvent(notification: { method: string; params: unknown }): void {\n const threadId = this.extractThreadIdFromParams(notification.params)\n if (!threadId) return\n const frame: StreamEventFrame = {\n method: notification.method,\n params: notification.params,\n atIso: new Date().toISOString(),\n }\n let buffer = this.streamEventsByThreadId.get(threadId)\n if (!buffer) {\n buffer = []\n this.streamEventsByThreadId.set(threadId, buffer)\n }\n buffer.push(frame)\n if (buffer.length > STREAM_EVENT_BUFFER_LIMIT) {\n buffer.splice(0, buffer.length - STREAM_EVENT_BUFFER_LIMIT)\n }\n }\n\n getStreamEvents(threadId: string, limit: number): StreamEventFrame[] {\n const buffer = this.streamEventsByThreadId.get(threadId)\n if (!buffer || buffer.length === 0) return []\n return buffer.slice(-limit)\n }\n\n storeThreadReadSnapshot(threadId: string, snapshot: unknown): void {\n this.lastThreadReadSnapshotByThreadId.set(threadId, snapshot)\n this.threadTurnPageReadCacheByThreadId.delete(threadId)\n }\n\n getLastThreadReadSnapshot(threadId: string): unknown | null {\n return this.lastThreadReadSnapshotByThreadId.get(threadId) ?? null\n }\n\n async readThreadForTurnPage(threadId: string): Promise<unknown> {\n const now = Date.now()\n const cached = this.threadTurnPageReadCacheByThreadId.get(threadId)\n if (cached && cached.expiresAt > now) return cached.result\n if (cached) this.threadTurnPageReadCacheByThreadId.delete(threadId)\n\n const pending = this.threadTurnPageReadPromiseByThreadId.get(threadId)\n if (pending) return pending\n\n const promise = this.rpc('thread/read', {\n threadId,\n includeTurns: true,\n }).then((result) => {\n this.threadTurnPageReadCacheByThreadId.set(threadId, {\n result,\n expiresAt: Date.now() + THREAD_TURN_PAGE_READ_CACHE_TTL_MS,\n })\n return result\n }).finally(() => {\n this.threadTurnPageReadPromiseByThreadId.delete(threadId)\n })\n\n this.threadTurnPageReadPromiseByThreadId.set(threadId, promise)\n return promise\n }\n\n cacheLiveState(threadId: string, data: unknown, turnCount: number, sessionSize: number): void {\n this.liveStateCache.set(threadId, { data, turnCount, sessionSize })\n }\n\n getCachedLiveState(threadId: string, turnCount: number, sessionSize: number): unknown | null {\n const cached = this.liveStateCache.get(threadId)\n if (!cached) return null\n if (cached.turnCount !== turnCount || cached.sessionSize !== sessionSize) return null\n return cached.data\n }\n\n invalidateLiveStateCache(threadId: string): void {\n this.liveStateCache.delete(threadId)\n }\n\n private captureItemFromNotification(notification: { method: string; params: unknown }): void {\n if (notification.method !== 'item/started' && notification.method !== 'item/completed') return\n\n const params = asRecord(notification.params)\n if (!params) return\n const item = asRecord(params.item)\n if (!item) return\n const itemType = typeof item.type === 'string' ? item.type : ''\n if (!MERGEABLE_ITEM_TYPES.has(itemType)) return\n\n const itemId = typeof item.id === 'string' ? item.id : ''\n if (!itemId) return\n\n const threadId = this.extractThreadIdFromParams(params)\n if (!threadId) return\n\n const turnId =\n (typeof params.turnId === 'string' ? params.turnId : '') ||\n (typeof params.turn_id === 'string' ? params.turn_id : '')\n if (!turnId) return\n\n let threadItems = this.capturedItemsByThreadId.get(threadId)\n if (!threadItems) {\n threadItems = new Map()\n this.capturedItemsByThreadId.set(threadId, threadItems)\n }\n\n const isCompleted = notification.method === 'item/completed'\n const existing = threadItems.get(itemId)\n\n if (existing && existing.completed && !isCompleted) return\n\n threadItems.set(itemId, {\n id: itemId,\n type: itemType,\n turnId,\n data: item as Record<string, unknown>,\n completed: isCompleted,\n })\n }\n\n mergeItemsIntoTurns(threadId: string, turns: unknown[]): unknown[] {\n const capturedMap = this.capturedItemsByThreadId.get(threadId)\n if (!capturedMap || capturedMap.size === 0) return turns\n\n const itemsByTurnId = new Map<string, CapturedItem[]>()\n for (const captured of capturedMap.values()) {\n let group = itemsByTurnId.get(captured.turnId)\n if (!group) {\n group = []\n itemsByTurnId.set(captured.turnId, group)\n }\n group.push(captured)\n }\n\n return turns.map((turn) => {\n const turnRecord = asRecord(turn)\n if (!turnRecord) return turn\n const turnId = typeof turnRecord.id === 'string' ? turnRecord.id : ''\n if (!turnId) return turn\n\n const captured = itemsByTurnId.get(turnId)\n if (!captured || captured.length === 0) return turn\n\n const existingItems = Array.isArray(turnRecord.items) ? (turnRecord.items as Record<string, unknown>[]) : []\n const existingIds = new Set(existingItems.map((it) => (typeof it.id === 'string' ? it.id : '')).filter(Boolean))\n\n const newItems = captured\n .filter((c) => !existingIds.has(c.id))\n .map((c) => c.data)\n\n if (newItems.length === 0) return turn\n\n return {\n ...turnRecord,\n items: [...existingItems, ...newItems],\n }\n })\n }\n\n private sendServerRequestReply(requestId: number, reply: ServerRequestReply): void {\n if (reply.error) {\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n error: reply.error,\n })\n return\n }\n\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n result: reply.result ?? {},\n })\n }\n\n private resolvePendingServerRequest(requestId: number, reply: ServerRequestReply): void {\n const pendingRequest = this.pendingServerRequests.get(requestId)\n if (!pendingRequest) {\n throw new Error(`No pending server request found for id ${String(requestId)}`)\n }\n this.pendingServerRequests.delete(requestId)\n\n this.sendServerRequestReply(requestId, reply)\n const requestParams = asRecord(pendingRequest.params)\n const threadId =\n typeof requestParams?.threadId === 'string' && requestParams.threadId.length > 0\n ? requestParams.threadId\n : ''\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: pendingRequest.method,\n threadId,\n mode: 'manual',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n }\n\n private async refreshChatgptAuthTokens(params: ChatgptAuthTokensRefreshParams): Promise<ChatgptAuthTokensRefreshResponse> {\n if (!this.chatgptAuthRefreshPromise) {\n this.chatgptAuthRefreshPromise = refreshChatgptAuthTokensForExternalAuth(params).finally(() => {\n this.chatgptAuthRefreshPromise = null\n })\n }\n return await this.chatgptAuthRefreshPromise\n }\n\n private async handleChatgptAuthTokensRefreshRequest(requestId: number, params: unknown): Promise<void> {\n const requestParams = asRecord(params)\n const previousAccountId = readNonEmptyString(requestParams?.previousAccountId ?? requestParams?.previous_account_id)\n try {\n const result = await this.refreshChatgptAuthTokens({\n reason: readNonEmptyString(requestParams?.reason) || undefined,\n previousAccountId: previousAccountId || undefined,\n })\n this.sendServerRequestReply(requestId, { result })\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: 'account/chatgptAuthTokens/refresh',\n mode: 'automatic',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n } catch (error) {\n this.sendServerRequestReply(requestId, {\n error: {\n code: -32001,\n message: getErrorMessage(error, 'Failed to refresh ChatGPT auth tokens'),\n },\n })\n }\n }\n\n private handleServerRequest(requestId: number, method: string, params: unknown): void {\n if (method === 'account/chatgptAuthTokens/refresh') {\n void this.handleChatgptAuthTokensRefreshRequest(requestId, params)\n return\n }\n\n const pendingRequest: PendingServerRequest = {\n id: requestId,\n method,\n params,\n receivedAtIso: new Date().toISOString(),\n }\n this.pendingServerRequests.set(requestId, pendingRequest)\n\n this.emitNotification({\n method: 'server/request',\n params: pendingRequest,\n })\n }\n\n private async call(method: string, params: unknown): Promise<unknown> {\n this.start()\n const id = this.nextId++\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject })\n\n this.sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n } satisfies JsonRpcCall)\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return\n if (this.initializePromise) {\n await this.initializePromise\n return\n }\n\n this.initializePromise = this.call('initialize', {\n clientInfo: {\n name: 'codex-web-local',\n version: '0.1.0',\n },\n capabilities: {\n experimentalApi: true,\n },\n }).then(() => {\n this.sendLine({\n jsonrpc: '2.0',\n method: 'initialized',\n })\n this.initialized = true\n }).finally(() => {\n this.initializePromise = null\n })\n\n await this.initializePromise\n }\n\n async rpc(method: string, params: unknown): Promise<unknown> {\n await this.ensureInitialized()\n return this.call(method, params)\n }\n\n onNotification(listener: (value: { method: string; params: unknown }) => void): () => void {\n this.notificationListeners.add(listener)\n return () => {\n this.notificationListeners.delete(listener)\n }\n }\n\n async respondToServerRequest(payload: unknown): Promise<void> {\n await this.ensureInitialized()\n\n const body = asRecord(payload)\n if (!body) {\n throw new Error('Invalid response payload: expected object')\n }\n\n const id = body.id\n if (typeof id !== 'number' || !Number.isInteger(id)) {\n throw new Error('Invalid response payload: \"id\" must be an integer')\n }\n\n const rawError = asRecord(body.error)\n if (rawError) {\n const message = typeof rawError.message === 'string' && rawError.message.trim().length > 0\n ? rawError.message.trim()\n : 'Server request rejected by client'\n const code = typeof rawError.code === 'number' && Number.isFinite(rawError.code)\n ? Math.trunc(rawError.code)\n : -32000\n this.resolvePendingServerRequest(id, { error: { code, message } })\n return\n }\n\n if (!('result' in body)) {\n throw new Error('Invalid response payload: expected \"result\" or \"error\"')\n }\n\n this.resolvePendingServerRequest(id, { result: body.result })\n }\n\n listPendingServerRequests(): PendingServerRequest[] {\n return Array.from(this.pendingServerRequests.values())\n }\n\n dispose(): void {\n if (!this.process) return\n\n const proc = this.process\n this.stopping = true\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n\n const failure = new Error('codex app-server stopped')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n this.pending.clear()\n this.pendingServerRequests.clear()\n\n try {\n proc.stdin.end()\n } catch {\n // ignore close errors on shutdown\n }\n\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore kill errors on shutdown\n }\n\n const forceKillTimer = setTimeout(() => {\n if (!proc.killed) {\n try {\n proc.kill('SIGKILL')\n } catch {\n // ignore kill errors on shutdown\n }\n }\n }, 1500)\n forceKillTimer.unref()\n }\n}\n\nexport class BackendQueueProcessor {\n private readonly processingThreadIds = new Set<string>()\n private readonly queueDrainTimersByThreadId = new Map<string, ReturnType<typeof setTimeout>>()\n private readonly queueDrainDueAtByThreadId = new Map<string, number>()\n private readonly unsubscribe: () => void\n\n constructor(private readonly appServer: AppServerProcess) {\n this.unsubscribe = appServer.onNotification((notification) => {\n if (!isTurnCompletedNotification(notification)) return\n const threadId = extractThreadIdFromNotificationParams(notification.params)\n if (!threadId) return\n void this.processThreadQueue(threadId)\n })\n void this.scheduleAllQueuedThreads(1000)\n }\n\n dispose(): void {\n this.unsubscribe()\n for (const timer of this.queueDrainTimersByThreadId.values()) {\n clearTimeout(timer)\n }\n this.queueDrainTimersByThreadId.clear()\n this.queueDrainDueAtByThreadId.clear()\n this.processingThreadIds.clear()\n }\n\n async scheduleAllQueuedThreads(delayMs = 0): Promise<void> {\n try {\n const state = await readThreadQueueState()\n for (const threadId of Object.keys(state)) {\n this.scheduleThreadQueueDrain(threadId, delayMs)\n }\n } catch {\n // Queue recovery is best-effort; normal turn-completed events can still drain later.\n }\n }\n\n scheduleThreadQueueDrain(threadId: string, delayMs = 5000): void {\n if (!threadId) return\n const normalizedDelayMs = Math.max(0, delayMs)\n const nextDueAt = Date.now() + normalizedDelayMs\n const existingDueAt = this.queueDrainDueAtByThreadId.get(threadId)\n const existingTimer = this.queueDrainTimersByThreadId.get(threadId)\n if (existingTimer) {\n if (existingDueAt !== undefined && existingDueAt <= nextDueAt) return\n clearTimeout(existingTimer)\n this.queueDrainTimersByThreadId.delete(threadId)\n this.queueDrainDueAtByThreadId.delete(threadId)\n }\n const timer = setTimeout(() => {\n this.queueDrainTimersByThreadId.delete(threadId)\n this.queueDrainDueAtByThreadId.delete(threadId)\n void this.processThreadQueue(threadId)\n }, normalizedDelayMs)\n timer.unref?.()\n this.queueDrainTimersByThreadId.set(threadId, timer)\n this.queueDrainDueAtByThreadId.set(threadId, nextDueAt)\n }\n\n async processThreadQueue(threadId: string): Promise<void> {\n if (this.processingThreadIds.has(threadId)) return\n this.processingThreadIds.add(threadId)\n try {\n const canStart = await this.canStartQueuedTurn(threadId)\n if (!canStart) {\n if (await this.hasQueuedTurns(threadId)) {\n this.scheduleThreadQueueDrain(threadId)\n }\n return\n }\n const next = await this.popNextQueuedTurn(threadId)\n if (!next) return\n try {\n await this.startQueuedTurn(next)\n if (await this.hasQueuedTurns(threadId)) {\n this.scheduleThreadQueueDrain(threadId)\n }\n } catch {\n await this.restoreQueuedTurn(next)\n this.scheduleThreadQueueDrain(threadId)\n }\n } catch {\n // Queue processing is best-effort. Keep the bridge alive if app-server is unavailable.\n this.scheduleThreadQueueDrain(threadId)\n } finally {\n this.processingThreadIds.delete(threadId)\n }\n }\n\n private async hasQueuedTurns(threadId: string): Promise<boolean> {\n const state = await readThreadQueueState()\n const queue = state[threadId]\n return Array.isArray(queue) && queue.length > 0\n }\n\n private async canStartQueuedTurn(threadId: string): Promise<boolean> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n if (!thread) return false\n\n const status = asRecord(thread.status)\n const statusType = readNonEmptyString(status?.type)\n if (statusType === 'inProgress' || statusType === 'running' || statusType === 'active') return false\n\n const turns = Array.isArray(thread.turns) ? thread.turns : []\n return !turns.some((turn) => readNonEmptyString(asRecord(turn)?.status) === 'inProgress')\n }\n\n private async popNextQueuedTurn(threadId: string): Promise<BackendQueuedTurn | null> {\n return withThreadQueueStateUpdate((state) => {\n const queue = state[threadId]\n if (!queue || queue.length === 0) {\n return { nextState: state, result: null }\n }\n\n const [message, ...rest] = queue\n const nextState = { ...state }\n if (rest.length > 0) {\n nextState[threadId] = rest\n } else {\n delete nextState[threadId]\n }\n return { nextState, result: { threadId, message } }\n })\n }\n\n private async restoreQueuedTurn(turn: BackendQueuedTurn): Promise<void> {\n await withThreadQueueStateUpdate((state) => {\n const queue = state[turn.threadId] ?? []\n return {\n nextState: {\n ...state,\n [turn.threadId]: [turn.message, ...queue],\n },\n result: undefined,\n }\n })\n }\n\n private async resolveCollaborationModeSettings(mode: CollaborationModeKind): Promise<ResolvedCollaborationModeSettings> {\n let currentConfig: Record<string, unknown> | null = null\n try {\n const configPayload = asRecord(await this.appServer.rpc('config/read', {}))\n currentConfig = asRecord(configPayload?.config)\n } catch {\n currentConfig = null\n }\n\n const configuredModel = readNonEmptyString(currentConfig?.model)\n if (configuredModel) {\n return {\n model: configuredModel,\n reasoningEffort: normalizeCollaborationModeReasoningEffort(normalizeReasoningEffort(currentConfig?.model_reasoning_effort)),\n }\n }\n\n try {\n const modelsPayload = asRecord(await this.appServer.rpc('model/list', {}))\n const models = Array.isArray(modelsPayload?.data) ? modelsPayload.data : []\n for (const row of models) {\n const record = asRecord(row)\n const candidate = readNonEmptyString(record?.id) || readNonEmptyString(record?.model)\n if (candidate) {\n return {\n model: candidate,\n reasoningEffort: normalizeCollaborationModeReasoningEffort(normalizeReasoningEffort(currentConfig?.model_reasoning_effort)),\n }\n }\n }\n } catch {\n // Fall through to no collaboration-mode payload.\n }\n\n throw new Error(`${mode === 'plan' ? 'Plan' : 'Default'} mode requires an available model.`)\n }\n\n private async buildQueuedTurnParams(turn: BackendQueuedTurn): Promise<Record<string, unknown>> {\n const localImageAttachments: StoredQueuedMessage['fileAttachments'] = []\n for (const imageUrl of turn.message.imageUrls) {\n const localImagePath = extractLocalImagePathFromUrl(imageUrl.trim())\n if (!localImagePath) continue\n localImageAttachments.push({\n label: fileNameFromPath(localImagePath),\n path: localImagePath,\n fsPath: localImagePath,\n })\n }\n\n const allFileAttachments = [...turn.message.fileAttachments, ...localImageAttachments]\n const dedupedFileAttachments = allFileAttachments.filter((entry, index) =>\n allFileAttachments.findIndex((candidate) => candidate.fsPath === entry.fsPath) === index)\n\n const input: Array<Record<string, unknown>> = [{\n type: 'text',\n text: buildTextWithAttachments(turn.message.text, dedupedFileAttachments),\n }]\n\n for (const imageUrl of turn.message.imageUrls) {\n const normalizedUrl = imageUrl.trim()\n if (!normalizedUrl) continue\n const localImagePath = extractLocalImagePathFromUrl(normalizedUrl)\n if (localImagePath) {\n input.push({ type: 'localImage', path: localImagePath })\n } else {\n input.push({ type: 'image', url: normalizedUrl, image_url: normalizedUrl })\n }\n }\n\n for (const skill of turn.message.skills) {\n input.push({ type: 'skill', name: skill.name, path: skill.path })\n }\n\n const params: Record<string, unknown> = {\n threadId: turn.threadId,\n input,\n }\n if (dedupedFileAttachments.length > 0) {\n params.attachments = dedupedFileAttachments.map((f) => ({ label: f.label, path: f.path, fsPath: f.fsPath }))\n }\n\n try {\n const settings = await this.resolveCollaborationModeSettings(turn.message.collaborationMode)\n params.collaborationMode = {\n mode: turn.message.collaborationMode,\n settings: {\n model: settings.model,\n reasoning_effort: settings.reasoningEffort,\n developer_instructions: null,\n },\n }\n } catch {\n // Older app-server versions still accept a plain turn/start without collaborationMode.\n }\n\n return params\n }\n\n private async startQueuedTurn(turn: BackendQueuedTurn): Promise<void> {\n await this.appServer.rpc('thread/resume', { threadId: turn.threadId })\n await this.appServer.rpc('turn/start', await this.buildQueuedTurnParams(turn))\n }\n}\n\nclass MethodCatalog {\n private methodCache: string[] | null = null\n private notificationCache: string[] | null = null\n\n private async runGenerateSchemaCommand(outDir: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n reject(new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.'))\n return\n }\n\n const invocation = getSpawnInvocation(codexCommand, ['app-server', 'generate-json-schema', '--out', outDir])\n const process = spawn(invocation.command, invocation.args, {\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n\n let stderr = ''\n\n process.stderr.setEncoding('utf8')\n process.stderr.on('data', (chunk: string) => {\n stderr += chunk\n })\n\n process.on('error', reject)\n process.on('exit', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(stderr.trim() || `generate-json-schema exited with code ${String(code)}`))\n })\n })\n }\n\n private extractMethodsFromClientRequest(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n private extractMethodsFromServerNotification(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n async listMethods(): Promise<string[]> {\n if (this.methodCache) {\n return this.methodCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const clientRequestPath = join(outDir, 'ClientRequest.json')\n const raw = await readFile(clientRequestPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromClientRequest(parsed)\n\n this.methodCache = methods\n return methods\n }\n\n async listNotificationMethods(): Promise<string[]> {\n if (this.notificationCache) {\n return this.notificationCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const serverNotificationPath = join(outDir, 'ServerNotification.json')\n const raw = await readFile(serverNotificationPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromServerNotification(parsed)\n\n this.notificationCache = methods\n return methods\n }\n}\n\ntype CodexBridgeMiddleware = ((req: IncomingMessage, res: ServerResponse, next: () => void) => Promise<void>) & {\n dispose: () => void\n subscribeNotifications: (listener: (value: { method: string; params: unknown; atIso: string }) => void) => () => void\n}\n\ntype SharedBridgeState = {\n version: string\n appServer: AppServerProcess\n terminalManager: ThreadTerminalManager\n methodCatalog: MethodCatalog\n telegramBridge: TelegramThreadBridge\n backendQueueProcessor: BackendQueueProcessor\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\nconst SHARED_BRIDGE_VERSION = 'experimental-api-v2'\n\nfunction getSharedBridgeState(): SharedBridgeState {\n const globalScope = globalThis as typeof globalThis & {\n [SHARED_BRIDGE_KEY]?: SharedBridgeState\n }\n\n const existing = globalScope[SHARED_BRIDGE_KEY]\n if (existing) {\n if (existing.version === SHARED_BRIDGE_VERSION && existing.terminalManager) {\n return existing\n }\n existing.appServer.dispose()\n existing.backendQueueProcessor?.dispose()\n existing.terminalManager?.dispose()\n }\n\n const appServer = new AppServerProcess()\n const terminalManager = new ThreadTerminalManager()\n const backendQueueProcessor = new BackendQueueProcessor(appServer)\n const created: SharedBridgeState = {\n version: SHARED_BRIDGE_VERSION,\n appServer,\n terminalManager,\n methodCatalog: new MethodCatalog(),\n backendQueueProcessor,\n telegramBridge: new TelegramThreadBridge(appServer, {\n onChatSeen: (chatId) => {\n void rememberTelegramChatId(chatId).catch(() => {})\n },\n }),\n }\n globalScope[SHARED_BRIDGE_KEY] = created\n return created\n}\n\nasync function loadAllThreadsForSearch(appServer: AppServerProcess): Promise<ThreadSearchDocument[]> {\n const threads: Array<{ id: string; title: string; preview: string }> = []\n let cursor: string | null = null\n\n do {\n const response = asRecord(await appServer.rpc('thread/list', {\n archived: false,\n limit: 100,\n sortKey: 'updated_at',\n modelProviders: [],\n cursor,\n }))\n const data = Array.isArray(response?.data) ? response.data : []\n for (const row of data) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id : ''\n if (!id) continue\n const title = typeof record?.name === 'string' && record.name.trim().length > 0\n ? record.name.trim()\n : (typeof record?.preview === 'string' && record.preview.trim().length > 0 ? record.preview.trim() : 'Untitled thread')\n const preview = typeof record?.preview === 'string' ? record.preview : ''\n threads.push({ id, title, preview })\n }\n cursor = typeof response?.nextCursor === 'string' && response.nextCursor.length > 0 ? response.nextCursor : null\n } while (cursor)\n\n const docs: ThreadSearchDocument[] = threads.map((thread) => {\n const searchableText = [thread.title, thread.preview].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText: '',\n searchableText,\n } satisfies ThreadSearchDocument\n })\n\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n const fullTextThreads = threads.slice(0, THREAD_SEARCH_FULL_TEXT_THREAD_LIMIT)\n const concurrency = 4\n for (let offset = 0; offset < fullTextThreads.length; offset += concurrency) {\n const batch = fullTextThreads.slice(offset, offset + concurrency)\n const loaded = await Promise.all(batch.map(async (thread) => {\n try {\n const readResponse = await appServer.rpc('thread/read', {\n threadId: thread.id,\n includeTurns: true,\n })\n const messageText = extractThreadMessageText(readResponse)\n const searchableText = [thread.title, thread.preview, messageText].filter(Boolean).join('\\n')\n return [thread.id, {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument] as const\n } catch {\n return null\n }\n }))\n for (const row of loaded) {\n if (!row) continue\n docsById.set(row[0], row[1])\n }\n }\n\n return Array.from(docsById.values())\n}\n\nasync function buildThreadSearchIndex(appServer: AppServerProcess): Promise<ThreadSearchIndex> {\n const docs = await loadAllThreadsForSearch(appServer)\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n return { docsById }\n}\n\nexport function createCodexBridgeMiddleware(): CodexBridgeMiddleware {\n const { appServer, terminalManager, methodCatalog, telegramBridge, backendQueueProcessor } = getSharedBridgeState()\n let threadSearchIndex: ThreadSearchIndex | null = null\n let threadSearchIndexPromise: Promise<ThreadSearchIndex> | null = null\n\n async function getThreadSearchIndex(): Promise<ThreadSearchIndex> {\n if (threadSearchIndex) return threadSearchIndex\n if (!threadSearchIndexPromise) {\n threadSearchIndexPromise = buildThreadSearchIndex(appServer)\n .then((index) => {\n threadSearchIndex = index\n return index\n })\n .finally(() => {\n threadSearchIndexPromise = null\n })\n }\n return threadSearchIndexPromise\n }\n void initializeSkillsSyncOnStartup(appServer)\n void readTelegramBridgeConfig()\n .then((config) => {\n if (!config.botToken) return\n telegramBridge.configureToken(config.botToken)\n telegramBridge.configureAllowedUserIds(config.allowedUserIds)\n telegramBridge.start()\n })\n .catch(() => {})\n\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const requestStartNs = process.hrtime.bigint()\n const rawUrl = req.url ?? ''\n const parsedRequestUrl = rawUrl ? new URL(rawUrl, 'http://localhost') : null\n const requestPath = parsedRequestUrl?.pathname ?? ''\n const requestMethod = req.method ?? 'UNKNOWN'\n const rawContentLength = Array.isArray(req.headers['content-length'])\n ? req.headers['content-length'][0]\n : req.headers['content-length']\n const parsedContentLength = rawContentLength ? Number.parseInt(rawContentLength, 10) : NaN\n let requestBodyBytes: number | null = Number.isFinite(parsedContentLength) && parsedContentLength >= 0\n ? parsedContentLength\n : null\n let responseBodyBytes = 0\n let rpcMethod: string | null = null\n const originalWrite = res.write.bind(res)\n const originalEnd = res.end.bind(res)\n res.write = ((chunk: unknown, encoding?: unknown, cb?: unknown) => {\n const resolvedEncoding = typeof encoding === 'string' ? encoding as BufferEncoding : undefined\n responseBodyBytes += getChunkByteLength(chunk, resolvedEncoding)\n return originalWrite(chunk as never, encoding as never, cb as never)\n }) as typeof res.write\n res.end = ((chunk?: unknown, encoding?: unknown, cb?: unknown) => {\n const resolvedEncoding = typeof encoding === 'string' ? encoding as BufferEncoding : undefined\n responseBodyBytes += getChunkByteLength(chunk, resolvedEncoding)\n return originalEnd(chunk as never, encoding as never, cb as never)\n }) as typeof res.end\n let didLog = false\n const logApiRequestDuration = () => {\n if (!API_PERF_LOGGING_ENABLED || didLog || !requestPath.startsWith('/codex-api/')) return\n const durationMs = Number((process.hrtime.bigint() - requestStartNs) / 1_000_000n)\n const requestBytes = requestBodyBytes ?? 0\n const bodyMbValue = (requestBytes + responseBodyBytes) / MB_DIVISOR\n const shouldLog = durationMs > API_PERF_MS_THRESHOLD || bodyMbValue > API_PERF_BODY_MB_THRESHOLD\n if (!shouldLog) return\n didLog = true\n const rpcPart = rpcMethod ? `, rpcMethod=${rpcMethod}` : ''\n console.info(`[codex-api-perf] ${requestMethod} ${requestPath} -> ${res.statusCode} (${durationMs}ms, bodyMB=${bodyMbValue.toFixed(1)}${rpcPart})`)\n }\n res.once('finish', logApiRequestDuration)\n res.once('close', logApiRequestDuration)\n\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\n\n if (url.pathname === '/codex-api/zen-proxy/v1/responses' && req.method === 'POST') {\n if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {\n setJson(res, 403, { error: 'Zen proxy is only available from localhost' })\n return\n }\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'chat'\n try {\n const state = JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n bearerToken = state.apiKey ?? ''\n wireApi = state.wireApi === 'responses' ? 'responses' : 'chat'\n } catch { /* use empty */ }\n handleZenProxyRequest(req, res, bearerToken, wireApi)\n return\n }\n\n if (url.pathname === '/codex-api/openrouter-proxy/v1/responses' && req.method === 'POST') {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'responses'\n try {\n const state = ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n bearerToken = state?.apiKey ?? ''\n wireApi = state?.wireApi === 'chat' ? 'chat' : 'responses'\n } catch { /* use empty */ }\n handleOpenRouterProxyRequest(req, res, bearerToken, wireApi)\n return\n }\n\n if (url.pathname === '/codex-api/custom-proxy/v1/responses' && req.method === 'POST') {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'responses'\n let baseUrl = ''\n try {\n const state = JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n bearerToken = state.apiKey ?? ''\n wireApi = state.wireApi === 'chat' ? 'chat' : 'responses'\n baseUrl = state.customBaseUrl ?? ''\n } catch { /* use empty */ }\n handleCustomEndpointProxyRequest(req, res, { baseUrl, bearerToken, wireApi })\n return\n }\n\n if (url.pathname.startsWith('/codex-api/free-mode')) {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n\n function readFreeModeState(): FreeModeState {\n return ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n ?? { enabled: false, apiKey: null, model: FREE_MODE_DEFAULT_MODEL }\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const enable = Boolean(body?.enable)\n\n if (enable) {\n const apiKey = getRandomFreeKey()\n if (!apiKey) {\n setJson(res, 500, { error: 'No free keys available' })\n return\n }\n\n const prev = readFreeModeState()\n const prevKeys = prev.providerKeys ?? {}\n if (prev.provider && prev.apiKey) {\n prevKeys[prev.provider] = prev.apiKey\n }\n const state: FreeModeState = {\n enabled: true,\n apiKey,\n model: FREE_MODE_DEFAULT_MODEL,\n provider: 'openrouter',\n wireApi: prev.wireApi === 'chat' ? 'chat' : 'responses',\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n const freeModels = await getFreeModels()\n setJson(res, 200, {\n ok: true,\n enabled: true,\n model: FREE_MODE_DEFAULT_MODEL,\n keyCount: getFreeKeyCount(),\n models: freeModels,\n })\n } else {\n const prev = readFreeModeState()\n const prevKeys = prev.providerKeys ?? {}\n if (prev.provider && prev.apiKey) {\n prevKeys[prev.provider] = prev.apiKey\n }\n const state: FreeModeState = {\n enabled: false,\n apiKey: null,\n model: FREE_MODE_DEFAULT_MODEL,\n wireApi: prev.wireApi === 'chat' ? 'chat' : 'responses',\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, enabled: false })\n }\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to toggle free mode') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/free-mode/status') {\n try {\n const state = readFreeModeState()\n const maskedKey = state.apiKey && state.customKey\n ? state.apiKey.substring(0, 12) + '...' + state.apiKey.substring(state.apiKey.length - 4)\n : null\n refreshFreeModelsInBackground()\n setJson(res, 200, {\n enabled: state.enabled,\n keyCount: getFreeKeyCount(),\n models: getCachedFreeModels(),\n currentModel: state.enabled ? state.model : null,\n customKey: Boolean(state.customKey),\n maskedKey,\n provider: state.provider ?? 'openrouter',\n customBaseUrl: state.customBaseUrl ?? null,\n wireApi: state.wireApi ?? null,\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read free mode status') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/rotate-key') {\n try {\n const apiKey = getRandomFreeKey()\n if (!apiKey) {\n setJson(res, 500, { error: 'No free keys available' })\n return\n }\n const current = readFreeModeState()\n const state: FreeModeState = { ...current, apiKey, customKey: false }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to rotate key') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/custom-key') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const key = typeof body?.key === 'string' ? body.key.trim() : ''\n const current = readFreeModeState()\n\n if (key.length > 0) {\n const state: FreeModeState = {\n ...current,\n enabled: true,\n apiKey: key,\n customKey: true,\n provider: 'openrouter',\n wireApi: current.wireApi === 'chat' ? 'chat' : 'responses',\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, customKey: true })\n } else {\n const communityKey = getRandomFreeKey()\n const state: FreeModeState = {\n ...current,\n apiKey: communityKey,\n customKey: false,\n provider: 'openrouter',\n wireApi: current.wireApi === 'chat' ? 'chat' : 'responses',\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, customKey: false })\n }\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to set custom key') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/custom-provider') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const baseUrl = typeof body?.baseUrl === 'string' ? body.baseUrl.trim() : ''\n const apiKey = typeof body?.apiKey === 'string' ? body.apiKey.trim() : ''\n const wireApi = body?.wireApi === 'chat' ? 'chat' as const : 'responses' as const\n const providerType = body?.provider === 'opencode-zen'\n ? 'opencode-zen' as const\n : body?.provider === 'openrouter'\n ? 'openrouter' as const\n : 'custom' as const\n if (providerType === 'custom' && !baseUrl) {\n setJson(res, 400, { error: 'baseUrl is required' })\n return\n }\n const current = readFreeModeState()\n const prevKeys = current.providerKeys ?? {}\n if (current.provider && current.apiKey) {\n prevKeys[current.provider] = current.apiKey\n }\n const resolvedKey = apiKey || prevKeys[providerType] || ''\n if (resolvedKey) {\n prevKeys[providerType] = resolvedKey\n }\n const resolvedModel = providerType === 'openrouter'\n ? (current.model || FREE_MODE_DEFAULT_MODEL)\n : providerType === 'custom'\n ? await fetchCustomEndpointDefaultModel(baseUrl, resolvedKey)\n : ''\n const state: FreeModeState = {\n enabled: true,\n apiKey: resolvedKey,\n model: resolvedModel,\n customKey: providerType === 'openrouter' ? current.customKey : true,\n provider: providerType,\n customBaseUrl: providerType === 'custom' ? baseUrl : undefined,\n wireApi,\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to set custom provider') })\n }\n return\n }\n\n next()\n return\n }\n\n if (await handleAccountRoutes(req, res, url, { appServer })) {\n return\n }\n\n if (await handleSkillsRoutes(req, res, url, { appServer, readJsonBody })) {\n return\n }\n\n if (await handleReviewRoutes(req, res, url, { readJsonBody })) {\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal/status') {\n setJson(res, 200, terminalManager.getAvailability())\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal/quick-commands') {\n const cwd = url.searchParams.get('cwd')?.trim() ?? ''\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n try {\n setJson(res, 200, { commands: await listTerminalQuickCommands(cwd) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load terminal quick commands') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/attach') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const threadId = readNonEmptyString(body?.threadId)\n const cwd = readNonEmptyString(body?.cwd)\n if (!threadId || !cwd) {\n setJson(res, 400, { error: 'Missing threadId or cwd' })\n return\n }\n const session = terminalManager.attach({\n threadId,\n cwd,\n sessionId: readNonEmptyString(body?.sessionId) || undefined,\n cols: typeof body?.cols === 'number' ? body.cols : undefined,\n rows: typeof body?.rows === 'number' ? body.rows : undefined,\n newSession: body?.newSession === true,\n })\n setJson(res, 200, { session })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/input') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n const data = typeof body?.data === 'string' ? body.data : ''\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.write(sessionId, data)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/resize') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.resize(sessionId, body?.cols, body?.rows)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/close') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.close(sessionId)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal-snapshot') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n setJson(res, 200, { session: terminalManager.getSnapshotForThread(threadId) })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/upload-file') {\n handleFileUpload(req, res)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/rpc') {\n const payload = await readJsonBody(req)\n const body = asRecord(payload) as RpcProxyRequest | null\n if (payload !== null && payload !== undefined) {\n requestBodyBytes = Buffer.byteLength(JSON.stringify(payload), 'utf8')\n }\n rpcMethod = body?.method && typeof body.method === 'string' ? body.method : null\n\n if (!body || typeof body.method !== 'string' || body.method.length === 0) {\n setJson(res, 400, { error: 'Invalid body: expected { method, params? }' })\n return\n }\n\n const rpcResult = await callRpcWithArchiveRecovery(appServer, body.method, body.params ?? null)\n const trimmedResult = trimThreadTurnsInRpcResult(body.method, rpcResult)\n const sanitizedResult = await sanitizeThreadTurnsInlinePayloads(body.method, trimmedResult)\n const result = THREAD_METHODS_WITH_TURNS.has(body.method)\n ? await mergeSessionSkillInputsIntoThreadResult(sanitizedResult)\n : sanitizedResult\n\n if (THREAD_METHODS_WITH_TURNS.has(body.method)) {\n const rpcRecord = asRecord(result)\n const rpcThread = asRecord(rpcRecord?.thread)\n const rpcThreadId = typeof rpcThread?.id === 'string' ? rpcThread.id : ''\n if (rpcThreadId) {\n appServer.storeThreadReadSnapshot(rpcThreadId, result)\n }\n }\n\n setJson(res, 200, { result })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-turn-page') {\n try {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const beforeTurnId = url.searchParams.get('beforeTurnId')?.trim() ?? ''\n const limitRaw = url.searchParams.get('limit')?.trim() ?? String(THREAD_RESPONSE_TURN_LIMIT)\n const limit = Math.max(1, Math.min(50, Number.parseInt(limitRaw, 10) || THREAD_RESPONSE_TURN_LIMIT))\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n const threadReadResult = await appServer.readThreadForTurnPage(threadId)\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n if (!record || !thread) {\n setJson(res, 502, { error: 'thread/read returned an invalid thread response' })\n return\n }\n\n const turns = Array.isArray(thread.turns) ? thread.turns : []\n const beforeIndex = beforeTurnId\n ? turns.findIndex((turn) => asRecord(turn)?.id === beforeTurnId)\n : turns.length\n if (beforeTurnId && beforeIndex < 0) {\n setJson(res, 200, {\n result: {\n ...record,\n thread: {\n ...thread,\n turns: [],\n },\n },\n startTurnIndex: 0,\n hasMoreOlder: false,\n })\n return\n }\n\n const endIndex = beforeIndex\n const startIndex = Math.max(0, endIndex - limit)\n const pageTurns = turns.slice(startIndex, endIndex)\n const pagedResult = {\n ...record,\n thread: {\n ...thread,\n turns: pageTurns,\n },\n }\n const sanitized = await sanitizeThreadTurnsInlinePayloads('thread/read', pagedResult)\n const result = await mergeSessionSkillInputsIntoThreadResult(sanitized)\n\n setJson(res, 200, {\n result,\n startTurnIndex: startIndex,\n hasMoreOlder: startIndex > 0,\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load earlier thread messages') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-file-change-fallback') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n const threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: true,\n })\n const threadReadRecord = asRecord(threadReadResult)\n const threadRecord = asRecord(threadReadRecord?.thread)\n const sessionPath = readNonEmptyString(threadRecord?.path)\n if (!sessionPath || !isAbsolute(sessionPath)) {\n setJson(res, 200, { data: [] })\n return\n }\n\n try {\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n setJson(res, 200, { data: buildSessionFileChangeFallback(threadReadResult, sessionLogRaw) })\n } catch {\n setJson(res, 200, { data: [] })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-stream-events') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const limitRaw = url.searchParams.get('limit')?.trim() ?? '80'\n const limit = Math.max(1, Math.min(400, Number.parseInt(limitRaw, 10) || 80))\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const events = appServer.getStreamEvents(threadId, limit)\n setJson(res, 200, { events })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-live-state') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n try {\n const threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: true,\n })\n const sanitized = await sanitizeThreadTurnsInlinePayloads('thread/read', threadReadResult)\n appServer.storeThreadReadSnapshot(threadId, sanitized)\n\n const record = asRecord(sanitized)\n const thread = asRecord(record?.thread)\n const rawTurns = Array.isArray(thread?.turns) ? thread.turns : []\n\n const sessionPath = readNonEmptyString(thread?.path)\n let sessionSize = 0\n if (sessionPath && isAbsolute(sessionPath)) {\n try {\n const s = await stat(sessionPath)\n sessionSize = s.size\n } catch { /* missing */ }\n }\n\n const cached = appServer.getCachedLiveState(threadId, rawTurns.length, sessionSize)\n if (cached) {\n setJson(res, 200, cached)\n return\n }\n\n let turns = appServer.mergeItemsIntoTurns(threadId, rawTurns)\n\n if (sessionPath && isAbsolute(sessionPath) && sessionSize > 0) {\n try {\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n turns = mergeSessionCommandsIntoTurns(turns, sessionLogRaw)\n } catch {\n // Session log not available — continue without command recovery\n }\n }\n\n const lastTurn = turns.length > 0 ? asRecord(turns[turns.length - 1]) : null\n const isInProgress = lastTurn?.status === 'inProgress'\n\n const responseData = {\n threadId,\n conversationState: {\n turns,\n },\n ownerClientId: null,\n liveStateError: null,\n isInProgress,\n }\n\n if (!isInProgress) {\n appServer.cacheLiveState(threadId, responseData, rawTurns.length, sessionSize)\n }\n\n setJson(res, 200, responseData)\n } catch (error) {\n const snapshot = appServer.getLastThreadReadSnapshot(threadId)\n if (snapshot) {\n const record = asRecord(snapshot)\n const thread = asRecord(record?.thread)\n const rawTurns = Array.isArray(thread?.turns) ? thread.turns : []\n const turns = appServer.mergeItemsIntoTurns(threadId, rawTurns)\n setJson(res, 200, {\n threadId,\n conversationState: { turns },\n ownerClientId: null,\n liveStateError: {\n kind: 'readFailed',\n message: getErrorMessage(error, 'thread/read failed'),\n },\n isInProgress: false,\n })\n } else {\n setJson(res, 200, {\n threadId,\n conversationState: null,\n ownerClientId: null,\n liveStateError: {\n kind: 'readFailed',\n message: getErrorMessage(error, 'thread/read failed'),\n },\n isInProgress: false,\n })\n }\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread/rollback-files') {\n try {\n const body = asRecord(await readJsonBody(req))\n const threadId = readNonEmptyString(body?.threadId)\n const turnId = readNonEmptyString(body?.turnId)\n const cwd = readNonEmptyString(body?.cwd)\n if (!threadId || !turnId || !cwd) {\n setJson(res, 400, { error: 'Missing threadId, turnId, or cwd' })\n return\n }\n\n const threadReadResult = await appServer.rpc('thread/read', { threadId, includeTurns: true })\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const sessionPath = readNonEmptyString(thread?.path)\n\n if (!sessionPath || !isAbsolute(sessionPath)) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No session log available' })\n return\n }\n\n let foundTurnIndex = -1\n const turnIdsToRevert = new Set<string>()\n for (let i = 0; i < turns.length; i++) {\n const turnRecord = asRecord(turns[i])\n const id = readNonEmptyString(turnRecord?.id)\n if (id === turnId) {\n foundTurnIndex = i\n }\n if (foundTurnIndex >= 0 && id) {\n turnIdsToRevert.add(id)\n }\n }\n\n if (turnIdsToRevert.size === 0) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No turns to revert' })\n return\n }\n\n let sessionLogRaw: string\n try {\n sessionLogRaw = await readFile(sessionPath, 'utf8')\n } catch {\n setJson(res, 200, { reverted: 0, errors: ['Could not read session log'], message: 'Session log unreadable' })\n return\n }\n\n const turnInfos = collectFileChangesForTurns(sessionLogRaw, turnIdsToRevert, cwd)\n if (turnInfos.size === 0) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No file changes to revert' })\n return\n }\n\n const result = await revertTurnFileChanges(cwd, turnInfos)\n setJson(res, 200, { ...result, message: `Reverted ${result.reverted} file change(s)` })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to revert file changes') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/transcribe') {\n const auth = await readCodexAuth()\n if (!auth) {\n setJson(res, 401, { error: 'No auth token available for transcription' })\n return\n }\n\n const rawBody = await readRawBody(req)\n const incomingCt = req.headers['content-type'] ?? 'application/octet-stream'\n const upstream = await proxyTranscribe(rawBody, incomingCt, auth.accessToken, auth.accountId)\n\n res.statusCode = upstream.status\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(upstream.body)\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/status') {\n try {\n setJson(res, 200, await readComposioStatus())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Composio status') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/connectors') {\n try {\n const query = url.searchParams.get('query') ?? ''\n const cursor = url.searchParams.get('cursor')?.trim() ?? null\n const limit = parseComposioLimit(url.searchParams.get('limit'))\n setJson(res, 200, await listComposioConnectors(query, cursor, limit))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to list Composio connectors') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/connector') {\n try {\n const slug = url.searchParams.get('slug') ?? ''\n setJson(res, 200, await readComposioConnectorDetail(slug))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load Composio connector') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/link') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const slug = readNonEmptyString(payload?.slug)\n setJson(res, 200, await startComposioLink(slug))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to start Composio login') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/login') {\n try {\n setJson(res, 200, await startComposioLogin())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to start Composio CLI login') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/install') {\n try {\n setJson(res, 200, await installComposioCli())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to install Composio CLI') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/connector-logo') {\n const src = url.searchParams.get('src')?.trim() ?? ''\n if (!src) {\n setJson(res, 400, { error: 'Missing src' })\n return\n }\n try {\n const logo = await fetchConnectorLogo(src)\n res.statusCode = 200\n res.setHeader('Content-Type', logo.contentType)\n res.setHeader('Cache-Control', 'private, max-age=3600')\n res.end(logo.body)\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch connector logo') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/server-requests/respond') {\n const payload = await readJsonBody(req)\n await appServer.respondToServerRequest(payload)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/server-requests/pending') {\n setJson(res, 200, { data: appServer.listPendingServerRequests() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/methods') {\n const methods = await methodCatalog.listMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/notifications') {\n const methods = await methodCatalog.listNotificationMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/provider-models') {\n try {\n const fmState = ensureDefaultFreeModeStateForMissingAuthSync(join(getCodexHomeDir(), FREE_MODE_STATE_FILE))\n if (fmState?.enabled) {\n if (fmState.provider === 'opencode-zen') {\n try {\n const modelsUrl = 'https://opencode.ai/zen/v1/models'\n const headers: Record<string, string> = {}\n if (fmState.apiKey && fmState.apiKey !== 'dummy') {\n headers['Authorization'] = `Bearer ${fmState.apiKey}`\n }\n const resp = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(8000) })\n if (resp.ok) {\n const json = await resp.json() as { data?: Array<{ id: string }> }\n const allIds = (json.data ?? []).map(m => m.id).filter(Boolean)\n const freeIds = allIds.filter(id => id.endsWith('-free') || id === 'big-pickle')\n const paidIds = allIds.filter(id => !id.endsWith('-free') && id !== 'big-pickle')\n setJson(res, 200, { data: [...freeIds, ...paidIds], exclusive: true, source: 'opencode-zen' })\n return\n }\n } catch {\n // OpenCode Zen model fetch failed\n }\n setJson(res, 200, { data: ['big-pickle', 'minimax-m2.5-free', 'nemotron-3-super-free', 'trinity-large-preview-free'], exclusive: true, source: 'opencode-zen' })\n return\n }\n if (fmState.provider === 'custom' && fmState.customBaseUrl) {\n try {\n const modelsUrl = fmState.customBaseUrl.replace(/\\/+$/, '') + '/models'\n const headers: Record<string, string> = {}\n if (fmState.apiKey && fmState.apiKey !== 'dummy') {\n headers['Authorization'] = `Bearer ${fmState.apiKey}`\n }\n const resp = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(8000) })\n if (resp.ok) {\n const json = await resp.json() as unknown\n const ids = normalizeProviderModelsData(json)\n const currentModel = fmState.model?.trim() ?? ''\n const orderedIds = currentModel && ids.includes(currentModel)\n ? [currentModel, ...ids.filter((id) => id !== currentModel)]\n : ids\n setJson(res, 200, { data: orderedIds, exclusive: true, source: 'custom' })\n return\n }\n } catch {\n // Custom endpoint model fetch failed — return empty list\n }\n setJson(res, 200, { data: [], exclusive: true, source: 'custom' })\n return\n }\n const freeModels = await getFreeModels()\n setJson(res, 200, { data: freeModels, exclusive: true })\n return\n }\n } catch {\n // No free-mode state — proceed normally\n }\n const data = await readProviderBackedModelIds(appServer)\n setJson(res, 200, data)\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/workspace-roots-state') {\n const state = await readWorkspaceRootsState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-queue-state') {\n const state = await readThreadQueueState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/home-directory') {\n setJson(res, 200, { data: { path: homedir() } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n const baseBranch = typeof payload?.baseBranch === 'string' ? payload.baseBranch.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const repoName = basename(gitRoot) || 'repo'\n const worktreesRoot = join(getCodexHomeDir(), 'worktrees')\n await mkdir(worktreesRoot, { recursive: true })\n\n // Match Codex desktop layout so project grouping resolves to repo name:\n // ~/.codex/worktrees/<id>/<repoName>\n let worktreeId = ''\n let worktreeParent = ''\n let worktreeCwd = ''\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = randomBytes(2).toString('hex')\n const parent = join(worktreesRoot, candidate)\n try {\n await stat(parent)\n continue\n } catch {\n worktreeId = candidate\n worktreeParent = parent\n worktreeCwd = join(parent, repoName)\n break\n }\n }\n if (!worktreeId || !worktreeParent || !worktreeCwd) {\n throw new Error('Failed to allocate a unique worktree id')\n }\n const startPoint = baseBranch || 'HEAD'\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '--detach', worktreeCwd, startPoint], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '--detach', worktreeCwd, startPoint], { cwd: gitRoot })\n }\n try {\n await persistWorkspaceRoot(worktreeCwd)\n } catch (error) {\n await rollbackCreatedWorktree(gitRoot, worktreeCwd, worktreeParent)\n throw error\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch: null,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create-permanent') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n const rawWorktreeName = typeof payload?.worktreeName === 'string' ? payload.worktreeName.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n if (!rawWorktreeName) {\n setJson(res, 400, { error: 'Missing worktreeName' })\n return\n }\n if (rawWorktreeName.includes('/') || rawWorktreeName.includes('\\\\') || rawWorktreeName === '.' || rawWorktreeName === '..') {\n setJson(res, 400, { error: 'Worktree name must be a single folder name' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const worktreeCwd = join(dirname(gitRoot), rawWorktreeName)\n try {\n await stat(worktreeCwd)\n setJson(res, 409, { error: 'Worktree folder already exists' })\n return\n } catch {\n // Expected for a new worktree path.\n }\n\n const branchName = await allocatePermanentWorktreeBranchName(gitRoot, rawWorktreeName)\n try {\n await runCommand('git', ['worktree', 'add', '-b', branchName, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branchName, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n try {\n await persistWorkspaceRoot(worktreeCwd)\n } catch (error) {\n await rollbackCreatedWorktree(gitRoot, worktreeCwd, undefined, branchName)\n throw error\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch: branchName,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/worktree/branches') {\n const rawSourceCwd = (url.searchParams.get('sourceCwd') ?? '').trim()\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n setJson(res, 200, { data: [] })\n return\n }\n const output = await runCommandCapture(\n 'git',\n ['for-each-ref', '--format=%(committerdate:unix)\\t%(refname)', 'refs/heads', 'refs/remotes'],\n { cwd: gitRoot },\n )\n const branchActivityByName = new Map<string, number>()\n for (const line of output.split('\\n')) {\n const [rawTimestamp = '', rawRefName = ''] = line.split('\\t')\n const normalized = normalizeBranchRefName(rawRefName)\n if (!normalized || normalized === 'origin/HEAD') continue\n const parsedTimestamp = Number.parseInt(rawTimestamp.trim(), 10)\n const timestamp = Number.isFinite(parsedTimestamp) ? parsedTimestamp : 0\n const current = branchActivityByName.get(normalized) ?? Number.MIN_SAFE_INTEGER\n if (timestamp > current) {\n branchActivityByName.set(normalized, timestamp)\n }\n }\n\n const branches = Array.from(branchActivityByName.entries())\n .map(([value]) => ({ value, label: value }))\n .sort((a, b) => {\n const aActivity = branchActivityByName.get(a.value) ?? 0\n const bActivity = branchActivityByName.get(b.value) ?? 0\n if (bActivity !== aActivity) return bActivity - aActivity\n return a.value.localeCompare(b.value)\n })\n setJson(res, 200, { data: branches })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to list branches') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/branches') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n setJson(res, 200, {\n data: {\n currentBranch: null,\n options: [],\n },\n })\n return\n }\n\n const state = await readGitHeaderState(gitRoot)\n const currentBranch = state.currentBranch\n const output = await runCommandCapture(\n 'git',\n ['for-each-ref', '--format=%(committerdate:unix)\\t%(refname)\\t%(objectname)', 'refs/heads', 'refs/remotes'],\n { cwd: gitRoot },\n )\n const branchActivityByName = new Map<string, { timestamp: number; isRemote: boolean }>()\n for (const line of output.split('\\n')) {\n const [rawTimestamp = '', rawRefName = ''] = line.split('\\t')\n const normalized = normalizeBranchRefName(rawRefName)\n if (!normalized || normalized === 'origin/HEAD') continue\n const parsedTimestamp = Number.parseInt(rawTimestamp.trim(), 10)\n const timestamp = Number.isFinite(parsedTimestamp) ? parsedTimestamp : 0\n const isRemote = rawRefName.trim().startsWith('refs/remotes/')\n const current = branchActivityByName.get(normalized)\n if (!current || timestamp > current.timestamp) {\n branchActivityByName.set(normalized, { timestamp, isRemote })\n }\n }\n if (currentBranch && !branchActivityByName.has(currentBranch)) {\n branchActivityByName.set(currentBranch, { timestamp: Number.MAX_SAFE_INTEGER, isRemote: false })\n }\n const options = Array.from(branchActivityByName.entries())\n .map(([value, metadata]) => ({\n value,\n label: value,\n isCurrent: value === currentBranch,\n isRemote: metadata.isRemote,\n }))\n .sort((a, b) => {\n const aActivity = branchActivityByName.get(a.value)?.timestamp ?? 0\n const bActivity = branchActivityByName.get(b.value)?.timestamp ?? 0\n if (bActivity !== aActivity) return bActivity - aActivity\n return a.value.localeCompare(b.value)\n })\n setJson(res, 200, {\n data: {\n ...state,\n options,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Git branches') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/repository-status') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n setJson(res, 200, {\n data: {\n isGitRepo: true,\n gitRoot,\n },\n })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Git repository status') })\n return\n }\n setJson(res, 200, {\n data: {\n isGitRepo: false,\n gitRoot: '',\n },\n })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/git/checkout') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const rawCwd = readNonEmptyString(record.cwd)\n const targetBranch = readNonEmptyString(record.branch)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!targetBranch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await assertNoTrackedGitChanges(gitRoot)\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, targetBranch)\n setJson(res, 200, { data: await readGitHeaderState(gitRoot) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to switch branch') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/branch-commits') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n const branch = (url.searchParams.get('branch') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!branch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await runCommandCapture('git', ['rev-parse', '--verify', `${branch}^{commit}`], { cwd: gitRoot })\n const resetHistoryRefPrefix = `refs/codex/header-git-reset-history/${branch}/`\n const resetHistoryRefsRaw = await runCommandCapture(\n 'git',\n ['for-each-ref', '--sort=-creatordate', '--format=%(refname)', resetHistoryRefPrefix],\n { cwd: gitRoot },\n ).catch(() => '')\n const resetHistoryRefs = resetHistoryRefsRaw\n .split('\\n')\n .map((entry) => entry.trim())\n .filter(Boolean)\n .slice(0, HEADER_GIT_RESET_HISTORY_REF_LIMIT)\n const output = await runCommandCapture(\n 'git',\n ['log', '-n', '12', '--date=short', '--format=%H%x09%h%x09%cd%x09%s', branch, ...resetHistoryRefs],\n { cwd: gitRoot },\n )\n const commits = output.split('\\n').flatMap((line) => {\n const [sha = '', shortSha = '', date = '', ...subjectParts] = line.split('\\t')\n const subject = subjectParts.join('\\t').trim()\n return sha.trim() && shortSha.trim()\n ? [{ sha: sha.trim(), shortSha: shortSha.trim(), date: date.trim(), subject: subject || shortSha.trim() }]\n : []\n })\n setJson(res, 200, { data: commits })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load branch commits') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/git/reset-to-commit') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const rawCwd = readNonEmptyString(record.cwd)\n const branch = readNonEmptyString(record.branch)\n const sha = readNonEmptyString(record.sha)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!branch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n if (!sha) {\n setJson(res, 400, { error: 'Missing commit' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await assertNoTrackedGitChanges(gitRoot)\n await assertLocalGitBranch(gitRoot, branch)\n const currentBranch = (await runCommandCapture('git', ['branch', '--show-current'], { cwd: gitRoot })).trim()\n if (currentBranch && currentBranch !== branch) {\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, branch)\n } else if (!currentBranch) {\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, branch)\n }\n const previousTip = await runCommandCapture('git', ['rev-parse', 'HEAD'], { cwd: gitRoot })\n const targetSha = await runCommandCapture('git', ['rev-parse', '--verify', `${sha}^{commit}`], { cwd: gitRoot })\n await runCommand('git', ['update-ref', toHeaderGitResetHistoryRef(branch, previousTip.trim()), previousTip.trim()], { cwd: gitRoot })\n await pruneHeaderGitResetHistoryRefs(gitRoot, branch)\n await runCommand('git', ['reset', '--hard', targetSha.trim()], { cwd: gitRoot })\n setJson(res, 200, { data: await readGitHeaderState(gitRoot) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to reset branch to commit') })\n }\n return\n }\n\n\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/workspace-roots-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n await updateWorkspaceRootsState((existingState) => ({\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n projectOrder: Array.isArray(record.projectOrder)\n ? normalizeStringArray(record.projectOrder)\n : existingState.projectOrder,\n remoteProjects: existingState.remoteProjects,\n }))\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-queue-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n await writeThreadQueueState(normalizeThreadQueueState(record))\n void backendQueueProcessor.scheduleAllQueuedThreads()\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/project-root') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n const createIfMissing = payload?.createIfMissing === true\n const label = typeof payload?.label === 'string' ? payload.label : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n let pathExists = true\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n pathExists = false\n }\n\n if (!pathExists && createIfMissing) {\n await mkdir(normalizedPath, { recursive: true })\n } else if (!pathExists) {\n setJson(res, 404, { error: 'Directory does not exist' })\n return\n }\n\n await persistWorkspaceRoot(normalizedPath, label)\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/local-directory') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n await mkdir(normalizedPath, { recursive: true })\n }\n\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/github-clone') {\n const payload = asRecord(await readJsonBody(req))\n const repoUrl = typeof payload?.url === 'string' ? payload.url.trim() : ''\n const basePath = typeof payload?.basePath === 'string' ? payload.basePath.trim() : ''\n try {\n const clonedPath = await cloneGithubRepositoryIntoBase(repoUrl, basePath)\n setJson(res, 200, { data: { path: clonedPath } })\n } catch (error) {\n setJson(res, 400, { error: error instanceof Error ? error.message : 'Failed to clone GitHub repository' })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/projectless-thread-cwd') {\n const payload = asRecord(await readJsonBody(req))\n const prompt = typeof payload?.prompt === 'string' ? payload.prompt : null\n try {\n const directory = await createProjectlessThreadDirectory(prompt)\n setJson(res, 200, { data: directory })\n } catch (error) {\n setJson(res, 500, { error: error instanceof Error ? error.message : 'Failed to create new chat folder' })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-root-suggestion') {\n const basePath = url.searchParams.get('basePath')?.trim() ?? ''\n if (!basePath) {\n setJson(res, 400, { error: 'Missing basePath' })\n return\n }\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n try {\n const baseInfo = await stat(normalizedBasePath)\n if (!baseInfo.isDirectory()) {\n setJson(res, 400, { error: 'basePath is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'basePath does not exist' })\n return\n }\n\n let index = 1\n while (index < 100000) {\n const candidateName = `New Project (${String(index)})`\n const candidatePath = join(normalizedBasePath, candidateName)\n try {\n await stat(candidatePath)\n index += 1\n continue\n } catch {\n setJson(res, 200, { data: { name: candidateName, path: candidatePath } })\n return\n }\n }\n\n setJson(res, 500, { error: 'Failed to compute project name suggestion' })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composer-file-search') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 20\n const limit = Math.max(1, Math.min(100, Math.floor(limitRaw)))\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const files = await listFilesWithRipgrep(cwd)\n const scored = files\n .map((path) => ({ path, score: scoreFileCandidate(path, query) }))\n .filter((row) => query.length === 0 || row.score < 10)\n .sort((a, b) => (a.score - b.score) || a.path.localeCompare(b.path))\n .slice(0, limit)\n .map((row) => ({ path: row.path }))\n setJson(res, 200, { data: scored })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to search files') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/prompts') {\n setJson(res, 200, { data: await listComposerPrompts() })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/prompts') {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const content = typeof payload?.content === 'string' ? payload.content : ''\n if (!name || !content.trim()) {\n setJson(res, 400, { error: 'Prompt name and content are required' })\n return\n }\n try {\n const prompt = await createComposerPromptFile(name, content)\n setJson(res, 200, { data: prompt })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create prompt') })\n }\n return\n }\n\n if (req.method === 'DELETE' && url.pathname === '/codex-api/prompts') {\n const promptPath = url.searchParams.get('path')?.trim() ?? ''\n if (!promptPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n try {\n const removed = await removeComposerPromptFile(promptPath)\n setJson(res, 200, { data: { removed } })\n } catch (error) {\n setJson(res, 400, { error: getErrorMessage(error, 'Failed to remove prompt') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-titles') {\n const cache = await readMergedThreadTitleCache()\n setJson(res, 200, { data: cache })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-pins') {\n const threadIds = await readPinnedThreadIds()\n setJson(res, 200, { data: { threadIds } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/preferences/first-launch-plugins-card') {\n const dismissed = await readFirstLaunchPluginsCardDismissed()\n setJson(res, 200, { data: { dismissed } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-automations') {\n const automationsByThreadId = await listThreadHeartbeatAutomations()\n setJson(res, 200, { data: automationsByThreadId })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-automation') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const automation = automationId\n ? await readThreadHeartbeatAutomation(threadId, automationId)\n : await readThreadHeartbeatAutomations(threadId)\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-search') {\n const payload = asRecord(await readJsonBody(req))\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 200\n const limit = Math.max(1, Math.min(1000, Math.floor(limitRaw)))\n if (!query) {\n setJson(res, 200, { data: { threadIds: [], indexedThreadCount: 0 } })\n return\n }\n\n const index = await getThreadSearchIndex()\n const matchedIds = Array.from(index.docsById.entries())\n .filter(([, doc]) => isExactPhraseMatch(query, doc))\n .slice(0, limit)\n .map(([id]) => id)\n\n setJson(res, 200, { data: { threadIds: matchedIds, indexedThreadCount: index.docsById.size } })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-titles') {\n const payload = asRecord(await readJsonBody(req))\n const id = typeof payload?.id === 'string' ? payload.id : ''\n const title = typeof payload?.title === 'string' ? payload.title : ''\n if (!id) {\n setJson(res, 400, { error: 'Missing id' })\n return\n }\n const cache = await readThreadTitleCache()\n const next = title ? updateThreadTitleCache(cache, id, title) : removeFromThreadTitleCache(cache, id)\n await writeThreadTitleCache(next)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-pins') {\n const payload = asRecord(await readJsonBody(req))\n const threadIds = normalizePinnedThreadIds(payload?.threadIds)\n await writePinnedThreadIds(threadIds)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/preferences/first-launch-plugins-card') {\n const payload = asRecord(await readJsonBody(req))\n const dismissed = payload?.dismissed === true\n await writeFirstLaunchPluginsCardDismissed(dismissed)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-automation') {\n const payload = asRecord(await readJsonBody(req))\n const threadId = typeof payload?.threadId === 'string' ? payload.threadId.trim() : ''\n const id = typeof payload?.id === 'string' ? payload.id.trim() : ''\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const prompt = typeof payload?.prompt === 'string' ? payload.prompt.trim() : ''\n const rrule = typeof payload?.rrule === 'string' ? payload.rrule.trim() : ''\n const status = payload?.status === 'PAUSED' ? 'PAUSED' : 'ACTIVE'\n if (!threadId || !name || !prompt || !rrule) {\n setJson(res, 400, { error: 'threadId, name, prompt, and rrule are required' })\n return\n }\n const automation = await writeThreadHeartbeatAutomation({ threadId, id, name, prompt, rrule, status })\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-automation/run') {\n const payload = asRecord(await readJsonBody(req))\n const threadId = typeof payload?.threadId === 'string' ? payload.threadId.trim() : ''\n const automationId = typeof payload?.automationId === 'string' ? payload.automationId.trim() : ''\n if (!threadId || !automationId) {\n setJson(res, 400, { error: 'threadId and automationId are required' })\n return\n }\n const automation = await readThreadHeartbeatAutomation(threadId, automationId)\n if (!automation) {\n setJson(res, 404, { error: 'Automation not found for thread' })\n return\n }\n await appendThreadQueuedMessage(threadId, buildHeartbeatQueuedMessage(automation))\n backendQueueProcessor.scheduleThreadQueueDrain(threadId, 0)\n setJson(res, 200, { data: { queued: true } })\n return\n }\n\n if (req.method === 'DELETE' && url.pathname === '/codex-api/thread-automation') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const removed = await deleteThreadHeartbeatAutomation(threadId, automationId)\n setJson(res, 200, { data: { removed } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/telegram/configure-bot') {\n const payload = asRecord(await readJsonBody(req))\n const botToken = typeof payload?.botToken === 'string' ? payload.botToken.trim() : ''\n const rawAllowedUserIds = Array.isArray(payload?.allowedUserIds) ? payload.allowedUserIds : []\n if (!botToken) {\n setJson(res, 400, { error: 'Missing botToken' })\n return\n }\n const config = normalizeTelegramBridgeConfig({\n botToken,\n allowedUserIds: rawAllowedUserIds,\n })\n if (config.allowedUserIds.length === 0) {\n setJson(res, 400, { error: 'At least one allowed Telegram user ID is required' })\n return\n }\n\n telegramBridge.configureToken(config.botToken)\n telegramBridge.configureAllowedUserIds(config.allowedUserIds)\n telegramBridge.start()\n const existingConfig = await readTelegramBridgeConfig()\n await writeTelegramBridgeConfig({\n botToken: config.botToken,\n chatIds: existingConfig.chatIds,\n allowedUserIds: config.allowedUserIds,\n })\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/telegram/config') {\n const config = await readTelegramBridgeConfig()\n setJson(res, 200, {\n data: {\n botToken: config.botToken,\n allowedUserIds: config.allowedUserIds,\n },\n })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/telegram/status') {\n setJson(res, 200, { data: telegramBridge.getStatus() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/events') {\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')\n res.setHeader('Cache-Control', 'no-cache, no-transform')\n res.setHeader('Connection', 'keep-alive')\n res.setHeader('X-Accel-Buffering', 'no')\n\n const unsubscribe = middleware.subscribeNotifications((notification: { method: string; params: unknown; atIso: string }) => {\n if (res.writableEnded || res.destroyed) return\n res.write(`data: ${JSON.stringify(notification)}\\n\\n`)\n })\n\n res.write(`event: ready\\ndata: ${JSON.stringify({ ok: true })}\\n\\n`)\n const keepAlive = setInterval(() => {\n res.write(': ping\\n\\n')\n }, 15000)\n\n const close = () => {\n clearInterval(keepAlive)\n unsubscribe()\n if (!res.writableEnded) {\n res.end()\n }\n }\n\n req.on('close', close)\n req.on('aborted', close)\n return\n }\n\n next()\n } catch (error) {\n const message = getErrorMessage(error, 'Unknown bridge error')\n setJson(res, 502, { error: message })\n }\n }\n\n middleware.dispose = () => {\n threadSearchIndex = null\n telegramBridge.stop()\n terminalManager.dispose()\n backendQueueProcessor.dispose()\n appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n const unsubscribeAppServer = appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n const unsubscribeTerminal = terminalManager.subscribe((notification) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n return () => {\n unsubscribeAppServer()\n unsubscribeTerminal()\n }\n }\n\n return middleware\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { mkdtemp, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { buildAppServerArgs } from './appServerRuntimeConfig.js'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n listPendingServerRequests(): unknown[]\n dispose(): void\n}\n\ntype AccountRouteContext = {\n appServer: AppServerLike\n}\n\ntype StoredRateLimitWindow = {\n usedPercent: number\n windowMinutes: number | null\n resetsAt: number | null\n}\n\ntype StoredCreditsSnapshot = {\n hasCredits: boolean\n unlimited: boolean\n balance: string | null\n}\n\ntype StoredRateLimitSnapshot = {\n limitId: string | null\n limitName: string | null\n primary: StoredRateLimitWindow | null\n secondary: StoredRateLimitWindow | null\n credits: StoredCreditsSnapshot | null\n planType: string | null\n}\n\ntype AccountQuotaStatus = 'idle' | 'loading' | 'ready' | 'error'\ntype AccountUnavailableReason = 'payment_required'\n\ntype StoredAccountEntry = {\n accountId: string\n storageId: string\n authMode: string | null\n email: string | null\n planType: string | null\n lastRefreshedAtIso: string\n lastActivatedAtIso: string | null\n quotaSnapshot: StoredRateLimitSnapshot | null\n quotaUpdatedAtIso: string | null\n quotaStatus: AccountQuotaStatus\n quotaError: string | null\n unavailableReason: AccountUnavailableReason | null\n}\n\ntype StoredAccountsState = {\n activeAccountId: string | null\n accounts: StoredAccountEntry[]\n}\n\ntype AuthFile = {\n auth_mode?: string\n tokens?: {\n access_token?: string\n account_id?: string\n }\n}\n\ntype TokenMetadata = {\n email: string | null\n planType: string | null\n}\n\ntype AccountInspection = {\n metadata: TokenMetadata\n quotaSnapshot: StoredRateLimitSnapshot | null\n}\n\nconst ACCOUNT_QUOTA_REFRESH_TTL_MS = 5 * 60 * 1000\nconst ACCOUNT_QUOTA_LOADING_STALE_MS = 2 * 60 * 1000\nconst ACCOUNT_INSPECTION_TIMEOUT_MS = 25 * 1000\nconst LOGIN_URL_TIMEOUT_MS = 15 * 1000\nconst LOGIN_CALLBACK_TIMEOUT_MS = 20 * 1000\nconst LOGIN_AUTH_FILE_TIMEOUT_MS = 10 * 1000\n\nlet backgroundRefreshPromise: Promise<void> | null = null\nlet activeLogin: {\n proc: ChildProcessWithoutNullStreams\n loginUrl: string | null\n output: string\n exited: boolean\n exitCode: number | null\n exitSignal: NodeJS.Signals | null\n exitPromise: Promise<void>\n} | null = null\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction readNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nfunction readBoolean(value: unknown): boolean | null {\n return typeof value === 'boolean' ? value : null\n}\n\nfunction normalizeAccountUnavailableReason(value: unknown): AccountUnavailableReason | null {\n return value === 'payment_required' ? value : null\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown> | null> {\n const rawBody = await new Promise<string>((resolve, reject) => {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => resolve(body))\n req.on('error', reject)\n })\n return asRecord(rawBody.length > 0 ? JSON.parse(rawBody) : {})\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n const error = record?.error\n if (typeof error === 'string' && error.trim().length > 0) {\n return error.trim()\n }\n if (typeof record?.message === 'string' && record.message.trim().length > 0) {\n return record.message.trim()\n }\n return fallback\n}\n\nfunction isPaymentRequiredErrorMessage(value: string | null): boolean {\n if (!value) return false\n const normalized = value.toLowerCase()\n return normalized.includes('payment required') || /\\b402\\b/.test(normalized)\n}\n\nfunction detectAccountUnavailableReason(error: unknown): AccountUnavailableReason | null {\n return isPaymentRequiredErrorMessage(getErrorMessage(error, '')) ? 'payment_required' : null\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getActiveAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\nfunction getAccountsStatePath(): string {\n return join(getCodexHomeDir(), 'accounts.json')\n}\n\nfunction getAccountsSnapshotRoot(): string {\n return join(getCodexHomeDir(), 'accounts')\n}\n\nfunction toStorageId(accountId: string): string {\n return createHash('sha256').update(accountId).digest('hex')\n}\n\nfunction normalizeRateLimitWindow(value: unknown): StoredRateLimitWindow | null {\n const record = asRecord(value)\n if (!record) return null\n\n const usedPercent = readNumber(record.usedPercent ?? record.used_percent)\n if (usedPercent === null) return null\n\n return {\n usedPercent,\n windowMinutes: readNumber(record.windowDurationMins ?? record.window_minutes),\n resetsAt: readNumber(record.resetsAt ?? record.resets_at),\n }\n}\n\nfunction normalizeCreditsSnapshot(value: unknown): StoredCreditsSnapshot | null {\n const record = asRecord(value)\n if (!record) return null\n\n const hasCredits = readBoolean(record.hasCredits ?? record.has_credits)\n const unlimited = readBoolean(record.unlimited)\n if (hasCredits === null || unlimited === null) return null\n\n return {\n hasCredits,\n unlimited,\n balance: readString(record.balance),\n }\n}\n\nfunction normalizeRateLimitSnapshot(value: unknown): StoredRateLimitSnapshot | null {\n const record = asRecord(value)\n if (!record) return null\n\n const primary = normalizeRateLimitWindow(record.primary)\n const secondary = normalizeRateLimitWindow(record.secondary)\n const credits = normalizeCreditsSnapshot(record.credits)\n\n if (!primary && !secondary && !credits) return null\n\n return {\n limitId: readString(record.limitId ?? record.limit_id),\n limitName: readString(record.limitName ?? record.limit_name),\n primary,\n secondary,\n credits,\n planType: readString(record.planType ?? record.plan_type),\n }\n}\n\nfunction pickCodexRateLimitSnapshot(payload: unknown): StoredRateLimitSnapshot | null {\n const record = asRecord(payload)\n if (!record) return null\n\n const rateLimitsByLimitId = asRecord(record.rateLimitsByLimitId ?? record.rate_limits_by_limit_id)\n const codexBucket = normalizeRateLimitSnapshot(rateLimitsByLimitId?.codex)\n if (codexBucket) return codexBucket\n\n return normalizeRateLimitSnapshot(record.rateLimits ?? record.rate_limits)\n}\n\nfunction normalizeStoredAccountEntry(value: unknown): StoredAccountEntry | null {\n const record = asRecord(value)\n const accountId = readString(record?.accountId)\n const storageId = readString(record?.storageId)\n const lastRefreshedAtIso = readString(record?.lastRefreshedAtIso)\n const quotaStatusRaw = readString(record?.quotaStatus)\n const quotaStatus: AccountQuotaStatus =\n quotaStatusRaw === 'loading' || quotaStatusRaw === 'ready' || quotaStatusRaw === 'error' ? quotaStatusRaw : 'idle'\n if (!accountId || !storageId || !lastRefreshedAtIso) return null\n\n return {\n accountId,\n storageId,\n authMode: readString(record?.authMode),\n email: readString(record?.email),\n planType: readString(record?.planType),\n lastRefreshedAtIso,\n lastActivatedAtIso: readString(record?.lastActivatedAtIso),\n quotaSnapshot: normalizeRateLimitSnapshot(record?.quotaSnapshot),\n quotaUpdatedAtIso: readString(record?.quotaUpdatedAtIso),\n quotaStatus,\n quotaError: readString(record?.quotaError),\n unavailableReason: normalizeAccountUnavailableReason(record?.unavailableReason)\n ?? (isPaymentRequiredErrorMessage(readString(record?.quotaError)) ? 'payment_required' : null),\n }\n}\n\nasync function readStoredAccountsState(): Promise<StoredAccountsState> {\n try {\n const raw = await readFile(getAccountsStatePath(), 'utf8')\n const parsed = asRecord(JSON.parse(raw))\n const activeAccountId = readString(parsed?.activeAccountId)\n const rawAccounts = Array.isArray(parsed?.accounts) ? parsed.accounts : []\n const accounts = rawAccounts\n .map((entry) => normalizeStoredAccountEntry(entry))\n .filter((entry): entry is StoredAccountEntry => entry !== null)\n return { activeAccountId, accounts }\n } catch {\n return { activeAccountId: null, accounts: [] }\n }\n}\n\nasync function writeStoredAccountsState(state: StoredAccountsState): Promise<void> {\n await writeFile(getAccountsStatePath(), JSON.stringify(state, null, 2), { encoding: 'utf8', mode: 0o600 })\n}\n\nfunction withUpsertedAccount(state: StoredAccountsState, nextEntry: StoredAccountEntry): StoredAccountsState {\n const rest = state.accounts.filter((entry) => entry.accountId !== nextEntry.accountId)\n return {\n activeAccountId: state.activeAccountId,\n accounts: [nextEntry, ...rest],\n }\n}\n\nfunction sortAccounts(accounts: StoredAccountEntry[], activeAccountId: string | null): StoredAccountEntry[] {\n return [...accounts].sort((left, right) => {\n const leftActive = left.accountId === activeAccountId ? 1 : 0\n const rightActive = right.accountId === activeAccountId ? 1 : 0\n if (leftActive !== rightActive) return rightActive - leftActive\n return right.lastRefreshedAtIso.localeCompare(left.lastRefreshedAtIso)\n })\n}\n\nfunction toPublicAccountEntry(entry: StoredAccountEntry, activeAccountId: string | null): StoredAccountEntry & { isActive: boolean } {\n return {\n ...entry,\n isActive: entry.accountId === activeAccountId,\n }\n}\n\nfunction decodeBase64UrlJson(input: string): Record<string, unknown> | null {\n try {\n const normalized = input.replace(/-/g, '+').replace(/_/g, '/')\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4))\n const raw = Buffer.from(`${normalized}${padding}`, 'base64').toString('utf8')\n const parsed = JSON.parse(raw) as unknown\n return asRecord(parsed)\n } catch {\n return null\n }\n}\n\nfunction extractTokenMetadata(accessToken: string | undefined): TokenMetadata {\n if (!accessToken || typeof accessToken !== 'string') {\n return { email: null, planType: null }\n }\n const parts = accessToken.split('.')\n if (parts.length < 2) {\n return { email: null, planType: null }\n }\n const payload = decodeBase64UrlJson(parts[1] ?? '')\n const profile = asRecord(payload?.['https://api.openai.com/profile'])\n const auth = asRecord(payload?.['https://api.openai.com/auth'])\n return {\n email: typeof profile?.email === 'string' && profile.email.trim().length > 0 ? profile.email.trim() : null,\n planType:\n typeof auth?.chatgpt_plan_type === 'string' && auth.chatgpt_plan_type.trim().length > 0\n ? auth.chatgpt_plan_type.trim()\n : null,\n }\n}\n\nasync function readAuthFileFromPath(path: string): Promise<{ raw: string; parsed: AuthFile; accountId: string; authMode: string | null; metadata: TokenMetadata }> {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as AuthFile\n const accountId = parsed.tokens?.account_id?.trim() ?? ''\n if (!accountId) {\n throw new Error('missing_account_id')\n }\n return {\n raw,\n parsed,\n accountId,\n authMode: typeof parsed.auth_mode === 'string' && parsed.auth_mode.trim().length > 0 ? parsed.auth_mode.trim() : null,\n metadata: extractTokenMetadata(parsed.tokens?.access_token),\n }\n}\n\nfunction getSnapshotPath(storageId: string): string {\n return join(getAccountsSnapshotRoot(), storageId, 'auth.json')\n}\n\nasync function writeSnapshot(storageId: string, raw: string): Promise<void> {\n const dir = join(getAccountsSnapshotRoot(), storageId)\n await mkdir(dir, { recursive: true, mode: 0o700 })\n await writeFile(getSnapshotPath(storageId), raw, { encoding: 'utf8', mode: 0o600 })\n}\n\nasync function removeSnapshot(storageId: string): Promise<void> {\n await rm(join(getAccountsSnapshotRoot(), storageId), { recursive: true, force: true })\n}\n\nasync function readRuntimeAccountMetadata(appServer: AppServerLike): Promise<TokenMetadata> {\n const payload = asRecord(await appServer.rpc('account/read', { refreshToken: false }))\n const account = asRecord(payload?.account)\n return {\n email: typeof account?.email === 'string' && account.email.trim().length > 0 ? account.email.trim() : null,\n planType: typeof account?.planType === 'string' && account.planType.trim().length > 0 ? account.planType.trim() : null,\n }\n}\n\nasync function validateSwitchedAccount(appServer: AppServerLike): Promise<AccountInspection> {\n const metadata = await readRuntimeAccountMetadata(appServer)\n const quotaPayload = await appServer.rpc('account/rateLimits/read', null)\n return {\n metadata,\n quotaSnapshot: pickCodexRateLimitSnapshot(quotaPayload),\n }\n}\n\nasync function restoreActiveAuth(raw: string | null): Promise<void> {\n const path = getActiveAuthPath()\n if (raw === null) {\n await rm(path, { force: true })\n return\n }\n await writeFile(path, raw, { encoding: 'utf8', mode: 0o600 })\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function withTemporaryCodexAppServer<T>(\n authRaw: string,\n run: (rpc: (method: string, params: unknown) => Promise<unknown>) => Promise<T>,\n): Promise<T> {\n const tempCodexHome = await mkdtemp(join(tmpdir(), 'codexui-account-'))\n const authPath = join(tempCodexHome, 'auth.json')\n await writeFile(authPath, authRaw, { encoding: 'utf8', mode: 0o600 })\n\n const proc = spawn('codex', buildAppServerArgs(), {\n env: { ...process.env, CODEX_HOME: tempCodexHome },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n let disposed = false\n let initialized = false\n let initializePromise: Promise<void> | null = null\n let readBuffer = ''\n let nextId = 1\n const pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n\n const rejectAllPending = (error: Error) => {\n for (const request of pending.values()) {\n request.reject(error)\n }\n pending.clear()\n }\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n readBuffer += chunk\n let lineEnd = readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = readBuffer.slice(0, lineEnd).trim()\n readBuffer = readBuffer.slice(lineEnd + 1)\n if (line.length > 0) {\n try {\n const message = JSON.parse(line) as { id?: number; result?: unknown; error?: { message?: string } }\n if (typeof message.id === 'number' && pending.has(message.id)) {\n const current = pending.get(message.id)\n pending.delete(message.id)\n if (!current) {\n lineEnd = readBuffer.indexOf('\\n')\n continue\n }\n if (message.error?.message) {\n current.reject(new Error(message.error.message))\n } else {\n current.resolve(message.result)\n }\n }\n } catch {\n // Ignore malformed lines and unrelated notifications.\n }\n }\n lineEnd = readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // JSON-RPC errors are surfaced through stdout responses.\n })\n\n proc.on('error', (error) => {\n rejectAllPending(error instanceof Error ? error : new Error('codex app-server failed to start'))\n })\n\n proc.on('exit', () => {\n if (disposed) return\n rejectAllPending(new Error('codex app-server exited unexpectedly'))\n })\n\n const sendLine = (payload: Record<string, unknown>) => {\n proc.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n const call = async (method: string, params: unknown): Promise<unknown> => {\n const id = nextId++\n return await new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n })\n })\n }\n\n const ensureInitialized = async (): Promise<void> => {\n if (initialized) return\n if (initializePromise) {\n await initializePromise\n return\n }\n\n initializePromise = call('initialize', {\n clientInfo: {\n name: 'codexui-account-refresh',\n version: '0.1.0',\n },\n capabilities: {\n experimentalApi: true,\n },\n }).then(() => {\n sendLine({\n jsonrpc: '2.0',\n method: 'initialized',\n })\n initialized = true\n }).finally(() => {\n initializePromise = null\n })\n\n await initializePromise\n }\n\n const dispose = async () => {\n if (disposed) return\n disposed = true\n rejectAllPending(new Error('codex app-server stopped'))\n try {\n proc.stdin.end()\n } catch {\n // ignore\n }\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore\n }\n await rm(tempCodexHome, { recursive: true, force: true })\n }\n\n try {\n await ensureInitialized()\n return await run(call)\n } finally {\n await dispose()\n }\n}\n\nasync function inspectStoredAccount(entry: StoredAccountEntry): Promise<AccountInspection> {\n const snapshotPath = getSnapshotPath(entry.storageId)\n const authRaw = await readFile(snapshotPath, 'utf8')\n return await withTemporaryCodexAppServer(authRaw, async (rpc) => {\n const accountPayload = asRecord(await rpc('account/read', { refreshToken: false }))\n const account = asRecord(accountPayload?.account)\n const quotaPayload = await rpc('account/rateLimits/read', null)\n return {\n metadata: {\n email: typeof account?.email === 'string' && account.email.trim().length > 0 ? account.email.trim() : entry.email,\n planType: typeof account?.planType === 'string' && account.planType.trim().length > 0 ? account.planType.trim() : entry.planType,\n },\n quotaSnapshot: pickCodexRateLimitSnapshot(quotaPayload),\n }\n })\n}\n\nasync function inspectStoredAccountWithTimeout(entry: StoredAccountEntry): Promise<AccountInspection> {\n let timeoutHandle: NodeJS.Timeout | null = null\n try {\n return await Promise.race<AccountInspection>([\n inspectStoredAccount(entry),\n new Promise<AccountInspection>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(`Account quota inspection timed out after ${ACCOUNT_INSPECTION_TIMEOUT_MS}ms`))\n }, ACCOUNT_INSPECTION_TIMEOUT_MS)\n timeoutHandle.unref?.()\n }),\n ])\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle)\n }\n}\n\nfunction shouldRefreshAccountQuota(entry: StoredAccountEntry): boolean {\n if (entry.quotaStatus === 'loading') {\n const updatedAtMs = entry.quotaUpdatedAtIso ? Date.parse(entry.quotaUpdatedAtIso) : Number.NaN\n if (!Number.isFinite(updatedAtMs)) return true\n return Date.now() - updatedAtMs >= ACCOUNT_QUOTA_LOADING_STALE_MS\n }\n if (!entry.quotaUpdatedAtIso) return true\n const updatedAtMs = Date.parse(entry.quotaUpdatedAtIso)\n if (!Number.isFinite(updatedAtMs)) return true\n return Date.now() - updatedAtMs >= ACCOUNT_QUOTA_REFRESH_TTL_MS\n}\n\nasync function replaceStoredAccount(nextEntry: StoredAccountEntry, activeAccountId: string | null): Promise<void> {\n const state = await readStoredAccountsState()\n const nextState = withUpsertedAccount({\n activeAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId,\n accounts: nextState.accounts,\n })\n}\n\nasync function pickReplacementActiveAccount(accounts: StoredAccountEntry[]): Promise<StoredAccountEntry | null> {\n const sorted = sortAccounts(accounts, null)\n for (const entry of sorted) {\n if (entry.unavailableReason === 'payment_required') continue\n if (await fileExists(getSnapshotPath(entry.storageId))) {\n return entry\n }\n }\n return null\n}\n\nasync function refreshAccountsInBackground(accountIds: string[], activeAccountId: string | null): Promise<void> {\n for (const accountId of accountIds) {\n const state = await readStoredAccountsState()\n const entry = state.accounts.find((item) => item.accountId === accountId)\n if (!entry) continue\n\n try {\n const inspected = await inspectStoredAccountWithTimeout(entry)\n await replaceStoredAccount({\n ...entry,\n email: inspected.metadata.email ?? entry.email,\n planType: inspected.metadata.planType ?? entry.planType,\n quotaSnapshot: inspected.quotaSnapshot ?? entry.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }, activeAccountId)\n } catch (error) {\n await replaceStoredAccount({\n ...entry,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to refresh account quota'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, activeAccountId)\n }\n }\n}\n\nasync function scheduleAccountsBackgroundRefresh(\n options: { force?: boolean; prioritizeAccountId?: string; accountIds?: string[] } = {},\n): Promise<StoredAccountsState> {\n const state = await readStoredAccountsState()\n if (state.accounts.length === 0) return state\n if (backgroundRefreshPromise) return state\n\n const allowedIds = options.accountIds ? new Set(options.accountIds) : null\n const candidates = state.accounts\n .filter((entry) => !allowedIds || allowedIds.has(entry.accountId))\n .filter((entry) => options.force === true || shouldRefreshAccountQuota(entry))\n .sort((left, right) => {\n const prioritize = options.prioritizeAccountId ?? ''\n const leftPriority = left.accountId === prioritize ? 1 : 0\n const rightPriority = right.accountId === prioritize ? 1 : 0\n if (leftPriority !== rightPriority) return rightPriority - leftPriority\n return 0\n })\n\n if (candidates.length === 0) return state\n\n const candidateIds = new Set(candidates.map((entry) => entry.accountId))\n const markedState: StoredAccountsState = {\n activeAccountId: state.activeAccountId,\n accounts: state.accounts.map((entry) => (\n candidateIds.has(entry.accountId)\n ? {\n ...entry,\n quotaStatus: 'loading',\n quotaError: null,\n }\n : entry\n )),\n }\n\n await writeStoredAccountsState(markedState)\n\n backgroundRefreshPromise = refreshAccountsInBackground(\n candidates.map((entry) => entry.accountId),\n markedState.activeAccountId,\n ).finally(() => {\n backgroundRefreshPromise = null\n })\n\n return markedState\n}\n\nasync function importAccountFromAuthPath(path: string): Promise<{\n activeAccountId: string | null\n importedAccountId: string\n accounts: Array<StoredAccountEntry & { isActive: boolean }>\n}> {\n const imported = await readAuthFileFromPath(path)\n const storageId = toStorageId(imported.accountId)\n await writeSnapshot(storageId, imported.raw)\n\n const state = await readStoredAccountsState()\n const existing = state.accounts.find((entry) => entry.accountId === imported.accountId) ?? null\n const nextEntry: StoredAccountEntry = {\n accountId: imported.accountId,\n storageId,\n authMode: imported.authMode,\n email: imported.metadata.email ?? existing?.email ?? null,\n planType: imported.metadata.planType ?? existing?.planType ?? null,\n lastRefreshedAtIso: new Date().toISOString(),\n lastActivatedAtIso: existing?.lastActivatedAtIso ?? null,\n quotaSnapshot: existing?.quotaSnapshot ?? null,\n quotaUpdatedAtIso: existing?.quotaUpdatedAtIso ?? null,\n quotaStatus: existing?.quotaStatus ?? 'idle',\n quotaError: existing?.quotaError ?? null,\n unavailableReason: existing?.unavailableReason ?? null,\n }\n const nextState = withUpsertedAccount(state, nextEntry)\n await writeStoredAccountsState(nextState)\n\n return {\n activeAccountId: nextState.activeAccountId,\n importedAccountId: imported.accountId,\n accounts: sortAccounts(nextState.accounts, nextState.activeAccountId).map((entry) => toPublicAccountEntry(entry, nextState.activeAccountId)),\n }\n}\n\nfunction extractLoginUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/auth\\.openai\\.com\\/oauth\\/authorize\\?\\S+/u)\n return match?.[0] ?? null\n}\n\nfunction isLocalCallbackUrl(rawUrl: string): boolean {\n try {\n const parsed = new URL(rawUrl)\n if (parsed.protocol !== 'http:') return false\n return parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]' || parsed.hostname === '::1'\n } catch {\n return false\n }\n}\n\nasync function waitForLoginUrl(): Promise<string> {\n if (activeLogin?.loginUrl) return activeLogin.loginUrl\n\n return await new Promise<string>((resolve, reject) => {\n const startedAt = Date.now()\n const timer = setInterval(() => {\n if (!activeLogin) {\n clearInterval(timer)\n reject(new Error('Login process is not running.'))\n return\n }\n if (activeLogin.loginUrl) {\n clearInterval(timer)\n resolve(activeLogin.loginUrl)\n return\n }\n if (activeLogin.exited) {\n clearInterval(timer)\n reject(new Error(activeLogin.output.trim() || 'codex login exited before returning a login URL.'))\n return\n }\n if (Date.now() - startedAt > LOGIN_URL_TIMEOUT_MS) {\n clearInterval(timer)\n reject(new Error('Timed out waiting for codex login URL.'))\n }\n }, 100)\n })\n}\n\nasync function startCodexLogin(): Promise<string> {\n if (activeLogin && !activeLogin.exited) {\n return await waitForLoginUrl()\n }\n\n const proc = spawn('codex', ['login'], {\n env: process.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n proc.stdin.end()\n\n activeLogin = {\n proc,\n loginUrl: null,\n output: '',\n exited: false,\n exitCode: null,\n exitSignal: null,\n exitPromise: new Promise<void>((resolve) => {\n proc.once('exit', (code, signal) => {\n if (activeLogin?.proc === proc) {\n activeLogin.exited = true\n activeLogin.exitCode = code\n activeLogin.exitSignal = signal\n }\n resolve()\n })\n }),\n }\n\n const appendOutput = (chunk: Buffer | string) => {\n if (!activeLogin || activeLogin.proc !== proc) return\n activeLogin.output += chunk.toString()\n activeLogin.loginUrl = activeLogin.loginUrl ?? extractLoginUrl(activeLogin.output)\n }\n\n proc.stdout.on('data', appendOutput)\n proc.stderr.on('data', appendOutput)\n proc.once('error', (error) => {\n if (!activeLogin || activeLogin.proc !== proc) return\n activeLogin.exited = true\n activeLogin.output += error.message\n })\n\n try {\n return await waitForLoginUrl()\n } catch (error) {\n if (activeLogin?.proc === proc && !activeLogin.exited) {\n proc.kill('SIGTERM')\n }\n activeLogin = null\n throw error\n }\n}\n\nasync function curlLoginCallback(callbackUrl: string): Promise<void> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), LOGIN_CALLBACK_TIMEOUT_MS)\n try {\n const response = await fetch(callbackUrl, {\n redirect: 'manual',\n signal: controller.signal,\n })\n if (response.status >= 400) {\n throw new Error(`Login callback returned HTTP ${response.status}.`)\n }\n } finally {\n clearTimeout(timer)\n }\n}\n\nasync function getActiveAuthMtimeMs(): Promise<number | null> {\n try {\n return (await stat(getActiveAuthPath())).mtimeMs\n } catch {\n return null\n }\n}\n\nasync function waitForAuthFileUpdate(previousMtimeMs: number | null): Promise<void> {\n const startedAt = Date.now()\n while (Date.now() - startedAt <= LOGIN_AUTH_FILE_TIMEOUT_MS) {\n const nextMtimeMs = await getActiveAuthMtimeMs()\n if (nextMtimeMs !== null && (previousMtimeMs === null || nextMtimeMs > previousMtimeMs)) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 250))\n }\n}\n\nfunction stopActiveLogin(): void {\n if (!activeLogin) return\n if (!activeLogin.exited) {\n activeLogin.proc.kill('SIGTERM')\n }\n activeLogin = null\n}\n\nexport async function handleAccountRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: AccountRouteContext,\n): Promise<boolean> {\n const { appServer } = context\n\n if (req.method === 'GET' && url.pathname === '/codex-api/accounts') {\n const state = await scheduleAccountsBackgroundRefresh()\n setJson(res, 200, {\n data: {\n activeAccountId: state.activeAccountId,\n accounts: sortAccounts(state.accounts, state.activeAccountId).map((entry) => toPublicAccountEntry(entry, state.activeAccountId)),\n },\n })\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/accounts/active') {\n const state = await readStoredAccountsState()\n const active = state.activeAccountId\n ? state.accounts.find((entry) => entry.accountId === state.activeAccountId) ?? null\n : null\n setJson(res, 200, {\n data: active ? toPublicAccountEntry(active, state.activeAccountId) : null,\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/refresh') {\n try {\n const imported = await importAccountFromAuthPath(getActiveAuthPath())\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const state = await readStoredAccountsState()\n const importedAccountId = imported.importedAccountId\n const target = state.accounts.find((entry) => entry.accountId === importedAccountId) ?? null\n if (!target) {\n throw new Error('account_not_found')\n }\n\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: importedAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: importedAccountId,\n accounts: nextState.accounts,\n })\n\n const backgroundState = await scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: importedAccountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== importedAccountId).map((entry) => entry.accountId),\n })\n\n setJson(res, 200, {\n data: {\n activeAccountId: importedAccountId,\n importedAccountId,\n accounts: sortAccounts(backgroundState.accounts, importedAccountId).map((entry) => toPublicAccountEntry(entry, importedAccountId)),\n },\n })\n } catch (error) {\n setJson(res, 502, {\n error: 'account_refresh_failed',\n message: getErrorMessage(error, 'Failed to refresh account'),\n })\n }\n } catch (error) {\n const message = getErrorMessage(error, 'Failed to refresh account')\n if (message === 'missing_account_id') {\n setJson(res, 400, { error: 'missing_account_id', message: 'Current auth.json is missing tokens.account_id.' })\n return true\n }\n setJson(res, 400, { error: 'invalid_auth_json', message: 'Failed to parse the current auth.json file.' })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/login/start') {\n try {\n const loginUrl = await startCodexLogin()\n setJson(res, 200, {\n ok: true,\n data: {\n loginUrl,\n },\n })\n } catch (error) {\n setJson(res, 500, {\n error: 'account_login_start_failed',\n message: getErrorMessage(error, 'Failed to start codex login'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/login/complete') {\n try {\n const payload = await readJsonBody(req)\n const callbackUrl = typeof payload?.callbackUrl === 'string' ? payload.callbackUrl.trim() : ''\n if (!callbackUrl) {\n setJson(res, 400, { error: 'missing_callback_url', message: 'Paste the localhost callback URL from the browser.' })\n return true\n }\n if (!isLocalCallbackUrl(callbackUrl)) {\n setJson(res, 400, { error: 'invalid_callback_url', message: 'The callback URL must use http://localhost or http://127.0.0.1.' })\n return true\n }\n if (!activeLogin || activeLogin.exited) {\n setJson(res, 409, { error: 'login_not_running', message: 'Start Codex login before submitting the callback URL.' })\n return true\n }\n\n const previousAuthMtimeMs = await getActiveAuthMtimeMs()\n await curlLoginCallback(callbackUrl)\n await waitForAuthFileUpdate(previousAuthMtimeMs)\n\n const imported = await importAccountFromAuthPath(getActiveAuthPath())\n stopActiveLogin()\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const state = await readStoredAccountsState()\n const importedAccountId = imported.importedAccountId\n const target = state.accounts.find((entry) => entry.accountId === importedAccountId) ?? null\n if (!target) {\n throw new Error('account_not_found')\n }\n\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: importedAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: importedAccountId,\n accounts: nextState.accounts,\n })\n\n const backgroundState = await scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: importedAccountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== importedAccountId).map((entry) => entry.accountId),\n })\n\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: importedAccountId,\n importedAccountId,\n accounts: sortAccounts(backgroundState.accounts, importedAccountId).map((entry) => toPublicAccountEntry(entry, importedAccountId)),\n },\n })\n } catch (error) {\n setJson(res, 500, {\n error: 'account_login_complete_failed',\n message: getErrorMessage(error, 'Failed to complete Codex login'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/switch') {\n try {\n if (appServer.listPendingServerRequests().length > 0) {\n setJson(res, 409, {\n error: 'account_switch_blocked',\n message: 'Finish pending approval requests before switching accounts.',\n })\n return true\n }\n\n const payload = await readJsonBody(req)\n const accountId = typeof payload?.accountId === 'string' ? payload.accountId.trim() : ''\n if (!accountId) {\n setJson(res, 400, { error: 'account_not_found', message: 'Missing accountId.' })\n return true\n }\n\n const state = await readStoredAccountsState()\n const target = state.accounts.find((entry) => entry.accountId === accountId) ?? null\n if (!target) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account was not found.' })\n return true\n }\n\n const snapshotPath = getSnapshotPath(target.storageId)\n if (!(await fileExists(snapshotPath))) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account snapshot is missing.' })\n return true\n }\n\n let previousRaw: string | null = null\n try {\n previousRaw = await readFile(getActiveAuthPath(), 'utf8')\n } catch {\n previousRaw = null\n }\n\n const targetRaw = await readFile(snapshotPath, 'utf8')\n await writeFile(getActiveAuthPath(), targetRaw, { encoding: 'utf8', mode: 0o600 })\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: accountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: accountId,\n accounts: nextState.accounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: accountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== accountId).map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: accountId,\n account: toPublicAccountEntry(nextEntry, accountId),\n },\n })\n } catch (error) {\n await restoreActiveAuth(previousRaw)\n appServer.dispose()\n await replaceStoredAccount({\n ...target,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to switch account'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, state.activeAccountId)\n setJson(res, 502, {\n error: 'account_switch_failed',\n message: getErrorMessage(error, 'Failed to switch account'),\n })\n }\n } catch (error) {\n setJson(res, 400, {\n error: 'invalid_auth_json',\n message: getErrorMessage(error, 'Failed to switch account'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/remove') {\n try {\n const payload = await readJsonBody(req)\n const accountId = typeof payload?.accountId === 'string' ? payload.accountId.trim() : ''\n if (!accountId) {\n setJson(res, 400, { error: 'account_not_found', message: 'Missing accountId.' })\n return true\n }\n\n const state = await readStoredAccountsState()\n const target = state.accounts.find((entry) => entry.accountId === accountId) ?? null\n if (!target) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account was not found.' })\n return true\n }\n\n const remainingAccounts = state.accounts.filter((entry) => entry.accountId !== accountId)\n if (state.activeAccountId !== accountId) {\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: state.activeAccountId,\n accounts: remainingAccounts,\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: state.activeAccountId,\n accounts: sortAccounts(remainingAccounts, state.activeAccountId).map((entry) => toPublicAccountEntry(entry, state.activeAccountId)),\n },\n })\n return true\n }\n\n if (appServer.listPendingServerRequests().length > 0) {\n setJson(res, 409, {\n error: 'account_remove_blocked',\n message: 'Finish pending approval requests before removing the active account.',\n })\n return true\n }\n\n let previousRaw: string | null = null\n try {\n previousRaw = await readFile(getActiveAuthPath(), 'utf8')\n } catch {\n previousRaw = null\n }\n\n const replacement = await pickReplacementActiveAccount(remainingAccounts)\n if (!replacement) {\n await restoreActiveAuth(null)\n appServer.dispose()\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: null,\n accounts: remainingAccounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n accountIds: remainingAccounts.map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: null,\n accounts: sortAccounts(remainingAccounts, null).map((entry) => toPublicAccountEntry(entry, null)),\n },\n })\n return true\n }\n\n const replacementSnapshotPath = getSnapshotPath(replacement.storageId)\n if (!(await fileExists(replacementSnapshotPath))) {\n setJson(res, 404, {\n error: 'account_not_found',\n message: 'The replacement account snapshot is missing.',\n })\n return true\n }\n\n const replacementRaw = await readFile(replacementSnapshotPath, 'utf8')\n await writeFile(getActiveAuthPath(), replacementRaw, { encoding: 'utf8', mode: 0o600 })\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const activatedReplacement: StoredAccountEntry = {\n ...replacement,\n email: inspection.metadata.email ?? replacement.email,\n planType: inspection.metadata.planType ?? replacement.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? replacement.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextAccounts = remainingAccounts.map((entry) => (\n entry.accountId === activatedReplacement.accountId ? activatedReplacement : entry\n ))\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: activatedReplacement.accountId,\n accounts: nextAccounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: activatedReplacement.accountId,\n accountIds: nextAccounts\n .filter((entry) => entry.accountId !== activatedReplacement.accountId)\n .map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: activatedReplacement.accountId,\n accounts: sortAccounts(nextAccounts, activatedReplacement.accountId)\n .map((entry) => toPublicAccountEntry(entry, activatedReplacement.accountId)),\n },\n })\n } catch (error) {\n await restoreActiveAuth(previousRaw)\n appServer.dispose()\n await replaceStoredAccount({\n ...replacement,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to switch account'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, state.activeAccountId)\n setJson(res, 502, {\n error: 'account_remove_failed',\n message: getErrorMessage(error, 'Failed to remove account'),\n })\n }\n } catch (error) {\n setJson(res, 400, {\n error: 'invalid_auth_json',\n message: getErrorMessage(error, 'Failed to remove account'),\n })\n }\n return true\n }\n\n return false\n}\n","import { spawn } from 'node:child_process'\nimport { mkdir, rm, stat, writeFile } from 'node:fs/promises'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { tmpdir } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\n\ntype ReviewScope = 'workspace' | 'baseBranch'\ntype ReviewWorkspaceView = 'unstaged' | 'staged'\ntype ReviewAction = 'stage' | 'unstage' | 'revert'\ntype ReviewActionLevel = 'all' | 'file' | 'hunk'\n\ntype ReviewDiffLine = {\n key: string\n kind: 'meta' | 'hunk' | 'add' | 'remove' | 'context'\n text: string\n oldLine: number | null\n newLine: number | null\n}\n\ntype ReviewSnapshotHunk = {\n id: string\n header: string\n patch: string\n addedLineCount: number\n removedLineCount: number\n oldStart: number | null\n oldLineCount: number\n newStart: number | null\n newLineCount: number\n lines: ReviewDiffLine[]\n}\n\ntype ReviewSnapshotFile = {\n id: string\n path: string\n absolutePath: string\n previousPath: string | null\n previousAbsolutePath: string | null\n operation: 'add' | 'delete' | 'update' | 'rename'\n addedLineCount: number\n removedLineCount: number\n diff: string\n hunks: ReviewSnapshotHunk[]\n}\n\ntype ReviewSnapshot = {\n cwd: string\n gitRoot: string | null\n isGitRepo: boolean\n scope: ReviewScope\n workspaceView: ReviewWorkspaceView\n baseBranch: string | null\n baseBranchOptions: string[]\n headBranch: string | null\n mergeBaseSha: string | null\n generatedAtIso: string\n summary: {\n fileCount: number\n addedLineCount: number\n removedLineCount: number\n }\n files: ReviewSnapshotFile[]\n}\n\ntype ReviewRouteContext = {\n readJsonBody: (req: IncomingMessage) => Promise<unknown>\n}\n\ntype CommandResult = {\n code: number\n stdout: string\n stderr: string\n}\n\ntype DetectedBaseBranch = {\n displayName: string\n gitRef: string\n}\n\nfunction normalizeBaseBranchDisplayName(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n return trimmed.startsWith('origin/') ? trimmed.slice('origin/'.length) : trimmed\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const direct = readString(record.error)\n if (direct) return direct\n\n const nested = asRecord(record.error)\n const nestedMessage = readString(nested?.message)\n if (nestedMessage) return nestedMessage\n\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nasync function runCommandResult(\n command: string,\n args: string[],\n options: { cwd?: string } = {},\n): Promise<CommandResult> {\n return await new Promise<CommandResult>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n resolve({\n code: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n })\n })\n })\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): Promise<void> {\n const result = await runCommandResult(command, args, options)\n if (result.code === 0) return\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (${command} ${args.join(' ')})${suffix}`)\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n const result = await runCommandResult(command, args, options)\n if (result.code === 0) return result.stdout\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (${command} ${args.join(' ')})${suffix}`)\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"ambiguous argument 'head'\") ||\n message.includes(\"bad revision 'head'\") ||\n message.includes('unknown revision or path not in the working tree') ||\n message.includes(\"not a valid object name 'head'\") ||\n message.includes('not a valid object name: head')\n )\n}\n\nfunction normalizeInputCwd(value: string): string {\n return isAbsolute(value) ? value : resolve(value)\n}\n\nasync function ensureDirectory(cwd: string): Promise<void> {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n throw new Error('cwd is not a directory')\n }\n}\n\nasync function resolveGitRoot(cwd: string): Promise<string | null> {\n try {\n return await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n } catch (error) {\n if (isNotGitRepositoryError(error)) {\n return null\n }\n throw error\n }\n}\n\nasync function gitRefExists(repoRoot: string, ref: string): Promise<boolean> {\n const result = await runCommandResult('git', ['rev-parse', '--verify', '--quiet', ref], { cwd: repoRoot })\n return result.code === 0\n}\n\nasync function detectBaseBranch(repoRoot: string): Promise<DetectedBaseBranch | null> {\n const originHead = await runCommandResult('git', ['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'], { cwd: repoRoot })\n const originHeadRef = originHead.code === 0 ? originHead.stdout : ''\n if (originHeadRef.startsWith('origin/')) {\n return {\n displayName: originHeadRef.slice('origin/'.length),\n gitRef: originHeadRef,\n }\n }\n\n for (const candidate of ['main', 'master']) {\n if (await gitRefExists(repoRoot, candidate)) {\n return { displayName: candidate, gitRef: candidate }\n }\n const remoteCandidate = `origin/${candidate}`\n if (await gitRefExists(repoRoot, remoteCandidate)) {\n return { displayName: candidate, gitRef: remoteCandidate }\n }\n }\n\n return null\n}\n\nasync function listBaseBranchOptions(repoRoot: string): Promise<string[]> {\n const result = await runCommandResult(\n 'git',\n ['for-each-ref', '--format=%(refname:short)', 'refs/heads', 'refs/remotes/origin'],\n { cwd: repoRoot },\n )\n if (result.code !== 0) {\n return []\n }\n\n const options: string[] = []\n for (const line of result.stdout.split(/\\r?\\n/u)) {\n const normalized = normalizeBaseBranchDisplayName(line)\n if (!normalized || normalized === 'HEAD' || normalized.endsWith('/HEAD')) continue\n if (!options.includes(normalized)) {\n options.push(normalized)\n }\n }\n\n for (const fallback of ['main', 'master']) {\n if (!options.includes(fallback)) {\n options.push(fallback)\n }\n }\n\n return options\n}\n\nasync function resolveBaseBranch(repoRoot: string, requestedBaseBranch = ''): Promise<DetectedBaseBranch | null> {\n const normalizedRequested = normalizeBaseBranchDisplayName(requestedBaseBranch)\n if (normalizedRequested) {\n for (const candidate of [normalizedRequested, `origin/${normalizedRequested}`]) {\n if (await gitRefExists(repoRoot, candidate)) {\n return {\n displayName: normalizedRequested,\n gitRef: candidate,\n }\n }\n }\n }\n\n return await detectBaseBranch(repoRoot)\n}\n\nasync function detectHeadBranch(repoRoot: string): Promise<string | null> {\n const result = await runCommandResult('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], { cwd: repoRoot })\n return result.code === 0 && result.stdout !== 'HEAD' ? result.stdout : null\n}\n\nfunction parseUntrackedPaths(statusOutput: string): string[] {\n const paths: string[] = []\n for (const line of statusOutput.split(/\\r?\\n/u)) {\n if (!line.startsWith('?? ')) continue\n const path = line.slice(3).trim()\n if (path && !paths.includes(path)) {\n paths.push(path)\n }\n }\n return paths\n}\n\nasync function diffUntrackedFile(repoRoot: string, path: string): Promise<string> {\n const result = await runCommandResult(\n 'git',\n ['diff', '--no-index', '--no-ext-diff', '--patch', '--', '/dev/null', path],\n { cwd: repoRoot },\n )\n\n if (result.code !== 0 && result.code !== 1) {\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (git diff --no-index -- /dev/null ${path})${suffix}`)\n }\n\n return result.stdout\n}\n\nasync function buildWorkspaceDiff(repoRoot: string, workspaceView: ReviewWorkspaceView): Promise<string> {\n if (workspaceView === 'staged') {\n try {\n return await runCommandCapture('git', ['diff', '--cached', '--no-ext-diff', '--find-renames', '--patch'], { cwd: repoRoot })\n } catch (error) {\n if (isMissingHeadError(error)) {\n return ''\n }\n throw error\n }\n }\n\n let trackedDiff = ''\n try {\n trackedDiff = await runCommandCapture('git', ['diff', '--no-ext-diff', '--find-renames', '--patch'], { cwd: repoRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) {\n throw error\n }\n }\n\n const statusOutput = await runCommandCapture('git', ['status', '--porcelain=v1', '--untracked-files=all'], { cwd: repoRoot })\n const untrackedDiffs = await Promise.all(\n parseUntrackedPaths(statusOutput).map(async (path) => await diffUntrackedFile(repoRoot, path)),\n )\n\n return [trackedDiff, ...untrackedDiffs]\n .map((chunk) => chunk.trim())\n .filter(Boolean)\n .join('\\n')\n}\n\nasync function buildBaseBranchDiff(\n repoRoot: string,\n baseBranch: DetectedBaseBranch,\n): Promise<{ diffText: string; mergeBaseSha: string | null }> {\n const mergeBaseResult = await runCommandResult('git', ['merge-base', 'HEAD', baseBranch.gitRef], { cwd: repoRoot })\n if (mergeBaseResult.code !== 0 || !mergeBaseResult.stdout) {\n return { diffText: '', mergeBaseSha: null }\n }\n\n const diffText = await runCommandCapture(\n 'git',\n ['diff', '--no-ext-diff', '--find-renames', '--patch', mergeBaseResult.stdout, 'HEAD'],\n { cwd: repoRoot },\n )\n\n return {\n diffText,\n mergeBaseSha: mergeBaseResult.stdout,\n }\n}\n\nfunction normalizeDiffPath(value: string): string | null {\n const trimmed = value.trim()\n if (!trimmed || trimmed === '/dev/null') return null\n if (trimmed.startsWith('a/') || trimmed.startsWith('b/')) {\n return trimmed.slice(2)\n }\n return trimmed\n}\n\nfunction filePathFromDiffHeader(line: string, side: 'old' | 'new'): string | null {\n const prefix = side === 'old' ? '--- ' : '+++ '\n if (!line.startsWith(prefix)) return null\n return normalizeDiffPath(line.slice(prefix.length))\n}\n\nfunction parseDiffGitLine(line: string): { oldPath: string | null; newPath: string | null } {\n const match = line.match(/^diff --git a\\/(.+?) b\\/(.+)$/u)\n if (!match) return { oldPath: null, newPath: null }\n return {\n oldPath: normalizeDiffPath(`a/${match[1]}`),\n newPath: normalizeDiffPath(`b/${match[2]}`),\n }\n}\n\nfunction buildReviewDiffLines(fileId: string, hunkId: string, lines: string[]): {\n addedLineCount: number\n removedLineCount: number\n lines: ReviewDiffLine[]\n} {\n const output: ReviewDiffLine[] = []\n let addedLineCount = 0\n let removedLineCount = 0\n let oldLine: number | null = null\n let newLine: number | null = null\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (index === 0) {\n const match = line.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/u)\n if (match) {\n oldLine = Number(match[1])\n newLine = Number(match[3])\n }\n output.push({\n key: `${fileId}:${hunkId}:header`,\n kind: 'hunk',\n text: line,\n oldLine: null,\n newLine: null,\n })\n continue\n }\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n output.push({\n key: `${fileId}:${hunkId}:add:${index}`,\n kind: 'add',\n text: line.slice(1),\n oldLine: null,\n newLine,\n })\n addedLineCount += 1\n newLine = newLine === null ? null : newLine + 1\n continue\n }\n\n if (line.startsWith('-') && !line.startsWith('---')) {\n output.push({\n key: `${fileId}:${hunkId}:remove:${index}`,\n kind: 'remove',\n text: line.slice(1),\n oldLine,\n newLine: null,\n })\n removedLineCount += 1\n oldLine = oldLine === null ? null : oldLine + 1\n continue\n }\n\n if (line.startsWith('\\\\')) {\n output.push({\n key: `${fileId}:${hunkId}:meta:${index}`,\n kind: 'meta',\n text: line,\n oldLine: null,\n newLine: null,\n })\n continue\n }\n\n output.push({\n key: `${fileId}:${hunkId}:context:${index}`,\n kind: 'context',\n text: line.startsWith(' ') ? line.slice(1) : line,\n oldLine,\n newLine,\n })\n oldLine = oldLine === null ? null : oldLine + 1\n newLine = newLine === null ? null : newLine + 1\n }\n\n return { addedLineCount, removedLineCount, lines: output }\n}\n\nfunction parseDiffBlocks(diffText: string): string[][] {\n const normalized = diffText.replace(/\\r\\n/g, '\\n').trim()\n if (!normalized) return []\n\n const blocks: string[][] = []\n let current: string[] = []\n for (const line of normalized.split('\\n')) {\n if (line.startsWith('diff --git ')) {\n if (current.length > 0) {\n blocks.push(current)\n }\n current = [line]\n continue\n }\n if (current.length > 0) {\n current.push(line)\n }\n }\n if (current.length > 0) {\n blocks.push(current)\n }\n return blocks\n}\n\nfunction serializePatch(lines: string[]): string {\n if (lines.length === 0) return ''\n return `${lines.join('\\n')}\\n`\n}\n\nfunction parseReviewSnapshotFile(repoRoot: string, blockLines: string[], fileIndex: number): ReviewSnapshotFile | null {\n if (blockLines.length === 0) return null\n\n let oldPath: string | null = null\n let newPath: string | null = null\n let renameFrom: string | null = null\n let renameTo: string | null = null\n let operation: ReviewSnapshotFile['operation'] = 'update'\n\n const firstHunkIndex = blockLines.findIndex((line) => line.startsWith('@@ '))\n const headerLines = firstHunkIndex >= 0 ? blockLines.slice(0, firstHunkIndex) : [...blockLines]\n\n for (const line of headerLines) {\n if (line.startsWith('diff --git ')) {\n const parsed = parseDiffGitLine(line)\n oldPath = parsed.oldPath ?? oldPath\n newPath = parsed.newPath ?? newPath\n continue\n }\n if (line.startsWith('rename from ')) {\n renameFrom = normalizeDiffPath(line.slice('rename from '.length))\n operation = 'rename'\n continue\n }\n if (line.startsWith('rename to ')) {\n renameTo = normalizeDiffPath(line.slice('rename to '.length))\n operation = 'rename'\n continue\n }\n if (line.startsWith('new file mode ')) {\n operation = 'add'\n continue\n }\n if (line.startsWith('deleted file mode ')) {\n operation = 'delete'\n continue\n }\n const headerOldPath = filePathFromDiffHeader(line, 'old')\n if (headerOldPath !== null) {\n oldPath = headerOldPath\n continue\n }\n const headerNewPath = filePathFromDiffHeader(line, 'new')\n if (headerNewPath !== null) {\n newPath = headerNewPath\n }\n }\n\n const previousPath = renameFrom ?? oldPath\n const resolvedPath = renameTo ?? newPath ?? oldPath\n if (!resolvedPath) return null\n\n if (operation === 'update') {\n if (!previousPath) {\n operation = 'add'\n } else if (!newPath) {\n operation = 'delete'\n }\n }\n\n const hunks: ReviewSnapshotHunk[] = []\n if (firstHunkIndex >= 0) {\n let currentHunk: string[] = []\n let hunkCounter = 0\n const flushHunk = () => {\n if (currentHunk.length === 0) return\n const header = currentHunk[0] ?? ''\n const match = header.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/u)\n const hunkId = `review-hunk:${fileIndex}:${hunkCounter}`\n const rendered = buildReviewDiffLines(`review-file:${fileIndex}`, hunkId, currentHunk)\n hunks.push({\n id: hunkId,\n header,\n patch: serializePatch([...headerLines, ...currentHunk]),\n addedLineCount: rendered.addedLineCount,\n removedLineCount: rendered.removedLineCount,\n oldStart: match ? Number(match[1]) : null,\n oldLineCount: match ? Number(match[2] ?? '1') : 0,\n newStart: match ? Number(match[3]) : null,\n newLineCount: match ? Number(match[4] ?? '1') : 0,\n lines: rendered.lines,\n })\n currentHunk = []\n hunkCounter += 1\n }\n\n for (let index = firstHunkIndex; index < blockLines.length; index += 1) {\n const line = blockLines[index] ?? ''\n if (line.startsWith('@@ ')) {\n flushHunk()\n currentHunk = [line]\n continue\n }\n if (currentHunk.length > 0) {\n currentHunk.push(line)\n }\n }\n flushHunk()\n }\n\n const addedLineCount = hunks.reduce((sum, hunk) => sum + hunk.addedLineCount, 0)\n const removedLineCount = hunks.reduce((sum, hunk) => sum + hunk.removedLineCount, 0)\n\n return {\n id: `review-file:${fileIndex}`,\n path: resolvedPath,\n absolutePath: join(repoRoot, resolvedPath),\n previousPath: previousPath && previousPath !== resolvedPath ? previousPath : null,\n previousAbsolutePath: previousPath && previousPath !== resolvedPath ? join(repoRoot, previousPath) : null,\n operation,\n addedLineCount,\n removedLineCount,\n diff: serializePatch(blockLines),\n hunks,\n }\n}\n\nfunction parseReviewSnapshotFiles(repoRoot: string, diffText: string): ReviewSnapshotFile[] {\n return parseDiffBlocks(diffText)\n .map((block, index) => parseReviewSnapshotFile(repoRoot, block, index))\n .filter((entry): entry is ReviewSnapshotFile => entry !== null)\n}\n\nasync function buildReviewSnapshot(\n cwd: string,\n scope: ReviewScope,\n workspaceView: ReviewWorkspaceView,\n requestedBaseBranch = '',\n): Promise<ReviewSnapshot> {\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n\n const gitRoot = await resolveGitRoot(normalizedCwd)\n if (!gitRoot) {\n return {\n cwd: normalizedCwd,\n gitRoot: null,\n isGitRepo: false,\n scope,\n workspaceView,\n baseBranch: null,\n baseBranchOptions: [],\n headBranch: null,\n mergeBaseSha: null,\n generatedAtIso: new Date().toISOString(),\n summary: {\n fileCount: 0,\n addedLineCount: 0,\n removedLineCount: 0,\n },\n files: [],\n }\n }\n\n const [baseBranch, baseBranchOptions, headBranch] = await Promise.all([\n resolveBaseBranch(gitRoot, requestedBaseBranch),\n listBaseBranchOptions(gitRoot),\n detectHeadBranch(gitRoot),\n ])\n\n let diffText = ''\n let mergeBaseSha: string | null = null\n\n if (scope === 'baseBranch') {\n if (baseBranch) {\n const baseDiff = await buildBaseBranchDiff(gitRoot, baseBranch)\n diffText = baseDiff.diffText\n mergeBaseSha = baseDiff.mergeBaseSha\n }\n } else {\n diffText = await buildWorkspaceDiff(gitRoot, workspaceView)\n }\n\n const files = parseReviewSnapshotFiles(gitRoot, diffText)\n return {\n cwd: normalizedCwd,\n gitRoot,\n isGitRepo: true,\n scope,\n workspaceView,\n baseBranch: baseBranch?.displayName ?? null,\n baseBranchOptions,\n headBranch,\n mergeBaseSha,\n generatedAtIso: new Date().toISOString(),\n summary: {\n fileCount: files.length,\n addedLineCount: files.reduce((sum, file) => sum + file.addedLineCount, 0),\n removedLineCount: files.reduce((sum, file) => sum + file.removedLineCount, 0),\n },\n files,\n }\n}\n\nasync function writePatchFile(patch: string): Promise<string> {\n const dir = await mkdir(join(tmpdir(), 'codexui-review-patches'), { recursive: true }).then(() => join(tmpdir(), 'codexui-review-patches'))\n const filePath = join(dir, `${Date.now()}-${Math.random().toString(16).slice(2)}.patch`)\n const normalizedPatch = patch.endsWith('\\n') ? patch : `${patch}\\n`\n await writeFile(filePath, normalizedPatch, 'utf8')\n return filePath\n}\n\nasync function applyPatchAction(\n repoRoot: string,\n action: ReviewAction,\n workspaceView: ReviewWorkspaceView,\n patch: string,\n): Promise<void> {\n const patchPath = await writePatchFile(patch)\n try {\n if (workspaceView === 'unstaged' && action === 'stage') {\n await runCommand('git', ['apply', '--cached', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n if (workspaceView === 'unstaged' && action === 'revert') {\n await runCommand('git', ['apply', '-R', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n if (workspaceView === 'staged' && action === 'unstage') {\n await runCommand('git', ['apply', '--cached', '-R', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n throw new Error('Unsupported patch action for this view')\n } finally {\n await rm(patchPath, { force: true })\n }\n}\n\nasync function applyAllAction(repoRoot: string, action: ReviewAction, workspaceView: ReviewWorkspaceView): Promise<void> {\n if (workspaceView === 'unstaged' && action === 'stage') {\n await runCommand('git', ['add', '-A'], { cwd: repoRoot })\n return\n }\n\n if (workspaceView === 'unstaged' && action === 'revert') {\n try {\n await runCommand('git', ['restore', '--worktree', '--source=HEAD', '--', '.'], { cwd: repoRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) {\n throw error\n }\n }\n await runCommand('git', ['clean', '-fd', '--', '.'], { cwd: repoRoot })\n return\n }\n\n if (workspaceView === 'staged' && action === 'unstage') {\n await runCommand('git', ['restore', '--staged', '--', '.'], { cwd: repoRoot })\n return\n }\n\n throw new Error('Unsupported bulk action for this view')\n}\n\nasync function initializeGitRepository(cwd: string): Promise<void> {\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n await runCommand('git', ['init'], { cwd: normalizedCwd })\n}\n\nasync function applyReviewAction(payload: unknown): Promise<ReviewSnapshot> {\n const record = asRecord(payload)\n if (!record) {\n throw new Error('Invalid body: expected object')\n }\n\n const cwd = readString(record.cwd)\n const scope = record.scope === 'baseBranch' ? 'baseBranch' : 'workspace'\n const workspaceView = record.workspaceView === 'staged' ? 'staged' : 'unstaged'\n const action = readString(record.action)\n const level = readString(record.level)\n const patch = typeof record.patch === 'string' ? record.patch : ''\n\n if (!cwd) {\n throw new Error('Missing cwd')\n }\n if (scope !== 'workspace') {\n throw new Error('Review actions are only available for workspace changes')\n }\n if (action !== 'stage' && action !== 'unstage' && action !== 'revert') {\n throw new Error('Invalid review action')\n }\n if (level !== 'all' && level !== 'file' && level !== 'hunk') {\n throw new Error('Invalid review action level')\n }\n\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n const repoRoot = await resolveGitRoot(normalizedCwd)\n if (!repoRoot) {\n throw new Error('Not a Git repository')\n }\n\n if (level === 'all') {\n await applyAllAction(repoRoot, action, workspaceView)\n } else {\n if (!patch.trim()) {\n throw new Error('Missing patch payload')\n }\n await applyPatchAction(repoRoot, action, workspaceView, patch)\n }\n\n return await buildReviewSnapshot(normalizedCwd, scope, workspaceView)\n}\n\nexport async function handleReviewRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: ReviewRouteContext,\n): Promise<boolean> {\n if (req.method === 'GET' && url.pathname === '/codex-api/review/snapshot') {\n const cwd = url.searchParams.get('cwd')?.trim() ?? ''\n const scope = url.searchParams.get('scope') === 'baseBranch' ? 'baseBranch' : 'workspace'\n const workspaceView = url.searchParams.get('workspaceView') === 'staged' ? 'staged' : 'unstaged'\n const baseBranch = url.searchParams.get('baseBranch')?.trim() ?? ''\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return true\n }\n\n try {\n setJson(res, 200, {\n data: await buildReviewSnapshot(cwd, scope, workspaceView, baseBranch),\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load review snapshot') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/review/action') {\n try {\n const payload = await context.readJsonBody(req)\n setJson(res, 200, {\n data: await applyReviewAction(payload),\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to apply review action') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/review/git/init') {\n const payload = asRecord(await context.readJsonBody(req))\n const cwd = readString(payload?.cwd)\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return true\n }\n\n try {\n await initializeGitRepository(cwd)\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to initialize Git') })\n }\n return true\n }\n\n return false\n}\n","import { spawn } from 'node:child_process'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\nimport { resolvePythonCommand, resolveSkillInstallerScriptPath } from '../commandResolution.js'\nimport { getSpawnInvocation } from '../utils/commandInvocation.js'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n}\n\ntype ReadJsonBody = (req: IncomingMessage) => Promise<unknown>\n\ntype SkillRouteContext = {\n appServer: AppServerLike\n readJsonBody: ReadJsonBody\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n if (!record) return fallback\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction splitAbsolutePath(pathValue: string): string[] {\n return pathValue.split('/').filter(Boolean)\n}\n\nfunction buildAbsolutePath(parts: string[]): string {\n return `/${parts.join('/')}`\n}\n\nfunction normalizeSkillMarkdownPath(skillPath: string): string {\n if (!skillPath) return ''\n return skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n}\n\nfunction deriveSkillPathInfo(\n skillPath: string,\n knownPaths: Set<string> = new Set(),\n): {\n normalizedPath: string\n rootSkillPath: string\n rootSkillName: string\n installDir: string\n isNestedSkill: boolean\n} | null {\n const normalizedPath = normalizeSkillMarkdownPath(skillPath)\n const parts = splitAbsolutePath(normalizedPath)\n if (parts.length < 2) return null\n\n const pluginSkillsIndex = parts.lastIndexOf('skills')\n if (pluginSkillsIndex >= 2) {\n const pluginName = parts[pluginSkillsIndex - 2] ?? ''\n if (pluginName) {\n const rootSkillPath = buildAbsolutePath([...parts.slice(0, pluginSkillsIndex + 1), pluginName, 'SKILL.md'])\n if (knownPaths.has(rootSkillPath)) {\n return {\n normalizedPath,\n rootSkillPath,\n rootSkillName: pluginName,\n installDir: buildAbsolutePath(parts.slice(0, pluginSkillsIndex + 1)),\n isNestedSkill: normalizedPath !== rootSkillPath,\n }\n }\n }\n }\n\n const firstSkillsIndex = parts.indexOf('skills')\n if (firstSkillsIndex < 0 || firstSkillsIndex + 1 >= parts.length - 1) return null\n const rootSkillName = parts[firstSkillsIndex + 1] ?? ''\n if (!rootSkillName) return null\n const rootParts = parts.slice(0, firstSkillsIndex + 2)\n const installDirParts = parts.slice(0, firstSkillsIndex + 1)\n return {\n normalizedPath,\n rootSkillPath: buildAbsolutePath([...rootParts, 'SKILL.md']),\n rootSkillName,\n installDir: buildAbsolutePath(installDirParts),\n isNestedSkill: normalizedPath !== buildAbsolutePath([...rootParts, 'SKILL.md']),\n }\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nfunction getSharedSkillsInstallDir(): string {\n return join(getSkillsInstallDir(), 'shared_skills')\n}\n\nconst DEFAULT_COMMAND_TIMEOUT_MS = 120_000\nconst SKILL_SEARCH_METADATA_LIMIT = 20\nconst SKILL_SEARCH_METADATA_CONCURRENCY = 4\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<void> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n await new Promise<void>((resolve, reject) => {\n const invocation = getSpawnInvocation(command, args)\n const proc = spawn(invocation.command, invocation.args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<string> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n return await new Promise<string>((resolve, reject) => {\n const invocation = getSpawnInvocation(command, args)\n const proc = spawn(invocation.command, invocation.args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms)\n promise.then(\n (val) => { clearTimeout(timer); resolve(val) },\n (err) => { clearTimeout(timer); reject(err) },\n )\n })\n}\n\nasync function detectUserSkillsDir(appServer: AppServerLike): Promise<string> {\n try {\n const result = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ scope?: string; path?: string }> }>\n }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.scope !== 'user' || !skill.path) continue\n const skillInfo = deriveSkillPathInfo(skill.path)\n if (!skillInfo) continue\n return skillInfo.installDir\n }\n }\n } catch {}\n return getSkillsInstallDir()\n}\n\nasync function ensureInstalledSkillIsValid(appServer: AppServerLike, skillPath: string): Promise<void> {\n const result = (await appServer.rpc('skills/list', { forceReload: true })) as {\n data?: Array<{ errors?: Array<{ path?: string; message?: string }> }>\n }\n const normalized = skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n for (const entry of result.data ?? []) {\n for (const error of entry.errors ?? []) {\n if (error.path === normalized) {\n throw new Error(error.message || 'Installed skill is invalid')\n }\n }\n }\n}\n\ntype SkillHubEntry = {\n name: string\n owner: string\n description: string\n displayName: string\n publishedAt: number\n avatarUrl: string\n url: string\n installed: boolean\n source?: string\n path?: string\n enabled?: boolean\n installCountLabel?: string\n}\n\nasync function runGitFetchWithRefLockRetry(repoDir: string, args: string[] = ['fetch', 'origin']): Promise<void> {\n try {\n await runCommand('git', args, { cwd: repoDir })\n } catch (error) {\n const message = getErrorMessage(error, '')\n if (!message.includes(\"cannot lock ref 'refs/remotes/origin/\")) throw error\n const branchMatch = message.match(/refs\\/remotes\\/origin\\/([^\\s':]+)/)\n if (!branchMatch?.[1]) throw error\n const refPath = join(repoDir, '.git', 'refs', 'remotes', 'origin', branchMatch[1])\n try { await rm(refPath, { force: true }) } catch {}\n await runCommand('git', args, { cwd: repoDir })\n }\n}\n\nasync function buildLocalHubEntry(info: InstalledSkillInfo): Promise<SkillHubEntry> {\n let description = ''\n if (info.path) {\n try {\n description = extractSkillDescriptionFromMarkdown(await readFile(info.path, 'utf8'))\n } catch {}\n }\n return {\n name: info.name,\n owner: 'local',\n description,\n displayName: '',\n publishedAt: 0,\n avatarUrl: '',\n url: '',\n installed: true,\n path: info.path,\n enabled: info.enabled,\n }\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/gu, '')\n}\n\nfunction parseNpxSkillsFindOutput(output: string, installedMap: Map<string, InstalledSkillInfo>): SkillHubEntry[] {\n const lines = stripAnsi(output).split(/\\r?\\n/u).map((line) => line.trim()).filter(Boolean)\n const results: SkillHubEntry[] = []\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n const match = line.match(/^(.+?@[^@\\s]+)\\s+([\\d.]+[KMB]?)\\s+installs$/iu)\n if (!match) continue\n const source = match[1]?.trim() ?? ''\n const installs = match[2]?.trim() ?? ''\n const atIndex = source.lastIndexOf('@')\n if (atIndex <= 0 || atIndex >= source.length - 1) continue\n const owner = source.slice(0, atIndex)\n const name = source.slice(atIndex + 1)\n let url = ''\n const next = lines[index + 1] ?? ''\n const urlMatch = next.match(/(?:^└\\s*)?(https?:\\/\\/\\S+)$/u)\n if (urlMatch?.[1]) {\n url = urlMatch[1]\n index += 1\n }\n const installedInfo = installedMap.get(name)\n results.push({\n name,\n owner,\n displayName: name,\n description: installs ? `${installs} installs` : '',\n installCountLabel: installs ? `${installs} installs` : '',\n publishedAt: 0,\n avatarUrl: '',\n url,\n installed: Boolean(installedInfo),\n source,\n path: installedInfo?.path,\n enabled: installedInfo?.enabled,\n })\n }\n return results\n}\n\nfunction parseGithubSkillSource(source: string): { ownerRepo: string; skillName: string } | null {\n const atIndex = source.lastIndexOf('@')\n if (atIndex <= 0 || atIndex >= source.length - 1) return null\n const ownerRepo = source.slice(0, atIndex).trim()\n const skillName = source.slice(atIndex + 1).trim()\n const ownerRepoParts = ownerRepo.split('/').filter(Boolean)\n if (ownerRepoParts.length !== 2 || skillName.length === 0) return null\n if (ownerRepoParts.some((part) => part.includes(':') || part.includes(' '))) return null\n return { ownerRepo, skillName }\n}\n\nfunction getGithubOwnerAvatarUrl(source: string): string {\n const parsed = parseGithubSkillSource(source)\n if (!parsed) return ''\n const owner = parsed.ownerRepo.split('/')[0] ?? ''\n return owner ? `https://github.com/${encodeURIComponent(owner)}.png?size=64` : ''\n}\n\nfunction buildGithubSkillRawCandidates(source: string): string[] {\n const parsed = parseGithubSkillSource(source)\n if (!parsed) return []\n const ownerRepo = parsed.ownerRepo.split('/').map(encodeURIComponent).join('/')\n const skillName = encodeURIComponent(parsed.skillName)\n const branches = ['main', 'master']\n const paths = [\n `skills/${skillName}/SKILL.md`,\n `${skillName}/SKILL.md`,\n 'SKILL.md',\n ]\n return branches.flatMap((branch) => paths.map((path) => `https://raw.githubusercontent.com/${ownerRepo}/${branch}/${path}`))\n}\n\nasync function fetchTextWithTimeout(url: string, timeoutMs: number): Promise<string> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const resp = await fetch(url, {\n headers: { 'User-Agent': 'codex-web-local' },\n signal: controller.signal,\n })\n if (!resp.ok) return ''\n return await resp.text()\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction resolveSkillIconUrl(icon: string, markdownUrl: string): string {\n const value = icon.trim().replace(/^['\"]|['\"]$/gu, '')\n if (!value) return ''\n if (/^https?:\\/\\//iu.test(value)) return value\n try {\n return new URL(value, markdownUrl).toString()\n } catch {\n return ''\n }\n}\n\nasync function fetchGithubSkillMetadata(source: string): Promise<Partial<Pick<SkillHubEntry, 'avatarUrl' | 'description'>>> {\n for (const candidate of buildGithubSkillRawCandidates(source)) {\n try {\n const markdown = await fetchTextWithTimeout(candidate, 4_000)\n if (!markdown) continue\n const description = extractSkillDescriptionFromMarkdown(markdown)\n const icon = extractSkillFrontmatterField(markdown, 'icon')\n const avatarUrl = icon ? resolveSkillIconUrl(icon, candidate) : getGithubOwnerAvatarUrl(source)\n if (description || avatarUrl) return { description, avatarUrl }\n } catch {}\n }\n return { avatarUrl: getGithubOwnerAvatarUrl(source) }\n}\n\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n mapper: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length)\n let nextIndex = 0\n const workerCount = Math.max(1, Math.min(concurrency, items.length))\n await Promise.all(Array.from({ length: workerCount }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex\n nextIndex += 1\n results[index] = await mapper(items[index] as T, index)\n }\n }))\n return results\n}\n\nasync function enrichSkillSearchDescriptions(results: SkillHubEntry[]): Promise<SkillHubEntry[]> {\n const enrichedHead = await mapWithConcurrency(\n results.slice(0, SKILL_SEARCH_METADATA_LIMIT),\n SKILL_SEARCH_METADATA_CONCURRENCY,\n async (result) => {\n if (!result.source) return result\n const metadata = await fetchGithubSkillMetadata(result.source)\n return {\n ...result,\n description: metadata.description || result.description,\n avatarUrl: metadata.avatarUrl || result.avatarUrl,\n }\n },\n )\n return [...enrichedHead, ...results.slice(SKILL_SEARCH_METADATA_LIMIT)]\n}\n\ntype RpcSkillRecord = {\n name?: string\n description?: string\n shortDescription?: string\n path?: string\n scope?: string\n enabled?: boolean\n}\n\nfunction groupRpcSkillRecords<T extends RpcSkillRecord>(skills: T[]): T[] {\n const normalizedPathSet = new Set(\n skills\n .map((skill) => normalizeSkillMarkdownPath(typeof skill.path === 'string' ? skill.path : ''))\n .filter(Boolean),\n )\n const grouped = new Map<string, { preferred: T; hasRoot: boolean; anyEnabled: boolean }>()\n\n for (const skill of skills) {\n const rawPath = typeof skill.path === 'string' ? skill.path : ''\n const pathInfo = rawPath ? deriveSkillPathInfo(rawPath, normalizedPathSet) : null\n const groupingKey = pathInfo && pathInfo.isNestedSkill && normalizedPathSet.has(pathInfo.rootSkillPath)\n ? pathInfo.rootSkillPath\n : (pathInfo?.normalizedPath || rawPath || `${skill.scope ?? ''}:${skill.name ?? ''}`)\n const existing = grouped.get(groupingKey)\n const isRootEntry = pathInfo?.normalizedPath === groupingKey\n const groupedName = pathInfo && groupingKey === pathInfo.rootSkillPath\n ? pathInfo.rootSkillName\n : skill.name\n\n if (!existing) {\n grouped.set(groupingKey, {\n preferred: isRootEntry\n ? {\n ...skill,\n name: groupedName,\n path: groupingKey,\n }\n : {\n ...skill,\n name: groupedName,\n path: groupingKey,\n },\n hasRoot: isRootEntry,\n anyEnabled: skill.enabled !== false,\n })\n continue\n }\n\n existing.anyEnabled = existing.anyEnabled || skill.enabled !== false\n if (!existing.hasRoot && isRootEntry) {\n existing.preferred = {\n ...skill,\n name: groupedName,\n path: groupingKey,\n }\n existing.hasRoot = true\n continue\n }\n if (!existing.preferred.description && skill.description) {\n existing.preferred = { ...existing.preferred, description: skill.description }\n }\n if (!existing.preferred.shortDescription && skill.shortDescription) {\n existing.preferred = { ...existing.preferred, shortDescription: skill.shortDescription }\n }\n }\n\n return Array.from(grouped.values()).map(({ preferred, anyEnabled }) => ({\n ...preferred,\n enabled: preferred.enabled ?? anyEnabled,\n }))\n}\n\ntype InstalledSkillInfo = { name: string; path: string; enabled: boolean }\ntype SyncedSkill = { owner?: string; name: string; enabled: boolean }\n\ntype SkillsSyncState = {\n githubToken?: string\n githubUsername?: string\n repoOwner?: string\n repoName?: string\n installedOwners?: Record<string, string>\n lastPullCommitSha?: string\n lastPushCommitSha?: string\n lastSyncAttemptCount?: number\n lastSyncError?: string\n lastSyncAtIso?: string\n}\n\ntype GithubDeviceCodeResponse = {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n\ntype GithubTokenResponse = { access_token?: string; error?: string }\n\nconst GITHUB_DEVICE_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nconst DEFAULT_SKILLS_SYNC_REPO_NAME = 'codexskills'\nconst SKILLS_SYNC_MANIFEST_PATH = 'installed-skills.json'\nconst SYNC_UPSTREAM_SKILLS_OWNER = 'OpenClawAndroid'\nconst SYNC_UPSTREAM_SKILLS_REPO = 'skills'\nconst PRIVATE_SYNC_BRANCH = 'main'\nconst PUBLIC_UPSTREAM_BRANCH_ANDROID = 'android'\nconst PUBLIC_UPSTREAM_BRANCH_DEFAULT = 'main'\nlet startupSkillsSyncInitialized = false\n\ntype StartupSyncStatus = {\n inProgress: boolean\n mode: 'unauthenticated-bootstrap' | 'authenticated-fork-sync' | 'idle'\n branch: string\n lastAction: string\n lastRunAtIso: string\n lastSuccessAtIso: string\n lastError: string\n}\n\nconst startupSyncStatus: StartupSyncStatus = {\n inProgress: false,\n mode: 'idle',\n branch: PRIVATE_SYNC_BRANCH,\n lastAction: 'not-started',\n lastRunAtIso: '',\n lastSuccessAtIso: '',\n lastError: '',\n}\n\nasync function scanInstalledSkillsFromDir(skillsDir: string): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue\n const skillMd = join(skillsDir, entry.name, 'SKILL.md')\n try {\n await stat(skillMd)\n map.set(entry.name, { name: entry.name, path: skillMd, enabled: true })\n } catch {}\n }\n } catch {}\n return map\n}\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n return await scanInstalledSkillsFromDir(getSkillsInstallDir())\n}\n\nasync function collectInstalledSkillsMap(appServer: AppServerLike): Promise<Map<string, InstalledSkillInfo>> {\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = await appServer.rpc('skills/list', {}) as { data?: Array<{ skills?: RpcSkillRecord[] }> }\n for (const entry of result.data ?? []) {\n for (const skill of groupRpcSkillRecords(entry.skills ?? [])) {\n if (skill.name) {\n installedMap.set(skill.name, { name: skill.name, path: skill.path ?? '', enabled: skill.enabled !== false })\n }\n }\n }\n } catch {}\n return installedMap\n}\n\nfunction extractSkillFrontmatterField(markdown: string, fieldName: string): string {\n const lines = markdown.split(/\\r?\\n/)\n if (lines[0]?.trim() !== '---') return ''\n const frontmatter: string[] = []\n for (let index = 1; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (line.trim() === '---') break\n frontmatter.push(line)\n }\n const escapedFieldName = fieldName.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&')\n const fieldPattern = new RegExp(`^${escapedFieldName}\\\\s*:`, 'iu')\n const valuePattern = new RegExp(`^${escapedFieldName}\\\\s*:\\\\s*`, 'iu')\n const fieldLine = frontmatter.find((line) => fieldPattern.test(line.trim()))\n if (!fieldLine) return ''\n return fieldLine.replace(valuePattern, '').replace(/^['\"]|['\"]$/gu, '').trim()\n}\n\nfunction extractSkillDescriptionFromMarkdown(markdown: string): string {\n const frontmatterDescription = extractSkillFrontmatterField(markdown, 'description')\n if (frontmatterDescription) return frontmatterDescription\n const lines = markdown.split(/\\r?\\n/)\n let inCodeFence = false\n for (const rawLine of lines) {\n const line = rawLine.trim()\n if (line.startsWith('```')) {\n inCodeFence = !inCodeFence\n continue\n }\n if (inCodeFence || line.length === 0) continue\n if (line.startsWith('#')) continue\n if (line.startsWith('>')) continue\n if (line.startsWith('- ') || line.startsWith('* ')) continue\n return line\n }\n return ''\n}\n\nfunction getSkillsSyncStatePath(): string {\n return join(getCodexHomeDir(), 'skills-sync.json')\n}\n\nasync function readSkillsSyncState(): Promise<SkillsSyncState> {\n try {\n const raw = await readFile(getSkillsSyncStatePath(), 'utf8')\n const parsed = JSON.parse(raw) as SkillsSyncState\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n return {}\n }\n}\n\nasync function writeSkillsSyncState(state: SkillsSyncState): Promise<void> {\n await writeFile(getSkillsSyncStatePath(), JSON.stringify(state), 'utf8')\n}\n\nasync function getGithubJson<T>(url: string, token: string, method = 'GET', body?: unknown): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!resp.ok) {\n const text = await resp.text()\n throw new Error(`GitHub API ${method} ${url} failed (${resp.status}): ${text}`)\n }\n return await resp.json() as T\n}\n\nasync function startGithubDeviceLogin(): Promise<GithubDeviceCodeResponse> {\n const resp = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n scope: 'repo read:user',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub device flow init failed (${resp.status})`)\n }\n return await resp.json() as GithubDeviceCodeResponse\n}\n\nasync function completeGithubDeviceLogin(deviceCode: string): Promise<{ token: string | null; error: string | null }> {\n const resp = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub token exchange failed (${resp.status})`)\n }\n const payload = await resp.json() as GithubTokenResponse\n if (!payload.access_token) return { token: null, error: payload.error || 'unknown_error' }\n return { token: payload.access_token, error: null }\n}\n\nfunction isAndroidLikeRuntime(): boolean {\n if (process.platform === 'android') return true\n if (existsSync('/data/data/com.termux')) return true\n if (process.env.TERMUX_VERSION) return true\n const prefix = process.env.PREFIX?.toLowerCase() ?? ''\n if (prefix.includes('/com.termux/')) return true\n const proot = process.env.PROOT_TMP_DIR?.toLowerCase() ?? ''\n return proot.length > 0\n}\n\nfunction getPreferredPublicUpstreamBranch(): string {\n return isAndroidLikeRuntime() ? PUBLIC_UPSTREAM_BRANCH_ANDROID : PUBLIC_UPSTREAM_BRANCH_DEFAULT\n}\n\nfunction isUpstreamSkillsRepo(repoOwner: string, repoName: string): boolean {\n return repoOwner.toLowerCase() === SYNC_UPSTREAM_SKILLS_OWNER.toLowerCase()\n && repoName.toLowerCase() === SYNC_UPSTREAM_SKILLS_REPO.toLowerCase()\n}\n\nasync function resolveGithubUsername(token: string): Promise<string> {\n const user = await getGithubJson<{ login: string }>('https://api.github.com/user', token)\n return user.login\n}\n\nasync function ensurePrivateForkFromUpstream(token: string, username: string, repoName: string): Promise<void> {\n const repoUrl = `https://api.github.com/repos/${username}/${repoName}`\n let created = false\n const existing = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const details = await existing.json() as { private?: boolean }\n if (details.private === true) return\n await getGithubJson(repoUrl, token, 'PATCH', { private: true })\n return\n }\n if (existing.status !== 404) {\n throw new Error(`Failed to check personal repo existence (${existing.status})`)\n }\n\n await getGithubJson(\n 'https://api.github.com/user/repos',\n token,\n 'POST',\n { name: repoName, private: true, auto_init: false, description: 'Codex skills private mirror sync' },\n )\n created = true\n\n let ready = false\n for (let i = 0; i < 20; i++) {\n const check = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (check.ok) {\n ready = true\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n if (!ready) throw new Error('Private mirror repo was created but is not available yet')\n if (!created) return\n\n const tmp = await mkdtemp(join(tmpdir(), 'codex-skills-seed-'))\n try {\n const upstreamUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = PRIVATE_SYNC_BRANCH\n try {\n await runCommand('git', ['clone', '--depth', '1', '--single-branch', '--branch', branch, upstreamUrl, tmp])\n } catch {\n await runCommand('git', ['clone', '--depth', '1', upstreamUrl, tmp])\n }\n const privateRemote = toGitHubTokenRemote(username, repoName, token)\n await runCommand('git', ['remote', 'set-url', 'origin', privateRemote], { cwd: tmp })\n try { await runCommand('git', ['checkout', '-B', branch], { cwd: tmp }) } catch {}\n await runCommand('git', ['push', '-u', 'origin', `HEAD:${branch}`], { cwd: tmp })\n } finally {\n await rm(tmp, { recursive: true, force: true })\n }\n}\n\nasync function readRemoteSkillsManifest(token: string, repoOwner: string, repoName: string): Promise<SyncedSkill[]> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n const resp = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (resp.status === 404) return []\n if (!resp.ok) throw new Error(`Failed to read remote manifest (${resp.status})`)\n const payload = await resp.json() as { content?: string }\n const content = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : '[]'\n const parsed = JSON.parse(content) as unknown\n if (!Array.isArray(parsed)) return []\n const skills: SyncedSkill[] = []\n for (const row of parsed) {\n const item = asRecord(row)\n const owner = typeof item?.owner === 'string' ? item.owner : ''\n const name = typeof item?.name === 'string' ? item.name : ''\n if (!name) continue\n skills.push({ ...(owner ? { owner } : {}), name, enabled: item?.enabled !== false })\n }\n return skills\n}\n\nasync function writeRemoteSkillsManifest(token: string, repoOwner: string, repoName: string, skills: SyncedSkill[]): Promise<boolean> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n let sha = ''\n const nextContent = JSON.stringify(skills, null, 2)\n const existing = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const payload = await existing.json() as { sha?: string; content?: string }\n sha = payload.sha ?? ''\n const currentContent = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : ''\n if (currentContent === nextContent) return false\n }\n const content = Buffer.from(nextContent, 'utf8').toString('base64')\n await getGithubJson(url, token, 'PUT', {\n message: 'Update synced skills manifest',\n content,\n ...(sha ? { sha } : {}),\n })\n return true\n}\n\nfunction toGitHubTokenRemote(repoOwner: string, repoName: string, token: string): string {\n return `https://x-access-token:${encodeURIComponent(token)}@github.com/${repoOwner}/${repoName}.git`\n}\n\nasync function ensureSkillsWorkingTreeRepo(\n repoUrl: string,\n branch: string,\n options: { localDir?: string; overwriteLocalFiles?: boolean } = {},\n): Promise<string> {\n const localDir = options.localDir ?? getSkillsInstallDir()\n await mkdir(localDir, { recursive: true })\n const gitDir = join(localDir, '.git')\n let hasGitDir = false\n try {\n const gitDirStat = await lstat(gitDir)\n hasGitDir = gitDirStat.isDirectory() || gitDirStat.isFile()\n } catch {\n hasGitDir = false\n }\n\n if (!hasGitDir) {\n await runCommand('git', ['init'], { cwd: localDir })\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: localDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: localDir })\n await runCommand('git', ['add', '-A'], { cwd: localDir })\n try { await runCommand('git', ['commit', '-m', 'Local skills snapshot before sync'], { cwd: localDir }) } catch {}\n await runCommand('git', ['branch', '-M', branch], { cwd: localDir })\n try { await runCommand('git', ['remote', 'add', 'origin', repoUrl], { cwd: localDir }) } catch {\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n }\n await runGitFetchWithRefLockRetry(localDir)\n if (options.overwriteLocalFiles) {\n await runCommand('git', ['reset', '--hard'], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n await runCommand('git', ['checkout', '-B', branch, `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n return localDir\n }\n try {\n await runCommand('git', ['merge', '--allow-unrelated-histories', '--no-edit', `origin/${branch}`], { cwd: localDir })\n } catch {}\n return localDir\n }\n\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n await runGitFetchWithRefLockRetry(localDir)\n if (options.overwriteLocalFiles) {\n try { await runCommand('git', ['reset', '--hard'], { cwd: localDir }) } catch {}\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n await runCommand('git', ['checkout', '-B', branch, `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n return localDir\n }\n const hasLocalChangesBeforeSync = await hasLocalUncommittedChanges(localDir)\n const localMtimesBeforeSync = hasLocalChangesBeforeSync ? await snapshotFileMtimes(localDir) : new Map<string, number>()\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n try {\n await runCommand('git', ['checkout', branch], { cwd: localDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n await runCommand('git', ['checkout', '-B', branch], { cwd: localDir })\n }\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n const hasLocalChangesBeforePull = await hasLocalUncommittedChanges(localDir)\n const localMtimesBeforePull = hasLocalChangesBeforePull ? await snapshotFileMtimes(localDir) : new Map<string, number>()\n let createdAutostash = false\n try {\n const stashOutput = await runCommandWithOutput('git', ['stash', 'push', '--include-untracked', '-m', 'codex-skills-autostash'], { cwd: localDir })\n createdAutostash = !stashOutput.includes('No local changes to save')\n } catch {}\n let pulledMtimes = new Map<string, number>()\n await runGitFetchWithRefLockRetry(localDir, ['fetch', 'origin', branch])\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n pulledMtimes = await snapshotFileMtimes(localDir)\n if (createdAutostash) {\n try {\n await runCommand('git', ['stash', 'pop'], { cwd: localDir })\n } catch {\n await resolveStashPopConflictsByFileTime(localDir, localMtimesBeforePull, pulledMtimes)\n }\n }\n return localDir\n}\n\nasync function resolveMergeConflictsByNewerCommit(\n repoDir: string,\n branch: string,\n localMtimesBeforeSync: Map<string, number> = new Map<string, number>(),\n): Promise<void> {\n // Keep resolving until merge/rebase no longer reports unmerged paths.\n for (let i = 0; i < 20; i++) {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtimeMs = localMtimesBeforeSync.get(path) ?? 0\n const localMtimeSec = Math.floor(localMtimeMs / 1000)\n const remoteCommitTime = await getCommitTime(repoDir, `origin/${branch}`, path)\n if (remoteCommitTime > localMtimeSec) {\n await checkoutConflictSideWithFallback(repoDir, path, '--theirs')\n } else {\n await checkoutConflictSideWithFallback(repoDir, path, '--ours')\n }\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const rebaseHead = await readOptionalGitRef(repoDir, 'REBASE_HEAD')\n if (rebaseHead) {\n try {\n await runCommand('git', ['rebase', '--continue'], { cwd: repoDir })\n continue\n } catch {\n // Continue loop and resolve next rebase-conflict batch.\n continue\n }\n }\n const mergeHead = await readOptionalGitRef(repoDir, 'MERGE_HEAD')\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve skills merge by mtime policy'], { cwd: repoDir })\n continue\n }\n }\n throw new Error('Auto-resolve exceeded retry limit while reconciling sync conflicts')\n}\n\nasync function readOptionalGitRef(repoDir: string, ref: string): Promise<string> {\n try {\n return (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', ref], { cwd: repoDir })).trim()\n } catch {\n return ''\n }\n}\n\nasync function listUnmergedStages(repoDir: string, path: string): Promise<Set<number>> {\n const raw = (await runCommandWithOutput('git', ['ls-files', '-u', '--', path], { cwd: repoDir })).trim()\n const stages = new Set<number>()\n if (!raw) return stages\n for (const line of raw.split(/\\r?\\n/)) {\n const parts = line.trim().split(/\\s+/)\n const stage = Number.parseInt(parts[2] ?? '', 10)\n if (Number.isInteger(stage)) stages.add(stage)\n }\n return stages\n}\n\nasync function checkoutConflictSideWithFallback(\n repoDir: string,\n path: string,\n preferredSide: '--ours' | '--theirs',\n): Promise<void> {\n const stages = await listUnmergedStages(repoDir, path)\n const hasOurs = stages.has(2)\n const hasTheirs = stages.has(3)\n if (!hasOurs && !hasTheirs) return\n if (preferredSide === '--ours') {\n if (hasOurs) {\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n return\n }\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n return\n }\n if (hasTheirs) {\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n return\n }\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n}\n\nasync function getCommitTime(repoDir: string, ref: string, path: string): Promise<number> {\n try {\n const output = (await runCommandWithOutput('git', ['log', '-1', '--format=%ct', ref, '--', path], { cwd: repoDir })).trim()\n return output ? Number.parseInt(output, 10) : 0\n } catch {\n return 0\n }\n}\n\nasync function resolveStashPopConflictsByFileTime(\n repoDir: string,\n localMtimesBeforePull: Map<string, number>,\n pulledMtimes: Map<string, number>,\n): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtime = localMtimesBeforePull.get(path) ?? 0\n const pulledMtime = pulledMtimes.get(path) ?? 0\n const side = localMtime >= pulledMtime ? '--theirs' : '--ours'\n await checkoutConflictSideWithFallback(repoDir, path, side)\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = await readOptionalGitRef(repoDir, 'MERGE_HEAD')\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve stash-pop conflicts by file time'], { cwd: repoDir })\n }\n}\n\nasync function snapshotFileMtimes(dir: string): Promise<Map<string, number>> {\n const mtimes = new Map<string, number>()\n await walkFileMtimes(dir, dir, mtimes)\n return mtimes\n}\n\nasync function hasLocalUncommittedChanges(repoDir: string): Promise<boolean> {\n const status = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n return status.length > 0\n}\n\nasync function hasCommittableWorkingTreeChanges(repoDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['diff', '--quiet', '--exit-code', '--ignore-submodules=dirty'], { cwd: repoDir })\n await runCommand('git', ['diff', '--cached', '--quiet', '--exit-code', '--ignore-submodules=dirty'], { cwd: repoDir })\n } catch {\n return true\n }\n const untracked = (await runCommandWithOutput('git', ['ls-files', '--others', '--exclude-standard'], { cwd: repoDir })).trim()\n return untracked.length > 0\n}\n\nasync function walkFileMtimes(rootDir: string, currentDir: string, out: Map<string, number>): Promise<void> {\n let entries: Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n try {\n entries = (await readdir(currentDir, { withFileTypes: true })) as Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entryName === '.git') continue\n const absolutePath = join(currentDir, entryName)\n const relativePath = absolutePath.slice(rootDir.length + 1)\n if (entry.isDirectory()) {\n await walkFileMtimes(rootDir, absolutePath, out)\n continue\n }\n if (!entry.isFile()) continue\n try {\n const info = await stat(absolutePath)\n out.set(relativePath, info.mtimeMs)\n } catch {}\n }\n}\n\nasync function syncInstalledSkillsFolderToRepo(\n token: string,\n repoOwner: string,\n repoName: string,\n _installedMap: Map<string, InstalledSkillInfo>,\n): Promise<void> {\n async function hasTrackedLocalFileChanges(repoDir: string, filePath: string): Promise<boolean> {\n const diffHead = (await runCommandWithOutput('git', ['diff', '--name-only', 'HEAD', '--', filePath], { cwd: repoDir })).trim()\n if (diffHead.length > 0) return true\n const diffCached = (await runCommandWithOutput('git', ['diff', '--cached', '--name-only', '--', filePath], { cwd: repoDir })).trim()\n return diffCached.length > 0\n }\n\n async function restoreProtectedFilesFromOrigin(repoDir: string, branch: string): Promise<void> {\n const protectedFiles = ['AGENTS.md']\n for (const filePath of protectedFiles) {\n const hasLocalEdits = await hasTrackedLocalFileChanges(repoDir, filePath)\n if (hasLocalEdits) continue\n try {\n await runCommand('git', ['cat-file', '-e', `origin/${branch}:${filePath}`], { cwd: repoDir })\n } catch {\n continue\n }\n await runCommand('git', ['checkout', `origin/${branch}`, '--', filePath], { cwd: repoDir })\n }\n try {\n await runCommand('git', ['cat-file', '-e', `origin/${branch}:shared_skills`], { cwd: repoDir })\n await runCommand('git', ['checkout', `origin/${branch}`, '--', 'shared_skills'], { cwd: repoDir })\n } catch {\n // Ignore when the branch does not track the nested shared_skills gitlink.\n }\n }\n\n function isNonFastForwardPushError(error: unknown): boolean {\n const text = getErrorMessage(error, '').toLowerCase()\n return text.includes('non-fast-forward')\n || text.includes('fetch first')\n || (text.includes('rejected') && text.includes('push'))\n }\n\n async function pushWithNonFastForwardRetry(repoDir: string, branch: string): Promise<void> {\n const maxAttempts = 3\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const hasLocalChangesBeforeReconcile = await hasLocalUncommittedChanges(repoDir)\n const localMtimesBeforeReconcile = hasLocalChangesBeforeReconcile ? await snapshotFileMtimes(repoDir) : new Map<string, number>()\n await runGitFetchWithRefLockRetry(repoDir)\n try {\n await runCommand('git', ['rebase', `origin/${branch}`], { cwd: repoDir })\n } catch {\n try { await runCommand('git', ['rebase', '--abort'], { cwd: repoDir }) } catch {}\n try {\n await runCommand('git', ['pull', '--rebase', '--autostash', 'origin', branch], { cwd: repoDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(repoDir, branch, localMtimesBeforeReconcile)\n await runCommand('git', ['pull', '--rebase', '--autostash', 'origin', branch], { cwd: repoDir })\n }\n }\n try {\n await runCommand('git', ['push', '--no-recurse-submodules', 'origin', `HEAD:${branch}`], { cwd: repoDir })\n const state = await readSkillsSyncState()\n const pushedHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir })\n await writeSkillsSyncState({\n ...state,\n lastPushCommitSha: pushedHead.trim(),\n lastSyncAttemptCount: attempt,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n return\n } catch (error) {\n if (!isNonFastForwardPushError(error) || attempt >= maxAttempts) {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n lastSyncAttemptCount: attempt,\n lastSyncError: getErrorMessage(error, 'push failed'),\n lastSyncAtIso: new Date().toISOString(),\n })\n throw error\n }\n }\n }\n throw new Error('Failed to push after non-fast-forward retries')\n }\n\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = PRIVATE_SYNC_BRANCH\n const repoDir = await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n void _installedMap\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: repoDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: repoDir })\n await restoreProtectedFilesFromOrigin(repoDir, branch)\n await runCommand('git', ['add', '.'], { cwd: repoDir })\n try {\n await runCommand('git', ['diff', '--cached', '--quiet', '--exit-code'], { cwd: repoDir })\n return\n } catch {}\n await runCommand('git', ['commit', '-m', 'Sync installed skills folder and manifest'], { cwd: repoDir })\n await pushWithNonFastForwardRetry(repoDir, branch)\n}\n\nasync function pullInstalledSkillsFolderFromRepo(token: string, repoOwner: string, repoName: string): Promise<string> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const isUpstream = isUpstreamSkillsRepo(repoOwner, repoName)\n const branch = isUpstream ? PUBLIC_UPSTREAM_BRANCH_ANDROID : PRIVATE_SYNC_BRANCH\n return await ensureSkillsWorkingTreeRepo(remoteUrl, branch, {\n ...(isUpstream ? { localDir: getSharedSkillsInstallDir() } : {}),\n overwriteLocalFiles: isUpstream,\n })\n}\n\nasync function bootstrapSkillsFromUpstreamIntoLocal(): Promise<string> {\n const repoUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n return await ensureSkillsWorkingTreeRepo(repoUrl, PUBLIC_UPSTREAM_BRANCH_ANDROID, {\n localDir: getSharedSkillsInstallDir(),\n overwriteLocalFiles: true,\n })\n}\n\nasync function collectLocalSyncedSkills(appServer: AppServerLike): Promise<SyncedSkill[]> {\n const state = await readSkillsSyncState()\n const owners = { ...(state.installedOwners ?? {}) }\n const skills = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ name?: string; enabled?: boolean; path?: string; scope?: string }> }>\n }\n const seen = new Set<string>()\n const synced: SyncedSkill[] = []\n let ownersChanged = false\n for (const entry of skills.data ?? []) {\n for (const skill of groupRpcSkillRecords(entry.skills ?? [])) {\n const name = typeof skill.name === 'string' ? skill.name : ''\n if (!name || skill.scope !== 'user' || seen.has(name)) continue\n seen.add(name)\n const owner = owners[name] ?? ''\n synced.push({ ...(owner ? { owner } : {}), name, enabled: skill.enabled !== false })\n }\n }\n if (ownersChanged) {\n await writeSkillsSyncState({ ...state, installedOwners: owners })\n }\n synced.sort((a, b) => `${a.owner ?? ''}/${a.name}`.localeCompare(`${b.owner ?? ''}/${b.name}`))\n return synced\n}\n\nasync function autoPushSyncedSkills(appServer: AppServerLike): Promise<void> {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) return\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n throw new Error('Refusing to push to upstream skills repository')\n }\n const repoDir = getSkillsInstallDir()\n await runCommand('git', ['fetch', 'origin', PRIVATE_SYNC_BRANCH], { cwd: repoDir })\n const head = (await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir })).trim()\n const originHead = (await runCommandWithOutput('git', ['rev-parse', `origin/${PRIVATE_SYNC_BRANCH}`], { cwd: repoDir })).trim()\n const hasCommittableChanges = await hasCommittableWorkingTreeChanges(repoDir)\n // After a successful pull, if local tree is already clean and equal to remote,\n // skip push entirely to avoid rewriting/deleting remote-only updates.\n if (!hasCommittableChanges && head === originHead) return\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n}\n\nasync function ensureCodexAgentsSymlinkToSkillsAgents(): Promise<void> {\n const codexHomeDir = getCodexHomeDir()\n const skillsAgentsPath = join(codexHomeDir, 'skills', 'AGENTS.md')\n const codexAgentsPath = join(codexHomeDir, 'AGENTS.md')\n await mkdir(join(codexHomeDir, 'skills'), { recursive: true })\n let copiedFromCodex = false\n try {\n const codexAgentsStat = await lstat(codexAgentsPath)\n if (codexAgentsStat.isFile() || codexAgentsStat.isSymbolicLink()) {\n const content = await readFile(codexAgentsPath, 'utf8')\n await writeFile(skillsAgentsPath, content, 'utf8')\n copiedFromCodex = true\n } else {\n await rm(codexAgentsPath, { force: true, recursive: true })\n }\n } catch {}\n if (!copiedFromCodex) {\n try {\n const skillsAgentsStat = await stat(skillsAgentsPath)\n if (!skillsAgentsStat.isFile()) {\n await rm(skillsAgentsPath, { force: true, recursive: true })\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n } catch {\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n }\n const relativeTarget = join('skills', 'AGENTS.md')\n try {\n const current = await lstat(codexAgentsPath)\n if (current.isSymbolicLink()) {\n const existingTarget = await readlink(codexAgentsPath)\n if (existingTarget === relativeTarget) return\n }\n await rm(codexAgentsPath, { force: true, recursive: true })\n } catch {}\n await symlink(relativeTarget, codexAgentsPath)\n}\n\nasync function runSkillsSyncStartup(appServer: AppServerLike): Promise<void> {\n if (startupSyncStatus.inProgress) return\n startupSyncStatus.inProgress = true\n startupSyncStatus.lastRunAtIso = new Date().toISOString()\n startupSyncStatus.lastError = ''\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken) {\n await ensureCodexAgentsSymlinkToSkillsAgents()\n if (!isAndroidLikeRuntime()) {\n startupSyncStatus.mode = 'idle'\n startupSyncStatus.lastAction = 'skip-upstream-non-android'\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n return\n }\n startupSyncStatus.mode = 'unauthenticated-bootstrap'\n startupSyncStatus.branch = getPreferredPublicUpstreamBranch()\n startupSyncStatus.lastAction = 'pull-upstream'\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'pull-upstream-complete'\n return\n }\n startupSyncStatus.mode = 'authenticated-fork-sync'\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n startupSyncStatus.lastAction = 'ensure-private-fork'\n const username = state.githubUsername || await resolveGithubUsername(state.githubToken)\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(state.githubToken, username, repoName)\n await writeSkillsSyncState({ ...state, githubUsername: username, repoOwner: username, repoName })\n startupSyncStatus.lastAction = 'pull-private-fork'\n await pullInstalledSkillsFolderFromRepo(state.githubToken, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastAction = 'push-private-fork'\n await autoPushSyncedSkills(appServer)\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'startup-sync-complete'\n } catch (error) {\n startupSyncStatus.lastError = getErrorMessage(error, 'startup-sync-failed')\n startupSyncStatus.lastAction = 'startup-sync-failed'\n } finally {\n startupSyncStatus.inProgress = false\n }\n}\n\nexport async function initializeSkillsSyncOnStartup(appServer: AppServerLike): Promise<void> {\n if (startupSkillsSyncInitialized) return\n startupSkillsSyncInitialized = true\n await runSkillsSyncStartup(appServer)\n}\n\nasync function finalizeGithubLoginAndSync(token: string, username: string, appServer: AppServerLike): Promise<void> {\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(token, username, repoName)\n const current = await readSkillsSyncState()\n await writeSkillsSyncState({ ...current, githubToken: token, githubUsername: username, repoOwner: username, repoName })\n await pullInstalledSkillsFolderFromRepo(token, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n await autoPushSyncedSkills(appServer)\n}\n\nexport async function handleSkillsRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: SkillRouteContext,\n): Promise<boolean> {\n const { appServer, readJsonBody } = context\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub') {\n try {\n const installedMap = await collectInstalledSkillsMap(appServer)\n const installed = await Promise.all([...installedMap.values()].map((info) => buildLocalHubEntry(info)))\n installed.sort((a, b) => a.name.localeCompare(b.name))\n setJson(res, 200, { installed })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch skills hub') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/search') {\n try {\n const query = (url.searchParams.get('q') || '').trim()\n if (query.length < 2) {\n setJson(res, 200, { results: [] })\n return true\n }\n const installedMap = await collectInstalledSkillsMap(appServer)\n const output = await runCommandWithOutput('npx', ['--yes', 'skills', 'find', query], { timeoutMs: 60_000 })\n const results = await enrichSkillSearchDescriptions(parseNpxSkillsFindOutput(output, installedMap))\n setJson(res, 200, { results })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to search skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-sync/status') {\n const state = await readSkillsSyncState()\n setJson(res, 200, {\n data: {\n loggedIn: Boolean(state.githubToken),\n githubUsername: state.githubUsername ?? '',\n repoOwner: state.repoOwner ?? '',\n repoName: state.repoName ?? '',\n configured: Boolean(state.githubToken && state.repoOwner && state.repoName),\n telemetry: {\n lastPullCommitSha: state.lastPullCommitSha ?? '',\n lastPushCommitSha: state.lastPushCommitSha ?? '',\n lastSyncAttemptCount: state.lastSyncAttemptCount ?? 0,\n lastSyncError: state.lastSyncError ?? '',\n lastSyncAtIso: state.lastSyncAtIso ?? '',\n },\n startup: {\n inProgress: startupSyncStatus.inProgress,\n mode: startupSyncStatus.mode,\n branch: startupSyncStatus.branch,\n lastAction: startupSyncStatus.lastAction,\n lastRunAtIso: startupSyncStatus.lastRunAtIso,\n lastSuccessAtIso: startupSyncStatus.lastSuccessAtIso,\n lastError: startupSyncStatus.lastError,\n },\n },\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/start-login') {\n try {\n const started = await startGithubDeviceLogin()\n setJson(res, 200, { data: started })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to start GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/token-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const token = typeof payload?.token === 'string' ? payload.token.trim() : ''\n if (!token) {\n setJson(res, 400, { error: 'Missing GitHub token' })\n return true\n }\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to login with GitHub token') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/logout') {\n try {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n githubToken: undefined,\n githubUsername: undefined,\n repoOwner: undefined,\n repoName: undefined,\n })\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to logout GitHub') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/complete-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const deviceCode = typeof payload?.deviceCode === 'string' ? payload.deviceCode : ''\n if (!deviceCode) {\n setJson(res, 400, { error: 'Missing deviceCode' })\n return true\n }\n const result = await completeGithubDeviceLogin(deviceCode)\n if (!result.token) {\n setJson(res, 200, { ok: false, pending: result.error === 'authorization_pending', error: result.error || 'login_failed' })\n return true\n }\n const token = result.token\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to complete GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/push') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n setJson(res, 400, { error: 'Skills sync is not configured yet' })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n setJson(res, 400, { error: 'Refusing to push to upstream repository' })\n return true\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await collectInstalledSkillsMap(appServer)\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n setJson(res, 200, { ok: true, data: { synced: local.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to push synced skills') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/startup-sync') {\n try {\n await runSkillsSyncStartup(appServer)\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to run startup sync') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/pull') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n const repoDir = await bootstrapSkillsFromUpstreamIntoLocal()\n const localSkills = await scanInstalledSkillsFromDir(repoDir)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: localSkills.size, source: 'upstream' } })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n const repoDir = await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const localSkills = await scanInstalledSkillsFromDir(repoDir)\n const pulledHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir }).catch(() => '')\n await writeSkillsSyncState({\n ...state,\n lastPullCommitSha: pulledHead.trim(),\n lastSyncAttemptCount: 1,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: localSkills.size, source: 'upstream' } })\n return true\n }\n const remote = await readRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName)\n const localDir = await detectUserSkillsDir(appServer)\n await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const localSkills = await scanInstalledSkillsFromDisk()\n const missingAfterPull: string[] = []\n for (const skill of remote) {\n const owner = skill.owner || ''\n if (!owner) continue\n if (!localSkills.has(skill.name)) {\n missingAfterPull.push(`${owner}/${skill.name}`)\n continue\n }\n const skillPath = join(localDir, skill.name)\n await appServer.rpc('skills/config/write', { path: skillPath, enabled: skill.enabled })\n }\n if (missingAfterPull.length > 0) {\n throw new Error(`Missing skill folders after pull: ${missingAfterPull.join(', ')}`)\n }\n const remoteNames = new Set(remote.map((row) => row.name))\n for (const [name, localInfo] of localSkills.entries()) {\n if (!remoteNames.has(name)) {\n await rm(localInfo.path.replace(/\\/SKILL\\.md$/, ''), { recursive: true, force: true })\n }\n }\n const nextOwners: Record<string, string> = {}\n for (const item of remote) {\n const owner = item.owner || ''\n if (owner) nextOwners[item.name] = owner\n }\n const pulledHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: getSkillsInstallDir() }).catch(() => '')\n await writeSkillsSyncState({\n ...state,\n installedOwners: nextOwners,\n lastPullCommitSha: pulledHead.trim(),\n lastSyncAttemptCount: 1,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: remote.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to pull synced skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/readme') {\n try {\n const owner = url.searchParams.get('owner') || ''\n const name = url.searchParams.get('name') || ''\n const installed = url.searchParams.get('installed') === 'true'\n const skillPath = url.searchParams.get('path') || ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n if (installed) {\n const installedMap = await scanInstalledSkillsFromDisk()\n const installedInfo = installedMap.get(name)\n const localSkillPath = installedInfo?.path\n || (skillPath ? (skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`) : '')\n if (localSkillPath) {\n const content = await readFile(localSkillPath, 'utf8')\n const description = extractSkillDescriptionFromMarkdown(content)\n setJson(res, 200, { content, description, source: 'local' })\n return true\n }\n }\n setJson(res, 404, { error: 'Only installed local skills are available in Skills Hub.' })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch SKILL.md') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/install') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const source = typeof payload?.source === 'string' ? payload.source.trim() : ''\n const owner = typeof payload?.owner === 'string' ? payload.owner.trim() : ''\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const installSource = source || (owner && name ? `${owner}@${name}` : '')\n if (!installSource || !/^[A-Za-z0-9._/-]+@[A-Za-z0-9._-]+$/u.test(installSource)) {\n setJson(res, 400, { error: 'Missing or invalid skill source' })\n return true\n }\n await runCommand('npx', ['--yes', 'skills', 'add', installSource, '--yes', '--global'], { timeoutMs: 120_000 })\n try { await withTimeout(appServer.rpc('skills/list', { forceReload: true }), 10_000, 'skills/list reload') } catch {}\n const installedMap = await collectInstalledSkillsMap(appServer)\n const installed = installedMap.get(name || installSource.slice(installSource.lastIndexOf('@') + 1))\n if (!installed?.path) {\n throw new Error(`Skill install completed but ${installSource} was not found in local installed skills`)\n }\n await ensureInstalledSkillIsValid(appServer, installed.path)\n autoPushSyncedSkills(appServer).catch(() => {})\n setJson(res, 200, { ok: true, path: installed.path })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to install skill') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/uninstall') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name : ''\n const path = typeof payload?.path === 'string' ? payload.path : ''\n const normalizedPath = path.endsWith('/SKILL.md') ? path.slice(0, -'/SKILL.md'.length) : path\n const target = normalizedPath || (name ? join(getSkillsInstallDir(), name) : '')\n if (!target) {\n setJson(res, 400, { error: 'Missing name or path' })\n return true\n }\n await rm(target, { recursive: true, force: true })\n if (name) {\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}) }\n delete nextOwners[name]\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n }\n autoPushSyncedSkills(appServer).catch(() => {})\n try { await withTimeout(appServer.rpc('skills/list', { forceReload: true }), 10_000, 'skills/list reload') } catch {}\n setJson(res, 200, { ok: true, deletedPath: target })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to uninstall skill') })\n }\n return true\n }\n\n return false\n}\n","import { spawnSync } from 'node:child_process'\nimport { basename, extname } from 'node:path'\n\nconst WINDOWS_CMD_NAMES = new Set(['codex', 'npm', 'npx'])\n\nfunction quoteCmdExeArg(value: string): string {\n const normalized = value.replace(/\"/g, '\"\"')\n if (!/[\\s\"]/u.test(normalized)) {\n return normalized\n }\n return `\"${normalized}\"`\n}\n\nfunction needsCmdExeWrapper(command: string): boolean {\n if (process.platform !== 'win32') {\n return false\n }\n\n const lowerCommand = command.toLowerCase()\n const baseName = basename(lowerCommand)\n if (/\\.(cmd|bat)$/i.test(baseName)) {\n return true\n }\n\n if (extname(baseName)) {\n return false\n }\n\n return WINDOWS_CMD_NAMES.has(baseName)\n}\n\nexport function getSpawnInvocation(command: string, args: string[] = []): { command: string; args: string[] } {\n if (needsCmdExeWrapper(command)) {\n return {\n command: 'cmd.exe',\n args: ['/d', '/s', '/c', [quoteCmdExeArg(command), ...args.map((arg) => quoteCmdExeArg(arg))].join(' ')],\n }\n }\n\n return { command, args }\n}\n\nexport function spawnSyncCommand(\n command: string,\n args: string[] = [],\n options: Parameters<typeof spawnSync>[2] = {},\n) {\n const invocation = getSpawnInvocation(command, args)\n return spawnSync(invocation.command, invocation.args, options)\n}\n","import { basename } from 'node:path'\n\ntype TelegramUpdate = {\n update_id?: number\n message?: {\n message_id?: number\n text?: string\n from?: {\n id?: number\n }\n chat?: {\n id?: number\n }\n }\n callback_query?: {\n id?: string\n data?: string\n from?: {\n id?: number\n }\n message?: {\n chat?: {\n id?: number\n }\n }\n }\n}\n\ntype AppServerLike = {\n rpc: (method: string, params: unknown) => Promise<unknown>\n onNotification: (listener: (value: { method: string; params: unknown }) => void) => () => void\n}\n\ntype TelegramThreadBridgeOptions = {\n onChatSeen?: (chatId: number) => void\n}\n\nexport type TelegramBridgeStatus = {\n configured: boolean\n active: boolean\n mappedChats: number\n mappedThreads: number\n allowedUsers: number\n allowAllUsers: boolean\n lastError: string\n}\n\ntype TelegramBotCommand = {\n command: string\n description: string\n}\n\nconst TELEGRAM_MESSAGE_MAX_LENGTH = 3500\nconst TELEGRAM_BOT_COMMANDS: TelegramBotCommand[] = [\n { command: 'start', description: 'Show quick start and thread picker' },\n { command: 'threads', description: 'List recent threads to connect' },\n { command: 'newthread', description: 'Create and connect a new thread' },\n { command: 'thread', description: 'Connect existing thread: /thread <id>' },\n { command: 'current', description: 'Show currently connected thread' },\n { command: 'history', description: 'Show recent history for current thread' },\n { command: 'status', description: 'Show bridge and mapping status' },\n { command: 'whoami', description: 'Show your Telegram IDs' },\n { command: 'help', description: 'Show available commands' },\n]\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\ntype NormalizedTelegramAllowlist = {\n allowAllUsers: boolean\n allowedUserIds: number[]\n}\n\nfunction normalizeTelegramAllowlist(values: unknown): NormalizedTelegramAllowlist {\n const rawValues = Array.isArray(values) ? values : []\n const allowAllUsers = rawValues.some((value) => typeof value === 'string' && value.trim() === '*')\n const allowedUserIds = Array.from(new Set(rawValues\n .map((value) => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.trunc(value)\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const normalized = value.trim().replace(/^(telegram|tg):/i, '').trim()\n if (/^-?\\d+$/.test(normalized)) {\n return Number.parseInt(normalized, 10)\n }\n }\n return Number.NaN\n })\n .filter((value) => Number.isFinite(value)))).slice(0, 100)\n return { allowAllUsers, allowedUserIds }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n}\n\nfunction renderMarkdownInlineToTelegramHtml(value: string): string {\n let rendered = escapeHtml(value)\n rendered = rendered.replace(/\\[([^\\]\\n]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\">$1</a>')\n rendered = rendered.replace(/`([^`\\n]+)`/g, '<code>$1</code>')\n rendered = rendered.replace(/\\*\\*([^*\\n][^*\\n]*?)\\*\\*/g, '<b>$1</b>')\n rendered = rendered.replace(/__([^_\\n][^_\\n]*?)__/g, '<b>$1</b>')\n rendered = rendered.replace(/\\*([^*\\n][^*\\n]*?)\\*/g, '<i>$1</i>')\n rendered = rendered.replace(/_([^_\\n][^_\\n]*?)_/g, '<i>$1</i>')\n rendered = rendered.replace(/^(#{1,6})\\s+(.+)$/gm, (_match, _hashes, content: string) => `<b>${content}</b>`)\n return rendered\n}\n\nfunction renderMarkdownToTelegramHtml(markdown: string): string {\n const normalized = markdown.replace(/\\r\\n/g, '\\n')\n const fencedCodeRegex = /```([a-zA-Z0-9_-]+)?\\n([\\s\\S]*?)```/g\n let cursor = 0\n const parts: string[] = []\n let match = fencedCodeRegex.exec(normalized)\n\n while (match) {\n const [fullMatch, lang, code] = match\n const matchIndex = match.index\n const before = normalized.slice(cursor, matchIndex)\n if (before) {\n parts.push(renderMarkdownInlineToTelegramHtml(before))\n }\n\n const escapedCode = escapeHtml((code ?? '').replace(/\\n+$/g, ''))\n const escapedLang = typeof lang === 'string' ? escapeHtml(lang) : ''\n if (escapedLang) {\n parts.push(`<pre><code class=\"language-${escapedLang}\">${escapedCode}</code></pre>`)\n } else {\n parts.push(`<pre>${escapedCode}</pre>`)\n }\n\n cursor = matchIndex + fullMatch.length\n match = fencedCodeRegex.exec(normalized)\n }\n\n const tail = normalized.slice(cursor)\n if (tail) {\n parts.push(renderMarkdownInlineToTelegramHtml(tail))\n }\n\n return parts.join('')\n}\n\nfunction splitTelegramText(text: string, maxLength = TELEGRAM_MESSAGE_MAX_LENGTH): string[] {\n const normalized = text.replace(/\\r\\n/g, '\\n').trim()\n if (!normalized) return []\n if (normalized.length <= maxLength) return [normalized]\n\n const chunks: string[] = []\n let remaining = normalized\n\n while (remaining.length > maxLength) {\n let splitIndex = remaining.lastIndexOf('\\n\\n', maxLength)\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf('\\n', maxLength)\n }\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf(' ', maxLength)\n }\n if (splitIndex <= 0) {\n splitIndex = maxLength\n }\n\n const chunk = remaining.slice(0, splitIndex).trim()\n if (chunk) chunks.push(chunk)\n remaining = remaining.slice(splitIndex).trim()\n }\n\n if (remaining) chunks.push(remaining)\n return chunks\n}\n\nexport class TelegramThreadBridge {\n private token: string\n private readonly appServer: AppServerLike\n private readonly defaultCwd: string\n private allowAllUsers = false\n private allowedUserIds = new Set<number>()\n private readonly threadIdByChatId = new Map<number, string>()\n private readonly chatIdsByThreadId = new Map<string, Set<number>>()\n private readonly lastForwardedTurnByThreadId = new Map<string, string>()\n private active = false\n private pollingTask: Promise<void> | null = null\n private nextUpdateOffset = 0\n private lastError = ''\n private readonly onChatSeen?: (chatId: number) => void\n\n constructor(appServer: AppServerLike, options: TelegramThreadBridgeOptions = {}) {\n this.appServer = appServer\n this.token = process.env.TELEGRAM_BOT_TOKEN?.trim() ?? ''\n this.defaultCwd = process.env.TELEGRAM_DEFAULT_CWD?.trim() ?? process.cwd()\n this.configureAllowedUserIds(\n (process.env.TELEGRAM_ALLOWED_USER_IDS ?? '')\n .split(',')\n .map((value) => value.trim())\n .filter(Boolean),\n )\n this.onChatSeen = options.onChatSeen\n }\n\n start(): void {\n if (!this.token || this.active) return\n this.active = true\n void this.syncBotCommands().catch(() => {})\n void this.notifyOnlineForKnownChats().catch(() => {})\n this.pollingTask = this.pollLoop()\n this.appServer.onNotification((notification) => {\n void this.handleNotification(notification).catch(() => {})\n })\n }\n\n stop(): void {\n this.active = false\n }\n\n private async pollLoop(): Promise<void> {\n while (this.active) {\n try {\n const updates = await this.getUpdates()\n this.lastError = ''\n for (const update of updates) {\n const updateId = typeof update.update_id === 'number' ? update.update_id : -1\n if (updateId >= 0) {\n this.nextUpdateOffset = Math.max(this.nextUpdateOffset, updateId + 1)\n }\n await this.handleIncomingUpdate(update)\n }\n } catch (error) {\n this.lastError = getErrorMessage(error, 'Telegram polling failed')\n await new Promise((resolve) => setTimeout(resolve, 1500))\n }\n }\n }\n\n private async getUpdates(): Promise<TelegramUpdate[]> {\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n const response = await fetch(this.apiUrl('getUpdates'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n timeout: 45,\n offset: this.nextUpdateOffset,\n allowed_updates: ['message', 'callback_query'],\n }),\n })\n const payload = asRecord(await response.json())\n const result = Array.isArray(payload?.result) ? payload.result : []\n return result as TelegramUpdate[]\n }\n\n private apiUrl(method: string): string {\n return `https://api.telegram.org/bot${this.token}/${method}`\n }\n\n configureToken(token: string): void {\n const normalizedToken = token.trim()\n if (!normalizedToken) {\n throw new Error('Telegram bot token is required')\n }\n this.token = normalizedToken\n void this.syncBotCommands().catch(() => {})\n }\n\n getStatus(): TelegramBridgeStatus {\n return {\n configured: this.token.length > 0,\n active: this.active,\n mappedChats: this.threadIdByChatId.size,\n mappedThreads: this.chatIdsByThreadId.size,\n allowedUsers: this.allowedUserIds.size,\n allowAllUsers: this.allowAllUsers,\n lastError: this.lastError,\n }\n }\n\n configureAllowedUserIds(allowedUserIds: unknown): void {\n const normalized = normalizeTelegramAllowlist(allowedUserIds)\n this.allowAllUsers = normalized.allowAllUsers\n this.allowedUserIds = new Set(normalized.allowedUserIds)\n }\n\n connectThread(threadId: string, chatId: number, token?: string): void {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId) {\n throw new Error('threadId is required')\n }\n if (!Number.isFinite(chatId)) {\n throw new Error('chatId must be a number')\n }\n if (typeof token === 'string' && token.trim().length > 0) {\n this.configureToken(token)\n }\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n this.bindChatToThread(chatId, normalizedThreadId)\n this.markChatSeen(chatId)\n this.start()\n void this.sendOnlineMessage(chatId).catch(() => {})\n }\n\n private markChatSeen(chatId: number): void {\n if (!Number.isFinite(chatId)) return\n this.onChatSeen?.(Math.trunc(chatId))\n }\n\n private async sendTelegramMessage(\n chatId: number,\n text: string,\n options: { replyMarkup?: unknown } = {},\n ): Promise<void> {\n const chunks = splitTelegramText(text)\n if (chunks.length === 0) return\n\n for (let index = 0; index < chunks.length; index += 1) {\n const chunk = chunks[index]\n const replyMarkup = index === 0 ? options.replyMarkup : undefined\n const htmlChunk = renderMarkdownToTelegramHtml(chunk)\n try {\n await this.sendMessageRequest(chatId, htmlChunk, { replyMarkup, parseMode: 'HTML' })\n } catch {\n await this.sendMessageRequest(chatId, chunk, { replyMarkup })\n }\n }\n }\n\n private async sendMessageRequest(\n chatId: number,\n text: string,\n options: { replyMarkup?: unknown; parseMode?: 'HTML' } = {},\n ): Promise<void> {\n const payload: Record<string, unknown> = { chat_id: chatId, text }\n if (options.replyMarkup) {\n payload.reply_markup = options.replyMarkup\n }\n if (options.parseMode) {\n payload.parse_mode = options.parseMode\n }\n await this.callTelegramApi('sendMessage', payload)\n }\n\n private async syncBotCommands(): Promise<void> {\n if (!this.token) return\n await this.callTelegramApi('setMyCommands', {\n commands: TELEGRAM_BOT_COMMANDS,\n })\n }\n\n private async callTelegramApi(method: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n const response = await fetch(this.apiUrl(method), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n const parsed = asRecord(await response.json())\n const ok = parsed?.ok === true\n if (!response.ok || !ok) {\n const description = typeof parsed?.description === 'string' ? parsed.description : ''\n const statusPart = `${String(response.status)} ${response.statusText}`.trim()\n throw new Error(description || statusPart || `Telegram API ${method} failed`)\n }\n return parsed ?? {}\n }\n\n private async sendOnlineMessage(chatId: number): Promise<void> {\n await this.sendTelegramMessage(chatId, 'Codex thread bridge went online.')\n }\n\n private async notifyOnlineForKnownChats(): Promise<void> {\n const knownChatIds = Array.from(this.threadIdByChatId.keys())\n for (const chatId of knownChatIds) {\n await this.sendOnlineMessage(chatId)\n }\n }\n\n private async handleIncomingUpdate(update: TelegramUpdate): Promise<void> {\n if (update.callback_query) {\n await this.handleCallbackQuery(update.callback_query)\n return\n }\n\n const message = update.message\n const chatId = message?.chat?.id\n const senderId = message?.from?.id\n const text = message?.text?.trim()\n if (typeof chatId !== 'number' || !text) return\n if (!this.isAllowedSender(senderId)) {\n await this.sendTelegramMessage(chatId, this.unauthorizedMessage(senderId))\n return\n }\n this.markChatSeen(chatId)\n\n if (text === '/start') {\n await this.sendTelegramMessage(chatId, this.helpMessage())\n await this.sendThreadPicker(chatId)\n return\n }\n\n if (text === '/threads') {\n await this.sendThreadPicker(chatId)\n return\n }\n\n if (text === '/newthread') {\n const threadId = await this.createThreadForChat(chatId)\n await this.sendTelegramMessage(chatId, `Mapped to new thread: ${threadId}`)\n return\n }\n\n const threadCommand = text.match(/^\\/thread\\s+(\\S+)$/)\n if (threadCommand) {\n const threadId = threadCommand[1]\n this.bindChatToThread(chatId, threadId)\n await this.sendTelegramMessage(chatId, `Mapped to thread: ${threadId}`)\n return\n }\n\n if (text === '/current') {\n const threadId = this.threadIdByChatId.get(chatId)\n await this.sendTelegramMessage(chatId, threadId\n ? `Current thread: \\`${threadId}\\``\n : 'No thread is connected for this chat yet. Use /threads, /newthread, or /thread <id>.')\n return\n }\n\n if (text === '/history') {\n const threadId = this.threadIdByChatId.get(chatId)\n if (!threadId) {\n await this.sendTelegramMessage(chatId, 'No thread is connected for this chat yet. Use /threads or /newthread first.')\n return\n }\n const history = await this.readThreadHistorySummary(threadId)\n await this.sendTelegramMessage(chatId, history)\n return\n }\n\n if (text === '/status') {\n const status = this.getStatus()\n const mappedThreadId = this.threadIdByChatId.get(chatId) ?? 'none'\n await this.sendTelegramMessage(\n chatId,\n [\n '**Bridge status**',\n `configured: ${String(status.configured)}`,\n `active: ${String(status.active)}`,\n `mapped chats: ${String(status.mappedChats)}`,\n `mapped threads: ${String(status.mappedThreads)}`,\n `allowed users: ${String(status.allowedUsers)}`,\n `allow all users: ${String(status.allowAllUsers)}`,\n `chat ${String(chatId)} thread: \\`${mappedThreadId}\\``,\n status.lastError ? `last error: ${status.lastError}` : '',\n ].filter(Boolean).join('\\n'),\n )\n return\n }\n\n if (text === '/whoami') {\n const normalizedSenderId = typeof senderId === 'number' && Number.isFinite(senderId)\n ? String(Math.trunc(senderId))\n : 'unknown'\n const normalizedChatId = String(Math.trunc(chatId))\n await this.sendTelegramMessage(\n chatId,\n [\n '**Identity**',\n `telegram user id: \\`${normalizedSenderId}\\``,\n `chat id: \\`${normalizedChatId}\\``,\n `authorized: ${String(this.isAllowedSender(senderId))}`,\n this.allowAllUsers ? 'allowlist mode: `*`' : 'allowlist mode: explicit ids',\n ].join('\\n'),\n )\n return\n }\n\n if (text === '/help') {\n await this.sendTelegramMessage(chatId, this.helpMessage())\n return\n }\n\n const threadId = await this.ensureThreadForChat(chatId)\n try {\n await this.appServer.rpc('turn/start', {\n threadId,\n input: [{ type: 'text', text }],\n })\n } catch (error) {\n const message = getErrorMessage(error, 'Failed to forward message to thread')\n await this.sendTelegramMessage(chatId, `Forward failed: ${message}`)\n }\n }\n\n private async handleCallbackQuery(callbackQuery: NonNullable<TelegramUpdate['callback_query']>): Promise<void> {\n const callbackId = typeof callbackQuery.id === 'string' ? callbackQuery.id : ''\n const data = typeof callbackQuery.data === 'string' ? callbackQuery.data : ''\n const chatId = callbackQuery.message?.chat?.id\n const senderId = callbackQuery.from?.id\n if (!this.isAllowedSender(senderId)) {\n if (callbackId) {\n await this.answerCallbackQuery(callbackId, this.unauthorizedCallbackMessage(senderId))\n }\n if (typeof chatId === 'number') {\n await this.sendTelegramMessage(chatId, this.unauthorizedMessage(senderId))\n }\n return\n }\n if (typeof chatId === 'number') {\n this.markChatSeen(chatId)\n }\n if (!callbackId) return\n\n if (!data.startsWith('thread:') || typeof chatId !== 'number') {\n await this.answerCallbackQuery(callbackId, 'Invalid selection')\n return\n }\n\n const threadId = data.slice('thread:'.length).trim()\n if (!threadId) {\n await this.answerCallbackQuery(callbackId, 'Invalid thread id')\n return\n }\n\n this.bindChatToThread(chatId, threadId)\n await this.answerCallbackQuery(callbackId, 'Thread connected')\n await this.sendTelegramMessage(chatId, `Connected to thread: ${threadId}`)\n const history = await this.readThreadHistorySummary(threadId)\n if (history) {\n await this.sendTelegramMessage(chatId, history)\n }\n }\n\n private isAllowedSender(senderId: unknown): senderId is number {\n if (this.allowAllUsers) {\n return typeof senderId === 'number' && Number.isFinite(senderId)\n }\n return typeof senderId === 'number'\n && Number.isFinite(senderId)\n && this.allowedUserIds.has(Math.trunc(senderId))\n }\n\n private unauthorizedMessage(senderId: unknown): string {\n const normalizedSenderId = typeof senderId === 'number' && Number.isFinite(senderId)\n ? String(Math.trunc(senderId))\n : 'unknown'\n return `Unauthorized sender.\\n\\nYour Telegram user ID: ${normalizedSenderId}\\nAdd this ID to the bot allowlist before using the bridge.`\n }\n\n private unauthorizedCallbackMessage(senderId: unknown): string {\n if (typeof senderId === 'number' && Number.isFinite(senderId)) {\n return `Unauthorized: ${String(Math.trunc(senderId))}`\n }\n return 'Unauthorized sender'\n }\n\n private helpMessage(): string {\n const rows = TELEGRAM_BOT_COMMANDS.map((command) => `/${command.command} - ${command.description}`)\n return ['**Available commands**', ...rows].join('\\n')\n }\n\n private async answerCallbackQuery(callbackQueryId: string, text: string): Promise<void> {\n await this.callTelegramApi('answerCallbackQuery', {\n callback_query_id: callbackQueryId,\n text,\n })\n }\n\n private async sendThreadPicker(chatId: number): Promise<void> {\n const threads = await this.listRecentThreads()\n if (threads.length === 0) {\n await this.sendTelegramMessage(chatId, 'No threads found. Send /newthread to create one.')\n return\n }\n\n const inlineKeyboard = threads.map((thread) => [\n {\n text: thread.title,\n callback_data: `thread:${thread.id}`,\n },\n ])\n\n await this.sendTelegramMessage(chatId, 'Select a thread to connect:', {\n replyMarkup: { inline_keyboard: inlineKeyboard },\n })\n }\n\n private async listRecentThreads(): Promise<Array<{ id: string; title: string }>> {\n const payload = asRecord(await this.appServer.rpc('thread/list', {\n archived: false,\n limit: 20,\n sortKey: 'updated_at',\n modelProviders: [],\n }))\n const rows = Array.isArray(payload?.data) ? payload.data : []\n const threads: Array<{ id: string; title: string }> = []\n for (const row of rows) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id.trim() : ''\n if (!id) continue\n const name = typeof record?.name === 'string' ? record.name.trim() : ''\n const preview = typeof record?.preview === 'string' ? record.preview.trim() : ''\n const cwd = typeof record?.cwd === 'string' ? record.cwd.trim() : ''\n const projectName = cwd ? basename(cwd) : 'project'\n const threadTitle = (name || preview || id).replace(/\\s+/g, ' ').trim()\n const title = `${projectName}/${threadTitle}`.slice(0, 64)\n threads.push({ id, title })\n }\n return threads\n }\n\n private async createThreadForChat(chatId: number): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/start', { cwd: this.defaultCwd }))\n const thread = asRecord(response?.thread)\n const threadId = typeof thread?.id === 'string' ? thread.id : ''\n if (!threadId) {\n throw new Error('thread/start did not return thread id')\n }\n this.bindChatToThread(chatId, threadId)\n return threadId\n }\n\n private async ensureThreadForChat(chatId: number): Promise<string> {\n const existing = this.threadIdByChatId.get(chatId)\n if (existing) return existing\n return this.createThreadForChat(chatId)\n }\n\n private bindChatToThread(chatId: number, threadId: string): void {\n const previousThreadId = this.threadIdByChatId.get(chatId)\n if (previousThreadId && previousThreadId !== threadId) {\n const previousSet = this.chatIdsByThreadId.get(previousThreadId)\n previousSet?.delete(chatId)\n if (previousSet && previousSet.size === 0) {\n this.chatIdsByThreadId.delete(previousThreadId)\n }\n }\n this.threadIdByChatId.set(chatId, threadId)\n const chatIds = this.chatIdsByThreadId.get(threadId) ?? new Set<number>()\n chatIds.add(chatId)\n this.chatIdsByThreadId.set(threadId, chatIds)\n }\n\n private extractThreadId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directThreadId = typeof params.threadId === 'string' ? params.threadId : ''\n if (directThreadId) return directThreadId\n const turn = asRecord(params.turn)\n const turnThreadId = typeof turn?.threadId === 'string' ? turn.threadId : ''\n return turnThreadId\n }\n\n private extractTurnId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directTurnId = typeof params.turnId === 'string' ? params.turnId : ''\n if (directTurnId) return directTurnId\n const turn = asRecord(params.turn)\n const turnId = typeof turn?.id === 'string' ? turn.id : ''\n return turnId\n }\n\n private async handleNotification(notification: { method: string; params: unknown }): Promise<void> {\n if (notification.method !== 'turn/completed') return\n const threadId = this.extractThreadId(notification)\n if (!threadId) return\n const chatIds = this.chatIdsByThreadId.get(threadId)\n if (!chatIds || chatIds.size === 0) return\n\n const turnId = this.extractTurnId(notification)\n const lastForwardedTurnId = this.lastForwardedTurnByThreadId.get(threadId)\n if (turnId && lastForwardedTurnId === turnId) return\n\n const assistantReply = await this.readLatestAssistantMessage(threadId)\n if (!assistantReply) return\n for (const chatId of chatIds) {\n await this.sendTelegramMessage(chatId, assistantReply)\n }\n if (turnId) {\n this.lastForwardedTurnByThreadId.set(threadId, turnId)\n }\n }\n\n private async readLatestAssistantMessage(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n\n for (let turnIndex = turns.length - 1; turnIndex >= 0; turnIndex -= 1) {\n const turn = asRecord(turns[turnIndex])\n const items = Array.isArray(turn?.items) ? turn.items : []\n for (let itemIndex = items.length - 1; itemIndex >= 0; itemIndex -= 1) {\n const item = asRecord(items[itemIndex])\n if (item?.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text.trim() : ''\n if (text) return text\n }\n }\n }\n return ''\n }\n\n private async readThreadHistorySummary(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const historyRows: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim()) {\n historyRows.push(`User: ${blockRecord.text.trim()}`)\n }\n }\n }\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim()) {\n historyRows.push(`Assistant: ${itemRecord.text.trim()}`)\n }\n }\n }\n\n if (historyRows.length === 0) {\n return 'Thread has no message history yet.'\n }\n\n const tail = historyRows.slice(-12).join('\\n\\n')\n const maxLen = 3800\n const summary = tail.length > maxLen ? tail.slice(tail.length - maxLen) : tail\n return `Recent history:\\n\\n${summary}`\n }\n}\n","const ENCRYPTED_KEYS: string[] = [\n \"FhkYWwEZE0MYBhAGUEADDBYFBEoDBxIHVUpUVRIMVUYDAkEHVRYNAxABUUAEAUMDV0pUDEQAU0ZTDEQCVERQVkoBVhAEBBBXAQ==\",\n \"FhkYWwEZE0MYVkIGUkNUUkpVXUsBBUUAVEYHUEIMBhQCVxZWBBcHVkoNUENRAxAMA0MHARBXBkVUAUVQXBAFAUVXVxFWBUtWBw==\",\n \"FhkYWwEZE0MYVhFWAUJUUBEMURMHAUoEAUcABRAEURRXARBRU0ZUBBFVB0YAAUNVVUYBDBBSABRUAhdVXUUBUhANV0IMBBABBA==\",\n \"FhkYWwEZE0MYUBIDABMBVkMHURcGDRVSXRMFBUUCBBQBVhUBUBEGDBAAVkpTVUoGUBYMBhJXB0ANABUEARBQB0RRXUBRBUNQBw==\",\n \"FhkYWwEZE0MYVhcFBhMFARJXVBMADRdWVxYHBkQNA0cBBEsGVEBRAkYCXEFXURBXABZQDEZSXBQHAkJSAUABVxIMA0NWAEcMUA==\",\n \"FhkYWwEZE0MYAEQAXEZQURUGARFRBkRWVENWDUYFBkQHBEJWU0dQUkdWBhZXARYMAERXURcBUUQNDUAGAEoEB0ABV0NTUkQDBw==\",\n \"FhkYWwEZE0MYABdRURBXVkYDURZWUUIAUEcMBEcMUUpXVxEGVhEMBktVXBBWAEFQBBBRVhECUEQEBkFQUUpRVRUMV0dRA0QGUw==\",\n \"FhkYWwEZE0MYVUMCUUIHAUFRVksFVhYMARRRBBIAVBMBDEFVAxMAAUpRXUsEBkMHVhAHBUdSVxECABJSVRdRBkMEURANAEdXVA==\",\n \"FhkYWwEZE0MYUkEFVEVUBEoMVkINDUFQUENQAkBSAEVQVhcEAEsDBxVWUkBWAkRSA0ANV0FVBkYMVxcBXUQEUEQCARYDDEpWXA==\",\n \"FhkYWwEZE0MYDBcCXBANBRdVU0YEAEsMAUoNUkoMUBYDABcHVEBQBkRVUxdWBUUAAURUVxUGB0oDVxIHABRUAhJRAEUDUkECXQ==\",\n \"FhkYWwEZE0MYVhUHVBEBURFQA0EBVRcNUUZXAhVXVkpQAEUHBhNTDUQMXRAGA0JQA0BRBRUHVRQMURVWXUoBVxcEBEYEAEACUQ==\",\n \"FhkYWwEZE0MYA0UCB0ZTABUNBhRTAUYAUENQUEANBEMCARdQBkRRBRYDUhdWVhACXBcGBhIDVBFRBRJQUREGDRAAUhQHUhUBAA==\",\n \"FhkYWwEZE0MYAUsMARACBBYGVxQHARVQVxRRBRcNUkAFUUQCXBEAUkcBXEMBBEYCXRENBUsBVRYABUJXU0FUAEYBUUpWABEGUw==\",\n \"FhkYWwEZE0MYAEdSUBcNAUoFUERUAkcFAEQAB0IBUxcFDUIMBEpQVktWUxdUB0MBXUEBBhIMXRQEUBFQXEMFAEBQXUEMVkoBUQ==\",\n \"FhkYWwEZE0MYDBYNUUVUA0ECUREMVhUEBkoCVxJSXEtRUENQVxAMBBcMAxACVkVVBEEDUEYDAURWA0oDXUYAAEEEVxQABUANVg==\",\n \"FhkYWwEZE0MYVhcHBhcFV0EBUEdWVxdSU0sMABFSUEIHA0EAU0dWBkcFXEZRBENXAUEDV0AFUkEABBAEXBdXAhZRBEAAUUBSVg==\",\n \"FhkYWwEZE0MYV0MHAxYBDUsHB0oFVRJWAUoABEQGAUEHDRdRUBQHBREFUkpQVUYHVkVTDBcDXUYHBkJXUhENVUIAVUtTDRcMVA==\",\n \"FhkYWwEZE0MYBxVXBEsAUkYBA0EEAUIGBkRQA0MNABZRVkcHA0JTUEdWUkNRBBUEXUFUB0oFB0QGDBdWUUsEV0NXBBQBVRUEVg==\",\n \"FhkYWwEZE0MYVxcCVBYHAEsNVBEADEENUkMAUhFWXBNUVxdWBxNWURYAVEEAUUdSURAHDUsAUkEABBJSVRZQV0YNVRBRDUVSBw==\",\n \"FhkYWwEZE0MYAEQEV0YGVxcMVkRQUEsGUEBRUEADAEYEV0NRBBRWBUpXV0oMA0NRXBBRAkAMXUZWURBSXEZRB0EEVBQNVxYBXQ==\",\n \"FhkYWwEZE0MYA0IBUhADUERXB0MNB0MHVUtUDRUNBEpXVkEGUBMABkZVUENUAkBVXRAEDEAHBkJWABAEURNWDEcEABQCVUdVVA==\",\n \"FhkYWwEZE0MYUhcEBBYCAUFSXUAEAEEBV0sDDRAFV0YDV0NVBENXB0QNVxdUAkYMXUQGA0tRV0tWVUoDAxcGUUVVVUQHDBEDBA==\",\n \"FhkYWwEZE0MYA0QBBEIAB0INXUtTBxYFVBFXABJSBkYEAxIAVEAGVkZSB0tQUEoHBkcGBBUHVENWAUNRUEYCAhJSXRcNUEQGUA==\",\n \"FhkYWwEZE0MYUBJQUEIFUkBXARBUBUIDAxBQVhJVVkUMVhEDAEYNVxEGBhRUVkJWURYDAUAAAUUMARVRBhYAUkAEUkUEAhYCVg==\",\n \"FhkYWwEZE0MYVUYGVBcEDEAFVhACVkFWXBFTAxAMUUpQURENARYBVhABAEINAEQCAUECDEsCBEUBVxBXBxRUVxdQBBRXVkcCUA==\",\n \"FhkYWwEZE0MYV0YMVxBTVUNQBERRURVSUxQGUUVWB0MGVUMHV0cHUkMEAEMDDUMCVEcGVkNVB0oDURdVAUFQBkIAURYDBhAHAA==\",\n \"FhkYWwEZE0MYUhYCXEsNVUAEURFXBkcHABFQBxcFUENWVkpVAxZWAhEBAxMBBkRRVUtQDEZWXEoBBxUNVkYBBhJQUBBQUUoDBw==\",\n \"FhkYWwEZE0MYB0YGXUIGDRIHVRZQVUJSV0UNB0oNAxQADRUMVUcEBhdQV0AHDUZXAEtQVkVQUhBRBUBSUEQCVkRSBEUDUkQEVQ==\",\n \"FhkYWwEZE0MYB0MGAUEADERVV0RXDUJSUUMAUEdRAUMCBxZSBktQDUMEBkIBBkIDAEMNURdRXUoFB0RWVEZRDUFXAEJTVRVWVg==\",\n \"FhkYWwEZE0MYAkQDAxcFBEpXVEIEDUJSB0tXBhVXUkIDAEEMBBBXDUdRVRcNBURVAxZXUUENARYNBkMAUBBTDUsGVUFWDEcAVQ==\",\n \"FhkYWwEZE0MYDRFQVUsCBRIMXBEFBEYEBEMBAUAMVkoCDUoABEcNV0YMU0pWABJXURcAAEIEUBcGVxcGUhZWBUIAVUQCUkVVAA==\",\n \"FhkYWwEZE0MYUhcDVURUDBBSVkVWAEYCBkoMUEVVU0cEAxcFVhcDVUEBAEpXUhIAXEUNBUQBAxYGUhFXVUUHBBUAVkpRURAAVQ==\",\n \"FhkYWwEZE0MYUEtVV0BQV0tXB0dXVkNRVRRQBUADABFTURYDVBdXUEFSXEpXB0dQVBQEA0oAVUpTBEYEVBMNDEMDU0BUBUINUg==\",\n \"FhkYWwEZE0MYUEpQBxZTBkFXXEZWAkEEBxEHB0RXVktQUEMDARRRABEFAUIABEAMARRRDUACBBAMUEMMUxcEUUEEAEoAURBQBg==\",\n \"FhkYWwEZE0MYUEINARRQAhcCUEJRUBIFBEIHBkJQB0tWVhINXRBUUBdVBkcMBUZVUxNTAUsMU0cFAEtSXUJXDRJSBkVUAUoBVA==\",\n \"FhkYWwEZE0MYUEBWAUtXBxEHUhNTBRZVB0UEB0MDA0sCBEAABkNUAUQCBxYAAEVQUEYDVkoDVxAFVUFVVUcMAUECBkoGUUsCUA==\",\n \"FhkYWwEZE0MYBBUBUEFTBUIDAxAGBUcFARBWBRJXUUJTAkUGURQBUUUEB0EFBBBVVURQBEEAUBMAVhINVUEBVUcMA0sNVUNQVg==\",\n \"FhkYWwEZE0MYDUMDA0MNA0oAV0BQUEEFBEUBAkpQXBAMBUsCVRZXVkIAXBMEAktXBhYABkcAUhMAUhYBA0BTAURVURMBA0ACXA==\",\n \"FhkYWwEZE0MYUhdXUUMDAEQNBhZTAEdWXUYHBxEHXUQCDBYCBkEBBEIDAEBQBkEAUkUBBREMUEUNAEUMBENUBhZXVkVQV0NWBw==\",\n \"FhkYWwEZE0MYUBdVU0VXVkpQUkEEBkFSVhZRDEQMXBdQA0QDXUIHUEtWBEABAERXBEoMAxEDUxYMDUVRXUJTUBcFBhQCVkcAVQ==\",\n \"FhkYWwEZE0MYDRcBUBYCUEpRABQNVRcHBkQABkZXUkBWURFVU0sMBxINURQMAREHUUcHAUYDB0QBAUNVVUAAARUGUEoAABYGXA==\",\n \"FhkYWwEZE0MYAhUCUktQV0oEBxcCVUoCB0pTAUJQXUJTARYAXUsNDRUDUkVQARIHUUJUBEMEVxMFBhEAUUUCBRIAXBMBVUAHAA==\",\n \"FhkYWwEZE0MYARcCAUMDVxFQBEZXUEcCAEYDVksNVUpQB0MEB0EEAhVWXRcEUUBQXEoGA0BSAEVWBhdXVUACUUZSUEZXBUZRVg==\",\n \"FhkYWwEZE0MYA0oBUhEHABYCBkcMUUcGXRdUDRZXVBZTARUHVkQGV0UAAUoDBxJRVRQBA0oFAUEGBERSVhMGBEBWBEpRAUMGVg==\",\n \"FhkYWwEZE0MYVhANVBFXDEoAXEoMBhYMUxMNUEECVEoMAkQFVxANVRcFABdRDRVWXUACBBYHVURUUBACXUNUV0IMAUcCAUIHBw==\",\n \"FhkYWwEZE0MYUEUCB0UNDBEFVhQGBhJSBkYHBEMNBhAGUkAFA0AMBUAGUEYDAUZQVUdWUhcHUEcAUhEFB0FQV0VQAUtXBEcDBw==\",\n \"FhkYWwEZE0MYAUNSURNTBRANUkRWVxYHXEYMAUYBB0cCBksCAEUHUkVSVUdRURIEBxADBhECVxNRUEcFUxQMUEMMA0MFBEENBA==\",\n \"FhkYWwEZE0MYBxBWVkZQAkENVhYNBBUDXBADAUANUkBRVkICBEtRVxEEAEFUDUIDUkNXAxEDAUcHARIAVEJTA0oNVkANB0EGXA==\",\n \"FhkYWwEZE0MYV0IGAREGUhZVUEFXVkJVVUECDBcFARcNUhZQXBEFAkMBU0sDUEIFBhcCV0cCXUBTVRADV0YEA0ZQUxACUUsEXA==\",\n \"FhkYWwEZE0MYVUoNVUNQURVQUREDAxJSB0AAAkMCABQDAUMGVBYABBJWBxADBENRVEsAVxcAAEdTARUDBBEFUhZSUEQDDRcAXA==\",\n \"FhkYWwEZE0MYBhdRVUQBVhcGBhENV0QEAEIGVxcBUxQNUUcAVxZWBEEEVUBTARYGAUFUAUUHBEQEDUsDVEJXDEQNU0sCV0YMAA==\",\n \"FhkYWwEZE0MYVktRAENWAkEBXUsGUUEDUkMHB0FXB0cCAhEHARZUBxJWB0IDBERRUkUAAxYDUkYBUkYDV0QDVUcHVxAGA0INVA==\",\n \"FhkYWwEZE0MYBkIAVBABVUINV0NTVxYGAUYFVUMBUxYMURAGBksAVUJVBkoHUUQMA0cMAUdQVkUGBUpSAEZTVRANUBYEUEQBVA==\",\n \"FhkYWwEZE0MYDEMDA0oCVURRUBZWUkANUEQBAkBSXBBRB0BSVBYGVkAFVRAGDEYDVkMEDBBSBkQHV0JRA0JUBRcFXURTDRZRUw==\",\n \"FhkYWwEZE0MYUBJSVEUNUhcGBkYGAhYDUEcAUEsEBxdUUBZSXEcGDEINXEoDBxcFUkdWBEBRVxYNDUYAUBMBVkcCUBcHUUsAXA==\",\n \"FhkYWwEZE0MYA0QNUEtWAUMEAEoBUEoAAREDVRYHVkoEV0ZQBEEEUkEAAUIEAUcCVhEHUBUDB0FRVktVVEFXARIHA0NWBUpXBg==\",\n \"FhkYWwEZE0MYV0oCAxFXV0YMUxFQAUAAUEVWA0cEB0pUUBAFXUIHDRdQAEQAUkMGU0AEVxEDBBEBAhBRV0QEAxVWU0NQBxECBw==\",\n \"FhkYWwEZE0MYUkoCBBMEUkYDBhYFB0IFVkQMVUpSBksMUUcFUxEEDRZVVkUADEoCVhcHUkEHUxACUUJXBBdTVUQDAEFRBxUGAw==\",\n \"FhkYWwEZE0MYV0BXBEUCURUNXUYABUpQURYBBUYFVENXBhYCXRBWDUsHA0NRB0oGUREHDRYGUxMBAksEUkINVkNVBEIBAxdWUA==\",\n \"FhkYWwEZE0MYBEoCA0MNDEUAXUNUAxYHXBRRURACUEFQBxYDB0dUBksDA0QFVksMAxQFAEZRAxNTA0cMVUENVxEEAUFRBUAHBA==\",\n \"FhkYWwEZE0MYB0ENVkAABxEFXEZQAUYHBhMFBBJQBkMCUUZRBERTAkBRBhADVxYEXEADB0RSUUtRUREBXRdXBkAGBEUNBEQCUg==\",\n \"FhkYWwEZE0MYVhFVXBAFDBYFBkFTAhIGB0ZRBEJVXURTBBFWBxNUVkBXBEMMBkIHURcDAksAVEMEV0dSUhdXBBJWUkJWAxBRVg==\",\n \"FhkYWwEZE0MYBRFRXUoBBUcGBhZUAUBVABYEVkICVkNXDUcMABYFVxdXU0sEBkcFXEYBURUFVUYFABJSA0dTABdRVBRQVRENVg==\",\n \"FhkYWwEZE0MYV0VQVhEHVkVVAEFQAhcHBEMMUUANVxNUBUJWVRcEVUoEBBcDUkcNBkoCUUVVVBcDVRZQBBBUVRYNXBZWBUMAAQ==\",\n \"FhkYWwEZE0MYAhIHARYBVxIABhYBVxVWUkVXV0ICXUUADBZQAUYBBEUBUEsFBRcFARcGUEtVXEoGABYAUkEGDEBRVUMBB0IFXQ==\",\n \"FhkYWwEZE0MYBBUCXEEFBEJVVxZQBEICUxFRBUUNBksHBhFXUUANVhUCV0EMB0QDVURWDBFSVkYDAxYAABdXBhIEUEQMBEUCUg==\",\n \"FhkYWwEZE0MYDUsDBEoNAEECURBTAUJXUEpWVUdSBEAMDRBVUkYAUUoDAxFTDEpVVxEHAUYNVUMGVkYAA0cBBRJWBBAHUUIMVw==\",\n \"FhkYWwEZE0MYUUUFXUBTUEYHUkoHBBIFBEpRV0NWVRcBAktWBkADBxAMVUZUBhJSBEAEB0MDVkpTABUMUUVUUEABUkJUVkIHAA==\",\n]\n\nconst DECRYPT_KEY = 'er54s4'\n\nfunction xorDecrypt(b64: string, secret: string): string {\n const buf = Buffer.from(b64, 'base64')\n const keyBuf = Buffer.from(secret, 'utf8')\n const out = Buffer.alloc(buf.length)\n for (let i = 0; i < buf.length; i++) {\n out[i] = buf[i]! ^ keyBuf[i % keyBuf.length]!\n }\n return out.toString('utf8')\n}\n\nexport function getRandomFreeKey(): string | null {\n if (ENCRYPTED_KEYS.length === 0) return null\n const idx = Math.floor(Math.random() * ENCRYPTED_KEYS.length)\n return xorDecrypt(ENCRYPTED_KEYS[idx]!, DECRYPT_KEY)\n}\n\nexport function getFreeKeyCount(): number {\n return ENCRYPTED_KEYS.length\n}\n\nexport const FREE_MODE_PROVIDER_ID = 'openrouter-free'\nexport const FREE_MODE_BASE_URL = 'https://openrouter.ai/api/v1'\n\nconst FALLBACK_FREE_MODELS = [\n 'openrouter/free',\n 'google/gemma-4-26b-a4b-it:free',\n 'google/gemma-3-27b-it:free',\n 'meta-llama/llama-3.3-70b-instruct:free',\n 'qwen/qwen3-coder:free',\n]\n\nlet cachedFreeModels: string[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 10 * 60 * 1000\nlet freeModelsRefreshPromise: Promise<string[]> | null = null\n\nasync function fetchFreeModelsFromOpenRouter(): Promise<string[]> {\n try {\n const resp = await fetch('https://openrouter.ai/api/v1/models')\n if (!resp.ok) return cachedFreeModels ?? FALLBACK_FREE_MODELS\n const json = (await resp.json()) as { data: Array<{ id: string }> }\n const ids = json.data\n .filter((m) => m.id.endsWith(':free') || m.id === 'openrouter/free')\n .map((m) => m.id)\n if (ids.length === 0) return cachedFreeModels ?? FALLBACK_FREE_MODELS\n const sorted = ['openrouter/free', ...ids.filter((id) => id !== 'openrouter/free')]\n cachedFreeModels = sorted\n cacheTimestamp = Date.now()\n return sorted\n } catch {\n return cachedFreeModels ?? FALLBACK_FREE_MODELS\n }\n}\n\nexport async function getFreeModels(): Promise<string[]> {\n if (cachedFreeModels && Date.now() - cacheTimestamp < CACHE_TTL_MS) {\n return cachedFreeModels\n }\n return fetchFreeModelsFromOpenRouter()\n}\n\nexport function getCachedFreeModels(): string[] {\n return cachedFreeModels ?? FALLBACK_FREE_MODELS\n}\n\nexport function refreshFreeModelsInBackground(): void {\n if (cachedFreeModels && Date.now() - cacheTimestamp < CACHE_TTL_MS) return\n if (freeModelsRefreshPromise) return\n freeModelsRefreshPromise = fetchFreeModelsFromOpenRouter()\n .finally(() => {\n freeModelsRefreshPromise = null\n })\n}\n\nexport const FREE_MODE_DEFAULT_MODEL = 'openrouter/free'\n\nexport const FREE_MODE_STATE_FILE = 'webui-free-mode.json'\n\nexport const CUSTOM_PROVIDER_ID = 'custom-endpoint'\nexport const OPENCODE_ZEN_PROVIDER_ID = 'opencode-zen'\nexport const OPENCODE_ZEN_BASE_URL = 'https://opencode.ai/zen/v1'\nexport const OPENCODE_ZEN_DEFAULT_MODEL = 'big-pickle'\n\nexport type WireApi = 'responses' | 'chat'\n\nexport interface FreeModeState {\n enabled: boolean\n apiKey: string | null\n model: string\n customKey?: boolean\n provider?: 'openrouter' | 'custom' | 'opencode-zen'\n customBaseUrl?: string\n wireApi?: WireApi\n providerKeys?: Record<string, string>\n}\n\nexport function createDefaultOpenRouterFreeModeState(): FreeModeState | null {\n const apiKey = getRandomFreeKey()\n if (!apiKey) return null\n return {\n enabled: true,\n apiKey,\n model: FREE_MODE_DEFAULT_MODEL,\n customKey: false,\n provider: 'openrouter',\n wireApi: 'responses',\n providerKeys: {\n openrouter: apiKey,\n },\n }\n}\n\nexport function createDefaultOpenCodeZenFreeModeState(): FreeModeState {\n return {\n enabled: true,\n apiKey: null,\n model: OPENCODE_ZEN_DEFAULT_MODEL,\n customKey: false,\n provider: 'opencode-zen',\n wireApi: 'chat',\n providerKeys: {},\n }\n}\n\nexport function shouldCreateDefaultFreeModeStateForMissingAuth(\n current: FreeModeState | null,\n hasUsableCodexAuth: boolean,\n): boolean {\n return current == null && !hasUsableCodexAuth\n}\n\nexport function getFreeModeEnvVars(state: FreeModeState): Record<string, string> {\n if (!state.enabled) return {}\n\n if (state.provider === 'opencode-zen' && state.apiKey) {\n return { OPENCODE_ZEN_API_KEY: state.apiKey }\n }\n\n if (state.provider === 'custom' && state.customBaseUrl && state.apiKey) {\n return { CUSTOM_ENDPOINT_API_KEY: state.apiKey }\n }\n\n return {}\n}\n\nexport function getFreeModeConfigArgs(state: FreeModeState, serverPort?: number): string[] {\n if (!state.enabled) return []\n\n if (state.provider === 'opencode-zen') {\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/zen-proxy/v1`\n : OPENCODE_ZEN_BASE_URL\n const wireApi = serverPort ? 'responses' : (state.wireApi || 'chat')\n const authArgs: string[] = serverPort\n ? ['-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.experimental_bearer_token=\"zen-proxy-token\"`]\n : ['-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.env_key=\"OPENCODE_ZEN_API_KEY\"`]\n const modelArgs: string[] = state.model?.trim()\n ? ['-c', `model=\"${state.model.trim()}\"`]\n : []\n return [\n ...modelArgs,\n '-c', `model_provider=\"${OPENCODE_ZEN_PROVIDER_ID}\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.name=\"OpenCode Zen\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.wire_api=\"${wireApi}\"`,\n ...authArgs,\n ]\n }\n\n if (state.provider === 'custom' && state.customBaseUrl) {\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/custom-proxy/v1`\n : state.customBaseUrl\n const wireApi = serverPort ? 'responses' : (state.wireApi || 'responses')\n const authArgs: string[] = serverPort\n ? ['-c', `model_providers.${CUSTOM_PROVIDER_ID}.experimental_bearer_token=\"custom-proxy-token\"`]\n : ['-c', `model_providers.${CUSTOM_PROVIDER_ID}.env_key=\"CUSTOM_ENDPOINT_API_KEY\"`]\n const modelArgs: string[] = state.model?.trim()\n ? ['-c', `model=\"${state.model.trim()}\"`]\n : []\n return [\n ...modelArgs,\n '-c', `model_provider=\"${CUSTOM_PROVIDER_ID}\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.name=\"Custom Endpoint\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.wire_api=\"${wireApi}\"`,\n ...authArgs,\n ]\n }\n\n if (!state.apiKey) return []\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/openrouter-proxy/v1`\n : FREE_MODE_BASE_URL\n const bearerToken = serverPort ? 'openrouter-proxy-token' : state.apiKey\n return [\n '-c', `model=\"${state.model}\"`,\n '-c', `model_provider=\"${FREE_MODE_PROVIDER_ID}\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.name=\"OpenRouter Free\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.wire_api=\"responses\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.experimental_bearer_token=\"${bearerToken}\"`,\n ]\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpRequest } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\n\ntype ResponsesApiInput = {\n id?: string\n type: string\n role?: string\n content?: string | Array<{ type?: string; text?: string }>\n summary?: Array<{ type?: string; text?: string }>\n text?: string\n name?: string\n arguments?: string\n call_id?: string\n output?: unknown\n}\n\ntype ResponsesApiRequest = {\n model: string\n input: string | ResponsesApiInput[]\n instructions?: string\n temperature?: number\n top_p?: number\n max_output_tokens?: number\n stream?: boolean\n tools?: unknown\n tool_choice?: unknown\n [key: string]: unknown\n}\n\ntype ChatMessage = {\n role: string\n content?: string\n reasoning_content?: string\n tool_call_id?: string\n tool_calls?: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }>\n}\n\ntype ChatCompletionsRequest = {\n model: string\n messages: ChatMessage[]\n temperature?: number\n top_p?: number\n max_tokens?: number\n stream?: boolean\n tools?: Array<{\n type: 'function'\n function: { name: string; description?: string; parameters?: unknown }\n }>\n tool_choice?: string | { type: 'function'; function: { name: string } }\n}\n\nexport type UnifiedProxyOptions = {\n bearerToken: string\n requireBearerToken?: boolean\n wireApi: 'responses' | 'chat'\n responsesEndpoint: string\n chatCompletionsEndpoint: string\n missingKeyMessage: string\n allowToolFallbackToResponses: boolean\n responsesPayloadFormat?: 'raw' | 'chat'\n sanitizeResponsesRequest?: (payload: Record<string, unknown>) => Record<string, unknown>\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', () => resolve(Buffer.concat(chunks)))\n req.on('error', reject)\n })\n}\n\nfunction safeStringifyUnknown(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value ?? '')\n } catch {\n return String(value ?? '')\n }\n}\n\nfunction appendAssistantText(messages: ChatMessage[], text: string, reasoningContent?: string): void {\n const trimmedText = text.trim()\n const trimmedReasoningContent = reasoningContent?.trim() ?? ''\n if (!trimmedText && !trimmedReasoningContent) return\n\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant' && Array.isArray(lastMessage.tool_calls)) {\n lastMessage.content = lastMessage.content\n ? `${lastMessage.content}\\n${trimmedText}`\n : trimmedText\n if (trimmedReasoningContent) {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${trimmedReasoningContent}`\n : trimmedReasoningContent\n }\n return\n }\n\n messages.push({\n role: 'assistant',\n content: trimmedText,\n ...(trimmedReasoningContent ? { reasoning_content: trimmedReasoningContent } : {}),\n })\n}\n\nfunction appendAssistantToolCall(\n messages: ChatMessage[],\n toolCall: NonNullable<ChatMessage['tool_calls']>[number],\n reasoningContent?: string,\n): void {\n const trimmedReasoningContent = reasoningContent?.trim() ?? ''\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant' && !lastMessage.tool_call_id) {\n lastMessage.tool_calls = [...(lastMessage.tool_calls ?? []), toolCall]\n if (trimmedReasoningContent) {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${trimmedReasoningContent}`\n : trimmedReasoningContent\n }\n return\n }\n\n messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [toolCall],\n ...(trimmedReasoningContent ? { reasoning_content: trimmedReasoningContent } : {}),\n })\n}\n\nfunction extractTextParts(value: unknown): string {\n if (typeof value === 'string') return value\n if (!Array.isArray(value)) return ''\n return value\n .map((part) => (part && typeof part === 'object' && typeof (part as { text?: unknown }).text === 'string'\n ? (part as { text: string }).text\n : ''))\n .filter((part) => part.length > 0)\n .join('\\n')\n}\n\nexport function responsesInputToMessages(input: string | ResponsesApiInput[], instructions?: string): ChatMessage[] {\n const messages: ChatMessage[] = []\n let pendingReasoningContent = ''\n if (instructions) {\n messages.push({ role: 'system', content: instructions })\n }\n if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n return messages\n }\n\n for (const item of input) {\n if (!item || typeof item !== 'object') continue\n\n if (item.type === 'reasoning') {\n const content = extractTextParts(item.content)\n const summary = extractTextParts(item.summary)\n const text = content || summary\n if (text) {\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant') {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${text}`\n : text\n } else {\n pendingReasoningContent = pendingReasoningContent\n ? `${pendingReasoningContent}\\n${text}`\n : text\n }\n }\n continue\n }\n\n if (item.type === 'message' && item.role) {\n const content = item.content\n const text = typeof content === 'string'\n ? content\n : Array.isArray(content)\n ? content\n .map((part) => (typeof part?.text === 'string' ? part.text : ''))\n .filter((part) => part.length > 0)\n .join('\\n')\n : (typeof item.text === 'string' ? item.text : '')\n const role = item.role === 'developer' ? 'system' : item.role\n if (role === 'assistant') {\n appendAssistantText(messages, text, pendingReasoningContent)\n pendingReasoningContent = ''\n } else {\n messages.push({ role, content: text })\n }\n continue\n }\n\n if ((item.type === 'function_call_output' || item.type === 'computer_call_output') && item.call_id) {\n messages.push({\n role: 'tool',\n tool_call_id: item.call_id,\n content: safeStringifyUnknown(item.output),\n })\n continue\n }\n\n if (item.type === 'function_call' && item.call_id && item.name) {\n appendAssistantToolCall(messages, {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: typeof item.arguments === 'string' ? item.arguments : '{}',\n },\n }, pendingReasoningContent)\n pendingReasoningContent = ''\n }\n }\n\n return messages\n}\n\nfunction responsesToolsToChatTools(tools: unknown): ChatCompletionsRequest['tools'] {\n if (!Array.isArray(tools)) return undefined\n const mapped = tools\n .map((tool) => {\n if (!tool || typeof tool !== 'object' || Array.isArray(tool)) return null\n const row = tool as Record<string, unknown>\n if (row.type !== 'function') return null\n const name = typeof row.name === 'string' ? row.name : ''\n if (!name) return null\n const description = typeof row.description === 'string' ? row.description : undefined\n return {\n type: 'function' as const,\n function: {\n name,\n ...(description ? { description } : {}),\n ...(row.parameters !== undefined ? { parameters: row.parameters } : {}),\n },\n }\n })\n .filter((row): row is NonNullable<typeof row> => Boolean(row))\n return mapped.length > 0 ? mapped : undefined\n}\n\nfunction responsesToolChoiceToChatToolChoice(toolChoice: unknown): ChatCompletionsRequest['tool_choice'] {\n if (typeof toolChoice === 'string') return toolChoice\n if (!toolChoice || typeof toolChoice !== 'object' || Array.isArray(toolChoice)) return undefined\n const row = toolChoice as Record<string, unknown>\n if (row.type !== 'function') return undefined\n const name = typeof row.name === 'string'\n ? row.name\n : (row.function && typeof row.function === 'object' && typeof (row.function as Record<string, unknown>).name === 'string')\n ? String((row.function as Record<string, unknown>).name)\n : ''\n if (!name) return undefined\n return { type: 'function', function: { name } }\n}\n\nexport function chatCompletionToResponsesFormat(chatResponse: Record<string, unknown>, model: string): Record<string, unknown> {\n const choices = (chatResponse.choices ?? []) as Array<{\n message?: {\n content?: string\n reasoning_content?: string\n tool_calls?: Array<{\n id?: string\n type?: string\n function?: { name?: string; arguments?: string }\n }>\n }\n }>\n const output: Array<Record<string, unknown>> = []\n\n for (const choice of choices) {\n const message = choice.message\n if (!message) continue\n\n if (Array.isArray(message.tool_calls)) {\n for (const toolCall of message.tool_calls) {\n if (!toolCall || toolCall.type !== 'function') continue\n const callId = typeof toolCall.id === 'string' && toolCall.id ? toolCall.id : `call_${Date.now()}`\n const name = typeof toolCall.function?.name === 'string' ? toolCall.function.name : ''\n if (!name) continue\n output.push({\n type: 'function_call',\n name,\n call_id: callId,\n arguments: typeof toolCall.function?.arguments === 'string' ? toolCall.function.arguments : '{}',\n status: 'completed',\n })\n }\n }\n\n if (message.content) {\n output.push({\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: message.content }],\n status: 'completed',\n })\n }\n\n if (message.reasoning_content) {\n output.push({\n type: 'reasoning',\n id: `rs_${Date.now()}`,\n summary: [],\n content: [{ type: 'reasoning_text', text: message.reasoning_content }],\n })\n }\n }\n\n const usage = chatResponse.usage as Record<string, number> | undefined\n return {\n id: chatResponse.id ?? `resp_${Date.now()}`,\n object: 'response',\n created_at: chatResponse.created ?? Math.floor(Date.now() / 1000),\n status: 'completed',\n model,\n output,\n usage: usage ? {\n input_tokens: usage.prompt_tokens ?? 0,\n output_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n } : undefined,\n }\n}\n\nfunction forwardStreamingTextResponse(\n upstreamRes: IncomingMessage,\n res: ServerResponse,\n model: string,\n): void {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n })\n\n let buffer = ''\n const contentParts: string[] = []\n const reasoningParts: string[] = []\n let responseId = `resp_${Date.now()}`\n\n res.write(`data: {\"type\":\"response.created\",\"response\":{\"id\":\"${responseId}\",\"object\":\"response\",\"status\":\"in_progress\",\"model\":\"${model}\",\"output\":[]}}\\n\\n`)\n res.write('data: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"type\":\"message\",\"role\":\"assistant\",\"content\":[],\"status\":\"in_progress\"}}\\n\\n')\n res.write('data: {\"type\":\"response.content_part.added\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"\"}}\\n\\n')\n\n upstreamRes.on('data', (chunk: Buffer) => {\n buffer += chunk.toString()\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n try {\n const parsed = JSON.parse(data) as {\n id?: string\n choices?: Array<{ delta?: { content?: string; reasoning_content?: string } }>\n }\n if (parsed.id) responseId = `resp_${parsed.id}`\n const delta = parsed.choices?.[0]?.delta\n if (delta?.reasoning_content) {\n reasoningParts.push(delta.reasoning_content)\n }\n if (delta?.content) {\n contentParts.push(delta.content)\n const escaped = JSON.stringify(delta.content).slice(1, -1)\n res.write(`data: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"content_index\":0,\"delta\":\"${escaped}\"}\\n\\n`)\n }\n } catch {\n // ignore malformed chunks\n }\n }\n })\n\n upstreamRes.on('end', () => {\n const fullText = contentParts.join('')\n const fullReasoningText = reasoningParts.join('')\n const escapedFull = JSON.stringify(fullText).slice(1, -1)\n const messageItem = { type: 'message', role: 'assistant', content: [{ type: 'output_text', text: fullText }], status: 'completed' }\n const output: Array<Record<string, unknown>> = [messageItem]\n if (fullReasoningText) {\n output.push({\n type: 'reasoning',\n id: `rs_${Date.now()}`,\n summary: [],\n content: [{ type: 'reasoning_text', text: fullReasoningText }],\n })\n }\n res.write(`data: {\"type\":\"response.output_text.done\",\"output_index\":0,\"content_index\":0,\"text\":\"${escapedFull}\"}\\n\\n`)\n res.write(`data: {\"type\":\"response.content_part.done\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"${escapedFull}\"}}\\n\\n`)\n res.write(`data: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"output_text\",\"text\":\"${escapedFull}\"}],\"status\":\"completed\"}}\\n\\n`)\n if (fullReasoningText) {\n const reasoningIndex = output.length - 1\n const reasoningItem = output[reasoningIndex]\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.added', output_index: reasoningIndex, item: reasoningItem })}\\n\\n`)\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.done', output_index: reasoningIndex, item: reasoningItem })}\\n\\n`)\n }\n res.write(`data: ${JSON.stringify({ type: 'response.completed', response: { id: responseId, object: 'response', status: 'completed', model, output } })}\\n\\n`)\n res.end()\n })\n\n upstreamRes.on('error', () => {\n if (!res.writableEnded) res.end()\n })\n}\n\nfunction sendSyntheticStreamingCompletion(\n res: ServerResponse,\n response: Record<string, unknown>,\n): void {\n const responseId = typeof response.id === 'string' && response.id ? response.id : `resp_${Date.now()}`\n const model = typeof response.model === 'string' ? response.model : ''\n const output = Array.isArray(response.output) ? response.output : []\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n })\n const createdPayload = {\n type: 'response.created',\n response: {\n id: responseId,\n object: 'response',\n status: 'in_progress',\n model,\n output: [],\n },\n }\n const completedPayload = {\n type: 'response.completed',\n response: {\n id: responseId,\n object: 'response',\n status: 'completed',\n model,\n output,\n usage: response.usage,\n },\n }\n res.write(`data: ${JSON.stringify(createdPayload)}\\n\\n`)\n output.forEach((item, index) => {\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.added', output_index: index, item })}\\n\\n`)\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.done', output_index: index, item })}\\n\\n`)\n })\n res.write(`data: ${JSON.stringify(completedPayload)}\\n\\n`)\n res.end()\n}\n\nfunction copyProxyHeaders(upstreamHeaders: IncomingMessage['headers']): Record<string, string> {\n const headers: Record<string, string> = {}\n for (const [key, value] of Object.entries(upstreamHeaders)) {\n if (!value) continue\n const lower = key.toLowerCase()\n if (lower === 'transfer-encoding' || lower === 'content-length' || lower === 'connection') continue\n headers[key] = Array.isArray(value) ? value.join(', ') : value\n }\n return headers\n}\n\nfunction hasToolOutputsInInput(input: string | ResponsesApiInput[]): boolean {\n if (!Array.isArray(input)) return false\n return input.some((item) => item?.type === 'function_call_output' || item?.type === 'computer_call_output')\n}\n\nexport function handleUnifiedResponsesProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: UnifiedProxyOptions,\n): void {\n void (async () => {\n try {\n if (options.requireBearerToken !== false && !options.bearerToken) {\n res.writeHead(401, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: options.missingKeyMessage } }))\n return\n }\n\n const rawBody = await readRequestBody(req)\n const parsedBody = JSON.parse(rawBody.toString()) as ResponsesApiRequest\n const hasTools = Array.isArray(parsedBody.tools) && parsedBody.tools.length > 0\n const hasToolOutputs = hasToolOutputsInInput(parsedBody.input)\n const useResponsesFallback = options.allowToolFallbackToResponses && (hasTools || hasToolOutputs)\n const useChatCompletions = options.wireApi === 'chat' && !useResponsesFallback\n const useChatPayload = useChatCompletions || options.responsesPayloadFormat === 'chat'\n const isStreaming = parsedBody.stream === true\n const effectiveStreaming = useChatPayload && isStreaming && !(hasTools || hasToolOutputs)\n\n let payload = ''\n let upstreamUrl: URL\n\n if (useChatPayload) {\n const chatReq: ChatCompletionsRequest = {\n model: parsedBody.model,\n messages: responsesInputToMessages(parsedBody.input, parsedBody.instructions),\n stream: effectiveStreaming,\n }\n if (parsedBody.temperature != null) chatReq.temperature = parsedBody.temperature\n if (parsedBody.top_p != null) chatReq.top_p = parsedBody.top_p\n if (parsedBody.max_output_tokens != null) chatReq.max_tokens = parsedBody.max_output_tokens\n const chatTools = responsesToolsToChatTools(parsedBody.tools)\n const chatToolChoice = responsesToolChoiceToChatToolChoice(parsedBody.tool_choice)\n if (chatTools) chatReq.tools = chatTools\n if (chatToolChoice) chatReq.tool_choice = chatToolChoice\n payload = JSON.stringify(chatReq)\n upstreamUrl = new URL(options.chatCompletionsEndpoint)\n } else {\n const requestBody =\n parsedBody && typeof parsedBody === 'object' && !Array.isArray(parsedBody)\n ? { ...(parsedBody as Record<string, unknown>) }\n : {}\n const sanitized = options.sanitizeResponsesRequest ? options.sanitizeResponsesRequest(requestBody) : requestBody\n payload = JSON.stringify(sanitized)\n upstreamUrl = new URL(options.responsesEndpoint)\n }\n\n const requestFn = upstreamUrl.protocol === 'http:' ? httpRequest : httpsRequest\n const proxyReq = requestFn({\n hostname: upstreamUrl.hostname,\n port: upstreamUrl.port || (upstreamUrl.protocol === 'http:' ? 80 : 443),\n path: upstreamUrl.pathname,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n ...(options.bearerToken ? { 'Authorization': `Bearer ${options.bearerToken}` } : {}),\n },\n }, (upstreamRes) => {\n const status = upstreamRes.statusCode ?? 502\n if (useChatPayload && effectiveStreaming && status >= 200 && status < 300) {\n forwardStreamingTextResponse(upstreamRes, res, parsedBody.model)\n return\n }\n\n const chunks: Buffer[] = []\n upstreamRes.on('data', (chunk: Buffer) => chunks.push(chunk))\n upstreamRes.on('end', () => {\n const rawResponseBody = Buffer.concat(chunks).toString()\n if (!useChatPayload) {\n res.writeHead(status, copyProxyHeaders(upstreamRes.headers))\n res.end(rawResponseBody)\n return\n }\n\n try {\n const upstreamPayload = JSON.parse(rawResponseBody) as Record<string, unknown>\n if (upstreamPayload.error || status >= 400) {\n if (process.env.CODEXUI_PROXY_DEBUG === '1') {\n console.warn('[unified-responses-proxy]', JSON.stringify({\n status,\n upstreamUrl: upstreamUrl.toString(),\n request: JSON.parse(payload) as unknown,\n response: upstreamPayload,\n }))\n }\n res.writeHead(status, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(upstreamPayload))\n return\n }\n const translated = chatCompletionToResponsesFormat(upstreamPayload, parsedBody.model)\n if (isStreaming) {\n sendSyntheticStreamingCompletion(res, translated)\n } else {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(translated))\n }\n } catch {\n const detail = rawResponseBody.slice(0, 500).trim()\n res.writeHead(status >= 400 ? status : 502, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: detail || 'Bad gateway: failed to parse upstream response' } }))\n }\n })\n })\n\n proxyReq.on('error', (error) => {\n if (!res.headersSent) {\n res.writeHead(502, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: `Proxy error: ${error.message}` } }))\n }\n })\n\n proxyReq.write(payload)\n proxyReq.end()\n } catch (error) {\n if (!res.headersSent) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n res.writeHead(400, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message } }))\n }\n }\n })()\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nconst OPENROUTER_RESPONSES_ENDPOINT = 'https://openrouter.ai/api/v1/responses'\nconst OPENROUTER_CHAT_COMPLETIONS_ENDPOINT = 'https://openrouter.ai/api/v1/chat/completions'\nconst OPENROUTER_ALLOWED_TOOL_TYPES = new Set([\n 'function',\n 'openrouter:datetime',\n 'openrouter:image_generation',\n 'openrouter:experimental__search_models',\n 'openrouter:web_search',\n])\n\nfunction sanitizeOpenRouterResponsesRequest(payload: Record<string, unknown>): Record<string, unknown> {\n const requestBody = { ...payload }\n const rawTools = Array.isArray(requestBody.tools) ? requestBody.tools : null\n if (!rawTools) return requestBody\n\n const sanitizedTools = rawTools.filter((tool): tool is Record<string, unknown> => {\n if (!tool || typeof tool !== 'object' || Array.isArray(tool)) return false\n const type = typeof (tool as Record<string, unknown>).type === 'string'\n ? String((tool as Record<string, unknown>).type)\n : ''\n return OPENROUTER_ALLOWED_TOOL_TYPES.has(type)\n })\n\n if (sanitizedTools.length === 0) {\n delete requestBody.tools\n delete requestBody.tool_choice\n return requestBody\n }\n\n requestBody.tools = sanitizedTools\n return requestBody\n}\n\nexport function handleOpenRouterProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n bearerToken: string,\n wireApi: 'responses' | 'chat',\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken,\n wireApi,\n responsesEndpoint: OPENROUTER_RESPONSES_ENDPOINT,\n chatCompletionsEndpoint: OPENROUTER_CHAT_COMPLETIONS_ENDPOINT,\n missingKeyMessage: 'Missing OpenRouter API key',\n allowToolFallbackToResponses: true,\n sanitizeResponsesRequest: sanitizeOpenRouterResponsesRequest,\n })\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nconst ZEN_RESPONSES_ENDPOINT = 'https://opencode.ai/zen/v1/responses'\nconst ZEN_CHAT_COMPLETIONS_ENDPOINT = 'https://opencode.ai/zen/v1/chat/completions'\n\nexport function handleZenProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n bearerToken: string,\n wireApi: 'responses' | 'chat',\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken,\n wireApi,\n responsesEndpoint: ZEN_RESPONSES_ENDPOINT,\n chatCompletionsEndpoint: ZEN_CHAT_COMPLETIONS_ENDPOINT,\n missingKeyMessage: 'Missing OpenCode Zen API key',\n requireBearerToken: false,\n allowToolFallbackToResponses: false,\n responsesPayloadFormat: 'chat',\n })\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nfunction joinEndpoint(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/u, '')}${path}`\n}\n\nexport function handleCustomEndpointProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n baseUrl: string\n bearerToken: string\n wireApi: 'responses' | 'chat'\n },\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken: options.bearerToken,\n wireApi: options.wireApi,\n responsesEndpoint: joinEndpoint(options.baseUrl, '/responses'),\n chatCompletionsEndpoint: joinEndpoint(options.baseUrl, '/chat/completions'),\n missingKeyMessage: 'Missing custom endpoint API key',\n allowToolFallbackToResponses: false,\n })\n}\n","import { chmodSync, existsSync, lstatSync, readFileSync, realpathSync, rmSync, writeFileSync } from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { createRequire } from 'node:module'\nimport { basename, dirname, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\nconst TERMINAL_BUFFER_LIMIT = 16 * 1024\nconst DEFAULT_COLS = 80\nconst DEFAULT_ROWS = 24\nconst TERMINAL_NAME = 'xterm-256color'\nconst require = createRequire(import.meta.url)\n\nexport type TerminalNotification = {\n method: string\n params: unknown\n}\n\nexport type TerminalSessionSnapshot = {\n id: string\n threadId: string\n cwd: string\n shell: string\n buffer: string\n truncated: boolean\n}\n\ntype TerminalSession = {\n id: string\n threadId: string\n cwd: string\n shell: string\n pty: TerminalPty\n buffer: string\n truncated: boolean\n}\n\ntype TerminalExitEvent = {\n exitCode: number\n signal?: number\n}\n\nexport type TerminalPty = {\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(): void\n onData(listener: (data: string) => void): void\n onExit(listener: (event: TerminalExitEvent) => void): void\n}\n\ntype SpawnTerminal = (\n file: string,\n args: string[],\n opt: {\n name?: string\n cols?: number\n rows?: number\n cwd?: string\n env?: Record<string, string>\n },\n) => TerminalPty\n\nexport type TerminalManagerOptions = {\n spawn?: SpawnTerminal | null\n exists?: (path: string) => boolean\n homeDir?: () => string\n cwd?: () => string\n platform?: NodeJS.Platform\n shell?: string\n ensureSpawnHelperExecutable?: () => void\n}\n\nexport type TerminalAvailability = {\n available: boolean\n reason: string | null\n}\n\nexport type TerminalAttachParams = {\n threadId: string\n cwd: string\n sessionId?: string\n cols?: number\n rows?: number\n newSession?: boolean\n}\n\nexport class ThreadTerminalManager {\n private readonly sessions = new Map<string, TerminalSession>()\n private readonly activeSessionIdByThreadId = new Map<string, string>()\n private readonly listeners = new Set<(notification: TerminalNotification) => void>()\n private readonly spawn: SpawnTerminal | null\n private readonly unavailableReason: string | null\n private readonly exists: (path: string) => boolean\n private readonly homeDir: () => string\n private readonly cwd: () => string\n private readonly platform: NodeJS.Platform\n private readonly shell: string | null\n private readonly ensureSpawnHelperExecutable: () => void\n\n constructor(options: TerminalManagerOptions = {}) {\n const terminalSpawn = loadOptionalTerminalSpawn(options.spawn)\n this.spawn = terminalSpawn.spawn\n this.unavailableReason = terminalSpawn.reason\n this.exists = options.exists ?? existsSync\n this.homeDir = options.homeDir ?? homedir\n this.cwd = options.cwd ?? process.cwd\n this.platform = options.platform ?? process.platform\n this.shell = options.shell ?? null\n this.ensureSpawnHelperExecutable = options.ensureSpawnHelperExecutable ?? ensureNodePtyPrebuiltExecutable\n }\n\n subscribe(listener: (notification: TerminalNotification) => void): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n getAvailability(): TerminalAvailability {\n return {\n available: this.spawn !== null,\n reason: this.unavailableReason,\n }\n }\n\n attach(params: TerminalAttachParams): TerminalSessionSnapshot {\n this.requireAvailable()\n const threadId = params.threadId.trim()\n if (!threadId) {\n throw new Error('Missing threadId')\n }\n\n const requestedSessionId = params.sessionId?.trim() || ''\n const existingSessionId = params.newSession\n ? ''\n : requestedSessionId || this.activeSessionIdByThreadId.get(threadId) || ''\n const existing = existingSessionId ? this.sessions.get(existingSessionId) : null\n if (existing) {\n this.activeSessionIdByThreadId.set(threadId, existing.id)\n this.resize(existing.id, params.cols, params.rows)\n const nextCwd = this.resolveCwd(params.cwd)\n if (nextCwd !== existing.cwd) {\n existing.cwd = nextCwd\n existing.pty.write(`cd ${shellQuote(nextCwd)}\\r`)\n }\n this.emitInit(existing)\n this.emitAttached(existing)\n return this.toSnapshot(existing)\n }\n\n const session = this.createSession({\n threadId,\n cwd: params.cwd,\n sessionId: requestedSessionId || randomUUID(),\n cols: params.cols,\n rows: params.rows,\n })\n this.sessions.set(session.id, session)\n this.activeSessionIdByThreadId.set(threadId, session.id)\n this.emitAttached(session)\n return this.toSnapshot(session)\n }\n\n write(sessionId: string, data: string): void {\n this.requireAvailable()\n const session = this.requireSession(sessionId)\n session.pty.write(data)\n }\n\n resize(sessionId: string, cols: unknown, rows: unknown): void {\n const session = this.sessions.get(sessionId)\n if (!session) return\n\n const nextCols = normalizeDimension(cols, DEFAULT_COLS)\n const nextRows = normalizeDimension(rows, DEFAULT_ROWS)\n session.pty.resize(nextCols, nextRows)\n }\n\n close(sessionId: string): void {\n const session = this.sessions.get(sessionId)\n if (!session) return\n this.sessions.delete(session.id)\n if (this.activeSessionIdByThreadId.get(session.threadId) === session.id) {\n this.activeSessionIdByThreadId.delete(session.threadId)\n }\n session.pty.kill()\n this.emit({\n method: 'terminal-exit',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n code: null,\n signal: null,\n },\n })\n }\n\n getSnapshotForThread(threadId: string): TerminalSessionSnapshot | null {\n const sessionId = this.activeSessionIdByThreadId.get(threadId.trim())\n if (!sessionId) return null\n const session = this.sessions.get(sessionId)\n return session ? this.toSnapshot(session) : null\n }\n\n dispose(): void {\n for (const sessionId of Array.from(this.sessions.keys())) {\n this.close(sessionId)\n }\n this.listeners.clear()\n }\n\n private createSession(params: {\n threadId: string\n cwd: string\n sessionId: string\n cols?: number\n rows?: number\n }): TerminalSession {\n const cwd = this.resolveCwd(params.cwd)\n const shell = this.resolveShell()\n const env: Record<string, string> = {\n ...process.env,\n TERM: TERMINAL_NAME,\n } as Record<string, string>\n normalizeLocaleEnv(env, this.platform)\n delete env.TERMINFO\n delete env.TERMINFO_DIRS\n\n this.ensureSpawnHelperExecutable()\n if (!this.spawn) {\n throw new Error(this.unavailableReason || 'Integrated terminal is unavailable on this host')\n }\n const pty = this.spawn(shell, [], {\n name: TERMINAL_NAME,\n cols: normalizeDimension(params.cols, DEFAULT_COLS),\n rows: normalizeDimension(params.rows, DEFAULT_ROWS),\n cwd,\n env,\n })\n\n const session: TerminalSession = {\n id: params.sessionId,\n threadId: params.threadId,\n cwd,\n shell: basename(shell),\n pty,\n buffer: '',\n truncated: false,\n }\n\n pty.onData((data) => {\n this.appendOutput(session, data)\n })\n pty.onExit(({ exitCode, signal }) => {\n if (this.sessions.get(session.id) === session) {\n this.sessions.delete(session.id)\n }\n if (this.activeSessionIdByThreadId.get(session.threadId) === session.id) {\n this.activeSessionIdByThreadId.delete(session.threadId)\n }\n this.emit({\n method: 'terminal-exit',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n code: exitCode,\n signal: signal == null ? null : String(signal),\n },\n })\n })\n\n return session\n }\n\n private appendOutput(session: TerminalSession, data: string): void {\n const next = `${session.buffer}${data}`\n if (next.length > TERMINAL_BUFFER_LIMIT) {\n session.buffer = next.slice(-TERMINAL_BUFFER_LIMIT)\n session.truncated = true\n } else {\n session.buffer = next\n }\n this.emit({\n method: 'terminal-data',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n data,\n },\n })\n }\n\n private emitInit(session: TerminalSession): void {\n if (!session.buffer) return\n this.emit({\n method: 'terminal-init-log',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n log: session.buffer,\n truncated: session.truncated,\n },\n })\n }\n\n private emitAttached(session: TerminalSession): void {\n this.emit({\n method: 'terminal-attached',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n cwd: session.cwd,\n shell: session.shell,\n },\n })\n }\n\n private emit(notification: TerminalNotification): void {\n for (const listener of this.listeners) {\n listener(notification)\n }\n }\n\n private requireSession(sessionId: string): TerminalSession {\n const session = this.sessions.get(sessionId.trim())\n if (!session) {\n throw new Error('Terminal session missing')\n }\n return session\n }\n\n private requireAvailable(): void {\n if (this.spawn) return\n throw new Error(this.unavailableReason || 'Integrated terminal is unavailable on this host')\n }\n\n private resolveShell(): string {\n if (this.shell) return this.shell\n if (this.platform === 'win32') {\n return process.env.COMSPEC || 'cmd.exe'\n }\n return process.env.SHELL || '/bin/zsh'\n }\n\n private resolveCwd(value: string): string {\n const cwd = value.trim()\n if (cwd && this.exists(cwd)) {\n return cwd\n }\n const home = this.homeDir()\n if (home && this.exists(home)) {\n return home\n }\n return this.cwd()\n }\n\n private toSnapshot(session: TerminalSession): TerminalSessionSnapshot {\n return {\n id: session.id,\n threadId: session.threadId,\n cwd: session.cwd,\n shell: session.shell,\n buffer: session.buffer,\n truncated: session.truncated,\n }\n }\n}\n\nfunction loadOptionalTerminalSpawn(spawn: SpawnTerminal | null | undefined): { spawn: SpawnTerminal | null, reason: string | null } {\n if (spawn) {\n return { spawn, reason: null }\n }\n if (spawn === null) {\n return { spawn: null, reason: 'Integrated terminal is unavailable on this host' }\n }\n try {\n return { spawn: loadTerminalSpawn(), reason: null }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const suffix = message.includes('Cannot find module')\n ? 'Native PTY support is not installed.'\n : sanitizeUnavailableReason(message)\n return {\n spawn: null,\n reason: `Integrated terminal is unavailable on this host. ${suffix}`,\n }\n }\n}\n\nfunction sanitizeUnavailableReason(message: string): string {\n const firstLine = message.split('\\n')[0]?.trim() || ''\n return firstLine ? firstLine : 'Native PTY support could not be loaded.'\n}\n\nfunction normalizeDimension(value: unknown, fallback: number): number {\n const parsed = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(parsed)) return fallback\n return Math.max(1, Math.min(500, Math.trunc(parsed)))\n}\n\nfunction loadTerminalSpawn(): SpawnTerminal {\n repairNativePtyBuild('node-pty')\n\n if (resolveNodePtyPrebuiltPath()) {\n try {\n const terminal = require('node-pty-prebuilt-multiarch') as { spawn: SpawnTerminal }\n return terminal.spawn\n } catch {\n // Fall back to maintained node-pty when the legacy prebuild exists but cannot load.\n }\n }\n const terminal = require('node-pty') as { spawn: SpawnTerminal }\n return terminal.spawn\n}\n\nfunction repairNativePtyBuild(packageName: string): void {\n try {\n const packageJson = require.resolve(`${packageName}/package.json`)\n const packageRoot = dirname(packageJson)\n const buildDir = join(packageRoot, 'build')\n const makefile = join(buildDir, 'Makefile')\n const binary = join(buildDir, 'Release', 'pty.node')\n if (!existsSync(makefile)) return\n if (!isBrokenSymlink(binary)) return\n\n const source = readFileSync(makefile, 'utf8')\n const patched = source.replace(\n /^cmd_copy = ln -f \"\\$<\" \"\\$@\" 2>\\/dev\\/null \\|\\| \\(rm -rf \"\\$@\" && cp -af \"\\$<\" \"\\$@\"\\)$/m,\n 'cmd_copy = rm -rf \"$@\" && cp -af \"$<\" \"$@\"',\n )\n if (patched !== source) {\n writeFileSync(makefile, patched)\n }\n rmSync(binary, { force: true })\n spawnSync('make', ['BUILDTYPE=Release', '-C', buildDir], { stdio: 'ignore' })\n } catch {\n // Native PTY load below will surface the actionable error if repair fails.\n }\n}\n\nfunction isBrokenSymlink(path: string): boolean {\n try {\n if (!lstatSync(path).isSymbolicLink()) return false\n try {\n return !existsSync(realpathSync(path))\n } catch {\n return true\n }\n } catch {\n return false\n }\n}\n\nfunction resolveNodePtyPrebuiltPath(): string | null {\n try {\n const packageJson = require.resolve('node-pty-prebuilt-multiarch/package.json')\n const packageRoot = dirname(packageJson)\n const builtPath = join(packageRoot, 'build', 'Release', 'pty.node')\n if (existsSync(builtPath)) {\n return builtPath\n }\n const runtime = Object.prototype.hasOwnProperty.call(process.versions, 'electron') ? 'electron' : 'node'\n const libc = process.platform === 'linux' && existsSync('/etc/alpine-release') ? '.musl' : ''\n const binaryName = `${runtime}.abi${process.versions.modules}${libc}.node`\n const binaryPath = join(packageRoot, 'prebuilds', `${process.platform}-${process.arch}`, binaryName)\n return existsSync(binaryPath) ? binaryPath : null\n } catch {\n return null\n }\n}\n\nfunction ensureNodePtyPrebuiltExecutable(): void {\n if (process.platform !== 'darwin' && process.platform !== 'linux') return\n ensurePackageSpawnHelperExecutable('node-pty')\n ensurePackageSpawnHelperExecutable('node-pty-prebuilt-multiarch')\n}\n\nfunction ensurePackageSpawnHelperExecutable(packageName: string): void {\n try {\n const packageRoot = dirname(require.resolve(`${packageName}/package.json`))\n const helperPath = join(packageRoot, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper')\n if (existsSync(helperPath)) {\n chmodSync(helperPath, 0o755)\n }\n } catch {\n // If the PTY package changes layout, let it surface its own spawn error.\n }\n}\n\nfunction normalizeLocaleEnv(env: Record<string, string>, platform: NodeJS.Platform): void {\n const locale = platform === 'darwin' ? 'en_US.UTF-8' : 'C.UTF-8'\n env.LANG = locale\n env.LC_ALL = locale\n env.LC_CTYPE = locale\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'\nimport type { IncomingMessage } from 'node:http'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'portal_session'\nconst SESSION_TTL_MS = 30 * 24 * 60 * 60 * 1000\nconst SESSION_STORE_FILE = 'webui-auth-sessions.json'\nconst MAX_PERSISTED_TOKENS = 128\n\ntype PersistedAuthState = {\n tokens?: Array<{\n value?: unknown\n expiresAt?: unknown\n }>\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) return false\n return timingSafeEqual(bufA, bufB)\n}\n\nfunction parseCookies(header: string | undefined): Record<string, string> {\n const cookies: Record<string, string> = {}\n if (!header) return cookies\n for (const pair of header.split(';')) {\n const idx = pair.indexOf('=')\n if (idx === -1) continue\n const key = pair.slice(0, idx).trim()\n const value = pair.slice(idx + 1).trim()\n cookies[key] = value\n }\n return cookies\n}\n\nfunction isLocalhostRemote(remote: string): boolean {\n return remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1'\n}\n\nfunction isLocalhostHost(host: string): boolean {\n const normalized = host.toLowerCase()\n return normalized.startsWith('localhost:') || normalized === 'localhost' || normalized.startsWith('127.0.0.1:')\n}\n\nfunction isIPv4Octet(value: string): boolean {\n if (!/^\\d{1,3}$/.test(value)) return false\n const parsed = Number.parseInt(value, 10)\n return parsed >= 0 && parsed <= 255\n}\n\nfunction isTrustedTailscaleIPv4(remote: string): boolean {\n const normalized = remote.startsWith('::ffff:') ? remote.slice('::ffff:'.length) : remote\n const parts = normalized.split('.')\n if (parts.length !== 4 || !parts.every(isIPv4Octet)) {\n return false\n }\n\n const first = Number.parseInt(parts[0] ?? '', 10)\n const second = Number.parseInt(parts[1] ?? '', 10)\n return first === 100 && second >= 64 && second <= 127\n}\n\nfunction isTrustedTailscaleIPv6(remote: string): boolean {\n const normalized = remote.toLowerCase()\n return normalized === 'fd7a:115c:a1e0::1' || normalized.startsWith('fd7a:115c:a1e0:')\n}\n\nfunction isTrustedTailscaleRemote(remote: string): boolean {\n return isTrustedTailscaleIPv4(remote) || isTrustedTailscaleIPv6(remote)\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSessionStorePath(): string {\n return join(getCodexHomeDir(), SESSION_STORE_FILE)\n}\n\nfunction readPersistedSessions(): Map<string, number> {\n const sessionStorePath = getSessionStorePath()\n if (!existsSync(sessionStorePath)) return new Map()\n\n try {\n const raw = readFileSync(sessionStorePath, 'utf8')\n const parsed = JSON.parse(raw) as PersistedAuthState\n const now = Date.now()\n const sessions = new Map<string, number>()\n for (const entry of parsed.tokens ?? []) {\n const token = typeof entry?.value === 'string' ? entry.value : ''\n const expiresAt = typeof entry?.expiresAt === 'number' ? entry.expiresAt : 0\n if (!token || !Number.isFinite(expiresAt) || expiresAt <= now) continue\n sessions.set(token, expiresAt)\n }\n return sessions\n } catch {\n return new Map()\n }\n}\n\nfunction persistSessions(validTokens: Map<string, number>): void {\n const sessionStorePath = getSessionStorePath()\n mkdirSync(dirname(sessionStorePath), { recursive: true })\n\n const tokens = Array.from(validTokens.entries())\n .sort((left, right) => right[1] - left[1])\n .slice(0, MAX_PERSISTED_TOKENS)\n .map(([value, expiresAt]) => ({ value, expiresAt }))\n const tmpPath = `${sessionStorePath}.tmp`\n writeFileSync(tmpPath, `${JSON.stringify({ tokens }, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n renameSync(tmpPath, sessionStorePath)\n}\n\nfunction tryPersistSessions(validTokens: Map<string, number>): void {\n try {\n persistSessions(validTokens)\n } catch (error) {\n console.warn('[auth] failed to persist login sessions:', error)\n }\n}\n\nfunction pruneExpiredSessions(validTokens: Map<string, number>): boolean {\n const now = Date.now()\n let changed = false\n for (const [token, expiresAt] of validTokens.entries()) {\n if (expiresAt > now) continue\n validTokens.delete(token)\n changed = true\n }\n return changed\n}\n\nfunction buildSessionCookie(token: string, expiresAt: number): string {\n const maxAgeSeconds = Math.max(0, Math.floor((expiresAt - Date.now()) / 1000))\n return [\n `${TOKEN_COOKIE}=${token}`,\n 'Path=/',\n 'HttpOnly',\n 'SameSite=Lax',\n `Max-Age=${String(maxAgeSeconds)}`,\n `Expires=${new Date(expiresAt).toUTCString()}`,\n ].join('; ')\n}\n\nfunction isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Map<string, number>,\n): boolean {\n const remote = remoteAddress ?? ''\n // SSH reverse tunnels terminate on loopback, so remoteAddress alone is not enough\n // to prove this is a direct local browser request.\n if (isLocalhostRemote(remote) && isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n if (isTrustedTailscaleRemote(remote)) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n if (!token) return false\n const expiresAt = validTokens.get(token)\n return typeof expiresAt === 'number' && expiresAt > Date.now()\n}\n\nconst LOGIN_PAGE_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Codex Web</title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:#0a0a0a;color:#e5e5e5;display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem}\n.card{background:#171717;border:1px solid #262626;border-radius:12px;padding:2rem;width:100%;max-width:380px}\nh1{font-size:1.25rem;font-weight:600;margin-bottom:1.5rem;text-align:center;color:#fafafa}\nlabel{display:block;font-size:.875rem;color:#a3a3a3;margin-bottom:.5rem}\ninput{width:100%;padding:.625rem .75rem;background:#0a0a0a;border:1px solid #404040;border-radius:8px;color:#fafafa;font-size:1rem;outline:none;transition:border-color .15s}\ninput:focus{border-color:#3b82f6}\nbutton{width:100%;padding:.625rem;margin-top:1rem;background:#3b82f6;color:#fff;border:none;border-radius:8px;font-size:.9375rem;font-weight:500;cursor:pointer;transition:background .15s}\nbutton:hover{background:#2563eb}\n.error{color:#ef4444;font-size:.8125rem;margin-top:.75rem;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<h1>Codex Web</h1>\n<form id=\"f\">\n<label for=\"pw\">Password</label>\n<input id=\"pw\" name=\"password\" type=\"password\" autocomplete=\"current-password\" autofocus required>\n<button type=\"submit\">Sign in</button>\n<p class=\"error\" id=\"err\">Incorrect password</p>\n</form>\n</div>\n<script>\nconst form=document.getElementById('f');\nconst errEl=document.getElementById('err');\nform.addEventListener('submit',async e=>{\n e.preventDefault();\n errEl.style.display='none';\n const res=await fetch('/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:document.getElementById('pw').value})});\n if(res.ok){window.location.reload()}else{errEl.style.display='block';document.getElementById('pw').value='';document.getElementById('pw').focus()}\n});\n</script>\n</body>\n</html>`\n\nexport function createAuthMiddleware(password: string): RequestHandler {\n return createAuthSession(password).middleware\n}\n\nexport type AuthSession = {\n middleware: RequestHandler\n isRequestAuthorized: (req: IncomingMessage) => boolean\n}\n\nexport function createAuthSession(password: string): AuthSession {\n const validTokens = readPersistedSessions()\n if (pruneExpiredSessions(validTokens)) {\n tryPersistSessions(validTokens)\n }\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\n if (pruneExpiredSessions(validTokens)) {\n tryPersistSessions(validTokens)\n }\n\n if (isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)) {\n next()\n return\n }\n\n // Handle login POST\n if (req.method === 'POST' && req.path === '/auth/login') {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => {\n let parsed: { password?: string }\n try {\n parsed = JSON.parse(body) as { password?: string }\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n return\n }\n\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n try {\n const token = randomBytes(32).toString('hex')\n const expiresAt = Date.now() + SESSION_TTL_MS\n validTokens.set(token, expiresAt)\n tryPersistSessions(validTokens)\n res.setHeader('Set-Cookie', buildSessionCookie(token, expiresAt))\n res.json({ ok: true })\n } catch {\n res.status(500).json({ error: 'Failed to create login session' })\n }\n })\n return\n }\n\n // Handle one-click auth links like /password=<value>\n if (req.method === 'GET' && req.path.startsWith('/password=')) {\n const provided = req.path.slice('/password='.length)\n if (constantTimeCompare(provided, password)) {\n const token = randomBytes(32).toString('hex')\n const expiresAt = Date.now() + SESSION_TTL_MS\n validTokens.set(token, expiresAt)\n tryPersistSessions(validTokens)\n res.setHeader('Set-Cookie', buildSessionCookie(token, expiresAt))\n res.redirect(302, '/')\n return\n }\n }\n\n // No valid session — serve login page\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(200).send(LOGIN_PAGE_HTML)\n }\n\n return {\n middleware,\n isRequestAuthorized: (req: IncomingMessage) => (\n isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)\n ),\n }\n}\n","import { dirname, extname, join } from 'node:path'\nimport { open, readFile, readdir, stat } from 'node:fs/promises'\n\ntype DirectoryItem = {\n name: string\n path: string\n isDirectory: boolean\n editable: boolean\n mtimeMs: number\n}\n\nexport type LocalDirectoryListingEntry = {\n name: string\n path: string\n}\n\nexport type LocalDirectoryListing = {\n path: string\n parentPath: string\n entries: LocalDirectoryListingEntry[]\n}\n\ntype LocalDirectoryListingOptions = {\n showHidden?: boolean\n}\n\nconst TEXT_EDITABLE_EXTENSIONS = new Set([\n '.txt', '.md', '.json', '.js', '.ts', '.tsx', '.jsx', '.css', '.scss',\n '.html', '.htm', '.xml', '.yml', '.yaml', '.log', '.csv', '.env', '.py',\n '.sh', '.toml', '.ini', '.conf', '.sql', '.bat', '.cmd', '.ps1',\n])\n\nfunction languageForPath(pathValue: string): string {\n const extension = extname(pathValue).toLowerCase()\n switch (extension) {\n case '.js': return 'javascript'\n case '.ts': return 'typescript'\n case '.jsx': return 'javascript'\n case '.tsx': return 'typescript'\n case '.py': return 'python'\n case '.sh': return 'sh'\n case '.css':\n case '.scss': return 'css'\n case '.html':\n case '.htm': return 'html'\n case '.json': return 'json'\n case '.md': return 'markdown'\n case '.yaml':\n case '.yml': return 'yaml'\n case '.xml': return 'xml'\n case '.sql': return 'sql'\n case '.toml': return 'ini'\n case '.ini':\n case '.conf': return 'ini'\n default: return 'plaintext'\n }\n}\n\nexport function normalizeLocalPath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nexport function decodeBrowsePath(rawPath: string): string {\n if (!rawPath) return ''\n try {\n return decodeURIComponent(rawPath)\n } catch {\n return rawPath\n }\n}\n\nexport function isTextEditablePath(pathValue: string): boolean {\n return TEXT_EDITABLE_EXTENSIONS.has(extname(pathValue).toLowerCase())\n}\n\nfunction isHiddenName(value: string): boolean {\n return value.startsWith('.')\n}\n\nfunction looksLikeTextBuffer(buffer: Buffer): boolean {\n if (buffer.length === 0) return true\n for (const byte of buffer) {\n if (byte === 0) return false\n }\n const decoded = buffer.toString('utf8')\n const replacementCount = (decoded.match(/\\uFFFD/gu) ?? []).length\n return replacementCount / decoded.length < 0.05\n}\n\nasync function probeFileIsText(localPath: string): Promise<boolean> {\n const handle = await open(localPath, 'r')\n try {\n const sample = Buffer.allocUnsafe(4096)\n const { bytesRead } = await handle.read(sample, 0, sample.length, 0)\n return looksLikeTextBuffer(sample.subarray(0, bytesRead))\n } finally {\n await handle.close()\n }\n}\n\nexport async function isTextEditableFile(localPath: string): Promise<boolean> {\n if (isTextEditablePath(localPath)) return true\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) return false\n return await probeFileIsText(localPath)\n } catch {\n return false\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/gu, '&amp;')\n .replace(/</gu, '&lt;')\n .replace(/>/gu, '&gt;')\n .replace(/\"/gu, '&quot;')\n .replace(/'/gu, '&#39;')\n}\n\nfunction normalizeNewProjectName(value: string): string {\n return value.trim().replace(/[\\\\/]+/gu, '').trim()\n}\n\nfunction toBrowseHref(pathValue: string, newProjectName = ''): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const query = normalizedName ? `?newProjectName=${encodeURIComponent(normalizedName)}` : ''\n return `/codex-local-browse${encodeURI(pathValue)}${query}`\n}\n\nfunction toEditHref(pathValue: string, newProjectName = ''): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const query = normalizedName ? `?newProjectName=${encodeURIComponent(normalizedName)}` : ''\n return `/codex-local-edit${encodeURI(pathValue)}${query}`\n}\n\nfunction escapeForInlineScriptString(value: string): string {\n // Prevent breaking out of inline <script> blocks when file content contains HTML/script tokens.\n return JSON.stringify(value)\n .replace(/<\\//gu, '<\\\\/')\n .replace(/<!--/gu, '<\\\\!--')\n .replace(/\\u2028/gu, '\\\\u2028')\n .replace(/\\u2029/gu, '\\\\u2029')\n}\n\nasync function getDirectoryItems(localPath: string): Promise<DirectoryItem[]> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const withMeta = await Promise.all(entries.map(async (entry) => {\n const entryPath = join(localPath, entry.name)\n const entryStat = await stat(entryPath)\n const editable = !entry.isDirectory() && await isTextEditableFile(entryPath)\n return {\n name: entry.name,\n path: entryPath,\n isDirectory: entry.isDirectory(),\n editable,\n mtimeMs: entryStat.mtimeMs,\n }\n }))\n return withMeta.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) return b.mtimeMs - a.mtimeMs\n if (a.isDirectory && !b.isDirectory) return -1\n if (!a.isDirectory && b.isDirectory) return 1\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction projectCreationTargetPath(parentPath: string, newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n if (!normalizedName) return ''\n return join(parentPath, normalizedName)\n}\n\nfunction projectCreationButtonLabel(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName ? `Create ${normalizedName} here` : ''\n}\n\nfunction projectCreationStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName ? `Creating ${normalizedName} in Codex...` : 'Creating project in Codex...'\n}\n\nfunction openFolderStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName\n ? `Opening folder in Codex without creating ${normalizedName}...`\n : 'Opening folder in Codex...'\n}\n\nfunction failureStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName\n ? `Failed to open folder or create ${normalizedName}.`\n : 'Failed to open folder.'\n}\n\nfunction actionButtonsHtml(localPath: string, newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const createTargetPath = projectCreationTargetPath(localPath, normalizedName)\n const createButton = createTargetPath\n ? `<button class=\"header-open-btn create-project-btn\" type=\"button\" aria-label=\"${escapeHtml(projectCreationButtonLabel(normalizedName))}\" title=\"${escapeHtml(projectCreationButtonLabel(normalizedName))}\" data-path=\"${escapeHtml(createTargetPath)}\" data-label=\"${escapeHtml(normalizedName)}\" data-status=\"${escapeHtml(projectCreationStatusText(normalizedName))}\" data-error=\"${escapeHtml(failureStatusText(normalizedName))}\">${escapeHtml(projectCreationButtonLabel(normalizedName))}</button>`\n : ''\n const openButton = `<button class=\"header-open-btn open-folder-btn\" type=\"button\" aria-label=\"Open current folder in Codex\" title=\"Open folder in Codex\" data-path=\"${escapeHtml(localPath)}\" data-label=\"\" data-status=\"${escapeHtml(openFolderStatusText(normalizedName))}\" data-error=\"${escapeHtml(failureStatusText(normalizedName))}\">Open folder in Codex</button>`\n return `${createButton}${openButton}`\n}\n\nexport async function getLocalDirectoryListing(\n localPath: string,\n options: LocalDirectoryListingOptions = {},\n): Promise<LocalDirectoryListing> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const directories = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: join(localPath, entry.name),\n }))\n .filter((entry) => options.showHidden === true || !isHiddenName(entry.name))\n .sort((a, b) => {\n const aHidden = isHiddenName(a.name)\n const bHidden = isHiddenName(b.name)\n if (aHidden !== bHidden) return aHidden ? -1 : 1\n return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' })\n })\n\n return {\n path: localPath,\n parentPath: dirname(localPath),\n entries: directories,\n }\n}\n\nexport async function createDirectoryListingHtml(localPath: string, options?: { newProjectName?: string }): Promise<string> {\n const newProjectName = normalizeNewProjectName(options?.newProjectName ?? '')\n const items = await getDirectoryItems(localPath)\n const parentPath = dirname(localPath)\n const rows = items\n .map((item) => {\n const suffix = item.isDirectory ? '/' : ''\n const editAction = item.editable\n ? ` <a class=\"icon-btn\" aria-label=\"Edit ${escapeHtml(item.name)}\" href=\"${escapeHtml(toEditHref(item.path, newProjectName))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path, newProjectName))}\">${escapeHtml(item.name)}${suffix}</a><span class=\"row-actions\">${editAction}</span></li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<a class=\"header-parent-link\" href=\"${escapeHtml(toBrowseHref(parentPath, newProjectName))}\">..</a>`\n : ''\n const pickerSummary = newProjectName\n ? `<p class=\"picker-summary\">Browse to the parent folder where you want to create <strong>${escapeHtml(newProjectName)}</strong>, or open the current folder directly.</p>`\n : ''\n const actionButtons = actionButtonsHtml(localPath, newProjectName)\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Index of ${escapeHtml(localPath)}</title>\n <style>\n body { font-family: ui-monospace, Menlo, Monaco, monospace; margin: 16px; background: #0b1020; color: #dbe6ff; }\n a { color: #8cc2ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n ul { list-style: none; padding: 0; margin: 12px 0 0; display: flex; flex-direction: column; gap: 8px; }\n .file-row { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; gap: 10px; }\n .file-link { display: block; padding: 10px 12px; border: 1px solid #28405f; border-radius: 10px; background: #0f1b33; overflow-wrap: anywhere; }\n .header-actions { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }\n .header-parent-link { color: #9ec8ff; font-size: 14px; padding: 8px 10px; border: 1px solid #2a4569; border-radius: 10px; background: #101f3a; }\n .header-parent-link:hover { text-decoration: none; filter: brightness(1.08); }\n .header-open-btn {\n height: 42px;\n padding: 0 14px;\n border: 1px solid #4f8de0;\n border-radius: 10px;\n background: linear-gradient(135deg, #2e6ee6 0%, #3d8cff 100%);\n color: #eef6ff;\n font-weight: 700;\n letter-spacing: 0.01em;\n cursor: pointer;\n box-shadow: 0 6px 18px rgba(33, 90, 199, 0.35);\n }\n .header-open-btn:hover { filter: brightness(1.08); }\n .header-open-btn:disabled { opacity: 0.6; cursor: default; }\n .picker-summary { margin: 10px 0 0; color: #b8d5ff; max-width: 60rem; line-height: 1.45; }\n .row-actions { display: inline-flex; align-items: center; gap: 8px; min-width: 42px; justify-content: flex-end; }\n .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; color: #dbe6ff; text-decoration: none; cursor: pointer; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\n .status { margin: 10px 0 0; color: #8cc2ff; min-height: 1.25em; }\n h1 { font-size: 18px; margin: 0; word-break: break-all; }\n @media (max-width: 640px) {\n body { margin: 12px; }\n .file-row { gap: 8px; }\n .file-link { font-size: 15px; padding: 12px; }\n .icon-btn { width: 44px; height: 44px; }\n }\n </style>\n</head>\n<body>\n <h1>Index of ${escapeHtml(localPath)}</h1>\n ${pickerSummary}\n <div class=\"header-actions\">\n ${parentLink}\n ${actionButtons}\n </div>\n <p id=\"status\" class=\"status\"></p>\n <ul>${rows}</ul>\n <script>\n const status = document.getElementById('status');\n document.addEventListener('click', async (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const button = target.closest('.open-folder-btn, .create-project-btn');\n if (!(button instanceof HTMLButtonElement)) return;\n\n const path = button.getAttribute('data-path') || '';\n const label = button.getAttribute('data-label') || '';\n const statusText = button.getAttribute('data-status') || 'Opening folder in Codex...';\n const errorText = button.getAttribute('data-error') || 'Failed to open folder.';\n if (!path) return;\n button.disabled = true;\n status.textContent = statusText;\n try {\n const response = await fetch('/codex-api/project-root', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path,\n createIfMissing: button.classList.contains('create-project-btn'),\n label,\n }),\n });\n if (!response.ok) {\n status.textContent = errorText;\n button.disabled = false;\n return;\n }\n status.textContent = 'Folder opened. Returning to Codex...';\n const nextUrl = '/?openProjectPath=' + encodeURIComponent(path) + '#/';\n window.location.assign(nextUrl);\n } catch {\n status.textContent = errorText;\n button.disabled = false;\n }\n });\n </script>\n</body>\n</html>`\n}\n\nexport async function createTextEditorHtml(localPath: string): Promise<string> {\n const content = await readFile(localPath, 'utf8')\n const parentPath = dirname(localPath)\n const language = languageForPath(localPath)\n const safeContentLiteral = escapeForInlineScriptString(content)\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Edit ${escapeHtml(localPath)}</title>\n <style>\n html, body { width: 100%; height: 100%; margin: 0; }\n body { font-family: ui-monospace, Menlo, Monaco, monospace; background: #0b1020; color: #dbe6ff; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar { position: sticky; top: 0; z-index: 10; display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; background: #0b1020; border-bottom: 1px solid #243a5a; }\n .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n button, a { background: #1b2a4a; color: #dbe6ff; border: 1px solid #345; padding: 6px 10px; border-radius: 6px; text-decoration: none; cursor: pointer; }\n button:hover, a:hover { filter: brightness(1.08); }\n #editor { flex: 1 1 auto; min-height: 0; width: 100%; border: none; overflow: hidden; }\n #status { margin-left: 8px; color: #8cc2ff; }\n .ace_editor { background: #07101f !important; color: #dbe6ff !important; width: 100% !important; height: 100% !important; }\n .ace_gutter { background: #07101f !important; color: #6f8eb5 !important; }\n .ace_marker-layer .ace_active-line { background: #10213c !important; }\n .ace_marker-layer .ace_selection { background: rgba(140, 194, 255, 0.3) !important; }\n .meta { opacity: 0.9; font-size: 12px; overflow-wrap: anywhere; }\n </style>\n</head>\n<body>\n <div class=\"toolbar\">\n <div class=\"row\">\n <a href=\"${escapeHtml(toBrowseHref(parentPath))}\">Back</a>\n <button id=\"saveBtn\" type=\"button\">Save</button>\n <span id=\"status\"></span>\n </div>\n <div class=\"meta\">${escapeHtml(localPath)} · ${escapeHtml(language)}</div>\n </div>\n <div id=\"editor\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2/ace.js\"></script>\n <script>\n const saveBtn = document.getElementById('saveBtn');\n const status = document.getElementById('status');\n const editor = ace.edit('editor');\n editor.setTheme('ace/theme/tomorrow_night');\n editor.session.setMode('ace/mode/${escapeHtml(language)}');\n editor.setValue(${safeContentLiteral}, -1);\n editor.setOptions({\n fontSize: '13px',\n wrap: true,\n showPrintMargin: false,\n useSoftTabs: true,\n tabSize: 2,\n behavioursEnabled: true,\n });\n editor.resize();\n\n saveBtn.addEventListener('click', async () => {\n status.textContent = 'Saving...';\n const response = await fetch(location.pathname, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n body: editor.getValue(),\n });\n status.textContent = response.ok ? 'Saved' : 'Save failed';\n });\n </script>\n</body>\n</html>`\n}\n","import { randomInt } from 'node:crypto'\n\nconst CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789'\n\nfunction randomGroup(length: number): string {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += CHARS[randomInt(CHARS.length)]\n }\n return result\n}\n\nexport function generatePassword(): string {\n return `${randomGroup(3)}-${randomGroup(3)}-${randomGroup(3)}`\n}\n"],"mappings":"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","names":["createServer","chmodSync","existsSync","mkdirSync","readFile","stat","writeFile","homedir","isAbsolute","join","resolve","spawn","createInterface","fileURLToPath","dirname","dirname","extname","isAbsolute","join","existsSync","writeFile","stat","spawn","spawnSync","createHash","mkdtemp","readFile","readdir","rm","mkdir","stat","lstat","existsSync","readFileSync","writeFileSync","httpRequest","httpsRequest","homedir","tmpdir","basename","dirname","isAbsolute","join","resolve","writeFile","homedir","join","resolve","join","homedir","updatedAtMs","spawn","mkdir","rm","stat","writeFile","tmpdir","join","asRecord","readString","getErrorMessage","setJson","resolve","spawn","mkdtemp","readFile","rm","mkdir","stat","existsSync","homedir","tmpdir","join","writeFile","spawnSync","asRecord","getErrorMessage","setJson","getCodexHomeDir","join","homedir","runCommand","resolve","spawn","rm","readFile","stat","writeFile","existsSync","mkdtemp","tmpdir","mkdir","repoDir","branch","readJsonBody","localSkills","pulledHead","basename","asRecord","getErrorMessage","resolve","threadId","message","baseUrl","resolve","existsSync","basename","join","homedir","spawnSync","require","spawn","terminal","join","homedir","payloadRecord","asRecord","stat","readFile","asRecord","isAbsolute","readFileSync","createHash","join","tmpdir","mkdir","stat","writeFile","changed","getErrorMessage","setJson","lstat","homedir","repoName","resolve","runCommand","rm","readFile","existsSync","readdir","readBoolean","readNumber","spawnSync","spawn","payloadRecord","runCommandCapture","getCodexHomeDir","join","getCodexHomeDir","readdir","readFile","mkdir","existsSync","writeFile","basename","resolve","rm","runCommand","spawn","isMissingHeadError","getErrorMessage","isNotGitRepositoryError","stat","runCommandCapture","asRecord","join","getCodexHomeDir","decodeBase64UrlJson","readFile","writeFile","readFileSync","dirname","writeFileSync","readdir","mkdir","stat","rm","runCommand","value","readJsonBody","setJson","tmpdir","mkdtemp","getErrorMessage","httpRequest","httpsRequest","resolve","spawn","process","readFreeModeState","isAbsolute","homedir","runCommandCapture","isNotGitRepositoryError","basename","isMissingHeadError","next","randomBytes","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","getCodexHomeDir","randomBytes","dirname","extname","join","readFile","readdir","stat","escapeHtml","dirname","join","isAbsolute","extname","stat","writeFile","existsSync","__dirname","dirname","fileURLToPath","join","homedir","existsSync","mkdirSync","writeFile","readFile","resolve","chmodSync","createInterface","spawn","getCodexGlobalStatePath","isAbsolute","stat","createServer"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/commandResolution.ts","../src/server/appServerRuntimeConfig.ts","../src/server/httpServer.ts","../src/server/codexAppServerBridge.ts","../src/server/accountRoutes.ts","../src/server/reviewGit.ts","../src/server/skillsRoutes.ts","../src/utils/commandInvocation.ts","../src/server/telegramThreadBridge.ts","../src/server/freeMode.ts","../src/server/unifiedResponsesProxy.ts","../src/server/openRouterProxy.ts","../src/server/zenProxy.ts","../src/server/customEndpointProxy.ts","../src/server/terminalManager.ts","../src/pathUtils.ts","../src/server/authMiddleware.ts","../src/server/localBrowseUi.ts","../src/server/password.ts"],"sourcesContent":["import { createServer } from 'node:http'\nimport { chmodSync, createWriteStream, existsSync, mkdirSync } from 'node:fs'\nimport { readFile, stat, writeFile } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\nimport { spawn } from 'node:child_process'\nimport { createInterface } from 'node:readline/promises'\nimport { fileURLToPath } from 'node:url'\nimport { dirname } from 'node:path'\nimport { get as httpsGet } from 'node:https'\nimport { Command } from 'commander'\nimport qrcode from 'qrcode-terminal'\nimport {\n canRunCommand,\n getNpmGlobalBinDir,\n getUserNpmPrefix,\n prependPathEntry,\n resolveCodexCommand,\n} from '../commandResolution.js'\nimport {\n parseApprovalPolicy,\n parseSandboxMode,\n resolveAppServerRuntimeConfig,\n} from '../server/appServerRuntimeConfig.js'\nimport { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\nimport { spawnSyncCommand } from '../utils/commandInvocation.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nlet hasPromptedCloudflaredInstall = false\n\nfunction getCodexHomePath(): string {\n return process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\n}\n\nfunction getCloudflaredPromptMarkerPath(): string {\n return join(getCodexHomePath(), '.cloudflared-install-prompted')\n}\n\nfunction hasPromptedCloudflaredInstallPersisted(): boolean {\n return existsSync(getCloudflaredPromptMarkerPath())\n}\n\nasync function persistCloudflaredInstallPrompted(): Promise<void> {\n const codexHome = getCodexHomePath()\n mkdirSync(codexHome, { recursive: true })\n await writeFile(getCloudflaredPromptMarkerPath(), `${Date.now()}\\n`, 'utf8')\n}\n\nasync function readCliVersion(): Promise<string> {\n try {\n const packageJsonPath = join(__dirname, '..', 'package.json')\n const raw = await readFile(packageJsonPath, 'utf8')\n const parsed = JSON.parse(raw) as { version?: unknown }\n return typeof parsed.version === 'string' ? parsed.version : 'unknown'\n } catch {\n return 'unknown'\n }\n}\n\nfunction isTermuxRuntime(): boolean {\n return Boolean(process.env.TERMUX_VERSION || process.env.PREFIX?.includes('/com.termux/'))\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n if (result.status !== 0) {\n throw new Error(`${label} failed with exit code ${String(result.status ?? -1)}`)\n }\n}\n\nfunction runWithStatus(command: string, args: string[]): number {\n const result = spawnSyncCommand(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRunCommand('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRunCommand(localCandidate, ['--version'])) {\n return localCandidate\n }\n return null\n}\n\nfunction mapCloudflaredLinuxArch(arch: NodeJS.Architecture): string | null {\n if (arch === 'x64') {\n return 'amd64'\n }\n if (arch === 'arm64') {\n return 'arm64'\n }\n return null\n}\n\nfunction downloadFile(url: string, destination: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const request = (currentUrl: string) => {\n httpsGet(currentUrl, (response) => {\n const code = response.statusCode ?? 0\n if (code >= 300 && code < 400 && response.headers.location) {\n response.resume()\n request(response.headers.location)\n return\n }\n if (code !== 200) {\n response.resume()\n reject(new Error(`Download failed with HTTP status ${String(code)}`))\n return\n }\n const file = createWriteStream(destination, { mode: 0o755 })\n response.pipe(file)\n file.on('finish', () => {\n file.close()\n resolve()\n })\n file.on('error', reject)\n }).on('error', reject)\n }\n\n request(url)\n })\n}\n\nasync function ensureCloudflaredInstalledLinux(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n if (process.platform !== 'linux') {\n return null\n }\n\n const mappedArch = mapCloudflaredLinuxArch(process.arch)\n if (!mappedArch) {\n throw new Error(`cloudflared auto-install is not supported for Linux architecture: ${process.arch}`)\n }\n\n const userBinDir = join(homedir(), '.local', 'bin')\n mkdirSync(userBinDir, { recursive: true })\n const destination = join(userBinDir, 'cloudflared')\n const downloadUrl = `https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-${mappedArch}`\n\n console.log('\\ncloudflared not found. Installing to ~/.local/bin...\\n')\n await downloadFile(downloadUrl, destination)\n chmodSync(destination, 0o755)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', userBinDir)\n\n const installed = resolveCloudflaredCommand()\n if (!installed) {\n throw new Error('cloudflared download completed but executable is still not available')\n }\n console.log('\\ncloudflared installed.\\n')\n return installed\n}\n\nasync function shouldInstallCloudflaredInteractively(): Promise<boolean> {\n if (hasPromptedCloudflaredInstall || hasPromptedCloudflaredInstallPersisted()) {\n return false\n }\n hasPromptedCloudflaredInstall = true\n await persistCloudflaredInstallPrompted()\n\n if (process.platform === 'win32') {\n return false\n }\n\n if (!process.stdin.isTTY || !process.stdout.isTTY) {\n console.warn('\\n[cloudflared] cloudflared is missing and terminal is non-interactive, skipping install.')\n return false\n }\n\n const prompt = createInterface({ input: process.stdin, output: process.stdout })\n try {\n const answer = await prompt.question('cloudflared is not installed. Install it now to ~/.local/bin? [y/N] ')\n const normalized = answer.trim().toLowerCase()\n return normalized === 'y' || normalized === 'yes'\n } finally {\n prompt.close()\n }\n}\n\nasync function resolveCloudflaredForTunnel(): Promise<string | null> {\n const current = resolveCloudflaredCommand()\n if (current) {\n return current\n }\n\n if (process.platform === 'win32') {\n return null\n }\n\n const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = getCodexHomePath()\n return existsSync(join(codexHome, 'auth.json'))\n}\n\nfunction ensureCodexInstalled(): string | null {\n let codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n const installWithFallback = (pkg: string, label: string): void => {\n const status = runWithStatus('npm', ['install', '-g', pkg])\n if (status === 0) {\n return\n }\n if (isTermuxRuntime()) {\n throw new Error(`${label} failed with exit code ${String(status)}`)\n }\n const userPrefix = getUserNpmPrefix()\n console.log(`\\nGlobal npm install requires elevated permissions. Retrying with --prefix ${userPrefix}...\\n`)\n runOrFail('npm', ['install', '-g', '--prefix', userPrefix, pkg], `${label} (user prefix)`)\n process.env.PATH = prependPathEntry(process.env.PATH ?? '', getNpmGlobalBinDir(userPrefix))\n }\n\n if (isTermuxRuntime()) {\n console.log('\\nCodex CLI not found. Installing Termux-compatible Codex CLI from npm...\\n')\n installWithFallback('@mmmbuto/codex-cli-termux', 'Codex CLI install')\n codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n console.log('\\nTermux npm package did not expose `codex`. Installing official CLI fallback...\\n')\n installWithFallback('@openai/codex', 'Codex CLI fallback install')\n }\n } else {\n console.log('\\nCodex CLI not found. Installing official Codex CLI from npm...\\n')\n installWithFallback('@openai/codex', 'Codex CLI install')\n }\n\n codexCommand = resolveCodexCommand()\n if (!codexCommand && !isTermuxRuntime()) {\n // Non-Termux path should resolve after official package install.\n throw new Error('Official Codex CLI install completed but binary is still not available in PATH')\n }\n if (!codexCommand && isTermuxRuntime()) {\n codexCommand = resolveCodexCommand()\n }\n if (!codexCommand) {\n throw new Error('Codex CLI install completed but binary is still not available in PATH')\n }\n console.log('\\nCodex CLI installed.\\n')\n }\n return codexCommand\n}\n\ntype PasswordResolution = {\n password: string | undefined\n generated: boolean\n}\n\nfunction resolvePassword(input: string | boolean): PasswordResolution {\n if (input === false) {\n return { password: undefined, generated: false }\n }\n if (typeof input === 'string') {\n return { password: input, generated: false }\n }\n return { password: generatePassword(), generated: true }\n}\n\nfunction getGeneratedPasswordPath(): string {\n return join(getCodexHomePath(), 'codexui-password')\n}\n\nasync function persistGeneratedPassword(password: string): Promise<string> {\n const codexHome = getCodexHomePath()\n mkdirSync(codexHome, { recursive: true })\n const passwordPath = getGeneratedPasswordPath()\n await writeFile(passwordPath, `${password}\\n`, { encoding: 'utf8', mode: 0o600 })\n chmodSync(passwordPath, 0o600)\n return passwordPath\n}\n\nfunction printTermuxKeepAlive(lines: string[]): void {\n if (!isTermuxRuntime()) {\n return\n }\n lines.push('')\n lines.push(' Android/Termux keep-alive:')\n lines.push(' 1) Keep this Termux session open (do not swipe it away).')\n lines.push(' 2) Disable battery optimization for Termux in Android settings.')\n lines.push(' 3) Optional: run `termux-wake-lock` in another shell.')\n}\n\nfunction openBrowser(url: string): void {\n const command = process.platform === 'darwin'\n ? { cmd: 'open', args: [url] }\n : process.platform === 'win32'\n ? { cmd: 'cmd', args: ['/c', 'start', '', url] }\n : { cmd: 'xdg-open', args: [url] }\n\n const child = spawn(command.cmd, command.args, { detached: true, stdio: 'ignore' })\n child.on('error', () => {})\n child.unref()\n}\n\nfunction buildTunnelAutologinUrl(tunnelUrl: string, _password: string | undefined): string {\n return tunnelUrl\n}\n\nfunction parseCloudflaredUrl(chunk: string): string | null {\n const urlMatch = chunk.match(/https:\\/\\/[a-zA-Z0-9-]+\\.trycloudflare\\.com/g)\n if (!urlMatch || urlMatch.length === 0) {\n return null\n }\n return urlMatch[urlMatch.length - 1] ?? null\n}\n\nfunction getAccessibleUrls(port: number): string[] {\n const urls = new Set<string>([`http://localhost:${String(port)}`])\n try {\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) {\n continue\n }\n for (const entry of entries) {\n if (entry.internal) {\n continue\n }\n if (entry.family === 'IPv4') {\n urls.add(`http://${entry.address}:${String(port)}`)\n }\n }\n }\n } catch {}\n return Array.from(urls)\n}\n\nfunction isTailscaleIPv4Address(address: string): boolean {\n const parts = address.split('.')\n if (parts.length !== 4) return false\n const octets = parts.map((part) => Number.parseInt(part, 10))\n if (octets.some((value) => Number.isNaN(value) || value < 0 || value > 255)) return false\n return octets[0] === 100 && octets[1] >= 64 && octets[1] <= 127\n}\n\nfunction isTailscaleIPv6Address(address: string): boolean {\n const normalized = address.toLowerCase()\n return normalized.startsWith('fd7a:115c:a1e0:')\n}\n\nfunction hasDetectedTailscaleIp(): boolean {\n try {\n const interfaces = networkInterfaces()\n for (const entries of Object.values(interfaces)) {\n if (!entries) continue\n for (const entry of entries) {\n if (entry.internal) continue\n if (entry.family === 'IPv4' && isTailscaleIPv4Address(entry.address)) return true\n if (entry.family === 'IPv6' && isTailscaleIPv6Address(entry.address)) return true\n }\n }\n } catch {}\n return false\n}\n\nasync function startCloudflaredTunnel(command: string, localPort: number): Promise<{\n process: ReturnType<typeof spawn>\n url: string\n}> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, ['tunnel', '--url', `http://localhost:${String(localPort)}`], {\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n\n const timeout = setTimeout(() => {\n child.kill('SIGTERM')\n reject(new Error('Timed out waiting for cloudflared tunnel URL'))\n }, 20000)\n\n const handleData = (value: Buffer | string) => {\n const text = String(value)\n const parsedUrl = parseCloudflaredUrl(text)\n if (!parsedUrl) {\n return\n }\n clearTimeout(timeout)\n child.stdout?.off('data', handleData)\n child.stderr?.off('data', handleData)\n resolve({ process: child, url: parsedUrl })\n }\n\n const onError = (error: Error) => {\n clearTimeout(timeout)\n reject(new Error(`Failed to start cloudflared: ${error.message}`))\n }\n\n child.once('error', onError)\n child.stdout?.on('data', handleData)\n child.stderr?.on('data', handleData)\n\n child.once('exit', (code) => {\n if (code === 0) {\n return\n }\n clearTimeout(timeout)\n reject(new Error(`cloudflared exited before providing a URL (code ${String(code)})`))\n })\n })\n}\n\nfunction listenWithFallback(server: ReturnType<typeof createServer>, startPort: number): Promise<number> {\n return new Promise((resolve, reject) => {\n const attempt = (port: number) => {\n const onError = (error: NodeJS.ErrnoException) => {\n server.off('listening', onListening)\n if (error.code === 'EADDRINUSE' || error.code === 'EACCES') {\n attempt(port + 1)\n return\n }\n reject(error)\n }\n const onListening = () => {\n server.off('error', onError)\n resolve(port)\n }\n\n server.once('error', onError)\n server.once('listening', onListening)\n server.listen(port, '0.0.0.0')\n }\n\n attempt(startPort)\n })\n}\n\nfunction getCodexGlobalStatePath(): string {\n const codexHome = getCodexHomePath()\n return join(codexHome, '.codex-global-state.json')\n}\n\nfunction normalizeUniqueStrings(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const next: string[] = []\n for (const item of value) {\n if (typeof item !== 'string') continue\n const trimmed = item.trim()\n if (!trimmed || next.includes(trimmed)) continue\n next.push(trimmed)\n }\n return next\n}\n\nasync function persistLaunchProject(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) return\n const normalizedPath = isAbsolute(trimmed) ? trimmed : resolve(trimmed)\n const directoryInfo = await stat(normalizedPath)\n if (!directoryInfo.isDirectory()) {\n throw new Error(`Not a directory: ${normalizedPath}`)\n }\n\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n payload = parsed as Record<string, unknown>\n }\n } catch {\n payload = {}\n }\n\n const roots = normalizeUniqueStrings(payload['electron-saved-workspace-roots'])\n const activeRoots = normalizeUniqueStrings(payload['active-workspace-roots'])\n payload['electron-saved-workspace-roots'] = [\n normalizedPath,\n ...roots.filter((value) => value !== normalizedPath),\n ]\n payload['active-workspace-roots'] = [\n normalizedPath,\n ...activeRoots.filter((value) => value !== normalizedPath),\n ]\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function addProjectOnly(projectPath: string): Promise<void> {\n const trimmed = projectPath.trim()\n if (!trimmed) {\n throw new Error('Missing project path')\n }\n await persistLaunchProject(trimmed)\n}\n\nasync function startServer(options: {\n port: string\n password: string | boolean\n tunnel: boolean\n open: boolean\n login: boolean\n sandboxMode?: string\n approvalPolicy?: string\n projectPath?: string\n}) {\n const version = await readCliVersion()\n const projectPath = options.projectPath?.trim() ?? ''\n if (projectPath.length > 0) {\n try {\n await persistLaunchProject(projectPath)\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[project] Could not open launch project: ${message}\\n`)\n }\n }\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (codexCommand) {\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n }\n if (options.sandboxMode) {\n process.env.CODEXUI_SANDBOX_MODE = options.sandboxMode\n }\n if (options.approvalPolicy) {\n process.env.CODEXUI_APPROVAL_POLICY = options.approvalPolicy\n }\n const runtimeConfig = resolveAppServerRuntimeConfig()\n if (options.login && !hasCodexAuth()) {\n console.log('\\nCodex is not logged in. You can log in later via settings or run `codexui login`.\\n')\n }\n const requestedPort = parseInt(options.port, 10)\n const passwordResolution = resolvePassword(options.password)\n const password = passwordResolution.password\n const generatedPasswordPath = password && passwordResolution.generated\n ? await persistGeneratedPassword(password)\n : null\n const { app, dispose, attachWebSocket } = createApp({ password })\n const server = createServer(app)\n attachWebSocket(server)\n const port = await listenWithFallback(server, requestedPort)\n let tunnelChild: ReturnType<typeof spawn> | null = null\n let tunnelUrl: string | null = null\n\n if (options.tunnel) {\n try {\n const cloudflaredCommand = await resolveCloudflaredForTunnel()\n if (!cloudflaredCommand) {\n throw new Error('cloudflared is not installed')\n }\n const tunnel = await startCloudflaredTunnel(cloudflaredCommand, port)\n tunnelChild = tunnel.process\n tunnelUrl = tunnel.url\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n console.warn(`\\n[cloudflared] Tunnel not started: ${message}`)\n }\n }\n\n const lines = [\n '',\n 'Codex Web Local is running!',\n ` Version: ${version}`,\n ' GitHub: https://github.com/friuns2/codexui',\n '',\n ` Bind: http://0.0.0.0:${String(port)}`,\n ` Codex sandbox: ${runtimeConfig.sandboxMode}`,\n ` Approval policy: ${runtimeConfig.approvalPolicy}`,\n ]\n const accessUrls = getAccessibleUrls(port)\n if (accessUrls.length > 0) {\n lines.push(` Local: ${accessUrls[0]}`)\n for (const accessUrl of accessUrls.slice(1)) {\n lines.push(` Network: ${accessUrl}`)\n }\n }\n\n if (port !== requestedPort) {\n lines.push(` Requested port ${String(requestedPort)} was unavailable; using ${String(port)}.`)\n }\n\n if (generatedPasswordPath) {\n lines.push(` Generated password file: ${generatedPasswordPath}`)\n lines.push(' Use that file to retrieve the password for untrusted origins.')\n }\n\n const tunnelQrUrl = tunnelUrl ? buildTunnelAutologinUrl(tunnelUrl, password) : null\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelQrUrl ?? tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelQrUrl) {\n qrcode.generate(tunnelQrUrl, { small: true })\n console.log('')\n }\n if (options.open) openBrowser(`http://localhost:${String(port)}`)\n\n function shutdown() {\n console.log('\\nShutting down...')\n if (tunnelChild && !tunnelChild.killed) {\n tunnelChild.kill('SIGTERM')\n }\n server.close(() => {\n dispose()\n process.exit(0)\n })\n // Force exit after timeout\n setTimeout(() => {\n dispose()\n process.exit(1)\n }, 5000).unref()\n }\n\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n}\n\nasync function runLogin() {\n const codexCommand = ensureCodexInstalled() ?? 'codex'\n process.env.CODEXUI_CODEX_COMMAND = codexCommand\n console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .argument('[projectPath]', 'project directory to open on launch')\n .option('--open-project <path>', 'open project directory on launch (Codex desktop parity)')\n .option('-p, --port <port>', 'port to listen on', '5900')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel (default is auto by Tailscale detection)', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .option('--open', 'open browser on startup', true)\n .option('--no-open', 'do not open browser on startup')\n .option('--login', 'run automatic Codex login bootstrap', true)\n .option('--no-login', 'skip automatic Codex login bootstrap')\n .option('--sandbox-mode <mode>', 'Codex sandbox mode: read-only, workspace-write, danger-full-access')\n .option('--approval-policy <policy>', 'Codex approval policy: untrusted, on-failure, on-request, never')\n .action(async (\n projectPath: string | undefined,\n opts: {\n port: string\n password: string | boolean\n tunnel: boolean\n open: boolean\n login: boolean\n sandboxMode?: string\n approvalPolicy?: string\n openProject?: string\n },\n ) => {\n const rawArgv = process.argv.slice(2)\n const openProjectFlagIndex = rawArgv.findIndex((arg) => arg === '--open-project' || arg.startsWith('--open-project='))\n const tunnelFlagExplicit = rawArgv.some((arg) => (\n arg === '--tunnel'\n || arg === '--no-tunnel'\n || arg.startsWith('--tunnel=')\n || arg.startsWith('--no-tunnel=')\n ))\n const effectiveTunnel = tunnelFlagExplicit ? opts.tunnel : hasDetectedTailscaleIp()\n\n let openProjectOnly = (opts.openProject ?? '').trim()\n if (!openProjectOnly && openProjectFlagIndex >= 0 && projectPath?.trim()) {\n // Commander may map \"--open-project .\" to the positional arg in this command layout.\n openProjectOnly = projectPath.trim()\n }\n if (openProjectOnly.length > 0) {\n await addProjectOnly(openProjectOnly)\n console.log(`Added project: ${openProjectOnly}`)\n return\n }\n\n const launchProject = (projectPath ?? '').trim()\n if (opts.sandboxMode) {\n const parsedSandboxMode = parseSandboxMode(opts.sandboxMode)\n if (!parsedSandboxMode) {\n throw new Error(`Invalid sandbox mode: ${opts.sandboxMode}`)\n }\n opts.sandboxMode = parsedSandboxMode\n }\n if (opts.approvalPolicy) {\n const parsedApprovalPolicy = parseApprovalPolicy(opts.approvalPolicy)\n if (!parsedApprovalPolicy) {\n throw new Error(`Invalid approval policy: ${opts.approvalPolicy}`)\n }\n opts.approvalPolicy = parsedApprovalPolicy\n }\n await startServer({ ...opts, tunnel: effectiveTunnel, projectPath: launchProject })\n })\n\nprogram.command('login').description('Install/check Codex CLI and run `codex login`').action(runLogin)\n\nprogram.command('help').description('Show codexui command help').action(() => {\n program.outputHelp()\n})\n\nprogram.parseAsync(process.argv).catch((error) => {\n const message = error instanceof Error ? error.message : String(error)\n console.error(`\\nFailed to run codexui: ${message}`)\n process.exit(1)\n})\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { delimiter, join } from 'node:path'\n\nexport type CommandInvocation = {\n command: string\n args: string[]\n}\n\nfunction uniqueStrings(values: Array<string | null | undefined>): string[] {\n const unique: string[] = []\n for (const value of values) {\n const normalized = value?.trim()\n if (!normalized || unique.includes(normalized)) continue\n unique.push(normalized)\n }\n return unique\n}\n\nfunction isPathLike(command: string): boolean {\n return command.includes('/') || command.includes('\\\\') || /^[a-zA-Z]:/.test(command)\n}\n\nfunction isRunnableCommand(command: string, args: string[] = []): boolean {\n if (isPathLike(command) && !existsSync(command)) {\n return false\n }\n return canRunCommand(command, args)\n}\n\nfunction getWindowsAppDataNpmPrefix(): string | null {\n const appData = process.env.APPDATA?.trim()\n return appData ? join(appData, 'npm') : null\n}\n\nfunction getPotentialNpmPrefixes(): string[] {\n return uniqueStrings([\n process.env.npm_config_prefix,\n process.env.PREFIX,\n getUserNpmPrefix(),\n process.platform === 'win32' ? getWindowsAppDataNpmPrefix() : null,\n ])\n}\n\nfunction getPotentialCodexPackageDirs(prefix: string): string[] {\n const dirs = [join(prefix, 'node_modules', '@openai', 'codex')]\n if (process.platform !== 'win32') {\n dirs.push(join(prefix, 'lib', 'node_modules', '@openai', 'codex'))\n }\n return dirs\n}\n\nfunction getPotentialCodexExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'codex',\n 'codex.exe',\n )\n : join(packageDir, 'bin', 'codex')\n ))\n}\n\nfunction getPotentialRipgrepExecutables(prefix: string): string[] {\n return getPotentialCodexPackageDirs(prefix).map((packageDir) => (\n process.platform === 'win32'\n ? join(\n packageDir,\n 'node_modules',\n '@openai',\n 'codex-win32-x64',\n 'vendor',\n 'x86_64-pc-windows-msvc',\n 'path',\n 'rg.exe',\n )\n : join(packageDir, 'bin', 'rg')\n ))\n}\n\nexport function canRunCommand(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, {\n stdio: 'ignore',\n windowsHide: true,\n })\n return !result.error && result.status === 0\n}\n\nexport function getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nexport function getNpmGlobalBinDir(prefix: string): string {\n return process.platform === 'win32' ? prefix : join(prefix, 'bin')\n}\n\nexport function prependPathEntry(existingPath: string, entry: string): string {\n const normalizedEntry = entry.trim()\n if (!normalizedEntry) return existingPath\n\n const parts = existingPath\n .split(delimiter)\n .map((value) => value.trim())\n .filter(Boolean)\n\n if (parts.includes(normalizedEntry)) {\n return existingPath\n }\n\n return existingPath ? `${normalizedEntry}${delimiter}${existingPath}` : normalizedEntry\n}\n\nexport function resolveCodexCommand(): string | null {\n const explicit = process.env.CODEXUI_CODEX_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialCodexExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'codex']\n : ['codex', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveRipgrepCommand(): string | null {\n const explicit = process.env.CODEXUI_RG_COMMAND?.trim()\n const packageCandidates = getPotentialNpmPrefixes().flatMap(getPotentialRipgrepExecutables)\n const fallbackCandidates = process.platform === 'win32'\n ? [...packageCandidates, 'rg']\n : ['rg', ...packageCandidates]\n\n for (const candidate of uniqueStrings([explicit, ...fallbackCandidates])) {\n if (isRunnableCommand(candidate, ['--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolvePythonCommand(): CommandInvocation | null {\n const candidates: CommandInvocation[] = process.platform === 'win32'\n ? [\n { command: 'python', args: [] },\n { command: 'py', args: ['-3'] },\n { command: 'python3', args: [] },\n ]\n : [\n { command: 'python3', args: [] },\n { command: 'python', args: [] },\n ]\n\n for (const candidate of candidates) {\n if (isRunnableCommand(candidate.command, [...candidate.args, '--version'])) {\n return candidate\n }\n }\n\n return null\n}\n\nexport function resolveSkillInstallerScriptPath(codexHome?: string): string | null {\n const normalizedCodexHome = codexHome?.trim()\n const candidates = uniqueStrings([\n normalizedCodexHome\n ? join(normalizedCodexHome, 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n process.env.CODEX_HOME?.trim()\n ? join(process.env.CODEX_HOME.trim(), 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py')\n : null,\n join(homedir(), '.codex', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n join(homedir(), '.cursor', 'skills', '.system', 'skill-installer', 'scripts', 'install-skill-from-github.py'),\n ])\n\n for (const candidate of candidates) {\n if (existsSync(candidate)) {\n return candidate\n }\n }\n\n return null\n}\n","const SANDBOX_MODES = new Set([\n 'read-only',\n 'workspace-write',\n 'danger-full-access',\n] as const)\n\nconst APPROVAL_POLICIES = new Set([\n 'untrusted',\n 'on-failure',\n 'on-request',\n 'never',\n] as const)\n\nexport type CodexSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'\nexport type CodexApprovalPolicy = 'untrusted' | 'on-failure' | 'on-request' | 'never'\n\ntype AppServerRuntimeConfig = {\n sandboxMode: CodexSandboxMode\n approvalPolicy: CodexApprovalPolicy\n}\n\nconst DEFAULT_RUNTIME_CONFIG: AppServerRuntimeConfig = {\n sandboxMode: 'danger-full-access',\n approvalPolicy: 'never',\n}\n\nfunction normalizeRuntimeValue(value: string | undefined): string {\n return value?.trim().toLowerCase() ?? ''\n}\n\nfunction readSandboxModeFromEnv(): CodexSandboxMode {\n const candidate = normalizeRuntimeValue(process.env.CODEXUI_SANDBOX_MODE)\n if (SANDBOX_MODES.has(candidate as CodexSandboxMode)) {\n return candidate as CodexSandboxMode\n }\n return DEFAULT_RUNTIME_CONFIG.sandboxMode\n}\n\nfunction readApprovalPolicyFromEnv(): CodexApprovalPolicy {\n const candidate = normalizeRuntimeValue(process.env.CODEXUI_APPROVAL_POLICY)\n if (APPROVAL_POLICIES.has(candidate as CodexApprovalPolicy)) {\n return candidate as CodexApprovalPolicy\n }\n return DEFAULT_RUNTIME_CONFIG.approvalPolicy\n}\n\nexport function resolveAppServerRuntimeConfig(): AppServerRuntimeConfig {\n return {\n sandboxMode: readSandboxModeFromEnv(),\n approvalPolicy: readApprovalPolicyFromEnv(),\n }\n}\n\nexport function buildAppServerArgs(): string[] {\n const config = resolveAppServerRuntimeConfig()\n return [\n 'app-server',\n '-c',\n `approval_policy=\"${config.approvalPolicy}\"`,\n '-c',\n `sandbox_mode=\"${config.sandboxMode}\"`,\n ]\n}\n\nexport function parseSandboxMode(value: string): CodexSandboxMode | null {\n const candidate = value.trim().toLowerCase()\n return SANDBOX_MODES.has(candidate as CodexSandboxMode) ? candidate as CodexSandboxMode : null\n}\n\nexport function parseApprovalPolicy(value: string): CodexApprovalPolicy | null {\n const candidate = value.trim().toLowerCase()\n return APPROVAL_POLICIES.has(candidate as CodexApprovalPolicy) ? candidate as CodexApprovalPolicy : null\n}\n","import { fileURLToPath } from 'node:url'\nimport { dirname, extname, isAbsolute, join } from 'node:path'\nimport type { Server as HttpServer, IncomingMessage } from 'node:http'\nimport { existsSync } from 'node:fs'\nimport { writeFile, stat } from 'node:fs/promises'\nimport express, { type Express } from 'express'\nimport { createCodexBridgeMiddleware } from './codexAppServerBridge.js'\nimport { createAuthSession } from './authMiddleware.js'\nimport { createDirectoryListingHtml, createTextEditorHtml, decodeBrowsePath, getLocalDirectoryListing, isTextEditableFile, normalizeLocalPath } from './localBrowseUi.js'\nimport { WebSocketServer, type WebSocket } from 'ws'\n\nconst __dirname = dirname(fileURLToPath(import.meta.url))\nconst distDir = join(__dirname, '..', 'dist')\nconst spaEntryFile = join(distDir, 'index.html')\n\nexport type ServerOptions = {\n password?: string\n}\n\nexport type ServerInstance = {\n app: Express\n dispose: () => void\n attachWebSocket: (server: HttpServer) => void\n}\n\nconst IMAGE_CONTENT_TYPES: Record<string, string> = {\n '.avif': 'image/avif',\n '.bmp': 'image/bmp',\n '.gif': 'image/gif',\n '.jpeg': 'image/jpeg',\n '.jpg': 'image/jpeg',\n '.png': 'image/png',\n '.svg': 'image/svg+xml',\n '.webp': 'image/webp',\n}\n\nfunction renderFrontendMissingHtml(message: string, details?: string[]): string {\n const lines = details && details.length > 0 ? `<pre>${details.join('\\n')}</pre>` : ''\n return [\n '<!doctype html>',\n '<html lang=\"en\">',\n '<head><meta charset=\"utf-8\"><title>Codex Web UI Error</title></head>',\n '<body>',\n `<h1>${message}</h1>`,\n lines,\n '<p>Redirecting to chat in 3 seconds...</p>',\n '<p><a href=\"/\">Back to chat</a></p>',\n '<script>',\n 'setTimeout(() => { window.location.assign(\"/\") }, 3000)',\n '</script>',\n '</body>',\n '</html>',\n ].join('')\n}\n\nfunction normalizeLocalImagePath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nfunction readWildcardPathParam(value: unknown): string {\n if (typeof value === 'string') return value\n if (Array.isArray(value)) return value.join('/')\n return ''\n}\n\nexport function createServer(options: ServerOptions = {}): ServerInstance {\n const app = express()\n const bridge = createCodexBridgeMiddleware()\n const authSession = options.password ? createAuthSession(options.password) : null\n\n // 1. Auth middleware (if password is set)\n if (authSession) {\n app.use(authSession.middleware)\n }\n\n // 2. Bridge middleware for /codex-api/*\n app.use(bridge)\n\n // 3. Serve local images referenced in markdown (desktop parity for absolute image paths)\n app.get('/codex-local-image', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalImagePath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n const contentType = IMAGE_CONTENT_TYPES[extname(localPath).toLowerCase()]\n if (!contentType) {\n res.status(415).json({ error: 'Unsupported image type.' })\n return\n }\n\n res.type(contentType)\n res.setHeader('Cache-Control', 'private, max-age=300')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'Image file not found.' })\n })\n })\n\n // 4. Serve local files inline for direct file open.\n app.get('/codex-local-file', (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n res.setHeader('Cache-Control', 'private, no-store')\n res.setHeader('Content-Disposition', 'inline')\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n })\n\n // 5. Return JSON directory listings for the integrated folder picker.\n app.get('/codex-local-directories', async (req, res) => {\n const rawPath = typeof req.query.path === 'string' ? req.query.path : ''\n const showHidden = typeof req.query.showHidden === 'string'\n && ['1', 'true', 'yes', 'on'].includes(req.query.showHidden.toLowerCase())\n const localPath = normalizeLocalPath(rawPath)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local directory path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isDirectory()) {\n res.status(400).json({ error: 'Expected directory path.' })\n return\n }\n const data = await getLocalDirectoryListing(localPath, { showHidden })\n res.status(200).json({ data })\n } catch {\n res.status(404).json({ error: 'Directory not found.' })\n }\n })\n\n // 6. Serve local files by path to preserve relative asset loading for HTML.\n app.get('/codex-local-browse/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n const newProjectName = typeof req.query.newProjectName === 'string' ? req.query.newProjectName : ''\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n\n try {\n const fileStat = await stat(localPath)\n res.setHeader('Cache-Control', 'private, no-store')\n if (fileStat.isDirectory()) {\n const html = await createDirectoryListingHtml(localPath, { newProjectName })\n res.status(200).type('text/html; charset=utf-8').send(html)\n return\n }\n\n res.sendFile(localPath, { dotfiles: 'allow' }, (error) => {\n if (!error) return\n if (!res.headersSent) res.status(404).json({ error: 'File not found.' })\n })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n // 7. Edit text-like local files.\n app.get('/codex-local-edit/*path', async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) {\n res.status(400).json({ error: 'Expected file path.' })\n return\n }\n const html = await createTextEditorHtml(localPath)\n res.status(200).type('text/html; charset=utf-8').send(html)\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n app.put('/codex-local-edit/*path', express.text({ type: '*/*', limit: '10mb' }), async (req, res) => {\n const rawPath = readWildcardPathParam(req.params.path)\n const localPath = decodeBrowsePath(`/${rawPath}`)\n if (!localPath || !isAbsolute(localPath)) {\n res.status(400).json({ error: 'Expected absolute local file path.' })\n return\n }\n if (!(await isTextEditableFile(localPath))) {\n res.status(415).json({ error: 'Only text-like files are editable.' })\n return\n }\n const body = typeof req.body === 'string' ? req.body : ''\n try {\n await writeFile(localPath, body, 'utf8')\n res.status(200).json({ ok: true })\n } catch {\n res.status(404).json({ error: 'File not found.' })\n }\n })\n\n const hasFrontendAssets = existsSync(spaEntryFile)\n\n // 8. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 9. SPA fallback\n app.use((_req, res) => {\n if (!hasFrontendAssets) {\n res\n .status(503)\n .type('text/html; charset=utf-8')\n .send(\n renderFrontendMissingHtml('Codex web UI assets are missing.', [\n `Expected: ${spaEntryFile}`,\n 'If running from source, build frontend assets with: pnpm run build:frontend',\n 'If running with npx, clear the npx cache and reinstall codexapp.',\n ]),\n )\n return\n }\n\n res.sendFile(spaEntryFile, (error) => {\n if (!error) return\n if (!res.headersSent) {\n res.status(404).type('text/html; charset=utf-8').send(renderFrontendMissingHtml('Frontend entry file not found.'))\n }\n })\n })\n\n return {\n app,\n dispose: () => bridge.dispose(),\n attachWebSocket: (server: HttpServer) => {\n const wss = new WebSocketServer({ noServer: true })\n\n server.on('upgrade', (req: IncomingMessage, socket, head) => {\n const url = new URL(req.url ?? '', 'http://localhost')\n if (url.pathname !== '/codex-api/ws') {\n return\n }\n\n if (authSession && !authSession.isRequestAuthorized(req)) {\n socket.write('HTTP/1.1 401 Unauthorized\\r\\nConnection: close\\r\\n\\r\\n')\n socket.destroy()\n return\n }\n\n wss.handleUpgrade(req, socket, head, (ws: WebSocket) => {\n wss.emit('connection', ws, req)\n })\n })\n\n wss.on('connection', (ws: WebSocket) => {\n ws.send(JSON.stringify({ method: 'ready', params: { ok: true }, atIso: new Date().toISOString() }))\n const unsubscribe = bridge.subscribeNotifications((notification) => {\n if (ws.readyState !== 1) return\n ws.send(JSON.stringify(notification))\n })\n\n ws.on('close', unsubscribe)\n ws.on('error', unsubscribe)\n })\n },\n }\n}\n","import { spawn, spawnSync, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { createHash, randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rename, rm, mkdir, stat, cp, lstat, readlink, symlink } from 'node:fs/promises'\nimport { createReadStream, existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpRequest } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, dirname, isAbsolute, join, resolve } from 'node:path'\nimport { createInterface } from 'node:readline'\nimport { writeFile } from 'node:fs/promises'\nimport { handleAccountRoutes } from './accountRoutes.js'\nimport { buildAppServerArgs } from './appServerRuntimeConfig.js'\nimport { handleReviewRoutes } from './reviewGit.js'\nimport { handleSkillsRoutes, initializeSkillsSyncOnStartup } from './skillsRoutes.js'\nimport { TelegramThreadBridge } from './telegramThreadBridge.js'\nimport {\n getRandomFreeKey,\n getFreeKeyCount,\n FREE_MODE_PROVIDER_ID,\n FREE_MODE_DEFAULT_MODEL,\n getCachedFreeModels,\n getFreeModels,\n refreshFreeModelsInBackground,\n FREE_MODE_STATE_FILE,\n createDefaultOpenCodeZenFreeModeState,\n getFreeModeConfigArgs,\n getFreeModeEnvVars,\n shouldCreateDefaultFreeModeStateForMissingAuth,\n type FreeModeState,\n} from './freeMode.js'\nimport { handleOpenRouterProxyRequest } from './openRouterProxy.js'\nimport { handleZenProxyRequest } from './zenProxy.js'\nimport { handleCustomEndpointProxyRequest } from './customEndpointProxy.js'\nimport { ThreadTerminalManager } from './terminalManager.js'\nimport { getSpawnInvocation } from '../utils/commandInvocation.js'\nimport {\n resolveCodexCommand,\n resolveRipgrepCommand,\n} from '../commandResolution.js'\nimport type { CollaborationModeKind, ReasoningEffort } from '../types/codex.js'\nimport { isAbsoluteLikePath } from '../pathUtils.js'\n\ntype JsonRpcCall = {\n jsonrpc: '2.0'\n id: number\n method: string\n params?: unknown\n}\n\ntype JsonRpcResponse = {\n id?: number\n result?: unknown\n error?: {\n code: number\n message: string\n }\n method?: string\n params?: unknown\n}\n\ntype RpcProxyRequest = {\n method: string\n params?: unknown\n}\n\ntype RpcExecutor = {\n rpc: (method: string, params: unknown) => Promise<unknown>\n}\n\ntype ServerRequestReply = {\n result?: unknown\n error?: {\n code: number\n message: string\n }\n}\n\ntype WorkspaceRootsState = {\n order: string[]\n labels: Record<string, string>\n active: string[]\n projectOrder: string[]\n remoteProjects: Array<{\n id: string\n hostId: string\n remotePath: string\n label: string\n }>\n}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\n}\n\ntype ChatgptAuthTokensRefreshParams = {\n reason?: string\n previousAccountId?: string | null\n}\n\ntype ChatgptAuthTokensRefreshResponse = {\n accessToken: string\n chatgptAccountId: string\n chatgptPlanType: string | null\n}\n\ntype ThreadSearchDocument = {\n id: string\n title: string\n preview: string\n messageText: string\n searchableText: string\n}\n\ntype ThreadSearchIndex = {\n docsById: Map<string, ThreadSearchDocument>\n}\n\ntype ProviderModelsResponse = {\n data: string[]\n providerId: string\n source: 'provider'\n}\n\ntype ComposioUserData = {\n apiKey: string\n baseUrl: string\n webUrl: string\n orgId: string\n testUserId: string\n}\n\ntype ComposioStatusResponse = {\n available: boolean\n authenticated: boolean\n cliVersion: string\n email: string\n defaultOrgName: string\n defaultOrgId: string\n webUrl: string\n baseUrl: string\n testUserId: string\n}\n\ntype ComposioConnectionSummary = {\n id: string\n wordId: string\n alias: string\n status: string\n authScheme: string\n createdAt: string\n updatedAt: string\n isComposioManaged: boolean\n isDisabled: boolean\n}\n\ntype ComposioConnectorSummary = {\n slug: string\n name: string\n description: string\n logoUrl: string\n latestVersion: string\n toolsCount: number\n triggersCount: number\n isNoAuth: boolean\n enabled: boolean\n authModes: string[]\n activeCount: number\n totalConnections: number\n connectionStatuses: string[]\n}\n\ntype ComposioToolSummary = {\n slug: string\n name: string\n description: string\n}\n\ntype ComposioConnectorDetail = {\n connector: ComposioConnectorSummary\n connections: ComposioConnectionSummary[]\n tools: ComposioToolSummary[]\n dashboardUrl: string\n}\n\ntype ComposioLinkResult = {\n status: string\n message: string\n connectedAccountId: string\n redirectUrl: string\n toolkit: string\n projectType: string\n}\n\ntype ComposioLoginResult = {\n status: string\n message: string\n loginUrl: string\n cliKey: string\n expiresAt: string\n}\n\ntype ComposioInstallResult = {\n ok: boolean\n command: string\n output: string\n}\n\ntype ComposioConnectorPage = {\n data: ComposioConnectorSummary[]\n nextCursor: string | null\n total: number\n}\n\nconst COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX = 1000\n\nconst PROVIDER_MODELS_FETCH_TIMEOUT_MS = 5_000\n\nconst THREAD_RESPONSE_TURN_LIMIT = 10\nconst THREAD_TURN_PAGE_READ_CACHE_TTL_MS = 30_000\nconst THREAD_METHODS_WITH_TURNS = new Set(['thread/read', 'thread/resume', 'thread/fork', 'thread/rollback'])\nconst THREAD_SEARCH_FULL_TEXT_THREAD_LIMIT = 100\nconst PROJECTLESS_THREAD_DIRECTORY_MAX_ATTEMPTS = 100\nconst PROJECTLESS_THREAD_SLUG_MAX_LENGTH = 80\nconst API_PERF_LOGGING_ENV_KEY = 'CODEXUI_API_PERF_LOGGING'\nconst API_PERF_MS_THRESHOLD_ENV_KEY = 'CODEXUI_API_PERF_MS_THRESHOLD'\nconst API_PERF_BODY_MB_THRESHOLD_ENV_KEY = 'CODEXUI_API_PERF_BODY_MB_THRESHOLD'\nconst DEFAULT_API_PERF_MS_THRESHOLD = 300\nconst DEFAULT_API_PERF_BODY_MB_THRESHOLD = 1\nconst MB_DIVISOR = 1024 * 1024\nconst COMPOSIO_USER_DATA_PATH = join(homedir(), '.composio', 'user_data.json')\n\ntype SessionRecoveredFileChange = {\n path: string\n operation: 'add' | 'delete' | 'update'\n movedToPath: string | null\n diff: string\n addedLineCount: number\n removedLineCount: number\n}\n\ntype SessionRecoveredTurnFileChanges = {\n turnId: string\n turnIndex: number\n fileChanges: SessionRecoveredFileChange[]\n}\n\ntype SessionRecoveredSkillInput = {\n name: string\n path: string\n}\n\ntype SessionSkillInputCacheEntry = {\n size: number\n mtimeMs: number\n skillsByTurnId: Map<string, SessionRecoveredSkillInput[]>\n}\n\nconst SESSION_SKILL_INPUT_CACHE_LIMIT = 64\nconst sessionSkillInputCache = new Map<string, SessionSkillInputCacheEntry>()\n\nfunction parseSessionSkillText(value: string): SessionRecoveredSkillInput | null {\n const trimmed = value.trim()\n if (!trimmed.startsWith('<skill>')) return null\n const name = trimmed.match(/<name>\\s*([\\s\\S]*?)\\s*<\\/name>/u)?.[1]?.trim() ?? ''\n const path = trimmed.match(/<path>\\s*([\\s\\S]*?)\\s*<\\/path>/u)?.[1]?.trim() ?? ''\n if (!name || !path) return null\n return { name, path }\n}\n\nfunction buildSessionSkillInputsByTurn(sessionLogRaw: string): Map<string, SessionRecoveredSkillInput[]> {\n let currentTurnId = ''\n const skillsByTurnId = new Map<string, SessionRecoveredSkillInput[]>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const payloadRecord = asRecord(row.payload)\n currentTurnId = readNonEmptyString(payloadRecord?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const payloadRecord = asRecord(row.payload)\n if (payloadRecord?.type === 'task_started') {\n currentTurnId = readNonEmptyString(payloadRecord.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId) continue\n const payloadRecord = asRecord(row.payload)\n if (payloadRecord?.type !== 'message' || payloadRecord.role !== 'user') continue\n const content = Array.isArray(payloadRecord.content) ? payloadRecord.content : []\n\n for (const contentItem of content) {\n const contentRecord = asRecord(contentItem)\n if (contentRecord?.type !== 'input_text' || typeof contentRecord.text !== 'string') continue\n const skill = parseSessionSkillText(contentRecord.text)\n if (!skill) continue\n const existing = skillsByTurnId.get(currentTurnId) ?? []\n if (!existing.some((item) => item.path === skill.path)) {\n existing.push(skill)\n skillsByTurnId.set(currentTurnId, existing)\n }\n }\n }\n\n return skillsByTurnId\n}\n\nasync function readCachedSessionSkillInputsByTurn(sessionPath: string): Promise<Map<string, SessionRecoveredSkillInput[]>> {\n const sessionStat = await stat(sessionPath)\n const cached = sessionSkillInputCache.get(sessionPath)\n if (cached && cached.size === sessionStat.size && cached.mtimeMs === sessionStat.mtimeMs) {\n return cached.skillsByTurnId\n }\n\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n const skillsByTurnId = buildSessionSkillInputsByTurn(sessionLogRaw)\n sessionSkillInputCache.set(sessionPath, {\n size: sessionStat.size,\n mtimeMs: sessionStat.mtimeMs,\n skillsByTurnId,\n })\n if (sessionSkillInputCache.size > SESSION_SKILL_INPUT_CACHE_LIMIT) {\n const oldestKey = sessionSkillInputCache.keys().next().value\n if (oldestKey) sessionSkillInputCache.delete(oldestKey)\n }\n return skillsByTurnId\n}\n\nfunction mergeSessionSkillInputsIntoTurnsFromMap(\n turns: unknown[],\n skillsByTurnId: Map<string, SessionRecoveredSkillInput[]>,\n): unknown[] {\n const turnIds = new Set<string>()\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) turnIds.add(turnId)\n }\n if (turnIds.size === 0) return turns\n\n if (skillsByTurnId.size === 0) return turns\n\n let changed = false\n const nextTurns = turns.map((turn) => {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n const skills = turnId ? skillsByTurnId.get(turnId) : undefined\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : null\n if (!turnRecord || !skills || skills.length === 0 || !items) return turn\n\n let targetUserMessageIndex = -1\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const itemRecord = asRecord(items[index])\n if (itemRecord?.type === 'userMessage' && Array.isArray(itemRecord.content)) {\n targetUserMessageIndex = index\n break\n }\n }\n if (targetUserMessageIndex < 0) return turn\n\n let addedToMessage = false\n const nextItems = items.map((item, index) => {\n const itemRecord = asRecord(item)\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : null\n if (index !== targetUserMessageIndex || itemRecord?.type !== 'userMessage' || !content) return item\n\n const existingSkillPaths = new Set(\n content.flatMap((contentItem) => {\n const contentRecord = asRecord(contentItem)\n const path = typeof contentRecord?.path === 'string' ? contentRecord.path.trim() : ''\n return contentRecord?.type === 'skill' && path ? [path] : []\n }),\n )\n const missingSkills = skills.filter((skill) => !existingSkillPaths.has(skill.path))\n if (missingSkills.length === 0) return item\n\n addedToMessage = true\n changed = true\n return {\n ...itemRecord,\n content: [\n ...content,\n ...missingSkills.map((skill) => ({ type: 'skill', name: skill.name, path: skill.path })),\n ],\n }\n })\n\n return addedToMessage ? { ...turnRecord, items: nextItems } : turn\n })\n\n return changed ? nextTurns : turns\n}\n\nexport function mergeSessionSkillInputsIntoTurns(turns: unknown[], sessionLogRaw: string): unknown[] {\n return mergeSessionSkillInputsIntoTurnsFromMap(turns, buildSessionSkillInputsByTurn(sessionLogRaw))\n}\n\nasync function mergeSessionSkillInputsIntoThreadResult(result: unknown): Promise<unknown> {\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n const sessionPath = readNonEmptyString(thread?.path)\n if (!record || !thread || !turns || turns.length === 0 || !sessionPath || !isAbsolute(sessionPath)) {\n return result\n }\n\n try {\n const skillsByTurnId = await readCachedSessionSkillInputsByTurn(sessionPath)\n const mergedTurns = mergeSessionSkillInputsIntoTurnsFromMap(turns, skillsByTurnId)\n if (mergedTurns === turns) return result\n return {\n ...record,\n thread: {\n ...thread,\n turns: mergedTurns,\n },\n }\n } catch {\n return result\n }\n}\n\nfunction readEnvValueFromFile(filePath: string, key: string): string | null {\n try {\n const content = readFileSync(filePath, 'utf8')\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&')\n const match = content.match(new RegExp(`^\\\\s*${escapedKey}\\\\s*=\\\\s*(.+)\\\\s*$`, 'm'))\n if (!match) return null\n const rawValue = match[1]?.trim() ?? ''\n if (!rawValue) return null\n if ((rawValue.startsWith('\"') && rawValue.endsWith('\"')) || (rawValue.startsWith('\\'') && rawValue.endsWith('\\''))) {\n return rawValue.slice(1, -1).trim()\n }\n return rawValue\n } catch {\n return null\n }\n}\n\nfunction parseBooleanEnvFlag(value: string | null | undefined): boolean | null {\n if (!value) return null\n const normalized = value.trim().toLowerCase()\n if (['1', 'true', 'yes', 'on'].includes(normalized)) return true\n if (['0', 'false', 'no', 'off'].includes(normalized)) return false\n return null\n}\n\nfunction resolveApiPerfLoggingEnabled(): boolean {\n const explicitValue = parseBooleanEnvFlag(process.env[API_PERF_LOGGING_ENV_KEY])\n if (explicitValue !== null) return explicitValue\n\n const fromEnvLocal = parseBooleanEnvFlag(readEnvValueFromFile('.env.local', API_PERF_LOGGING_ENV_KEY))\n if (fromEnvLocal !== null) return fromEnvLocal\n\n const fromEnv = parseBooleanEnvFlag(readEnvValueFromFile('.env', API_PERF_LOGGING_ENV_KEY))\n if (fromEnv !== null) return fromEnv\n\n return false\n}\n\nconst API_PERF_LOGGING_ENABLED = resolveApiPerfLoggingEnabled()\n\nfunction parseNumberEnvFlag(value: string | null | undefined): number | null {\n if (!value) return null\n const parsed = Number.parseFloat(value.trim())\n if (!Number.isFinite(parsed)) return null\n return parsed\n}\n\nfunction resolveNumericEnvConfig(envKey: string, fallback: number): number {\n const fromProcess = parseNumberEnvFlag(process.env[envKey])\n if (fromProcess !== null) return fromProcess\n\n const fromEnvLocal = parseNumberEnvFlag(readEnvValueFromFile('.env.local', envKey))\n if (fromEnvLocal !== null) return fromEnvLocal\n\n const fromEnv = parseNumberEnvFlag(readEnvValueFromFile('.env', envKey))\n if (fromEnv !== null) return fromEnv\n\n return fallback\n}\n\nconst API_PERF_MS_THRESHOLD = resolveNumericEnvConfig(API_PERF_MS_THRESHOLD_ENV_KEY, DEFAULT_API_PERF_MS_THRESHOLD)\nconst API_PERF_BODY_MB_THRESHOLD = resolveNumericEnvConfig(API_PERF_BODY_MB_THRESHOLD_ENV_KEY, DEFAULT_API_PERF_BODY_MB_THRESHOLD)\n\nfunction getChunkByteLength(chunk: unknown, encoding?: BufferEncoding): number {\n if (typeof chunk === 'string') {\n return Buffer.byteLength(chunk, encoding)\n }\n if (chunk instanceof Uint8Array) {\n return chunk.byteLength\n }\n if (ArrayBuffer.isView(chunk)) {\n return chunk.byteLength\n }\n if (chunk instanceof ArrayBuffer) {\n return chunk.byteLength\n }\n return 0\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction isInlineDataUrl(value: string): boolean {\n return /^data:/iu.test(value.trim())\n}\n\nfunction inferImageMimeTypeFromBytes(bytes: Uint8Array): string | null {\n if (\n bytes.length >= 8 &&\n bytes[0] === 0x89 &&\n bytes[1] === 0x50 &&\n bytes[2] === 0x4e &&\n bytes[3] === 0x47 &&\n bytes[4] === 0x0d &&\n bytes[5] === 0x0a &&\n bytes[6] === 0x1a &&\n bytes[7] === 0x0a\n ) {\n return 'image/png'\n }\n if (bytes.length >= 3 && bytes[0] === 0xff && bytes[1] === 0xd8 && bytes[2] === 0xff) {\n return 'image/jpeg'\n }\n if (\n bytes.length >= 12 &&\n bytes[0] === 0x52 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x46 &&\n bytes[8] === 0x57 &&\n bytes[9] === 0x45 &&\n bytes[10] === 0x42 &&\n bytes[11] === 0x50\n ) {\n return 'image/webp'\n }\n if (\n bytes.length >= 6 &&\n bytes[0] === 0x47 &&\n bytes[1] === 0x49 &&\n bytes[2] === 0x46 &&\n bytes[3] === 0x38 &&\n (bytes[4] === 0x37 || bytes[4] === 0x39) &&\n bytes[5] === 0x61\n ) {\n return 'image/gif'\n }\n return null\n}\n\nfunction inferImageMimeTypeFromBase64(value: string): string | null {\n const compact = value.trim().replace(/\\s+/gu, '')\n if (compact.length < 32 || !/^[A-Za-z0-9+/]+={0,2}$/u.test(compact)) return null\n try {\n return inferImageMimeTypeFromBytes(Buffer.from(compact.slice(0, 64), 'base64'))\n } catch {\n return null\n }\n}\n\nfunction normalizeBase64ImageDataUrl(value: string, mimeType: string): string | null {\n const trimmed = value.trim()\n if (!trimmed) return null\n if (isInlineDataUrl(trimmed)) {\n return /^data:image\\//iu.test(trimmed) ? trimmed : null\n }\n const compact = trimmed.replace(/\\s+/gu, '')\n const inferredMimeType = inferImageMimeTypeFromBase64(compact)\n if (!inferredMimeType) return null\n const normalizedMimeType = mimeType.trim().toLowerCase()\n const finalMimeType = normalizedMimeType.startsWith('image/') && normalizedMimeType !== 'image/*'\n ? normalizedMimeType\n : inferredMimeType\n return `data:${finalMimeType};base64,${compact}`\n}\n\nfunction extensionFromMimeType(mimeType: string): string {\n const normalized = mimeType.trim().toLowerCase()\n if (normalized === 'image/png') return '.png'\n if (normalized === 'image/jpeg') return '.jpg'\n if (normalized === 'image/webp') return '.webp'\n if (normalized === 'image/gif') return '.gif'\n if (normalized === 'image/svg+xml') return '.svg'\n if (normalized === 'application/pdf') return '.pdf'\n return ''\n}\n\nfunction asNonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction toAttachmentLinkTarget(block: Record<string, unknown>, fallback: string): string {\n const candidate = asNonEmptyString(block.path)\n ?? asNonEmptyString(block.file_path)\n ?? asNonEmptyString(block.filename)\n ?? asNonEmptyString(block.file_id)\n ?? fallback\n if (candidate.startsWith('file://')) return candidate\n if (candidate.startsWith('/')) return `file://${candidate}`\n return `attachment://${candidate}`\n}\n\nasync function persistInlineDataUrlToLocalFile(dataUrl: string, baseName: string): Promise<string | null> {\n const trimmed = dataUrl.trim()\n const match = /^data:([^;,]*)(;base64)?,(.*)$/isu.exec(trimmed)\n if (!match) return null\n const mimeType = (match[1] ?? '').trim().toLowerCase()\n const encodedPayload = match[3] ?? ''\n let bytes: Buffer\n try {\n bytes = match[2]\n ? Buffer.from(encodedPayload, 'base64')\n : Buffer.from(decodeURIComponent(encodedPayload), 'utf8')\n } catch {\n return null\n }\n if (bytes.length === 0) return null\n\n const hash = createHash('sha1').update(bytes).digest('hex')\n const ext = extensionFromMimeType(mimeType)\n const mediaDir = join(tmpdir(), 'codex-web-inline-media')\n await mkdir(mediaDir, { recursive: true })\n const fileName = `${baseName}-${hash}${ext}`\n const filePath = join(mediaDir, fileName)\n try {\n await stat(filePath)\n } catch {\n await writeFile(filePath, bytes)\n }\n return filePath\n}\n\nfunction toLocalImageProxyUrl(path: string): string {\n return `/codex-local-image?path=${encodeURIComponent(path)}`\n}\n\nconst INLINE_IMAGE_FIELD_NAMES = new Set([\n 'b64_json',\n 'image',\n 'image_url',\n 'images',\n 'result',\n 'url',\n])\n\ntype InlinePayloadSanitizeContext = {\n turnId: string\n itemId: string\n blockIndex: number\n fieldName?: string\n}\n\nfunction isPotentialInlineImageField(fieldName: string | undefined): boolean {\n return typeof fieldName === 'string' && INLINE_IMAGE_FIELD_NAMES.has(fieldName)\n}\n\nasync function sanitizeInlineImageString(\n value: string,\n context: InlinePayloadSanitizeContext,\n): Promise<{ value: string; changed: boolean }> {\n if (!isPotentialInlineImageField(context.fieldName)) {\n return { value, changed: false }\n }\n\n const dataUrl = normalizeBase64ImageDataUrl(value, 'image/*')\n if (!dataUrl) return { value, changed: false }\n\n const localUrl = await persistInlineDataUrlToLocalFile(\n dataUrl,\n `inline-image-${context.turnId}-${context.itemId}-${context.fieldName}-${String(context.blockIndex)}`,\n )\n if (!localUrl) return { value, changed: false }\n\n return { value: toLocalImageProxyUrl(localUrl), changed: true }\n}\n\nasync function sanitizeInlineUserContentBlock(\n block: unknown,\n context: InlinePayloadSanitizeContext,\n): Promise<unknown> {\n const record = asRecord(block)\n if (!record) return block\n\n const type = asNonEmptyString(record.type) ?? ''\n const imageUrl = asNonEmptyString(record.url) ?? asNonEmptyString(record.image_url)\n if (imageUrl && isInlineDataUrl(imageUrl)) {\n const localUrl = await persistInlineDataUrlToLocalFile(imageUrl, `inline-image-${context.turnId}-${context.itemId}-${String(context.blockIndex)}`)\n if (localUrl) {\n const nextRecord = { ...record }\n if (typeof record.url === 'string') {\n nextRecord.url = toLocalImageProxyUrl(localUrl)\n }\n if (typeof record.image_url === 'string') {\n nextRecord.image_url = toLocalImageProxyUrl(localUrl)\n }\n return {\n ...nextRecord,\n type: 'image',\n }\n }\n const target = toAttachmentLinkTarget(record, `inline-image/${context.turnId}/${context.itemId}/${String(context.blockIndex)}`)\n return {\n type: 'text',\n text: `Image attachment: ${target}`,\n }\n }\n\n if (type === 'imageGeneration' || type === 'image_generation') {\n const rawResult = asNonEmptyString(record.result)\n ?? asNonEmptyString(record.b64_json)\n ?? asNonEmptyString(record.image)\n const mimeType = asNonEmptyString(record.mime_type)\n ?? asNonEmptyString(record.mimeType)\n ?? 'image/png'\n const dataUrl = rawResult ? normalizeBase64ImageDataUrl(rawResult, mimeType) : null\n if (dataUrl) {\n const localUrl = await persistInlineDataUrlToLocalFile(dataUrl, `generated-image-${context.turnId}-${context.itemId}`)\n if (localUrl) {\n return {\n ...record,\n type: 'imageView',\n path: localUrl,\n }\n }\n }\n }\n\n const inlineFileData = asNonEmptyString(record.file_data)\n ?? asNonEmptyString(record.data)\n ?? asNonEmptyString(record.base64)\n if ((type.includes('file') || type === 'input_file' || type === 'file') && inlineFileData) {\n const mimeType = asNonEmptyString(record.mime_type) ?? 'application/octet-stream'\n const fileDataUrl = `data:${mimeType};base64,${inlineFileData}`\n const localUrl = await persistInlineDataUrlToLocalFile(fileDataUrl, `inline-file-${context.turnId}-${context.itemId}-${String(context.blockIndex)}`)\n if (localUrl) {\n return {\n type: 'text',\n text: `File attachment: ${localUrl}`,\n }\n }\n const target = toAttachmentLinkTarget(record, `inline-file/${context.turnId}/${context.itemId}/${String(context.blockIndex)}`)\n return {\n type: 'text',\n text: `File attachment: ${target}`,\n }\n }\n\n return block\n}\n\nasync function sanitizeInlinePayloadDeep(\n value: unknown,\n context: InlinePayloadSanitizeContext,\n): Promise<{ value: unknown; changed: boolean }> {\n const maybeBlock = await sanitizeInlineUserContentBlock(value, context)\n if (maybeBlock !== value) {\n return { value: maybeBlock, changed: true }\n }\n\n if (typeof value === 'string') {\n return sanitizeInlineImageString(value, context)\n }\n\n if (Array.isArray(value)) {\n let changed = false\n const nextArray: unknown[] = []\n for (let index = 0; index < value.length; index += 1) {\n const nested = await sanitizeInlinePayloadDeep(value[index], {\n turnId: context.turnId,\n itemId: context.itemId,\n blockIndex: index,\n fieldName: context.fieldName,\n })\n if (nested.changed) changed = true\n nextArray.push(nested.value)\n }\n return changed ? { value: nextArray, changed: true } : { value, changed: false }\n }\n\n const record = asRecord(value)\n if (!record) return { value, changed: false }\n\n let changed = false\n const nextRecord: Record<string, unknown> = {}\n for (const [key, nestedValue] of Object.entries(record)) {\n const nested = await sanitizeInlinePayloadDeep(nestedValue, {\n turnId: context.turnId,\n itemId: context.itemId,\n blockIndex: context.blockIndex,\n fieldName: key,\n })\n if (nested.changed) changed = true\n nextRecord[key] = nested.value\n }\n\n return changed ? { value: nextRecord, changed: true } : { value, changed: false }\n}\n\nexport async function sanitizeThreadTurnsInlinePayloads(method: string, result: unknown): Promise<unknown> {\n if (!THREAD_METHODS_WITH_TURNS.has(method)) return result\n\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n if (!record || !thread || !turns || turns.length === 0) return result\n\n let changed = false\n const nextTurns: unknown[] = []\n for (let turnIndex = 0; turnIndex < turns.length; turnIndex += 1) {\n const turn = turns[turnIndex]\n const turnRecord = asRecord(turn)\n const turnId = asNonEmptyString(turnRecord?.id) ?? 'turn'\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : null\n if (!turnRecord || !items) {\n nextTurns.push(turn)\n continue\n }\n\n let itemChanged = false\n const nextItems: unknown[] = []\n for (let itemIndex = 0; itemIndex < items.length; itemIndex += 1) {\n const item = items[itemIndex]\n const itemRecord = asRecord(item)\n const itemId = asNonEmptyString(itemRecord?.id) ?? 'item'\n if (!itemRecord) {\n nextItems.push(item)\n continue\n }\n const sanitizedItem = await sanitizeInlinePayloadDeep(item, {\n turnId,\n itemId,\n blockIndex: itemIndex + turnIndex,\n })\n if (!sanitizedItem.changed) {\n nextItems.push(item)\n continue\n }\n itemChanged = true\n nextItems.push(sanitizedItem.value)\n }\n\n if (!itemChanged) {\n nextTurns.push(turn)\n continue\n }\n changed = true\n nextTurns.push({\n ...turnRecord,\n items: nextItems,\n })\n }\n\n if (!changed) return result\n return {\n ...record,\n thread: {\n ...thread,\n turns: nextTurns,\n },\n }\n}\n\nfunction trimThreadTurnsInRpcResult(method: string, result: unknown): unknown {\n if (!THREAD_METHODS_WITH_TURNS.has(method)) return result\n\n const record = asRecord(result)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : null\n if (!record || !thread || !turns || turns.length <= THREAD_RESPONSE_TURN_LIMIT) return result\n const startTurnIndex = Math.max(0, turns.length - THREAD_RESPONSE_TURN_LIMIT)\n\n return {\n ...record,\n threadTurnStartIndex: startTurnIndex,\n thread: {\n ...thread,\n turns: turns.slice(startTurnIndex),\n },\n }\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\nexport function isUnauthenticatedRateLimitError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('authentication required') && message.includes('rate limits')\n}\n\nconst warnedCodexAuthReadFailures = new Set<string>()\n\nfunction getErrorCode(error: unknown): string | null {\n return typeof error === 'object' && error !== null && 'code' in error\n ? String((error as { code?: unknown }).code ?? '')\n : null\n}\n\nfunction getCodexAuthReadErrorMessage(error: unknown): string {\n return error instanceof Error && error.message.trim().length > 0\n ? error.message\n : String(error)\n}\n\nfunction warnCodexAuthReadFailure(authPath: string, error: unknown): void {\n const message = getCodexAuthReadErrorMessage(error)\n const warningKey = `${authPath}:${message}`\n if (warnedCodexAuthReadFailures.has(warningKey)) return\n warnedCodexAuthReadFailures.add(warningKey)\n console.warn('[codex-auth] Unable to read Codex auth state', { path: authPath, error: message })\n}\n\nexport async function hasUsableCodexAuth(): Promise<boolean> {\n const authPath = getCodexAuthPath()\n try {\n const raw = await readFile(authPath, 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n return Boolean(auth.tokens?.access_token?.trim() || auth.tokens?.refresh_token?.trim())\n } catch (error) {\n if (getErrorCode(error) !== 'ENOENT') {\n warnCodexAuthReadFailure(authPath, error)\n }\n return false\n }\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction logProviderModelDiscoveryWarning(message: string, details: Record<string, unknown>): void {\n console.warn('[codex-provider-models]', message, details)\n}\n\nfunction isTimeoutError(payload: unknown): boolean {\n return payload instanceof Error && (payload.name === 'AbortError' || payload.name === 'TimeoutError')\n}\n\nfunction formatProjectlessDateSegment(date = new Date()): string {\n const month = String(date.getMonth() + 1).padStart(2, '0')\n const day = String(date.getDate()).padStart(2, '0')\n return `${date.getFullYear()}-${month}-${day}`\n}\n\nfunction buildProjectlessPromptSlug(prompt: string | null): string {\n const slug = prompt\n ?.toLowerCase()\n .match(/[a-z0-9]+/g)\n ?.slice(0, 6)\n .join('-')\n .slice(0, PROJECTLESS_THREAD_SLUG_MAX_LENGTH)\n return slug && slug.length > 0 ? slug : 'new-chat'\n}\n\nasync function ensureRealDirectory(path: string, label: string): Promise<void> {\n const info = await lstat(path)\n if (info.isSymbolicLink() || !info.isDirectory()) {\n throw new Error(`${label} must be a real directory`)\n }\n}\n\nasync function createProjectlessThreadDirectory(prompt: string | null): Promise<{ cwd: string; outputDirectory: string; workspaceRoot: string }> {\n const workspaceRoot = join(homedir(), 'Documents', 'Codex')\n await mkdir(workspaceRoot, { recursive: true })\n await ensureRealDirectory(workspaceRoot, 'Projectless workspace root')\n\n const dateDir = join(workspaceRoot, formatProjectlessDateSegment())\n await mkdir(dateDir, { recursive: true })\n await ensureRealDirectory(dateDir, 'Projectless thread date directory')\n\n const slug = buildProjectlessPromptSlug(prompt)\n for (let index = 0; index < PROJECTLESS_THREAD_DIRECTORY_MAX_ATTEMPTS; index += 1) {\n const folderName = index === 0 ? slug : `${slug}-${index + 1}`\n const cwd = join(dateDir, folderName)\n try {\n await mkdir(cwd, { recursive: false })\n return { cwd, outputDirectory: cwd, workspaceRoot }\n } catch {\n try {\n await stat(cwd)\n } catch {\n throw new Error('Failed to create new chat folder')\n }\n }\n }\n\n throw new Error('Unable to create a unique new chat folder')\n}\n\nfunction normalizeGithubCloneUrl(rawUrl: string): { url: string; repoName: string } {\n const trimmedUrl = rawUrl.trim()\n if (!trimmedUrl) throw new Error('Missing GitHub repository URL')\n\n const sshMatch = trimmedUrl.match(/^git@github\\.com:([A-Za-z0-9_.-]+)\\/([A-Za-z0-9_.-]+?)(?:\\.git)?$/u)\n if (sshMatch) {\n const repoName = sshMatch[2]\n return { url: `git@github.com:${sshMatch[1]}/${repoName}.git`, repoName }\n }\n\n let parsed: URL\n try {\n parsed = new URL(trimmedUrl)\n } catch {\n throw new Error('Enter a valid GitHub repository URL')\n }\n if (parsed.hostname.toLowerCase() !== 'github.com') {\n throw new Error('Only github.com repository URLs are supported')\n }\n const segments = parsed.pathname.split('/').filter(Boolean)\n if (segments.length < 2) {\n throw new Error('Enter a GitHub repository URL with owner and repository name')\n }\n const owner = segments[0]\n const repoName = segments[1].replace(/\\.git$/iu, '')\n if (!/^[A-Za-z0-9_.-]+$/u.test(owner) || !/^[A-Za-z0-9_.-]+$/u.test(repoName)) {\n throw new Error('GitHub repository owner or name contains unsupported characters')\n }\n return { url: `https://github.com/${owner}/${repoName}.git`, repoName }\n}\n\nasync function cloneGithubRepositoryIntoBase(rawUrl: string, rawBasePath: string): Promise<string> {\n const basePath = rawBasePath.trim()\n if (!basePath) throw new Error('Missing clone destination folder')\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n await ensureRealDirectory(normalizedBasePath, 'Clone destination folder')\n\n const { url, repoName } = normalizeGithubCloneUrl(rawUrl)\n const targetPath = join(normalizedBasePath, repoName)\n try {\n await stat(targetPath)\n throw new Error(`Destination already exists: ${targetPath}`)\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code !== 'ENOENT') throw error\n }\n\n try {\n await runCommand('git', ['clone', url, targetPath], { cwd: normalizedBasePath, timeoutMs: 5 * 60_000 })\n } catch (error) {\n await rm(targetPath, { recursive: true, force: true }).catch(() => undefined)\n throw error\n }\n await persistWorkspaceRoot(targetPath, '')\n return targetPath\n}\n\nfunction normalizeHeaderValue(value: unknown): string | null {\n if (typeof value === 'string') {\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n }\n if (typeof value === 'number' || typeof value === 'boolean') {\n return String(value)\n }\n return null\n}\n\nfunction normalizeQueryParams(value: unknown): URLSearchParams {\n const params = new URLSearchParams()\n const record = asRecord(value)\n if (!record) return params\n\n for (const [key, rawValue] of Object.entries(record)) {\n const normalized = normalizeHeaderValue(rawValue)\n if (!normalized) continue\n params.set(key, normalized)\n }\n\n return params\n}\n\nfunction buildProviderModelsUrl(baseUrl: string, queryParams: unknown): URL {\n const url = new URL(baseUrl)\n url.pathname = url.pathname.endsWith('/') ? `${url.pathname}models` : `${url.pathname}/models`\n const extraParams = normalizeQueryParams(queryParams)\n for (const [key, value] of extraParams.entries()) {\n url.searchParams.set(key, value)\n }\n return url\n}\n\nfunction normalizeProviderModelsData(payload: unknown): string[] {\n const record = asRecord(payload)\n const rows = Array.isArray(record?.data) ? record.data : null\n if (!rows) {\n throw new Error('provider /models payload is missing a data array')\n }\n\n const ids: string[] = []\n for (const row of rows) {\n const entry = asRecord(row)\n const candidate = readNonEmptyString(entry?.id)\n if (!candidate || ids.includes(candidate)) continue\n ids.push(candidate)\n }\n return ids\n}\n\nasync function fetchCustomEndpointDefaultModel(baseUrl: string, apiKey: string): Promise<string> {\n const normalizedBaseUrl = baseUrl.trim()\n if (!normalizedBaseUrl) return ''\n\n try {\n const modelsUrl = buildProviderModelsUrl(normalizedBaseUrl, null)\n const headers: Record<string, string> = apiKey ? { Authorization: `Bearer ${apiKey}` } : {}\n const response = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(PROVIDER_MODELS_FETCH_TIMEOUT_MS) })\n if (!response.ok) return ''\n const payload = await response.json() as unknown\n const modelIds = normalizeProviderModelsData(payload)\n return modelIds[0] ?? ''\n } catch {\n return ''\n }\n}\n\nasync function readProviderBackedModelIds(appServer: AppServerProcess): Promise<ProviderModelsResponse> {\n const configPayload = asRecord(await appServer.rpc('config/read', {}))\n const config = asRecord(configPayload?.config)\n const providerId = readNonEmptyString(config?.model_provider)\n if (!providerId) {\n return { data: [], providerId: '', source: 'provider' }\n }\n\n const providers = asRecord(config?.model_providers)\n const provider = asRecord(providers?.[providerId])\n if (!provider) {\n logProviderModelDiscoveryWarning('configured provider is missing from model_providers', { providerId })\n return { data: [], providerId, source: 'provider' }\n }\n\n const wireApi = readNonEmptyString(provider.wire_api)\n if (wireApi !== 'responses') {\n return { data: [], providerId, source: 'provider' }\n }\n\n const baseUrl = readNonEmptyString(provider.base_url)\n if (!baseUrl) {\n logProviderModelDiscoveryWarning('responses provider is missing base_url', { providerId })\n return { data: [], providerId, source: 'provider' }\n }\n\n const headers = new Headers()\n const configuredHeaders = asRecord(provider.http_headers)\n if (configuredHeaders) {\n for (const [key, rawValue] of Object.entries(configuredHeaders)) {\n const normalized = normalizeHeaderValue(rawValue)\n if (!normalized) continue\n headers.set(key, normalized)\n }\n }\n\n const bearerToken = readNonEmptyString(provider.experimental_bearer_token)\n if (bearerToken && !headers.has('Authorization')) {\n headers.set('Authorization', `Bearer ${bearerToken}`)\n }\n\n const envKey = readNonEmptyString(provider.env_key)\n const envHttpHeaders = asRecord(provider.env_http_headers)\n if (envKey || envHttpHeaders) {\n logProviderModelDiscoveryWarning('provider discovery skipped env-backed auth/header expansion', {\n providerId,\n hasEnvKey: Boolean(envKey),\n hasEnvHttpHeaders: Boolean(envHttpHeaders),\n })\n }\n\n let requestUrl: URL\n try {\n requestUrl = buildProviderModelsUrl(baseUrl, provider.query_params)\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models URL was invalid', {\n providerId,\n error: getErrorMessage(error, 'invalid url'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n let response: Response\n try {\n response = await fetch(requestUrl, {\n method: 'GET',\n headers,\n signal: AbortSignal.timeout(PROVIDER_MODELS_FETCH_TIMEOUT_MS),\n })\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models request failed', {\n providerId,\n error: isTimeoutError(error) ? `request timed out after ${PROVIDER_MODELS_FETCH_TIMEOUT_MS}ms` : getErrorMessage(error, 'network error'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n let payload: unknown = null\n try {\n payload = await response.json()\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models response was not valid JSON', {\n providerId,\n status: response.status,\n error: getErrorMessage(error, 'invalid json'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n if (!response.ok) {\n logProviderModelDiscoveryWarning('provider /models request returned non-2xx', {\n providerId,\n status: response.status,\n statusText: response.statusText,\n })\n return { data: [], providerId, source: 'provider' }\n }\n\n try {\n return {\n data: normalizeProviderModelsData(payload),\n providerId,\n source: 'provider',\n }\n } catch (error) {\n logProviderModelDiscoveryWarning('provider /models payload was invalid', {\n providerId,\n error: getErrorMessage(error, 'invalid payload'),\n })\n return { data: [], providerId, source: 'provider' }\n }\n}\n\nfunction extractThreadMessageText(threadReadPayload: unknown): string {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const parts: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim().length > 0) {\n parts.push(itemRecord.text.trim())\n continue\n }\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim().length > 0) {\n parts.push(blockRecord.text.trim())\n }\n }\n continue\n }\n if (type === 'commandExecution') {\n const command = typeof itemRecord?.command === 'string' ? itemRecord.command.trim() : ''\n const output = typeof itemRecord?.aggregatedOutput === 'string' ? itemRecord.aggregatedOutput.trim() : ''\n if (command) parts.push(command)\n if (output) parts.push(output)\n }\n }\n }\n\n return parts.join('\\n').trim()\n}\n\nfunction readNonEmptyString(value: unknown): string {\n return typeof value === 'string' && value.trim().length > 0 ? value : ''\n}\n\nfunction readThreadArchiveFallbackName(threadReadResult: unknown): string {\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n return (\n readNonEmptyString(thread?.name)\n || readNonEmptyString(thread?.title)\n || readNonEmptyString(thread?.preview)\n || 'Untitled thread'\n )\n}\n\nfunction isArchivedThreadReadResult(threadReadResult: unknown): boolean {\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n const sessionPath = readNonEmptyString(thread?.path)\n return sessionPath.split(/[\\\\/]+/u).includes('archived_sessions')\n}\n\nexport async function callRpcWithArchiveRecovery(\n appServer: RpcExecutor,\n method: string,\n params: unknown,\n): Promise<unknown> {\n try {\n return await appServer.rpc(method, params ?? null)\n } catch (error) {\n if (method !== 'thread/archive') {\n throw error\n }\n\n const paramsRecord = asRecord(params)\n const threadId = readNonEmptyString(paramsRecord?.threadId)\n const errorMessage = getErrorMessage(error, '')\n if (!threadId || !errorMessage.includes('no rollout found')) {\n throw error\n }\n\n let threadReadResult: unknown = null\n try {\n threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: false,\n })\n if (isArchivedThreadReadResult(threadReadResult)) {\n return null\n }\n } catch {\n // If metadata cannot be read, still try materializing a title before retrying archive.\n }\n\n await appServer.rpc('thread/name/set', {\n threadId,\n name: readThreadArchiveFallbackName(threadReadResult),\n })\n return appServer.rpc(method, params ?? null)\n }\n}\n\ntype TerminalQuickCommand = {\n label: string\n value: string\n source: 'package' | 'script' | 'make'\n}\n\nasync function listTerminalQuickCommands(cwd: string): Promise<TerminalQuickCommand[]> {\n const normalizedCwd = isAbsolute(cwd) ? cwd : resolve(cwd)\n const info = await stat(normalizedCwd)\n if (!info.isDirectory()) {\n throw new Error('Terminal cwd is not a directory')\n }\n\n const commands: TerminalQuickCommand[] = []\n const seen = new Set<string>()\n const addCommand = (command: TerminalQuickCommand) => {\n if (!command.value || seen.has(command.value)) return\n seen.add(command.value)\n commands.push(command)\n }\n\n await addPackageJsonCommands(normalizedCwd, addCommand)\n await addMakefileCommands(normalizedCwd, addCommand)\n await addRootScriptCommands(normalizedCwd, addCommand)\n await addScriptsDirectoryCommands(normalizedCwd, addCommand)\n return commands\n}\n\nasync function addPackageJsonCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n try {\n const raw = await readFile(join(cwd, 'package.json'), 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const record = asRecord(parsed)\n const scripts = asRecord(record?.scripts)\n if (!scripts) return\n const packageManager = resolvePackageManager(cwd)\n for (const scriptName of Object.keys(scripts)) {\n if (typeof scripts[scriptName] !== 'string') continue\n const value = formatPackageScriptCommand(packageManager, scriptName)\n addCommand({\n label: value,\n value,\n source: 'package',\n })\n }\n } catch {\n // A project without package.json simply has no package quick commands.\n }\n}\n\nasync function addMakefileCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n const makefilePath = existsSync(join(cwd, 'Makefile'))\n ? join(cwd, 'Makefile')\n : existsSync(join(cwd, 'makefile'))\n ? join(cwd, 'makefile')\n : ''\n if (!makefilePath) return\n\n try {\n const raw = await readFile(makefilePath, 'utf8')\n for (const line of raw.split(/\\r?\\n/)) {\n const match = /^([A-Za-z0-9_.@%/+~-][A-Za-z0-9_.@%/+~-]*)\\s*:(?![=])/.exec(line)\n if (!match) continue\n const target = match[1]\n if (!target || target.startsWith('.')) continue\n const value = `make ${quoteShellTokenIfNeeded(target)}`\n addCommand({\n label: value,\n value,\n source: 'make',\n })\n }\n } catch {\n // Ignore unreadable Makefiles for quick-command discovery.\n }\n}\n\nasync function addRootScriptCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n await addScriptFileCommands(cwd, '.', addCommand)\n}\n\nasync function addScriptsDirectoryCommands(\n cwd: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n await addScriptFileCommands(join(cwd, 'scripts'), './scripts', addCommand)\n}\n\nasync function addScriptFileCommands(\n directory: string,\n commandPrefix: string,\n addCommand: (command: TerminalQuickCommand) => void,\n): Promise<void> {\n try {\n const entries = await readdir(directory, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isFile()) continue\n if (!entry.name.endsWith('.sh') && !entry.name.endsWith('.cmd')) continue\n const value = `${commandPrefix}/${quoteShellTokenIfNeeded(entry.name)}`\n addCommand({\n label: value,\n value,\n source: 'script',\n })\n }\n } catch {\n // A project without script files simply has no script-file quick commands.\n }\n}\n\nfunction resolvePackageManager(cwd: string): 'npm' | 'pnpm' | 'yarn' | 'bun' {\n if (existsSync(join(cwd, 'pnpm-lock.yaml'))) return 'pnpm'\n if (existsSync(join(cwd, 'yarn.lock'))) return 'yarn'\n if (existsSync(join(cwd, 'bun.lock')) || existsSync(join(cwd, 'bun.lockb'))) return 'bun'\n return 'npm'\n}\n\nfunction formatPackageScriptCommand(packageManager: 'npm' | 'pnpm' | 'yarn' | 'bun', scriptName: string): string {\n const quoted = quoteShellTokenIfNeeded(scriptName)\n if (packageManager === 'npm') return `npm run ${quoted}`\n if (packageManager === 'pnpm') return `pnpm run ${quoted}`\n if (packageManager === 'bun') return `bun run ${quoted}`\n return `yarn ${quoted}`\n}\n\nfunction quoteShellTokenIfNeeded(value: string): string {\n return /^[A-Za-z0-9_./:@-]+$/.test(value) ? value : `'${value.replace(/'/g, `'\\\\''`)}'`\n}\n\nfunction readBoolean(value: unknown): boolean {\n return value === true\n}\n\nfunction readNumber(value: unknown): number {\n return typeof value === 'number' && Number.isFinite(value) ? value : 0\n}\n\ntype ComposioCliInvocation = { command: string; args: string[]; displayCommand: string }\n\nfunction buildComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const overrideCommand = process.env.CODEXUI_COMPOSIO_COMMAND?.trim()\n if (overrideCommand) {\n const invocation = getSpawnInvocation(overrideCommand, args)\n return {\n command: invocation.command,\n args: invocation.args,\n displayCommand: `${overrideCommand} ${args.map(quoteShellTokenIfNeeded).join(' ')}`.trim(),\n }\n }\n return buildInstalledComposioInvocation(args)\n}\n\nfunction buildInstalledComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const candidates = [\n join(homedir(), '.composio', 'composio'),\n 'composio',\n ]\n for (const candidate of candidates) {\n if ((candidate.includes('/') || candidate.includes('\\\\')) && !existsSync(candidate)) continue\n const invocation = getSpawnInvocation(candidate, args)\n return {\n command: invocation.command,\n args: invocation.args,\n displayCommand: `${candidate} ${args.map(quoteShellTokenIfNeeded).join(' ')}`.trim(),\n }\n }\n return null\n}\n\nfunction probeComposioInvocation(invocation: ComposioCliInvocation): { available: boolean; cliVersion: string; output: string } {\n const probe = spawnSync(invocation.command, invocation.args, {\n encoding: 'utf8',\n env: process.env,\n windowsHide: true,\n })\n const output = `${probe.stdout ?? ''}${probe.stderr ?? ''}`.trim()\n return {\n available: !probe.error && probe.status === 0,\n cliVersion: probe.status === 0 ? (probe.stdout ?? '').trim() : '',\n output,\n }\n}\n\nfunction resolveComposioInvocation(args: string[]): ComposioCliInvocation | null {\n const invocation = buildComposioInvocation(args)\n const versionInvocation = buildComposioInvocation(['--version'])\n if (invocation && versionInvocation && probeComposioInvocation(versionInvocation).available) return invocation\n return null\n}\n\nfunction parseComposioJson<T>(stdout: string, fallback: string): T {\n const trimmed = stdout.trim()\n if (!trimmed) {\n throw new Error(fallback)\n }\n return JSON.parse(trimmed) as T\n}\n\nasync function runComposioJson<T>(args: string[], fallback: string): Promise<T> {\n const invocation = resolveComposioInvocation(args)\n if (!invocation) {\n throw new Error('Composio CLI is not installed')\n }\n const child = spawn(invocation.command, invocation.args, {\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout.setEncoding('utf8')\n child.stderr.setEncoding('utf8')\n child.stdout.on('data', (chunk) => { stdout += chunk })\n child.stderr.on('data', (chunk) => { stderr += chunk })\n\n const exitCode = await new Promise<number>((resolveExit, reject) => {\n child.once('error', reject)\n child.once('close', (code) => resolveExit(code ?? 0))\n })\n\n if (exitCode !== 0) {\n throw new Error(stderr.trim() || stdout.trim() || fallback)\n }\n\n try {\n return parseComposioJson<T>(stdout, fallback)\n } catch (error) {\n const details = stderr.trim() || stdout.trim()\n throw new Error(details || getErrorMessage(error, fallback))\n }\n}\n\nasync function readComposioUserData(): Promise<ComposioUserData | null> {\n try {\n const raw = await readFile(COMPOSIO_USER_DATA_PATH, 'utf8')\n const payload = asRecord(JSON.parse(raw))\n if (!payload) return null\n return {\n apiKey: readNonEmptyString(payload.api_key),\n baseUrl: readNonEmptyString(payload.base_url),\n webUrl: readNonEmptyString(payload.web_url),\n orgId: readNonEmptyString(payload.org_id),\n testUserId: readNonEmptyString(payload.test_user_id),\n }\n } catch {\n return null\n }\n}\n\nfunction normalizeComposioConnection(value: unknown): ComposioConnectionSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const authConfig = asRecord(record.auth_config)\n return {\n id: readNonEmptyString(record.id),\n wordId: readNonEmptyString(record.word_id),\n alias: readNonEmptyString(record.alias),\n status: readNonEmptyString(record.status),\n authScheme: readNonEmptyString(record.authScheme || authConfig?.auth_scheme),\n createdAt: readNonEmptyString(record.created_at),\n updatedAt: readNonEmptyString(record.updated_at),\n isComposioManaged: readBoolean(authConfig?.is_composio_managed),\n isDisabled: readBoolean(record.is_disabled),\n }\n}\n\nfunction normalizeComposioToolkit(value: unknown, connectionsBySlug: Map<string, ComposioConnectionSummary[]>): ComposioConnectorSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const slug = readNonEmptyString(record.slug)\n if (!slug) return null\n const connectionRows = connectionsBySlug.get(slug) ?? []\n return {\n slug,\n name: readNonEmptyString(record.name),\n description: readNonEmptyString(record.description),\n logoUrl: readNonEmptyString(record.logo || record.meta && asRecord(record.meta)?.logo),\n latestVersion: readNonEmptyString(record.latest_version || record.latestVersion),\n toolsCount: readNumber(record.tools_count),\n triggersCount: readNumber(record.triggers_count),\n isNoAuth: readBoolean(record.is_no_auth),\n enabled: record.enabled !== false,\n authModes: Array.isArray(record.auth_modes) ? record.auth_modes.map(readNonEmptyString).filter(Boolean) : [],\n activeCount: connectionRows.filter((row) => row.status === 'ACTIVE' && !row.isDisabled).length,\n totalConnections: connectionRows.length,\n connectionStatuses: [...new Set(connectionRows.map((row) => row.status).filter(Boolean))],\n }\n}\n\nfunction normalizeComposioTool(value: unknown): ComposioToolSummary | null {\n const record = asRecord(value)\n if (!record) return null\n const slug = readNonEmptyString(record.slug)\n if (!slug) return null\n return {\n slug,\n name: readNonEmptyString(record.name),\n description: readNonEmptyString(record.description),\n }\n}\n\nasync function readComposioConnectionsBySlug(): Promise<Map<string, ComposioConnectionSummary[]>> {\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['connections', 'list'], 'Failed to list Composio connections'))\n const bySlug = new Map<string, ComposioConnectionSummary[]>()\n for (const [slug, rawRows] of Object.entries(payload ?? {})) {\n if (!Array.isArray(rawRows)) continue\n const rows = rawRows.map(normalizeComposioConnection).filter((row): row is ComposioConnectionSummary => row !== null)\n bySlug.set(slug, rows)\n }\n return bySlug\n}\n\nasync function readComposioStatus(): Promise<ComposioStatusResponse> {\n const versionInvocation = buildComposioInvocation(['--version'])\n const probe = versionInvocation\n ? probeComposioInvocation(versionInvocation)\n : { available: false, cliVersion: '', output: '' }\n const available = probe.available\n const cliVersion = probe.cliVersion\n const userData = await readComposioUserData()\n if (!available) {\n return {\n available: false,\n authenticated: false,\n cliVersion,\n email: '',\n defaultOrgName: '',\n defaultOrgId: userData?.orgId ?? '',\n webUrl: userData?.webUrl ?? '',\n baseUrl: userData?.baseUrl ?? '',\n testUserId: userData?.testUserId ?? '',\n }\n }\n\n try {\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['whoami'], 'Failed to read Composio account status'))\n return {\n available: true,\n authenticated: true,\n cliVersion,\n email: readNonEmptyString(payload?.email),\n defaultOrgName: readNonEmptyString(payload?.default_org_name),\n defaultOrgId: readNonEmptyString(payload?.default_org_id) || userData?.orgId || '',\n webUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n baseUrl: userData?.baseUrl || 'https://backend.composio.dev',\n testUserId: readNonEmptyString(payload?.test_user_id) || userData?.testUserId || '',\n }\n } catch {\n return {\n available: true,\n authenticated: false,\n cliVersion,\n email: '',\n defaultOrgName: '',\n defaultOrgId: userData?.orgId ?? '',\n webUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n baseUrl: userData?.baseUrl || 'https://backend.composio.dev',\n testUserId: userData?.testUserId ?? '',\n }\n }\n}\n\nasync function listComposioConnectors(query: string, cursor: string | null = null, limit = 50): Promise<ComposioConnectorPage> {\n const args = ['dev', 'toolkits', 'list', '--limit', String(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX)]\n const trimmedQuery = query.trim()\n if (trimmedQuery) {\n args.push('--query', trimmedQuery)\n }\n const [payload, connectionsBySlug] = await Promise.all([\n runComposioJson<unknown[]>(args, 'Failed to list Composio toolkits'),\n readComposioConnectionsBySlug(),\n ])\n const allRows = payload\n .map((item) => normalizeComposioToolkit(item, connectionsBySlug))\n .filter((row): row is ComposioConnectorSummary => row !== null)\n const safeLimit = Number.isFinite(limit) ? Math.max(1, Math.min(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX, Math.floor(limit))) : 50\n const safeCursor = parseComposioCursor(cursor, allRows.length)\n return {\n data: allRows.slice(safeCursor, safeCursor + safeLimit),\n nextCursor: safeCursor + safeLimit < allRows.length ? String(safeCursor + safeLimit) : null,\n total: allRows.length,\n }\n}\n\nfunction parseComposioCursor(cursor: string | null | undefined, maxLength: number): number {\n const trimmed = cursor?.trim() ?? ''\n const parsed = Number.parseInt(trimmed, 10)\n if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) return 0\n if (parsed >= maxLength) return maxLength\n return parsed\n}\n\nfunction parseComposioLimit(rawLimit: string | null): number {\n const parsed = Number.parseInt((rawLimit ?? '').trim(), 10)\n if (!Number.isFinite(parsed) || Number.isNaN(parsed) || parsed <= 0) return 50\n return Math.max(1, Math.min(COMPOSIO_CONNECTORS_PAGE_LIMIT_MAX, parsed))\n}\n\nasync function readComposioConnectorDetail(slug: string): Promise<ComposioConnectorDetail> {\n const normalizedSlug = slug.trim()\n if (!normalizedSlug) {\n throw new Error('Missing Composio connector slug')\n }\n\n const [infoPayload, toolsPayload, connectionsPayload, userData] = await Promise.all([\n runComposioJson<Record<string, unknown>>(['dev', 'toolkits', 'info', normalizedSlug], `Failed to load Composio toolkit ${normalizedSlug}`),\n runComposioJson<unknown[]>(['tools', 'list', normalizedSlug, '--limit', '10'], `Failed to list tools for ${normalizedSlug}`),\n runComposioJson<{ toolkit?: string; items?: unknown[] }>(['link', normalizedSlug, '--list'], `Failed to list connections for ${normalizedSlug}`),\n readComposioUserData(),\n ])\n\n const connections = Array.isArray(connectionsPayload.items)\n ? connectionsPayload.items.map(normalizeComposioConnection).filter((row): row is ComposioConnectionSummary => row !== null)\n : []\n const connector = normalizeComposioToolkit(infoPayload, new Map([[normalizedSlug, connections]]))\n if (!connector) {\n throw new Error(`Unknown Composio connector: ${normalizedSlug}`)\n }\n\n return {\n connector,\n connections,\n tools: Array.isArray(toolsPayload)\n ? toolsPayload.map(normalizeComposioTool).filter((row): row is ComposioToolSummary => row !== null)\n : [],\n dashboardUrl: userData?.webUrl || 'https://dashboard.composio.dev/',\n }\n}\n\nasync function startComposioLink(slug: string): Promise<ComposioLinkResult> {\n const normalizedSlug = slug.trim()\n if (!normalizedSlug) {\n throw new Error('Missing Composio connector slug')\n }\n const payload = asRecord(await runComposioJson<Record<string, unknown>>(['link', normalizedSlug, '--no-wait'], `Failed to start Composio link for ${normalizedSlug}`))\n return {\n status: readNonEmptyString(payload?.status),\n message: readNonEmptyString(payload?.message),\n connectedAccountId: readNonEmptyString(payload?.connected_account_id),\n redirectUrl: readNonEmptyString(payload?.redirect_url),\n toolkit: readNonEmptyString(payload?.toolkit),\n projectType: readNonEmptyString(payload?.project_type),\n }\n}\n\nasync function startComposioLogin(): Promise<ComposioLoginResult> {\n const invocation = resolveComposioInvocation(['login', '--no-browser', '-y'])\n if (!invocation) {\n throw new Error('Composio CLI is not installed')\n }\n const proc = spawn(invocation.command, invocation.args, {\n cwd: process.cwd(),\n env: process.env,\n detached: true,\n stdio: ['ignore', 'pipe', 'pipe'],\n windowsHide: true,\n })\n proc.unref()\n\n let stdout = ''\n let stderr = ''\n proc.stdout.setEncoding('utf8')\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', (chunk) => { stderr += chunk })\n\n const loginUrl = await new Promise<string>((resolveLoginUrl, reject) => {\n const timeout = setTimeout(() => {\n proc.kill('SIGTERM')\n reject(new Error(stderr.trim() || stdout.trim() || 'Timed out waiting for Composio CLI login URL'))\n }, 10_000)\n const finish = (url: string) => {\n clearTimeout(timeout)\n proc.stdout.destroy()\n proc.stderr.destroy()\n resolveLoginUrl(url)\n }\n proc.once('error', (error) => {\n clearTimeout(timeout)\n reject(error)\n })\n proc.once('close', (code) => {\n clearTimeout(timeout)\n reject(new Error(stderr.trim() || stdout.trim() || `Composio CLI login exited with code ${code ?? 0}`))\n })\n proc.stdout.on('data', (chunk) => {\n stdout += chunk\n const url = stdout.match(/https?:\\/\\/\\S+/)?.[0] ?? ''\n if (url) finish(url)\n })\n })\n\n const cliKey = loginUrl ? (new URL(loginUrl).searchParams.get('cliKey') ?? '') : ''\n return {\n status: 'started',\n message: 'Composio CLI login URL created',\n loginUrl,\n cliKey,\n expiresAt: '',\n }\n}\n\nasync function installComposioCli(): Promise<ComposioInstallResult> {\n const command = 'bash'\n const installScriptUrl = 'https://composio.dev/install'\n const args = ['-lc', `curl -fsSL ${installScriptUrl} | bash`]\n const invocation = getSpawnInvocation(command, args)\n const env = {\n ...process.env,\n COMPOSIO_INSTALL_DIR: process.env.COMPOSIO_INSTALL_DIR?.trim() || join(homedir(), '.composio'),\n }\n const result = spawnSync(invocation.command, invocation.args, {\n encoding: 'utf8',\n env,\n windowsHide: true,\n })\n const output = `${result.stdout ?? ''}${result.stderr ?? ''}`.trim()\n if (result.error || result.status !== 0) {\n throw new Error(output || result.error?.message || 'Failed to install Composio CLI')\n }\n return {\n ok: true,\n command: `curl -fsSL ${installScriptUrl} | bash`,\n output,\n }\n}\n\nfunction countRecoveredContentLines(value: string): number {\n if (!value) return 0\n const normalized = value.replace(/\\r\\n/g, '\\n')\n const trimmed = normalized.endsWith('\\n') ? normalized.slice(0, -1) : normalized\n if (!trimmed) return 0\n return trimmed.split('\\n').length\n}\n\nfunction countRecoveredPatchLines(value: string): { addedLineCount: number; removedLineCount: number } {\n let addedLineCount = 0\n let removedLineCount = 0\n\n for (const line of value.replace(/\\r\\n/g, '\\n').split('\\n')) {\n if (!line) continue\n if (line.startsWith('+++') || line.startsWith('---') || line.startsWith('@@')) continue\n if (line.startsWith('+')) {\n addedLineCount += 1\n continue\n }\n if (line.startsWith('-')) {\n removedLineCount += 1\n }\n }\n\n return { addedLineCount, removedLineCount }\n}\n\nfunction mergeRecoveredDiff(first: string, second: string): string {\n if (!first) return second\n if (!second || first === second) return first\n return `${first}\\n${second}`.trim()\n}\n\nfunction mergeRecoveredFileChange(first: SessionRecoveredFileChange, second: SessionRecoveredFileChange): SessionRecoveredFileChange {\n const operation = first.operation === 'add' || second.operation === 'add'\n ? 'add'\n : first.operation === 'delete' || second.operation === 'delete'\n ? 'delete'\n : 'update'\n\n return {\n path: second.path || first.path,\n operation,\n movedToPath: second.movedToPath ?? first.movedToPath ?? null,\n diff: mergeRecoveredDiff(first.diff, second.diff),\n addedLineCount: first.addedLineCount + second.addedLineCount,\n removedLineCount: first.removedLineCount + second.removedLineCount,\n }\n}\n\nfunction isApplyPatchSectionBoundary(value: string): boolean {\n return value.startsWith('*** Update File: ')\n || value.startsWith('*** Add File: ')\n || value.startsWith('*** Delete File: ')\n || value === '*** End Patch'\n}\n\nfunction parseApplyPatchInput(input: string): SessionRecoveredFileChange[] {\n const normalized = input.replace(/\\r\\n/g, '\\n')\n const lines = normalized.split('\\n')\n const changes: SessionRecoveredFileChange[] = []\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n\n if (line.startsWith('*** Add File: ')) {\n const path = line.slice('*** Add File: '.length).trim()\n const contentLines: string[] = []\n for (index += 1; index < lines.length; index += 1) {\n const nextLine = lines[index] ?? ''\n if (isApplyPatchSectionBoundary(nextLine)) {\n index -= 1\n break\n }\n contentLines.push(nextLine.startsWith('+') ? nextLine.slice(1) : nextLine)\n }\n const diff = contentLines.join('\\n').trimEnd()\n if (path) {\n changes.push({\n path,\n operation: 'add',\n movedToPath: null,\n diff,\n addedLineCount: countRecoveredContentLines(diff),\n removedLineCount: 0,\n })\n }\n continue\n }\n\n if (line.startsWith('*** Delete File: ')) {\n const path = line.slice('*** Delete File: '.length).trim()\n if (path) {\n changes.push({\n path,\n operation: 'delete',\n movedToPath: null,\n diff: '',\n addedLineCount: 0,\n removedLineCount: 0,\n })\n }\n continue\n }\n\n if (line.startsWith('*** Update File: ')) {\n const path = line.slice('*** Update File: '.length).trim()\n let movedToPath: string | null = null\n const diffLines: string[] = []\n\n for (index += 1; index < lines.length; index += 1) {\n const nextLine = lines[index] ?? ''\n if (nextLine.startsWith('*** Move to: ')) {\n const moved = nextLine.slice('*** Move to: '.length).trim()\n movedToPath = moved || null\n continue\n }\n if (isApplyPatchSectionBoundary(nextLine)) {\n index -= 1\n break\n }\n diffLines.push(nextLine)\n }\n\n const diff = diffLines.join('\\n').trimEnd()\n const counts = countRecoveredPatchLines(diff)\n if (path) {\n changes.push({\n path,\n operation: 'update',\n movedToPath,\n diff,\n ...counts,\n })\n }\n }\n }\n\n return changes\n}\n\nfunction buildSessionFileChangeFallback(threadReadPayload: unknown, sessionLogRaw: string): SessionRecoveredTurnFileChanges[] {\n const payload = asRecord(threadReadPayload)\n const thread = asRecord(payload?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const turnIndexById = new Map<string, number>()\n\n for (let turnIndex = 0; turnIndex < turns.length; turnIndex += 1) {\n const turnRecord = asRecord(turns[turnIndex])\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) {\n turnIndexById.set(turnId, turnIndex)\n }\n }\n\n const collectedByTurnId = new Map<string, SessionRecoveredFileChange[]>()\n let currentTurnId = ''\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const payloadRecord = asRecord(row.payload)\n currentTurnId = readNonEmptyString(payloadRecord?.turn_id) || currentTurnId\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIndexById.has(currentTurnId)) {\n continue\n }\n\n const payloadRecord = asRecord(row.payload)\n if (\n payloadRecord?.type !== 'custom_tool_call'\n || payloadRecord.name !== 'apply_patch'\n || payloadRecord.status !== 'completed'\n ) {\n continue\n }\n\n const input = readNonEmptyString(payloadRecord.input)\n if (!input) continue\n\n const parsedChanges = parseApplyPatchInput(input)\n if (parsedChanges.length === 0) continue\n\n const previous = collectedByTurnId.get(currentTurnId) ?? []\n previous.push(...parsedChanges)\n collectedByTurnId.set(currentTurnId, previous)\n }\n\n const recovered: SessionRecoveredTurnFileChanges[] = []\n for (const [turnId, fileChanges] of collectedByTurnId.entries()) {\n const turnIndex = turnIndexById.get(turnId)\n if (typeof turnIndex !== 'number' || fileChanges.length === 0) continue\n\n const mergedByPath = new Map<string, SessionRecoveredFileChange>()\n for (const fileChange of fileChanges) {\n const key = `${fileChange.path}\\u0000${fileChange.movedToPath ?? ''}`\n const previous = mergedByPath.get(key)\n mergedByPath.set(key, previous ? mergeRecoveredFileChange(previous, fileChange) : { ...fileChange })\n }\n\n recovered.push({\n turnId,\n turnIndex,\n fileChanges: Array.from(mergedByPath.values()),\n })\n }\n\n return recovered.sort((first, second) => first.turnIndex - second.turnIndex)\n}\n\ntype SessionRecoveredCommand = {\n id: string\n type: 'commandExecution'\n command: string\n cwd: string | null\n status: 'completed' | 'failed'\n aggregatedOutput: string\n exitCode: number | null\n durationMs: number | null\n}\n\nfunction parseExecCommandOutput(output: string): { exitCode: number | null; wallTime: number | null; cleanOutput: string } {\n let exitCode: number | null = null\n let wallTime: number | null = null\n const outputLines: string[] = []\n let pastHeader = false\n\n for (const line of output.split('\\n')) {\n if (!pastHeader) {\n const exitMatch = line.match(/^Process exited with code (\\d+)/)\n if (exitMatch) {\n exitCode = Number.parseInt(exitMatch[1]!, 10)\n continue\n }\n const wallMatch = line.match(/^Wall time:\\s+([\\d.]+)\\s+seconds/)\n if (wallMatch) {\n wallTime = Math.round(Number.parseFloat(wallMatch[1]!) * 1000)\n continue\n }\n if (line.startsWith('Command:') || line.startsWith('Chunk ID:') || line.startsWith('Original token count:')) {\n continue\n }\n if (line === 'Output:') {\n pastHeader = true\n continue\n }\n }\n outputLines.push(line)\n }\n\n return { exitCode, wallTime, cleanOutput: outputLines.join('\\n').trimEnd() }\n}\n\ntype SessionRecoveredFileChangeItem = {\n id: string\n type: 'fileChange'\n status: 'completed'\n changes: Record<string, unknown>[]\n}\n\ntype SessionItemSlot = {\n type: 'agentMessage' | 'commandExecution' | 'fileChange'\n command?: SessionRecoveredCommand\n fileChange?: SessionRecoveredFileChangeItem\n}\n\nfunction buildSessionItemOrder(sessionLogRaw: string, turnIds: Set<string>): Map<string, SessionItemSlot[]> {\n let currentTurnId = ''\n const orderByTurnId = new Map<string, SessionItemSlot[]>()\n const callIdToCommand = new Map<string, SessionRecoveredCommand>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const p = asRecord(row.payload)\n currentTurnId = readNonEmptyString(p?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const p = asRecord(row.payload)\n if (p?.type === 'task_started') {\n currentTurnId = readNonEmptyString(p.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIds.has(currentTurnId)) continue\n const payload = asRecord(row.payload)\n if (!payload) continue\n\n let slots = orderByTurnId.get(currentTurnId)\n if (!slots) {\n slots = []\n orderByTurnId.set(currentTurnId, slots)\n }\n\n if (payload.type === 'message' && payload.role === 'assistant') {\n slots.push({ type: 'agentMessage' })\n continue\n }\n\n if (payload.type === 'function_call' && payload.name === 'exec_command') {\n const callId = readNonEmptyString(payload.call_id)\n if (!callId) continue\n let cmd = ''\n try {\n const args = JSON.parse(payload.arguments as string) as Record<string, unknown>\n cmd = typeof args.cmd === 'string' ? args.cmd : ''\n } catch { /* empty */ }\n const command: SessionRecoveredCommand = {\n id: `session-cmd-${callId}`,\n type: 'commandExecution',\n command: cmd,\n cwd: null,\n status: 'completed',\n aggregatedOutput: '',\n exitCode: null,\n durationMs: null,\n }\n callIdToCommand.set(callId, command)\n slots.push({ type: 'commandExecution', command })\n continue\n }\n\n if (payload.type === 'function_call_output') {\n const callId = readNonEmptyString(payload.call_id)\n if (!callId) continue\n const existing = callIdToCommand.get(callId)\n if (!existing) continue\n const rawOutput = typeof payload.output === 'string' ? payload.output : ''\n const parsed = parseExecCommandOutput(rawOutput)\n existing.aggregatedOutput = parsed.cleanOutput\n existing.exitCode = parsed.exitCode\n existing.durationMs = parsed.wallTime\n existing.status = parsed.exitCode === 0 || parsed.exitCode === null ? 'completed' : 'failed'\n }\n\n if (payload.type === 'custom_tool_call' && payload.name === 'apply_patch' && payload.status === 'completed') {\n const input = typeof payload.input === 'string' ? payload.input : ''\n const callId = readNonEmptyString(payload.call_id)\n if (!input || !callId) continue\n const parsedChanges = parseApplyPatchInput(input)\n if (parsedChanges.length === 0) continue\n const fcItem: SessionRecoveredFileChangeItem = {\n id: `session-fc-${callId}`,\n type: 'fileChange',\n status: 'completed',\n changes: parsedChanges.map((fc) => ({\n ...fc,\n kind: { type: fc.operation, ...(fc.movedToPath ? { move_path: fc.movedToPath } : {}) },\n })),\n }\n slots.push({ type: 'fileChange', fileChange: fcItem })\n }\n }\n\n return orderByTurnId\n}\n\nfunction extractFilePathsFromCommand(cmd: string, cwd: string): string[] {\n const paths: string[] = []\n const absPathPattern = /(?:^|\\s|>>|>|<)(\\/?(?:Users|home|tmp|var|etc|root)\\/[^\\s;|&><\"']+)/g\n let match: RegExpExecArray | null\n while ((match = absPathPattern.exec(cmd)) !== null) {\n const p = match[1]?.trim()\n if (p && !p.endsWith('/') && !p.startsWith('-')) paths.push(p)\n }\n\n const redirectPattern = /(?:>>?|cat\\s*>\\s*)([^\\s;|&><\"']+)/g\n while ((match = redirectPattern.exec(cmd)) !== null) {\n const p = match[1]?.trim()\n if (p && !p.startsWith('-') && !p.startsWith('/dev/')) {\n paths.push(isAbsolute(p) ? p : join(cwd, p))\n }\n }\n\n return [...new Set(paths)]\n}\n\ntype CollectedTurnFileInfo = {\n patchInputs: { callId: string; input: string }[]\n commandFilePaths: string[]\n}\n\nfunction collectFileChangesForTurns(\n sessionLogRaw: string,\n turnIdsToRevert: Set<string>,\n cwd: string,\n): Map<string, CollectedTurnFileInfo> {\n let currentTurnId = ''\n const infoByTurnId = new Map<string, CollectedTurnFileInfo>()\n\n for (const line of sessionLogRaw.split('\\n')) {\n if (!line.trim()) continue\n let row: Record<string, unknown> | null = null\n try {\n row = JSON.parse(line) as Record<string, unknown>\n } catch {\n continue\n }\n\n if (row.type === 'turn_context') {\n const p = asRecord(row.payload)\n currentTurnId = readNonEmptyString(p?.turn_id) || currentTurnId\n continue\n }\n if (row.type === 'event_msg') {\n const p = asRecord(row.payload)\n if (p?.type === 'task_started') {\n currentTurnId = readNonEmptyString(p.turn_id) || currentTurnId\n }\n continue\n }\n\n if (row.type !== 'response_item' || !currentTurnId || !turnIdsToRevert.has(currentTurnId)) continue\n const payload = asRecord(row.payload)\n if (!payload) continue\n\n let info = infoByTurnId.get(currentTurnId)\n if (!info) {\n info = { patchInputs: [], commandFilePaths: [] }\n infoByTurnId.set(currentTurnId, info)\n }\n\n if (payload.type === 'custom_tool_call' && payload.name === 'apply_patch' && payload.status === 'completed') {\n const input = typeof payload.input === 'string' ? payload.input : ''\n const callId = readNonEmptyString(payload.call_id)\n if (input && callId) {\n info.patchInputs.push({ callId, input })\n }\n }\n\n if (payload.type === 'function_call' && payload.name === 'exec_command') {\n let cmd = ''\n try {\n const args = JSON.parse(payload.arguments as string) as Record<string, unknown>\n cmd = typeof args.cmd === 'string' ? args.cmd : ''\n } catch { /* empty */ }\n if (cmd) {\n const extracted = extractFilePathsFromCommand(cmd, cwd)\n for (const p of extracted) {\n if (!info.commandFilePaths.includes(p)) info.commandFilePaths.push(p)\n }\n }\n }\n }\n\n return infoByTurnId\n}\n\nfunction reverseV4aDiff(fileContent: string, diffText: string): string | null {\n const fileLines = fileContent.split('\\n')\n const rawDiffLines = diffText.split('\\n')\n while (rawDiffLines.length > 0 && rawDiffLines[rawDiffLines.length - 1]?.trim() === '') rawDiffLines.pop()\n const diffLines = rawDiffLines\n const result = [...fileLines]\n\n type DiffEntry = { type: 'context' | 'add' | 'remove'; text: string }\n const hunks: DiffEntry[][] = []\n let currentHunk: DiffEntry[] | null = null\n\n for (const dl of diffLines) {\n if (dl.startsWith('@@')) {\n if (currentHunk) hunks.push(currentHunk)\n currentHunk = []\n continue\n }\n if (!currentHunk) continue\n if (dl.startsWith('+')) {\n currentHunk.push({ type: 'add', text: dl.slice(1) })\n } else if (dl.startsWith('-')) {\n currentHunk.push({ type: 'remove', text: dl.slice(1) })\n } else if (dl.startsWith(' ')) {\n currentHunk.push({ type: 'context', text: dl.slice(1) })\n } else {\n currentHunk.push({ type: 'context', text: dl })\n }\n }\n if (currentHunk) hunks.push(currentHunk)\n\n for (let hi = hunks.length - 1; hi >= 0; hi--) {\n const hunk = hunks[hi]!\n const expectedSequence = hunk\n .filter((e) => e.type === 'context' || e.type === 'add')\n .map((e) => e.text)\n\n if (expectedSequence.length === 0) continue\n\n let seqStart = -1\n outer: for (let ri = result.length - expectedSequence.length; ri >= 0; ri--) {\n for (let si = 0; si < expectedSequence.length; si++) {\n if (result[ri + si] !== expectedSequence[si]) continue outer\n }\n seqStart = ri\n break\n }\n\n if (seqStart < 0) return null\n\n const newLines: string[] = []\n let seqIdx = 0\n for (const entry of hunk) {\n if (entry.type === 'context') {\n newLines.push(result[seqStart + seqIdx]!)\n seqIdx++\n } else if (entry.type === 'add') {\n seqIdx++\n } else if (entry.type === 'remove') {\n newLines.push(entry.text)\n }\n }\n\n result.splice(seqStart, expectedSequence.length, ...newLines)\n }\n\n return result.join('\\n')\n}\n\nasync function revertTurnFileChanges(\n cwd: string,\n turnInfos: Map<string, CollectedTurnFileInfo>,\n): Promise<{ reverted: number; errors: string[] }> {\n if (turnInfos.size === 0) return { reverted: 0, errors: [] }\n\n let reverted = 0\n const errors: string[] = []\n\n const allEntries = [...turnInfos.values()]\n const allPatchInputs = allEntries.flatMap((info) => info.patchInputs).reverse()\n const allCommandPaths = new Set(allEntries.flatMap((info) => info.commandFilePaths))\n\n let isGitRepo = false\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n isGitRepo = !!gitRoot\n } catch { /* not a git repo */ }\n\n const trackedFiles = new Set<string>()\n if (isGitRepo) {\n try {\n const tracked = await runCommandCapture('git', ['ls-files', '--full-name'], { cwd: gitRoot })\n for (const f of tracked.split('\\n')) {\n if (f.trim()) trackedFiles.add(join(gitRoot, f.trim()))\n }\n } catch { /* empty */ }\n }\n\n const patchRevertedPaths = new Set<string>()\n\n for (const patch of allPatchInputs) {\n const changes = parseApplyPatchInput(patch.input)\n for (let ci = changes.length - 1; ci >= 0; ci--) {\n const change = changes[ci]!\n const filePath = isAbsolute(change.path) ? change.path : join(cwd, change.path)\n\n try {\n if (change.operation === 'add') {\n const fileStat = await stat(filePath).catch(() => null)\n if (fileStat) {\n await rm(filePath, { force: true })\n reverted++\n patchRevertedPaths.add(filePath)\n }\n } else if (change.operation === 'update' && change.diff) {\n let reversed = false\n try {\n const currentContent = await readFile(filePath, 'utf8')\n const newContent = reverseV4aDiff(currentContent, change.diff)\n if (newContent !== null && newContent !== currentContent) {\n const { writeFile } = await import('node:fs/promises')\n await writeFile(filePath, newContent)\n reverted++\n patchRevertedPaths.add(filePath)\n reversed = true\n }\n } catch { /* file read/write failed */ }\n\n if (!reversed) {\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n patchRevertedPaths.add(filePath)\n } catch {\n errors.push(`Could not revert: ${filePath}`)\n }\n } else {\n errors.push(`Could not reverse patch for untracked file: ${filePath}`)\n }\n }\n } else if (change.operation === 'delete') {\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n patchRevertedPaths.add(filePath)\n } catch {\n errors.push(`Could not restore deleted file: ${filePath}`)\n }\n }\n }\n } catch (err) {\n errors.push(`Failed to revert patch for ${filePath}: ${err instanceof Error ? err.message : String(err)}`)\n }\n }\n }\n\n for (const filePath of allCommandPaths) {\n if (patchRevertedPaths.has(filePath)) continue\n const isTracked = trackedFiles.has(filePath)\n if (isTracked && isGitRepo) {\n const relativePath = filePath.startsWith(gitRoot + '/') ? filePath.slice(gitRoot.length + 1) : filePath\n try {\n await runCommand('git', ['checkout', 'HEAD', '--', relativePath], { cwd: gitRoot })\n reverted++\n } catch {\n errors.push(`Could not restore command-modified file: ${filePath}`)\n }\n }\n }\n\n return { reverted, errors }\n}\n\nfunction mergeSessionCommandsIntoTurns(turns: unknown[], sessionLogRaw: string): unknown[] {\n const turnIds = new Set<string>()\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const turnId = readNonEmptyString(turnRecord?.id)\n if (turnId) turnIds.add(turnId)\n }\n\n if (turnIds.size === 0) return turns\n\n const orderByTurnId = buildSessionItemOrder(sessionLogRaw, turnIds)\n if (orderByTurnId.size === 0) return turns\n\n return turns.map((turn) => {\n const turnRecord = asRecord(turn)\n if (!turnRecord) return turn\n const turnId = readNonEmptyString(turnRecord.id)\n if (!turnId) return turn\n\n const slots = orderByTurnId.get(turnId)\n if (!slots || slots.length === 0) return turn\n\n const existingItems = Array.isArray(turnRecord.items) ? (turnRecord.items as Record<string, unknown>[]) : []\n const alreadyHasRecoveredItems = existingItems.some((it) => it.type === 'commandExecution' || it.type === 'fileChange')\n if (alreadyHasRecoveredItems) return turn\n\n const agentMessages = existingItems.filter((it) => it.type === 'agentMessage')\n const nonAgentNonUserItems = existingItems.filter((it) => it.type !== 'agentMessage' && it.type !== 'userMessage')\n const userMessages = existingItems.filter((it) => it.type === 'userMessage')\n\n let agentIdx = 0\n const interleaved: Record<string, unknown>[] = [...userMessages]\n\n for (const slot of slots) {\n if (slot.type === 'agentMessage') {\n if (agentIdx < agentMessages.length) {\n interleaved.push(agentMessages[agentIdx]!)\n agentIdx++\n }\n } else if (slot.type === 'commandExecution' && slot.command) {\n interleaved.push(slot.command as unknown as Record<string, unknown>)\n } else if (slot.type === 'fileChange' && slot.fileChange) {\n interleaved.push(slot.fileChange as unknown as Record<string, unknown>)\n }\n }\n\n while (agentIdx < agentMessages.length) {\n interleaved.push(agentMessages[agentIdx]!)\n agentIdx++\n }\n\n interleaved.push(...nonAgentNonUserItems)\n\n return {\n ...turnRecord,\n items: interleaved,\n }\n })\n}\n\nfunction isExactPhraseMatch(query: string, doc: ThreadSearchDocument): boolean {\n const q = query.trim().toLowerCase()\n if (!q) return false\n return (\n doc.title.toLowerCase().includes(q) ||\n doc.preview.toLowerCase().includes(q) ||\n doc.messageText.toLowerCase().includes(q)\n )\n}\n\nfunction scoreFileCandidate(path: string, query: string): number {\n if (!query) return 0\n const lowerPath = path.toLowerCase()\n const lowerQuery = query.toLowerCase()\n const baseName = lowerPath.slice(lowerPath.lastIndexOf('/') + 1)\n if (baseName === lowerQuery) return 0\n if (baseName.startsWith(lowerQuery)) return 1\n if (baseName.includes(lowerQuery)) return 2\n if (lowerPath.includes(`/${lowerQuery}`)) return 3\n if (lowerPath.includes(lowerQuery)) return 4\n return 10\n}\n\nasync function listFilesWithRipgrep(cwd: string): Promise<string[]> {\n return await new Promise<string[]>((resolve, reject) => {\n const ripgrepCommand = resolveRipgrepCommand()\n if (!ripgrepCommand) {\n reject(new Error('ripgrep (rg) is not available'))\n return\n }\n\n const proc = spawn(ripgrepCommand, ['--files', '--hidden', '-g', '!.git', '-g', '!node_modules'], {\n cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n const rows = stdout\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .filter(Boolean)\n resolve(rows)\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n reject(new Error(details || 'rg --files failed'))\n })\n })\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nfunction getPromptsDir(): string {\n return join(getCodexHomeDir(), 'prompts')\n}\n\ntype ComposerPromptRecord = {\n name: string\n path: string\n content: string\n description: string\n}\n\nfunction promptNameToFileName(name: string): string {\n const trimmed = name.trim()\n const withoutExtension = trimmed.replace(/\\.md$/i, '')\n const sanitized = withoutExtension\n .replace(/[\\/\\\\:*?\"<>|]/g, ' ')\n .replace(/\\s+/g, ' ')\n .trim()\n return `${sanitized || 'prompt'}.md`\n}\n\nfunction buildPromptDescription(content: string): string {\n const firstNonEmptyLine = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find(Boolean) ?? ''\n return firstNonEmptyLine.slice(0, 120)\n}\n\nasync function listComposerPrompts(): Promise<ComposerPromptRecord[]> {\n const promptsDir = getPromptsDir()\n try {\n const entries = await readdir(promptsDir, { withFileTypes: true })\n const prompts = await Promise.all(entries\n .filter((entry) => entry.isFile() && entry.name.toLowerCase().endsWith('.md'))\n .map(async (entry) => {\n const promptPath = join(promptsDir, entry.name)\n const content = await readFile(promptPath, 'utf8')\n return {\n name: entry.name.replace(/\\.md$/i, ''),\n path: promptPath,\n content,\n description: buildPromptDescription(content),\n } satisfies ComposerPromptRecord\n }))\n return prompts.sort((a, b) => a.name.localeCompare(b.name))\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') return []\n throw error\n }\n}\n\nasync function createComposerPromptFile(name: string, content: string): Promise<ComposerPromptRecord> {\n const trimmedName = name.trim()\n if (!trimmedName) throw new Error('Prompt name is required')\n const trimmedContent = content.trim()\n if (!trimmedContent) throw new Error('Prompt content is required')\n const promptsDir = getPromptsDir()\n await mkdir(promptsDir, { recursive: true })\n\n const baseFileName = promptNameToFileName(trimmedName)\n let targetPath = join(promptsDir, baseFileName)\n let suffix = 2\n while (existsSync(targetPath)) {\n const nextFileName = `${baseFileName.replace(/\\.md$/i, '')}-${suffix}.md`\n targetPath = join(promptsDir, nextFileName)\n suffix += 1\n }\n\n await writeFile(targetPath, `${trimmedContent}\\n`, 'utf8')\n return {\n name: basename(targetPath).replace(/\\.md$/i, ''),\n path: targetPath,\n content: `${trimmedContent}\\n`,\n description: buildPromptDescription(trimmedContent),\n }\n}\n\nasync function removeComposerPromptFile(promptPath: string): Promise<boolean> {\n const resolvedPath = resolve(promptPath)\n const promptsDir = resolve(getPromptsDir())\n const relative = resolvedPath.startsWith(`${promptsDir}/`) ? resolvedPath.slice(promptsDir.length + 1) : ''\n if (!relative || relative.includes('..') || !resolvedPath.toLowerCase().endsWith('.md')) {\n throw new Error('Invalid prompt path')\n }\n try {\n await rm(resolvedPath, { force: false })\n return true\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === 'ENOENT') return false\n throw error\n }\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n let timedOut = false\n let closed = false\n const timeout =\n typeof options.timeoutMs === 'number' && Number.isFinite(options.timeoutMs) && options.timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n proc.kill('SIGTERM')\n setTimeout(() => {\n if (!closed) proc.kill('SIGKILL')\n }, 5_000).unref()\n }, options.timeoutMs)\n : null\n timeout?.unref()\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (error) => {\n if (timeout) clearTimeout(timeout)\n reject(error)\n })\n proc.on('close', (code) => {\n closed = true\n if (timeout) clearTimeout(timeout)\n if (timedOut) {\n reject(new Error(`Command timed out after ${options.timeoutMs}ms (${command} ${args.join(' ')})`))\n return\n }\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"not a valid object name: 'head'\") ||\n message.includes('not a valid object name: head') ||\n message.includes('invalid reference: head')\n )\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nasync function ensureRepoHasInitialCommit(repoRoot: string): Promise<void> {\n const agentsPath = join(repoRoot, 'AGENTS.md')\n try {\n await stat(agentsPath)\n } catch {\n await writeFile(agentsPath, '', 'utf8')\n }\n\n await runCommand('git', ['add', 'AGENTS.md'], { cwd: repoRoot })\n await runCommand(\n 'git',\n ['-c', 'user.name=Codex', '-c', 'user.email=codex@local', 'commit', '-m', 'Initialize repository for worktree support'],\n { cwd: repoRoot },\n )\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction normalizeBranchRefName(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('refs/heads/')) return trimmed.slice('refs/heads/'.length)\n if (trimmed.startsWith('refs/remotes/')) return trimmed.slice('refs/remotes/'.length)\n return trimmed\n}\n\nfunction toHeaderGitResetHistoryRef(branchName: string, commitSha: string): string {\n return `refs/codex/header-git-reset-history/${branchName}/${commitSha}`\n}\n\nconst HEADER_GIT_RESET_HISTORY_REF_LIMIT = 25\n\nasync function assertLocalGitBranch(repoRoot: string, branchName: string): Promise<void> {\n await runCommandCapture('git', ['show-ref', '--verify', `refs/heads/${branchName}`], { cwd: repoRoot })\n}\n\nasync function checkoutGitBranchWithWorktreeRecovery(repoRoot: string, branchName: string): Promise<void> {\n try {\n await runCommand('git', ['checkout', branchName], { cwd: repoRoot })\n } catch (checkoutError) {\n const blockingWorktreePath = extractBranchLockedWorktreePath(checkoutError, branchName)\n if (!blockingWorktreePath) {\n throw checkoutError\n }\n await runCommand('git', ['checkout', '--detach'], { cwd: blockingWorktreePath })\n await runCommand('git', ['checkout', branchName], { cwd: repoRoot })\n }\n}\n\nasync function pruneHeaderGitResetHistoryRefs(repoRoot: string, branchName: string): Promise<void> {\n const resetHistoryRefPrefix = `refs/codex/header-git-reset-history/${branchName}/`\n const refsRaw = await runCommandCapture(\n 'git',\n ['for-each-ref', '--sort=-creatordate', '--format=%(refname)', resetHistoryRefPrefix],\n { cwd: repoRoot },\n ).catch(() => '')\n const refs = refsRaw\n .split('\\n')\n .map((entry) => entry.trim())\n .filter(Boolean)\n const staleRefs = refs.slice(HEADER_GIT_RESET_HISTORY_REF_LIMIT)\n for (const refName of staleRefs) {\n await runCommand('git', ['update-ref', '-d', refName], { cwd: repoRoot })\n }\n}\n\nasync function readGitHeaderState(cwd: string): Promise<{\n currentBranch: string | null\n headSha: string | null\n headSubject: string | null\n headDate: string | null\n detached: boolean\n dirty: boolean\n gitRoot: string\n}> {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n const currentBranchRaw = await runCommandCapture('git', ['branch', '--show-current'], { cwd: gitRoot })\n const currentBranch = currentBranchRaw.trim() || null\n const headShaRaw = await runCommandCapture('git', ['rev-parse', '--short=12', 'HEAD'], { cwd: gitRoot })\n const headCommitRaw = await runCommandCapture('git', ['show', '-s', '--date=short', '--format=%cd%x09%s', 'HEAD'], { cwd: gitRoot })\n const [headDate = '', ...headSubjectParts] = headCommitRaw.split('\\t')\n const statusRaw = await runCommandCapture('git', ['status', '--porcelain'], { cwd: gitRoot })\n return {\n currentBranch,\n headSha: headShaRaw.trim() || null,\n headSubject: headSubjectParts.join('\\t').trim() || null,\n headDate: headDate.trim() || null,\n detached: !currentBranch,\n dirty: statusRaw.trim().length > 0,\n gitRoot,\n }\n}\n\nasync function assertNoTrackedGitChanges(repoRoot: string): Promise<void> {\n const statusRaw = await runCommandCapture('git', ['status', '--porcelain'], { cwd: repoRoot })\n const trackedChanges = statusRaw\n .split('\\n')\n .map((line) => line.trimEnd())\n .filter((line) => line && !line.startsWith('?? '))\n if (trackedChanges.length > 0) {\n throw new Error('Cannot switch branches or reset with tracked uncommitted changes. Commit, stash, or discard tracked changes first. Untracked files are allowed unless Git would overwrite them.')\n }\n}\n\nfunction extractBranchLockedWorktreePath(error: unknown, branchName: string): string {\n const message = getErrorMessage(error, '')\n if (!message || !branchName) return ''\n const escapedBranch = branchName.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&')\n const pattern = new RegExp(`'${escapedBranch}' is already checked out at '([^']+)'`, 'u')\n const match = pattern.exec(message)\n return match?.[1]?.trim() ?? ''\n}\n\nfunction toPermanentWorktreeBranchNameDraft(worktreeName: string): string {\n const sanitized = worktreeName\n .trim()\n .replace(/[^A-Za-z0-9._-]+/gu, '-')\n .replace(/\\.+/gu, '.')\n .replace(/-+/gu, '-')\n .replace(/^[.-]+|[.-]+$/gu, '')\n return sanitized || 'worktree'\n}\n\nasync function isValidGitBranchName(gitRoot: string, branchName: string): Promise<boolean> {\n try {\n await runCommand('git', ['check-ref-format', '--branch', branchName], { cwd: gitRoot })\n return true\n } catch {\n return false\n }\n}\n\nasync function doesLocalGitBranchExist(gitRoot: string, branchName: string): Promise<boolean> {\n try {\n await runCommand('git', ['show-ref', '--verify', '--quiet', `refs/heads/${branchName}`], { cwd: gitRoot })\n return true\n } catch {\n return false\n }\n}\n\nasync function allocatePermanentWorktreeBranchName(gitRoot: string, worktreeName: string): Promise<string> {\n const base = toPermanentWorktreeBranchNameDraft(worktreeName)\n for (let attempt = 0; attempt < 50; attempt += 1) {\n const candidate = attempt === 0 ? base : `${base}-${attempt + 1}`\n if (!await isValidGitBranchName(gitRoot, candidate)) continue\n if (!await doesLocalGitBranchExist(gitRoot, candidate)) return candidate\n }\n throw new Error('Failed to allocate a unique branch name for worktree')\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n return await new Promise<string>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (!Array.isArray(value)) return []\n const normalized: string[] = []\n for (const item of value) {\n if (typeof item === 'string' && item.length > 0 && !normalized.includes(item)) {\n normalized.push(item)\n }\n }\n return normalized\n}\n\nfunction normalizeStringRecord(value: unknown): Record<string, string> {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return {}\n const next: Record<string, string> = {}\n for (const [key, item] of Object.entries(value as Record<string, unknown>)) {\n if (typeof key === 'string' && key.length > 0 && typeof item === 'string') {\n next[key] = item\n }\n }\n return next\n}\n\nfunction normalizeRemoteProjects(value: unknown): WorkspaceRootsState['remoteProjects'] {\n if (!Array.isArray(value)) return []\n const next: WorkspaceRootsState['remoteProjects'] = []\n const seen = new Set<string>()\n for (const item of value) {\n const record = asRecord(item)\n if (!record) continue\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n if (!id || seen.has(id)) continue\n seen.add(id)\n next.push({\n id,\n hostId: typeof record.hostId === 'string' ? record.hostId.trim() : '',\n remotePath: typeof record.remotePath === 'string' ? record.remotePath.trim() : '',\n label: typeof record.label === 'string' ? record.label.trim() : '',\n })\n }\n return next\n}\n\n\n\nfunction getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n auth_mode?: string\n last_refresh?: number\n tokens?: {\n access_token?: string\n refresh_token?: string\n id_token?: string\n account_id?: string\n }\n}\n\nconst CODEX_CHATGPT_CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann'\nconst DEFAULT_CODEX_REFRESH_TOKEN_URL = 'https://auth.openai.com/oauth/token'\n\nfunction decodeBase64UrlJson(value: string): Record<string, unknown> | null {\n try {\n const padded = `${value}${'='.repeat((4 - (value.length % 4)) % 4)}`\n const decoded = Buffer.from(padded.replace(/-/g, '+').replace(/_/g, '/'), 'base64').toString('utf8')\n const parsed = JSON.parse(decoded) as unknown\n return asRecord(parsed)\n } catch {\n return null\n }\n}\n\nfunction decodeJwtPayload(token: string | undefined): Record<string, unknown> | null {\n if (!token) return null\n const parts = token.split('.')\n if (parts.length < 2) return null\n return decodeBase64UrlJson(parts[1] ?? '')\n}\n\nfunction extractChatgptTokenMetadata(accessToken: string | undefined): {\n chatgptAccountId: string | null\n chatgptPlanType: string | null\n} {\n const payload = decodeJwtPayload(accessToken)\n const auth = asRecord(payload?.['https://api.openai.com/auth'])\n return {\n chatgptAccountId: readNonEmptyString(auth?.chatgpt_account_id) || null,\n chatgptPlanType: readNonEmptyString(auth?.chatgpt_plan_type) || null,\n }\n}\n\nfunction readTokenErrorMessage(payload: unknown, fallback: string): string {\n const record = asRecord(payload)\n const message = readNonEmptyString(record?.message)\n if (message) return message\n const error = record?.error\n if (typeof error === 'string' && error.trim().length > 0) return error.trim()\n const nestedError = asRecord(error)\n return readNonEmptyString(nestedError?.message)\n || readNonEmptyString(nestedError?.error_description)\n || readNonEmptyString(record?.error_description)\n || fallback\n}\n\nfunction readTokenResponseString(payload: Record<string, unknown> | null, ...keys: string[]): string | null {\n if (!payload) return null\n for (const key of keys) {\n const value = readNonEmptyString(payload[key])\n if (value) return value\n }\n return null\n}\n\nexport async function refreshChatgptAuthTokensForExternalAuth(\n params: ChatgptAuthTokensRefreshParams = {},\n): Promise<ChatgptAuthTokensRefreshResponse> {\n const authPath = getCodexAuthPath()\n const raw = await readFile(authPath, 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const currentRefreshToken = auth.tokens?.refresh_token?.trim() ?? ''\n if (!currentRefreshToken) {\n throw new Error('No ChatGPT refresh token is available. Please sign in again.')\n }\n\n const refreshUrl = process.env.CODEX_REFRESH_TOKEN_URL_OVERRIDE?.trim() || DEFAULT_CODEX_REFRESH_TOKEN_URL\n const body = new URLSearchParams({\n grant_type: 'refresh_token',\n refresh_token: currentRefreshToken,\n client_id: CODEX_CHATGPT_CLIENT_ID,\n })\n\n const response = await fetch(refreshUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n body: body.toString(),\n signal: AbortSignal.timeout(25_000),\n })\n\n const text = await response.text()\n let payload: Record<string, unknown> | null = null\n try {\n payload = asRecord(JSON.parse(text))\n } catch {\n payload = null\n }\n\n if (!response.ok) {\n throw new Error(readTokenErrorMessage(payload, `ChatGPT token refresh failed with HTTP ${String(response.status)}`))\n }\n\n const accessToken = readTokenResponseString(payload, 'access_token', 'accessToken')\n if (!accessToken) {\n throw new Error('ChatGPT token refresh response did not include an access token.')\n }\n\n const nextRefreshToken = readTokenResponseString(payload, 'refresh_token', 'refreshToken') ?? currentRefreshToken\n const nextIdToken = readTokenResponseString(payload, 'id_token', 'idToken') ?? auth.tokens?.id_token\n const metadata = extractChatgptTokenMetadata(accessToken)\n const chatgptAccountId =\n metadata.chatgptAccountId\n || readTokenResponseString(payload, 'chatgpt_account_id', 'chatgptAccountId')\n || readNonEmptyString(params.previousAccountId)\n || readNonEmptyString(auth.tokens?.account_id)\n if (!chatgptAccountId) {\n throw new Error('ChatGPT token refresh response did not include account metadata.')\n }\n\n const nextAuth: CodexAuth = {\n ...auth,\n auth_mode: auth.auth_mode || 'chatgpt',\n last_refresh: Date.now(),\n tokens: {\n ...auth.tokens,\n access_token: accessToken,\n refresh_token: nextRefreshToken,\n account_id: chatgptAccountId,\n ...(nextIdToken ? { id_token: nextIdToken } : {}),\n },\n }\n await writeFile(authPath, JSON.stringify(nextAuth, null, 2), { encoding: 'utf8', mode: 0o600 })\n\n return {\n accessToken,\n chatgptAccountId,\n chatgptPlanType: metadata.chatgptPlanType,\n }\n}\n\nasync function readCodexAuth(): Promise<{ accessToken: string; accountId?: string } | null> {\n try {\n const raw = await readFile(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n const token = auth.tokens?.access_token\n if (!token) return null\n return { accessToken: token, accountId: auth.tokens?.account_id ?? undefined }\n } catch {\n return null\n }\n}\n\nfunction hasUsableCodexAuthSync(): boolean {\n try {\n const raw = readFileSync(getCodexAuthPath(), 'utf8')\n const auth = JSON.parse(raw) as CodexAuth\n return Boolean(auth.tokens?.access_token?.trim())\n } catch {\n return false\n }\n}\n\nfunction readFreeModeStateSync(statePath: string): FreeModeState | null {\n try {\n return JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n } catch {\n return null\n }\n}\n\nfunction ensureDefaultFreeModeStateForMissingAuthSync(statePath: string): FreeModeState | null {\n const current = readFreeModeStateSync(statePath)\n if (!shouldCreateDefaultFreeModeStateForMissingAuth(current, hasUsableCodexAuthSync())) {\n return current\n }\n\n const fallback = createDefaultOpenCodeZenFreeModeState()\n\n mkdirSync(dirname(statePath), { recursive: true })\n writeFileSync(statePath, JSON.stringify(fallback), { encoding: 'utf8', mode: 0o600 })\n return fallback\n}\n\nfunction isLoopbackRemoteAddress(remoteAddress: string | undefined): boolean {\n if (!remoteAddress) return false\n const normalized = remoteAddress.startsWith('::ffff:')\n ? remoteAddress.slice('::ffff:'.length)\n : remoteAddress\n return normalized === '127.0.0.1' || normalized === '::1'\n}\n\nfunction getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\nfunction getTelegramBridgeConfigPath(): string {\n return join(getCodexHomeDir(), 'telegram-bridge.json')\n}\n\nfunction getCodexSessionIndexPath(): string {\n return join(getCodexHomeDir(), 'session_index.jsonl')\n}\n\nfunction getCodexAutomationsDir(): string {\n return join(getCodexHomeDir(), 'automations')\n}\n\ntype ThreadAutomationStatus = 'ACTIVE' | 'PAUSED'\n\ntype ThreadAutomationRecord = {\n id: string\n kind: 'heartbeat' | 'cron'\n name: string\n prompt: string\n rrule: string\n status: ThreadAutomationStatus\n targetThreadId: string | null\n cwds: string[]\n extraTomlLines: string[]\n createdAtMs: number | null\n updatedAtMs: number | null\n nextRunAtMs: number | null\n}\n\nfunction readTomlString(value: string): string {\n const trimmed = value.trim()\n if ((trimmed.startsWith('\"') && trimmed.endsWith('\"')) || (trimmed.startsWith('\\'') && trimmed.endsWith('\\''))) {\n try {\n return JSON.parse(trimmed)\n } catch {\n return trimmed.slice(1, -1)\n }\n }\n return trimmed\n}\n\nfunction serializeTomlString(value: string): string {\n return JSON.stringify(value)\n}\n\nfunction parseTomlStringArray(value: string): string[] {\n const trimmed = value.trim()\n if (!trimmed.startsWith('[') || !trimmed.endsWith(']')) return []\n try {\n const parsed = JSON.parse(trimmed)\n return Array.isArray(parsed)\n ? parsed.filter((item): item is string => typeof item === 'string' && item.trim().length > 0)\n : []\n } catch {\n return []\n }\n}\n\nfunction serializeTomlStringArray(values: string[]): string {\n return `[${values.map((value) => serializeTomlString(value)).join(', ')}]`\n}\n\nfunction parseAutomationToml(raw: string): ThreadAutomationRecord | null {\n const values: Record<string, string> = {}\n const extraTomlLines: string[] = []\n const knownKeys = new Set([\n 'version',\n 'id',\n 'kind',\n 'name',\n 'prompt',\n 'status',\n 'rrule',\n 'target_thread_id',\n 'cwds',\n 'created_at',\n 'updated_at',\n ])\n let isInsideExtraTable = false\n for (const line of raw.split(/\\r?\\n/u)) {\n const trimmed = line.trim()\n if (!trimmed || trimmed.startsWith('#')) continue\n if (trimmed.startsWith('[') && trimmed.endsWith(']')) {\n isInsideExtraTable = true\n extraTomlLines.push(trimmed)\n continue\n }\n if (isInsideExtraTable) {\n extraTomlLines.push(trimmed)\n continue\n }\n if (!trimmed.includes('=')) {\n extraTomlLines.push(trimmed)\n continue\n }\n const separatorIndex = trimmed.indexOf('=')\n const key = trimmed.slice(0, separatorIndex).trim()\n const value = trimmed.slice(separatorIndex + 1).trim()\n if (!key) continue\n if (knownKeys.has(key)) {\n values[key] = value\n } else {\n extraTomlLines.push(trimmed)\n }\n }\n\n const id = readTomlString(values.id ?? '')\n const kindValue = readTomlString(values.kind ?? (values.cwds ? 'cron' : 'heartbeat'))\n const name = readTomlString(values.name ?? '')\n const prompt = readTomlString(values.prompt ?? '')\n const rrule = readTomlString(values.rrule ?? '')\n const statusValue = readTomlString(values.status ?? 'ACTIVE')\n const targetThreadId = readTomlString(values.target_thread_id ?? '') || null\n const cwds = parseTomlStringArray(values.cwds ?? '')\n const createdAtMs = Number.parseInt(values.created_at ?? '', 10)\n const updatedAtMs = Number.parseInt(values.updated_at ?? '', 10)\n\n if (!id || !name || !prompt || !rrule) return null\n if (kindValue !== 'heartbeat' && kindValue !== 'cron') return null\n if (statusValue !== 'ACTIVE' && statusValue !== 'PAUSED') return null\n\n return {\n id,\n kind: kindValue,\n name,\n prompt,\n rrule,\n status: statusValue,\n targetThreadId,\n cwds,\n extraTomlLines,\n createdAtMs: Number.isFinite(createdAtMs) ? createdAtMs : null,\n updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : null,\n nextRunAtMs: null,\n }\n}\n\nfunction serializeAutomationToml(record: ThreadAutomationRecord): string {\n const lines = [\n 'version = 1',\n `id = ${serializeTomlString(record.id)}`,\n `kind = ${serializeTomlString(record.kind)}`,\n `name = ${serializeTomlString(record.name)}`,\n `prompt = ${serializeTomlString(record.prompt)}`,\n `status = ${serializeTomlString(record.status)}`,\n `rrule = ${serializeTomlString(record.rrule)}`,\n ]\n if (record.targetThreadId) {\n lines.push(`target_thread_id = ${serializeTomlString(record.targetThreadId)}`)\n }\n if (record.cwds.length > 0) {\n lines.push(`cwds = ${serializeTomlStringArray(record.cwds)}`)\n }\n lines.push(\n `created_at = ${String(record.createdAtMs ?? Date.now())}`,\n `updated_at = ${String(record.updatedAtMs ?? Date.now())}`,\n )\n lines.push(...record.extraTomlLines)\n return `${lines.join('\\n')}\\n`\n}\n\nfunction slugifyAutomationId(threadId: string, name: string): string {\n const preferred = name.trim().toLowerCase().replace(/[^a-z0-9]+/gu, '-').replace(/^-+|-+$/gu, '')\n if (preferred) return preferred.slice(0, 48)\n const fallback = threadId.trim().toLowerCase().replace(/[^a-z0-9]+/gu, '-').replace(/^-+|-+$/gu, '')\n return `heartbeat-${fallback.slice(0, 24) || randomBytes(4).toString('hex')}`\n}\n\nasync function readAutomationRecordFromFile(filePath: string): Promise<ThreadAutomationRecord | null> {\n try {\n return parseAutomationToml(await readFile(filePath, 'utf8'))\n } catch {\n return null\n }\n}\n\nasync function listThreadHeartbeatAutomations(): Promise<Record<string, ThreadAutomationRecord[]>> {\n const automationRoot = getCodexAutomationsDir()\n const next: Record<string, ThreadAutomationRecord[]> = {}\n let entries\n try {\n entries = await readdir(automationRoot, { withFileTypes: true })\n } catch {\n return next\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const automation = await readAutomationRecordFromFile(join(automationRoot, entry.name, 'automation.toml'))\n if (!automation || automation.kind !== 'heartbeat' || !automation.targetThreadId) continue\n next[automation.targetThreadId] = [...(next[automation.targetThreadId] ?? []), automation]\n }\n\n for (const automations of Object.values(next)) {\n automations.sort((first, second) => {\n const firstCreatedAt = first.createdAtMs ?? 0\n const secondCreatedAt = second.createdAtMs ?? 0\n if (firstCreatedAt !== secondCreatedAt) return firstCreatedAt - secondCreatedAt\n return first.id.localeCompare(second.id)\n })\n }\n\n return next\n}\n\nasync function readThreadHeartbeatAutomations(threadId: string): Promise<ThreadAutomationRecord[]> {\n const all = await listThreadHeartbeatAutomations()\n return all[threadId] ?? []\n}\n\nasync function readThreadHeartbeatAutomation(threadId: string, automationId = ''): Promise<ThreadAutomationRecord | null> {\n const automations = await readThreadHeartbeatAutomations(threadId)\n if (automationId) return automations.find((automation) => automation.id === automationId) ?? null\n return automations[0] ?? null\n}\n\nfunction resolveUniqueAutomationId(existingIds: Set<string>, threadId: string, name: string): string {\n const baseId = slugifyAutomationId(threadId, name)\n if (!existingIds.has(baseId)) return baseId\n for (let index = 2; index < 1000; index += 1) {\n const candidate = `${baseId}-${index}`\n if (!existingIds.has(candidate)) return candidate\n }\n return `${baseId}-${randomBytes(4).toString('hex')}`\n}\n\nasync function writeThreadHeartbeatAutomation(input: {\n threadId: string\n id?: string\n name: string\n prompt: string\n rrule: string\n status: ThreadAutomationStatus\n}): Promise<ThreadAutomationRecord> {\n const threadId = input.threadId.trim()\n const name = input.name.trim()\n const prompt = input.prompt.trim()\n const rrule = input.rrule.trim()\n if (!threadId || !name || !prompt || !rrule) {\n throw new Error('threadId, name, prompt, and rrule are required')\n }\n\n const automationRoot = getCodexAutomationsDir()\n await mkdir(automationRoot, { recursive: true })\n const existing = input.id ? await readThreadHeartbeatAutomation(threadId, input.id.trim()) : null\n const entries = await readdir(automationRoot, { withFileTypes: true }).catch(() => [])\n const existingIds = new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name))\n const id = existing?.id ?? resolveUniqueAutomationId(existingIds, threadId, name)\n const automationDir = join(automationRoot, id)\n const now = Date.now()\n const record: ThreadAutomationRecord = {\n id,\n kind: 'heartbeat',\n name,\n prompt,\n rrule,\n status: input.status,\n targetThreadId: threadId,\n cwds: [],\n extraTomlLines: existing?.extraTomlLines ?? [],\n createdAtMs: existing?.createdAtMs ?? now,\n updatedAtMs: now,\n nextRunAtMs: null,\n }\n\n await mkdir(automationDir, { recursive: true })\n await writeFile(join(automationDir, 'automation.toml'), serializeAutomationToml(record), 'utf8')\n const memoryPath = join(automationDir, 'memory.md')\n try {\n await stat(memoryPath)\n } catch {\n await writeFile(memoryPath, '', 'utf8')\n }\n return record\n}\n\nasync function deleteThreadHeartbeatAutomation(threadId: string, automationId = ''): Promise<boolean> {\n const normalizedThreadId = threadId.trim()\n const normalizedAutomationId = automationId.trim()\n if (normalizedAutomationId) {\n const automation = await readThreadHeartbeatAutomation(normalizedThreadId, normalizedAutomationId)\n if (!automation) return false\n await rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })\n return true\n }\n\n const automations = await readThreadHeartbeatAutomations(normalizedThreadId)\n if (automations.length === 0) return false\n await Promise.all(automations.map((automation) => rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })))\n return true\n}\n\nasync function listProjectCronAutomations(): Promise<Record<string, ThreadAutomationRecord[]>> {\n const automationRoot = getCodexAutomationsDir()\n const next: Record<string, ThreadAutomationRecord[]> = {}\n let entries\n try {\n entries = await readdir(automationRoot, { withFileTypes: true })\n } catch {\n return next\n }\n\n for (const entry of entries) {\n if (!entry.isDirectory()) continue\n const automation = await readAutomationRecordFromFile(join(automationRoot, entry.name, 'automation.toml'))\n if (!automation || automation.kind !== 'cron' || automation.cwds.length === 0) continue\n for (const cwd of automation.cwds) {\n next[cwd] = [...(next[cwd] ?? []), automation]\n }\n }\n\n for (const automations of Object.values(next)) {\n automations.sort((first, second) => {\n const firstCreatedAt = first.createdAtMs ?? 0\n const secondCreatedAt = second.createdAtMs ?? 0\n if (firstCreatedAt !== secondCreatedAt) return firstCreatedAt - secondCreatedAt\n return first.id.localeCompare(second.id)\n })\n }\n\n return next\n}\n\nasync function readProjectCronAutomations(projectName: string): Promise<ThreadAutomationRecord[]> {\n const all = await listProjectCronAutomations()\n return all[projectName] ?? []\n}\n\nasync function readProjectCronAutomation(projectName: string, automationId = ''): Promise<ThreadAutomationRecord | null> {\n const automations = await readProjectCronAutomations(projectName)\n if (automationId) return automations.find((automation) => automation.id === automationId) ?? null\n return automations[0] ?? null\n}\n\nasync function writeProjectCronAutomation(input: {\n projectName: string\n id?: string\n name: string\n prompt: string\n rrule: string\n status: ThreadAutomationStatus\n}): Promise<ThreadAutomationRecord> {\n const projectName = input.projectName.trim()\n const name = input.name.trim()\n const prompt = input.prompt.trim()\n const rrule = input.rrule.trim()\n if (!projectName || !name || !prompt || !rrule) {\n throw new Error('projectName, name, prompt, and rrule are required')\n }\n if (!isAbsoluteLikePath(projectName)) {\n throw new Error('Project automation cwd must be an absolute path')\n }\n\n const automationRoot = getCodexAutomationsDir()\n await mkdir(automationRoot, { recursive: true })\n const existing = input.id ? await readProjectCronAutomation(projectName, input.id.trim()) : null\n const entries = await readdir(automationRoot, { withFileTypes: true }).catch(() => [])\n const existingIds = new Set(entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name))\n const id = existing?.id ?? resolveUniqueAutomationId(existingIds, projectName, name)\n const automationDir = join(automationRoot, id)\n const now = Date.now()\n const record: ThreadAutomationRecord = {\n id,\n kind: 'cron',\n name,\n prompt,\n rrule,\n status: input.status,\n targetThreadId: null,\n cwds: Array.from(new Set([...(existing?.cwds ?? []), projectName])),\n extraTomlLines: existing?.extraTomlLines ?? [],\n createdAtMs: existing?.createdAtMs ?? now,\n updatedAtMs: now,\n nextRunAtMs: null,\n }\n\n await mkdir(automationDir, { recursive: true })\n await writeFile(join(automationDir, 'automation.toml'), serializeAutomationToml(record), 'utf8')\n const memoryPath = join(automationDir, 'memory.md')\n try {\n await stat(memoryPath)\n } catch {\n await writeFile(memoryPath, '', 'utf8')\n }\n return record\n}\n\nasync function deleteProjectCronAutomation(projectName: string, automationId = ''): Promise<boolean> {\n const normalizedProjectName = projectName.trim()\n const normalizedAutomationId = automationId.trim()\n if (!normalizedProjectName || !isAbsoluteLikePath(normalizedProjectName)) return false\n if (normalizedAutomationId) {\n const automation = await readProjectCronAutomation(normalizedProjectName, normalizedAutomationId)\n if (!automation) return false\n const remainingCwds = automation.cwds.filter((cwd) => cwd !== normalizedProjectName)\n if (remainingCwds.length > 0) {\n const record = { ...automation, cwds: remainingCwds, updatedAtMs: Date.now() }\n await writeFile(join(getCodexAutomationsDir(), automation.id, 'automation.toml'), serializeAutomationToml(record), 'utf8')\n } else {\n await rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })\n }\n return true\n }\n\n const automations = await readProjectCronAutomations(normalizedProjectName)\n if (automations.length === 0) return false\n await Promise.all(automations.map(async (automation) => {\n const remainingCwds = automation.cwds.filter((cwd) => cwd !== normalizedProjectName)\n if (remainingCwds.length > 0) {\n const record = { ...automation, cwds: remainingCwds, updatedAtMs: Date.now() }\n await writeFile(join(getCodexAutomationsDir(), automation.id, 'automation.toml'), serializeAutomationToml(record), 'utf8')\n return\n }\n await rm(join(getCodexAutomationsDir(), automation.id), { recursive: true, force: true })\n }))\n return true\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\nconst EMPTY_THREAD_TITLE_CACHE: ThreadTitleCache = { titles: {}, order: [] }\nconst PINNED_THREAD_IDS_KEY = 'pinned-thread-ids'\n\ntype SessionIndexThreadTitleCacheState = {\n fileSignature: string | null\n cache: ThreadTitleCache\n}\n\nlet sessionIndexThreadTitleCacheState: SessionIndexThreadTitleCacheState = {\n fileSignature: null,\n cache: EMPTY_THREAD_TITLE_CACHE,\n}\n\ntype TelegramBridgeConfigState = {\n botToken: string\n chatIds: number[]\n allowedUserIds: Array<number | '*'>\n}\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return EMPTY_THREAD_TITLE_CACHE\n const rawTitles = asRecord(record.titles)\n const titles: Record<string, string> = {}\n if (rawTitles) {\n for (const [k, v] of Object.entries(rawTitles)) {\n if (typeof v === 'string' && v.length > 0) titles[k] = v\n }\n }\n const order = normalizeStringArray(record.order)\n return { titles, order }\n}\n\nfunction normalizePinnedThreadIds(value: unknown): string[] {\n return normalizeStringArray(value)\n}\n\nfunction updateThreadTitleCache(cache: ThreadTitleCache, id: string, title: string): ThreadTitleCache {\n const titles = { ...cache.titles, [id]: title }\n const order = [id, ...cache.order.filter((o) => o !== id)]\n while (order.length > MAX_THREAD_TITLES) {\n const removed = order.pop()\n if (removed) delete titles[removed]\n }\n return { titles, order }\n}\n\nfunction removeFromThreadTitleCache(cache: ThreadTitleCache, id: string): ThreadTitleCache {\n const { [id]: _, ...titles } = cache.titles\n return { titles, order: cache.order.filter((o) => o !== id) }\n}\n\ntype SessionIndexThreadTitle = {\n id: string\n title: string\n updatedAtMs: number\n}\n\nfunction normalizeSessionIndexThreadTitle(value: unknown): SessionIndexThreadTitle | null {\n const record = asRecord(value)\n if (!record) return null\n\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n const title = typeof record.thread_name === 'string' ? record.thread_name.trim() : ''\n const updatedAtIso = typeof record.updated_at === 'string' ? record.updated_at.trim() : ''\n const updatedAtMs = updatedAtIso ? Date.parse(updatedAtIso) : Number.NaN\n\n if (!id || !title) return null\n return {\n id,\n title,\n updatedAtMs: Number.isFinite(updatedAtMs) ? updatedAtMs : 0,\n }\n}\n\nfunction trimThreadTitleCache(cache: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...cache.titles }\n const order = cache.order.filter((id) => {\n if (!titles[id]) return false\n return true\n }).slice(0, MAX_THREAD_TITLES)\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n delete titles[id]\n }\n }\n\n return { titles, order }\n}\n\nfunction mergeThreadTitleCaches(base: ThreadTitleCache, overlay: ThreadTitleCache): ThreadTitleCache {\n const titles = { ...base.titles, ...overlay.titles }\n const order: string[] = []\n\n for (const id of [...overlay.order, ...base.order]) {\n if (!titles[id] || order.includes(id)) continue\n order.push(id)\n }\n\n for (const id of Object.keys(titles)) {\n if (!order.includes(id)) {\n order.push(id)\n }\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitleCache(): Promise<ThreadTitleCache> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadTitleCache(payload['thread-titles'])\n } catch {\n return EMPTY_THREAD_TITLE_CACHE\n }\n}\n\nasync function writeThreadTitleCache(cache: ThreadTitleCache): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload['thread-titles'] = cache\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function readPinnedThreadIds(): Promise<string[]> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizePinnedThreadIds(payload[PINNED_THREAD_IDS_KEY])\n } catch {\n return []\n }\n}\n\nasync function writePinnedThreadIds(threadIds: string[]): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload[PINNED_THREAD_IDS_KEY] = normalizePinnedThreadIds(threadIds)\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nconst FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY = 'first-launch-plugins-card-dismissed'\nconst THREAD_QUEUE_STATE_KEY = 'thread-queue-state'\n\ntype StoredQueuedMessage = {\n id: string\n text: string\n imageUrls: string[]\n skills: Array<{ name: string; path: string }>\n fileAttachments: Array<{ label: string; path: string; fsPath: string }>\n collaborationMode: 'default' | 'plan'\n}\n\ntype ThreadQueueState = Record<string, StoredQueuedMessage[]>\n\ntype BackendQueuedTurn = {\n threadId: string\n message: StoredQueuedMessage\n}\n\ntype ThreadQueueStateUpdate<T> = {\n nextState: ThreadQueueState\n result: T\n}\n\ntype ResolvedCollaborationModeSettings = {\n model: string\n reasoningEffort: ReasoningEffort | null\n}\n\nfunction normalizeStoredQueuedMessage(value: unknown): StoredQueuedMessage | null {\n const record = asRecord(value)\n if (!record) return null\n\n const id = typeof record.id === 'string' ? record.id.trim() : ''\n if (!id) return null\n\n const normalizeNamedPathItems = (items: unknown): Array<{ name: string; path: string }> => {\n if (!Array.isArray(items)) return []\n return items.flatMap((item) => {\n const itemRecord = asRecord(item)\n if (!itemRecord) return []\n const name = typeof itemRecord.name === 'string' ? itemRecord.name.trim() : ''\n const path = typeof itemRecord.path === 'string' ? itemRecord.path.trim() : ''\n return name && path ? [{ name, path }] : []\n })\n }\n\n const normalizeFileAttachments = (items: unknown): Array<{ label: string; path: string; fsPath: string }> => {\n if (!Array.isArray(items)) return []\n return items.flatMap((item) => {\n const itemRecord = asRecord(item)\n if (!itemRecord) return []\n const label = typeof itemRecord.label === 'string' ? itemRecord.label.trim() : ''\n const path = typeof itemRecord.path === 'string' ? itemRecord.path.trim() : ''\n const fsPath = typeof itemRecord.fsPath === 'string' ? itemRecord.fsPath.trim() : ''\n return label && path && fsPath ? [{ label, path, fsPath }] : []\n })\n }\n\n return {\n id,\n text: typeof record.text === 'string' ? record.text : '',\n imageUrls: normalizeStringArray(record.imageUrls),\n skills: normalizeNamedPathItems(record.skills),\n fileAttachments: normalizeFileAttachments(record.fileAttachments),\n collaborationMode: record.collaborationMode === 'plan' ? 'plan' : 'default',\n }\n}\n\nfunction normalizeThreadQueueState(value: unknown): ThreadQueueState {\n const record = asRecord(value)\n if (!record) return {}\n\n const state: ThreadQueueState = {}\n for (const [threadId, rawMessages] of Object.entries(record)) {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId || !Array.isArray(rawMessages)) continue\n const messages = rawMessages.flatMap((item) => {\n const message = normalizeStoredQueuedMessage(item)\n return message ? [message] : []\n })\n if (messages.length > 0) {\n state[normalizedThreadId] = messages\n }\n }\n return state\n}\n\nlet threadQueueMutationChain: Promise<unknown> = Promise.resolve()\n\nasync function readThreadQueueState(): Promise<ThreadQueueState> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeThreadQueueState(payload[THREAD_QUEUE_STATE_KEY])\n } catch {\n return {}\n }\n}\n\nasync function writeThreadQueueStateUnlocked(nextState: ThreadQueueState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n const normalized = normalizeThreadQueueState(nextState)\n if (Object.keys(normalized).length > 0) {\n payload[THREAD_QUEUE_STATE_KEY] = normalized\n } else {\n delete payload[THREAD_QUEUE_STATE_KEY]\n }\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nasync function withThreadQueueStateUpdate<T>(\n update: (state: ThreadQueueState) => ThreadQueueStateUpdate<T> | Promise<ThreadQueueStateUpdate<T>>,\n): Promise<T> {\n const run = threadQueueMutationChain.then(async () => {\n const currentState = await readThreadQueueState()\n const { nextState, result } = await update(currentState)\n await writeThreadQueueStateUnlocked(nextState)\n return result\n })\n threadQueueMutationChain = run.catch(() => {})\n return run\n}\n\nasync function writeThreadQueueState(nextState: ThreadQueueState): Promise<void> {\n await withThreadQueueStateUpdate(() => ({\n nextState: normalizeThreadQueueState(nextState),\n result: undefined,\n }))\n}\n\nasync function appendThreadQueuedMessage(threadId: string, message: StoredQueuedMessage): Promise<void> {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId) throw new Error('threadId is required')\n await withThreadQueueStateUpdate((state) => ({\n nextState: {\n ...state,\n [normalizedThreadId]: [...(state[normalizedThreadId] ?? []), message],\n },\n result: undefined,\n }))\n}\n\nfunction normalizeReasoningEffort(value: unknown): ReasoningEffort | '' {\n const allowed: ReasoningEffort[] = ['none', 'minimal', 'low', 'medium', 'high', 'xhigh']\n return typeof value === 'string' && allowed.includes(value as ReasoningEffort)\n ? (value as ReasoningEffort)\n : ''\n}\n\nfunction normalizeCollaborationModeReasoningEffort(value: ReasoningEffort | '' | null | undefined): ReasoningEffort | null {\n return value && value.length > 0 ? value : null\n}\n\nfunction extractLocalImagePathFromUrl(value: string): string | null {\n if (!value) return null\n try {\n const parsed = new URL(value, 'http://localhost')\n if (parsed.pathname !== '/codex-local-image') return null\n const path = parsed.searchParams.get('path')?.trim() ?? ''\n return path.length > 0 ? path : null\n } catch {\n return null\n }\n}\n\nfunction buildTextWithAttachments(prompt: string, files: StoredQueuedMessage['fileAttachments']): string {\n if (files.length === 0) return prompt\n let prefix = '# Files mentioned by the user:\\n'\n for (const f of files) {\n prefix += `\\n## ${f.label}: ${f.path}\\n`\n }\n return `${prefix}\\n## My request for Codex:\\n\\n${prompt}\\n`\n}\n\nfunction escapeHeartbeatXmlText(value: string): string {\n return value\n .replace(/&/gu, '&amp;')\n .replace(/</gu, '&lt;')\n .replace(/>/gu, '&gt;')\n}\n\nfunction buildHeartbeatQueuedMessage(automation: ThreadAutomationRecord): StoredQueuedMessage {\n return {\n id: `automation-${automation.id}-${Date.now()}-${randomBytes(3).toString('hex')}`,\n text: `<heartbeat>\n<automation_id>${escapeHeartbeatXmlText(automation.id)}</automation_id>\n<current_time_iso>${new Date().toISOString()}</current_time_iso>\n<instructions>\n${escapeHeartbeatXmlText(automation.prompt)}\n</instructions>\n</heartbeat>`,\n imageUrls: [],\n skills: [],\n fileAttachments: [],\n collaborationMode: 'default',\n }\n}\n\nfunction fileNameFromPath(pathValue: string): string {\n const normalized = pathValue.replace(/\\\\/g, '/')\n const segments = normalized.split('/').filter(Boolean)\n return segments.at(-1) ?? normalized\n}\n\nfunction extractThreadIdFromNotificationParams(params: unknown): string {\n const record = asRecord(params)\n if (!record) return ''\n const threadId =\n (typeof record.threadId === 'string' ? record.threadId : '') ||\n (typeof record.thread_id === 'string' ? record.thread_id : '') ||\n (typeof record.conversationId === 'string' ? record.conversationId : '') ||\n (typeof record.conversation_id === 'string' ? record.conversation_id : '')\n if (threadId) return threadId\n const thread = asRecord(record.thread)\n if (thread && typeof thread.id === 'string') return thread.id\n const turn = asRecord(record.turn)\n if (turn) {\n const turnThreadId =\n (typeof turn.threadId === 'string' ? turn.threadId : '') ||\n (typeof turn.thread_id === 'string' ? turn.thread_id : '')\n if (turnThreadId) return turnThreadId\n }\n return ''\n}\n\nfunction isTurnCompletedNotification(notification: { method: string; params: unknown }): boolean {\n return notification.method === 'turn/completed'\n}\n\nasync function readFirstLaunchPluginsCardDismissed(): Promise<boolean> {\n const statePath = getCodexGlobalStatePath()\n try {\n const raw = await readFile(statePath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return payload[FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY] === true\n } catch {\n return false\n }\n}\n\nasync function writeFirstLaunchPluginsCardDismissed(dismissed: boolean): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n payload[FIRST_LAUNCH_PLUGINS_CARD_DISMISSED_KEY] = dismissed === true\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nfunction getSessionIndexFileSignature(stats: { mtimeMs: number; size: number }): string {\n return `${String(stats.mtimeMs)}:${String(stats.size)}`\n}\n\nasync function parseThreadTitlesFromSessionIndex(sessionIndexPath: string): Promise<ThreadTitleCache> {\n const latestById = new Map<string, SessionIndexThreadTitle>()\n const input = createReadStream(sessionIndexPath, { encoding: 'utf8' })\n const lines = createInterface({\n input,\n crlfDelay: Infinity,\n })\n\n try {\n for await (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n\n try {\n const entry = normalizeSessionIndexThreadTitle(JSON.parse(trimmed) as unknown)\n if (!entry) continue\n\n const previous = latestById.get(entry.id)\n if (!previous || entry.updatedAtMs >= previous.updatedAtMs) {\n latestById.set(entry.id, entry)\n }\n } catch {\n // Skip malformed lines and keep scanning the rest of the index.\n }\n }\n } finally {\n lines.close()\n input.close()\n }\n\n const entries = Array.from(latestById.values()).sort((first, second) => second.updatedAtMs - first.updatedAtMs)\n const titles: Record<string, string> = {}\n const order: string[] = []\n for (const entry of entries) {\n titles[entry.id] = entry.title\n order.push(entry.id)\n }\n\n return trimThreadTitleCache({ titles, order })\n}\n\nasync function readThreadTitlesFromSessionIndex(): Promise<ThreadTitleCache> {\n const sessionIndexPath = getCodexSessionIndexPath()\n\n try {\n const stats = await stat(sessionIndexPath)\n const fileSignature = getSessionIndexFileSignature(stats)\n if (sessionIndexThreadTitleCacheState.fileSignature === fileSignature) {\n return sessionIndexThreadTitleCacheState.cache\n }\n\n const cache = await parseThreadTitlesFromSessionIndex(sessionIndexPath)\n sessionIndexThreadTitleCacheState = { fileSignature, cache }\n return cache\n } catch {\n sessionIndexThreadTitleCacheState = {\n fileSignature: 'missing',\n cache: EMPTY_THREAD_TITLE_CACHE,\n }\n return sessionIndexThreadTitleCacheState.cache\n }\n}\n\nasync function readMergedThreadTitleCache(): Promise<ThreadTitleCache> {\n const [sessionIndexCache, persistedCache] = await Promise.all([\n readThreadTitlesFromSessionIndex(),\n readThreadTitleCache(),\n ])\n return mergeThreadTitleCaches(persistedCache, sessionIndexCache)\n}\n\nasync function readWorkspaceRootsState(): Promise<WorkspaceRootsState> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n\n try {\n const raw = await readFile(statePath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n payload = asRecord(parsed) ?? {}\n } catch {\n payload = {}\n }\n\n return {\n order: normalizeStringArray(payload['electron-saved-workspace-roots']),\n labels: normalizeStringRecord(payload['electron-workspace-root-labels']),\n active: normalizeStringArray(payload['active-workspace-roots']),\n projectOrder: normalizeStringArray(payload['project-order']),\n remoteProjects: normalizeRemoteProjects(payload['remote-projects']),\n }\n}\n\nasync function writeWorkspaceRootsState(nextState: WorkspaceRootsState): Promise<void> {\n const statePath = getCodexGlobalStatePath()\n let payload: Record<string, unknown> = {}\n try {\n const raw = await readFile(statePath, 'utf8')\n payload = asRecord(JSON.parse(raw)) ?? {}\n } catch {\n payload = {}\n }\n\n payload['electron-saved-workspace-roots'] = normalizeStringArray(nextState.order)\n payload['electron-workspace-root-labels'] = normalizeStringRecord(nextState.labels)\n payload['active-workspace-roots'] = normalizeStringArray(nextState.active)\n payload['project-order'] = normalizeStringArray(nextState.projectOrder)\n\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\n}\n\nlet workspaceRootsMutation: Promise<void> = Promise.resolve()\n\nfunction queueWorkspaceRootsMutation<T>(mutation: () => Promise<T>): Promise<T> {\n const run = workspaceRootsMutation.catch(() => undefined).then(mutation)\n workspaceRootsMutation = run.then(\n () => undefined,\n () => undefined,\n )\n return run\n}\n\nfunction prependUniqueString(value: string, items: string[]): string[] {\n return [value, ...items.filter((item) => item !== value)]\n}\n\nasync function updateWorkspaceRootsState(\n updater: (existingState: WorkspaceRootsState) => WorkspaceRootsState,\n): Promise<void> {\n await queueWorkspaceRootsMutation(async () => {\n const existingState = await readWorkspaceRootsState()\n await writeWorkspaceRootsState(updater(existingState))\n })\n}\n\nasync function persistWorkspaceRoot(workspaceRoot: string, label = ''): Promise<void> {\n const normalizedRoot = workspaceRoot.trim()\n if (!normalizedRoot) return\n\n await updateWorkspaceRootsState((existingState) => {\n const nextLabels = { ...existingState.labels }\n const trimmedLabel = label.trim()\n if (trimmedLabel.length > 0) {\n nextLabels[normalizedRoot] = trimmedLabel\n }\n return {\n order: prependUniqueString(normalizedRoot, existingState.order),\n labels: nextLabels,\n active: prependUniqueString(normalizedRoot, existingState.active),\n projectOrder: prependUniqueString(normalizedRoot, existingState.projectOrder),\n remoteProjects: existingState.remoteProjects,\n }\n })\n}\n\nasync function rollbackCreatedWorktree(\n gitRoot: string,\n worktreeCwd: string,\n cleanupDirectory?: string,\n branchName?: string,\n): Promise<void> {\n try {\n await runCommand('git', ['worktree', 'remove', '--force', worktreeCwd], { cwd: gitRoot })\n } catch {\n await rm(worktreeCwd, { recursive: true, force: true }).catch(() => undefined)\n }\n\n if (cleanupDirectory && cleanupDirectory !== worktreeCwd) {\n await rm(cleanupDirectory, { recursive: true, force: true }).catch(() => undefined)\n }\n\n if (branchName) {\n await runCommand('git', ['branch', '-D', branchName], { cwd: gitRoot }).catch(() => undefined)\n }\n}\n\nfunction normalizeTelegramBridgeConfig(value: unknown): TelegramBridgeConfigState {\n const record = asRecord(value)\n if (!record) return { botToken: '', chatIds: [], allowedUserIds: [] }\n const botToken = typeof record.botToken === 'string' ? record.botToken.trim() : ''\n const rawChatIds = Array.isArray(record.chatIds) ? record.chatIds : []\n const chatIds = Array.from(new Set(rawChatIds\n .filter((value): value is number => typeof value === 'number' && Number.isFinite(value))\n .map((value) => Math.trunc(value)))).slice(0, 50)\n const rawAllowedUserIds = Array.isArray(record.allowedUserIds) ? record.allowedUserIds : []\n const allowAllUsers = rawAllowedUserIds.some((value) => typeof value === 'string' && value.trim() === '*')\n const normalizedAllowedUserIds = Array.from(new Set(rawAllowedUserIds\n .map((value) => {\n if (typeof value === 'number' && Number.isFinite(value)) return Math.trunc(value)\n if (typeof value === 'string') {\n const normalized = value.trim().replace(/^(telegram|tg):/i, '').trim()\n if (/^-?\\d+$/.test(normalized)) {\n return Number.parseInt(normalized, 10)\n }\n }\n return Number.NaN\n })\n .filter((value) => Number.isFinite(value)))).slice(0, 100)\n const allowedUserIds: Array<number | '*'> = allowAllUsers\n ? ['*' as const, ...normalizedAllowedUserIds]\n : normalizedAllowedUserIds\n return { botToken, chatIds, allowedUserIds }\n}\n\nasync function readTelegramBridgeConfig(): Promise<TelegramBridgeConfigState> {\n const telegramConfigPath = getTelegramBridgeConfigPath()\n try {\n const raw = await readFile(telegramConfigPath, 'utf8')\n const payload = asRecord(JSON.parse(raw)) ?? {}\n return normalizeTelegramBridgeConfig(payload)\n } catch {\n return { botToken: '', chatIds: [], allowedUserIds: [] }\n }\n}\n\nasync function writeTelegramBridgeConfig(nextState: TelegramBridgeConfigState): Promise<void> {\n const normalized = normalizeTelegramBridgeConfig(nextState)\n const telegramConfigPath = getTelegramBridgeConfigPath()\n await writeFile(telegramConfigPath, JSON.stringify({\n botToken: normalized.botToken,\n chatIds: normalized.chatIds,\n allowedUserIds: normalized.allowedUserIds,\n }), 'utf8')\n}\n\nlet telegramBridgeConfigMutation: Promise<void> = Promise.resolve()\n\nfunction rememberTelegramChatId(chatId: number): Promise<void> {\n const normalizedChatId = Math.trunc(chatId)\n if (!Number.isFinite(normalizedChatId)) return Promise.resolve()\n\n telegramBridgeConfigMutation = telegramBridgeConfigMutation.then(async () => {\n const current = await readTelegramBridgeConfig()\n if (current.chatIds.includes(normalizedChatId)) return\n const next = {\n ...current,\n chatIds: [normalizedChatId, ...current.chatIds].slice(0, 50),\n }\n await writeTelegramBridgeConfig(next)\n })\n return telegramBridgeConfigMutation\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<unknown> {\n const raw = await readRawBody(req)\n if (raw.length === 0) return null\n const text = raw.toString('utf8').trim()\n if (text.length === 0) return null\n return JSON.parse(text) as unknown\n}\n\nasync function readRawBody(req: IncomingMessage): Promise<Buffer> {\n const chunks: Uint8Array[] = []\n for await (const chunk of req) {\n chunks.push(typeof chunk === 'string' ? Buffer.from(chunk) : chunk)\n }\n return Buffer.concat(chunks)\n}\n\nfunction bufferIndexOf(buf: Buffer, needle: Buffer, start = 0): number {\n for (let i = start; i <= buf.length - needle.length; i++) {\n let match = true\n for (let j = 0; j < needle.length; j++) {\n if (buf[i + j] !== needle[j]) { match = false; break }\n }\n if (match) return i\n }\n return -1\n}\n\nfunction handleFileUpload(req: IncomingMessage, res: ServerResponse): void {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', async () => {\n try {\n const body = Buffer.concat(chunks)\n const contentType = req.headers['content-type'] ?? ''\n const boundaryMatch = contentType.match(/boundary=(.+)/i)\n if (!boundaryMatch) { setJson(res, 400, { error: 'Missing multipart boundary' }); return }\n const boundary = boundaryMatch[1]\n const boundaryBuf = Buffer.from(`--${boundary}`)\n const parts: Buffer[] = []\n let searchStart = 0\n while (searchStart < body.length) {\n const idx = body.indexOf(boundaryBuf, searchStart)\n if (idx < 0) break\n if (searchStart > 0) parts.push(body.subarray(searchStart, idx))\n searchStart = idx + boundaryBuf.length\n if (body[searchStart] === 0x0d && body[searchStart + 1] === 0x0a) searchStart += 2\n }\n let fileName = 'uploaded-file'\n let fileData: Buffer | null = null\n const headerSep = Buffer.from('\\r\\n\\r\\n')\n for (const part of parts) {\n const headerEnd = bufferIndexOf(part, headerSep)\n if (headerEnd < 0) continue\n const headers = part.subarray(0, headerEnd).toString('utf8')\n const fnMatch = headers.match(/filename=\"([^\"]+)\"/i)\n if (!fnMatch) continue\n fileName = fnMatch[1].replace(/[/\\\\]/g, '_')\n let end = part.length\n if (end >= 2 && part[end - 2] === 0x0d && part[end - 1] === 0x0a) end -= 2\n fileData = part.subarray(headerEnd + 4, end)\n break\n }\n if (!fileData) { setJson(res, 400, { error: 'No file in request' }); return }\n const uploadDir = join(tmpdir(), 'codex-web-uploads')\n await mkdir(uploadDir, { recursive: true })\n const destDir = await mkdtemp(join(uploadDir, 'f-'))\n const destPath = join(destDir, fileName)\n await writeFile(destPath, fileData)\n setJson(res, 200, { path: destPath })\n } catch (err) {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload failed') })\n }\n })\n req.on('error', (err: Error) => {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload stream error') })\n })\n}\n\nfunction httpPost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n const doRequest = url.startsWith('http://') ? httpRequest : httpsRequest\n return new Promise((resolve, reject) => {\n const req = doRequest(url, { method: 'POST', headers }, (res) => {\n const chunks: Buffer[] = []\n res.on('data', (c: Buffer) => chunks.push(c))\n res.on('end', () => resolve({ status: res.statusCode ?? 500, body: Buffer.concat(chunks).toString('utf8') }))\n res.on('error', reject)\n })\n req.on('error', reject)\n req.write(body)\n req.end()\n })\n}\n\nlet curlImpersonateAvailable: boolean | null = null\n\nfunction curlImpersonatePost(\n url: string,\n headers: Record<string, string | number>,\n body: Buffer,\n): Promise<{ status: number; body: string }> {\n return new Promise((resolve, reject) => {\n const args = ['-s', '-w', '\\n%{http_code}', '-X', 'POST', url]\n for (const [k, v] of Object.entries(headers)) {\n if (k.toLowerCase() === 'content-length') continue\n args.push('-H', `${k}: ${String(v)}`)\n }\n args.push('--data-binary', '@-')\n const proc = spawn('curl-impersonate-chrome', args, {\n env: { ...process.env, CURL_IMPERSONATE: 'chrome116' },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n const chunks: Buffer[] = []\n proc.stdout.on('data', (c: Buffer) => chunks.push(c))\n proc.on('error', (e) => {\n curlImpersonateAvailable = false\n reject(e)\n })\n proc.on('close', (code) => {\n const raw = Buffer.concat(chunks).toString('utf8')\n const lastNewline = raw.lastIndexOf('\\n')\n const statusStr = lastNewline >= 0 ? raw.slice(lastNewline + 1).trim() : ''\n const responseBody = lastNewline >= 0 ? raw.slice(0, lastNewline) : raw\n const status = parseInt(statusStr, 10) || (code === 0 ? 200 : 500)\n curlImpersonateAvailable = true\n resolve({ status, body: responseBody })\n })\n proc.stdin.write(body)\n proc.stdin.end()\n })\n}\n\nasync function proxyTranscribe(\n body: Buffer,\n contentType: string,\n authToken: string,\n accountId?: string,\n): Promise<{ status: number; body: string }> {\n const chatgptHeaders: Record<string, string | number> = {\n 'Content-Type': contentType,\n 'Content-Length': body.length,\n Authorization: `Bearer ${authToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n }\n if (accountId) chatgptHeaders['ChatGPT-Account-Id'] = accountId\n\n const postFn = curlImpersonateAvailable !== false ? curlImpersonatePost : httpPost\n let result: { status: number; body: string }\n try {\n result = await postFn('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n } catch {\n result = await httpPost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n }\n\n if (result.status === 403 && result.body.includes('cf_chl')) {\n if (curlImpersonateAvailable !== false && postFn !== curlImpersonatePost) {\n try {\n const ciResult = await curlImpersonatePost('https://chatgpt.com/backend-api/transcribe', chatgptHeaders, body)\n if (ciResult.status !== 403) return ciResult\n } catch {}\n }\n return { status: 503, body: JSON.stringify({ error: 'Transcription blocked by Cloudflare. Install curl-impersonate-chrome.' }) }\n }\n\n return result\n}\n\nfunction parseConnectorLogoUrl(rawUrl: string): { connectorId: string; theme: 'light' | 'dark' } | null {\n const trimmed = rawUrl.trim()\n if (!trimmed.startsWith('connectors://')) return null\n const rest = trimmed.slice('connectors://'.length)\n const connectorId = (rest.split(/[/?#]/u)[0] ?? '').trim()\n if (!connectorId) return null\n const query = rest.includes('?') ? rest.slice(rest.indexOf('?') + 1).split('#')[0] ?? '' : ''\n const theme = new URLSearchParams(query).get('theme')?.toLowerCase() === 'dark' ? 'dark' : 'light'\n return { connectorId, theme }\n}\n\nasync function fetchConnectorLogo(rawUrl: string): Promise<{ contentType: string; body: Buffer }> {\n const parsed = parseConnectorLogoUrl(rawUrl)\n if (!parsed) throw new Error('Unsupported connector logo URL')\n const auth = await readCodexAuth()\n if (!auth) throw new Error('No auth token available for connector logo')\n\n const endpoint = `https://chatgpt.com/backend-api/aip/connectors/${encodeURIComponent(parsed.connectorId)}/logo?theme=${parsed.theme}`\n const response = await fetch(endpoint, {\n headers: {\n Authorization: `Bearer ${auth.accessToken}`,\n originator: 'Codex Desktop',\n 'User-Agent': `Codex Desktop/0.1.0 (${process.platform}; ${process.arch})`,\n ...(auth.accountId ? { 'ChatGPT-Account-Id': auth.accountId } : {}),\n },\n signal: AbortSignal.timeout(10_000),\n })\n if (!response.ok) throw new Error(`Connector logo fetch failed (${response.status})`)\n\n const contentType = response.headers.get('content-type') ?? ''\n if (contentType.includes('application/json')) {\n const payload = asRecord(await response.json())\n const body = asRecord(payload?.body)\n const base64 = readNonEmptyString(body?.base64)\n const nestedContentType = readNonEmptyString(body?.contentType) ?? readNonEmptyString(body?.content_type)\n if (!base64 || !nestedContentType) throw new Error('Connector logo response was missing image data')\n return { contentType: nestedContentType, body: Buffer.from(base64, 'base64') }\n }\n\n return {\n contentType: contentType || 'image/png',\n body: Buffer.from(await response.arrayBuffer()),\n }\n}\n\nconst STREAM_EVENT_BUFFER_LIMIT = 400\n\ntype StreamEventFrame = {\n method: string\n params: unknown\n atIso: string\n}\n\ntype CapturedItem = {\n id: string\n type: string\n turnId: string\n data: Record<string, unknown>\n completed: boolean\n}\n\nconst MERGEABLE_ITEM_TYPES = new Set([\n 'commandExecution',\n 'fileChange',\n])\n\nclass AppServerProcess {\n private process: ChildProcessWithoutNullStreams | null = null\n private initialized = false\n private initializePromise: Promise<void> | null = null\n private readBuffer = ''\n private nextId = 1\n private stopping = false\n private readonly pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n private readonly notificationListeners = new Set<(value: { method: string; params: unknown }) => void>()\n private readonly pendingServerRequests = new Map<number, PendingServerRequest>()\n private readonly appServerArgs = buildAppServerArgs()\n private readonly streamEventsByThreadId = new Map<string, StreamEventFrame[]>()\n private readonly lastThreadReadSnapshotByThreadId = new Map<string, unknown>()\n private readonly threadTurnPageReadCacheByThreadId = new Map<string, { result: unknown; expiresAt: number }>()\n private readonly threadTurnPageReadPromiseByThreadId = new Map<string, Promise<unknown>>()\n private readonly capturedItemsByThreadId = new Map<string, Map<string, CapturedItem>>()\n private readonly liveStateCache = new Map<string, { data: unknown; turnCount: number; sessionSize: number }>()\n private chatgptAuthRefreshPromise: Promise<ChatgptAuthTokensRefreshResponse> | null = null\n\n\n private getCodexCommand(): string {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n throw new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.')\n }\n return codexCommand\n }\n\n private buildAppServerConfig(): { args: string[]; env: Record<string, string> } {\n const args = [\n 'app-server',\n '-c', 'approval_policy=\"never\"',\n '-c', 'sandbox_mode=\"danger-full-access\"',\n ]\n let extraEnv: Record<string, string> = {}\n const serverPort = parseInt(process.env.CODEXUI_SERVER_PORT ?? '', 10) || undefined\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n try {\n const state = ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n if (state) {\n args.push(...getFreeModeConfigArgs(state, serverPort))\n extraEnv = getFreeModeEnvVars(state)\n }\n } catch {\n // No free-mode state or invalid — use defaults\n }\n return { args, env: extraEnv }\n }\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const config = this.buildAppServerConfig()\n const invocation = getSpawnInvocation(this.getCodexCommand(), config.args)\n const spawnEnv = Object.keys(config.env).length > 0\n ? { ...process.env, ...config.env }\n : undefined\n const proc = spawn(invocation.command, invocation.args, { stdio: ['pipe', 'pipe', 'pipe'], ...(spawnEnv ? { env: spawnEnv } : {}) })\n this.process = proc\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n this.readBuffer += chunk\n\n let lineEnd = this.readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = this.readBuffer.slice(0, lineEnd).trim()\n this.readBuffer = this.readBuffer.slice(lineEnd + 1)\n\n if (line.length > 0) {\n this.handleLine(line)\n }\n\n lineEnd = this.readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // Keep stderr silent in dev middleware; JSON-RPC errors are forwarded via responses.\n })\n\n proc.on('exit', () => {\n if (this.process !== proc) {\n return\n }\n\n const failure = new Error(this.stopping ? 'codex app-server stopped' : 'codex app-server exited unexpectedly')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n\n this.pending.clear()\n this.pendingServerRequests.clear()\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n })\n }\n\n private sendLine(payload: Record<string, unknown>): void {\n if (!this.process) {\n throw new Error('codex app-server is not running')\n }\n\n this.process.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n private handleLine(line: string): void {\n let message: JsonRpcResponse\n try {\n message = JSON.parse(line) as JsonRpcResponse\n } catch {\n return\n }\n\n if (typeof message.id === 'number' && this.pending.has(message.id)) {\n const pendingRequest = this.pending.get(message.id)\n this.pending.delete(message.id)\n\n if (!pendingRequest) return\n\n if (message.error) {\n pendingRequest.reject(new Error(message.error.message))\n } else {\n pendingRequest.resolve(message.result)\n }\n return\n }\n\n if (typeof message.method === 'string' && typeof message.id !== 'number') {\n this.emitNotification({\n method: message.method,\n params: message.params ?? null,\n })\n return\n }\n\n // Handle server-initiated JSON-RPC requests (approvals, dynamic tool calls, etc.).\n if (typeof message.id === 'number' && typeof message.method === 'string') {\n this.handleServerRequest(message.id, message.method, message.params ?? null)\n }\n }\n\n private emitNotification(notification: { method: string; params: unknown }): void {\n this.recordStreamEvent(notification)\n this.captureItemFromNotification(notification)\n const nThreadId = this.extractThreadIdFromParams(notification.params)\n if (nThreadId) {\n this.invalidateLiveStateCache(nThreadId)\n this.threadTurnPageReadCacheByThreadId.delete(nThreadId)\n }\n for (const listener of this.notificationListeners) {\n listener(notification)\n }\n }\n\n private extractThreadIdFromParams(params: unknown): string {\n const record = asRecord(params)\n if (!record) return ''\n const threadId =\n (typeof record.threadId === 'string' ? record.threadId : '') ||\n (typeof record.thread_id === 'string' ? record.thread_id : '') ||\n (typeof record.conversationId === 'string' ? record.conversationId : '') ||\n (typeof record.conversation_id === 'string' ? record.conversation_id : '')\n if (threadId) return threadId\n const thread = asRecord(record.thread)\n if (thread && typeof thread.id === 'string') return thread.id\n const turn = asRecord(record.turn)\n if (turn) {\n const turnThreadId =\n (typeof turn.threadId === 'string' ? turn.threadId : '') ||\n (typeof turn.thread_id === 'string' ? turn.thread_id : '')\n if (turnThreadId) return turnThreadId\n }\n return ''\n }\n\n private recordStreamEvent(notification: { method: string; params: unknown }): void {\n const threadId = this.extractThreadIdFromParams(notification.params)\n if (!threadId) return\n const frame: StreamEventFrame = {\n method: notification.method,\n params: notification.params,\n atIso: new Date().toISOString(),\n }\n let buffer = this.streamEventsByThreadId.get(threadId)\n if (!buffer) {\n buffer = []\n this.streamEventsByThreadId.set(threadId, buffer)\n }\n buffer.push(frame)\n if (buffer.length > STREAM_EVENT_BUFFER_LIMIT) {\n buffer.splice(0, buffer.length - STREAM_EVENT_BUFFER_LIMIT)\n }\n }\n\n getStreamEvents(threadId: string, limit: number): StreamEventFrame[] {\n const buffer = this.streamEventsByThreadId.get(threadId)\n if (!buffer || buffer.length === 0) return []\n return buffer.slice(-limit)\n }\n\n storeThreadReadSnapshot(threadId: string, snapshot: unknown): void {\n this.lastThreadReadSnapshotByThreadId.set(threadId, snapshot)\n this.threadTurnPageReadCacheByThreadId.delete(threadId)\n }\n\n getLastThreadReadSnapshot(threadId: string): unknown | null {\n return this.lastThreadReadSnapshotByThreadId.get(threadId) ?? null\n }\n\n async readThreadForTurnPage(threadId: string): Promise<unknown> {\n const now = Date.now()\n const cached = this.threadTurnPageReadCacheByThreadId.get(threadId)\n if (cached && cached.expiresAt > now) return cached.result\n if (cached) this.threadTurnPageReadCacheByThreadId.delete(threadId)\n\n const pending = this.threadTurnPageReadPromiseByThreadId.get(threadId)\n if (pending) return pending\n\n const promise = this.rpc('thread/read', {\n threadId,\n includeTurns: true,\n }).then((result) => {\n this.threadTurnPageReadCacheByThreadId.set(threadId, {\n result,\n expiresAt: Date.now() + THREAD_TURN_PAGE_READ_CACHE_TTL_MS,\n })\n return result\n }).finally(() => {\n this.threadTurnPageReadPromiseByThreadId.delete(threadId)\n })\n\n this.threadTurnPageReadPromiseByThreadId.set(threadId, promise)\n return promise\n }\n\n cacheLiveState(threadId: string, data: unknown, turnCount: number, sessionSize: number): void {\n this.liveStateCache.set(threadId, { data, turnCount, sessionSize })\n }\n\n getCachedLiveState(threadId: string, turnCount: number, sessionSize: number): unknown | null {\n const cached = this.liveStateCache.get(threadId)\n if (!cached) return null\n if (cached.turnCount !== turnCount || cached.sessionSize !== sessionSize) return null\n return cached.data\n }\n\n invalidateLiveStateCache(threadId: string): void {\n this.liveStateCache.delete(threadId)\n }\n\n private captureItemFromNotification(notification: { method: string; params: unknown }): void {\n if (notification.method !== 'item/started' && notification.method !== 'item/completed') return\n\n const params = asRecord(notification.params)\n if (!params) return\n const item = asRecord(params.item)\n if (!item) return\n const itemType = typeof item.type === 'string' ? item.type : ''\n if (!MERGEABLE_ITEM_TYPES.has(itemType)) return\n\n const itemId = typeof item.id === 'string' ? item.id : ''\n if (!itemId) return\n\n const threadId = this.extractThreadIdFromParams(params)\n if (!threadId) return\n\n const turnId =\n (typeof params.turnId === 'string' ? params.turnId : '') ||\n (typeof params.turn_id === 'string' ? params.turn_id : '')\n if (!turnId) return\n\n let threadItems = this.capturedItemsByThreadId.get(threadId)\n if (!threadItems) {\n threadItems = new Map()\n this.capturedItemsByThreadId.set(threadId, threadItems)\n }\n\n const isCompleted = notification.method === 'item/completed'\n const existing = threadItems.get(itemId)\n\n if (existing && existing.completed && !isCompleted) return\n\n threadItems.set(itemId, {\n id: itemId,\n type: itemType,\n turnId,\n data: item as Record<string, unknown>,\n completed: isCompleted,\n })\n }\n\n mergeItemsIntoTurns(threadId: string, turns: unknown[]): unknown[] {\n const capturedMap = this.capturedItemsByThreadId.get(threadId)\n if (!capturedMap || capturedMap.size === 0) return turns\n\n const itemsByTurnId = new Map<string, CapturedItem[]>()\n for (const captured of capturedMap.values()) {\n let group = itemsByTurnId.get(captured.turnId)\n if (!group) {\n group = []\n itemsByTurnId.set(captured.turnId, group)\n }\n group.push(captured)\n }\n\n return turns.map((turn) => {\n const turnRecord = asRecord(turn)\n if (!turnRecord) return turn\n const turnId = typeof turnRecord.id === 'string' ? turnRecord.id : ''\n if (!turnId) return turn\n\n const captured = itemsByTurnId.get(turnId)\n if (!captured || captured.length === 0) return turn\n\n const existingItems = Array.isArray(turnRecord.items) ? (turnRecord.items as Record<string, unknown>[]) : []\n const existingIds = new Set(existingItems.map((it) => (typeof it.id === 'string' ? it.id : '')).filter(Boolean))\n\n const newItems = captured\n .filter((c) => !existingIds.has(c.id))\n .map((c) => c.data)\n\n if (newItems.length === 0) return turn\n\n return {\n ...turnRecord,\n items: [...existingItems, ...newItems],\n }\n })\n }\n\n private sendServerRequestReply(requestId: number, reply: ServerRequestReply): void {\n if (reply.error) {\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n error: reply.error,\n })\n return\n }\n\n this.sendLine({\n jsonrpc: '2.0',\n id: requestId,\n result: reply.result ?? {},\n })\n }\n\n private resolvePendingServerRequest(requestId: number, reply: ServerRequestReply): void {\n const pendingRequest = this.pendingServerRequests.get(requestId)\n if (!pendingRequest) {\n throw new Error(`No pending server request found for id ${String(requestId)}`)\n }\n this.pendingServerRequests.delete(requestId)\n\n this.sendServerRequestReply(requestId, reply)\n const requestParams = asRecord(pendingRequest.params)\n const threadId =\n typeof requestParams?.threadId === 'string' && requestParams.threadId.length > 0\n ? requestParams.threadId\n : ''\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: pendingRequest.method,\n threadId,\n mode: 'manual',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n }\n\n private async refreshChatgptAuthTokens(params: ChatgptAuthTokensRefreshParams): Promise<ChatgptAuthTokensRefreshResponse> {\n if (!this.chatgptAuthRefreshPromise) {\n this.chatgptAuthRefreshPromise = refreshChatgptAuthTokensForExternalAuth(params).finally(() => {\n this.chatgptAuthRefreshPromise = null\n })\n }\n return await this.chatgptAuthRefreshPromise\n }\n\n private async handleChatgptAuthTokensRefreshRequest(requestId: number, params: unknown): Promise<void> {\n const requestParams = asRecord(params)\n const previousAccountId = readNonEmptyString(requestParams?.previousAccountId ?? requestParams?.previous_account_id)\n try {\n const result = await this.refreshChatgptAuthTokens({\n reason: readNonEmptyString(requestParams?.reason) || undefined,\n previousAccountId: previousAccountId || undefined,\n })\n this.sendServerRequestReply(requestId, { result })\n this.emitNotification({\n method: 'server/request/resolved',\n params: {\n id: requestId,\n method: 'account/chatgptAuthTokens/refresh',\n mode: 'automatic',\n resolvedAtIso: new Date().toISOString(),\n },\n })\n } catch (error) {\n this.sendServerRequestReply(requestId, {\n error: {\n code: -32001,\n message: getErrorMessage(error, 'Failed to refresh ChatGPT auth tokens'),\n },\n })\n }\n }\n\n private handleServerRequest(requestId: number, method: string, params: unknown): void {\n if (method === 'account/chatgptAuthTokens/refresh') {\n void this.handleChatgptAuthTokensRefreshRequest(requestId, params)\n return\n }\n\n const pendingRequest: PendingServerRequest = {\n id: requestId,\n method,\n params,\n receivedAtIso: new Date().toISOString(),\n }\n this.pendingServerRequests.set(requestId, pendingRequest)\n\n this.emitNotification({\n method: 'server/request',\n params: pendingRequest,\n })\n }\n\n private async call(method: string, params: unknown): Promise<unknown> {\n this.start()\n const id = this.nextId++\n\n return new Promise((resolve, reject) => {\n this.pending.set(id, { resolve, reject })\n\n this.sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n } satisfies JsonRpcCall)\n })\n }\n\n private async ensureInitialized(): Promise<void> {\n if (this.initialized) return\n if (this.initializePromise) {\n await this.initializePromise\n return\n }\n\n this.initializePromise = this.call('initialize', {\n clientInfo: {\n name: 'codex-web-local',\n version: '0.1.0',\n },\n capabilities: {\n experimentalApi: true,\n },\n }).then(() => {\n this.sendLine({\n jsonrpc: '2.0',\n method: 'initialized',\n })\n this.initialized = true\n }).finally(() => {\n this.initializePromise = null\n })\n\n await this.initializePromise\n }\n\n async rpc(method: string, params: unknown): Promise<unknown> {\n await this.ensureInitialized()\n return this.call(method, params)\n }\n\n onNotification(listener: (value: { method: string; params: unknown }) => void): () => void {\n this.notificationListeners.add(listener)\n return () => {\n this.notificationListeners.delete(listener)\n }\n }\n\n async respondToServerRequest(payload: unknown): Promise<void> {\n await this.ensureInitialized()\n\n const body = asRecord(payload)\n if (!body) {\n throw new Error('Invalid response payload: expected object')\n }\n\n const id = body.id\n if (typeof id !== 'number' || !Number.isInteger(id)) {\n throw new Error('Invalid response payload: \"id\" must be an integer')\n }\n\n const rawError = asRecord(body.error)\n if (rawError) {\n const message = typeof rawError.message === 'string' && rawError.message.trim().length > 0\n ? rawError.message.trim()\n : 'Server request rejected by client'\n const code = typeof rawError.code === 'number' && Number.isFinite(rawError.code)\n ? Math.trunc(rawError.code)\n : -32000\n this.resolvePendingServerRequest(id, { error: { code, message } })\n return\n }\n\n if (!('result' in body)) {\n throw new Error('Invalid response payload: expected \"result\" or \"error\"')\n }\n\n this.resolvePendingServerRequest(id, { result: body.result })\n }\n\n listPendingServerRequests(): PendingServerRequest[] {\n return Array.from(this.pendingServerRequests.values())\n }\n\n dispose(): void {\n if (!this.process) return\n\n const proc = this.process\n this.stopping = true\n this.process = null\n this.initialized = false\n this.initializePromise = null\n this.readBuffer = ''\n\n const failure = new Error('codex app-server stopped')\n for (const request of this.pending.values()) {\n request.reject(failure)\n }\n this.pending.clear()\n this.pendingServerRequests.clear()\n\n try {\n proc.stdin.end()\n } catch {\n // ignore close errors on shutdown\n }\n\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore kill errors on shutdown\n }\n\n const forceKillTimer = setTimeout(() => {\n if (!proc.killed) {\n try {\n proc.kill('SIGKILL')\n } catch {\n // ignore kill errors on shutdown\n }\n }\n }, 1500)\n forceKillTimer.unref()\n }\n}\n\nexport class BackendQueueProcessor {\n private readonly processingThreadIds = new Set<string>()\n private readonly queueDrainTimersByThreadId = new Map<string, ReturnType<typeof setTimeout>>()\n private readonly queueDrainDueAtByThreadId = new Map<string, number>()\n private readonly unsubscribe: () => void\n\n constructor(private readonly appServer: AppServerProcess) {\n this.unsubscribe = appServer.onNotification((notification) => {\n if (!isTurnCompletedNotification(notification)) return\n const threadId = extractThreadIdFromNotificationParams(notification.params)\n if (!threadId) return\n void this.processThreadQueue(threadId)\n })\n void this.scheduleAllQueuedThreads(1000)\n }\n\n dispose(): void {\n this.unsubscribe()\n for (const timer of this.queueDrainTimersByThreadId.values()) {\n clearTimeout(timer)\n }\n this.queueDrainTimersByThreadId.clear()\n this.queueDrainDueAtByThreadId.clear()\n this.processingThreadIds.clear()\n }\n\n async scheduleAllQueuedThreads(delayMs = 0): Promise<void> {\n try {\n const state = await readThreadQueueState()\n for (const threadId of Object.keys(state)) {\n this.scheduleThreadQueueDrain(threadId, delayMs)\n }\n } catch {\n // Queue recovery is best-effort; normal turn-completed events can still drain later.\n }\n }\n\n scheduleThreadQueueDrain(threadId: string, delayMs = 5000): void {\n if (!threadId) return\n const normalizedDelayMs = Math.max(0, delayMs)\n const nextDueAt = Date.now() + normalizedDelayMs\n const existingDueAt = this.queueDrainDueAtByThreadId.get(threadId)\n const existingTimer = this.queueDrainTimersByThreadId.get(threadId)\n if (existingTimer) {\n if (existingDueAt !== undefined && existingDueAt <= nextDueAt) return\n clearTimeout(existingTimer)\n this.queueDrainTimersByThreadId.delete(threadId)\n this.queueDrainDueAtByThreadId.delete(threadId)\n }\n const timer = setTimeout(() => {\n this.queueDrainTimersByThreadId.delete(threadId)\n this.queueDrainDueAtByThreadId.delete(threadId)\n void this.processThreadQueue(threadId)\n }, normalizedDelayMs)\n timer.unref?.()\n this.queueDrainTimersByThreadId.set(threadId, timer)\n this.queueDrainDueAtByThreadId.set(threadId, nextDueAt)\n }\n\n async processThreadQueue(threadId: string): Promise<void> {\n if (this.processingThreadIds.has(threadId)) return\n this.processingThreadIds.add(threadId)\n try {\n const canStart = await this.canStartQueuedTurn(threadId)\n if (!canStart) {\n if (await this.hasQueuedTurns(threadId)) {\n this.scheduleThreadQueueDrain(threadId)\n }\n return\n }\n const next = await this.popNextQueuedTurn(threadId)\n if (!next) return\n try {\n await this.startQueuedTurn(next)\n if (await this.hasQueuedTurns(threadId)) {\n this.scheduleThreadQueueDrain(threadId)\n }\n } catch {\n await this.restoreQueuedTurn(next)\n this.scheduleThreadQueueDrain(threadId)\n }\n } catch {\n // Queue processing is best-effort. Keep the bridge alive if app-server is unavailable.\n this.scheduleThreadQueueDrain(threadId)\n } finally {\n this.processingThreadIds.delete(threadId)\n }\n }\n\n private async hasQueuedTurns(threadId: string): Promise<boolean> {\n const state = await readThreadQueueState()\n const queue = state[threadId]\n return Array.isArray(queue) && queue.length > 0\n }\n\n private async canStartQueuedTurn(threadId: string): Promise<boolean> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n if (!thread) return false\n\n const status = asRecord(thread.status)\n const statusType = readNonEmptyString(status?.type)\n if (statusType === 'inProgress' || statusType === 'running' || statusType === 'active') return false\n\n const turns = Array.isArray(thread.turns) ? thread.turns : []\n return !turns.some((turn) => readNonEmptyString(asRecord(turn)?.status) === 'inProgress')\n }\n\n private async popNextQueuedTurn(threadId: string): Promise<BackendQueuedTurn | null> {\n return withThreadQueueStateUpdate((state) => {\n const queue = state[threadId]\n if (!queue || queue.length === 0) {\n return { nextState: state, result: null }\n }\n\n const [message, ...rest] = queue\n const nextState = { ...state }\n if (rest.length > 0) {\n nextState[threadId] = rest\n } else {\n delete nextState[threadId]\n }\n return { nextState, result: { threadId, message } }\n })\n }\n\n private async restoreQueuedTurn(turn: BackendQueuedTurn): Promise<void> {\n await withThreadQueueStateUpdate((state) => {\n const queue = state[turn.threadId] ?? []\n return {\n nextState: {\n ...state,\n [turn.threadId]: [turn.message, ...queue],\n },\n result: undefined,\n }\n })\n }\n\n private async resolveCollaborationModeSettings(mode: CollaborationModeKind): Promise<ResolvedCollaborationModeSettings> {\n let currentConfig: Record<string, unknown> | null = null\n try {\n const configPayload = asRecord(await this.appServer.rpc('config/read', {}))\n currentConfig = asRecord(configPayload?.config)\n } catch {\n currentConfig = null\n }\n\n const configuredModel = readNonEmptyString(currentConfig?.model)\n if (configuredModel) {\n return {\n model: configuredModel,\n reasoningEffort: normalizeCollaborationModeReasoningEffort(normalizeReasoningEffort(currentConfig?.model_reasoning_effort)),\n }\n }\n\n try {\n const modelsPayload = asRecord(await this.appServer.rpc('model/list', {}))\n const models = Array.isArray(modelsPayload?.data) ? modelsPayload.data : []\n for (const row of models) {\n const record = asRecord(row)\n const candidate = readNonEmptyString(record?.id) || readNonEmptyString(record?.model)\n if (candidate) {\n return {\n model: candidate,\n reasoningEffort: normalizeCollaborationModeReasoningEffort(normalizeReasoningEffort(currentConfig?.model_reasoning_effort)),\n }\n }\n }\n } catch {\n // Fall through to no collaboration-mode payload.\n }\n\n throw new Error(`${mode === 'plan' ? 'Plan' : 'Default'} mode requires an available model.`)\n }\n\n private async buildQueuedTurnParams(turn: BackendQueuedTurn): Promise<Record<string, unknown>> {\n const localImageAttachments: StoredQueuedMessage['fileAttachments'] = []\n for (const imageUrl of turn.message.imageUrls) {\n const localImagePath = extractLocalImagePathFromUrl(imageUrl.trim())\n if (!localImagePath) continue\n localImageAttachments.push({\n label: fileNameFromPath(localImagePath),\n path: localImagePath,\n fsPath: localImagePath,\n })\n }\n\n const allFileAttachments = [...turn.message.fileAttachments, ...localImageAttachments]\n const dedupedFileAttachments = allFileAttachments.filter((entry, index) =>\n allFileAttachments.findIndex((candidate) => candidate.fsPath === entry.fsPath) === index)\n\n const input: Array<Record<string, unknown>> = [{\n type: 'text',\n text: buildTextWithAttachments(turn.message.text, dedupedFileAttachments),\n }]\n\n for (const imageUrl of turn.message.imageUrls) {\n const normalizedUrl = imageUrl.trim()\n if (!normalizedUrl) continue\n const localImagePath = extractLocalImagePathFromUrl(normalizedUrl)\n if (localImagePath) {\n input.push({ type: 'localImage', path: localImagePath })\n } else {\n input.push({ type: 'image', url: normalizedUrl, image_url: normalizedUrl })\n }\n }\n\n for (const skill of turn.message.skills) {\n input.push({ type: 'skill', name: skill.name, path: skill.path })\n }\n\n const params: Record<string, unknown> = {\n threadId: turn.threadId,\n input,\n }\n if (dedupedFileAttachments.length > 0) {\n params.attachments = dedupedFileAttachments.map((f) => ({ label: f.label, path: f.path, fsPath: f.fsPath }))\n }\n\n try {\n const settings = await this.resolveCollaborationModeSettings(turn.message.collaborationMode)\n params.collaborationMode = {\n mode: turn.message.collaborationMode,\n settings: {\n model: settings.model,\n reasoning_effort: settings.reasoningEffort,\n developer_instructions: null,\n },\n }\n } catch {\n // Older app-server versions still accept a plain turn/start without collaborationMode.\n }\n\n return params\n }\n\n private async startQueuedTurn(turn: BackendQueuedTurn): Promise<void> {\n await this.appServer.rpc('thread/resume', { threadId: turn.threadId })\n await this.appServer.rpc('turn/start', await this.buildQueuedTurnParams(turn))\n }\n}\n\nclass MethodCatalog {\n private methodCache: string[] | null = null\n private notificationCache: string[] | null = null\n\n private async runGenerateSchemaCommand(outDir: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n const codexCommand = resolveCodexCommand()\n if (!codexCommand) {\n reject(new Error('Codex CLI is not available. Install @openai/codex or set CODEXUI_CODEX_COMMAND.'))\n return\n }\n\n const invocation = getSpawnInvocation(codexCommand, ['app-server', 'generate-json-schema', '--out', outDir])\n const process = spawn(invocation.command, invocation.args, {\n stdio: ['ignore', 'ignore', 'pipe'],\n })\n\n let stderr = ''\n\n process.stderr.setEncoding('utf8')\n process.stderr.on('data', (chunk: string) => {\n stderr += chunk\n })\n\n process.on('error', reject)\n process.on('exit', (code) => {\n if (code === 0) {\n resolve()\n return\n }\n\n reject(new Error(stderr.trim() || `generate-json-schema exited with code ${String(code)}`))\n })\n })\n }\n\n private extractMethodsFromClientRequest(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n private extractMethodsFromServerNotification(payload: unknown): string[] {\n const root = asRecord(payload)\n const oneOf = Array.isArray(root?.oneOf) ? root.oneOf : []\n const methods = new Set<string>()\n\n for (const entry of oneOf) {\n const row = asRecord(entry)\n const properties = asRecord(row?.properties)\n const methodDef = asRecord(properties?.method)\n const methodEnum = Array.isArray(methodDef?.enum) ? methodDef.enum : []\n\n for (const item of methodEnum) {\n if (typeof item === 'string' && item.length > 0) {\n methods.add(item)\n }\n }\n }\n\n return Array.from(methods).sort((a, b) => a.localeCompare(b))\n }\n\n async listMethods(): Promise<string[]> {\n if (this.methodCache) {\n return this.methodCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const clientRequestPath = join(outDir, 'ClientRequest.json')\n const raw = await readFile(clientRequestPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromClientRequest(parsed)\n\n this.methodCache = methods\n return methods\n }\n\n async listNotificationMethods(): Promise<string[]> {\n if (this.notificationCache) {\n return this.notificationCache\n }\n\n const outDir = await mkdtemp(join(tmpdir(), 'codex-web-local-schema-'))\n await this.runGenerateSchemaCommand(outDir)\n\n const serverNotificationPath = join(outDir, 'ServerNotification.json')\n const raw = await readFile(serverNotificationPath, 'utf8')\n const parsed = JSON.parse(raw) as unknown\n const methods = this.extractMethodsFromServerNotification(parsed)\n\n this.notificationCache = methods\n return methods\n }\n}\n\ntype CodexBridgeMiddleware = ((req: IncomingMessage, res: ServerResponse, next: () => void) => Promise<void>) & {\n dispose: () => void\n subscribeNotifications: (listener: (value: { method: string; params: unknown; atIso: string }) => void) => () => void\n}\n\ntype SharedBridgeState = {\n version: string\n appServer: AppServerProcess\n terminalManager: ThreadTerminalManager\n methodCatalog: MethodCatalog\n telegramBridge: TelegramThreadBridge\n backendQueueProcessor: BackendQueueProcessor\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\nconst SHARED_BRIDGE_VERSION = 'experimental-api-v2'\n\nfunction getSharedBridgeState(): SharedBridgeState {\n const globalScope = globalThis as typeof globalThis & {\n [SHARED_BRIDGE_KEY]?: SharedBridgeState\n }\n\n const existing = globalScope[SHARED_BRIDGE_KEY]\n if (existing) {\n if (existing.version === SHARED_BRIDGE_VERSION && existing.terminalManager) {\n return existing\n }\n existing.appServer.dispose()\n existing.backendQueueProcessor?.dispose()\n existing.terminalManager?.dispose()\n }\n\n const appServer = new AppServerProcess()\n const terminalManager = new ThreadTerminalManager()\n const backendQueueProcessor = new BackendQueueProcessor(appServer)\n const created: SharedBridgeState = {\n version: SHARED_BRIDGE_VERSION,\n appServer,\n terminalManager,\n methodCatalog: new MethodCatalog(),\n backendQueueProcessor,\n telegramBridge: new TelegramThreadBridge(appServer, {\n onChatSeen: (chatId) => {\n void rememberTelegramChatId(chatId).catch(() => {})\n },\n }),\n }\n globalScope[SHARED_BRIDGE_KEY] = created\n return created\n}\n\nasync function loadAllThreadsForSearch(appServer: AppServerProcess): Promise<ThreadSearchDocument[]> {\n const threads: Array<{ id: string; title: string; preview: string }> = []\n let cursor: string | null = null\n\n do {\n const response = asRecord(await appServer.rpc('thread/list', {\n archived: false,\n limit: 100,\n sortKey: 'updated_at',\n modelProviders: [],\n cursor,\n }))\n const data = Array.isArray(response?.data) ? response.data : []\n for (const row of data) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id : ''\n if (!id) continue\n const title = typeof record?.name === 'string' && record.name.trim().length > 0\n ? record.name.trim()\n : (typeof record?.preview === 'string' && record.preview.trim().length > 0 ? record.preview.trim() : 'Untitled thread')\n const preview = typeof record?.preview === 'string' ? record.preview : ''\n threads.push({ id, title, preview })\n }\n cursor = typeof response?.nextCursor === 'string' && response.nextCursor.length > 0 ? response.nextCursor : null\n } while (cursor)\n\n const docs: ThreadSearchDocument[] = threads.map((thread) => {\n const searchableText = [thread.title, thread.preview].filter(Boolean).join('\\n')\n return {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText: '',\n searchableText,\n } satisfies ThreadSearchDocument\n })\n\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n const fullTextThreads = threads.slice(0, THREAD_SEARCH_FULL_TEXT_THREAD_LIMIT)\n const concurrency = 4\n for (let offset = 0; offset < fullTextThreads.length; offset += concurrency) {\n const batch = fullTextThreads.slice(offset, offset + concurrency)\n const loaded = await Promise.all(batch.map(async (thread) => {\n try {\n const readResponse = await appServer.rpc('thread/read', {\n threadId: thread.id,\n includeTurns: true,\n })\n const messageText = extractThreadMessageText(readResponse)\n const searchableText = [thread.title, thread.preview, messageText].filter(Boolean).join('\\n')\n return [thread.id, {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument] as const\n } catch {\n return null\n }\n }))\n for (const row of loaded) {\n if (!row) continue\n docsById.set(row[0], row[1])\n }\n }\n\n return Array.from(docsById.values())\n}\n\nasync function buildThreadSearchIndex(appServer: AppServerProcess): Promise<ThreadSearchIndex> {\n const docs = await loadAllThreadsForSearch(appServer)\n const docsById = new Map<string, ThreadSearchDocument>(docs.map((doc) => [doc.id, doc]))\n return { docsById }\n}\n\nexport function createCodexBridgeMiddleware(): CodexBridgeMiddleware {\n const { appServer, terminalManager, methodCatalog, telegramBridge, backendQueueProcessor } = getSharedBridgeState()\n let threadSearchIndex: ThreadSearchIndex | null = null\n let threadSearchIndexPromise: Promise<ThreadSearchIndex> | null = null\n\n async function getThreadSearchIndex(): Promise<ThreadSearchIndex> {\n if (threadSearchIndex) return threadSearchIndex\n if (!threadSearchIndexPromise) {\n threadSearchIndexPromise = buildThreadSearchIndex(appServer)\n .then((index) => {\n threadSearchIndex = index\n return index\n })\n .finally(() => {\n threadSearchIndexPromise = null\n })\n }\n return threadSearchIndexPromise\n }\n void initializeSkillsSyncOnStartup(appServer)\n void readTelegramBridgeConfig()\n .then((config) => {\n if (!config.botToken) return\n telegramBridge.configureToken(config.botToken)\n telegramBridge.configureAllowedUserIds(config.allowedUserIds)\n telegramBridge.start()\n })\n .catch(() => {})\n\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n const requestStartNs = process.hrtime.bigint()\n const rawUrl = req.url ?? ''\n const parsedRequestUrl = rawUrl ? new URL(rawUrl, 'http://localhost') : null\n const requestPath = parsedRequestUrl?.pathname ?? ''\n const requestMethod = req.method ?? 'UNKNOWN'\n const rawContentLength = Array.isArray(req.headers['content-length'])\n ? req.headers['content-length'][0]\n : req.headers['content-length']\n const parsedContentLength = rawContentLength ? Number.parseInt(rawContentLength, 10) : NaN\n let requestBodyBytes: number | null = Number.isFinite(parsedContentLength) && parsedContentLength >= 0\n ? parsedContentLength\n : null\n let responseBodyBytes = 0\n let rpcMethod: string | null = null\n const originalWrite = res.write.bind(res)\n const originalEnd = res.end.bind(res)\n res.write = ((chunk: unknown, encoding?: unknown, cb?: unknown) => {\n const resolvedEncoding = typeof encoding === 'string' ? encoding as BufferEncoding : undefined\n responseBodyBytes += getChunkByteLength(chunk, resolvedEncoding)\n return originalWrite(chunk as never, encoding as never, cb as never)\n }) as typeof res.write\n res.end = ((chunk?: unknown, encoding?: unknown, cb?: unknown) => {\n const resolvedEncoding = typeof encoding === 'string' ? encoding as BufferEncoding : undefined\n responseBodyBytes += getChunkByteLength(chunk, resolvedEncoding)\n return originalEnd(chunk as never, encoding as never, cb as never)\n }) as typeof res.end\n let didLog = false\n const logApiRequestDuration = () => {\n if (!API_PERF_LOGGING_ENABLED || didLog || !requestPath.startsWith('/codex-api/')) return\n const durationMs = Number((process.hrtime.bigint() - requestStartNs) / 1_000_000n)\n const requestBytes = requestBodyBytes ?? 0\n const bodyMbValue = (requestBytes + responseBodyBytes) / MB_DIVISOR\n const shouldLog = durationMs > API_PERF_MS_THRESHOLD || bodyMbValue > API_PERF_BODY_MB_THRESHOLD\n if (!shouldLog) return\n didLog = true\n const rpcPart = rpcMethod ? `, rpcMethod=${rpcMethod}` : ''\n console.info(`[codex-api-perf] ${requestMethod} ${requestPath} -> ${res.statusCode} (${durationMs}ms, bodyMB=${bodyMbValue.toFixed(1)}${rpcPart})`)\n }\n res.once('finish', logApiRequestDuration)\n res.once('close', logApiRequestDuration)\n\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\n\n if (url.pathname === '/codex-api/zen-proxy/v1/responses' && req.method === 'POST') {\n if (!isLoopbackRemoteAddress(req.socket.remoteAddress)) {\n setJson(res, 403, { error: 'Zen proxy is only available from localhost' })\n return\n }\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'chat'\n try {\n const state = JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n bearerToken = state.apiKey ?? ''\n wireApi = state.wireApi === 'responses' ? 'responses' : 'chat'\n } catch { /* use empty */ }\n handleZenProxyRequest(req, res, bearerToken, wireApi)\n return\n }\n\n if (url.pathname === '/codex-api/openrouter-proxy/v1/responses' && req.method === 'POST') {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'responses'\n try {\n const state = ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n bearerToken = state?.apiKey ?? ''\n wireApi = state?.wireApi === 'chat' ? 'chat' : 'responses'\n } catch { /* use empty */ }\n handleOpenRouterProxyRequest(req, res, bearerToken, wireApi)\n return\n }\n\n if (url.pathname === '/codex-api/custom-proxy/v1/responses' && req.method === 'POST') {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n let bearerToken = ''\n let wireApi: 'responses' | 'chat' = 'responses'\n let baseUrl = ''\n try {\n const state = JSON.parse(readFileSync(statePath, 'utf8')) as FreeModeState\n bearerToken = state.apiKey ?? ''\n wireApi = state.wireApi === 'chat' ? 'chat' : 'responses'\n baseUrl = state.customBaseUrl ?? ''\n } catch { /* use empty */ }\n handleCustomEndpointProxyRequest(req, res, { baseUrl, bearerToken, wireApi })\n return\n }\n\n if (url.pathname.startsWith('/codex-api/free-mode')) {\n const statePath = join(getCodexHomeDir(), FREE_MODE_STATE_FILE)\n\n function readFreeModeState(): FreeModeState {\n return ensureDefaultFreeModeStateForMissingAuthSync(statePath)\n ?? { enabled: false, apiKey: null, model: FREE_MODE_DEFAULT_MODEL }\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const enable = Boolean(body?.enable)\n\n if (enable) {\n const apiKey = getRandomFreeKey()\n if (!apiKey) {\n setJson(res, 500, { error: 'No free keys available' })\n return\n }\n\n const prev = readFreeModeState()\n const prevKeys = prev.providerKeys ?? {}\n if (prev.provider && prev.apiKey) {\n prevKeys[prev.provider] = prev.apiKey\n }\n const state: FreeModeState = {\n enabled: true,\n apiKey,\n model: FREE_MODE_DEFAULT_MODEL,\n provider: 'openrouter',\n wireApi: prev.wireApi === 'chat' ? 'chat' : 'responses',\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n const freeModels = await getFreeModels()\n setJson(res, 200, {\n ok: true,\n enabled: true,\n model: FREE_MODE_DEFAULT_MODEL,\n keyCount: getFreeKeyCount(),\n models: freeModels,\n })\n } else {\n const prev = readFreeModeState()\n const prevKeys = prev.providerKeys ?? {}\n if (prev.provider && prev.apiKey) {\n prevKeys[prev.provider] = prev.apiKey\n }\n const state: FreeModeState = {\n enabled: false,\n apiKey: null,\n model: FREE_MODE_DEFAULT_MODEL,\n wireApi: prev.wireApi === 'chat' ? 'chat' : 'responses',\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, enabled: false })\n }\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to toggle free mode') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/free-mode/status') {\n try {\n const state = readFreeModeState()\n const maskedKey = state.apiKey && state.customKey\n ? state.apiKey.substring(0, 12) + '...' + state.apiKey.substring(state.apiKey.length - 4)\n : null\n refreshFreeModelsInBackground()\n setJson(res, 200, {\n enabled: state.enabled,\n keyCount: getFreeKeyCount(),\n models: getCachedFreeModels(),\n currentModel: state.enabled ? state.model : null,\n customKey: Boolean(state.customKey),\n maskedKey,\n provider: state.provider ?? 'openrouter',\n customBaseUrl: state.customBaseUrl ?? null,\n wireApi: state.wireApi ?? null,\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read free mode status') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/rotate-key') {\n try {\n const apiKey = getRandomFreeKey()\n if (!apiKey) {\n setJson(res, 500, { error: 'No free keys available' })\n return\n }\n const current = readFreeModeState()\n const state: FreeModeState = { ...current, apiKey, customKey: false }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to rotate key') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/custom-key') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const key = typeof body?.key === 'string' ? body.key.trim() : ''\n const current = readFreeModeState()\n\n if (key.length > 0) {\n const state: FreeModeState = {\n ...current,\n enabled: true,\n apiKey: key,\n customKey: true,\n provider: 'openrouter',\n wireApi: current.wireApi === 'chat' ? 'chat' : 'responses',\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, customKey: true })\n } else {\n const communityKey = getRandomFreeKey()\n const state: FreeModeState = {\n ...current,\n apiKey: communityKey,\n customKey: false,\n provider: 'openrouter',\n wireApi: current.wireApi === 'chat' ? 'chat' : 'responses',\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true, customKey: false })\n }\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to set custom key') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/free-mode/custom-provider') {\n try {\n const body = await readJsonBody(req) as Record<string, unknown> | null\n const baseUrl = typeof body?.baseUrl === 'string' ? body.baseUrl.trim() : ''\n const apiKey = typeof body?.apiKey === 'string' ? body.apiKey.trim() : ''\n const wireApi = body?.wireApi === 'chat' ? 'chat' as const : 'responses' as const\n const providerType = body?.provider === 'opencode-zen'\n ? 'opencode-zen' as const\n : body?.provider === 'openrouter'\n ? 'openrouter' as const\n : 'custom' as const\n if (providerType === 'custom' && !baseUrl) {\n setJson(res, 400, { error: 'baseUrl is required' })\n return\n }\n const current = readFreeModeState()\n const prevKeys = current.providerKeys ?? {}\n if (current.provider && current.apiKey) {\n prevKeys[current.provider] = current.apiKey\n }\n const resolvedKey = apiKey || prevKeys[providerType] || ''\n if (resolvedKey) {\n prevKeys[providerType] = resolvedKey\n }\n const resolvedModel = providerType === 'openrouter'\n ? (current.model || FREE_MODE_DEFAULT_MODEL)\n : providerType === 'custom'\n ? await fetchCustomEndpointDefaultModel(baseUrl, resolvedKey)\n : ''\n const state: FreeModeState = {\n enabled: true,\n apiKey: resolvedKey,\n model: resolvedModel,\n customKey: providerType === 'openrouter' ? current.customKey : true,\n provider: providerType,\n customBaseUrl: providerType === 'custom' ? baseUrl : undefined,\n wireApi,\n providerKeys: prevKeys,\n }\n await writeFile(statePath, JSON.stringify(state), 'utf8')\n appServer.dispose()\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to set custom provider') })\n }\n return\n }\n\n next()\n return\n }\n\n if (await handleAccountRoutes(req, res, url, { appServer })) {\n return\n }\n\n if (await handleSkillsRoutes(req, res, url, { appServer, readJsonBody })) {\n return\n }\n\n if (await handleReviewRoutes(req, res, url, { readJsonBody })) {\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal/status') {\n setJson(res, 200, terminalManager.getAvailability())\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal/quick-commands') {\n const cwd = url.searchParams.get('cwd')?.trim() ?? ''\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n try {\n setJson(res, 200, { commands: await listTerminalQuickCommands(cwd) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load terminal quick commands') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/attach') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const threadId = readNonEmptyString(body?.threadId)\n const cwd = readNonEmptyString(body?.cwd)\n if (!threadId || !cwd) {\n setJson(res, 400, { error: 'Missing threadId or cwd' })\n return\n }\n const session = terminalManager.attach({\n threadId,\n cwd,\n sessionId: readNonEmptyString(body?.sessionId) || undefined,\n cols: typeof body?.cols === 'number' ? body.cols : undefined,\n rows: typeof body?.rows === 'number' ? body.rows : undefined,\n newSession: body?.newSession === true,\n })\n setJson(res, 200, { session })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/input') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n const data = typeof body?.data === 'string' ? body.data : ''\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.write(sessionId, data)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/resize') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.resize(sessionId, body?.cols, body?.rows)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-terminal/close') {\n const availability = terminalManager.getAvailability()\n if (!availability.available) {\n setJson(res, 503, { error: availability.reason || 'Integrated terminal is unavailable on this host' })\n return\n }\n const body = asRecord(await readJsonBody(req))\n const sessionId = readNonEmptyString(body?.sessionId)\n if (!sessionId) {\n setJson(res, 400, { error: 'Missing sessionId' })\n return\n }\n terminalManager.close(sessionId)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-terminal-snapshot') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n setJson(res, 200, { session: terminalManager.getSnapshotForThread(threadId) })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/upload-file') {\n handleFileUpload(req, res)\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/rpc') {\n const payload = await readJsonBody(req)\n const body = asRecord(payload) as RpcProxyRequest | null\n if (payload !== null && payload !== undefined) {\n requestBodyBytes = Buffer.byteLength(JSON.stringify(payload), 'utf8')\n }\n rpcMethod = body?.method && typeof body.method === 'string' ? body.method : null\n\n if (!body || typeof body.method !== 'string' || body.method.length === 0) {\n setJson(res, 400, { error: 'Invalid body: expected { method, params? }' })\n return\n }\n\n if (body.method === 'account/rateLimits/read' && !(await hasUsableCodexAuth())) {\n setJson(res, 200, { result: null })\n return\n }\n\n let rpcResult: unknown\n try {\n rpcResult = await callRpcWithArchiveRecovery(appServer, body.method, body.params ?? null)\n } catch (error) {\n if (body.method === 'account/rateLimits/read' && isUnauthenticatedRateLimitError(error)) {\n setJson(res, 200, { result: null })\n return\n }\n throw error\n }\n const trimmedResult = trimThreadTurnsInRpcResult(body.method, rpcResult)\n const sanitizedResult = await sanitizeThreadTurnsInlinePayloads(body.method, trimmedResult)\n const result = THREAD_METHODS_WITH_TURNS.has(body.method)\n ? await mergeSessionSkillInputsIntoThreadResult(sanitizedResult)\n : sanitizedResult\n\n if (THREAD_METHODS_WITH_TURNS.has(body.method)) {\n const rpcRecord = asRecord(result)\n const rpcThread = asRecord(rpcRecord?.thread)\n const rpcThreadId = typeof rpcThread?.id === 'string' ? rpcThread.id : ''\n if (rpcThreadId) {\n appServer.storeThreadReadSnapshot(rpcThreadId, result)\n }\n }\n\n setJson(res, 200, { result })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-turn-page') {\n try {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const beforeTurnId = url.searchParams.get('beforeTurnId')?.trim() ?? ''\n const limitRaw = url.searchParams.get('limit')?.trim() ?? String(THREAD_RESPONSE_TURN_LIMIT)\n const limit = Math.max(1, Math.min(50, Number.parseInt(limitRaw, 10) || THREAD_RESPONSE_TURN_LIMIT))\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n const threadReadResult = await appServer.readThreadForTurnPage(threadId)\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n if (!record || !thread) {\n setJson(res, 502, { error: 'thread/read returned an invalid thread response' })\n return\n }\n\n const turns = Array.isArray(thread.turns) ? thread.turns : []\n const beforeIndex = beforeTurnId\n ? turns.findIndex((turn) => asRecord(turn)?.id === beforeTurnId)\n : turns.length\n if (beforeTurnId && beforeIndex < 0) {\n setJson(res, 200, {\n result: {\n ...record,\n thread: {\n ...thread,\n turns: [],\n },\n },\n startTurnIndex: 0,\n hasMoreOlder: false,\n })\n return\n }\n\n const endIndex = beforeIndex\n const startIndex = Math.max(0, endIndex - limit)\n const pageTurns = turns.slice(startIndex, endIndex)\n const pagedResult = {\n ...record,\n thread: {\n ...thread,\n turns: pageTurns,\n },\n }\n const sanitized = await sanitizeThreadTurnsInlinePayloads('thread/read', pagedResult)\n const result = await mergeSessionSkillInputsIntoThreadResult(sanitized)\n\n setJson(res, 200, {\n result,\n startTurnIndex: startIndex,\n hasMoreOlder: startIndex > 0,\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load earlier thread messages') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-file-change-fallback') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n const threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: true,\n })\n const threadReadRecord = asRecord(threadReadResult)\n const threadRecord = asRecord(threadReadRecord?.thread)\n const sessionPath = readNonEmptyString(threadRecord?.path)\n if (!sessionPath || !isAbsolute(sessionPath)) {\n setJson(res, 200, { data: [] })\n return\n }\n\n try {\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n setJson(res, 200, { data: buildSessionFileChangeFallback(threadReadResult, sessionLogRaw) })\n } catch {\n setJson(res, 200, { data: [] })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-stream-events') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const limitRaw = url.searchParams.get('limit')?.trim() ?? '80'\n const limit = Math.max(1, Math.min(400, Number.parseInt(limitRaw, 10) || 80))\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const events = appServer.getStreamEvents(threadId, limit)\n setJson(res, 200, { events })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-live-state') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n\n try {\n const threadReadResult = await appServer.rpc('thread/read', {\n threadId,\n includeTurns: true,\n })\n const sanitized = await sanitizeThreadTurnsInlinePayloads('thread/read', threadReadResult)\n appServer.storeThreadReadSnapshot(threadId, sanitized)\n\n const record = asRecord(sanitized)\n const thread = asRecord(record?.thread)\n const rawTurns = Array.isArray(thread?.turns) ? thread.turns : []\n\n const sessionPath = readNonEmptyString(thread?.path)\n let sessionSize = 0\n if (sessionPath && isAbsolute(sessionPath)) {\n try {\n const s = await stat(sessionPath)\n sessionSize = s.size\n } catch { /* missing */ }\n }\n\n const cached = appServer.getCachedLiveState(threadId, rawTurns.length, sessionSize)\n if (cached) {\n setJson(res, 200, cached)\n return\n }\n\n let turns = appServer.mergeItemsIntoTurns(threadId, rawTurns)\n\n if (sessionPath && isAbsolute(sessionPath) && sessionSize > 0) {\n try {\n const sessionLogRaw = await readFile(sessionPath, 'utf8')\n turns = mergeSessionCommandsIntoTurns(turns, sessionLogRaw)\n } catch {\n // Session log not available — continue without command recovery\n }\n }\n\n const lastTurn = turns.length > 0 ? asRecord(turns[turns.length - 1]) : null\n const isInProgress = lastTurn?.status === 'inProgress'\n\n const responseData = {\n threadId,\n conversationState: {\n turns,\n },\n ownerClientId: null,\n liveStateError: null,\n isInProgress,\n }\n\n if (!isInProgress) {\n appServer.cacheLiveState(threadId, responseData, rawTurns.length, sessionSize)\n }\n\n setJson(res, 200, responseData)\n } catch (error) {\n const snapshot = appServer.getLastThreadReadSnapshot(threadId)\n if (snapshot) {\n const record = asRecord(snapshot)\n const thread = asRecord(record?.thread)\n const rawTurns = Array.isArray(thread?.turns) ? thread.turns : []\n const turns = appServer.mergeItemsIntoTurns(threadId, rawTurns)\n setJson(res, 200, {\n threadId,\n conversationState: { turns },\n ownerClientId: null,\n liveStateError: {\n kind: 'readFailed',\n message: getErrorMessage(error, 'thread/read failed'),\n },\n isInProgress: false,\n })\n } else {\n setJson(res, 200, {\n threadId,\n conversationState: null,\n ownerClientId: null,\n liveStateError: {\n kind: 'readFailed',\n message: getErrorMessage(error, 'thread/read failed'),\n },\n isInProgress: false,\n })\n }\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread/rollback-files') {\n try {\n const body = asRecord(await readJsonBody(req))\n const threadId = readNonEmptyString(body?.threadId)\n const turnId = readNonEmptyString(body?.turnId)\n const cwd = readNonEmptyString(body?.cwd)\n if (!threadId || !turnId || !cwd) {\n setJson(res, 400, { error: 'Missing threadId, turnId, or cwd' })\n return\n }\n\n const threadReadResult = await appServer.rpc('thread/read', { threadId, includeTurns: true })\n const record = asRecord(threadReadResult)\n const thread = asRecord(record?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const sessionPath = readNonEmptyString(thread?.path)\n\n if (!sessionPath || !isAbsolute(sessionPath)) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No session log available' })\n return\n }\n\n let foundTurnIndex = -1\n const turnIdsToRevert = new Set<string>()\n for (let i = 0; i < turns.length; i++) {\n const turnRecord = asRecord(turns[i])\n const id = readNonEmptyString(turnRecord?.id)\n if (id === turnId) {\n foundTurnIndex = i\n }\n if (foundTurnIndex >= 0 && id) {\n turnIdsToRevert.add(id)\n }\n }\n\n if (turnIdsToRevert.size === 0) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No turns to revert' })\n return\n }\n\n let sessionLogRaw: string\n try {\n sessionLogRaw = await readFile(sessionPath, 'utf8')\n } catch {\n setJson(res, 200, { reverted: 0, errors: ['Could not read session log'], message: 'Session log unreadable' })\n return\n }\n\n const turnInfos = collectFileChangesForTurns(sessionLogRaw, turnIdsToRevert, cwd)\n if (turnInfos.size === 0) {\n setJson(res, 200, { reverted: 0, errors: [], message: 'No file changes to revert' })\n return\n }\n\n const result = await revertTurnFileChanges(cwd, turnInfos)\n setJson(res, 200, { ...result, message: `Reverted ${result.reverted} file change(s)` })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to revert file changes') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/transcribe') {\n const auth = await readCodexAuth()\n if (!auth) {\n setJson(res, 401, { error: 'No auth token available for transcription' })\n return\n }\n\n const rawBody = await readRawBody(req)\n const incomingCt = req.headers['content-type'] ?? 'application/octet-stream'\n const upstream = await proxyTranscribe(rawBody, incomingCt, auth.accessToken, auth.accountId)\n\n res.statusCode = upstream.status\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(upstream.body)\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/status') {\n try {\n setJson(res, 200, await readComposioStatus())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Composio status') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/connectors') {\n try {\n const query = url.searchParams.get('query') ?? ''\n const cursor = url.searchParams.get('cursor')?.trim() ?? null\n const limit = parseComposioLimit(url.searchParams.get('limit'))\n setJson(res, 200, await listComposioConnectors(query, cursor, limit))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to list Composio connectors') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/composio/connector') {\n try {\n const slug = url.searchParams.get('slug') ?? ''\n setJson(res, 200, await readComposioConnectorDetail(slug))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load Composio connector') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/link') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const slug = readNonEmptyString(payload?.slug)\n setJson(res, 200, await startComposioLink(slug))\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to start Composio login') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/login') {\n try {\n setJson(res, 200, await startComposioLogin())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to start Composio CLI login') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composio/install') {\n try {\n setJson(res, 200, await installComposioCli())\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to install Composio CLI') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/connector-logo') {\n const src = url.searchParams.get('src')?.trim() ?? ''\n if (!src) {\n setJson(res, 400, { error: 'Missing src' })\n return\n }\n try {\n const logo = await fetchConnectorLogo(src)\n res.statusCode = 200\n res.setHeader('Content-Type', logo.contentType)\n res.setHeader('Cache-Control', 'private, max-age=3600')\n res.end(logo.body)\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch connector logo') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/server-requests/respond') {\n const payload = await readJsonBody(req)\n await appServer.respondToServerRequest(payload)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/server-requests/pending') {\n setJson(res, 200, { data: appServer.listPendingServerRequests() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/methods') {\n const methods = await methodCatalog.listMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/meta/notifications') {\n const methods = await methodCatalog.listNotificationMethods()\n setJson(res, 200, { data: methods })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/provider-models') {\n try {\n const fmState = ensureDefaultFreeModeStateForMissingAuthSync(join(getCodexHomeDir(), FREE_MODE_STATE_FILE))\n if (fmState?.enabled) {\n if (fmState.provider === 'opencode-zen') {\n try {\n const modelsUrl = 'https://opencode.ai/zen/v1/models'\n const headers: Record<string, string> = {}\n if (fmState.apiKey && fmState.apiKey !== 'dummy') {\n headers['Authorization'] = `Bearer ${fmState.apiKey}`\n }\n const resp = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(8000) })\n if (resp.ok) {\n const json = await resp.json() as { data?: Array<{ id: string }> }\n const allIds = (json.data ?? []).map(m => m.id).filter(Boolean)\n const freeIds = allIds.filter(id => id.endsWith('-free') || id === 'big-pickle')\n const paidIds = allIds.filter(id => !id.endsWith('-free') && id !== 'big-pickle')\n setJson(res, 200, { data: [...freeIds, ...paidIds], exclusive: true, source: 'opencode-zen' })\n return\n }\n } catch {\n // OpenCode Zen model fetch failed\n }\n setJson(res, 200, { data: ['big-pickle', 'minimax-m2.5-free', 'nemotron-3-super-free', 'trinity-large-preview-free'], exclusive: true, source: 'opencode-zen' })\n return\n }\n if (fmState.provider === 'custom' && fmState.customBaseUrl) {\n try {\n const modelsUrl = fmState.customBaseUrl.replace(/\\/+$/, '') + '/models'\n const headers: Record<string, string> = {}\n if (fmState.apiKey && fmState.apiKey !== 'dummy') {\n headers['Authorization'] = `Bearer ${fmState.apiKey}`\n }\n const resp = await fetch(modelsUrl, { headers, signal: AbortSignal.timeout(8000) })\n if (resp.ok) {\n const json = await resp.json() as unknown\n const ids = normalizeProviderModelsData(json)\n const currentModel = fmState.model?.trim() ?? ''\n const orderedIds = currentModel && ids.includes(currentModel)\n ? [currentModel, ...ids.filter((id) => id !== currentModel)]\n : ids\n setJson(res, 200, { data: orderedIds, exclusive: true, source: 'custom' })\n return\n }\n } catch {\n // Custom endpoint model fetch failed — return empty list\n }\n setJson(res, 200, { data: [], exclusive: true, source: 'custom' })\n return\n }\n const freeModels = await getFreeModels()\n setJson(res, 200, { data: freeModels, exclusive: true })\n return\n }\n } catch {\n // No free-mode state — proceed normally\n }\n const data = await readProviderBackedModelIds(appServer)\n setJson(res, 200, data)\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/workspace-roots-state') {\n const state = await readWorkspaceRootsState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-queue-state') {\n const state = await readThreadQueueState()\n setJson(res, 200, { data: state })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/home-directory') {\n setJson(res, 200, { data: { path: homedir() } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n const baseBranch = typeof payload?.baseBranch === 'string' ? payload.baseBranch.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const repoName = basename(gitRoot) || 'repo'\n const worktreesRoot = join(getCodexHomeDir(), 'worktrees')\n await mkdir(worktreesRoot, { recursive: true })\n\n // Match Codex desktop layout so project grouping resolves to repo name:\n // ~/.codex/worktrees/<id>/<repoName>\n let worktreeId = ''\n let worktreeParent = ''\n let worktreeCwd = ''\n for (let attempt = 0; attempt < 12; attempt += 1) {\n const candidate = randomBytes(2).toString('hex')\n const parent = join(worktreesRoot, candidate)\n try {\n await stat(parent)\n continue\n } catch {\n worktreeId = candidate\n worktreeParent = parent\n worktreeCwd = join(parent, repoName)\n break\n }\n }\n if (!worktreeId || !worktreeParent || !worktreeCwd) {\n throw new Error('Failed to allocate a unique worktree id')\n }\n const startPoint = baseBranch || 'HEAD'\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '--detach', worktreeCwd, startPoint], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '--detach', worktreeCwd, startPoint], { cwd: gitRoot })\n }\n try {\n await persistWorkspaceRoot(worktreeCwd)\n } catch (error) {\n await rollbackCreatedWorktree(gitRoot, worktreeCwd, worktreeParent)\n throw error\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch: null,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/worktree/create-permanent') {\n const payload = asRecord(await readJsonBody(req))\n const rawSourceCwd = typeof payload?.sourceCwd === 'string' ? payload.sourceCwd.trim() : ''\n const rawWorktreeName = typeof payload?.worktreeName === 'string' ? payload.worktreeName.trim() : ''\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n if (!rawWorktreeName) {\n setJson(res, 400, { error: 'Missing worktreeName' })\n return\n }\n if (rawWorktreeName.includes('/') || rawWorktreeName.includes('\\\\') || rawWorktreeName === '.' || rawWorktreeName === '..') {\n setJson(res, 400, { error: 'Worktree name must be a single folder name' })\n return\n }\n\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n await runCommand('git', ['init'], { cwd: sourceCwd })\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n }\n const worktreeCwd = join(dirname(gitRoot), rawWorktreeName)\n try {\n await stat(worktreeCwd)\n setJson(res, 409, { error: 'Worktree folder already exists' })\n return\n } catch {\n // Expected for a new worktree path.\n }\n\n const branchName = await allocatePermanentWorktreeBranchName(gitRoot, rawWorktreeName)\n try {\n await runCommand('git', ['worktree', 'add', '-b', branchName, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branchName, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n try {\n await persistWorkspaceRoot(worktreeCwd)\n } catch (error) {\n await rollbackCreatedWorktree(gitRoot, worktreeCwd, undefined, branchName)\n throw error\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch: branchName,\n gitRoot,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create worktree') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/worktree/branches') {\n const rawSourceCwd = (url.searchParams.get('sourceCwd') ?? '').trim()\n if (!rawSourceCwd) {\n setJson(res, 400, { error: 'Missing sourceCwd' })\n return\n }\n const sourceCwd = isAbsolute(rawSourceCwd) ? rawSourceCwd : resolve(rawSourceCwd)\n try {\n const sourceInfo = await stat(sourceCwd)\n if (!sourceInfo.isDirectory()) {\n setJson(res, 400, { error: 'sourceCwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'sourceCwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd: sourceCwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n setJson(res, 200, { data: [] })\n return\n }\n const output = await runCommandCapture(\n 'git',\n ['for-each-ref', '--format=%(committerdate:unix)\\t%(refname)', 'refs/heads', 'refs/remotes'],\n { cwd: gitRoot },\n )\n const branchActivityByName = new Map<string, number>()\n for (const line of output.split('\\n')) {\n const [rawTimestamp = '', rawRefName = ''] = line.split('\\t')\n const normalized = normalizeBranchRefName(rawRefName)\n if (!normalized || normalized === 'origin/HEAD') continue\n const parsedTimestamp = Number.parseInt(rawTimestamp.trim(), 10)\n const timestamp = Number.isFinite(parsedTimestamp) ? parsedTimestamp : 0\n const current = branchActivityByName.get(normalized) ?? Number.MIN_SAFE_INTEGER\n if (timestamp > current) {\n branchActivityByName.set(normalized, timestamp)\n }\n }\n\n const branches = Array.from(branchActivityByName.entries())\n .map(([value]) => ({ value, label: value }))\n .sort((a, b) => {\n const aActivity = branchActivityByName.get(a.value) ?? 0\n const bActivity = branchActivityByName.get(b.value) ?? 0\n if (bActivity !== aActivity) return bActivity - aActivity\n return a.value.localeCompare(b.value)\n })\n setJson(res, 200, { data: branches })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to list branches') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/branches') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n let gitRoot = ''\n try {\n gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) throw error\n setJson(res, 200, {\n data: {\n currentBranch: null,\n options: [],\n },\n })\n return\n }\n\n const state = await readGitHeaderState(gitRoot)\n const currentBranch = state.currentBranch\n const output = await runCommandCapture(\n 'git',\n ['for-each-ref', '--format=%(committerdate:unix)\\t%(refname)\\t%(objectname)', 'refs/heads', 'refs/remotes'],\n { cwd: gitRoot },\n )\n const branchActivityByName = new Map<string, { timestamp: number; isRemote: boolean }>()\n for (const line of output.split('\\n')) {\n const [rawTimestamp = '', rawRefName = ''] = line.split('\\t')\n const normalized = normalizeBranchRefName(rawRefName)\n if (!normalized || normalized === 'origin/HEAD') continue\n const parsedTimestamp = Number.parseInt(rawTimestamp.trim(), 10)\n const timestamp = Number.isFinite(parsedTimestamp) ? parsedTimestamp : 0\n const isRemote = rawRefName.trim().startsWith('refs/remotes/')\n const current = branchActivityByName.get(normalized)\n if (!current || timestamp > current.timestamp) {\n branchActivityByName.set(normalized, { timestamp, isRemote })\n }\n }\n if (currentBranch && !branchActivityByName.has(currentBranch)) {\n branchActivityByName.set(currentBranch, { timestamp: Number.MAX_SAFE_INTEGER, isRemote: false })\n }\n const options = Array.from(branchActivityByName.entries())\n .map(([value, metadata]) => ({\n value,\n label: value,\n isCurrent: value === currentBranch,\n isRemote: metadata.isRemote,\n }))\n .sort((a, b) => {\n const aActivity = branchActivityByName.get(a.value)?.timestamp ?? 0\n const bActivity = branchActivityByName.get(b.value)?.timestamp ?? 0\n if (bActivity !== aActivity) return bActivity - aActivity\n return a.value.localeCompare(b.value)\n })\n setJson(res, 200, {\n data: {\n ...state,\n options,\n },\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Git branches') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/repository-status') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n setJson(res, 200, {\n data: {\n isGitRepo: true,\n gitRoot,\n },\n })\n } catch (error) {\n if (!isNotGitRepositoryError(error)) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to read Git repository status') })\n return\n }\n setJson(res, 200, {\n data: {\n isGitRepo: false,\n gitRoot: '',\n },\n })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/git/checkout') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const rawCwd = readNonEmptyString(record.cwd)\n const targetBranch = readNonEmptyString(record.branch)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!targetBranch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const cwdInfo = await stat(cwd)\n if (!cwdInfo.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await assertNoTrackedGitChanges(gitRoot)\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, targetBranch)\n setJson(res, 200, { data: await readGitHeaderState(gitRoot) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to switch branch') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/git/branch-commits') {\n const rawCwd = (url.searchParams.get('cwd') ?? '').trim()\n const branch = (url.searchParams.get('branch') ?? '').trim()\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!branch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await runCommandCapture('git', ['rev-parse', '--verify', `${branch}^{commit}`], { cwd: gitRoot })\n const resetHistoryRefPrefix = `refs/codex/header-git-reset-history/${branch}/`\n const resetHistoryRefsRaw = await runCommandCapture(\n 'git',\n ['for-each-ref', '--sort=-creatordate', '--format=%(refname)', resetHistoryRefPrefix],\n { cwd: gitRoot },\n ).catch(() => '')\n const resetHistoryRefs = resetHistoryRefsRaw\n .split('\\n')\n .map((entry) => entry.trim())\n .filter(Boolean)\n .slice(0, HEADER_GIT_RESET_HISTORY_REF_LIMIT)\n const output = await runCommandCapture(\n 'git',\n ['log', '-n', '12', '--date=short', '--format=%H%x09%h%x09%cd%x09%s', branch, ...resetHistoryRefs],\n { cwd: gitRoot },\n )\n const commits = output.split('\\n').flatMap((line) => {\n const [sha = '', shortSha = '', date = '', ...subjectParts] = line.split('\\t')\n const subject = subjectParts.join('\\t').trim()\n return sha.trim() && shortSha.trim()\n ? [{ sha: sha.trim(), shortSha: shortSha.trim(), date: date.trim(), subject: subject || shortSha.trim() }]\n : []\n })\n setJson(res, 200, { data: commits })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load branch commits') })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/git/reset-to-commit') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n const rawCwd = readNonEmptyString(record.cwd)\n const branch = readNonEmptyString(record.branch)\n const sha = readNonEmptyString(record.sha)\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n if (!branch) {\n setJson(res, 400, { error: 'Missing branch' })\n return\n }\n if (!sha) {\n setJson(res, 400, { error: 'Missing commit' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const gitRoot = await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n await assertNoTrackedGitChanges(gitRoot)\n await assertLocalGitBranch(gitRoot, branch)\n const currentBranch = (await runCommandCapture('git', ['branch', '--show-current'], { cwd: gitRoot })).trim()\n if (currentBranch && currentBranch !== branch) {\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, branch)\n } else if (!currentBranch) {\n await checkoutGitBranchWithWorktreeRecovery(gitRoot, branch)\n }\n const previousTip = await runCommandCapture('git', ['rev-parse', 'HEAD'], { cwd: gitRoot })\n const targetSha = await runCommandCapture('git', ['rev-parse', '--verify', `${sha}^{commit}`], { cwd: gitRoot })\n await runCommand('git', ['update-ref', toHeaderGitResetHistoryRef(branch, previousTip.trim()), previousTip.trim()], { cwd: gitRoot })\n await pruneHeaderGitResetHistoryRefs(gitRoot, branch)\n await runCommand('git', ['reset', '--hard', targetSha.trim()], { cwd: gitRoot })\n setJson(res, 200, { data: await readGitHeaderState(gitRoot) })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to reset branch to commit') })\n }\n return\n }\n\n\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/workspace-roots-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n await updateWorkspaceRootsState((existingState) => ({\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n projectOrder: Array.isArray(record.projectOrder)\n ? normalizeStringArray(record.projectOrder)\n : existingState.projectOrder,\n remoteProjects: existingState.remoteProjects,\n }))\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-queue-state') {\n const payload = await readJsonBody(req)\n const record = asRecord(payload)\n if (!record) {\n setJson(res, 400, { error: 'Invalid body: expected object' })\n return\n }\n await writeThreadQueueState(normalizeThreadQueueState(record))\n void backendQueueProcessor.scheduleAllQueuedThreads()\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/project-root') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n const createIfMissing = payload?.createIfMissing === true\n const label = typeof payload?.label === 'string' ? payload.label : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n let pathExists = true\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n pathExists = false\n }\n\n if (!pathExists && createIfMissing) {\n await mkdir(normalizedPath, { recursive: true })\n } else if (!pathExists) {\n setJson(res, 404, { error: 'Directory does not exist' })\n return\n }\n\n await persistWorkspaceRoot(normalizedPath, label)\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/local-directory') {\n const payload = asRecord(await readJsonBody(req))\n const rawPath = typeof payload?.path === 'string' ? payload.path.trim() : ''\n if (!rawPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n\n const normalizedPath = isAbsolute(rawPath) ? rawPath : resolve(rawPath)\n try {\n const info = await stat(normalizedPath)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'Path exists but is not a directory' })\n return\n }\n } catch {\n await mkdir(normalizedPath, { recursive: true })\n }\n\n setJson(res, 200, { data: { path: normalizedPath } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/github-clone') {\n const payload = asRecord(await readJsonBody(req))\n const repoUrl = typeof payload?.url === 'string' ? payload.url.trim() : ''\n const basePath = typeof payload?.basePath === 'string' ? payload.basePath.trim() : ''\n try {\n const clonedPath = await cloneGithubRepositoryIntoBase(repoUrl, basePath)\n setJson(res, 200, { data: { path: clonedPath } })\n } catch (error) {\n setJson(res, 400, { error: error instanceof Error ? error.message : 'Failed to clone GitHub repository' })\n }\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/projectless-thread-cwd') {\n const payload = asRecord(await readJsonBody(req))\n const prompt = typeof payload?.prompt === 'string' ? payload.prompt : null\n try {\n const directory = await createProjectlessThreadDirectory(prompt)\n setJson(res, 200, { data: directory })\n } catch (error) {\n setJson(res, 500, { error: error instanceof Error ? error.message : 'Failed to create new chat folder' })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-root-suggestion') {\n const basePath = url.searchParams.get('basePath')?.trim() ?? ''\n if (!basePath) {\n setJson(res, 400, { error: 'Missing basePath' })\n return\n }\n const normalizedBasePath = isAbsolute(basePath) ? basePath : resolve(basePath)\n try {\n const baseInfo = await stat(normalizedBasePath)\n if (!baseInfo.isDirectory()) {\n setJson(res, 400, { error: 'basePath is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'basePath does not exist' })\n return\n }\n\n let index = 1\n while (index < 100000) {\n const candidateName = `New Project (${String(index)})`\n const candidatePath = join(normalizedBasePath, candidateName)\n try {\n await stat(candidatePath)\n index += 1\n continue\n } catch {\n setJson(res, 200, { data: { name: candidateName, path: candidatePath } })\n return\n }\n }\n\n setJson(res, 500, { error: 'Failed to compute project name suggestion' })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/composer-file-search') {\n const payload = asRecord(await readJsonBody(req))\n const rawCwd = typeof payload?.cwd === 'string' ? payload.cwd.trim() : ''\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 20\n const limit = Math.max(1, Math.min(100, Math.floor(limitRaw)))\n if (!rawCwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return\n }\n const cwd = isAbsolute(rawCwd) ? rawCwd : resolve(rawCwd)\n try {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n setJson(res, 400, { error: 'cwd is not a directory' })\n return\n }\n } catch {\n setJson(res, 404, { error: 'cwd does not exist' })\n return\n }\n\n try {\n const files = await listFilesWithRipgrep(cwd)\n const scored = files\n .map((path) => ({ path, score: scoreFileCandidate(path, query) }))\n .filter((row) => query.length === 0 || row.score < 10)\n .sort((a, b) => (a.score - b.score) || a.path.localeCompare(b.path))\n .slice(0, limit)\n .map((row) => ({ path: row.path }))\n setJson(res, 200, { data: scored })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to search files') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/prompts') {\n setJson(res, 200, { data: await listComposerPrompts() })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/prompts') {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const content = typeof payload?.content === 'string' ? payload.content : ''\n if (!name || !content.trim()) {\n setJson(res, 400, { error: 'Prompt name and content are required' })\n return\n }\n try {\n const prompt = await createComposerPromptFile(name, content)\n setJson(res, 200, { data: prompt })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to create prompt') })\n }\n return\n }\n\n if (req.method === 'DELETE' && url.pathname === '/codex-api/prompts') {\n const promptPath = url.searchParams.get('path')?.trim() ?? ''\n if (!promptPath) {\n setJson(res, 400, { error: 'Missing path' })\n return\n }\n try {\n const removed = await removeComposerPromptFile(promptPath)\n setJson(res, 200, { data: { removed } })\n } catch (error) {\n setJson(res, 400, { error: getErrorMessage(error, 'Failed to remove prompt') })\n }\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-titles') {\n const cache = await readMergedThreadTitleCache()\n setJson(res, 200, { data: cache })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-pins') {\n const threadIds = await readPinnedThreadIds()\n setJson(res, 200, { data: { threadIds } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/preferences/first-launch-plugins-card') {\n const dismissed = await readFirstLaunchPluginsCardDismissed()\n setJson(res, 200, { data: { dismissed } })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-automations') {\n const automationsByThreadId = await listThreadHeartbeatAutomations()\n setJson(res, 200, { data: automationsByThreadId })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-automations') {\n const automationsByProjectName = await listProjectCronAutomations()\n setJson(res, 200, { data: automationsByProjectName })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/thread-automation') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const automation = automationId\n ? await readThreadHeartbeatAutomation(threadId, automationId)\n : await readThreadHeartbeatAutomations(threadId)\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/project-automation') {\n const projectName = url.searchParams.get('projectName')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!projectName) {\n setJson(res, 400, { error: 'Missing projectName' })\n return\n }\n const automation = automationId\n ? await readProjectCronAutomation(projectName, automationId)\n : await readProjectCronAutomations(projectName)\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-search') {\n const payload = asRecord(await readJsonBody(req))\n const query = typeof payload?.query === 'string' ? payload.query.trim() : ''\n const limitRaw = typeof payload?.limit === 'number' ? payload.limit : 200\n const limit = Math.max(1, Math.min(1000, Math.floor(limitRaw)))\n if (!query) {\n setJson(res, 200, { data: { threadIds: [], indexedThreadCount: 0 } })\n return\n }\n\n const index = await getThreadSearchIndex()\n const matchedIds = Array.from(index.docsById.entries())\n .filter(([, doc]) => isExactPhraseMatch(query, doc))\n .slice(0, limit)\n .map(([id]) => id)\n\n setJson(res, 200, { data: { threadIds: matchedIds, indexedThreadCount: index.docsById.size } })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-titles') {\n const payload = asRecord(await readJsonBody(req))\n const id = typeof payload?.id === 'string' ? payload.id : ''\n const title = typeof payload?.title === 'string' ? payload.title : ''\n if (!id) {\n setJson(res, 400, { error: 'Missing id' })\n return\n }\n const cache = await readThreadTitleCache()\n const next = title ? updateThreadTitleCache(cache, id, title) : removeFromThreadTitleCache(cache, id)\n await writeThreadTitleCache(next)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-pins') {\n const payload = asRecord(await readJsonBody(req))\n const threadIds = normalizePinnedThreadIds(payload?.threadIds)\n await writePinnedThreadIds(threadIds)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/preferences/first-launch-plugins-card') {\n const payload = asRecord(await readJsonBody(req))\n const dismissed = payload?.dismissed === true\n await writeFirstLaunchPluginsCardDismissed(dismissed)\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/thread-automation') {\n const payload = asRecord(await readJsonBody(req))\n const threadId = typeof payload?.threadId === 'string' ? payload.threadId.trim() : ''\n const id = typeof payload?.id === 'string' ? payload.id.trim() : ''\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const prompt = typeof payload?.prompt === 'string' ? payload.prompt.trim() : ''\n const rrule = typeof payload?.rrule === 'string' ? payload.rrule.trim() : ''\n const status = payload?.status === 'PAUSED' ? 'PAUSED' : 'ACTIVE'\n if (!threadId || !name || !prompt || !rrule) {\n setJson(res, 400, { error: 'threadId, name, prompt, and rrule are required' })\n return\n }\n const automation = await writeThreadHeartbeatAutomation({ threadId, id, name, prompt, rrule, status })\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'PUT' && url.pathname === '/codex-api/project-automation') {\n const payload = asRecord(await readJsonBody(req))\n const projectName = typeof payload?.projectName === 'string' ? payload.projectName.trim() : ''\n const id = typeof payload?.id === 'string' ? payload.id.trim() : ''\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const prompt = typeof payload?.prompt === 'string' ? payload.prompt.trim() : ''\n const rrule = typeof payload?.rrule === 'string' ? payload.rrule.trim() : ''\n const status = payload?.status === 'PAUSED' ? 'PAUSED' : 'ACTIVE'\n if (!projectName || !name || !prompt || !rrule) {\n setJson(res, 400, { error: 'projectName, name, prompt, and rrule are required' })\n return\n }\n if (!isAbsoluteLikePath(projectName)) {\n setJson(res, 400, { error: 'Project automation cwd must be an absolute path' })\n return\n }\n const automation = await writeProjectCronAutomation({ projectName, id, name, prompt, rrule, status })\n setJson(res, 200, { data: automation })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/thread-automation/run') {\n const payload = asRecord(await readJsonBody(req))\n const threadId = typeof payload?.threadId === 'string' ? payload.threadId.trim() : ''\n const automationId = typeof payload?.automationId === 'string' ? payload.automationId.trim() : ''\n if (!threadId || !automationId) {\n setJson(res, 400, { error: 'threadId and automationId are required' })\n return\n }\n const automation = await readThreadHeartbeatAutomation(threadId, automationId)\n if (!automation) {\n setJson(res, 404, { error: 'Automation not found for thread' })\n return\n }\n await appendThreadQueuedMessage(threadId, buildHeartbeatQueuedMessage(automation))\n backendQueueProcessor.scheduleThreadQueueDrain(threadId, 0)\n setJson(res, 200, { data: { queued: true } })\n return\n }\n\n if (req.method === 'DELETE' && url.pathname === '/codex-api/thread-automation') {\n const threadId = url.searchParams.get('threadId')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!threadId) {\n setJson(res, 400, { error: 'Missing threadId' })\n return\n }\n const removed = await deleteThreadHeartbeatAutomation(threadId, automationId)\n setJson(res, 200, { data: { removed } })\n return\n }\n\n if (req.method === 'DELETE' && url.pathname === '/codex-api/project-automation') {\n const projectName = url.searchParams.get('projectName')?.trim() ?? ''\n const automationId = url.searchParams.get('automationId')?.trim() ?? ''\n if (!projectName) {\n setJson(res, 400, { error: 'Missing projectName' })\n return\n }\n const removed = await deleteProjectCronAutomation(projectName, automationId)\n setJson(res, 200, { data: { removed } })\n return\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/telegram/configure-bot') {\n const payload = asRecord(await readJsonBody(req))\n const botToken = typeof payload?.botToken === 'string' ? payload.botToken.trim() : ''\n const rawAllowedUserIds = Array.isArray(payload?.allowedUserIds) ? payload.allowedUserIds : []\n if (!botToken) {\n setJson(res, 400, { error: 'Missing botToken' })\n return\n }\n const config = normalizeTelegramBridgeConfig({\n botToken,\n allowedUserIds: rawAllowedUserIds,\n })\n if (config.allowedUserIds.length === 0) {\n setJson(res, 400, { error: 'At least one allowed Telegram user ID is required' })\n return\n }\n\n telegramBridge.configureToken(config.botToken)\n telegramBridge.configureAllowedUserIds(config.allowedUserIds)\n telegramBridge.start()\n const existingConfig = await readTelegramBridgeConfig()\n await writeTelegramBridgeConfig({\n botToken: config.botToken,\n chatIds: existingConfig.chatIds,\n allowedUserIds: config.allowedUserIds,\n })\n setJson(res, 200, { ok: true })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/telegram/config') {\n const config = await readTelegramBridgeConfig()\n setJson(res, 200, {\n data: {\n botToken: config.botToken,\n allowedUserIds: config.allowedUserIds,\n },\n })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/telegram/status') {\n setJson(res, 200, { data: telegramBridge.getStatus() })\n return\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/events') {\n res.statusCode = 200\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8')\n res.setHeader('Cache-Control', 'no-cache, no-transform')\n res.setHeader('Connection', 'keep-alive')\n res.setHeader('X-Accel-Buffering', 'no')\n\n const unsubscribe = middleware.subscribeNotifications((notification: { method: string; params: unknown; atIso: string }) => {\n if (res.writableEnded || res.destroyed) return\n res.write(`data: ${JSON.stringify(notification)}\\n\\n`)\n })\n\n res.write(`event: ready\\ndata: ${JSON.stringify({ ok: true })}\\n\\n`)\n const keepAlive = setInterval(() => {\n res.write(': ping\\n\\n')\n }, 15000)\n\n const close = () => {\n clearInterval(keepAlive)\n unsubscribe()\n if (!res.writableEnded) {\n res.end()\n }\n }\n\n req.on('close', close)\n req.on('aborted', close)\n return\n }\n\n next()\n } catch (error) {\n const message = getErrorMessage(error, 'Unknown bridge error')\n setJson(res, 502, { error: message })\n }\n }\n\n middleware.dispose = () => {\n threadSearchIndex = null\n telegramBridge.stop()\n terminalManager.dispose()\n backendQueueProcessor.dispose()\n appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n const unsubscribeAppServer = appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n const unsubscribeTerminal = terminalManager.subscribe((notification) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n return () => {\n unsubscribeAppServer()\n unsubscribeTerminal()\n }\n }\n\n return middleware\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { createHash } from 'node:crypto'\nimport { mkdtemp, mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { buildAppServerArgs } from './appServerRuntimeConfig.js'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n listPendingServerRequests(): unknown[]\n dispose(): void\n}\n\ntype AccountRouteContext = {\n appServer: AppServerLike\n}\n\ntype StoredRateLimitWindow = {\n usedPercent: number\n windowMinutes: number | null\n resetsAt: number | null\n}\n\ntype StoredCreditsSnapshot = {\n hasCredits: boolean\n unlimited: boolean\n balance: string | null\n}\n\ntype StoredRateLimitSnapshot = {\n limitId: string | null\n limitName: string | null\n primary: StoredRateLimitWindow | null\n secondary: StoredRateLimitWindow | null\n credits: StoredCreditsSnapshot | null\n planType: string | null\n}\n\ntype AccountQuotaStatus = 'idle' | 'loading' | 'ready' | 'error'\ntype AccountUnavailableReason = 'payment_required'\n\ntype StoredAccountEntry = {\n accountId: string\n storageId: string\n authMode: string | null\n email: string | null\n planType: string | null\n lastRefreshedAtIso: string\n lastActivatedAtIso: string | null\n quotaSnapshot: StoredRateLimitSnapshot | null\n quotaUpdatedAtIso: string | null\n quotaStatus: AccountQuotaStatus\n quotaError: string | null\n unavailableReason: AccountUnavailableReason | null\n}\n\ntype StoredAccountsState = {\n activeAccountId: string | null\n accounts: StoredAccountEntry[]\n}\n\ntype AuthFile = {\n auth_mode?: string\n tokens?: {\n access_token?: string\n account_id?: string\n }\n}\n\ntype TokenMetadata = {\n email: string | null\n planType: string | null\n}\n\ntype AccountInspection = {\n metadata: TokenMetadata\n quotaSnapshot: StoredRateLimitSnapshot | null\n}\n\nconst ACCOUNT_QUOTA_REFRESH_TTL_MS = 5 * 60 * 1000\nconst ACCOUNT_QUOTA_LOADING_STALE_MS = 2 * 60 * 1000\nconst ACCOUNT_INSPECTION_TIMEOUT_MS = 25 * 1000\nconst LOGIN_URL_TIMEOUT_MS = 15 * 1000\nconst LOGIN_CALLBACK_TIMEOUT_MS = 20 * 1000\nconst LOGIN_AUTH_FILE_TIMEOUT_MS = 10 * 1000\n\nlet backgroundRefreshPromise: Promise<void> | null = null\nlet activeLogin: {\n proc: ChildProcessWithoutNullStreams\n loginUrl: string | null\n output: string\n exited: boolean\n exitCode: number | null\n exitSignal: NodeJS.Signals | null\n exitPromise: Promise<void>\n} | null = null\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction readString(value: unknown): string | null {\n return typeof value === 'string' && value.trim().length > 0 ? value.trim() : null\n}\n\nfunction readNumber(value: unknown): number | null {\n return typeof value === 'number' && Number.isFinite(value) ? value : null\n}\n\nfunction readBoolean(value: unknown): boolean | null {\n return typeof value === 'boolean' ? value : null\n}\n\nfunction normalizeAccountUnavailableReason(value: unknown): AccountUnavailableReason | null {\n return value === 'payment_required' ? value : null\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nasync function readJsonBody(req: IncomingMessage): Promise<Record<string, unknown> | null> {\n const rawBody = await new Promise<string>((resolve, reject) => {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => resolve(body))\n req.on('error', reject)\n })\n return asRecord(rawBody.length > 0 ? JSON.parse(rawBody) : {})\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n const error = record?.error\n if (typeof error === 'string' && error.trim().length > 0) {\n return error.trim()\n }\n if (typeof record?.message === 'string' && record.message.trim().length > 0) {\n return record.message.trim()\n }\n return fallback\n}\n\nfunction isPaymentRequiredErrorMessage(value: string | null): boolean {\n if (!value) return false\n const normalized = value.toLowerCase()\n return normalized.includes('payment required') || /\\b402\\b/.test(normalized)\n}\n\nfunction detectAccountUnavailableReason(error: unknown): AccountUnavailableReason | null {\n return isPaymentRequiredErrorMessage(getErrorMessage(error, '')) ? 'payment_required' : null\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getActiveAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\nfunction getAccountsStatePath(): string {\n return join(getCodexHomeDir(), 'accounts.json')\n}\n\nfunction getAccountsSnapshotRoot(): string {\n return join(getCodexHomeDir(), 'accounts')\n}\n\nfunction toStorageId(accountId: string): string {\n return createHash('sha256').update(accountId).digest('hex')\n}\n\nfunction normalizeRateLimitWindow(value: unknown): StoredRateLimitWindow | null {\n const record = asRecord(value)\n if (!record) return null\n\n const usedPercent = readNumber(record.usedPercent ?? record.used_percent)\n if (usedPercent === null) return null\n\n return {\n usedPercent,\n windowMinutes: readNumber(record.windowDurationMins ?? record.window_minutes),\n resetsAt: readNumber(record.resetsAt ?? record.resets_at),\n }\n}\n\nfunction normalizeCreditsSnapshot(value: unknown): StoredCreditsSnapshot | null {\n const record = asRecord(value)\n if (!record) return null\n\n const hasCredits = readBoolean(record.hasCredits ?? record.has_credits)\n const unlimited = readBoolean(record.unlimited)\n if (hasCredits === null || unlimited === null) return null\n\n return {\n hasCredits,\n unlimited,\n balance: readString(record.balance),\n }\n}\n\nfunction normalizeRateLimitSnapshot(value: unknown): StoredRateLimitSnapshot | null {\n const record = asRecord(value)\n if (!record) return null\n\n const primary = normalizeRateLimitWindow(record.primary)\n const secondary = normalizeRateLimitWindow(record.secondary)\n const credits = normalizeCreditsSnapshot(record.credits)\n\n if (!primary && !secondary && !credits) return null\n\n return {\n limitId: readString(record.limitId ?? record.limit_id),\n limitName: readString(record.limitName ?? record.limit_name),\n primary,\n secondary,\n credits,\n planType: readString(record.planType ?? record.plan_type),\n }\n}\n\nfunction pickCodexRateLimitSnapshot(payload: unknown): StoredRateLimitSnapshot | null {\n const record = asRecord(payload)\n if (!record) return null\n\n const rateLimitsByLimitId = asRecord(record.rateLimitsByLimitId ?? record.rate_limits_by_limit_id)\n const codexBucket = normalizeRateLimitSnapshot(rateLimitsByLimitId?.codex)\n if (codexBucket) return codexBucket\n\n return normalizeRateLimitSnapshot(record.rateLimits ?? record.rate_limits)\n}\n\nfunction normalizeStoredAccountEntry(value: unknown): StoredAccountEntry | null {\n const record = asRecord(value)\n const accountId = readString(record?.accountId)\n const storageId = readString(record?.storageId)\n const lastRefreshedAtIso = readString(record?.lastRefreshedAtIso)\n const quotaStatusRaw = readString(record?.quotaStatus)\n const quotaStatus: AccountQuotaStatus =\n quotaStatusRaw === 'loading' || quotaStatusRaw === 'ready' || quotaStatusRaw === 'error' ? quotaStatusRaw : 'idle'\n if (!accountId || !storageId || !lastRefreshedAtIso) return null\n\n return {\n accountId,\n storageId,\n authMode: readString(record?.authMode),\n email: readString(record?.email),\n planType: readString(record?.planType),\n lastRefreshedAtIso,\n lastActivatedAtIso: readString(record?.lastActivatedAtIso),\n quotaSnapshot: normalizeRateLimitSnapshot(record?.quotaSnapshot),\n quotaUpdatedAtIso: readString(record?.quotaUpdatedAtIso),\n quotaStatus,\n quotaError: readString(record?.quotaError),\n unavailableReason: normalizeAccountUnavailableReason(record?.unavailableReason)\n ?? (isPaymentRequiredErrorMessage(readString(record?.quotaError)) ? 'payment_required' : null),\n }\n}\n\nasync function readStoredAccountsState(): Promise<StoredAccountsState> {\n try {\n const raw = await readFile(getAccountsStatePath(), 'utf8')\n const parsed = asRecord(JSON.parse(raw))\n const activeAccountId = readString(parsed?.activeAccountId)\n const rawAccounts = Array.isArray(parsed?.accounts) ? parsed.accounts : []\n const accounts = rawAccounts\n .map((entry) => normalizeStoredAccountEntry(entry))\n .filter((entry): entry is StoredAccountEntry => entry !== null)\n return { activeAccountId, accounts }\n } catch {\n return { activeAccountId: null, accounts: [] }\n }\n}\n\nasync function writeStoredAccountsState(state: StoredAccountsState): Promise<void> {\n await writeFile(getAccountsStatePath(), JSON.stringify(state, null, 2), { encoding: 'utf8', mode: 0o600 })\n}\n\nfunction withUpsertedAccount(state: StoredAccountsState, nextEntry: StoredAccountEntry): StoredAccountsState {\n const rest = state.accounts.filter((entry) => entry.accountId !== nextEntry.accountId)\n return {\n activeAccountId: state.activeAccountId,\n accounts: [nextEntry, ...rest],\n }\n}\n\nfunction sortAccounts(accounts: StoredAccountEntry[], activeAccountId: string | null): StoredAccountEntry[] {\n return [...accounts].sort((left, right) => {\n const leftActive = left.accountId === activeAccountId ? 1 : 0\n const rightActive = right.accountId === activeAccountId ? 1 : 0\n if (leftActive !== rightActive) return rightActive - leftActive\n return right.lastRefreshedAtIso.localeCompare(left.lastRefreshedAtIso)\n })\n}\n\nfunction toPublicAccountEntry(entry: StoredAccountEntry, activeAccountId: string | null): StoredAccountEntry & { isActive: boolean } {\n return {\n ...entry,\n isActive: entry.accountId === activeAccountId,\n }\n}\n\nfunction decodeBase64UrlJson(input: string): Record<string, unknown> | null {\n try {\n const normalized = input.replace(/-/g, '+').replace(/_/g, '/')\n const padding = normalized.length % 4 === 0 ? '' : '='.repeat(4 - (normalized.length % 4))\n const raw = Buffer.from(`${normalized}${padding}`, 'base64').toString('utf8')\n const parsed = JSON.parse(raw) as unknown\n return asRecord(parsed)\n } catch {\n return null\n }\n}\n\nfunction extractTokenMetadata(accessToken: string | undefined): TokenMetadata {\n if (!accessToken || typeof accessToken !== 'string') {\n return { email: null, planType: null }\n }\n const parts = accessToken.split('.')\n if (parts.length < 2) {\n return { email: null, planType: null }\n }\n const payload = decodeBase64UrlJson(parts[1] ?? '')\n const profile = asRecord(payload?.['https://api.openai.com/profile'])\n const auth = asRecord(payload?.['https://api.openai.com/auth'])\n return {\n email: typeof profile?.email === 'string' && profile.email.trim().length > 0 ? profile.email.trim() : null,\n planType:\n typeof auth?.chatgpt_plan_type === 'string' && auth.chatgpt_plan_type.trim().length > 0\n ? auth.chatgpt_plan_type.trim()\n : null,\n }\n}\n\nasync function readAuthFileFromPath(path: string): Promise<{ raw: string; parsed: AuthFile; accountId: string; authMode: string | null; metadata: TokenMetadata }> {\n const raw = await readFile(path, 'utf8')\n const parsed = JSON.parse(raw) as AuthFile\n const accountId = parsed.tokens?.account_id?.trim() ?? ''\n if (!accountId) {\n throw new Error('missing_account_id')\n }\n return {\n raw,\n parsed,\n accountId,\n authMode: typeof parsed.auth_mode === 'string' && parsed.auth_mode.trim().length > 0 ? parsed.auth_mode.trim() : null,\n metadata: extractTokenMetadata(parsed.tokens?.access_token),\n }\n}\n\nfunction getSnapshotPath(storageId: string): string {\n return join(getAccountsSnapshotRoot(), storageId, 'auth.json')\n}\n\nasync function writeSnapshot(storageId: string, raw: string): Promise<void> {\n const dir = join(getAccountsSnapshotRoot(), storageId)\n await mkdir(dir, { recursive: true, mode: 0o700 })\n await writeFile(getSnapshotPath(storageId), raw, { encoding: 'utf8', mode: 0o600 })\n}\n\nasync function removeSnapshot(storageId: string): Promise<void> {\n await rm(join(getAccountsSnapshotRoot(), storageId), { recursive: true, force: true })\n}\n\nasync function readRuntimeAccountMetadata(appServer: AppServerLike): Promise<TokenMetadata> {\n const payload = asRecord(await appServer.rpc('account/read', { refreshToken: false }))\n const account = asRecord(payload?.account)\n return {\n email: typeof account?.email === 'string' && account.email.trim().length > 0 ? account.email.trim() : null,\n planType: typeof account?.planType === 'string' && account.planType.trim().length > 0 ? account.planType.trim() : null,\n }\n}\n\nasync function validateSwitchedAccount(appServer: AppServerLike): Promise<AccountInspection> {\n const metadata = await readRuntimeAccountMetadata(appServer)\n const quotaPayload = await appServer.rpc('account/rateLimits/read', null)\n return {\n metadata,\n quotaSnapshot: pickCodexRateLimitSnapshot(quotaPayload),\n }\n}\n\nasync function restoreActiveAuth(raw: string | null): Promise<void> {\n const path = getActiveAuthPath()\n if (raw === null) {\n await rm(path, { force: true })\n return\n }\n await writeFile(path, raw, { encoding: 'utf8', mode: 0o600 })\n}\n\nasync function fileExists(path: string): Promise<boolean> {\n try {\n await stat(path)\n return true\n } catch {\n return false\n }\n}\n\nasync function withTemporaryCodexAppServer<T>(\n authRaw: string,\n run: (rpc: (method: string, params: unknown) => Promise<unknown>) => Promise<T>,\n): Promise<T> {\n const tempCodexHome = await mkdtemp(join(tmpdir(), 'codexui-account-'))\n const authPath = join(tempCodexHome, 'auth.json')\n await writeFile(authPath, authRaw, { encoding: 'utf8', mode: 0o600 })\n\n const proc = spawn('codex', buildAppServerArgs(), {\n env: { ...process.env, CODEX_HOME: tempCodexHome },\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n\n let disposed = false\n let initialized = false\n let initializePromise: Promise<void> | null = null\n let readBuffer = ''\n let nextId = 1\n const pending = new Map<number, { resolve: (value: unknown) => void; reject: (reason?: unknown) => void }>()\n\n const rejectAllPending = (error: Error) => {\n for (const request of pending.values()) {\n request.reject(error)\n }\n pending.clear()\n }\n\n proc.stdout.setEncoding('utf8')\n proc.stdout.on('data', (chunk: string) => {\n readBuffer += chunk\n let lineEnd = readBuffer.indexOf('\\n')\n while (lineEnd !== -1) {\n const line = readBuffer.slice(0, lineEnd).trim()\n readBuffer = readBuffer.slice(lineEnd + 1)\n if (line.length > 0) {\n try {\n const message = JSON.parse(line) as { id?: number; result?: unknown; error?: { message?: string } }\n if (typeof message.id === 'number' && pending.has(message.id)) {\n const current = pending.get(message.id)\n pending.delete(message.id)\n if (!current) {\n lineEnd = readBuffer.indexOf('\\n')\n continue\n }\n if (message.error?.message) {\n current.reject(new Error(message.error.message))\n } else {\n current.resolve(message.result)\n }\n }\n } catch {\n // Ignore malformed lines and unrelated notifications.\n }\n }\n lineEnd = readBuffer.indexOf('\\n')\n }\n })\n\n proc.stderr.setEncoding('utf8')\n proc.stderr.on('data', () => {\n // JSON-RPC errors are surfaced through stdout responses.\n })\n\n proc.on('error', (error) => {\n rejectAllPending(error instanceof Error ? error : new Error('codex app-server failed to start'))\n })\n\n proc.on('exit', () => {\n if (disposed) return\n rejectAllPending(new Error('codex app-server exited unexpectedly'))\n })\n\n const sendLine = (payload: Record<string, unknown>) => {\n proc.stdin.write(`${JSON.stringify(payload)}\\n`)\n }\n\n const call = async (method: string, params: unknown): Promise<unknown> => {\n const id = nextId++\n return await new Promise((resolve, reject) => {\n pending.set(id, { resolve, reject })\n sendLine({\n jsonrpc: '2.0',\n id,\n method,\n params,\n })\n })\n }\n\n const ensureInitialized = async (): Promise<void> => {\n if (initialized) return\n if (initializePromise) {\n await initializePromise\n return\n }\n\n initializePromise = call('initialize', {\n clientInfo: {\n name: 'codexui-account-refresh',\n version: '0.1.0',\n },\n capabilities: {\n experimentalApi: true,\n },\n }).then(() => {\n sendLine({\n jsonrpc: '2.0',\n method: 'initialized',\n })\n initialized = true\n }).finally(() => {\n initializePromise = null\n })\n\n await initializePromise\n }\n\n const dispose = async () => {\n if (disposed) return\n disposed = true\n rejectAllPending(new Error('codex app-server stopped'))\n try {\n proc.stdin.end()\n } catch {\n // ignore\n }\n try {\n proc.kill('SIGTERM')\n } catch {\n // ignore\n }\n await rm(tempCodexHome, { recursive: true, force: true })\n }\n\n try {\n await ensureInitialized()\n return await run(call)\n } finally {\n await dispose()\n }\n}\n\nasync function inspectStoredAccount(entry: StoredAccountEntry): Promise<AccountInspection> {\n const snapshotPath = getSnapshotPath(entry.storageId)\n const authRaw = await readFile(snapshotPath, 'utf8')\n return await withTemporaryCodexAppServer(authRaw, async (rpc) => {\n const accountPayload = asRecord(await rpc('account/read', { refreshToken: false }))\n const account = asRecord(accountPayload?.account)\n const quotaPayload = await rpc('account/rateLimits/read', null)\n return {\n metadata: {\n email: typeof account?.email === 'string' && account.email.trim().length > 0 ? account.email.trim() : entry.email,\n planType: typeof account?.planType === 'string' && account.planType.trim().length > 0 ? account.planType.trim() : entry.planType,\n },\n quotaSnapshot: pickCodexRateLimitSnapshot(quotaPayload),\n }\n })\n}\n\nasync function inspectStoredAccountWithTimeout(entry: StoredAccountEntry): Promise<AccountInspection> {\n let timeoutHandle: NodeJS.Timeout | null = null\n try {\n return await Promise.race<AccountInspection>([\n inspectStoredAccount(entry),\n new Promise<AccountInspection>((_, reject) => {\n timeoutHandle = setTimeout(() => {\n reject(new Error(`Account quota inspection timed out after ${ACCOUNT_INSPECTION_TIMEOUT_MS}ms`))\n }, ACCOUNT_INSPECTION_TIMEOUT_MS)\n timeoutHandle.unref?.()\n }),\n ])\n } finally {\n if (timeoutHandle) clearTimeout(timeoutHandle)\n }\n}\n\nfunction shouldRefreshAccountQuota(entry: StoredAccountEntry): boolean {\n if (entry.quotaStatus === 'loading') {\n const updatedAtMs = entry.quotaUpdatedAtIso ? Date.parse(entry.quotaUpdatedAtIso) : Number.NaN\n if (!Number.isFinite(updatedAtMs)) return true\n return Date.now() - updatedAtMs >= ACCOUNT_QUOTA_LOADING_STALE_MS\n }\n if (!entry.quotaUpdatedAtIso) return true\n const updatedAtMs = Date.parse(entry.quotaUpdatedAtIso)\n if (!Number.isFinite(updatedAtMs)) return true\n return Date.now() - updatedAtMs >= ACCOUNT_QUOTA_REFRESH_TTL_MS\n}\n\nasync function replaceStoredAccount(nextEntry: StoredAccountEntry, activeAccountId: string | null): Promise<void> {\n const state = await readStoredAccountsState()\n const nextState = withUpsertedAccount({\n activeAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId,\n accounts: nextState.accounts,\n })\n}\n\nasync function pickReplacementActiveAccount(accounts: StoredAccountEntry[]): Promise<StoredAccountEntry | null> {\n const sorted = sortAccounts(accounts, null)\n for (const entry of sorted) {\n if (entry.unavailableReason === 'payment_required') continue\n if (await fileExists(getSnapshotPath(entry.storageId))) {\n return entry\n }\n }\n return null\n}\n\nasync function refreshAccountsInBackground(accountIds: string[], activeAccountId: string | null): Promise<void> {\n for (const accountId of accountIds) {\n const state = await readStoredAccountsState()\n const entry = state.accounts.find((item) => item.accountId === accountId)\n if (!entry) continue\n\n try {\n const inspected = await inspectStoredAccountWithTimeout(entry)\n await replaceStoredAccount({\n ...entry,\n email: inspected.metadata.email ?? entry.email,\n planType: inspected.metadata.planType ?? entry.planType,\n quotaSnapshot: inspected.quotaSnapshot ?? entry.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }, activeAccountId)\n } catch (error) {\n await replaceStoredAccount({\n ...entry,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to refresh account quota'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, activeAccountId)\n }\n }\n}\n\nasync function scheduleAccountsBackgroundRefresh(\n options: { force?: boolean; prioritizeAccountId?: string; accountIds?: string[] } = {},\n): Promise<StoredAccountsState> {\n const state = await readStoredAccountsState()\n if (state.accounts.length === 0) return state\n if (backgroundRefreshPromise) return state\n\n const allowedIds = options.accountIds ? new Set(options.accountIds) : null\n const candidates = state.accounts\n .filter((entry) => !allowedIds || allowedIds.has(entry.accountId))\n .filter((entry) => options.force === true || shouldRefreshAccountQuota(entry))\n .sort((left, right) => {\n const prioritize = options.prioritizeAccountId ?? ''\n const leftPriority = left.accountId === prioritize ? 1 : 0\n const rightPriority = right.accountId === prioritize ? 1 : 0\n if (leftPriority !== rightPriority) return rightPriority - leftPriority\n return 0\n })\n\n if (candidates.length === 0) return state\n\n const candidateIds = new Set(candidates.map((entry) => entry.accountId))\n const markedState: StoredAccountsState = {\n activeAccountId: state.activeAccountId,\n accounts: state.accounts.map((entry) => (\n candidateIds.has(entry.accountId)\n ? {\n ...entry,\n quotaStatus: 'loading',\n quotaError: null,\n }\n : entry\n )),\n }\n\n await writeStoredAccountsState(markedState)\n\n backgroundRefreshPromise = refreshAccountsInBackground(\n candidates.map((entry) => entry.accountId),\n markedState.activeAccountId,\n ).finally(() => {\n backgroundRefreshPromise = null\n })\n\n return markedState\n}\n\nasync function importAccountFromAuthPath(path: string): Promise<{\n activeAccountId: string | null\n importedAccountId: string\n accounts: Array<StoredAccountEntry & { isActive: boolean }>\n}> {\n const imported = await readAuthFileFromPath(path)\n const storageId = toStorageId(imported.accountId)\n await writeSnapshot(storageId, imported.raw)\n\n const state = await readStoredAccountsState()\n const existing = state.accounts.find((entry) => entry.accountId === imported.accountId) ?? null\n const nextEntry: StoredAccountEntry = {\n accountId: imported.accountId,\n storageId,\n authMode: imported.authMode,\n email: imported.metadata.email ?? existing?.email ?? null,\n planType: imported.metadata.planType ?? existing?.planType ?? null,\n lastRefreshedAtIso: new Date().toISOString(),\n lastActivatedAtIso: existing?.lastActivatedAtIso ?? null,\n quotaSnapshot: existing?.quotaSnapshot ?? null,\n quotaUpdatedAtIso: existing?.quotaUpdatedAtIso ?? null,\n quotaStatus: existing?.quotaStatus ?? 'idle',\n quotaError: existing?.quotaError ?? null,\n unavailableReason: existing?.unavailableReason ?? null,\n }\n const nextState = withUpsertedAccount(state, nextEntry)\n await writeStoredAccountsState(nextState)\n\n return {\n activeAccountId: nextState.activeAccountId,\n importedAccountId: imported.accountId,\n accounts: sortAccounts(nextState.accounts, nextState.activeAccountId).map((entry) => toPublicAccountEntry(entry, nextState.activeAccountId)),\n }\n}\n\nfunction extractLoginUrl(output: string): string | null {\n const match = output.match(/https:\\/\\/auth\\.openai\\.com\\/oauth\\/authorize\\?\\S+/u)\n return match?.[0] ?? null\n}\n\nfunction isLocalCallbackUrl(rawUrl: string): boolean {\n try {\n const parsed = new URL(rawUrl)\n if (parsed.protocol !== 'http:') return false\n return parsed.hostname === 'localhost' || parsed.hostname === '127.0.0.1' || parsed.hostname === '[::1]' || parsed.hostname === '::1'\n } catch {\n return false\n }\n}\n\nasync function waitForLoginUrl(): Promise<string> {\n if (activeLogin?.loginUrl) return activeLogin.loginUrl\n\n return await new Promise<string>((resolve, reject) => {\n const startedAt = Date.now()\n const timer = setInterval(() => {\n if (!activeLogin) {\n clearInterval(timer)\n reject(new Error('Login process is not running.'))\n return\n }\n if (activeLogin.loginUrl) {\n clearInterval(timer)\n resolve(activeLogin.loginUrl)\n return\n }\n if (activeLogin.exited) {\n clearInterval(timer)\n reject(new Error(activeLogin.output.trim() || 'codex login exited before returning a login URL.'))\n return\n }\n if (Date.now() - startedAt > LOGIN_URL_TIMEOUT_MS) {\n clearInterval(timer)\n reject(new Error('Timed out waiting for codex login URL.'))\n }\n }, 100)\n })\n}\n\nasync function startCodexLogin(): Promise<string> {\n if (activeLogin && !activeLogin.exited) {\n return await waitForLoginUrl()\n }\n\n const proc = spawn('codex', ['login'], {\n env: process.env,\n stdio: ['pipe', 'pipe', 'pipe'],\n })\n proc.stdin.end()\n\n activeLogin = {\n proc,\n loginUrl: null,\n output: '',\n exited: false,\n exitCode: null,\n exitSignal: null,\n exitPromise: new Promise<void>((resolve) => {\n proc.once('exit', (code, signal) => {\n if (activeLogin?.proc === proc) {\n activeLogin.exited = true\n activeLogin.exitCode = code\n activeLogin.exitSignal = signal\n }\n resolve()\n })\n }),\n }\n\n const appendOutput = (chunk: Buffer | string) => {\n if (!activeLogin || activeLogin.proc !== proc) return\n activeLogin.output += chunk.toString()\n activeLogin.loginUrl = activeLogin.loginUrl ?? extractLoginUrl(activeLogin.output)\n }\n\n proc.stdout.on('data', appendOutput)\n proc.stderr.on('data', appendOutput)\n proc.once('error', (error) => {\n if (!activeLogin || activeLogin.proc !== proc) return\n activeLogin.exited = true\n activeLogin.output += error.message\n })\n\n try {\n return await waitForLoginUrl()\n } catch (error) {\n if (activeLogin?.proc === proc && !activeLogin.exited) {\n proc.kill('SIGTERM')\n }\n activeLogin = null\n throw error\n }\n}\n\nasync function curlLoginCallback(callbackUrl: string): Promise<void> {\n const controller = new AbortController()\n const timer = setTimeout(() => controller.abort(), LOGIN_CALLBACK_TIMEOUT_MS)\n try {\n const response = await fetch(callbackUrl, {\n redirect: 'manual',\n signal: controller.signal,\n })\n if (response.status >= 400) {\n throw new Error(`Login callback returned HTTP ${response.status}.`)\n }\n } finally {\n clearTimeout(timer)\n }\n}\n\nasync function getActiveAuthMtimeMs(): Promise<number | null> {\n try {\n return (await stat(getActiveAuthPath())).mtimeMs\n } catch {\n return null\n }\n}\n\nasync function waitForAuthFileUpdate(previousMtimeMs: number | null): Promise<void> {\n const startedAt = Date.now()\n while (Date.now() - startedAt <= LOGIN_AUTH_FILE_TIMEOUT_MS) {\n const nextMtimeMs = await getActiveAuthMtimeMs()\n if (nextMtimeMs !== null && (previousMtimeMs === null || nextMtimeMs > previousMtimeMs)) {\n return\n }\n await new Promise((resolve) => setTimeout(resolve, 250))\n }\n}\n\nfunction stopActiveLogin(): void {\n if (!activeLogin) return\n if (!activeLogin.exited) {\n activeLogin.proc.kill('SIGTERM')\n }\n activeLogin = null\n}\n\nexport async function handleAccountRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: AccountRouteContext,\n): Promise<boolean> {\n const { appServer } = context\n\n if (req.method === 'GET' && url.pathname === '/codex-api/accounts') {\n const state = await scheduleAccountsBackgroundRefresh()\n setJson(res, 200, {\n data: {\n activeAccountId: state.activeAccountId,\n accounts: sortAccounts(state.accounts, state.activeAccountId).map((entry) => toPublicAccountEntry(entry, state.activeAccountId)),\n },\n })\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/accounts/active') {\n const state = await readStoredAccountsState()\n const active = state.activeAccountId\n ? state.accounts.find((entry) => entry.accountId === state.activeAccountId) ?? null\n : null\n setJson(res, 200, {\n data: active ? toPublicAccountEntry(active, state.activeAccountId) : null,\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/refresh') {\n try {\n const imported = await importAccountFromAuthPath(getActiveAuthPath())\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const state = await readStoredAccountsState()\n const importedAccountId = imported.importedAccountId\n const target = state.accounts.find((entry) => entry.accountId === importedAccountId) ?? null\n if (!target) {\n throw new Error('account_not_found')\n }\n\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: importedAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: importedAccountId,\n accounts: nextState.accounts,\n })\n\n const backgroundState = await scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: importedAccountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== importedAccountId).map((entry) => entry.accountId),\n })\n\n setJson(res, 200, {\n data: {\n activeAccountId: importedAccountId,\n importedAccountId,\n accounts: sortAccounts(backgroundState.accounts, importedAccountId).map((entry) => toPublicAccountEntry(entry, importedAccountId)),\n },\n })\n } catch (error) {\n setJson(res, 502, {\n error: 'account_refresh_failed',\n message: getErrorMessage(error, 'Failed to refresh account'),\n })\n }\n } catch (error) {\n const message = getErrorMessage(error, 'Failed to refresh account')\n if (message === 'missing_account_id') {\n setJson(res, 400, { error: 'missing_account_id', message: 'Current auth.json is missing tokens.account_id.' })\n return true\n }\n setJson(res, 400, { error: 'invalid_auth_json', message: 'Failed to parse the current auth.json file.' })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/login/start') {\n try {\n const loginUrl = await startCodexLogin()\n setJson(res, 200, {\n ok: true,\n data: {\n loginUrl,\n },\n })\n } catch (error) {\n setJson(res, 500, {\n error: 'account_login_start_failed',\n message: getErrorMessage(error, 'Failed to start codex login'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/login/complete') {\n try {\n const payload = await readJsonBody(req)\n const callbackUrl = typeof payload?.callbackUrl === 'string' ? payload.callbackUrl.trim() : ''\n if (!callbackUrl) {\n setJson(res, 400, { error: 'missing_callback_url', message: 'Paste the localhost callback URL from the browser.' })\n return true\n }\n if (!isLocalCallbackUrl(callbackUrl)) {\n setJson(res, 400, { error: 'invalid_callback_url', message: 'The callback URL must use http://localhost or http://127.0.0.1.' })\n return true\n }\n if (!activeLogin || activeLogin.exited) {\n setJson(res, 409, { error: 'login_not_running', message: 'Start Codex login before submitting the callback URL.' })\n return true\n }\n\n const previousAuthMtimeMs = await getActiveAuthMtimeMs()\n await curlLoginCallback(callbackUrl)\n await waitForAuthFileUpdate(previousAuthMtimeMs)\n\n const imported = await importAccountFromAuthPath(getActiveAuthPath())\n stopActiveLogin()\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const state = await readStoredAccountsState()\n const importedAccountId = imported.importedAccountId\n const target = state.accounts.find((entry) => entry.accountId === importedAccountId) ?? null\n if (!target) {\n throw new Error('account_not_found')\n }\n\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: importedAccountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: importedAccountId,\n accounts: nextState.accounts,\n })\n\n const backgroundState = await scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: importedAccountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== importedAccountId).map((entry) => entry.accountId),\n })\n\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: importedAccountId,\n importedAccountId,\n accounts: sortAccounts(backgroundState.accounts, importedAccountId).map((entry) => toPublicAccountEntry(entry, importedAccountId)),\n },\n })\n } catch (error) {\n setJson(res, 500, {\n error: 'account_login_complete_failed',\n message: getErrorMessage(error, 'Failed to complete Codex login'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/switch') {\n try {\n if (appServer.listPendingServerRequests().length > 0) {\n setJson(res, 409, {\n error: 'account_switch_blocked',\n message: 'Finish pending approval requests before switching accounts.',\n })\n return true\n }\n\n const payload = await readJsonBody(req)\n const accountId = typeof payload?.accountId === 'string' ? payload.accountId.trim() : ''\n if (!accountId) {\n setJson(res, 400, { error: 'account_not_found', message: 'Missing accountId.' })\n return true\n }\n\n const state = await readStoredAccountsState()\n const target = state.accounts.find((entry) => entry.accountId === accountId) ?? null\n if (!target) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account was not found.' })\n return true\n }\n\n const snapshotPath = getSnapshotPath(target.storageId)\n if (!(await fileExists(snapshotPath))) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account snapshot is missing.' })\n return true\n }\n\n let previousRaw: string | null = null\n try {\n previousRaw = await readFile(getActiveAuthPath(), 'utf8')\n } catch {\n previousRaw = null\n }\n\n const targetRaw = await readFile(snapshotPath, 'utf8')\n await writeFile(getActiveAuthPath(), targetRaw, { encoding: 'utf8', mode: 0o600 })\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const nextEntry: StoredAccountEntry = {\n ...target,\n email: inspection.metadata.email ?? target.email,\n planType: inspection.metadata.planType ?? target.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? target.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextState = withUpsertedAccount({\n activeAccountId: accountId,\n accounts: state.accounts,\n }, nextEntry)\n await writeStoredAccountsState({\n activeAccountId: accountId,\n accounts: nextState.accounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: accountId,\n accountIds: nextState.accounts.filter((entry) => entry.accountId !== accountId).map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: accountId,\n account: toPublicAccountEntry(nextEntry, accountId),\n },\n })\n } catch (error) {\n await restoreActiveAuth(previousRaw)\n appServer.dispose()\n await replaceStoredAccount({\n ...target,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to switch account'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, state.activeAccountId)\n setJson(res, 502, {\n error: 'account_switch_failed',\n message: getErrorMessage(error, 'Failed to switch account'),\n })\n }\n } catch (error) {\n setJson(res, 400, {\n error: 'invalid_auth_json',\n message: getErrorMessage(error, 'Failed to switch account'),\n })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/accounts/remove') {\n try {\n const payload = await readJsonBody(req)\n const accountId = typeof payload?.accountId === 'string' ? payload.accountId.trim() : ''\n if (!accountId) {\n setJson(res, 400, { error: 'account_not_found', message: 'Missing accountId.' })\n return true\n }\n\n const state = await readStoredAccountsState()\n const target = state.accounts.find((entry) => entry.accountId === accountId) ?? null\n if (!target) {\n setJson(res, 404, { error: 'account_not_found', message: 'The requested account was not found.' })\n return true\n }\n\n const remainingAccounts = state.accounts.filter((entry) => entry.accountId !== accountId)\n if (state.activeAccountId !== accountId) {\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: state.activeAccountId,\n accounts: remainingAccounts,\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: state.activeAccountId,\n accounts: sortAccounts(remainingAccounts, state.activeAccountId).map((entry) => toPublicAccountEntry(entry, state.activeAccountId)),\n },\n })\n return true\n }\n\n if (appServer.listPendingServerRequests().length > 0) {\n setJson(res, 409, {\n error: 'account_remove_blocked',\n message: 'Finish pending approval requests before removing the active account.',\n })\n return true\n }\n\n let previousRaw: string | null = null\n try {\n previousRaw = await readFile(getActiveAuthPath(), 'utf8')\n } catch {\n previousRaw = null\n }\n\n const replacement = await pickReplacementActiveAccount(remainingAccounts)\n if (!replacement) {\n await restoreActiveAuth(null)\n appServer.dispose()\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: null,\n accounts: remainingAccounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n accountIds: remainingAccounts.map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: null,\n accounts: sortAccounts(remainingAccounts, null).map((entry) => toPublicAccountEntry(entry, null)),\n },\n })\n return true\n }\n\n const replacementSnapshotPath = getSnapshotPath(replacement.storageId)\n if (!(await fileExists(replacementSnapshotPath))) {\n setJson(res, 404, {\n error: 'account_not_found',\n message: 'The replacement account snapshot is missing.',\n })\n return true\n }\n\n const replacementRaw = await readFile(replacementSnapshotPath, 'utf8')\n await writeFile(getActiveAuthPath(), replacementRaw, { encoding: 'utf8', mode: 0o600 })\n\n try {\n appServer.dispose()\n const inspection = await validateSwitchedAccount(appServer)\n const activatedReplacement: StoredAccountEntry = {\n ...replacement,\n email: inspection.metadata.email ?? replacement.email,\n planType: inspection.metadata.planType ?? replacement.planType,\n lastActivatedAtIso: new Date().toISOString(),\n quotaSnapshot: inspection.quotaSnapshot ?? replacement.quotaSnapshot,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'ready',\n quotaError: null,\n unavailableReason: null,\n }\n const nextAccounts = remainingAccounts.map((entry) => (\n entry.accountId === activatedReplacement.accountId ? activatedReplacement : entry\n ))\n await removeSnapshot(target.storageId)\n await writeStoredAccountsState({\n activeAccountId: activatedReplacement.accountId,\n accounts: nextAccounts,\n })\n void scheduleAccountsBackgroundRefresh({\n force: true,\n prioritizeAccountId: activatedReplacement.accountId,\n accountIds: nextAccounts\n .filter((entry) => entry.accountId !== activatedReplacement.accountId)\n .map((entry) => entry.accountId),\n })\n setJson(res, 200, {\n ok: true,\n data: {\n activeAccountId: activatedReplacement.accountId,\n accounts: sortAccounts(nextAccounts, activatedReplacement.accountId)\n .map((entry) => toPublicAccountEntry(entry, activatedReplacement.accountId)),\n },\n })\n } catch (error) {\n await restoreActiveAuth(previousRaw)\n appServer.dispose()\n await replaceStoredAccount({\n ...replacement,\n quotaUpdatedAtIso: new Date().toISOString(),\n quotaStatus: 'error',\n quotaError: getErrorMessage(error, 'Failed to switch account'),\n unavailableReason: detectAccountUnavailableReason(error),\n }, state.activeAccountId)\n setJson(res, 502, {\n error: 'account_remove_failed',\n message: getErrorMessage(error, 'Failed to remove account'),\n })\n }\n } catch (error) {\n setJson(res, 400, {\n error: 'invalid_auth_json',\n message: getErrorMessage(error, 'Failed to remove account'),\n })\n }\n return true\n }\n\n return false\n}\n","import { spawn } from 'node:child_process'\nimport { mkdir, rm, stat, writeFile } from 'node:fs/promises'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { tmpdir } from 'node:os'\nimport { isAbsolute, join, resolve } from 'node:path'\n\ntype ReviewScope = 'workspace' | 'baseBranch'\ntype ReviewWorkspaceView = 'unstaged' | 'staged'\ntype ReviewAction = 'stage' | 'unstage' | 'revert'\ntype ReviewActionLevel = 'all' | 'file' | 'hunk'\n\ntype ReviewDiffLine = {\n key: string\n kind: 'meta' | 'hunk' | 'add' | 'remove' | 'context'\n text: string\n oldLine: number | null\n newLine: number | null\n}\n\ntype ReviewSnapshotHunk = {\n id: string\n header: string\n patch: string\n addedLineCount: number\n removedLineCount: number\n oldStart: number | null\n oldLineCount: number\n newStart: number | null\n newLineCount: number\n lines: ReviewDiffLine[]\n}\n\ntype ReviewSnapshotFile = {\n id: string\n path: string\n absolutePath: string\n previousPath: string | null\n previousAbsolutePath: string | null\n operation: 'add' | 'delete' | 'update' | 'rename'\n addedLineCount: number\n removedLineCount: number\n diff: string\n hunks: ReviewSnapshotHunk[]\n}\n\ntype ReviewSnapshot = {\n cwd: string\n gitRoot: string | null\n isGitRepo: boolean\n scope: ReviewScope\n workspaceView: ReviewWorkspaceView\n baseBranch: string | null\n baseBranchOptions: string[]\n headBranch: string | null\n mergeBaseSha: string | null\n generatedAtIso: string\n summary: {\n fileCount: number\n addedLineCount: number\n removedLineCount: number\n }\n files: ReviewSnapshotFile[]\n}\n\ntype ReviewRouteContext = {\n readJsonBody: (req: IncomingMessage) => Promise<unknown>\n}\n\ntype CommandResult = {\n code: number\n stdout: string\n stderr: string\n}\n\ntype DetectedBaseBranch = {\n displayName: string\n gitRef: string\n}\n\nfunction normalizeBaseBranchDisplayName(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n return trimmed.startsWith('origin/') ? trimmed.slice('origin/'.length) : trimmed\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction readString(value: unknown): string {\n return typeof value === 'string' ? value.trim() : ''\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const direct = readString(record.error)\n if (direct) return direct\n\n const nested = asRecord(record.error)\n const nestedMessage = readString(nested?.message)\n if (nestedMessage) return nestedMessage\n\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nasync function runCommandResult(\n command: string,\n args: string[],\n options: { cwd?: string } = {},\n): Promise<CommandResult> {\n return await new Promise<CommandResult>((resolve, reject) => {\n const proc = spawn(command, args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let stdout = ''\n let stderr = ''\n\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', reject)\n proc.on('close', (code) => {\n resolve({\n code: code ?? 1,\n stdout: stdout.trim(),\n stderr: stderr.trim(),\n })\n })\n })\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): Promise<void> {\n const result = await runCommandResult(command, args, options)\n if (result.code === 0) return\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (${command} ${args.join(' ')})${suffix}`)\n}\n\nasync function runCommandCapture(command: string, args: string[], options: { cwd?: string } = {}): Promise<string> {\n const result = await runCommandResult(command, args, options)\n if (result.code === 0) return result.stdout\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (${command} ${args.join(' ')})${suffix}`)\n}\n\nfunction isNotGitRepositoryError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return message.includes('not a git repository') || message.includes('fatal: not a git repository')\n}\n\nfunction isMissingHeadError(error: unknown): boolean {\n const message = getErrorMessage(error, '').toLowerCase()\n return (\n message.includes(\"ambiguous argument 'head'\") ||\n message.includes(\"bad revision 'head'\") ||\n message.includes('unknown revision or path not in the working tree') ||\n message.includes(\"not a valid object name 'head'\") ||\n message.includes('not a valid object name: head')\n )\n}\n\nfunction normalizeInputCwd(value: string): string {\n return isAbsolute(value) ? value : resolve(value)\n}\n\nasync function ensureDirectory(cwd: string): Promise<void> {\n const info = await stat(cwd)\n if (!info.isDirectory()) {\n throw new Error('cwd is not a directory')\n }\n}\n\nasync function resolveGitRoot(cwd: string): Promise<string | null> {\n try {\n return await runCommandCapture('git', ['rev-parse', '--show-toplevel'], { cwd })\n } catch (error) {\n if (isNotGitRepositoryError(error)) {\n return null\n }\n throw error\n }\n}\n\nasync function gitRefExists(repoRoot: string, ref: string): Promise<boolean> {\n const result = await runCommandResult('git', ['rev-parse', '--verify', '--quiet', ref], { cwd: repoRoot })\n return result.code === 0\n}\n\nasync function detectBaseBranch(repoRoot: string): Promise<DetectedBaseBranch | null> {\n const originHead = await runCommandResult('git', ['symbolic-ref', '--quiet', '--short', 'refs/remotes/origin/HEAD'], { cwd: repoRoot })\n const originHeadRef = originHead.code === 0 ? originHead.stdout : ''\n if (originHeadRef.startsWith('origin/')) {\n return {\n displayName: originHeadRef.slice('origin/'.length),\n gitRef: originHeadRef,\n }\n }\n\n for (const candidate of ['main', 'master']) {\n if (await gitRefExists(repoRoot, candidate)) {\n return { displayName: candidate, gitRef: candidate }\n }\n const remoteCandidate = `origin/${candidate}`\n if (await gitRefExists(repoRoot, remoteCandidate)) {\n return { displayName: candidate, gitRef: remoteCandidate }\n }\n }\n\n return null\n}\n\nasync function listBaseBranchOptions(repoRoot: string): Promise<string[]> {\n const result = await runCommandResult(\n 'git',\n ['for-each-ref', '--format=%(refname:short)', 'refs/heads', 'refs/remotes/origin'],\n { cwd: repoRoot },\n )\n if (result.code !== 0) {\n return []\n }\n\n const options: string[] = []\n for (const line of result.stdout.split(/\\r?\\n/u)) {\n const normalized = normalizeBaseBranchDisplayName(line)\n if (!normalized || normalized === 'HEAD' || normalized.endsWith('/HEAD')) continue\n if (!options.includes(normalized)) {\n options.push(normalized)\n }\n }\n\n for (const fallback of ['main', 'master']) {\n if (!options.includes(fallback)) {\n options.push(fallback)\n }\n }\n\n return options\n}\n\nasync function resolveBaseBranch(repoRoot: string, requestedBaseBranch = ''): Promise<DetectedBaseBranch | null> {\n const normalizedRequested = normalizeBaseBranchDisplayName(requestedBaseBranch)\n if (normalizedRequested) {\n for (const candidate of [normalizedRequested, `origin/${normalizedRequested}`]) {\n if (await gitRefExists(repoRoot, candidate)) {\n return {\n displayName: normalizedRequested,\n gitRef: candidate,\n }\n }\n }\n }\n\n return await detectBaseBranch(repoRoot)\n}\n\nasync function detectHeadBranch(repoRoot: string): Promise<string | null> {\n const result = await runCommandResult('git', ['symbolic-ref', '--quiet', '--short', 'HEAD'], { cwd: repoRoot })\n return result.code === 0 && result.stdout !== 'HEAD' ? result.stdout : null\n}\n\nfunction parseUntrackedPaths(statusOutput: string): string[] {\n const paths: string[] = []\n for (const line of statusOutput.split(/\\r?\\n/u)) {\n if (!line.startsWith('?? ')) continue\n const path = line.slice(3).trim()\n if (path && !paths.includes(path)) {\n paths.push(path)\n }\n }\n return paths\n}\n\nasync function diffUntrackedFile(repoRoot: string, path: string): Promise<string> {\n const result = await runCommandResult(\n 'git',\n ['diff', '--no-index', '--no-ext-diff', '--patch', '--', '/dev/null', path],\n { cwd: repoRoot },\n )\n\n if (result.code !== 0 && result.code !== 1) {\n const details = [result.stderr, result.stdout].filter(Boolean).join('\\n')\n const suffix = details ? `: ${details}` : ''\n throw new Error(`Command failed (git diff --no-index -- /dev/null ${path})${suffix}`)\n }\n\n return result.stdout\n}\n\nasync function buildWorkspaceDiff(repoRoot: string, workspaceView: ReviewWorkspaceView): Promise<string> {\n if (workspaceView === 'staged') {\n try {\n return await runCommandCapture('git', ['diff', '--cached', '--no-ext-diff', '--find-renames', '--patch'], { cwd: repoRoot })\n } catch (error) {\n if (isMissingHeadError(error)) {\n return ''\n }\n throw error\n }\n }\n\n let trackedDiff = ''\n try {\n trackedDiff = await runCommandCapture('git', ['diff', '--no-ext-diff', '--find-renames', '--patch'], { cwd: repoRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) {\n throw error\n }\n }\n\n const statusOutput = await runCommandCapture('git', ['status', '--porcelain=v1', '--untracked-files=all'], { cwd: repoRoot })\n const untrackedDiffs = await Promise.all(\n parseUntrackedPaths(statusOutput).map(async (path) => await diffUntrackedFile(repoRoot, path)),\n )\n\n return [trackedDiff, ...untrackedDiffs]\n .map((chunk) => chunk.trim())\n .filter(Boolean)\n .join('\\n')\n}\n\nasync function buildBaseBranchDiff(\n repoRoot: string,\n baseBranch: DetectedBaseBranch,\n): Promise<{ diffText: string; mergeBaseSha: string | null }> {\n const mergeBaseResult = await runCommandResult('git', ['merge-base', 'HEAD', baseBranch.gitRef], { cwd: repoRoot })\n if (mergeBaseResult.code !== 0 || !mergeBaseResult.stdout) {\n return { diffText: '', mergeBaseSha: null }\n }\n\n const diffText = await runCommandCapture(\n 'git',\n ['diff', '--no-ext-diff', '--find-renames', '--patch', mergeBaseResult.stdout, 'HEAD'],\n { cwd: repoRoot },\n )\n\n return {\n diffText,\n mergeBaseSha: mergeBaseResult.stdout,\n }\n}\n\nfunction normalizeDiffPath(value: string): string | null {\n const trimmed = value.trim()\n if (!trimmed || trimmed === '/dev/null') return null\n if (trimmed.startsWith('a/') || trimmed.startsWith('b/')) {\n return trimmed.slice(2)\n }\n return trimmed\n}\n\nfunction filePathFromDiffHeader(line: string, side: 'old' | 'new'): string | null {\n const prefix = side === 'old' ? '--- ' : '+++ '\n if (!line.startsWith(prefix)) return null\n return normalizeDiffPath(line.slice(prefix.length))\n}\n\nfunction parseDiffGitLine(line: string): { oldPath: string | null; newPath: string | null } {\n const match = line.match(/^diff --git a\\/(.+?) b\\/(.+)$/u)\n if (!match) return { oldPath: null, newPath: null }\n return {\n oldPath: normalizeDiffPath(`a/${match[1]}`),\n newPath: normalizeDiffPath(`b/${match[2]}`),\n }\n}\n\nfunction buildReviewDiffLines(fileId: string, hunkId: string, lines: string[]): {\n addedLineCount: number\n removedLineCount: number\n lines: ReviewDiffLine[]\n} {\n const output: ReviewDiffLine[] = []\n let addedLineCount = 0\n let removedLineCount = 0\n let oldLine: number | null = null\n let newLine: number | null = null\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (index === 0) {\n const match = line.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/u)\n if (match) {\n oldLine = Number(match[1])\n newLine = Number(match[3])\n }\n output.push({\n key: `${fileId}:${hunkId}:header`,\n kind: 'hunk',\n text: line,\n oldLine: null,\n newLine: null,\n })\n continue\n }\n\n if (line.startsWith('+') && !line.startsWith('+++')) {\n output.push({\n key: `${fileId}:${hunkId}:add:${index}`,\n kind: 'add',\n text: line.slice(1),\n oldLine: null,\n newLine,\n })\n addedLineCount += 1\n newLine = newLine === null ? null : newLine + 1\n continue\n }\n\n if (line.startsWith('-') && !line.startsWith('---')) {\n output.push({\n key: `${fileId}:${hunkId}:remove:${index}`,\n kind: 'remove',\n text: line.slice(1),\n oldLine,\n newLine: null,\n })\n removedLineCount += 1\n oldLine = oldLine === null ? null : oldLine + 1\n continue\n }\n\n if (line.startsWith('\\\\')) {\n output.push({\n key: `${fileId}:${hunkId}:meta:${index}`,\n kind: 'meta',\n text: line,\n oldLine: null,\n newLine: null,\n })\n continue\n }\n\n output.push({\n key: `${fileId}:${hunkId}:context:${index}`,\n kind: 'context',\n text: line.startsWith(' ') ? line.slice(1) : line,\n oldLine,\n newLine,\n })\n oldLine = oldLine === null ? null : oldLine + 1\n newLine = newLine === null ? null : newLine + 1\n }\n\n return { addedLineCount, removedLineCount, lines: output }\n}\n\nfunction parseDiffBlocks(diffText: string): string[][] {\n const normalized = diffText.replace(/\\r\\n/g, '\\n').trim()\n if (!normalized) return []\n\n const blocks: string[][] = []\n let current: string[] = []\n for (const line of normalized.split('\\n')) {\n if (line.startsWith('diff --git ')) {\n if (current.length > 0) {\n blocks.push(current)\n }\n current = [line]\n continue\n }\n if (current.length > 0) {\n current.push(line)\n }\n }\n if (current.length > 0) {\n blocks.push(current)\n }\n return blocks\n}\n\nfunction serializePatch(lines: string[]): string {\n if (lines.length === 0) return ''\n return `${lines.join('\\n')}\\n`\n}\n\nfunction parseReviewSnapshotFile(repoRoot: string, blockLines: string[], fileIndex: number): ReviewSnapshotFile | null {\n if (blockLines.length === 0) return null\n\n let oldPath: string | null = null\n let newPath: string | null = null\n let renameFrom: string | null = null\n let renameTo: string | null = null\n let operation: ReviewSnapshotFile['operation'] = 'update'\n\n const firstHunkIndex = blockLines.findIndex((line) => line.startsWith('@@ '))\n const headerLines = firstHunkIndex >= 0 ? blockLines.slice(0, firstHunkIndex) : [...blockLines]\n\n for (const line of headerLines) {\n if (line.startsWith('diff --git ')) {\n const parsed = parseDiffGitLine(line)\n oldPath = parsed.oldPath ?? oldPath\n newPath = parsed.newPath ?? newPath\n continue\n }\n if (line.startsWith('rename from ')) {\n renameFrom = normalizeDiffPath(line.slice('rename from '.length))\n operation = 'rename'\n continue\n }\n if (line.startsWith('rename to ')) {\n renameTo = normalizeDiffPath(line.slice('rename to '.length))\n operation = 'rename'\n continue\n }\n if (line.startsWith('new file mode ')) {\n operation = 'add'\n continue\n }\n if (line.startsWith('deleted file mode ')) {\n operation = 'delete'\n continue\n }\n const headerOldPath = filePathFromDiffHeader(line, 'old')\n if (headerOldPath !== null) {\n oldPath = headerOldPath\n continue\n }\n const headerNewPath = filePathFromDiffHeader(line, 'new')\n if (headerNewPath !== null) {\n newPath = headerNewPath\n }\n }\n\n const previousPath = renameFrom ?? oldPath\n const resolvedPath = renameTo ?? newPath ?? oldPath\n if (!resolvedPath) return null\n\n if (operation === 'update') {\n if (!previousPath) {\n operation = 'add'\n } else if (!newPath) {\n operation = 'delete'\n }\n }\n\n const hunks: ReviewSnapshotHunk[] = []\n if (firstHunkIndex >= 0) {\n let currentHunk: string[] = []\n let hunkCounter = 0\n const flushHunk = () => {\n if (currentHunk.length === 0) return\n const header = currentHunk[0] ?? ''\n const match = header.match(/^@@\\s+-(\\d+)(?:,(\\d+))?\\s+\\+(\\d+)(?:,(\\d+))?\\s+@@/u)\n const hunkId = `review-hunk:${fileIndex}:${hunkCounter}`\n const rendered = buildReviewDiffLines(`review-file:${fileIndex}`, hunkId, currentHunk)\n hunks.push({\n id: hunkId,\n header,\n patch: serializePatch([...headerLines, ...currentHunk]),\n addedLineCount: rendered.addedLineCount,\n removedLineCount: rendered.removedLineCount,\n oldStart: match ? Number(match[1]) : null,\n oldLineCount: match ? Number(match[2] ?? '1') : 0,\n newStart: match ? Number(match[3]) : null,\n newLineCount: match ? Number(match[4] ?? '1') : 0,\n lines: rendered.lines,\n })\n currentHunk = []\n hunkCounter += 1\n }\n\n for (let index = firstHunkIndex; index < blockLines.length; index += 1) {\n const line = blockLines[index] ?? ''\n if (line.startsWith('@@ ')) {\n flushHunk()\n currentHunk = [line]\n continue\n }\n if (currentHunk.length > 0) {\n currentHunk.push(line)\n }\n }\n flushHunk()\n }\n\n const addedLineCount = hunks.reduce((sum, hunk) => sum + hunk.addedLineCount, 0)\n const removedLineCount = hunks.reduce((sum, hunk) => sum + hunk.removedLineCount, 0)\n\n return {\n id: `review-file:${fileIndex}`,\n path: resolvedPath,\n absolutePath: join(repoRoot, resolvedPath),\n previousPath: previousPath && previousPath !== resolvedPath ? previousPath : null,\n previousAbsolutePath: previousPath && previousPath !== resolvedPath ? join(repoRoot, previousPath) : null,\n operation,\n addedLineCount,\n removedLineCount,\n diff: serializePatch(blockLines),\n hunks,\n }\n}\n\nfunction parseReviewSnapshotFiles(repoRoot: string, diffText: string): ReviewSnapshotFile[] {\n return parseDiffBlocks(diffText)\n .map((block, index) => parseReviewSnapshotFile(repoRoot, block, index))\n .filter((entry): entry is ReviewSnapshotFile => entry !== null)\n}\n\nasync function buildReviewSnapshot(\n cwd: string,\n scope: ReviewScope,\n workspaceView: ReviewWorkspaceView,\n requestedBaseBranch = '',\n): Promise<ReviewSnapshot> {\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n\n const gitRoot = await resolveGitRoot(normalizedCwd)\n if (!gitRoot) {\n return {\n cwd: normalizedCwd,\n gitRoot: null,\n isGitRepo: false,\n scope,\n workspaceView,\n baseBranch: null,\n baseBranchOptions: [],\n headBranch: null,\n mergeBaseSha: null,\n generatedAtIso: new Date().toISOString(),\n summary: {\n fileCount: 0,\n addedLineCount: 0,\n removedLineCount: 0,\n },\n files: [],\n }\n }\n\n const [baseBranch, baseBranchOptions, headBranch] = await Promise.all([\n resolveBaseBranch(gitRoot, requestedBaseBranch),\n listBaseBranchOptions(gitRoot),\n detectHeadBranch(gitRoot),\n ])\n\n let diffText = ''\n let mergeBaseSha: string | null = null\n\n if (scope === 'baseBranch') {\n if (baseBranch) {\n const baseDiff = await buildBaseBranchDiff(gitRoot, baseBranch)\n diffText = baseDiff.diffText\n mergeBaseSha = baseDiff.mergeBaseSha\n }\n } else {\n diffText = await buildWorkspaceDiff(gitRoot, workspaceView)\n }\n\n const files = parseReviewSnapshotFiles(gitRoot, diffText)\n return {\n cwd: normalizedCwd,\n gitRoot,\n isGitRepo: true,\n scope,\n workspaceView,\n baseBranch: baseBranch?.displayName ?? null,\n baseBranchOptions,\n headBranch,\n mergeBaseSha,\n generatedAtIso: new Date().toISOString(),\n summary: {\n fileCount: files.length,\n addedLineCount: files.reduce((sum, file) => sum + file.addedLineCount, 0),\n removedLineCount: files.reduce((sum, file) => sum + file.removedLineCount, 0),\n },\n files,\n }\n}\n\nasync function writePatchFile(patch: string): Promise<string> {\n const dir = await mkdir(join(tmpdir(), 'codexui-review-patches'), { recursive: true }).then(() => join(tmpdir(), 'codexui-review-patches'))\n const filePath = join(dir, `${Date.now()}-${Math.random().toString(16).slice(2)}.patch`)\n const normalizedPatch = patch.endsWith('\\n') ? patch : `${patch}\\n`\n await writeFile(filePath, normalizedPatch, 'utf8')\n return filePath\n}\n\nasync function applyPatchAction(\n repoRoot: string,\n action: ReviewAction,\n workspaceView: ReviewWorkspaceView,\n patch: string,\n): Promise<void> {\n const patchPath = await writePatchFile(patch)\n try {\n if (workspaceView === 'unstaged' && action === 'stage') {\n await runCommand('git', ['apply', '--cached', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n if (workspaceView === 'unstaged' && action === 'revert') {\n await runCommand('git', ['apply', '-R', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n if (workspaceView === 'staged' && action === 'unstage') {\n await runCommand('git', ['apply', '--cached', '-R', '--recount', patchPath], { cwd: repoRoot })\n return\n }\n throw new Error('Unsupported patch action for this view')\n } finally {\n await rm(patchPath, { force: true })\n }\n}\n\nasync function applyAllAction(repoRoot: string, action: ReviewAction, workspaceView: ReviewWorkspaceView): Promise<void> {\n if (workspaceView === 'unstaged' && action === 'stage') {\n await runCommand('git', ['add', '-A'], { cwd: repoRoot })\n return\n }\n\n if (workspaceView === 'unstaged' && action === 'revert') {\n try {\n await runCommand('git', ['restore', '--worktree', '--source=HEAD', '--', '.'], { cwd: repoRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) {\n throw error\n }\n }\n await runCommand('git', ['clean', '-fd', '--', '.'], { cwd: repoRoot })\n return\n }\n\n if (workspaceView === 'staged' && action === 'unstage') {\n await runCommand('git', ['restore', '--staged', '--', '.'], { cwd: repoRoot })\n return\n }\n\n throw new Error('Unsupported bulk action for this view')\n}\n\nasync function initializeGitRepository(cwd: string): Promise<void> {\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n await runCommand('git', ['init'], { cwd: normalizedCwd })\n}\n\nasync function applyReviewAction(payload: unknown): Promise<ReviewSnapshot> {\n const record = asRecord(payload)\n if (!record) {\n throw new Error('Invalid body: expected object')\n }\n\n const cwd = readString(record.cwd)\n const scope = record.scope === 'baseBranch' ? 'baseBranch' : 'workspace'\n const workspaceView = record.workspaceView === 'staged' ? 'staged' : 'unstaged'\n const action = readString(record.action)\n const level = readString(record.level)\n const patch = typeof record.patch === 'string' ? record.patch : ''\n\n if (!cwd) {\n throw new Error('Missing cwd')\n }\n if (scope !== 'workspace') {\n throw new Error('Review actions are only available for workspace changes')\n }\n if (action !== 'stage' && action !== 'unstage' && action !== 'revert') {\n throw new Error('Invalid review action')\n }\n if (level !== 'all' && level !== 'file' && level !== 'hunk') {\n throw new Error('Invalid review action level')\n }\n\n const normalizedCwd = normalizeInputCwd(cwd)\n await ensureDirectory(normalizedCwd)\n const repoRoot = await resolveGitRoot(normalizedCwd)\n if (!repoRoot) {\n throw new Error('Not a Git repository')\n }\n\n if (level === 'all') {\n await applyAllAction(repoRoot, action, workspaceView)\n } else {\n if (!patch.trim()) {\n throw new Error('Missing patch payload')\n }\n await applyPatchAction(repoRoot, action, workspaceView, patch)\n }\n\n return await buildReviewSnapshot(normalizedCwd, scope, workspaceView)\n}\n\nexport async function handleReviewRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: ReviewRouteContext,\n): Promise<boolean> {\n if (req.method === 'GET' && url.pathname === '/codex-api/review/snapshot') {\n const cwd = url.searchParams.get('cwd')?.trim() ?? ''\n const scope = url.searchParams.get('scope') === 'baseBranch' ? 'baseBranch' : 'workspace'\n const workspaceView = url.searchParams.get('workspaceView') === 'staged' ? 'staged' : 'unstaged'\n const baseBranch = url.searchParams.get('baseBranch')?.trim() ?? ''\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return true\n }\n\n try {\n setJson(res, 200, {\n data: await buildReviewSnapshot(cwd, scope, workspaceView, baseBranch),\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to load review snapshot') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/review/action') {\n try {\n const payload = await context.readJsonBody(req)\n setJson(res, 200, {\n data: await applyReviewAction(payload),\n })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to apply review action') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/review/git/init') {\n const payload = asRecord(await context.readJsonBody(req))\n const cwd = readString(payload?.cwd)\n if (!cwd) {\n setJson(res, 400, { error: 'Missing cwd' })\n return true\n }\n\n try {\n await initializeGitRepository(cwd)\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to initialize Git') })\n }\n return true\n }\n\n return false\n}\n","import { spawn } from 'node:child_process'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { homedir, tmpdir } from 'node:os'\nimport { join } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\nimport { resolvePythonCommand, resolveSkillInstallerScriptPath } from '../commandResolution.js'\nimport { getSpawnInvocation } from '../utils/commandInvocation.js'\n\ntype AppServerLike = {\n rpc(method: string, params: unknown): Promise<unknown>\n}\n\ntype ReadJsonBody = (req: IncomingMessage) => Promise<unknown>\n\ntype SkillRouteContext = {\n appServer: AppServerLike\n readJsonBody: ReadJsonBody\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n const record = asRecord(payload)\n if (!record) return fallback\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n return fallback\n}\n\nfunction setJson(res: ServerResponse, statusCode: number, payload: unknown): void {\n res.statusCode = statusCode\n res.setHeader('Content-Type', 'application/json; charset=utf-8')\n res.end(JSON.stringify(payload))\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction splitAbsolutePath(pathValue: string): string[] {\n return pathValue.split('/').filter(Boolean)\n}\n\nfunction buildAbsolutePath(parts: string[]): string {\n return `/${parts.join('/')}`\n}\n\nfunction normalizeSkillMarkdownPath(skillPath: string): string {\n if (!skillPath) return ''\n return skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n}\n\nfunction deriveSkillPathInfo(\n skillPath: string,\n knownPaths: Set<string> = new Set(),\n): {\n normalizedPath: string\n rootSkillPath: string\n rootSkillName: string\n installDir: string\n isNestedSkill: boolean\n} | null {\n const normalizedPath = normalizeSkillMarkdownPath(skillPath)\n const parts = splitAbsolutePath(normalizedPath)\n if (parts.length < 2) return null\n\n const pluginSkillsIndex = parts.lastIndexOf('skills')\n if (pluginSkillsIndex >= 2) {\n const pluginName = parts[pluginSkillsIndex - 2] ?? ''\n if (pluginName) {\n const rootSkillPath = buildAbsolutePath([...parts.slice(0, pluginSkillsIndex + 1), pluginName, 'SKILL.md'])\n if (knownPaths.has(rootSkillPath)) {\n return {\n normalizedPath,\n rootSkillPath,\n rootSkillName: pluginName,\n installDir: buildAbsolutePath(parts.slice(0, pluginSkillsIndex + 1)),\n isNestedSkill: normalizedPath !== rootSkillPath,\n }\n }\n }\n }\n\n const firstSkillsIndex = parts.indexOf('skills')\n if (firstSkillsIndex < 0 || firstSkillsIndex + 1 >= parts.length - 1) return null\n const rootSkillName = parts[firstSkillsIndex + 1] ?? ''\n if (!rootSkillName) return null\n const rootParts = parts.slice(0, firstSkillsIndex + 2)\n const installDirParts = parts.slice(0, firstSkillsIndex + 1)\n return {\n normalizedPath,\n rootSkillPath: buildAbsolutePath([...rootParts, 'SKILL.md']),\n rootSkillName,\n installDir: buildAbsolutePath(installDirParts),\n isNestedSkill: normalizedPath !== buildAbsolutePath([...rootParts, 'SKILL.md']),\n }\n}\n\nfunction getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nfunction getSharedSkillsInstallDir(): string {\n return join(getSkillsInstallDir(), 'shared_skills')\n}\n\nconst DEFAULT_COMMAND_TIMEOUT_MS = 120_000\nconst SKILL_SEARCH_METADATA_LIMIT = 20\nconst SKILL_SEARCH_METADATA_CONCURRENCY = 4\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<void> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n await new Promise<void>((resolve, reject) => {\n const invocation = getSpawnInvocation(command, args)\n const proc = spawn(invocation.command, invocation.args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve()\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nasync function runCommandWithOutput(command: string, args: string[], options: { cwd?: string; timeoutMs?: number } = {}): Promise<string> {\n const timeout = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS\n return await new Promise<string>((resolve, reject) => {\n const invocation = getSpawnInvocation(command, args)\n const proc = spawn(invocation.command, invocation.args, {\n cwd: options.cwd,\n env: process.env,\n stdio: ['ignore', 'pipe', 'pipe'],\n })\n let settled = false\n let stdout = ''\n let stderr = ''\n const timer = setTimeout(() => {\n if (settled) return\n settled = true\n proc.kill('SIGKILL')\n reject(new Error(`Command timed out after ${timeout}ms (${command} ${args.join(' ')})`))\n }, timeout)\n proc.stdout.on('data', (chunk: Buffer) => { stdout += chunk.toString() })\n proc.stderr.on('data', (chunk: Buffer) => { stderr += chunk.toString() })\n proc.on('error', (err) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n reject(err)\n })\n proc.on('close', (code) => {\n if (settled) return\n settled = true\n clearTimeout(timer)\n if (code === 0) {\n resolve(stdout.trim())\n return\n }\n const details = [stderr.trim(), stdout.trim()].filter(Boolean).join('\\n')\n const suffix = details.length > 0 ? `: ${details}` : ''\n reject(new Error(`Command failed (${command} ${args.join(' ')})${suffix}`))\n })\n })\n}\n\nfunction withTimeout<T>(promise: Promise<T>, ms: number, label: string): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const timer = setTimeout(() => reject(new Error(`${label} timed out after ${ms}ms`)), ms)\n promise.then(\n (val) => { clearTimeout(timer); resolve(val) },\n (err) => { clearTimeout(timer); reject(err) },\n )\n })\n}\n\nasync function detectUserSkillsDir(appServer: AppServerLike): Promise<string> {\n try {\n const result = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ scope?: string; path?: string }> }>\n }\n for (const entry of result.data ?? []) {\n for (const skill of entry.skills ?? []) {\n if (skill.scope !== 'user' || !skill.path) continue\n const skillInfo = deriveSkillPathInfo(skill.path)\n if (!skillInfo) continue\n return skillInfo.installDir\n }\n }\n } catch {}\n return getSkillsInstallDir()\n}\n\nasync function ensureInstalledSkillIsValid(appServer: AppServerLike, skillPath: string): Promise<void> {\n const result = (await appServer.rpc('skills/list', { forceReload: true })) as {\n data?: Array<{ errors?: Array<{ path?: string; message?: string }> }>\n }\n const normalized = skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`\n for (const entry of result.data ?? []) {\n for (const error of entry.errors ?? []) {\n if (error.path === normalized) {\n throw new Error(error.message || 'Installed skill is invalid')\n }\n }\n }\n}\n\ntype SkillHubEntry = {\n name: string\n owner: string\n description: string\n displayName: string\n publishedAt: number\n avatarUrl: string\n url: string\n installed: boolean\n source?: string\n path?: string\n enabled?: boolean\n installCountLabel?: string\n}\n\nasync function runGitFetchWithRefLockRetry(repoDir: string, args: string[] = ['fetch', 'origin']): Promise<void> {\n try {\n await runCommand('git', args, { cwd: repoDir })\n } catch (error) {\n const message = getErrorMessage(error, '')\n if (!message.includes(\"cannot lock ref 'refs/remotes/origin/\")) throw error\n const branchMatch = message.match(/refs\\/remotes\\/origin\\/([^\\s':]+)/)\n if (!branchMatch?.[1]) throw error\n const refPath = join(repoDir, '.git', 'refs', 'remotes', 'origin', branchMatch[1])\n try { await rm(refPath, { force: true }) } catch {}\n await runCommand('git', args, { cwd: repoDir })\n }\n}\n\nasync function buildLocalHubEntry(info: InstalledSkillInfo): Promise<SkillHubEntry> {\n let description = ''\n if (info.path) {\n try {\n description = extractSkillDescriptionFromMarkdown(await readFile(info.path, 'utf8'))\n } catch {}\n }\n return {\n name: info.name,\n owner: 'local',\n description,\n displayName: '',\n publishedAt: 0,\n avatarUrl: '',\n url: '',\n installed: true,\n path: info.path,\n enabled: info.enabled,\n }\n}\n\nfunction stripAnsi(value: string): string {\n return value.replace(/\\x1B\\[[0-?]*[ -/]*[@-~]/gu, '')\n}\n\nfunction parseNpxSkillsFindOutput(output: string, installedMap: Map<string, InstalledSkillInfo>): SkillHubEntry[] {\n const lines = stripAnsi(output).split(/\\r?\\n/u).map((line) => line.trim()).filter(Boolean)\n const results: SkillHubEntry[] = []\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n const match = line.match(/^(.+?@[^@\\s]+)\\s+([\\d.]+[KMB]?)\\s+installs$/iu)\n if (!match) continue\n const source = match[1]?.trim() ?? ''\n const installs = match[2]?.trim() ?? ''\n const atIndex = source.lastIndexOf('@')\n if (atIndex <= 0 || atIndex >= source.length - 1) continue\n const owner = source.slice(0, atIndex)\n const name = source.slice(atIndex + 1)\n let url = ''\n const next = lines[index + 1] ?? ''\n const urlMatch = next.match(/(?:^└\\s*)?(https?:\\/\\/\\S+)$/u)\n if (urlMatch?.[1]) {\n url = urlMatch[1]\n index += 1\n }\n const installedInfo = installedMap.get(name)\n results.push({\n name,\n owner,\n displayName: name,\n description: installs ? `${installs} installs` : '',\n installCountLabel: installs ? `${installs} installs` : '',\n publishedAt: 0,\n avatarUrl: '',\n url,\n installed: Boolean(installedInfo),\n source,\n path: installedInfo?.path,\n enabled: installedInfo?.enabled,\n })\n }\n return results\n}\n\nfunction parseGithubSkillSource(source: string): { ownerRepo: string; skillName: string } | null {\n const atIndex = source.lastIndexOf('@')\n if (atIndex <= 0 || atIndex >= source.length - 1) return null\n const ownerRepo = source.slice(0, atIndex).trim()\n const skillName = source.slice(atIndex + 1).trim()\n const ownerRepoParts = ownerRepo.split('/').filter(Boolean)\n if (ownerRepoParts.length !== 2 || skillName.length === 0) return null\n if (ownerRepoParts.some((part) => part.includes(':') || part.includes(' '))) return null\n return { ownerRepo, skillName }\n}\n\nfunction getGithubOwnerAvatarUrl(source: string): string {\n const parsed = parseGithubSkillSource(source)\n if (!parsed) return ''\n const owner = parsed.ownerRepo.split('/')[0] ?? ''\n return owner ? `https://github.com/${encodeURIComponent(owner)}.png?size=64` : ''\n}\n\nfunction buildGithubSkillRawCandidates(source: string): string[] {\n const parsed = parseGithubSkillSource(source)\n if (!parsed) return []\n const ownerRepo = parsed.ownerRepo.split('/').map(encodeURIComponent).join('/')\n const skillName = encodeURIComponent(parsed.skillName)\n const branches = ['main', 'master']\n const paths = [\n `skills/${skillName}/SKILL.md`,\n `${skillName}/SKILL.md`,\n 'SKILL.md',\n ]\n return branches.flatMap((branch) => paths.map((path) => `https://raw.githubusercontent.com/${ownerRepo}/${branch}/${path}`))\n}\n\nasync function fetchTextWithTimeout(url: string, timeoutMs: number): Promise<string> {\n const controller = new AbortController()\n const timeout = setTimeout(() => controller.abort(), timeoutMs)\n try {\n const resp = await fetch(url, {\n headers: { 'User-Agent': 'codex-web-local' },\n signal: controller.signal,\n })\n if (!resp.ok) return ''\n return await resp.text()\n } finally {\n clearTimeout(timeout)\n }\n}\n\nfunction resolveSkillIconUrl(icon: string, markdownUrl: string): string {\n const value = icon.trim().replace(/^['\"]|['\"]$/gu, '')\n if (!value) return ''\n if (/^https?:\\/\\//iu.test(value)) return value\n try {\n return new URL(value, markdownUrl).toString()\n } catch {\n return ''\n }\n}\n\nasync function fetchGithubSkillMetadata(source: string): Promise<Partial<Pick<SkillHubEntry, 'avatarUrl' | 'description'>>> {\n for (const candidate of buildGithubSkillRawCandidates(source)) {\n try {\n const markdown = await fetchTextWithTimeout(candidate, 4_000)\n if (!markdown) continue\n const description = extractSkillDescriptionFromMarkdown(markdown)\n const icon = extractSkillFrontmatterField(markdown, 'icon')\n const avatarUrl = icon ? resolveSkillIconUrl(icon, candidate) : getGithubOwnerAvatarUrl(source)\n if (description || avatarUrl) return { description, avatarUrl }\n } catch {}\n }\n return { avatarUrl: getGithubOwnerAvatarUrl(source) }\n}\n\nasync function mapWithConcurrency<T, R>(\n items: T[],\n concurrency: number,\n mapper: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length)\n let nextIndex = 0\n const workerCount = Math.max(1, Math.min(concurrency, items.length))\n await Promise.all(Array.from({ length: workerCount }, async () => {\n while (nextIndex < items.length) {\n const index = nextIndex\n nextIndex += 1\n results[index] = await mapper(items[index] as T, index)\n }\n }))\n return results\n}\n\nasync function enrichSkillSearchDescriptions(results: SkillHubEntry[]): Promise<SkillHubEntry[]> {\n const enrichedHead = await mapWithConcurrency(\n results.slice(0, SKILL_SEARCH_METADATA_LIMIT),\n SKILL_SEARCH_METADATA_CONCURRENCY,\n async (result) => {\n if (!result.source) return result\n const metadata = await fetchGithubSkillMetadata(result.source)\n return {\n ...result,\n description: metadata.description || result.description,\n avatarUrl: metadata.avatarUrl || result.avatarUrl,\n }\n },\n )\n return [...enrichedHead, ...results.slice(SKILL_SEARCH_METADATA_LIMIT)]\n}\n\ntype RpcSkillRecord = {\n name?: string\n description?: string\n shortDescription?: string\n path?: string\n scope?: string\n enabled?: boolean\n}\n\nfunction groupRpcSkillRecords<T extends RpcSkillRecord>(skills: T[]): T[] {\n const normalizedPathSet = new Set(\n skills\n .map((skill) => normalizeSkillMarkdownPath(typeof skill.path === 'string' ? skill.path : ''))\n .filter(Boolean),\n )\n const grouped = new Map<string, { preferred: T; hasRoot: boolean; anyEnabled: boolean }>()\n\n for (const skill of skills) {\n const rawPath = typeof skill.path === 'string' ? skill.path : ''\n const pathInfo = rawPath ? deriveSkillPathInfo(rawPath, normalizedPathSet) : null\n const groupingKey = pathInfo && pathInfo.isNestedSkill && normalizedPathSet.has(pathInfo.rootSkillPath)\n ? pathInfo.rootSkillPath\n : (pathInfo?.normalizedPath || rawPath || `${skill.scope ?? ''}:${skill.name ?? ''}`)\n const existing = grouped.get(groupingKey)\n const isRootEntry = pathInfo?.normalizedPath === groupingKey\n const groupedName = pathInfo && groupingKey === pathInfo.rootSkillPath\n ? pathInfo.rootSkillName\n : skill.name\n\n if (!existing) {\n grouped.set(groupingKey, {\n preferred: isRootEntry\n ? {\n ...skill,\n name: groupedName,\n path: groupingKey,\n }\n : {\n ...skill,\n name: groupedName,\n path: groupingKey,\n },\n hasRoot: isRootEntry,\n anyEnabled: skill.enabled !== false,\n })\n continue\n }\n\n existing.anyEnabled = existing.anyEnabled || skill.enabled !== false\n if (!existing.hasRoot && isRootEntry) {\n existing.preferred = {\n ...skill,\n name: groupedName,\n path: groupingKey,\n }\n existing.hasRoot = true\n continue\n }\n if (!existing.preferred.description && skill.description) {\n existing.preferred = { ...existing.preferred, description: skill.description }\n }\n if (!existing.preferred.shortDescription && skill.shortDescription) {\n existing.preferred = { ...existing.preferred, shortDescription: skill.shortDescription }\n }\n }\n\n return Array.from(grouped.values()).map(({ preferred, anyEnabled }) => ({\n ...preferred,\n enabled: preferred.enabled ?? anyEnabled,\n }))\n}\n\ntype InstalledSkillInfo = { name: string; path: string; enabled: boolean }\ntype SyncedSkill = { owner?: string; name: string; enabled: boolean }\n\ntype SkillsSyncState = {\n githubToken?: string\n githubUsername?: string\n repoOwner?: string\n repoName?: string\n installedOwners?: Record<string, string>\n lastPullCommitSha?: string\n lastPushCommitSha?: string\n lastSyncAttemptCount?: number\n lastSyncError?: string\n lastSyncAtIso?: string\n}\n\ntype GithubDeviceCodeResponse = {\n device_code: string\n user_code: string\n verification_uri: string\n expires_in: number\n interval: number\n}\n\ntype GithubTokenResponse = { access_token?: string; error?: string }\n\nconst GITHUB_DEVICE_CLIENT_ID = 'Iv1.b507a08c87ecfe98'\nconst DEFAULT_SKILLS_SYNC_REPO_NAME = 'codexskills'\nconst SKILLS_SYNC_MANIFEST_PATH = 'installed-skills.json'\nconst SYNC_UPSTREAM_SKILLS_OWNER = 'OpenClawAndroid'\nconst SYNC_UPSTREAM_SKILLS_REPO = 'skills'\nconst PRIVATE_SYNC_BRANCH = 'main'\nconst PUBLIC_UPSTREAM_BRANCH_ANDROID = 'android'\nconst PUBLIC_UPSTREAM_BRANCH_DEFAULT = 'main'\nlet startupSkillsSyncInitialized = false\n\ntype StartupSyncStatus = {\n inProgress: boolean\n mode: 'unauthenticated-bootstrap' | 'authenticated-fork-sync' | 'idle'\n branch: string\n lastAction: string\n lastRunAtIso: string\n lastSuccessAtIso: string\n lastError: string\n}\n\nconst startupSyncStatus: StartupSyncStatus = {\n inProgress: false,\n mode: 'idle',\n branch: PRIVATE_SYNC_BRANCH,\n lastAction: 'not-started',\n lastRunAtIso: '',\n lastSuccessAtIso: '',\n lastError: '',\n}\n\nasync function scanInstalledSkillsFromDir(skillsDir: string): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n try {\n const entries = await readdir(skillsDir, { withFileTypes: true })\n for (const entry of entries) {\n if (!entry.isDirectory() || entry.name.startsWith('.')) continue\n const skillMd = join(skillsDir, entry.name, 'SKILL.md')\n try {\n await stat(skillMd)\n map.set(entry.name, { name: entry.name, path: skillMd, enabled: true })\n } catch {}\n }\n } catch {}\n return map\n}\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n return await scanInstalledSkillsFromDir(getSkillsInstallDir())\n}\n\nasync function collectInstalledSkillsMap(appServer: AppServerLike): Promise<Map<string, InstalledSkillInfo>> {\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = await appServer.rpc('skills/list', {}) as { data?: Array<{ skills?: RpcSkillRecord[] }> }\n for (const entry of result.data ?? []) {\n for (const skill of groupRpcSkillRecords(entry.skills ?? [])) {\n if (skill.name) {\n installedMap.set(skill.name, { name: skill.name, path: skill.path ?? '', enabled: skill.enabled !== false })\n }\n }\n }\n } catch {}\n return installedMap\n}\n\nfunction extractSkillFrontmatterField(markdown: string, fieldName: string): string {\n const lines = markdown.split(/\\r?\\n/)\n if (lines[0]?.trim() !== '---') return ''\n const frontmatter: string[] = []\n for (let index = 1; index < lines.length; index += 1) {\n const line = lines[index] ?? ''\n if (line.trim() === '---') break\n frontmatter.push(line)\n }\n const escapedFieldName = fieldName.replace(/[.*+?^${}()|[\\]\\\\]/gu, '\\\\$&')\n const fieldPattern = new RegExp(`^${escapedFieldName}\\\\s*:`, 'iu')\n const valuePattern = new RegExp(`^${escapedFieldName}\\\\s*:\\\\s*`, 'iu')\n const fieldLine = frontmatter.find((line) => fieldPattern.test(line.trim()))\n if (!fieldLine) return ''\n return fieldLine.replace(valuePattern, '').replace(/^['\"]|['\"]$/gu, '').trim()\n}\n\nfunction extractSkillDescriptionFromMarkdown(markdown: string): string {\n const frontmatterDescription = extractSkillFrontmatterField(markdown, 'description')\n if (frontmatterDescription) return frontmatterDescription\n const lines = markdown.split(/\\r?\\n/)\n let inCodeFence = false\n for (const rawLine of lines) {\n const line = rawLine.trim()\n if (line.startsWith('```')) {\n inCodeFence = !inCodeFence\n continue\n }\n if (inCodeFence || line.length === 0) continue\n if (line.startsWith('#')) continue\n if (line.startsWith('>')) continue\n if (line.startsWith('- ') || line.startsWith('* ')) continue\n return line\n }\n return ''\n}\n\nfunction getSkillsSyncStatePath(): string {\n return join(getCodexHomeDir(), 'skills-sync.json')\n}\n\nasync function readSkillsSyncState(): Promise<SkillsSyncState> {\n try {\n const raw = await readFile(getSkillsSyncStatePath(), 'utf8')\n const parsed = JSON.parse(raw) as SkillsSyncState\n return parsed && typeof parsed === 'object' ? parsed : {}\n } catch {\n return {}\n }\n}\n\nasync function writeSkillsSyncState(state: SkillsSyncState): Promise<void> {\n await writeFile(getSkillsSyncStatePath(), JSON.stringify(state), 'utf8')\n}\n\nasync function getGithubJson<T>(url: string, token: string, method = 'GET', body?: unknown): Promise<T> {\n const resp = await fetch(url, {\n method,\n headers: {\n Accept: 'application/vnd.github+json',\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n body: body ? JSON.stringify(body) : undefined,\n })\n if (!resp.ok) {\n const text = await resp.text()\n throw new Error(`GitHub API ${method} ${url} failed (${resp.status}): ${text}`)\n }\n return await resp.json() as T\n}\n\nasync function startGithubDeviceLogin(): Promise<GithubDeviceCodeResponse> {\n const resp = await fetch('https://github.com/login/device/code', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n scope: 'repo read:user',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub device flow init failed (${resp.status})`)\n }\n return await resp.json() as GithubDeviceCodeResponse\n}\n\nasync function completeGithubDeviceLogin(deviceCode: string): Promise<{ token: string | null; error: string | null }> {\n const resp = await fetch('https://github.com/login/oauth/access_token', {\n method: 'POST',\n headers: {\n Accept: 'application/json',\n 'Content-Type': 'application/x-www-form-urlencoded',\n 'User-Agent': 'codex-web-local',\n },\n body: new URLSearchParams({\n client_id: GITHUB_DEVICE_CLIENT_ID,\n device_code: deviceCode,\n grant_type: 'urn:ietf:params:oauth:grant-type:device_code',\n }),\n })\n if (!resp.ok) {\n throw new Error(`GitHub token exchange failed (${resp.status})`)\n }\n const payload = await resp.json() as GithubTokenResponse\n if (!payload.access_token) return { token: null, error: payload.error || 'unknown_error' }\n return { token: payload.access_token, error: null }\n}\n\nfunction isAndroidLikeRuntime(): boolean {\n if (process.platform === 'android') return true\n if (existsSync('/data/data/com.termux')) return true\n if (process.env.TERMUX_VERSION) return true\n const prefix = process.env.PREFIX?.toLowerCase() ?? ''\n if (prefix.includes('/com.termux/')) return true\n const proot = process.env.PROOT_TMP_DIR?.toLowerCase() ?? ''\n return proot.length > 0\n}\n\nfunction getPreferredPublicUpstreamBranch(): string {\n return isAndroidLikeRuntime() ? PUBLIC_UPSTREAM_BRANCH_ANDROID : PUBLIC_UPSTREAM_BRANCH_DEFAULT\n}\n\nfunction isUpstreamSkillsRepo(repoOwner: string, repoName: string): boolean {\n return repoOwner.toLowerCase() === SYNC_UPSTREAM_SKILLS_OWNER.toLowerCase()\n && repoName.toLowerCase() === SYNC_UPSTREAM_SKILLS_REPO.toLowerCase()\n}\n\nasync function resolveGithubUsername(token: string): Promise<string> {\n const user = await getGithubJson<{ login: string }>('https://api.github.com/user', token)\n return user.login\n}\n\nasync function ensurePrivateForkFromUpstream(token: string, username: string, repoName: string): Promise<void> {\n const repoUrl = `https://api.github.com/repos/${username}/${repoName}`\n let created = false\n const existing = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const details = await existing.json() as { private?: boolean }\n if (details.private === true) return\n await getGithubJson(repoUrl, token, 'PATCH', { private: true })\n return\n }\n if (existing.status !== 404) {\n throw new Error(`Failed to check personal repo existence (${existing.status})`)\n }\n\n await getGithubJson(\n 'https://api.github.com/user/repos',\n token,\n 'POST',\n { name: repoName, private: true, auto_init: false, description: 'Codex skills private mirror sync' },\n )\n created = true\n\n let ready = false\n for (let i = 0; i < 20; i++) {\n const check = await fetch(repoUrl, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (check.ok) {\n ready = true\n break\n }\n await new Promise((resolve) => setTimeout(resolve, 1000))\n }\n if (!ready) throw new Error('Private mirror repo was created but is not available yet')\n if (!created) return\n\n const tmp = await mkdtemp(join(tmpdir(), 'codex-skills-seed-'))\n try {\n const upstreamUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = PRIVATE_SYNC_BRANCH\n try {\n await runCommand('git', ['clone', '--depth', '1', '--single-branch', '--branch', branch, upstreamUrl, tmp])\n } catch {\n await runCommand('git', ['clone', '--depth', '1', upstreamUrl, tmp])\n }\n const privateRemote = toGitHubTokenRemote(username, repoName, token)\n await runCommand('git', ['remote', 'set-url', 'origin', privateRemote], { cwd: tmp })\n try { await runCommand('git', ['checkout', '-B', branch], { cwd: tmp }) } catch {}\n await runCommand('git', ['push', '-u', 'origin', `HEAD:${branch}`], { cwd: tmp })\n } finally {\n await rm(tmp, { recursive: true, force: true })\n }\n}\n\nasync function readRemoteSkillsManifest(token: string, repoOwner: string, repoName: string): Promise<SyncedSkill[]> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n const resp = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (resp.status === 404) return []\n if (!resp.ok) throw new Error(`Failed to read remote manifest (${resp.status})`)\n const payload = await resp.json() as { content?: string }\n const content = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : '[]'\n const parsed = JSON.parse(content) as unknown\n if (!Array.isArray(parsed)) return []\n const skills: SyncedSkill[] = []\n for (const row of parsed) {\n const item = asRecord(row)\n const owner = typeof item?.owner === 'string' ? item.owner : ''\n const name = typeof item?.name === 'string' ? item.name : ''\n if (!name) continue\n skills.push({ ...(owner ? { owner } : {}), name, enabled: item?.enabled !== false })\n }\n return skills\n}\n\nasync function writeRemoteSkillsManifest(token: string, repoOwner: string, repoName: string, skills: SyncedSkill[]): Promise<boolean> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n let sha = ''\n const nextContent = JSON.stringify(skills, null, 2)\n const existing = await fetch(url, {\n headers: {\n Accept: 'application/vnd.github+json',\n Authorization: `Bearer ${token}`,\n 'X-GitHub-Api-Version': '2022-11-28',\n 'User-Agent': 'codex-web-local',\n },\n })\n if (existing.ok) {\n const payload = await existing.json() as { sha?: string; content?: string }\n sha = payload.sha ?? ''\n const currentContent = payload.content ? Buffer.from(payload.content.replace(/\\n/g, ''), 'base64').toString('utf8') : ''\n if (currentContent === nextContent) return false\n }\n const content = Buffer.from(nextContent, 'utf8').toString('base64')\n await getGithubJson(url, token, 'PUT', {\n message: 'Update synced skills manifest',\n content,\n ...(sha ? { sha } : {}),\n })\n return true\n}\n\nfunction toGitHubTokenRemote(repoOwner: string, repoName: string, token: string): string {\n return `https://x-access-token:${encodeURIComponent(token)}@github.com/${repoOwner}/${repoName}.git`\n}\n\nasync function ensureSkillsWorkingTreeRepo(\n repoUrl: string,\n branch: string,\n options: { localDir?: string; overwriteLocalFiles?: boolean } = {},\n): Promise<string> {\n const localDir = options.localDir ?? getSkillsInstallDir()\n await mkdir(localDir, { recursive: true })\n const gitDir = join(localDir, '.git')\n let hasGitDir = false\n try {\n const gitDirStat = await lstat(gitDir)\n hasGitDir = gitDirStat.isDirectory() || gitDirStat.isFile()\n } catch {\n hasGitDir = false\n }\n\n if (!hasGitDir) {\n await runCommand('git', ['init'], { cwd: localDir })\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: localDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: localDir })\n await runCommand('git', ['add', '-A'], { cwd: localDir })\n try { await runCommand('git', ['commit', '-m', 'Local skills snapshot before sync'], { cwd: localDir }) } catch {}\n await runCommand('git', ['branch', '-M', branch], { cwd: localDir })\n try { await runCommand('git', ['remote', 'add', 'origin', repoUrl], { cwd: localDir }) } catch {\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n }\n await runGitFetchWithRefLockRetry(localDir)\n if (options.overwriteLocalFiles) {\n await runCommand('git', ['reset', '--hard'], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n await runCommand('git', ['checkout', '-B', branch, `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n return localDir\n }\n try {\n await runCommand('git', ['merge', '--allow-unrelated-histories', '--no-edit', `origin/${branch}`], { cwd: localDir })\n } catch {}\n return localDir\n }\n\n await runCommand('git', ['remote', 'set-url', 'origin', repoUrl], { cwd: localDir })\n await runGitFetchWithRefLockRetry(localDir)\n if (options.overwriteLocalFiles) {\n try { await runCommand('git', ['reset', '--hard'], { cwd: localDir }) } catch {}\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n await runCommand('git', ['checkout', '-B', branch, `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n await runCommand('git', ['clean', '-fd'], { cwd: localDir })\n return localDir\n }\n const hasLocalChangesBeforeSync = await hasLocalUncommittedChanges(localDir)\n const localMtimesBeforeSync = hasLocalChangesBeforeSync ? await snapshotFileMtimes(localDir) : new Map<string, number>()\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n try {\n await runCommand('git', ['checkout', branch], { cwd: localDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n await runCommand('git', ['checkout', '-B', branch], { cwd: localDir })\n }\n await resolveMergeConflictsByNewerCommit(localDir, branch, localMtimesBeforeSync)\n const hasLocalChangesBeforePull = await hasLocalUncommittedChanges(localDir)\n const localMtimesBeforePull = hasLocalChangesBeforePull ? await snapshotFileMtimes(localDir) : new Map<string, number>()\n let createdAutostash = false\n try {\n const stashOutput = await runCommandWithOutput('git', ['stash', 'push', '--include-untracked', '-m', 'codex-skills-autostash'], { cwd: localDir })\n createdAutostash = !stashOutput.includes('No local changes to save')\n } catch {}\n let pulledMtimes = new Map<string, number>()\n await runGitFetchWithRefLockRetry(localDir, ['fetch', 'origin', branch])\n await runCommand('git', ['reset', '--hard', `origin/${branch}`], { cwd: localDir })\n pulledMtimes = await snapshotFileMtimes(localDir)\n if (createdAutostash) {\n try {\n await runCommand('git', ['stash', 'pop'], { cwd: localDir })\n } catch {\n await resolveStashPopConflictsByFileTime(localDir, localMtimesBeforePull, pulledMtimes)\n }\n }\n return localDir\n}\n\nasync function resolveMergeConflictsByNewerCommit(\n repoDir: string,\n branch: string,\n localMtimesBeforeSync: Map<string, number> = new Map<string, number>(),\n): Promise<void> {\n // Keep resolving until merge/rebase no longer reports unmerged paths.\n for (let i = 0; i < 20; i++) {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtimeMs = localMtimesBeforeSync.get(path) ?? 0\n const localMtimeSec = Math.floor(localMtimeMs / 1000)\n const remoteCommitTime = await getCommitTime(repoDir, `origin/${branch}`, path)\n if (remoteCommitTime > localMtimeSec) {\n await checkoutConflictSideWithFallback(repoDir, path, '--theirs')\n } else {\n await checkoutConflictSideWithFallback(repoDir, path, '--ours')\n }\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const rebaseHead = await readOptionalGitRef(repoDir, 'REBASE_HEAD')\n if (rebaseHead) {\n try {\n await runCommand('git', ['rebase', '--continue'], { cwd: repoDir })\n continue\n } catch {\n // Continue loop and resolve next rebase-conflict batch.\n continue\n }\n }\n const mergeHead = await readOptionalGitRef(repoDir, 'MERGE_HEAD')\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve skills merge by mtime policy'], { cwd: repoDir })\n continue\n }\n }\n throw new Error('Auto-resolve exceeded retry limit while reconciling sync conflicts')\n}\n\nasync function readOptionalGitRef(repoDir: string, ref: string): Promise<string> {\n try {\n return (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', ref], { cwd: repoDir })).trim()\n } catch {\n return ''\n }\n}\n\nasync function listUnmergedStages(repoDir: string, path: string): Promise<Set<number>> {\n const raw = (await runCommandWithOutput('git', ['ls-files', '-u', '--', path], { cwd: repoDir })).trim()\n const stages = new Set<number>()\n if (!raw) return stages\n for (const line of raw.split(/\\r?\\n/)) {\n const parts = line.trim().split(/\\s+/)\n const stage = Number.parseInt(parts[2] ?? '', 10)\n if (Number.isInteger(stage)) stages.add(stage)\n }\n return stages\n}\n\nasync function checkoutConflictSideWithFallback(\n repoDir: string,\n path: string,\n preferredSide: '--ours' | '--theirs',\n): Promise<void> {\n const stages = await listUnmergedStages(repoDir, path)\n const hasOurs = stages.has(2)\n const hasTheirs = stages.has(3)\n if (!hasOurs && !hasTheirs) return\n if (preferredSide === '--ours') {\n if (hasOurs) {\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n return\n }\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n return\n }\n if (hasTheirs) {\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n return\n }\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n}\n\nasync function getCommitTime(repoDir: string, ref: string, path: string): Promise<number> {\n try {\n const output = (await runCommandWithOutput('git', ['log', '-1', '--format=%ct', ref, '--', path], { cwd: repoDir })).trim()\n return output ? Number.parseInt(output, 10) : 0\n } catch {\n return 0\n }\n}\n\nasync function resolveStashPopConflictsByFileTime(\n repoDir: string,\n localMtimesBeforePull: Map<string, number>,\n pulledMtimes: Map<string, number>,\n): Promise<void> {\n const unmerged = (await runCommandWithOutput('git', ['diff', '--name-only', '--diff-filter=U'], { cwd: repoDir }))\n .split(/\\r?\\n/)\n .map((row) => row.trim())\n .filter(Boolean)\n if (unmerged.length === 0) return\n for (const path of unmerged) {\n const localMtime = localMtimesBeforePull.get(path) ?? 0\n const pulledMtime = pulledMtimes.get(path) ?? 0\n const side = localMtime >= pulledMtime ? '--theirs' : '--ours'\n await checkoutConflictSideWithFallback(repoDir, path, side)\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = await readOptionalGitRef(repoDir, 'MERGE_HEAD')\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve stash-pop conflicts by file time'], { cwd: repoDir })\n }\n}\n\nasync function snapshotFileMtimes(dir: string): Promise<Map<string, number>> {\n const mtimes = new Map<string, number>()\n await walkFileMtimes(dir, dir, mtimes)\n return mtimes\n}\n\nasync function hasLocalUncommittedChanges(repoDir: string): Promise<boolean> {\n const status = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n return status.length > 0\n}\n\nasync function hasCommittableWorkingTreeChanges(repoDir: string): Promise<boolean> {\n try {\n await runCommand('git', ['diff', '--quiet', '--exit-code', '--ignore-submodules=dirty'], { cwd: repoDir })\n await runCommand('git', ['diff', '--cached', '--quiet', '--exit-code', '--ignore-submodules=dirty'], { cwd: repoDir })\n } catch {\n return true\n }\n const untracked = (await runCommandWithOutput('git', ['ls-files', '--others', '--exclude-standard'], { cwd: repoDir })).trim()\n return untracked.length > 0\n}\n\nasync function walkFileMtimes(rootDir: string, currentDir: string, out: Map<string, number>): Promise<void> {\n let entries: Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n try {\n entries = (await readdir(currentDir, { withFileTypes: true })) as Array<{ name: string | Buffer; isDirectory: () => boolean; isFile: () => boolean }>\n } catch {\n return\n }\n for (const entry of entries) {\n const entryName = String(entry.name)\n if (entryName === '.git') continue\n const absolutePath = join(currentDir, entryName)\n const relativePath = absolutePath.slice(rootDir.length + 1)\n if (entry.isDirectory()) {\n await walkFileMtimes(rootDir, absolutePath, out)\n continue\n }\n if (!entry.isFile()) continue\n try {\n const info = await stat(absolutePath)\n out.set(relativePath, info.mtimeMs)\n } catch {}\n }\n}\n\nasync function syncInstalledSkillsFolderToRepo(\n token: string,\n repoOwner: string,\n repoName: string,\n _installedMap: Map<string, InstalledSkillInfo>,\n): Promise<void> {\n async function hasTrackedLocalFileChanges(repoDir: string, filePath: string): Promise<boolean> {\n const diffHead = (await runCommandWithOutput('git', ['diff', '--name-only', 'HEAD', '--', filePath], { cwd: repoDir })).trim()\n if (diffHead.length > 0) return true\n const diffCached = (await runCommandWithOutput('git', ['diff', '--cached', '--name-only', '--', filePath], { cwd: repoDir })).trim()\n return diffCached.length > 0\n }\n\n async function restoreProtectedFilesFromOrigin(repoDir: string, branch: string): Promise<void> {\n const protectedFiles = ['AGENTS.md']\n for (const filePath of protectedFiles) {\n const hasLocalEdits = await hasTrackedLocalFileChanges(repoDir, filePath)\n if (hasLocalEdits) continue\n try {\n await runCommand('git', ['cat-file', '-e', `origin/${branch}:${filePath}`], { cwd: repoDir })\n } catch {\n continue\n }\n await runCommand('git', ['checkout', `origin/${branch}`, '--', filePath], { cwd: repoDir })\n }\n try {\n await runCommand('git', ['cat-file', '-e', `origin/${branch}:shared_skills`], { cwd: repoDir })\n await runCommand('git', ['checkout', `origin/${branch}`, '--', 'shared_skills'], { cwd: repoDir })\n } catch {\n // Ignore when the branch does not track the nested shared_skills gitlink.\n }\n }\n\n function isNonFastForwardPushError(error: unknown): boolean {\n const text = getErrorMessage(error, '').toLowerCase()\n return text.includes('non-fast-forward')\n || text.includes('fetch first')\n || (text.includes('rejected') && text.includes('push'))\n }\n\n async function pushWithNonFastForwardRetry(repoDir: string, branch: string): Promise<void> {\n const maxAttempts = 3\n for (let attempt = 1; attempt <= maxAttempts; attempt++) {\n const hasLocalChangesBeforeReconcile = await hasLocalUncommittedChanges(repoDir)\n const localMtimesBeforeReconcile = hasLocalChangesBeforeReconcile ? await snapshotFileMtimes(repoDir) : new Map<string, number>()\n await runGitFetchWithRefLockRetry(repoDir)\n try {\n await runCommand('git', ['rebase', `origin/${branch}`], { cwd: repoDir })\n } catch {\n try { await runCommand('git', ['rebase', '--abort'], { cwd: repoDir }) } catch {}\n try {\n await runCommand('git', ['pull', '--rebase', '--autostash', 'origin', branch], { cwd: repoDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(repoDir, branch, localMtimesBeforeReconcile)\n await runCommand('git', ['pull', '--rebase', '--autostash', 'origin', branch], { cwd: repoDir })\n }\n }\n try {\n await runCommand('git', ['push', '--no-recurse-submodules', 'origin', `HEAD:${branch}`], { cwd: repoDir })\n const state = await readSkillsSyncState()\n const pushedHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir })\n await writeSkillsSyncState({\n ...state,\n lastPushCommitSha: pushedHead.trim(),\n lastSyncAttemptCount: attempt,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n return\n } catch (error) {\n if (!isNonFastForwardPushError(error) || attempt >= maxAttempts) {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n lastSyncAttemptCount: attempt,\n lastSyncError: getErrorMessage(error, 'push failed'),\n lastSyncAtIso: new Date().toISOString(),\n })\n throw error\n }\n }\n }\n throw new Error('Failed to push after non-fast-forward retries')\n }\n\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = PRIVATE_SYNC_BRANCH\n const repoDir = await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n void _installedMap\n await runCommand('git', ['config', 'user.email', 'skills-sync@local'], { cwd: repoDir })\n await runCommand('git', ['config', 'user.name', 'Skills Sync'], { cwd: repoDir })\n await restoreProtectedFilesFromOrigin(repoDir, branch)\n await runCommand('git', ['add', '.'], { cwd: repoDir })\n try {\n await runCommand('git', ['diff', '--cached', '--quiet', '--exit-code'], { cwd: repoDir })\n return\n } catch {}\n await runCommand('git', ['commit', '-m', 'Sync installed skills folder and manifest'], { cwd: repoDir })\n await pushWithNonFastForwardRetry(repoDir, branch)\n}\n\nasync function pullInstalledSkillsFolderFromRepo(token: string, repoOwner: string, repoName: string): Promise<string> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const isUpstream = isUpstreamSkillsRepo(repoOwner, repoName)\n const branch = isUpstream ? PUBLIC_UPSTREAM_BRANCH_ANDROID : PRIVATE_SYNC_BRANCH\n return await ensureSkillsWorkingTreeRepo(remoteUrl, branch, {\n ...(isUpstream ? { localDir: getSharedSkillsInstallDir() } : {}),\n overwriteLocalFiles: isUpstream,\n })\n}\n\nasync function bootstrapSkillsFromUpstreamIntoLocal(): Promise<string> {\n const repoUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n return await ensureSkillsWorkingTreeRepo(repoUrl, PUBLIC_UPSTREAM_BRANCH_ANDROID, {\n localDir: getSharedSkillsInstallDir(),\n overwriteLocalFiles: true,\n })\n}\n\nasync function collectLocalSyncedSkills(appServer: AppServerLike): Promise<SyncedSkill[]> {\n const state = await readSkillsSyncState()\n const owners = { ...(state.installedOwners ?? {}) }\n const skills = (await appServer.rpc('skills/list', {})) as {\n data?: Array<{ skills?: Array<{ name?: string; enabled?: boolean; path?: string; scope?: string }> }>\n }\n const seen = new Set<string>()\n const synced: SyncedSkill[] = []\n let ownersChanged = false\n for (const entry of skills.data ?? []) {\n for (const skill of groupRpcSkillRecords(entry.skills ?? [])) {\n const name = typeof skill.name === 'string' ? skill.name : ''\n if (!name || skill.scope !== 'user' || seen.has(name)) continue\n seen.add(name)\n const owner = owners[name] ?? ''\n synced.push({ ...(owner ? { owner } : {}), name, enabled: skill.enabled !== false })\n }\n }\n if (ownersChanged) {\n await writeSkillsSyncState({ ...state, installedOwners: owners })\n }\n synced.sort((a, b) => `${a.owner ?? ''}/${a.name}`.localeCompare(`${b.owner ?? ''}/${b.name}`))\n return synced\n}\n\nasync function autoPushSyncedSkills(appServer: AppServerLike): Promise<void> {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) return\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n throw new Error('Refusing to push to upstream skills repository')\n }\n const repoDir = getSkillsInstallDir()\n await runCommand('git', ['fetch', 'origin', PRIVATE_SYNC_BRANCH], { cwd: repoDir })\n const head = (await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir })).trim()\n const originHead = (await runCommandWithOutput('git', ['rev-parse', `origin/${PRIVATE_SYNC_BRANCH}`], { cwd: repoDir })).trim()\n const hasCommittableChanges = await hasCommittableWorkingTreeChanges(repoDir)\n // After a successful pull, if local tree is already clean and equal to remote,\n // skip push entirely to avoid rewriting/deleting remote-only updates.\n if (!hasCommittableChanges && head === originHead) return\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await scanInstalledSkillsFromDisk()\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n}\n\nasync function ensureCodexAgentsSymlinkToSkillsAgents(): Promise<void> {\n const codexHomeDir = getCodexHomeDir()\n const skillsAgentsPath = join(codexHomeDir, 'skills', 'AGENTS.md')\n const codexAgentsPath = join(codexHomeDir, 'AGENTS.md')\n await mkdir(join(codexHomeDir, 'skills'), { recursive: true })\n let copiedFromCodex = false\n try {\n const codexAgentsStat = await lstat(codexAgentsPath)\n if (codexAgentsStat.isFile() || codexAgentsStat.isSymbolicLink()) {\n const content = await readFile(codexAgentsPath, 'utf8')\n await writeFile(skillsAgentsPath, content, 'utf8')\n copiedFromCodex = true\n } else {\n await rm(codexAgentsPath, { force: true, recursive: true })\n }\n } catch {}\n if (!copiedFromCodex) {\n try {\n const skillsAgentsStat = await stat(skillsAgentsPath)\n if (!skillsAgentsStat.isFile()) {\n await rm(skillsAgentsPath, { force: true, recursive: true })\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n } catch {\n await writeFile(skillsAgentsPath, '', 'utf8')\n }\n }\n const relativeTarget = join('skills', 'AGENTS.md')\n try {\n const current = await lstat(codexAgentsPath)\n if (current.isSymbolicLink()) {\n const existingTarget = await readlink(codexAgentsPath)\n if (existingTarget === relativeTarget) return\n }\n await rm(codexAgentsPath, { force: true, recursive: true })\n } catch {}\n await symlink(relativeTarget, codexAgentsPath)\n}\n\nasync function runSkillsSyncStartup(appServer: AppServerLike): Promise<void> {\n if (startupSyncStatus.inProgress) return\n startupSyncStatus.inProgress = true\n startupSyncStatus.lastRunAtIso = new Date().toISOString()\n startupSyncStatus.lastError = ''\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken) {\n await ensureCodexAgentsSymlinkToSkillsAgents()\n if (!isAndroidLikeRuntime()) {\n startupSyncStatus.mode = 'idle'\n startupSyncStatus.lastAction = 'skip-upstream-non-android'\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n return\n }\n startupSyncStatus.mode = 'unauthenticated-bootstrap'\n startupSyncStatus.branch = getPreferredPublicUpstreamBranch()\n startupSyncStatus.lastAction = 'pull-upstream'\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'pull-upstream-complete'\n return\n }\n startupSyncStatus.mode = 'authenticated-fork-sync'\n startupSyncStatus.branch = PRIVATE_SYNC_BRANCH\n startupSyncStatus.lastAction = 'ensure-private-fork'\n const username = state.githubUsername || await resolveGithubUsername(state.githubToken)\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(state.githubToken, username, repoName)\n await writeSkillsSyncState({ ...state, githubUsername: username, repoOwner: username, repoName })\n startupSyncStatus.lastAction = 'pull-private-fork'\n await pullInstalledSkillsFolderFromRepo(state.githubToken, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n startupSyncStatus.lastAction = 'push-private-fork'\n await autoPushSyncedSkills(appServer)\n startupSyncStatus.lastSuccessAtIso = new Date().toISOString()\n startupSyncStatus.lastAction = 'startup-sync-complete'\n } catch (error) {\n startupSyncStatus.lastError = getErrorMessage(error, 'startup-sync-failed')\n startupSyncStatus.lastAction = 'startup-sync-failed'\n } finally {\n startupSyncStatus.inProgress = false\n }\n}\n\nexport async function initializeSkillsSyncOnStartup(appServer: AppServerLike): Promise<void> {\n if (startupSkillsSyncInitialized) return\n startupSkillsSyncInitialized = true\n await runSkillsSyncStartup(appServer)\n}\n\nasync function finalizeGithubLoginAndSync(token: string, username: string, appServer: AppServerLike): Promise<void> {\n const repoName = DEFAULT_SKILLS_SYNC_REPO_NAME\n await ensurePrivateForkFromUpstream(token, username, repoName)\n const current = await readSkillsSyncState()\n await writeSkillsSyncState({ ...current, githubToken: token, githubUsername: username, repoOwner: username, repoName })\n await pullInstalledSkillsFolderFromRepo(token, username, repoName)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n await autoPushSyncedSkills(appServer)\n}\n\nexport async function handleSkillsRoutes(\n req: IncomingMessage,\n res: ServerResponse,\n url: URL,\n context: SkillRouteContext,\n): Promise<boolean> {\n const { appServer, readJsonBody } = context\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub') {\n try {\n const installedMap = await collectInstalledSkillsMap(appServer)\n const installed = await Promise.all([...installedMap.values()].map((info) => buildLocalHubEntry(info)))\n installed.sort((a, b) => a.name.localeCompare(b.name))\n setJson(res, 200, { installed })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch skills hub') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/search') {\n try {\n const query = (url.searchParams.get('q') || '').trim()\n if (query.length < 2) {\n setJson(res, 200, { results: [] })\n return true\n }\n const installedMap = await collectInstalledSkillsMap(appServer)\n const output = await runCommandWithOutput('npx', ['--yes', 'skills', 'find', query], { timeoutMs: 60_000 })\n const results = await enrichSkillSearchDescriptions(parseNpxSkillsFindOutput(output, installedMap))\n setJson(res, 200, { results })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to search skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-sync/status') {\n const state = await readSkillsSyncState()\n setJson(res, 200, {\n data: {\n loggedIn: Boolean(state.githubToken),\n githubUsername: state.githubUsername ?? '',\n repoOwner: state.repoOwner ?? '',\n repoName: state.repoName ?? '',\n configured: Boolean(state.githubToken && state.repoOwner && state.repoName),\n telemetry: {\n lastPullCommitSha: state.lastPullCommitSha ?? '',\n lastPushCommitSha: state.lastPushCommitSha ?? '',\n lastSyncAttemptCount: state.lastSyncAttemptCount ?? 0,\n lastSyncError: state.lastSyncError ?? '',\n lastSyncAtIso: state.lastSyncAtIso ?? '',\n },\n startup: {\n inProgress: startupSyncStatus.inProgress,\n mode: startupSyncStatus.mode,\n branch: startupSyncStatus.branch,\n lastAction: startupSyncStatus.lastAction,\n lastRunAtIso: startupSyncStatus.lastRunAtIso,\n lastSuccessAtIso: startupSyncStatus.lastSuccessAtIso,\n lastError: startupSyncStatus.lastError,\n },\n },\n })\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/start-login') {\n try {\n const started = await startGithubDeviceLogin()\n setJson(res, 200, { data: started })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to start GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/token-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const token = typeof payload?.token === 'string' ? payload.token.trim() : ''\n if (!token) {\n setJson(res, 400, { error: 'Missing GitHub token' })\n return true\n }\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to login with GitHub token') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/logout') {\n try {\n const state = await readSkillsSyncState()\n await writeSkillsSyncState({\n ...state,\n githubToken: undefined,\n githubUsername: undefined,\n repoOwner: undefined,\n repoName: undefined,\n })\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 500, { error: getErrorMessage(error, 'Failed to logout GitHub') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/github/complete-login') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const deviceCode = typeof payload?.deviceCode === 'string' ? payload.deviceCode : ''\n if (!deviceCode) {\n setJson(res, 400, { error: 'Missing deviceCode' })\n return true\n }\n const result = await completeGithubDeviceLogin(deviceCode)\n if (!result.token) {\n setJson(res, 200, { ok: false, pending: result.error === 'authorization_pending', error: result.error || 'login_failed' })\n return true\n }\n const token = result.token\n const username = await resolveGithubUsername(token)\n await finalizeGithubLoginAndSync(token, username, appServer)\n setJson(res, 200, { ok: true, data: { githubUsername: username } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to complete GitHub login') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/push') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n setJson(res, 400, { error: 'Skills sync is not configured yet' })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n setJson(res, 400, { error: 'Refusing to push to upstream repository' })\n return true\n }\n const local = await collectLocalSyncedSkills(appServer)\n const installedMap = await collectInstalledSkillsMap(appServer)\n await writeRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName, local)\n await syncInstalledSkillsFolderToRepo(state.githubToken, state.repoOwner, state.repoName, installedMap)\n setJson(res, 200, { ok: true, data: { synced: local.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to push synced skills') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/startup-sync') {\n try {\n await runSkillsSyncStartup(appServer)\n setJson(res, 200, { ok: true })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to run startup sync') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-sync/pull') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n const repoDir = await bootstrapSkillsFromUpstreamIntoLocal()\n const localSkills = await scanInstalledSkillsFromDir(repoDir)\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: localSkills.size, source: 'upstream' } })\n return true\n }\n if (isUpstreamSkillsRepo(state.repoOwner, state.repoName)) {\n const repoDir = await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const localSkills = await scanInstalledSkillsFromDir(repoDir)\n const pulledHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: repoDir }).catch(() => '')\n await writeSkillsSyncState({\n ...state,\n lastPullCommitSha: pulledHead.trim(),\n lastSyncAttemptCount: 1,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: localSkills.size, source: 'upstream' } })\n return true\n }\n const remote = await readRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName)\n const localDir = await detectUserSkillsDir(appServer)\n await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const localSkills = await scanInstalledSkillsFromDisk()\n const missingAfterPull: string[] = []\n for (const skill of remote) {\n const owner = skill.owner || ''\n if (!owner) continue\n if (!localSkills.has(skill.name)) {\n missingAfterPull.push(`${owner}/${skill.name}`)\n continue\n }\n const skillPath = join(localDir, skill.name)\n await appServer.rpc('skills/config/write', { path: skillPath, enabled: skill.enabled })\n }\n if (missingAfterPull.length > 0) {\n throw new Error(`Missing skill folders after pull: ${missingAfterPull.join(', ')}`)\n }\n const remoteNames = new Set(remote.map((row) => row.name))\n for (const [name, localInfo] of localSkills.entries()) {\n if (!remoteNames.has(name)) {\n await rm(localInfo.path.replace(/\\/SKILL\\.md$/, ''), { recursive: true, force: true })\n }\n }\n const nextOwners: Record<string, string> = {}\n for (const item of remote) {\n const owner = item.owner || ''\n if (owner) nextOwners[item.name] = owner\n }\n const pulledHead = await runCommandWithOutput('git', ['rev-parse', 'HEAD'], { cwd: getSkillsInstallDir() }).catch(() => '')\n await writeSkillsSyncState({\n ...state,\n installedOwners: nextOwners,\n lastPullCommitSha: pulledHead.trim(),\n lastSyncAttemptCount: 1,\n lastSyncError: '',\n lastSyncAtIso: new Date().toISOString(),\n })\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: remote.length } })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to pull synced skills') })\n }\n return true\n }\n\n if (req.method === 'GET' && url.pathname === '/codex-api/skills-hub/readme') {\n try {\n const owner = url.searchParams.get('owner') || ''\n const name = url.searchParams.get('name') || ''\n const installed = url.searchParams.get('installed') === 'true'\n const skillPath = url.searchParams.get('path') || ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n if (installed) {\n const installedMap = await scanInstalledSkillsFromDisk()\n const installedInfo = installedMap.get(name)\n const localSkillPath = installedInfo?.path\n || (skillPath ? (skillPath.endsWith('/SKILL.md') ? skillPath : `${skillPath}/SKILL.md`) : '')\n if (localSkillPath) {\n const content = await readFile(localSkillPath, 'utf8')\n const description = extractSkillDescriptionFromMarkdown(content)\n setJson(res, 200, { content, description, source: 'local' })\n return true\n }\n }\n setJson(res, 404, { error: 'Only installed local skills are available in Skills Hub.' })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch SKILL.md') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/install') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const source = typeof payload?.source === 'string' ? payload.source.trim() : ''\n const owner = typeof payload?.owner === 'string' ? payload.owner.trim() : ''\n const name = typeof payload?.name === 'string' ? payload.name.trim() : ''\n const installSource = source || (owner && name ? `${owner}@${name}` : '')\n if (!installSource || !/^[A-Za-z0-9._/-]+@[A-Za-z0-9._-]+$/u.test(installSource)) {\n setJson(res, 400, { error: 'Missing or invalid skill source' })\n return true\n }\n await runCommand('npx', ['--yes', 'skills', 'add', installSource, '--yes', '--global'], { timeoutMs: 120_000 })\n try { await withTimeout(appServer.rpc('skills/list', { forceReload: true }), 10_000, 'skills/list reload') } catch {}\n const installedMap = await collectInstalledSkillsMap(appServer)\n const installed = installedMap.get(name || installSource.slice(installSource.lastIndexOf('@') + 1))\n if (!installed?.path) {\n throw new Error(`Skill install completed but ${installSource} was not found in local installed skills`)\n }\n await ensureInstalledSkillIsValid(appServer, installed.path)\n autoPushSyncedSkills(appServer).catch(() => {})\n setJson(res, 200, { ok: true, path: installed.path })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to install skill') })\n }\n return true\n }\n\n if (req.method === 'POST' && url.pathname === '/codex-api/skills-hub/uninstall') {\n try {\n const payload = asRecord(await readJsonBody(req))\n const name = typeof payload?.name === 'string' ? payload.name : ''\n const path = typeof payload?.path === 'string' ? payload.path : ''\n const normalizedPath = path.endsWith('/SKILL.md') ? path.slice(0, -'/SKILL.md'.length) : path\n const target = normalizedPath || (name ? join(getSkillsInstallDir(), name) : '')\n if (!target) {\n setJson(res, 400, { error: 'Missing name or path' })\n return true\n }\n await rm(target, { recursive: true, force: true })\n if (name) {\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}) }\n delete nextOwners[name]\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n }\n autoPushSyncedSkills(appServer).catch(() => {})\n try { await withTimeout(appServer.rpc('skills/list', { forceReload: true }), 10_000, 'skills/list reload') } catch {}\n setJson(res, 200, { ok: true, deletedPath: target })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to uninstall skill') })\n }\n return true\n }\n\n return false\n}\n","import { spawnSync } from 'node:child_process'\nimport { basename, extname } from 'node:path'\n\nconst WINDOWS_CMD_NAMES = new Set(['codex', 'npm', 'npx'])\n\nfunction quoteCmdExeArg(value: string): string {\n const normalized = value.replace(/\"/g, '\"\"')\n if (!/[\\s\"]/u.test(normalized)) {\n return normalized\n }\n return `\"${normalized}\"`\n}\n\nfunction needsCmdExeWrapper(command: string): boolean {\n if (process.platform !== 'win32') {\n return false\n }\n\n const lowerCommand = command.toLowerCase()\n const baseName = basename(lowerCommand)\n if (/\\.(cmd|bat)$/i.test(baseName)) {\n return true\n }\n\n if (extname(baseName)) {\n return false\n }\n\n return WINDOWS_CMD_NAMES.has(baseName)\n}\n\nexport function getSpawnInvocation(command: string, args: string[] = []): { command: string; args: string[] } {\n if (needsCmdExeWrapper(command)) {\n return {\n command: 'cmd.exe',\n args: ['/d', '/s', '/c', [quoteCmdExeArg(command), ...args.map((arg) => quoteCmdExeArg(arg))].join(' ')],\n }\n }\n\n return { command, args }\n}\n\nexport function spawnSyncCommand(\n command: string,\n args: string[] = [],\n options: Parameters<typeof spawnSync>[2] = {},\n) {\n const invocation = getSpawnInvocation(command, args)\n return spawnSync(invocation.command, invocation.args, options)\n}\n","import { basename } from 'node:path'\n\ntype TelegramUpdate = {\n update_id?: number\n message?: {\n message_id?: number\n text?: string\n from?: {\n id?: number\n }\n chat?: {\n id?: number\n }\n }\n callback_query?: {\n id?: string\n data?: string\n from?: {\n id?: number\n }\n message?: {\n chat?: {\n id?: number\n }\n }\n }\n}\n\ntype AppServerLike = {\n rpc: (method: string, params: unknown) => Promise<unknown>\n onNotification: (listener: (value: { method: string; params: unknown }) => void) => () => void\n}\n\ntype TelegramThreadBridgeOptions = {\n onChatSeen?: (chatId: number) => void\n}\n\nexport type TelegramBridgeStatus = {\n configured: boolean\n active: boolean\n mappedChats: number\n mappedThreads: number\n allowedUsers: number\n allowAllUsers: boolean\n lastError: string\n}\n\ntype TelegramBotCommand = {\n command: string\n description: string\n}\n\nconst TELEGRAM_MESSAGE_MAX_LENGTH = 3500\nconst TELEGRAM_BOT_COMMANDS: TelegramBotCommand[] = [\n { command: 'start', description: 'Show quick start and thread picker' },\n { command: 'threads', description: 'List recent threads to connect' },\n { command: 'newthread', description: 'Create and connect a new thread' },\n { command: 'thread', description: 'Connect existing thread: /thread <id>' },\n { command: 'current', description: 'Show currently connected thread' },\n { command: 'history', description: 'Show recent history for current thread' },\n { command: 'status', description: 'Show bridge and mapping status' },\n { command: 'whoami', description: 'Show your Telegram IDs' },\n { command: 'help', description: 'Show available commands' },\n]\n\nfunction asRecord(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null\n}\n\nfunction getErrorMessage(payload: unknown, fallback: string): string {\n if (payload instanceof Error && payload.message.trim().length > 0) {\n return payload.message\n }\n\n const record = asRecord(payload)\n if (!record) return fallback\n\n const error = record.error\n if (typeof error === 'string' && error.length > 0) return error\n\n const nestedError = asRecord(error)\n if (nestedError && typeof nestedError.message === 'string' && nestedError.message.length > 0) {\n return nestedError.message\n }\n\n return fallback\n}\n\ntype NormalizedTelegramAllowlist = {\n allowAllUsers: boolean\n allowedUserIds: number[]\n}\n\nfunction normalizeTelegramAllowlist(values: unknown): NormalizedTelegramAllowlist {\n const rawValues = Array.isArray(values) ? values : []\n const allowAllUsers = rawValues.some((value) => typeof value === 'string' && value.trim() === '*')\n const allowedUserIds = Array.from(new Set(rawValues\n .map((value) => {\n if (typeof value === 'number' && Number.isFinite(value)) {\n return Math.trunc(value)\n }\n if (typeof value === 'string' && value.trim().length > 0) {\n const normalized = value.trim().replace(/^(telegram|tg):/i, '').trim()\n if (/^-?\\d+$/.test(normalized)) {\n return Number.parseInt(normalized, 10)\n }\n }\n return Number.NaN\n })\n .filter((value) => Number.isFinite(value)))).slice(0, 100)\n return { allowAllUsers, allowedUserIds }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/g, '&amp;')\n .replace(/</g, '&lt;')\n .replace(/>/g, '&gt;')\n}\n\nfunction renderMarkdownInlineToTelegramHtml(value: string): string {\n let rendered = escapeHtml(value)\n rendered = rendered.replace(/\\[([^\\]\\n]+)\\]\\((https?:\\/\\/[^\\s)]+)\\)/g, '<a href=\"$2\">$1</a>')\n rendered = rendered.replace(/`([^`\\n]+)`/g, '<code>$1</code>')\n rendered = rendered.replace(/\\*\\*([^*\\n][^*\\n]*?)\\*\\*/g, '<b>$1</b>')\n rendered = rendered.replace(/__([^_\\n][^_\\n]*?)__/g, '<b>$1</b>')\n rendered = rendered.replace(/\\*([^*\\n][^*\\n]*?)\\*/g, '<i>$1</i>')\n rendered = rendered.replace(/_([^_\\n][^_\\n]*?)_/g, '<i>$1</i>')\n rendered = rendered.replace(/^(#{1,6})\\s+(.+)$/gm, (_match, _hashes, content: string) => `<b>${content}</b>`)\n return rendered\n}\n\nfunction renderMarkdownToTelegramHtml(markdown: string): string {\n const normalized = markdown.replace(/\\r\\n/g, '\\n')\n const fencedCodeRegex = /```([a-zA-Z0-9_-]+)?\\n([\\s\\S]*?)```/g\n let cursor = 0\n const parts: string[] = []\n let match = fencedCodeRegex.exec(normalized)\n\n while (match) {\n const [fullMatch, lang, code] = match\n const matchIndex = match.index\n const before = normalized.slice(cursor, matchIndex)\n if (before) {\n parts.push(renderMarkdownInlineToTelegramHtml(before))\n }\n\n const escapedCode = escapeHtml((code ?? '').replace(/\\n+$/g, ''))\n const escapedLang = typeof lang === 'string' ? escapeHtml(lang) : ''\n if (escapedLang) {\n parts.push(`<pre><code class=\"language-${escapedLang}\">${escapedCode}</code></pre>`)\n } else {\n parts.push(`<pre>${escapedCode}</pre>`)\n }\n\n cursor = matchIndex + fullMatch.length\n match = fencedCodeRegex.exec(normalized)\n }\n\n const tail = normalized.slice(cursor)\n if (tail) {\n parts.push(renderMarkdownInlineToTelegramHtml(tail))\n }\n\n return parts.join('')\n}\n\nfunction splitTelegramText(text: string, maxLength = TELEGRAM_MESSAGE_MAX_LENGTH): string[] {\n const normalized = text.replace(/\\r\\n/g, '\\n').trim()\n if (!normalized) return []\n if (normalized.length <= maxLength) return [normalized]\n\n const chunks: string[] = []\n let remaining = normalized\n\n while (remaining.length > maxLength) {\n let splitIndex = remaining.lastIndexOf('\\n\\n', maxLength)\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf('\\n', maxLength)\n }\n if (splitIndex < Math.floor(maxLength * 0.5)) {\n splitIndex = remaining.lastIndexOf(' ', maxLength)\n }\n if (splitIndex <= 0) {\n splitIndex = maxLength\n }\n\n const chunk = remaining.slice(0, splitIndex).trim()\n if (chunk) chunks.push(chunk)\n remaining = remaining.slice(splitIndex).trim()\n }\n\n if (remaining) chunks.push(remaining)\n return chunks\n}\n\nexport class TelegramThreadBridge {\n private token: string\n private readonly appServer: AppServerLike\n private readonly defaultCwd: string\n private allowAllUsers = false\n private allowedUserIds = new Set<number>()\n private readonly threadIdByChatId = new Map<number, string>()\n private readonly chatIdsByThreadId = new Map<string, Set<number>>()\n private readonly lastForwardedTurnByThreadId = new Map<string, string>()\n private active = false\n private pollingTask: Promise<void> | null = null\n private nextUpdateOffset = 0\n private lastError = ''\n private readonly onChatSeen?: (chatId: number) => void\n\n constructor(appServer: AppServerLike, options: TelegramThreadBridgeOptions = {}) {\n this.appServer = appServer\n this.token = process.env.TELEGRAM_BOT_TOKEN?.trim() ?? ''\n this.defaultCwd = process.env.TELEGRAM_DEFAULT_CWD?.trim() ?? process.cwd()\n this.configureAllowedUserIds(\n (process.env.TELEGRAM_ALLOWED_USER_IDS ?? '')\n .split(',')\n .map((value) => value.trim())\n .filter(Boolean),\n )\n this.onChatSeen = options.onChatSeen\n }\n\n start(): void {\n if (!this.token || this.active) return\n this.active = true\n void this.syncBotCommands().catch(() => {})\n void this.notifyOnlineForKnownChats().catch(() => {})\n this.pollingTask = this.pollLoop()\n this.appServer.onNotification((notification) => {\n void this.handleNotification(notification).catch(() => {})\n })\n }\n\n stop(): void {\n this.active = false\n }\n\n private async pollLoop(): Promise<void> {\n while (this.active) {\n try {\n const updates = await this.getUpdates()\n this.lastError = ''\n for (const update of updates) {\n const updateId = typeof update.update_id === 'number' ? update.update_id : -1\n if (updateId >= 0) {\n this.nextUpdateOffset = Math.max(this.nextUpdateOffset, updateId + 1)\n }\n await this.handleIncomingUpdate(update)\n }\n } catch (error) {\n this.lastError = getErrorMessage(error, 'Telegram polling failed')\n await new Promise((resolve) => setTimeout(resolve, 1500))\n }\n }\n }\n\n private async getUpdates(): Promise<TelegramUpdate[]> {\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n const response = await fetch(this.apiUrl('getUpdates'), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n timeout: 45,\n offset: this.nextUpdateOffset,\n allowed_updates: ['message', 'callback_query'],\n }),\n })\n const payload = asRecord(await response.json())\n const result = Array.isArray(payload?.result) ? payload.result : []\n return result as TelegramUpdate[]\n }\n\n private apiUrl(method: string): string {\n return `https://api.telegram.org/bot${this.token}/${method}`\n }\n\n configureToken(token: string): void {\n const normalizedToken = token.trim()\n if (!normalizedToken) {\n throw new Error('Telegram bot token is required')\n }\n this.token = normalizedToken\n void this.syncBotCommands().catch(() => {})\n }\n\n getStatus(): TelegramBridgeStatus {\n return {\n configured: this.token.length > 0,\n active: this.active,\n mappedChats: this.threadIdByChatId.size,\n mappedThreads: this.chatIdsByThreadId.size,\n allowedUsers: this.allowedUserIds.size,\n allowAllUsers: this.allowAllUsers,\n lastError: this.lastError,\n }\n }\n\n configureAllowedUserIds(allowedUserIds: unknown): void {\n const normalized = normalizeTelegramAllowlist(allowedUserIds)\n this.allowAllUsers = normalized.allowAllUsers\n this.allowedUserIds = new Set(normalized.allowedUserIds)\n }\n\n connectThread(threadId: string, chatId: number, token?: string): void {\n const normalizedThreadId = threadId.trim()\n if (!normalizedThreadId) {\n throw new Error('threadId is required')\n }\n if (!Number.isFinite(chatId)) {\n throw new Error('chatId must be a number')\n }\n if (typeof token === 'string' && token.trim().length > 0) {\n this.configureToken(token)\n }\n if (!this.token) {\n throw new Error('Telegram bot token is not configured')\n }\n this.bindChatToThread(chatId, normalizedThreadId)\n this.markChatSeen(chatId)\n this.start()\n void this.sendOnlineMessage(chatId).catch(() => {})\n }\n\n private markChatSeen(chatId: number): void {\n if (!Number.isFinite(chatId)) return\n this.onChatSeen?.(Math.trunc(chatId))\n }\n\n private async sendTelegramMessage(\n chatId: number,\n text: string,\n options: { replyMarkup?: unknown } = {},\n ): Promise<void> {\n const chunks = splitTelegramText(text)\n if (chunks.length === 0) return\n\n for (let index = 0; index < chunks.length; index += 1) {\n const chunk = chunks[index]\n const replyMarkup = index === 0 ? options.replyMarkup : undefined\n const htmlChunk = renderMarkdownToTelegramHtml(chunk)\n try {\n await this.sendMessageRequest(chatId, htmlChunk, { replyMarkup, parseMode: 'HTML' })\n } catch {\n await this.sendMessageRequest(chatId, chunk, { replyMarkup })\n }\n }\n }\n\n private async sendMessageRequest(\n chatId: number,\n text: string,\n options: { replyMarkup?: unknown; parseMode?: 'HTML' } = {},\n ): Promise<void> {\n const payload: Record<string, unknown> = { chat_id: chatId, text }\n if (options.replyMarkup) {\n payload.reply_markup = options.replyMarkup\n }\n if (options.parseMode) {\n payload.parse_mode = options.parseMode\n }\n await this.callTelegramApi('sendMessage', payload)\n }\n\n private async syncBotCommands(): Promise<void> {\n if (!this.token) return\n await this.callTelegramApi('setMyCommands', {\n commands: TELEGRAM_BOT_COMMANDS,\n })\n }\n\n private async callTelegramApi(method: string, payload: Record<string, unknown>): Promise<Record<string, unknown>> {\n const response = await fetch(this.apiUrl(method), {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(payload),\n })\n const parsed = asRecord(await response.json())\n const ok = parsed?.ok === true\n if (!response.ok || !ok) {\n const description = typeof parsed?.description === 'string' ? parsed.description : ''\n const statusPart = `${String(response.status)} ${response.statusText}`.trim()\n throw new Error(description || statusPart || `Telegram API ${method} failed`)\n }\n return parsed ?? {}\n }\n\n private async sendOnlineMessage(chatId: number): Promise<void> {\n await this.sendTelegramMessage(chatId, 'Codex thread bridge went online.')\n }\n\n private async notifyOnlineForKnownChats(): Promise<void> {\n const knownChatIds = Array.from(this.threadIdByChatId.keys())\n for (const chatId of knownChatIds) {\n await this.sendOnlineMessage(chatId)\n }\n }\n\n private async handleIncomingUpdate(update: TelegramUpdate): Promise<void> {\n if (update.callback_query) {\n await this.handleCallbackQuery(update.callback_query)\n return\n }\n\n const message = update.message\n const chatId = message?.chat?.id\n const senderId = message?.from?.id\n const text = message?.text?.trim()\n if (typeof chatId !== 'number' || !text) return\n if (!this.isAllowedSender(senderId)) {\n await this.sendTelegramMessage(chatId, this.unauthorizedMessage(senderId))\n return\n }\n this.markChatSeen(chatId)\n\n if (text === '/start') {\n await this.sendTelegramMessage(chatId, this.helpMessage())\n await this.sendThreadPicker(chatId)\n return\n }\n\n if (text === '/threads') {\n await this.sendThreadPicker(chatId)\n return\n }\n\n if (text === '/newthread') {\n const threadId = await this.createThreadForChat(chatId)\n await this.sendTelegramMessage(chatId, `Mapped to new thread: ${threadId}`)\n return\n }\n\n const threadCommand = text.match(/^\\/thread\\s+(\\S+)$/)\n if (threadCommand) {\n const threadId = threadCommand[1]\n this.bindChatToThread(chatId, threadId)\n await this.sendTelegramMessage(chatId, `Mapped to thread: ${threadId}`)\n return\n }\n\n if (text === '/current') {\n const threadId = this.threadIdByChatId.get(chatId)\n await this.sendTelegramMessage(chatId, threadId\n ? `Current thread: \\`${threadId}\\``\n : 'No thread is connected for this chat yet. Use /threads, /newthread, or /thread <id>.')\n return\n }\n\n if (text === '/history') {\n const threadId = this.threadIdByChatId.get(chatId)\n if (!threadId) {\n await this.sendTelegramMessage(chatId, 'No thread is connected for this chat yet. Use /threads or /newthread first.')\n return\n }\n const history = await this.readThreadHistorySummary(threadId)\n await this.sendTelegramMessage(chatId, history)\n return\n }\n\n if (text === '/status') {\n const status = this.getStatus()\n const mappedThreadId = this.threadIdByChatId.get(chatId) ?? 'none'\n await this.sendTelegramMessage(\n chatId,\n [\n '**Bridge status**',\n `configured: ${String(status.configured)}`,\n `active: ${String(status.active)}`,\n `mapped chats: ${String(status.mappedChats)}`,\n `mapped threads: ${String(status.mappedThreads)}`,\n `allowed users: ${String(status.allowedUsers)}`,\n `allow all users: ${String(status.allowAllUsers)}`,\n `chat ${String(chatId)} thread: \\`${mappedThreadId}\\``,\n status.lastError ? `last error: ${status.lastError}` : '',\n ].filter(Boolean).join('\\n'),\n )\n return\n }\n\n if (text === '/whoami') {\n const normalizedSenderId = typeof senderId === 'number' && Number.isFinite(senderId)\n ? String(Math.trunc(senderId))\n : 'unknown'\n const normalizedChatId = String(Math.trunc(chatId))\n await this.sendTelegramMessage(\n chatId,\n [\n '**Identity**',\n `telegram user id: \\`${normalizedSenderId}\\``,\n `chat id: \\`${normalizedChatId}\\``,\n `authorized: ${String(this.isAllowedSender(senderId))}`,\n this.allowAllUsers ? 'allowlist mode: `*`' : 'allowlist mode: explicit ids',\n ].join('\\n'),\n )\n return\n }\n\n if (text === '/help') {\n await this.sendTelegramMessage(chatId, this.helpMessage())\n return\n }\n\n const threadId = await this.ensureThreadForChat(chatId)\n try {\n await this.appServer.rpc('turn/start', {\n threadId,\n input: [{ type: 'text', text }],\n })\n } catch (error) {\n const message = getErrorMessage(error, 'Failed to forward message to thread')\n await this.sendTelegramMessage(chatId, `Forward failed: ${message}`)\n }\n }\n\n private async handleCallbackQuery(callbackQuery: NonNullable<TelegramUpdate['callback_query']>): Promise<void> {\n const callbackId = typeof callbackQuery.id === 'string' ? callbackQuery.id : ''\n const data = typeof callbackQuery.data === 'string' ? callbackQuery.data : ''\n const chatId = callbackQuery.message?.chat?.id\n const senderId = callbackQuery.from?.id\n if (!this.isAllowedSender(senderId)) {\n if (callbackId) {\n await this.answerCallbackQuery(callbackId, this.unauthorizedCallbackMessage(senderId))\n }\n if (typeof chatId === 'number') {\n await this.sendTelegramMessage(chatId, this.unauthorizedMessage(senderId))\n }\n return\n }\n if (typeof chatId === 'number') {\n this.markChatSeen(chatId)\n }\n if (!callbackId) return\n\n if (!data.startsWith('thread:') || typeof chatId !== 'number') {\n await this.answerCallbackQuery(callbackId, 'Invalid selection')\n return\n }\n\n const threadId = data.slice('thread:'.length).trim()\n if (!threadId) {\n await this.answerCallbackQuery(callbackId, 'Invalid thread id')\n return\n }\n\n this.bindChatToThread(chatId, threadId)\n await this.answerCallbackQuery(callbackId, 'Thread connected')\n await this.sendTelegramMessage(chatId, `Connected to thread: ${threadId}`)\n const history = await this.readThreadHistorySummary(threadId)\n if (history) {\n await this.sendTelegramMessage(chatId, history)\n }\n }\n\n private isAllowedSender(senderId: unknown): senderId is number {\n if (this.allowAllUsers) {\n return typeof senderId === 'number' && Number.isFinite(senderId)\n }\n return typeof senderId === 'number'\n && Number.isFinite(senderId)\n && this.allowedUserIds.has(Math.trunc(senderId))\n }\n\n private unauthorizedMessage(senderId: unknown): string {\n const normalizedSenderId = typeof senderId === 'number' && Number.isFinite(senderId)\n ? String(Math.trunc(senderId))\n : 'unknown'\n return `Unauthorized sender.\\n\\nYour Telegram user ID: ${normalizedSenderId}\\nAdd this ID to the bot allowlist before using the bridge.`\n }\n\n private unauthorizedCallbackMessage(senderId: unknown): string {\n if (typeof senderId === 'number' && Number.isFinite(senderId)) {\n return `Unauthorized: ${String(Math.trunc(senderId))}`\n }\n return 'Unauthorized sender'\n }\n\n private helpMessage(): string {\n const rows = TELEGRAM_BOT_COMMANDS.map((command) => `/${command.command} - ${command.description}`)\n return ['**Available commands**', ...rows].join('\\n')\n }\n\n private async answerCallbackQuery(callbackQueryId: string, text: string): Promise<void> {\n await this.callTelegramApi('answerCallbackQuery', {\n callback_query_id: callbackQueryId,\n text,\n })\n }\n\n private async sendThreadPicker(chatId: number): Promise<void> {\n const threads = await this.listRecentThreads()\n if (threads.length === 0) {\n await this.sendTelegramMessage(chatId, 'No threads found. Send /newthread to create one.')\n return\n }\n\n const inlineKeyboard = threads.map((thread) => [\n {\n text: thread.title,\n callback_data: `thread:${thread.id}`,\n },\n ])\n\n await this.sendTelegramMessage(chatId, 'Select a thread to connect:', {\n replyMarkup: { inline_keyboard: inlineKeyboard },\n })\n }\n\n private async listRecentThreads(): Promise<Array<{ id: string; title: string }>> {\n const payload = asRecord(await this.appServer.rpc('thread/list', {\n archived: false,\n limit: 20,\n sortKey: 'updated_at',\n modelProviders: [],\n }))\n const rows = Array.isArray(payload?.data) ? payload.data : []\n const threads: Array<{ id: string; title: string }> = []\n for (const row of rows) {\n const record = asRecord(row)\n const id = typeof record?.id === 'string' ? record.id.trim() : ''\n if (!id) continue\n const name = typeof record?.name === 'string' ? record.name.trim() : ''\n const preview = typeof record?.preview === 'string' ? record.preview.trim() : ''\n const cwd = typeof record?.cwd === 'string' ? record.cwd.trim() : ''\n const projectName = cwd ? basename(cwd) : 'project'\n const threadTitle = (name || preview || id).replace(/\\s+/g, ' ').trim()\n const title = `${projectName}/${threadTitle}`.slice(0, 64)\n threads.push({ id, title })\n }\n return threads\n }\n\n private async createThreadForChat(chatId: number): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/start', { cwd: this.defaultCwd }))\n const thread = asRecord(response?.thread)\n const threadId = typeof thread?.id === 'string' ? thread.id : ''\n if (!threadId) {\n throw new Error('thread/start did not return thread id')\n }\n this.bindChatToThread(chatId, threadId)\n return threadId\n }\n\n private async ensureThreadForChat(chatId: number): Promise<string> {\n const existing = this.threadIdByChatId.get(chatId)\n if (existing) return existing\n return this.createThreadForChat(chatId)\n }\n\n private bindChatToThread(chatId: number, threadId: string): void {\n const previousThreadId = this.threadIdByChatId.get(chatId)\n if (previousThreadId && previousThreadId !== threadId) {\n const previousSet = this.chatIdsByThreadId.get(previousThreadId)\n previousSet?.delete(chatId)\n if (previousSet && previousSet.size === 0) {\n this.chatIdsByThreadId.delete(previousThreadId)\n }\n }\n this.threadIdByChatId.set(chatId, threadId)\n const chatIds = this.chatIdsByThreadId.get(threadId) ?? new Set<number>()\n chatIds.add(chatId)\n this.chatIdsByThreadId.set(threadId, chatIds)\n }\n\n private extractThreadId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directThreadId = typeof params.threadId === 'string' ? params.threadId : ''\n if (directThreadId) return directThreadId\n const turn = asRecord(params.turn)\n const turnThreadId = typeof turn?.threadId === 'string' ? turn.threadId : ''\n return turnThreadId\n }\n\n private extractTurnId(notification: { method: string; params: unknown }): string {\n const params = asRecord(notification.params)\n if (!params) return ''\n const directTurnId = typeof params.turnId === 'string' ? params.turnId : ''\n if (directTurnId) return directTurnId\n const turn = asRecord(params.turn)\n const turnId = typeof turn?.id === 'string' ? turn.id : ''\n return turnId\n }\n\n private async handleNotification(notification: { method: string; params: unknown }): Promise<void> {\n if (notification.method !== 'turn/completed') return\n const threadId = this.extractThreadId(notification)\n if (!threadId) return\n const chatIds = this.chatIdsByThreadId.get(threadId)\n if (!chatIds || chatIds.size === 0) return\n\n const turnId = this.extractTurnId(notification)\n const lastForwardedTurnId = this.lastForwardedTurnByThreadId.get(threadId)\n if (turnId && lastForwardedTurnId === turnId) return\n\n const assistantReply = await this.readLatestAssistantMessage(threadId)\n if (!assistantReply) return\n for (const chatId of chatIds) {\n await this.sendTelegramMessage(chatId, assistantReply)\n }\n if (turnId) {\n this.lastForwardedTurnByThreadId.set(threadId, turnId)\n }\n }\n\n private async readLatestAssistantMessage(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n\n for (let turnIndex = turns.length - 1; turnIndex >= 0; turnIndex -= 1) {\n const turn = asRecord(turns[turnIndex])\n const items = Array.isArray(turn?.items) ? turn.items : []\n for (let itemIndex = items.length - 1; itemIndex >= 0; itemIndex -= 1) {\n const item = asRecord(items[itemIndex])\n if (item?.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text.trim() : ''\n if (text) return text\n }\n }\n }\n return ''\n }\n\n private async readThreadHistorySummary(threadId: string): Promise<string> {\n const response = asRecord(await this.appServer.rpc('thread/read', { threadId, includeTurns: true }))\n const thread = asRecord(response?.thread)\n const turns = Array.isArray(thread?.turns) ? thread.turns : []\n const historyRows: string[] = []\n\n for (const turn of turns) {\n const turnRecord = asRecord(turn)\n const items = Array.isArray(turnRecord?.items) ? turnRecord.items : []\n for (const item of items) {\n const itemRecord = asRecord(item)\n const type = typeof itemRecord?.type === 'string' ? itemRecord.type : ''\n if (type === 'userMessage') {\n const content = Array.isArray(itemRecord?.content) ? itemRecord.content : []\n for (const block of content) {\n const blockRecord = asRecord(block)\n if (blockRecord?.type === 'text' && typeof blockRecord.text === 'string' && blockRecord.text.trim()) {\n historyRows.push(`User: ${blockRecord.text.trim()}`)\n }\n }\n }\n if (type === 'agentMessage' && typeof itemRecord?.text === 'string' && itemRecord.text.trim()) {\n historyRows.push(`Assistant: ${itemRecord.text.trim()}`)\n }\n }\n }\n\n if (historyRows.length === 0) {\n return 'Thread has no message history yet.'\n }\n\n const tail = historyRows.slice(-12).join('\\n\\n')\n const maxLen = 3800\n const summary = tail.length > maxLen ? tail.slice(tail.length - maxLen) : tail\n return `Recent history:\\n\\n${summary}`\n }\n}\n","const ENCRYPTED_KEYS: string[] = [\n \"FhkYWwEZE0MYBhAGUEADDBYFBEoDBxIHVUpUVRIMVUYDAkEHVRYNAxABUUAEAUMDV0pUDEQAU0ZTDEQCVERQVkoBVhAEBBBXAQ==\",\n \"FhkYWwEZE0MYVkIGUkNUUkpVXUsBBUUAVEYHUEIMBhQCVxZWBBcHVkoNUENRAxAMA0MHARBXBkVUAUVQXBAFAUVXVxFWBUtWBw==\",\n \"FhkYWwEZE0MYVhFWAUJUUBEMURMHAUoEAUcABRAEURRXARBRU0ZUBBFVB0YAAUNVVUYBDBBSABRUAhdVXUUBUhANV0IMBBABBA==\",\n \"FhkYWwEZE0MYUBIDABMBVkMHURcGDRVSXRMFBUUCBBQBVhUBUBEGDBAAVkpTVUoGUBYMBhJXB0ANABUEARBQB0RRXUBRBUNQBw==\",\n \"FhkYWwEZE0MYVhcFBhMFARJXVBMADRdWVxYHBkQNA0cBBEsGVEBRAkYCXEFXURBXABZQDEZSXBQHAkJSAUABVxIMA0NWAEcMUA==\",\n \"FhkYWwEZE0MYAEQAXEZQURUGARFRBkRWVENWDUYFBkQHBEJWU0dQUkdWBhZXARYMAERXURcBUUQNDUAGAEoEB0ABV0NTUkQDBw==\",\n \"FhkYWwEZE0MYABdRURBXVkYDURZWUUIAUEcMBEcMUUpXVxEGVhEMBktVXBBWAEFQBBBRVhECUEQEBkFQUUpRVRUMV0dRA0QGUw==\",\n \"FhkYWwEZE0MYVUMCUUIHAUFRVksFVhYMARRRBBIAVBMBDEFVAxMAAUpRXUsEBkMHVhAHBUdSVxECABJSVRdRBkMEURANAEdXVA==\",\n \"FhkYWwEZE0MYUkEFVEVUBEoMVkINDUFQUENQAkBSAEVQVhcEAEsDBxVWUkBWAkRSA0ANV0FVBkYMVxcBXUQEUEQCARYDDEpWXA==\",\n \"FhkYWwEZE0MYDBcCXBANBRdVU0YEAEsMAUoNUkoMUBYDABcHVEBQBkRVUxdWBUUAAURUVxUGB0oDVxIHABRUAhJRAEUDUkECXQ==\",\n \"FhkYWwEZE0MYVhUHVBEBURFQA0EBVRcNUUZXAhVXVkpQAEUHBhNTDUQMXRAGA0JQA0BRBRUHVRQMURVWXUoBVxcEBEYEAEACUQ==\",\n \"FhkYWwEZE0MYA0UCB0ZTABUNBhRTAUYAUENQUEANBEMCARdQBkRRBRYDUhdWVhACXBcGBhIDVBFRBRJQUREGDRAAUhQHUhUBAA==\",\n \"FhkYWwEZE0MYAUsMARACBBYGVxQHARVQVxRRBRcNUkAFUUQCXBEAUkcBXEMBBEYCXRENBUsBVRYABUJXU0FUAEYBUUpWABEGUw==\",\n \"FhkYWwEZE0MYAEdSUBcNAUoFUERUAkcFAEQAB0IBUxcFDUIMBEpQVktWUxdUB0MBXUEBBhIMXRQEUBFQXEMFAEBQXUEMVkoBUQ==\",\n \"FhkYWwEZE0MYDBYNUUVUA0ECUREMVhUEBkoCVxJSXEtRUENQVxAMBBcMAxACVkVVBEEDUEYDAURWA0oDXUYAAEEEVxQABUANVg==\",\n \"FhkYWwEZE0MYVhcHBhcFV0EBUEdWVxdSU0sMABFSUEIHA0EAU0dWBkcFXEZRBENXAUEDV0AFUkEABBAEXBdXAhZRBEAAUUBSVg==\",\n \"FhkYWwEZE0MYV0MHAxYBDUsHB0oFVRJWAUoABEQGAUEHDRdRUBQHBREFUkpQVUYHVkVTDBcDXUYHBkJXUhENVUIAVUtTDRcMVA==\",\n \"FhkYWwEZE0MYBxVXBEsAUkYBA0EEAUIGBkRQA0MNABZRVkcHA0JTUEdWUkNRBBUEXUFUB0oFB0QGDBdWUUsEV0NXBBQBVRUEVg==\",\n \"FhkYWwEZE0MYVxcCVBYHAEsNVBEADEENUkMAUhFWXBNUVxdWBxNWURYAVEEAUUdSURAHDUsAUkEABBJSVRZQV0YNVRBRDUVSBw==\",\n \"FhkYWwEZE0MYAEQEV0YGVxcMVkRQUEsGUEBRUEADAEYEV0NRBBRWBUpXV0oMA0NRXBBRAkAMXUZWURBSXEZRB0EEVBQNVxYBXQ==\",\n \"FhkYWwEZE0MYA0IBUhADUERXB0MNB0MHVUtUDRUNBEpXVkEGUBMABkZVUENUAkBVXRAEDEAHBkJWABAEURNWDEcEABQCVUdVVA==\",\n \"FhkYWwEZE0MYUhcEBBYCAUFSXUAEAEEBV0sDDRAFV0YDV0NVBENXB0QNVxdUAkYMXUQGA0tRV0tWVUoDAxcGUUVVVUQHDBEDBA==\",\n \"FhkYWwEZE0MYA0QBBEIAB0INXUtTBxYFVBFXABJSBkYEAxIAVEAGVkZSB0tQUEoHBkcGBBUHVENWAUNRUEYCAhJSXRcNUEQGUA==\",\n \"FhkYWwEZE0MYUBJQUEIFUkBXARBUBUIDAxBQVhJVVkUMVhEDAEYNVxEGBhRUVkJWURYDAUAAAUUMARVRBhYAUkAEUkUEAhYCVg==\",\n \"FhkYWwEZE0MYVUYGVBcEDEAFVhACVkFWXBFTAxAMUUpQURENARYBVhABAEINAEQCAUECDEsCBEUBVxBXBxRUVxdQBBRXVkcCUA==\",\n \"FhkYWwEZE0MYV0YMVxBTVUNQBERRURVSUxQGUUVWB0MGVUMHV0cHUkMEAEMDDUMCVEcGVkNVB0oDURdVAUFQBkIAURYDBhAHAA==\",\n \"FhkYWwEZE0MYUhYCXEsNVUAEURFXBkcHABFQBxcFUENWVkpVAxZWAhEBAxMBBkRRVUtQDEZWXEoBBxUNVkYBBhJQUBBQUUoDBw==\",\n \"FhkYWwEZE0MYB0YGXUIGDRIHVRZQVUJSV0UNB0oNAxQADRUMVUcEBhdQV0AHDUZXAEtQVkVQUhBRBUBSUEQCVkRSBEUDUkQEVQ==\",\n \"FhkYWwEZE0MYB0MGAUEADERVV0RXDUJSUUMAUEdRAUMCBxZSBktQDUMEBkIBBkIDAEMNURdRXUoFB0RWVEZRDUFXAEJTVRVWVg==\",\n \"FhkYWwEZE0MYAkQDAxcFBEpXVEIEDUJSB0tXBhVXUkIDAEEMBBBXDUdRVRcNBURVAxZXUUENARYNBkMAUBBTDUsGVUFWDEcAVQ==\",\n \"FhkYWwEZE0MYDRFQVUsCBRIMXBEFBEYEBEMBAUAMVkoCDUoABEcNV0YMU0pWABJXURcAAEIEUBcGVxcGUhZWBUIAVUQCUkVVAA==\",\n \"FhkYWwEZE0MYUhcDVURUDBBSVkVWAEYCBkoMUEVVU0cEAxcFVhcDVUEBAEpXUhIAXEUNBUQBAxYGUhFXVUUHBBUAVkpRURAAVQ==\",\n \"FhkYWwEZE0MYUEtVV0BQV0tXB0dXVkNRVRRQBUADABFTURYDVBdXUEFSXEpXB0dQVBQEA0oAVUpTBEYEVBMNDEMDU0BUBUINUg==\",\n \"FhkYWwEZE0MYUEpQBxZTBkFXXEZWAkEEBxEHB0RXVktQUEMDARRRABEFAUIABEAMARRRDUACBBAMUEMMUxcEUUEEAEoAURBQBg==\",\n \"FhkYWwEZE0MYUEINARRQAhcCUEJRUBIFBEIHBkJQB0tWVhINXRBUUBdVBkcMBUZVUxNTAUsMU0cFAEtSXUJXDRJSBkVUAUoBVA==\",\n \"FhkYWwEZE0MYUEBWAUtXBxEHUhNTBRZVB0UEB0MDA0sCBEAABkNUAUQCBxYAAEVQUEYDVkoDVxAFVUFVVUcMAUECBkoGUUsCUA==\",\n \"FhkYWwEZE0MYBBUBUEFTBUIDAxAGBUcFARBWBRJXUUJTAkUGURQBUUUEB0EFBBBVVURQBEEAUBMAVhINVUEBVUcMA0sNVUNQVg==\",\n \"FhkYWwEZE0MYDUMDA0MNA0oAV0BQUEEFBEUBAkpQXBAMBUsCVRZXVkIAXBMEAktXBhYABkcAUhMAUhYBA0BTAURVURMBA0ACXA==\",\n \"FhkYWwEZE0MYUhdXUUMDAEQNBhZTAEdWXUYHBxEHXUQCDBYCBkEBBEIDAEBQBkEAUkUBBREMUEUNAEUMBENUBhZXVkVQV0NWBw==\",\n \"FhkYWwEZE0MYUBdVU0VXVkpQUkEEBkFSVhZRDEQMXBdQA0QDXUIHUEtWBEABAERXBEoMAxEDUxYMDUVRXUJTUBcFBhQCVkcAVQ==\",\n \"FhkYWwEZE0MYDRcBUBYCUEpRABQNVRcHBkQABkZXUkBWURFVU0sMBxINURQMAREHUUcHAUYDB0QBAUNVVUAAARUGUEoAABYGXA==\",\n \"FhkYWwEZE0MYAhUCUktQV0oEBxcCVUoCB0pTAUJQXUJTARYAXUsNDRUDUkVQARIHUUJUBEMEVxMFBhEAUUUCBRIAXBMBVUAHAA==\",\n \"FhkYWwEZE0MYARcCAUMDVxFQBEZXUEcCAEYDVksNVUpQB0MEB0EEAhVWXRcEUUBQXEoGA0BSAEVWBhdXVUACUUZSUEZXBUZRVg==\",\n \"FhkYWwEZE0MYA0oBUhEHABYCBkcMUUcGXRdUDRZXVBZTARUHVkQGV0UAAUoDBxJRVRQBA0oFAUEGBERSVhMGBEBWBEpRAUMGVg==\",\n \"FhkYWwEZE0MYVhANVBFXDEoAXEoMBhYMUxMNUEECVEoMAkQFVxANVRcFABdRDRVWXUACBBYHVURUUBACXUNUV0IMAUcCAUIHBw==\",\n \"FhkYWwEZE0MYUEUCB0UNDBEFVhQGBhJSBkYHBEMNBhAGUkAFA0AMBUAGUEYDAUZQVUdWUhcHUEcAUhEFB0FQV0VQAUtXBEcDBw==\",\n \"FhkYWwEZE0MYAUNSURNTBRANUkRWVxYHXEYMAUYBB0cCBksCAEUHUkVSVUdRURIEBxADBhECVxNRUEcFUxQMUEMMA0MFBEENBA==\",\n \"FhkYWwEZE0MYBxBWVkZQAkENVhYNBBUDXBADAUANUkBRVkICBEtRVxEEAEFUDUIDUkNXAxEDAUcHARIAVEJTA0oNVkANB0EGXA==\",\n \"FhkYWwEZE0MYV0IGAREGUhZVUEFXVkJVVUECDBcFARcNUhZQXBEFAkMBU0sDUEIFBhcCV0cCXUBTVRADV0YEA0ZQUxACUUsEXA==\",\n \"FhkYWwEZE0MYVUoNVUNQURVQUREDAxJSB0AAAkMCABQDAUMGVBYABBJWBxADBENRVEsAVxcAAEdTARUDBBEFUhZSUEQDDRcAXA==\",\n \"FhkYWwEZE0MYBhdRVUQBVhcGBhENV0QEAEIGVxcBUxQNUUcAVxZWBEEEVUBTARYGAUFUAUUHBEQEDUsDVEJXDEQNU0sCV0YMAA==\",\n \"FhkYWwEZE0MYVktRAENWAkEBXUsGUUEDUkMHB0FXB0cCAhEHARZUBxJWB0IDBERRUkUAAxYDUkYBUkYDV0QDVUcHVxAGA0INVA==\",\n \"FhkYWwEZE0MYBkIAVBABVUINV0NTVxYGAUYFVUMBUxYMURAGBksAVUJVBkoHUUQMA0cMAUdQVkUGBUpSAEZTVRANUBYEUEQBVA==\",\n \"FhkYWwEZE0MYDEMDA0oCVURRUBZWUkANUEQBAkBSXBBRB0BSVBYGVkAFVRAGDEYDVkMEDBBSBkQHV0JRA0JUBRcFXURTDRZRUw==\",\n \"FhkYWwEZE0MYUBJSVEUNUhcGBkYGAhYDUEcAUEsEBxdUUBZSXEcGDEINXEoDBxcFUkdWBEBRVxYNDUYAUBMBVkcCUBcHUUsAXA==\",\n \"FhkYWwEZE0MYA0QNUEtWAUMEAEoBUEoAAREDVRYHVkoEV0ZQBEEEUkEAAUIEAUcCVhEHUBUDB0FRVktVVEFXARIHA0NWBUpXBg==\",\n \"FhkYWwEZE0MYV0oCAxFXV0YMUxFQAUAAUEVWA0cEB0pUUBAFXUIHDRdQAEQAUkMGU0AEVxEDBBEBAhBRV0QEAxVWU0NQBxECBw==\",\n \"FhkYWwEZE0MYUkoCBBMEUkYDBhYFB0IFVkQMVUpSBksMUUcFUxEEDRZVVkUADEoCVhcHUkEHUxACUUJXBBdTVUQDAEFRBxUGAw==\",\n \"FhkYWwEZE0MYV0BXBEUCURUNXUYABUpQURYBBUYFVENXBhYCXRBWDUsHA0NRB0oGUREHDRYGUxMBAksEUkINVkNVBEIBAxdWUA==\",\n \"FhkYWwEZE0MYBEoCA0MNDEUAXUNUAxYHXBRRURACUEFQBxYDB0dUBksDA0QFVksMAxQFAEZRAxNTA0cMVUENVxEEAUFRBUAHBA==\",\n \"FhkYWwEZE0MYB0ENVkAABxEFXEZQAUYHBhMFBBJQBkMCUUZRBERTAkBRBhADVxYEXEADB0RSUUtRUREBXRdXBkAGBEUNBEQCUg==\",\n \"FhkYWwEZE0MYVhFVXBAFDBYFBkFTAhIGB0ZRBEJVXURTBBFWBxNUVkBXBEMMBkIHURcDAksAVEMEV0dSUhdXBBJWUkJWAxBRVg==\",\n \"FhkYWwEZE0MYBRFRXUoBBUcGBhZUAUBVABYEVkICVkNXDUcMABYFVxdXU0sEBkcFXEYBURUFVUYFABJSA0dTABdRVBRQVRENVg==\",\n \"FhkYWwEZE0MYV0VQVhEHVkVVAEFQAhcHBEMMUUANVxNUBUJWVRcEVUoEBBcDUkcNBkoCUUVVVBcDVRZQBBBUVRYNXBZWBUMAAQ==\",\n \"FhkYWwEZE0MYAhIHARYBVxIABhYBVxVWUkVXV0ICXUUADBZQAUYBBEUBUEsFBRcFARcGUEtVXEoGABYAUkEGDEBRVUMBB0IFXQ==\",\n \"FhkYWwEZE0MYBBUCXEEFBEJVVxZQBEICUxFRBUUNBksHBhFXUUANVhUCV0EMB0QDVURWDBFSVkYDAxYAABdXBhIEUEQMBEUCUg==\",\n \"FhkYWwEZE0MYDUsDBEoNAEECURBTAUJXUEpWVUdSBEAMDRBVUkYAUUoDAxFTDEpVVxEHAUYNVUMGVkYAA0cBBRJWBBAHUUIMVw==\",\n \"FhkYWwEZE0MYUUUFXUBTUEYHUkoHBBIFBEpRV0NWVRcBAktWBkADBxAMVUZUBhJSBEAEB0MDVkpTABUMUUVUUEABUkJUVkIHAA==\",\n]\n\nconst DECRYPT_KEY = 'er54s4'\n\nfunction xorDecrypt(b64: string, secret: string): string {\n const buf = Buffer.from(b64, 'base64')\n const keyBuf = Buffer.from(secret, 'utf8')\n const out = Buffer.alloc(buf.length)\n for (let i = 0; i < buf.length; i++) {\n out[i] = buf[i]! ^ keyBuf[i % keyBuf.length]!\n }\n return out.toString('utf8')\n}\n\nexport function getRandomFreeKey(): string | null {\n if (ENCRYPTED_KEYS.length === 0) return null\n const idx = Math.floor(Math.random() * ENCRYPTED_KEYS.length)\n return xorDecrypt(ENCRYPTED_KEYS[idx]!, DECRYPT_KEY)\n}\n\nexport function getFreeKeyCount(): number {\n return ENCRYPTED_KEYS.length\n}\n\nexport const FREE_MODE_PROVIDER_ID = 'openrouter-free'\nexport const FREE_MODE_BASE_URL = 'https://openrouter.ai/api/v1'\n\nconst FALLBACK_FREE_MODELS = [\n 'openrouter/free',\n 'google/gemma-4-26b-a4b-it:free',\n 'google/gemma-3-27b-it:free',\n 'meta-llama/llama-3.3-70b-instruct:free',\n 'qwen/qwen3-coder:free',\n]\n\nlet cachedFreeModels: string[] | null = null\nlet cacheTimestamp = 0\nconst CACHE_TTL_MS = 10 * 60 * 1000\nlet freeModelsRefreshPromise: Promise<string[]> | null = null\n\nasync function fetchFreeModelsFromOpenRouter(): Promise<string[]> {\n try {\n const resp = await fetch('https://openrouter.ai/api/v1/models')\n if (!resp.ok) return cachedFreeModels ?? FALLBACK_FREE_MODELS\n const json = (await resp.json()) as { data: Array<{ id: string }> }\n const ids = json.data\n .filter((m) => m.id.endsWith(':free') || m.id === 'openrouter/free')\n .map((m) => m.id)\n if (ids.length === 0) return cachedFreeModels ?? FALLBACK_FREE_MODELS\n const sorted = ['openrouter/free', ...ids.filter((id) => id !== 'openrouter/free')]\n cachedFreeModels = sorted\n cacheTimestamp = Date.now()\n return sorted\n } catch {\n return cachedFreeModels ?? FALLBACK_FREE_MODELS\n }\n}\n\nexport async function getFreeModels(): Promise<string[]> {\n if (cachedFreeModels && Date.now() - cacheTimestamp < CACHE_TTL_MS) {\n return cachedFreeModels\n }\n return fetchFreeModelsFromOpenRouter()\n}\n\nexport function getCachedFreeModels(): string[] {\n return cachedFreeModels ?? FALLBACK_FREE_MODELS\n}\n\nexport function refreshFreeModelsInBackground(): void {\n if (cachedFreeModels && Date.now() - cacheTimestamp < CACHE_TTL_MS) return\n if (freeModelsRefreshPromise) return\n freeModelsRefreshPromise = fetchFreeModelsFromOpenRouter()\n .finally(() => {\n freeModelsRefreshPromise = null\n })\n}\n\nexport const FREE_MODE_DEFAULT_MODEL = 'openrouter/free'\n\nexport const FREE_MODE_STATE_FILE = 'webui-free-mode.json'\n\nexport const CUSTOM_PROVIDER_ID = 'custom-endpoint'\nexport const OPENCODE_ZEN_PROVIDER_ID = 'opencode-zen'\nexport const OPENCODE_ZEN_BASE_URL = 'https://opencode.ai/zen/v1'\nexport const OPENCODE_ZEN_DEFAULT_MODEL = 'big-pickle'\n\nexport type WireApi = 'responses' | 'chat'\n\nexport interface FreeModeState {\n enabled: boolean\n apiKey: string | null\n model: string\n customKey?: boolean\n provider?: 'openrouter' | 'custom' | 'opencode-zen'\n customBaseUrl?: string\n wireApi?: WireApi\n providerKeys?: Record<string, string>\n}\n\nexport function createDefaultOpenRouterFreeModeState(): FreeModeState | null {\n const apiKey = getRandomFreeKey()\n if (!apiKey) return null\n return {\n enabled: true,\n apiKey,\n model: FREE_MODE_DEFAULT_MODEL,\n customKey: false,\n provider: 'openrouter',\n wireApi: 'responses',\n providerKeys: {\n openrouter: apiKey,\n },\n }\n}\n\nexport function createDefaultOpenCodeZenFreeModeState(): FreeModeState {\n return {\n enabled: true,\n apiKey: null,\n model: OPENCODE_ZEN_DEFAULT_MODEL,\n customKey: false,\n provider: 'opencode-zen',\n wireApi: 'chat',\n providerKeys: {},\n }\n}\n\nexport function shouldCreateDefaultFreeModeStateForMissingAuth(\n current: FreeModeState | null,\n hasUsableCodexAuth: boolean,\n): boolean {\n return current == null && !hasUsableCodexAuth\n}\n\nexport function getFreeModeEnvVars(state: FreeModeState): Record<string, string> {\n if (!state.enabled) return {}\n\n if (state.provider === 'opencode-zen' && state.apiKey) {\n return { OPENCODE_ZEN_API_KEY: state.apiKey }\n }\n\n if (state.provider === 'custom' && state.customBaseUrl && state.apiKey) {\n return { CUSTOM_ENDPOINT_API_KEY: state.apiKey }\n }\n\n return {}\n}\n\nexport function getFreeModeConfigArgs(state: FreeModeState, serverPort?: number): string[] {\n if (!state.enabled) return []\n\n if (state.provider === 'opencode-zen') {\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/zen-proxy/v1`\n : OPENCODE_ZEN_BASE_URL\n const wireApi = serverPort ? 'responses' : (state.wireApi || 'chat')\n const authArgs: string[] = serverPort\n ? ['-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.experimental_bearer_token=\"zen-proxy-token\"`]\n : ['-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.env_key=\"OPENCODE_ZEN_API_KEY\"`]\n const modelArgs: string[] = state.model?.trim()\n ? ['-c', `model=\"${state.model.trim()}\"`]\n : []\n return [\n ...modelArgs,\n '-c', `model_provider=\"${OPENCODE_ZEN_PROVIDER_ID}\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.name=\"OpenCode Zen\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${OPENCODE_ZEN_PROVIDER_ID}.wire_api=\"${wireApi}\"`,\n ...authArgs,\n ]\n }\n\n if (state.provider === 'custom' && state.customBaseUrl) {\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/custom-proxy/v1`\n : state.customBaseUrl\n const wireApi = serverPort ? 'responses' : (state.wireApi || 'responses')\n const authArgs: string[] = serverPort\n ? ['-c', `model_providers.${CUSTOM_PROVIDER_ID}.experimental_bearer_token=\"custom-proxy-token\"`]\n : ['-c', `model_providers.${CUSTOM_PROVIDER_ID}.env_key=\"CUSTOM_ENDPOINT_API_KEY\"`]\n const modelArgs: string[] = state.model?.trim()\n ? ['-c', `model=\"${state.model.trim()}\"`]\n : []\n return [\n ...modelArgs,\n '-c', `model_provider=\"${CUSTOM_PROVIDER_ID}\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.name=\"Custom Endpoint\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${CUSTOM_PROVIDER_ID}.wire_api=\"${wireApi}\"`,\n ...authArgs,\n ]\n }\n\n if (!state.apiKey) return []\n const baseUrl = serverPort\n ? `http://127.0.0.1:${serverPort}/codex-api/openrouter-proxy/v1`\n : FREE_MODE_BASE_URL\n const bearerToken = serverPort ? 'openrouter-proxy-token' : state.apiKey\n return [\n '-c', `model=\"${state.model}\"`,\n '-c', `model_provider=\"${FREE_MODE_PROVIDER_ID}\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.name=\"OpenRouter Free\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.base_url=\"${baseUrl}\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.wire_api=\"responses\"`,\n '-c', `model_providers.${FREE_MODE_PROVIDER_ID}.experimental_bearer_token=\"${bearerToken}\"`,\n ]\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpRequest } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\n\ntype ResponsesApiInput = {\n id?: string\n type: string\n role?: string\n content?: string | Array<{ type?: string; text?: string }>\n summary?: Array<{ type?: string; text?: string }>\n text?: string\n name?: string\n arguments?: string\n call_id?: string\n output?: unknown\n}\n\ntype ResponsesApiRequest = {\n model: string\n input: string | ResponsesApiInput[]\n instructions?: string\n temperature?: number\n top_p?: number\n max_output_tokens?: number\n stream?: boolean\n tools?: unknown\n tool_choice?: unknown\n [key: string]: unknown\n}\n\ntype ChatMessage = {\n role: string\n content?: string\n reasoning_content?: string\n tool_call_id?: string\n tool_calls?: Array<{\n id: string\n type: 'function'\n function: { name: string; arguments: string }\n }>\n}\n\ntype ChatCompletionsRequest = {\n model: string\n messages: ChatMessage[]\n temperature?: number\n top_p?: number\n max_tokens?: number\n stream?: boolean\n tools?: Array<{\n type: 'function'\n function: { name: string; description?: string; parameters?: unknown }\n }>\n tool_choice?: string | { type: 'function'; function: { name: string } }\n}\n\nexport type UnifiedProxyOptions = {\n bearerToken: string\n requireBearerToken?: boolean\n wireApi: 'responses' | 'chat'\n responsesEndpoint: string\n chatCompletionsEndpoint: string\n missingKeyMessage: string\n allowToolFallbackToResponses: boolean\n responsesPayloadFormat?: 'raw' | 'chat'\n sanitizeResponsesRequest?: (payload: Record<string, unknown>) => Record<string, unknown>\n}\n\nfunction readRequestBody(req: IncomingMessage): Promise<Buffer> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on('data', (chunk: Buffer) => chunks.push(chunk))\n req.on('end', () => resolve(Buffer.concat(chunks)))\n req.on('error', reject)\n })\n}\n\nfunction safeStringifyUnknown(value: unknown): string {\n if (typeof value === 'string') return value\n try {\n return JSON.stringify(value ?? '')\n } catch {\n return String(value ?? '')\n }\n}\n\nfunction appendAssistantText(messages: ChatMessage[], text: string, reasoningContent?: string): void {\n const trimmedText = text.trim()\n const trimmedReasoningContent = reasoningContent?.trim() ?? ''\n if (!trimmedText && !trimmedReasoningContent) return\n\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant' && Array.isArray(lastMessage.tool_calls)) {\n lastMessage.content = lastMessage.content\n ? `${lastMessage.content}\\n${trimmedText}`\n : trimmedText\n if (trimmedReasoningContent) {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${trimmedReasoningContent}`\n : trimmedReasoningContent\n }\n return\n }\n\n messages.push({\n role: 'assistant',\n content: trimmedText,\n ...(trimmedReasoningContent ? { reasoning_content: trimmedReasoningContent } : {}),\n })\n}\n\nfunction appendAssistantToolCall(\n messages: ChatMessage[],\n toolCall: NonNullable<ChatMessage['tool_calls']>[number],\n reasoningContent?: string,\n): void {\n const trimmedReasoningContent = reasoningContent?.trim() ?? ''\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant' && !lastMessage.tool_call_id) {\n lastMessage.tool_calls = [...(lastMessage.tool_calls ?? []), toolCall]\n if (trimmedReasoningContent) {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${trimmedReasoningContent}`\n : trimmedReasoningContent\n }\n return\n }\n\n messages.push({\n role: 'assistant',\n content: '',\n tool_calls: [toolCall],\n ...(trimmedReasoningContent ? { reasoning_content: trimmedReasoningContent } : {}),\n })\n}\n\nfunction extractTextParts(value: unknown): string {\n if (typeof value === 'string') return value\n if (!Array.isArray(value)) return ''\n return value\n .map((part) => (part && typeof part === 'object' && typeof (part as { text?: unknown }).text === 'string'\n ? (part as { text: string }).text\n : ''))\n .filter((part) => part.length > 0)\n .join('\\n')\n}\n\nexport function responsesInputToMessages(input: string | ResponsesApiInput[], instructions?: string): ChatMessage[] {\n const messages: ChatMessage[] = []\n let pendingReasoningContent = ''\n if (instructions) {\n messages.push({ role: 'system', content: instructions })\n }\n if (typeof input === 'string') {\n messages.push({ role: 'user', content: input })\n return messages\n }\n\n for (const item of input) {\n if (!item || typeof item !== 'object') continue\n\n if (item.type === 'reasoning') {\n const content = extractTextParts(item.content)\n const summary = extractTextParts(item.summary)\n const text = content || summary\n if (text) {\n const lastMessage = messages[messages.length - 1]\n if (lastMessage?.role === 'assistant') {\n lastMessage.reasoning_content = lastMessage.reasoning_content\n ? `${lastMessage.reasoning_content}\\n${text}`\n : text\n } else {\n pendingReasoningContent = pendingReasoningContent\n ? `${pendingReasoningContent}\\n${text}`\n : text\n }\n }\n continue\n }\n\n if (item.type === 'message' && item.role) {\n const content = item.content\n const text = typeof content === 'string'\n ? content\n : Array.isArray(content)\n ? content\n .map((part) => (typeof part?.text === 'string' ? part.text : ''))\n .filter((part) => part.length > 0)\n .join('\\n')\n : (typeof item.text === 'string' ? item.text : '')\n const role = item.role === 'developer' ? 'system' : item.role\n if (role === 'assistant') {\n appendAssistantText(messages, text, pendingReasoningContent)\n pendingReasoningContent = ''\n } else {\n messages.push({ role, content: text })\n }\n continue\n }\n\n if ((item.type === 'function_call_output' || item.type === 'computer_call_output') && item.call_id) {\n messages.push({\n role: 'tool',\n tool_call_id: item.call_id,\n content: safeStringifyUnknown(item.output),\n })\n continue\n }\n\n if (item.type === 'function_call' && item.call_id && item.name) {\n appendAssistantToolCall(messages, {\n id: item.call_id,\n type: 'function',\n function: {\n name: item.name,\n arguments: typeof item.arguments === 'string' ? item.arguments : '{}',\n },\n }, pendingReasoningContent)\n pendingReasoningContent = ''\n }\n }\n\n return messages\n}\n\nfunction responsesToolsToChatTools(tools: unknown): ChatCompletionsRequest['tools'] {\n if (!Array.isArray(tools)) return undefined\n const mapped = tools\n .map((tool) => {\n if (!tool || typeof tool !== 'object' || Array.isArray(tool)) return null\n const row = tool as Record<string, unknown>\n if (row.type !== 'function') return null\n const name = typeof row.name === 'string' ? row.name : ''\n if (!name) return null\n const description = typeof row.description === 'string' ? row.description : undefined\n return {\n type: 'function' as const,\n function: {\n name,\n ...(description ? { description } : {}),\n ...(row.parameters !== undefined ? { parameters: row.parameters } : {}),\n },\n }\n })\n .filter((row): row is NonNullable<typeof row> => Boolean(row))\n return mapped.length > 0 ? mapped : undefined\n}\n\nfunction responsesToolChoiceToChatToolChoice(toolChoice: unknown): ChatCompletionsRequest['tool_choice'] {\n if (typeof toolChoice === 'string') return toolChoice\n if (!toolChoice || typeof toolChoice !== 'object' || Array.isArray(toolChoice)) return undefined\n const row = toolChoice as Record<string, unknown>\n if (row.type !== 'function') return undefined\n const name = typeof row.name === 'string'\n ? row.name\n : (row.function && typeof row.function === 'object' && typeof (row.function as Record<string, unknown>).name === 'string')\n ? String((row.function as Record<string, unknown>).name)\n : ''\n if (!name) return undefined\n return { type: 'function', function: { name } }\n}\n\nexport function chatCompletionToResponsesFormat(chatResponse: Record<string, unknown>, model: string): Record<string, unknown> {\n const choices = (chatResponse.choices ?? []) as Array<{\n message?: {\n content?: string\n reasoning_content?: string\n tool_calls?: Array<{\n id?: string\n type?: string\n function?: { name?: string; arguments?: string }\n }>\n }\n }>\n const output: Array<Record<string, unknown>> = []\n\n for (const choice of choices) {\n const message = choice.message\n if (!message) continue\n\n if (Array.isArray(message.tool_calls)) {\n for (const toolCall of message.tool_calls) {\n if (!toolCall || toolCall.type !== 'function') continue\n const callId = typeof toolCall.id === 'string' && toolCall.id ? toolCall.id : `call_${Date.now()}`\n const name = typeof toolCall.function?.name === 'string' ? toolCall.function.name : ''\n if (!name) continue\n output.push({\n type: 'function_call',\n name,\n call_id: callId,\n arguments: typeof toolCall.function?.arguments === 'string' ? toolCall.function.arguments : '{}',\n status: 'completed',\n })\n }\n }\n\n if (message.content) {\n output.push({\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: message.content }],\n status: 'completed',\n })\n }\n\n if (message.reasoning_content) {\n output.push({\n type: 'reasoning',\n id: `rs_${Date.now()}`,\n summary: [],\n content: [{ type: 'reasoning_text', text: message.reasoning_content }],\n })\n }\n }\n\n const usage = chatResponse.usage as Record<string, number> | undefined\n return {\n id: chatResponse.id ?? `resp_${Date.now()}`,\n object: 'response',\n created_at: chatResponse.created ?? Math.floor(Date.now() / 1000),\n status: 'completed',\n model,\n output,\n usage: usage ? {\n input_tokens: usage.prompt_tokens ?? 0,\n output_tokens: usage.completion_tokens ?? 0,\n total_tokens: usage.total_tokens ?? 0,\n } : undefined,\n }\n}\n\nfunction forwardStreamingTextResponse(\n upstreamRes: IncomingMessage,\n res: ServerResponse,\n model: string,\n): void {\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n })\n\n let buffer = ''\n const contentParts: string[] = []\n const reasoningParts: string[] = []\n let responseId = `resp_${Date.now()}`\n\n res.write(`data: {\"type\":\"response.created\",\"response\":{\"id\":\"${responseId}\",\"object\":\"response\",\"status\":\"in_progress\",\"model\":\"${model}\",\"output\":[]}}\\n\\n`)\n res.write('data: {\"type\":\"response.output_item.added\",\"output_index\":0,\"item\":{\"type\":\"message\",\"role\":\"assistant\",\"content\":[],\"status\":\"in_progress\"}}\\n\\n')\n res.write('data: {\"type\":\"response.content_part.added\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"\"}}\\n\\n')\n\n upstreamRes.on('data', (chunk: Buffer) => {\n buffer += chunk.toString()\n const lines = buffer.split('\\n')\n buffer = lines.pop() ?? ''\n\n for (const line of lines) {\n if (!line.startsWith('data: ')) continue\n const data = line.slice(6).trim()\n if (data === '[DONE]') continue\n try {\n const parsed = JSON.parse(data) as {\n id?: string\n choices?: Array<{ delta?: { content?: string; reasoning_content?: string } }>\n }\n if (parsed.id) responseId = `resp_${parsed.id}`\n const delta = parsed.choices?.[0]?.delta\n if (delta?.reasoning_content) {\n reasoningParts.push(delta.reasoning_content)\n }\n if (delta?.content) {\n contentParts.push(delta.content)\n const escaped = JSON.stringify(delta.content).slice(1, -1)\n res.write(`data: {\"type\":\"response.output_text.delta\",\"output_index\":0,\"content_index\":0,\"delta\":\"${escaped}\"}\\n\\n`)\n }\n } catch {\n // ignore malformed chunks\n }\n }\n })\n\n upstreamRes.on('end', () => {\n const fullText = contentParts.join('')\n const fullReasoningText = reasoningParts.join('')\n const escapedFull = JSON.stringify(fullText).slice(1, -1)\n const messageItem = { type: 'message', role: 'assistant', content: [{ type: 'output_text', text: fullText }], status: 'completed' }\n const output: Array<Record<string, unknown>> = [messageItem]\n if (fullReasoningText) {\n output.push({\n type: 'reasoning',\n id: `rs_${Date.now()}`,\n summary: [],\n content: [{ type: 'reasoning_text', text: fullReasoningText }],\n })\n }\n res.write(`data: {\"type\":\"response.output_text.done\",\"output_index\":0,\"content_index\":0,\"text\":\"${escapedFull}\"}\\n\\n`)\n res.write(`data: {\"type\":\"response.content_part.done\",\"output_index\":0,\"content_index\":0,\"part\":{\"type\":\"output_text\",\"text\":\"${escapedFull}\"}}\\n\\n`)\n res.write(`data: {\"type\":\"response.output_item.done\",\"output_index\":0,\"item\":{\"type\":\"message\",\"role\":\"assistant\",\"content\":[{\"type\":\"output_text\",\"text\":\"${escapedFull}\"}],\"status\":\"completed\"}}\\n\\n`)\n if (fullReasoningText) {\n const reasoningIndex = output.length - 1\n const reasoningItem = output[reasoningIndex]\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.added', output_index: reasoningIndex, item: reasoningItem })}\\n\\n`)\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.done', output_index: reasoningIndex, item: reasoningItem })}\\n\\n`)\n }\n res.write(`data: ${JSON.stringify({ type: 'response.completed', response: { id: responseId, object: 'response', status: 'completed', model, output } })}\\n\\n`)\n res.end()\n })\n\n upstreamRes.on('error', () => {\n if (!res.writableEnded) res.end()\n })\n}\n\nfunction sendSyntheticStreamingCompletion(\n res: ServerResponse,\n response: Record<string, unknown>,\n): void {\n const responseId = typeof response.id === 'string' && response.id ? response.id : `resp_${Date.now()}`\n const model = typeof response.model === 'string' ? response.model : ''\n const output = Array.isArray(response.output) ? response.output : []\n res.writeHead(200, {\n 'Content-Type': 'text/event-stream',\n 'Cache-Control': 'no-cache',\n 'Connection': 'keep-alive',\n })\n const createdPayload = {\n type: 'response.created',\n response: {\n id: responseId,\n object: 'response',\n status: 'in_progress',\n model,\n output: [],\n },\n }\n const completedPayload = {\n type: 'response.completed',\n response: {\n id: responseId,\n object: 'response',\n status: 'completed',\n model,\n output,\n usage: response.usage,\n },\n }\n res.write(`data: ${JSON.stringify(createdPayload)}\\n\\n`)\n output.forEach((item, index) => {\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.added', output_index: index, item })}\\n\\n`)\n res.write(`data: ${JSON.stringify({ type: 'response.output_item.done', output_index: index, item })}\\n\\n`)\n })\n res.write(`data: ${JSON.stringify(completedPayload)}\\n\\n`)\n res.end()\n}\n\nfunction copyProxyHeaders(upstreamHeaders: IncomingMessage['headers']): Record<string, string> {\n const headers: Record<string, string> = {}\n for (const [key, value] of Object.entries(upstreamHeaders)) {\n if (!value) continue\n const lower = key.toLowerCase()\n if (lower === 'transfer-encoding' || lower === 'content-length' || lower === 'connection') continue\n headers[key] = Array.isArray(value) ? value.join(', ') : value\n }\n return headers\n}\n\nfunction hasToolOutputsInInput(input: string | ResponsesApiInput[]): boolean {\n if (!Array.isArray(input)) return false\n return input.some((item) => item?.type === 'function_call_output' || item?.type === 'computer_call_output')\n}\n\nexport function handleUnifiedResponsesProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: UnifiedProxyOptions,\n): void {\n void (async () => {\n try {\n if (options.requireBearerToken !== false && !options.bearerToken) {\n res.writeHead(401, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: options.missingKeyMessage } }))\n return\n }\n\n const rawBody = await readRequestBody(req)\n const parsedBody = JSON.parse(rawBody.toString()) as ResponsesApiRequest\n const hasTools = Array.isArray(parsedBody.tools) && parsedBody.tools.length > 0\n const hasToolOutputs = hasToolOutputsInInput(parsedBody.input)\n const useResponsesFallback = options.allowToolFallbackToResponses && (hasTools || hasToolOutputs)\n const useChatCompletions = options.wireApi === 'chat' && !useResponsesFallback\n const useChatPayload = useChatCompletions || options.responsesPayloadFormat === 'chat'\n const isStreaming = parsedBody.stream === true\n const effectiveStreaming = useChatPayload && isStreaming && !(hasTools || hasToolOutputs)\n\n let payload = ''\n let upstreamUrl: URL\n\n if (useChatPayload) {\n const chatReq: ChatCompletionsRequest = {\n model: parsedBody.model,\n messages: responsesInputToMessages(parsedBody.input, parsedBody.instructions),\n stream: effectiveStreaming,\n }\n if (parsedBody.temperature != null) chatReq.temperature = parsedBody.temperature\n if (parsedBody.top_p != null) chatReq.top_p = parsedBody.top_p\n if (parsedBody.max_output_tokens != null) chatReq.max_tokens = parsedBody.max_output_tokens\n const chatTools = responsesToolsToChatTools(parsedBody.tools)\n const chatToolChoice = responsesToolChoiceToChatToolChoice(parsedBody.tool_choice)\n if (chatTools) chatReq.tools = chatTools\n if (chatToolChoice) chatReq.tool_choice = chatToolChoice\n payload = JSON.stringify(chatReq)\n upstreamUrl = new URL(options.chatCompletionsEndpoint)\n } else {\n const requestBody =\n parsedBody && typeof parsedBody === 'object' && !Array.isArray(parsedBody)\n ? { ...(parsedBody as Record<string, unknown>) }\n : {}\n const sanitized = options.sanitizeResponsesRequest ? options.sanitizeResponsesRequest(requestBody) : requestBody\n payload = JSON.stringify(sanitized)\n upstreamUrl = new URL(options.responsesEndpoint)\n }\n\n const requestFn = upstreamUrl.protocol === 'http:' ? httpRequest : httpsRequest\n const proxyReq = requestFn({\n hostname: upstreamUrl.hostname,\n port: upstreamUrl.port || (upstreamUrl.protocol === 'http:' ? 80 : 443),\n path: upstreamUrl.pathname,\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Content-Length': Buffer.byteLength(payload),\n ...(options.bearerToken ? { 'Authorization': `Bearer ${options.bearerToken}` } : {}),\n },\n }, (upstreamRes) => {\n const status = upstreamRes.statusCode ?? 502\n if (useChatPayload && effectiveStreaming && status >= 200 && status < 300) {\n forwardStreamingTextResponse(upstreamRes, res, parsedBody.model)\n return\n }\n\n const chunks: Buffer[] = []\n upstreamRes.on('data', (chunk: Buffer) => chunks.push(chunk))\n upstreamRes.on('end', () => {\n const rawResponseBody = Buffer.concat(chunks).toString()\n if (!useChatPayload) {\n res.writeHead(status, copyProxyHeaders(upstreamRes.headers))\n res.end(rawResponseBody)\n return\n }\n\n try {\n const upstreamPayload = JSON.parse(rawResponseBody) as Record<string, unknown>\n if (upstreamPayload.error || status >= 400) {\n if (process.env.CODEXUI_PROXY_DEBUG === '1') {\n console.warn('[unified-responses-proxy]', JSON.stringify({\n status,\n upstreamUrl: upstreamUrl.toString(),\n request: JSON.parse(payload) as unknown,\n response: upstreamPayload,\n }))\n }\n res.writeHead(status, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(upstreamPayload))\n return\n }\n const translated = chatCompletionToResponsesFormat(upstreamPayload, parsedBody.model)\n if (isStreaming) {\n sendSyntheticStreamingCompletion(res, translated)\n } else {\n res.writeHead(200, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify(translated))\n }\n } catch {\n const detail = rawResponseBody.slice(0, 500).trim()\n res.writeHead(status >= 400 ? status : 502, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: detail || 'Bad gateway: failed to parse upstream response' } }))\n }\n })\n })\n\n proxyReq.on('error', (error) => {\n if (!res.headersSent) {\n res.writeHead(502, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message: `Proxy error: ${error.message}` } }))\n }\n })\n\n proxyReq.write(payload)\n proxyReq.end()\n } catch (error) {\n if (!res.headersSent) {\n const message = error instanceof Error ? error.message : 'Unknown error'\n res.writeHead(400, { 'Content-Type': 'application/json' })\n res.end(JSON.stringify({ error: { message } }))\n }\n }\n })()\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nconst OPENROUTER_RESPONSES_ENDPOINT = 'https://openrouter.ai/api/v1/responses'\nconst OPENROUTER_CHAT_COMPLETIONS_ENDPOINT = 'https://openrouter.ai/api/v1/chat/completions'\nconst OPENROUTER_ALLOWED_TOOL_TYPES = new Set([\n 'function',\n 'openrouter:datetime',\n 'openrouter:image_generation',\n 'openrouter:experimental__search_models',\n 'openrouter:web_search',\n])\n\nfunction sanitizeOpenRouterResponsesRequest(payload: Record<string, unknown>): Record<string, unknown> {\n const requestBody = { ...payload }\n const rawTools = Array.isArray(requestBody.tools) ? requestBody.tools : null\n if (!rawTools) return requestBody\n\n const sanitizedTools = rawTools.filter((tool): tool is Record<string, unknown> => {\n if (!tool || typeof tool !== 'object' || Array.isArray(tool)) return false\n const type = typeof (tool as Record<string, unknown>).type === 'string'\n ? String((tool as Record<string, unknown>).type)\n : ''\n return OPENROUTER_ALLOWED_TOOL_TYPES.has(type)\n })\n\n if (sanitizedTools.length === 0) {\n delete requestBody.tools\n delete requestBody.tool_choice\n return requestBody\n }\n\n requestBody.tools = sanitizedTools\n return requestBody\n}\n\nexport function handleOpenRouterProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n bearerToken: string,\n wireApi: 'responses' | 'chat',\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken,\n wireApi,\n responsesEndpoint: OPENROUTER_RESPONSES_ENDPOINT,\n chatCompletionsEndpoint: OPENROUTER_CHAT_COMPLETIONS_ENDPOINT,\n missingKeyMessage: 'Missing OpenRouter API key',\n allowToolFallbackToResponses: true,\n sanitizeResponsesRequest: sanitizeOpenRouterResponsesRequest,\n })\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nconst ZEN_RESPONSES_ENDPOINT = 'https://opencode.ai/zen/v1/responses'\nconst ZEN_CHAT_COMPLETIONS_ENDPOINT = 'https://opencode.ai/zen/v1/chat/completions'\n\nexport function handleZenProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n bearerToken: string,\n wireApi: 'responses' | 'chat',\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken,\n wireApi,\n responsesEndpoint: ZEN_RESPONSES_ENDPOINT,\n chatCompletionsEndpoint: ZEN_CHAT_COMPLETIONS_ENDPOINT,\n missingKeyMessage: 'Missing OpenCode Zen API key',\n requireBearerToken: false,\n allowToolFallbackToResponses: false,\n responsesPayloadFormat: 'chat',\n })\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\nimport { handleUnifiedResponsesProxyRequest } from './unifiedResponsesProxy.js'\n\nfunction joinEndpoint(baseUrl: string, path: string): string {\n return `${baseUrl.replace(/\\/+$/u, '')}${path}`\n}\n\nexport function handleCustomEndpointProxyRequest(\n req: IncomingMessage,\n res: ServerResponse,\n options: {\n baseUrl: string\n bearerToken: string\n wireApi: 'responses' | 'chat'\n },\n): void {\n handleUnifiedResponsesProxyRequest(req, res, {\n bearerToken: options.bearerToken,\n wireApi: options.wireApi,\n responsesEndpoint: joinEndpoint(options.baseUrl, '/responses'),\n chatCompletionsEndpoint: joinEndpoint(options.baseUrl, '/chat/completions'),\n missingKeyMessage: 'Missing custom endpoint API key',\n allowToolFallbackToResponses: false,\n })\n}\n","import { chmodSync, existsSync, lstatSync, readFileSync, realpathSync, rmSync, writeFileSync } from 'node:fs'\nimport { randomUUID } from 'node:crypto'\nimport { createRequire } from 'node:module'\nimport { basename, dirname, join } from 'node:path'\nimport { homedir } from 'node:os'\nimport { spawnSync } from 'node:child_process'\nconst TERMINAL_BUFFER_LIMIT = 16 * 1024\nconst DEFAULT_COLS = 80\nconst DEFAULT_ROWS = 24\nconst TERMINAL_NAME = 'xterm-256color'\nconst require = createRequire(import.meta.url)\n\nexport type TerminalNotification = {\n method: string\n params: unknown\n}\n\nexport type TerminalSessionSnapshot = {\n id: string\n threadId: string\n cwd: string\n shell: string\n buffer: string\n truncated: boolean\n}\n\ntype TerminalSession = {\n id: string\n threadId: string\n cwd: string\n shell: string\n pty: TerminalPty\n buffer: string\n truncated: boolean\n}\n\ntype TerminalExitEvent = {\n exitCode: number\n signal?: number\n}\n\nexport type TerminalPty = {\n write(data: string): void\n resize(cols: number, rows: number): void\n kill(): void\n onData(listener: (data: string) => void): void\n onExit(listener: (event: TerminalExitEvent) => void): void\n}\n\ntype SpawnTerminal = (\n file: string,\n args: string[],\n opt: {\n name?: string\n cols?: number\n rows?: number\n cwd?: string\n env?: Record<string, string>\n },\n) => TerminalPty\n\nexport type TerminalManagerOptions = {\n spawn?: SpawnTerminal | null\n exists?: (path: string) => boolean\n homeDir?: () => string\n cwd?: () => string\n platform?: NodeJS.Platform\n shell?: string\n ensureSpawnHelperExecutable?: () => void\n}\n\nexport type TerminalAvailability = {\n available: boolean\n reason: string | null\n}\n\nexport type TerminalAttachParams = {\n threadId: string\n cwd: string\n sessionId?: string\n cols?: number\n rows?: number\n newSession?: boolean\n}\n\nexport class ThreadTerminalManager {\n private readonly sessions = new Map<string, TerminalSession>()\n private readonly activeSessionIdByThreadId = new Map<string, string>()\n private readonly listeners = new Set<(notification: TerminalNotification) => void>()\n private readonly spawn: SpawnTerminal | null\n private readonly unavailableReason: string | null\n private readonly exists: (path: string) => boolean\n private readonly homeDir: () => string\n private readonly cwd: () => string\n private readonly platform: NodeJS.Platform\n private readonly shell: string | null\n private readonly ensureSpawnHelperExecutable: () => void\n\n constructor(options: TerminalManagerOptions = {}) {\n const terminalSpawn = loadOptionalTerminalSpawn(options.spawn)\n this.spawn = terminalSpawn.spawn\n this.unavailableReason = terminalSpawn.reason\n this.exists = options.exists ?? existsSync\n this.homeDir = options.homeDir ?? homedir\n this.cwd = options.cwd ?? process.cwd\n this.platform = options.platform ?? process.platform\n this.shell = options.shell ?? null\n this.ensureSpawnHelperExecutable = options.ensureSpawnHelperExecutable ?? ensureNodePtyPrebuiltExecutable\n }\n\n subscribe(listener: (notification: TerminalNotification) => void): () => void {\n this.listeners.add(listener)\n return () => {\n this.listeners.delete(listener)\n }\n }\n\n getAvailability(): TerminalAvailability {\n return {\n available: this.spawn !== null,\n reason: this.unavailableReason,\n }\n }\n\n attach(params: TerminalAttachParams): TerminalSessionSnapshot {\n this.requireAvailable()\n const threadId = params.threadId.trim()\n if (!threadId) {\n throw new Error('Missing threadId')\n }\n\n const requestedSessionId = params.sessionId?.trim() || ''\n const existingSessionId = params.newSession\n ? ''\n : requestedSessionId || this.activeSessionIdByThreadId.get(threadId) || ''\n const existing = existingSessionId ? this.sessions.get(existingSessionId) : null\n if (existing) {\n this.activeSessionIdByThreadId.set(threadId, existing.id)\n this.resize(existing.id, params.cols, params.rows)\n const nextCwd = this.resolveCwd(params.cwd)\n if (nextCwd !== existing.cwd) {\n existing.cwd = nextCwd\n existing.pty.write(`cd ${shellQuote(nextCwd)}\\r`)\n }\n this.emitInit(existing)\n this.emitAttached(existing)\n return this.toSnapshot(existing)\n }\n\n const session = this.createSession({\n threadId,\n cwd: params.cwd,\n sessionId: requestedSessionId || randomUUID(),\n cols: params.cols,\n rows: params.rows,\n })\n this.sessions.set(session.id, session)\n this.activeSessionIdByThreadId.set(threadId, session.id)\n this.emitAttached(session)\n return this.toSnapshot(session)\n }\n\n write(sessionId: string, data: string): void {\n this.requireAvailable()\n const session = this.requireSession(sessionId)\n session.pty.write(data)\n }\n\n resize(sessionId: string, cols: unknown, rows: unknown): void {\n const session = this.sessions.get(sessionId)\n if (!session) return\n\n const nextCols = normalizeDimension(cols, DEFAULT_COLS)\n const nextRows = normalizeDimension(rows, DEFAULT_ROWS)\n session.pty.resize(nextCols, nextRows)\n }\n\n close(sessionId: string): void {\n const session = this.sessions.get(sessionId)\n if (!session) return\n this.sessions.delete(session.id)\n if (this.activeSessionIdByThreadId.get(session.threadId) === session.id) {\n this.activeSessionIdByThreadId.delete(session.threadId)\n }\n session.pty.kill()\n this.emit({\n method: 'terminal-exit',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n code: null,\n signal: null,\n },\n })\n }\n\n getSnapshotForThread(threadId: string): TerminalSessionSnapshot | null {\n const sessionId = this.activeSessionIdByThreadId.get(threadId.trim())\n if (!sessionId) return null\n const session = this.sessions.get(sessionId)\n return session ? this.toSnapshot(session) : null\n }\n\n dispose(): void {\n for (const sessionId of Array.from(this.sessions.keys())) {\n this.close(sessionId)\n }\n this.listeners.clear()\n }\n\n private createSession(params: {\n threadId: string\n cwd: string\n sessionId: string\n cols?: number\n rows?: number\n }): TerminalSession {\n const cwd = this.resolveCwd(params.cwd)\n const shell = this.resolveShell()\n const env: Record<string, string> = {\n ...process.env,\n TERM: TERMINAL_NAME,\n } as Record<string, string>\n normalizeLocaleEnv(env, this.platform)\n delete env.TERMINFO\n delete env.TERMINFO_DIRS\n\n this.ensureSpawnHelperExecutable()\n if (!this.spawn) {\n throw new Error(this.unavailableReason || 'Integrated terminal is unavailable on this host')\n }\n const pty = this.spawn(shell, [], {\n name: TERMINAL_NAME,\n cols: normalizeDimension(params.cols, DEFAULT_COLS),\n rows: normalizeDimension(params.rows, DEFAULT_ROWS),\n cwd,\n env,\n })\n\n const session: TerminalSession = {\n id: params.sessionId,\n threadId: params.threadId,\n cwd,\n shell: basename(shell),\n pty,\n buffer: '',\n truncated: false,\n }\n\n pty.onData((data) => {\n this.appendOutput(session, data)\n })\n pty.onExit(({ exitCode, signal }) => {\n if (this.sessions.get(session.id) === session) {\n this.sessions.delete(session.id)\n }\n if (this.activeSessionIdByThreadId.get(session.threadId) === session.id) {\n this.activeSessionIdByThreadId.delete(session.threadId)\n }\n this.emit({\n method: 'terminal-exit',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n code: exitCode,\n signal: signal == null ? null : String(signal),\n },\n })\n })\n\n return session\n }\n\n private appendOutput(session: TerminalSession, data: string): void {\n const next = `${session.buffer}${data}`\n if (next.length > TERMINAL_BUFFER_LIMIT) {\n session.buffer = next.slice(-TERMINAL_BUFFER_LIMIT)\n session.truncated = true\n } else {\n session.buffer = next\n }\n this.emit({\n method: 'terminal-data',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n data,\n },\n })\n }\n\n private emitInit(session: TerminalSession): void {\n if (!session.buffer) return\n this.emit({\n method: 'terminal-init-log',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n log: session.buffer,\n truncated: session.truncated,\n },\n })\n }\n\n private emitAttached(session: TerminalSession): void {\n this.emit({\n method: 'terminal-attached',\n params: {\n sessionId: session.id,\n threadId: session.threadId,\n cwd: session.cwd,\n shell: session.shell,\n },\n })\n }\n\n private emit(notification: TerminalNotification): void {\n for (const listener of this.listeners) {\n listener(notification)\n }\n }\n\n private requireSession(sessionId: string): TerminalSession {\n const session = this.sessions.get(sessionId.trim())\n if (!session) {\n throw new Error('Terminal session missing')\n }\n return session\n }\n\n private requireAvailable(): void {\n if (this.spawn) return\n throw new Error(this.unavailableReason || 'Integrated terminal is unavailable on this host')\n }\n\n private resolveShell(): string {\n if (this.shell) return this.shell\n if (this.platform === 'win32') {\n return process.env.COMSPEC || 'cmd.exe'\n }\n return process.env.SHELL || '/bin/zsh'\n }\n\n private resolveCwd(value: string): string {\n const cwd = value.trim()\n if (cwd && this.exists(cwd)) {\n return cwd\n }\n const home = this.homeDir()\n if (home && this.exists(home)) {\n return home\n }\n return this.cwd()\n }\n\n private toSnapshot(session: TerminalSession): TerminalSessionSnapshot {\n return {\n id: session.id,\n threadId: session.threadId,\n cwd: session.cwd,\n shell: session.shell,\n buffer: session.buffer,\n truncated: session.truncated,\n }\n }\n}\n\nfunction loadOptionalTerminalSpawn(spawn: SpawnTerminal | null | undefined): { spawn: SpawnTerminal | null, reason: string | null } {\n if (spawn) {\n return { spawn, reason: null }\n }\n if (spawn === null) {\n return { spawn: null, reason: 'Integrated terminal is unavailable on this host' }\n }\n try {\n return { spawn: loadTerminalSpawn(), reason: null }\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error)\n const suffix = message.includes('Cannot find module')\n ? 'Native PTY support is not installed.'\n : sanitizeUnavailableReason(message)\n return {\n spawn: null,\n reason: `Integrated terminal is unavailable on this host. ${suffix}`,\n }\n }\n}\n\nfunction sanitizeUnavailableReason(message: string): string {\n const firstLine = message.split('\\n')[0]?.trim() || ''\n return firstLine ? firstLine : 'Native PTY support could not be loaded.'\n}\n\nfunction normalizeDimension(value: unknown, fallback: number): number {\n const parsed = typeof value === 'number' ? value : Number(value)\n if (!Number.isFinite(parsed)) return fallback\n return Math.max(1, Math.min(500, Math.trunc(parsed)))\n}\n\nfunction loadTerminalSpawn(): SpawnTerminal {\n repairNativePtyBuild('node-pty')\n\n if (resolveNodePtyPrebuiltPath()) {\n try {\n const terminal = require('node-pty-prebuilt-multiarch') as { spawn: SpawnTerminal }\n return terminal.spawn\n } catch {\n // Fall back to maintained node-pty when the legacy prebuild exists but cannot load.\n }\n }\n const terminal = require('node-pty') as { spawn: SpawnTerminal }\n return terminal.spawn\n}\n\nfunction repairNativePtyBuild(packageName: string): void {\n try {\n const packageJson = require.resolve(`${packageName}/package.json`)\n const packageRoot = dirname(packageJson)\n const buildDir = join(packageRoot, 'build')\n const makefile = join(buildDir, 'Makefile')\n const binary = join(buildDir, 'Release', 'pty.node')\n if (!existsSync(makefile)) return\n if (!isBrokenSymlink(binary)) return\n\n const source = readFileSync(makefile, 'utf8')\n const patched = source.replace(\n /^cmd_copy = ln -f \"\\$<\" \"\\$@\" 2>\\/dev\\/null \\|\\| \\(rm -rf \"\\$@\" && cp -af \"\\$<\" \"\\$@\"\\)$/m,\n 'cmd_copy = rm -rf \"$@\" && cp -af \"$<\" \"$@\"',\n )\n if (patched !== source) {\n writeFileSync(makefile, patched)\n }\n rmSync(binary, { force: true })\n spawnSync('make', ['BUILDTYPE=Release', '-C', buildDir], { stdio: 'ignore' })\n } catch {\n // Native PTY load below will surface the actionable error if repair fails.\n }\n}\n\nfunction isBrokenSymlink(path: string): boolean {\n try {\n if (!lstatSync(path).isSymbolicLink()) return false\n try {\n return !existsSync(realpathSync(path))\n } catch {\n return true\n }\n } catch {\n return false\n }\n}\n\nfunction resolveNodePtyPrebuiltPath(): string | null {\n try {\n const packageJson = require.resolve('node-pty-prebuilt-multiarch/package.json')\n const packageRoot = dirname(packageJson)\n const builtPath = join(packageRoot, 'build', 'Release', 'pty.node')\n if (existsSync(builtPath)) {\n return builtPath\n }\n const runtime = Object.prototype.hasOwnProperty.call(process.versions, 'electron') ? 'electron' : 'node'\n const libc = process.platform === 'linux' && existsSync('/etc/alpine-release') ? '.musl' : ''\n const binaryName = `${runtime}.abi${process.versions.modules}${libc}.node`\n const binaryPath = join(packageRoot, 'prebuilds', `${process.platform}-${process.arch}`, binaryName)\n return existsSync(binaryPath) ? binaryPath : null\n } catch {\n return null\n }\n}\n\nfunction ensureNodePtyPrebuiltExecutable(): void {\n if (process.platform !== 'darwin' && process.platform !== 'linux') return\n ensurePackageSpawnHelperExecutable('node-pty')\n ensurePackageSpawnHelperExecutable('node-pty-prebuilt-multiarch')\n}\n\nfunction ensurePackageSpawnHelperExecutable(packageName: string): void {\n try {\n const packageRoot = dirname(require.resolve(`${packageName}/package.json`))\n const helperPath = join(packageRoot, 'prebuilds', `${process.platform}-${process.arch}`, 'spawn-helper')\n if (existsSync(helperPath)) {\n chmodSync(helperPath, 0o755)\n }\n } catch {\n // If the PTY package changes layout, let it surface its own spawn error.\n }\n}\n\nfunction normalizeLocaleEnv(env: Record<string, string>, platform: NodeJS.Platform): void {\n const locale = platform === 'darwin' ? 'en_US.UTF-8' : 'C.UTF-8'\n env.LANG = locale\n env.LC_ALL = locale\n env.LC_CTYPE = locale\n}\n\nfunction shellQuote(value: string): string {\n return `'${value.replace(/'/g, `'\\\\''`)}'`\n}\n","function stripWindowsDevicePathPrefix(value: string): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n\n if (trimmed.startsWith('\\\\\\\\?\\\\UNC\\\\')) {\n return `\\\\\\\\${trimmed.slice('\\\\\\\\?\\\\UNC\\\\'.length)}`\n }\n\n if (trimmed.startsWith('\\\\\\\\?\\\\')) {\n return trimmed.slice('\\\\\\\\?\\\\'.length)\n }\n\n return trimmed\n}\n\nexport function normalizePathForUi(value: string): string {\n return stripWindowsDevicePathPrefix(value)\n}\n\nfunction isWindowsLikePath(value: string): boolean {\n return /^[a-z]:[\\\\/]/iu.test(value) || value.startsWith('\\\\\\\\')\n}\n\nexport function isAbsoluteLikePath(value: string): boolean {\n const normalized = normalizePathForUi(value)\n return normalized.startsWith('/') || isWindowsLikePath(normalized)\n}\n\nexport function normalizePathForComparison(value: string): string {\n const normalized = normalizePathForUi(value).replace(/[\\\\/]+/gu, '/')\n return isWindowsLikePath(normalized) ? normalized.toLowerCase() : normalized\n}\n\nexport function getPathLeafName(value: string): string {\n const normalized = normalizePathForUi(value).replace(/[\\\\/]+$/u, '')\n if (!normalized) return ''\n\n const separatorIndex = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\\\'))\n if (separatorIndex < 0) return normalized\n return normalized.slice(separatorIndex + 1)\n}\n\nexport function getPathParent(value: string): string {\n const normalized = normalizePathForUi(value).replace(/[\\\\/]+$/u, '')\n if (!normalized) return ''\n\n const separatorIndex = Math.max(normalized.lastIndexOf('/'), normalized.lastIndexOf('\\\\'))\n if (separatorIndex <= 0) return ''\n return normalized.slice(0, separatorIndex)\n}\n\nexport function toProjectName(value: string): string {\n const leaf = getPathLeafName(value)\n return leaf || normalizePathForUi(value) || 'Projectless'\n}\n\nexport function isProjectlessChatPath(value: string): boolean {\n const normalized = normalizePathForUi(value).replace(/[\\\\/]+/gu, '/')\n if (!normalized) return false\n return /(?:^|\\/)Documents\\/Codex\\/\\d{4}-\\d{2}-\\d{2}\\/[^/]+$/u.test(normalized)\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\nimport { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs'\nimport type { IncomingMessage } from 'node:http'\nimport { homedir } from 'node:os'\nimport { dirname, join } from 'node:path'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'portal_session'\nconst SESSION_TTL_MS = 30 * 24 * 60 * 60 * 1000\nconst SESSION_STORE_FILE = 'webui-auth-sessions.json'\nconst MAX_PERSISTED_TOKENS = 128\n\ntype PersistedAuthState = {\n tokens?: Array<{\n value?: unknown\n expiresAt?: unknown\n }>\n}\n\nfunction constantTimeCompare(a: string, b: string): boolean {\n const bufA = Buffer.from(a)\n const bufB = Buffer.from(b)\n if (bufA.length !== bufB.length) return false\n return timingSafeEqual(bufA, bufB)\n}\n\nfunction parseCookies(header: string | undefined): Record<string, string> {\n const cookies: Record<string, string> = {}\n if (!header) return cookies\n for (const pair of header.split(';')) {\n const idx = pair.indexOf('=')\n if (idx === -1) continue\n const key = pair.slice(0, idx).trim()\n const value = pair.slice(idx + 1).trim()\n cookies[key] = value\n }\n return cookies\n}\n\nfunction isLocalhostRemote(remote: string): boolean {\n return remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1'\n}\n\nfunction isLocalhostHost(host: string): boolean {\n const normalized = host.toLowerCase()\n return normalized.startsWith('localhost:') || normalized === 'localhost' || normalized.startsWith('127.0.0.1:')\n}\n\nfunction isIPv4Octet(value: string): boolean {\n if (!/^\\d{1,3}$/.test(value)) return false\n const parsed = Number.parseInt(value, 10)\n return parsed >= 0 && parsed <= 255\n}\n\nfunction isTrustedTailscaleIPv4(remote: string): boolean {\n const normalized = remote.startsWith('::ffff:') ? remote.slice('::ffff:'.length) : remote\n const parts = normalized.split('.')\n if (parts.length !== 4 || !parts.every(isIPv4Octet)) {\n return false\n }\n\n const first = Number.parseInt(parts[0] ?? '', 10)\n const second = Number.parseInt(parts[1] ?? '', 10)\n return first === 100 && second >= 64 && second <= 127\n}\n\nfunction isTrustedTailscaleIPv6(remote: string): boolean {\n const normalized = remote.toLowerCase()\n return normalized === 'fd7a:115c:a1e0::1' || normalized.startsWith('fd7a:115c:a1e0:')\n}\n\nfunction isTrustedTailscaleRemote(remote: string): boolean {\n return isTrustedTailscaleIPv4(remote) || isTrustedTailscaleIPv6(remote)\n}\n\nfunction getCodexHomeDir(): string {\n const codexHome = process.env.CODEX_HOME?.trim()\n return codexHome && codexHome.length > 0 ? codexHome : join(homedir(), '.codex')\n}\n\nfunction getSessionStorePath(): string {\n return join(getCodexHomeDir(), SESSION_STORE_FILE)\n}\n\nfunction readPersistedSessions(): Map<string, number> {\n const sessionStorePath = getSessionStorePath()\n if (!existsSync(sessionStorePath)) return new Map()\n\n try {\n const raw = readFileSync(sessionStorePath, 'utf8')\n const parsed = JSON.parse(raw) as PersistedAuthState\n const now = Date.now()\n const sessions = new Map<string, number>()\n for (const entry of parsed.tokens ?? []) {\n const token = typeof entry?.value === 'string' ? entry.value : ''\n const expiresAt = typeof entry?.expiresAt === 'number' ? entry.expiresAt : 0\n if (!token || !Number.isFinite(expiresAt) || expiresAt <= now) continue\n sessions.set(token, expiresAt)\n }\n return sessions\n } catch {\n return new Map()\n }\n}\n\nfunction persistSessions(validTokens: Map<string, number>): void {\n const sessionStorePath = getSessionStorePath()\n mkdirSync(dirname(sessionStorePath), { recursive: true })\n\n const tokens = Array.from(validTokens.entries())\n .sort((left, right) => right[1] - left[1])\n .slice(0, MAX_PERSISTED_TOKENS)\n .map(([value, expiresAt]) => ({ value, expiresAt }))\n const tmpPath = `${sessionStorePath}.tmp`\n writeFileSync(tmpPath, `${JSON.stringify({ tokens }, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600 })\n renameSync(tmpPath, sessionStorePath)\n}\n\nfunction tryPersistSessions(validTokens: Map<string, number>): void {\n try {\n persistSessions(validTokens)\n } catch (error) {\n console.warn('[auth] failed to persist login sessions:', error)\n }\n}\n\nfunction pruneExpiredSessions(validTokens: Map<string, number>): boolean {\n const now = Date.now()\n let changed = false\n for (const [token, expiresAt] of validTokens.entries()) {\n if (expiresAt > now) continue\n validTokens.delete(token)\n changed = true\n }\n return changed\n}\n\nfunction buildSessionCookie(token: string, expiresAt: number): string {\n const maxAgeSeconds = Math.max(0, Math.floor((expiresAt - Date.now()) / 1000))\n return [\n `${TOKEN_COOKIE}=${token}`,\n 'Path=/',\n 'HttpOnly',\n 'SameSite=Lax',\n `Max-Age=${String(maxAgeSeconds)}`,\n `Expires=${new Date(expiresAt).toUTCString()}`,\n ].join('; ')\n}\n\nfunction isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Map<string, number>,\n): boolean {\n const remote = remoteAddress ?? ''\n // SSH reverse tunnels terminate on loopback, so remoteAddress alone is not enough\n // to prove this is a direct local browser request.\n if (isLocalhostRemote(remote) && isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n if (isTrustedTailscaleRemote(remote)) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n if (!token) return false\n const expiresAt = validTokens.get(token)\n return typeof expiresAt === 'number' && expiresAt > Date.now()\n}\n\nconst LOGIN_PAGE_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"utf-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<title>Codex Web</title>\n<style>\n*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}\nbody{font-family:-apple-system,BlinkMacSystemFont,\"Segoe UI\",Roboto,sans-serif;background:#0a0a0a;color:#e5e5e5;display:flex;align-items:center;justify-content:center;min-height:100vh;padding:1rem}\n.card{background:#171717;border:1px solid #262626;border-radius:12px;padding:2rem;width:100%;max-width:380px}\nh1{font-size:1.25rem;font-weight:600;margin-bottom:1.5rem;text-align:center;color:#fafafa}\nlabel{display:block;font-size:.875rem;color:#a3a3a3;margin-bottom:.5rem}\ninput{width:100%;padding:.625rem .75rem;background:#0a0a0a;border:1px solid #404040;border-radius:8px;color:#fafafa;font-size:1rem;outline:none;transition:border-color .15s}\ninput:focus{border-color:#3b82f6}\nbutton{width:100%;padding:.625rem;margin-top:1rem;background:#3b82f6;color:#fff;border:none;border-radius:8px;font-size:.9375rem;font-weight:500;cursor:pointer;transition:background .15s}\nbutton:hover{background:#2563eb}\n.error{color:#ef4444;font-size:.8125rem;margin-top:.75rem;text-align:center;display:none}\n</style>\n</head>\n<body>\n<div class=\"card\">\n<h1>Codex Web</h1>\n<form id=\"f\">\n<label for=\"pw\">Password</label>\n<input id=\"pw\" name=\"password\" type=\"password\" autocomplete=\"current-password\" autofocus required>\n<button type=\"submit\">Sign in</button>\n<p class=\"error\" id=\"err\">Incorrect password</p>\n</form>\n</div>\n<script>\nconst form=document.getElementById('f');\nconst errEl=document.getElementById('err');\nform.addEventListener('submit',async e=>{\n e.preventDefault();\n errEl.style.display='none';\n const res=await fetch('/auth/login',{method:'POST',headers:{'Content-Type':'application/json'},body:JSON.stringify({password:document.getElementById('pw').value})});\n if(res.ok){window.location.reload()}else{errEl.style.display='block';document.getElementById('pw').value='';document.getElementById('pw').focus()}\n});\n</script>\n</body>\n</html>`\n\nexport function createAuthMiddleware(password: string): RequestHandler {\n return createAuthSession(password).middleware\n}\n\nexport type AuthSession = {\n middleware: RequestHandler\n isRequestAuthorized: (req: IncomingMessage) => boolean\n}\n\nexport function createAuthSession(password: string): AuthSession {\n const validTokens = readPersistedSessions()\n if (pruneExpiredSessions(validTokens)) {\n tryPersistSessions(validTokens)\n }\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\n if (pruneExpiredSessions(validTokens)) {\n tryPersistSessions(validTokens)\n }\n\n if (isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)) {\n next()\n return\n }\n\n // Handle login POST\n if (req.method === 'POST' && req.path === '/auth/login') {\n let body = ''\n req.setEncoding('utf8')\n req.on('data', (chunk: string) => { body += chunk })\n req.on('end', () => {\n let parsed: { password?: string }\n try {\n parsed = JSON.parse(body) as { password?: string }\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n return\n }\n\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n try {\n const token = randomBytes(32).toString('hex')\n const expiresAt = Date.now() + SESSION_TTL_MS\n validTokens.set(token, expiresAt)\n tryPersistSessions(validTokens)\n res.setHeader('Set-Cookie', buildSessionCookie(token, expiresAt))\n res.json({ ok: true })\n } catch {\n res.status(500).json({ error: 'Failed to create login session' })\n }\n })\n return\n }\n\n // Handle one-click auth links like /password=<value>\n if (req.method === 'GET' && req.path.startsWith('/password=')) {\n const provided = req.path.slice('/password='.length)\n if (constantTimeCompare(provided, password)) {\n const token = randomBytes(32).toString('hex')\n const expiresAt = Date.now() + SESSION_TTL_MS\n validTokens.set(token, expiresAt)\n tryPersistSessions(validTokens)\n res.setHeader('Set-Cookie', buildSessionCookie(token, expiresAt))\n res.redirect(302, '/')\n return\n }\n }\n\n // No valid session — serve login page\n res.setHeader('Content-Type', 'text/html; charset=utf-8')\n res.status(200).send(LOGIN_PAGE_HTML)\n }\n\n return {\n middleware,\n isRequestAuthorized: (req: IncomingMessage) => (\n isAuthorizedByRequestLike(req.socket.remoteAddress, req.headers.host, req.headers.cookie, validTokens)\n ),\n }\n}\n","import { dirname, extname, join } from 'node:path'\nimport { open, readFile, readdir, stat } from 'node:fs/promises'\n\ntype DirectoryItem = {\n name: string\n path: string\n isDirectory: boolean\n editable: boolean\n mtimeMs: number\n}\n\nexport type LocalDirectoryListingEntry = {\n name: string\n path: string\n}\n\nexport type LocalDirectoryListing = {\n path: string\n parentPath: string\n entries: LocalDirectoryListingEntry[]\n}\n\ntype LocalDirectoryListingOptions = {\n showHidden?: boolean\n}\n\nconst TEXT_EDITABLE_EXTENSIONS = new Set([\n '.txt', '.md', '.json', '.js', '.ts', '.tsx', '.jsx', '.css', '.scss',\n '.html', '.htm', '.xml', '.yml', '.yaml', '.log', '.csv', '.env', '.py',\n '.sh', '.toml', '.ini', '.conf', '.sql', '.bat', '.cmd', '.ps1',\n])\n\nfunction languageForPath(pathValue: string): string {\n const extension = extname(pathValue).toLowerCase()\n switch (extension) {\n case '.js': return 'javascript'\n case '.ts': return 'typescript'\n case '.jsx': return 'javascript'\n case '.tsx': return 'typescript'\n case '.py': return 'python'\n case '.sh': return 'sh'\n case '.css':\n case '.scss': return 'css'\n case '.html':\n case '.htm': return 'html'\n case '.json': return 'json'\n case '.md': return 'markdown'\n case '.yaml':\n case '.yml': return 'yaml'\n case '.xml': return 'xml'\n case '.sql': return 'sql'\n case '.toml': return 'ini'\n case '.ini':\n case '.conf': return 'ini'\n default: return 'plaintext'\n }\n}\n\nexport function normalizeLocalPath(rawPath: string): string {\n const trimmed = rawPath.trim()\n if (!trimmed) return ''\n if (trimmed.startsWith('file://')) {\n try {\n return decodeURIComponent(trimmed.replace(/^file:\\/\\//u, ''))\n } catch {\n return trimmed.replace(/^file:\\/\\//u, '')\n }\n }\n return trimmed\n}\n\nexport function decodeBrowsePath(rawPath: string): string {\n if (!rawPath) return ''\n try {\n return decodeURIComponent(rawPath)\n } catch {\n return rawPath\n }\n}\n\nexport function isTextEditablePath(pathValue: string): boolean {\n return TEXT_EDITABLE_EXTENSIONS.has(extname(pathValue).toLowerCase())\n}\n\nfunction isHiddenName(value: string): boolean {\n return value.startsWith('.')\n}\n\nfunction looksLikeTextBuffer(buffer: Buffer): boolean {\n if (buffer.length === 0) return true\n for (const byte of buffer) {\n if (byte === 0) return false\n }\n const decoded = buffer.toString('utf8')\n const replacementCount = (decoded.match(/\\uFFFD/gu) ?? []).length\n return replacementCount / decoded.length < 0.05\n}\n\nasync function probeFileIsText(localPath: string): Promise<boolean> {\n const handle = await open(localPath, 'r')\n try {\n const sample = Buffer.allocUnsafe(4096)\n const { bytesRead } = await handle.read(sample, 0, sample.length, 0)\n return looksLikeTextBuffer(sample.subarray(0, bytesRead))\n } finally {\n await handle.close()\n }\n}\n\nexport async function isTextEditableFile(localPath: string): Promise<boolean> {\n if (isTextEditablePath(localPath)) return true\n try {\n const fileStat = await stat(localPath)\n if (!fileStat.isFile()) return false\n return await probeFileIsText(localPath)\n } catch {\n return false\n }\n}\n\nfunction escapeHtml(value: string): string {\n return value\n .replace(/&/gu, '&amp;')\n .replace(/</gu, '&lt;')\n .replace(/>/gu, '&gt;')\n .replace(/\"/gu, '&quot;')\n .replace(/'/gu, '&#39;')\n}\n\nfunction normalizeNewProjectName(value: string): string {\n return value.trim().replace(/[\\\\/]+/gu, '').trim()\n}\n\nfunction toBrowseHref(pathValue: string, newProjectName = ''): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const query = normalizedName ? `?newProjectName=${encodeURIComponent(normalizedName)}` : ''\n return `/codex-local-browse${encodeURI(pathValue)}${query}`\n}\n\nfunction toEditHref(pathValue: string, newProjectName = ''): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const query = normalizedName ? `?newProjectName=${encodeURIComponent(normalizedName)}` : ''\n return `/codex-local-edit${encodeURI(pathValue)}${query}`\n}\n\nfunction escapeForInlineScriptString(value: string): string {\n // Prevent breaking out of inline <script> blocks when file content contains HTML/script tokens.\n return JSON.stringify(value)\n .replace(/<\\//gu, '<\\\\/')\n .replace(/<!--/gu, '<\\\\!--')\n .replace(/\\u2028/gu, '\\\\u2028')\n .replace(/\\u2029/gu, '\\\\u2029')\n}\n\nasync function getDirectoryItems(localPath: string): Promise<DirectoryItem[]> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const withMeta = await Promise.all(entries.map(async (entry) => {\n const entryPath = join(localPath, entry.name)\n const entryStat = await stat(entryPath)\n const editable = !entry.isDirectory() && await isTextEditableFile(entryPath)\n return {\n name: entry.name,\n path: entryPath,\n isDirectory: entry.isDirectory(),\n editable,\n mtimeMs: entryStat.mtimeMs,\n }\n }))\n return withMeta.sort((a, b) => {\n if (b.mtimeMs !== a.mtimeMs) return b.mtimeMs - a.mtimeMs\n if (a.isDirectory && !b.isDirectory) return -1\n if (!a.isDirectory && b.isDirectory) return 1\n return a.name.localeCompare(b.name)\n })\n}\n\nfunction projectCreationTargetPath(parentPath: string, newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n if (!normalizedName) return ''\n return join(parentPath, normalizedName)\n}\n\nfunction projectCreationButtonLabel(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName ? `Create ${normalizedName} here` : ''\n}\n\nfunction projectCreationStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName ? `Creating ${normalizedName} in Codex...` : 'Creating project in Codex...'\n}\n\nfunction openFolderStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName\n ? `Opening folder in Codex without creating ${normalizedName}...`\n : 'Opening folder in Codex...'\n}\n\nfunction failureStatusText(newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n return normalizedName\n ? `Failed to open folder or create ${normalizedName}.`\n : 'Failed to open folder.'\n}\n\nfunction actionButtonsHtml(localPath: string, newProjectName: string): string {\n const normalizedName = normalizeNewProjectName(newProjectName)\n const createTargetPath = projectCreationTargetPath(localPath, normalizedName)\n const createButton = createTargetPath\n ? `<button class=\"header-open-btn create-project-btn\" type=\"button\" aria-label=\"${escapeHtml(projectCreationButtonLabel(normalizedName))}\" title=\"${escapeHtml(projectCreationButtonLabel(normalizedName))}\" data-path=\"${escapeHtml(createTargetPath)}\" data-label=\"${escapeHtml(normalizedName)}\" data-status=\"${escapeHtml(projectCreationStatusText(normalizedName))}\" data-error=\"${escapeHtml(failureStatusText(normalizedName))}\">${escapeHtml(projectCreationButtonLabel(normalizedName))}</button>`\n : ''\n const openButton = `<button class=\"header-open-btn open-folder-btn\" type=\"button\" aria-label=\"Open current folder in Codex\" title=\"Open folder in Codex\" data-path=\"${escapeHtml(localPath)}\" data-label=\"\" data-status=\"${escapeHtml(openFolderStatusText(normalizedName))}\" data-error=\"${escapeHtml(failureStatusText(normalizedName))}\">Open folder in Codex</button>`\n return `${createButton}${openButton}`\n}\n\nexport async function getLocalDirectoryListing(\n localPath: string,\n options: LocalDirectoryListingOptions = {},\n): Promise<LocalDirectoryListing> {\n const entries = await readdir(localPath, { withFileTypes: true })\n const directories = entries\n .filter((entry) => entry.isDirectory())\n .map((entry) => ({\n name: entry.name,\n path: join(localPath, entry.name),\n }))\n .filter((entry) => options.showHidden === true || !isHiddenName(entry.name))\n .sort((a, b) => {\n const aHidden = isHiddenName(a.name)\n const bHidden = isHiddenName(b.name)\n if (aHidden !== bHidden) return aHidden ? -1 : 1\n return a.name.localeCompare(b.name, undefined, { numeric: true, sensitivity: 'base' })\n })\n\n return {\n path: localPath,\n parentPath: dirname(localPath),\n entries: directories,\n }\n}\n\nexport async function createDirectoryListingHtml(localPath: string, options?: { newProjectName?: string }): Promise<string> {\n const newProjectName = normalizeNewProjectName(options?.newProjectName ?? '')\n const items = await getDirectoryItems(localPath)\n const parentPath = dirname(localPath)\n const rows = items\n .map((item) => {\n const suffix = item.isDirectory ? '/' : ''\n const editAction = item.editable\n ? ` <a class=\"icon-btn\" aria-label=\"Edit ${escapeHtml(item.name)}\" href=\"${escapeHtml(toEditHref(item.path, newProjectName))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path, newProjectName))}\">${escapeHtml(item.name)}${suffix}</a><span class=\"row-actions\">${editAction}</span></li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<a class=\"header-parent-link\" href=\"${escapeHtml(toBrowseHref(parentPath, newProjectName))}\">..</a>`\n : ''\n const pickerSummary = newProjectName\n ? `<p class=\"picker-summary\">Browse to the parent folder where you want to create <strong>${escapeHtml(newProjectName)}</strong>, or open the current folder directly.</p>`\n : ''\n const actionButtons = actionButtonsHtml(localPath, newProjectName)\n\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Index of ${escapeHtml(localPath)}</title>\n <style>\n body { font-family: ui-monospace, Menlo, Monaco, monospace; margin: 16px; background: #0b1020; color: #dbe6ff; }\n a { color: #8cc2ff; text-decoration: none; }\n a:hover { text-decoration: underline; }\n ul { list-style: none; padding: 0; margin: 12px 0 0; display: flex; flex-direction: column; gap: 8px; }\n .file-row { display: grid; grid-template-columns: minmax(0,1fr) auto; align-items: center; gap: 10px; }\n .file-link { display: block; padding: 10px 12px; border: 1px solid #28405f; border-radius: 10px; background: #0f1b33; overflow-wrap: anywhere; }\n .header-actions { display: flex; align-items: center; gap: 10px; margin-top: 10px; flex-wrap: wrap; }\n .header-parent-link { color: #9ec8ff; font-size: 14px; padding: 8px 10px; border: 1px solid #2a4569; border-radius: 10px; background: #101f3a; }\n .header-parent-link:hover { text-decoration: none; filter: brightness(1.08); }\n .header-open-btn {\n height: 42px;\n padding: 0 14px;\n border: 1px solid #4f8de0;\n border-radius: 10px;\n background: linear-gradient(135deg, #2e6ee6 0%, #3d8cff 100%);\n color: #eef6ff;\n font-weight: 700;\n letter-spacing: 0.01em;\n cursor: pointer;\n box-shadow: 0 6px 18px rgba(33, 90, 199, 0.35);\n }\n .header-open-btn:hover { filter: brightness(1.08); }\n .header-open-btn:disabled { opacity: 0.6; cursor: default; }\n .picker-summary { margin: 10px 0 0; color: #b8d5ff; max-width: 60rem; line-height: 1.45; }\n .row-actions { display: inline-flex; align-items: center; gap: 8px; min-width: 42px; justify-content: flex-end; }\n .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; color: #dbe6ff; text-decoration: none; cursor: pointer; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\n .status { margin: 10px 0 0; color: #8cc2ff; min-height: 1.25em; }\n h1 { font-size: 18px; margin: 0; word-break: break-all; }\n @media (max-width: 640px) {\n body { margin: 12px; }\n .file-row { gap: 8px; }\n .file-link { font-size: 15px; padding: 12px; }\n .icon-btn { width: 44px; height: 44px; }\n }\n </style>\n</head>\n<body>\n <h1>Index of ${escapeHtml(localPath)}</h1>\n ${pickerSummary}\n <div class=\"header-actions\">\n ${parentLink}\n ${actionButtons}\n </div>\n <p id=\"status\" class=\"status\"></p>\n <ul>${rows}</ul>\n <script>\n const status = document.getElementById('status');\n document.addEventListener('click', async (event) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const button = target.closest('.open-folder-btn, .create-project-btn');\n if (!(button instanceof HTMLButtonElement)) return;\n\n const path = button.getAttribute('data-path') || '';\n const label = button.getAttribute('data-label') || '';\n const statusText = button.getAttribute('data-status') || 'Opening folder in Codex...';\n const errorText = button.getAttribute('data-error') || 'Failed to open folder.';\n if (!path) return;\n button.disabled = true;\n status.textContent = statusText;\n try {\n const response = await fetch('/codex-api/project-root', {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({\n path,\n createIfMissing: button.classList.contains('create-project-btn'),\n label,\n }),\n });\n if (!response.ok) {\n status.textContent = errorText;\n button.disabled = false;\n return;\n }\n status.textContent = 'Folder opened. Returning to Codex...';\n const nextUrl = '/?openProjectPath=' + encodeURIComponent(path) + '#/';\n window.location.assign(nextUrl);\n } catch {\n status.textContent = errorText;\n button.disabled = false;\n }\n });\n </script>\n</body>\n</html>`\n}\n\nexport async function createTextEditorHtml(localPath: string): Promise<string> {\n const content = await readFile(localPath, 'utf8')\n const parentPath = dirname(localPath)\n const language = languageForPath(localPath)\n const safeContentLiteral = escapeForInlineScriptString(content)\n return `<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n <title>Edit ${escapeHtml(localPath)}</title>\n <style>\n html, body { width: 100%; height: 100%; margin: 0; }\n body { font-family: ui-monospace, Menlo, Monaco, monospace; background: #0b1020; color: #dbe6ff; display: flex; flex-direction: column; overflow: hidden; }\n .toolbar { position: sticky; top: 0; z-index: 10; display: flex; flex-direction: column; gap: 8px; padding: 10px 12px; background: #0b1020; border-bottom: 1px solid #243a5a; }\n .row { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }\n button, a { background: #1b2a4a; color: #dbe6ff; border: 1px solid #345; padding: 6px 10px; border-radius: 6px; text-decoration: none; cursor: pointer; }\n button:hover, a:hover { filter: brightness(1.08); }\n #editor { flex: 1 1 auto; min-height: 0; width: 100%; border: none; overflow: hidden; }\n #status { margin-left: 8px; color: #8cc2ff; }\n .ace_editor { background: #07101f !important; color: #dbe6ff !important; width: 100% !important; height: 100% !important; }\n .ace_gutter { background: #07101f !important; color: #6f8eb5 !important; }\n .ace_marker-layer .ace_active-line { background: #10213c !important; }\n .ace_marker-layer .ace_selection { background: rgba(140, 194, 255, 0.3) !important; }\n .meta { opacity: 0.9; font-size: 12px; overflow-wrap: anywhere; }\n </style>\n</head>\n<body>\n <div class=\"toolbar\">\n <div class=\"row\">\n <a href=\"${escapeHtml(toBrowseHref(parentPath))}\">Back</a>\n <button id=\"saveBtn\" type=\"button\">Save</button>\n <span id=\"status\"></span>\n </div>\n <div class=\"meta\">${escapeHtml(localPath)} · ${escapeHtml(language)}</div>\n </div>\n <div id=\"editor\"></div>\n <script src=\"https://cdnjs.cloudflare.com/ajax/libs/ace/1.36.2/ace.js\"></script>\n <script>\n const saveBtn = document.getElementById('saveBtn');\n const status = document.getElementById('status');\n const editor = ace.edit('editor');\n editor.setTheme('ace/theme/tomorrow_night');\n editor.session.setMode('ace/mode/${escapeHtml(language)}');\n editor.setValue(${safeContentLiteral}, -1);\n editor.setOptions({\n fontSize: '13px',\n wrap: true,\n showPrintMargin: false,\n useSoftTabs: true,\n tabSize: 2,\n behavioursEnabled: true,\n });\n editor.resize();\n\n saveBtn.addEventListener('click', async () => {\n status.textContent = 'Saving...';\n const response = await fetch(location.pathname, {\n method: 'PUT',\n headers: { 'Content-Type': 'text/plain; charset=utf-8' },\n body: editor.getValue(),\n });\n status.textContent = response.ok ? 'Saved' : 'Save failed';\n });\n </script>\n</body>\n</html>`\n}\n","import { randomInt } from 'node:crypto'\n\nconst CHARS = 'abcdefghijklmnopqrstuvwxyz0123456789'\n\nfunction randomGroup(length: number): string {\n let result = ''\n for (let i = 0; i < length; i++) {\n result += CHARS[randomInt(CHARS.length)]\n }\n return result\n}\n\nexport function generatePassword(): string {\n return `${randomGroup(3)}-${randomGroup(3)}-${randomGroup(3)}`\n}\n"],"mappings":"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","names":["createServer","chmodSync","existsSync","mkdirSync","readFile","stat","writeFile","homedir","isAbsolute","join","resolve","spawn","createInterface","fileURLToPath","dirname","dirname","extname","isAbsolute","join","existsSync","writeFile","stat","spawn","spawnSync","createHash","mkdtemp","readFile","readdir","rm","mkdir","stat","lstat","existsSync","readFileSync","writeFileSync","httpRequest","httpsRequest","homedir","tmpdir","basename","dirname","isAbsolute","join","resolve","writeFile","homedir","join","resolve","join","homedir","updatedAtMs","spawn","mkdir","rm","stat","writeFile","tmpdir","join","asRecord","readString","getErrorMessage","setJson","resolve","spawn","mkdtemp","readFile","rm","mkdir","stat","existsSync","homedir","tmpdir","join","writeFile","spawnSync","asRecord","getErrorMessage","setJson","getCodexHomeDir","join","homedir","runCommand","resolve","spawn","rm","readFile","stat","writeFile","existsSync","mkdtemp","tmpdir","mkdir","repoDir","branch","readJsonBody","localSkills","pulledHead","basename","asRecord","getErrorMessage","resolve","threadId","message","hasUsableCodexAuth","baseUrl","resolve","existsSync","basename","join","homedir","spawnSync","require","spawn","terminal","join","homedir","payloadRecord","asRecord","stat","readFile","asRecord","isAbsolute","readFileSync","createHash","join","tmpdir","mkdir","stat","writeFile","changed","getErrorMessage","readFile","setJson","lstat","homedir","repoName","resolve","runCommand","rm","existsSync","readdir","readBoolean","readNumber","spawnSync","spawn","payloadRecord","runCommandCapture","getCodexHomeDir","join","getCodexHomeDir","readdir","readFile","mkdir","existsSync","writeFile","basename","resolve","rm","runCommand","spawn","isMissingHeadError","getErrorMessage","isNotGitRepositoryError","stat","runCommandCapture","asRecord","join","getCodexHomeDir","decodeBase64UrlJson","readFile","writeFile","readFileSync","dirname","writeFileSync","readdir","mkdir","stat","rm","runCommand","value","readJsonBody","setJson","tmpdir","mkdtemp","getErrorMessage","httpRequest","httpsRequest","resolve","spawn","process","readFreeModeState","isAbsolute","homedir","runCommandCapture","isNotGitRepositoryError","basename","isMissingHeadError","next","randomBytes","existsSync","mkdirSync","readFileSync","writeFileSync","homedir","dirname","join","getCodexHomeDir","randomBytes","dirname","extname","join","readFile","readdir","stat","escapeHtml","dirname","join","isAbsolute","extname","stat","writeFile","existsSync","__dirname","dirname","fileURLToPath","join","homedir","existsSync","mkdirSync","writeFile","readFile","resolve","chmodSync","createInterface","spawn","getCodexGlobalStatePath","isAbsolute","stat","createServer"]}