codexapp 0.1.44 → 0.1.45

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/server/httpServer.ts","../src/server/codexAppServerBridge.ts","../src/server/skillsRoutes.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 } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { join } from 'node:path'\nimport { spawn, spawnSync } 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 { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\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 canRun(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, { stdio: 'ignore' })\n return result.status === 0\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSync(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 = spawnSync(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nfunction resolveCodexCommand(): string | null {\n if (canRun('codex', ['--version'])) {\n return 'codex'\n }\n\n const userCandidate = join(getUserNpmPrefix(), 'bin', 'codex')\n if (existsSync(userCandidate) && canRun(userCandidate, ['--version'])) {\n return userCandidate\n }\n\n const prefix = process.env.PREFIX?.trim()\n if (!prefix) {\n return null\n }\n const candidate = join(prefix, 'bin', 'codex')\n if (existsSync(candidate) && canRun(candidate, ['--version'])) {\n return candidate\n }\n return null\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRun('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRun(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 = `${userBinDir}:${process.env.PATH ?? ''}`\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 (!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 const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\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 = `${join(userPrefix, 'bin')}:${process.env.PATH ?? ''}`\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\nfunction resolvePassword(input: string | boolean): string | undefined {\n if (input === false) {\n return undefined\n }\n if (typeof input === 'string') {\n return input\n }\n return generatePassword()\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 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 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 return Array.from(urls)\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\nasync function startServer(options: { port: string; password: string | boolean; tunnel: boolean }) {\n const version = await readCliVersion()\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (!hasCodexAuth() && codexCommand) {\n console.log('\\nCodex is not logged in. Starting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n }\n const requestedPort = parseInt(options.port, 10)\n const password = resolvePassword(options.password)\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 ]\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 (password) {\n lines.push(` Password: ${password}`)\n }\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelUrl) {\n qrcode.generate(tunnelUrl, { small: true })\n console.log('')\n }\n 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 console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .option('-p, --port <port>', 'port to listen on', '5999')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .action(async (opts: { port: string; password: string | boolean; tunnel: boolean }) => {\n await startServer(opts)\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 { 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, 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><a href=\"/\">Back to chat</a></p>',\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. 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 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)\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 // 6. 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 // 7. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 8. 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: npm 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, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat, cp, lstat, readlink, symlink } from 'node:fs/promises'\nimport { existsSync } from 'node:fs'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, isAbsolute, join, resolve } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\nimport { handleSkillsRoutes, initializeSkillsSyncOnStartup } from './skillsRoutes.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 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}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\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\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\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 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 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 proc = spawn('rg', ['--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\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): 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 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()\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\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 getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n tokens?: {\n access_token?: string\n account_id?: string\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 getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return { titles: {}, order: [] }\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 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\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 { titles: {}, order: [] }\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 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 }\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\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\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\nasync function proxyTranscribe(\n body: Buffer,\n contentType: string,\n authToken: string,\n accountId?: string,\n): Promise<{ status: number; body: string }> {\n const headers: 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\n if (accountId) {\n headers['ChatGPT-Account-Id'] = accountId\n }\n\n return new Promise((resolve, reject) => {\n const req = httpsRequest(\n 'https://chatgpt.com/backend-api/transcribe',\n { method: 'POST', headers },\n (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 )\n req.on('error', reject)\n req.write(body)\n req.end()\n })\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 = [\n 'app-server',\n '-c',\n 'approval_policy=\"never\"',\n '-c',\n 'sandbox_mode=\"danger-full-access\"',\n ]\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const proc = spawn('codex', this.appServerArgs, { stdio: ['pipe', 'pipe', 'pipe'] })\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 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 for (const listener of this.notificationListeners) {\n listener(notification)\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 handleServerRequest(requestId: number, method: string, params: unknown): void {\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 }).then(() => {\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\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 process = spawn('codex', ['app-server', 'generate-json-schema', '--out', outDir], {\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 appServer: AppServerProcess\n methodCatalog: MethodCatalog\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\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) return existing\n\n const created: SharedBridgeState = {\n appServer: new AppServerProcess(),\n methodCatalog: new MethodCatalog(),\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 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[] = []\n const concurrency = 4\n for (let offset = 0; offset < threads.length; offset += concurrency) {\n const batch = threads.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 {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument\n } catch {\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 docs.push(...loaded)\n }\n\n return docs\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, methodCatalog } = 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\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\n\n if (await handleSkillsRoutes(req, res, url, { appServer, readJsonBody })) {\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\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 result = await appServer.rpc(body.method, body.params ?? null)\n setJson(res, 200, { result })\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 === '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/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/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 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 branch = `codex/${worktreeId}`\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch,\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 === '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 const nextState: WorkspaceRootsState = {\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n }\n await writeWorkspaceRootsState(nextState)\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 const existingState = await readWorkspaceRootsState()\n const nextOrder = [normalizedPath, ...existingState.order.filter((item) => item !== normalizedPath)]\n const nextActive = [normalizedPath, ...existingState.active.filter((item) => item !== normalizedPath)]\n const nextLabels = { ...existingState.labels }\n if (label.trim().length > 0) {\n nextLabels[normalizedPath] = label.trim()\n }\n await writeWorkspaceRootsState({\n order: nextOrder,\n labels: nextLabels,\n active: nextActive,\n })\n setJson(res, 200, { data: { path: normalizedPath } })\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/thread-titles') {\n const cache = await readThreadTitleCache()\n setJson(res, 200, { data: cache })\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 === '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 appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n return appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n }\n\n return middleware\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'\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 getSkillsInstallDir(): string {\n return join(getCodexHomeDir(), 'skills')\n}\n\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): 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 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()\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 } = {}): 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\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 parts = skill.path.split('/').filter(Boolean)\n if (parts.length < 2) continue\n return `/${parts.slice(0, -2).join('/')}`\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 path?: string\n enabled?: boolean\n}\n\ntype SkillsTreeEntry = {\n name: string\n owner: string\n url: string\n}\n\ntype SkillsTreeCache = {\n entries: SkillsTreeEntry[]\n fetchedAt: number\n}\n\ntype MetaJson = {\n displayName?: string\n owner?: string\n slug?: string\n latest?: { publishedAt?: number }\n}\n\nconst TREE_CACHE_TTL_MS = 5 * 60 * 1000\nlet skillsTreeCache: SkillsTreeCache | null = null\nconst metaCache = new Map<string, { description: string; displayName: string; publishedAt: number }>()\n\nasync function getGhToken(): Promise<string | null> {\n try {\n const proc = spawn('gh', ['auth', 'token'], { stdio: ['ignore', 'pipe', 'ignore'] })\n let out = ''\n proc.stdout.on('data', (d: Buffer) => { out += d.toString() })\n return new Promise((resolve) => {\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null))\n proc.on('error', () => resolve(null))\n })\n } catch {\n return null\n }\n}\n\nasync function ghFetch(url: string): Promise<Response> {\n const token = await getGhToken()\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'codex-web-local',\n }\n if (token) headers.Authorization = `Bearer ${token}`\n return fetch(url, { headers })\n}\n\nasync function fetchSkillsTree(): Promise<SkillsTreeEntry[]> {\n if (skillsTreeCache && Date.now() - skillsTreeCache.fetchedAt < TREE_CACHE_TTL_MS) {\n return skillsTreeCache.entries\n }\n\n const resp = await ghFetch(`https://api.github.com/repos/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/git/trees/main?recursive=1`)\n if (!resp.ok) throw new Error(`GitHub tree API returned ${resp.status}`)\n const data = (await resp.json()) as { tree?: Array<{ path: string; type: string }> }\n\n const metaPattern = /^skills\\/([^/]+)\\/([^/]+)\\/_meta\\.json$/\n const seen = new Set<string>()\n const entries: SkillsTreeEntry[] = []\n\n for (const node of data.tree ?? []) {\n const match = metaPattern.exec(node.path)\n if (!match) continue\n const [, owner, skillName] = match\n const key = `${owner}/${skillName}`\n if (seen.has(key)) continue\n seen.add(key)\n entries.push({\n name: skillName,\n owner,\n url: `https://github.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/tree/main/skills/${owner}/${skillName}`,\n })\n }\n\n skillsTreeCache = { entries, fetchedAt: Date.now() }\n return entries\n}\n\nasync function fetchMetaBatch(entries: SkillsTreeEntry[]): Promise<void> {\n const toFetch = entries.filter((e) => !metaCache.has(`${e.owner}/${e.name}`))\n if (toFetch.length === 0) return\n const batch = toFetch.slice(0, 50)\n await Promise.allSettled(\n batch.map(async (e) => {\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${e.owner}/${e.name}/_meta.json`\n const resp = await fetch(rawUrl)\n if (!resp.ok) return\n const meta = (await resp.json()) as MetaJson\n metaCache.set(`${e.owner}/${e.name}`, {\n displayName: typeof meta.displayName === 'string' ? meta.displayName : '',\n description: typeof meta.displayName === 'string' ? meta.displayName : '',\n publishedAt: meta.latest?.publishedAt ?? 0,\n })\n }),\n )\n}\n\nfunction buildHubEntry(e: SkillsTreeEntry): SkillHubEntry {\n const cached = metaCache.get(`${e.owner}/${e.name}`)\n return {\n name: e.name,\n owner: e.owner,\n description: cached?.description ?? '',\n displayName: cached?.displayName ?? '',\n publishedAt: cached?.publishedAt ?? 0,\n avatarUrl: `https://github.com/${e.owner}.png?size=40`,\n url: e.url,\n installed: false,\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}\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 HUB_SKILLS_OWNER = 'openclaw'\nconst HUB_SKILLS_REPO = 'skills'\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: getPreferredSyncBranch(),\n lastAction: 'not-started',\n lastRunAtIso: '',\n lastSuccessAtIso: '',\n lastError: '',\n}\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n const skillsDir = getSkillsInstallDir()\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\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 getPreferredSyncBranch(): string {\n return isAndroidLikeRuntime() ? 'android' : 'main'\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 = getPreferredSyncBranch()\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<void> {\n const url = `https://api.github.com/repos/${repoOwner}/${repoName}/contents/${SKILLS_SYNC_MANIFEST_PATH}`\n let sha = ''\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 }\n sha = payload.sha ?? ''\n }\n const content = Buffer.from(JSON.stringify(skills, null, 2), 'utf8').toString('base64')\n await getGithubJson(url, token, 'PUT', {\n message: 'Update synced skills manifest',\n content,\n ...(sha ? { sha } : {}),\n })\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(repoUrl: string, branch: string): Promise<string> {\n const localDir = getSkillsInstallDir()\n await mkdir(localDir, { recursive: true })\n const gitDir = join(localDir, '.git')\n let hasGitDir = false\n try { hasGitDir = (await stat(gitDir)).isDirectory() } catch { hasGitDir = false }\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 runCommand('git', ['fetch', 'origin'], { cwd: localDir })\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 runCommand('git', ['fetch', 'origin'], { cwd: localDir })\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n try {\n await runCommand('git', ['checkout', branch], { cwd: localDir })\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n await runCommand('git', ['checkout', '-B', branch], { cwd: localDir })\n }\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n const localMtimesBeforePull = await snapshotFileMtimes(localDir)\n try { await runCommand('git', ['stash', 'push', '--include-untracked', '-m', 'codex-skills-autostash'], { cwd: localDir }) } catch {}\n let pulledMtimes = new Map<string, number>()\n try {\n await runCommand('git', ['pull', '--no-rebase', 'origin', branch], { cwd: localDir })\n pulledMtimes = await snapshotFileMtimes(localDir)\n } catch {\n await resolveMergeConflictsByNewerCommit(localDir, branch)\n pulledMtimes = await snapshotFileMtimes(localDir)\n }\n try {\n await runCommand('git', ['stash', 'pop'], { cwd: localDir })\n } catch {\n await resolveStashPopConflictsByFileTime(localDir, localMtimesBeforePull, pulledMtimes)\n }\n return localDir\n}\n\nasync function resolveMergeConflictsByNewerCommit(repoDir: string, branch: string): 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 oursTime = await getCommitTime(repoDir, 'HEAD', path)\n const theirsTime = await getCommitTime(repoDir, `origin/${branch}`, path)\n if (theirsTime > oursTime) {\n await runCommand('git', ['checkout', '--theirs', '--', path], { cwd: repoDir })\n } else {\n await runCommand('git', ['checkout', '--ours', '--', path], { cwd: repoDir })\n }\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\n if (mergeHead) {\n await runCommand('git', ['commit', '-m', 'Auto-resolve skills merge by newer file'], { cwd: repoDir })\n }\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 runCommand('git', ['checkout', side, '--', path], { cwd: repoDir })\n await runCommand('git', ['add', '--', path], { cwd: repoDir })\n }\n const mergeHead = (await runCommandWithOutput('git', ['rev-parse', '-q', '--verify', 'MERGE_HEAD'], { cwd: repoDir })).trim()\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 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 const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = getPreferredSyncBranch()\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 runCommand('git', ['add', '.'], { cwd: repoDir })\n const status = (await runCommandWithOutput('git', ['status', '--porcelain'], { cwd: repoDir })).trim()\n if (!status) return\n await runCommand('git', ['commit', '-m', 'Sync installed skills folder and manifest'], { cwd: repoDir })\n await runCommand('git', ['push', 'origin', `HEAD:${branch}`], { cwd: repoDir })\n}\n\nasync function pullInstalledSkillsFolderFromRepo(token: string, repoOwner: string, repoName: string): Promise<void> {\n const remoteUrl = toGitHubTokenRemote(repoOwner, repoName, token)\n const branch = getPreferredSyncBranch()\n await ensureSkillsWorkingTreeRepo(remoteUrl, branch)\n}\n\nasync function bootstrapSkillsFromUpstreamIntoLocal(): Promise<void> {\n const repoUrl = `https://github.com/${SYNC_UPSTREAM_SKILLS_OWNER}/${SYNC_UPSTREAM_SKILLS_REPO}.git`\n const branch = getPreferredSyncBranch()\n await ensureSkillsWorkingTreeRepo(repoUrl, branch)\n}\n\nasync function collectLocalSyncedSkills(appServer: AppServerLike): Promise<SyncedSkill[]> {\n const state = await readSkillsSyncState()\n const owners = { ...(state.installedOwners ?? {}) }\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n\n const skills = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; enabled?: boolean }> }> }\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 entry.skills ?? []) {\n const name = typeof skill.name === 'string' ? skill.name : ''\n if (!name || seen.has(name)) continue\n seen.add(name)\n let owner = owners[name]\n if (!owner) {\n owner = uniqueOwnerByName.get(name) ?? ''\n if (owner) {\n owners[name] = owner\n ownersChanged = true\n }\n }\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 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\nexport async function initializeSkillsSyncOnStartup(appServer: AppServerLike): Promise<void> {\n if (startupSkillsSyncInitialized) return\n startupSkillsSyncInitialized = true\n startupSyncStatus.inProgress = true\n startupSyncStatus.lastRunAtIso = new Date().toISOString()\n startupSyncStatus.lastError = ''\n startupSyncStatus.branch = getPreferredSyncBranch()\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.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.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\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\nasync function searchSkillsHub(\n allEntries: SkillsTreeEntry[],\n query: string,\n limit: number,\n sort: string,\n installedMap: Map<string, InstalledSkillInfo>,\n): Promise<SkillHubEntry[]> {\n const q = query.toLowerCase().trim()\n const filtered = q\n ? allEntries.filter((s) => {\n if (s.name.toLowerCase().includes(q) || s.owner.toLowerCase().includes(q)) return true\n const cached = metaCache.get(`${s.owner}/${s.name}`)\n return Boolean(cached?.displayName?.toLowerCase().includes(q))\n })\n : allEntries\n const page = filtered.slice(0, Math.min(limit * 2, 200))\n await fetchMetaBatch(page)\n let results = page.map(buildHubEntry)\n if (sort === 'date') {\n results.sort((a, b) => b.publishedAt - a.publishedAt)\n } else if (q) {\n results.sort((a, b) => {\n const aExact = a.name.toLowerCase() === q ? 1 : 0\n const bExact = b.name.toLowerCase() === q ? 1 : 0\n if (aExact !== bExact) return bExact - aExact\n return b.publishedAt - a.publishedAt\n })\n }\n return results.slice(0, limit).map((s) => {\n const local = installedMap.get(s.name)\n return local ? { ...s, installed: true, path: local.path, enabled: local.enabled } : s\n })\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 q = url.searchParams.get('q') || ''\n const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') || '50', 10) || 50, 1), 200)\n const sort = url.searchParams.get('sort') || 'date'\n const allEntries = await fetchSkillsTree()\n\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; path?: string; enabled?: boolean }> }> }\n for (const entry of result.data ?? []) {\n for (const skill of 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\n const installedHubEntries = allEntries.filter((e) => installedMap.has(e.name))\n await fetchMetaBatch(installedHubEntries)\n\n const installed: SkillHubEntry[] = []\n for (const [, info] of installedMap) {\n const hubEntry = allEntries.find((e) => e.name === info.name)\n const base = hubEntry ? buildHubEntry(hubEntry) : {\n name: info.name, owner: 'local', description: '', displayName: '', publishedAt: 0, avatarUrl: '', url: '', installed: false,\n }\n installed.push({ ...base, installed: true, path: info.path, enabled: info.enabled })\n }\n\n const results = await searchSkillsHub(allEntries, q, limit, sort, installedMap)\n setJson(res, 200, { data: results, installed, total: allEntries.length })\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-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 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 scanInstalledSkillsFromDisk()\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/pull') {\n try {\n const state = await readSkillsSyncState()\n if (!state.githubToken || !state.repoOwner || !state.repoName) {\n await bootstrapSkillsFromUpstreamIntoLocal()\n try { await appServer.rpc('skills/list', { forceReload: true }) } catch {}\n setJson(res, 200, { ok: true, data: { synced: 0, source: 'upstream' } })\n return true\n }\n const remote = await readRemoteSkillsManifest(state.githubToken, state.repoOwner, state.repoName)\n const tree = await fetchSkillsTree()\n const uniqueOwnerByName = new Map<string, string>()\n const ambiguousNames = new Set<string>()\n for (const entry of tree) {\n if (ambiguousNames.has(entry.name)) continue\n const existingOwner = uniqueOwnerByName.get(entry.name)\n if (!existingOwner) {\n uniqueOwnerByName.set(entry.name, entry.owner)\n continue\n }\n if (existingOwner !== entry.owner) {\n uniqueOwnerByName.delete(entry.name)\n ambiguousNames.add(entry.name)\n }\n }\n const localDir = await detectUserSkillsDir(appServer)\n await pullInstalledSkillsFolderFromRepo(state.githubToken, state.repoOwner, state.repoName)\n const installerScript = '/Users/igor/.cursor/skills/.system/skill-installer/scripts/install-skill-from-github.py'\n const localSkills = await scanInstalledSkillsFromDisk()\n for (const skill of remote) {\n const owner = skill.owner || uniqueOwnerByName.get(skill.name) || ''\n if (!owner) continue\n if (!localSkills.has(skill.name)) {\n await runCommand('python3', [\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${skill.name}`,\n '--dest', localDir,\n '--method', 'git',\n ])\n }\n const skillPath = join(localDir, skill.name)\n await appServer.rpc('skills/config/write', { path: skillPath, enabled: skill.enabled })\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 || uniqueOwnerByName.get(item.name) || ''\n if (owner) nextOwners[item.name] = owner\n }\n await writeSkillsSyncState({ ...state, installedOwners: nextOwners })\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 if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n const rawUrl = `https://raw.githubusercontent.com/${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}/main/skills/${owner}/${name}/SKILL.md`\n const resp = await fetch(rawUrl)\n if (!resp.ok) throw new Error(`Failed to fetch SKILL.md: ${resp.status}`)\n const content = await resp.text()\n setJson(res, 200, { content })\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 owner = typeof payload?.owner === 'string' ? payload.owner : ''\n const name = typeof payload?.name === 'string' ? payload.name : ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return true\n }\n const installerScript = '/Users/igor/.cursor/skills/.system/skill-installer/scripts/install-skill-from-github.py'\n const installDest = await detectUserSkillsDir(appServer)\n await runCommand('python3', [\n installerScript,\n '--repo', `${HUB_SKILLS_OWNER}/${HUB_SKILLS_REPO}`,\n '--path', `skills/${owner}/${name}`,\n '--dest', installDest,\n '--method', 'git',\n ])\n const skillDir = join(installDest, name)\n await ensureInstalledSkillIsValid(appServer, skillDir)\n const syncState = await readSkillsSyncState()\n const nextOwners = { ...(syncState.installedOwners ?? {}), [name]: owner }\n await writeSkillsSyncState({ ...syncState, installedOwners: nextOwners })\n await autoPushSyncedSkills(appServer)\n setJson(res, 200, { ok: true, path: skillDir })\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 target = path || (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 await autoPushSyncedSkills(appServer)\n try { await appServer.rpc('skills/list', { forceReload: true }) } 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 { randomBytes, timingSafeEqual } from 'node:crypto'\nimport type { IncomingMessage } from 'node:http'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'codex_web_local_token'\n\nfunction isLocalhostRequest(req: Request): boolean {\n const remote = req.socket.remoteAddress ?? ''\n if (remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1') {\n return true\n }\n\n const host = (req.headers.host ?? '').toLowerCase()\n return host.startsWith('localhost:') || host === 'localhost' || host.startsWith('127.0.0.1:')\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 isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Set<string>,\n): boolean {\n const remote = remoteAddress ?? ''\n if (isLocalhostRemote(remote) || isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n return Boolean(token && validTokens.has(token))\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 Local &mdash; Login</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 Local</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 = new Set<string>()\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\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 try {\n const parsed = JSON.parse(body) as { password?: string }\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n const token = randomBytes(32).toString('hex')\n validTokens.add(token)\n\n res.setHeader('Set-Cookie', `${TOKEN_COOKIE}=${token}; Path=/; HttpOnly; SameSite=Strict`)\n res.json({ ok: true })\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n }\n })\n return\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\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 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 toBrowseHref(pathValue: string): string {\n return `/codex-local-browse${encodeURI(pathValue)}`\n}\n\nfunction toEditHref(pathValue: string): string {\n return `/codex-local-edit${encodeURI(pathValue)}`\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\nexport async function createDirectoryListingHtml(localPath: string): Promise<string> {\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))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path))}\">${escapeHtml(item.name)}${suffix}</a>${editAction}</li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<p><a href=\"${escapeHtml(toBrowseHref(parentPath))}\">..</a></p>`\n : ''\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 .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; text-decoration: none; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\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 ${parentLink}\n <ul>${rows}</ul>\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","existsSync","readFile","homedir","join","spawn","fileURLToPath","dirname","dirname","extname","isAbsolute","join","existsSync","writeFile","stat","spawn","mkdtemp","readFile","mkdir","stat","homedir","tmpdir","join","writeFile","resolve","readJsonBody","asRecord","getErrorMessage","setJson","resolve","spawn","getCodexHomeDir","join","homedir","runCommand","resolve","spawn","getErrorMessage","join","stat","writeFile","join","getCodexHomeDir","readFile","asRecord","writeFile","setJson","tmpdir","mkdir","mkdtemp","getErrorMessage","resolve","spawn","process","homedir","stat","runCommand","next","randomBytes","randomBytes","join","readFile","readdir","stat","dirname","join","isAbsolute","extname","stat","writeFile","existsSync","__dirname","dirname","fileURLToPath","join","readFile","homedir","existsSync","resolve","spawn","createServer"]}
1
+ {"version":3,"sources":["../src/cli/index.ts","../src/server/httpServer.ts","../src/server/codexAppServerBridge.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 } from 'node:fs/promises'\nimport { homedir, networkInterfaces } from 'node:os'\nimport { join } from 'node:path'\nimport { spawn, spawnSync } 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 { createServer as createApp } from '../server/httpServer.js'\nimport { generatePassword } from '../server/password.js'\n\nconst program = new Command().name('codexui').description('Web interface for Codex app-server')\nconst __dirname = dirname(fileURLToPath(import.meta.url))\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 canRun(command: string, args: string[] = []): boolean {\n const result = spawnSync(command, args, { stdio: 'ignore' })\n return result.status === 0\n}\n\nfunction runOrFail(command: string, args: string[], label: string): void {\n const result = spawnSync(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 = spawnSync(command, args, { stdio: 'inherit' })\n return result.status ?? -1\n}\n\nfunction getUserNpmPrefix(): string {\n return join(homedir(), '.npm-global')\n}\n\nfunction resolveCodexCommand(): string | null {\n if (canRun('codex', ['--version'])) {\n return 'codex'\n }\n\n const userCandidate = join(getUserNpmPrefix(), 'bin', 'codex')\n if (existsSync(userCandidate) && canRun(userCandidate, ['--version'])) {\n return userCandidate\n }\n\n const prefix = process.env.PREFIX?.trim()\n if (!prefix) {\n return null\n }\n const candidate = join(prefix, 'bin', 'codex')\n if (existsSync(candidate) && canRun(candidate, ['--version'])) {\n return candidate\n }\n return null\n}\n\nfunction resolveCloudflaredCommand(): string | null {\n if (canRun('cloudflared', ['--version'])) {\n return 'cloudflared'\n }\n const localCandidate = join(homedir(), '.local', 'bin', 'cloudflared')\n if (existsSync(localCandidate) && canRun(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 = `${userBinDir}:${process.env.PATH ?? ''}`\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 (!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 const installApproved = await shouldInstallCloudflaredInteractively()\n if (!installApproved) {\n return null\n }\n\n return ensureCloudflaredInstalledLinux()\n}\n\nfunction hasCodexAuth(): boolean {\n const codexHome = process.env.CODEX_HOME?.trim() || join(homedir(), '.codex')\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 = `${join(userPrefix, 'bin')}:${process.env.PATH ?? ''}`\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\nfunction resolvePassword(input: string | boolean): string | undefined {\n if (input === false) {\n return undefined\n }\n if (typeof input === 'string') {\n return input\n }\n return generatePassword()\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 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 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 return Array.from(urls)\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\nasync function startServer(options: { port: string; password: string | boolean; tunnel: boolean }) {\n const version = await readCliVersion()\n const codexCommand = ensureCodexInstalled() ?? resolveCodexCommand()\n if (!hasCodexAuth() && codexCommand) {\n console.log('\\nCodex is not logged in. Starting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n }\n const requestedPort = parseInt(options.port, 10)\n const password = resolvePassword(options.password)\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 ]\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 (password) {\n lines.push(` Password: ${password}`)\n }\n if (tunnelUrl) {\n lines.push(` Tunnel: ${tunnelUrl}`)\n lines.push(' Tunnel QR code below')\n }\n\n printTermuxKeepAlive(lines)\n lines.push('')\n console.log(lines.join('\\n'))\n if (tunnelUrl) {\n qrcode.generate(tunnelUrl, { small: true })\n console.log('')\n }\n 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 console.log('\\nStarting `codex login`...\\n')\n runOrFail(codexCommand, ['login'], 'Codex login')\n}\n\nprogram\n .option('-p, --port <port>', 'port to listen on', '5999')\n .option('--password <pass>', 'set a specific password')\n .option('--no-password', 'disable password protection')\n .option('--tunnel', 'start cloudflared tunnel', true)\n .option('--no-tunnel', 'disable cloudflared tunnel startup')\n .action(async (opts: { port: string; password: string | boolean; tunnel: boolean }) => {\n await startServer(opts)\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 { 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, 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 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. 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 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)\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 // 6. 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 // 7. Static files from Vue build\n if (hasFrontendAssets) {\n app.use(express.static(distDir))\n }\n\n // 8. SPA fallback\n app.use((_req, res) => {\n if (!hasFrontendAssets) {\n res.status(503).type('text/plain').send(\n [\n 'Codex web UI assets are missing.',\n `Expected: ${spaEntryFile}`,\n 'If running from source, build frontend assets with: npm run build:frontend',\n 'If running with npx, clear the npx cache and reinstall codexapp.',\n ].join('\\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/plain').send('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, type ChildProcessWithoutNullStreams } from 'node:child_process'\nimport { randomBytes } from 'node:crypto'\nimport { mkdtemp, readFile, readdir, rm, mkdir, stat } from 'node:fs/promises'\nimport type { IncomingMessage, ServerResponse } from 'node:http'\nimport { request as httpsRequest } from 'node:https'\nimport { homedir } from 'node:os'\nimport { tmpdir } from 'node:os'\nimport { basename, isAbsolute, join, resolve } from 'node:path'\nimport { writeFile } from 'node:fs/promises'\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 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}\n\ntype PendingServerRequest = {\n id: number\n method: string\n params: unknown\n receivedAtIso: string\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\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\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 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 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 proc = spawn('rg', ['--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\nasync function runCommand(command: string, args: string[], options: { cwd?: string } = {}): 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 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()\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>((resolveOutput, 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 resolveOutput(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\nasync function detectUserSkillsDir(appServer: AppServerProcess): 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 parts = skill.path.split('/').filter(Boolean)\n if (parts.length < 2) continue\n return `/${parts.slice(0, -2).join('/')}`\n }\n }\n } catch {}\n return getSkillsInstallDir()\n}\n\nasync function ensureInstalledSkillIsValid(appServer: AppServerProcess, 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 path?: string\n enabled?: boolean\n}\n\ntype SkillsTreeEntry = {\n name: string\n owner: string\n url: string\n}\n\ntype SkillsTreeCache = {\n entries: SkillsTreeEntry[]\n fetchedAt: number\n}\n\ntype MetaJson = {\n displayName?: string\n owner?: string\n slug?: string\n latest?: { publishedAt?: number }\n}\n\nconst TREE_CACHE_TTL_MS = 5 * 60 * 1000\nlet skillsTreeCache: SkillsTreeCache | null = null\nconst metaCache = new Map<string, { description: string; displayName: string; publishedAt: number }>()\n\nasync function getGhToken(): Promise<string | null> {\n try {\n const proc = spawn('gh', ['auth', 'token'], { stdio: ['ignore', 'pipe', 'ignore'] })\n let out = ''\n proc.stdout.on('data', (d: Buffer) => { out += d.toString() })\n return new Promise((resolve) => {\n proc.on('close', (code) => resolve(code === 0 ? out.trim() : null))\n proc.on('error', () => resolve(null))\n })\n } catch { return null }\n}\n\nasync function ghFetch(url: string): Promise<Response> {\n const token = await getGhToken()\n const headers: Record<string, string> = {\n Accept: 'application/vnd.github+json',\n 'User-Agent': 'codex-web-local',\n }\n if (token) headers.Authorization = `Bearer ${token}`\n return fetch(url, { headers })\n}\n\nasync function fetchSkillsTree(): Promise<SkillsTreeEntry[]> {\n if (skillsTreeCache && Date.now() - skillsTreeCache.fetchedAt < TREE_CACHE_TTL_MS) {\n return skillsTreeCache.entries\n }\n\n const resp = await ghFetch('https://api.github.com/repos/openclaw/skills/git/trees/main?recursive=1')\n if (!resp.ok) throw new Error(`GitHub tree API returned ${resp.status}`)\n const data = (await resp.json()) as { tree?: Array<{ path: string; type: string }> }\n\n const metaPattern = /^skills\\/([^/]+)\\/([^/]+)\\/_meta\\.json$/\n const seen = new Set<string>()\n const entries: SkillsTreeEntry[] = []\n\n for (const node of data.tree ?? []) {\n const match = metaPattern.exec(node.path)\n if (!match) continue\n const [, owner, skillName] = match\n const key = `${owner}/${skillName}`\n if (seen.has(key)) continue\n seen.add(key)\n entries.push({\n name: skillName,\n owner,\n url: `https://github.com/openclaw/skills/tree/main/skills/${owner}/${skillName}`,\n })\n }\n\n skillsTreeCache = { entries, fetchedAt: Date.now() }\n return entries\n}\n\nasync function fetchMetaBatch(entries: SkillsTreeEntry[]): Promise<void> {\n const toFetch = entries.filter((e) => !metaCache.has(`${e.owner}/${e.name}`))\n if (toFetch.length === 0) return\n\n const batch = toFetch.slice(0, 50)\n const results = await Promise.allSettled(\n batch.map(async (e) => {\n const rawUrl = `https://raw.githubusercontent.com/openclaw/skills/main/skills/${e.owner}/${e.name}/_meta.json`\n const resp = await fetch(rawUrl)\n if (!resp.ok) return\n const meta = (await resp.json()) as MetaJson\n metaCache.set(`${e.owner}/${e.name}`, {\n displayName: typeof meta.displayName === 'string' ? meta.displayName : '',\n description: typeof meta.displayName === 'string' ? meta.displayName : '',\n publishedAt: meta.latest?.publishedAt ?? 0,\n })\n }),\n )\n void results\n}\n\nfunction buildHubEntry(e: SkillsTreeEntry): SkillHubEntry {\n const cached = metaCache.get(`${e.owner}/${e.name}`)\n return {\n name: e.name,\n owner: e.owner,\n description: cached?.description ?? '',\n displayName: cached?.displayName ?? '',\n publishedAt: cached?.publishedAt ?? 0,\n avatarUrl: `https://github.com/${e.owner}.png?size=40`,\n url: e.url,\n installed: false,\n }\n}\n\ntype InstalledSkillInfo = { name: string; path: string; enabled: boolean }\n\nasync function scanInstalledSkillsFromDisk(): Promise<Map<string, InstalledSkillInfo>> {\n const map = new Map<string, InstalledSkillInfo>()\n const skillsDir = getSkillsInstallDir()\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 searchSkillsHub(\n allEntries: SkillsTreeEntry[],\n query: string,\n limit: number,\n sort: string,\n installedMap: Map<string, InstalledSkillInfo>,\n): Promise<SkillHubEntry[]> {\n const q = query.toLowerCase().trim()\n let filtered = q\n ? allEntries.filter((s) => {\n if (s.name.toLowerCase().includes(q) || s.owner.toLowerCase().includes(q)) return true\n const cached = metaCache.get(`${s.owner}/${s.name}`)\n if (cached?.displayName?.toLowerCase().includes(q)) return true\n return false\n })\n : allEntries\n\n const page = filtered.slice(0, Math.min(limit * 2, 200))\n await fetchMetaBatch(page)\n\n let results = page.map(buildHubEntry)\n\n if (sort === 'date') {\n results.sort((a, b) => b.publishedAt - a.publishedAt)\n } else if (q) {\n results.sort((a, b) => {\n const aExact = a.name.toLowerCase() === q ? 1 : 0\n const bExact = b.name.toLowerCase() === q ? 1 : 0\n if (aExact !== bExact) return bExact - aExact\n return b.publishedAt - a.publishedAt\n })\n }\n\n return results.slice(0, limit).map((s) => {\n const local = installedMap.get(s.name)\n return local\n ? { ...s, installed: true, path: local.path, enabled: local.enabled }\n : s\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 getCodexAuthPath(): string {\n return join(getCodexHomeDir(), 'auth.json')\n}\n\ntype CodexAuth = {\n tokens?: {\n access_token?: string\n account_id?: string\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 getCodexGlobalStatePath(): string {\n return join(getCodexHomeDir(), '.codex-global-state.json')\n}\n\ntype ThreadTitleCache = { titles: Record<string, string>; order: string[] }\nconst MAX_THREAD_TITLES = 500\n\nfunction normalizeThreadTitleCache(value: unknown): ThreadTitleCache {\n const record = asRecord(value)\n if (!record) return { titles: {}, order: [] }\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 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\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 { titles: {}, order: [] }\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 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 }\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\n await writeFile(statePath, JSON.stringify(payload), 'utf8')\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) => {\n setJson(res, 500, { error: getErrorMessage(err, 'Upload stream error') })\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 headers: 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\n if (accountId) {\n headers['ChatGPT-Account-Id'] = accountId\n }\n\n return new Promise((resolve, reject) => {\n const req = httpsRequest(\n 'https://chatgpt.com/backend-api/transcribe',\n { method: 'POST', headers },\n (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 )\n req.on('error', reject)\n req.write(body)\n req.end()\n })\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 = [\n 'app-server',\n '-c',\n 'approval_policy=\"never\"',\n '-c',\n 'sandbox_mode=\"danger-full-access\"',\n ]\n\n private start(): void {\n if (this.process) return\n\n this.stopping = false\n const proc = spawn('codex', this.appServerArgs, { stdio: ['pipe', 'pipe', 'pipe'] })\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 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 for (const listener of this.notificationListeners) {\n listener(notification)\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 handleServerRequest(requestId: number, method: string, params: unknown): void {\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 }).then(() => {\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\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 process = spawn('codex', ['app-server', 'generate-json-schema', '--out', outDir], {\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 appServer: AppServerProcess\n methodCatalog: MethodCatalog\n}\n\nconst SHARED_BRIDGE_KEY = '__codexRemoteSharedBridge__'\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) return existing\n\n const created: SharedBridgeState = {\n appServer: new AppServerProcess(),\n methodCatalog: new MethodCatalog(),\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 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[] = []\n const concurrency = 4\n for (let offset = 0; offset < threads.length; offset += concurrency) {\n const batch = threads.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 {\n id: thread.id,\n title: thread.title,\n preview: thread.preview,\n messageText,\n searchableText,\n } satisfies ThreadSearchDocument\n } catch {\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 docs.push(...loaded)\n }\n\n return docs\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, methodCatalog } = 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\n const middleware = async (req: IncomingMessage, res: ServerResponse, next: () => void) => {\n try {\n if (!req.url) {\n next()\n return\n }\n\n const url = new URL(req.url, 'http://localhost')\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\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 result = await appServer.rpc(body.method, body.params ?? null)\n setJson(res, 200, { result })\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 === '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/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/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 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 branch = `codex/${worktreeId}`\n\n await mkdir(worktreeParent, { recursive: true })\n try {\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n } catch (error) {\n if (!isMissingHeadError(error)) throw error\n await ensureRepoHasInitialCommit(gitRoot)\n await runCommand('git', ['worktree', 'add', '-b', branch, worktreeCwd, 'HEAD'], { cwd: gitRoot })\n }\n\n setJson(res, 200, {\n data: {\n cwd: worktreeCwd,\n branch,\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 === '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 const nextState: WorkspaceRootsState = {\n order: normalizeStringArray(record.order),\n labels: normalizeStringRecord(record.labels),\n active: normalizeStringArray(record.active),\n }\n await writeWorkspaceRootsState(nextState)\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 const existingState = await readWorkspaceRootsState()\n const nextOrder = [normalizedPath, ...existingState.order.filter((item) => item !== normalizedPath)]\n const nextActive = [normalizedPath, ...existingState.active.filter((item) => item !== normalizedPath)]\n const nextLabels = { ...existingState.labels }\n if (label.trim().length > 0) {\n nextLabels[normalizedPath] = label.trim()\n }\n await writeWorkspaceRootsState({\n order: nextOrder,\n labels: nextLabels,\n active: nextActive,\n })\n setJson(res, 200, { data: { path: normalizedPath } })\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/thread-titles') {\n const cache = await readThreadTitleCache()\n setJson(res, 200, { data: cache })\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 === 'GET' && url.pathname === '/codex-api/skills-hub') {\n try {\n const q = url.searchParams.get('q') || ''\n const limit = Math.min(Math.max(parseInt(url.searchParams.get('limit') || '50', 10) || 50, 1), 200)\n const sort = url.searchParams.get('sort') || 'date'\n const allEntries = await fetchSkillsTree()\n\n const installedMap = await scanInstalledSkillsFromDisk()\n try {\n const result = (await appServer.rpc('skills/list', {})) as { data?: Array<{ skills?: Array<{ name?: string; path?: string; enabled?: boolean }> }> }\n for (const entry of result.data ?? []) {\n for (const skill of 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\n const installedHubEntries = allEntries.filter((e) => installedMap.has(e.name))\n await fetchMetaBatch(installedHubEntries)\n\n const installed: SkillHubEntry[] = []\n for (const [, info] of installedMap) {\n const hubEntry = allEntries.find((e) => e.name === info.name)\n const base = hubEntry ? buildHubEntry(hubEntry) : {\n name: info.name, owner: 'local', description: '', displayName: '',\n publishedAt: 0, avatarUrl: '', url: '', installed: false,\n }\n installed.push({ ...base, installed: true, path: info.path, enabled: info.enabled })\n }\n\n const results = await searchSkillsHub(allEntries, q, limit, sort, installedMap)\n setJson(res, 200, { data: results, installed, total: allEntries.length })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch skills hub') })\n }\n return\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 if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return\n }\n const rawUrl = `https://raw.githubusercontent.com/openclaw/skills/main/skills/${owner}/${name}/SKILL.md`\n const resp = await fetch(rawUrl)\n if (!resp.ok) throw new Error(`Failed to fetch SKILL.md: ${resp.status}`)\n const content = await resp.text()\n setJson(res, 200, { content })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to fetch SKILL.md') })\n }\n return\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 owner = typeof payload?.owner === 'string' ? payload.owner : ''\n const name = typeof payload?.name === 'string' ? payload.name : ''\n if (!owner || !name) {\n setJson(res, 400, { error: 'Missing owner or name' })\n return\n }\n const installerScript = '/Users/igor/.cursor/skills/.system/skill-installer/scripts/install-skill-from-github.py'\n const installDest = await detectUserSkillsDir(appServer)\n const skillPathInRepo = `skills/${owner}/${name}`\n await runCommand('python3', [\n installerScript,\n '--repo', 'openclaw/skills',\n '--path', skillPathInRepo,\n '--dest', installDest,\n '--method', 'git',\n ])\n const skillDir = join(installDest, name)\n await ensureInstalledSkillIsValid(appServer, skillDir)\n setJson(res, 200, { ok: true, path: skillDir })\n } catch (error) {\n setJson(res, 502, { error: getErrorMessage(error, 'Failed to install skill') })\n }\n return\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 target = path || (name ? join(getSkillsInstallDir(), name) : '')\n if (!target) {\n setJson(res, 400, { error: 'Missing name or path' })\n return\n }\n await rm(target, { recursive: true, force: true })\n try { await appServer.rpc('skills/list', { forceReload: true }) } 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\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 appServer.dispose()\n }\n middleware.subscribeNotifications = (\n listener: (value: { method: string; params: unknown; atIso: string }) => void,\n ) => {\n return appServer.onNotification((notification: { method: string; params: unknown }) => {\n listener({\n ...notification,\n atIso: new Date().toISOString(),\n })\n })\n }\n\n return middleware\n}\n","import { randomBytes, timingSafeEqual } from 'node:crypto'\nimport type { IncomingMessage } from 'node:http'\nimport type { RequestHandler, Request, Response, NextFunction } from 'express'\n\nconst TOKEN_COOKIE = 'codex_web_local_token'\n\nfunction isLocalhostRequest(req: Request): boolean {\n const remote = req.socket.remoteAddress ?? ''\n if (remote === '127.0.0.1' || remote === '::1' || remote === '::ffff:127.0.0.1') {\n return true\n }\n\n const host = (req.headers.host ?? '').toLowerCase()\n return host.startsWith('localhost:') || host === 'localhost' || host.startsWith('127.0.0.1:')\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 isAuthorizedByRequestLike(\n remoteAddress: string | undefined,\n hostHeader: string | undefined,\n cookieHeader: string | undefined,\n validTokens: Set<string>,\n): boolean {\n const remote = remoteAddress ?? ''\n if (isLocalhostRemote(remote) || isLocalhostHost(hostHeader ?? '')) {\n return true\n }\n\n const cookies = parseCookies(cookieHeader)\n const token = cookies[TOKEN_COOKIE]\n return Boolean(token && validTokens.has(token))\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 Local &mdash; Login</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 Local</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 = new Set<string>()\n\n const middleware: RequestHandler = (req: Request, res: Response, next: NextFunction): void => {\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 try {\n const parsed = JSON.parse(body) as { password?: string }\n const provided = typeof parsed.password === 'string' ? parsed.password : ''\n\n if (!constantTimeCompare(provided, password)) {\n res.status(401).json({ error: 'Invalid password' })\n return\n }\n\n const token = randomBytes(32).toString('hex')\n validTokens.add(token)\n\n res.setHeader('Set-Cookie', `${TOKEN_COOKIE}=${token}; Path=/; HttpOnly; SameSite=Strict`)\n res.json({ ok: true })\n } catch {\n res.status(400).json({ error: 'Invalid request body' })\n }\n })\n return\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\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 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 toBrowseHref(pathValue: string): string {\n return `/codex-local-browse${encodeURI(pathValue)}`\n}\n\nfunction toEditHref(pathValue: string): string {\n return `/codex-local-edit${encodeURI(pathValue)}`\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\nexport async function createDirectoryListingHtml(localPath: string): Promise<string> {\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))}\" title=\"Edit\">✏️</a>`\n : ''\n return `<li class=\"file-row\"><a class=\"file-link\" href=\"${escapeHtml(toBrowseHref(item.path))}\">${escapeHtml(item.name)}${suffix}</a>${editAction}</li>`\n })\n .join('\\n')\n\n const parentLink = localPath !== parentPath\n ? `<p><a href=\"${escapeHtml(toBrowseHref(parentPath))}\">..</a></p>`\n : ''\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 .icon-btn { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid #36557a; border-radius: 10px; background: #162643; text-decoration: none; }\n .icon-btn:hover { filter: brightness(1.08); text-decoration: none; }\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 ${parentLink}\n <ul>${rows}</ul>\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","existsSync","readFile","homedir","join","spawn","fileURLToPath","dirname","dirname","extname","isAbsolute","join","writeFile","stat","resolve","process","next","randomBytes","randomBytes","join","readFile","readdir","stat","dirname","join","isAbsolute","extname","stat","writeFile","__dirname","dirname","fileURLToPath","join","readFile","homedir","existsSync","resolve","spawn","createServer"]}