@nchappell/codex-web-ui 1.0.6 → 1.0.8

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.
Files changed (53) hide show
  1. package/.next/BUILD_ID +1 -1
  2. package/.next/build-manifest.json +3 -3
  3. package/.next/fallback-build-manifest.json +3 -3
  4. package/.next/server/app/_global-error.html +1 -1
  5. package/.next/server/app/_global-error.rsc +1 -1
  6. package/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +1 -1
  7. package/.next/server/app/_global-error.segments/_full.segment.rsc +1 -1
  8. package/.next/server/app/_global-error.segments/_head.segment.rsc +1 -1
  9. package/.next/server/app/_global-error.segments/_index.segment.rsc +1 -1
  10. package/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -1
  11. package/.next/server/app/_not-found.html +1 -1
  12. package/.next/server/app/_not-found.rsc +1 -1
  13. package/.next/server/app/_not-found.segments/_full.segment.rsc +1 -1
  14. package/.next/server/app/_not-found.segments/_head.segment.rsc +1 -1
  15. package/.next/server/app/_not-found.segments/_index.segment.rsc +1 -1
  16. package/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +1 -1
  17. package/.next/server/app/_not-found.segments/_not-found.segment.rsc +1 -1
  18. package/.next/server/app/_not-found.segments/_tree.segment.rsc +1 -1
  19. package/.next/server/app/index.html +1 -1
  20. package/.next/server/app/index.rsc +1 -1
  21. package/.next/server/app/index.segments/__PAGE__.segment.rsc +1 -1
  22. package/.next/server/app/index.segments/_full.segment.rsc +1 -1
  23. package/.next/server/app/index.segments/_head.segment.rsc +1 -1
  24. package/.next/server/app/index.segments/_index.segment.rsc +1 -1
  25. package/.next/server/app/index.segments/_tree.segment.rsc +1 -1
  26. package/.next/server/app/thread/[threadId]/page_client-reference-manifest.js +1 -1
  27. package/.next/server/app/threads/page_client-reference-manifest.js +1 -1
  28. package/.next/server/app/threads.html +1 -1
  29. package/.next/server/app/threads.rsc +2 -2
  30. package/.next/server/app/threads.segments/_full.segment.rsc +2 -2
  31. package/.next/server/app/threads.segments/_head.segment.rsc +1 -1
  32. package/.next/server/app/threads.segments/_index.segment.rsc +1 -1
  33. package/.next/server/app/threads.segments/_tree.segment.rsc +1 -1
  34. package/.next/server/app/threads.segments/threads/__PAGE__.segment.rsc +2 -2
  35. package/.next/server/app/threads.segments/threads.segment.rsc +1 -1
  36. package/.next/server/chunks/[root-of-the-server]__0pym12l._.js +3 -3
  37. package/.next/server/chunks/[root-of-the-server]__0pym12l._.js.map +1 -1
  38. package/.next/server/chunks/ssr/[root-of-the-server]__0h7ed3q._.js +6 -6
  39. package/.next/server/chunks/ssr/[root-of-the-server]__0h7ed3q._.js.map +1 -1
  40. package/.next/server/middleware-build-manifest.js +3 -3
  41. package/.next/server/pages/404.html +1 -1
  42. package/.next/server/pages/500.html +1 -1
  43. package/.next/static/chunks/{0k4c4eedynfr0.js → 0g7lwnm9wxo3~.js} +7 -7
  44. package/README.md +17 -14
  45. package/bin/codex-web-ui.js +70 -33
  46. package/bin/docker-entrypoint.sh +5 -0
  47. package/client/src/App.tsx +1 -19
  48. package/client/src/api.ts +0 -5
  49. package/package.json +3 -2
  50. package/server/appApi.ts +0 -25
  51. /package/.next/static/{Kq7OCztahzPSRmlZKubC1 → QMdoD-vxQDoRuGNGiCAPJ}/_buildManifest.js +0 -0
  52. /package/.next/static/{Kq7OCztahzPSRmlZKubC1 → QMdoD-vxQDoRuGNGiCAPJ}/_clientMiddlewareManifest.js +0 -0
  53. /package/.next/static/{Kq7OCztahzPSRmlZKubC1 → QMdoD-vxQDoRuGNGiCAPJ}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../server/appApi.ts","../../../server/cors.ts","../../../server/mcpOAuthRelay.ts","../../../server/runtime.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../server/codexBridge.ts","../../../app/api/%5B%5B...path%5D%5D/route.ts","../../../server/auth.ts","../../../server/logStore.ts","../../../server/mcpConfig.ts","../../../server/eventHub.ts","../../../server/permissions.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { authState, isAuthenticated, loginWithPassword } from \"./auth\";\nimport { corsHeaders } from \"./cors\";\nimport {\n isMcpOAuthCallbackPath,\n mcpOAuthCallbackBaseUrl,\n mcpOAuthCallbackPort,\n registerMcpOAuthCallback,\n relayMcpOAuthCallback\n} from \"./mcpOAuthRelay\";\nimport { codexConfigPath, saveMcpServerConfig } from \"./mcpConfig\";\nimport { enforceRpcPermissions } from \"./permissions\";\nimport { getRuntime, homeDir, projectRoot } from \"./runtime\";\nimport type { JsonValue } from \"./types\";\n\nconst mimeTypes: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".bmp\": \"image/bmp\",\n \".avif\": \"image/avif\",\n \".pdf\": \"application/pdf\",\n \".mp4\": \"video/mp4\",\n \".m4v\": \"video/x-m4v\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".ogv\": \"video/ogg\",\n \".ogg\": \"video/ogg\",\n \".avi\": \"video/x-msvideo\",\n \".mkv\": \"video/x-matroska\",\n \".3gp\": \"video/3gpp\"\n};\n\nexport async function handleApiRequest(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (isMcpOAuthCallbackPath(url.pathname)) {\n return relayMcpOAuthCallback(request);\n }\n\n const cors = corsHeaders(request);\n if (request.method === \"OPTIONS\") {\n return cors.allowed\n ? withCors(new Response(null, { status: 204, headers: noStoreHeaders() }), cors.headers)\n : json({ ok: false, error: \"Origin is not allowed\" }, 403, cors.headers);\n }\n if (!cors.allowed) {\n return json({ ok: false, error: \"Origin is not allowed\" }, 403, cors.headers);\n }\n\n const startedAt = Date.now();\n const { logs } = await getRuntime();\n try {\n const response = await dispatchApiRequest(request, url, cors.headers);\n void logs.append({\n type: \"server\",\n method: \"http/request\",\n payload: {\n method: request.method,\n path: url.pathname,\n statusCode: response.status,\n durationMs: Date.now() - startedAt\n }\n });\n return response;\n } catch (error) {\n const err = error as Error & { data?: unknown; statusCode?: number };\n const response = json({ ok: false, error: err.message || \"Internal server error\", data: err.data }, err.statusCode || 500, cors.headers);\n void logs.append({\n type: \"server\",\n method: \"http/request\",\n payload: {\n method: request.method,\n path: url.pathname,\n statusCode: response.status,\n durationMs: Date.now() - startedAt\n }\n });\n return response;\n }\n}\n\nasync function dispatchApiRequest(request: Request, url: URL, cors: Headers): Promise<Response> {\n const { bridge, hub, logs } = await getRuntime();\n const pathname = url.pathname;\n\n if (pathname === \"/api/login\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n return json({ ok: true, ...loginWithPassword(body.password) }, 200, cors);\n }\n\n if (pathname === \"/api/logout\" && request.method === \"POST\") {\n return json({ ok: true }, 200, cors);\n }\n\n if (pathname === \"/api/auth\" && request.method === \"GET\") {\n return json({ ok: true, ...authState(request) }, 200, cors);\n }\n\n if (!isAuthenticated(request)) {\n return json({ ok: false, error: \"Unauthorized\" }, 401, cors);\n }\n\n if (pathname === \"/api/status\" && request.method === \"GET\") {\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/events\" && request.method === \"GET\") {\n bridge.start().catch((error: Error) => {\n hub.broadcast(\"server-status\", bridge.summary());\n hub.broadcast(\"stderr\", { at: Date.now(), line: error.message });\n });\n return withCors(\n new Response(hub.stream(request.signal), {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\"\n }\n }),\n cors\n );\n }\n\n if (pathname === \"/api/rpc\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n if (typeof body.method !== \"string\") {\n return json({ ok: false, error: \"Missing JSON-RPC method\" }, 400, cors);\n }\n const params = enforceRpcPermissions(body.method, (body.params ?? {}) as JsonValue);\n const result = await bridge.request(body.method, params);\n return json({ ok: true, result }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers\" && request.method === \"GET\") {\n return json({ ok: true, mcp: await listMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n await saveMcpServerConfig({\n name: body.name as string,\n url: body.url as string\n });\n return json({ ok: true, mcp: await reloadMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers/oauth/login\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) {\n return json({ ok: false, error: \"Missing MCP server name\" }, 400, cors);\n }\n await configureMcpOAuthRelay(request);\n const result = asRecord(await bridge.request(\"mcpServer/oauth/login\", { name }));\n const authorizationUrl = typeof result.authorization_url === \"string\"\n ? result.authorization_url\n : typeof result.authorizationUrl === \"string\"\n ? result.authorizationUrl\n : \"\";\n if (!authorizationUrl) {\n return json({ ok: false, error: \"Codex did not return an MCP OAuth authorization URL\" }, 502, cors);\n }\n registerMcpOAuthCallback(name, authorizationUrl);\n return json({ ok: true, authorizationUrl }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers/reload\" && request.method === \"POST\") {\n return json({ ok: true, mcp: await reloadMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/client-requests\" && request.method === \"GET\") {\n return json({ ok: true, requests: bridge.pendingClientRequests() }, 200, cors);\n }\n\n if (pathname === \"/api/client-requests/respond\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n const id = typeof body.id === \"string\" || typeof body.id === \"number\" ? body.id : null;\n if (id === null) {\n return json({ ok: false, error: \"Missing client request id\" }, 400, cors);\n }\n bridge.respondClientRequest(id, (body.result ?? {}) as JsonValue);\n return json({ ok: true }, 200, cors);\n }\n\n if (pathname === \"/api/uploads\" && request.method === \"POST\") {\n return json({ ok: true, attachment: await saveUploadedFile(request) }, 200, cors);\n }\n\n if (pathname === \"/api/transcribe\" && request.method === \"POST\") {\n return json({ ok: true, transcript: await transcribeAudio(request) }, 200, cors);\n }\n\n if (pathname === \"/api/files/view\" && request.method === \"GET\") {\n return json({ ok: true, file: await readReferencedFile(url.searchParams) }, 200, cors);\n }\n\n if (pathname === \"/api/files/download\" && (request.method === \"GET\" || request.method === \"HEAD\")) {\n return withCors(await sendReferencedFile(url.searchParams, request.method === \"HEAD\", false, request.headers.get(\"range\")), cors);\n }\n\n if (pathname === \"/api/files/raw\" && (request.method === \"GET\" || request.method === \"HEAD\")) {\n return withCors(await sendReferencedFile(url.searchParams, request.method === \"HEAD\", true, request.headers.get(\"range\")), cors);\n }\n\n if (pathname === \"/api/files/explore\" && request.method === \"GET\") {\n return json({ ok: true, explorer: await exploreFiles(url.searchParams) }, 200, cors);\n }\n\n if (pathname === \"/api/skills\" && request.method === \"GET\") {\n const summary = bridge.summary();\n return json({ ok: true, skills: await listSkills(typeof summary.cwd === \"string\" ? summary.cwd : null) }, 200, cors);\n }\n\n if (pathname === \"/api/server/restart\" && request.method === \"POST\") {\n await bridge.restart();\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/app-server/recover\" && request.method === \"POST\") {\n const output = await recoverAppServerSidecar();\n await bridge.restart();\n return json({ ok: true, output, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/server/stop\" && request.method === \"POST\") {\n await bridge.stop();\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/repositories/browse\" && request.method === \"GET\") {\n return json({ ok: true, browser: await browseRepositories(url.searchParams.get(\"path\")) }, 200, cors);\n }\n\n if (pathname === \"/api/repositories/create\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n return json({ ok: true, browser: await createRepository(body.parentPath, body.name) }, 200, cors);\n }\n\n if (pathname.startsWith(\"/api/logs/\") && request.method === \"DELETE\") {\n const threadId = decodeURIComponent(pathname.slice(\"/api/logs/\".length));\n return json({ ok: true, threadId, deleted: await logs.deleteThreadLog(threadId) }, 200, cors);\n }\n\n return json({ ok: false, error: \"Not found\" }, 404, cors);\n}\n\nasync function browseRepositories(inputPath: unknown): Promise<Record<string, unknown>> {\n const currentPath = resolveExplorerPath(inputPath);\n const stats = statSync(currentPath);\n if (!stats.isDirectory()) {\n throw new Error(\"Path is not a directory\");\n }\n const entries = await readdir(currentPath, { withFileTypes: true });\n const directories = entries\n .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n .map((entry) => {\n const entryPath = path.join(currentPath, entry.name);\n let isDirectory = entry.isDirectory();\n try {\n isDirectory = statSync(entryPath).isDirectory();\n } catch {\n isDirectory = false;\n }\n return isDirectory\n ? {\n name: entry.name,\n path: entryPath,\n displayPath: displayPath(entryPath),\n isGitRepo: isGitRepo(entryPath),\n hidden: entry.name.startsWith(\".\")\n }\n : null;\n })\n .filter((entry): entry is { name: string; path: string; displayPath: string; isGitRepo: boolean; hidden: boolean } => Boolean(entry))\n .sort((a, b) => Number(a.hidden) - Number(b.hidden) || Number(b.isGitRepo) - Number(a.isGitRepo) || a.name.localeCompare(b.name));\n\n return {\n path: currentPath,\n displayPath: displayPath(currentPath),\n parentPath: path.dirname(currentPath) === currentPath ? null : path.dirname(currentPath),\n homePath: homeDir,\n isGitRepo: isGitRepo(currentPath),\n entries: directories\n };\n}\n\nasync function createRepository(parentPath: unknown, name: unknown): Promise<Record<string, unknown>> {\n const parent = resolveExplorerPath(parentPath);\n if (!statSync(parent).isDirectory()) {\n throw new Error(\"Parent path is not a directory\");\n }\n const repoName = typeof name === \"string\" ? name.trim() : \"\";\n if (!repoName || repoName === \".\" || repoName === \"..\" || repoName.includes(\"/\") || repoName.includes(\"\\\\\")) {\n throw new Error(\"Enter a single folder name for the new repository\");\n }\n const repoPath = path.join(parent, repoName);\n if (existsSync(repoPath)) {\n throw new Error(\"A folder already exists with that name\");\n }\n await mkdir(repoPath, { recursive: false });\n await runGitInit(repoPath);\n return browseRepositories(repoPath);\n}\n\nasync function reloadMcpServers(): Promise<Record<string, unknown>> {\n const { bridge } = await getRuntime();\n await bridge.request(\"config/mcpServer/reload\", {});\n return listMcpServers();\n}\n\nasync function configureMcpOAuthRelay(request: Request): Promise<void> {\n const { bridge } = await getRuntime();\n await bridge.request(\"config/batchWrite\", {\n edits: [\n {\n keyPath: \"mcp_oauth_callback_port\",\n value: mcpOAuthCallbackPort(),\n mergeStrategy: \"replace\"\n },\n {\n keyPath: \"mcp_oauth_callback_url\",\n value: mcpOAuthCallbackBaseUrl(request),\n mergeStrategy: \"replace\"\n }\n ],\n reloadUserConfig: true\n });\n}\n\nasync function listMcpServers(): Promise<Record<string, unknown>> {\n const { bridge } = await getRuntime();\n const response = asRecord(await bridge.request(\"mcpServerStatus/list\", { detail: \"toolsAndAuthOnly\" }));\n const data = Array.isArray(response.data) ? response.data.map(summarizeMcpServer) : [];\n return {\n configPath: codexConfigPath(),\n servers: data,\n nextCursor: typeof response.nextCursor === \"string\" ? response.nextCursor : null\n };\n}\n\nfunction summarizeMcpServer(value: unknown): Record<string, unknown> {\n const record = asRecord(value);\n const tools = asRecord(record.tools);\n return {\n name: typeof record.name === \"string\" ? record.name : \"unknown\",\n authStatus: typeof record.authStatus === \"string\" ? record.authStatus : \"unsupported\",\n tools: Object.keys(tools).sort(),\n resources: Array.isArray(record.resources) ? record.resources.length : 0,\n resourceTemplates: Array.isArray(record.resourceTemplates) ? record.resourceTemplates.length : 0\n };\n}\n\nasync function saveUploadedFile(request: Request): Promise<Record<string, unknown>> {\n const encodedName = request.headers.get(\"x-file-name\") || \"\";\n const originalName = encodedName ? decodeURIComponent(encodedName) : \"upload\";\n const safeName = safeUploadName(originalName);\n const uploadDir = path.resolve(process.env.CODEX_WEB_UI_UPLOAD_DIR || path.join(projectRoot, \"data/uploads\"));\n const body = await readBinaryBody(request, 50 * 1024 * 1024);\n if (body.length === 0) {\n throw new Error(\"Uploaded file is empty\");\n }\n await mkdir(uploadDir, { recursive: true });\n const filePath = path.join(uploadDir, `${Date.now()}-${crypto.randomUUID()}-${safeName}`);\n await writeFile(filePath, body, { flag: \"wx\" });\n return {\n path: filePath,\n displayPath: displayPath(filePath),\n name: originalName,\n size: body.length\n };\n}\n\nasync function transcribeAudio(request: Request): Promise<string> {\n const apiKey = process.env.OPENAI_API_KEY || process.env.CODEX_WEB_UI_OPENAI_API_KEY || \"\";\n if (!apiKey) {\n throw new Error(\"OPENAI_API_KEY is required for audio transcription.\");\n }\n const encodedName = request.headers.get(\"x-file-name\") || \"\";\n const originalName = encodedName ? decodeURIComponent(encodedName) : \"recording.webm\";\n const body = await readBinaryBody(request, 25 * 1024 * 1024);\n if (body.length === 0) {\n throw new Error(\"Audio recording is empty.\");\n }\n const form = new FormData();\n form.set(\"model\", process.env.CODEX_WEB_UI_TRANSCRIPTION_MODEL || \"gpt-4o-mini-transcribe\");\n form.set(\"response_format\", \"json\");\n form.set(\"file\", new Blob([new Uint8Array(body)], { type: request.headers.get(\"content-type\") || \"audio/webm\" }), safeUploadName(originalName));\n const response = await fetch(\"https://api.openai.com/v1/audio/transcriptions\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`\n },\n body: form\n });\n const result = asRecord(await response.json().catch(() => ({})));\n if (!response.ok) {\n const error = asRecord(result.error);\n throw new Error(typeof error.message === \"string\" ? error.message : `Transcription failed: ${response.status}`);\n }\n return typeof result.text === \"string\" ? result.text.trim() : \"\";\n}\n\nasync function exploreFiles(searchParams: URLSearchParams): Promise<Record<string, unknown>> {\n const cwd = await resolveFilesCwd(searchParams.get(\"cwd\"));\n const currentPath = resolveFilesExplorerPath(cwd, searchParams.get(\"path\"));\n const stats = statSync(currentPath);\n if (!stats.isDirectory()) {\n throw new Error(\"Explorer path is not a directory\");\n }\n\n const trackedFiles = await gitTrackedFiles(cwd);\n const entries = new Map<string, Record<string, unknown>>();\n const relativeDir = normalizeRelativePath(path.relative(cwd, currentPath));\n const prefix = relativeDir ? `${relativeDir}/` : \"\";\n\n for (const trackedFile of trackedFiles) {\n const normalized = normalizeRelativePath(trackedFile);\n if (!normalized || hasHiddenPathSegment(normalized) || (prefix && !normalized.startsWith(prefix))) {\n continue;\n }\n const remainder = prefix ? normalized.slice(prefix.length) : normalized;\n if (!remainder || remainder.includes(\"../\")) {\n continue;\n }\n const [name, ...rest] = remainder.split(\"/\");\n if (!name || isHiddenName(name)) {\n continue;\n }\n const entryPath = path.join(currentPath, name);\n const isFile = rest.length === 0;\n entries.set(name, fileExplorerEntry(entryPath, cwd, isFile ? \"file\" : \"directory\", true));\n }\n\n const actualEntries = await readdir(currentPath, { withFileTypes: true });\n for (const entry of actualEntries) {\n if (isHiddenName(entry.name)) {\n continue;\n }\n const entryPath = path.join(currentPath, entry.name);\n let kind: \"file\" | \"directory\" | null = entry.isDirectory() ? \"directory\" : entry.isFile() ? \"file\" : null;\n if (!kind && entry.isSymbolicLink()) {\n try {\n const linkedStats = statSync(entryPath);\n kind = linkedStats.isDirectory() ? \"directory\" : linkedStats.isFile() ? \"file\" : null;\n } catch {\n kind = null;\n }\n }\n if (!kind) {\n continue;\n }\n const previous = entries.get(entry.name);\n entries.set(entry.name, { ...fileExplorerEntry(entryPath, cwd, kind, Boolean(previous?.tracked)), tracked: Boolean(previous?.tracked) });\n }\n\n const sortedEntries = [...entries.values()].sort((a, b) => {\n const aType = a.type === \"directory\" ? 0 : 1;\n const bType = b.type === \"directory\" ? 0 : 1;\n return aType - bType || String(a.name).localeCompare(String(b.name), undefined, { sensitivity: \"base\" });\n });\n\n return {\n cwd,\n path: currentPath,\n relativePath: normalizeRelativePath(path.relative(cwd, currentPath)),\n displayPath: displayPath(currentPath),\n parentPath: currentPath === cwd ? null : path.dirname(currentPath),\n trackedCount: trackedFiles.length,\n entries: sortedEntries\n };\n}\n\nfunction fileExplorerEntry(filePath: string, cwd: string, type: \"file\" | \"directory\", tracked: boolean): Record<string, unknown> {\n let size: number | null = null;\n let modifiedAt: number | null = null;\n try {\n const stats = statSync(filePath);\n size = stats.isFile() ? stats.size : null;\n modifiedAt = Math.round(stats.mtimeMs);\n } catch {\n size = null;\n modifiedAt = null;\n }\n const kind = type === \"file\" ? previewKindForPath(filePath) : null;\n return {\n name: path.basename(filePath),\n path: filePath,\n relativePath: normalizeRelativePath(path.relative(cwd, filePath)),\n displayPath: displayPath(filePath),\n type,\n tracked,\n size,\n modifiedAt,\n kind: kind || null,\n previewable: type === \"file\" && Boolean(kind)\n };\n}\n\nasync function listSkills(cwd: string | null): Promise<Record<string, unknown>[]> {\n const codexHome = process.env.CODEX_HOME ? path.resolve(process.env.CODEX_HOME) : path.join(homeDir, \".codex\");\n const sources = [\n { source: \"workspace\", path: cwd ? path.join(cwd, \".codex\", \"skills\") : \"\" },\n { source: \"project\", path: path.join(projectRoot, \".codex\", \"skills\") },\n { source: \"user\", path: path.join(codexHome, \"skills\") }\n ].filter((source) => source.path);\n const byName = new Map<string, Record<string, unknown>>();\n for (const source of sources) {\n for (const skill of await readSkillsFromDirectory(source.path, source.source)) {\n const name = String(skill.name);\n if (!byName.has(name)) {\n byName.set(name, skill);\n }\n }\n }\n return [...byName.values()].sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, { sensitivity: \"base\" }));\n}\n\nasync function readSkillsFromDirectory(root: string, source: string): Promise<Record<string, unknown>[]> {\n if (!existsSync(root)) {\n return [];\n }\n const results: Record<string, unknown>[] = [];\n const entries = await readdir(root, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const entryPath = path.join(root, entry.name);\n if (entry.name === \".system\") {\n results.push(...await readSkillsFromDirectory(entryPath, \"system\"));\n continue;\n }\n const skillFile = path.join(entryPath, \"SKILL.md\");\n if (!existsSync(skillFile)) {\n continue;\n }\n results.push({\n name: entry.name,\n path: entryPath,\n source,\n description: await readSkillDescription(skillFile)\n });\n }\n return results;\n}\n\nasync function readSkillDescription(skillFile: string): Promise<string | null> {\n const content = await readFile(skillFile, \"utf8\").catch(() => \"\");\n const description = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line && !line.startsWith(\"#\") && !line.startsWith(\"---\"));\n return description ? truncateText(description.replace(/^description:\\s*/i, \"\").replace(/^[\"']|[\"']$/g, \"\"), 220) : null;\n}\n\nfunction truncateText(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit - 1)}...`;\n}\n\nasync function readReferencedFile(searchParams: URLSearchParams): Promise<Record<string, unknown>> {\n const filePath = await resolveReferencedFilePath(searchParams.get(\"path\"), searchParams.get(\"cwd\"));\n const stats = statSync(filePath);\n if (!stats.isFile()) {\n throw new Error(\"Referenced path is not a file\");\n }\n const kind = previewKindForPath(filePath);\n const maxBytes = 2 * 1024 * 1024;\n if (kind === \"image\" || kind === \"pdf\" || kind === \"video\") {\n return fileMetadata(filePath, stats.size, kind, true);\n }\n if (!kind || stats.size > maxBytes) {\n return fileMetadata(filePath, stats.size, kind, false);\n }\n const content = await readFile(filePath, \"utf8\");\n return {\n ...fileMetadata(filePath, stats.size, kind, true),\n content\n };\n}\n\nasync function sendReferencedFile(searchParams: URLSearchParams, headOnly: boolean, inline = false, rangeHeader?: string | null): Promise<Response> {\n const filePath = await resolveReferencedFilePath(searchParams.get(\"path\"), searchParams.get(\"cwd\"));\n const stats = statSync(filePath);\n if (!stats.isFile()) {\n return json({ ok: false, error: \"Referenced path is not a file\" }, 404);\n }\n const fileName = path.basename(filePath);\n const ext = path.extname(filePath).toLowerCase();\n const range = parseRangeHeader(rangeHeader || \"\", stats.size);\n if (rangeHeader && !range) {\n return new Response(null, {\n status: 416,\n headers: {\n \"Content-Range\": `bytes */${stats.size}`,\n \"Accept-Ranges\": \"bytes\"\n }\n });\n }\n const start = range?.start ?? 0;\n const end = range?.end ?? stats.size - 1;\n const contentLength = end - start + 1;\n const headers = new Headers({\n \"Content-Type\": mimeTypes[ext] || \"application/octet-stream\",\n \"Content-Length\": String(contentLength),\n \"Content-Disposition\": `${inline ? \"inline\" : \"attachment\"}; filename=\"${fileName.replace(/\"/g, \"\")}\"; filename*=UTF-8''${encodeURIComponent(fileName)}`,\n \"Cache-Control\": \"private, max-age=60\",\n \"Accept-Ranges\": \"bytes\",\n ...(range ? { \"Content-Range\": `bytes ${start}-${end}/${stats.size}` } : {})\n });\n const body = headOnly ? null : (Readable.toWeb(createReadStream(filePath, { start, end })) as ReadableStream<Uint8Array>);\n return new Response(body, { status: range ? 206 : 200, headers });\n}\n\nasync function resolveReferencedFilePath(inputPath: string | null, cwd: string | null): Promise<string> {\n const value = inputPath?.trim();\n if (!value) {\n throw new Error(\"Missing file path\");\n }\n if (value === \"~\") {\n return homeDir;\n }\n if (value.startsWith(\"~/\")) {\n return path.resolve(homeDir, value.slice(2));\n }\n if (path.isAbsolute(value)) {\n return path.resolve(value);\n }\n const { bridge } = await getRuntime();\n const summary = bridge.summary();\n const base = cwd?.trim() ? path.resolve(cwd) : summary.cwd;\n return path.resolve(typeof base === \"string\" ? base : projectRoot, value);\n}\n\nfunction fileMetadata(filePath: string, size: number, kind: string | null, previewable: boolean): Record<string, unknown> {\n return {\n path: filePath,\n displayPath: displayPath(filePath),\n name: path.basename(filePath),\n extension: path.extname(filePath).slice(1).toLowerCase(),\n mimeType: mimeTypes[path.extname(filePath).toLowerCase()] || \"application/octet-stream\",\n size,\n kind: kind || \"download\",\n previewable\n };\n}\n\nfunction previewKindForPath(filePath: string): string | null {\n const ext = path.extname(filePath).slice(1).toLowerCase();\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"bmp\", \"avif\", \"svg\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"mp4\", \"m4v\", \"webm\", \"mov\", \"ogv\", \"ogg\", \"avi\", \"mkv\", \"3gp\"].includes(ext)) return \"video\";\n if (ext === \"json\") return \"json\";\n if ([\"md\", \"markdown\", \"mdx\"].includes(ext)) return \"markdown\";\n if ([\"txt\", \"log\", \"csv\", \"yaml\", \"yml\", \"toml\", \"ini\", \"env\"].includes(ext)) return \"text\";\n if ([\"js\", \"jsx\", \"ts\", \"tsx\", \"py\", \"rs\", \"go\", \"java\", \"kt\", \"swift\", \"c\", \"h\", \"cpp\", \"hpp\", \"cs\", \"rb\", \"php\", \"sh\", \"bash\", \"zsh\", \"fish\", \"sql\", \"css\", \"scss\", \"html\", \"xml\", \"vue\", \"svelte\", \"dockerfile\"].includes(ext)) {\n return \"code\";\n }\n return null;\n}\n\nfunction parseRangeHeader(value: string, size: number): { start: number; end: number } | null {\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(value.trim());\n if (!match || size <= 0) {\n return null;\n }\n\n const [, rawStart, rawEnd] = match;\n if (!rawStart && !rawEnd) {\n return null;\n }\n\n if (!rawStart) {\n const suffixLength = Number(rawEnd);\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n return {\n start: Math.max(size - suffixLength, 0),\n end: size - 1\n };\n }\n\n const start = Number(rawStart);\n const end = rawEnd ? Number(rawEnd) : size - 1;\n if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start > end || start >= size) {\n return null;\n }\n return {\n start,\n end: Math.min(end, size - 1)\n };\n}\n\nfunction safeUploadName(name: string): string {\n const baseName = path.basename(name || \"upload\").replace(/[^A-Za-z0-9._-]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n return baseName || \"upload\";\n}\n\nfunction resolveExplorerPath(inputPath: unknown): string {\n const value = typeof inputPath === \"string\" && inputPath.trim() ? inputPath.trim() : homeDir;\n if (value === \"~\") {\n return homeDir;\n }\n if (value.startsWith(\"~/\")) {\n return path.resolve(homeDir, value.slice(2));\n }\n return path.resolve(path.isAbsolute(value) ? value : path.join(homeDir, value));\n}\n\nasync function resolveFilesCwd(inputCwd: string | null): Promise<string> {\n const { bridge } = await getRuntime();\n const summary = bridge.summary();\n const fallback = typeof summary.cwd === \"string\" && summary.cwd ? summary.cwd : projectRoot;\n return resolveReferencedFilePath(inputCwd?.trim() || fallback, null);\n}\n\nfunction resolveFilesExplorerPath(cwd: string, inputPath: string | null): string {\n const value = inputPath?.trim();\n if (!value) {\n return cwd;\n }\n const filePath = path.resolve(path.isAbsolute(value) ? value : path.join(cwd, value));\n if (!isPathWithin(cwd, filePath)) {\n throw new Error(\"Explorer path must stay within the working directory\");\n }\n return filePath;\n}\n\nasync function gitTrackedFiles(cwd: string): Promise<string[]> {\n return new Promise((resolve) => {\n execFile(\"git\", [\"-C\", cwd, \"ls-files\", \"-z\"], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) {\n resolve([]);\n return;\n }\n resolve(stdout.split(\"\\0\").filter(Boolean));\n });\n });\n}\n\nfunction normalizeRelativePath(value: string): string {\n return value.split(path.sep).join(\"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction hasHiddenPathSegment(value: string): boolean {\n return value.split(\"/\").some(isHiddenName);\n}\n\nfunction isHiddenName(value: string): boolean {\n return value.startsWith(\".\");\n}\n\nfunction isPathWithin(parentPath: string, childPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return !relativePath || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nfunction displayPath(filePath: string): string {\n const relative = path.relative(homeDir, filePath);\n if (!relative) {\n return \"~\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return `~/${relative}`;\n }\n return filePath;\n}\n\nfunction isGitRepo(dirPath: string): boolean {\n return existsSync(path.join(dirPath, \".git\"));\n}\n\nasync function runGitInit(repoPath: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n execFile(\"git\", [\"init\", \"--\", repoPath], (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n}\n\nasync function readJsonBody(request: Request): Promise<Record<string, unknown>> {\n const text = (await readBinaryBody(request, 1_000_000)).toString(\"utf8\").trim();\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n}\n\nasync function readBinaryBody(request: Request, limitBytes: number): Promise<Buffer> {\n const contentLength = Number(request.headers.get(\"content-length\") || \"0\");\n if (Number.isFinite(contentLength) && contentLength > limitBytes) {\n throw new Error(\"Request body is too large\");\n }\n const body = Buffer.from(await request.arrayBuffer());\n if (body.length > limitBytes) {\n throw new Error(\"Request body is too large\");\n }\n return body;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction json(payload: unknown, status = 200, cors?: Headers): Response {\n return withCors(\n Response.json(payload, {\n status,\n headers: noStoreHeaders()\n }),\n cors\n );\n}\n\nasync function recoverAppServerSidecar(): Promise<string> {\n const socket = process.env.CODEX_APP_SERVER_SOCKET;\n if (!socket) {\n throw new Error(\"CODEX_APP_SERVER_SOCKET is not configured; this server owns its app-server connection.\");\n }\n const binPath = path.join(projectRoot, \"bin\", \"codex-web-ui.js\");\n return new Promise((resolve, reject) => {\n execFile(process.execPath, [binPath, \"app-server\", \"recover\", \"--socket\", socket], { cwd: projectRoot, env: process.env, timeout: 12_000 }, (error, stdout, stderr) => {\n const output = [stdout, stderr].filter(Boolean).join(\"\\n\").trim();\n if (error) {\n const message = output || error.message;\n reject(new Error(message));\n return;\n }\n resolve(output);\n });\n });\n}\n\nfunction noStoreHeaders(): Headers {\n return new Headers({\n \"Cache-Control\": \"no-store\"\n });\n}\n\nfunction withCors(response: Response, cors?: Headers): Response {\n for (const [key, value] of cors ?? []) {\n response.headers.set(key, value);\n }\n return response;\n}\n","const CORS_ALLOWED_HEADERS = \"Authorization, Content-Type, X-File-Name\";\nconst CORS_ALLOWED_METHODS = \"GET, HEAD, POST, DELETE, OPTIONS\";\nconst CORS_MAX_AGE_SECONDS = \"600\";\n\nexport function corsHeaders(request: Request): { allowed: boolean; headers: Headers } {\n const headers = new Headers();\n const origin = request.headers.get(\"origin\")?.trim() || \"\";\n if (!origin) {\n return { allowed: true, headers };\n }\n if (!isAllowedOrigin(request, origin)) {\n return { allowed: false, headers };\n }\n headers.set(\"Access-Control-Allow-Origin\", origin);\n headers.set(\"Access-Control-Allow-Methods\", CORS_ALLOWED_METHODS);\n headers.set(\"Access-Control-Allow-Headers\", CORS_ALLOWED_HEADERS);\n headers.set(\"Access-Control-Max-Age\", CORS_MAX_AGE_SECONDS);\n headers.set(\"Vary\", \"Origin\");\n return { allowed: true, headers };\n}\n\nfunction isAllowedOrigin(request: Request, origin: string): boolean {\n if (isSameOrigin(request, origin)) {\n return true;\n }\n return parseCsvEnv(process.env.CODEX_WEB_UI_ALLOWED_ORIGINS).some((pattern) => originMatchesPattern(origin, pattern));\n}\n\nfunction isSameOrigin(request: Request, origin: string): boolean {\n try {\n const requestUrl = new URL(request.url);\n const originUrl = new URL(origin);\n const protocol = request.headers.get(\"x-forwarded-proto\") || requestUrl.protocol.replace(\":\", \"\");\n const host = request.headers.get(\"x-forwarded-host\") || request.headers.get(\"host\") || requestUrl.host;\n return originUrl.protocol === `${protocol}:` && originUrl.host === host;\n } catch {\n return false;\n }\n}\n\nfunction originMatchesPattern(origin: string, pattern: string): boolean {\n try {\n const originUrl = new URL(origin);\n const match = /^(https?):\\/\\/([^/:]+|\\*)(?::(\\*|\\d+))?$/.exec(pattern.trim());\n if (!match) {\n return origin === pattern;\n }\n const [, protocol, hostname, port] = match;\n if (originUrl.protocol !== `${protocol}:`) {\n return false;\n }\n if (hostname !== \"*\" && hostname.toLowerCase() !== originUrl.hostname.toLowerCase()) {\n return false;\n }\n return port === \"*\" || (port ? port === originUrl.port : !originUrl.port);\n } catch {\n return origin === pattern;\n }\n}\n\nfunction parseCsvEnv(value: string | undefined): string[] {\n return (value || \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","const DEFAULT_CALLBACK_PORT = 33420;\nconst CALLBACK_BASE_PATH = \"/api/mcp/oauth/callback\";\nconst CALLBACK_TTL_MS = 10 * 60 * 1000;\n\ntype RegisteredMcpCallback = {\n serverName: string;\n path: string;\n state: string;\n localUrl: string;\n expiresAt: number;\n};\n\nconst callbacks = new Map<string, RegisteredMcpCallback>();\n\nexport function mcpOAuthCallbackPort(): number {\n const raw = process.env.CODEX_WEB_UI_MCP_OAUTH_CALLBACK_PORT || process.env.MCP_OAUTH_CALLBACK_PORT || String(DEFAULT_CALLBACK_PORT);\n const value = Number(raw);\n if (!Number.isInteger(value) || value < 1 || value > 65535) {\n return DEFAULT_CALLBACK_PORT;\n }\n return value;\n}\n\nexport function mcpOAuthCallbackBaseUrl(request: Request): string {\n const origin = publicOrigin(request);\n ensureOAuthRedirectOriginAllowed(origin);\n return `${origin}${CALLBACK_BASE_PATH}`;\n}\n\nexport function registerMcpOAuthCallback(serverName: string, authorizationUrl: string): void {\n purgeExpiredCallbacks();\n\n const url = new URL(authorizationUrl);\n const redirectUri = url.searchParams.get(\"redirect_uri\");\n const state = url.searchParams.get(\"state\");\n if (!redirectUri || !state) {\n throw new Error(\"Codex MCP OAuth authorization URL is missing redirect_uri or state\");\n }\n\n const redirectUrl = new URL(redirectUri);\n if (!redirectUrl.pathname.startsWith(`${CALLBACK_BASE_PATH}/`)) {\n throw new Error(\"Codex MCP OAuth callback URL was not configured for the Web UI relay\");\n }\n\n const port = mcpOAuthCallbackPort();\n callbacks.set(callbackKey(redirectUrl.pathname, state), {\n serverName,\n path: redirectUrl.pathname,\n state,\n localUrl: `http://127.0.0.1:${port}${redirectUrl.pathname}`,\n expiresAt: Date.now() + CALLBACK_TTL_MS\n });\n}\n\nexport function isMcpOAuthCallbackPath(pathname: string): boolean {\n return pathname === CALLBACK_BASE_PATH || pathname.startsWith(`${CALLBACK_BASE_PATH}/`);\n}\n\nexport async function relayMcpOAuthCallback(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (!isMcpOAuthCallbackPath(url.pathname)) {\n return Response.json({ ok: false, error: \"Not found\" }, { status: 404, headers: noStoreHeaders() });\n }\n if (request.method !== \"GET\") {\n return Response.json({ ok: false, error: \"Method not allowed\" }, { status: 405, headers: noStoreHeaders() });\n }\n\n purgeExpiredCallbacks();\n\n const state = url.searchParams.get(\"state\") || \"\";\n const key = callbackKey(url.pathname, state);\n const registered = callbacks.get(key);\n callbacks.delete(key);\n\n if (!registered) {\n return oauthCallbackHtml(\"MCP OAuth callback expired or was already used.\", 403);\n }\n if (registered.expiresAt < Date.now()) {\n return oauthCallbackHtml(\"MCP OAuth callback expired.\", 403);\n }\n\n const localUrl = new URL(registered.localUrl);\n localUrl.search = url.search;\n\n let response: Response;\n try {\n response = await fetch(localUrl, {\n method: \"GET\",\n redirect: \"manual\",\n cache: \"no-store\"\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return oauthCallbackHtml(`Could not reach local Codex OAuth listener for ${registered.serverName}: ${escapeHtml(message)}`, 502);\n }\n\n const headers = noStoreHeaders();\n const contentType = response.headers.get(\"content-type\");\n if (contentType) {\n headers.set(\"Content-Type\", contentType);\n }\n const location = response.headers.get(\"location\");\n if (location) {\n headers.set(\"Location\", location);\n }\n return new Response(await response.arrayBuffer(), {\n status: response.status,\n statusText: response.statusText,\n headers\n });\n}\n\nfunction publicOrigin(request: Request): string {\n const configured = process.env.CODEX_WEB_UI_PUBLIC_ORIGIN?.trim();\n if (configured) {\n return configured.replace(/\\/+$/, \"\");\n }\n\n const requestUrl = new URL(request.url);\n const protocol = request.headers.get(\"x-forwarded-proto\") || requestUrl.protocol.replace(\":\", \"\");\n const host = request.headers.get(\"x-forwarded-host\") || request.headers.get(\"host\") || requestUrl.host;\n return `${protocol}://${host}`;\n}\n\nfunction ensureOAuthRedirectOriginAllowed(origin: string): void {\n const url = new URL(origin);\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLocalOAuthHost(url.hostname)) {\n return;\n }\n const error = new Error(\n \"MCP OAuth requires an HTTPS Web UI origin for remote or LAN browsers. \" +\n \"Open the UI through an HTTPS tunnel/reverse proxy, or set CODEX_WEB_UI_PUBLIC_ORIGIN to that HTTPS origin.\"\n ) as Error & { statusCode?: number };\n error.statusCode = 400;\n throw error;\n}\n\nfunction isLocalOAuthHost(hostname: string): boolean {\n const value = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n return value === \"localhost\" || value.endsWith(\".localhost\") || value === \"::1\" || value.startsWith(\"127.\");\n}\n\nfunction callbackKey(pathname: string, state: string): string {\n return `${pathname}\\n${state}`;\n}\n\nfunction purgeExpiredCallbacks(): void {\n const now = Date.now();\n for (const [key, callback] of callbacks) {\n if (callback.expiresAt < now) {\n callbacks.delete(key);\n }\n }\n}\n\nfunction oauthCallbackHtml(message: string, status: number): Response {\n return new Response(\n `<!doctype html><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>MCP OAuth</title><body style=\"font-family: system-ui, sans-serif; padding: 2rem;\"><h1>MCP OAuth</h1><p>${message}</p></body>`,\n {\n status,\n headers: {\n ...Object.fromEntries(noStoreHeaders()),\n \"Content-Type\": \"text/html; charset=utf-8\"\n }\n }\n );\n}\n\nfunction noStoreHeaders(): Headers {\n return new Headers({\n \"Cache-Control\": \"no-store\"\n });\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"\\\"\":\n return \"&quot;\";\n default:\n return \"&#39;\";\n }\n });\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { CodexBridge } from \"./codexBridge\";\nimport { EventHub } from \"./eventHub\";\nimport { SessionLogStore } from \"./logStore\";\n\nexport const projectRoot = path.resolve(/*turbopackIgnore: true*/ process.cwd());\nexport const homeDir = os.homedir();\n\nconst logs = new SessionLogStore(process.env.CODEX_WEB_UI_DATA_DIR || path.join(projectRoot, \"data\"));\nconst hub = new EventHub();\nconst bridge = new CodexBridge(\n {\n command: process.env.CODEX_COMMAND || \"codex\",\n cwd: process.env.CODEX_CWD || projectRoot,\n model: process.env.CODEX_MODEL || \"gpt-5.5\",\n reasoningEffort: process.env.CODEX_REASONING_EFFORT || \"high\",\n fastMode: process.env.CODEX_FAST_MODE !== \"0\",\n appServerSocketPath: process.env.CODEX_APP_SERVER_SOCKET || \"\"\n },\n hub,\n logs\n);\n\nlet readyPromise: Promise<void> | null = null;\n\nexport async function getRuntime(): Promise<{ bridge: CodexBridge; hub: EventHub; logs: SessionLogStore }> {\n readyPromise ??= logs.ensure();\n await readyPromise;\n return { bridge, hub, logs };\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/[[...path]]/route\",\n pathname: \"/api/[[...path]]\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/[[...path]]/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/[[...path]]/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, deploymentId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId,\n deploymentId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport net from \"node:net\";\nimport readline from \"node:readline\";\nimport type { EventHub } from \"./eventHub\";\nimport type { SessionLogStore } from \"./logStore\";\nimport type { JsonRpcNotification, JsonRpcResponse, JsonValue, ServerStatus } from \"./types\";\n\ninterface PendingRequest {\n method: string;\n resolve: (value: JsonValue | undefined) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nexport interface ClientRequest {\n id: string | number;\n method: string;\n params: JsonValue;\n receivedAt: number;\n}\n\ninterface AppServerConnection {\n readonly pid: number | null;\n close(): Promise<void>;\n isWritable(): boolean;\n write(message: Record<string, unknown>): void;\n}\n\nexport interface CodexBridgeConfig {\n command: string;\n cwd: string;\n model: string;\n reasoningEffort: string;\n fastMode: boolean;\n appServerSocketPath: string;\n}\n\nexport class CodexBridge {\n private connection: AppServerConnection | null = null;\n private nextId = 1;\n private readonly pending = new Map<string, PendingRequest>();\n private readonly clientRequests = new Map<string, ClientRequest>();\n private startPromise: Promise<void> | null = null;\n private readonly stderrLines: { at: number; line: string }[] = [];\n private status: ServerStatus;\n\n constructor(\n private readonly config: CodexBridgeConfig,\n private readonly hub: EventHub,\n private readonly logs: SessionLogStore\n ) {\n this.status = {\n state: \"stopped\",\n command: config.command,\n cwd: config.cwd,\n pid: null,\n startedAt: null,\n exitedAt: null,\n exitCode: null,\n signal: null,\n error: null\n };\n }\n\n summary(): Record<string, unknown> {\n return {\n ...this.status,\n stderr: [...this.stderrLines],\n config: this.config\n };\n }\n\n async start(): Promise<void> {\n if (this.connection && this.status.state === \"running\") {\n return;\n }\n if (this.startPromise) {\n return this.startPromise;\n }\n this.startPromise = this.startFresh();\n try {\n await this.startPromise;\n } finally {\n this.startPromise = null;\n }\n }\n\n async restart(): Promise<void> {\n await this.stop();\n await this.start();\n }\n\n async stop(): Promise<void> {\n if (!this.connection) {\n return;\n }\n await this.connection.close();\n }\n\n async request(method: string, params: JsonValue = {}, options: { skipStart?: boolean; timeoutMs?: number } = {}): Promise<JsonValue | undefined> {\n try {\n return await this.requestOnce(method, params, options);\n } catch (error) {\n if (options.skipStart || !isRecoverableConnectionError(error)) {\n throw error;\n }\n this.connection = null;\n await delay(350);\n return this.requestOnce(method, params, options);\n }\n }\n\n private async requestOnce(method: string, params: JsonValue = {}, options: { skipStart?: boolean; timeoutMs?: number } = {}): Promise<JsonValue | undefined> {\n if (!options.skipStart) {\n await this.start();\n }\n if (!this.connection?.isWritable()) {\n throw new Error(\"codex app-server is not running\");\n }\n\n const id = this.nextId++;\n const timeoutMs = options.timeoutMs ?? 120_000;\n const message = { id, method, params };\n void this.logs.recordRpcRequest(method, id, params);\n\n return new Promise<JsonValue | undefined>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(String(id));\n reject(new Error(`JSON-RPC request timed out: ${method}`));\n }, timeoutMs);\n this.pending.set(String(id), { method, resolve, reject, timer });\n try {\n this.write(message);\n } catch (error) {\n clearTimeout(timer);\n this.pending.delete(String(id));\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n notify(method: string, params?: JsonValue): void {\n this.write(params === undefined ? { method } : { method, params });\n }\n\n pendingClientRequests(): ClientRequest[] {\n return [...this.clientRequests.values()].sort((a, b) => a.receivedAt - b.receivedAt);\n }\n\n respondClientRequest(id: string | number, result: JsonValue): void {\n const key = String(id);\n const request = this.clientRequests.get(key);\n if (!request) {\n throw new Error(\"Client request is not pending\");\n }\n this.clientRequests.delete(key);\n this.write({\n jsonrpc: \"2.0\",\n id: request.id,\n result\n });\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, result });\n }\n\n private async startFresh(): Promise<void> {\n this.setStatus({\n state: \"starting\",\n pid: null,\n startedAt: new Date().toISOString(),\n exitedAt: null,\n exitCode: null,\n signal: null,\n error: null\n });\n\n try {\n const connection = this.config.appServerSocketPath\n ? await this.connectUnixSocketAppServer()\n : this.spawnOwnedAppServer();\n this.connection = connection;\n this.setStatus({ state: \"starting\", pid: connection.pid });\n\n await this.request(\n \"initialize\",\n {\n clientInfo: { name: \"codex-web-ui\", version: \"0.1.0\" },\n capabilities: { experimentalApi: true }\n },\n { skipStart: true, timeoutMs: 30_000 }\n );\n this.notify(\"initialized\");\n this.setStatus({ state: \"running\" });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.connection = null;\n this.setStatus({ state: \"error\", pid: null, error: err.message });\n throw err;\n }\n }\n\n private spawnOwnedAppServer(): AppServerConnection {\n const proc = spawn(this.config.command, [\"app-server\", ...this.configArgs(), \"--listen\", \"stdio://\"], {\n cwd: this.config.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n\n proc.once(\"error\", (error) => this.handleConnectionError(error));\n proc.once(\"exit\", (code, signal) => this.handleConnectionExit(\n code === 0 ? null : `codex app-server exited with code ${code ?? \"unknown\"}`,\n code,\n signal as NodeJS.Signals | null\n ));\n readline.createInterface({ input: proc.stdout }).on(\"line\", (line) => this.handleMessageText(line));\n readline.createInterface({ input: proc.stderr }).on(\"line\", (line) => this.handleStderr(line));\n\n return {\n pid: proc.pid ?? null,\n close: async () => {\n if (proc.exitCode !== null || proc.killed) {\n return;\n }\n proc.kill(\"SIGTERM\");\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (proc.exitCode === null && !proc.killed) {\n proc.kill(\"SIGKILL\");\n }\n resolve();\n }, 5_000);\n proc.once(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n },\n isWritable: () => proc.stdin.writable,\n write: (message: Record<string, unknown>) => {\n proc.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n };\n }\n\n private async connectUnixSocketAppServer(): Promise<AppServerConnection> {\n return UnixWebSocketConnection.connect({\n path: this.config.appServerSocketPath,\n onClose: () => this.handleConnectionExit(\"codex app-server socket closed\", null, null),\n onError: (error) => this.handleConnectionError(error),\n onMessage: (text) => this.handleMessageText(text)\n });\n }\n\n private configArgs(): string[] {\n const args: string[] = [];\n if (this.config.model) {\n args.push(\"-c\", `model=\"${this.config.model}\"`);\n }\n if (this.config.reasoningEffort) {\n args.push(\"-c\", `model_reasoning_effort=\"${this.config.reasoningEffort}\"`);\n }\n if (!this.config.fastMode) {\n args.push(\"--disable\", \"fast_mode\");\n }\n return args;\n }\n\n private write(message: Record<string, unknown>): void {\n if (!this.connection?.isWritable()) {\n throw new Error(\"codex app-server connection is unavailable\");\n }\n this.connection.write(message);\n }\n\n private handleMessageText(line: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n void this.logs.append({ type: \"stdout\", payload: line });\n this.hub.broadcast(\"stdout\", { line });\n return;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n this.hub.broadcast(\"json\", parsed);\n return;\n }\n\n const message = parsed as JsonRpcResponse & JsonRpcNotification;\n if (Object.prototype.hasOwnProperty.call(message, \"id\")) {\n const id = String(message.id);\n const pending = this.pending.get(id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pending.delete(id);\n void this.logs.recordRpcResponse(pending.method, message.id, message.result, message.error as JsonValue | undefined);\n this.hub.broadcast(\"rpc-response\", { method: pending.method, id: message.id, ok: !message.error });\n if (message.error) {\n const error = new Error(message.error.message);\n (error as Error & { data?: unknown }).data = message.error;\n pending.reject(error);\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n if (message.method) {\n const request = {\n id: message.id as string | number,\n method: message.method,\n params: (message.params ?? {}) as JsonValue,\n receivedAt: Date.now()\n };\n this.clientRequests.set(String(message.id), request);\n void this.logs.append({ type: \"client-request\", id: message.id, method: message.method, payload: message.params });\n this.hub.broadcast(\"client-request\", request);\n return;\n }\n }\n\n if (message.method) {\n void this.logs.recordNotification(message.method, message.params);\n this.hub.broadcast(\"notification\", message);\n return;\n }\n\n this.hub.broadcast(\"json\", message);\n }\n\n private handleStderr(line: string): void {\n const item = { at: Date.now(), line };\n this.stderrLines.push(item);\n if (this.stderrLines.length > 150) {\n this.stderrLines.splice(0, this.stderrLines.length - 150);\n }\n void this.logs.append({ type: \"stderr\", payload: line });\n this.hub.broadcast(\"stderr\", item);\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pending.values()) {\n clearTimeout(pending.timer);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private setStatus(patch: Partial<ServerStatus>): void {\n this.status = { ...this.status, ...patch };\n this.hub.broadcast(\"server-status\", this.summary());\n void this.logs.append({ type: \"server\", payload: this.summary() as JsonValue });\n }\n\n private handleConnectionError(error: Error): void {\n this.connection = null;\n this.setStatus({ state: \"error\", error: error.message });\n this.rejectPending(error);\n for (const request of this.clientRequests.values()) {\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, error: error.message });\n }\n this.clientRequests.clear();\n }\n\n private handleConnectionExit(error: string | null, code: number | null, signal: NodeJS.Signals | null): void {\n this.setStatus({\n state: \"exited\",\n pid: null,\n exitedAt: new Date().toISOString(),\n exitCode: code,\n signal,\n error\n });\n this.connection = null;\n this.rejectPending(new Error(error ?? \"codex app-server exited\"));\n for (const request of this.clientRequests.values()) {\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, error: error ?? \"codex app-server exited\" });\n }\n this.clientRequests.clear();\n }\n}\n\nfunction isRecoverableConnectionError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /\\b(ENOENT|ECONNREFUSED|EPIPE|socket closed|connection is unavailable|app-server is not running)\\b/i.test(message);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nclass UnixWebSocketConnection implements AppServerConnection {\n readonly pid = null;\n private closed = false;\n private closeSent = false;\n private buffer = Buffer.alloc(0);\n private fragmentedText = \"\";\n\n private constructor(\n private readonly socket: net.Socket,\n private readonly handlers: {\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (text: string) => void;\n }\n ) {}\n\n static connect(options: {\n path: string;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (text: string) => void;\n }): Promise<UnixWebSocketConnection> {\n return new Promise((resolve, reject) => {\n const socket = net.createConnection(options.path);\n const key = crypto.randomBytes(16).toString(\"base64\");\n const expectedAccept = crypto\n .createHash(\"sha1\")\n .update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`)\n .digest(\"base64\");\n let handshakeBuffer = Buffer.alloc(0);\n let settled = false;\n let connection: UnixWebSocketConnection | null = null;\n\n const fail = (error: Error) => {\n if (!settled) {\n settled = true;\n socket.destroy();\n reject(error);\n return;\n }\n options.onError(error);\n };\n\n socket.once(\"connect\", () => {\n socket.write([\n \"GET / HTTP/1.1\",\n \"Host: localhost\",\n \"Upgrade: websocket\",\n \"Connection: Upgrade\",\n `Sec-WebSocket-Key: ${key}`,\n \"Sec-WebSocket-Version: 13\",\n \"\",\n \"\"\n ].join(\"\\r\\n\"));\n });\n\n socket.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n if (settled) {\n connection?.receive(buffer);\n return;\n }\n handshakeBuffer = Buffer.concat([handshakeBuffer, buffer]);\n const headerEnd = handshakeBuffer.indexOf(\"\\r\\n\\r\\n\");\n if (headerEnd === -1) {\n return;\n }\n const headerText = handshakeBuffer.subarray(0, headerEnd).toString(\"utf8\");\n const headers = parseHttpHeaders(headerText);\n if (!headerText.startsWith(\"HTTP/1.1 101\") || headers[\"sec-websocket-accept\"] !== expectedAccept) {\n fail(new Error(\"Codex app-server Unix socket did not accept WebSocket upgrade\"));\n return;\n }\n settled = true;\n connection = new UnixWebSocketConnection(socket, options);\n resolve(connection);\n const remaining = handshakeBuffer.subarray(headerEnd + 4);\n if (remaining.length > 0) {\n connection.receive(remaining);\n }\n });\n\n socket.once(\"error\", fail);\n socket.once(\"close\", () => {\n if (!settled) {\n fail(new Error(\"Codex app-server Unix socket closed before WebSocket upgrade\"));\n return;\n }\n connection?.markClosed();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.sendFrame(0x8, Buffer.alloc(0));\n this.closeSent = true;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n this.socket.destroy();\n resolve();\n }, 1_000);\n this.socket.once(\"close\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n isWritable(): boolean {\n return !this.closed && this.socket.writable;\n }\n\n write(message: Record<string, unknown>): void {\n this.sendFrame(0x1, Buffer.from(JSON.stringify(message), \"utf8\"));\n }\n\n private receive(chunk: Buffer): void {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n this.parseFrames();\n }\n\n private parseFrames(): void {\n while (this.buffer.length >= 2) {\n const first = this.buffer[0];\n const second = this.buffer[1];\n const fin = Boolean(first & 0x80);\n const opcode = first & 0x0f;\n const masked = Boolean(second & 0x80);\n let length = second & 0x7f;\n let offset = 2;\n\n if (length === 126) {\n if (this.buffer.length < 4) return;\n length = this.buffer.readUInt16BE(2);\n offset = 4;\n } else if (length === 127) {\n if (this.buffer.length < 10) return;\n const bigLength = this.buffer.readBigUInt64BE(2);\n if (bigLength > BigInt(Number.MAX_SAFE_INTEGER)) {\n this.handlers.onError(new Error(\"Codex app-server WebSocket frame is too large\"));\n this.socket.destroy();\n return;\n }\n length = Number(bigLength);\n offset = 10;\n }\n\n let mask: Buffer | null = null;\n if (masked) {\n if (this.buffer.length < offset + 4) return;\n mask = this.buffer.subarray(offset, offset + 4);\n offset += 4;\n }\n if (this.buffer.length < offset + length) return;\n\n let payload = this.buffer.subarray(offset, offset + length);\n this.buffer = this.buffer.subarray(offset + length);\n if (mask) {\n const unmasked = Buffer.alloc(payload.length);\n for (let index = 0; index < payload.length; index += 1) {\n unmasked[index] = payload[index] ^ mask[index % 4];\n }\n payload = unmasked;\n }\n\n if (opcode === 0x8) {\n if (!this.closeSent) {\n this.sendFrame(0x8, Buffer.alloc(0));\n }\n this.socket.end();\n continue;\n }\n if (opcode === 0x9) {\n this.sendFrame(0xA, payload);\n continue;\n }\n if (opcode === 0xA) {\n continue;\n }\n if (opcode !== 0x1 && opcode !== 0x0) {\n continue;\n }\n\n this.fragmentedText += payload.toString(\"utf8\");\n if (fin) {\n const text = this.fragmentedText;\n this.fragmentedText = \"\";\n this.handlers.onMessage(text);\n }\n }\n }\n\n private sendFrame(opcode: number, payload: Buffer): void {\n const header = makeClientFrameHeader(opcode, payload.length);\n const mask = crypto.randomBytes(4);\n const maskedPayload = Buffer.alloc(payload.length);\n for (let index = 0; index < payload.length; index += 1) {\n maskedPayload[index] = payload[index] ^ mask[index % 4];\n }\n this.socket.write(Buffer.concat([header, mask, maskedPayload]));\n }\n\n private markClosed(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.handlers.onClose();\n }\n}\n\nfunction makeClientFrameHeader(opcode: number, length: number): Buffer {\n if (length < 126) {\n return Buffer.from([0x80 | opcode, 0x80 | length]);\n }\n if (length < 65_536) {\n const header = Buffer.alloc(4);\n header[0] = 0x80 | opcode;\n header[1] = 0x80 | 126;\n header.writeUInt16BE(length, 2);\n return header;\n }\n const header = Buffer.alloc(10);\n header[0] = 0x80 | opcode;\n header[1] = 0x80 | 127;\n header.writeBigUInt64BE(BigInt(length), 2);\n return header;\n}\n\nfunction parseHttpHeaders(headerText: string): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of headerText.split(\"\\r\\n\").slice(1)) {\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n continue;\n }\n headers[line.slice(0, separator).trim().toLowerCase()] = line.slice(separator + 1).trim();\n }\n return headers;\n}\n","import { handleApiRequest } from \"@/server/appApi\";\n\nexport const runtime = \"nodejs\";\nexport const dynamic = \"force-dynamic\";\nexport const fetchCache = \"force-no-store\";\nexport const revalidate = 0;\n\nexport function GET(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function HEAD(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function POST(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function DELETE(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function OPTIONS(request: Request) {\n return handleApiRequest(request);\n}\n","import crypto from \"node:crypto\";\nimport { getPermissionPolicy, type PermissionPolicy } from \"./permissions\";\n\nconst AUTH_MODE: AuthMode = \"password\";\nconst AUTH_TOKEN_TTL_MS = 4 * 60 * 60 * 1000;\nconst AUTH_TOKEN_ISSUER = \"codex-web-ui\";\nconst PASSWORD = process.env.CODEX_WEB_UI_PASSWORD || \"\";\nconst AUTH_TOKEN_SECRET = process.env.CODEX_WEB_UI_AUTH_SECRET || PASSWORD;\nconst AUTH_WARNING = !PASSWORD ? \"Set CODEX_WEB_UI_PASSWORD before exposing this server.\" : null;\nconst AUTH_USER: AuthUser = { id: \"password\", email: null, name: \"Password user\", role: \"admin\" };\nconst UNAUTHENTICATED_AUTH_STATE = {\n authenticated: false,\n mode: AUTH_MODE,\n warning: AUTH_WARNING,\n user: null,\n tokenExpiresAt: null,\n get permissionPolicy() {\n return getPermissionPolicy();\n }\n};\n\nexport type AuthMode = \"password\";\nexport type AuthUser = { id: string; email: string | null; name: string | null; role: string };\nexport type AppSession = { expiresAt: number; mode: AuthMode; user: AuthUser | null };\nexport type AuthState = {\n authenticated: boolean;\n mode: AuthMode;\n warning: string | null;\n user: AuthUser | null;\n tokenExpiresAt: number | null;\n permissionPolicy: PermissionPolicy;\n};\ntype JwtClaims = { iss: string; sub: string; role: string; iat: number; exp: number };\n\nexport function isAuthenticated(request: Request): boolean {\n return Boolean(currentSession(request));\n}\n\nexport function currentSession(request: Request): AppSession | null {\n const token = getBearerToken(request);\n if (!token) {\n return null;\n }\n const claims = verifyAuthToken(token);\n if (!claims) {\n return null;\n }\n return { expiresAt: claims.exp * 1000, mode: AUTH_MODE, user: { ...AUTH_USER, role: claims.role || AUTH_USER.role } };\n}\n\nexport function authState(request: Request): AuthState {\n const session = currentSession(request);\n return session ? authStateFromSession(session) : UNAUTHENTICATED_AUTH_STATE;\n}\n\nexport function loginWithPassword(password: unknown): AuthState & { token: string; expiresAt: number } {\n if (!safePasswordEquals(typeof password === \"string\" ? password : \"\")) {\n throw httpError(401, \"Invalid password\");\n }\n const { token, expiresAt } = createAuthToken(AUTH_USER);\n return { token, expiresAt, ...authStateFromSession({ expiresAt, mode: AUTH_MODE, user: AUTH_USER }) };\n}\n\nexport function authMode(): AuthMode {\n return AUTH_MODE;\n}\n\nexport function authWarning(): string | null {\n return AUTH_WARNING;\n}\n\nfunction authStateFromSession(session: AppSession): AuthState {\n return {\n authenticated: true,\n mode: session.mode,\n warning: AUTH_WARNING,\n user: session.user,\n tokenExpiresAt: session.expiresAt,\n permissionPolicy: getPermissionPolicy()\n };\n}\n\nfunction getBearerToken(request: Request): string {\n const header = request.headers.get(\"authorization\") || \"\";\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim());\n return match?.[1]?.trim() || \"\";\n}\n\nfunction createAuthToken(user: AuthUser): { token: string; expiresAt: number } {\n if (!AUTH_TOKEN_SECRET) {\n throw httpError(500, \"CODEX_WEB_UI_PASSWORD is required before login is available.\");\n }\n const nowSeconds = Math.floor(Date.now() / 1000);\n const expiresAtSeconds = nowSeconds + Math.floor(AUTH_TOKEN_TTL_MS / 1000);\n const claims: JwtClaims = {\n iss: AUTH_TOKEN_ISSUER,\n sub: user.id,\n role: user.role,\n iat: nowSeconds,\n exp: expiresAtSeconds\n };\n return {\n token: signJwt(claims),\n expiresAt: expiresAtSeconds * 1000\n };\n}\n\nfunction signJwt(claims: JwtClaims): string {\n const header = base64UrlJson({ alg: \"HS256\", typ: \"JWT\" });\n const payload = base64UrlJson(claims);\n const signature = hmacBase64Url(`${header}.${payload}`);\n return `${header}.${payload}.${signature}`;\n}\n\nfunction verifyAuthToken(token: string): JwtClaims | null {\n if (!AUTH_TOKEN_SECRET) {\n return null;\n }\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n const [header, payload, signature] = parts;\n if (!timingSafeStringEquals(signature, hmacBase64Url(`${header}.${payload}`))) {\n return null;\n }\n const parsedHeader = parseJwtPart(header);\n const claims = parseJwtPart(payload);\n if (parsedHeader.alg !== \"HS256\" || parsedHeader.typ !== \"JWT\") {\n return null;\n }\n const exp = numberValue(claims.exp);\n if (claims.iss !== AUTH_TOKEN_ISSUER || claims.sub !== AUTH_USER.id || !exp || Date.now() >= exp * 1000) {\n return null;\n }\n return {\n iss: AUTH_TOKEN_ISSUER,\n sub: AUTH_USER.id,\n role: typeof claims.role === \"string\" ? claims.role : AUTH_USER.role,\n iat: numberValue(claims.iat) ?? 0,\n exp\n };\n}\n\nfunction base64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64url\");\n}\n\nfunction parseJwtPart(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(Buffer.from(value, \"base64url\").toString(\"utf8\"));\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\nfunction hmacBase64Url(value: string): string {\n return crypto.createHmac(\"sha256\", AUTH_TOKEN_SECRET).update(value).digest(\"base64url\");\n}\n\nfunction timingSafeStringEquals(left: string, right: string): boolean {\n const leftBuffer = Buffer.from(left);\n const rightBuffer = Buffer.from(right);\n return leftBuffer.length === rightBuffer.length && crypto.timingSafeEqual(leftBuffer, rightBuffer);\n}\n\nfunction safePasswordEquals(value: string): boolean {\n if (!PASSWORD) {\n return false;\n }\n return timingSafeStringEquals(value, PASSWORD);\n}\n\nfunction numberValue(value: unknown): number | null {\n const numeric = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n return Number.isFinite(numeric) ? numeric : null;\n}\n\nfunction httpError(statusCode: number, message: string): Error & { statusCode: number } {\n return Object.assign(new Error(message), { statusCode });\n}\n","import { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { JsonValue, LogEntry, SessionIndexRecord, ThreadRecord } from \"./types\";\n\nexport class SessionLogStore {\n readonly rootDir: string;\n readonly sessionsDir: string;\n readonly globalLogPath: string;\n readonly indexPath: string;\n\n private index: Map<string, SessionIndexRecord> | null = null;\n private indexQueue: Promise<void> = Promise.resolve();\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n this.sessionsDir = path.join(rootDir, \"sessions\");\n this.globalLogPath = path.join(rootDir, \"server.jsonl\");\n this.indexPath = path.join(rootDir, \"sessions.json\");\n }\n\n async ensure(): Promise<void> {\n await mkdir(this.sessionsDir, { recursive: true });\n await this.loadIndex();\n }\n\n async append(entry: Omit<LogEntry, \"at\">): Promise<void> {\n const fullEntry: LogEntry = { at: new Date().toISOString(), ...entry };\n await this.ensure();\n await appendFile(this.globalLogPath, `${JSON.stringify(fullEntry)}\\n`, \"utf8\");\n const threadIds = extractThreadIds(fullEntry);\n for (const threadId of threadIds) {\n await appendFile(this.threadLogPath(threadId), `${JSON.stringify({ ...fullEntry, threadId })}\\n`, \"utf8\");\n }\n }\n\n async recordRpcRequest(method: string, id: string | number, params: JsonValue | undefined): Promise<void> {\n await this.append({\n type: \"rpc-request\",\n id,\n method,\n payload: jsonOrNull({ threadIds: threadIdsFromJson(params), params: summarizeRpcPayload(params) })\n });\n }\n\n async recordRpcResponse(\n method: string,\n id: string | number,\n result: JsonValue | undefined,\n error: JsonValue | undefined\n ): Promise<void> {\n if (result !== undefined) {\n await this.recordThreadsFromResult(result);\n }\n await this.append({\n type: \"rpc-response\",\n id,\n method,\n payload: jsonOrNull({ threadIds: threadIdsFromJson(result), result: summarizeRpcPayload(result), error })\n });\n }\n\n async recordNotification(method: string, params: JsonValue | undefined): Promise<void> {\n if (params && typeof params === \"object\" && !Array.isArray(params)) {\n const thread = (params as Record<string, JsonValue>).thread;\n if (isThreadRecord(thread)) {\n await this.recordThread(thread);\n }\n }\n await this.append({ type: \"notification\", method, payload: jsonOrNull({ params }) });\n }\n\n async recordThreadsFromResult(result: JsonValue): Promise<void> {\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n return;\n }\n const record = result as Record<string, JsonValue>;\n if (isThreadRecord(record.thread)) {\n await this.recordThread(record.thread);\n }\n if (Array.isArray(record.data)) {\n for (const item of record.data) {\n if (isThreadRecord(item)) {\n await this.recordThread(item);\n }\n }\n }\n }\n\n async recordThread(thread: ThreadRecord): Promise<void> {\n await this.ensure();\n const index = await this.loadIndex();\n const previous = index.get(thread.id);\n const record: SessionIndexRecord = {\n id: thread.id,\n name: typeof thread.name === \"string\" ? thread.name : previous?.name ?? null,\n preview: typeof thread.preview === \"string\" ? thread.preview : previous?.preview ?? \"\",\n cwd: typeof thread.cwd === \"string\" ? thread.cwd : previous?.cwd ?? \"\",\n sessionId: typeof thread.sessionId === \"string\" ? thread.sessionId : previous?.sessionId ?? \"\",\n createdAt: typeof thread.createdAt === \"number\" ? thread.createdAt : previous?.createdAt ?? null,\n updatedAt: typeof thread.updatedAt === \"number\" ? thread.updatedAt : previous?.updatedAt ?? null,\n status: thread.status ?? previous?.status ?? null,\n logPath: this.threadLogPath(thread.id),\n lastLoggedAt: new Date().toISOString()\n };\n index.set(thread.id, record);\n if (!existsSync(this.threadLogPath(thread.id))) {\n const entry: LogEntry = {\n at: new Date().toISOString(),\n type: \"server\",\n threadId: thread.id,\n method: \"thread/indexed\",\n payload: JSON.parse(JSON.stringify({ thread: record })) as JsonValue\n };\n await appendFile(this.threadLogPath(thread.id), `${JSON.stringify(entry)}\\n`, \"utf8\");\n }\n await this.saveIndexQueued();\n }\n\n async deleteThreadLog(threadId: string): Promise<boolean> {\n await this.ensure();\n const index = await this.loadIndex();\n index.delete(threadId);\n await this.saveIndexQueued();\n const filePath = this.threadLogPath(threadId);\n if (!existsSync(filePath)) {\n return false;\n }\n await unlink(filePath);\n return true;\n }\n\n threadLogPath(threadId: string): string {\n return path.join(this.sessionsDir, `${safeFileName(threadId)}.jsonl`);\n }\n\n private async loadIndex(): Promise<Map<string, SessionIndexRecord>> {\n if (this.index) {\n return this.index;\n }\n await mkdir(this.sessionsDir, { recursive: true });\n if (!existsSync(this.indexPath)) {\n this.index = new Map();\n return this.index;\n }\n const raw = await readFile(this.indexPath, \"utf8\");\n const parsed = JSON.parse(raw || \"{}\") as Record<string, SessionIndexRecord>;\n this.index = new Map(Object.entries(parsed));\n return this.index;\n }\n\n private async saveIndexQueued(): Promise<void> {\n this.indexQueue = this.indexQueue.then(async () => {\n if (!this.index) {\n return;\n }\n const payload = Object.fromEntries([...this.index.entries()]);\n await writeFile(this.indexPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n });\n await this.indexQueue;\n }\n}\n\nfunction extractThreadIds(entry: LogEntry): string[] {\n const ids = new Set<string>();\n const payload = entry.payload;\n if (entry.threadId) {\n ids.add(entry.threadId);\n }\n if (payload && typeof payload === \"object\" && !Array.isArray(payload)) {\n const record = payload as Record<string, JsonValue>;\n if (Array.isArray(record.threadIds)) {\n for (const id of record.threadIds) {\n if (typeof id === \"string\") {\n ids.add(id);\n }\n }\n }\n collectThreadIds(record.params, ids);\n collectThreadIds(record.result, ids);\n }\n return [...ids];\n}\n\nfunction threadIdsFromJson(value: JsonValue | undefined): string[] {\n const ids = new Set<string>();\n collectThreadIdsDeep(value, ids, 0);\n return [...ids];\n}\n\nfunction collectThreadIdsDeep(value: JsonValue | undefined, ids: Set<string>, depth: number): void {\n if (!value || typeof value !== \"object\" || depth > 8) {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n collectThreadIdsDeep(item, ids, depth + 1);\n }\n return;\n }\n const record = value as Record<string, JsonValue>;\n if (typeof record.threadId === \"string\") {\n ids.add(record.threadId);\n }\n if (isThreadRecord(record.thread)) {\n ids.add(record.thread.id);\n }\n for (const nested of Object.values(record)) {\n collectThreadIdsDeep(nested, ids, depth + 1);\n }\n}\n\nfunction summarizeRpcPayload(value: JsonValue | undefined): JsonValue {\n if (value === undefined) {\n return null;\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n length: value.length,\n sample: summarizeArraySample(value)\n };\n }\n const record = value as Record<string, JsonValue>;\n if (isThreadRecord(record.thread)) {\n return {\n type: \"object\",\n keys: Object.keys(record),\n thread: summarizeThreadRecord(record.thread)\n };\n }\n if (Array.isArray(record.data)) {\n return {\n type: \"object\",\n keys: Object.keys(record),\n data: {\n type: \"array\",\n length: record.data.length,\n sample: summarizeArraySample(record.data)\n }\n };\n }\n return {\n type: \"object\",\n keys: Object.keys(record).slice(0, 30),\n threadId: typeof record.threadId === \"string\" ? record.threadId : null\n };\n}\n\nfunction summarizeArraySample(items: JsonValue[]): JsonValue[] {\n return items.slice(0, 5).map((item) => {\n if (isThreadRecord(item)) {\n return summarizeThreadRecord(item);\n }\n if (!item || typeof item !== \"object\") {\n return item;\n }\n if (Array.isArray(item)) {\n return { type: \"array\", length: item.length };\n }\n return { type: \"object\", keys: Object.keys(item).slice(0, 20) };\n });\n}\n\nfunction summarizeThreadRecord(thread: ThreadRecord): JsonValue {\n return {\n id: thread.id,\n name: typeof thread.name === \"string\" ? thread.name : null,\n preview: typeof thread.preview === \"string\" ? thread.preview : \"\",\n cwd: typeof thread.cwd === \"string\" ? thread.cwd : \"\",\n sessionId: typeof thread.sessionId === \"string\" ? thread.sessionId : \"\",\n createdAt: typeof thread.createdAt === \"number\" ? thread.createdAt : null,\n updatedAt: typeof thread.updatedAt === \"number\" ? thread.updatedAt : null,\n status: thread.status ?? null,\n turnCount: Array.isArray(thread.turns) ? thread.turns.length : null\n };\n}\n\nfunction collectThreadIds(value: JsonValue | undefined, ids: Set<string>): void {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return;\n }\n const record = value as Record<string, JsonValue>;\n if (typeof record.threadId === \"string\") {\n ids.add(record.threadId);\n }\n if (isThreadRecord(record.thread)) {\n ids.add(record.thread.id);\n }\n if (Array.isArray(record.data)) {\n for (const item of record.data) {\n if (isThreadRecord(item)) {\n ids.add(item.id);\n }\n }\n }\n}\n\nfunction isThreadRecord(value: unknown): value is ThreadRecord {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value) && typeof (value as { id?: unknown }).id === \"string\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction jsonOrNull(value: unknown): JsonValue {\n return JSON.parse(JSON.stringify(value ?? null)) as JsonValue;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { homeDir } from \"./runtime\";\n\nexport interface McpServerInput {\n name: string;\n url: string;\n}\n\nexport function codexConfigPath(): string {\n if (process.env.CODEX_CONFIG_PATH) {\n return path.resolve(process.env.CODEX_CONFIG_PATH);\n }\n return path.join(process.env.CODEX_HOME || path.join(homeDir, \".codex\"), \"config.toml\");\n}\n\nexport async function saveMcpServerConfig(input: McpServerInput): Promise<{ configPath: string }> {\n const name = validateServerName(input.name);\n const url = validateServerUrl(input.url);\n const configPath = codexConfigPath();\n const existing = await readFile(configPath, \"utf8\").catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return \"\";\n }\n throw error;\n });\n const { text } = removeMcpServerBlock(existing, name);\n const nextBlock = [\n `[mcp_servers.${name}]`,\n `url = \"${tomlStringValue(url)}\"`\n ].join(\"\\n\");\n const nextText = `${text.trimEnd()}${text.trimEnd() ? \"\\n\\n\" : \"\"}${nextBlock}\\n`;\n await mkdir(path.dirname(configPath), { recursive: true });\n await writeFile(configPath, nextText, \"utf8\");\n return { configPath };\n}\n\nfunction validateServerName(value: unknown): string {\n const name = typeof value === \"string\" ? value.trim() : \"\";\n if (!/^[A-Za-z0-9_-]{1,80}$/.test(name)) {\n throw new Error(\"MCP server name must be 1-80 letters, numbers, dashes, or underscores\");\n }\n return name;\n}\n\nfunction validateServerUrl(value: unknown): string {\n const raw = typeof value === \"string\" ? value.trim() : \"\";\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n throw new Error(\"Enter a valid MCP server URL\");\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"MCP server URL must use http or https\");\n }\n if (parsed.username || parsed.password) {\n throw new Error(\"Put MCP credentials in the bearer token field, not the URL\");\n }\n if (parsed.protocol === \"http:\" && !isLocalHost(parsed.hostname)) {\n throw new Error(\"Plain HTTP MCP servers must be localhost or loopback\");\n }\n return parsed.toString();\n}\n\nfunction isLocalHost(hostname: string): boolean {\n const value = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n return value === \"localhost\" || value === \"0.0.0.0\" || value === \"::1\" || value.startsWith(\"127.\");\n}\n\nfunction removeMcpServerBlock(text: string, name: string): { text: string; block: string | null } {\n const lines = text.split(/\\r?\\n/);\n const kept: string[] = [];\n const removed: string[] = [];\n let removing = false;\n for (const line of lines) {\n if (isTableHeader(line)) {\n removing = tableName(line) === `mcp_servers.${name}`;\n }\n if (removing) {\n removed.push(line);\n } else {\n kept.push(line);\n }\n }\n return { text: kept.join(\"\\n\"), block: removed.length ? removed.join(\"\\n\") : null };\n}\n\nfunction isTableHeader(line: string): boolean {\n return /^\\s*\\[[^\\]]+\\]\\s*$/.test(line);\n}\n\nfunction tableName(line: string): string {\n return line.trim().replace(/^\\[|\\]$/g, \"\").replace(/\"([^\"]+)\"/g, \"$1\");\n}\n\nfunction tomlStringValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n","type SseRequest = import(\"node:http\").IncomingMessage;\ntype SseResponse = import(\"node:http\").ServerResponse;\n\nexport interface ServerEvent {\n type: string;\n payload: unknown;\n at: number;\n}\n\ninterface SseClient {\n close(): void;\n send(eventName: string, payload: unknown): void;\n}\n\nclass RingBuffer<T> {\n private readonly items: T[] = [];\n\n constructor(private readonly limit: number) {}\n\n push(item: T): void {\n this.items.push(item);\n if (this.items.length > this.limit) {\n this.items.splice(0, this.items.length - this.limit);\n }\n }\n\n snapshot(): T[] {\n return [...this.items];\n }\n}\n\nexport class EventHub {\n private readonly clients = new Set<SseClient>();\n private readonly history = new RingBuffer<ServerEvent>(300);\n\n add(req: SseRequest, res: SseResponse): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\"\n });\n res.write(\"\\n\");\n const client: SseClient = {\n close: () => undefined,\n send: (eventName, payload) => {\n res.write(`event: ${eventName}\\n`);\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n }\n };\n this.clients.add(client);\n client.send(\"hello\", { serverTime: new Date().toISOString(), history: this.history.snapshot() });\n\n const keepAlive = setInterval(() => {\n if (!res.destroyed) {\n res.write(\": keepalive\\n\\n\");\n }\n }, 25_000);\n\n req.on(\"close\", () => {\n clearInterval(keepAlive);\n this.clients.delete(client);\n });\n }\n\n stream(signal?: AbortSignal): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n let client: SseClient | null = null;\n let keepAlive: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n if (keepAlive) {\n clearInterval(keepAlive);\n keepAlive = null;\n }\n if (client) {\n this.clients.delete(client);\n client = null;\n }\n };\n\n return new ReadableStream<Uint8Array>({\n start: (controller) => {\n client = {\n close: cleanup,\n send: (eventName, payload) => {\n controller.enqueue(encoder.encode(`event: ${eventName}\\n`));\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(payload)}\\n\\n`));\n }\n };\n this.clients.add(client);\n client.send(\"hello\", { serverTime: new Date().toISOString(), history: this.history.snapshot() });\n keepAlive = setInterval(() => {\n controller.enqueue(encoder.encode(\": keepalive\\n\\n\"));\n }, 25_000);\n signal?.addEventListener(\"abort\", cleanup, { once: true });\n },\n cancel: cleanup\n });\n }\n\n broadcast(type: string, payload: unknown): void {\n const event = { type, payload, at: Date.now() };\n this.history.push(event);\n for (const client of this.clients) {\n client.send(\"message\", event);\n }\n }\n}\n","import type { JsonValue } from \"./types\";\n\nexport type ApprovalPolicy = \"on-request\" | \"untrusted\" | \"on-failure\" | \"never\";\nexport type SandboxMode = \"read-only\" | \"workspace-write\" | \"danger-full-access\";\n\nexport interface PermissionPolicy {\n defaultApprovalPolicy: ApprovalPolicy;\n defaultSandbox: SandboxMode;\n locked: boolean;\n unsafePermissions: boolean;\n allowedApprovalPolicies: ApprovalPolicy[];\n allowedSandboxes: SandboxMode[];\n}\n\nconst safeApprovalPolicies: ApprovalPolicy[] = [\"on-request\", \"untrusted\"];\nconst unsafeApprovalPolicies: ApprovalPolicy[] = [\"on-request\", \"untrusted\", \"on-failure\", \"never\"];\nconst safeSandboxes: SandboxMode[] = [\"read-only\", \"workspace-write\"];\nconst unsafeSandboxes: SandboxMode[] = [\"read-only\", \"workspace-write\", \"danger-full-access\"];\n\nexport function getPermissionPolicy(): PermissionPolicy {\n const unsafePermissions = booleanEnv(\"CODEX_WEB_UI_UNSAFE_PERMISSIONS\", false);\n const allowedApprovalPolicies = unsafePermissions ? unsafeApprovalPolicies : safeApprovalPolicies;\n const allowedSandboxes = unsafePermissions ? unsafeSandboxes : safeSandboxes;\n const defaultApprovalPolicy = approvalPolicyFor(process.env.CODEX_WEB_UI_APPROVAL_POLICY) ?? \"on-request\";\n const defaultSandbox = sandboxFor(process.env.CODEX_WEB_UI_SANDBOX) ?? \"workspace-write\";\n\n if (!allowedApprovalPolicies.includes(defaultApprovalPolicy)) {\n throw httpError(500, `Configured approval policy requires unsafe permissions: ${defaultApprovalPolicy}`);\n }\n if (!allowedSandboxes.includes(defaultSandbox)) {\n throw httpError(500, `Configured sandbox requires unsafe permissions: ${defaultSandbox}`);\n }\n\n return {\n defaultApprovalPolicy,\n defaultSandbox,\n locked: booleanEnv(\"CODEX_WEB_UI_LOCK_PERMISSIONS\", false),\n unsafePermissions,\n allowedApprovalPolicies,\n allowedSandboxes\n };\n}\n\nexport function enforceRpcPermissions(method: string, params: JsonValue): JsonValue {\n if (!params || typeof params !== \"object\" || Array.isArray(params)) {\n return params;\n }\n if (!usesPermissions(method)) {\n return params;\n }\n\n const policy = getPermissionPolicy();\n const next: Record<string, JsonValue> = { ...(params as Record<string, JsonValue>) };\n const requestedApprovalPolicy = approvalPolicyFor(next.approvalPolicy);\n const requestedSandbox = sandboxFor(next.sandbox) ?? sandboxFor(next.sandboxPolicy);\n\n const approvalPolicy = policy.locked\n ? policy.defaultApprovalPolicy\n : validateApprovalPolicy(requestedApprovalPolicy ?? policy.defaultApprovalPolicy, policy);\n const sandbox = policy.locked\n ? policy.defaultSandbox\n : validateSandbox(requestedSandbox ?? policy.defaultSandbox, policy);\n\n if (method === \"turn/start\" || method === \"thread/start\") {\n next.approvalPolicy = approvalPolicy;\n }\n if (method === \"turn/start\") {\n next.sandboxPolicy = sandboxPolicyFor(sandbox);\n delete next.sandbox;\n } else {\n next.sandbox = sandbox;\n delete next.sandboxPolicy;\n }\n\n return next;\n}\n\nfunction usesPermissions(method: string): boolean {\n return method === \"thread/start\" || method === \"thread/resume\" || method === \"thread/fork\" || method === \"turn/start\";\n}\n\nfunction validateApprovalPolicy(value: ApprovalPolicy, policy: PermissionPolicy): ApprovalPolicy {\n if (!policy.allowedApprovalPolicies.includes(value)) {\n throw httpError(403, `Approval policy requires unsafe permissions: ${value}`);\n }\n return value;\n}\n\nfunction validateSandbox(value: SandboxMode, policy: PermissionPolicy): SandboxMode {\n if (!policy.allowedSandboxes.includes(value)) {\n throw httpError(403, `Sandbox requires --unsafe-permissions: ${value}`);\n }\n return value;\n}\n\nfunction approvalPolicyFor(value: unknown): ApprovalPolicy | null {\n return value === \"on-request\" || value === \"untrusted\" || value === \"on-failure\" || value === \"never\" ? value : null;\n}\n\nfunction sandboxFor(value: unknown): SandboxMode | null {\n if (value === \"read-only\" || value === \"workspace-write\" || value === \"danger-full-access\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n if (record.type === \"readOnly\") return \"read-only\";\n if (record.type === \"workspaceWrite\") return \"workspace-write\";\n if (record.type === \"dangerFullAccess\") return \"danger-full-access\";\n return null;\n}\n\nfunction sandboxPolicyFor(value: SandboxMode): JsonValue {\n if (value === \"danger-full-access\") return { type: \"dangerFullAccess\" };\n if (value === \"read-only\") return { type: \"readOnly\" };\n return { type: \"workspaceWrite\" };\n}\n\nfunction booleanEnv(name: string, fallback: boolean): boolean {\n const value = process.env[name];\n if (value === undefined) {\n return fallback;\n }\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase())) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(value.toLowerCase())) return false;\n return fallback;\n}\n\nfunction httpError(statusCode: number, message: string): Error & { statusCode: number } {\n return Object.assign(new Error(message), { statusCode });\n}\n"],"names":["unsafeApprovalPolicies","safeApprovalPolicies","safeSandboxes","unsafeSandboxes","getPermissionPolicy","unsafePermissions","booleanEnv","defaultSandbox","allowedApprovalPolicies","allowedSandboxes","defaultApprovalPolicy","approvalPolicyFor","process","env","CODEX_WEB_UI_APPROVAL_POLICY","sandboxFor","CODEX_WEB_UI_SANDBOX","includes","httpError","isArray","params","locked","sandbox","enforceRpcPermissions","method","Array","usesPermissions","policy","next","requestedApprovalPolicy","approvalPolicy","requestedSandbox","sandboxPolicy","validateApprovalPolicy","validateSandbox","sandboxPolicyFor","value","type","name","fallback","record","undefined","toLowerCase","statusCode","message","Object","assign","Error"],"mappings":"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","ignoreList":[4]}
1
+ {"version":3,"sources":["../../../server/appApi.ts","../../../server/cors.ts","../../../server/mcpOAuthRelay.ts","../../../server/runtime.ts","../../../node_modules/next/dist/esm/build/templates/app-route.js","../../../server/codexBridge.ts","../../../app/api/%5B%5B...path%5D%5D/route.ts","../../../server/auth.ts","../../../server/logStore.ts","../../../server/mcpConfig.ts","../../../server/permissions.ts","../../../server/eventHub.ts"],"sourcesContent":["import crypto from \"node:crypto\";\nimport { execFile } from \"node:child_process\";\nimport { createReadStream, existsSync, statSync } from \"node:fs\";\nimport { mkdir, readdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { Readable } from \"node:stream\";\nimport { authState, isAuthenticated, loginWithPassword } from \"./auth\";\nimport { corsHeaders } from \"./cors\";\nimport {\n isMcpOAuthCallbackPath,\n mcpOAuthCallbackBaseUrl,\n mcpOAuthCallbackPort,\n registerMcpOAuthCallback,\n relayMcpOAuthCallback\n} from \"./mcpOAuthRelay\";\nimport { codexConfigPath, saveMcpServerConfig } from \"./mcpConfig\";\nimport { enforceRpcPermissions } from \"./permissions\";\nimport { getRuntime, homeDir, projectRoot } from \"./runtime\";\nimport type { JsonValue } from \"./types\";\n\nconst mimeTypes: Record<string, string> = {\n \".html\": \"text/html; charset=utf-8\",\n \".js\": \"text/javascript; charset=utf-8\",\n \".css\": \"text/css; charset=utf-8\",\n \".json\": \"application/json; charset=utf-8\",\n \".svg\": \"image/svg+xml\",\n \".ico\": \"image/x-icon\",\n \".png\": \"image/png\",\n \".jpg\": \"image/jpeg\",\n \".jpeg\": \"image/jpeg\",\n \".gif\": \"image/gif\",\n \".webp\": \"image/webp\",\n \".bmp\": \"image/bmp\",\n \".avif\": \"image/avif\",\n \".pdf\": \"application/pdf\",\n \".mp4\": \"video/mp4\",\n \".m4v\": \"video/x-m4v\",\n \".webm\": \"video/webm\",\n \".mov\": \"video/quicktime\",\n \".ogv\": \"video/ogg\",\n \".ogg\": \"video/ogg\",\n \".avi\": \"video/x-msvideo\",\n \".mkv\": \"video/x-matroska\",\n \".3gp\": \"video/3gpp\"\n};\n\nexport async function handleApiRequest(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (isMcpOAuthCallbackPath(url.pathname)) {\n return relayMcpOAuthCallback(request);\n }\n\n const cors = corsHeaders(request);\n if (request.method === \"OPTIONS\") {\n return cors.allowed\n ? withCors(new Response(null, { status: 204, headers: noStoreHeaders() }), cors.headers)\n : json({ ok: false, error: \"Origin is not allowed\" }, 403, cors.headers);\n }\n if (!cors.allowed) {\n return json({ ok: false, error: \"Origin is not allowed\" }, 403, cors.headers);\n }\n\n const startedAt = Date.now();\n const { logs } = await getRuntime();\n try {\n const response = await dispatchApiRequest(request, url, cors.headers);\n void logs.append({\n type: \"server\",\n method: \"http/request\",\n payload: {\n method: request.method,\n path: url.pathname,\n statusCode: response.status,\n durationMs: Date.now() - startedAt\n }\n });\n return response;\n } catch (error) {\n const err = error as Error & { data?: unknown; statusCode?: number };\n const response = json({ ok: false, error: err.message || \"Internal server error\", data: err.data }, err.statusCode || 500, cors.headers);\n void logs.append({\n type: \"server\",\n method: \"http/request\",\n payload: {\n method: request.method,\n path: url.pathname,\n statusCode: response.status,\n durationMs: Date.now() - startedAt\n }\n });\n return response;\n }\n}\n\nasync function dispatchApiRequest(request: Request, url: URL, cors: Headers): Promise<Response> {\n const { bridge, hub, logs } = await getRuntime();\n const pathname = url.pathname;\n\n if (pathname === \"/api/login\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n return json({ ok: true, ...loginWithPassword(body.password) }, 200, cors);\n }\n\n if (pathname === \"/api/logout\" && request.method === \"POST\") {\n return json({ ok: true }, 200, cors);\n }\n\n if (pathname === \"/api/auth\" && request.method === \"GET\") {\n return json({ ok: true, ...authState(request) }, 200, cors);\n }\n\n if (!isAuthenticated(request)) {\n return json({ ok: false, error: \"Unauthorized\" }, 401, cors);\n }\n\n if (pathname === \"/api/status\" && request.method === \"GET\") {\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/events\" && request.method === \"GET\") {\n bridge.start().catch((error: Error) => {\n hub.broadcast(\"server-status\", bridge.summary());\n hub.broadcast(\"stderr\", { at: Date.now(), line: error.message });\n });\n return withCors(\n new Response(hub.stream(request.signal), {\n status: 200,\n headers: {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\"\n }\n }),\n cors\n );\n }\n\n if (pathname === \"/api/rpc\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n if (typeof body.method !== \"string\") {\n return json({ ok: false, error: \"Missing JSON-RPC method\" }, 400, cors);\n }\n const params = enforceRpcPermissions(body.method, (body.params ?? {}) as JsonValue);\n const result = await bridge.request(body.method, params);\n return json({ ok: true, result }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers\" && request.method === \"GET\") {\n return json({ ok: true, mcp: await listMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n await saveMcpServerConfig({\n name: body.name as string,\n url: body.url as string\n });\n return json({ ok: true, mcp: await reloadMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers/oauth/login\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n const name = typeof body.name === \"string\" ? body.name.trim() : \"\";\n if (!name) {\n return json({ ok: false, error: \"Missing MCP server name\" }, 400, cors);\n }\n await configureMcpOAuthRelay(request);\n const result = asRecord(await bridge.request(\"mcpServer/oauth/login\", { name }));\n const authorizationUrl = typeof result.authorization_url === \"string\"\n ? result.authorization_url\n : typeof result.authorizationUrl === \"string\"\n ? result.authorizationUrl\n : \"\";\n if (!authorizationUrl) {\n return json({ ok: false, error: \"Codex did not return an MCP OAuth authorization URL\" }, 502, cors);\n }\n registerMcpOAuthCallback(name, authorizationUrl);\n return json({ ok: true, authorizationUrl }, 200, cors);\n }\n\n if (pathname === \"/api/mcp/servers/reload\" && request.method === \"POST\") {\n return json({ ok: true, mcp: await reloadMcpServers() }, 200, cors);\n }\n\n if (pathname === \"/api/client-requests\" && request.method === \"GET\") {\n return json({ ok: true, requests: bridge.pendingClientRequests() }, 200, cors);\n }\n\n if (pathname === \"/api/client-requests/respond\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n const id = typeof body.id === \"string\" || typeof body.id === \"number\" ? body.id : null;\n if (id === null) {\n return json({ ok: false, error: \"Missing client request id\" }, 400, cors);\n }\n bridge.respondClientRequest(id, (body.result ?? {}) as JsonValue);\n return json({ ok: true }, 200, cors);\n }\n\n if (pathname === \"/api/uploads\" && request.method === \"POST\") {\n return json({ ok: true, attachment: await saveUploadedFile(request) }, 200, cors);\n }\n\n if (pathname === \"/api/transcribe\" && request.method === \"POST\") {\n return json({ ok: true, transcript: await transcribeAudio(request) }, 200, cors);\n }\n\n if (pathname === \"/api/files/view\" && request.method === \"GET\") {\n return json({ ok: true, file: await readReferencedFile(url.searchParams) }, 200, cors);\n }\n\n if (pathname === \"/api/files/download\" && (request.method === \"GET\" || request.method === \"HEAD\")) {\n return withCors(await sendReferencedFile(url.searchParams, request.method === \"HEAD\", false, request.headers.get(\"range\")), cors);\n }\n\n if (pathname === \"/api/files/raw\" && (request.method === \"GET\" || request.method === \"HEAD\")) {\n return withCors(await sendReferencedFile(url.searchParams, request.method === \"HEAD\", true, request.headers.get(\"range\")), cors);\n }\n\n if (pathname === \"/api/files/explore\" && request.method === \"GET\") {\n return json({ ok: true, explorer: await exploreFiles(url.searchParams) }, 200, cors);\n }\n\n if (pathname === \"/api/skills\" && request.method === \"GET\") {\n const summary = bridge.summary();\n return json({ ok: true, skills: await listSkills(typeof summary.cwd === \"string\" ? summary.cwd : null) }, 200, cors);\n }\n\n if (pathname === \"/api/server/restart\" && request.method === \"POST\") {\n await bridge.restart();\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/server/stop\" && request.method === \"POST\") {\n await bridge.stop();\n return json({ ok: true, status: bridge.summary() }, 200, cors);\n }\n\n if (pathname === \"/api/repositories/browse\" && request.method === \"GET\") {\n return json({ ok: true, browser: await browseRepositories(url.searchParams.get(\"path\")) }, 200, cors);\n }\n\n if (pathname === \"/api/repositories/create\" && request.method === \"POST\") {\n const body = await readJsonBody(request);\n return json({ ok: true, browser: await createRepository(body.parentPath, body.name) }, 200, cors);\n }\n\n if (pathname.startsWith(\"/api/logs/\") && request.method === \"DELETE\") {\n const threadId = decodeURIComponent(pathname.slice(\"/api/logs/\".length));\n return json({ ok: true, threadId, deleted: await logs.deleteThreadLog(threadId) }, 200, cors);\n }\n\n return json({ ok: false, error: \"Not found\" }, 404, cors);\n}\n\nasync function browseRepositories(inputPath: unknown): Promise<Record<string, unknown>> {\n const currentPath = resolveExplorerPath(inputPath);\n const stats = statSync(currentPath);\n if (!stats.isDirectory()) {\n throw new Error(\"Path is not a directory\");\n }\n const entries = await readdir(currentPath, { withFileTypes: true });\n const directories = entries\n .filter((entry) => entry.isDirectory() || entry.isSymbolicLink())\n .map((entry) => {\n const entryPath = path.join(currentPath, entry.name);\n let isDirectory = entry.isDirectory();\n try {\n isDirectory = statSync(entryPath).isDirectory();\n } catch {\n isDirectory = false;\n }\n return isDirectory\n ? {\n name: entry.name,\n path: entryPath,\n displayPath: displayPath(entryPath),\n isGitRepo: isGitRepo(entryPath),\n hidden: entry.name.startsWith(\".\")\n }\n : null;\n })\n .filter((entry): entry is { name: string; path: string; displayPath: string; isGitRepo: boolean; hidden: boolean } => Boolean(entry))\n .sort((a, b) => Number(a.hidden) - Number(b.hidden) || Number(b.isGitRepo) - Number(a.isGitRepo) || a.name.localeCompare(b.name));\n\n return {\n path: currentPath,\n displayPath: displayPath(currentPath),\n parentPath: path.dirname(currentPath) === currentPath ? null : path.dirname(currentPath),\n homePath: homeDir,\n isGitRepo: isGitRepo(currentPath),\n entries: directories\n };\n}\n\nasync function createRepository(parentPath: unknown, name: unknown): Promise<Record<string, unknown>> {\n const parent = resolveExplorerPath(parentPath);\n if (!statSync(parent).isDirectory()) {\n throw new Error(\"Parent path is not a directory\");\n }\n const repoName = typeof name === \"string\" ? name.trim() : \"\";\n if (!repoName || repoName === \".\" || repoName === \"..\" || repoName.includes(\"/\") || repoName.includes(\"\\\\\")) {\n throw new Error(\"Enter a single folder name for the new repository\");\n }\n const repoPath = path.join(parent, repoName);\n if (existsSync(repoPath)) {\n throw new Error(\"A folder already exists with that name\");\n }\n await mkdir(repoPath, { recursive: false });\n await runGitInit(repoPath);\n return browseRepositories(repoPath);\n}\n\nasync function reloadMcpServers(): Promise<Record<string, unknown>> {\n const { bridge } = await getRuntime();\n await bridge.request(\"config/mcpServer/reload\", {});\n return listMcpServers();\n}\n\nasync function configureMcpOAuthRelay(request: Request): Promise<void> {\n const { bridge } = await getRuntime();\n await bridge.request(\"config/batchWrite\", {\n edits: [\n {\n keyPath: \"mcp_oauth_callback_port\",\n value: mcpOAuthCallbackPort(),\n mergeStrategy: \"replace\"\n },\n {\n keyPath: \"mcp_oauth_callback_url\",\n value: mcpOAuthCallbackBaseUrl(request),\n mergeStrategy: \"replace\"\n }\n ],\n reloadUserConfig: true\n });\n}\n\nasync function listMcpServers(): Promise<Record<string, unknown>> {\n const { bridge } = await getRuntime();\n const response = asRecord(await bridge.request(\"mcpServerStatus/list\", { detail: \"toolsAndAuthOnly\" }));\n const data = Array.isArray(response.data) ? response.data.map(summarizeMcpServer) : [];\n return {\n configPath: codexConfigPath(),\n servers: data,\n nextCursor: typeof response.nextCursor === \"string\" ? response.nextCursor : null\n };\n}\n\nfunction summarizeMcpServer(value: unknown): Record<string, unknown> {\n const record = asRecord(value);\n const tools = asRecord(record.tools);\n return {\n name: typeof record.name === \"string\" ? record.name : \"unknown\",\n authStatus: typeof record.authStatus === \"string\" ? record.authStatus : \"unsupported\",\n tools: Object.keys(tools).sort(),\n resources: Array.isArray(record.resources) ? record.resources.length : 0,\n resourceTemplates: Array.isArray(record.resourceTemplates) ? record.resourceTemplates.length : 0\n };\n}\n\nasync function saveUploadedFile(request: Request): Promise<Record<string, unknown>> {\n const encodedName = request.headers.get(\"x-file-name\") || \"\";\n const originalName = encodedName ? decodeURIComponent(encodedName) : \"upload\";\n const safeName = safeUploadName(originalName);\n const uploadDir = path.resolve(process.env.CODEX_WEB_UI_UPLOAD_DIR || path.join(projectRoot, \"data/uploads\"));\n const body = await readBinaryBody(request, 50 * 1024 * 1024);\n if (body.length === 0) {\n throw new Error(\"Uploaded file is empty\");\n }\n await mkdir(uploadDir, { recursive: true });\n const filePath = path.join(uploadDir, `${Date.now()}-${crypto.randomUUID()}-${safeName}`);\n await writeFile(filePath, body, { flag: \"wx\" });\n return {\n path: filePath,\n displayPath: displayPath(filePath),\n name: originalName,\n size: body.length\n };\n}\n\nasync function transcribeAudio(request: Request): Promise<string> {\n const apiKey = process.env.OPENAI_API_KEY || process.env.CODEX_WEB_UI_OPENAI_API_KEY || \"\";\n if (!apiKey) {\n throw new Error(\"OPENAI_API_KEY is required for audio transcription.\");\n }\n const encodedName = request.headers.get(\"x-file-name\") || \"\";\n const originalName = encodedName ? decodeURIComponent(encodedName) : \"recording.webm\";\n const body = await readBinaryBody(request, 25 * 1024 * 1024);\n if (body.length === 0) {\n throw new Error(\"Audio recording is empty.\");\n }\n const form = new FormData();\n form.set(\"model\", process.env.CODEX_WEB_UI_TRANSCRIPTION_MODEL || \"gpt-4o-mini-transcribe\");\n form.set(\"response_format\", \"json\");\n form.set(\"file\", new Blob([new Uint8Array(body)], { type: request.headers.get(\"content-type\") || \"audio/webm\" }), safeUploadName(originalName));\n const response = await fetch(\"https://api.openai.com/v1/audio/transcriptions\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${apiKey}`\n },\n body: form\n });\n const result = asRecord(await response.json().catch(() => ({})));\n if (!response.ok) {\n const error = asRecord(result.error);\n throw new Error(typeof error.message === \"string\" ? error.message : `Transcription failed: ${response.status}`);\n }\n return typeof result.text === \"string\" ? result.text.trim() : \"\";\n}\n\nasync function exploreFiles(searchParams: URLSearchParams): Promise<Record<string, unknown>> {\n const cwd = await resolveFilesCwd(searchParams.get(\"cwd\"));\n const currentPath = resolveFilesExplorerPath(cwd, searchParams.get(\"path\"));\n const stats = statSync(currentPath);\n if (!stats.isDirectory()) {\n throw new Error(\"Explorer path is not a directory\");\n }\n\n const trackedFiles = await gitTrackedFiles(cwd);\n const entries = new Map<string, Record<string, unknown>>();\n const relativeDir = normalizeRelativePath(path.relative(cwd, currentPath));\n const prefix = relativeDir ? `${relativeDir}/` : \"\";\n\n for (const trackedFile of trackedFiles) {\n const normalized = normalizeRelativePath(trackedFile);\n if (!normalized || hasHiddenPathSegment(normalized) || (prefix && !normalized.startsWith(prefix))) {\n continue;\n }\n const remainder = prefix ? normalized.slice(prefix.length) : normalized;\n if (!remainder || remainder.includes(\"../\")) {\n continue;\n }\n const [name, ...rest] = remainder.split(\"/\");\n if (!name || isHiddenName(name)) {\n continue;\n }\n const entryPath = path.join(currentPath, name);\n const isFile = rest.length === 0;\n entries.set(name, fileExplorerEntry(entryPath, cwd, isFile ? \"file\" : \"directory\", true));\n }\n\n const actualEntries = await readdir(currentPath, { withFileTypes: true });\n for (const entry of actualEntries) {\n if (isHiddenName(entry.name)) {\n continue;\n }\n const entryPath = path.join(currentPath, entry.name);\n let kind: \"file\" | \"directory\" | null = entry.isDirectory() ? \"directory\" : entry.isFile() ? \"file\" : null;\n if (!kind && entry.isSymbolicLink()) {\n try {\n const linkedStats = statSync(entryPath);\n kind = linkedStats.isDirectory() ? \"directory\" : linkedStats.isFile() ? \"file\" : null;\n } catch {\n kind = null;\n }\n }\n if (!kind) {\n continue;\n }\n const previous = entries.get(entry.name);\n entries.set(entry.name, { ...fileExplorerEntry(entryPath, cwd, kind, Boolean(previous?.tracked)), tracked: Boolean(previous?.tracked) });\n }\n\n const sortedEntries = [...entries.values()].sort((a, b) => {\n const aType = a.type === \"directory\" ? 0 : 1;\n const bType = b.type === \"directory\" ? 0 : 1;\n return aType - bType || String(a.name).localeCompare(String(b.name), undefined, { sensitivity: \"base\" });\n });\n\n return {\n cwd,\n path: currentPath,\n relativePath: normalizeRelativePath(path.relative(cwd, currentPath)),\n displayPath: displayPath(currentPath),\n parentPath: currentPath === cwd ? null : path.dirname(currentPath),\n trackedCount: trackedFiles.length,\n entries: sortedEntries\n };\n}\n\nfunction fileExplorerEntry(filePath: string, cwd: string, type: \"file\" | \"directory\", tracked: boolean): Record<string, unknown> {\n let size: number | null = null;\n let modifiedAt: number | null = null;\n try {\n const stats = statSync(filePath);\n size = stats.isFile() ? stats.size : null;\n modifiedAt = Math.round(stats.mtimeMs);\n } catch {\n size = null;\n modifiedAt = null;\n }\n const kind = type === \"file\" ? previewKindForPath(filePath) : null;\n return {\n name: path.basename(filePath),\n path: filePath,\n relativePath: normalizeRelativePath(path.relative(cwd, filePath)),\n displayPath: displayPath(filePath),\n type,\n tracked,\n size,\n modifiedAt,\n kind: kind || null,\n previewable: type === \"file\" && Boolean(kind)\n };\n}\n\nasync function listSkills(cwd: string | null): Promise<Record<string, unknown>[]> {\n const codexHome = process.env.CODEX_HOME ? path.resolve(process.env.CODEX_HOME) : path.join(homeDir, \".codex\");\n const sources = [\n { source: \"workspace\", path: cwd ? path.join(cwd, \".codex\", \"skills\") : \"\" },\n { source: \"project\", path: path.join(projectRoot, \".codex\", \"skills\") },\n { source: \"user\", path: path.join(codexHome, \"skills\") }\n ].filter((source) => source.path);\n const byName = new Map<string, Record<string, unknown>>();\n for (const source of sources) {\n for (const skill of await readSkillsFromDirectory(source.path, source.source)) {\n const name = String(skill.name);\n if (!byName.has(name)) {\n byName.set(name, skill);\n }\n }\n }\n return [...byName.values()].sort((a, b) => String(a.name).localeCompare(String(b.name), undefined, { sensitivity: \"base\" }));\n}\n\nasync function readSkillsFromDirectory(root: string, source: string): Promise<Record<string, unknown>[]> {\n if (!existsSync(root)) {\n return [];\n }\n const results: Record<string, unknown>[] = [];\n const entries = await readdir(root, { withFileTypes: true }).catch(() => []);\n for (const entry of entries) {\n if (!entry.isDirectory()) {\n continue;\n }\n const entryPath = path.join(root, entry.name);\n if (entry.name === \".system\") {\n results.push(...await readSkillsFromDirectory(entryPath, \"system\"));\n continue;\n }\n const skillFile = path.join(entryPath, \"SKILL.md\");\n if (!existsSync(skillFile)) {\n continue;\n }\n results.push({\n name: entry.name,\n path: entryPath,\n source,\n description: await readSkillDescription(skillFile)\n });\n }\n return results;\n}\n\nasync function readSkillDescription(skillFile: string): Promise<string | null> {\n const content = await readFile(skillFile, \"utf8\").catch(() => \"\");\n const description = content\n .split(/\\r?\\n/)\n .map((line) => line.trim())\n .find((line) => line && !line.startsWith(\"#\") && !line.startsWith(\"---\"));\n return description ? truncateText(description.replace(/^description:\\s*/i, \"\").replace(/^[\"']|[\"']$/g, \"\"), 220) : null;\n}\n\nfunction truncateText(value: string, limit: number): string {\n return value.length <= limit ? value : `${value.slice(0, limit - 1)}...`;\n}\n\nasync function readReferencedFile(searchParams: URLSearchParams): Promise<Record<string, unknown>> {\n const filePath = await resolveReferencedFilePath(searchParams.get(\"path\"), searchParams.get(\"cwd\"));\n const stats = statSync(filePath);\n if (!stats.isFile()) {\n throw new Error(\"Referenced path is not a file\");\n }\n const kind = previewKindForPath(filePath);\n const maxBytes = 2 * 1024 * 1024;\n if (kind === \"image\" || kind === \"pdf\" || kind === \"video\") {\n return fileMetadata(filePath, stats.size, kind, true);\n }\n if (!kind || stats.size > maxBytes) {\n return fileMetadata(filePath, stats.size, kind, false);\n }\n const content = await readFile(filePath, \"utf8\");\n return {\n ...fileMetadata(filePath, stats.size, kind, true),\n content\n };\n}\n\nasync function sendReferencedFile(searchParams: URLSearchParams, headOnly: boolean, inline = false, rangeHeader?: string | null): Promise<Response> {\n const filePath = await resolveReferencedFilePath(searchParams.get(\"path\"), searchParams.get(\"cwd\"));\n const stats = statSync(filePath);\n if (!stats.isFile()) {\n return json({ ok: false, error: \"Referenced path is not a file\" }, 404);\n }\n const fileName = path.basename(filePath);\n const ext = path.extname(filePath).toLowerCase();\n const range = parseRangeHeader(rangeHeader || \"\", stats.size);\n if (rangeHeader && !range) {\n return new Response(null, {\n status: 416,\n headers: {\n \"Content-Range\": `bytes */${stats.size}`,\n \"Accept-Ranges\": \"bytes\"\n }\n });\n }\n const start = range?.start ?? 0;\n const end = range?.end ?? stats.size - 1;\n const contentLength = end - start + 1;\n const headers = new Headers({\n \"Content-Type\": mimeTypes[ext] || \"application/octet-stream\",\n \"Content-Length\": String(contentLength),\n \"Content-Disposition\": `${inline ? \"inline\" : \"attachment\"}; filename=\"${fileName.replace(/\"/g, \"\")}\"; filename*=UTF-8''${encodeURIComponent(fileName)}`,\n \"Cache-Control\": \"private, max-age=60\",\n \"Accept-Ranges\": \"bytes\",\n ...(range ? { \"Content-Range\": `bytes ${start}-${end}/${stats.size}` } : {})\n });\n const body = headOnly ? null : (Readable.toWeb(createReadStream(filePath, { start, end })) as ReadableStream<Uint8Array>);\n return new Response(body, { status: range ? 206 : 200, headers });\n}\n\nasync function resolveReferencedFilePath(inputPath: string | null, cwd: string | null): Promise<string> {\n const value = inputPath?.trim();\n if (!value) {\n throw new Error(\"Missing file path\");\n }\n if (value === \"~\") {\n return homeDir;\n }\n if (value.startsWith(\"~/\")) {\n return path.resolve(homeDir, value.slice(2));\n }\n if (path.isAbsolute(value)) {\n return path.resolve(value);\n }\n const { bridge } = await getRuntime();\n const summary = bridge.summary();\n const base = cwd?.trim() ? path.resolve(cwd) : summary.cwd;\n return path.resolve(typeof base === \"string\" ? base : projectRoot, value);\n}\n\nfunction fileMetadata(filePath: string, size: number, kind: string | null, previewable: boolean): Record<string, unknown> {\n return {\n path: filePath,\n displayPath: displayPath(filePath),\n name: path.basename(filePath),\n extension: path.extname(filePath).slice(1).toLowerCase(),\n mimeType: mimeTypes[path.extname(filePath).toLowerCase()] || \"application/octet-stream\",\n size,\n kind: kind || \"download\",\n previewable\n };\n}\n\nfunction previewKindForPath(filePath: string): string | null {\n const ext = path.extname(filePath).slice(1).toLowerCase();\n if ([\"png\", \"jpg\", \"jpeg\", \"gif\", \"webp\", \"bmp\", \"avif\", \"svg\"].includes(ext)) return \"image\";\n if (ext === \"pdf\") return \"pdf\";\n if ([\"mp4\", \"m4v\", \"webm\", \"mov\", \"ogv\", \"ogg\", \"avi\", \"mkv\", \"3gp\"].includes(ext)) return \"video\";\n if (ext === \"json\") return \"json\";\n if ([\"md\", \"markdown\", \"mdx\"].includes(ext)) return \"markdown\";\n if ([\"txt\", \"log\", \"csv\", \"yaml\", \"yml\", \"toml\", \"ini\", \"env\"].includes(ext)) return \"text\";\n if ([\"js\", \"jsx\", \"ts\", \"tsx\", \"py\", \"rs\", \"go\", \"java\", \"kt\", \"swift\", \"c\", \"h\", \"cpp\", \"hpp\", \"cs\", \"rb\", \"php\", \"sh\", \"bash\", \"zsh\", \"fish\", \"sql\", \"css\", \"scss\", \"html\", \"xml\", \"vue\", \"svelte\", \"dockerfile\"].includes(ext)) {\n return \"code\";\n }\n return null;\n}\n\nfunction parseRangeHeader(value: string, size: number): { start: number; end: number } | null {\n const match = /^bytes=(\\d*)-(\\d*)$/.exec(value.trim());\n if (!match || size <= 0) {\n return null;\n }\n\n const [, rawStart, rawEnd] = match;\n if (!rawStart && !rawEnd) {\n return null;\n }\n\n if (!rawStart) {\n const suffixLength = Number(rawEnd);\n if (!Number.isSafeInteger(suffixLength) || suffixLength <= 0) {\n return null;\n }\n return {\n start: Math.max(size - suffixLength, 0),\n end: size - 1\n };\n }\n\n const start = Number(rawStart);\n const end = rawEnd ? Number(rawEnd) : size - 1;\n if (!Number.isSafeInteger(start) || !Number.isSafeInteger(end) || start > end || start >= size) {\n return null;\n }\n return {\n start,\n end: Math.min(end, size - 1)\n };\n}\n\nfunction safeUploadName(name: string): string {\n const baseName = path.basename(name || \"upload\").replace(/[^A-Za-z0-9._-]+/g, \"_\").replace(/^_+|_+$/g, \"\");\n return baseName || \"upload\";\n}\n\nfunction resolveExplorerPath(inputPath: unknown): string {\n const value = typeof inputPath === \"string\" && inputPath.trim() ? inputPath.trim() : homeDir;\n if (value === \"~\") {\n return homeDir;\n }\n if (value.startsWith(\"~/\")) {\n return path.resolve(homeDir, value.slice(2));\n }\n return path.resolve(path.isAbsolute(value) ? value : path.join(homeDir, value));\n}\n\nasync function resolveFilesCwd(inputCwd: string | null): Promise<string> {\n const { bridge } = await getRuntime();\n const summary = bridge.summary();\n const fallback = typeof summary.cwd === \"string\" && summary.cwd ? summary.cwd : projectRoot;\n return resolveReferencedFilePath(inputCwd?.trim() || fallback, null);\n}\n\nfunction resolveFilesExplorerPath(cwd: string, inputPath: string | null): string {\n const value = inputPath?.trim();\n if (!value) {\n return cwd;\n }\n const filePath = path.resolve(path.isAbsolute(value) ? value : path.join(cwd, value));\n if (!isPathWithin(cwd, filePath)) {\n throw new Error(\"Explorer path must stay within the working directory\");\n }\n return filePath;\n}\n\nasync function gitTrackedFiles(cwd: string): Promise<string[]> {\n return new Promise((resolve) => {\n execFile(\"git\", [\"-C\", cwd, \"ls-files\", \"-z\"], { maxBuffer: 10 * 1024 * 1024 }, (error, stdout) => {\n if (error) {\n resolve([]);\n return;\n }\n resolve(stdout.split(\"\\0\").filter(Boolean));\n });\n });\n}\n\nfunction normalizeRelativePath(value: string): string {\n return value.split(path.sep).join(\"/\").replace(/^\\.\\//, \"\");\n}\n\nfunction hasHiddenPathSegment(value: string): boolean {\n return value.split(\"/\").some(isHiddenName);\n}\n\nfunction isHiddenName(value: string): boolean {\n return value.startsWith(\".\");\n}\n\nfunction isPathWithin(parentPath: string, childPath: string): boolean {\n const relativePath = path.relative(parentPath, childPath);\n return !relativePath || (!relativePath.startsWith(\"..\") && !path.isAbsolute(relativePath));\n}\n\nfunction displayPath(filePath: string): string {\n const relative = path.relative(homeDir, filePath);\n if (!relative) {\n return \"~\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return `~/${relative}`;\n }\n return filePath;\n}\n\nfunction isGitRepo(dirPath: string): boolean {\n return existsSync(path.join(dirPath, \".git\"));\n}\n\nasync function runGitInit(repoPath: string): Promise<void> {\n await new Promise<void>((resolve, reject) => {\n execFile(\"git\", [\"init\", \"--\", repoPath], (error) => {\n if (error) {\n reject(error);\n return;\n }\n resolve();\n });\n });\n}\n\nasync function readJsonBody(request: Request): Promise<Record<string, unknown>> {\n const text = (await readBinaryBody(request, 1_000_000)).toString(\"utf8\").trim();\n return text ? (JSON.parse(text) as Record<string, unknown>) : {};\n}\n\nasync function readBinaryBody(request: Request, limitBytes: number): Promise<Buffer> {\n const contentLength = Number(request.headers.get(\"content-length\") || \"0\");\n if (Number.isFinite(contentLength) && contentLength > limitBytes) {\n throw new Error(\"Request body is too large\");\n }\n const body = Buffer.from(await request.arrayBuffer());\n if (body.length > limitBytes) {\n throw new Error(\"Request body is too large\");\n }\n return body;\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> {\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction json(payload: unknown, status = 200, cors?: Headers): Response {\n return withCors(\n Response.json(payload, {\n status,\n headers: noStoreHeaders()\n }),\n cors\n );\n}\n\nfunction noStoreHeaders(): Headers {\n return new Headers({\n \"Cache-Control\": \"no-store\"\n });\n}\n\nfunction withCors(response: Response, cors?: Headers): Response {\n for (const [key, value] of cors ?? []) {\n response.headers.set(key, value);\n }\n return response;\n}\n","const CORS_ALLOWED_HEADERS = \"Authorization, Content-Type, X-File-Name\";\nconst CORS_ALLOWED_METHODS = \"GET, HEAD, POST, DELETE, OPTIONS\";\nconst CORS_MAX_AGE_SECONDS = \"600\";\n\nexport function corsHeaders(request: Request): { allowed: boolean; headers: Headers } {\n const headers = new Headers();\n const origin = request.headers.get(\"origin\")?.trim() || \"\";\n if (!origin) {\n return { allowed: true, headers };\n }\n if (!isAllowedOrigin(request, origin)) {\n return { allowed: false, headers };\n }\n headers.set(\"Access-Control-Allow-Origin\", origin);\n headers.set(\"Access-Control-Allow-Methods\", CORS_ALLOWED_METHODS);\n headers.set(\"Access-Control-Allow-Headers\", CORS_ALLOWED_HEADERS);\n headers.set(\"Access-Control-Max-Age\", CORS_MAX_AGE_SECONDS);\n headers.set(\"Vary\", \"Origin\");\n return { allowed: true, headers };\n}\n\nfunction isAllowedOrigin(request: Request, origin: string): boolean {\n if (isSameOrigin(request, origin)) {\n return true;\n }\n return parseCsvEnv(process.env.CODEX_WEB_UI_ALLOWED_ORIGINS).some((pattern) => originMatchesPattern(origin, pattern));\n}\n\nfunction isSameOrigin(request: Request, origin: string): boolean {\n try {\n const requestUrl = new URL(request.url);\n const originUrl = new URL(origin);\n const protocol = request.headers.get(\"x-forwarded-proto\") || requestUrl.protocol.replace(\":\", \"\");\n const host = request.headers.get(\"x-forwarded-host\") || request.headers.get(\"host\") || requestUrl.host;\n return originUrl.protocol === `${protocol}:` && originUrl.host === host;\n } catch {\n return false;\n }\n}\n\nfunction originMatchesPattern(origin: string, pattern: string): boolean {\n try {\n const originUrl = new URL(origin);\n const match = /^(https?):\\/\\/([^/:]+|\\*)(?::(\\*|\\d+))?$/.exec(pattern.trim());\n if (!match) {\n return origin === pattern;\n }\n const [, protocol, hostname, port] = match;\n if (originUrl.protocol !== `${protocol}:`) {\n return false;\n }\n if (hostname !== \"*\" && hostname.toLowerCase() !== originUrl.hostname.toLowerCase()) {\n return false;\n }\n return port === \"*\" || (port ? port === originUrl.port : !originUrl.port);\n } catch {\n return origin === pattern;\n }\n}\n\nfunction parseCsvEnv(value: string | undefined): string[] {\n return (value || \"\")\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n","const DEFAULT_CALLBACK_PORT = 33420;\nconst CALLBACK_BASE_PATH = \"/api/mcp/oauth/callback\";\nconst CALLBACK_TTL_MS = 10 * 60 * 1000;\n\ntype RegisteredMcpCallback = {\n serverName: string;\n path: string;\n state: string;\n localUrl: string;\n expiresAt: number;\n};\n\nconst callbacks = new Map<string, RegisteredMcpCallback>();\n\nexport function mcpOAuthCallbackPort(): number {\n const raw = process.env.CODEX_WEB_UI_MCP_OAUTH_CALLBACK_PORT || process.env.MCP_OAUTH_CALLBACK_PORT || String(DEFAULT_CALLBACK_PORT);\n const value = Number(raw);\n if (!Number.isInteger(value) || value < 1 || value > 65535) {\n return DEFAULT_CALLBACK_PORT;\n }\n return value;\n}\n\nexport function mcpOAuthCallbackBaseUrl(request: Request): string {\n const origin = publicOrigin(request);\n ensureOAuthRedirectOriginAllowed(origin);\n return `${origin}${CALLBACK_BASE_PATH}`;\n}\n\nexport function registerMcpOAuthCallback(serverName: string, authorizationUrl: string): void {\n purgeExpiredCallbacks();\n\n const url = new URL(authorizationUrl);\n const redirectUri = url.searchParams.get(\"redirect_uri\");\n const state = url.searchParams.get(\"state\");\n if (!redirectUri || !state) {\n throw new Error(\"Codex MCP OAuth authorization URL is missing redirect_uri or state\");\n }\n\n const redirectUrl = new URL(redirectUri);\n if (!redirectUrl.pathname.startsWith(`${CALLBACK_BASE_PATH}/`)) {\n throw new Error(\"Codex MCP OAuth callback URL was not configured for the Web UI relay\");\n }\n\n const port = mcpOAuthCallbackPort();\n callbacks.set(callbackKey(redirectUrl.pathname, state), {\n serverName,\n path: redirectUrl.pathname,\n state,\n localUrl: `http://127.0.0.1:${port}${redirectUrl.pathname}`,\n expiresAt: Date.now() + CALLBACK_TTL_MS\n });\n}\n\nexport function isMcpOAuthCallbackPath(pathname: string): boolean {\n return pathname === CALLBACK_BASE_PATH || pathname.startsWith(`${CALLBACK_BASE_PATH}/`);\n}\n\nexport async function relayMcpOAuthCallback(request: Request): Promise<Response> {\n const url = new URL(request.url);\n if (!isMcpOAuthCallbackPath(url.pathname)) {\n return Response.json({ ok: false, error: \"Not found\" }, { status: 404, headers: noStoreHeaders() });\n }\n if (request.method !== \"GET\") {\n return Response.json({ ok: false, error: \"Method not allowed\" }, { status: 405, headers: noStoreHeaders() });\n }\n\n purgeExpiredCallbacks();\n\n const state = url.searchParams.get(\"state\") || \"\";\n const key = callbackKey(url.pathname, state);\n const registered = callbacks.get(key);\n callbacks.delete(key);\n\n if (!registered) {\n return oauthCallbackHtml(\"MCP OAuth callback expired or was already used.\", 403);\n }\n if (registered.expiresAt < Date.now()) {\n return oauthCallbackHtml(\"MCP OAuth callback expired.\", 403);\n }\n\n const localUrl = new URL(registered.localUrl);\n localUrl.search = url.search;\n\n let response: Response;\n try {\n response = await fetch(localUrl, {\n method: \"GET\",\n redirect: \"manual\",\n cache: \"no-store\"\n });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return oauthCallbackHtml(`Could not reach local Codex OAuth listener for ${registered.serverName}: ${escapeHtml(message)}`, 502);\n }\n\n const headers = noStoreHeaders();\n const contentType = response.headers.get(\"content-type\");\n if (contentType) {\n headers.set(\"Content-Type\", contentType);\n }\n const location = response.headers.get(\"location\");\n if (location) {\n headers.set(\"Location\", location);\n }\n return new Response(await response.arrayBuffer(), {\n status: response.status,\n statusText: response.statusText,\n headers\n });\n}\n\nfunction publicOrigin(request: Request): string {\n const configured = process.env.CODEX_WEB_UI_PUBLIC_ORIGIN?.trim();\n if (configured) {\n return configured.replace(/\\/+$/, \"\");\n }\n\n const requestUrl = new URL(request.url);\n const protocol = request.headers.get(\"x-forwarded-proto\") || requestUrl.protocol.replace(\":\", \"\");\n const host = request.headers.get(\"x-forwarded-host\") || request.headers.get(\"host\") || requestUrl.host;\n return `${protocol}://${host}`;\n}\n\nfunction ensureOAuthRedirectOriginAllowed(origin: string): void {\n const url = new URL(origin);\n if (url.protocol === \"https:\") {\n return;\n }\n if (url.protocol === \"http:\" && isLocalOAuthHost(url.hostname)) {\n return;\n }\n const error = new Error(\n \"MCP OAuth requires an HTTPS Web UI origin for remote or LAN browsers. \" +\n \"Open the UI through an HTTPS tunnel/reverse proxy, or set CODEX_WEB_UI_PUBLIC_ORIGIN to that HTTPS origin.\"\n ) as Error & { statusCode?: number };\n error.statusCode = 400;\n throw error;\n}\n\nfunction isLocalOAuthHost(hostname: string): boolean {\n const value = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n return value === \"localhost\" || value.endsWith(\".localhost\") || value === \"::1\" || value.startsWith(\"127.\");\n}\n\nfunction callbackKey(pathname: string, state: string): string {\n return `${pathname}\\n${state}`;\n}\n\nfunction purgeExpiredCallbacks(): void {\n const now = Date.now();\n for (const [key, callback] of callbacks) {\n if (callback.expiresAt < now) {\n callbacks.delete(key);\n }\n }\n}\n\nfunction oauthCallbackHtml(message: string, status: number): Response {\n return new Response(\n `<!doctype html><meta name=\"viewport\" content=\"width=device-width, initial-scale=1\"><title>MCP OAuth</title><body style=\"font-family: system-ui, sans-serif; padding: 2rem;\"><h1>MCP OAuth</h1><p>${message}</p></body>`,\n {\n status,\n headers: {\n ...Object.fromEntries(noStoreHeaders()),\n \"Content-Type\": \"text/html; charset=utf-8\"\n }\n }\n );\n}\n\nfunction noStoreHeaders(): Headers {\n return new Headers({\n \"Cache-Control\": \"no-store\"\n });\n}\n\nfunction escapeHtml(value: string): string {\n return value.replace(/[&<>\"']/g, (char) => {\n switch (char) {\n case \"&\":\n return \"&amp;\";\n case \"<\":\n return \"&lt;\";\n case \">\":\n return \"&gt;\";\n case \"\\\"\":\n return \"&quot;\";\n default:\n return \"&#39;\";\n }\n });\n}\n","import os from \"node:os\";\nimport path from \"node:path\";\nimport { CodexBridge } from \"./codexBridge\";\nimport { EventHub } from \"./eventHub\";\nimport { SessionLogStore } from \"./logStore\";\n\nexport const projectRoot = path.resolve(/*turbopackIgnore: true*/ process.cwd());\nexport const homeDir = os.homedir();\n\nconst logs = new SessionLogStore(process.env.CODEX_WEB_UI_DATA_DIR || path.join(projectRoot, \"data\"));\nconst hub = new EventHub();\nconst bridge = new CodexBridge(\n {\n command: process.env.CODEX_COMMAND || \"codex\",\n cwd: process.env.CODEX_CWD || projectRoot,\n model: process.env.CODEX_MODEL || \"gpt-5.5\",\n reasoningEffort: process.env.CODEX_REASONING_EFFORT || \"high\",\n fastMode: process.env.CODEX_FAST_MODE !== \"0\",\n appServerSocketPath: process.env.CODEX_APP_SERVER_SOCKET || \"\"\n },\n hub,\n logs\n);\n\nlet readyPromise: Promise<void> | null = null;\n\nexport async function getRuntime(): Promise<{ bridge: CodexBridge; hub: EventHub; logs: SessionLogStore }> {\n readyPromise ??= logs.ensure();\n await readyPromise;\n return { bridge, hub, logs };\n}\n","import { AppRouteRouteModule } from \"next/dist/esm/server/route-modules/app-route/module.compiled\";\nimport { RouteKind } from \"next/dist/esm/server/route-kind\";\nimport { patchFetch as _patchFetch } from \"next/dist/esm/server/lib/patch-fetch\";\nimport { addRequestMeta, getRequestMeta, setRequestMeta } from \"next/dist/esm/server/request-meta\";\nimport { getTracer, SpanKind } from \"next/dist/esm/server/lib/trace/tracer\";\nimport { setManifestsSingleton } from \"next/dist/esm/server/app-render/manifests-singleton\";\nimport { normalizeAppPath } from \"next/dist/esm/shared/lib/router/utils/app-paths\";\nimport { NodeNextRequest, NodeNextResponse } from \"next/dist/esm/server/base-http/node\";\nimport { NextRequestAdapter, signalFromNodeResponse } from \"next/dist/esm/server/web/spec-extension/adapters/next-request\";\nimport { BaseServerSpan } from \"next/dist/esm/server/lib/trace/constants\";\nimport { getRevalidateReason } from \"next/dist/esm/server/instrumentation/utils\";\nimport { sendResponse } from \"next/dist/esm/server/send-response\";\nimport { fromNodeOutgoingHttpHeaders, toNodeOutgoingHttpHeaders } from \"next/dist/esm/server/web/utils\";\nimport { getCacheControlHeader } from \"next/dist/esm/server/lib/cache-control\";\nimport { INFINITE_CACHE, NEXT_CACHE_TAGS_HEADER } from \"next/dist/esm/lib/constants\";\nimport { NoFallbackError } from \"next/dist/esm/shared/lib/no-fallback-error.external\";\nimport { CachedRouteKind } from \"next/dist/esm/server/response-cache\";\nimport * as userland from \"INNER_APP_ROUTE\";\n// We inject the nextConfigOutput here so that we can use them in the route\n// module.\nconst nextConfigOutput = \"\"\nconst routeModule = new AppRouteRouteModule({\n definition: {\n kind: RouteKind.APP_ROUTE,\n page: \"/api/[[...path]]/route\",\n pathname: \"/api/[[...path]]\",\n filename: \"route\",\n bundlePath: \"\"\n },\n distDir: process.env.__NEXT_RELATIVE_DIST_DIR || '',\n relativeProjectDir: process.env.__NEXT_RELATIVE_PROJECT_DIR || '',\n resolvedPagePath: \"[project]/app/api/[[...path]]/route.ts\",\n nextConfigOutput,\n // The static import is used for initialization (methods, dynamic, etc.).\n userland: userland,\n // In Turbopack dev mode, also provide a getter that calls require() on every\n // request. This re-reads from devModuleCache so HMR updates are picked up,\n // and the async wrapper unwraps async-module Promises (ESM-only\n // serverExternalPackages) automatically.\n ...process.env.TURBOPACK && process.env.__NEXT_DEV_SERVER ? {\n getUserland: ()=>import(\"INNER_APP_ROUTE\")\n } : {}\n});\n// Pull out the exports that we need to expose from the module. This should\n// be eliminated when we've moved the other routes to the new format. These\n// are used to hook into the route.\nconst { workAsyncStorage, workUnitAsyncStorage, serverHooks } = routeModule;\nfunction patchFetch() {\n return _patchFetch({\n workAsyncStorage,\n workUnitAsyncStorage\n });\n}\nexport { routeModule, workAsyncStorage, workUnitAsyncStorage, serverHooks, patchFetch, };\nexport async function handler(req, res, ctx) {\n if (ctx.requestMeta) {\n setRequestMeta(req, ctx.requestMeta);\n }\n if (routeModule.isDev) {\n addRequestMeta(req, 'devRequestTimingInternalsEnd', process.hrtime.bigint());\n }\n let srcPage = \"/api/[[...path]]/route\";\n // turbopack doesn't normalize `/index` in the page name\n // so we need to to process dynamic routes properly\n // TODO: fix turbopack providing differing value from webpack\n if (process.env.TURBOPACK) {\n srcPage = srcPage.replace(/\\/index$/, '') || '/';\n } else if (srcPage === '/index') {\n // we always normalize /index specifically\n srcPage = '/';\n }\n const multiZoneDraftMode = process.env.__NEXT_MULTI_ZONE_DRAFT_MODE;\n const prepareResult = await routeModule.prepare(req, res, {\n srcPage,\n multiZoneDraftMode\n });\n if (!prepareResult) {\n res.statusCode = 400;\n res.end('Bad Request');\n ctx.waitUntil == null ? void 0 : ctx.waitUntil.call(ctx, Promise.resolve());\n return null;\n }\n const { buildId, deploymentId, params, nextConfig, parsedUrl, isDraftMode, prerenderManifest, routerServerContext, isOnDemandRevalidate, revalidateOnlyGenerated, resolvedPathname, clientReferenceManifest, serverActionsManifest } = prepareResult;\n const normalizedSrcPage = normalizeAppPath(srcPage);\n let isIsr = Boolean(prerenderManifest.dynamicRoutes[normalizedSrcPage] || prerenderManifest.routes[resolvedPathname]);\n const render404 = async ()=>{\n // TODO: should route-module itself handle rendering the 404\n if (routerServerContext == null ? void 0 : routerServerContext.render404) {\n await routerServerContext.render404(req, res, parsedUrl, false);\n } else {\n res.end('This page could not be found');\n }\n return null;\n };\n if (isIsr && !isDraftMode) {\n const isPrerendered = Boolean(prerenderManifest.routes[resolvedPathname]);\n const prerenderInfo = prerenderManifest.dynamicRoutes[normalizedSrcPage];\n if (prerenderInfo) {\n if (prerenderInfo.fallback === false && !isPrerendered) {\n if (nextConfig.adapterPath) {\n return await render404();\n }\n throw new NoFallbackError();\n }\n }\n }\n let cacheKey = null;\n if (isIsr && !routeModule.isDev && !isDraftMode) {\n cacheKey = resolvedPathname;\n // ensure /index and / is normalized to one key\n cacheKey = cacheKey === '/index' ? '/' : cacheKey;\n }\n const supportsDynamicResponse = // If we're in development, we always support dynamic HTML\n routeModule.isDev === true || // If this is not SSG or does not have static paths, then it supports\n // dynamic HTML.\n !isIsr;\n // This is a revalidation request if the request is for a static\n // page and it is not being resumed from a postponed render and\n // it is not a dynamic RSC request then it is a revalidation\n // request.\n const isStaticGeneration = isIsr && !supportsDynamicResponse;\n // Before rendering (which initializes component tree modules), we have to\n // set the reference manifests to our global store so Server Action's\n // encryption util can access to them at the top level of the page module.\n if (serverActionsManifest && clientReferenceManifest) {\n setManifestsSingleton({\n page: srcPage,\n clientReferenceManifest,\n serverActionsManifest\n });\n }\n const method = req.method || 'GET';\n const tracer = getTracer();\n const activeSpan = tracer.getActiveScopeSpan();\n const isWrappedByNextServer = Boolean(routerServerContext == null ? void 0 : routerServerContext.isWrappedByNextServer);\n const isMinimalMode = Boolean(getRequestMeta(req, 'minimalMode'));\n const incrementalCache = getRequestMeta(req, 'incrementalCache') || await routeModule.getIncrementalCache(req, nextConfig, prerenderManifest, isMinimalMode);\n incrementalCache == null ? void 0 : incrementalCache.resetRequestCache();\n globalThis.__incrementalCache = incrementalCache;\n const context = {\n params,\n previewProps: prerenderManifest.preview,\n renderOpts: {\n experimental: {\n authInterrupts: Boolean(nextConfig.experimental.authInterrupts)\n },\n cacheComponents: Boolean(nextConfig.cacheComponents),\n supportsDynamicResponse,\n incrementalCache,\n cacheLifeProfiles: nextConfig.cacheLife,\n waitUntil: ctx.waitUntil,\n onClose: (cb)=>{\n res.on('close', cb);\n },\n onAfterTaskError: undefined,\n onInstrumentationRequestError: (error, _request, errorContext, silenceLog)=>routeModule.onRequestError(req, error, errorContext, silenceLog, routerServerContext)\n },\n sharedContext: {\n buildId,\n deploymentId\n }\n };\n const nodeNextReq = new NodeNextRequest(req);\n const nodeNextRes = new NodeNextResponse(res);\n const nextReq = NextRequestAdapter.fromNodeNextRequest(nodeNextReq, signalFromNodeResponse(res));\n try {\n let parentSpan;\n const invokeRouteModule = async (span)=>{\n return routeModule.handle(nextReq, context).finally(()=>{\n if (!span) return;\n span.setAttributes({\n 'http.status_code': res.statusCode,\n 'next.rsc': false\n });\n const rootSpanAttributes = tracer.getRootSpanAttributes();\n // We were unable to get attributes, probably OTEL is not enabled\n if (!rootSpanAttributes) {\n return;\n }\n if (rootSpanAttributes.get('next.span_type') !== BaseServerSpan.handleRequest) {\n console.warn(`Unexpected root span type '${rootSpanAttributes.get('next.span_type')}'. Please report this Next.js issue https://github.com/vercel/next.js`);\n return;\n }\n const route = rootSpanAttributes.get('next.route');\n if (route) {\n const name = `${method} ${route}`;\n span.setAttributes({\n 'next.route': route,\n 'http.route': route,\n 'next.span_name': name\n });\n span.updateName(name);\n // Propagate http.route to the parent span if one exists (e.g.\n // a platform-created HTTP span in adapter deployments).\n if (parentSpan && parentSpan !== span) {\n parentSpan.setAttribute('http.route', route);\n parentSpan.updateName(name);\n }\n } else {\n span.updateName(`${method} ${srcPage}`);\n }\n });\n };\n const handleResponse = async (currentSpan)=>{\n var _cacheEntry_value;\n const responseGenerator = async ({ previousCacheEntry })=>{\n try {\n if (!isMinimalMode && isOnDemandRevalidate && revalidateOnlyGenerated && !previousCacheEntry) {\n res.statusCode = 404;\n // on-demand revalidate always sets this header\n res.setHeader('x-nextjs-cache', 'REVALIDATED');\n res.end('This page could not be found');\n return null;\n }\n const response = await invokeRouteModule(currentSpan);\n req.fetchMetrics = context.renderOpts.fetchMetrics;\n let pendingWaitUntil = context.renderOpts.pendingWaitUntil;\n // Attempt using provided waitUntil if available\n // if it's not we fallback to sendResponse's handling\n if (pendingWaitUntil) {\n if (ctx.waitUntil) {\n ctx.waitUntil(pendingWaitUntil);\n pendingWaitUntil = undefined;\n }\n }\n const cacheTags = context.renderOpts.collectedTags;\n // If the request is for a static response, we can cache it so long\n // as it's not edge.\n if (isIsr) {\n const blob = await response.blob();\n // Copy the headers from the response.\n const headers = toNodeOutgoingHttpHeaders(response.headers);\n if (cacheTags) {\n headers[NEXT_CACHE_TAGS_HEADER] = cacheTags;\n }\n if (!headers['content-type'] && blob.type) {\n headers['content-type'] = blob.type;\n }\n const revalidate = typeof context.renderOpts.collectedRevalidate === 'undefined' || context.renderOpts.collectedRevalidate >= INFINITE_CACHE ? false : context.renderOpts.collectedRevalidate;\n const expire = typeof context.renderOpts.collectedExpire === 'undefined' || context.renderOpts.collectedExpire >= INFINITE_CACHE ? undefined : context.renderOpts.collectedExpire;\n // Create the cache entry for the response.\n const cacheEntry = {\n value: {\n kind: CachedRouteKind.APP_ROUTE,\n status: response.status,\n body: Buffer.from(await blob.arrayBuffer()),\n headers\n },\n cacheControl: {\n revalidate,\n expire\n }\n };\n return cacheEntry;\n } else {\n // send response without caching if not ISR\n await sendResponse(nodeNextReq, nodeNextRes, response, context.renderOpts.pendingWaitUntil);\n return null;\n }\n } catch (err) {\n // if this is a background revalidate we need to report\n // the request error here as it won't be bubbled\n if (previousCacheEntry == null ? void 0 : previousCacheEntry.isStale) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: srcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n throw err;\n }\n };\n const cacheEntry = await routeModule.handleResponse({\n req,\n nextConfig,\n cacheKey,\n routeKind: RouteKind.APP_ROUTE,\n isFallback: false,\n prerenderManifest,\n isRoutePPREnabled: false,\n isOnDemandRevalidate,\n revalidateOnlyGenerated,\n responseGenerator,\n waitUntil: ctx.waitUntil,\n isMinimalMode\n });\n // we don't create a cacheEntry for ISR\n if (!isIsr) {\n return null;\n }\n if ((cacheEntry == null ? void 0 : (_cacheEntry_value = cacheEntry.value) == null ? void 0 : _cacheEntry_value.kind) !== CachedRouteKind.APP_ROUTE) {\n var _cacheEntry_value1;\n throw Object.defineProperty(new Error(`Invariant: app-route received invalid cache entry ${cacheEntry == null ? void 0 : (_cacheEntry_value1 = cacheEntry.value) == null ? void 0 : _cacheEntry_value1.kind}`), \"__NEXT_ERROR_CODE\", {\n value: \"E701\",\n enumerable: false,\n configurable: true\n });\n }\n if (!isMinimalMode) {\n res.setHeader('x-nextjs-cache', isOnDemandRevalidate ? 'REVALIDATED' : cacheEntry.isMiss ? 'MISS' : cacheEntry.isStale ? 'STALE' : 'HIT');\n }\n // Draft mode should never be cached\n if (isDraftMode) {\n res.setHeader('Cache-Control', 'private, no-cache, no-store, max-age=0, must-revalidate');\n }\n const headers = fromNodeOutgoingHttpHeaders(cacheEntry.value.headers);\n if (!(isMinimalMode && isIsr)) {\n headers.delete(NEXT_CACHE_TAGS_HEADER);\n }\n // If cache control is already set on the response we don't\n // override it to allow users to customize it via next.config\n if (cacheEntry.cacheControl && !res.getHeader('Cache-Control') && !headers.get('Cache-Control')) {\n headers.set('Cache-Control', getCacheControlHeader(cacheEntry.cacheControl));\n }\n await sendResponse(nodeNextReq, nodeNextRes, // @ts-expect-error - Argument of type 'Buffer<ArrayBufferLike>' is not assignable to parameter of type 'BodyInit | null | undefined'.\n new Response(cacheEntry.value.body, {\n headers,\n status: cacheEntry.value.status || 200\n }));\n return null;\n };\n // TODO: activeSpan code path is for when wrapped by\n // next-server can be removed when this is no longer used\n if (isWrappedByNextServer && activeSpan) {\n await handleResponse(activeSpan);\n } else {\n parentSpan = tracer.getActiveScopeSpan();\n await tracer.withPropagatedContext(req.headers, ()=>tracer.trace(BaseServerSpan.handleRequest, {\n spanName: `${method} ${srcPage}`,\n kind: SpanKind.SERVER,\n attributes: {\n 'http.method': method,\n 'http.target': req.url\n }\n }, handleResponse), undefined, !isWrappedByNextServer);\n }\n } catch (err) {\n if (!(err instanceof NoFallbackError)) {\n const silenceLog = false;\n await routeModule.onRequestError(req, err, {\n routerKind: 'App Router',\n routePath: normalizedSrcPage,\n routeType: 'route',\n revalidateReason: getRevalidateReason({\n isStaticGeneration,\n isOnDemandRevalidate\n })\n }, silenceLog, routerServerContext);\n }\n // rethrow so that we can handle serving error page\n // If this is during static generation, throw the error again.\n if (isIsr) throw err;\n // Otherwise, send a 500 response.\n await sendResponse(nodeNextReq, nodeNextRes, new Response(null, {\n status: 500\n }));\n return null;\n }\n}\n\n//# sourceMappingURL=app-route.js.map\n","import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport crypto from \"node:crypto\";\nimport net from \"node:net\";\nimport readline from \"node:readline\";\nimport type { EventHub } from \"./eventHub\";\nimport type { SessionLogStore } from \"./logStore\";\nimport type { JsonRpcNotification, JsonRpcResponse, JsonValue, ServerStatus } from \"./types\";\n\ninterface PendingRequest {\n method: string;\n resolve: (value: JsonValue | undefined) => void;\n reject: (error: Error) => void;\n timer: NodeJS.Timeout;\n}\n\nexport interface ClientRequest {\n id: string | number;\n method: string;\n params: JsonValue;\n receivedAt: number;\n}\n\ninterface AppServerConnection {\n readonly pid: number | null;\n close(): Promise<void>;\n isWritable(): boolean;\n write(message: Record<string, unknown>): void;\n}\n\nexport interface CodexBridgeConfig {\n command: string;\n cwd: string;\n model: string;\n reasoningEffort: string;\n fastMode: boolean;\n appServerSocketPath: string;\n}\n\nexport class CodexBridge {\n private connection: AppServerConnection | null = null;\n private nextId = 1;\n private readonly pending = new Map<string, PendingRequest>();\n private readonly clientRequests = new Map<string, ClientRequest>();\n private startPromise: Promise<void> | null = null;\n private readonly stderrLines: { at: number; line: string }[] = [];\n private status: ServerStatus;\n\n constructor(\n private readonly config: CodexBridgeConfig,\n private readonly hub: EventHub,\n private readonly logs: SessionLogStore\n ) {\n this.status = {\n state: \"stopped\",\n command: config.command,\n cwd: config.cwd,\n pid: null,\n startedAt: null,\n exitedAt: null,\n exitCode: null,\n signal: null,\n error: null\n };\n }\n\n summary(): Record<string, unknown> {\n return {\n ...this.status,\n stderr: [...this.stderrLines],\n config: this.config\n };\n }\n\n async start(): Promise<void> {\n if (this.connection && this.status.state === \"running\") {\n return;\n }\n if (this.startPromise) {\n return this.startPromise;\n }\n this.startPromise = this.startFresh();\n try {\n await this.startPromise;\n } finally {\n this.startPromise = null;\n }\n }\n\n async restart(): Promise<void> {\n await this.stop();\n await this.start();\n }\n\n async stop(): Promise<void> {\n if (!this.connection) {\n return;\n }\n await this.connection.close();\n }\n\n async request(method: string, params: JsonValue = {}, options: { skipStart?: boolean; timeoutMs?: number } = {}): Promise<JsonValue | undefined> {\n try {\n return await this.requestOnce(method, params, options);\n } catch (error) {\n if (options.skipStart || !isRecoverableConnectionError(error)) {\n throw error;\n }\n this.connection = null;\n await delay(350);\n return this.requestOnce(method, params, options);\n }\n }\n\n private async requestOnce(method: string, params: JsonValue = {}, options: { skipStart?: boolean; timeoutMs?: number } = {}): Promise<JsonValue | undefined> {\n if (!options.skipStart) {\n await this.start();\n }\n if (!this.connection?.isWritable()) {\n throw new Error(\"codex app-server is not running\");\n }\n\n const id = this.nextId++;\n const timeoutMs = options.timeoutMs ?? 120_000;\n const message = { id, method, params };\n void this.logs.recordRpcRequest(method, id, params);\n\n return new Promise<JsonValue | undefined>((resolve, reject) => {\n const timer = setTimeout(() => {\n this.pending.delete(String(id));\n reject(new Error(`JSON-RPC request timed out: ${method}`));\n }, timeoutMs);\n this.pending.set(String(id), { method, resolve, reject, timer });\n try {\n this.write(message);\n } catch (error) {\n clearTimeout(timer);\n this.pending.delete(String(id));\n reject(error instanceof Error ? error : new Error(String(error)));\n }\n });\n }\n\n notify(method: string, params?: JsonValue): void {\n this.write(params === undefined ? { method } : { method, params });\n }\n\n pendingClientRequests(): ClientRequest[] {\n return [...this.clientRequests.values()].sort((a, b) => a.receivedAt - b.receivedAt);\n }\n\n respondClientRequest(id: string | number, result: JsonValue): void {\n const key = String(id);\n const request = this.clientRequests.get(key);\n if (!request) {\n throw new Error(\"Client request is not pending\");\n }\n this.clientRequests.delete(key);\n this.write({\n jsonrpc: \"2.0\",\n id: request.id,\n result\n });\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, result });\n }\n\n private async startFresh(): Promise<void> {\n this.setStatus({\n state: \"starting\",\n pid: null,\n startedAt: new Date().toISOString(),\n exitedAt: null,\n exitCode: null,\n signal: null,\n error: null\n });\n\n try {\n const connection = this.config.appServerSocketPath\n ? await this.connectUnixSocketAppServer()\n : this.spawnOwnedAppServer();\n this.connection = connection;\n this.setStatus({ state: \"starting\", pid: connection.pid });\n\n await this.request(\n \"initialize\",\n {\n clientInfo: { name: \"codex-web-ui\", version: \"0.1.0\" },\n capabilities: { experimentalApi: true }\n },\n { skipStart: true, timeoutMs: 30_000 }\n );\n this.notify(\"initialized\");\n this.setStatus({ state: \"running\" });\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n this.connection = null;\n this.setStatus({ state: \"error\", pid: null, error: err.message });\n throw err;\n }\n }\n\n private spawnOwnedAppServer(): AppServerConnection {\n const proc = spawn(this.config.command, [\"app-server\", ...this.configArgs(), \"--listen\", \"stdio://\"], {\n cwd: this.config.cwd,\n env: process.env,\n stdio: [\"pipe\", \"pipe\", \"pipe\"]\n });\n\n proc.once(\"error\", (error) => this.handleConnectionError(error));\n proc.once(\"exit\", (code, signal) => this.handleConnectionExit(\n code === 0 ? null : `codex app-server exited with code ${code ?? \"unknown\"}`,\n code,\n signal as NodeJS.Signals | null\n ));\n readline.createInterface({ input: proc.stdout }).on(\"line\", (line) => this.handleMessageText(line));\n readline.createInterface({ input: proc.stderr }).on(\"line\", (line) => this.handleStderr(line));\n\n return {\n pid: proc.pid ?? null,\n close: async () => {\n if (proc.exitCode !== null || proc.killed) {\n return;\n }\n proc.kill(\"SIGTERM\");\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n if (proc.exitCode === null && !proc.killed) {\n proc.kill(\"SIGKILL\");\n }\n resolve();\n }, 5_000);\n proc.once(\"exit\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n },\n isWritable: () => proc.stdin.writable,\n write: (message: Record<string, unknown>) => {\n proc.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n };\n }\n\n private async connectUnixSocketAppServer(): Promise<AppServerConnection> {\n return UnixWebSocketConnection.connect({\n path: this.config.appServerSocketPath,\n onClose: () => this.handleConnectionExit(\"codex app-server socket closed\", null, null),\n onError: (error) => this.handleConnectionError(error),\n onMessage: (text) => this.handleMessageText(text)\n });\n }\n\n private configArgs(): string[] {\n const args: string[] = [];\n if (this.config.model) {\n args.push(\"-c\", `model=\"${this.config.model}\"`);\n }\n if (this.config.reasoningEffort) {\n args.push(\"-c\", `model_reasoning_effort=\"${this.config.reasoningEffort}\"`);\n }\n if (!this.config.fastMode) {\n args.push(\"--disable\", \"fast_mode\");\n }\n return args;\n }\n\n private write(message: Record<string, unknown>): void {\n if (!this.connection?.isWritable()) {\n throw new Error(\"codex app-server connection is unavailable\");\n }\n this.connection.write(message);\n }\n\n private handleMessageText(line: string): void {\n let parsed: unknown;\n try {\n parsed = JSON.parse(line);\n } catch {\n void this.logs.append({ type: \"stdout\", payload: line });\n this.hub.broadcast(\"stdout\", { line });\n return;\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n this.hub.broadcast(\"json\", parsed);\n return;\n }\n\n const message = parsed as JsonRpcResponse & JsonRpcNotification;\n if (Object.prototype.hasOwnProperty.call(message, \"id\")) {\n const id = String(message.id);\n const pending = this.pending.get(id);\n if (pending) {\n clearTimeout(pending.timer);\n this.pending.delete(id);\n void this.logs.recordRpcResponse(pending.method, message.id, message.result, message.error as JsonValue | undefined);\n this.hub.broadcast(\"rpc-response\", { method: pending.method, id: message.id, ok: !message.error });\n if (message.error) {\n const error = new Error(message.error.message);\n (error as Error & { data?: unknown }).data = message.error;\n pending.reject(error);\n } else {\n pending.resolve(message.result);\n }\n return;\n }\n\n if (message.method) {\n const request = {\n id: message.id as string | number,\n method: message.method,\n params: (message.params ?? {}) as JsonValue,\n receivedAt: Date.now()\n };\n this.clientRequests.set(String(message.id), request);\n void this.logs.append({ type: \"client-request\", id: message.id, method: message.method, payload: message.params });\n this.hub.broadcast(\"client-request\", request);\n return;\n }\n }\n\n if (message.method) {\n void this.logs.recordNotification(message.method, message.params);\n this.hub.broadcast(\"notification\", message);\n return;\n }\n\n this.hub.broadcast(\"json\", message);\n }\n\n private handleStderr(line: string): void {\n const item = { at: Date.now(), line };\n this.stderrLines.push(item);\n if (this.stderrLines.length > 150) {\n this.stderrLines.splice(0, this.stderrLines.length - 150);\n }\n void this.logs.append({ type: \"stderr\", payload: line });\n this.hub.broadcast(\"stderr\", item);\n }\n\n private rejectPending(error: Error): void {\n for (const pending of this.pending.values()) {\n clearTimeout(pending.timer);\n pending.reject(error);\n }\n this.pending.clear();\n }\n\n private setStatus(patch: Partial<ServerStatus>): void {\n this.status = { ...this.status, ...patch };\n this.hub.broadcast(\"server-status\", this.summary());\n void this.logs.append({ type: \"server\", payload: this.summary() as JsonValue });\n }\n\n private handleConnectionError(error: Error): void {\n this.connection = null;\n this.setStatus({ state: \"error\", error: error.message });\n this.rejectPending(error);\n for (const request of this.clientRequests.values()) {\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, error: error.message });\n }\n this.clientRequests.clear();\n }\n\n private handleConnectionExit(error: string | null, code: number | null, signal: NodeJS.Signals | null): void {\n this.setStatus({\n state: \"exited\",\n pid: null,\n exitedAt: new Date().toISOString(),\n exitCode: code,\n signal,\n error\n });\n this.connection = null;\n this.rejectPending(new Error(error ?? \"codex app-server exited\"));\n for (const request of this.clientRequests.values()) {\n this.hub.broadcast(\"client-request-resolved\", { id: request.id, method: request.method, error: error ?? \"codex app-server exited\" });\n }\n this.clientRequests.clear();\n }\n}\n\nfunction isRecoverableConnectionError(error: unknown): boolean {\n const message = error instanceof Error ? error.message : String(error);\n return /\\b(ENOENT|ECONNREFUSED|EPIPE|socket closed|connection is unavailable|app-server is not running)\\b/i.test(message);\n}\n\nfunction delay(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nclass UnixWebSocketConnection implements AppServerConnection {\n readonly pid = null;\n private closed = false;\n private closeSent = false;\n private buffer = Buffer.alloc(0);\n private fragmentedText = \"\";\n\n private constructor(\n private readonly socket: net.Socket,\n private readonly handlers: {\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (text: string) => void;\n }\n ) {}\n\n static connect(options: {\n path: string;\n onClose: () => void;\n onError: (error: Error) => void;\n onMessage: (text: string) => void;\n }): Promise<UnixWebSocketConnection> {\n return new Promise((resolve, reject) => {\n const socket = net.createConnection(options.path);\n const key = crypto.randomBytes(16).toString(\"base64\");\n const expectedAccept = crypto\n .createHash(\"sha1\")\n .update(`${key}258EAFA5-E914-47DA-95CA-C5AB0DC85B11`)\n .digest(\"base64\");\n let handshakeBuffer = Buffer.alloc(0);\n let settled = false;\n let connection: UnixWebSocketConnection | null = null;\n\n const fail = (error: Error) => {\n if (!settled) {\n settled = true;\n socket.destroy();\n reject(error);\n return;\n }\n options.onError(error);\n };\n\n socket.once(\"connect\", () => {\n socket.write([\n \"GET / HTTP/1.1\",\n \"Host: localhost\",\n \"Upgrade: websocket\",\n \"Connection: Upgrade\",\n `Sec-WebSocket-Key: ${key}`,\n \"Sec-WebSocket-Version: 13\",\n \"\",\n \"\"\n ].join(\"\\r\\n\"));\n });\n\n socket.on(\"data\", (chunk) => {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n if (settled) {\n connection?.receive(buffer);\n return;\n }\n handshakeBuffer = Buffer.concat([handshakeBuffer, buffer]);\n const headerEnd = handshakeBuffer.indexOf(\"\\r\\n\\r\\n\");\n if (headerEnd === -1) {\n return;\n }\n const headerText = handshakeBuffer.subarray(0, headerEnd).toString(\"utf8\");\n const headers = parseHttpHeaders(headerText);\n if (!headerText.startsWith(\"HTTP/1.1 101\") || headers[\"sec-websocket-accept\"] !== expectedAccept) {\n fail(new Error(\"Codex app-server Unix socket did not accept WebSocket upgrade\"));\n return;\n }\n settled = true;\n connection = new UnixWebSocketConnection(socket, options);\n resolve(connection);\n const remaining = handshakeBuffer.subarray(headerEnd + 4);\n if (remaining.length > 0) {\n connection.receive(remaining);\n }\n });\n\n socket.once(\"error\", fail);\n socket.once(\"close\", () => {\n if (!settled) {\n fail(new Error(\"Codex app-server Unix socket closed before WebSocket upgrade\"));\n return;\n }\n connection?.markClosed();\n });\n });\n }\n\n async close(): Promise<void> {\n if (this.closed) {\n return;\n }\n this.sendFrame(0x8, Buffer.alloc(0));\n this.closeSent = true;\n await new Promise<void>((resolve) => {\n const timer = setTimeout(() => {\n this.socket.destroy();\n resolve();\n }, 1_000);\n this.socket.once(\"close\", () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n isWritable(): boolean {\n return !this.closed && this.socket.writable;\n }\n\n write(message: Record<string, unknown>): void {\n this.sendFrame(0x1, Buffer.from(JSON.stringify(message), \"utf8\"));\n }\n\n private receive(chunk: Buffer): void {\n this.buffer = Buffer.concat([this.buffer, chunk]);\n this.parseFrames();\n }\n\n private parseFrames(): void {\n while (this.buffer.length >= 2) {\n const first = this.buffer[0];\n const second = this.buffer[1];\n const fin = Boolean(first & 0x80);\n const opcode = first & 0x0f;\n const masked = Boolean(second & 0x80);\n let length = second & 0x7f;\n let offset = 2;\n\n if (length === 126) {\n if (this.buffer.length < 4) return;\n length = this.buffer.readUInt16BE(2);\n offset = 4;\n } else if (length === 127) {\n if (this.buffer.length < 10) return;\n const bigLength = this.buffer.readBigUInt64BE(2);\n if (bigLength > BigInt(Number.MAX_SAFE_INTEGER)) {\n this.handlers.onError(new Error(\"Codex app-server WebSocket frame is too large\"));\n this.socket.destroy();\n return;\n }\n length = Number(bigLength);\n offset = 10;\n }\n\n let mask: Buffer | null = null;\n if (masked) {\n if (this.buffer.length < offset + 4) return;\n mask = this.buffer.subarray(offset, offset + 4);\n offset += 4;\n }\n if (this.buffer.length < offset + length) return;\n\n let payload = this.buffer.subarray(offset, offset + length);\n this.buffer = this.buffer.subarray(offset + length);\n if (mask) {\n const unmasked = Buffer.alloc(payload.length);\n for (let index = 0; index < payload.length; index += 1) {\n unmasked[index] = payload[index] ^ mask[index % 4];\n }\n payload = unmasked;\n }\n\n if (opcode === 0x8) {\n if (!this.closeSent) {\n this.sendFrame(0x8, Buffer.alloc(0));\n }\n this.socket.end();\n continue;\n }\n if (opcode === 0x9) {\n this.sendFrame(0xA, payload);\n continue;\n }\n if (opcode === 0xA) {\n continue;\n }\n if (opcode !== 0x1 && opcode !== 0x0) {\n continue;\n }\n\n this.fragmentedText += payload.toString(\"utf8\");\n if (fin) {\n const text = this.fragmentedText;\n this.fragmentedText = \"\";\n this.handlers.onMessage(text);\n }\n }\n }\n\n private sendFrame(opcode: number, payload: Buffer): void {\n const header = makeClientFrameHeader(opcode, payload.length);\n const mask = crypto.randomBytes(4);\n const maskedPayload = Buffer.alloc(payload.length);\n for (let index = 0; index < payload.length; index += 1) {\n maskedPayload[index] = payload[index] ^ mask[index % 4];\n }\n this.socket.write(Buffer.concat([header, mask, maskedPayload]));\n }\n\n private markClosed(): void {\n if (this.closed) {\n return;\n }\n this.closed = true;\n this.handlers.onClose();\n }\n}\n\nfunction makeClientFrameHeader(opcode: number, length: number): Buffer {\n if (length < 126) {\n return Buffer.from([0x80 | opcode, 0x80 | length]);\n }\n if (length < 65_536) {\n const header = Buffer.alloc(4);\n header[0] = 0x80 | opcode;\n header[1] = 0x80 | 126;\n header.writeUInt16BE(length, 2);\n return header;\n }\n const header = Buffer.alloc(10);\n header[0] = 0x80 | opcode;\n header[1] = 0x80 | 127;\n header.writeBigUInt64BE(BigInt(length), 2);\n return header;\n}\n\nfunction parseHttpHeaders(headerText: string): Record<string, string> {\n const headers: Record<string, string> = {};\n for (const line of headerText.split(\"\\r\\n\").slice(1)) {\n const separator = line.indexOf(\":\");\n if (separator === -1) {\n continue;\n }\n headers[line.slice(0, separator).trim().toLowerCase()] = line.slice(separator + 1).trim();\n }\n return headers;\n}\n","import { handleApiRequest } from \"@/server/appApi\";\n\nexport const runtime = \"nodejs\";\nexport const dynamic = \"force-dynamic\";\nexport const fetchCache = \"force-no-store\";\nexport const revalidate = 0;\n\nexport function GET(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function HEAD(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function POST(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function DELETE(request: Request) {\n return handleApiRequest(request);\n}\n\nexport function OPTIONS(request: Request) {\n return handleApiRequest(request);\n}\n","import crypto from \"node:crypto\";\nimport { getPermissionPolicy, type PermissionPolicy } from \"./permissions\";\n\nconst AUTH_MODE: AuthMode = \"password\";\nconst AUTH_TOKEN_TTL_MS = 4 * 60 * 60 * 1000;\nconst AUTH_TOKEN_ISSUER = \"codex-web-ui\";\nconst PASSWORD = process.env.CODEX_WEB_UI_PASSWORD || \"\";\nconst AUTH_TOKEN_SECRET = process.env.CODEX_WEB_UI_AUTH_SECRET || PASSWORD;\nconst AUTH_WARNING = !PASSWORD ? \"Set CODEX_WEB_UI_PASSWORD before exposing this server.\" : null;\nconst AUTH_USER: AuthUser = { id: \"password\", email: null, name: \"Password user\", role: \"admin\" };\nconst UNAUTHENTICATED_AUTH_STATE = {\n authenticated: false,\n mode: AUTH_MODE,\n warning: AUTH_WARNING,\n user: null,\n tokenExpiresAt: null,\n get permissionPolicy() {\n return getPermissionPolicy();\n }\n};\n\nexport type AuthMode = \"password\";\nexport type AuthUser = { id: string; email: string | null; name: string | null; role: string };\nexport type AppSession = { expiresAt: number; mode: AuthMode; user: AuthUser | null };\nexport type AuthState = {\n authenticated: boolean;\n mode: AuthMode;\n warning: string | null;\n user: AuthUser | null;\n tokenExpiresAt: number | null;\n permissionPolicy: PermissionPolicy;\n};\ntype JwtClaims = { iss: string; sub: string; role: string; iat: number; exp: number };\n\nexport function isAuthenticated(request: Request): boolean {\n return Boolean(currentSession(request));\n}\n\nexport function currentSession(request: Request): AppSession | null {\n const token = getBearerToken(request);\n if (!token) {\n return null;\n }\n const claims = verifyAuthToken(token);\n if (!claims) {\n return null;\n }\n return { expiresAt: claims.exp * 1000, mode: AUTH_MODE, user: { ...AUTH_USER, role: claims.role || AUTH_USER.role } };\n}\n\nexport function authState(request: Request): AuthState {\n const session = currentSession(request);\n return session ? authStateFromSession(session) : UNAUTHENTICATED_AUTH_STATE;\n}\n\nexport function loginWithPassword(password: unknown): AuthState & { token: string; expiresAt: number } {\n if (!safePasswordEquals(typeof password === \"string\" ? password : \"\")) {\n throw httpError(401, \"Invalid password\");\n }\n const { token, expiresAt } = createAuthToken(AUTH_USER);\n return { token, expiresAt, ...authStateFromSession({ expiresAt, mode: AUTH_MODE, user: AUTH_USER }) };\n}\n\nexport function authMode(): AuthMode {\n return AUTH_MODE;\n}\n\nexport function authWarning(): string | null {\n return AUTH_WARNING;\n}\n\nfunction authStateFromSession(session: AppSession): AuthState {\n return {\n authenticated: true,\n mode: session.mode,\n warning: AUTH_WARNING,\n user: session.user,\n tokenExpiresAt: session.expiresAt,\n permissionPolicy: getPermissionPolicy()\n };\n}\n\nfunction getBearerToken(request: Request): string {\n const header = request.headers.get(\"authorization\") || \"\";\n const match = /^Bearer\\s+(.+)$/i.exec(header.trim());\n return match?.[1]?.trim() || \"\";\n}\n\nfunction createAuthToken(user: AuthUser): { token: string; expiresAt: number } {\n if (!AUTH_TOKEN_SECRET) {\n throw httpError(500, \"CODEX_WEB_UI_PASSWORD is required before login is available.\");\n }\n const nowSeconds = Math.floor(Date.now() / 1000);\n const expiresAtSeconds = nowSeconds + Math.floor(AUTH_TOKEN_TTL_MS / 1000);\n const claims: JwtClaims = {\n iss: AUTH_TOKEN_ISSUER,\n sub: user.id,\n role: user.role,\n iat: nowSeconds,\n exp: expiresAtSeconds\n };\n return {\n token: signJwt(claims),\n expiresAt: expiresAtSeconds * 1000\n };\n}\n\nfunction signJwt(claims: JwtClaims): string {\n const header = base64UrlJson({ alg: \"HS256\", typ: \"JWT\" });\n const payload = base64UrlJson(claims);\n const signature = hmacBase64Url(`${header}.${payload}`);\n return `${header}.${payload}.${signature}`;\n}\n\nfunction verifyAuthToken(token: string): JwtClaims | null {\n if (!AUTH_TOKEN_SECRET) {\n return null;\n }\n const parts = token.split(\".\");\n if (parts.length !== 3) {\n return null;\n }\n const [header, payload, signature] = parts;\n if (!timingSafeStringEquals(signature, hmacBase64Url(`${header}.${payload}`))) {\n return null;\n }\n const parsedHeader = parseJwtPart(header);\n const claims = parseJwtPart(payload);\n if (parsedHeader.alg !== \"HS256\" || parsedHeader.typ !== \"JWT\") {\n return null;\n }\n const exp = numberValue(claims.exp);\n if (claims.iss !== AUTH_TOKEN_ISSUER || claims.sub !== AUTH_USER.id || !exp || Date.now() >= exp * 1000) {\n return null;\n }\n return {\n iss: AUTH_TOKEN_ISSUER,\n sub: AUTH_USER.id,\n role: typeof claims.role === \"string\" ? claims.role : AUTH_USER.role,\n iat: numberValue(claims.iat) ?? 0,\n exp\n };\n}\n\nfunction base64UrlJson(value: unknown): string {\n return Buffer.from(JSON.stringify(value), \"utf8\").toString(\"base64url\");\n}\n\nfunction parseJwtPart(value: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(Buffer.from(value, \"base64url\").toString(\"utf8\"));\n return parsed && typeof parsed === \"object\" && !Array.isArray(parsed) ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\nfunction hmacBase64Url(value: string): string {\n return crypto.createHmac(\"sha256\", AUTH_TOKEN_SECRET).update(value).digest(\"base64url\");\n}\n\nfunction timingSafeStringEquals(left: string, right: string): boolean {\n const leftBuffer = Buffer.from(left);\n const rightBuffer = Buffer.from(right);\n return leftBuffer.length === rightBuffer.length && crypto.timingSafeEqual(leftBuffer, rightBuffer);\n}\n\nfunction safePasswordEquals(value: string): boolean {\n if (!PASSWORD) {\n return false;\n }\n return timingSafeStringEquals(value, PASSWORD);\n}\n\nfunction numberValue(value: unknown): number | null {\n const numeric = typeof value === \"number\" ? value : typeof value === \"string\" ? Number(value) : NaN;\n return Number.isFinite(numeric) ? numeric : null;\n}\n\nfunction httpError(statusCode: number, message: string): Error & { statusCode: number } {\n return Object.assign(new Error(message), { statusCode });\n}\n","import { existsSync } from \"node:fs\";\nimport { appendFile, mkdir, readFile, unlink, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport type { JsonValue, LogEntry, SessionIndexRecord, ThreadRecord } from \"./types\";\n\nexport class SessionLogStore {\n readonly rootDir: string;\n readonly sessionsDir: string;\n readonly globalLogPath: string;\n readonly indexPath: string;\n\n private index: Map<string, SessionIndexRecord> | null = null;\n private indexQueue: Promise<void> = Promise.resolve();\n\n constructor(rootDir: string) {\n this.rootDir = rootDir;\n this.sessionsDir = path.join(rootDir, \"sessions\");\n this.globalLogPath = path.join(rootDir, \"server.jsonl\");\n this.indexPath = path.join(rootDir, \"sessions.json\");\n }\n\n async ensure(): Promise<void> {\n await mkdir(this.sessionsDir, { recursive: true });\n await this.loadIndex();\n }\n\n async append(entry: Omit<LogEntry, \"at\">): Promise<void> {\n const fullEntry: LogEntry = { at: new Date().toISOString(), ...entry };\n await this.ensure();\n await appendFile(this.globalLogPath, `${JSON.stringify(fullEntry)}\\n`, \"utf8\");\n const threadIds = extractThreadIds(fullEntry);\n for (const threadId of threadIds) {\n await appendFile(this.threadLogPath(threadId), `${JSON.stringify({ ...fullEntry, threadId })}\\n`, \"utf8\");\n }\n }\n\n async recordRpcRequest(method: string, id: string | number, params: JsonValue | undefined): Promise<void> {\n await this.append({\n type: \"rpc-request\",\n id,\n method,\n payload: jsonOrNull({ threadIds: threadIdsFromJson(params), params: summarizeRpcPayload(params) })\n });\n }\n\n async recordRpcResponse(\n method: string,\n id: string | number,\n result: JsonValue | undefined,\n error: JsonValue | undefined\n ): Promise<void> {\n if (result !== undefined) {\n await this.recordThreadsFromResult(result);\n }\n await this.append({\n type: \"rpc-response\",\n id,\n method,\n payload: jsonOrNull({ threadIds: threadIdsFromJson(result), result: summarizeRpcPayload(result), error })\n });\n }\n\n async recordNotification(method: string, params: JsonValue | undefined): Promise<void> {\n if (params && typeof params === \"object\" && !Array.isArray(params)) {\n const thread = (params as Record<string, JsonValue>).thread;\n if (isThreadRecord(thread)) {\n await this.recordThread(thread);\n }\n }\n await this.append({ type: \"notification\", method, payload: jsonOrNull({ params }) });\n }\n\n async recordThreadsFromResult(result: JsonValue): Promise<void> {\n if (!result || typeof result !== \"object\" || Array.isArray(result)) {\n return;\n }\n const record = result as Record<string, JsonValue>;\n if (isThreadRecord(record.thread)) {\n await this.recordThread(record.thread);\n }\n if (Array.isArray(record.data)) {\n for (const item of record.data) {\n if (isThreadRecord(item)) {\n await this.recordThread(item);\n }\n }\n }\n }\n\n async recordThread(thread: ThreadRecord): Promise<void> {\n await this.ensure();\n const index = await this.loadIndex();\n const previous = index.get(thread.id);\n const record: SessionIndexRecord = {\n id: thread.id,\n name: typeof thread.name === \"string\" ? thread.name : previous?.name ?? null,\n preview: typeof thread.preview === \"string\" ? thread.preview : previous?.preview ?? \"\",\n cwd: typeof thread.cwd === \"string\" ? thread.cwd : previous?.cwd ?? \"\",\n sessionId: typeof thread.sessionId === \"string\" ? thread.sessionId : previous?.sessionId ?? \"\",\n createdAt: typeof thread.createdAt === \"number\" ? thread.createdAt : previous?.createdAt ?? null,\n updatedAt: typeof thread.updatedAt === \"number\" ? thread.updatedAt : previous?.updatedAt ?? null,\n status: thread.status ?? previous?.status ?? null,\n logPath: this.threadLogPath(thread.id),\n lastLoggedAt: new Date().toISOString()\n };\n index.set(thread.id, record);\n if (!existsSync(this.threadLogPath(thread.id))) {\n const entry: LogEntry = {\n at: new Date().toISOString(),\n type: \"server\",\n threadId: thread.id,\n method: \"thread/indexed\",\n payload: JSON.parse(JSON.stringify({ thread: record })) as JsonValue\n };\n await appendFile(this.threadLogPath(thread.id), `${JSON.stringify(entry)}\\n`, \"utf8\");\n }\n await this.saveIndexQueued();\n }\n\n async deleteThreadLog(threadId: string): Promise<boolean> {\n await this.ensure();\n const index = await this.loadIndex();\n index.delete(threadId);\n await this.saveIndexQueued();\n const filePath = this.threadLogPath(threadId);\n if (!existsSync(filePath)) {\n return false;\n }\n await unlink(filePath);\n return true;\n }\n\n threadLogPath(threadId: string): string {\n return path.join(this.sessionsDir, `${safeFileName(threadId)}.jsonl`);\n }\n\n private async loadIndex(): Promise<Map<string, SessionIndexRecord>> {\n if (this.index) {\n return this.index;\n }\n await mkdir(this.sessionsDir, { recursive: true });\n if (!existsSync(this.indexPath)) {\n this.index = new Map();\n return this.index;\n }\n const raw = await readFile(this.indexPath, \"utf8\");\n const parsed = JSON.parse(raw || \"{}\") as Record<string, SessionIndexRecord>;\n this.index = new Map(Object.entries(parsed));\n return this.index;\n }\n\n private async saveIndexQueued(): Promise<void> {\n this.indexQueue = this.indexQueue.then(async () => {\n if (!this.index) {\n return;\n }\n const payload = Object.fromEntries([...this.index.entries()]);\n await writeFile(this.indexPath, `${JSON.stringify(payload, null, 2)}\\n`, \"utf8\");\n });\n await this.indexQueue;\n }\n}\n\nfunction extractThreadIds(entry: LogEntry): string[] {\n const ids = new Set<string>();\n const payload = entry.payload;\n if (entry.threadId) {\n ids.add(entry.threadId);\n }\n if (payload && typeof payload === \"object\" && !Array.isArray(payload)) {\n const record = payload as Record<string, JsonValue>;\n if (Array.isArray(record.threadIds)) {\n for (const id of record.threadIds) {\n if (typeof id === \"string\") {\n ids.add(id);\n }\n }\n }\n collectThreadIds(record.params, ids);\n collectThreadIds(record.result, ids);\n }\n return [...ids];\n}\n\nfunction threadIdsFromJson(value: JsonValue | undefined): string[] {\n const ids = new Set<string>();\n collectThreadIdsDeep(value, ids, 0);\n return [...ids];\n}\n\nfunction collectThreadIdsDeep(value: JsonValue | undefined, ids: Set<string>, depth: number): void {\n if (!value || typeof value !== \"object\" || depth > 8) {\n return;\n }\n if (Array.isArray(value)) {\n for (const item of value) {\n collectThreadIdsDeep(item, ids, depth + 1);\n }\n return;\n }\n const record = value as Record<string, JsonValue>;\n if (typeof record.threadId === \"string\") {\n ids.add(record.threadId);\n }\n if (isThreadRecord(record.thread)) {\n ids.add(record.thread.id);\n }\n for (const nested of Object.values(record)) {\n collectThreadIdsDeep(nested, ids, depth + 1);\n }\n}\n\nfunction summarizeRpcPayload(value: JsonValue | undefined): JsonValue {\n if (value === undefined) {\n return null;\n }\n if (!value || typeof value !== \"object\") {\n return value;\n }\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n length: value.length,\n sample: summarizeArraySample(value)\n };\n }\n const record = value as Record<string, JsonValue>;\n if (isThreadRecord(record.thread)) {\n return {\n type: \"object\",\n keys: Object.keys(record),\n thread: summarizeThreadRecord(record.thread)\n };\n }\n if (Array.isArray(record.data)) {\n return {\n type: \"object\",\n keys: Object.keys(record),\n data: {\n type: \"array\",\n length: record.data.length,\n sample: summarizeArraySample(record.data)\n }\n };\n }\n return {\n type: \"object\",\n keys: Object.keys(record).slice(0, 30),\n threadId: typeof record.threadId === \"string\" ? record.threadId : null\n };\n}\n\nfunction summarizeArraySample(items: JsonValue[]): JsonValue[] {\n return items.slice(0, 5).map((item) => {\n if (isThreadRecord(item)) {\n return summarizeThreadRecord(item);\n }\n if (!item || typeof item !== \"object\") {\n return item;\n }\n if (Array.isArray(item)) {\n return { type: \"array\", length: item.length };\n }\n return { type: \"object\", keys: Object.keys(item).slice(0, 20) };\n });\n}\n\nfunction summarizeThreadRecord(thread: ThreadRecord): JsonValue {\n return {\n id: thread.id,\n name: typeof thread.name === \"string\" ? thread.name : null,\n preview: typeof thread.preview === \"string\" ? thread.preview : \"\",\n cwd: typeof thread.cwd === \"string\" ? thread.cwd : \"\",\n sessionId: typeof thread.sessionId === \"string\" ? thread.sessionId : \"\",\n createdAt: typeof thread.createdAt === \"number\" ? thread.createdAt : null,\n updatedAt: typeof thread.updatedAt === \"number\" ? thread.updatedAt : null,\n status: thread.status ?? null,\n turnCount: Array.isArray(thread.turns) ? thread.turns.length : null\n };\n}\n\nfunction collectThreadIds(value: JsonValue | undefined, ids: Set<string>): void {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return;\n }\n const record = value as Record<string, JsonValue>;\n if (typeof record.threadId === \"string\") {\n ids.add(record.threadId);\n }\n if (isThreadRecord(record.thread)) {\n ids.add(record.thread.id);\n }\n if (Array.isArray(record.data)) {\n for (const item of record.data) {\n if (isThreadRecord(item)) {\n ids.add(item.id);\n }\n }\n }\n}\n\nfunction isThreadRecord(value: unknown): value is ThreadRecord {\n return Boolean(value && typeof value === \"object\" && !Array.isArray(value) && typeof (value as { id?: unknown }).id === \"string\");\n}\n\nfunction safeFileName(value: string): string {\n return value.replace(/[^a-zA-Z0-9._-]/g, \"_\");\n}\n\nfunction jsonOrNull(value: unknown): JsonValue {\n return JSON.parse(JSON.stringify(value ?? null)) as JsonValue;\n}\n","import { mkdir, readFile, writeFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { homeDir } from \"./runtime\";\n\nexport interface McpServerInput {\n name: string;\n url: string;\n}\n\nexport function codexConfigPath(): string {\n if (process.env.CODEX_CONFIG_PATH) {\n return path.resolve(process.env.CODEX_CONFIG_PATH);\n }\n return path.join(process.env.CODEX_HOME || path.join(homeDir, \".codex\"), \"config.toml\");\n}\n\nexport async function saveMcpServerConfig(input: McpServerInput): Promise<{ configPath: string }> {\n const name = validateServerName(input.name);\n const url = validateServerUrl(input.url);\n const configPath = codexConfigPath();\n const existing = await readFile(configPath, \"utf8\").catch((error: NodeJS.ErrnoException) => {\n if (error.code === \"ENOENT\") {\n return \"\";\n }\n throw error;\n });\n const { text } = removeMcpServerBlock(existing, name);\n const nextBlock = [\n `[mcp_servers.${name}]`,\n `url = \"${tomlStringValue(url)}\"`\n ].join(\"\\n\");\n const nextText = `${text.trimEnd()}${text.trimEnd() ? \"\\n\\n\" : \"\"}${nextBlock}\\n`;\n await mkdir(path.dirname(configPath), { recursive: true });\n await writeFile(configPath, nextText, \"utf8\");\n return { configPath };\n}\n\nfunction validateServerName(value: unknown): string {\n const name = typeof value === \"string\" ? value.trim() : \"\";\n if (!/^[A-Za-z0-9_-]{1,80}$/.test(name)) {\n throw new Error(\"MCP server name must be 1-80 letters, numbers, dashes, or underscores\");\n }\n return name;\n}\n\nfunction validateServerUrl(value: unknown): string {\n const raw = typeof value === \"string\" ? value.trim() : \"\";\n let parsed: URL;\n try {\n parsed = new URL(raw);\n } catch {\n throw new Error(\"Enter a valid MCP server URL\");\n }\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"MCP server URL must use http or https\");\n }\n if (parsed.username || parsed.password) {\n throw new Error(\"Put MCP credentials in the bearer token field, not the URL\");\n }\n if (parsed.protocol === \"http:\" && !isLocalHost(parsed.hostname)) {\n throw new Error(\"Plain HTTP MCP servers must be localhost or loopback\");\n }\n return parsed.toString();\n}\n\nfunction isLocalHost(hostname: string): boolean {\n const value = hostname.toLowerCase().replace(/^\\[|\\]$/g, \"\");\n return value === \"localhost\" || value === \"0.0.0.0\" || value === \"::1\" || value.startsWith(\"127.\");\n}\n\nfunction removeMcpServerBlock(text: string, name: string): { text: string; block: string | null } {\n const lines = text.split(/\\r?\\n/);\n const kept: string[] = [];\n const removed: string[] = [];\n let removing = false;\n for (const line of lines) {\n if (isTableHeader(line)) {\n removing = tableName(line) === `mcp_servers.${name}`;\n }\n if (removing) {\n removed.push(line);\n } else {\n kept.push(line);\n }\n }\n return { text: kept.join(\"\\n\"), block: removed.length ? removed.join(\"\\n\") : null };\n}\n\nfunction isTableHeader(line: string): boolean {\n return /^\\s*\\[[^\\]]+\\]\\s*$/.test(line);\n}\n\nfunction tableName(line: string): string {\n return line.trim().replace(/^\\[|\\]$/g, \"\").replace(/\"([^\"]+)\"/g, \"$1\");\n}\n\nfunction tomlStringValue(value: string): string {\n return value.replace(/\\\\/g, \"\\\\\\\\\").replace(/\"/g, '\\\\\"');\n}\n","import type { JsonValue } from \"./types\";\n\nexport type ApprovalPolicy = \"on-request\" | \"untrusted\" | \"on-failure\" | \"never\";\nexport type SandboxMode = \"read-only\" | \"workspace-write\" | \"danger-full-access\";\n\nexport interface PermissionPolicy {\n defaultApprovalPolicy: ApprovalPolicy;\n defaultSandbox: SandboxMode;\n locked: boolean;\n unsafePermissions: boolean;\n allowedApprovalPolicies: ApprovalPolicy[];\n allowedSandboxes: SandboxMode[];\n}\n\nconst safeApprovalPolicies: ApprovalPolicy[] = [\"on-request\", \"untrusted\"];\nconst unsafeApprovalPolicies: ApprovalPolicy[] = [\"on-request\", \"untrusted\", \"on-failure\", \"never\"];\nconst safeSandboxes: SandboxMode[] = [\"read-only\", \"workspace-write\"];\nconst unsafeSandboxes: SandboxMode[] = [\"read-only\", \"workspace-write\", \"danger-full-access\"];\n\nexport function getPermissionPolicy(): PermissionPolicy {\n const unsafePermissions = booleanEnv(\"CODEX_WEB_UI_UNSAFE_PERMISSIONS\", false);\n const allowedApprovalPolicies = unsafePermissions ? unsafeApprovalPolicies : safeApprovalPolicies;\n const allowedSandboxes = unsafePermissions ? unsafeSandboxes : safeSandboxes;\n const defaultApprovalPolicy = approvalPolicyFor(process.env.CODEX_WEB_UI_APPROVAL_POLICY) ?? \"on-request\";\n const defaultSandbox = sandboxFor(process.env.CODEX_WEB_UI_SANDBOX) ?? \"workspace-write\";\n\n if (!allowedApprovalPolicies.includes(defaultApprovalPolicy)) {\n throw httpError(500, `Configured approval policy requires unsafe permissions: ${defaultApprovalPolicy}`);\n }\n if (!allowedSandboxes.includes(defaultSandbox)) {\n throw httpError(500, `Configured sandbox requires unsafe permissions: ${defaultSandbox}`);\n }\n\n return {\n defaultApprovalPolicy,\n defaultSandbox,\n locked: booleanEnv(\"CODEX_WEB_UI_LOCK_PERMISSIONS\", false),\n unsafePermissions,\n allowedApprovalPolicies,\n allowedSandboxes\n };\n}\n\nexport function enforceRpcPermissions(method: string, params: JsonValue): JsonValue {\n if (!params || typeof params !== \"object\" || Array.isArray(params)) {\n return params;\n }\n if (!usesPermissions(method)) {\n return params;\n }\n\n const policy = getPermissionPolicy();\n const next: Record<string, JsonValue> = { ...(params as Record<string, JsonValue>) };\n const requestedApprovalPolicy = approvalPolicyFor(next.approvalPolicy);\n const requestedSandbox = sandboxFor(next.sandbox) ?? sandboxFor(next.sandboxPolicy);\n\n const approvalPolicy = policy.locked\n ? policy.defaultApprovalPolicy\n : validateApprovalPolicy(requestedApprovalPolicy ?? policy.defaultApprovalPolicy, policy);\n const sandbox = policy.locked\n ? policy.defaultSandbox\n : validateSandbox(requestedSandbox ?? policy.defaultSandbox, policy);\n\n if (method === \"turn/start\" || method === \"thread/start\") {\n next.approvalPolicy = approvalPolicy;\n }\n if (method === \"turn/start\") {\n next.sandboxPolicy = sandboxPolicyFor(sandbox);\n delete next.sandbox;\n } else {\n next.sandbox = sandbox;\n delete next.sandboxPolicy;\n }\n\n return next;\n}\n\nfunction usesPermissions(method: string): boolean {\n return method === \"thread/start\" || method === \"thread/resume\" || method === \"thread/fork\" || method === \"turn/start\";\n}\n\nfunction validateApprovalPolicy(value: ApprovalPolicy, policy: PermissionPolicy): ApprovalPolicy {\n if (!policy.allowedApprovalPolicies.includes(value)) {\n throw httpError(403, `Approval policy requires unsafe permissions: ${value}`);\n }\n return value;\n}\n\nfunction validateSandbox(value: SandboxMode, policy: PermissionPolicy): SandboxMode {\n if (!policy.allowedSandboxes.includes(value)) {\n throw httpError(403, `Sandbox requires --unsafe-permissions: ${value}`);\n }\n return value;\n}\n\nfunction approvalPolicyFor(value: unknown): ApprovalPolicy | null {\n return value === \"on-request\" || value === \"untrusted\" || value === \"on-failure\" || value === \"never\" ? value : null;\n}\n\nfunction sandboxFor(value: unknown): SandboxMode | null {\n if (value === \"read-only\" || value === \"workspace-write\" || value === \"danger-full-access\") {\n return value;\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n return null;\n }\n const record = value as Record<string, unknown>;\n if (record.type === \"readOnly\") return \"read-only\";\n if (record.type === \"workspaceWrite\") return \"workspace-write\";\n if (record.type === \"dangerFullAccess\") return \"danger-full-access\";\n return null;\n}\n\nfunction sandboxPolicyFor(value: SandboxMode): JsonValue {\n if (value === \"danger-full-access\") return { type: \"dangerFullAccess\" };\n if (value === \"read-only\") return { type: \"readOnly\" };\n return { type: \"workspaceWrite\" };\n}\n\nfunction booleanEnv(name: string, fallback: boolean): boolean {\n const value = process.env[name];\n if (value === undefined) {\n return fallback;\n }\n if ([\"1\", \"true\", \"yes\", \"on\"].includes(value.toLowerCase())) return true;\n if ([\"0\", \"false\", \"no\", \"off\"].includes(value.toLowerCase())) return false;\n return fallback;\n}\n\nfunction httpError(statusCode: number, message: string): Error & { statusCode: number } {\n return Object.assign(new Error(message), { statusCode });\n}\n","type SseRequest = import(\"node:http\").IncomingMessage;\ntype SseResponse = import(\"node:http\").ServerResponse;\n\nexport interface ServerEvent {\n type: string;\n payload: unknown;\n at: number;\n}\n\ninterface SseClient {\n close(): void;\n send(eventName: string, payload: unknown): void;\n}\n\nclass RingBuffer<T> {\n private readonly items: T[] = [];\n\n constructor(private readonly limit: number) {}\n\n push(item: T): void {\n this.items.push(item);\n if (this.items.length > this.limit) {\n this.items.splice(0, this.items.length - this.limit);\n }\n }\n\n snapshot(): T[] {\n return [...this.items];\n }\n}\n\nexport class EventHub {\n private readonly clients = new Set<SseClient>();\n private readonly history = new RingBuffer<ServerEvent>(300);\n\n add(req: SseRequest, res: SseResponse): void {\n res.writeHead(200, {\n \"Content-Type\": \"text/event-stream; charset=utf-8\",\n \"Cache-Control\": \"no-cache, no-transform\",\n Connection: \"keep-alive\",\n \"X-Accel-Buffering\": \"no\"\n });\n res.write(\"\\n\");\n const client: SseClient = {\n close: () => undefined,\n send: (eventName, payload) => {\n res.write(`event: ${eventName}\\n`);\n res.write(`data: ${JSON.stringify(payload)}\\n\\n`);\n }\n };\n this.clients.add(client);\n client.send(\"hello\", { serverTime: new Date().toISOString(), history: this.history.snapshot() });\n\n const keepAlive = setInterval(() => {\n if (!res.destroyed) {\n res.write(\": keepalive\\n\\n\");\n }\n }, 25_000);\n\n req.on(\"close\", () => {\n clearInterval(keepAlive);\n this.clients.delete(client);\n });\n }\n\n stream(signal?: AbortSignal): ReadableStream<Uint8Array> {\n const encoder = new TextEncoder();\n let client: SseClient | null = null;\n let keepAlive: NodeJS.Timeout | null = null;\n\n const cleanup = () => {\n if (keepAlive) {\n clearInterval(keepAlive);\n keepAlive = null;\n }\n if (client) {\n this.clients.delete(client);\n client = null;\n }\n };\n\n return new ReadableStream<Uint8Array>({\n start: (controller) => {\n client = {\n close: cleanup,\n send: (eventName, payload) => {\n controller.enqueue(encoder.encode(`event: ${eventName}\\n`));\n controller.enqueue(encoder.encode(`data: ${JSON.stringify(payload)}\\n\\n`));\n }\n };\n this.clients.add(client);\n client.send(\"hello\", { serverTime: new Date().toISOString(), history: this.history.snapshot() });\n keepAlive = setInterval(() => {\n controller.enqueue(encoder.encode(\": keepalive\\n\\n\"));\n }, 25_000);\n signal?.addEventListener(\"abort\", cleanup, { once: true });\n },\n cancel: cleanup\n });\n }\n\n broadcast(type: string, payload: unknown): void {\n const event = { type, payload, at: Date.now() };\n this.history.push(event);\n for (const client of this.clients) {\n client.send(\"message\", event);\n }\n }\n}\n"],"names":["unsafeApprovalPolicies","safeApprovalPolicies","safeSandboxes","unsafeSandboxes","getPermissionPolicy","unsafePermissions","booleanEnv","defaultSandbox","allowedApprovalPolicies","allowedSandboxes","defaultApprovalPolicy","approvalPolicyFor","process","env","CODEX_WEB_UI_APPROVAL_POLICY","sandboxFor","CODEX_WEB_UI_SANDBOX","includes","httpError","isArray","params","locked","sandbox","enforceRpcPermissions","method","Array","usesPermissions","policy","next","requestedApprovalPolicy","approvalPolicy","requestedSandbox","sandboxPolicy","validateApprovalPolicy","validateSandbox","sandboxPolicyFor","value","type","name","fallback","record","undefined","toLowerCase","statusCode","message","Object","assign","Error"],"mappings":"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","ignoreList":[4]}