@codex-app-sdk/backend 0.21.0 → 0.21.2
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.
- package/dist/chunks/{codex-CmHW3ikB.js → codex-qk7I-QSQ.js} +21 -6
- package/dist/chunks/codex-qk7I-QSQ.js.map +1 -0
- package/dist/codex/client.d.ts.map +1 -1
- package/dist/index.js +1067 -988
- package/dist/index.js.map +1 -1
- package/dist/node/codex-surface-catalog-controller.d.ts +5 -0
- package/dist/node/codex-surface-catalog-controller.d.ts.map +1 -1
- package/dist/node/codex-surface-connection-controller.d.ts.map +1 -1
- package/dist/node/codex-surface-contracts.d.ts +1 -4
- package/dist/node/codex-surface-contracts.d.ts.map +1 -1
- package/dist/node/codex-surface-items-controller.d.ts.map +1 -1
- package/dist/node/codex-surface-lifecycle-controller.d.ts.map +1 -1
- package/dist/node/codex-surface-message-state.d.ts +1 -0
- package/dist/node/codex-surface-message-state.d.ts.map +1 -1
- package/dist/node/codex-surface-messages-controller.d.ts +2 -0
- package/dist/node/codex-surface-messages-controller.d.ts.map +1 -1
- package/dist/node/codex-surface-notifications-controller.d.ts.map +1 -1
- package/dist/node/codex-surface.d.ts.map +1 -1
- package/dist/node/conversation-content-transport.d.ts +1 -1
- package/dist/protocol.js +1 -1
- package/package.json +2 -2
- package/dist/chunks/codex-CmHW3ikB.js.map +0 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["SIZE_HEADER","getImageSize"],"sources":["../src/node/codex-executable.ts","../src/node/codex-stdio-transport.ts","../src/node/codex-unix-socket-transport.ts","../src/node/codex-file-attachment.ts","../src/node/tool-output.ts","../src/node/codex-tool-part-adapter.ts","../src/node/codex-surface-prompts.ts","../src/node/codex-surface-message-state.ts","../src/node/codex-conversation-history.ts","../../../node_modules/image-size/dist/esm/types/utils.js","../../../node_modules/image-size/dist/esm/types/bmp.js","../../../node_modules/image-size/dist/esm/types/ico.js","../../../node_modules/image-size/dist/esm/types/cur.js","../../../node_modules/image-size/dist/esm/types/dds.js","../../../node_modules/image-size/dist/esm/types/gif.js","../../../node_modules/image-size/dist/esm/types/heif.js","../../../node_modules/image-size/dist/esm/types/icns.js","../../../node_modules/image-size/dist/esm/types/j2c.js","../../../node_modules/image-size/dist/esm/types/jp2.js","../../../node_modules/image-size/dist/esm/types/jpg.js","../../../node_modules/image-size/dist/esm/utils/bit-reader.js","../../../node_modules/image-size/dist/esm/types/jxl-stream.js","../../../node_modules/image-size/dist/esm/types/jxl.js","../../../node_modules/image-size/dist/esm/types/ktx.js","../../../node_modules/image-size/dist/esm/types/png.js","../../../node_modules/image-size/dist/esm/types/pnm.js","../../../node_modules/image-size/dist/esm/types/psd.js","../../../node_modules/image-size/dist/esm/types/svg.js","../../../node_modules/image-size/dist/esm/types/tga.js","../../../node_modules/image-size/dist/esm/types/tiff.js","../../../node_modules/image-size/dist/esm/types/webp.js","../../../node_modules/image-size/dist/esm/types/index.js","../../../node_modules/image-size/dist/esm/detector.js","../../../node_modules/image-size/dist/esm/lookup.js","../src/node/conversation-content-transport.ts","../src/node/codex-original-history-images.ts","../src/node/codex-surface-usage-controller.ts","../src/node/codex-original-history-usage.ts","../src/node/codex-surface-realtime.ts","../src/node/codex-surface-realtime-session.ts","../src/node/codex-surface-runtime.ts","../src/node/codex-surface-authentication.ts","../src/node/codex-surface-settings.ts","../src/node/codex-surface-data.ts","../src/node/codex-surface-transport-options.ts","../src/node/codex-surface-authentication-controller.ts","../src/node/codex-conversation-handle.ts","../src/node/codex-raw-response-item-adapter.ts","../src/node/codex-surface-events.ts","../src/node/codex-surface-subagents.ts","../src/node/codex-surface-items-controller.ts","../src/node/codex-surface-client-requests-controller.ts","../src/node/codex-surface-catalog.ts","../src/node/codex-surface-catalog-controller.ts","../src/node/codex-approvals.ts","../src/node/codex-surface-approvals-controller.ts","../src/node/codex-surface-mcp.ts","../src/node/codex-surface-extensions-controller.ts","../src/node/codex-surface-conversations-controller.ts","../src/node/codex-surface-conversation-settings-controller.ts","../src/node/codex-surface-turn-actions-controller.ts","../src/node/codex-surface-messages-controller.ts","../src/node/codex-surface-lifecycle-controller.ts","../src/node/codex-surface-notifications-controller.ts","../src/node/codex-surface-runtime-controller.ts","../src/node/codex-surface-connection-controller.ts","../src/node/codex-surface-fork-controller.ts","../src/node/codex-markdown-images.ts","../src/node/codex-surface-prompt-history.ts","../src/node/codex-surface-text-generation-controller.ts","../src/node/codex-surface.ts","../src/node/codex-app-backend-cache.ts","../src/node/codex-app-backend.ts","../src/node/apple-speech-transcription.ts","../src/node/apple-speech-session.ts"],"sourcesContent":["import { execFile as nodeExecFile, execFileSync as nodeExecFileSync } from 'node:child_process';\nimport { existsSync as nodeExistsSync, readFileSync as nodeReadFileSync, readdirSync as nodeReaddirSync } from 'node:fs';\nimport { homedir as nodeHomedir } from 'node:os';\nimport path from 'node:path';\n\ntype ExecFileSync = (\n file: string,\n args: string[],\n options?: { encoding?: BufferEncoding; env?: NodeJS.ProcessEnv; stdio?: 'ignore' | 'pipe'; timeout?: number },\n) => string | Buffer;\n\ntype ExecFile = (\n file: string,\n args: string[],\n options: { encoding: 'utf8'; env: NodeJS.ProcessEnv; timeout: number },\n) => Promise<string>;\n\nexport type CodexExecutableDiscoveryDependencies = {\n env?: NodeJS.ProcessEnv;\n /** Asynchronous login-shell runner used by `resolveCodexRuntime`. */\n execFile?: ExecFile;\n execFileSync?: ExecFileSync;\n existsSync?: (filePath: string) => boolean;\n homedir?: () => string;\n pathDelimiter?: string;\n platform?: NodeJS.Platform;\n readFileSync?: (filePath: string, encoding: BufferEncoding) => string;\n readdirSync?: (dirPath: string) => string[];\n shell?: string;\n /** Upper bound for each login-shell probe. Defaults to 5 seconds. */\n shellTimeoutMs?: number;\n};\n\nexport type CodexRuntime = {\n command: string;\n env: NodeJS.ProcessEnv;\n};\n\nexport type ResolveCodexRuntimeOptions = {\n command?: string;\n env?: NodeJS.ProcessEnv;\n discovery?: CodexExecutableDiscoveryDependencies;\n};\n\ntype ShellProbe = {\n path: string | null;\n nvmNodePath: string | null;\n};\n\nconst DEFAULT_SHELL_TIMEOUT_MS = 5_000;\nconst emptyShellProbe: ShellProbe = { path: null, nvmNodePath: null };\nconst shellProbeCache = new Map<string, Promise<ShellProbe>>();\n\nexport function discoverCodexExecutable(\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): string | null {\n return findExecutable('codex', codexRuntimePathEntries(dependencies), dependencies);\n}\n\nexport function codexRuntimePathEntries(\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): string[] {\n return runtimePathEntries(probeLoginShellSync(dependencies), dependencies);\n}\n\nexport function withCodexRuntimePath(\n env: NodeJS.ProcessEnv | undefined,\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): NodeJS.ProcessEnv {\n const mergedEnv = { ...process.env, ...env };\n return withPathEntries(mergedEnv, codexRuntimePathEntries({ ...dependencies, env: mergedEnv }), dependencies);\n}\n\n/**\n * Resolves the Codex command and child-process environment without blocking\n * the event loop. Login-shell probes run concurrently, are bounded by\n * `shellTimeoutMs`, and are cached per shell, PATH, and home directory for the\n * life of the process, so reconnects do not spawn shells again.\n */\nexport async function resolveCodexRuntime(options: ResolveCodexRuntimeOptions = {}): Promise<CodexRuntime> {\n const env = { ...process.env, ...options.env };\n const dependencies = { ...options.discovery, env };\n const entries = runtimePathEntries(await probeLoginShell(dependencies), dependencies);\n return {\n command: options.command?.trim() || findExecutable('codex', entries, dependencies) || 'codex',\n env: withPathEntries(env, entries, dependencies),\n };\n}\n\nfunction runtimePathEntries(probe: ShellProbe, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n const delimiter = pathDelimiter(dependencies);\n const env = dependencies.env ?? process.env;\n return unique([\n ...bundledApplicationBinaryPaths(dependencies),\n ...pathEntries(env.PATH, delimiter),\n ...pathEntries(probe.path, delimiter),\n ...commonUserBinaryPaths(dependencies),\n ...nvmBinaryPaths(probe, dependencies),\n ]);\n}\n\nfunction withPathEntries(\n env: NodeJS.ProcessEnv,\n entries: string[],\n dependencies: CodexExecutableDiscoveryDependencies,\n): NodeJS.ProcessEnv {\n return { ...env, PATH: entries.join(pathDelimiter(dependencies)) };\n}\n\nfunction bundledApplicationBinaryPaths(dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if ((dependencies.platform ?? process.platform) !== 'darwin') return [];\n return [\n '/Applications/ChatGPT.app/Contents/Resources',\n '/Applications/Codex.app/Contents/Resources',\n ].filter((entry) => executableExists(path.join(entry, 'codex'), dependencies));\n}\n\nfunction findExecutable(\n executable: string,\n entries: string[],\n dependencies: CodexExecutableDiscoveryDependencies,\n): string | null {\n for (const entry of entries) {\n for (const candidate of executableCandidates(executable, dependencies)) {\n const filePath = path.join(entry, candidate);\n if (executableExists(filePath, dependencies)) {\n return filePath;\n }\n }\n }\n return null;\n}\n\nfunction probeLoginShellSync(dependencies: CodexExecutableDiscoveryDependencies): ShellProbe {\n if (isWindows(dependencies)) return emptyShellProbe;\n const run = (args: string[]): string | null => {\n try {\n return (dependencies.execFileSync ?? nodeExecFileSync)(loginShell(dependencies), args, {\n encoding: 'utf8',\n env: dependencies.env ?? process.env,\n stdio: 'pipe',\n timeout: shellTimeoutMs(dependencies),\n }).toString();\n } catch {\n return null;\n }\n };\n return {\n path: run(['-l', '-c', pathCommand(dependencies)]),\n nvmNodePath: run(['-l', '-c', 'nvm which current'])?.trim() || null,\n };\n}\n\nfunction probeLoginShell(dependencies: CodexExecutableDiscoveryDependencies): Promise<ShellProbe> {\n if (isWindows(dependencies)) return Promise.resolve(emptyShellProbe);\n if (dependencies.execFile || dependencies.execFileSync) return runLoginShellProbe(dependencies);\n const env = dependencies.env ?? process.env;\n const key = [loginShell(dependencies), env.PATH ?? '', homeDir(dependencies)].join('\\u0000');\n let probe = shellProbeCache.get(key);\n if (!probe) {\n probe = runLoginShellProbe(dependencies);\n shellProbeCache.set(key, probe);\n }\n return probe;\n}\n\nasync function runLoginShellProbe(dependencies: CodexExecutableDiscoveryDependencies): Promise<ShellProbe> {\n // Hosts that inject only a synchronous runner keep their existing contract.\n if (!dependencies.execFile && dependencies.execFileSync) return probeLoginShellSync(dependencies);\n const run = loginShellRunner(dependencies);\n const [shellPath, nvmNodePath] = await Promise.all([\n run(['-l', '-c', pathCommand(dependencies)]),\n run(['-l', '-c', 'nvm which current']),\n ]);\n return { path: shellPath, nvmNodePath: nvmNodePath?.trim() || null };\n}\n\nfunction loginShellRunner(\n dependencies: CodexExecutableDiscoveryDependencies,\n): (args: string[]) => Promise<string | null> {\n const shell = loginShell(dependencies);\n const env = dependencies.env ?? process.env;\n const timeout = shellTimeoutMs(dependencies);\n if (dependencies.execFile) {\n const execFile = dependencies.execFile;\n return (args) => withTimeout(execFile(shell, args, { encoding: 'utf8', env, timeout }), timeout);\n }\n return (args) => withTimeout(new Promise<string>((resolve, reject) => {\n nodeExecFile(shell, args, { encoding: 'utf8', env, timeout, killSignal: 'SIGKILL' }, (error, stdout) => {\n if (error) reject(error);\n else resolve(stdout);\n });\n }), timeout);\n}\n\n// A login shell can leave a background process holding stdout open after the\n// shell itself is killed, so the probe resolves on its own deadline too.\nfunction withTimeout(promise: Promise<string>, timeoutMs: number): Promise<string | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), timeoutMs + 100);\n timer.unref?.();\n promise.then(\n (value) => { clearTimeout(timer); resolve(String(value)); },\n () => { clearTimeout(timer); resolve(null); },\n );\n });\n}\n\nfunction pathCommand(dependencies: CodexExecutableDiscoveryDependencies): string {\n const shell = loginShell(dependencies);\n return shell.endsWith('/nu') || shell === 'nu' ? 'print $env.PATH' : 'printf \"%s\" \"$PATH\"';\n}\n\nfunction loginShell(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.shell ?? dependencies.env?.SHELL ?? process.env.SHELL ?? '/bin/bash';\n}\n\nfunction shellTimeoutMs(dependencies: CodexExecutableDiscoveryDependencies): number {\n return dependencies.shellTimeoutMs ?? DEFAULT_SHELL_TIMEOUT_MS;\n}\n\nfunction commonUserBinaryPaths(dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (isWindows(dependencies)) {\n return [];\n }\n\n const home = homeDir(dependencies);\n return [\n path.join(home, '.local/bin'),\n path.join(home, 'bin'),\n '/opt/homebrew/bin',\n '/usr/local/bin',\n ].filter((entry) => executableExists(entry, dependencies));\n}\n\nfunction nvmBinaryPaths(probe: ShellProbe, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (isWindows(dependencies)) {\n return [];\n }\n const commandPath = probe.nvmNodePath && executableExists(probe.nvmNodePath, dependencies)\n ? path.dirname(probe.nvmNodePath)\n : null;\n return unique([commandPath, nvmBinaryPathFromFiles(dependencies)]);\n}\n\nfunction nvmBinaryPathFromFiles(dependencies: CodexExecutableDiscoveryDependencies): string | null {\n const home = homeDir(dependencies);\n const aliasPath = path.join(home, '.nvm/alias/default');\n const versionsPath = path.join(home, '.nvm/versions/node');\n if (!executableExists(aliasPath, dependencies) || !executableExists(versionsPath, dependencies)) {\n return null;\n }\n\n try {\n let current = (dependencies.readFileSync ?? nodeReadFileSync)(aliasPath, 'utf8').trim();\n if (!current) {\n return null;\n }\n if (!current.startsWith('v')) {\n current = `v${current}`;\n }\n const best = (dependencies.readdirSync ?? nodeReaddirSync)(versionsPath)\n .filter((version) => version.startsWith(current))\n .sort()\n .at(-1);\n return best ? path.join(versionsPath, best, 'bin') : null;\n } catch {}\n return null;\n}\n\nfunction executableCandidates(executable: string, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (!isWindows(dependencies) || path.extname(executable)) {\n return [executable];\n }\n const pathExt = dependencies.env?.PATHEXT ?? process.env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM';\n return [executable, ...pathExt.split(';').filter(Boolean).map((extension) => `${executable}${extension.toLowerCase()}`)];\n}\n\nfunction isWindows(dependencies: CodexExecutableDiscoveryDependencies): boolean {\n return (dependencies.platform ?? process.platform) === 'win32';\n}\n\nfunction pathEntries(value: string | undefined | null, delimiter: string): string[] {\n return value ? value.split(delimiter).map((entry) => entry.trim()) : [];\n}\n\nfunction unique(entries: Array<string | null | undefined>): string[] {\n return [...new Set(entries.filter((entry): entry is string => Boolean(entry)))];\n}\n\nfunction executableExists(filePath: string, dependencies: CodexExecutableDiscoveryDependencies): boolean {\n return (dependencies.existsSync ?? nodeExistsSync)(filePath);\n}\n\nfunction homeDir(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.homedir?.() ?? dependencies.env?.HOME ?? process.env.HOME ?? nodeHomedir();\n}\n\nfunction pathDelimiter(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.pathDelimiter ?? path.delimiter;\n}\n","import { spawn, type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from 'node:child_process';\nimport { constants as bufferConstants } from 'node:buffer';\nimport { notifyListeners } from '../codex/listener-errors';\nimport { RpcTransportProtocolError, type RpcMessage, type RpcTransport } from '../codex/wire';\nimport {\n resolveCodexRuntime,\n type CodexExecutableDiscoveryDependencies,\n} from './codex-executable';\n\nexport type CodexAppServerExit = {\n code: number | null;\n signal: NodeJS.Signals | null;\n stderr: string;\n};\n\nexport type CodexAppServerStdioTransportOptions = {\n command?: string;\n configOverrides?: string[];\n codexHome?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n executableDiscovery?: CodexExecutableDiscoveryDependencies;\n onExit?: (exit: CodexAppServerExit) => void;\n onStderr?: (text: string) => void;\n spawnProcess?: typeof spawn;\n shutdownTimeoutMs?: number;\n maxDiagnosticBufferChars?: number;\n maxOutputLineChars?: number;\n};\n\nconst DEFAULT_DIAGNOSTIC_BUFFER_CHARS = 64 * 1024;\nconst DEFAULT_CONFIG_OVERRIDES = ['features.default_mode_request_user_input=true'];\nconst DEFAULT_OUTPUT_LINE_CHARS = Math.min(\n 256 * 1024 * 1024,\n Math.floor(bufferConstants.MAX_STRING_LENGTH / 2),\n);\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 12_000;\n\nexport class CodexAppServerStdioTransport implements RpcTransport {\n private child: ChildProcessWithoutNullStreams | null = null;\n private readonly expectedExits = new WeakSet<ChildProcessWithoutNullStreams>();\n private readonly messageListeners = new Set<(message: unknown) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n\n private starting: Promise<void> | null = null;\n private generation = 0;\n\n constructor(private readonly options: CodexAppServerStdioTransportOptions = {}) {}\n\n start(): Promise<void> {\n if (this.child) {\n return Promise.resolve();\n }\n this.starting ??= this.spawnAppServer().finally(() => { this.starting = null; });\n return this.starting;\n }\n\n private async spawnAppServer(): Promise<void> {\n const generation = this.generation;\n const { command, env } = await resolveCodexRuntime({\n command: this.options.command,\n env: this.options.env,\n discovery: this.options.executableDiscovery,\n });\n if (generation !== this.generation) {\n throw new Error('Codex app-server transport was closed while starting');\n }\n const configArgs = [\n ...DEFAULT_CONFIG_OVERRIDES,\n ...(this.options.configOverrides ?? []),\n ].flatMap((override) => ['-c', override]);\n const args = [...configArgs, 'app-server', '--listen', 'stdio://'];\n const processEnv = {\n ...env,\n ...(this.options.codexHome ? { CODEX_HOME: this.options.codexHome } : {}),\n };\n const spawnOptions: SpawnOptionsWithoutStdio = {\n ...(this.options.cwd ? { cwd: this.options.cwd } : {}),\n env: processEnv,\n stdio: 'pipe',\n };\n const child = (this.options.spawnProcess ?? spawn)(command, args, spawnOptions);\n this.child = child;\n let stdoutBuffer = '';\n let discardingOversizedLine = false;\n let stderrBuffer = '';\n const maxDiagnosticBufferChars = Math.max(1, this.options.maxDiagnosticBufferChars ?? DEFAULT_DIAGNOSTIC_BUFFER_CHARS);\n const maxOutputLineChars = Math.max(1, this.options.maxOutputLineChars ?? DEFAULT_OUTPUT_LINE_CHARS);\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string | Buffer) => {\n let text = chunk.toString();\n if (discardingOversizedLine) {\n const discardedLineEnd = text.indexOf('\\n');\n if (discardedLineEnd < 0) return;\n discardingOversizedLine = false;\n text = text.slice(discardedLineEnd + 1);\n }\n stdoutBuffer += text;\n let newlineIndex = stdoutBuffer.indexOf('\\n');\n while (newlineIndex >= 0) {\n const line = stdoutBuffer.slice(0, newlineIndex).trim();\n stdoutBuffer = stdoutBuffer.slice(newlineIndex + 1);\n newlineIndex = stdoutBuffer.indexOf('\\n');\n if (line) {\n if (line.length > maxOutputLineChars) {\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server output line exceeded the configured limit',\n { requestId: rpcResponseIdFromPrefix(line) },\n ));\n } else {\n this.parseLine(line);\n }\n }\n }\n if (stdoutBuffer.length > maxOutputLineChars) {\n const requestId = rpcResponseIdFromPrefix(stdoutBuffer);\n stdoutBuffer = '';\n discardingOversizedLine = true;\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server output line exceeded the configured limit',\n { requestId },\n ));\n }\n });\n child.stderr.on('data', (chunk: string | Buffer) => {\n const text = chunk.toString();\n stderrBuffer = appendBounded(stderrBuffer, text, maxDiagnosticBufferChars);\n this.options.onStderr?.(text);\n });\n child.stdin.on('error', (error) => {\n if (this.child !== child || this.expectedExits.has(child)) return;\n this.child = null;\n this.expectedExits.add(child);\n child.kill();\n this.emitError(error);\n });\n child.once('error', (error) => {\n if (this.child === child) {\n this.child = null;\n }\n if (!this.expectedExits.has(child)) {\n this.expectedExits.add(child);\n this.emitError(error);\n }\n });\n child.once('exit', (code, signal) => {\n if (this.child === child) {\n this.child = null;\n }\n const exit = { code, signal, stderr: stderrBuffer.trim() };\n this.options.onExit?.(exit);\n if (!this.expectedExits.has(child)) {\n const status = code ?? signal ?? 'unknown';\n const detail = exit.stderr ? `: ${exit.stderr}` : '';\n this.emitError(new Error(`Codex app-server exited (${status})${detail}`));\n }\n });\n }\n\n send(message: RpcMessage): void {\n if (!this.child) {\n throw new Error('Codex app-server transport is not started');\n }\n this.child.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async close(): Promise<void> {\n this.generation += 1;\n const child = this.child;\n this.child = null;\n if (!child) {\n return;\n }\n this.expectedExits.add(child);\n const shutdownTimeoutMs = this.options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n const gracefulExit = waitForExit(child, shutdownTimeoutMs);\n // Stdio app-server shuts its threads down on EOF. SIGTERM bypasses that\n // path and can lose the tail of a rollout that has not been flushed yet.\n child.stdin.end();\n if (await gracefulExit) return;\n\n const signalTimeoutMs = Math.min(shutdownTimeoutMs, 1_000);\n const terminatedExit = waitForExit(child, signalTimeoutMs);\n child.kill();\n if (await terminatedExit) return;\n\n const forcedExit = waitForExit(child, signalTimeoutMs);\n child.kill('SIGKILL');\n if (!await forcedExit) {\n throw new Error('Codex app-server did not exit after SIGKILL');\n }\n }\n\n onMessage(listener: (message: unknown) => void): () => void {\n this.messageListeners.add(listener);\n return () => this.messageListeners.delete(listener);\n }\n\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n private parseLine(line: string): void {\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch (error) {\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server sent malformed JSON',\n { cause: error },\n ));\n return;\n }\n // Only a parse failure is a protocol error; a throwing subscriber must\n // neither masquerade as one nor fail every request in flight.\n notifyListeners(this.messageListeners, message);\n }\n\n private emitError(error: Error): void {\n for (const listener of this.errorListeners) {\n listener(error);\n }\n }\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n return (current + chunk).slice(-limit);\n}\n\nfunction rpcResponseIdFromPrefix(frame: string): string | number | undefined {\n const match = /^\\s*\\{\\s*\"id\"\\s*:\\s*(?:(-?\\d+)|(\"(?:\\\\.|[^\"\\\\])*\"))/.exec(frame);\n if (!match) return undefined;\n if (match[1] !== undefined) {\n const id = Number(match[1]);\n return Number.isSafeInteger(id) ? id : undefined;\n }\n try {\n return JSON.parse(match[2] as string) as string;\n } catch {}\n return undefined;\n}\n\nfunction waitForExit(child: ChildProcessWithoutNullStreams, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve(true);\n return new Promise((resolve) => {\n const onExit = (): void => {\n clearTimeout(timeout);\n resolve(true);\n };\n const timeout = setTimeout(() => {\n child.off('exit', onExit);\n resolve(false);\n }, Math.max(0, timeoutMs));\n child.once('exit', onExit);\n });\n}\n","import { randomBytes } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createConnection, type Socket } from 'node:net';\nimport { notifyListeners } from '../codex/listener-errors';\nimport { RpcTransportProtocolError, type RpcMessage, type RpcTransport } from '../codex/wire';\n\nconst DEFAULT_MAX_FRAME_BYTES = 64 * 1024 * 1024;\n\nexport type CodexAppServerUnixSocketTransportOptions = {\n /** Discriminates this opt-in transport from the default spawned stdio transport. */\n type: 'unixSocket';\n /** Absolute path to an app-server control socket. */\n socketPath?: string;\n /** Used to derive the default control socket when socketPath is omitted. */\n codexHome?: string;\n maxFrameBytes?: number;\n};\n\n/**\n * Connects to an already-running Codex app-server listening on a Unix socket.\n * It never owns, starts, or stops the remote server.\n */\nexport class CodexAppServerUnixSocketTransport implements RpcTransport {\n private socket: Socket | null = null;\n private readonly messageListeners = new Set<(message: unknown) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n private handshakeBuffer = Buffer.alloc(0);\n private frameBuffer = Buffer.alloc(0);\n private fragments: Buffer[] = [];\n private fragmentOpcode: number | null = null;\n private started = false;\n private closed = false;\n\n constructor(private readonly options: CodexAppServerUnixSocketTransportOptions) {}\n\n async start(): Promise<void> {\n if (this.started) return;\n this.closed = false;\n const socket = createConnection(this.socketPath());\n this.socket = socket;\n await new Promise<void>((resolve, reject) => {\n const fail = (error: Error): void => {\n cleanup();\n this.socket = null;\n socket.destroy();\n reject(error);\n };\n const onConnect = (): void => {\n socket.write(websocketHandshakeRequest());\n };\n const onData = (chunk: Buffer): void => {\n this.handshakeBuffer = Buffer.concat([this.handshakeBuffer, chunk]);\n const boundary = this.handshakeBuffer.indexOf('\\r\\n\\r\\n');\n if (boundary < 0) return;\n const header = this.handshakeBuffer.subarray(0, boundary).toString('utf8');\n const remainder = this.handshakeBuffer.subarray(boundary + 4);\n this.handshakeBuffer = Buffer.alloc(0);\n if (!/^HTTP\\/1\\.1 101(?: |$)/m.test(header)) {\n fail(new Error(`Codex app-server rejected Unix socket WebSocket upgrade: ${header.split('\\r\\n', 1)[0]}`));\n return;\n }\n cleanup();\n socket.on('data', (data: Buffer) => this.handleFrameData(data));\n socket.on('error', (error) => this.handleSocketError(error));\n socket.on('close', () => this.handleSocketClose());\n this.started = true;\n this.handleFrameData(remainder);\n resolve();\n };\n const cleanup = (): void => {\n socket.off('connect', onConnect);\n socket.off('data', onData);\n socket.off('error', fail);\n socket.off('close', onClose);\n };\n const onClose = (): void => fail(new Error('Codex app-server closed the Unix socket during WebSocket upgrade'));\n socket.once('connect', onConnect);\n socket.on('data', onData);\n socket.once('error', fail);\n socket.once('close', onClose);\n });\n }\n\n send(message: RpcMessage): void {\n if (!this.socket || !this.started) throw new Error('Codex app-server Unix socket transport is not started');\n this.writeFrame(0x1, Buffer.from(JSON.stringify(message)), this.socket);\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.started = false;\n const socket = this.socket;\n this.socket = null;\n if (!socket) return;\n if (!socket.destroyed) {\n try {\n this.writeFrame(0x8, Buffer.alloc(0), socket);\n } finally {\n socket.end();\n }\n }\n }\n\n onMessage(listener: (message: unknown) => void): () => void {\n this.messageListeners.add(listener);\n return () => this.messageListeners.delete(listener);\n }\n\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n private socketPath(): string {\n const explicit = this.options.socketPath?.trim();\n if (explicit) return explicit;\n const home = this.options.codexHome?.trim() || process.env.CODEX_HOME?.trim() || join(homedir(), '.codex');\n return join(home, 'app-server-control', 'app-server-control.sock');\n }\n\n private handleFrameData(chunk: Buffer): void {\n this.frameBuffer = Buffer.concat([this.frameBuffer, chunk]);\n try {\n while (true) {\n const frame = readFrame(this.frameBuffer, this.options.maxFrameBytes ?? DEFAULT_MAX_FRAME_BYTES);\n if (!frame) return;\n this.frameBuffer = this.frameBuffer.subarray(frame.bytesRead);\n this.handleFrame(frame.fin, frame.opcode, frame.payload);\n }\n } catch (error) {\n this.frameBuffer = Buffer.alloc(0);\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n private handleFrame(fin: boolean, opcode: number, payload: Buffer): void {\n if (opcode === 0x8) {\n void this.close();\n return;\n }\n if (opcode === 0x9) {\n if (this.socket && !this.socket.destroyed) this.writeFrame(0xA, payload, this.socket);\n return;\n }\n if (opcode === 0xA) return;\n if (opcode === 0x0) {\n if (this.fragmentOpcode === null) return this.emitError(new RpcTransportProtocolError('Codex app-server sent an unexpected WebSocket continuation frame'));\n this.fragments.push(payload);\n if (!fin) return;\n const initialOpcode = this.fragmentOpcode;\n const complete = Buffer.concat(this.fragments);\n this.fragments = [];\n this.fragmentOpcode = null;\n return this.handleFrame(true, initialOpcode, complete);\n }\n if (opcode !== 0x1 || this.fragmentOpcode !== null) {\n return this.emitError(new RpcTransportProtocolError(`Codex app-server sent unsupported WebSocket opcode ${opcode}`));\n }\n if (!fin) {\n this.fragmentOpcode = opcode;\n this.fragments = [payload];\n return;\n }\n let message: unknown;\n try {\n message = JSON.parse(payload.toString('utf8'));\n } catch (error) {\n this.emitError(new RpcTransportProtocolError('Codex app-server sent malformed JSON', { cause: error }));\n return;\n }\n // A throwing subscriber is not a protocol error and must not fail the connection.\n notifyListeners(this.messageListeners, message);\n }\n\n private writeFrame(opcode: number, payload: Buffer, target: Socket): void {\n target.write(encodeClientFrame(opcode, payload));\n }\n\n private handleSocketError(error: Error): void {\n if (!this.closed) this.emitError(error);\n }\n\n private handleSocketClose(): void {\n this.started = false;\n this.socket = null;\n if (!this.closed) this.emitError(new Error('Codex app-server Unix socket connection closed'));\n }\n\n private emitError(error: Error): void {\n for (const listener of this.errorListeners) listener(error);\n }\n}\n\nfunction websocketHandshakeRequest(): string {\n const key = randomBytes(16).toString('base64');\n return [\n 'GET /rpc 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\nfunction encodeClientFrame(opcode: number, payload: Buffer): Buffer {\n const mask = randomBytes(4);\n const header = frameHeader(opcode, payload.length, true);\n const masked = Buffer.from(payload);\n for (let index = 0; index < masked.length; index += 1) masked[index] = (masked[index] ?? 0) ^ (mask[index % 4] ?? 0);\n return Buffer.concat([header, mask, masked]);\n}\n\nfunction frameHeader(opcode: number, length: number, masked: boolean): Buffer {\n const maskBit = masked ? 0x80 : 0;\n if (length < 126) return Buffer.from([0x80 | opcode, maskBit | length]);\n if (length <= 0xffff) {\n const header = Buffer.alloc(4);\n header[0] = 0x80 | opcode;\n header[1] = maskBit | 126;\n header.writeUInt16BE(length, 2);\n return header;\n }\n const header = Buffer.alloc(10);\n header[0] = 0x80 | opcode;\n header[1] = maskBit | 127;\n header.writeBigUInt64BE(BigInt(length), 2);\n return header;\n}\n\nfunction readFrame(buffer: Buffer, maxFrameBytes: number): { fin: boolean; opcode: number; payload: Buffer; bytesRead: number } | null {\n if (buffer.length < 2) return null;\n const firstByte = buffer[0] ?? 0;\n const secondByte = buffer[1] ?? 0;\n const fin = (firstByte & 0x80) !== 0;\n const opcode = firstByte & 0x0f;\n const masked = (secondByte & 0x80) !== 0;\n let length = secondByte & 0x7f;\n let offset = 2;\n if (length === 126) {\n if (buffer.length < offset + 2) return null;\n length = buffer.readUInt16BE(offset);\n offset += 2;\n } else if (length === 127) {\n if (buffer.length < offset + 8) return null;\n const longLength = buffer.readBigUInt64BE(offset);\n if (longLength > BigInt(Number.MAX_SAFE_INTEGER)) throw new RpcTransportProtocolError('Codex app-server sent an oversized WebSocket frame');\n length = Number(longLength);\n offset += 8;\n }\n if (length > maxFrameBytes) throw new RpcTransportProtocolError('Codex app-server WebSocket frame exceeded the configured limit');\n const maskLength = masked ? 4 : 0;\n if (buffer.length < offset + maskLength + length) return null;\n const mask = masked ? buffer.subarray(offset, offset + 4) : undefined;\n offset += maskLength;\n const payload = Buffer.from(buffer.subarray(offset, offset + length));\n if (mask) for (let index = 0; index < payload.length; index += 1) payload[index] = (payload[index] ?? 0) ^ (mask[index % 4] ?? 0);\n return { fin, opcode, payload, bytesRead: offset + length };\n}\n","import type { v2 } from '../codex';\n\nconst prefix = '<attached_file>\\n';\nconst suffix = '\\n</attached_file>';\n\n// Generic mentions are not forwarded to the model by app-server. Keep file\n// references in text, with an exact envelope we can restore as a history chip.\nexport function fileAttachmentInput(name: string, path: string): v2.UserInput {\n const reference = JSON.stringify({ name, path }).replaceAll('<', '\\\\u003c');\n return { type: 'text', text: `${prefix}${reference}${suffix}`, text_elements: [] };\n}\n\nexport function fileAttachmentReference(text: string): { name: string; path: string } | null {\n if (!text.startsWith(prefix) || !text.endsWith(suffix)) return null;\n try {\n const value: unknown = JSON.parse(text.slice(prefix.length, -suffix.length));\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null;\n const reference = value as Record<string, unknown>;\n return typeof reference.name === 'string' && typeof reference.path === 'string' && reference.path.length > 0\n ? { name: reference.name, path: reference.path }\n : null;\n } catch {\n return null;\n }\n}\n","const structuredToolResultNotice = 'Result returned in structuredContent.';\n\nexport function toolOutputText(output: unknown): string | undefined {\n if (typeof output === 'string') {\n return output;\n }\n\n if (Array.isArray(output)) {\n return output\n .map((entry) => toolOutputText(entry))\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n }\n\n if (!isRecord(output)) {\n return JSON.stringify(output);\n }\n\n const structuredText = 'structuredContent' in output ? toolOutputText(output.structuredContent) : undefined;\n if (structuredText) {\n const contentText = toolOutputContentText(output);\n if (!contentText || contentText.trim() === structuredToolResultNotice) {\n return structuredText;\n }\n\n return `${contentText}\\n\\n${structuredText}`;\n }\n\n return toolOutputContentText(output) ?? JSON.stringify(output);\n}\n\nfunction toolOutputContentText(output: Record<string, unknown>): string | undefined {\n if (typeof output.text === 'string') {\n return output.text;\n }\n\n if (typeof output.content === 'string') {\n return output.content;\n }\n\n if (Array.isArray(output.content)) {\n return toolOutputText(output.content);\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","import { isAbsolute, resolve } from 'node:path';\nimport type {\n CodexSurfaceFileActivityAction,\n CodexSurfaceFileActivityStatus,\n SurfaceMessageToolPart as RendererToolPart,\n SurfaceMessageToolPartUpdate as RendererToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport { toolOutputText } from './tool-output';\n\nconst structuredToolResultNotice = 'Result returned in structuredContent.';\nconst MAX_TOOL_PAYLOAD_BYTES = 32 * 1024;\n\nexport type CodexToolPartAdapterOptions = {\n includeCommandOutput?: boolean;\n cwd?: string | null;\n};\n\nexport type CodexFileActivity = {\n action: CodexSurfaceFileActivityAction;\n path: string;\n status: CodexSurfaceFileActivityStatus;\n};\n\nexport function codexToolPartFileActivities(\n toolPart: RendererToolPart,\n cwd?: string | null,\n): CodexFileActivity[] {\n const status = toolPart.status;\n if (toolPart.kind === 'command') {\n const input = isRecord(toolPart.input) ? toolPart.input : {};\n const commandCwd = typeof input.cwd === 'string' ? input.cwd : cwd ?? undefined;\n const actions = normalizedCommandActions(input.commandActions);\n return actions.flatMap((action) => {\n if (action.type !== 'read') return [];\n const path = fullFilePath(action.path ?? action.name, commandCwd);\n return path ? [{ action: 'read' as const, path, status }] : [];\n });\n }\n\n if (toolPart.kind !== 'fileChange') return [];\n const input = isRecord(toolPart.input) ? toolPart.input : {};\n const metadata = toolPart.metadata ?? {};\n const changes = Array.isArray(metadata.changes)\n ? metadata.changes\n : Array.isArray(input.changes) ? input.changes : [];\n return changes.flatMap((change) => {\n if (!isRecord(change) || typeof change.path !== 'string') return [];\n const kind = patchChangeKind(change.kind);\n if (kind === 'delete') return [];\n const path = fullFilePath(change.path, cwd ?? undefined);\n return path ? [{ action: kind === 'add' ? 'create' as const : 'edit' as const, path, status }] : [];\n });\n}\n\nexport function codexThreadItemToToolPart(item: unknown, options: CodexToolPartAdapterOptions = {}): RendererToolPart | null {\n if (!isRecord(item) || typeof item.id !== 'string') {\n return null;\n }\n\n if (item.type === 'commandExecution') {\n const command = typeof item.command === 'string' ? item.command : 'command';\n const status = rendererToolStatus(item.status);\n const statusText = commandStatusText(status, item.commandActions, command);\n const body = options.includeCommandOutput && typeof item.aggregatedOutput === 'string' ? item.aggregatedOutput : undefined;\n return {\n type: 'tool',\n id: item.id,\n kind: 'command',\n title: command,\n status,\n ...(statusText ? { statusText } : {}),\n ...(body !== undefined ? { body } : {}),\n input: {\n command,\n cwd: typeof item.cwd === 'string' ? item.cwd : undefined,\n commandActions: item.commandActions,\n },\n output: {\n exitCode: typeof item.exitCode === 'number' ? item.exitCode : undefined,\n durationMs: typeof item.durationMs === 'number' ? item.durationMs : undefined,\n },\n metadata: {\n source: item.source,\n processId: item.processId,\n },\n };\n }\n\n if (item.type === 'mcpToolCall') {\n const server = typeof item.server === 'string' ? item.server : 'mcp';\n const tool = typeof item.tool === 'string' ? item.tool : 'tool';\n const errorMessage = boundedToolText(mcpErrorMessage(item.error));\n const input = boundedToolPayload(item.arguments);\n const output = boundedToolPayload(item.result);\n return {\n type: 'tool',\n id: item.id,\n kind: 'mcp',\n title: `${server}.${tool}`,\n status: rendererToolStatus(item.status),\n body: errorMessage ?? boundedToolText(mcpResultText(output)),\n ...(input !== undefined ? { input } : {}),\n ...(output !== undefined ? { output } : {}),\n metadata: {\n server,\n tool,\n pluginId: item.pluginId,\n mcpAppResourceUri: item.mcpAppResourceUri,\n durationMs: item.durationMs,\n },\n };\n }\n\n if (item.type === 'dynamicToolCall') {\n const tool = typeof item.tool === 'string' ? item.tool : 'tool';\n const namespace = typeof item.namespace === 'string' ? item.namespace : null;\n const input = boundedToolPayload(item.arguments);\n const output = boundedToolPayload(item.contentItems);\n return {\n type: 'tool',\n id: item.id,\n kind: 'dynamic',\n title: namespace ? `${namespace}.${tool}` : tool,\n status: rendererToolStatus(item.status),\n body: boundedToolText(dynamicToolContentText(output)),\n ...(input !== undefined ? { input } : {}),\n ...(output !== undefined ? { output } : {}),\n metadata: {\n namespace,\n tool,\n success: item.success,\n durationMs: item.durationMs,\n },\n };\n }\n\n if (item.type === 'fileChange') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const status = rendererToolStatus(item.status);\n const statusText = fileChangeStatusText(status, changes);\n return {\n type: 'tool',\n id: item.id,\n kind: 'fileChange',\n title: changes.length === 1 ? '1 file change' : `${changes.length} file changes`,\n status,\n ...(statusText ? { statusText } : {}),\n body: fileChangesText(changes),\n input: { changes },\n metadata: {\n changes,\n ...(typeof item.cwd === 'string' ? { cwd: item.cwd } : options.cwd ? { cwd: options.cwd } : {}),\n },\n };\n }\n\n if (item.type === 'webSearch') {\n const query = typeof item.query === 'string' && item.query.trim() ? item.query.trim() : 'web search';\n return {\n type: 'tool',\n id: item.id,\n kind: 'webSearch',\n title: 'Web search',\n status: 'completed',\n body: query,\n input: item.action ?? { query },\n metadata: {\n query,\n action: item.action,\n },\n };\n }\n\n if (item.type === 'imageView' && typeof item.path === 'string') {\n return { type: 'tool', id: item.id, kind: 'dynamic', title: 'view_image',\n status: 'completed', input: { path: item.path } };\n }\n\n if (item.type === 'imageGeneration') {\n return {\n type: 'tool',\n id: item.id,\n kind: 'dynamic',\n title: 'image_generation',\n status: rendererToolStatus(item.status),\n body: typeof item.revisedPrompt === 'string' ? item.revisedPrompt : undefined,\n input: {\n revisedPrompt: item.revisedPrompt,\n },\n output: item.savedPath,\n metadata: {\n savedPath: item.savedPath,\n },\n };\n }\n\n return null;\n}\n\nexport function shouldForwardCommandExecutionOutput(item: unknown): boolean {\n if (!isRecord(item) || item.type !== 'commandExecution' || typeof item.command !== 'string') {\n return false;\n }\n\n const command = item.command;\n return isApplyPatchCommand(command) || isShellRedirectWriteCommand(command) || isTeeWriteCommand(command);\n}\n\nexport function commandOutputDeltaToToolPartUpdate(itemId: string, delta: string): RendererToolPartUpdate {\n return {\n itemId,\n bodyDelta: delta,\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'command',\n title: 'Command',\n status: 'running',\n },\n };\n}\n\nexport function fileChangePatchToToolPartUpdate(itemId: string, changes: unknown[]): RendererToolPartUpdate {\n const statusText = fileChangeStatusText('running', changes);\n return {\n itemId,\n body: fileChangesText(changes),\n ...(statusText ? { statusText } : {}),\n input: { changes },\n metadata: { changes },\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'fileChange',\n title: changes.length === 1 ? '1 file change' : `${changes.length} file changes`,\n status: 'running',\n ...(statusText ? { statusText } : {}),\n body: fileChangesText(changes),\n input: { changes },\n metadata: { changes },\n },\n };\n}\n\nexport function mcpProgressToToolPartUpdate(itemId: string, message: string): RendererToolPartUpdate {\n return {\n itemId,\n bodyAppend: message,\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'mcp',\n title: 'MCP tool',\n status: 'running',\n },\n };\n}\n\nexport function rawOutputToToolPartUpdate(itemId: string, output: unknown, title?: string, status: unknown = 'completed'): RendererToolPartUpdate {\n const boundedOutput = boundedToolPayload(output);\n const body = boundedToolText(toolOutputText(boundedOutput));\n return {\n itemId,\n title: title && title.trim() ? title : undefined,\n status: rendererToolStatus(status),\n body,\n ...(boundedOutput !== undefined ? { output: boundedOutput } : {}),\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'generic',\n title: title && title.trim() ? title : 'Tool output',\n status: rendererToolStatus(status),\n body,\n ...(boundedOutput !== undefined ? { output: boundedOutput } : {}),\n },\n };\n}\n\nfunction rendererToolStatus(status: unknown): RendererToolPart['status'] {\n if (status === 'completed' || status === 'succeeded' || status === 'success') {\n return 'completed';\n }\n\n if (status === 'failed' || status === 'error' || status === 'declined' || status === 'incomplete' || status === 'canceled' || status === 'cancelled') {\n return 'failed';\n }\n\n return 'running';\n}\n\nfunction commandStatusText(status: RendererToolPart['status'], commandActions: unknown, command: string): string | undefined {\n const descriptor = commandStatusDescriptor(status, commandActions, command);\n return descriptor ? JSON.stringify(descriptor) : undefined;\n}\n\nfunction commandStatusDescriptor(status: RendererToolPart['status'], commandActions: unknown, command: string): {\n action: 'edit' | 'explore' | 'list' | 'read' | 'run' | 'search';\n phase: RendererToolPart['status'];\n params: Record<string, unknown>;\n source: 'codex';\n} | undefined {\n const actions = normalizedCommandActions(commandActions);\n const actionTypes = new Set(actions.map((action) => action.type));\n if (actions.length === 0) {\n return {\n action: 'run',\n phase: status,\n params: { target: command },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('read')) {\n const names = uniqueNonEmpty(actions.map((action) => action.name ?? action.path));\n return {\n action: 'read',\n phase: status,\n params: {\n names,\n target: formatReadTargetList(names, command),\n },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('listFiles')) {\n const targets = uniqueNonEmpty(actions.map((action) => action.path ?? action.command));\n return {\n action: 'list',\n phase: status,\n params: {\n targets,\n target: formatTargetList(targets, command),\n },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('search')) {\n const searches = actions.map((action) => {\n if (action.query && action.path) {\n return `\"${action.query}\" in ${action.path}`;\n }\n\n return action.query ?? action.path ?? action.command;\n });\n const targets = uniqueNonEmpty(searches);\n return {\n action: 'search',\n phase: status,\n params: {\n targets,\n target: formatTargetList(targets, command),\n },\n source: 'codex',\n };\n }\n\n return {\n action: 'explore',\n phase: status,\n params: {\n actions: actions.map((action) => action.type),\n target: formatTargetList(uniqueNonEmpty(actions.map(commandActionTarget)), command),\n },\n source: 'codex',\n };\n}\n\nfunction commandActionTarget(action: NormalizedCommandAction): string | undefined {\n return action.path ?? action.name ?? action.query ?? action.command;\n}\n\ntype NormalizedCommandAction = {\n command?: string;\n name?: string;\n path?: string;\n query?: string;\n type: 'listFiles' | 'read' | 'search';\n};\n\nfunction normalizedCommandActions(value: unknown): NormalizedCommandAction[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n\n if (entry.type !== 'read' && entry.type !== 'listFiles' && entry.type !== 'search') {\n return [];\n }\n\n return [{\n command: typeof entry.command === 'string' ? entry.command : undefined,\n name: typeof entry.name === 'string' ? entry.name : undefined,\n path: typeof entry.path === 'string' ? entry.path : undefined,\n query: typeof entry.query === 'string' ? entry.query : undefined,\n type: entry.type,\n }];\n });\n}\n\nfunction isApplyPatchCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])apply_patch(?:\\s|$)/u.test(command);\n}\n\nfunction isShellRedirectWriteCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])(?:cat|printf|echo)\\b[\\s\\S]*>>?\\s*(?:\"[^\"]+\"|'[^']+'|[^\\s;\"'&|]+)(?=$|[\\s;&|])/u.test(command);\n}\n\nfunction isTeeWriteCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])tee(?:\\s+-a)?\\s+(?!-)(?:\"[^\"]+\"|'[^']+'|[^\\s;\"'&|]+)(?=$|[\\s;&|])/u.test(command);\n}\n\nfunction uniqueNonEmpty(values: Array<string | undefined>): string[] {\n return [...new Set(values.map((value) => value?.trim()).filter((value): value is string => Boolean(value)))];\n}\n\nfunction formatTargetList(values: string[], fallback: string): string {\n if (values.length === 0) {\n return fallback;\n }\n\n if (values.length <= 3) {\n return values.join(', ');\n }\n\n return `${values.slice(0, 3).join(', ')} and ${values.length - 3} more`;\n}\n\nfunction formatReadTargetList(values: string[], fallback: string): string {\n return formatFileTargetList(values, fallback);\n}\n\nfunction formatFileTargetList(values: string[], fallback: string): string {\n const names = uniqueNonEmpty(values.map(fileName));\n return formatTargetList(names, fallback);\n}\n\nfunction fileChangeStatusText(status: RendererToolPart['status'], changes: unknown[]): string | undefined {\n const descriptor = fileChangeStatusDescriptor(status, changes);\n return descriptor ? JSON.stringify(descriptor) : undefined;\n}\n\nfunction fileChangeStatusDescriptor(status: RendererToolPart['status'], changes: unknown[]): {\n action: 'create' | 'delete' | 'edit';\n phase: RendererToolPart['status'];\n params: Record<string, unknown>;\n source: 'codex';\n} | undefined {\n const normalizedChanges = changes.flatMap((change) => {\n if (!isRecord(change)) {\n return [];\n }\n\n const path = typeof change.path === 'string' ? change.path : undefined;\n const kind = patchChangeKind(change.kind);\n const lineDiff = lineDiffFromFileChange(change);\n return [{\n addedLines: lineDiff.addedLines,\n kind,\n path,\n removedLines: lineDiff.removedLines,\n }];\n });\n\n if (!normalizedChanges.length) {\n return undefined;\n }\n\n const addedLines = normalizedChanges.reduce((total, change) => total + change.addedLines, 0);\n const removedLines = normalizedChanges.reduce((total, change) => total + change.removedLines, 0);\n const paths = uniqueNonEmpty(normalizedChanges.map((change) => change.path));\n const target = formatFileTargetList(paths, `${normalizedChanges.length} files`);\n return {\n action: fileChangeAction(normalizedChanges.map((change) => change.kind)),\n phase: status,\n params: {\n addedLines,\n path: paths.length === 1 ? paths[0] : undefined,\n removedLines,\n target,\n },\n source: 'codex',\n };\n}\n\nfunction fileChangeAction(kinds: Array<'add' | 'delete' | undefined>): 'create' | 'delete' | 'edit' {\n if (kinds.every((kind) => kind === 'add')) {\n return 'create';\n }\n\n if (kinds.every((kind) => kind === 'delete')) {\n return 'delete';\n }\n\n return 'edit';\n}\n\nfunction lineDiffFromFileChange(change: Record<string, unknown>): { addedLines: number; removedLines: number } {\n const diff = typeof change.diff === 'string' ? change.diff : undefined;\n const kind = patchChangeKind(change.kind);\n if (kind === 'add') {\n return { addedLines: rawContentLineCount(diff), removedLines: 0 };\n }\n if (kind === 'delete') {\n return { addedLines: 0, removedLines: rawContentLineCount(diff) };\n }\n\n return lineDiffFromUnifiedDiff(diff);\n}\n\nexport function lineDiffFromUnifiedDiff(diff: string | undefined): { addedLines: number; removedLines: number } {\n if (!diff) {\n return { addedLines: 0, removedLines: 0 };\n }\n\n let addedLines = 0;\n let removedLines = 0;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+++') || line.startsWith('---')) {\n continue;\n }\n\n if (line.startsWith('+')) {\n addedLines += 1;\n } else if (line.startsWith('-')) {\n removedLines += 1;\n }\n }\n\n return { addedLines, removedLines };\n}\n\nfunction patchChangeKind(kind: unknown): 'add' | 'delete' | undefined {\n if (kind === 'add' || kind === 'delete') {\n return kind;\n }\n\n if (isRecord(kind) && typeof kind.type === 'string') {\n return patchChangeKind(kind.type);\n }\n\n return undefined;\n}\n\nfunction fullFilePath(value: string | undefined, cwd: string | undefined): string | undefined {\n const path = value?.trim();\n if (!path) return undefined;\n if (isAbsolute(path)) return path;\n if (!cwd || !isAbsolute(cwd)) return undefined;\n return resolve(cwd, path);\n}\n\nfunction rawContentLineCount(content: string | undefined): number {\n if (!content) {\n return 0;\n }\n\n const lines = content.split(/\\r\\n|\\r|\\n/);\n while (lines.at(-1) === '') {\n lines.pop();\n }\n return lines.length;\n}\n\nfunction fileName(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts.at(-1) ?? path;\n}\n\nfunction mcpErrorMessage(error: unknown): string | undefined {\n if (!isRecord(error)) {\n return undefined;\n }\n\n return typeof error.message === 'string' ? error.message : undefined;\n}\n\nfunction mcpResultText(result: unknown): string | undefined {\n if (!isRecord(result)) {\n return undefined;\n }\n\n const contentText = mcpContentText(result.content);\n const structuredText = 'structuredContent' in result ? toolOutputText(result.structuredContent) : undefined;\n if (!structuredText) {\n return contentText;\n }\n\n if (!contentText || contentText.trim() === structuredToolResultNotice) {\n return structuredText;\n }\n\n return `${contentText}\\n\\n${structuredText}`;\n}\n\nfunction mcpContentText(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n return content\n .map((entry) => {\n if (!isRecord(entry)) {\n return '';\n }\n\n if (typeof entry.text === 'string') {\n return entry.text;\n }\n\n return JSON.stringify(entry);\n })\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n}\n\nfunction dynamicToolContentText(contentItems: unknown): string | undefined {\n if (!Array.isArray(contentItems)) {\n return undefined;\n }\n\n return contentItems\n .map((entry) => {\n if (isRecord(entry) && typeof entry.text === 'string') {\n return entry.text;\n }\n\n return JSON.stringify(entry);\n })\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n}\n\nfunction fileChangesText(changes: unknown[]): string | undefined {\n return changes\n .map((change) => {\n if (!isRecord(change)) {\n return JSON.stringify(change);\n }\n\n const kind = patchChangeKind(change.kind) ?? 'update';\n const path = typeof change.path === 'string' ? change.path : 'unknown';\n return `${kind} ${path}`;\n })\n .join('\\n') || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction boundedToolText(value: string | undefined): string | undefined {\n return value !== undefined && Buffer.byteLength(value) <= MAX_TOOL_PAYLOAD_BYTES ? value : undefined;\n}\n\nfunction boundedToolPayload(value: unknown): unknown {\n if (value === undefined || !jsonValueFitsByteBudget(value, MAX_TOOL_PAYLOAD_BYTES)) {\n return undefined;\n }\n return value;\n}\n\nfunction jsonValueFitsByteBudget(value: unknown, maxBytes: number): boolean {\n if (jsonValueContainsOversizedStringOrCycle(value, maxBytes, new Set<object>())) {\n return false;\n }\n try {\n const serialized = JSON.stringify(value);\n return serialized !== undefined && Buffer.byteLength(serialized) <= maxBytes;\n } catch {\n return false;\n }\n}\n\nfunction jsonValueContainsOversizedStringOrCycle(\n value: unknown,\n maxBytes: number,\n ancestors: Set<object>,\n): boolean {\n if (typeof value === 'string') return Buffer.byteLength(value) > maxBytes;\n if (value === null || typeof value !== 'object') return false;\n if (ancestors.has(value)) return true;\n\n ancestors.add(value);\n const entries = Array.isArray(value) ? value : Object.values(value);\n const oversized = entries.some((entry) => jsonValueContainsOversizedStringOrCycle(entry, maxBytes, ancestors));\n ancestors.delete(value);\n return oversized;\n}\n","import { normalizePromptContent, type CodexPromptPart } from '@codex-app-sdk/core/surface';\nimport type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceReviewTarget,\n CodexSurfaceSkill,\n CodexSurfaceSkillInput,\n SurfaceMessage,\n SurfaceMessageToolPart,\n} from '@codex-app-sdk/core/surface';\n\nexport type GoalSlashCommand =\n | { action: 'clear' }\n | { action: 'edit' }\n | { action: 'set'; objective: string }\n | { action: 'show' }\n | { action: 'unsupported' };\n\nexport function mcpElicitationResponse(\n decision: 'allow' | 'allow_conversation' | 'always_allow' | 'deny',\n): v2.McpServerElicitationRequestResponse {\n switch (decision) {\n case 'allow':\n return { action: 'accept', content: null, _meta: null };\n case 'allow_conversation':\n return { action: 'accept', content: null, _meta: { persist: 'session' } };\n case 'always_allow':\n return { action: 'accept', content: null, _meta: { persist: 'always' } };\n case 'deny':\n return { action: 'decline', content: null, _meta: null };\n }\n}\n\nexport function parsePlanSlashCommand(prompt: string): { prompt: string | null } | null {\n const match = /^\\/plan(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const planPrompt = match[1]?.trim() ?? '';\n return { prompt: planPrompt || null };\n}\n\nexport function parseGoalSlashCommand(prompt: string): GoalSlashCommand | null {\n const match = /^\\/goal(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const rest = match[1]?.trim() ?? '';\n if (!rest) return { action: 'show' };\n if (rest.toLowerCase() === 'clear') return { action: 'clear' };\n if (rest.toLowerCase() === 'edit') return { action: 'edit' };\n if (rest.toLowerCase() === 'pause' || rest.toLowerCase() === 'resume') return { action: 'unsupported' };\n return { action: 'set', objective: rest };\n}\n\nexport function parseReviewSlashCommand(prompt: string): CodexSurfaceReviewTarget | null {\n const match = /^\\/review(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const instructions = match[1]?.trim() ?? '';\n return instructions ? { type: 'custom', instructions } : { type: 'uncommittedChanges' };\n}\n\nexport function normalizeReviewTarget(target: CodexSurfaceReviewTarget): v2.ReviewTarget {\n if (target.type === 'commit') return { ...target, title: target.title ?? null };\n return { ...target };\n}\n\nexport function authoredPromptContent(content?: readonly CodexPromptPart[]): CodexPromptPart[] | undefined {\n if (content === undefined) return undefined;\n const normalized = normalizePromptContent(content);\n return normalized;\n}\n\nexport function promptSkillInputsFromContent(content: readonly CodexPromptPart[] = []): CodexSurfaceSkillInput[] {\n return content.flatMap(part => part.type === 'mention' && part.kind === 'skill'\n ? [{ name: part.value, path: part.id }] : []);\n}\n\nexport function promptMentionInputs(content: readonly CodexPromptPart[] = []): Extract<v2.UserInput, { type: 'mention' }>[] {\n return content.flatMap(part => part.type === 'mention' && (part.kind === 'file' || part.kind === 'plugin')\n ? [{ type: 'mention' as const, name: part.label, path: part.kind === 'plugin' ? `plugin://${part.id}` : part.id }] : []);\n}\n\nexport function validateSkillInputs(\n inputs: readonly CodexSurfaceSkillInput[],\n catalog: readonly CodexSurfaceSkill[],\n): CodexSurfaceSkillInput[] {\n return inputs.map((input) => {\n const match = catalog.find((skill) => (\n skill.enabled\n && skill.name === input.name\n && skill.path === input.path\n ));\n if (!match) {\n throw new Error(`Skill '${input.name}' is not an enabled skill in the Codex catalog`);\n }\n return { name: match.name, path: match.path };\n });\n}\n\nexport function mergeSkillInputs(\n ...groups: readonly (readonly CodexSurfaceSkillInput[])[]\n): CodexSurfaceSkillInput[] {\n const seen = new Set<string>();\n return groups.flatMap((group) => group.filter((skill) => {\n const key = `${skill.name}\\u0000${skill.path}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n }));\n}\n\nexport function findPendingMcpToolPart(\n messages: readonly SurfaceMessage[],\n turnId: string,\n server: string,\n tool: string,\n): SurfaceMessageToolPart | null {\n const running = messages\n .filter((message) => message.metadata?.turnId === turnId)\n .flatMap((message) => message.parts)\n .filter((part): part is SurfaceMessageToolPart => (\n part.type === 'tool' && part.kind === 'mcp' && part.status === 'running'\n ));\n const exact = running.find((part) => {\n const metadataServer = stringValue(part.metadata?.server);\n const metadataTool = stringValue(part.metadata?.tool);\n return (\n (metadataServer === server && metadataTool === tool)\n || part.title.endsWith(`.${tool}`)\n );\n });\n return exact ?? (running.length === 1 ? running[0] ?? null : null);\n}\n\nexport function argumentsPreview(meta: Record<string, unknown>): string {\n if (Array.isArray(meta.tool_params_display)) {\n const lines = meta.tool_params_display.map((entry) => {\n if (!isRecord(entry) || typeof entry.name !== 'string') return '';\n const label = stringValue(entry.display_name) ?? entry.name;\n const value = typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value);\n return `${label}: ${value}`;\n }).filter(Boolean);\n if (lines.length > 0) return lines.join('\\n');\n }\n return meta.tool_params === undefined ? '' : JSON.stringify(meta.tool_params, null, 2);\n}\n\nexport function persistSupports(value: unknown, mode: 'always' | 'session'): boolean {\n return value === mode || (Array.isArray(value) && value.includes(mode));\n}\n\nexport function stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nexport function normalizedConversationId(value: string): string {\n const conversationId = value.trim();\n if (!conversationId) throw new Error('Conversation id cannot be empty');\n return conversationId;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { v2 } from '../codex/index';\nimport type {\n SurfaceMessage,\n SurfaceMessageMediaPart,\n SurfaceMessageQuestionPart,\n SurfaceMessageReasoningPart,\n SurfaceMessageTextPart,\n SurfaceMessageToolPart,\n SurfaceMessageToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport { isRecord } from './codex-surface-prompts';\n\nexport function activeTurnId(turns: v2.Turn[]): string | null {\n for (let index = turns.length - 1; index >= 0; index -= 1) {\n const turn = turns[index];\n if (turn?.status === 'inProgress') return turn.id;\n }\n return null;\n}\n\nexport function ensureAssistantTurnMessage(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n options: { createdAt?: string; forceSegment?: boolean } = {},\n): SurfaceMessage[] {\n const next = [...messages];\n const lastTurnIndex = findLastIndex(next, (message) => message.metadata?.turnId === turnId);\n const lastTurnMessage = lastTurnIndex >= 0 ? next[lastTurnIndex] : undefined;\n if (\n lastTurnMessage?.role === 'assistant'\n && lastTurnMessage.kind === undefined\n && lastTurnMessage.status === 'streaming'\n ) {\n return next;\n }\n\n if (options.forceSegment) {\n const previousAssistantIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const previousAssistant = previousAssistantIndex >= 0 ? next[previousAssistantIndex] : undefined;\n if (previousAssistant?.parts.length === 0) {\n next.splice(previousAssistantIndex, 1);\n } else if (previousAssistant) {\n next.splice(previousAssistantIndex, 1, { ...previousAssistant, status: 'complete' });\n }\n } else {\n const existing = next.find((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n && message.status === 'streaming'\n ));\n if (existing) return next;\n }\n\n const segmentCount = next.filter((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n )).length;\n const id = segmentCount === 0 ? `assistant-${turnId}` : `assistant-${turnId}-segment-${segmentCount}`;\n next.push({\n id,\n role: 'assistant',\n status: 'streaming',\n turnId,\n parts: [],\n createdAt: options.createdAt ?? new Date().toISOString(),\n metadata: { conversationId: threadId, turnId },\n });\n return next;\n}\n\nexport function appendAssistantTextDelta(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n delta: string,\n phase?: SurfaceMessageTextPart['phase'],\n): SurfaceMessage[] {\n if (!delta) return [...messages];\n const next = ensureAssistantTurnMessage(messages, threadId, turnId);\n const messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const lastPart = parts.at(-1);\n if (lastPart?.type === 'text' && lastPart.itemId === itemId) {\n parts.splice(parts.length - 1, 1, {\n ...lastPart,\n text: `${lastPart.text}${delta}`,\n ...(phase ? { phase } : {}),\n });\n } else {\n parts.push({ type: 'text', text: delta, itemId, ...(phase ? { phase } : {}) });\n }\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantReasoningSummaries(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n summaries: readonly string[],\n): SurfaceMessage[] {\n const normalized = summaries\n .map((summary, summaryIndex): SurfaceMessageReasoningPart | null => {\n const text = summary.trim();\n return text ? { type: 'reasoning', summary: text, itemId, summaryIndex } : null;\n })\n .filter((part): part is SurfaceMessageReasoningPart => part !== null);\n if (normalized.length === 0) normalized.push({ type: 'reasoning', summary: '', itemId, summaryIndex: 0 });\n\n const next = ensureAssistantTurnMessage(messages, threadId, turnId);\n const messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n\n const firstExistingIndex = message.parts.findIndex((part) => (\n part.type === 'reasoning' && part.itemId === itemId\n ));\n const parts = message.parts.filter((part) => (\n part.type !== 'reasoning' || part.itemId !== itemId\n ));\n parts.splice(firstExistingIndex >= 0 ? firstExistingIndex : parts.length, 0, ...normalized);\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantText(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n text: string,\n phase?: SurfaceMessageTextPart['phase'],\n): SurfaceMessage[] {\n const next = [...messages];\n for (let messageIndex = next.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = next[messageIndex];\n if (message?.role !== 'assistant' || message.metadata?.turnId !== turnId) continue;\n const partIndex = message.parts.findIndex((part) => part.type === 'text' && part.itemId === itemId);\n if (partIndex < 0) continue;\n const parts = [...message.parts];\n const existingPart = parts[partIndex] as SurfaceMessageTextPart;\n parts.splice(partIndex, 1, {\n ...existingPart,\n text,\n itemId,\n ...(phase ? { phase } : {}),\n });\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n }\n\n const ensured = ensureAssistantTurnMessage(next, threadId, turnId);\n const messageIndex = findLastIndex(ensured, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? ensured[messageIndex] : undefined;\n if (!message) return ensured;\n const textPart: SurfaceMessageTextPart = {\n type: 'text',\n text,\n itemId,\n ...(phase ? { phase } : {}),\n };\n ensured.splice(messageIndex, 1, {\n ...message,\n parts: [...message.parts, textPart],\n });\n return pruneEmptyAssistantPlaceholders(ensured, threadId);\n}\n\nexport function removeAssistantText(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n): SurfaceMessage[] {\n const next = messages.map((message) => {\n if (message.role !== 'assistant' || message.metadata?.turnId !== turnId) return message;\n const parts = message.parts.filter((part) => part.type !== 'text' || part.itemId !== itemId);\n return parts.length === message.parts.length ? message : { ...message, parts };\n });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function extractProposedPlanDocument(text: string): { markdown: string; visibleText: string } | null {\n const match = /<proposed_plan>([\\s\\S]*?)<\\/proposed_plan>/iu.exec(text);\n const markdown = match?.[1]?.trim() ?? '';\n if (!match || !markdown) return null;\n return {\n markdown,\n visibleText: `${text.slice(0, match.index)}${text.slice(match.index + match[0].length)}`.trim(),\n };\n}\n\nexport function upsertAssistantToolPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n toolPart: SurfaceMessageToolPart,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === toolPart.id)\n ));\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => part.type === 'tool' && part.id === toolPart.id);\n if (partIndex >= 0) {\n const existing = parts[partIndex] as SurfaceMessageToolPart;\n parts.splice(partIndex, 1, {\n ...existing,\n ...toolPart,\n body: toolPart.body ?? existing.body,\n input: toolPart.input ?? existing.input,\n output: toolPart.output ?? existing.output,\n statusText: toolPart.statusText ?? transitionedToolStatusText(existing.statusText, toolPart.status),\n metadata: { ...(existing.metadata ?? {}), ...(toolPart.metadata ?? {}) },\n });\n } else {\n parts.push(toolPart);\n }\n // A late tool result must not reopen a segment closed by compaction or steer.\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantMediaPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n mediaPart: SurfaceMessageMediaPart,\n sourceItemId = mediaPart.itemId,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'media' && part.itemId === mediaPart.itemId)\n ));\n if (messageIndex < 0 && mediaPart.itemId) {\n messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === sourceItemId)\n ));\n }\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => (\n part.type === 'media' && part.itemId === mediaPart.itemId\n ));\n if (partIndex >= 0) parts.splice(partIndex, 1, mediaPart);\n else parts.push(mediaPart);\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantQuestionPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n questionPart: SurfaceMessageQuestionPart,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => (\n part.type === 'question' && part.request.id === questionPart.request.id\n ))\n ));\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => (\n part.type === 'question' && part.request.id === questionPart.request.id\n ));\n if (partIndex >= 0) parts.splice(partIndex, 1, questionPart);\n else parts.push(questionPart);\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function surfaceMediaPartsEqual(\n left: SurfaceMessageMediaPart,\n right: SurfaceMessageMediaPart,\n): boolean {\n return left.itemId === right.itemId\n && left.media.url === right.media.url\n && left.media.alt === right.media.alt\n && left.media.mimeType === right.media.mimeType\n && left.media.prompt === right.media.prompt\n && left.media.title === right.media.title;\n}\n\nexport function updateAssistantToolPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n update: SurfaceMessageToolPartUpdate,\n): SurfaceMessage[] {\n const next = [...messages];\n const messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === update.itemId)\n ));\n if (messageIndex < 0) {\n if (!update.fallbackToolPart) return next;\n const inserted = upsertAssistantToolPart(next, threadId, turnId, update.fallbackToolPart);\n return updateAssistantToolPart(inserted, threadId, turnId, {\n ...update,\n fallbackToolPart: undefined,\n });\n }\n const message = next[messageIndex];\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => part.type === 'tool' && part.id === update.itemId);\n const existing = parts[partIndex] as SurfaceMessageToolPart | undefined;\n if (!existing) return next;\n parts.splice(partIndex, 1, {\n ...existing,\n ...(update.title !== undefined ? { title: update.title } : {}),\n ...(update.status !== undefined ? { status: update.status } : {}),\n ...(update.statusText !== undefined ? { statusText: update.statusText ?? undefined } : {}),\n ...(update.body !== undefined ? { body: update.body } : {}),\n ...(update.bodyDelta !== undefined ? { body: `${existing.body ?? ''}${update.bodyDelta}` } : {}),\n ...(update.bodyAppend !== undefined\n ? { body: [existing.body, update.bodyAppend].filter(Boolean).join('\\n') }\n : {}),\n ...(update.input !== undefined ? { input: update.input } : {}),\n ...(update.output !== undefined ? { output: update.output } : {}),\n ...(update.metadata !== undefined\n ? { metadata: { ...(existing.metadata ?? {}), ...update.metadata } }\n : {}),\n });\n next.splice(messageIndex, 1, { ...message, parts });\n return next;\n}\n\nexport function appendCompactionMarker(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n status: 'streaming' | 'complete' = 'streaming',\n): SurfaceMessage[] {\n if (messages.some((message) => message.kind === 'compaction' && message.metadata?.turnId === turnId)) {\n return messages.map((message) => (\n status === 'complete' && message.kind === 'compaction' && message.metadata?.turnId === turnId\n ? { ...message, status }\n : message\n ));\n }\n const next = [...messages];\n const activeAssistantIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const activeAssistant = activeAssistantIndex >= 0 ? next[activeAssistantIndex] : undefined;\n if (activeAssistant?.parts.length === 0) {\n next.splice(activeAssistantIndex, 1);\n } else if (activeAssistant) {\n next.splice(activeAssistantIndex, 1, { ...activeAssistant, status: 'complete' });\n }\n next.push({\n id: `compaction-${turnId}`,\n kind: 'compaction',\n role: 'assistant',\n status,\n turnId,\n parts: [],\n createdAt: new Date().toISOString(),\n metadata: { conversationId: threadId, turnId },\n });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function finalizeTurnToolParts(\n messages: SurfaceMessage[],\n turnId: string,\n turnStatus: v2.TurnStatus,\n): SurfaceMessage[] {\n const toolStatus: SurfaceMessageToolPart['status'] = turnStatus === 'completed' ? 'completed' : 'failed';\n return messages.map((message) => {\n if (message.metadata?.turnId !== turnId) return message;\n let changed = false;\n const parts = message.parts.map((part) => {\n if (part.type !== 'tool' || part.status !== 'running') return part;\n changed = true;\n return {\n ...part,\n status: toolStatus,\n statusText: transitionedToolStatusText(part.statusText, toolStatus),\n };\n });\n return changed ? { ...message, parts } : message;\n });\n}\n\nfunction transitionedToolStatusText(\n statusText: string | undefined,\n phase: SurfaceMessageToolPart['status'],\n): string | undefined {\n if (phase === 'running') return statusText;\n if (!statusText) return statusText;\n try {\n const parsed: unknown = JSON.parse(statusText);\n if (!isRecord(parsed)) return statusText;\n return JSON.stringify({ ...parsed, phase });\n } catch {\n return statusText;\n }\n}\n\nexport function pruneEmptyAssistantPlaceholders(messages: SurfaceMessage[], threadId: string): SurfaceMessage[] {\n const relevantIndexes = messages\n .map((message, index) => ({ message, index }))\n .filter(({ message }) => message.metadata?.conversationId === threadId);\n const lastIndex = relevantIndexes.at(-1)?.index ?? -1;\n return messages.filter((message, index) => (\n message.metadata?.conversationId !== threadId\n || index === lastIndex\n || message.role !== 'assistant'\n || message.kind !== undefined\n || message.parts.length > 0\n ));\n}\n\nfunction findLastIndex<T>(values: readonly T[], predicate: (value: T) => boolean): number {\n for (let index = values.length - 1; index >= 0; index -= 1) {\n const value = values[index];\n if (value !== undefined && predicate(value)) return index;\n }\n return -1;\n}\n\nexport function addUnique<T>(values: readonly T[], value: T): T[] {\n return values.includes(value) ? [...values] : [...values, value];\n}\n\nexport function formatPlanMarkdown(\n explanation: string | null,\n plan: readonly { step: string; status: string }[],\n): string {\n return [\n explanation?.trim() ?? '',\n ...plan.map((entry) => `${entry.status === 'completed' ? '- [x]' : '- [ ]'} ${entry.step}`),\n ].filter(Boolean).join('\\n');\n}\n\nexport function planProgressToolPart(\n turnId: string,\n markdown: string,\n status: SurfaceMessageToolPart['status'],\n): SurfaceMessageToolPart {\n return {\n type: 'tool',\n id: `plan-progress-${turnId}`,\n kind: 'generic',\n title: 'plan',\n status,\n body: markdown,\n statusText: JSON.stringify({\n source: 'codex',\n action: 'plan',\n phase: status,\n params: {\n addedLines: markdown.split('\\n').filter((line) => line.trim()).length,\n operation: 'write',\n target: 'plan',\n },\n }),\n metadata: { planProgress: true },\n };\n}\n","import { normalizePromptContent, promptContentText } from '@codex-app-sdk/core/surface';\nimport type { Thread } from '../codex/generated/v2/Thread';\nimport type { ThreadItem } from '../codex/generated/v2/ThreadItem';\nimport type { Turn } from '../codex/generated/v2/Turn';\nimport { basename, extname, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { fileAttachmentReference } from './codex-file-attachment';\nimport type {\n CodexSurfaceClientRequest,\n SurfaceMessage,\n SurfaceMessageAttachment,\n SurfaceMessageMediaPart,\n SurfaceMessagePart,\n SurfaceMessageQuestionPart,\n} from '@codex-app-sdk/core/surface';\nimport { codexThreadItemToToolPart } from './codex-tool-part-adapter';\nimport {\n extractProposedPlanDocument,\n finalizeTurnToolParts,\n} from './codex-surface-message-state';\n\nexport { codexThreadItemToToolPart as codexItemToToolPart } from './codex-tool-part-adapter';\n\nconst MAX_INLINE_GENERATED_IMAGE_BYTES = 16 * 1024 * 1024;\nconst supportedGeneratedImageMimeTypes = new Set([\n 'image/avif',\n 'image/gif',\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n]);\n\nexport function codexThreadToSurfaceMessages(thread: Thread): SurfaceMessage[] {\n const turns = Array.isArray(thread.turns) ? thread.turns : [];\n return turns.flatMap((turn) => codexTurnToSurfaceMessages(thread.id, turn));\n}\n\n/**\n * Keep bounded data previews from optimistic messages when app-server history\n * rematerializes the same user attachment from its local filesystem path.\n * Filesystem URLs are not renderer-safe in Electron and are intentionally not\n * used as image sources.\n */\nexport function preserveHistoricalAttachmentPreviews(\n previousMessages: readonly SurfaceMessage[],\n historyMessages: readonly SurfaceMessage[],\n): SurfaceMessage[] {\n const previewsByPath = new Map<string, string>();\n for (const message of previousMessages) {\n for (const part of message.parts) {\n if (part.type !== 'attachment' || part.attachment.kind !== 'image' || !part.attachment.path) continue;\n if (isRendererSafeImagePreview(part.attachment.url)) {\n previewsByPath.set(part.attachment.path, part.attachment.url);\n }\n }\n }\n if (previewsByPath.size === 0) return [...historyMessages];\n\n return historyMessages.map((message) => {\n let changed = false;\n const parts = message.parts.map((part) => {\n if (part.type !== 'attachment' || part.attachment.kind !== 'image' || !part.attachment.path) {\n return part;\n }\n const previewUrl = previewsByPath.get(part.attachment.path);\n if (!previewUrl || part.attachment.url === previewUrl) return part;\n changed = true;\n return { ...part, attachment: { ...part.attachment, url: previewUrl } };\n });\n return changed ? { ...message, parts } : message;\n });\n}\n\n/** Preserve authored presentation by provider-echoed client identity, never text matching. */\nexport function preserveHistoricalMessagePresentation(previous: readonly SurfaceMessage[], history: readonly SurfaceMessage[]): SurfaceMessage[] {\n const authored = new Map(previous.filter(message => message.role === 'user' && message.metadata?.promptContent)\n .map(message => [message.id, message.metadata!.promptContent]));\n return preserveHistoricalAttachmentPreviews(previous, history).map(message => {\n const saved = authored.get(message.id);\n if (!saved || message.role !== 'user') return message;\n const content = normalizePromptContent(saved);\n return {\n ...message, metadata: { ...message.metadata, promptContent: content },\n parts: [{ type: 'text', text: promptContentText(content) }, ...message.parts.filter(part => part.type !== 'text')],\n };\n });\n}\n\nexport function codexTurnToSurfaceMessages(threadId: string, turn: Turn): SurfaceMessage[] {\n const messages: SurfaceMessage[] = [];\n const assistantParts: SurfaceMessagePart[] = [];\n const createdAt = timestampToIso(turn.startedAt ?? turn.completedAt);\n let assistantSegmentIndex = 0;\n let sawAssistantActivity = false;\n let sawFinalAnswer = false;\n const initialUserMessageKeys = new Set<string>();\n\n const flushAssistantMessage = () => {\n if (assistantParts.length === 0) {\n return;\n }\n\n const segmentSuffix = assistantSegmentIndex === 0 ? '' : `-segment-${assistantSegmentIndex}`;\n messages.push({\n id: `assistant-${turn.id}${segmentSuffix}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts: [...assistantParts],\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id },\n });\n assistantParts.length = 0;\n assistantSegmentIndex += 1;\n };\n\n for (const item of Array.isArray(turn.items) ? turn.items : []) {\n if (item.type === 'userMessage') {\n const parts = userMessageParts(item);\n const asyncQuestionRequestIds = asyncQuestionRequestIdsForUserMessage(item);\n if (parts.length > 0) {\n const isSteerMessage = sawAssistantActivity;\n const initialMessageKey = isSteerMessage ? null : JSON.stringify(parts);\n if (initialMessageKey && initialUserMessageKeys.has(initialMessageKey)) continue;\n if (initialMessageKey) initialUserMessageKeys.add(initialMessageKey);\n flushAssistantMessage();\n messages.push({\n id: item.clientId ?? `user-${threadId}-${turn.id}-${item.id ?? messages.length}`,\n ...(isSteerMessage ? { kind: 'steer' as const } : {}),\n role: 'user',\n status: 'complete',\n turnId: turn.id,\n parts,\n createdAt,\n metadata: {\n conversationId: threadId,\n turnId: turn.id,\n ...(asyncQuestionRequestIds.length > 0 ? {\n asyncQuestionRequestIds,\n asyncQuestionAnswers: asyncQuestionAnswersForUserMessage(item),\n } : {}),\n },\n });\n }\n continue;\n }\n\n if (item.type === 'contextCompaction') {\n sawAssistantActivity = true;\n flushAssistantMessage();\n const markerId = `compaction-${turn.id}`;\n if (!messages.some((message) => message.id === markerId)) {\n messages.push({\n id: markerId,\n kind: 'compaction',\n role: 'assistant',\n status: 'complete',\n turnId: turn.id,\n parts: [],\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id },\n });\n }\n continue;\n }\n\n if (item.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text : '';\n if (item.phase === 'final_answer' && text.trim()) sawFinalAnswer = true;\n const questionPart = codexItemToQuestionPart(threadId, turn.id, item, true);\n const proposedPlan = item.phase === 'final_answer'\n ? extractProposedPlanDocument(text)\n : null;\n if (proposedPlan && !questionPart) {\n if (proposedPlan.visibleText) {\n sawAssistantActivity = true;\n assistantParts.push({\n type: 'text',\n text: proposedPlan.visibleText,\n itemId: item.id,\n ...(item.phase ? { phase: item.phase } : {}),\n });\n }\n } else if (text && !questionPart) {\n sawAssistantActivity = true;\n assistantParts.push({\n type: 'text',\n text,\n itemId: item.id,\n ...(item.phase ? { phase: item.phase } : {}),\n });\n }\n if (questionPart) {\n sawAssistantActivity = true;\n assistantParts.push(questionPart);\n }\n continue;\n }\n\n if (item.type === 'reasoning') {\n const summaries = item.summary\n .map((summary, summaryIndex) => ({ summary: summary.trim(), summaryIndex }))\n .filter(({ summary }) => summary.length > 0);\n if (summaries.length === 0 && sawFinalAnswer) summaries.push({ summary: '', summaryIndex: 0 });\n if (summaries.length > 0) {\n sawAssistantActivity = true;\n assistantParts.push(...summaries.map(({ summary, summaryIndex }) => ({\n type: 'reasoning' as const,\n summary,\n itemId: item.id,\n summaryIndex,\n })));\n }\n continue;\n }\n\n if (item.type === 'exitedReviewMode') {\n const text = typeof item.review === 'string' ? item.review : '';\n if (text) {\n sawAssistantActivity = true;\n assistantParts.push({ type: 'text', text, itemId: item.id });\n }\n continue;\n }\n\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart) {\n sawAssistantActivity = true;\n assistantParts.push(toolPart);\n }\n const mediaParts = codexItemToMediaParts(item);\n if (mediaParts.length) {\n sawAssistantActivity = true;\n assistantParts.push(...mediaParts);\n }\n }\n\n flushAssistantMessage();\n if ((turn.itemsView === 'summary' || turn.itemsView === 'notLoaded') && !messages.some(m => m.role === 'assistant')) {\n messages.push({ id: `assistant-${turn.id}`, role: 'assistant', status: surfaceMessageStatus(turn.status), turnId: turn.id, parts: [], createdAt, metadata: { conversationId: threadId, turnId: turn.id } });\n }\n return turn.status === 'inProgress'\n ? messages\n : finalizeTurnToolParts(messages, turn.id, turn.status);\n}\n\nexport function codexItemToSurfaceMessage(\n threadId: string,\n turn: Pick<Turn, 'id' | 'status' | 'startedAt'>,\n item: ThreadItem,\n): SurfaceMessage | null {\n const createdAt = timestampToIso(turn.startedAt);\n if (item.type === 'userMessage') {\n const parts = userMessageParts(item);\n const asyncQuestionRequestIds = asyncQuestionRequestIdsForUserMessage(item);\n return parts.length > 0 ? {\n id: item.clientId ?? `user-${threadId}-${turn.id}-${item.id}`,\n role: 'user',\n status: 'complete',\n turnId: turn.id,\n parts,\n createdAt,\n metadata: {\n conversationId: threadId,\n turnId: turn.id,\n itemId: item.id,\n ...(asyncQuestionRequestIds.length > 0 ? {\n asyncQuestionRequestIds,\n asyncQuestionAnswers: asyncQuestionAnswersForUserMessage(item),\n } : {}),\n },\n } : null;\n }\n\n if (item.type === 'agentMessage' || item.type === 'exitedReviewMode') {\n const text = item.type === 'agentMessage' ? item.text : item.review;\n const proposedPlan = item.type === 'agentMessage' && item.phase === 'final_answer'\n ? extractProposedPlanDocument(text)\n : null;\n const questionPart = item.type === 'agentMessage'\n ? codexItemToQuestionPart(threadId, turn.id, item, true)\n : null;\n const parts: SurfaceMessagePart[] = [\n ...(!questionPart && (proposedPlan?.visibleText || (!proposedPlan && text)) ? [{\n type: 'text' as const,\n text: proposedPlan?.visibleText ?? text,\n itemId: item.id,\n ...(item.type === 'agentMessage' && item.phase ? { phase: item.phase } : {}),\n }] : []),\n ...(questionPart ? [questionPart] : []),\n ];\n return parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n }\n\n if (item.type === 'reasoning') {\n const parts = item.summary\n .map((summary, summaryIndex) => ({ summary: summary.trim(), summaryIndex }))\n .filter(({ summary }) => summary.length > 0)\n .map(({ summary, summaryIndex }) => ({\n type: 'reasoning' as const,\n summary,\n itemId: item.id,\n summaryIndex,\n }));\n return parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n }\n\n const parts: SurfaceMessagePart[] = [];\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart) parts.push(toolPart);\n parts.push(...codexItemToMediaParts(item));\n const message: SurfaceMessage | null = parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n if (!message || turn.status === 'inProgress') return message;\n return finalizeTurnToolParts([message], turn.id, turn.status)[0] ?? null;\n}\n\nexport function codexItemToQuestionPart(\n threadId: string,\n turnId: string,\n item: Extract<ThreadItem, { type: 'agentMessage' }>,\n historical = false,\n): SurfaceMessageQuestionPart | null {\n if (item.delivery !== 'async') return null;\n const structuredQuestions = item.questions ?? [];\n const questions = structuredQuestions.length > 0\n ? structuredQuestions.map((question, index) => ({\n id: JSON.stringify(['request_user_input_async', item.id, index]),\n header: question.title,\n question: question.title,\n isOther: true,\n isSecret: false,\n options: question.options?.map((label) => ({ label, description: '' })) ?? null,\n }))\n : item.text.trim()\n ? [{\n id: item.id,\n header: 'Question',\n question: item.text,\n isOther: true,\n isSecret: false,\n options: null,\n }]\n : [];\n if (questions.length === 0) return null;\n const request: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> = {\n id: `async-question:${item.id}`,\n kind: 'ask_user',\n conversationId: threadId,\n turnId,\n itemId: item.id,\n payload: {\n request: {\n itemId: item.id,\n delivery: 'async',\n blocking: false,\n questions,\n },\n },\n };\n return { type: 'question', request, ...(historical ? { historical: true } : {}) };\n}\n\nexport function codexItemToMediaPart(item: ThreadItem): SurfaceMessageMediaPart | null {\n if (item.type !== 'imageGeneration') return null;\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart?.status !== 'completed') return null;\n\n const candidatePath = typeof item.savedPath === 'string' && isAbsolute(item.savedPath)\n ? item.savedPath\n : null;\n const savedPathMimeType = candidatePath ? mimeTypeForSource(candidatePath) : undefined;\n const savedPath = savedPathMimeType && supportedGeneratedImageMimeTypes.has(savedPathMimeType)\n ? candidatePath\n : null;\n const result = 'result' in item && typeof item.result === 'string' ? item.result.trim() : '';\n const inlineImage = codexImageDataUrl(result);\n const url = inlineImage?.url ?? (savedPath ? pathToFileURL(savedPath).href : undefined);\n if (!url) return null;\n\n const prompt = typeof item.revisedPrompt === 'string' ? item.revisedPrompt.trim() : '';\n return {\n type: 'media',\n itemId: item.id,\n media: {\n url,\n alt: 'Generated image',\n title: 'Generated image',\n mimeType: inlineImage?.mimeType ?? savedPathMimeType ?? 'image/png',\n ...(prompt ? { prompt } : {}),\n },\n };\n}\n\n/** Tool result images are media, independently of the small text/JSON tool-output budget. */\nexport function codexItemToMediaParts(item: ThreadItem): SurfaceMessageMediaPart[] {\n if (item.type === 'imageView') {\n if (typeof item.path !== 'string') return [];\n const mimeType = mimeTypeForSource(item.path);\n return isAbsolute(item.path) && mimeType && supportedGeneratedImageMimeTypes.has(mimeType)\n ? [{ type: 'media', phase: 'commentary', itemId: item.id, media: { url: pathToFileURL(item.path).href, mimeType, alt: 'Viewed image', title: 'Viewed image' } }]\n : [];\n }\n const generated = codexItemToMediaPart(item);\n if (generated) return [generated];\n const content = item.type === 'mcpToolCall' && item.status === 'completed' ? item.result?.content\n : item.type === 'dynamicToolCall' && item.status === 'completed' ? item.contentItems : undefined;\n if (!Array.isArray(content)) return [];\n const parts: SurfaceMessageMediaPart[] = [];\n let remaining = 20 * 1024 * 1024;\n let parseBudget = 32 * 1024 * 1024;\n let entries = 256;\n // Only unwrap the provider's content/text JSON envelopes, never arbitrary\n // result properties. Cumulative limits bound both parsing work and images.\n const visit = (blocks: unknown[], depth: number): void => {\n for (const entry of blocks) {\n if (--entries < 0 || parts.length >= 8) return;\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n const value = entry as Record<string, unknown>;\n if (value.type === 'text' || value.type === 'inputText') {\n if (depth >= 4 || typeof value.text !== 'string') continue;\n const byteLength = Buffer.byteLength(value.text);\n if (byteLength > parseBudget) continue;\n parseBudget -= byteLength;\n try {\n const envelope: unknown = JSON.parse(value.text);\n if (isRecord(envelope) && Array.isArray(envelope.content)) visit(envelope.content, depth + 1);\n } catch { /* Ordinary text and malformed envelopes are not media. */ }\n continue;\n }\n const source = value.type === 'image' && typeof value.data === 'string' ? value.data\n : value.type === 'inputImage' && typeof value.imageUrl === 'string' ? value.imageUrl : '';\n if (source.length > remaining) continue;\n const image = codexImageDataUrl(source);\n if (!image) continue;\n remaining -= image.url.length;\n parts.push({ type: 'media', phase: 'commentary', itemId: parts.length ? `${item.id}:image:${parts.length}` : item.id,\n media: { url: image.url, mimeType: image.mimeType, alt: 'Tool image', title: 'Tool image' } });\n }\n };\n visit(content, 0);\n return parts;\n}\n\nfunction userMessageParts(item: Extract<ThreadItem, { type: 'userMessage' }>): SurfaceMessagePart[] {\n const content = Array.isArray(item.content) ? item.content : [];\n const hasTextInput = content.some((input) => (\n isRecord(input) && input.type === 'text' && typeof input.text === 'string' && input.text.length > 0\n ));\n const parts: SurfaceMessagePart[] = [];\n let text: string[] = [];\n const renderedSkills = new Set<string>();\n const flushText = () => {\n if (text.length > 0) parts.push({ type: 'text', text: text.join('\\n') });\n text = [];\n };\n\n for (const input of content) {\n if (isRecord(input) && input.type === 'skill' && typeof input.name === 'string') {\n // app-server persists selected skills alongside the original prompt text.\n // The text is the canonical user-authored display value; rendering the\n // structured execution metadata too repeats the skill mention.\n if (hasTextInput) continue;\n const normalizedName = input.name.toLowerCase();\n if (renderedSkills.has(normalizedName)) continue;\n renderedSkills.add(normalizedName);\n }\n const inputText = userInputText(input);\n const file = fileAttachmentReference(inputText);\n if (file) {\n flushText();\n parts.push({ type: 'attachment', attachment: { kind: 'file', ...file } });\n continue;\n }\n if (inputText) {\n text.push(inputText);\n continue;\n }\n const attachment = userInputAttachment(input);\n if (!attachment) continue;\n flushText();\n parts.push({ type: 'attachment', attachment });\n }\n flushText();\n return parts;\n}\n\nfunction userInputText(input: unknown): string {\n if (!isRecord(input) || typeof input.type !== 'string') {\n return '';\n }\n if (input.type === 'text' && typeof input.text === 'string') {\n return asyncQuestionReply(input.text)?.displayText ?? input.text;\n }\n if (input.type === 'skill' && typeof input.name === 'string') return `$${input.name}`;\n return '';\n}\n\nfunction asyncQuestionRequestIdsForUserMessage(\n item: Extract<ThreadItem, { type: 'userMessage' }>,\n): string[] {\n const ids = new Set<string>();\n for (const input of Array.isArray(item.content) ? item.content : []) {\n if (!isRecord(input) || input.type !== 'text' || typeof input.text !== 'string') continue;\n for (const requestId of asyncQuestionReply(input.text)?.requestIds ?? []) ids.add(requestId);\n }\n return [...ids];\n}\n\nfunction asyncQuestionAnswersForUserMessage(item: Extract<ThreadItem, { type: 'userMessage' }>): Record<string, { answers: string[] }> {\n const answers: Record<string, { answers: string[] }> = {};\n for (const input of Array.isArray(item.content) ? item.content : []) {\n if (!isRecord(input) || input.type !== 'text' || typeof input.text !== 'string') continue;\n Object.assign(answers, asyncQuestionReply(input.text)?.answers);\n }\n return answers;\n}\n\nfunction asyncQuestionReply(text: string): { displayText: string; requestIds: string[]; answers: Record<string, { answers: string[] }> } | null {\n const match = text.match(\n /^<send_user_message_question_reply>\\s*([\\s\\S]*?)\\s*<\\/send_user_message_question_reply>$/,\n );\n if (!match?.[1]) return null;\n try {\n const value: unknown = JSON.parse(match[1]);\n if (!Array.isArray(value)) return null;\n const replies = value.filter((entry): entry is {\n questionItemId: string;\n question: string;\n answer: string;\n } => (\n isRecord(entry)\n && typeof entry.questionItemId === 'string'\n && typeof entry.question === 'string'\n && typeof entry.answer === 'string'\n ));\n if (replies.length === 0) return null;\n const requestIds = replies.flatMap((reply) => {\n try {\n const questionId: unknown = JSON.parse(reply.questionItemId);\n if (\n Array.isArray(questionId)\n && questionId[0] === 'request_user_input_async'\n && typeof questionId[1] === 'string'\n ) return [`async-question:${questionId[1]}`];\n } catch {\n // Open-ended asynchronous questions use their item id directly.\n }\n return [`async-question:${reply.questionItemId}`];\n });\n return {\n displayText: replies.length === 1\n ? replies[0]!.answer\n : replies.map((reply) => `${reply.question}: ${reply.answer}`).join('\\n'),\n requestIds,\n answers: Object.fromEntries(replies.map((reply) => [reply.questionItemId, { answers: [reply.answer] }])),\n };\n } catch {\n return null;\n }\n}\n\nfunction userInputAttachment(input: unknown): SurfaceMessageAttachment | null {\n if (!isRecord(input) || typeof input.type !== 'string') return null;\n if (input.type === 'mention' && typeof input.path === 'string' && !input.path.startsWith('plugin://')) {\n const name = typeof input.name === 'string' && input.name.trim()\n ? input.name.trim()\n : attachmentName(input.path, 'File');\n const mimeType = mimeTypeForSource(input.path);\n return {\n kind: 'file',\n name,\n path: input.path,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n if (input.type === 'image' && typeof input.url === 'string') {\n const mimeType = mimeTypeForSource(input.url);\n return {\n kind: 'image',\n name: attachmentName(input.url, 'Image'),\n url: input.url,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n if (input.type === 'localImage' && typeof input.path === 'string') {\n const mimeType = mimeTypeForSource(input.path);\n return {\n kind: 'image',\n name: attachmentName(input.path, 'Image'),\n path: input.path,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n return null;\n}\n\nfunction attachmentName(source: string, fallback: string): string {\n try {\n const path = /^[a-z][a-z\\d+.-]*:/i.test(source) ? new URL(source).pathname : source;\n const name = basename(decodeURIComponent(path)).trim();\n return name || fallback;\n } catch {\n return basename(source).trim() || fallback;\n }\n}\n\nfunction mimeTypeForSource(source: string): string | undefined {\n const dataMimeType = /^data:([^;,]+)/i.exec(source)?.[1]?.toLowerCase();\n if (dataMimeType) return dataMimeType;\n let extension = '';\n try {\n const path = /^[a-z][a-z\\d+.-]*:/i.test(source) ? new URL(source).pathname : source;\n extension = extname(path).slice(1).toLowerCase();\n } catch {\n extension = extname(source).slice(1).toLowerCase();\n }\n return ({\n avif: 'image/avif',\n gif: 'image/gif',\n heic: 'image/heic',\n heif: 'image/heif',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n pdf: 'application/pdf',\n png: 'image/png',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n } as Record<string, string>)[extension];\n}\n\nexport function codexImageDataUrl(result: string): { url: string; mimeType: string } | null {\n if (!result) return null;\n const dataUrlMatch = /^data:image\\/[a-z0-9.+-]+;base64,([a-z0-9+/=\\s]+)$/i.exec(result);\n const compact = (dataUrlMatch?.[1] ?? result).replace(/\\s+/g, '');\n const maxEncodedLength = Math.ceil(MAX_INLINE_GENERATED_IMAGE_BYTES / 3) * 4 + 4;\n if (\n !compact\n || compact.length > maxEncodedLength\n || compact.length % 4 !== 0\n || !/^[a-z0-9+/]+={0,2}$/i.test(compact)\n ) {\n return null;\n }\n const bytes = Buffer.from(compact, 'base64');\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_INLINE_GENERATED_IMAGE_BYTES) return null;\n const mimeType = generatedImageMimeType(bytes);\n if (!mimeType) return null;\n return { url: `data:${mimeType};base64,${compact}`, mimeType };\n}\n\nfunction isRendererSafeImagePreview(value: string | undefined): value is string {\n return Boolean(\n value\n && value.length <= 16 * 1024 * 1024\n && /^data:image\\/(?:avif|bmp|gif|heic|heif|jpe?g|png|webp);base64,[a-z\\d+/]+={0,2}$/i.test(value),\n );\n}\n\nfunction generatedImageMimeType(bytes: Uint8Array): string | null {\n if (startsWithBytes(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return 'image/png';\n if (startsWithBytes(bytes, [0xff, 0xd8, 0xff])) return 'image/jpeg';\n const header = Buffer.from(bytes.subarray(0, 12)).toString('ascii');\n if (header.startsWith('GIF87a') || header.startsWith('GIF89a')) return 'image/gif';\n if (header.startsWith('RIFF') && header.slice(8, 12) === 'WEBP') return 'image/webp';\n if (bytes.byteLength >= 12 && header.slice(4, 12) === 'ftypavif') return 'image/avif';\n return null;\n}\n\nfunction startsWithBytes(bytes: Uint8Array, prefix: readonly number[]): boolean {\n return prefix.every((value, index) => bytes[index] === value);\n}\n\nfunction surfaceMessageStatus(status: Turn['status']): SurfaceMessage['status'] {\n if (status === 'inProgress') return 'streaming';\n if (status === 'failed') return 'error';\n return 'complete';\n}\n\nfunction timestampToIso(timestamp: number | null | undefined): string {\n if (typeof timestamp !== 'number' || !Number.isFinite(timestamp)) {\n return new Date(0).toISOString();\n }\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","const decoder = new TextDecoder();\nexport const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));\nexport const toHexString = (input, start = 0, end = input.length) => input\n .slice(start, end)\n .reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), '');\nconst getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);\nexport const readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);\nexport const readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);\nexport const readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);\nexport const readUInt24LE = (input, offset = 0) => {\n const view = getView(input, offset);\n return view.getUint16(0, true) + (view.getUint8(2) << 16);\n};\nexport const readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);\nexport const readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);\nexport const readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);\nexport const readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);\nconst methods = {\n readUInt16BE,\n readUInt16LE,\n readUInt32BE,\n readUInt32LE,\n};\nexport function readUInt(input, bits, offset = 0, isBigEndian = false) {\n const endian = isBigEndian ? 'BE' : 'LE';\n const methodName = `readUInt${bits}${endian}`;\n return methods[methodName](input, offset);\n}\nconst BOX_HEADER_SIZE = 8;\nfunction readBox(input, offset) {\n if (input.length - offset < BOX_HEADER_SIZE)\n return undefined;\n const boxSize = readUInt32BE(input, offset);\n if (input.length - offset < boxSize)\n return undefined;\n return {\n name: toUTF8String(input, 4 + offset, 8 + offset),\n offset,\n size: boxSize,\n };\n}\nexport function findBox(input, boxName, startOffset) {\n let currentOffset = startOffset;\n while (currentOffset < input.length) {\n if (input.length - currentOffset < 4)\n break;\n const boxSize = readUInt32BE(input, currentOffset);\n if (boxSize < BOX_HEADER_SIZE) {\n currentOffset += BOX_HEADER_SIZE;\n continue;\n }\n const box = readBox(input, currentOffset);\n if (!box)\n break;\n if (box.name === boxName)\n return box;\n currentOffset += box.size;\n }\n return undefined;\n}\n","import { readInt32LE, readUInt32LE, toUTF8String } from './utils.js';\nexport const BMP = {\n validate: (input) => toUTF8String(input, 0, 2) === 'BM',\n calculate: (input) => ({\n height: Math.abs(readInt32LE(input, 22)),\n width: readUInt32LE(input, 18),\n }),\n};\n","import { readUInt16LE } from './utils.js';\nconst TYPE_ICON = 1;\nconst SIZE_HEADER = 2 + 2 + 2;\nconst SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;\nfunction getSizeFromOffset(input, offset) {\n const value = input[offset];\n return value === 0 ? 256 : value;\n}\nfunction getImageSize(input, imageIndex) {\n const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;\n return {\n height: getSizeFromOffset(input, offset + 1),\n width: getSizeFromOffset(input, offset),\n };\n}\nexport const ICO = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0)\n return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_ICON;\n },\n calculate(input) {\n const nbImages = readUInt16LE(input, 4);\n if (SIZE_HEADER + nbImages * SIZE_IMAGE_ENTRY > input.length) {\n throw new TypeError('Invalid ICO');\n }\n const imageSize = getImageSize(input, 0);\n if (nbImages === 1)\n return imageSize;\n const images = [];\n for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) {\n images.push(getImageSize(input, imageIndex));\n }\n return {\n width: imageSize.width,\n height: imageSize.height,\n images: images,\n };\n },\n};\n","import { ICO } from './ico.js';\nimport { readUInt16LE } from './utils.js';\nconst TYPE_CURSOR = 2;\nexport const CUR = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0)\n return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_CURSOR;\n },\n calculate: (input) => ICO.calculate(input),\n};\n","import { readUInt32LE } from './utils.js';\nexport const DDS = {\n validate: (input) => readUInt32LE(input, 0) === 0x20534444,\n calculate: (input) => ({\n height: readUInt32LE(input, 12),\n width: readUInt32LE(input, 16),\n }),\n};\n","import { readUInt16LE, toUTF8String } from './utils.js';\nconst gifRegexp = /^GIF8[79]a/;\nexport const GIF = {\n validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),\n calculate: (input) => ({\n height: readUInt16LE(input, 8),\n width: readUInt16LE(input, 6),\n }),\n};\n","import { findBox, readUInt32BE, toUTF8String } from './utils.js';\nconst brandMap = {\n avif: 'avif',\n mif1: 'heif',\n msf1: 'heif',\n heic: 'heic',\n heix: 'heic',\n hevc: 'heic',\n hevx: 'heic',\n};\nexport const HEIF = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'ftyp')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand in brandMap;\n },\n calculate(input) {\n const metaBox = findBox(input, 'meta', 0);\n const iprpBox = metaBox && findBox(input, 'iprp', metaBox.offset + 12);\n const ipcoBox = iprpBox && findBox(input, 'ipco', iprpBox.offset + 8);\n if (!ipcoBox) {\n throw new TypeError('Invalid HEIF, no ipco box found');\n }\n const type = toUTF8String(input, 8, 12);\n const images = [];\n let currentOffset = ipcoBox.offset + 8;\n while (currentOffset < ipcoBox.offset + ipcoBox.size) {\n const ispeBox = findBox(input, 'ispe', currentOffset);\n if (!ispeBox)\n break;\n if (ispeBox.size < 20) {\n throw new TypeError('Invalid HEIF');\n }\n const rawWidth = readUInt32BE(input, ispeBox.offset + 12);\n const rawHeight = readUInt32BE(input, ispeBox.offset + 16);\n const clapBox = findBox(input, 'clap', currentOffset);\n let width = rawWidth;\n const height = rawHeight;\n if (clapBox &&\n clapBox.size >= 16 &&\n clapBox.offset < ipcoBox.offset + ipcoBox.size) {\n const cropRight = readUInt32BE(input, clapBox.offset + 12);\n width = rawWidth - cropRight;\n }\n images.push({ height, width });\n const nextOffset = ispeBox.offset + ispeBox.size;\n if (nextOffset <= currentOffset) {\n throw new TypeError('Invalid HEIF');\n }\n currentOffset = nextOffset;\n }\n if (images.length === 0) {\n throw new TypeError('Invalid HEIF, no sizes found');\n }\n return {\n width: images[0].width,\n height: images[0].height,\n type,\n ...(images.length > 1 ? { images } : {}),\n };\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nconst SIZE_HEADER = 4 + 4;\nconst FILE_LENGTH_OFFSET = 4;\nconst ENTRY_LENGTH_OFFSET = 4;\nconst ICON_TYPE_SIZE = {\n ICON: 32,\n 'ICN#': 32,\n 'icm#': 16,\n icm4: 16,\n icm8: 16,\n 'ics#': 16,\n ics4: 16,\n ics8: 16,\n is32: 16,\n s8mk: 16,\n icp4: 16,\n icl4: 32,\n icl8: 32,\n il32: 32,\n l8mk: 32,\n icp5: 32,\n ic11: 32,\n ich4: 48,\n ich8: 48,\n ih32: 48,\n h8mk: 48,\n icp6: 64,\n ic12: 32,\n it32: 128,\n t8mk: 128,\n ic07: 128,\n ic08: 256,\n ic13: 256,\n ic09: 512,\n ic14: 512,\n ic10: 1024,\n};\nfunction readImageHeader(input, imageOffset) {\n const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;\n if (imageLengthOffset + 4 > input.length) {\n throw new TypeError('Invalid ICNS');\n }\n return [\n toUTF8String(input, imageOffset, imageLengthOffset),\n readUInt32BE(input, imageLengthOffset),\n ];\n}\nfunction getImageSize(type) {\n const size = ICON_TYPE_SIZE[type];\n return { width: size, height: size, type };\n}\nexport const ICNS = {\n validate: (input) => toUTF8String(input, 0, 4) === 'icns',\n calculate(input) {\n const inputLength = input.length;\n const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);\n let imageOffset = SIZE_HEADER;\n const images = [];\n while (imageOffset < fileLength && imageOffset < inputLength) {\n const imageHeader = readImageHeader(input, imageOffset);\n const entryLength = imageHeader[1];\n if (entryLength < 8) {\n throw new TypeError('Invalid ICNS');\n }\n const imageSize = getImageSize(imageHeader[0]);\n images.push(imageSize);\n imageOffset += entryLength;\n }\n if (images.length === 0) {\n throw new TypeError('Invalid ICNS, no sizes found');\n }\n return {\n width: images[0].width,\n height: images[0].height,\n ...(images.length > 1 ? { images } : {}),\n };\n },\n};\n","import { readUInt32BE } from './utils.js';\nexport const J2C = {\n validate: (input) => readUInt32BE(input, 0) === 0xff4fff51,\n calculate: (input) => ({\n height: readUInt32BE(input, 12),\n width: readUInt32BE(input, 8),\n }),\n};\n","import { findBox, readUInt32BE, toUTF8String } from './utils.js';\nexport const JP2 = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'jP ')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === 'jp2 ';\n },\n calculate(input) {\n const jp2hBox = findBox(input, 'jp2h', 0);\n const ihdrBox = jp2hBox && findBox(input, 'ihdr', jp2hBox.offset + 8);\n if (ihdrBox) {\n return {\n height: readUInt32BE(input, ihdrBox.offset + 8),\n width: readUInt32BE(input, ihdrBox.offset + 12),\n };\n }\n throw new TypeError('Unsupported JPEG 2000 format');\n },\n};\n","import { readUInt, readUInt16BE, toHexString } from './utils.js';\nconst EXIF_MARKER = '45786966';\nconst APP1_DATA_SIZE_BYTES = 2;\nconst EXIF_HEADER_BYTES = 6;\nconst TIFF_BYTE_ALIGN_BYTES = 2;\nconst BIG_ENDIAN_BYTE_ALIGN = '4d4d';\nconst LITTLE_ENDIAN_BYTE_ALIGN = '4949';\nconst IDF_ENTRY_BYTES = 12;\nconst NUM_DIRECTORY_ENTRIES_BYTES = 2;\nfunction isEXIF(input) {\n return toHexString(input, 2, 6) === EXIF_MARKER;\n}\nfunction extractSize(input, index) {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2),\n };\n}\nfunction extractOrientation(exifBlock, isBigEndian) {\n const idfOffset = 8;\n const offset = EXIF_HEADER_BYTES + idfOffset;\n const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);\n for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {\n const start = offset +\n NUM_DIRECTORY_ENTRIES_BYTES +\n directoryEntryNumber * IDF_ENTRY_BYTES;\n const end = start + IDF_ENTRY_BYTES;\n if (start > exifBlock.length) {\n return;\n }\n const block = exifBlock.slice(start, end);\n const tagNumber = readUInt(block, 16, 0, isBigEndian);\n if (tagNumber === 274) {\n const dataFormat = readUInt(block, 16, 2, isBigEndian);\n if (dataFormat !== 3) {\n return;\n }\n const numberOfComponents = readUInt(block, 32, 4, isBigEndian);\n if (numberOfComponents !== 1) {\n return;\n }\n return readUInt(block, 16, 8, isBigEndian);\n }\n }\n}\nfunction validateExifBlock(input, index) {\n const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);\n const byteAlign = toHexString(exifBlock, EXIF_HEADER_BYTES, EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES);\n const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;\n const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;\n if (isBigEndian || isLittleEndian) {\n return extractOrientation(exifBlock, isBigEndian);\n }\n}\nfunction validateInput(input, index) {\n if (index > input.length) {\n throw new TypeError('Corrupt JPG, exceeded buffer limits');\n }\n}\nexport const JPG = {\n validate: (input) => toHexString(input, 0, 2) === 'ffd8',\n calculate(_input) {\n let input = _input.slice(4);\n let orientation;\n let next;\n while (input.length) {\n const i = readUInt16BE(input, 0);\n validateInput(input, i);\n if (input[i] !== 0xff) {\n input = input.slice(1);\n continue;\n }\n if (isEXIF(input)) {\n orientation = validateExifBlock(input, i);\n }\n next = input[i + 1];\n if (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n const size = extractSize(input, i + 5);\n if (!orientation) {\n return size;\n }\n return {\n height: size.height,\n orientation,\n width: size.width,\n };\n }\n input = input.slice(i + 2);\n }\n throw new TypeError('Invalid JPG, no size found');\n },\n};\n","export class BitReader {\n input;\n endianness;\n byteOffset = 2;\n bitOffset = 0;\n constructor(input, endianness) {\n this.input = input;\n this.endianness = endianness;\n }\n getBits(length = 1) {\n let result = 0;\n let bitsRead = 0;\n while (bitsRead < length) {\n if (this.byteOffset >= this.input.length) {\n throw new Error('Reached end of input');\n }\n const currentByte = this.input[this.byteOffset];\n const bitsLeft = 8 - this.bitOffset;\n const bitsToRead = Math.min(length - bitsRead, bitsLeft);\n if (this.endianness === 'little-endian') {\n const mask = (1 << bitsToRead) - 1;\n const bits = (currentByte >> this.bitOffset) & mask;\n result |= bits << bitsRead;\n }\n else {\n const mask = ((1 << bitsToRead) - 1) << (8 - this.bitOffset - bitsToRead);\n const bits = (currentByte & mask) >> (8 - this.bitOffset - bitsToRead);\n result = (result << bitsToRead) | bits;\n }\n bitsRead += bitsToRead;\n this.bitOffset += bitsToRead;\n if (this.bitOffset === 8) {\n this.byteOffset++;\n this.bitOffset = 0;\n }\n }\n return result;\n }\n}\n","import { BitReader } from '../utils/bit-reader.js';\nimport { toHexString } from './utils.js';\nfunction calculateImageDimension(reader, isSmallImage) {\n if (isSmallImage) {\n return 8 * (1 + reader.getBits(5));\n }\n const sizeClass = reader.getBits(2);\n const extraBits = [9, 13, 18, 30][sizeClass];\n return 1 + reader.getBits(extraBits);\n}\nfunction calculateImageWidth(reader, isSmallImage, widthMode, height) {\n if (isSmallImage && widthMode === 0) {\n return 8 * (1 + reader.getBits(5));\n }\n if (widthMode === 0) {\n return calculateImageDimension(reader, false);\n }\n const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];\n return Math.floor(height * aspectRatios[widthMode - 1]);\n}\nexport const JXLStream = {\n validate: (input) => {\n return toHexString(input, 0, 2) === 'ff0a';\n },\n calculate(input) {\n const reader = new BitReader(input, 'little-endian');\n const isSmallImage = reader.getBits(1) === 1;\n const height = calculateImageDimension(reader, isSmallImage);\n const widthMode = reader.getBits(3);\n const width = calculateImageWidth(reader, isSmallImage, widthMode, height);\n return { width, height };\n },\n};\n","import { JXLStream } from './jxl-stream.js';\nimport { findBox, toUTF8String } from './utils.js';\nfunction extractCodestream(input) {\n const jxlcBox = findBox(input, 'jxlc', 0);\n if (jxlcBox) {\n return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);\n }\n const partialStreams = extractPartialStreams(input);\n if (partialStreams.length > 0) {\n return concatenateCodestreams(partialStreams);\n }\n return undefined;\n}\nfunction extractPartialStreams(input) {\n const partialStreams = [];\n let offset = 0;\n while (offset < input.length) {\n const jxlpBox = findBox(input, 'jxlp', offset);\n if (!jxlpBox)\n break;\n if (jxlpBox.size < 12) {\n throw new TypeError('Invalid JXL');\n }\n partialStreams.push(input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size));\n offset = jxlpBox.offset + jxlpBox.size;\n }\n return partialStreams;\n}\nfunction concatenateCodestreams(partialCodestreams) {\n const totalLength = partialCodestreams.reduce((acc, curr) => acc + curr.length, 0);\n const codestream = new Uint8Array(totalLength);\n let position = 0;\n for (const partial of partialCodestreams) {\n codestream.set(partial, position);\n position += partial.length;\n }\n return codestream;\n}\nexport const JXL = {\n validate: (input) => {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'JXL ')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === 'jxl ';\n },\n calculate(input) {\n const codestream = extractCodestream(input);\n if (codestream)\n return JXLStream.calculate(codestream);\n throw new TypeError('Invalid JXL');\n },\n};\n","import { readUInt32LE, toUTF8String } from './utils.js';\nexport const KTX = {\n validate: (input) => {\n const signature = toUTF8String(input, 1, 7);\n return ['KTX 11', 'KTX 20'].includes(signature);\n },\n calculate: (input) => {\n const type = input[5] === 0x31 ? 'ktx' : 'ktx2';\n const offset = type === 'ktx' ? 36 : 20;\n return {\n height: readUInt32LE(input, offset + 4),\n width: readUInt32LE(input, offset),\n type,\n };\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nconst pngSignature = 'PNG\\r\\n\\x1a\\n';\nconst pngImageHeaderChunkName = 'IHDR';\nconst pngFriedChunkName = 'CgBI';\nexport const PNG = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError('Invalid PNG');\n }\n return true;\n }\n return false;\n },\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32),\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16),\n };\n },\n};\n","import { toUTF8String } from './utils.js';\nconst PNMTypes = {\n P1: 'pbm/ascii',\n P2: 'pgm/ascii',\n P3: 'ppm/ascii',\n P4: 'pbm',\n P5: 'pgm',\n P6: 'ppm',\n P7: 'pam',\n PF: 'pfm',\n};\nconst handlers = {\n default: (lines) => {\n let dimensions = [];\n while (lines.length > 0) {\n const line = lines.shift();\n if (line[0] === '#') {\n continue;\n }\n dimensions = line.split(' ');\n break;\n }\n if (dimensions.length === 2) {\n return {\n height: Number.parseInt(dimensions[1], 10),\n width: Number.parseInt(dimensions[0], 10),\n };\n }\n throw new TypeError('Invalid PNM');\n },\n pam: (lines) => {\n const size = {};\n while (lines.length > 0) {\n const line = lines.shift();\n if (line.length > 16 || line.charCodeAt(0) > 128) {\n continue;\n }\n const [key, value] = line.split(' ');\n if (key && value) {\n size[key.toLowerCase()] = Number.parseInt(value, 10);\n }\n if (size.height && size.width) {\n break;\n }\n }\n if (size.height && size.width) {\n return {\n height: size.height,\n width: size.width,\n };\n }\n throw new TypeError('Invalid PAM');\n },\n};\nexport const PNM = {\n validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,\n calculate(input) {\n const signature = toUTF8String(input, 0, 2);\n const type = PNMTypes[signature];\n const lines = toUTF8String(input, 3).split(/[\\r\\n]+/);\n const handler = handlers[type] || handlers.default;\n return handler(lines);\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nexport const PSD = {\n validate: (input) => toUTF8String(input, 0, 4) === '8BPS',\n calculate: (input) => ({\n height: readUInt32BE(input, 14),\n width: readUInt32BE(input, 18),\n }),\n};\n","import { toUTF8String } from './utils.js';\nconst svgReg = /<svg\\s([^>\"']|\"[^\"]*\"|'[^']*')*>/;\nconst extractorRegExps = {\n height: /\\sheight=(['\"])([^%]+?)\\1/,\n root: svgReg,\n viewbox: /\\sviewBox=(['\"])(.+?)\\1/i,\n width: /\\swidth=(['\"])([^%]+?)\\1/,\n};\nconst INCH_CM = 2.54;\nconst units = {\n in: 96,\n cm: 96 / INCH_CM,\n em: 16,\n ex: 8,\n m: (96 / INCH_CM) * 100,\n mm: 96 / INCH_CM / 10,\n pc: 96 / 72 / 12,\n pt: 96 / 72,\n px: 1,\n};\nconst unitsReg = new RegExp(`^([0-9.]+(?:e\\\\d+)?)(${Object.keys(units).join('|')})?$`);\nfunction parseLength(len) {\n const m = unitsReg.exec(len);\n if (!m) {\n return undefined;\n }\n return Math.round(Number(m[1]) * (units[m[2]] || 1));\n}\nfunction parseViewbox(viewbox) {\n const bounds = viewbox.split(' ');\n return {\n height: parseLength(bounds[3]),\n width: parseLength(bounds[2]),\n };\n}\nfunction parseAttributes(root) {\n const width = root.match(extractorRegExps.width);\n const height = root.match(extractorRegExps.height);\n const viewbox = root.match(extractorRegExps.viewbox);\n return {\n height: height && parseLength(height[2]),\n viewbox: viewbox && parseViewbox(viewbox[2]),\n width: width && parseLength(width[2]),\n };\n}\nfunction calculateByDimensions(attrs) {\n return {\n height: attrs.height,\n width: attrs.width,\n };\n}\nfunction calculateByViewbox(attrs, viewbox) {\n const ratio = viewbox.width / viewbox.height;\n if (attrs.width) {\n return {\n height: Math.floor(attrs.width / ratio),\n width: attrs.width,\n };\n }\n if (attrs.height) {\n return {\n height: attrs.height,\n width: Math.floor(attrs.height * ratio),\n };\n }\n return {\n height: viewbox.height,\n width: viewbox.width,\n };\n}\nexport const SVG = {\n validate: (input) => svgReg.test(toUTF8String(input, 0, 1000)),\n calculate(input) {\n const root = toUTF8String(input).match(extractorRegExps.root);\n if (root) {\n const attrs = parseAttributes(root[0]);\n if (attrs.width && attrs.height) {\n return calculateByDimensions(attrs);\n }\n if (attrs.viewbox) {\n return calculateByViewbox(attrs, attrs.viewbox);\n }\n }\n throw new TypeError('Invalid SVG');\n },\n};\n","import { readUInt16LE } from './utils.js';\nexport const TGA = {\n validate(input) {\n return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;\n },\n calculate(input) {\n return {\n height: readUInt16LE(input, 14),\n width: readUInt16LE(input, 12),\n };\n },\n};\n","import { readUInt, readUInt64, toHexString, toUTF8String } from './utils.js';\nconst CONSTANTS = {\n TAG: {\n WIDTH: 256,\n HEIGHT: 257,\n COMPRESSION: 259,\n },\n TYPE: {\n SHORT: 3,\n LONG: 4,\n LONG8: 16,\n },\n ENTRY_SIZE: {\n STANDARD: 12,\n BIG: 20,\n },\n COUNT_SIZE: {\n STANDARD: 2,\n BIG: 8,\n },\n};\nfunction readIFD(input, { isBigEndian, isBigTiff }) {\n const ifdOffset = isBigTiff\n ? Number(readUInt64(input, 8, isBigEndian))\n : readUInt(input, 32, 4, isBigEndian);\n const entryCountSize = isBigTiff\n ? CONSTANTS.COUNT_SIZE.BIG\n : CONSTANTS.COUNT_SIZE.STANDARD;\n return input.slice(ifdOffset + entryCountSize);\n}\nfunction readTagValue(input, type, offset, isBigEndian) {\n switch (type) {\n case CONSTANTS.TYPE.SHORT:\n return readUInt(input, 16, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG:\n return readUInt(input, 32, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG8: {\n const value = Number(readUInt64(input, offset, isBigEndian));\n if (value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError('Value too large');\n }\n return value;\n }\n default:\n return 0;\n }\n}\nfunction nextTag(input, isBigTiff) {\n const entrySize = isBigTiff\n ? CONSTANTS.ENTRY_SIZE.BIG\n : CONSTANTS.ENTRY_SIZE.STANDARD;\n if (input.length > entrySize) {\n return input.slice(entrySize);\n }\n}\nfunction extractTags(input, { isBigEndian, isBigTiff }) {\n const tags = {};\n let temp = input;\n while (temp?.length) {\n const code = readUInt(temp, 16, 0, isBigEndian);\n const type = readUInt(temp, 16, 2, isBigEndian);\n const length = isBigTiff\n ? Number(readUInt64(temp, 4, isBigEndian))\n : readUInt(temp, 32, 4, isBigEndian);\n if (code === 0)\n break;\n if (length === 1 &&\n (type === CONSTANTS.TYPE.SHORT ||\n type === CONSTANTS.TYPE.LONG ||\n (isBigTiff && type === CONSTANTS.TYPE.LONG8))) {\n const valueOffset = isBigTiff ? 12 : 8;\n tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);\n }\n temp = nextTag(temp, isBigTiff);\n }\n return tags;\n}\nfunction determineFormat(input) {\n const signature = toUTF8String(input, 0, 2);\n const version = readUInt(input, 16, 2, signature === 'MM');\n return {\n isBigEndian: signature === 'MM',\n isBigTiff: version === 43,\n };\n}\nfunction validateBigTIFFHeader(input, isBigEndian) {\n const byteSize = readUInt(input, 16, 4, isBigEndian);\n const reserved = readUInt(input, 16, 6, isBigEndian);\n if (byteSize !== 8 || reserved !== 0) {\n throw new TypeError('Invalid BigTIFF header');\n }\n}\nconst signatures = new Set([\n '49492a00',\n '4d4d002a',\n '49492b00',\n '4d4d002b',\n]);\nexport const TIFF = {\n validate: (input) => {\n const signature = toHexString(input, 0, 4);\n return signatures.has(signature);\n },\n calculate(input) {\n const format = determineFormat(input);\n if (format.isBigTiff) {\n validateBigTIFFHeader(input, format.isBigEndian);\n }\n const ifdBuffer = readIFD(input, format);\n const tags = extractTags(ifdBuffer, format);\n const info = {\n height: tags[CONSTANTS.TAG.HEIGHT],\n width: tags[CONSTANTS.TAG.WIDTH],\n type: format.isBigTiff ? 'bigtiff' : 'tiff',\n };\n if (tags[CONSTANTS.TAG.COMPRESSION]) {\n info.compression = tags[CONSTANTS.TAG.COMPRESSION];\n }\n if (!info.width || !info.height) {\n throw new TypeError('Invalid Tiff. Missing tags');\n }\n return info;\n },\n};\n","import { readInt16LE, readUInt24LE, toHexString, toUTF8String } from './utils.js';\nfunction calculateExtended(input) {\n return {\n height: 1 + readUInt24LE(input, 7),\n width: 1 + readUInt24LE(input, 4),\n };\n}\nfunction calculateLossless(input) {\n return {\n height: 1 +\n (((input[4] & 0xf) << 10) | (input[3] << 2) | ((input[2] & 0xc0) >> 6)),\n width: 1 + (((input[2] & 0x3f) << 8) | input[1]),\n };\n}\nfunction calculateLossy(input) {\n return {\n height: readInt16LE(input, 8) & 0x3fff,\n width: readInt16LE(input, 6) & 0x3fff,\n };\n}\nexport const WEBP = {\n validate(input) {\n const riffHeader = 'RIFF' === toUTF8String(input, 0, 4);\n const webpHeader = 'WEBP' === toUTF8String(input, 8, 12);\n const vp8Header = 'VP8' === toUTF8String(input, 12, 15);\n return riffHeader && webpHeader && vp8Header;\n },\n calculate(_input) {\n const chunkHeader = toUTF8String(_input, 12, 16);\n const input = _input.slice(20, 30);\n if (chunkHeader === 'VP8X') {\n const extendedHeader = input[0];\n const validStart = (extendedHeader & 0xc0) === 0;\n const validEnd = (extendedHeader & 0x01) === 0;\n if (validStart && validEnd) {\n return calculateExtended(input);\n }\n throw new TypeError('Invalid WebP');\n }\n if (chunkHeader === 'VP8 ' && input[0] !== 0x2f) {\n return calculateLossy(input);\n }\n const signature = toHexString(input, 3, 6);\n if (chunkHeader === 'VP8L' && signature !== '9d012a') {\n return calculateLossless(input);\n }\n throw new TypeError('Invalid WebP');\n },\n};\n","import { BMP } from './bmp.js';\nimport { CUR } from './cur.js';\nimport { DDS } from './dds.js';\nimport { GIF } from './gif.js';\nimport { HEIF } from './heif.js';\nimport { ICNS } from './icns.js';\nimport { ICO } from './ico.js';\nimport { J2C } from './j2c.js';\nimport { JP2 } from './jp2.js';\nimport { JPG } from './jpg.js';\nimport { JXL } from './jxl.js';\nimport { JXLStream } from './jxl-stream.js';\nimport { KTX } from './ktx.js';\nimport { PNG } from './png.js';\nimport { PNM } from './pnm.js';\nimport { PSD } from './psd.js';\nimport { SVG } from './svg.js';\nimport { TGA } from './tga.js';\nimport { TIFF } from './tiff.js';\nimport { WEBP } from './webp.js';\nexport const typeHandlers = new Map([\n ['bmp', BMP],\n ['cur', CUR],\n ['dds', DDS],\n ['gif', GIF],\n ['heif', HEIF],\n ['icns', ICNS],\n ['ico', ICO],\n ['j2c', J2C],\n ['jp2', JP2],\n ['jpg', JPG],\n ['jxl', JXL],\n ['jxl-stream', JXLStream],\n ['ktx', KTX],\n ['png', PNG],\n ['pnm', PNM],\n ['psd', PSD],\n ['svg', SVG],\n ['tga', TGA],\n ['tiff', TIFF],\n ['webp', WEBP],\n]);\nexport const types = Array.from(typeHandlers.keys());\n","import { typeHandlers, types } from './types/index.js';\nconst firstBytes = new Map([\n [0x00, 'heif'],\n [0x38, 'psd'],\n [0x42, 'bmp'],\n [0x44, 'dds'],\n [0x47, 'gif'],\n [0x49, 'tiff'],\n [0x4d, 'tiff'],\n [0x52, 'webp'],\n [0x69, 'icns'],\n [0x89, 'png'],\n [0xff, 'jpg'],\n]);\nexport function detector(input) {\n const byte = input[0];\n const type = firstBytes.get(byte);\n if (type && typeHandlers.get(type)?.validate(input)) {\n return type;\n }\n return types.find((type) => typeHandlers.get(type)?.validate(input));\n}\n","import { detector } from './detector.js';\nimport { typeHandlers } from './types/index.js';\nconst globalOptions = {\n disabledTypes: [],\n};\nexport function imageSize(input) {\n const type = detector(input);\n if (typeof type !== 'undefined') {\n if (globalOptions.disabledTypes.indexOf(type) > -1) {\n throw new TypeError(`disabled file type: ${type}`);\n }\n const size = typeHandlers.get(type)?.calculate(input);\n if (size !== undefined) {\n size.type = size.type ?? type;\n if (size.images && size.images.length > 1) {\n const largestImage = size.images.reduce((largest, current) => {\n return current.width * current.height > largest.width * largest.height\n ? current\n : largest;\n }, size.images[0]);\n size.width = largestImage.width;\n size.height = largestImage.height;\n }\n return size;\n }\n }\n throw new TypeError(`unsupported file type: ${type}`);\n}\nexport const disableTypes = (types) => {\n globalOptions.disabledTypes = types;\n};\n","import { createHash } from 'node:crypto';\nimport { imageSize } from 'image-size';\n\ntype Content = { text: string; byteLength: number; charOffset: number; byteOffset: number };\ntype Projection = { value: unknown; contents: Map<string, Content> };\n/** Transport-only image and large file-diff references. Reads require the caller's current authoritative\n * snapshot; the weak cache neither owns history nor keeps discarded snapshots alive. */\nexport class ConversationContentTransport {\n private readonly cache = new WeakMap<object, Projection>();\n constructor(private readonly conversationId: string) {}\n\n project<T>(source: T): T { return this.projection(source).value as T; }\n\n read(source: object, contentId: string, offset: number): { data: string; totalBytes: number; nextOffset: number | null } {\n const content = this.projection(source).contents.get(contentId);\n if (!content) throw new Error('Conversation content is no longer available.');\n if (!Number.isSafeInteger(offset) || offset < 0 || offset >= content.byteLength) throw new Error('Invalid content offset.');\n const end = Math.min(content.byteLength, offset + 64 * 1024);\n return { data: contentChunk(content, offset, end).toString('base64'), totalBytes: content.byteLength, nextOffset: end < content.byteLength ? end : null };\n }\n\n private projection(source: unknown): Projection {\n if (source && typeof source === 'object') {\n const cached = this.cache.get(source);\n if (cached) return cached;\n }\n const contents = new Map<string, Content>();\n const references = new Map<string, string>();\n const dimensions = new Map<string, { width: number; height: number } | undefined>();\n const visit = (value: unknown, field?: string): unknown => {\n if (typeof value === 'string' && ['url', 'imageUrl', 'image_url', 'previewUrl'].includes(field ?? '') && /^data:image\\/[a-z0-9.+-]+;base64,[a-z\\d+/]+=*$/i.test(value)) {\n let reference = references.get(value);\n if (!reference) {\n const id = contentHash(value);\n contents.set(id, { text: value, byteLength: value.length, charOffset: 0, byteOffset: 0 });\n reference = `conversation-image:${encodeURIComponent(this.conversationId)}:${id}`;\n references.set(value, reference);\n dimensions.set(reference, imageDimensions(value));\n }\n return reference;\n }\n if (!value || typeof value !== 'object') return value;\n const change = value as { path?: unknown; kind?: { type?: unknown }; diff?: unknown };\n if (typeof change.path === 'string' && ['add', 'update', 'delete'].includes(String(change.kind?.type))\n && typeof change.diff === 'string' && Buffer.byteLength(change.diff) > 64 * 1024) {\n const byteLength = Buffer.byteLength(change.diff);\n const contentId = contentHash(change.diff);\n contents.set(contentId, { text: change.diff, byteLength, charOffset: 0, byteOffset: 0 });\n return { ...value, diff: '', diffContent: { sessionId: this.conversationId, contentId, byteLength, changeKind: change.kind!.type } };\n }\n let changed = false;\n let size: { width: number; height: number } | undefined;\n const entries = Object.entries(value).map(([key, child]) => {\n const next = visit(child, key); changed ||= next !== child;\n if (typeof next === 'string') size ??= dimensions.get(next);\n return [key, next] as const;\n });\n return changed ? Array.isArray(value) ? entries.map(([, child]) => child) : { ...Object.fromEntries(entries), ...size } : value;\n };\n const projection = { value: visit(source), contents };\n if (source && typeof source === 'object') this.cache.set(source, projection);\n return projection;\n }\n}\n\n/** Retain the provider string, not another full binary copy. Non-ASCII diffs are\n * encoded in bounded blocks; the cursor makes sequential chunk reads linear. */\nfunction contentChunk(content: Content, start: number, end: number): Buffer {\n if (content.byteLength === content.text.length) return Buffer.from(content.text.slice(start, end));\n if (start < content.byteOffset) { content.charOffset = 0; content.byteOffset = 0; }\n const chunks: Buffer[] = [];\n while (content.byteOffset < end) {\n const nextChar = blockEnd(content.text, content.charOffset);\n const text = content.text.slice(content.charOffset, nextChar);\n const nextByte = content.byteOffset + Buffer.byteLength(text);\n if (nextByte > start) chunks.push(Buffer.from(text).subarray(Math.max(0, start - content.byteOffset), Math.min(nextByte, end) - content.byteOffset));\n if (nextByte >= end) break;\n content.charOffset = nextChar; content.byteOffset = nextByte;\n }\n return Buffer.concat(chunks, end - start);\n}\n\nfunction blockEnd(text: string, start: number): number {\n const end = Math.min(text.length, start + 16 * 1024);\n const last = text.charCodeAt(end - 1);\n return end < text.length && last >= 0xd800 && last <= 0xdbff ? end - 1 : end;\n}\n\nfunction contentHash(text: string): string {\n const hash = createHash('sha256');\n for (let start = 0; start < text.length;) {\n const end = blockEnd(text, start);\n hash.update(text.slice(start, end)); start = end;\n }\n return hash.digest('hex');\n}\n\n/** Probe a bounded header, never decode or duplicate the full image. Unsupported\n * or truncated headers omit metadata; the image remains readable unchanged. */\nexport function imageDimensions(dataUrl: string): { width: number; height: number } | undefined {\n try {\n const start = dataUrl.indexOf(',') + 1;\n const { width, height, orientation } = imageSize(Buffer.from(dataUrl.slice(start, start + 64 * 1024), 'base64'));\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width <= 0 || height <= 0) return undefined;\n return orientation && orientation >= 5 && orientation <= 8 ? { width: height, height: width } : { width, height };\n } catch { return undefined; }\n}\n","import { createHash } from 'node:crypto';\nimport { open, stat } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport type { FileHandle } from 'node:fs/promises';\nimport type { CodexAppServerClient } from '../codex';\nimport type { SurfaceMessage, SurfaceMessageMediaPart } from '@codex-app-sdk/core/surface';\nimport { codexImageDataUrl } from './codex-conversation-history';\nimport { imageDimensions } from './conversation-content-transport';\n\nconst MAX_RECORD = 32 * 1024 * 1024;\nconst MAX_IMAGE = 20 * 1024 * 1024;\nconst MAX_IMAGES = 2048;\ntype Location = { offset: number; length: number; turnId: string; callId: string; imageIndex: number; byteLength: number; hash: string; part: SurfaceMessageMediaPart };\ntype Index = { path: string; signature: string; images: Map<string, Location> };\ntype RecordValue = { type?: string; payload?: Record<string, unknown> };\n\n/** Read-only provider history. Retains at most two small offset indexes and two\n * encoded images under a shared budget; never writes files or keeps a second transcript. */\nexport class CodexOriginalHistoryImages {\n private readonly paths = new Map<string, string>();\n private readonly indexes = new Map<string, Index>();\n private disposed = false;\n private work: Promise<unknown> = Promise.resolve();\n private readonly images = new Map<string, { signature: string; url: string }>();\n constructor(private readonly client: CodexAppServerClient) {}\n\n forget(threadId: string) { this.paths.delete(threadId); this.indexes.delete(threadId); this.images.clear(); }\n clear() { this.disposed = true; this.paths.clear(); this.indexes.clear(); this.images.clear(); }\n\n rememberPath(threadId: string, path?: string | null): void {\n if (path !== undefined && path !== this.paths.get(threadId)) { this.indexes.delete(threadId); this.paths.delete(threadId); if (path && isAbsolute(path)) this.paths.set(threadId, path); }\n }\n\n async prepare(threadId: string, path?: string | null): Promise<(messages: SurfaceMessage[]) => SurfaceMessage[]> {\n this.rememberPath(threadId, path);\n let index: Index | undefined;\n try { index = await this.exclusive(() => this.index(threadId)); } catch { /* Unavailable provider history does not hide the normal transcript. */ }\n const parts = new Map<string, SurfaceMessageMediaPart[]>();\n for (const image of index?.images.values() ?? []) {\n const group = parts.get(image.turnId) ?? []; group.push(image.part); parts.set(image.turnId, group);\n }\n return messages => {\n const lastAssistant = new Map(messages.filter(m => m.role === 'assistant').map(m => [m.turnId, m.id]));\n return messages.map(message => {\n if (message.role !== 'assistant' || message.status === 'streaming') return message;\n const viewed = new Set(message.parts.filter(p => p.type === 'tool' && p.title === 'view_image').map(p => p.type === 'tool' ? p.id : ''));\n const kept = message.parts.filter(p => p.type !== 'media' || (!viewed.has(p.itemId ?? '') && !p.itemId?.startsWith('original-image:')));\n const originals = lastAssistant.get(message.turnId) === message.id ? parts.get(message.turnId ?? '') ?? [] : [];\n const final = kept.findIndex(p => p.type === 'text' && p.phase === 'final_answer');\n const at = final < 0 ? kept.length : final;\n return { ...message, parts: [...kept.slice(0, at), ...originals, ...kept.slice(at)] };\n });\n };\n }\n\n read(threadId: string, contentId: string, offset: number) {\n return this.exclusive(() => this.readOriginal(threadId, contentId, offset));\n }\n\n private exclusive<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.work.then(operation, operation);\n this.work = result.then(() => undefined, () => undefined);\n return result;\n }\n\n private async readOriginal(threadId: string, contentId: string, offset: number) {\n const index = await this.index(threadId);\n const location = index.images.get(contentId);\n if (!location) throw new Error('Original conversation image is no longer available.');\n if (!Number.isSafeInteger(offset) || offset < 0 || offset >= location.byteLength) throw new Error('Invalid content offset.');\n const signature = fileSignature(await stat(index.path));\n if (this.disposed || this.paths.get(threadId) !== index.path) throw new Error('Conversation image reader was released.');\n const cached = this.images.get(contentId);\n let url = cached?.signature === signature ? cached.url : undefined;\n this.images.delete(contentId);\n if (!url) {\n const file = await open(index.path, 'r');\n try {\n await verifyOwner(file, threadId);\n const bytes = Buffer.alloc(location.length);\n for (let position = 0; position < bytes.length;) {\n const result = await file.read(bytes, position, Math.min(64 * 1024, bytes.length - position), location.offset + position);\n if (!result.bytesRead) throw new Error('Original image record was truncated.');\n position += result.bytesRead;\n }\n const record = JSON.parse(bytes.toString('utf8')) as RecordValue;\n const payload = record.payload;\n if (record.type !== 'response_item' || payload?.type !== 'custom_tool_call_output' || payload.call_id !== location.callId\n || turnId(payload) !== location.turnId || !Array.isArray(payload.output)) throw new Error('Original image identity changed.');\n const block = payload.output[location.imageIndex];\n const candidate = imageUrl(block);\n if (!candidate || hash(candidate) !== location.hash) throw new Error('Original image bytes changed.');\n url = candidate;\n if (this.disposed || this.paths.get(threadId) !== index.path) throw new Error('Conversation image reader was released.');\n } finally { await file.close(); }\n }\n this.images.set(contentId, { signature, url });\n while (this.images.size > 2 || [...this.images.values()].reduce((sum, image) => sum + image.url.length, 0) > MAX_IMAGE) {\n this.images.delete(this.images.keys().next().value!);\n }\n const end = Math.min(url.length, offset + 64 * 1024);\n return { data: Buffer.from(url.slice(offset, end)).toString('base64'), totalBytes: url.length, nextOffset: end < url.length ? end : null };\n }\n\n private async index(threadId: string): Promise<Index> {\n if (this.disposed) throw new Error('Conversation image reader was released.');\n let path = this.paths.get(threadId);\n if (!path) {\n const { thread } = await this.client.request('thread/read', { threadId, includeTurns: false });\n if (thread.id !== threadId || !thread.path || !isAbsolute(thread.path)) throw new Error('Original history is unavailable.');\n if (this.disposed) throw new Error('Conversation image reader was released.');\n path = thread.path; this.paths.set(threadId, path);\n }\n const metadata = await stat(path);\n if (!metadata.isFile()) throw new Error('Original history is not a file.');\n const signature = fileSignature(metadata);\n const cached = this.indexes.get(threadId);\n if (cached?.signature === signature) return cached;\n const images = new Map<string, Location>();\n const calls = new Map<string, string>();\n const file = await open(path, 'r');\n try {\n await verifyOwner(file, threadId);\n let records = 0;\n for await (const line of lines(file, metadata.size)) {\n if (++records > 100_000 || images.size >= MAX_IMAGES) break;\n let record: RecordValue;\n try { record = JSON.parse(line.text) as RecordValue; } catch { continue; }\n const payload = record?.payload;\n if (record?.type !== 'response_item' || !payload || typeof payload.call_id !== 'string' || !payload.call_id || payload.call_id.length > 256) continue;\n const turn = turnId(payload);\n if (!turn) continue;\n if (payload.type === 'custom_tool_call') {\n if (calls.size < 4096) calls.set(payload.call_id, turn);\n continue;\n }\n if (payload.type !== 'custom_tool_call_output' || calls.get(payload.call_id) !== turn || !Array.isArray(payload.output)) continue;\n calls.delete(payload.call_id);\n for (let i = 0; i < Math.min(payload.output.length, 256) && images.size < MAX_IMAGES; i++) {\n const url = imageUrl(payload.output[i]);\n if (!url) continue;\n const digest = hash(url);\n const id = hash(JSON.stringify([threadId, turn, payload.call_id, i, digest]));\n images.set(id, { offset: line.offset, length: line.length, turnId: turn, callId: payload.call_id, imageIndex: i, byteLength: url.length, hash: digest,\n part: { type: 'media', phase: 'commentary', itemId: `original-image:${payload.call_id}:${i}`, media: {\n url: `conversation-image:${encodeURIComponent(threadId)}:${id}`, mimeType: url.slice(5, url.indexOf(';')),\n title: 'Recorded tool image', alt: 'Recorded tool image', ...imageDimensions(url),\n } } });\n }\n }\n } finally { await file.close(); }\n if (this.disposed || this.paths.get(threadId) !== path) throw new Error('Conversation image reader was released.');\n const index = { path, signature, images };\n this.indexes.delete(threadId); this.indexes.set(threadId, index);\n while (this.indexes.size > 2) this.indexes.delete(this.indexes.keys().next().value!);\n return index;\n }\n}\n\nfunction turnId(payload: Record<string, unknown>): string | undefined {\n const metadata = payload.internal_chat_message_metadata_passthrough;\n return metadata && typeof metadata === 'object' && 'turn_id' in metadata && typeof metadata.turn_id === 'string' && metadata.turn_id.length <= 256 ? metadata.turn_id : undefined;\n}\nfunction imageUrl(block: unknown): string | undefined {\n if (!block || typeof block !== 'object' || !('type' in block) || block.type !== 'input_image' || !('image_url' in block)\n || typeof block.image_url !== 'string' || block.image_url.length > MAX_IMAGE) return;\n return codexImageDataUrl(block.image_url)?.url;\n}\nfunction hash(text: string) { return createHash('sha256').update(text).digest('hex'); }\nfunction fileSignature(value: { dev: number; ino: number; size: number; mtimeMs: number }) { return `${value.dev}:${value.ino}:${value.size}:${value.mtimeMs}`; }\nasync function verifyOwner(file: FileHandle, threadId: string) {\n const header = Buffer.alloc(64 * 1024); const { bytesRead } = await file.read(header, 0, header.length, 0);\n const line = header.subarray(0, bytesRead).toString('utf8').split('\\n', 1)[0]!;\n const record = JSON.parse(line) as RecordValue;\n if (record?.type !== 'session_meta' || record.payload?.id !== threadId) throw new Error('Original history belongs to a different conversation.');\n}\n\n/** Fixed-size file reads; oversized records are skipped without retaining them. */\nasync function* lines(file: FileHandle, size: number) {\n let offset = 0, start = 0, length = 0; let pieces: Buffer[] = [];\n while (offset < size) {\n const chunk = Buffer.alloc(Math.min(64 * 1024, size - offset));\n const { bytesRead } = await file.read(chunk, 0, chunk.length, offset);\n if (!bytesRead) break;\n let from = 0;\n while (from < bytesRead) {\n const newline = chunk.indexOf(10, from), end = newline < 0 || newline >= bytesRead ? bytesRead : newline;\n const piece = chunk.subarray(from, end); length += piece.length;\n if (length <= MAX_RECORD) pieces.push(piece); else pieces = [];\n if (newline >= 0 && newline < bytesRead) {\n if (length <= MAX_RECORD) yield { offset: start, length, text: Buffer.concat(pieces, length).toString('utf8') };\n start = offset + end + 1; length = 0; pieces = [];\n }\n from = end + 1;\n }\n offset += bytesRead;\n }\n // A trailing partial record is ignored until the provider appends its newline.\n}\n\n/** Keep mutable viewed files as operations, not historical screenshot substitutes. */\nexport function suppressViewedImagePreviews(messages: SurfaceMessage[]): SurfaceMessage[] {\n return messages.map(message => {\n const viewed = new Set(message.parts.filter(p => p.type === 'tool' && p.title === 'view_image').map(p => p.type === 'tool' ? p.id : ''));\n return viewed.size ? { ...message, parts: message.parts.filter(p => p.type !== 'media' || !viewed.has(p.itemId ?? '')) } : message;\n });\n}\n","import type {\n CodexSurfaceEvent, CodexSurfaceEventOrigin, CodexSurfaceExecutionUsage, CodexSurfaceRequestUsage, CodexSurfaceTokenUsage,\n} from '@codex-app-sdk/core/surface';\n\ntype EventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent ? Omit<Event, 'seq' | 'occurredAt' | 'origin'> : never\n : never;\nconst unavailableRequestUsage: CodexSurfaceRequestUsage = {\n status: 'unavailable',\n reason: 'public-runtime-request-evidence-unavailable',\n unavailableFields: [\n 'requestIdentity', 'timestamp', 'actualModel', 'actualProvider', 'requestTokenUsage',\n 'cacheWriteLifetimes', 'cacheWriteInputInclusion', 'pricingContext',\n 'requestedModel', 'requestedServiceTier', 'reportedServiceTier', 'finality',\n ],\n requests: null,\n};\n\ntype Execution = { baseline: CodexSurfaceTokenUsage | null; latest: CodexSurfaceExecutionUsage | null;\n native?: { total: CodexSurfaceTokenUsage; execution: CodexSurfaceTokenUsage } };\ntype ThreadUsage = {\n total: CodexSurfaceTokenUsage | null;\n lastUsageTurnId: string | null;\n activeTurnId: string | null;\n executions: Map<string, Execution>;\n};\n\n/** Attributes provider counters only across locally observed execution boundaries. */\nexport class CodexSurfaceUsageController {\n private readonly threads = new Map<string, ThreadUsage>();\n\n clear(): void { this.threads.clear(); }\n\n recover(id: string, turnId: string, value: { total: CodexSurfaceTokenUsage; last: CodexSurfaceTokenUsage; execution: CodexSurfaceTokenUsage }): CodexSurfaceExecutionUsage | undefined {\n const record = this.threads.get(id)?.executions.get(turnId);\n if (!record) return;\n // Native history can flush after the corresponding live packet. Preserve\n // the newer live suffix while adding any native-only compaction charge.\n const suffix = record.latest ? difference(value.total, record.latest.total) : null;\n const execution = suffix ? add(value.execution, suffix) ?? value.execution : value.execution;\n const total = suffix ? record.latest!.total : value.total;\n const last = suffix ? record.latest!.last : value.last;\n record.native = structuredClone({ total, execution });\n const usage = { ...structuredClone({ last, total, execution }), observedStart: true, model: record.latest?.model ?? null,\n requestUsage: structuredClone(unavailableRequestUsage) };\n record.latest = structuredClone(usage);\n return usage;\n }\n\n /** A successful thread/start establishes zero prior consumption, unlike resume or fork. */\n observeEmptyConversation(id: string): void {\n // Preserve any provider evidence that arrived before the start response.\n if (this.threads.has(id)) return;\n this.thread(id).total = {\n totalTokens: 0, inputTokens: 0, cachedInputTokens: 0, cacheWriteInputTokens: 0,\n outputTokens: 0, reasoningOutputTokens: 0,\n };\n }\n\n observe(origin: CodexSurfaceEventOrigin, input: EventInput): EventInput {\n if (!('conversationId' in input)) return input;\n const id = input.conversationId;\n if ((input.type === 'conversation.historyReplaced' && input.payload.reason !== 'details' && input.payload.reason !== 'images') || input.type === 'conversation.summaryRemoved') {\n this.threads.delete(id);\n return input;\n }\n if (input.type === 'turn.started' && origin !== 'lifecycle') {\n const thread = this.thread(id);\n if (!thread.executions.has(input.turnId)) {\n thread.executions.set(input.turnId, {\n baseline: thread.lastUsageTurnId === input.turnId ? null : thread.total, latest: null,\n });\n }\n thread.activeTurnId = input.turnId;\n return input;\n }\n if (input.type === 'turn.completed') {\n const thread = this.threads.get(id);\n if (thread?.activeTurnId === input.turnId) thread.activeTurnId = null;\n return { ...input, payload: { ...input.payload, executionUsage: structuredClone(thread?.executions.get(input.turnId)?.latest ?? null) } };\n }\n if (input.type !== 'conversation.executionUsageChanged') return input;\n\n const thread = this.thread(id);\n const record = thread.executions.get(input.turnId);\n const incoming = input.payload.usage;\n const overlapping = thread.activeTurnId !== null && thread.activeTurnId !== input.turnId;\n if (overlapping) {\n const active = thread.executions.get(thread.activeTurnId!);\n if (active) { active.baseline = null; active.native = undefined; }\n if (record) { record.baseline = null; record.native = undefined; }\n }\n if (record && (!validCounts(incoming.total)\n || (record.latest && !nondecreasing(record.latest.total, incoming.total)))) {\n record.baseline = null; record.native = undefined;\n }\n const nativeDelta = record?.native ? difference(record.native.total, incoming.total) : null;\n const execution = record?.native && nativeDelta ? add(record.native.execution, nativeDelta)\n : record?.baseline ? difference(record.baseline, incoming.total) : null;\n if (record && execution === null) record.baseline = null;\n const usage: CodexSurfaceExecutionUsage = {\n ...incoming, execution, observedStart: Boolean(record),\n requestUsage: structuredClone(unavailableRequestUsage),\n };\n if (record) record.latest = structuredClone(usage);\n thread.total = !overlapping && validCounts(incoming.total) ? structuredClone(incoming.total) : null;\n thread.lastUsageTurnId = input.turnId;\n return { ...input, payload: { usage } };\n }\n\n private thread(id: string): ThreadUsage {\n let thread = this.threads.get(id);\n if (!thread) {\n thread = { total: null, lastUsageTurnId: null, activeTurnId: null, executions: new Map() };\n this.threads.set(id, thread);\n }\n return thread;\n }\n}\n\nconst requiredCounts = ['totalTokens', 'inputTokens', 'cachedInputTokens', 'outputTokens', 'reasoningOutputTokens'] as const;\nexport function validCounts(usage: CodexSurfaceTokenUsage): boolean {\n return requiredCounts.every(key => Number.isSafeInteger(usage[key]) && usage[key] >= 0)\n && (usage.cacheWriteInputTokens === null || (Number.isSafeInteger(usage.cacheWriteInputTokens) && usage.cacheWriteInputTokens >= 0))\n && usage.totalTokens === usage.inputTokens + usage.outputTokens\n && usage.cachedInputTokens <= usage.inputTokens && usage.reasoningOutputTokens <= usage.outputTokens;\n}\n\nfunction nondecreasing(before: CodexSurfaceTokenUsage, after: CodexSurfaceTokenUsage): boolean {\n return requiredCounts.every(key => after[key] >= before[key])\n && (before.cacheWriteInputTokens === null || after.cacheWriteInputTokens === null\n || after.cacheWriteInputTokens >= before.cacheWriteInputTokens);\n}\n\nfunction difference(before: CodexSurfaceTokenUsage, after: CodexSurfaceTokenUsage): CodexSurfaceTokenUsage | null {\n if (!validCounts(before) || !validCounts(after) || !nondecreasing(before, after)) return null;\n const delta: CodexSurfaceTokenUsage = {\n totalTokens: after.totalTokens - before.totalTokens,\n inputTokens: after.inputTokens - before.inputTokens,\n cachedInputTokens: after.cachedInputTokens - before.cachedInputTokens,\n cacheWriteInputTokens: before.cacheWriteInputTokens === null || after.cacheWriteInputTokens === null\n ? null : after.cacheWriteInputTokens - before.cacheWriteInputTokens,\n outputTokens: after.outputTokens - before.outputTokens,\n reasoningOutputTokens: after.reasoningOutputTokens - before.reasoningOutputTokens,\n };\n return validCounts(delta) ? delta : null;\n}\n\nfunction add(before: CodexSurfaceTokenUsage, delta: CodexSurfaceTokenUsage): CodexSurfaceTokenUsage | null {\n const result = Object.fromEntries(requiredCounts.map(key => [key, before[key] + delta[key]])) as unknown as CodexSurfaceTokenUsage;\n result.cacheWriteInputTokens = before.cacheWriteInputTokens === null || delta.cacheWriteInputTokens === null\n ? null : before.cacheWriteInputTokens + delta.cacheWriteInputTokens;\n return validCounts(result) ? result : null;\n}\n","import { open } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport type { CodexAppServerClient } from '../codex';\nimport type { CodexSurfaceTokenUsage } from '@codex-app-sdk/core/surface';\nimport { validCounts } from './codex-surface-usage-controller';\n\nexport type CodexHistoricalExecutionUsage = {\n turnId: string;\n recordedAt: string;\n execution: CodexSurfaceTokenUsage;\n total: CodexSurfaceTokenUsage;\n last: CodexSurfaceTokenUsage;\n status?: 'completed' | 'interrupted';\n};\ntype Index = { identity: string; size: number; mtimeMs: number; offset: number;\n turns: Map<string, CodexHistoricalExecutionUsage>; statuses: Map<string, 'completed' | 'interrupted'> };\nconst MAX_RECORD = 1024 * 1024;\n\n/** Numeric-only, read-only index of native 0.163/0.164 per-turn replacement counters.\n * File identity and ownership are checked before append reuse; no transcript is retained. */\nexport class CodexOriginalHistoryUsage {\n private readonly indexes = new Map<string, Index>();\n private work: Promise<unknown> = Promise.resolve();\n private readonly paths = new Map<string, string>();\n constructor(private readonly client?: CodexAppServerClient) {}\n clear(): void { this.indexes.clear(); this.paths.clear(); }\n forget(conversationId: string): void { this.paths.delete(conversationId); }\n\n async read(conversationId: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n if (!this.client) throw new Error('A provider client is required.');\n let filePath = this.paths.get(conversationId);\n if (!filePath) {\n const { thread } = await this.client.request('thread/read', { threadId: conversationId, includeTurns: false });\n if (thread.id !== conversationId || !thread.path) throw new Error('Original usage is unavailable.');\n filePath = thread.path;\n this.paths.set(conversationId, filePath);\n }\n return this.readFile(conversationId, filePath);\n }\n\n readFile(conversationId: string, filePath: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n const next = this.work.then(() => this.scan(conversationId, filePath));\n this.work = next.catch(() => undefined);\n return next;\n }\n\n private async scan(conversationId: string, filePath: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n if (!isAbsolute(filePath)) throw new Error('Original usage requires an absolute provider path.');\n const file = await open(filePath, 'r');\n try {\n const metadata = await file.stat();\n if (!metadata.isFile() || metadata.size > 2 * 1024 ** 3) throw new Error('Original usage is unavailable.');\n const header = Buffer.alloc(64 * 1024);\n const { bytesRead } = await file.read(header, 0, header.length, 0);\n const first = JSON.parse(header.subarray(0, bytesRead).toString('utf8').split('\\n', 1)[0]!);\n if (first?.type !== 'session_meta' || first.payload?.id !== conversationId) throw new Error('Original usage belongs to a different conversation.');\n const key = `${conversationId}\\0${filePath}`;\n const identity = `${metadata.dev}:${metadata.ino}`;\n let index = this.indexes.get(key);\n if (!index || index.identity !== identity || metadata.size < index.size || (metadata.size === index.size && metadata.mtimeMs !== index.mtimeMs)) {\n index = { identity, size: 0, mtimeMs: 0, offset: 0, turns: new Map(), statuses: new Map() };\n }\n if (metadata.size !== index.size || metadata.mtimeMs !== index.mtimeMs) {\n let at = index.offset;\n let pending = Buffer.alloc(0);\n let skipped = false;\n const buffer = Buffer.alloc(64 * 1024);\n while (at < metadata.size) {\n const { bytesRead: count } = await file.read(buffer, 0, Math.min(buffer.length, metadata.size - at), at);\n if (!count) break;\n let start = 0;\n for (let i = 0; i < count; i++) {\n if (buffer[i] !== 10) continue;\n const fragment = buffer.subarray(start, i);\n if (!skipped && pending.length + fragment.length <= MAX_RECORD) {\n this.record(index, conversationId, Buffer.concat([pending, fragment]).toString('utf8'));\n }\n pending = Buffer.alloc(0); skipped = false; start = i + 1; index.offset = at + start;\n }\n const tail = buffer.subarray(start, count);\n if (pending.length + tail.length > MAX_RECORD) { skipped = true; pending = Buffer.alloc(0); }\n else if (!skipped) pending = Buffer.concat([pending, tail]);\n at += count;\n }\n index.size = metadata.size; index.mtimeMs = metadata.mtimeMs;\n }\n this.indexes.delete(key); this.indexes.set(key, index);\n while (this.indexes.size > 8) this.indexes.delete(this.indexes.keys().next().value!);\n return structuredClone([...index.turns.values()].map(value => ({ ...value,\n ...(index.statuses.has(value.turnId) ? { status: index.statuses.get(value.turnId)! } : {}) })));\n } finally { await file.close(); }\n }\n\n private record(index: Index, conversationId: string, line: string): void {\n if (!line.includes('token_usage_record') && !line.includes('task_complete') && !line.includes('turn_aborted')) return;\n let value: any;\n try { value = JSON.parse(line); } catch { return; }\n const record = value.payload;\n if (value?.type === 'event_msg' && typeof record?.turn_id === 'string'\n && (record.type === 'task_complete' || record.type === 'turn_aborted')) {\n index.statuses.set(record.turn_id, record.type === 'task_complete' ? 'completed' : 'interrupted');\n if (index.statuses.size > 50_000) index.statuses.delete(index.statuses.keys().next().value!);\n return;\n }\n if (value?.type !== 'token_usage_record') return;\n if (record?.thread_id !== conversationId || typeof record.turn_id !== 'string' || !record.turn_id || record.turn_id.length > 256) return;\n if (typeof value.timestamp !== 'string' || !Number.isFinite(Date.parse(value.timestamp))) return;\n const execution = nativeCounts(record.turn_token_usage);\n const total = nativeCounts(record.thread_token_usage);\n const last = nativeCounts(record.usage);\n if (!execution || !total || !last) return;\n index.turns.set(record.turn_id, { turnId: record.turn_id, recordedAt: value.timestamp, execution, total, last });\n if (index.turns.size > 50_000) index.turns.delete(index.turns.keys().next().value!);\n }\n}\n\nfunction nativeCounts(value: any): CodexSurfaceTokenUsage | undefined {\n if (!value || typeof value !== 'object') return;\n const result = { totalTokens: value.total_tokens, inputTokens: value.input_tokens, cachedInputTokens: value.cached_input_tokens,\n cacheWriteInputTokens: value.cache_write_input_tokens ?? null, outputTokens: value.output_tokens, reasoningOutputTokens: value.reasoning_output_tokens };\n return validCounts(result) ? result : undefined;\n}\n","import type { v2 } from '../codex/index';\nimport type { CodexRealtimeInputAudioChunk } from '@codex-app-sdk/core/surface';\n\nexport function normalizedOptionalRealtimeString(\n value: string | undefined,\n field: string,\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'string') throw new TypeError(`Realtime ${field} must be a string`);\n const normalized = value.trim();\n if (!normalized) throw new TypeError(`Realtime ${field} cannot be empty`);\n return normalized;\n}\n\nexport function normalizedRealtimeText(value: string, field: string): string {\n if (typeof value !== 'string') throw new TypeError(`Realtime ${field} must be a string`);\n const normalized = value.trim();\n if (!normalized) throw new TypeError(`Realtime ${field} cannot be empty`);\n return normalized;\n}\n\nexport function realtimeAudioChunkParams(audio: CodexRealtimeInputAudioChunk): v2.ThreadRealtimeAudioChunk {\n if (!(audio.data instanceof Uint8Array)) {\n throw new TypeError('Realtime audio data must be a Uint8Array');\n }\n const sampleRate = positiveInteger(audio.sampleRate, 'sampleRate');\n const numChannels = positiveInteger(audio.numChannels, 'numChannels');\n const samplesPerChannel = audio.samplesPerChannel === undefined\n ? Math.floor(audio.data.byteLength / 2 / numChannels)\n : nullableNonNegativeInteger(audio.samplesPerChannel, 'samplesPerChannel');\n const itemId = audio.itemId === undefined ? null : audio.itemId;\n if (itemId !== null && (typeof itemId !== 'string' || !itemId.trim())) {\n throw new TypeError('Realtime audio itemId must be a non-empty string or null');\n }\n return {\n data: Buffer.from(audio.data.buffer, audio.data.byteOffset, audio.data.byteLength).toString('base64'),\n sampleRate,\n numChannels,\n samplesPerChannel,\n itemId,\n };\n}\n\nexport function realtimeAudioChunk(audio: v2.ThreadRealtimeAudioChunk): {\n data: Uint8Array;\n sampleRate: number;\n numChannels: number;\n samplesPerChannel: number | null;\n itemId: string | null;\n} {\n return {\n data: new Uint8Array(Buffer.from(audio.data, 'base64')),\n sampleRate: audio.sampleRate,\n numChannels: audio.numChannels,\n samplesPerChannel: audio.samplesPerChannel,\n itemId: audio.itemId,\n };\n}\n\nfunction positiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`Realtime audio ${field} must be a positive integer`);\n }\n return value;\n}\n\nfunction nullableNonNegativeInteger(value: number | null, field: string): number | null {\n if (value === null) return null;\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`Realtime audio ${field} must be a non-negative integer or null`);\n }\n return value;\n}\n","import type { CodexAppServerClient, RealtimeVoice } from '../codex/index';\nimport type { CodexConversationEvent, CodexRealtimeEvent, StartCodexRealtimeOptions } from '@codex-app-sdk/core/surface';\nimport type { CodexRealtimeSession } from './codex-surface-contracts';\nimport {\n normalizedOptionalRealtimeString,\n normalizedRealtimeText,\n realtimeAudioChunkParams,\n} from './codex-surface-realtime';\n\nexport type StartCodexRealtimeSessionContext = {\n client: CodexAppServerClient;\n ensureThreadReady(): Promise<void>;\n onConversationEvent(listener: (event: CodexConversationEvent) => void): () => void;\n options: StartCodexRealtimeOptions;\n threadId: string;\n};\n\nexport async function startCodexRealtimeSession(\n context: StartCodexRealtimeSessionContext,\n): Promise<CodexRealtimeSession> {\n const { client, ensureThreadReady, onConversationEvent, options, threadId } = context;\n await ensureThreadReady();\n const outputModality = options.outputModality;\n if (outputModality !== 'text' && outputModality !== 'audio') {\n throw new TypeError(`Invalid realtime output modality '${String(outputModality)}'`);\n }\n const version = options.version;\n if (version !== undefined && version !== 'v1' && version !== 'v2' && version !== 'v3') {\n throw new TypeError(`Invalid realtime version '${String(version)}'`);\n }\n const model = normalizedOptionalRealtimeString(options.model, 'model');\n const voice = normalizedOptionalRealtimeString(options.voice, 'voice');\n const transport = options.transport ?? { type: 'websocket' };\n if (transport.type !== 'websocket' && transport.type !== 'webrtc') {\n throw new TypeError(`Invalid realtime transport '${String((transport as { type?: unknown }).type)}'`);\n }\n if (transport.type === 'webrtc' && !transport.sdp.trim()) {\n throw new TypeError('WebRTC realtime transport requires a non-empty SDP offer');\n }\n const answer = transport.type === 'webrtc' ? deferredRealtimeSdp(onConversationEvent) : null;\n let remoteSdp: string | null;\n try {\n const [, sdp] = await Promise.all([client.request('thread/realtime/start', {\n threadId,\n outputModality,\n ...(model ? { model } : {}),\n ...(version ? { version } : {}),\n ...(voice ? { voice: voice as RealtimeVoice } : {}),\n ...(options.includeStartupContext !== undefined\n ? { includeStartupContext: options.includeStartupContext }\n : {}),\n ...(options.prompt !== undefined ? { prompt: options.prompt } : {}),\n ...(options.flushTranscriptTailOnSessionEnd !== undefined\n ? { flushTranscriptTailOnSessionEnd: options.flushTranscriptTailOnSessionEnd }\n : {}),\n transport: transport.type === 'webrtc'\n ? { type: 'webrtc', sdp: transport.sdp }\n : { type: 'websocket' },\n }), answer?.promise ?? Promise.resolve(null)]);\n remoteSdp = sdp;\n } catch (error) {\n answer?.cancel();\n throw error;\n }\n\n let stopped = false;\n const requireActive = (): void => {\n if (stopped) throw new Error(`Realtime session for '${threadId}' is stopped`);\n };\n return {\n conversationId: threadId,\n transport: transport.type,\n remoteSdp,\n appendAudio: async (audio) => {\n requireActive();\n if (transport.type === 'webrtc') {\n throw new Error('WebRTC realtime audio must be sent through its negotiated media track');\n }\n await client.request('thread/realtime/appendAudio', {\n threadId,\n audio: realtimeAudioChunkParams(audio),\n });\n },\n appendText: async (text, role = 'user') => {\n requireActive();\n const normalizedText = normalizedRealtimeText(text, 'text');\n if (role !== 'user' && role !== 'developer' && role !== 'assistant') {\n throw new TypeError(`Invalid realtime text role '${String(role)}'`);\n }\n await client.request('thread/realtime/appendText', { threadId, text: normalizedText, role });\n },\n appendSpeech: async (text) => {\n requireActive();\n await client.request('thread/realtime/appendSpeech', {\n threadId,\n text: normalizedRealtimeText(text, 'speech'),\n });\n },\n stop: async () => {\n if (stopped) return;\n await client.request('thread/realtime/stop', { threadId });\n stopped = true;\n },\n onEvent: (listener) => onConversationEvent((event) => {\n if (event.type.startsWith('realtime.')) listener(event as CodexRealtimeEvent);\n }),\n };\n}\n\nfunction deferredRealtimeSdp(\n onConversationEvent: StartCodexRealtimeSessionContext['onConversationEvent'],\n): { promise: Promise<string>; cancel(): void } {\n let unsubscribe: () => void = () => undefined;\n let timer: NodeJS.Timeout | undefined;\n let settled = false;\n const cleanup = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n unsubscribe();\n };\n const promise = new Promise<string>((resolve, reject) => {\n unsubscribe = onConversationEvent((event) => {\n if (event.type === 'realtime.sdp') {\n cleanup();\n resolve(event.payload.sdp);\n } else if (event.type === 'realtime.error') {\n cleanup();\n reject(new Error(event.payload.message));\n } else if (event.type === 'realtime.closed') {\n cleanup();\n reject(new Error('Realtime session closed before returning its WebRTC answer'));\n }\n });\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for the WebRTC realtime SDP answer'));\n }, 30_000);\n });\n return { promise, cancel: cleanup };\n}\n","import type {\n CodexSurfaceApproval,\n CodexSurfaceAuthentication,\n CodexSurfaceClientRequest,\n CodexSurfaceSnapshot,\n CodexConversationLoadingStrategy,\n CodexSurfaceSkill,\n CodexSurfaceThreadStatus,\n CodexSurfaceTurn,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport type { ThreadHistoryMode } from '../codex/generated/v2/ThreadHistoryMode';\n\nexport type ThreadRuntimeState = {\n threadId: string;\n cwd: string | null;\n hydrated: boolean;\n activeTurnId: string | null;\n turns: CodexSurfaceTurn[];\n turnIds: string[];\n messages: SurfaceMessage[];\n answeredClientRequestIds: string[];\n approvalPreset: CodexSurfaceSnapshot['approvalPreset'];\n approvalPresets: CodexSurfaceSnapshot['approvalPresets'];\n permissionProfiles: CodexSurfaceSnapshot['permissionProfiles'];\n skills: CodexSurfaceSkill[];\n skillCatalogStatus: CodexSurfaceSnapshot['skillCatalogStatus'];\n selectedModelId: string | null;\n selectedReasoningEffort: string | null;\n selectedServiceTier: string | null;\n planMode: boolean;\n executionPlan: CodexSurfaceSnapshot['executionPlan'];\n contextUsage: CodexSurfaceSnapshot['contextUsage'];\n goal: CodexSurfaceSnapshot['goal'];\n turnGitDiff: CodexSurfaceSnapshot['turnGitDiff'];\n threadStatus: CodexSurfaceThreadStatus | null;\n queuedPrompts: CodexSurfaceSnapshot['queuedPrompts'];\n busy: boolean;\n turnStartPending: boolean;\n historyLoading: boolean;\n historyMode: ThreadHistoryMode;\n loadingStrategy: CodexConversationLoadingStrategy;\n historyItemsView: 'full' | 'summary';\n historyCursor: string | null;\n historyHasOlder: boolean;\n historyLoadingOlder: boolean;\n fullHistoryHydrated: boolean;\n error: string | null;\n planMarkdownByTurn: Map<string, string>;\n};\n\nexport type ThreadRuntimePatch = Partial<Omit<ThreadRuntimeState, 'threadId' | 'planMarkdownByTurn'>>;\n\nexport type ConversationCatalogs = Pick<\n ThreadRuntimeState,\n 'approvalPresets' | 'permissionProfiles' | 'skillCatalogStatus' | 'skills'\n>;\n\nexport function initialSurfaceSnapshot(authentication: CodexSurfaceAuthentication): CodexSurfaceSnapshot {\n return {\n status: 'idle',\n authentication,\n conversations: [],\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n clientRequests: [],\n answeredClientRequestIds: [],\n approvals: [],\n models: [],\n modelCatalogStatus: 'notLoaded',\n skills: [],\n skillCatalogStatus: 'notLoaded',\n plugins: [],\n pluginCatalogStatus: 'notLoaded',\n permissionProfiles: [],\n approvalPresets: [],\n approvalPreset: null,\n selectedModelId: null,\n selectedReasoningEffort: null,\n selectedServiceTier: null,\n planMode: false,\n executionPlan: null,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n rateLimits: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n historyState: {\n loadingStrategy: 'lazy',\n hasOlder: false,\n loadingOlder: false,\n fullyLoaded: false,\n },\n error: null,\n };\n}\n\nexport function createThreadRuntime(\n threadId: string,\n state: CodexSurfaceSnapshot,\n patch: ThreadRuntimePatch = {},\n): ThreadRuntimeState {\n return {\n threadId,\n cwd: null,\n hydrated: false,\n activeTurnId: null,\n turns: [],\n turnIds: [],\n messages: [],\n answeredClientRequestIds: [],\n approvalPreset: state.approvalPreset,\n approvalPresets: [...state.approvalPresets],\n permissionProfiles: [...state.permissionProfiles],\n skills: [...state.skills],\n skillCatalogStatus: state.skillCatalogStatus,\n selectedModelId: state.selectedModelId,\n selectedReasoningEffort: state.selectedReasoningEffort,\n selectedServiceTier: state.selectedServiceTier ?? null,\n planMode: false,\n executionPlan: null,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n turnStartPending: false,\n historyLoading: false,\n historyMode: 'legacy',\n loadingStrategy: state.historyState?.loadingStrategy ?? 'lazy',\n historyItemsView: 'full',\n historyCursor: null,\n historyHasOlder: false,\n historyLoadingOlder: false,\n fullHistoryHydrated: false,\n error: null,\n planMarkdownByTurn: new Map(),\n ...patch,\n };\n}\n\nexport function runtimeProjection(\n runtime: ThreadRuntimeState,\n approvals: CodexSurfaceApproval[],\n clientRequests: CodexSurfaceClientRequest[],\n): Pick<\n CodexSurfaceSnapshot,\n | 'approvalPreset'\n | 'approvalPresets'\n | 'answeredClientRequestIds'\n | 'approvals'\n | 'activeTurnId'\n | 'busy'\n | 'clientRequests'\n | 'contextUsage'\n | 'error'\n | 'executionPlan'\n | 'goal'\n | 'historyLoading'\n | 'historyState'\n | 'messages'\n | 'permissionProfiles'\n | 'planMode'\n | 'queuedPrompts'\n | 'selectedModelId'\n | 'selectedReasoningEffort'\n | 'selectedServiceTier'\n | 'skillCatalogStatus'\n | 'skills'\n | 'threadStatus'\n | 'turnGitDiff'\n | 'turns'\n> {\n const projectedClientRequests = [...clientRequests];\n const knownClientRequestIds = new Set(projectedClientRequests.map((request) => request.id));\n const answeredClientRequestIds = new Set(runtime.answeredClientRequestIds);\n for (const message of runtime.messages) {\n const answeredByMessage = message.metadata?.asyncQuestionRequestIds;\n if (Array.isArray(answeredByMessage)) {\n for (const requestId of answeredByMessage) {\n if (typeof requestId === 'string') answeredClientRequestIds.add(requestId);\n }\n }\n }\n for (const message of runtime.messages) {\n for (const part of message.parts) {\n if (\n part.type !== 'question'\n || part.historical === true\n || knownClientRequestIds.has(part.request.id)\n || answeredClientRequestIds.has(part.request.id)\n ) continue;\n knownClientRequestIds.add(part.request.id);\n projectedClientRequests.push(part.request);\n }\n }\n return {\n activeTurnId: runtime.activeTurnId,\n approvalPreset: runtime.approvalPreset,\n approvalPresets: runtime.approvalPresets,\n answeredClientRequestIds: [...answeredClientRequestIds],\n approvals,\n busy: runtime.busy,\n clientRequests: projectedClientRequests,\n contextUsage: runtime.contextUsage,\n error: runtime.error,\n executionPlan: runtime.executionPlan,\n goal: runtime.goal,\n historyLoading: runtime.historyLoading,\n historyState: {\n loadingStrategy: runtime.loadingStrategy,\n ...(runtime.historyItemsView === 'summary' ? { itemsView: 'summary' as const } : {}),\n hasOlder: runtime.historyHasOlder,\n loadingOlder: runtime.historyLoadingOlder,\n fullyLoaded: runtime.fullHistoryHydrated,\n },\n messages: runtime.messages,\n permissionProfiles: runtime.permissionProfiles,\n planMode: runtime.planMode,\n queuedPrompts: runtime.queuedPrompts,\n selectedModelId: runtime.selectedModelId,\n selectedReasoningEffort: runtime.selectedReasoningEffort,\n selectedServiceTier: runtime.selectedServiceTier,\n skillCatalogStatus: runtime.skillCatalogStatus,\n skills: runtime.skills,\n threadStatus: runtime.threadStatus,\n turnGitDiff: runtime.turnGitDiff,\n turns: runtime.turns,\n };\n}\n","import type { v2 } from '../codex/index';\nimport type { CodexSurfaceAuthentication } from '@codex-app-sdk/core/surface';\n\nexport function initialAuthentication(): CodexSurfaceAuthentication {\n return {\n status: 'notLoaded',\n account: null,\n requiresOpenaiAuth: null,\n error: null,\n login: {\n status: 'idle',\n loginId: null,\n authUrl: null,\n error: null,\n },\n };\n}\n\nexport function surfaceAccount(account: v2.Account): NonNullable<CodexSurfaceAuthentication['account']> {\n if (account.type === 'chatgpt') {\n return { type: 'chatgpt', email: account.email, planType: account.planType };\n }\n if (account.type === 'amazonBedrock') {\n return {\n type: 'amazonBedrock',\n credentialSource: account.usesCodexManagedCredentials ? 'codexManaged' : 'awsManaged',\n };\n }\n return { type: 'apiKey' };\n}\n\nexport function surfaceAuthenticationKey(authentication: CodexSurfaceAuthentication): string {\n return JSON.stringify({\n account: authentication.account,\n requiresOpenaiAuth: authentication.requiresOpenaiAuth,\n });\n}\n\nexport function surfaceAuthenticationIdentityKey(authentication: CodexSurfaceAuthentication): string {\n const account = authentication.account;\n if (!account) {\n return JSON.stringify({ type: null, requiresOpenaiAuth: authentication.requiresOpenaiAuth });\n }\n if (account.type === 'chatgpt') return JSON.stringify({ type: account.type, email: account.email });\n if (account.type === 'amazonBedrock') {\n return JSON.stringify({ type: account.type, credentialSource: account.credentialSource });\n }\n return JSON.stringify({ type: account.type });\n}\n\nexport function normalizedLoginId(value: string): string {\n const loginId = value.trim();\n if (!loginId) throw new Error('Codex login id cannot be empty');\n return loginId;\n}\n\nexport function safeLoginUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error('Codex account/login/start returned an invalid authentication URL');\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error(`Codex account/login/start returned unsupported authentication URL scheme '${url.protocol}'`);\n }\n return url.href;\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceApprovalPreset,\n CodexSurfaceModel,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\n\nexport type SurfaceSelection = Pick<\n CodexSurfaceSnapshot,\n 'approvalPreset' | 'planMode' | 'selectedModelId' | 'selectedReasoningEffort'\n | 'selectedServiceTier'\n>;\n\nexport function selectedModel(\n models: CodexSurfaceModel[],\n idOrModel: string | null,\n): CodexSurfaceModel | null {\n return models.find((model) => model.id === idOrModel || model.model === idOrModel)\n ?? models.find((model) => model.isDefault)\n ?? models[0]\n ?? null;\n}\n\nexport function requireCatalogModel(models: CodexSurfaceModel[], idOrModel: string): CodexSurfaceModel {\n const model = models.find((candidate) => candidate.id === idOrModel || candidate.model === idOrModel);\n if (!model) throw new Error(`Unknown model '${idOrModel}'`);\n return model;\n}\n\nexport function validateReasoningEffort(\n model: CodexSurfaceModel | null,\n reasoningEffort: string | undefined,\n): void {\n if (!reasoningEffort) return;\n if (!model) throw new Error(`Cannot select reasoning effort '${reasoningEffort}' without a model`);\n const supported = model.supportedReasoningEfforts?.map((option) => option.reasoningEffort) ?? [];\n if (supported.length > 0 && !supported.includes(reasoningEffort)) {\n throw new Error(`Reasoning effort '${reasoningEffort}' is not available for '${model.displayName}'`);\n }\n}\n\nexport function defaultReasoningEffort(model: CodexSurfaceModel): string | null {\n return model.defaultReasoningEffort\n ?? model.supportedReasoningEfforts?.[0]?.reasoningEffort\n ?? null;\n}\n\nexport function defaultServiceTier(model: CodexSurfaceModel): string | null {\n return model.defaultServiceTier ?? null;\n}\n\nexport function validateServiceTier(\n model: CodexSurfaceModel | null,\n serviceTier: string | null | undefined,\n): void {\n if (!serviceTier) return;\n if (!model) throw new Error(`Cannot select service tier '${serviceTier}' without a model`);\n if (serviceTier === 'default' || serviceTier === model.defaultServiceTier) return;\n const supported = model.serviceTiers?.map((option) => option.id) ?? [];\n if (supported.length > 0 && !supported.includes(serviceTier)) {\n throw new Error(`Service tier '${serviceTier}' is not available for '${model.displayName}'`);\n }\n}\n\nexport function approvalPresetsForProfiles(\n profiles: CodexSurfaceSnapshot['permissionProfiles'],\n requirements: v2.ConfigRequirements | null,\n): CodexSurfaceApprovalPreset[] {\n const allowed = new Set(profiles.filter((profile) => profile.allowed).map((profile) => profile.id));\n const presets: CodexSurfaceApprovalPreset[] = [];\n if (\n allowed.has(':workspace')\n && requirementAllows(requirements?.allowedApprovalPolicies, 'on-request')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'user')\n ) presets.push('ask-for-approval');\n if (\n allowed.has(':workspace')\n && requirementAllows(requirements?.allowedApprovalPolicies, 'on-request')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'auto_review')\n ) presets.push('approve-for-me');\n if (\n (allowed.has(':danger-full-access') || allowed.has(':danger-no-sandbox'))\n && requirementAllows(requirements?.allowedApprovalPolicies, 'never')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'user')\n ) presets.push('full-access');\n return presets;\n}\n\nfunction requirementAllows<T>(values: T[] | null | undefined, value: T): boolean {\n return !Array.isArray(values) || values.length === 0 || values.includes(value);\n}\n\nexport function approvalPresetStartParams(preset: CodexSurfaceApprovalPreset): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer: v2.ApprovalsReviewer;\n permissions: string;\n} {\n if (preset === 'full-access') {\n return {\n approvalPolicy: 'never',\n approvalsReviewer: 'user',\n permissions: ':danger-full-access',\n };\n }\n return {\n approvalPolicy: 'on-request',\n approvalsReviewer: preset === 'approve-for-me' ? 'auto_review' : 'user',\n permissions: ':workspace',\n };\n}\n\nexport function approvalPresetUpdateParams(preset: CodexSurfaceApprovalPreset): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer: v2.ApprovalsReviewer;\n permissions: string;\n} {\n return approvalPresetStartParams(preset);\n}\n\nexport function approvalPresetFromSettings(\n approvalPolicy: v2.AskForApproval,\n approvalsReviewer: v2.ApprovalsReviewer,\n sandbox: v2.SandboxPolicy,\n activePermissionProfile: v2.ActivePermissionProfile | null,\n): CodexSurfaceApprovalPreset | null {\n const profile = activePermissionProfile?.id;\n if (\n approvalPolicy === 'never'\n && (\n sandbox.type === 'dangerFullAccess'\n || profile === ':danger-full-access'\n || profile === ':danger-no-sandbox'\n )\n ) return 'full-access';\n if (\n approvalPolicy === 'on-request'\n && (approvalsReviewer === 'auto_review' || approvalsReviewer === 'guardian_subagent')\n ) return 'approve-for-me';\n if (approvalPolicy === 'on-request') return 'ask-for-approval';\n return null;\n}\n\nexport function sessionSelection(\n response: v2.ThreadForkResponse | v2.ThreadResumeResponse | v2.ThreadStartResponse,\n models: CodexSurfaceModel[],\n current: CodexSurfaceSnapshot,\n): SurfaceSelection {\n const model = selectedModel(models, response.model);\n return {\n approvalPreset: approvalPresetFromSettings(\n response.approvalPolicy,\n response.approvalsReviewer,\n response.sandbox,\n response.activePermissionProfile,\n ) ?? current.approvalPreset,\n planMode: current.planMode,\n selectedModelId: model?.id ?? current.selectedModelId,\n selectedReasoningEffort: response.reasoningEffort ?? (model ? defaultReasoningEffort(model) : null),\n selectedServiceTier: response.serviceTier !== undefined\n ? response.serviceTier\n : model ? defaultServiceTier(model) : null,\n };\n}\n\nexport function threadSettingsSelection(\n settings: v2.ThreadSettings,\n models: CodexSurfaceModel[],\n current: CodexSurfaceSnapshot,\n): SurfaceSelection {\n const model = selectedModel(models, settings.model);\n return {\n approvalPreset: approvalPresetFromSettings(\n settings.approvalPolicy,\n settings.approvalsReviewer,\n settings.sandboxPolicy,\n settings.activePermissionProfile,\n ) ?? current.approvalPreset,\n planMode: settings.collaborationMode.mode === 'plan',\n selectedModelId: model?.id ?? current.selectedModelId,\n selectedReasoningEffort: settings.effort ?? (model ? defaultReasoningEffort(model) : null),\n selectedServiceTier: settings.serviceTier !== undefined\n ? settings.serviceTier\n : model ? defaultServiceTier(model) : null,\n };\n}\n\nexport function nextSelection(\n current: CodexSurfaceSnapshot,\n settings: UpdateCodexConversationSettings,\n): SurfaceSelection {\n let model = selectedModel(current.models, current.selectedModelId);\n if (settings.modelId) {\n model = current.models.find((candidate) => candidate.id === settings.modelId) ?? null;\n if (!model) throw new Error(`Unknown model '${settings.modelId}'`);\n }\n\n let reasoningEffort = settings.reasoningEffort ?? current.selectedReasoningEffort;\n let serviceTier = settings.serviceTier !== undefined\n ? settings.serviceTier\n : current.selectedServiceTier ?? null;\n const supported = model?.supportedReasoningEfforts?.map((option) => option.reasoningEffort) ?? [];\n if (settings.reasoningEffort && supported.length > 0 && !supported.includes(settings.reasoningEffort)) {\n throw new Error(`Reasoning effort '${settings.reasoningEffort}' is not available for '${model!.displayName}'`);\n }\n if (settings.modelId && supported.length > 0 && (!reasoningEffort || !supported.includes(reasoningEffort))) {\n reasoningEffort = model ? defaultReasoningEffort(model) : null;\n }\n if (settings.serviceTier !== undefined) validateServiceTier(model, serviceTier);\n if (settings.serviceTier === undefined && settings.modelId && serviceTier\n && !model!.serviceTiers?.some((tier) => tier.id === serviceTier)) {\n serviceTier = model ? defaultServiceTier(model) : null;\n }\n\n return {\n approvalPreset: settings.approvalPreset ?? current.approvalPreset,\n planMode: settings.planMode ?? current.planMode,\n selectedModelId: model?.id ?? null,\n selectedReasoningEffort: reasoningEffort,\n selectedServiceTier: serviceTier,\n };\n}\n\nexport function collaborationMode(\n planMode: boolean,\n model: string,\n reasoningEffort: string | null,\n): NonNullable<v2.TurnStartParams['collaborationMode']> {\n return {\n mode: planMode ? 'plan' : 'default',\n settings: {\n model,\n reasoning_effort: reasoningEffort,\n developer_instructions: null,\n },\n };\n}\n\nexport function turnSettings(\n state: CodexSurfaceSnapshot,\n options: SendCodexMessageOptions,\n): Pick<v2.TurnStartParams, 'collaborationMode' | 'effort' | 'model' | 'serviceTier'> {\n const selected = selectedModel(state.models, state.selectedModelId);\n const model = options.model ?? selected?.model;\n const effort = options.reasoningEffort ?? state.selectedReasoningEffort;\n const planMode = options.planMode ?? state.planMode;\n return {\n ...(model ? { model } : {}),\n ...(effort ? { effort } : {}),\n ...(model ? { collaborationMode: collaborationMode(planMode, model, effort) } : {}),\n ...(options.serviceTier !== undefined\n ? { serviceTier: options.serviceTier }\n : state.selectedServiceTier ? { serviceTier: state.selectedServiceTier } : {}),\n };\n}\n","import { basename, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { isDeepStrictEqual } from 'node:util';\nimport { fileAttachmentInput } from './codex-file-attachment';\nimport type { v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceAttachment,\n CodexSurfaceContextUsage,\n CodexSurfaceRateLimitSnapshot,\n CodexSurfaceRateLimits,\n CodexSurfaceSnapshot,\n CodexSurfaceThreadStatus,\n SendCodexMessageOptions,\n SurfaceMessage,\n SurfaceMessageAttachmentPart,\n} from '@codex-app-sdk/core/surface';\nimport {\n requireCatalogModel,\n selectedModel,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\n\nexport function threadToSummary(thread: v2.Thread): CodexConversationSummary {\n const preview = thread.preview.trim();\n const firstPreviewLine = preview.split('\\n')[0]!;\n return {\n id: thread.id,\n ...(thread.sessionId ? { sessionId: thread.sessionId } : {}),\n ...(thread.parentThreadId ? { parentConversationId: thread.parentThreadId } : {}),\n ...(thread.agentNickname ? { agentNickname: thread.agentNickname } : {}),\n ...(thread.agentRole ? { agentRole: thread.agentRole } : {}),\n title: thread.name?.trim() || firstPreviewLine.trim() || 'Untitled conversation',\n preview,\n cwd: thread.cwd,\n status: thread.status.type === 'active' ? 'active' : thread.status.type === 'systemError' ? 'error' : 'idle',\n turnCount: thread.turns.length,\n createdAt: new Date(thread.createdAt * 1000).toISOString(),\n updatedAt: new Date((thread.recencyAt ?? thread.updatedAt) * 1000).toISOString(),\n };\n}\n\n/**\n * Reuses previous items that a refresh left unchanged, and the previous list\n * itself when nothing changed, so state patches carry only real changes.\n */\nexport function reuseUnchangedItems<Item extends { id: string }>(previous: Item[], next: Item[]): Item[] {\n const previousById = new Map(previous.map((item) => [item.id, item]));\n const merged = next.map((item) => {\n const existing = previousById.get(item.id);\n return existing && isDeepStrictEqual(existing, item) ? existing : item;\n });\n return merged.length === previous.length && merged.every((item, index) => item === previous[index])\n ? previous\n : merged;\n}\n\nexport function upsertConversation(\n conversations: CodexConversationSummary[],\n next: CodexConversationSummary,\n): CodexConversationSummary[] {\n return [next, ...conversations.filter((conversation) => conversation.id !== next.id)]\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n}\n\nexport function validatedSendOptions(\n state: CodexSurfaceSnapshot,\n options: SendCodexMessageOptions,\n): SendCodexMessageOptions {\n const model = options.model\n ? requireCatalogModel(state.models, options.model)\n : selectedModel(state.models, state.selectedModelId);\n validateReasoningEffort(model, options.reasoningEffort);\n validateServiceTier(model, options.serviceTier);\n return {\n ...options,\n ...(options.attachments ? { attachments: validateAttachments(options.attachments) } : {}),\n ...(options.model && model ? { model: model.model } : {}),\n };\n}\n\nexport function validateAttachments(attachments: readonly CodexSurfaceAttachment[]): CodexSurfaceAttachment[] {\n return attachments.map((attachment) => {\n const path = attachment.path.trim();\n if (!path) throw new Error('Attachment paths cannot be empty');\n if (!isAbsolute(path)) throw new Error(`Attachment path must be absolute: '${path}'`);\n if (attachment.type === 'image') return { ...attachment, path };\n const name = attachment.name?.trim();\n return { ...attachment, path, ...(name ? { name } : {}) };\n });\n}\n\nexport function attachmentInput(attachment: CodexSurfaceAttachment): v2.UserInput {\n if (attachment.type === 'image') {\n return {\n type: 'localImage',\n path: attachment.path,\n ...(attachment.detail === undefined ? {} : { detail: attachment.detail }),\n };\n }\n return fileAttachmentInput(attachment.name ?? basename(attachment.path), attachment.path);\n}\n\nexport function surfaceAttachmentPart(attachment: CodexSurfaceAttachment): SurfaceMessageAttachmentPart {\n const name = attachment.name?.trim() || basename(attachment.path);\n if (attachment.type === 'image') {\n return {\n type: 'attachment',\n attachment: {\n kind: 'image',\n name,\n path: attachment.path,\n url: attachment.previewUrl ?? pathToFileURL(attachment.path).href,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n },\n };\n }\n return {\n type: 'attachment',\n attachment: {\n kind: 'file',\n name,\n path: attachment.path,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n },\n };\n}\n\nexport function messageTurnIdOrNull(message: SurfaceMessage): string | null {\n const metadataTurnId = message.metadata?.turnId;\n return message.turnId ?? (typeof metadataTurnId === 'string' ? metadataTurnId : null);\n}\n\nexport function messageTurnId(message: SurfaceMessage): string {\n const turnId = messageTurnIdOrNull(message);\n if (!turnId) throw new Error('This message is not associated with a Codex turn');\n return turnId;\n}\n\nexport function surfaceMessageText(message: SurfaceMessage): string {\n return message.parts\n .filter((part): part is Extract<SurfaceMessage['parts'][number], { type: 'text' }> => part.type === 'text')\n .map((part) => part.text)\n .join('\\n')\n .trim();\n}\n\nexport function surfaceMessageAttachments(message: SurfaceMessage): CodexSurfaceAttachment[] {\n return message.parts.flatMap((part): CodexSurfaceAttachment[] => {\n if (part.type !== 'attachment') return [];\n const attachment = part.attachment;\n const attachmentPath = attachment.path;\n if (!attachmentPath) return [];\n if (attachment.kind === 'image') {\n return [{\n type: 'image',\n path: attachmentPath,\n name: attachment.name,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n ...(attachment.url?.startsWith('data:image/') ? { previewUrl: attachment.url } : {}),\n }];\n }\n return [{\n type: 'file',\n path: attachmentPath,\n name: attachment.name,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n }];\n });\n}\n\nexport function surfaceTokenUsage(usage: v2.TokenUsageBreakdown): import('@codex-app-sdk/core/surface').CodexSurfaceTokenUsage {\n return {\n totalTokens: usage.totalTokens, inputTokens: usage.inputTokens,\n cachedInputTokens: usage.cachedInputTokens, cacheWriteInputTokens: usage.cacheWriteInputTokens ?? null,\n outputTokens: usage.outputTokens, reasoningOutputTokens: usage.reasoningOutputTokens,\n };\n}\n\nexport function surfaceContextUsage(tokenUsage: v2.ThreadTokenUsage): CodexSurfaceContextUsage {\n const modelContextWindow = tokenUsage.modelContextWindow;\n const contextTokens = tokenUsage.last.totalTokens;\n const usedPercent = typeof modelContextWindow === 'number' && modelContextWindow > 0\n ? Math.min(100, Math.max(0, (contextTokens / modelContextWindow) * 100))\n : null;\n return {\n totalTokens: tokenUsage.total.totalTokens,\n inputTokens: tokenUsage.total.inputTokens,\n cachedInputTokens: tokenUsage.total.cachedInputTokens,\n outputTokens: tokenUsage.total.outputTokens,\n reasoningOutputTokens: tokenUsage.total.reasoningOutputTokens,\n lastTotalTokens: tokenUsage.last.totalTokens,\n modelContextWindow,\n usedPercent,\n };\n}\n\nexport function surfaceThreadStatus(status: v2.ThreadStatus): CodexSurfaceThreadStatus {\n return status.type === 'active'\n ? { type: 'active', activeFlags: [...status.activeFlags] }\n : { type: status.type };\n}\n\nexport function conversationStatus(status: v2.ThreadStatus): CodexConversationSummary['status'] {\n if (status.type === 'active') return 'active';\n if (status.type === 'systemError') return 'error';\n return 'idle';\n}\n\nexport function surfaceRateLimits(response: v2.GetAccountRateLimitsResponse): CodexSurfaceRateLimits {\n const byLimitId = response.rateLimitsByLimitId\n ? Object.fromEntries(Object.entries(response.rateLimitsByLimitId)\n .filter((entry): entry is [string, v2.RateLimitSnapshot] => Boolean(entry[1]))\n .map(([limitId, snapshot]) => [limitId, surfaceRateLimitSnapshot(snapshot)]))\n : null;\n return {\n rateLimits: surfaceRateLimitSnapshot(response.rateLimits),\n rateLimitsByLimitId: byLimitId,\n rateLimitResetCredits: response.rateLimitResetCredits ? {\n availableCount: nonnegativeDecimal(response.rateLimitResetCredits.availableCount),\n credits: response.rateLimitResetCredits.credits?.map((credit) => ({ ...credit })) ?? null,\n } : null,\n };\n}\n\n/** JSON may decode protocol bigint fields as numbers. Never publish rounded counts. */\nexport function nonnegativeDecimal(value: unknown): string {\n if (typeof value === 'bigint' && value >= 0n) return value.toString();\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return String(value);\n if (typeof value === 'string' && /^(0|[1-9][0-9]*)$/.test(value)) return value;\n throw new Error('Invalid account count: expected an exact nonnegative integer');\n}\n\nexport function surfaceAccountUsage(response: v2.GetAccountTokenUsageResponse): import('@codex-app-sdk/core/surface').CodexSurfaceAccountUsage {\n const decimal = (value: bigint | null) => value === null ? null : nonnegativeDecimal(value);\n return {\n summary: {\n lifetimeTokens: decimal(response.summary.lifetimeTokens),\n peakDailyTokens: decimal(response.summary.peakDailyTokens),\n longestRunningTurnSec: decimal(response.summary.longestRunningTurnSec),\n currentStreakDays: decimal(response.summary.currentStreakDays),\n longestStreakDays: decimal(response.summary.longestStreakDays),\n },\n dailyUsageBuckets: response.dailyUsageBuckets?.map(bucket => ({\n startDate: bucket.startDate, tokens: nonnegativeDecimal(bucket.tokens),\n })) ?? null,\n };\n}\n\nexport function surfaceRateLimitSnapshot(snapshot: v2.RateLimitSnapshot): CodexSurfaceRateLimitSnapshot {\n return {\n limitId: snapshot.limitId,\n limitName: snapshot.limitName,\n primary: snapshot.primary ? { ...snapshot.primary } : null,\n secondary: snapshot.secondary ? { ...snapshot.secondary } : null,\n credits: snapshot.credits ? { ...snapshot.credits } : null,\n individualLimit: snapshot.individualLimit ? { ...snapshot.individualLimit } : null,\n planType: snapshot.planType,\n rateLimitReachedType: snapshot.rateLimitReachedType,\n };\n}\n\nexport function mergeSurfaceRateLimits(\n current: CodexSurfaceRateLimits | null,\n update: v2.RateLimitSnapshot,\n): CodexSurfaceRateLimits {\n const next = surfaceRateLimitSnapshot(update);\n if (!current) {\n return {\n rateLimits: next,\n rateLimitsByLimitId: next.limitId ? { [next.limitId]: next } : null,\n rateLimitResetCredits: null,\n };\n }\n const merged = mergeRateLimitSnapshot(current.rateLimits, next);\n const rateLimitsByLimitId = current.rateLimitsByLimitId ? { ...current.rateLimitsByLimitId } : {};\n if (merged.limitId) {\n rateLimitsByLimitId[merged.limitId] = mergeRateLimitSnapshot(\n rateLimitsByLimitId[merged.limitId] ?? merged,\n next,\n );\n }\n return {\n ...current,\n rateLimits: merged,\n rateLimitsByLimitId: Object.keys(rateLimitsByLimitId).length > 0 ? rateLimitsByLimitId : null,\n };\n}\n\nexport function mergeRateLimitSnapshot(\n current: CodexSurfaceRateLimitSnapshot,\n update: CodexSurfaceRateLimitSnapshot,\n): CodexSurfaceRateLimitSnapshot {\n return {\n limitId: update.limitId ?? current.limitId,\n limitName: update.limitName ?? current.limitName,\n primary: update.primary ? { ...(current.primary ?? {}), ...update.primary } : current.primary,\n secondary: update.secondary ? { ...(current.secondary ?? {}), ...update.secondary } : current.secondary,\n credits: update.credits ? { ...(current.credits ?? {}), ...update.credits } : current.credits,\n individualLimit: update.individualLimit\n ? { ...(current.individualLimit ?? {}), ...update.individualLimit }\n : current.individualLimit,\n planType: update.planType ?? current.planType,\n rateLimitReachedType: update.rateLimitReachedType ?? current.rateLimitReachedType,\n };\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexAppServerTransportOptions, CodexSurfaceOptions } from './codex-surface-contracts';\nimport type { CodexAppServerUnixSocketTransportOptions } from './codex-unix-socket-transport';\n\nexport function isUnixSocketTransportOptions(\n options: CodexAppServerTransportOptions,\n): options is CodexAppServerUnixSocketTransportOptions {\n return 'type' in options && options.type === 'unixSocket';\n}\n\nexport function surfaceTransportOptions(options: CodexSurfaceOptions): CodexAppServerTransportOptions {\n const topLevelHome = options.codexHome === undefined\n ? undefined\n : absoluteCodexHome(options.codexHome);\n const transportHome = options.transport?.codexHome;\n if (topLevelHome !== undefined && transportHome !== undefined && topLevelHome !== transportHome) {\n throw new Error('Codex surface codexHome conflicts with transport.codexHome');\n }\n const transport = options.transport ?? {};\n return {\n ...transport,\n ...(topLevelHome === undefined ? {} : { codexHome: topLevelHome }),\n };\n}\n\nexport function absoluteCodexHome(value: string): string {\n const codexHome = value.trim();\n if (!codexHome) throw new Error('Codex surface codexHome cannot be empty');\n if (!isAbsolute(codexHome)) throw new Error('Codex surface codexHome must be an absolute path');\n return codexHome;\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceAuthentication,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport {\n normalizedLoginId,\n safeLoginUrl,\n surfaceAccount,\n surfaceAuthenticationIdentityKey,\n} from './codex-surface-authentication';\nimport { errorMessage } from './codex-surface-prompts';\n\nexport type CodexSurfaceAuthenticationHost = {\n bootstrapSurfaceData(force?: boolean): Promise<void>;\n clearAuthenticatedSurfaceData(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n patchAuthentication(patch: Partial<CodexSurfaceAuthentication>, origin: CodexSurfaceEventOrigin): void;\n reportError(error: unknown): void;\n};\n\nexport class CodexSurfaceAuthenticationController {\n private accountRefreshPromise: Promise<CodexSurfaceSnapshot> | null = null;\n private accountRefreshRequested = false;\n private accountRefreshForceBootstrap = false;\n private accountRefreshOrigin: CodexSurfaceEventOrigin = 'action';\n private chatGptLoginPromise: Promise<CodexSurfaceChatGptLogin> | null = null;\n private chatGptDeviceCodeLoginPromise: Promise<CodexSurfaceChatGptDeviceCodeLogin> | null = null;\n private activeChatGptDeviceCodeLogin: CodexSurfaceChatGptDeviceCodeLogin | null = null;\n private lastLoadedAuthenticationIdentityKey: string | null = null;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceAuthenticationHost,\n ) {}\n\n pendingRefresh(): Promise<CodexSurfaceSnapshot> | null {\n return this.accountRefreshPromise;\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n const current = this.host.getSnapshot().authentication.login;\n if (current.status === 'pending' && current.loginId && current.authUrl) {\n return { loginId: current.loginId, authUrl: current.authUrl };\n }\n if (this.chatGptLoginPromise) return this.chatGptLoginPromise;\n const start = (async () => {\n this.host.patchAuthentication({\n login: { status: 'starting', loginId: null, authUrl: null, error: null },\n }, 'action');\n try {\n const response = await this.client.request('account/login/start', { type: 'chatgpt' });\n if (response.type !== 'chatgpt') {\n throw new Error(`Codex account/login/start returned unexpected login type '${response.type}'`);\n }\n const loginId = normalizedLoginId(response.loginId);\n const authUrl = safeLoginUrl(response.authUrl);\n this.host.patchAuthentication({\n login: { status: 'pending', loginId, authUrl, error: null },\n }, 'action');\n return { loginId, authUrl };\n } catch (error) {\n this.host.patchAuthentication({\n login: { status: 'error', loginId: null, authUrl: null, error: errorMessage(error) },\n }, 'action');\n throw error;\n }\n })();\n this.chatGptLoginPromise = start;\n void start.finally(() => {\n this.chatGptLoginPromise = null;\n }).catch(() => undefined);\n return start;\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n const current = this.host.getSnapshot().authentication.login;\n if (\n current.status === 'pending'\n && current.loginId === this.activeChatGptDeviceCodeLogin?.loginId\n && current.authUrl === this.activeChatGptDeviceCodeLogin.verificationUrl\n ) {\n return this.activeChatGptDeviceCodeLogin;\n }\n if (this.chatGptDeviceCodeLoginPromise) return this.chatGptDeviceCodeLoginPromise;\n const start = (async () => {\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: { status: 'starting', loginId: null, authUrl: null, error: null },\n }, 'action');\n try {\n const response = await this.client.request('account/login/start', { type: 'chatgptDeviceCode' });\n if (response.type !== 'chatgptDeviceCode') {\n throw new Error(`Codex account/login/start returned unexpected login type '${response.type}'`);\n }\n const loginId = normalizedLoginId(response.loginId);\n const verificationUrl = safeLoginUrl(response.verificationUrl);\n const userCode = response.userCode.trim();\n if (!userCode) throw new Error('Codex account/login/start returned an empty device user code');\n this.host.patchAuthentication({\n login: { status: 'pending', loginId, authUrl: verificationUrl, error: null },\n }, 'action');\n const login = { loginId, verificationUrl, userCode };\n this.activeChatGptDeviceCodeLogin = login;\n return login;\n } catch (error) {\n this.host.patchAuthentication({\n login: { status: 'error', loginId: null, authUrl: null, error: errorMessage(error) },\n }, 'action');\n throw error;\n }\n })();\n this.chatGptDeviceCodeLoginPromise = start;\n void start.finally(() => {\n this.chatGptDeviceCodeLoginPromise = null;\n }).catch(() => undefined);\n return start;\n }\n\n async cancelLogin(loginId: string): Promise<CodexSurfaceSnapshot> {\n const normalized = normalizedLoginId(loginId);\n const response = await this.client.request('account/login/cancel', { loginId: normalized });\n this.host.patchAuthentication({\n login: {\n status: response.status === 'canceled' ? 'cancelled' : 'idle',\n loginId: null,\n authUrl: null,\n error: null,\n },\n }, 'action');\n this.activeChatGptDeviceCodeLogin = null;\n return this.host.getSnapshot();\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n await this.client.request('account/logout', undefined);\n this.host.patchAuthentication({\n login: { status: 'idle', loginId: null, authUrl: null, error: null },\n }, 'action');\n this.activeChatGptDeviceCodeLogin = null;\n const authenticationChanged = await this.load('action');\n if (authenticationChanged || this.blocksBootstrap()) {\n await this.host.clearAuthenticatedSurfaceData();\n }\n if (!this.blocksBootstrap()) await this.host.bootstrapSurfaceData(true);\n return this.host.getSnapshot();\n }\n\n refresh(\n origin: CodexSurfaceEventOrigin,\n forceBootstrap = false,\n ): Promise<CodexSurfaceSnapshot> {\n this.accountRefreshRequested = true;\n this.accountRefreshForceBootstrap ||= forceBootstrap;\n this.accountRefreshOrigin = origin;\n if (this.accountRefreshPromise) return this.accountRefreshPromise;\n const refresh = (async () => {\n while (this.accountRefreshRequested) {\n const refreshOrigin = this.accountRefreshOrigin;\n const refreshForceBootstrap = this.accountRefreshForceBootstrap;\n this.accountRefreshRequested = false;\n this.accountRefreshForceBootstrap = false;\n try {\n const authenticationChanged = await this.load(refreshOrigin);\n if (authenticationChanged || this.blocksBootstrap()) {\n await this.host.clearAuthenticatedSurfaceData();\n }\n if (!this.blocksBootstrap()) {\n await this.host.bootstrapSurfaceData(refreshForceBootstrap);\n }\n } catch (error) {\n if (!this.accountRefreshRequested) throw error;\n this.accountRefreshForceBootstrap ||= refreshForceBootstrap;\n }\n }\n return this.host.getSnapshot();\n })();\n this.accountRefreshPromise = refresh;\n void refresh.finally(() => {\n this.accountRefreshPromise = null;\n }).catch(() => undefined);\n return refresh;\n }\n\n async load(origin: CodexSurfaceEventOrigin): Promise<boolean> {\n const previousAuthenticationIdentityKey = this.lastLoadedAuthenticationIdentityKey;\n this.host.patchAuthentication({ status: 'loading', error: null }, origin);\n try {\n const response = await this.client.request('account/read', { refreshToken: false });\n const account = response.account ? surfaceAccount(response.account) : null;\n const authentication = {\n ...this.host.getSnapshot().authentication,\n account,\n requiresOpenaiAuth: response.requiresOpenaiAuth,\n };\n const authenticationIdentityKey = surfaceAuthenticationIdentityKey(authentication);\n this.host.patchAuthentication({\n status: 'loaded', account, requiresOpenaiAuth: response.requiresOpenaiAuth, error: null,\n }, origin);\n this.lastLoadedAuthenticationIdentityKey = authenticationIdentityKey;\n return previousAuthenticationIdentityKey !== null\n && previousAuthenticationIdentityKey !== authenticationIdentityKey;\n } catch (error) {\n this.host.patchAuthentication({ status: 'error', error: errorMessage(error) }, origin);\n throw error;\n }\n }\n\n blocksBootstrap(): boolean {\n const authentication = this.host.getSnapshot().authentication;\n return authentication.status === 'loaded'\n && authentication.account === null\n && authentication.requiresOpenaiAuth === true;\n }\n\n handleLoginCompleted(params: v2.AccountLoginCompletedNotification): void {\n const current = this.host.getSnapshot().authentication.login;\n const loginId = params.loginId ?? current.loginId;\n if (!params.success) {\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: {\n status: 'error', loginId, authUrl: current.authUrl,\n error: params.error ?? 'Codex sign-in failed',\n },\n }, 'notification');\n return;\n }\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: { status: 'completed', loginId, authUrl: current.authUrl, error: null },\n }, 'notification');\n void this.refresh('notification').catch((error) => this.host.reportError(error));\n }\n}\n","import type {\n CodexConversationEvent,\n CodexConversationHistory,\n CodexConversationHistoryPage,\n CodexConversationPromptHistory,\n CodexConversationSnapshot,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceClientRequestResponse,\n SendCodexMessageOptions,\n StartCodexRealtimeOptions,\n StartCodexReviewOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport type {\n CodexConversation,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexRealtimeSession,\n ForkCodexConversationOptions,\n} from './codex-surface-contracts';\n\nexport type CodexConversationHandleOperations = {\n clearGoal(): Promise<void>;\n compact(): Promise<void>;\n continueInterruptedTurn(): Promise<void>;\n deleteTurn(turnId: string): Promise<void>;\n deleteQueuedPrompt(promptId: string): Promise<void>;\n updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<void>;\n fork(\n options?: ForkCodexConversationOptions,\n hostOptions?: CodexConversationHostOptions,\n ): Promise<CodexConversationForkResult>;\n forkTurn(\n turnId: string,\n options?: ForkCodexConversationOptions,\n hostOptions?: CodexConversationHostOptions,\n ): Promise<CodexConversationForkResult>;\n getSnapshot(): CodexConversationSnapshot;\n interrupt(): Promise<void>;\n load(options?: CodexConversationLoadOptions): Promise<void>;\n onEvent(listener: (event: CodexConversationEvent) => void): () => void;\n onStateChange(listener: (snapshot: CodexConversationSnapshot) => void): () => void;\n readHistory(): Promise<CodexConversationHistory>;\n readContent?: CodexConversation['readContent'];\n readPromptHistory(): Promise<CodexConversationPromptHistory>;\n loadOlderHistory?: () => Promise<CodexConversationHistoryPage>;\n loadTurnHistory?: (turnId: string) => Promise<void>;\n rename(title: string): Promise<void>;\n resolveApproval(\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope?: CodexSurfaceApprovalScope,\n ): Promise<void>;\n respondToClientRequest(response: CodexSurfaceClientRequestResponse): Promise<void>;\n retryTurn(turnId: string): Promise<void>;\n select(): Promise<void>;\n sendMessage(prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n setGoal(objective: string, tokenBudget?: number | null): Promise<void>;\n startRealtime(options: StartCodexRealtimeOptions): Promise<CodexRealtimeSession>;\n startReview(options?: StartCodexReviewOptions): Promise<void>;\n steerMessage(prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<void>;\n updateSettings(settings: UpdateCodexConversationSettings): Promise<void>;\n};\n\nexport function createCodexConversationHandle(\n id: string,\n operations: CodexConversationHandleOperations,\n): CodexConversation {\n const snapshotAfter = async (operation: () => Promise<void>): Promise<CodexConversationSnapshot> => {\n await operation();\n return operations.getSnapshot();\n };\n return {\n id,\n fork: operations.fork,\n forkTurn: operations.forkTurn,\n load: (options) => snapshotAfter(() => operations.load(options)),\n select: () => snapshotAfter(operations.select),\n readHistory: operations.readHistory,\n readContent: operations.readContent ?? (async () => { throw new Error('Content reads are unavailable.'); }),\n readPromptHistory: operations.readPromptHistory,\n loadTurnHistory: (turnId) => snapshotAfter(() => operations.loadTurnHistory?.(turnId) ?? Promise.reject(new Error('Turn history is unavailable.'))),\n loadOlderHistory: operations.loadOlderHistory ?? (\n async () => ({ conversationId: id, messages: [], hasOlder: false })\n ),\n rename: (title) => snapshotAfter(() => operations.rename(title)),\n updateSettings: (settings) => snapshotAfter(() => operations.updateSettings(settings)),\n sendMessage: (prompt, options) => snapshotAfter(() => operations.sendMessage(prompt, options)),\n startRealtime: operations.startRealtime,\n compact: () => snapshotAfter(operations.compact),\n continueInterruptedTurn: () => snapshotAfter(operations.continueInterruptedTurn),\n startReview: (options) => snapshotAfter(() => operations.startReview(options)),\n steerMessage: (prompt, options) => snapshotAfter(() => operations.steerMessage(prompt, options)),\n interrupt: () => snapshotAfter(operations.interrupt),\n deleteTurn: (turnId) => snapshotAfter(() => operations.deleteTurn(turnId)),\n editTurn: (turnId, content, options) => snapshotAfter(() => operations.editTurn(turnId, content, options)),\n retryTurn: (turnId) => snapshotAfter(() => operations.retryTurn(turnId)),\n deleteQueuedPrompt: (promptId) => snapshotAfter(() => operations.deleteQueuedPrompt(promptId)),\n updateQueuedPrompt: (promptId, prompt, options) => snapshotAfter(() => operations.updateQueuedPrompt(promptId, prompt, options)),\n steerQueuedPrompt: (promptId, prompt, options) => snapshotAfter(() => operations.steerQueuedPrompt(promptId, prompt, options)),\n respondToClientRequest: (response) => snapshotAfter(() => operations.respondToClientRequest(response)),\n resolveApproval: (approvalId, decision, scope) => snapshotAfter(\n () => operations.resolveApproval(approvalId, decision, scope),\n ),\n setGoal: (objective, tokenBudget) => snapshotAfter(() => operations.setGoal(objective, tokenBudget)),\n clearGoal: () => snapshotAfter(operations.clearGoal),\n getSnapshot: operations.getSnapshot,\n onStateChange: operations.onStateChange,\n onEvent: operations.onEvent,\n };\n}\n","import type { ResponseItem } from '../codex/generated/ResponseItem';\nimport type { SurfaceMessageToolPart, SurfaceMessageToolPartUpdate } from '@codex-app-sdk/core/surface';\nimport { codexThreadItemToToolPart, rawOutputToToolPartUpdate } from './codex-tool-part-adapter';\n\ntype AdaptedRawResponseItemEvent =\n | { type: 'item.started' | 'item.completed'; payload: { toolPart: SurfaceMessageToolPart } }\n | { type: 'item.updated'; payload: SurfaceMessageToolPartUpdate };\n\nexport function rawResponseItemToEvent(item: ResponseItem): AdaptedRawResponseItemEvent | null {\n if (!isRecord(item) || typeof item.type !== 'string') {\n return null;\n }\n\n if (item.type === 'local_shell_call') {\n const toolPart = codexThreadItemToToolPart(localShellCallToCommandExecution(item))!;\n\n return {\n type: rawStatusIsCompleted(item.status) ? 'item.completed' : 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'function_call') {\n const toolPart = codexThreadItemToToolPart(functionCallToThreadItem(item))!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'function_call_output') {\n return rawOutputUpdate(item.call_id, item.output);\n }\n\n if (item.type === 'custom_tool_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n namespace: null,\n tool: stringValue(item.name) ?? 'custom_tool',\n status: item.status,\n arguments: stringValue(item.input) ?? '',\n contentItems: null,\n success: null,\n durationMs: null,\n })!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'custom_tool_call_output') {\n return rawOutputUpdate(item.call_id, item.output, stringValue(item.name) ?? undefined);\n }\n\n if (item.type === 'tool_search_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n namespace: 'codex',\n tool: 'tool_search',\n status: item.status,\n arguments: item.arguments,\n contentItems: null,\n success: null,\n durationMs: null,\n execution: item.execution,\n })!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'tool_search_output') {\n return {\n type: 'item.updated',\n payload: rawOutputToToolPartUpdate(stringValue(item.call_id) ?? fallbackRawItemId(item), item.tools, 'tool_search', item.status),\n };\n }\n\n if (item.type === 'web_search_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'webSearch',\n id: fallbackRawItemId(item),\n query: webSearchQuery(item.action),\n action: item.action,\n })!;\n\n return {\n type: 'item.completed',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'image_generation_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.id) ?? fallbackRawItemId(item),\n namespace: null,\n tool: 'image_generation',\n status: item.status,\n arguments: {\n revisedPrompt: item.revised_prompt,\n },\n contentItems: null,\n success: item.status === 'completed',\n durationMs: null,\n })!;\n\n return {\n type: 'item.completed',\n payload: { toolPart },\n };\n }\n\n return null;\n}\n\nfunction localShellCallToCommandExecution(item: Record<string, unknown>): Record<string, unknown> {\n const action = isRecord(item.action) ? item.action : {};\n const command = Array.isArray(action.command)\n ? joinCommand(action.command)\n : stringValue(action.command) ?? 'local shell';\n\n return {\n type: 'commandExecution',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n command,\n cwd: stringValue(action.working_directory) ?? '',\n processId: null,\n source: 'agent',\n status: rawStatusToThreadStatus(item.status),\n commandActions: [],\n aggregatedOutput: null,\n exitCode: null,\n durationMs: null,\n };\n}\n\nfunction functionCallToThreadItem(item: Record<string, unknown>): Record<string, unknown> {\n const name = stringValue(item.name) ?? 'function_call';\n const args = parseArguments(item.arguments);\n const id = stringValue(item.call_id) ?? fallbackRawItemId(item);\n\n if (name === 'shell_command' && isRecord(args)) {\n return {\n type: 'commandExecution',\n id,\n command: stringValue(args.command) ?? name,\n cwd: stringValue(args.workdir) ?? stringValue(args.cwd) ?? '',\n processId: null,\n source: 'agent',\n status: 'inProgress',\n commandActions: [],\n aggregatedOutput: null,\n exitCode: null,\n durationMs: null,\n };\n }\n\n return {\n type: 'dynamicToolCall',\n id,\n namespace: stringValue(item.namespace),\n tool: name,\n status: 'inProgress',\n arguments: args,\n contentItems: null,\n success: null,\n durationMs: null,\n };\n}\n\nfunction rawOutputUpdate(callId: unknown, output: unknown, title?: string): AdaptedRawResponseItemEvent {\n return {\n type: 'item.updated',\n payload: rawOutputToToolPartUpdate(stringValue(callId) ?? 'raw-response-output', output, title),\n };\n}\n\nfunction rawStatusToThreadStatus(status: unknown): string {\n if (status === 'completed') {\n return 'completed';\n }\n\n if (status === 'incomplete' || status === 'failed' || status === 'error') {\n return 'failed';\n }\n\n return 'inProgress';\n}\n\nfunction rawStatusIsCompleted(status: unknown): boolean {\n return status === 'completed' || status === 'failed' || status === 'error' || status === 'incomplete';\n}\n\nfunction parseArguments(value: unknown): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction webSearchQuery(action: unknown): string {\n if (!isRecord(action)) {\n return 'web search';\n }\n\n return stringValue(action.query) ?? stringValue(action.searchTerm) ?? 'web search';\n}\n\nfunction joinCommand(parts: unknown[]): string {\n return parts.map((part) => {\n const value = String(part);\n return /\\s/.test(value) ? JSON.stringify(value) : value;\n }).join(' ');\n}\n\nfunction fallbackRawItemId(item: Record<string, unknown>): string {\n const callId = stringValue(item.call_id) ?? stringValue(item.id);\n if (callId) {\n return callId;\n }\n\n return `raw-${item.type}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceEvent,\n CodexSurfaceJsonValue,\n CodexSurfaceTurn,\n CodexSurfaceTurnError,\n} from '@codex-app-sdk/core/surface';\n\nexport type SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport function threadItemKey(threadId: string, itemId: string): string {\n return `${threadId}\\u0000${itemId}`;\n}\n\nexport function timestampToIso(timestamp: number | null | undefined): string {\n return typeof timestamp === 'number' && Number.isFinite(timestamp)\n ? new Date(timestamp * 1000).toISOString()\n : new Date().toISOString();\n}\n\nexport function timestampToIsoOrNull(timestamp: number | null | undefined): string | null {\n return typeof timestamp === 'number' && Number.isFinite(timestamp)\n ? new Date(timestamp * 1000).toISOString()\n : null;\n}\n\nexport function surfaceTurnError(error: v2.TurnError | null): CodexSurfaceTurnError | null {\n if (!error) return null;\n return {\n message: error.message,\n additionalDetails: error.additionalDetails,\n codexErrorInfo: error.codexErrorInfo as CodexSurfaceJsonValue | null,\n };\n}\n\nexport function surfaceTurn(turn: v2.Turn, willRetry = false): CodexSurfaceTurn {\n return {\n id: turn.id,\n ...(turn.itemsView === 'summary' || turn.itemsView === 'notLoaded' ? { itemsView: 'summary' as const } : {}),\n status: turn.status,\n error: surfaceTurnError(turn.error),\n willRetry,\n startedAt: timestampToIsoOrNull(turn.startedAt),\n completedAt: timestampToIsoOrNull(turn.completedAt),\n durationMs: turn.durationMs ?? null,\n };\n}\n\nexport function upsertSurfaceTurn(\n turns: readonly CodexSurfaceTurn[],\n turn: CodexSurfaceTurn,\n): CodexSurfaceTurn[] {\n const index = turns.findIndex((candidate) => candidate.id === turn.id);\n if (index < 0) return [...turns, turn];\n const next = [...turns];\n next.splice(index, 1, { ...turn, startedAt: turn.startedAt ?? turns[index]!.startedAt });\n return next;\n}\n\nexport function sameValue(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function createMessageId(): string {\n return `user-${globalThis.crypto.randomUUID()}`;\n}\n\nexport function createQueuedPromptId(): string {\n return `queued-prompt-${globalThis.crypto.randomUUID()}`;\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceSubagentState,\n CodexSurfaceSubagentToolCall,\n} from '@codex-app-sdk/core/surface';\n\nexport function surfaceSubagentToolCall(\n item: Extract<v2.ThreadItem, { type: 'collabAgentToolCall' }>,\n): CodexSurfaceSubagentToolCall {\n const agentStates: Record<string, CodexSurfaceSubagentState> = {};\n for (const [conversationId, state] of Object.entries(item.agentsStates)) {\n if (state) agentStates[conversationId] = { status: state.status, message: state.message };\n }\n return {\n id: item.id,\n tool: item.tool,\n status: item.status,\n senderConversationId: item.senderThreadId,\n receiverConversationIds: [...item.receiverThreadIds],\n prompt: item.prompt,\n model: item.model,\n reasoningEffort: item.reasoningEffort,\n agentStates,\n };\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n SurfaceMessage,\n SurfaceMessageTextPart,\n SurfaceMessageToolPart,\n SurfaceMessageToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexItemToMediaParts,\n codexItemToQuestionPart,\n codexItemToSurfaceMessage,\n codexItemToToolPart,\n} from './codex-conversation-history';\nimport { rawResponseItemToEvent } from './codex-raw-response-item-adapter';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n surfaceTurn,\n surfaceTurnError,\n threadItemKey,\n timestampToIsoOrNull,\n upsertSurfaceTurn,\n} from './codex-surface-events';\nimport {\n appendAssistantTextDelta,\n appendCompactionMarker,\n ensureAssistantTurnMessage,\n extractProposedPlanDocument,\n finalizeTurnToolParts,\n formatPlanMarkdown,\n planProgressToolPart,\n removeAssistantText,\n surfaceMediaPartsEqual,\n updateAssistantToolPart,\n upsertAssistantMediaPart,\n upsertAssistantQuestionPart,\n upsertAssistantReasoningSummaries,\n upsertAssistantText,\n upsertAssistantToolPart,\n} from './codex-surface-message-state';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceSubagentToolCall } from './codex-surface-subagents';\nimport {\n codexToolPartFileActivities,\n shouldForwardCommandExecutionOutput,\n} from './codex-tool-part-adapter';\n\nexport type CodexSurfaceItemsHost = {\n assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'started' | 'listed' | 'resumed' | 'created' | 'updated',\n origin: CodexSurfaceEventOrigin,\n ): void;\n getState(): CodexSurfaceSnapshot;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n sendNextQueuedPrompt(threadId: string): void;\n};\n\nexport class CodexSurfaceItemsController {\n private readonly commandOutputForwardItemIds = new Set<string>();\n private readonly fileActivityKeys = new Set<string>();\n // app-server emits exitedReviewMode first, followed by a final agentMessage\n // rendered from the same ReviewOutputEvent. Full history retains only the\n // review-mode item, so it is the canonical surface representation.\n private readonly reviewOutputByTurn = new Map<string, string>();\n\n constructor(private readonly host: CodexSurfaceItemsHost) {}\n\n reset(): void {\n this.commandOutputForwardItemIds.clear();\n this.fileActivityKeys.clear();\n this.reviewOutputByTurn.clear();\n }\n\n forget(threadId: string): void {\n const prefix = `${threadId}\\u0000`;\n for (const key of this.commandOutputForwardItemIds) {\n if (key.startsWith(prefix)) this.commandOutputForwardItemIds.delete(key);\n }\n for (const key of this.fileActivityKeys) {\n if (key.startsWith(prefix)) this.fileActivityKeys.delete(key);\n }\n for (const key of this.reviewOutputByTurn.keys()) {\n if (key.startsWith(prefix)) this.reviewOutputByTurn.delete(key);\n }\n }\n\n isForwardingCommandOutput(threadId: string, itemId: string): boolean {\n return this.commandOutputForwardItemIds.has(threadItemKey(threadId, itemId));\n }\n\n applyAgentDelta(params: v2.AgentMessageDeltaNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const phase = runtime.messages.flatMap((message) => message.parts)\n .find((part): part is SurfaceMessageTextPart => (\n part.type === 'text' && part.itemId === params.itemId\n ))?.phase;\n this.host.patchRuntime(params.threadId, {\n messages: appendAssistantTextDelta(\n runtime.messages, params.threadId, params.turnId, params.itemId, params.delta, phase,\n ),\n });\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message) {\n this.host.emitEvent('notification', {\n type: 'message.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n messageId: message.id,\n itemId: params.itemId,\n delta: params.delta,\n ...(phase ? { phase } : {}),\n },\n });\n }\n }\n\n applyPlanDelta(params: v2.PlanDeltaNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const markdown = `${runtime.planMarkdownByTurn.get(params.turnId) ?? ''}${params.delta}`;\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'running'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.itemId, delta: params.delta, markdown },\n });\n }\n\n applyPlanUpdated(params: v2.TurnPlanUpdatedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const markdown = formatPlanMarkdown(params.explanation, params.plan);\n const updatedAt = new Date().toISOString();\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n executionPlan: {\n turnId: params.turnId,\n explanation: params.explanation,\n steps: structuredClone(params.plan),\n markdown,\n updatedAt,\n },\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'completed'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n explanation: params.explanation,\n steps: structuredClone(params.plan),\n markdown,\n status: 'completed',\n },\n });\n }\n\n applyRawResponseItem(params: v2.RawResponseItemCompletedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const event = rawResponseItemToEvent(params.item);\n if (!event) return;\n if (event.type === 'item.updated') {\n this.applyToolUpdate(params.threadId, params.turnId, event.payload);\n return;\n }\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId, event.payload.toolPart,\n ),\n });\n const message = this.host.messageContainingTool(\n params.threadId, params.turnId, event.payload.toolPart.id,\n );\n if (message) {\n this.host.emitEvent('notification', {\n type: event.type === 'item.completed' ? 'tool.completed' : 'tool.started',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { messageId: message.id, toolPart: structuredClone(event.payload.toolPart) },\n });\n this.emitFileActivities(\n params.threadId,\n params.turnId,\n message.id,\n event.payload.toolPart.id,\n event.payload.toolPart,\n runtime.cwd,\n );\n }\n }\n\n applyItem(params: v2.ItemStartedNotification | v2.ItemCompletedNotification, completed: boolean): void {\n const runtime = this.host.requireRuntime(params.threadId);\n const turnStartPending = runtime.turnStartPending;\n if (!completed) this.host.markRuntimeTurnActive(runtime, params.turnId);\n const turn = {\n id: params.turnId,\n status: completed ? 'completed' : 'inProgress',\n startedAt: ('startedAtMs' in params ? params.startedAtMs : params.completedAtMs) / 1000,\n } as const;\n\n if (params.item.type === 'userMessage') {\n const message = codexItemToSurfaceMessage(params.threadId, turn, params.item);\n if (!message || runtime.messages.some((candidate) => candidate.id === message.id)) return;\n const isSteer = runtime.messages.some((candidate) => (\n candidate.role === 'assistant'\n && candidate.metadata?.turnId === params.turnId\n && candidate.parts.length > 0\n ));\n const pendingOptimisticIndex = !isSteer && turnStartPending\n ? runtime.messages.map((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && !candidate.turnId\n && JSON.stringify(candidate.parts) === JSON.stringify(message.parts)\n )).lastIndexOf(true)\n : -1;\n if (pendingOptimisticIndex >= 0) {\n const pending = runtime.messages[pendingOptimisticIndex]!;\n const reconciled = {\n ...message,\n id: pending.id,\n createdAt: pending.createdAt ?? message.createdAt,\n metadata: { ...pending.metadata, ...message.metadata },\n };\n const messages = [...runtime.messages];\n messages.splice(pendingOptimisticIndex, 1, reconciled);\n this.host.patchRuntime(params.threadId, { messages });\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(reconciled) },\n });\n return;\n }\n const duplicateInitialMessage = !isSteer && runtime.messages.some((candidate) => (\n candidate.role === 'user'\n && candidate.turnId === params.turnId\n && candidate.kind !== 'steer'\n && JSON.stringify(candidate.parts) === JSON.stringify(message.parts)\n ));\n if (duplicateInitialMessage) return;\n const appended = isSteer ? { ...message, kind: 'steer' as const } : message;\n const messages = [...runtime.messages, appended];\n this.host.patchRuntime(params.threadId, {\n messages: isSteer\n ? ensureAssistantTurnMessage(messages, params.threadId, params.turnId, { forceSegment: true })\n : messages,\n });\n this.host.emitEvent('notification', {\n type: 'message.appended', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(appended) },\n });\n return;\n }\n\n if (params.item.type === 'reasoning') {\n const previousMessage = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n const previousParts = previousMessage ? JSON.stringify(previousMessage.parts) : null;\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantReasoningSummaries(\n runtime.messages,\n params.threadId,\n params.turnId,\n params.item.id,\n params.item.summary,\n ),\n });\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (!message || JSON.stringify(message.parts) === previousParts) return;\n this.host.emitEvent('notification', {\n type: previousMessage ? 'message.updated' : 'message.appended',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n return;\n }\n\n if (\n params.item.type === 'agentMessage'\n && completed\n && runtime.planMode\n && params.item.phase === 'final_answer'\n ) {\n const proposedPlan = extractProposedPlanDocument(params.item.text);\n if (proposedPlan) {\n const previousMessage = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n let messages = removeAssistantText(\n runtime.messages, params.threadId, params.turnId, params.item.id,\n );\n if (proposedPlan.visibleText) {\n messages = upsertAssistantText(\n messages, params.threadId, params.turnId, params.item.id,\n proposedPlan.visibleText, params.item.phase,\n );\n }\n messages = upsertAssistantToolPart(\n messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, proposedPlan.markdown, 'completed'),\n );\n runtime.planMarkdownByTurn.set(params.turnId, proposedPlan.markdown);\n this.host.patchRuntime(params.threadId, { messages });\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message) {\n this.host.emitEvent('notification', {\n type: previousMessage ? 'message.updated' : 'message.appended',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'plan.completed', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, markdown: proposedPlan.markdown },\n });\n return;\n }\n }\n\n if (params.item.type === 'agentMessage' || params.item.type === 'exitedReviewMode') {\n const text = params.item.type === 'agentMessage' ? params.item.text : params.item.review;\n const phase = params.item.type === 'agentMessage' ? params.item.phase ?? undefined : undefined;\n if (!text && params.item.type !== 'agentMessage') return;\n const reviewTurnKey = threadItemKey(params.threadId, params.turnId);\n if (\n params.item.type === 'agentMessage'\n && this.reviewOutputByTurn.get(reviewTurnKey) === text\n ) return;\n if (params.item.type === 'exitedReviewMode') {\n this.reviewOutputByTurn.set(reviewTurnKey, text);\n }\n const previousMessageIds = new Set(runtime.messages.map((message) => message.id));\n const previousMessage = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n const previousParts = previousMessage ? JSON.stringify(previousMessage.parts) : null;\n const previousQuestionRequestIds = new Set(previousMessage?.parts.flatMap((part) => (\n part.type === 'question' ? [part.request.id] : []\n )) ?? []);\n const previousText = runtime.messages.flatMap((message) => message.parts)\n .find((part): part is Extract<SurfaceMessage['parts'][number], { type: 'text' }> => (\n part.type === 'text' && part.itemId === params.item.id\n ))?.text ?? '';\n const questionPart = params.item.type === 'agentMessage'\n ? codexItemToQuestionPart(params.threadId, params.turnId, params.item)\n : null;\n const visibleText = questionPart ? '' : text;\n let messages = questionPart\n ? removeAssistantText(runtime.messages, params.threadId, params.turnId, params.item.id)\n : upsertAssistantText(runtime.messages, params.threadId, params.turnId, params.item.id, text, phase);\n if (questionPart) {\n messages = upsertAssistantQuestionPart(\n messages, params.threadId, params.turnId, questionPart,\n );\n }\n this.host.patchRuntime(params.threadId, { messages });\n if (!visibleText && !questionPart && !phase) return;\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message && !previousMessageIds.has(message.id)) {\n this.host.emitEvent('notification', {\n type: 'message.appended', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n } else if (message && JSON.stringify(message.parts) !== previousParts && (questionPart || visibleText === previousText)) {\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n } else if (message && visibleText !== previousText) {\n if (visibleText.startsWith(previousText)) {\n const delta = visibleText.slice(previousText.length);\n if (delta) this.host.emitEvent('notification', {\n type: 'message.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n messageId: message.id,\n itemId: params.item.id,\n delta,\n ...(phase ? { phase } : {}),\n },\n });\n } else {\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n }\n if (questionPart && !previousQuestionRequestIds.has(questionPart.request.id)) {\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { request: structuredClone(questionPart.request) },\n });\n }\n return;\n }\n\n if (params.item.type === 'plan') {\n if (!completed) return;\n const markdown = params.item.text.trim() || runtime.planMarkdownByTurn.get(params.turnId) || '';\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'completed'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.completed', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, markdown },\n });\n return;\n }\n\n if (params.item.type === 'contextCompaction') {\n this.host.patchRuntime(params.threadId, {\n messages: appendCompactionMarker(runtime.messages, params.threadId, params.turnId, completed ? 'complete' : 'streaming'),\n });\n if (completed) {\n const message = this.host.requireRuntime(params.threadId).messages.find((candidate) => (\n candidate.kind === 'compaction' && candidate.metadata?.turnId === params.turnId\n ));\n if (message) this.host.emitEvent('notification', {\n type: 'context.compactionCompleted', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, message: structuredClone(message) },\n });\n } else {\n this.host.emitEvent('notification', {\n type: 'context.compactionStarted', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id },\n });\n }\n return;\n }\n\n if (params.item.type === 'collabAgentToolCall') {\n this.host.emitEvent('notification', {\n type: 'subagent.toolCallChanged',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: {\n lifecycle: completed ? 'completed' : 'started',\n toolCall: surfaceSubagentToolCall(params.item),\n },\n });\n return;\n }\n\n if (params.item.type === 'subAgentActivity') {\n this.host.emitEvent('notification', {\n type: 'subagent.activity',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: {\n lifecycle: completed ? 'completed' : 'started',\n activity: {\n id: params.item.id,\n kind: params.item.kind,\n agentConversationId: params.item.agentThreadId,\n agentPath: params.item.agentPath,\n },\n },\n });\n return;\n }\n\n const includeCommandOutput = this.shouldForwardCommandOutput(params.threadId, completed, params.item);\n const toolPart = codexItemToToolPart(params.item, { includeCommandOutput, cwd: runtime.cwd });\n const mediaParts = codexItemToMediaParts(params.item);\n if (!toolPart && !mediaParts.length) return;\n const mediaChanged = mediaParts.some(mediaPart => !runtime.messages.some((message) => (\n message.parts.some((part) => part.type === 'media' && surfaceMediaPartsEqual(part, mediaPart))\n )));\n let messages = toolPart\n ? upsertAssistantToolPart(runtime.messages, params.threadId, params.turnId, toolPart)\n : [...runtime.messages];\n for (const mediaPart of mediaParts) messages = upsertAssistantMediaPart(messages, params.threadId, params.turnId, mediaPart, params.item.id);\n this.host.patchRuntime(params.threadId, { messages });\n const message = toolPart\n ? this.host.messageContainingTool(params.threadId, params.turnId, toolPart.id)\n : this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message && toolPart) this.host.emitEvent('notification', {\n type: completed ? 'tool.completed' : 'tool.started',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { messageId: message.id, toolPart: structuredClone(toolPart) },\n });\n if (message && toolPart) {\n this.emitFileActivities(\n params.threadId,\n params.turnId,\n message.id,\n toolPart.id,\n toolPart,\n runtime.cwd,\n );\n }\n if (message && mediaChanged) this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n\n shouldForwardCommandOutput(threadId: string, completed: boolean, item: v2.ThreadItem): boolean {\n const itemId = 'id' in item && typeof item.id === 'string' ? item.id : null;\n if (!itemId) return false;\n const key = threadItemKey(threadId, itemId);\n if (!completed) {\n const shouldForward = shouldForwardCommandExecutionOutput(item);\n if (shouldForward) this.commandOutputForwardItemIds.add(key);\n else this.commandOutputForwardItemIds.delete(key);\n return shouldForward;\n }\n const shouldForward = this.commandOutputForwardItemIds.has(key)\n || shouldForwardCommandExecutionOutput(item);\n this.commandOutputForwardItemIds.delete(key);\n return shouldForward;\n }\n\n applyToolUpdate(threadId: string, turnId: string, update: SurfaceMessageToolPartUpdate): void {\n const runtime = this.host.requireRuntime(threadId);\n this.host.markRuntimeTurnActive(runtime, turnId);\n const effectiveUpdate = runtime.cwd && hasFileChangeData(update)\n ? { ...update, metadata: { ...update.metadata, cwd: runtime.cwd } }\n : update;\n this.host.patchRuntime(threadId, {\n messages: updateAssistantToolPart(runtime.messages, threadId, turnId, effectiveUpdate),\n });\n const message = this.host.messageContainingTool(threadId, turnId, update.itemId);\n if (message) this.host.emitEvent('notification', {\n type: 'tool.updated', conversationId: threadId, turnId,\n payload: { messageId: message.id, update: structuredClone(effectiveUpdate) },\n });\n const toolPart = message?.parts.find((part): part is SurfaceMessageToolPart => (\n part.type === 'tool' && part.id === update.itemId\n ));\n if (message && toolPart) {\n this.emitFileActivities(threadId, turnId, message.id, toolPart.id, toolPart, runtime.cwd);\n }\n }\n\n private emitFileActivities(\n threadId: string,\n turnId: string,\n messageId: string,\n itemId: string,\n toolPart: SurfaceMessageToolPart,\n cwd: string | null,\n ): void {\n for (const activity of codexToolPartFileActivities(toolPart, cwd)) {\n const key = `${threadId}\\u0000${itemId}\\u0000${activity.action}\\u0000${activity.path}\\u0000${activity.status}`;\n if (this.fileActivityKeys.has(key)) continue;\n this.fileActivityKeys.add(key);\n this.host.emitEvent('notification', {\n type: 'file.activity',\n conversationId: threadId,\n turnId,\n payload: {\n messageId,\n itemId,\n path: activity.path,\n action: activity.action,\n status: activity.status,\n },\n });\n }\n }\n\n applyTurnCompleted(params: v2.TurnCompletedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n if (!runtime.turnIds.includes(params.turn.id)) runtime.turnIds.push(params.turn.id);\n const turnStartPending = runtime.activeTurnId !== params.turn.id && runtime.turnStartPending;\n if (runtime.activeTurnId === params.turn.id) runtime.activeTurnId = null;\n const busy = turnStartPending || runtime.activeTurnId !== null;\n const status: SurfaceMessage['status'] = params.turn.status === 'failed' ? 'error' : 'complete';\n const messages = finalizeTurnToolParts(runtime.messages, params.turn.id, params.turn.status)\n .map((message) => message.metadata?.turnId === params.turn.id ? { ...message, status } : message)\n .filter((message) => !(\n message.role === 'assistant' && message.metadata?.turnId === params.turn.id\n && message.kind === undefined && message.parts.length === 0\n ));\n this.host.patchRuntime(params.threadId, {\n busy,\n ...(!busy ? { threadStatus: { type: 'idle' as const }, error: params.turn.error?.message ?? null } : {}),\n turnStartPending,\n messages,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(params.turn)),\n });\n this.host.patch({\n conversations: this.host.getState().conversations.map((conversation) => conversation.id === params.threadId\n ? {\n ...conversation,\n status: busy ? 'active' : params.turn.status === 'failed' ? 'error' : 'idle',\n turnCount: runtime.turnIds.length,\n updatedAt: new Date().toISOString(),\n }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === params.threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n this.host.emitEvent('notification', {\n type: 'turn.completed', conversationId: params.threadId, turnId: params.turn.id,\n payload: {\n status: params.turn.status,\n error: surfaceTurnError(params.turn.error),\n willRetry: false,\n startedAt: timestampToIsoOrNull(params.turn.startedAt),\n completedAt: timestampToIsoOrNull(params.turn.completedAt),\n durationMs: params.turn.durationMs ?? null,\n },\n });\n this.host.emitConversationActivity(params.threadId, 'notification');\n runtime.planMarkdownByTurn.delete(params.turn.id);\n this.host.sendNextQueuedPrompt(params.threadId);\n }\n}\n\nfunction hasFileChangeData(update: SurfaceMessageToolPartUpdate): boolean {\n if (update.fallbackToolPart?.kind === 'fileChange') return true;\n const input = update.input;\n const metadata = update.metadata;\n return (isRecord(input) && Array.isArray(input.changes))\n || (isRecord(metadata) && Array.isArray(metadata.changes));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","import type {\n CodexServerRequestResponder,\n ServerRequest,\n} from '../codex/index';\nimport type {\n CodexSurfaceClientRequest,\n CodexSurfaceClientRequestResponse,\n SurfaceMessage,\n SurfaceMessageToolPart,\n} from '@codex-app-sdk/core/surface';\nimport {\n argumentsPreview,\n findPendingMcpToolPart,\n isRecord,\n mcpElicitationResponse,\n persistSupports,\n stringValue,\n} from './codex-surface-prompts';\nimport { addUnique, updateAssistantToolPart, upsertAssistantToolPart } from './codex-surface-message-state';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { runtimeProjection, type ThreadRuntimePatch, type ThreadRuntimeState } from './codex-surface-runtime';\n\ntype ToolInputRequest = Extract<ServerRequest, { method: 'item/tool/requestUserInput' }>;\ntype McpElicitationRequest = Extract<ServerRequest, { method: 'mcpServer/elicitation/request' }>;\ntype ClientRequestResolutionReason =\n | 'conversation_closed'\n | 'conversation_removed'\n | 'surface_disconnected';\n\ntype PendingClientRequest =\n | {\n kind: 'ask_user';\n itemId: string;\n request: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }>;\n threadId: string;\n turnId: string;\n responder: CodexServerRequestResponder<'item/tool/requestUserInput'>;\n }\n | {\n kind: 'mcp_tool_approval';\n displayTurnId: string;\n itemId: string;\n request: Extract<CodexSurfaceClientRequest, { kind: 'confirm_tool' }>;\n threadId: string;\n turnId: string | null;\n responder: CodexServerRequestResponder<'mcpServer/elicitation/request'>;\n };\n\nexport type CodexSurfaceClientRequestsHost = {\n activeConversationId(): string | null;\n answerAsyncQuestion(threadId: string, prompt: string, displayText: string): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action' | 'notification'): void;\n emitEvent(origin: 'action' | 'notification', input: SurfaceEventInput): void;\n hasPendingApproval(threadId: string): boolean;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n};\n\nexport class CodexSurfaceClientRequestsController {\n private readonly pending = new Map<string, PendingClientRequest>();\n\n constructor(private readonly host: CodexSurfaceClientRequestsHost) {}\n\n requestsForThread(threadId: string): CodexSurfaceClientRequest[] {\n return [...this.pending.values()]\n .filter((pending) => pending.threadId === threadId)\n .map((pending) => pending.request);\n }\n\n hasForThread(threadId: string): boolean {\n return [...this.pending.values()].some((pending) => pending.threadId === threadId);\n }\n\n clear(): void {\n this.pending.clear();\n }\n\n rejectAll(reason: string): void {\n for (const pending of this.pending.values()) pending.responder.reject(reason);\n this.pending.clear();\n }\n\n clearForThread(threadId: string, reason: string, eventReason: ClientRequestResolutionReason): void {\n const resolved: PendingClientRequest[] = [];\n for (const [requestId, pending] of this.pending) {\n if (pending.threadId !== threadId) continue;\n pending.responder.reject(reason);\n this.pending.delete(requestId);\n resolved.push(pending);\n }\n this.host.patchRuntime(threadId, {});\n for (const pending of resolved) {\n this.host.emitEvent('notification', {\n type: 'clientRequest.resolved',\n conversationId: threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: {\n request: structuredClone(pending.request),\n response: null,\n reason: eventReason,\n },\n });\n }\n }\n\n async respond(\n threadId: string | undefined,\n response: CodexSurfaceClientRequestResponse,\n ): Promise<void> {\n const pending = this.pending.get(response.id);\n if (!pending) {\n await this.respondToAsyncQuestion(threadId, response);\n return;\n }\n if (threadId !== undefined && pending.threadId !== threadId) {\n throw new Error(`Client request '${response.id}' belongs to conversation '${pending.threadId}', not '${threadId}'`);\n }\n const confirmationDecision = response.payload?.decision ?? 'deny';\n if (\n pending.kind === 'mcp_tool_approval'\n && !['allow', 'allow_conversation', 'always_allow', 'deny'].includes(confirmationDecision)\n ) {\n throw new Error(`Invalid tool confirmation decision '${String(confirmationDecision)}'`);\n }\n this.pending.delete(response.id);\n const runtime = this.host.requireRuntime(pending.threadId);\n const answeredClientRequestIds = addUnique(runtime.answeredClientRequestIds, response.id);\n if (pending.kind === 'ask_user') {\n const answers = response.payload?.answers ?? {};\n pending.responder.resolve({ answers });\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds,\n messages: updateAssistantToolPart(runtime.messages, pending.threadId, pending.turnId, {\n itemId: pending.itemId,\n output: { answers },\n }),\n });\n } else {\n const decision = confirmationDecision;\n pending.responder.resolve(mcpElicitationResponse(decision));\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds,\n messages: updateAssistantToolPart(runtime.messages, pending.threadId, pending.displayTurnId, {\n itemId: pending.itemId,\n output: { decision },\n }),\n });\n }\n this.maybeClearWaitingBusy(pending.threadId);\n this.host.emitEvent('action', {\n type: 'clientRequest.resolved',\n conversationId: pending.threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: {\n request: structuredClone(pending.request),\n response: structuredClone(response),\n reason: 'host',\n },\n });\n this.host.emitConversationActivity(pending.threadId, 'action');\n }\n\n private async respondToAsyncQuestion(\n threadId: string | undefined,\n response: CodexSurfaceClientRequestResponse,\n ): Promise<void> {\n const resolvedThreadId = threadId ?? this.host.activeConversationId();\n const runtime = resolvedThreadId === null ? null : this.host.requireRuntime(resolvedThreadId);\n const request = runtime && runtimeProjection(runtime, [], []).clientRequests.find(\n (candidate): candidate is Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> => (\n candidate.kind === 'ask_user' && candidate.id === response.id\n ),\n );\n const match = runtime && request ? { request, runtime } : null;\n if (!match) throw new Error(`Unknown client request '${response.id}'`);\n if (match.request.payload.request.delivery !== 'async') {\n throw new Error(`Unknown client request '${response.id}'`);\n }\n const answers = response.payload?.answers ?? {};\n const entries = match.request.payload.request.questions.flatMap((question) => {\n const answer = answers[question.id]?.answers.join(', ').trim() ?? '';\n return answer ? [{\n questionItemId: question.id,\n question: question.question,\n answer,\n }] : [];\n });\n if (response.payload?.cancelled !== true) {\n if (entries.length === 0) throw new Error('At least one answer is required');\n const prompt = '<send_user_message_question_reply>\\n'\n + `${JSON.stringify(entries)}\\n`\n + '</send_user_message_question_reply>';\n const displayText = entries.length === 1\n ? entries[0]!.answer\n : entries.map((entry) => `${entry.question}: ${entry.answer}`).join('\\n');\n await this.host.answerAsyncQuestion(match.runtime.threadId, prompt, displayText);\n }\n this.host.patchRuntime(match.runtime.threadId, {\n answeredClientRequestIds: addUnique(match.runtime.answeredClientRequestIds, response.id),\n });\n this.host.emitEvent('action', {\n type: 'clientRequest.resolved',\n conversationId: match.runtime.threadId,\n ...(match.request.turnId ? { turnId: match.request.turnId } : {}),\n payload: {\n request: structuredClone(match.request),\n response: structuredClone(response),\n reason: 'host',\n },\n });\n this.host.emitConversationActivity(match.runtime.threadId, 'action');\n }\n\n handleServerResolved(requestId: string, threadId: string): void {\n const pending = this.pending.get(requestId);\n this.pending.delete(requestId);\n if (pending) {\n const runtime = this.host.requireRuntime(pending.threadId);\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds: addUnique(runtime.answeredClientRequestIds, requestId),\n });\n }\n this.maybeClearWaitingBusy(threadId);\n if (!pending) return;\n this.host.emitEvent('notification', {\n type: 'clientRequest.resolved',\n conversationId: pending.threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: { request: structuredClone(pending.request), response: null, reason: 'server' },\n });\n }\n\n maybeClearWaitingBusy(threadId: string): void {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.turnStartPending || runtime.activeTurnId !== null) return;\n if (!this.host.hasPendingApproval(threadId) && !this.hasForThread(threadId)) {\n this.host.patchRuntime(threadId, { busy: false });\n }\n }\n\n handleToolInputRequest(\n request: ToolInputRequest,\n responder: CodexServerRequestResponder<'item/tool/requestUserInput'>,\n ): boolean {\n const { threadId, turnId, itemId, questions } = request.params;\n if (questions.length === 0) return false;\n const runtime = this.host.requireRuntime(threadId);\n this.host.markRuntimeTurnActive(runtime, turnId);\n const requestId = String(request.id);\n const normalizedQuestions = questions.map((question) => ({\n ...question,\n options: question.options?.map((option) => ({ ...option })) ?? null,\n }));\n const clientRequest: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> = {\n id: requestId,\n kind: 'ask_user',\n conversationId: threadId,\n turnId,\n itemId,\n payload: {\n request: {\n itemId,\n delivery: 'tool',\n blocking: request.params.isBlocking ?? true,\n questions: normalizedQuestions,\n ...(request.params.autoResolutionMs === null\n ? {}\n : { autoResolutionMs: request.params.autoResolutionMs }),\n },\n },\n };\n this.pending.set(requestId, {\n kind: 'ask_user', itemId, request: clientRequest, threadId, turnId, responder,\n });\n this.host.patchRuntime(threadId, {\n busy: true,\n messages: upsertAssistantToolPart(runtime.messages, threadId, turnId, {\n type: 'tool',\n id: itemId,\n kind: 'generic',\n title: 'ask_user_question',\n status: 'running',\n statusText: JSON.stringify({\n source: 'codex', action: 'ask_user_question', phase: 'running',\n params: { requestId, questions: normalizedQuestions },\n }),\n input: normalizedQuestions,\n metadata: { requestId, question: normalizedQuestions[0]!.question },\n }),\n });\n const requestToolMessage = this.host.messageContainingTool(threadId, turnId, itemId);\n const requestToolPart = requestToolMessage?.parts.find((part) => part.type === 'tool' && part.id === itemId);\n if (requestToolMessage && requestToolPart?.type === 'tool') {\n this.host.emitEvent('notification', {\n type: 'tool.started', conversationId: threadId, turnId,\n payload: { messageId: requestToolMessage.id, toolPart: structuredClone(requestToolPart) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested', conversationId: threadId, turnId,\n payload: { request: structuredClone(clientRequest) },\n });\n this.host.emitConversationActivity(threadId, 'notification');\n return true;\n }\n\n handleMcpElicitationRequest(\n request: McpElicitationRequest,\n responder: CodexServerRequestResponder<'mcpServer/elicitation/request'>,\n ): boolean {\n const params = request.params;\n if (params.mode !== 'form') return false;\n const meta = params._meta;\n if (!isRecord(meta) || meta.codex_approval_kind !== 'mcp_tool_call') return false;\n const requestId = String(request.id);\n const toolName = stringValue(meta.tool_name) ?? stringValue(meta.tool_title) ?? 'tool';\n const runtime = this.host.requireRuntime(params.threadId);\n if (params.turnId) this.host.markRuntimeTurnActive(runtime, params.turnId);\n const displayTurnId = params.turnId ?? runtime.activeTurnId ?? `client-request-${requestId}`;\n const existingTool = findPendingMcpToolPart(\n runtime.messages, displayTurnId, params.serverName, toolName,\n );\n const itemId = existingTool?.id ?? `approval-${requestId}`;\n const summary = params.message.trim() || `Allow ${params.serverName} to run ${toolName}?`;\n const clientRequest: Extract<CodexSurfaceClientRequest, { kind: 'confirm_tool' }> = {\n id: requestId,\n kind: 'confirm_tool',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId,\n payload: {\n confirmation: {\n argumentsPreview: argumentsPreview(meta),\n integrationId: params.serverName,\n integrationName: stringValue(meta.connector_name) ?? params.serverName,\n summary,\n toolName,\n ...(persistSupports(meta.persist, 'session') ? { allowConversation: true } : {}),\n ...(persistSupports(meta.persist, 'always') ? { allowAlways: true } : {}),\n },\n },\n };\n this.pending.set(requestId, {\n kind: 'mcp_tool_approval', displayTurnId, itemId, request: clientRequest,\n threadId: params.threadId, turnId: params.turnId, responder,\n });\n const toolPart: SurfaceMessageToolPart = {\n type: 'tool',\n id: itemId,\n kind: 'mcp',\n title: `${params.serverName}.${toolName}`,\n status: 'running',\n statusText: JSON.stringify({\n source: 'mcp', action: 'confirm_tool', phase: 'running',\n params: {\n requestId, confirmationSummary: summary, argumentsPreview: argumentsPreview(meta),\n allowConversation: persistSupports(meta.persist, 'session'),\n allowAlways: persistSupports(meta.persist, 'always'),\n },\n }),\n input: meta.tool_params,\n metadata: {\n ...(existingTool?.metadata ?? {}),\n requestId, confirmationRequestId: requestId, server: params.serverName, tool: toolName,\n },\n };\n this.host.patchRuntime(params.threadId, {\n busy: true,\n messages: upsertAssistantToolPart(runtime.messages, params.threadId, displayTurnId, toolPart),\n });\n const toolMessage = this.host.messageContainingTool(params.threadId, displayTurnId, itemId);\n if (toolMessage) {\n this.host.emitEvent('notification', {\n type: 'tool.started', conversationId: params.threadId, turnId: displayTurnId,\n payload: { messageId: toolMessage.id, toolPart: structuredClone(toolPart) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested',\n conversationId: params.threadId,\n ...(params.turnId ? { turnId: params.turnId } : {}),\n payload: { request: structuredClone(clientRequest) },\n });\n this.host.emitConversationActivity(params.threadId, 'notification');\n return true;\n }\n}\n","import { extname } from 'node:path';\nimport type { v2 } from '../codex/index';\nimport type { CodexSurfaceModel, CodexSurfacePlugin, CodexSurfaceSkill } from '@codex-app-sdk/core/surface';\n\nconst MAX_CATALOG_ICON_BYTES = 256 * 1024;\n\nexport function codexModelToSurfaceModel(model: v2.Model): CodexSurfaceModel {\n return {\n id: model.id,\n model: model.model,\n displayName: model.displayName,\n description: model.description,\n hidden: model.hidden,\n supportedReasoningEfforts: model.supportedReasoningEfforts,\n defaultReasoningEffort: model.defaultReasoningEffort,\n ...(model.serviceTiers.length > 0 ? {\n serviceTiers: model.serviceTiers.map((tier) => ({\n id: tier.id,\n name: tier.name,\n description: tier.description,\n })),\n } : {}),\n ...(model.defaultServiceTier ? { defaultServiceTier: model.defaultServiceTier } : {}),\n isDefault: model.isDefault,\n providerMetadata: {\n inputModalities: model.inputModalities,\n serviceTiers: model.serviceTiers,\n supportsPersonality: model.supportsPersonality,\n upgrade: model.upgrade,\n upgradeInfo: model.upgradeInfo,\n },\n };\n}\n\nexport async function surfaceSkills(\n skills: readonly v2.SkillMetadata[],\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfaceSkill[]> {\n return Promise.all(\n skills\n .filter((skill) => skill.enabled)\n .map((skill) => surfaceSkill(skill, localIconDataUrl)),\n );\n}\n\nexport async function surfaceSkill(\n skill: v2.SkillMetadata,\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfaceSkill> {\n const brandColor = nonEmpty(skill.interface?.brandColor);\n const defaultPrompt = stringOrUndefined(skill.interface?.defaultPrompt);\n const [iconSmall, iconLarge] = await Promise.all([\n skill.interface?.iconSmall ? localIconDataUrl(skill.interface.iconSmall) : undefined,\n skill.interface?.iconLarge ? localIconDataUrl(skill.interface.iconLarge) : undefined,\n ]);\n return {\n name: skill.name,\n description: skill.description,\n shortDescription: skill.shortDescription ?? skill.interface?.shortDescription,\n displayName: skill.interface?.displayName,\n iconSmall,\n iconLarge,\n ...(brandColor ? { brandColor } : {}),\n ...(defaultPrompt !== undefined ? { defaultPrompt } : {}),\n path: skill.path,\n scope: skill.scope,\n enabled: skill.enabled,\n };\n}\n\nexport async function surfacePlugin(\n plugin: v2.PluginSummary,\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfacePlugin> {\n const pluginInterface = plugin.interface;\n const composerIconUrl = safeRemoteImageUrl(pluginInterface?.composerIconUrl);\n const logoUrl = safeRemoteImageUrl(pluginInterface?.logoUrl);\n const logoUrlDark = safeRemoteImageUrl(pluginInterface?.logoUrlDark);\n const displayName = nonEmpty(pluginInterface?.displayName) ?? plugin.name;\n const shortDescription = nonEmpty(pluginInterface?.shortDescription);\n const longDescription = nonEmpty(pluginInterface?.longDescription);\n const brandColor = nonEmpty(pluginInterface?.brandColor);\n const iconUrl = composerIconUrl\n ?? logoUrl\n ?? await firstLocalPluginIcon([pluginInterface?.composerIcon, pluginInterface?.logo], localIconDataUrl);\n const iconUrlDark = composerIconUrl\n ?? logoUrlDark\n ?? logoUrl\n ?? await firstLocalPluginIcon([\n pluginInterface?.composerIcon,\n pluginInterface?.logoDark,\n pluginInterface?.logo,\n ], localIconDataUrl);\n return {\n id: plugin.id,\n name: plugin.name,\n displayName,\n ...(shortDescription ? { shortDescription } : {}),\n ...(longDescription ? { longDescription } : {}),\n ...(brandColor ? { brandColor } : {}),\n ...(iconUrl ? { iconUrl } : {}),\n ...(iconUrlDark ? { iconUrlDark } : {}),\n enabled: plugin.enabled,\n };\n}\n\nexport async function firstLocalPluginIcon(\n paths: readonly (string | null | undefined)[],\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<string | undefined> {\n for (const path of paths) {\n if (!path) continue;\n const dataUrl = await localIconDataUrl(path);\n if (dataUrl) return dataUrl;\n }\n return undefined;\n}\n\nexport function safeRemoteImageUrl(value: string | null | undefined): string | undefined {\n const url = nonEmpty(value);\n try {\n return new URL(url!).protocol === 'https:' ? url : undefined;\n } catch {}\n return undefined;\n}\n\nexport function catalogIconMimeType(path: string): string | undefined {\n switch (extname(path).toLowerCase()) {\n case '.avif': return 'image/avif';\n case '.bmp': return 'image/bmp';\n case '.gif': return 'image/gif';\n case '.ico': return 'image/x-icon';\n case '.jpeg':\n case '.jpg': return 'image/jpeg';\n case '.png': return 'image/png';\n case '.svg': return 'image/svg+xml';\n case '.webp': return 'image/webp';\n }\n return undefined;\n}\n\nexport function boundedImageDataUrl(mimeType: string, dataBase64: string): string | undefined {\n const encoded = dataBase64.trim();\n if (!/^[a-z\\d+/]+={0,2}$/i.test(encoded)) {\n return undefined;\n }\n const unpadded = encoded.replace(/=+$/, '');\n if (unpadded.length % 4 === 1) return undefined;\n const suppliedPadding = encoded.length - unpadded.length;\n const requiredPadding = (4 - (unpadded.length % 4)) % 4;\n if (suppliedPadding !== 0 && suppliedPadding !== requiredPadding) return undefined;\n const byteLength = Math.floor((unpadded.length * 3) / 4);\n if (byteLength > MAX_CATALOG_ICON_BYTES) return undefined;\n const padded = `${unpadded}${'='.repeat((4 - (unpadded.length % 4)) % 4)}`;\n return `data:${mimeType};base64,${padded}`;\n}\n\nfunction nonEmpty(value: unknown): string | undefined {\n const trimmed = typeof value === 'string' ? value.trim() : undefined;\n return trimmed || undefined;\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceApprovalPreset,\n CodexSurfaceEventOrigin,\n CodexSurfaceModel,\n CodexSurfaceSnapshot,\n CodexSurfaceSkill,\n ListCodexModelsOptions,\n} from '@codex-app-sdk/core/surface';\nimport {\n boundedImageDataUrl,\n catalogIconMimeType,\n codexModelToSurfaceModel,\n surfacePlugin,\n surfaceSkills,\n} from './codex-surface-catalog';\nimport { reuseUnchangedItems, surfaceRateLimits } from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n approvalPresetsForProfiles,\n defaultReasoningEffort,\n defaultServiceTier,\n selectedModel,\n} from './codex-surface-settings';\nimport type { ListCodexSkillsOptions } from './codex-surface-contracts';\nimport type { ConversationCatalogs, ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceCatalogHost = {\n authenticationBlocksBootstrap(): boolean;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n ensureConnected(): Promise<void>;\n getState(): CodexSurfaceSnapshot;\n isClosed(): boolean;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n preferredApprovalPreset(): CodexSurfaceApprovalPreset | null;\n runtimes(): Iterable<ThreadRuntimeState>;\n};\n\nexport class CodexSurfaceCatalogController {\n private readonly iconDataUrls = new Map<string, Promise<string | undefined>>();\n private pluginPromise: Promise<void> | null = null;\n private pluginLastAttemptedCwdsKey: string | null = null;\n private pluginRefreshRequested = false;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly cwd: string | undefined,\n private readonly host: CodexSurfaceCatalogHost,\n ) {}\n\n reset(pluginRefreshRequested: boolean): void {\n this.iconDataUrls.clear();\n this.pluginLastAttemptedCwdsKey = null;\n this.pluginRefreshRequested = pluginRefreshRequested;\n }\n\n async listModels(options: ListCodexModelsOptions = {}): Promise<CodexSurfaceModel[]> {\n await this.host.ensureConnected();\n const includeHidden = options.includeHidden ?? false;\n const forceReload = options.forceReload ?? true;\n const state = this.host.getState();\n if (!forceReload && !includeHidden && state.modelCatalogStatus === 'loaded') {\n return structuredClone(state.models);\n }\n const models = await this.requestModels(includeHidden);\n if (!includeHidden) this.applyModels(models, 'action');\n return structuredClone(models);\n }\n\n async loadModels(): Promise<void> {\n this.host.patch({ modelCatalogStatus: 'loading' });\n this.emitModels([], 'loading');\n try {\n this.applyModels(await this.requestModels(false), 'action');\n } catch {\n this.host.patch({ modelCatalogStatus: 'error', models: [] });\n this.emitModels([], 'error');\n }\n }\n\n async loadSkills(forceReload = false, origin: CodexSurfaceEventOrigin = 'action'): Promise<void> {\n if (forceReload) this.iconDataUrls.clear();\n this.host.patch({ skillCatalogStatus: 'loading' });\n this.emitSkills(this.cwd ?? null, [], 'loading', origin);\n try {\n const response = await this.client.request('skills/list', {\n ...(this.cwd ? { cwds: [this.cwd] } : {}), forceReload,\n });\n const skills = await surfaceSkills(\n response.data.flatMap((entry) => entry.skills),\n (path) => this.iconDataUrl(path),\n );\n this.host.patch({ skills, skillCatalogStatus: 'loaded' });\n this.emitSkills(this.cwd ?? null, skills, 'loaded', origin);\n } catch {\n this.host.patch({ skills: [], skillCatalogStatus: 'error' });\n this.emitSkills(this.cwd ?? null, [], 'error', origin);\n }\n }\n\n async listSkills(options: ListCodexSkillsOptions = {}): Promise<CodexSurfaceSkill[]> {\n await this.host.ensureConnected();\n if (options.forceReload) this.iconDataUrls.clear();\n const response = await this.client.request('skills/list', {\n ...(options.cwd ? { cwds: [options.cwd] } : {}),\n forceReload: options.forceReload ?? false,\n });\n const skills = await surfaceSkills(\n response.data.flatMap((entry) => entry.skills),\n (path) => this.iconDataUrl(path),\n );\n for (const runtime of this.host.runtimes()) {\n if (runtime.cwd !== (options.cwd ?? null)) continue;\n this.host.patchRuntime(runtime.threadId, { skills, skillCatalogStatus: 'loaded' });\n this.host.emitConversationSkills(runtime.threadId, 'action');\n }\n this.emitSkills(options.cwd ?? null, skills, 'loaded', 'action');\n return structuredClone(skills);\n }\n\n async loadPermissionProfiles(): Promise<void> {\n try {\n const profiles = await this.requestPermissionProfiles(this.cwd);\n const requirements = (await this.client.request('configRequirements/read', undefined)).requirements;\n const approvalPresets = approvalPresetsForProfiles(profiles, requirements);\n const preferred = this.host.preferredApprovalPreset();\n this.host.patch({\n permissionProfiles: profiles,\n approvalPresets,\n approvalPreset: preferred\n ? (approvalPresets.includes(preferred) ? preferred : approvalPresets[0] ?? null)\n : null,\n });\n this.emitPermissions(this.cwd ?? null, profiles, approvalPresets);\n } catch {\n this.host.patch({ permissionProfiles: [], approvalPresets: [], approvalPreset: null });\n this.emitPermissions(this.cwd ?? null, [], []);\n }\n }\n\n async loadRateLimits(): Promise<void> {\n try {\n const rateLimits = surfaceRateLimits(\n await this.client.request('account/rateLimits/read', undefined),\n );\n this.host.patch({ rateLimits });\n this.host.emitEvent('action', {\n type: 'rateLimits.changed', payload: { rateLimits: structuredClone(rateLimits) },\n });\n } catch {\n this.host.patch({ rateLimits: null });\n this.host.emitEvent('action', { type: 'rateLimits.changed', payload: { rateLimits: null } });\n }\n }\n\n async loadConversationCatalogs(cwd: string | undefined, forceReload = false): Promise<ConversationCatalogs> {\n const state = this.host.getState();\n if (!forceReload && cwd === this.cwd && state.skillCatalogStatus !== 'notLoaded') {\n return {\n skills: [...state.skills],\n skillCatalogStatus: state.skillCatalogStatus,\n permissionProfiles: [...state.permissionProfiles],\n approvalPresets: [...state.approvalPresets],\n };\n }\n const [skillResult, permissionResult] = await Promise.allSettled([\n this.client.request('skills/list', { ...(cwd ? { cwds: [cwd] } : {}), forceReload }),\n (async () => ({\n profiles: await this.requestPermissionProfiles(cwd),\n requirements: (await this.client.request('configRequirements/read', undefined)).requirements,\n }))(),\n ]);\n const skills = skillResult.status === 'fulfilled'\n ? await surfaceSkills(\n skillResult.value.data.flatMap((entry) => entry.skills),\n (path) => this.iconDataUrl(path),\n )\n : [];\n const permissionProfiles = permissionResult.status === 'fulfilled' ? permissionResult.value.profiles : [];\n return {\n skills,\n skillCatalogStatus: skillResult.status === 'fulfilled' ? 'loaded' : 'error',\n permissionProfiles,\n approvalPresets: permissionResult.status === 'fulfilled'\n ? approvalPresetsForProfiles(permissionProfiles, permissionResult.value.requirements)\n : [],\n };\n }\n\n schedulePluginRefresh(force = false): void {\n const state = this.host.getState();\n if (this.host.isClosed() || state.status !== 'ready' || this.host.authenticationBlocksBootstrap()) return;\n const scope = this.pluginScope();\n if (force) {\n this.pluginLastAttemptedCwdsKey = null;\n this.pluginRefreshRequested = true;\n }\n if (this.pluginPromise) return;\n if (!this.pluginRefreshRequested && this.pluginLastAttemptedCwdsKey === scope.key) return;\n this.pluginRefreshRequested = false;\n this.host.patch({ pluginCatalogStatus: 'loading' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged',\n payload: { plugins: structuredClone(state.plugins), status: 'loading' },\n });\n const loading = this.loadPluginCatalog(scope.cwds, scope.key);\n this.pluginPromise = loading;\n void loading.finally(() => {\n this.pluginPromise = null;\n if (this.pluginRefreshRequested || this.pluginScope().key !== scope.key) this.schedulePluginRefresh();\n }).catch(() => undefined);\n }\n\n private async requestModels(includeHidden: boolean): Promise<CodexSurfaceModel[]> {\n const models: CodexSurfaceModel[] = [];\n let cursor: string | null | undefined = null;\n do {\n const response: v2.ModelListResponse = await this.client.request('model/list', { cursor, includeHidden });\n models.push(...response.data.map(codexModelToSurfaceModel));\n cursor = response.nextCursor;\n } while (cursor);\n return models;\n }\n\n private applyModels(models: CodexSurfaceModel[], origin: CodexSurfaceEventOrigin): void {\n const selected = selectedModel(models, this.host.getState().selectedModelId);\n this.host.patch({\n models,\n modelCatalogStatus: 'loaded',\n selectedModelId: selected?.id ?? null,\n selectedReasoningEffort: selected ? defaultReasoningEffort(selected) : null,\n selectedServiceTier: selected ? defaultServiceTier(selected) : null,\n });\n this.emitModels(models, 'loaded', origin);\n }\n\n private emitModels(\n models: CodexSurfaceModel[],\n status: CodexSurfaceSnapshot['modelCatalogStatus'],\n origin: CodexSurfaceEventOrigin = 'action',\n ): void {\n this.host.emitEvent(origin, {\n type: 'catalog.modelsChanged', payload: { models: structuredClone(models), status },\n });\n }\n\n private emitSkills(\n cwd: string | null,\n skills: CodexSurfaceSkill[],\n status: CodexSurfaceSnapshot['skillCatalogStatus'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.host.emitEvent(origin, {\n type: 'catalog.skillsChanged', payload: { cwd, skills: structuredClone(skills), status },\n });\n }\n\n private emitPermissions(\n cwd: string | null,\n profiles: CodexSurfaceSnapshot['permissionProfiles'],\n approvalPresets: CodexSurfaceSnapshot['approvalPresets'],\n ): void {\n this.host.emitEvent('action', {\n type: 'catalog.permissionsChanged',\n payload: { cwd, permissionProfiles: structuredClone(profiles), approvalPresets: [...approvalPresets] },\n });\n }\n\n private async requestPermissionProfiles(cwd: string | undefined) {\n const profiles: CodexSurfaceSnapshot['permissionProfiles'] = [];\n let cursor: string | null | undefined = null;\n do {\n const response: v2.PermissionProfileListResponse = await this.client.request('permissionProfile/list', {\n cursor, ...(cwd ? { cwd } : {}),\n });\n profiles.push(...response.data);\n cursor = response.nextCursor;\n } while (cursor);\n return profiles;\n }\n\n private pluginScope(): { cwds: string[]; key: string } {\n const state = this.host.getState();\n const cwds = [...new Set([\n this.cwd,\n ...state.conversations.map((conversation) => conversation.cwd),\n ...[...this.host.runtimes()].map((runtime) => runtime.cwd ?? undefined),\n ].filter((cwd): cwd is string => typeof cwd === 'string' && cwd.trim().length > 0))].sort();\n return { cwds, key: JSON.stringify(cwds) };\n }\n\n private async loadPluginCatalog(cwds: readonly string[], key: string): Promise<void> {\n this.pluginLastAttemptedCwdsKey = key;\n try {\n const response = await this.client.request('plugin/installed', {\n ...(cwds.length > 0 ? { cwds: [...cwds] } : {}),\n });\n const summaries = new Map<string, v2.PluginSummary>();\n for (const marketplace of response.marketplaces) {\n for (const plugin of marketplace.plugins) {\n if (!summaries.has(plugin.id)) summaries.set(plugin.id, plugin);\n }\n }\n const plugins = reuseUnchangedItems(this.host.getState().plugins, await Promise.all(\n [...summaries.values()].map((plugin) => surfacePlugin(plugin, (path) => this.iconDataUrl(path))),\n ));\n if (this.host.isClosed() || this.host.authenticationBlocksBootstrap()) return;\n this.host.patch({ plugins, pluginCatalogStatus: 'loaded' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged', payload: { plugins: structuredClone(plugins), status: 'loaded' },\n });\n } catch {\n if (this.host.isClosed() || this.host.authenticationBlocksBootstrap()) return;\n this.pluginLastAttemptedCwdsKey = null;\n this.host.patch({ pluginCatalogStatus: 'error' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged',\n payload: { plugins: structuredClone(this.host.getState().plugins), status: 'error' },\n });\n }\n }\n\n private iconDataUrl(path: string): Promise<string | undefined> {\n const existing = this.iconDataUrls.get(path);\n if (existing) return existing;\n const materialized = this.readIconDataUrl(path);\n this.iconDataUrls.set(path, materialized);\n return materialized;\n }\n\n private async readIconDataUrl(path: string): Promise<string | undefined> {\n if (!isAbsolute(path)) return undefined;\n const mimeType = catalogIconMimeType(path);\n if (!mimeType) return undefined;\n try {\n const response = await this.client.request('fs/readFile', { path });\n return boundedImageDataUrl(mimeType, response.dataBase64);\n } catch {\n return undefined;\n }\n }\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceApproval,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceRequestedPermission,\n} from '@codex-app-sdk/core/surface';\n\nexport type PendingCodexApproval = {\n approval: CodexSurfaceApproval;\n resolve(decision: CodexSurfaceApprovalDecision, scope: CodexSurfaceApprovalScope): void;\n};\n\nexport function registerCodexApprovalHandlers(\n client: CodexAppServerClient,\n onApproval: (pending: PendingCodexApproval) => void,\n): () => void {\n const unsubscribers = [\n client.onServerRequest('item/commandExecution/requestApproval', (request, responder) => {\n onApproval({\n approval: commandApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n decision: commandDecision(request.params, decision, scope),\n }),\n });\n return true;\n }),\n client.onServerRequest('item/fileChange/requestApproval', (request, responder) => {\n onApproval({\n approval: fileChangeApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny' ? 'decline' : scope === 'session' ? 'acceptForSession' : 'accept',\n }),\n });\n return true;\n }),\n client.onServerRequest('item/permissions/requestApproval', (request, responder) => {\n onApproval({\n approval: permissionsApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n permissions: decision === 'deny' ? {} : {\n ...(request.params.permissions.fileSystem ? { fileSystem: request.params.permissions.fileSystem } : {}),\n ...(request.params.permissions.network ? { network: request.params.permissions.network } : {}),\n },\n scope: scope === 'session' ? 'session' : 'turn',\n }),\n });\n return true;\n }),\n client.onServerRequest('execCommandApproval', (request, responder) => {\n onApproval({\n approval: {\n id: String(request.id),\n kind: 'command',\n conversationId: request.params.conversationId,\n itemId: request.params.callId,\n title: 'Run command',\n command: request.params.command.join(' '),\n cwd: request.params.cwd,\n ...(request.params.reason ? { description: request.params.reason } : {}),\n },\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny'\n ? { denied: { rejection: 'Denied by user' } }\n : scope === 'session' ? 'approved_for_session' : 'approved',\n }),\n });\n return true;\n }),\n client.onServerRequest('applyPatchApproval', (request, responder) => {\n onApproval({\n approval: {\n id: String(request.id),\n kind: 'file-change',\n conversationId: request.params.conversationId,\n itemId: request.params.callId,\n title: 'Apply file changes',\n ...((request.params.reason || request.params.grantRoot) ? {\n description: request.params.reason ?? `Write under ${request.params.grantRoot}`,\n } : {}),\n },\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny'\n ? { denied: { rejection: 'Denied by user' } }\n : scope === 'session' ? 'approved_for_session' : 'approved',\n }),\n });\n return true;\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n}\n\nfunction commandApproval(\n id: string | number,\n params: v2.CommandExecutionRequestApprovalParams,\n): CodexSurfaceApproval {\n const availableDecisions = params.availableDecisions;\n const additionalPermissions = permissionDetails(params.additionalPermissions);\n const requestedPermissions = [\n ...(params.networkApprovalContext ? [{\n kind: 'network' as const,\n enabled: true,\n host: params.networkApprovalContext.host,\n protocol: params.networkApprovalContext.protocol,\n }] : []),\n ...additionalPermissions.filter((permission) => !params.networkApprovalContext || permission.kind !== 'network'),\n ];\n return {\n id: String(id),\n kind: 'command',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Run command',\n command: params.command ?? undefined,\n cwd: params.cwd ?? undefined,\n ...(params.reason ? { description: params.reason } : {}),\n ...(requestedPermissions.length ? { requestedPermissions } : {}),\n ...(availableDecisions ? {\n allowedScopes: [\n ...(availableDecisions.includes('accept') ? ['once' as const] : []),\n ...(availableDecisions.includes('acceptForSession') ? ['session' as const] : []),\n ],\n canDeny: availableDecisions.includes('decline') || availableDecisions.includes('cancel'),\n } : {}),\n };\n}\n\nfunction fileChangeApproval(\n id: string | number,\n params: v2.FileChangeRequestApprovalParams,\n): CodexSurfaceApproval {\n return {\n id: String(id),\n kind: 'file-change',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Apply file changes',\n ...((params.reason || params.grantRoot) ? {\n description: params.reason ?? `Write under ${params.grantRoot}`,\n } : {}),\n };\n}\n\nfunction permissionsApproval(\n id: string | number,\n params: v2.PermissionsRequestApprovalParams,\n): CodexSurfaceApproval {\n const requestedPermissions = permissionDetails(params.permissions);\n return {\n id: String(id),\n kind: 'permissions',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Grant additional permissions',\n description: params.reason ?? 'Codex requested additional access for this task.',\n cwd: params.cwd,\n ...(requestedPermissions.length ? { requestedPermissions } : {}),\n };\n}\n\nfunction commandDecision(\n params: v2.CommandExecutionRequestApprovalParams,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope,\n): v2.CommandExecutionApprovalDecision {\n const available = params.availableDecisions;\n const requested = decision === 'deny' ? 'decline' : scope === 'session' ? 'acceptForSession' : 'accept';\n if (!available || available.includes(requested)) return requested;\n if (decision === 'deny' && available.includes('cancel')) return 'cancel';\n throw new Error(`Approval decision '${decision}:${scope}' is not available for this command`);\n}\n\nfunction permissionDetails(\n profile: v2.RequestPermissionProfile | v2.AdditionalPermissionProfile | null | undefined,\n): CodexSurfaceRequestedPermission[] {\n if (!profile) return [];\n const permissions: CodexSurfaceRequestedPermission[] = [];\n if (profile.network) {\n permissions.push({ kind: 'network', enabled: profile.network.enabled ?? false });\n }\n if (profile.fileSystem) {\n for (const path of profile.fileSystem.read ?? []) {\n permissions.push({ kind: 'filesystem', access: 'read', path });\n }\n for (const path of profile.fileSystem.write ?? []) {\n permissions.push({ kind: 'filesystem', access: 'write', path });\n }\n for (const entry of profile.fileSystem.entries ?? []) {\n permissions.push({\n kind: 'filesystem',\n access: entry.access,\n path: fileSystemPath(entry.path),\n });\n }\n }\n return permissions;\n}\n\nfunction fileSystemPath(path: v2.FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return path.pattern;\n const special = path.value;\n switch (special.kind) {\n case 'project_roots': return special.subpath ? `project roots/${special.subpath}` : 'project roots';\n case 'tmpdir': return 'system temporary directory';\n case 'slash_tmp': return '/tmp';\n case 'root': return 'filesystem root';\n case 'minimal': return 'minimal runtime paths';\n case 'unknown': return [special.path, special.subpath].filter(Boolean).join('/');\n }\n}\n","import type { CodexAppServerClient } from '../codex/index';\nimport type {\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { registerCodexApprovalHandlers, type PendingCodexApproval } from './codex-approvals';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\ntype ApprovalResolutionReason =\n | 'conversation_closed'\n | 'conversation_removed'\n | 'surface_disconnected';\n\nexport type CodexSurfaceApprovalsHost = {\n activeConversationId(): string | null;\n createRuntime(threadId: string, patch: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n maybeClearWaitingBusy(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(threadId: string, status: 'active'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n};\n\nexport class CodexSurfaceApprovalsController {\n private readonly pending = new Map<string, PendingCodexApproval>();\n private readonly unsubscribeHandler: () => void;\n\n constructor(client: CodexAppServerClient, private readonly host: CodexSurfaceApprovalsHost) {\n this.unsubscribeHandler = registerCodexApprovalHandlers(client, (pending) => this.add(pending));\n }\n\n close(): void {\n this.unsubscribeHandler();\n this.pending.clear();\n }\n\n denyAll(): void {\n for (const pending of this.pending.values()) pending.resolve('deny', 'once');\n this.pending.clear();\n }\n\n approvalsForThread(threadId: string): CodexSurfaceSnapshot['approvals'] {\n return [...this.pending.values()]\n .map((pending) => pending.approval)\n .filter((approval) => approval.conversationId === threadId);\n }\n\n hasForThread(threadId: string): boolean {\n return [...this.pending.values()]\n .some((pending) => pending.approval.conversationId === threadId);\n }\n\n async resolve(\n threadId: string | undefined,\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope,\n ): Promise<void> {\n const pending = this.pending.get(approvalId);\n if (!pending) throw new Error(`Unknown approval '${approvalId}'`);\n if (threadId !== undefined && pending.approval.conversationId !== threadId) {\n throw new Error(\n `Approval '${approvalId}' belongs to conversation '${pending.approval.conversationId}', not '${threadId}'`,\n );\n }\n if (decision !== 'approve' && decision !== 'deny') {\n throw new Error(`Invalid approval decision '${String(decision)}'`);\n }\n if (scope !== 'once' && scope !== 'session') {\n throw new Error(`Invalid approval scope '${String(scope)}'`);\n }\n if (decision === 'approve' && pending.approval.allowedScopes && !pending.approval.allowedScopes.includes(scope)) {\n throw new Error(`Approval decision '${decision}:${scope}' is not available for '${approvalId}'`);\n }\n pending.resolve(decision, scope);\n this.pending.delete(approvalId);\n this.refreshActive();\n this.host.maybeClearWaitingBusy(pending.approval.conversationId);\n this.host.emitEvent('action', {\n type: 'approval.resolved',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval), decision, scope, reason: 'host',\n },\n });\n this.host.emitConversationActivity(pending.approval.conversationId, 'action');\n }\n\n clearForThread(threadId: string, eventReason: ApprovalResolutionReason): void {\n const resolved: PendingCodexApproval[] = [];\n for (const [approvalId, pending] of this.pending) {\n if (pending.approval.conversationId !== threadId) continue;\n pending.resolve('deny', 'once');\n this.pending.delete(approvalId);\n resolved.push(pending);\n }\n this.refreshActive();\n this.host.patchRuntime(threadId, {});\n for (const pending of resolved) {\n this.host.emitEvent('notification', {\n type: 'approval.resolved',\n conversationId: threadId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval),\n decision: 'deny', scope: 'once', reason: eventReason,\n },\n });\n }\n }\n\n handleServerResolved(requestId: string): void {\n const pending = this.pending.get(requestId);\n this.pending.delete(requestId);\n this.refreshActive();\n if (!pending) return;\n this.host.maybeClearWaitingBusy(pending.approval.conversationId);\n this.host.emitEvent('notification', {\n type: 'approval.resolved',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval),\n decision: null, scope: null, reason: 'server',\n },\n });\n }\n\n private add(pending: PendingCodexApproval): void {\n this.pending.set(pending.approval.id, pending);\n const runtime = this.host.createRuntime(pending.approval.conversationId, { busy: true });\n if (pending.approval.turnId) this.host.markRuntimeTurnActive(runtime, pending.approval.turnId);\n this.host.patchRuntime(pending.approval.conversationId, { busy: true });\n this.host.patchConversationStatus(pending.approval.conversationId, 'active');\n this.refreshActive();\n this.host.emitEvent('notification', {\n type: 'approval.requested',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: { approval: structuredClone(pending.approval) },\n });\n this.host.emitConversationActivity(pending.approval.conversationId, 'notification');\n }\n\n private refreshActive(): void {\n const threadId = this.host.activeConversationId();\n this.host.patch({ approvals: threadId ? this.approvalsForThread(threadId) : [] });\n }\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexSurfaceJsonValue } from '@codex-app-sdk/core/surface';\n\nexport type CodexMcpServerToolApprovalMode = 'auto' | 'prompt' | 'writes' | 'approve';\n\nexport type CodexMcpServerTransport =\n | {\n type: 'stdio';\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: Readonly<Record<string, string>>;\n /** Environment variable names inherited by the app-server-launched process. */\n envVars?: readonly string[];\n }\n | {\n type: 'http';\n url: string;\n };\n\n/** Trusted main-process configuration for an app-owned MCP server. */\nexport type CodexMcpServerDefinition = {\n name: string;\n transport: CodexMcpServerTransport;\n toolApprovalMode?: CodexMcpServerToolApprovalMode;\n required?: boolean;\n enabledTools?: readonly string[];\n startupTimeoutMs?: number;\n toolTimeoutMs?: number;\n};\n\nexport function normalizeMcpServers(\n definitions: readonly CodexMcpServerDefinition[],\n): readonly CodexMcpServerDefinition[] {\n if (!Array.isArray(definitions)) throw new TypeError('Codex MCP servers must be an array');\n const names = new Set<string>();\n return definitions.map((definition, index) => {\n if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {\n throw new TypeError(`Codex MCP server ${index + 1} must be an object`);\n }\n const name = definition.name?.trim();\n if (!name || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(name)) {\n throw new TypeError(`Codex MCP server ${index + 1} name must match ^[A-Za-z0-9][A-Za-z0-9_-]*$`);\n }\n if (names.has(name)) throw new Error(`Duplicate Codex MCP server '${name}'`);\n names.add(name);\n const transport = normalizeMcpTransport(definition.transport, name);\n const toolApprovalMode = definition.toolApprovalMode;\n if (\n toolApprovalMode !== undefined\n && toolApprovalMode !== 'auto'\n && toolApprovalMode !== 'prompt'\n && toolApprovalMode !== 'writes'\n && toolApprovalMode !== 'approve'\n ) {\n throw new TypeError(`Codex MCP server '${name}' tool approval mode is invalid`);\n }\n if (definition.required !== undefined && typeof definition.required !== 'boolean') {\n throw new TypeError(`Codex MCP server '${name}' required flag must be a boolean`);\n }\n const enabledTools = definition.enabledTools === undefined\n ? undefined\n : normalizedNonEmptyStrings(definition.enabledTools, `Codex MCP server '${name}' enabled tool`);\n const startupTimeoutMs = optionalPositiveMilliseconds(\n definition.startupTimeoutMs,\n `Codex MCP server '${name}' startup timeout`,\n );\n const toolTimeoutMs = optionalPositiveMilliseconds(\n definition.toolTimeoutMs,\n `Codex MCP server '${name}' tool timeout`,\n );\n return {\n name,\n transport,\n ...(toolApprovalMode === undefined ? {} : { toolApprovalMode }),\n ...(definition.required === undefined ? {} : { required: definition.required }),\n ...(enabledTools === undefined ? {} : { enabledTools }),\n ...(startupTimeoutMs === undefined ? {} : { startupTimeoutMs }),\n ...(toolTimeoutMs === undefined ? {} : { toolTimeoutMs }),\n };\n });\n}\n\nfunction normalizeMcpTransport(\n transport: CodexMcpServerTransport,\n serverName: string,\n): CodexMcpServerTransport {\n if (!transport || typeof transport !== 'object' || Array.isArray(transport)) {\n throw new TypeError(`Codex MCP server '${serverName}' transport must be an object`);\n }\n if (transport.type === 'http') {\n const url = transport.url?.trim();\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new TypeError(`Codex MCP server '${serverName}' URL must be valid`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new TypeError(`Codex MCP server '${serverName}' URL must use HTTP or HTTPS`);\n }\n return { type: 'http', url };\n }\n if (transport.type !== 'stdio') {\n throw new TypeError(`Codex MCP server '${serverName}' transport type is invalid`);\n }\n const command = transport.command?.trim();\n if (!command) throw new TypeError(`Codex MCP server '${serverName}' command cannot be empty`);\n const args = transport.args === undefined\n ? undefined\n : normalizedNonEmptyStrings(transport.args, `Codex MCP server '${serverName}' argument`);\n const cwd = transport.cwd?.trim();\n if (cwd !== undefined && (!cwd || !isAbsolute(cwd))) {\n throw new TypeError(`Codex MCP server '${serverName}' cwd must be an absolute path`);\n }\n let env: Record<string, string> | undefined;\n if (transport.env !== undefined) {\n if (!transport.env || typeof transport.env !== 'object' || Array.isArray(transport.env)) {\n throw new TypeError(`Codex MCP server '${serverName}' env must be an object`);\n }\n env = {};\n for (const [key, value] of Object.entries(transport.env)) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) || typeof value !== 'string') {\n throw new TypeError(`Codex MCP server '${serverName}' env entries must be string environment variables`);\n }\n env[key] = value;\n }\n }\n const envVars = transport.envVars === undefined\n ? undefined\n : normalizedEnvironmentVariableNames(transport.envVars, serverName);\n return {\n type: 'stdio',\n command,\n ...(args === undefined ? {} : { args }),\n ...(cwd === undefined ? {} : { cwd }),\n ...(env === undefined ? {} : { env }),\n ...(envVars === undefined ? {} : { envVars }),\n };\n}\n\nfunction normalizedNonEmptyStrings(values: readonly string[], label: string): string[] {\n if (!Array.isArray(values)) throw new TypeError(`${label}s must be an array`);\n const normalized = values.map((value) => {\n if (typeof value !== 'string' || !value.trim()) throw new TypeError(`${label} cannot be empty`);\n return value.trim();\n });\n return [...new Set(normalized)];\n}\n\nfunction normalizedEnvironmentVariableNames(values: readonly string[], serverName: string): string[] {\n const names = normalizedNonEmptyStrings(values, `Codex MCP server '${serverName}' environment variable`);\n for (const name of names) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new TypeError(`Codex MCP server '${serverName}' environment variable '${name}' is invalid`);\n }\n }\n return names;\n}\n\nfunction optionalPositiveMilliseconds(value: number | undefined, label: string): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value) || value <= 0) throw new TypeError(`${label} must be a positive finite number`);\n return value;\n}\n\nexport function mcpServerConfig(\n definitions: readonly CodexMcpServerDefinition[],\n): Record<string, CodexSurfaceJsonValue> {\n const config: Record<string, CodexSurfaceJsonValue> = {};\n for (const definition of definitions) {\n const server: Record<string, CodexSurfaceJsonValue> = definition.transport.type === 'http'\n ? { url: definition.transport.url }\n : {\n command: definition.transport.command,\n ...(definition.transport.args === undefined ? {} : { args: [...definition.transport.args] }),\n ...(definition.transport.cwd === undefined ? {} : { cwd: definition.transport.cwd }),\n ...(definition.transport.env === undefined ? {} : { env: { ...definition.transport.env } }),\n ...(definition.transport.envVars === undefined ? {} : { env_vars: [...definition.transport.envVars] }),\n };\n if (definition.toolApprovalMode !== undefined) {\n server.default_tools_approval_mode = definition.toolApprovalMode;\n }\n if (definition.required !== undefined) server.required = definition.required;\n if (definition.enabledTools !== undefined) server.enabled_tools = [...definition.enabledTools];\n if (definition.startupTimeoutMs !== undefined) server.startup_timeout_sec = definition.startupTimeoutMs / 1000;\n if (definition.toolTimeoutMs !== undefined) server.tool_timeout_sec = definition.toolTimeoutMs / 1000;\n config[`mcp_servers.${definition.name}`] = server;\n }\n return config;\n}\n\nexport function assertNoMcpConfigCollision(\n config: Readonly<Record<string, CodexSurfaceJsonValue>>,\n definitions: readonly CodexMcpServerDefinition[],\n): void {\n if (definitions.length === 0) return;\n for (const key of Object.keys(config)) {\n if (key === 'mcp_servers') {\n throw new Error('Raw mcp_servers config cannot be combined with typed Codex MCP servers');\n }\n for (const definition of definitions) {\n const path = `mcp_servers.${definition.name}`;\n if (key === path || key.startsWith(`${path}.`)) {\n throw new Error(`Raw config for Codex MCP server '${definition.name}' conflicts with its typed definition`);\n }\n }\n }\n}\n","import type { CodexServerRequestResponder, ServerRequest, v2 } from '../codex/index';\nimport type { CodexSurfaceJsonValue, CreateCodexConversationOptions } from '@codex-app-sdk/core/surface';\nimport {\n assertNoMcpConfigCollision,\n mcpServerConfig,\n normalizeMcpServers,\n type CodexMcpServerDefinition,\n} from './codex-surface-mcp';\nimport { errorMessage } from './codex-surface-prompts';\nimport type {\n CodexConversationLoadOptions,\n CodexDynamicTool,\n CodexSurfaceExtension,\n CodexThreadStartExtension,\n} from './codex-surface-contracts';\n\ntype DynamicToolRequest = Extract<ServerRequest, { method: 'item/tool/call' }>;\n\nexport class CodexSurfaceExtensionsController {\n private readonly dynamicTools = new Map<string, CodexDynamicTool>();\n readonly defaultMcpServers: readonly CodexMcpServerDefinition[];\n\n constructor(\n private readonly extensions: readonly CodexSurfaceExtension[],\n mcpServers: readonly CodexMcpServerDefinition[],\n private readonly hostOptionsForThread: (threadId: string) => CodexConversationLoadOptions | undefined,\n ) {\n this.defaultMcpServers = normalizeMcpServers(mcpServers);\n for (const extension of extensions) {\n for (const tool of extension.dynamicTools ?? []) {\n const name = tool.name.trim();\n if (!name) throw new Error('Dynamic tool names cannot be empty');\n if (this.dynamicTools.has(name)) throw new Error(`Duplicate dynamic tool '${name}'`);\n this.dynamicTools.set(name, { ...tool, name });\n }\n }\n }\n\n hasDynamicTools(): boolean {\n return this.dynamicTools.size > 0;\n }\n\n dynamicToolSpecs(): v2.DynamicToolSpec[] {\n return [...this.dynamicTools.values()].map((tool) => ({\n type: 'function',\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as v2.DynamicToolFunctionSpec['inputSchema'],\n ...(tool.deferLoading === undefined ? {} : { deferLoading: tool.deferLoading }),\n }));\n }\n\n async conversationExtension(\n context: Parameters<NonNullable<CodexSurfaceExtension['configureConversation']>>[0],\n createOptions: CreateCodexConversationOptions = {},\n mcpServers: readonly CodexMcpServerDefinition[] = this.defaultMcpServers,\n ): Promise<CodexThreadStartExtension> {\n const config: Record<string, CodexSurfaceJsonValue> = mcpServerConfig(mcpServers);\n const developerInstructions: string[] = [];\n let baseInstructions: string | undefined;\n for (const extension of this.extensions) {\n if (!extension.configureConversation) continue;\n const contribution = await extension.configureConversation(context);\n if (contribution.config) {\n assertNoMcpConfigCollision(contribution.config, mcpServers);\n Object.assign(config, contribution.config);\n }\n if (contribution.baseInstructions !== undefined) baseInstructions = contribution.baseInstructions;\n if (contribution.developerInstructions?.trim()) {\n developerInstructions.push(contribution.developerInstructions.trim());\n }\n }\n if (createOptions.config) {\n assertNoMcpConfigCollision(createOptions.config, mcpServers);\n Object.assign(config, createOptions.config);\n }\n if (createOptions.baseInstructions !== undefined) baseInstructions = createOptions.baseInstructions;\n if (createOptions.developerInstructions?.trim()) {\n developerInstructions.push(createOptions.developerInstructions.trim());\n }\n return {\n ...(baseInstructions === undefined ? {} : { baseInstructions }),\n ...(Object.keys(config).length === 0 ? {} : { config }),\n ...(developerInstructions.length === 0\n ? {}\n : { developerInstructions: developerInstructions.join('\\n\\n') }),\n };\n }\n\n async handleDynamicToolCall(\n request: DynamicToolRequest,\n responder: CodexServerRequestResponder<'item/tool/call'>,\n ): Promise<void> {\n if (request.params.namespace !== null) {\n responder.reject({\n code: -32601,\n message: `Dynamic tool namespace '${request.params.namespace}' is not configured`,\n });\n return;\n }\n const tool = this.dynamicTools.get(request.params.tool);\n if (!tool) {\n responder.reject({ code: -32601, message: `Unknown dynamic host tool '${request.params.tool}'` });\n return;\n }\n try {\n const result = await tool.execute({\n callId: request.params.callId,\n conversationId: request.params.threadId,\n turnId: request.params.turnId,\n arguments: request.params.arguments as CodexSurfaceJsonValue,\n extensionContext: this.hostOptionsForThread(request.params.threadId)?.extensionContext,\n });\n const normalized = typeof result === 'string'\n ? { content: [{ type: 'text' as const, text: result }], success: true }\n : { content: result.content, success: result.success ?? true };\n responder.resolve({\n success: normalized.success,\n contentItems: normalized.content.map((item) => item.type === 'image'\n ? { type: 'inputImage' as const, imageUrl: item.imageUrl }\n : { type: 'inputText' as const, text: item.text }),\n });\n } catch (error) {\n responder.resolve({\n success: false,\n contentItems: [{ type: 'inputText', text: errorMessage(error) }],\n });\n }\n }\n}\n","import { suppressViewedImagePreviews } from './codex-original-history-images';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n ListCodexConversationsOptions,\n SurfaceMessage,\n CodexSurfaceHistoryReason,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexTurnToSurfaceMessages,\n preserveHistoricalMessagePresentation,\n} from './codex-conversation-history';\nimport { normalizedConversationId, errorMessage } from './codex-surface-prompts';\nimport { reuseUnchangedItems, threadToSummary, upsertConversation } from './codex-surface-data';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceTurn } from './codex-surface-events';\n\nconst HISTORY_INITIAL_PAGE_SIZE = 50;\nconst HISTORY_PAGE_SIZE = 25;\nconst HISTORY_MESSAGE_BATCH_SIZE = 25;\n\ntype HistoryHydrationOptions = {\n initialPageLoaded?: boolean;\n cursor?: string | null;\n restart?: boolean;\n itemsView?: 'full' | 'summary';\n};\n\nexport type CodexSurfaceConversationsHost = {\n emitHistoryReplaced(threadId: string, reason: CodexSurfaceHistoryReason, origin: 'action'): void;\n emitHistoryPrepended(threadId: string, messages: readonly SurfaceMessage[], origin: 'lifecycle'): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'listed' | 'updated',\n origin: 'action',\n ): void;\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n removeThread(threadId: string, reason: 'archived' | 'deleted', origin: 'action'): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n schedulePluginRefresh(force: boolean): void;\n};\n\nexport class CodexSurfaceConversationsController {\n private readonly turnLoads = new Map<string, Map<string, Promise<void>>>();\n private readonly imageHydrations = new Map<string, Promise<void>>();\n private readonly historyHydrations = new Map<string, Promise<void>>();\n private readonly historyLoads = new Map<string, Promise<{\n conversationId: string;\n messages: SurfaceMessage[];\n hasOlder: boolean;\n }>>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly conversationLimit: number | undefined,\n private readonly host: CodexSurfaceConversationsHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n reset(): void {\n this.turnLoads.clear(); this.imageHydrations.clear();\n this.historyHydrations.clear();\n this.historyLoads.clear();\n }\n\n forget(threadId: string): void {\n this.turnLoads.delete(threadId); this.imageHydrations.delete(threadId);\n this.historyHydrations.delete(threadId);\n this.historyLoads.delete(threadId);\n }\n\n async loadTurnHistory(threadId: string, turnId: string): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n const prior = runtime.turns.find(turn => turn.id === turnId);\n if (!prior) throw new Error('Turn is not loaded in this conversation.');\n if (prior.itemsView !== 'summary') return;\n let loads = this.turnLoads.get(threadId);\n if (!loads) { loads = new Map(); this.turnLoads.set(threadId, loads); }\n const existing = loads.get(turnId); if (existing) return existing;\n const setDetails = (patch: Partial<typeof prior>) => {\n this.host.patchRuntime(threadId, { turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, ...patch } : turn) });\n this.host.emitHistoryReplaced(threadId, 'details', 'action');\n };\n const loading = (async () => {\n await Promise.resolve();\n try {\n if (this.host.runtime(threadId) !== runtime) throw new Error('Conversation changed while loading turn details.');\n setDetails({ detailsLoading: true, detailsError: null });\n const items = await readTurnItems(this.client, threadId, turnId);\n if (this.host.runtime(threadId) !== runtime) throw new Error('Conversation changed while loading turn details.');\n const current = runtime.turns.find(turn => turn.id === turnId);\n if (!current) throw new Error('Turn is no longer available.');\n // An already-streaming turn is authoritative; never replace its live work.\n if (runtime.activeTurnId !== turnId && current.status !== 'inProgress') {\n const native: v2.Turn = { id: turnId, rootTurnId: null, itemsView: 'full', items, status: current.status, error: null,\n startedAt: current.startedAt ? Date.parse(current.startedAt) / 1000 : null,\n completedAt: current.completedAt ? Date.parse(current.completedAt) / 1000 : null, durationMs: current.durationMs };\n let messages = preserveHistoricalMessagePresentation(runtime.messages, codexTurnToSurfaceMessages(threadId, native));\n if (this.originalImages) messages = suppressViewedImagePreviews(messages);\n const at = runtime.messages.findIndex(message => message.turnId === turnId);\n const merged = runtime.messages.filter(message => message.turnId !== turnId);\n merged.splice(at < 0 ? merged.length : at, 0, ...messages);\n this.host.patchRuntime(threadId, { messages: merged });\n }\n setDetails({ itemsView: 'full', detailsLoading: false, detailsError: null });\n this.hydrateOriginalImages(threadId);\n } catch (error) {\n if (this.host.runtime(threadId) === runtime) setDetails({ detailsLoading: false, detailsError: errorMessage(error) });\n throw error;\n } finally { if (this.turnLoads.get(threadId) === loads) loads.delete(turnId); }\n })();\n loads.set(turnId, loading); return loading;\n }\n\n async loadLoadedTurnHistory(threadId: string): Promise<void> {\n const paging = this.historyLoads.get(threadId);\n if (paging) await paging;\n for (const turn of [...this.host.requireRuntime(threadId).turns]) {\n if (turn.itemsView === 'summary') await this.loadTurnHistory(threadId, turn.id);\n }\n }\n\n hydrateOriginalImages(threadId: string, path?: string | null): void {\n if (!this.originalImages) return;\n this.originalImages.rememberPath(threadId, path);\n if (this.imageHydrations.has(threadId)) return;\n const runtime = this.host.runtime(threadId);\n if (!runtime || !runtime.turns.some(turn => turn.itemsView !== 'summary')) return;\n const work = (async () => {\n const project = await this.originalImages!.prepare(threadId, path);\n if (this.host.runtime(threadId) !== runtime) return;\n const summaryIds = new Set(runtime.turns.filter(turn => turn.itemsView === 'summary').map(turn => turn.id));\n this.host.patchRuntime(threadId, { messages: project(runtime.messages).map((message, index) => summaryIds.has(message.turnId ?? '') ? runtime.messages[index]! : message) });\n this.host.emitHistoryReplaced(threadId, 'images', 'action');\n })();\n this.imageHydrations.set(threadId, work);\n void work.finally(() => { if (this.imageHydrations.get(threadId) === work) this.imageHydrations.delete(threadId); }).catch(() => undefined);\n }\n\n async refresh(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n return this.load();\n }\n\n async load(): Promise<CodexSurfaceSnapshot> {\n const conversations = reuseUnchangedItems(\n this.host.getState().conversations,\n await this.requestConversations({ limit: this.conversationLimit }),\n );\n this.host.patch({ conversations });\n this.host.schedulePluginRefresh(true);\n for (const summary of conversations) this.host.emitSummaryUpserted(summary, 'listed', 'action');\n return this.host.getSnapshot();\n }\n\n async list(options: ListCodexConversationsOptions = {}): Promise<CodexConversationSummary[]> {\n await this.host.ensureConnected();\n return structuredClone(await this.requestConversations(options));\n }\n\n async readSummary(conversationId: string): Promise<CodexConversationSummary> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n const response: v2.ThreadReadResponse = await this.client.request('thread/read', {\n threadId,\n includeTurns: false,\n });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/read returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const summary = this.summaryWithKnownTurnCount(response.thread);\n return structuredClone(summary);\n }\n\n async archive(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n await this.client.request('thread/archive', { threadId });\n this.host.removeThread(threadId, 'archived', 'action');\n return this.host.getSnapshot();\n }\n\n async delete(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n await this.client.request('thread/delete', { threadId });\n this.host.removeThread(threadId, 'deleted', 'action');\n return this.host.getSnapshot();\n }\n\n async unarchive(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n const response = await this.client.request('thread/unarchive', { threadId });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/unarchive returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const summary = this.summaryWithKnownTurnCount(response.thread);\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n return this.host.getSnapshot();\n }\n\n hydrateCompleteHistory(threadId: string, options: HistoryHydrationOptions = {}): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.fullHistoryHydrated && !options.restart) return Promise.resolve();\n if (options.initialPageLoaded && options.cursor === null) {\n this.host.patchRuntime(threadId, {\n historyCursor: null,\n historyHasOlder: false,\n fullHistoryHydrated: true,\n });\n return Promise.resolve();\n }\n const existing = this.historyHydrations.get(threadId);\n if (existing) return existing;\n const hydration = (async () => {\n try {\n if (options.restart) {\n const response: v2.ThreadTurnsListResponse = await this.client.request('thread/turns/list', {\n threadId,\n cursor: null,\n limit: HISTORY_INITIAL_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: 'full',\n });\n await this.mergeHistoryPage(threadId, [...response.data].reverse(), new Set());\n this.host.patchRuntime(threadId, {\n historyCursor: response.nextCursor,\n historyHasOlder: response.nextCursor !== null,\n fullHistoryHydrated: response.nextCursor === null,\n });\n }\n if (options.cursor !== undefined) {\n this.host.patchRuntime(threadId, {\n historyCursor: options.cursor,\n historyHasOlder: options.cursor !== null,\n });\n }\n while (this.host.runtime(threadId)?.historyCursor !== null) {\n await this.loadOlderHistory(threadId, options.itemsView);\n }\n if (!this.host.runtime(threadId)) return;\n this.host.patchRuntime(threadId, {\n fullHistoryHydrated: true,\n historyHasOlder: false,\n });\n } catch (error) {\n if (this.host.runtime(threadId)) {\n this.host.patchRuntime(threadId, {\n error: `Could not load complete conversation history: ${errorMessage(error)}`,\n });\n }\n throw error;\n }\n })();\n this.historyHydrations.set(threadId, hydration);\n void hydration.finally(() => {\n if (this.historyHydrations.get(threadId) === hydration) this.historyHydrations.delete(threadId);\n }).catch(() => undefined);\n return hydration;\n }\n\n loadOlderHistory(threadId: string, itemsView?: 'full' | 'summary'): Promise<{\n conversationId: string;\n messages: SurfaceMessage[];\n hasOlder: boolean;\n }> {\n const runtime = this.host.requireRuntime(threadId);\n const existing = this.historyLoads.get(threadId);\n if (existing) return existing;\n if (runtime.fullHistoryHydrated || runtime.historyCursor === null) {\n return Promise.resolve({ conversationId: threadId, messages: [], hasOlder: false });\n }\n const load = (async () => {\n this.host.patchRuntime(threadId, { historyLoadingOlder: true, error: null });\n try {\n let cursor = this.host.requireRuntime(threadId).historyCursor;\n let messages: SurfaceMessage[] = [];\n const requestedCursors = new Set<string>();\n while (cursor !== null && messages.length === 0) {\n if (requestedCursors.has(cursor)) {\n throw new Error(`Codex app-server repeated a thread history cursor for '${threadId}'`);\n }\n requestedCursors.add(cursor);\n const materializedTurnIds = new Set(this.host.requireRuntime(threadId).turnIds);\n const requestedView = itemsView ?? this.host.requireRuntime(threadId).historyItemsView;\n let response: v2.ThreadTurnsListResponse = await this.client.request('thread/turns/list', {\n threadId, cursor, limit: HISTORY_PAGE_SIZE, sortDirection: 'desc', itemsView: requestedView,\n });\n if (requestedView === 'summary' && (itemsView ?? this.host.requireRuntime(threadId).historyItemsView) === 'full') {\n response = await this.client.request('thread/turns/list', { threadId, cursor, limit: HISTORY_PAGE_SIZE, sortDirection: 'desc', itemsView: 'full' });\n }\n const turns = [...response.data].reverse();\n const newTurnIds = new Set(turns\n .map((turn) => turn.id)\n .filter((turnId) => !materializedTurnIds.has(turnId)));\n messages = await this.mergeHistoryPage(threadId, turns, newTurnIds);\n cursor = response.nextCursor;\n this.host.patchRuntime(threadId, {\n historyCursor: cursor,\n historyHasOlder: cursor !== null,\n fullHistoryHydrated: cursor === null,\n });\n await this.emitHistoryChunks(threadId, messages);\n }\n return {\n conversationId: threadId,\n messages,\n hasOlder: this.host.requireRuntime(threadId).historyHasOlder,\n };\n } catch (error) {\n if (this.host.runtime(threadId)) this.host.patchRuntime(threadId, { error: errorMessage(error) });\n throw error;\n } finally {\n if (this.host.runtime(threadId)) this.host.patchRuntime(threadId, { historyLoadingOlder: false });\n }\n })();\n this.historyLoads.set(threadId, load);\n void load.finally(() => {\n if (this.historyLoads.get(threadId) === load) this.historyLoads.delete(threadId);\n }).catch(() => undefined);\n return load;\n }\n\n async waitForHistoryEmission(threadId: string): Promise<void> {\n const load = this.historyLoads.get(threadId);\n if (!load) return;\n await load.then(() => undefined, () => undefined);\n }\n\n private async emitHistoryChunks(threadId: string, messages: readonly SurfaceMessage[]): Promise<void> {\n for (let index = messages.length; index > 0;) {\n const start = Math.max(0, index - HISTORY_MESSAGE_BATCH_SIZE);\n this.host.emitHistoryPrepended(threadId, messages.slice(start, index), 'lifecycle');\n await yieldToRenderer();\n index = start;\n }\n }\n\n async refreshCompleteHistory(threadId: string): Promise<void> {\n const existing = this.historyHydrations.get(threadId);\n if (existing) await existing.catch(() => undefined);\n this.host.patchRuntime(threadId, {\n fullHistoryHydrated: false,\n historyCursor: null,\n historyHasOlder: true,\n });\n await this.hydrateCompleteHistory(threadId, { restart: true, itemsView: 'full' });\n }\n\n private async requestConversations(\n options: ListCodexConversationsOptions = {},\n ): Promise<CodexConversationSummary[]> {\n const conversations: CodexConversationSummary[] = [];\n // Paging is sorted by update time, so a thread updated mid-listing can\n // appear on two pages; keep its first, most recent position.\n const seenIds = new Set<string>();\n const totalLimit = options.limit === undefined\n ? Number.POSITIVE_INFINITY\n : Math.max(0, Math.floor(options.limit));\n let cursor: string | null | undefined = null;\n do {\n const limit = Math.min(100, totalLimit - conversations.length);\n if (limit <= 0) break;\n const response: v2.ThreadListResponse = await this.client.request('thread/list', {\n archived: options.archived ?? false,\n cursor,\n limit,\n sortDirection: 'desc',\n sortKey: 'updated_at',\n ...(options.cwd === undefined\n ? {}\n : { cwd: typeof options.cwd === 'string' ? options.cwd : [...options.cwd] }),\n ...(options.searchTerm === undefined ? {} : { searchTerm: options.searchTerm }),\n });\n for (const thread of response.data) {\n if (seenIds.has(thread.id)) continue;\n seenIds.add(thread.id);\n conversations.push(this.summaryWithKnownTurnCount(thread));\n }\n cursor = response.nextCursor;\n } while (cursor);\n return conversations;\n }\n\n private async mergeHistoryPage(\n threadId: string,\n turns: readonly v2.Turn[],\n newTurnIds: ReadonlySet<string>,\n ): Promise<SurfaceMessage[]> {\n const originalProjection = this.host.runtime(threadId)?.historyItemsView !== 'summary' ? await this.originalImages?.prepare(threadId) : undefined;\n const current = this.host.runtime(threadId);\n if (!current) return [];\n const protectedTurnIds = new Set<string>();\n if (current.activeTurnId) protectedTurnIds.add(current.activeTurnId);\n for (const turn of turns) {\n if ((turn.status === 'inProgress' || (turn.itemsView === 'summary' && current.turns.find(value => value.id === turn.id)?.itemsView !== 'summary')) && current.turnIds.includes(turn.id)) protectedTurnIds.add(turn.id);\n }\n const replaceableTurnIds = new Set(turns\n .filter((turn) => !protectedTurnIds.has(turn.id))\n .map((turn) => turn.id));\n const historicalTurns = turns.filter((turn) => replaceableTurnIds.has(turn.id));\n const preservedTurnIds = current.turnIds.filter((turnId) => !replaceableTurnIds.has(turnId));\n const preservedTurns = current.turns.filter((turn) => !replaceableTurnIds.has(turn.id));\n const preservedMessages = current.messages.filter((message) => (\n message.turnId === undefined || !replaceableTurnIds.has(message.turnId)\n ));\n let historyMessages = preserveHistoricalMessagePresentation(\n current.messages,\n historicalTurns.flatMap((turn) => codexTurnToSurfaceMessages(threadId, turn)),\n );\n if (originalProjection) historyMessages = originalProjection(historyMessages);\n else if (this.originalImages) historyMessages = suppressViewedImagePreviews(historyMessages);\n this.host.patchRuntime(threadId, {\n turnIds: [...historicalTurns.map((turn) => turn.id), ...preservedTurnIds],\n turns: [...historicalTurns.map((turn) => surfaceTurn(turn)), ...preservedTurns],\n messages: [...historyMessages, ...preservedMessages],\n });\n if (current.historyItemsView === 'summary') this.hydrateOriginalImages(threadId);\n const turnCount = this.host.requireRuntime(threadId).turnIds.length;\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, turnCount }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'action');\n return historyMessages.filter((message) => message.turnId !== undefined && newTurnIds.has(message.turnId));\n }\n\n private summaryWithKnownTurnCount(thread: v2.Thread): CodexConversationSummary {\n const summary = threadToSummary(thread);\n const runtime = this.host.runtime(thread.id);\n if (runtime?.hydrated) return { ...summary, turnCount: runtime.turnIds.length };\n const existing = this.host.getState().conversations.find((conversation) => conversation.id === thread.id);\n return existing ? { ...summary, turnCount: existing.turnCount } : summary;\n }\n}\n\nfunction yieldToRenderer(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/** Full-detail reads for one turn, independent of turn pagination. */\nexport async function readTurnItems(client: CodexAppServerClient, threadId: string, turnId: string): Promise<v2.ThreadItem[]> {\n const items = new Map<string, v2.ThreadItem>(); const cursors = new Set<string>(); let cursor: string | null = null;\n do {\n const page: v2.ThreadItemsListResponse = await client.request('thread/items/list', { threadId, turnId, cursor, limit: 100, sortDirection: 'asc' });\n if (page.data.some(entry => entry.turnId !== turnId)) throw new Error('Turn details belong to another turn.');\n for (const entry of page.data) items.set(entry.item.id, entry.item); cursor = page.nextCursor;\n if (cursor && cursors.has(cursor)) throw new Error('Repeated turn detail cursor.');\n if (cursor) cursors.add(cursor);\n } while (cursor);\n return [...items.values()];\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceApprovalMode,\n CodexSurfaceApprovalPreset,\n CodexSurfacePermissionMode,\n CodexSurfaceSnapshot,\n CreateCodexConversationOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { sameValue } from './codex-surface-events';\nimport {\n approvalPresetStartParams,\n approvalPresetUpdateParams,\n collaborationMode,\n nextSelection,\n selectedModel,\n} from './codex-surface-settings';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceConversationSettingsHost = {\n createConversation(): Promise<void>;\n emitConversationSettings(threadId: string, origin: 'action'): void;\n emitEvent(origin: 'action', input: SurfaceEventInput): void;\n emitSummaryUpserted(summary: CodexConversationSummary, reason: 'updated', origin: 'action'): void;\n ensureConnected(): Promise<void>;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n};\n\nexport class CodexSurfaceConversationSettingsController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly defaults: {\n approvalMode?: CodexSurfaceApprovalMode;\n approvalPreset?: CodexSurfaceApprovalPreset;\n permissionMode?: CodexSurfacePermissionMode;\n },\n private readonly host: CodexSurfaceConversationSettingsHost,\n ) {}\n\n preferredApprovalPreset(): CodexSurfaceApprovalPreset | null {\n if (this.defaults.approvalPreset) return this.defaults.approvalPreset;\n if (this.defaults.approvalMode !== undefined || this.defaults.permissionMode !== undefined) {\n if (this.defaults.permissionMode === 'full-access' && this.defaults.approvalMode !== 'ask') {\n return 'full-access';\n }\n if (this.defaults.permissionMode === 'workspace-write' && this.defaults.approvalMode === 'ask') {\n return 'ask-for-approval';\n }\n return null;\n }\n return 'ask-for-approval';\n }\n\n threadStartSettings(\n options: CreateCodexConversationOptions,\n availablePresets: readonly CodexSurfaceApprovalPreset[],\n ): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer?: v2.ApprovalsReviewer;\n permissions?: string;\n sandbox?: v2.SandboxMode;\n } {\n const preferred = this.preferredApprovalPreset();\n const preset = options.approvalPreset ?? (\n options.approvalMode === undefined && options.permissionMode === undefined\n ? (availablePresets.includes(preferred ?? 'ask-for-approval')\n ? preferred\n : availablePresets[0] ?? null)\n : null\n );\n if (preset) return approvalPresetStartParams(preset);\n const approvalMode = options.approvalMode ?? this.defaults.approvalMode;\n const permissionMode = options.permissionMode ?? this.defaults.permissionMode ?? 'read-only';\n return {\n approvalPolicy: approvalMode === 'ask' ? 'on-request' : 'never',\n sandbox: permissionMode === 'full-access' ? 'danger-full-access' : permissionMode,\n };\n }\n\n async rename(threadId: string, title: string): Promise<void> {\n await this.host.ensureThreadReady(threadId);\n const name = title.trim();\n if (!name) throw new Error('Conversation title cannot be empty');\n await this.client.request('thread/name/set', { threadId, name });\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, title: name }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'action');\n }\n\n async update(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot> {\n const state = this.host.getState();\n const threadId = state.activeConversationId;\n if (!threadId) {\n const next = nextSelection(state, settings);\n if (settings.approvalPreset && !state.approvalPresets.includes(settings.approvalPreset)) {\n throw new Error(`Approval preset '${settings.approvalPreset}' is not available`);\n }\n this.host.patch(next);\n return this.host.getSnapshot();\n }\n await this.updateForThread(threadId, settings);\n return this.host.getSnapshot();\n }\n\n async updateForThread(threadId: string, settings: UpdateCodexConversationSettings): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const runtimeSnapshot = this.host.snapshotForRuntime(runtime);\n const next = nextSelection(runtimeSnapshot, settings);\n const changed = runtime.approvalPreset !== next.approvalPreset\n || runtime.selectedModelId !== next.selectedModelId\n || runtime.selectedReasoningEffort !== next.selectedReasoningEffort\n || runtime.selectedServiceTier !== next.selectedServiceTier\n || runtime.planMode !== next.planMode;\n if (settings.approvalPreset && !runtimeSnapshot.approvalPresets.includes(settings.approvalPreset)) {\n throw new Error(`Approval preset '${settings.approvalPreset}' is not available`);\n }\n const model = selectedModel(this.host.getState().models, next.selectedModelId);\n await this.client.request('thread/settings/update', {\n threadId,\n ...(settings.approvalPreset ? approvalPresetUpdateParams(settings.approvalPreset) : {}),\n ...(settings.modelId && model ? { model: model.model } : {}),\n ...(settings.reasoningEffort || settings.modelId ? { effort: next.selectedReasoningEffort } : {}),\n ...(settings.serviceTier !== undefined || settings.modelId\n ? { serviceTier: next.selectedServiceTier }\n : {}),\n ...(model && (\n typeof settings.planMode === 'boolean'\n || Boolean(settings.modelId)\n || Boolean(settings.reasoningEffort)\n ) ? { collaborationMode: collaborationMode(next.planMode, model.model, next.selectedReasoningEffort) } : {}),\n });\n this.host.patchRuntime(threadId, next);\n if (changed) this.host.emitConversationSettings(threadId, 'action');\n }\n\n async setGoal(objective: string, tokenBudget?: number | null): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.setGoalForThread(threadId, objective, tokenBudget);\n return this.host.getSnapshot();\n }\n\n async setGoalForThread(threadId: string, objective: string, tokenBudget?: number | null): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const normalizedObjective = objective.trim();\n if (!normalizedObjective) throw new Error('Goal objective cannot be empty');\n const response = await this.client.request('thread/goal/set', {\n threadId, objective: normalizedObjective, status: 'active',\n ...(tokenBudget === undefined ? {} : { tokenBudget }),\n });\n if (response.goal.threadId !== threadId) {\n throw new Error(`Codex thread/goal/set returned a goal for '${response.goal.threadId}' instead of '${threadId}'`);\n }\n const changed = !sameValue(runtime.goal, response.goal);\n this.host.patchRuntime(threadId, { goal: { ...response.goal } });\n if (changed) {\n this.host.emitEvent('action', {\n type: 'conversation.goalChanged', conversationId: threadId,\n payload: { goal: structuredClone(response.goal) },\n });\n }\n }\n\n async clearGoal(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.clearGoalForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async clearGoalForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n await this.client.request('thread/goal/clear', { threadId });\n const changed = runtime.goal !== null;\n this.host.patchRuntime(threadId, { goal: null });\n if (changed) {\n this.host.emitEvent('action', {\n type: 'conversation.goalChanged', conversationId: threadId, payload: { goal: null },\n });\n }\n }\n}\n","import { normalizePromptContent } from '@codex-app-sdk/core/surface';\nimport type { CodexAppServerClient } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport { codexTurnToSurfaceMessages } from './codex-conversation-history';\nimport {\n messageTurnIdOrNull,\n surfaceMessageAttachments,\n surfaceMessageText,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { surfaceTurn, timestampToIso, upsertSurfaceTurn } from './codex-surface-events';\nimport { errorMessage, normalizeReviewTarget } from './codex-surface-prompts';\nimport { ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nconst UNCOMMITTED_REVIEW_PROMPT = 'Review the current code changes (staged, unstaged, and untracked files) and provide prioritized findings.';\n\nexport type CodexSurfaceTurnActionsHost = {\n createConversation(): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action'): void;\n emitEvent(origin: 'action', input: SurfaceEventInput): void;\n emitHistoryReplaced(threadId: string, reason: 'rollback', origin: 'action'): void;\n emitSummaryUpserted(summary: CodexConversationSummary, reason: 'updated', origin: 'action'): void;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n loadTurnHistory?(threadId: string, turnId: string): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n hydrateCompleteHistory(threadId: string, options?: { initialPageLoaded?: boolean; cursor?: string | null }): Promise<void>;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(threadId: string, status: CodexConversationSummary['status'], origin: 'action'): void;\n patchConversationTurnCount(threadId: string, turnCount: number, origin: 'action'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n sendMessageToThread(threadId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n};\n\nexport class CodexSurfaceTurnActionsController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceTurnActionsHost,\n ) {}\n\n async compact(): Promise<CodexSurfaceSnapshot> {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.compactForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async compactForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('Cannot compact while Codex is responding');\n await this.client.request('thread/compact/start', { threadId });\n }\n\n async startReview(options: StartCodexReviewOptions = {}): Promise<CodexSurfaceSnapshot> {\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.startReviewForThread(threadId, options);\n return this.host.getSnapshot();\n }\n\n async startReviewForThread(\n threadId: string,\n options: StartCodexReviewOptions = {},\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('The conversation is already responding');\n this.host.patchRuntime(threadId, { busy: true, turnStartPending: true, error: null });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n try {\n const target = normalizeReviewTarget(options.target ?? { type: 'uncommittedChanges' });\n const response = await this.client.request('review/start', {\n threadId,\n target,\n delivery: 'inline',\n });\n if (response.reviewThreadId !== threadId) {\n throw new Error(\n `Codex review/start returned unexpected review thread '${response.reviewThreadId}' for inline review on thread '${threadId}'`,\n );\n }\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!runtime.turnIds.includes(response.turn.id)) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const responseMessages = codexTurnToSurfaceMessages(threadId, response.turn)\n .filter((message) => !runtime.messages.some((candidate) => candidate.id === message.id))\n .map((message) => message.role === 'user'\n ? {\n ...message,\n parts: target.type === 'uncommittedChanges'\n ? message.parts.map((part) => part.type === 'text' && part.text === 'current changes'\n ? { ...part, text: UNCOMMITTED_REVIEW_PROMPT }\n : part)\n : message.parts,\n metadata: { ...message.metadata, reviewPrompt: true },\n }\n : message);\n const messages = insertTurnMessages(runtime.messages, response.turn.id, responseMessages);\n this.host.patchRuntime(threadId, {\n busy: runtime.activeTurnId !== null,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: runtime.activeTurnId\n ? ensureAssistantTurnMessage(messages, threadId, response.turn.id)\n : messages,\n });\n for (const message of responseMessages) {\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId, turnId: response.turn.id,\n payload: { message: structuredClone(message) },\n });\n }\n this.host.patchConversationStatus(threadId, runtime.activeTurnId ? 'active' : 'idle', 'action');\n if (runtime.activeTurnId && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, { busy: false, turnStartPending: false, error: errorMessage(error) });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async interrupt(): Promise<CodexSurfaceSnapshot> {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.interruptThread(threadId);\n return this.host.getSnapshot();\n }\n\n async interruptThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (!runtime.activeTurnId) return;\n await this.client.request('turn/interrupt', { threadId, turnId: runtime.activeTurnId });\n }\n\n async deleteTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.deleteTurnForThread(threadId, turnId);\n return this.host.getSnapshot();\n }\n\n async deleteTurnForThread(threadId: string, turnId: string): Promise<void> {\n await this.rollbackToTurn(threadId, turnId);\n }\n\n async editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.editTurnForThread(threadId, turnId, content, options);\n return this.host.getSnapshot();\n }\n\n async editTurnForThread(threadId: string, turnId: string, content: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.turns.find(turn => turn.id === turnId)?.itemsView === 'summary') await this.host.loadTurnHistory?.(threadId, turnId);\n const message = runtime.messages.find((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && messageTurnIdOrNull(candidate) === turnId\n ));\n if (!message) throw new Error(`Could not find the user prompt for Codex turn '${turnId}'`);\n const text = content.trim();\n if (!text) throw new Error('Cannot replace a turn prompt with empty content');\n const attachments = surfaceMessageAttachments(message);\n await this.rollbackToTurn(threadId, turnId);\n await this.host.sendMessageToThread(threadId, text, { ...options, ...(attachments.length > 0 ? { attachments } : {}) });\n }\n\n async retryTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.retryTurnForThread(threadId, turnId);\n return this.host.getSnapshot();\n }\n\n async retryTurnForThread(threadId: string, turnId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.turns.find(turn => turn.id === turnId)?.itemsView === 'summary') await this.host.loadTurnHistory?.(threadId, turnId);\n const prompt = runtime.messages.find((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && messageTurnIdOrNull(candidate) === turnId\n ));\n if (!prompt) throw new Error('Could not find the user prompt for this turn');\n const text = surfaceMessageText(prompt);\n if (!text) throw new Error('Could not find the user prompt for this turn');\n const attachments = surfaceMessageAttachments(prompt);\n await this.rollbackToTurn(threadId, turnId);\n await this.host.sendMessageToThread(threadId, text, {\n ...(prompt.metadata?.promptContent ? { content: normalizePromptContent(prompt.metadata.promptContent) } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n });\n }\n\n async rollbackToTurn(threadId: string, turnId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('Cannot roll back while Codex is responding');\n if (runtime.historyMode !== 'paginated') {\n throw new Error('Legacy conversation history does not support deleting, editing, or retrying turns with app-server 0.164.0. Start a new conversation to use these actions.');\n }\n let targetIndex = runtime.turnIds.indexOf(turnId);\n if (targetIndex < 0) {\n await this.host.hydrateCompleteHistory(threadId);\n targetIndex = runtime.turnIds.indexOf(turnId);\n }\n if (targetIndex < 0) throw new Error(`Cannot roll back to unknown Codex turn '${turnId}'`);\n await this.revertPaginatedThread(threadId, turnId, targetIndex, runtime);\n }\n\n private async revertPaginatedThread(\n threadId: string,\n turnId: string,\n targetIndex: number,\n runtime: ThreadRuntimeState,\n ): Promise<void> {\n const response = await this.client.request('thread/revert', {\n threadId,\n beforeTurnId: turnId,\n });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/revert returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const retainedTurnIds = runtime.turnIds.slice(0, targetIndex);\n const retainedTurnIdSet = new Set(retainedTurnIds);\n const messages = runtime.messages.filter((message) => {\n const messageTurnId = messageTurnIdOrNull(message);\n return messageTurnId === null || retainedTurnIdSet.has(messageTurnId);\n });\n runtime.turnIds = retainedTurnIds;\n runtime.turns = runtime.turns.filter((turn) => retainedTurnIdSet.has(turn.id));\n runtime.activeTurnId = null;\n const summary = { ...threadToSummary(response.thread), turnCount: retainedTurnIds.length };\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.patchRuntime(threadId, {\n messages,\n answeredClientRequestIds: [],\n busy: false,\n turnStartPending: false,\n error: null,\n contextUsage: null,\n turnGitDiff: null,\n historyCursor: response.turnsBackwardsCursor,\n historyHasOlder: response.turnsBackwardsCursor !== null,\n fullHistoryHydrated: response.turnsBackwardsCursor === null,\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n this.host.emitHistoryReplaced(threadId, 'rollback', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n }\n\n private requiredActiveConversation(): string {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n return threadId;\n }\n}\n\nfunction insertTurnMessages(\n current: readonly SurfaceMessage[],\n turnId: string,\n incoming: readonly SurfaceMessage[],\n): SurfaceMessage[] {\n const firstTurnMessageIndex = current.findIndex((message) => message.turnId === turnId);\n if (firstTurnMessageIndex < 0) return [...current, ...incoming];\n return [\n ...current.slice(0, firstTurnMessageIndex),\n ...incoming,\n ...current.slice(firstTurnMessageIndex),\n ];\n}\n","import { promptContentDispatchText, promptContentText } from '@codex-app-sdk/core/surface';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport {\n attachmentInput,\n surfaceAttachmentPart,\n validateAttachments,\n validatedSendOptions,\n} from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n createMessageId,\n createQueuedPromptId,\n surfaceTurn,\n timestampToIso,\n upsertSurfaceTurn,\n} from './codex-surface-events';\nimport {\n ensureAssistantTurnMessage,\n pruneEmptyAssistantPlaceholders,\n} from './codex-surface-message-state';\nimport {\n errorMessage,\n mergeSkillInputs,\n parseGoalSlashCommand,\n parsePlanSlashCommand,\n parseReviewSlashCommand,\n authoredPromptContent,\n promptSkillInputsFromContent,\n promptMentionInputs,\n validateSkillInputs,\n} from './codex-surface-prompts';\nimport { turnSettings } from './codex-surface-settings';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceMessagesHost = {\n clearGoalForThread(threadId: string): Promise<void>;\n compactForThread(threadId: string): Promise<void>;\n createConversation(): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action'): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n ensureConnected(): Promise<void>;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: 'action',\n ): void;\n patchConversationTurnCount(threadId: string, turnCount: number, origin: 'action'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n setGoal(objective: string): Promise<CodexSurfaceSnapshot>;\n setGoalForThread(threadId: string, objective: string): Promise<void>;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n startReview(options: StartCodexReviewOptions): Promise<CodexSurfaceSnapshot>;\n startReviewForThread(threadId: string, options: StartCodexReviewOptions): Promise<void>;\n updateSettings(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot>;\n updateSettingsForThread(threadId: string, settings: UpdateCodexConversationSettings): Promise<void>;\n};\n\nexport class CodexSurfaceMessagesController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceMessagesHost,\n ) {}\n\n async send(prompt: string, options: SendCodexMessageOptions = {}): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n let text = prompt.trim();\n if (!text) throw new Error('Cannot send an empty message');\n if (!this.host.getState().activeConversationId) {\n const planCommand = parsePlanSlashCommand(text);\n if (planCommand) {\n await this.host.createConversation();\n await this.host.updateSettings({ planMode: true });\n if (!planCommand.prompt) return this.host.getSnapshot();\n text = planCommand.prompt;\n options = { ...options, planMode: true };\n }\n const goalCommand = parseGoalSlashCommand(text);\n if (goalCommand) {\n if (goalCommand.action === 'clear' || goalCommand.action === 'show' || goalCommand.action === 'edit') {\n return this.host.getSnapshot();\n }\n if (goalCommand.action === 'set') return this.host.setGoal(goalCommand.objective);\n throw new Error('Pausing and resuming goals is not supported by Codex app-server');\n }\n if (text === '/compact') return this.host.getSnapshot();\n const reviewCommand = parseReviewSlashCommand(text);\n if (reviewCommand) {\n await this.host.createConversation();\n return this.host.startReview({ target: reviewCommand });\n }\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n }\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.sendToThread(threadId, text, options);\n return this.host.getSnapshot();\n }\n\n async sendToThread(\n threadId: string,\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n let text = prompt.trim();\n if (!text) throw new Error('Cannot send an empty message');\n const planCommand = parsePlanSlashCommand(text);\n if (planCommand) {\n await this.host.updateSettingsForThread(threadId, { planMode: true });\n if (!planCommand.prompt) return;\n text = planCommand.prompt;\n options = { ...options, planMode: true };\n }\n const goalCommand = parseGoalSlashCommand(text);\n if (goalCommand) {\n if (goalCommand.action === 'clear') return this.host.clearGoalForThread(threadId);\n if (goalCommand.action === 'set') return this.host.setGoalForThread(threadId, goalCommand.objective);\n if (goalCommand.action === 'unsupported') {\n throw new Error('Pausing and resuming goals is not supported by Codex app-server');\n }\n return;\n }\n if (text === '/compact') return this.host.compactForThread(threadId);\n const reviewCommand = parseReviewSlashCommand(text);\n if (reviewCommand) return this.host.startReviewForThread(threadId, { target: reviewCommand });\n options = {\n ...validatedSendOptions(this.host.snapshotForRuntime(runtime), options),\n ...(options.skills ? { skills: validateSkillInputs(options.skills, runtime.skills) } : {}),\n };\n await this.sendPromptToThread(threadId, text, options);\n }\n\n async continueInterruptedTurn(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n await this.continueInterruptedTurnForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async continueInterruptedTurnForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy || runtime.turnStartPending || runtime.activeTurnId) {\n throw new Error('Cannot continue while a turn is active');\n }\n const latestTurnId = runtime.turnIds.at(-1);\n const latestTurn = latestTurnId\n ? runtime.turns.find((turn) => turn.id === latestTurnId)\n : undefined;\n if (latestTurn?.status !== 'interrupted') {\n throw new Error('The latest turn is not interrupted');\n }\n\n this.host.patchRuntime(threadId, { busy: true, turnStartPending: true, error: null });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n\n try {\n const response = await this.client.request('turn/start', {\n threadId,\n input: [],\n ...turnSettings(this.host.snapshotForRuntime(runtime), {}),\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!wasKnownTurn) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const busy = response.turn.status === 'inProgress';\n this.host.patchRuntime(threadId, {\n busy,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: busy\n ? ensureAssistantTurnMessage(runtime.messages, threadId, response.turn.id)\n : runtime.messages,\n });\n this.host.patchConversationStatus(threadId, busy ? 'active' : 'idle', 'action');\n if (busy && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, {\n busy: false, turnStartPending: false, error: errorMessage(error),\n });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async sendPromptToThread(\n threadId: string,\n text: string,\n options: SendCodexMessageOptions = {},\n displayText?: string,\n ): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n const normalizedOptions = validatedSendOptions(this.host.snapshotForRuntime(runtime), options);\n const content = authoredPromptContent(normalizedOptions.content);\n if (content) normalizedOptions.content = content;\n const visibleText = content ? promptContentText(content) : displayText?.trim() || text;\n const skillInputs = mergeSkillInputs(\n validateSkillInputs(promptSkillInputsFromContent(content), runtime.skills),\n validateSkillInputs(normalizedOptions.skills ?? [], runtime.skills),\n );\n const attachments = validateAttachments(normalizedOptions.attachments ?? []);\n if (runtime.busy) {\n this.host.patchRuntime(threadId, {\n queuedPrompts: [\n ...runtime.queuedPrompts,\n {\n id: createQueuedPromptId(),\n text: visibleText,\n ...(Object.keys(normalizedOptions).length > 0 ? { options: normalizedOptions } : {}),\n },\n ],\n });\n this.emitQueuedPrompts(threadId);\n return;\n }\n\n const messageId = createMessageId();\n const optimisticMessage: SurfaceMessage = {\n id: messageId,\n role: 'user',\n status: 'complete',\n parts: [{ type: 'text', text: visibleText }, ...attachments.map(surfaceAttachmentPart)],\n createdAt: new Date().toISOString(),\n metadata: {\n conversationId: threadId,\n ...(content ? { promptContent: content } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n },\n };\n this.host.patchRuntime(threadId, {\n busy: true, turnStartPending: true, error: null,\n messages: [...runtime.messages, optimisticMessage],\n });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId,\n payload: { message: structuredClone(optimisticMessage) },\n });\n this.host.emitConversationActivity(threadId, 'action');\n\n try {\n const response = await this.client.request('turn/start', {\n threadId,\n clientUserMessageId: messageId,\n input: [\n { type: 'text', text: promptContentDispatchText(content ?? [], text), text_elements: [] },\n ...attachments.map(attachmentInput),\n ...promptMentionInputs(content),\n ...skillInputs.map((skill) => ({ type: 'skill' as const, name: skill.name, path: skill.path })),\n ],\n ...turnSettings(this.host.snapshotForRuntime(runtime), normalizedOptions),\n ...(normalizedOptions.outputSchema === undefined\n ? {}\n : { outputSchema: normalizedOptions.outputSchema as v2.TurnStartParams['outputSchema'] }),\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!runtime.turnIds.includes(response.turn.id)) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const busy = response.turn.status === 'inProgress';\n const messages = runtime.messages.map((message) => message.id === messageId\n ? { ...message, turnId: response.turn.id, metadata: { ...message.metadata, turnId: response.turn.id } }\n : message);\n this.host.patchRuntime(threadId, {\n busy,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: busy ? ensureAssistantTurnMessage(messages, threadId, response.turn.id) : messages,\n });\n this.host.patchConversationStatus(threadId, busy ? 'active' : 'idle', 'action');\n const startedMessage = messages.find((message) => message.id === messageId);\n if (startedMessage) {\n this.host.emitEvent('action', {\n type: 'message.updated', conversationId: threadId, turnId: response.turn.id,\n payload: { message: structuredClone(startedMessage) },\n });\n }\n if (busy && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, {\n busy: false, turnStartPending: false, error: errorMessage(error),\n });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async steer(\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.steerForThread(threadId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async steerForThread(\n threadId: string,\n prompt: string,\n options: SendCodexMessageOptions = {},\n displayText?: string,\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const text = prompt.trim();\n const content = authoredPromptContent(options.content);\n const skillInputs = mergeSkillInputs(\n validateSkillInputs(promptSkillInputsFromContent(content), runtime.skills),\n validateSkillInputs(options.skills ?? [], runtime.skills),\n );\n const visibleText = content ? promptContentText(content) : displayText?.trim() || text;\n if (!text) throw new Error('Cannot steer with an empty message');\n if (!runtime.activeTurnId) throw new Error('There is no active turn to steer');\n const attachments = validateAttachments(options.attachments ?? []);\n const messageId = createMessageId();\n const optimisticSteer: SurfaceMessage = {\n id: messageId, kind: 'steer', role: 'user', status: 'complete',\n parts: [{ type: 'text', text: visibleText }, ...attachments.map(surfaceAttachmentPart)],\n createdAt: new Date().toISOString(),\n turnId: runtime.activeTurnId,\n metadata: {\n conversationId: threadId,\n turnId: runtime.activeTurnId,\n ...(content ? { promptContent: content } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n },\n };\n this.host.patchRuntime(threadId, {\n error: null,\n messages: ensureAssistantTurnMessage(\n [...runtime.messages, optimisticSteer], threadId, runtime.activeTurnId, { forceSegment: true },\n ),\n });\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId, turnId: runtime.activeTurnId,\n payload: { message: structuredClone(optimisticSteer) },\n });\n try {\n const response = await this.client.request('turn/steer', {\n threadId,\n expectedTurnId: runtime.activeTurnId,\n clientUserMessageId: messageId,\n input: [\n { type: 'text', text: promptContentDispatchText(content ?? [], text), text_elements: [] },\n ...attachments.map(attachmentInput),\n ...promptMentionInputs(content),\n ...skillInputs.map(skill => ({ type: 'skill' as const, name: skill.name, path: skill.path })),\n ],\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turnId);\n runtime.activeTurnId = response.turnId;\n if (!runtime.turnIds.includes(response.turnId)) runtime.turnIds.push(response.turnId);\n runtime.turns = upsertSurfaceTurn(runtime.turns, {\n id: response.turnId,\n status: 'inProgress',\n error: null,\n willRetry: false,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n });\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const steeredMessages = runtime.messages.map((message) => message.id === messageId\n ? { ...message, turnId: response.turnId, metadata: { ...message.metadata, turnId: response.turnId } }\n : message);\n this.host.patchRuntime(threadId, {\n messages: pruneEmptyAssistantPlaceholders(\n ensureAssistantTurnMessage(steeredMessages, threadId, response.turnId),\n threadId,\n ),\n });\n if (!wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turnId,\n payload: { startedAt: new Date().toISOString() },\n });\n }\n } catch (error) {\n this.host.patchRuntime(threadId, { error: errorMessage(error) });\n throw error;\n }\n }\n\n async answerAsyncQuestion(threadId: string, prompt: string, displayText: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.activeTurnId) {\n await this.steerForThread(threadId, prompt, {}, displayText);\n return;\n }\n await this.sendPromptToThread(threadId, prompt, {}, displayText);\n }\n\n async deleteQueuedPrompt(promptId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.deleteQueuedPromptForThread(threadId, promptId);\n return this.host.getSnapshot();\n }\n\n async deleteQueuedPromptForThread(threadId: string, promptId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const queuedPrompts = runtime.queuedPrompts.filter((prompt) => prompt.id !== promptId);\n if (queuedPrompts.length === runtime.queuedPrompts.length) {\n throw new Error(`Unknown queued prompt '${promptId}'`);\n }\n this.host.patchRuntime(runtime.threadId, { queuedPrompts });\n this.emitQueuedPrompts(runtime.threadId);\n }\n\n async updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.updateQueuedPromptForThread(threadId, promptId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async updateQueuedPromptForThread(threadId: string, promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const text = prompt.trim();\n if (!text) throw new Error('Cannot update a queued prompt with empty content');\n let found = false;\n const queuedPrompts = runtime.queuedPrompts.map((candidate) => {\n if (candidate.id !== promptId) return candidate;\n found = true;\n const content = authoredPromptContent(options?.content);\n validateSkillInputs(promptSkillInputsFromContent(content), runtime.skills);\n const nextOptions = { ...candidate.options, ...options };\n if (content) nextOptions.content = content;\n else delete nextOptions.content;\n return { ...candidate, text, options: nextOptions };\n });\n if (!found) throw new Error(`Unknown queued prompt '${promptId}'`);\n this.host.patchRuntime(runtime.threadId, { queuedPrompts });\n this.emitQueuedPrompts(runtime.threadId);\n }\n\n async steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.steerQueuedPromptForThread(threadId, promptId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async steerQueuedPromptForThread(threadId: string, promptId: string, replacement?: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const prompt = runtime.queuedPrompts.find((candidate) => candidate.id === promptId);\n if (!prompt) throw new Error(`Unknown queued prompt '${promptId}'`);\n this.host.patchRuntime(runtime.threadId, {\n queuedPrompts: runtime.queuedPrompts.filter((candidate) => candidate.id !== promptId),\n });\n this.emitQueuedPrompts(runtime.threadId);\n const text = replacement ?? prompt.text;\n const sendOptions = replacement === undefined ? prompt.options : { ...prompt.options, ...options, content: options?.content };\n if (runtime.busy) await this.steerForThread(threadId, text, sendOptions);\n else await this.sendToThread(threadId, text, sendOptions);\n }\n\n async sendNextQueuedPrompt(threadId: string): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.busy || runtime.queuedPrompts.length === 0) return;\n const next = runtime.queuedPrompts[0]!;\n const queuedPrompts = runtime.queuedPrompts.slice(1);\n this.host.patchRuntime(threadId, { queuedPrompts });\n this.emitQueuedPrompts(threadId, 'notification');\n try {\n await this.sendPromptToThread(threadId, next.text, next.options);\n } catch (error) {\n this.host.patchRuntime(threadId, {\n error: errorMessage(error), queuedPrompts: [next, ...runtime.queuedPrompts],\n });\n this.emitQueuedPrompts(threadId, 'notification');\n }\n }\n\n private emitQueuedPrompts(\n threadId: string,\n origin: CodexSurfaceEventOrigin = 'action',\n ): void {\n const queuedPrompts = this.host.requireRuntime(threadId).queuedPrompts;\n this.host.emitEvent(origin, {\n type: 'conversation.queueChanged',\n conversationId: threadId,\n payload: { queuedPrompts: structuredClone(queuedPrompts) },\n });\n }\n\n private requiredActiveConversation(): string {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n return threadId;\n }\n}\n","import { readTurnItems } from './codex-surface-conversations-controller';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationHistory,\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n CreateCodexConversationOptions,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexTurnToSurfaceMessages,\n preserveHistoricalMessagePresentation,\n} from './codex-conversation-history';\nimport type {\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexSurfaceOptions,\n} from './codex-surface-contracts';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceConversationSettingsController } from './codex-surface-conversation-settings-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport {\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { activeTurnId, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { surfaceTurn } from './codex-surface-events';\nimport { normalizeMcpServers } from './codex-surface-mcp';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport {\n collaborationMode,\n defaultReasoningEffort,\n validateServiceTier,\n requireCatalogModel,\n selectedModel,\n sessionSelection,\n validateReasoningEffort,\n} from './codex-surface-settings';\n\nconst CONVERSATION_HISTORY_PAGE_SIZE = 5;\n\ntype HistoryReason = Extract<\n CodexSurfaceEvent,\n { type: 'conversation.historyReplaced' }\n>['payload']['reason'];\n\nexport interface CodexSurfaceLifecycleHost {\n activateRuntime(runtime: ThreadRuntimeState): void;\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitHistoryReplaced(threadId: string, reason: HistoryReason, origin: CodexSurfaceEventOrigin): void;\n emitSelected(conversationId: string): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'created' | 'resumed' | 'updated',\n origin: CodexSurfaceEventOrigin,\n ): void;\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n observeEmptyConversation(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n runtimeProjection(runtime: ThreadRuntimeState): Partial<CodexSurfaceSnapshot>;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n}\n\nexport class CodexSurfaceLifecycleController {\n private readonly hydrationPromises = new Map<string, Promise<void>>();\n private readonly hostOptionsByThread = new Map<string, CodexConversationLoadOptions>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly options: Pick<CodexSurfaceOptions, 'conversationDefaults' | 'cwd' | 'loadingStrategy' | 'historyItemsView'>,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly extensions: CodexSurfaceExtensionsController,\n private readonly settings: CodexSurfaceConversationSettingsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly host: CodexSurfaceLifecycleHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n hostOptions(threadId: string): CodexConversationLoadOptions | undefined {\n return this.hostOptionsByThread.get(threadId);\n }\n\n rememberHostOptions(threadId: string, options: CodexConversationLoadOptions): void {\n this.hostOptionsByThread.set(threadId, options);\n }\n\n forget(threadId: string): void {\n this.hostOptionsByThread.delete(threadId);\n this.hydrationPromises.delete(threadId);\n }\n\n clear(): void {\n this.hostOptionsByThread.clear();\n this.hydrationPromises.clear();\n }\n\n resetHydrations(): void {\n this.hydrationPromises.clear();\n }\n\n async create(\n options: CreateCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n options = { ...this.options.conversationDefaults, ...options };\n const cwd = options.cwd ?? this.options.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd);\n if (options.approvalPreset && !catalogs.approvalPresets.includes(options.approvalPreset)) {\n throw new Error(`Approval preset '${options.approvalPreset}' is not available`);\n }\n const state = this.host.getState();\n const inheritedApprovalPreset = options.approvalPreset\n ?? (options.approvalMode === undefined\n && options.permissionMode === undefined\n && state.approvalPreset\n && catalogs.approvalPresets.includes(state.approvalPreset)\n ? state.approvalPreset\n : undefined);\n const settings = this.settings.threadStartSettings({\n ...options,\n ...(inheritedApprovalPreset ? { approvalPreset: inheritedApprovalPreset } : {}),\n }, catalogs.approvalPresets);\n const currentModel = selectedModel(state.models, state.selectedModelId);\n const requestedModel = options.model ? requireCatalogModel(state.models, options.model) : currentModel;\n const model = requestedModel?.model;\n const requestedReasoningEffort = options.reasoningEffort\n ?? (requestedModel?.id === currentModel?.id\n ? state.selectedReasoningEffort\n : requestedModel ? defaultReasoningEffort(requestedModel) : null)\n ?? undefined;\n const requestedServiceTier = options.serviceTier !== undefined\n ? options.serviceTier\n : requestedModel?.id === currentModel?.id\n ? (state.selectedServiceTier ?? null)\n : requestedModel?.defaultServiceTier ?? null;\n validateReasoningEffort(requestedModel, requestedReasoningEffort);\n validateServiceTier(requestedModel, requestedServiceTier);\n const mcpServers = hostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(hostOptions.mcpServers);\n const extension = await this.extensions.conversationExtension({\n operation: 'start',\n conversationId: null,\n cwd,\n createOptions: options,\n extensionContext: hostOptions.extensionContext,\n }, options, mcpServers);\n const response = await this.client.request('thread/start', {\n ...(cwd ? { cwd } : {}),\n ...(model ? { model } : {}),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadStartParams['config'] }),\n ...(this.extensions.hasDynamicTools() ? { dynamicTools: this.extensions.dynamicToolSpecs() } : {}),\n ...settings,\n ...(requestedServiceTier === undefined ? {} : { serviceTier: requestedServiceTier }),\n ...(options.threadSource === undefined ? {} : { threadSource: options.threadSource }),\n serviceName: 'codex_app_sdk',\n });\n this.host.observeEmptyConversation(response.thread.id);\n const selection = sessionSelection(response, state.models, state);\n if (requestedReasoningEffort) {\n await this.client.request('thread/settings/update', {\n threadId: response.thread.id,\n effort: requestedReasoningEffort,\n ...(requestedModel ? {\n collaborationMode: collaborationMode(state.planMode, requestedModel.model, requestedReasoningEffort),\n } : {}),\n });\n selection.selectedReasoningEffort = requestedReasoningEffort;\n }\n if (requestedServiceTier !== undefined) selection.selectedServiceTier = requestedServiceTier;\n if (requestedModel) selection.selectedModelId = requestedModel.id;\n if (inheritedApprovalPreset) selection.approvalPreset = inheritedApprovalPreset;\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n ...(this.options.historyItemsView ? { historyItemsView: this.options.historyItemsView } : {}),\n historyMode: response.thread.historyMode ?? 'legacy',\n cwd: response.cwd ?? response.thread.cwd,\n activeTurnId: null,\n turnIds: [],\n messages: [],\n answeredClientRequestIds: [],\n threadStatus: surfaceThreadStatus(response.thread.status),\n ...catalogs,\n ...selection,\n });\n this.hostOptionsByThread.set(response.thread.id, {\n ...(cwd ? { cwd } : {}),\n ...hostOptions,\n mcpServers,\n });\n const summary = threadToSummary(response.thread);\n this.host.patch({\n activeConversationId: response.thread.id,\n conversations: upsertConversation(state.conversations, summary),\n ...this.host.runtimeProjection(runtime),\n });\n this.host.emitSummaryUpserted(summary, 'created', 'action');\n this.host.emitSelected(response.thread.id);\n this.emitConversationState(response.thread.id);\n return this.host.getSnapshot();\n }\n\n async select(conversationId: string): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const runtime = this.host.runtime(conversationId);\n if (runtime?.hydrated && (runtime.busy || runtime.activeTurnId !== null)) {\n this.host.activateRuntime(runtime);\n return this.host.getSnapshot();\n }\n return this.resume(conversationId);\n }\n\n resumeDuringBootstrap(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.resume(conversationId);\n }\n\n async ensureReady(\n threadId: string,\n loadOptions: CodexConversationLoadOptions = {},\n ): Promise<ThreadRuntimeState> {\n await this.host.ensureConnected();\n const runtime = this.host.runtime(threadId);\n if (runtime?.hydrated && Object.keys(loadOptions).every(key => key === 'historyItemsView' || key === 'loadingStrategy')) {\n this.hostOptionsByThread.set(threadId, { ...this.hostOptionsByThread.get(threadId), ...loadOptions });\n this.host.patchRuntime(threadId, {\n ...(loadOptions.historyItemsView ? { historyItemsView: loadOptions.historyItemsView } : {}),\n ...(loadOptions.loadingStrategy ? { loadingStrategy: loadOptions.loadingStrategy } : {}),\n });\n if (loadOptions.historyItemsView === 'full') await this.conversations.loadLoadedTurnHistory(threadId);\n if (loadOptions.loadingStrategy === 'eager' && runtime.historyHasOlder) {\n void this.conversations.hydrateCompleteHistory(threadId).catch(() => undefined);\n }\n return runtime;\n }\n let hydration = this.hydrationPromises.get(threadId);\n if (!hydration) {\n hydration = this.resume(threadId, false, loadOptions, 'load').then(() => undefined);\n this.hydrationPromises.set(threadId, hydration);\n void hydration.finally(() => {\n if (this.hydrationPromises.get(threadId) === hydration) this.hydrationPromises.delete(threadId);\n }).catch(() => undefined);\n }\n await hydration;\n return this.host.requireRuntime(threadId);\n }\n\n async readHistory(conversationId: string): Promise<CodexConversationHistory> {\n await this.host.ensureConnected();\n if (!conversationId) throw new Error('There is no active conversation');\n const existing = await this.ensureReady(conversationId);\n if (existing.busy) { await this.conversations.loadLoadedTurnHistory(conversationId); return this.historySnapshot(conversationId, existing); }\n const loadingRuntime = this.host.createRuntime(conversationId, { historyLoading: true, error: null });\n if (this.host.getState().activeConversationId === conversationId) this.host.activateRuntime(loadingRuntime);\n try {\n const [response] = await Promise.all([\n this.client.request('thread/read', { threadId: conversationId, includeTurns: false }),\n this.conversations.refreshCompleteHistory(conversationId),\n ]);\n if (response.thread.id !== conversationId) {\n throw new Error(`Codex thread/read returned '${response.thread.id}' for requested thread '${conversationId}'`);\n }\n const hydratedRuntime = this.host.requireRuntime(conversationId);\n const runtime = this.host.createRuntime(conversationId, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n historyLoading: false,\n activeTurnId: hydratedRuntime.activeTurnId,\n turns: hydratedRuntime.turns,\n turnIds: hydratedRuntime.turnIds,\n messages: hydratedRuntime.messages,\n loadingStrategy: hydratedRuntime.loadingStrategy,\n historyCursor: null,\n historyHasOlder: false,\n historyLoadingOlder: false,\n fullHistoryHydrated: true,\n busy: Boolean(hydratedRuntime.activeTurnId),\n threadStatus: surfaceThreadStatus(response.thread.status),\n });\n const summary = { ...threadToSummary(response.thread), turnCount: runtime.turnIds.length };\n const state = this.host.getState();\n this.host.patch({\n conversations: upsertConversation(state.conversations, summary),\n ...(state.activeConversationId === conversationId ? this.host.runtimeProjection(runtime) : {}),\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n this.host.emitHistoryReplaced(conversationId, 'resync', 'action');\n this.host.emitConversationActivity(conversationId, 'action');\n return this.historySnapshot(conversationId, runtime);\n } catch (error) {\n this.host.patchRuntime(conversationId, { historyLoading: false, error: errorMessage(error) });\n throw error;\n }\n }\n\n private async resume(\n conversationId: string,\n activate = true,\n loadOptions: CodexConversationLoadOptions = {},\n historyReason: 'load' | 'resume' = 'resume',\n ): Promise<CodexSurfaceSnapshot> {\n const requestedHostOptions = { ...this.hostOptionsByThread.get(conversationId), ...loadOptions };\n const hostOptions = {\n ...requestedHostOptions,\n mcpServers: requestedHostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(requestedHostOptions.mcpServers),\n };\n this.hostOptionsByThread.set(conversationId, hostOptions);\n const extension = await this.extensions.conversationExtension({\n operation: 'resume',\n conversationId,\n cwd: hostOptions.cwd,\n extensionContext: hostOptions.extensionContext,\n }, {}, hostOptions.mcpServers);\n const historyItemsView = hostOptions.historyItemsView ?? this.options.historyItemsView ?? 'full';\n const loadingRuntime = this.host.createRuntime(conversationId, { historyLoading: true, error: null });\n const initialTurns = new Map(loadingRuntime.turns.map((turn) => [turn.id, turn]));\n const initialMessages = new Map(loadingRuntime.messages.map((message) => [message.id, message]));\n const initialStatus = loadingRuntime.threadStatus;\n if (activate) this.host.activateRuntime(loadingRuntime);\n try {\n const [response, goal] = await Promise.all([\n this.client.request('thread/resume', {\n threadId: conversationId,\n excludeTurns: true,\n initialTurnsPage: {\n limit: CONVERSATION_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n },\n ...(hostOptions.cwd ? { cwd: hostOptions.cwd } : {}),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadResumeParams['config'] }),\n }),\n this.client.request('thread/goal/get', { threadId: conversationId })\n .then((result) => result.goal)\n .catch(() => null),\n ]);\n if (response.thread.id !== conversationId) {\n throw new Error(`Codex thread/resume returned '${response.thread.id}' for requested thread '${conversationId}'`);\n }\n const initialPage = response.initialTurnsPage ?? await this.client.request('thread/turns/list', {\n threadId: response.thread.id,\n cursor: null,\n limit: CONVERSATION_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n });\n const turns = await Promise.all([...initialPage.data].reverse().map(async turn =>\n turn.status === 'inProgress' && (turn.itemsView === 'summary' || turn.itemsView === 'notLoaded')\n ? { ...turn, items: await readTurnItems(this.client, response.thread.id, turn.id), itemsView: 'full' as const } : turn));\n const cwd = response.cwd ?? response.thread.cwd ?? hostOptions.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd);\n const originalProjection = historyItemsView === 'full' ? await this.originalImages?.prepare(response.thread.id, response.thread.path) : undefined;\n const changedTurns = loadingRuntime.turns.filter((turn) => initialTurns.get(turn.id) !== turn);\n const threadStatus = loadingRuntime.threadStatus !== initialStatus && loadingRuntime.threadStatus\n ? loadingRuntime.threadStatus\n : surfaceThreadStatus(response.thread.status);\n const restoredTurns = turns.map((turn) => threadStatus.type === 'idle' && turn.status === 'inProgress'\n ? { ...turn, status: 'interrupted' as const }\n : turn);\n const previouslyFull = new Set(loadingRuntime.turns.filter(turn => turn.itemsView !== 'summary').map(turn => turn.id));\n const projectedTurns = new Map(restoredTurns.map((turn) => [turn.id, turn.itemsView === 'summary' && previouslyFull.has(turn.id)\n ? { ...loadingRuntime.turns.find(value => value.id === turn.id)!, ...surfaceTurn(turn), itemsView: 'full' as const } : surfaceTurn(turn)]));\n for (const turn of changedTurns) projectedTurns.set(turn.id, turn);\n const runningTurnId = changedTurns.length > 0\n ? loadingRuntime.activeTurnId\n : threadStatus.type === 'active' ? activeTurnId(turns) : null;\n const historyMessages = preserveHistoricalMessagePresentation(\n loadingRuntime.messages,\n restoredTurns.flatMap(turn => turn.itemsView === 'summary' && previouslyFull.has(turn.id)\n ? loadingRuntime.messages.filter(message => message.turnId === turn.id) : codexTurnToSurfaceMessages(response.thread.id, turn)),\n );\n // Notifications received while hydration awaited RPC/catalog data are newer\n // than that response. Never replace them with the stale transcript page.\n const mergedMessages = new Map(historyMessages.map((message) => [message.id, message]));\n for (const message of loadingRuntime.messages) {\n if (initialMessages.get(message.id) !== message) mergedMessages.set(message.id, message);\n }\n let messages = runningTurnId\n ? ensureAssistantTurnMessage([...mergedMessages.values()], response.thread.id, runningTurnId)\n : [...mergedMessages.values()];\n if (originalProjection) messages = originalProjection(messages);\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n loadingStrategy: hostOptions.loadingStrategy ?? this.options.loadingStrategy ?? 'lazy',\n historyItemsView,\n historyCursor: initialPage.nextCursor,\n historyHasOlder: initialPage.nextCursor !== null,\n historyLoadingOlder: false,\n fullHistoryHydrated: initialPage.nextCursor === null,\n cwd: cwd ?? null,\n historyLoading: false,\n activeTurnId: runningTurnId,\n turns: [...projectedTurns.values()],\n turnIds: [...projectedTurns.keys()],\n messages,\n busy: changedTurns.length > 0 ? loadingRuntime.busy : Boolean(runningTurnId) || threadStatus.type === 'active',\n goal: goal ? { ...goal } : null,\n threadStatus,\n ...catalogs,\n ...sessionSelection(response, this.host.getState().models, this.host.snapshotForRuntime(loadingRuntime)),\n });\n const summary = { ...threadToSummary(response.thread), turnCount: turns.length };\n const state = this.host.getState();\n this.host.patch({\n conversations: upsertConversation(state.conversations, summary),\n ...(state.activeConversationId === response.thread.id ? this.host.runtimeProjection(runtime) : {}),\n });\n this.host.emitSummaryUpserted(summary, 'resumed', 'action');\n this.host.emitHistoryReplaced(response.thread.id, historyReason, 'action');\n this.emitConversationState(response.thread.id);\n if (historyItemsView === 'summary') this.conversations.hydrateOriginalImages(response.thread.id, response.thread.path);\n if (runtime.loadingStrategy === 'eager' && initialPage.nextCursor !== null) {\n void this.conversations.hydrateCompleteHistory(response.thread.id, {\n cursor: initialPage.nextCursor,\n initialPageLoaded: true,\n }).catch(() => undefined);\n }\n return this.host.getSnapshot();\n } catch (error) {\n this.host.patchRuntime(conversationId, { historyLoading: false, error: errorMessage(error) });\n throw error;\n }\n }\n\n private emitConversationState(threadId: string): void {\n this.host.emitConversationActivity(threadId, 'action');\n this.host.emitConversationSettings(threadId, 'action');\n this.host.emitConversationSkills(threadId, 'action');\n this.host.emitConversationPermissions(threadId, 'action');\n }\n\n private historySnapshot(\n conversationId: string,\n runtime: Pick<ThreadRuntimeState, 'messages' | 'threadStatus'>,\n ): CodexConversationHistory {\n return {\n conversationId,\n messages: structuredClone(runtime.messages),\n threadStatus: structuredClone(runtime.threadStatus),\n };\n }\n}\n","import type { ServerNotification } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceJsonValue,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport {\n commandOutputDeltaToToolPartUpdate,\n fileChangePatchToToolPartUpdate,\n lineDiffFromUnifiedDiff,\n mcpProgressToToolPartUpdate,\n} from './codex-tool-part-adapter';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport {\n conversationStatus,\n mergeSurfaceRateLimits,\n surfaceContextUsage,\n surfaceTokenUsage,\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { appendCompactionMarker, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { realtimeAudioChunk } from './codex-surface-realtime';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { threadSettingsSelection } from './codex-surface-settings';\nimport {\n sameValue,\n surfaceTurn,\n surfaceTurnError,\n timestampToIso,\n upsertSurfaceTurn,\n} from './codex-surface-events';\n\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport interface CodexSurfaceNotificationsHost {\n clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'conversation_closed' | 'conversation_removed' | 'surface_disconnected',\n ): void;\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void;\n getState(): CodexSurfaceSnapshot;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin?: CodexSurfaceEventOrigin,\n ): void;\n patchConversationTurnCount(threadId: string, turnCount: number): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n removeThread(threadId: string, reason: 'archived' | 'deleted'): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n runtimes(): Iterable<ThreadRuntimeState>;\n sendNextQueuedPrompt(threadId: string): void;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n unknownNotification(notification: ServerNotification): void;\n}\n\nexport class CodexSurfaceNotificationsController {\n constructor(\n private readonly authentication: CodexSurfaceAuthenticationController,\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly items: CodexSurfaceItemsController,\n private readonly host: CodexSurfaceNotificationsHost,\n ) {}\n\n handle(notification: ServerNotification): void {\n switch (notification.method) {\n case 'thread/started': {\n this.host.createRuntime(notification.params.thread.id, {\n historyMode: notification.params.thread.historyMode ?? 'legacy',\n threadStatus: surfaceThreadStatus(notification.params.thread.status),\n });\n const summary = threadToSummary(notification.params.thread);\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary, 'started', 'notification');\n this.host.emitConversationActivity(notification.params.thread.id, 'notification');\n return;\n }\n case 'thread/status/changed': {\n const { threadId, status } = notification.params;\n const runtime = this.host.requireRuntime(threadId);\n const systemError = status.type === 'systemError';\n // Idle establishes readiness, not the outcome of the previous turn.\n // Keep its last-known record until an authoritative terminal arrives.\n if (systemError || (status.type === 'idle' && !runtime.turnStartPending)) runtime.activeTurnId = null;\n this.host.patchRuntime(threadId, {\n threadStatus: surfaceThreadStatus(status),\n busy: systemError\n ? false\n : runtime.turnStartPending || status.type === 'active' || runtime.activeTurnId !== null,\n ...(systemError\n ? { turnStartPending: false, error: 'Codex app-server reported a system error' }\n : {}),\n });\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, status: conversationStatus(status) }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n this.host.emitConversationActivity(threadId, 'notification');\n if (status.type === 'idle') this.host.sendNextQueuedPrompt(threadId);\n return;\n }\n case 'thread/archived':\n case 'thread/deleted':\n this.host.removeThread(\n notification.params.threadId,\n notification.method === 'thread/archived' ? 'archived' : 'deleted',\n );\n return;\n case 'thread/unarchived':\n void this.conversations.load().catch((error) => {\n this.host.patch({ error: errorMessage(error) });\n });\n return;\n case 'thread/closed': {\n const runtime = this.host.runtime(notification.params.threadId);\n if (runtime) {\n runtime.activeTurnId = null;\n this.host.patchRuntime(notification.params.threadId, {\n busy: false,\n turnStartPending: false,\n threadStatus: { type: 'idle' },\n });\n }\n this.host.clearPendingForThread(notification.params.threadId, 'Codex thread closed', 'conversation_closed');\n this.host.patchConversationStatus(notification.params.threadId, 'idle');\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'skills/changed':\n void this.catalog.loadSkills(true, 'notification');\n for (const runtime of this.host.runtimes()) {\n void this.catalog.loadConversationCatalogs(runtime.cwd ?? undefined, true).then((catalogs) => {\n this.host.patchRuntime(runtime.threadId, catalogs);\n this.host.emitConversationSkills(runtime.threadId, 'notification');\n this.host.emitConversationPermissions(runtime.threadId, 'notification');\n });\n }\n return;\n case 'thread/name/updated': {\n const state = this.host.getState();\n const previous = state.conversations.find((conversation) => conversation.id === notification.params.threadId);\n const title = notification.params.threadName?.trim() || previous?.preview || 'Untitled conversation';\n if (previous?.title === title) return;\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === notification.params.threadId\n ? { ...conversation, title }\n : conversation),\n });\n const summary = this.host.getState().conversations.find(\n (conversation) => conversation.id === notification.params.threadId,\n );\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n return;\n }\n case 'thread/settings/updated': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const state = this.host.getState();\n const next = threadSettingsSelection(\n notification.params.threadSettings,\n state.models,\n this.host.snapshotForRuntime(runtime),\n );\n const changed = runtime.approvalPreset !== next.approvalPreset\n || runtime.selectedModelId !== next.selectedModelId\n || runtime.selectedReasoningEffort !== next.selectedReasoningEffort\n || runtime.selectedServiceTier !== next.selectedServiceTier\n || runtime.planMode !== next.planMode;\n this.host.patchRuntime(notification.params.threadId, next);\n if (changed) this.host.emitConversationSettings(notification.params.threadId, 'notification');\n return;\n }\n case 'thread/goal/updated': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n if (sameValue(runtime.goal, notification.params.goal)) return;\n this.host.patchRuntime(notification.params.threadId, { goal: { ...notification.params.goal } });\n this.host.emitEvent('notification', {\n type: 'conversation.goalChanged',\n conversationId: notification.params.threadId,\n ...(notification.params.turnId ? { turnId: notification.params.turnId } : {}),\n payload: { goal: structuredClone(notification.params.goal) },\n });\n return;\n }\n case 'thread/goal/cleared':\n if (this.host.requireRuntime(notification.params.threadId).goal === null) return;\n this.host.patchRuntime(notification.params.threadId, { goal: null });\n this.host.emitEvent('notification', {\n type: 'conversation.goalChanged',\n conversationId: notification.params.threadId,\n payload: { goal: null },\n });\n return;\n case 'thread/tokenUsage/updated': {\n const contextUsage = surfaceContextUsage(notification.params.tokenUsage);\n this.host.patchRuntime(notification.params.threadId, { contextUsage });\n this.host.emitEvent('notification', {\n type: 'conversation.contextUsageChanged',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { contextUsage: structuredClone(contextUsage) },\n });\n this.host.emitEvent('notification', {\n type: 'conversation.executionUsageChanged',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { usage: {\n last: surfaceTokenUsage(notification.params.tokenUsage.last),\n total: surfaceTokenUsage(notification.params.tokenUsage.total),\n execution: null, model: null, observedStart: false,\n } },\n });\n return;\n }\n case 'model/rerouted':\n this.host.emitEvent('notification', {\n type: 'turn.modelRerouted', conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { fromModel: notification.params.fromModel, toModel: notification.params.toModel, reason: notification.params.reason },\n });\n return;\n case 'turn/started': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const alreadyActive = runtime.activeTurnId === notification.params.turn.id;\n this.host.markRuntimeTurnActive(runtime, notification.params.turn.id);\n this.host.patchConversationTurnCount(notification.params.threadId, runtime.turnIds.length);\n this.host.patchRuntime(notification.params.threadId, {\n busy: true,\n turnStartPending: false,\n error: null,\n turnGitDiff: null,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(notification.params.turn)),\n messages: ensureAssistantTurnMessage(\n runtime.messages,\n notification.params.threadId,\n notification.params.turn.id,\n { createdAt: timestampToIso(notification.params.turn.startedAt) },\n ),\n });\n this.host.patchConversationStatus(notification.params.threadId, 'active');\n if (!alreadyActive) {\n this.host.emitEvent('notification', {\n type: 'turn.started',\n conversationId: notification.params.threadId,\n turnId: notification.params.turn.id,\n payload: { startedAt: timestampToIso(notification.params.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'item/agentMessage/delta':\n this.items.applyAgentDelta(notification.params);\n return;\n case 'item/plan/delta':\n this.items.applyPlanDelta(notification.params);\n return;\n case 'item/started':\n case 'item/completed':\n this.items.applyItem(notification.params, notification.method === 'item/completed');\n return;\n case 'item/commandExecution/outputDelta':\n if (!this.items.isForwardingCommandOutput(notification.params.threadId, notification.params.itemId)) return;\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n commandOutputDeltaToToolPartUpdate(notification.params.itemId, notification.params.delta),\n );\n return;\n case 'item/fileChange/patchUpdated':\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n fileChangePatchToToolPartUpdate(notification.params.itemId, notification.params.changes),\n );\n return;\n case 'item/mcpToolCall/progress':\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n mcpProgressToToolPartUpdate(notification.params.itemId, notification.params.message),\n );\n return;\n case 'rawResponseItem/completed':\n this.items.applyRawResponseItem(notification.params);\n return;\n case 'turn/plan/updated':\n this.items.applyPlanUpdated(notification.params);\n return;\n case 'serverRequest/resolved': {\n const requestId = String(notification.params.requestId);\n this.clientRequests.handleServerResolved(requestId, notification.params.threadId);\n this.approvals.handleServerResolved(requestId);\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'turn/diff/updated': {\n const counts = lineDiffFromUnifiedDiff(notification.params.diff);\n this.host.patchRuntime(notification.params.threadId, {\n turnGitDiff: {\n turnId: notification.params.turnId,\n addedLines: counts.addedLines,\n removedLines: counts.removedLines,\n diff: notification.params.diff,\n updatedAt: new Date().toISOString(),\n },\n });\n this.host.emitEvent('notification', {\n type: 'conversation.diffUpdated',\n conversationId: notification.params.threadId,\n payload: { diff: structuredClone(this.host.requireRuntime(notification.params.threadId).turnGitDiff) },\n });\n return;\n }\n case 'thread/compacted': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n this.host.patchRuntime(notification.params.threadId, {\n messages: appendCompactionMarker(\n runtime.messages,\n notification.params.threadId,\n notification.params.turnId,\n 'complete',\n ),\n });\n const message = this.host.requireRuntime(notification.params.threadId).messages.find((candidate) => (\n candidate.kind === 'compaction' && candidate.metadata?.turnId === notification.params.turnId\n ))!;\n this.host.emitEvent('notification', {\n type: 'context.compactionCompleted',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { itemId: null, message: structuredClone(message) },\n });\n return;\n }\n case 'turn/completed':\n this.items.applyTurnCompleted(notification.params);\n return;\n case 'error': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const terminalCurrentTurn = !notification.params.willRetry\n && runtime.activeTurnId === notification.params.turnId;\n if (terminalCurrentTurn) runtime.activeTurnId = null;\n this.host.patchRuntime(notification.params.threadId, {\n error: notification.params.error.message,\n turns: upsertSurfaceTurn(runtime.turns, {\n ...(runtime.turns.find((turn) => turn.id === notification.params.turnId) ?? {\n id: notification.params.turnId,\n status: 'inProgress' as const,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n }),\n status: notification.params.willRetry ? 'inProgress' : 'failed',\n error: surfaceTurnError(notification.params.error),\n willRetry: notification.params.willRetry,\n }),\n ...(terminalCurrentTurn ? { busy: false, turnStartPending: false } : {}),\n });\n if (terminalCurrentTurn) this.host.patchConversationStatus(notification.params.threadId, 'error');\n this.host.emitEvent('notification', {\n type: 'turn.error',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: {\n error: surfaceTurnError(notification.params.error)!,\n willRetry: notification.params.willRetry,\n },\n });\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'account/rateLimits/updated': {\n const state = this.host.getState();\n this.host.patch({ rateLimits: mergeSurfaceRateLimits(state.rateLimits, notification.params.rateLimits) });\n this.host.emitEvent('notification', {\n type: 'rateLimits.changed',\n payload: { rateLimits: structuredClone(this.host.getState().rateLimits) },\n });\n return;\n }\n case 'account/updated':\n void this.authentication.refresh('notification').catch((error) => this.host.patch({ error: errorMessage(error) }));\n return;\n case 'account/login/completed':\n this.authentication.handleLoginCompleted(notification.params);\n return;\n case 'thread/realtime/started':\n this.host.emitEvent('notification', {\n type: 'realtime.started',\n conversationId: notification.params.threadId,\n payload: {\n realtimeSessionId: notification.params.realtimeSessionId,\n version: notification.params.version,\n },\n });\n return;\n case 'thread/realtime/itemAdded':\n this.host.emitEvent('notification', {\n type: 'realtime.itemAdded',\n conversationId: notification.params.threadId,\n payload: { item: structuredClone(notification.params.item) as CodexSurfaceJsonValue },\n });\n return;\n case 'thread/realtime/item/started':\n case 'thread/realtime/item/completed':\n this.host.emitEvent('notification', {\n type: notification.method === 'thread/realtime/item/started'\n ? 'realtime.itemStarted' : 'realtime.itemCompleted',\n conversationId: notification.params.threadId,\n payload: { item: structuredClone(notification.params.item) as CodexSurfaceJsonValue },\n });\n return;\n case 'thread/realtime/item/transcript/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.itemTranscriptDelta',\n conversationId: notification.params.threadId,\n payload: { itemId: notification.params.itemId, delta: notification.params.delta },\n });\n return;\n case 'thread/realtime/transcript/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.transcriptDelta',\n conversationId: notification.params.threadId,\n payload: { role: notification.params.role, delta: notification.params.delta },\n });\n return;\n case 'thread/realtime/transcript/done':\n this.host.emitEvent('notification', {\n type: 'realtime.transcriptCompleted',\n conversationId: notification.params.threadId,\n payload: { role: notification.params.role, text: notification.params.text },\n });\n return;\n case 'thread/realtime/outputAudio/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.audioDelta',\n conversationId: notification.params.threadId,\n payload: { audio: realtimeAudioChunk(notification.params.audio) },\n });\n return;\n case 'thread/realtime/sdp':\n this.host.emitEvent('notification', {\n type: 'realtime.sdp',\n conversationId: notification.params.threadId,\n payload: { sdp: notification.params.sdp },\n });\n return;\n case 'thread/realtime/error':\n this.host.emitEvent('notification', {\n type: 'realtime.error',\n conversationId: notification.params.threadId,\n payload: { message: notification.params.message },\n });\n return;\n case 'thread/realtime/closed':\n this.host.emitEvent('notification', {\n type: 'realtime.closed',\n conversationId: notification.params.threadId,\n payload: { reason: notification.params.reason },\n });\n return;\n case 'hook/started':\n case 'hook/completed':\n case 'item/autoApprovalReview/started':\n case 'item/autoApprovalReview/completed':\n case 'command/exec/outputDelta':\n case 'process/outputDelta':\n case 'process/exited':\n case 'item/commandExecution/terminalInteraction':\n case 'item/fileChange/outputDelta':\n case 'mcpServer/oauthLogin/completed':\n case 'mcpServer/startupStatus/updated':\n case 'app/list/updated':\n case 'externalAgentConfig/import/progress':\n case 'externalAgentConfig/import/completed':\n case 'fs/changed':\n case 'item/reasoning/summaryTextDelta':\n case 'item/reasoning/summaryPartAdded':\n case 'item/reasoning/textDelta':\n case 'model/verification':\n case 'turn/moderationMetadata':\n case 'model/safetyBuffering/updated':\n case 'warning':\n case 'guardianWarning':\n case 'deprecationNotice':\n case 'configWarning':\n case 'fuzzyFileSearch/sessionUpdated':\n case 'fuzzyFileSearch/sessionCompleted':\n case 'windows/worldWritableWarning':\n case 'windowsSandbox/setupCompleted':\n return;\n case 'remoteControl/status/changed':\n this.host.emitEvent('notification', {\n type: 'remoteControl.statusChanged',\n payload: {\n status: {\n status: notification.params.status,\n serverName: notification.params.serverName,\n installationId: notification.params.installationId,\n environmentId: notification.params.environmentId,\n },\n },\n });\n return;\n default:\n return this.host.unknownNotification(notification);\n }\n }\n}\n","import type {\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport { upsertSurfaceTurn } from './codex-surface-events';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport {\n createThreadRuntime,\n runtimeProjection,\n type ThreadRuntimePatch,\n type ThreadRuntimeState,\n} from './codex-surface-runtime';\n\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport interface CodexSurfaceRuntimeHost {\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n getState(): CodexSurfaceSnapshot;\n notifyConversationListeners(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>, conversationId?: string): void;\n schedulePluginRefresh(): void;\n}\n\nexport class CodexSurfaceRuntimeController {\n private readonly runtimes = new Map<string, ThreadRuntimeState>();\n private readonly semanticEventValues = new Map<string, string>();\n\n constructor(\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly host: CodexSurfaceRuntimeHost,\n ) {}\n\n get(threadId: string): ThreadRuntimeState | undefined {\n return this.runtimes.get(threadId);\n }\n\n values(): IterableIterator<ThreadRuntimeState> {\n return this.runtimes.values();\n }\n\n clear(): void {\n this.runtimes.clear();\n this.semanticEventValues.clear();\n }\n\n forget(threadId: string): void {\n this.runtimes.delete(threadId);\n this.semanticEventValues.delete(`summary:${threadId}`);\n this.semanticEventValues.delete(`activity:${threadId}`);\n this.semanticEventValues.delete(`settings:${threadId}`);\n }\n\n create(threadId: string, patch: ThreadRuntimePatch = {}): ThreadRuntimeState {\n const existing = this.runtimes.get(threadId);\n if (existing) {\n Object.assign(existing, patch);\n return existing;\n }\n const runtime = createThreadRuntime(threadId, this.host.getState(), patch);\n this.runtimes.set(threadId, runtime);\n return runtime;\n }\n\n require(threadId: string): ThreadRuntimeState {\n return this.runtimes.get(threadId) ?? this.create(threadId);\n }\n\n projection(runtime: ThreadRuntimeState): ReturnType<typeof runtimeProjection> {\n return runtimeProjection(\n runtime,\n this.approvals.approvalsForThread(runtime.threadId),\n this.clientRequests.requestsForThread(runtime.threadId),\n );\n }\n\n snapshot(runtime: ThreadRuntimeState): CodexSurfaceSnapshot {\n return { ...this.host.getState(), ...this.projection(runtime) };\n }\n\n activate(runtime: ThreadRuntimeState): void {\n this.host.patch({\n activeConversationId: runtime.threadId,\n ...this.projection(runtime),\n });\n this.host.emitEvent('action', {\n type: 'conversation.selected',\n payload: { conversationId: runtime.threadId },\n });\n }\n\n patch(threadId: string, patch: ThreadRuntimePatch): void {\n const runtime = this.require(threadId);\n const historyChanged = (['historyLoading', 'historyLoadingOlder', 'historyHasOlder', 'fullHistoryHydrated', 'loadingStrategy', 'historyItemsView'] as const)\n .some((key) => key in patch && patch[key] !== runtime[key]);\n Object.assign(runtime, patch);\n if (this.host.getState().activeConversationId === threadId) {\n this.host.patch(this.projection(runtime), threadId);\n } else {\n this.host.notifyConversationListeners(threadId);\n }\n if (historyChanged) {\n this.host.emitEvent('lifecycle', {\n type: 'conversation.historyStateChanged',\n conversationId: threadId,\n payload: {\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n error: runtime.error,\n },\n });\n }\n }\n\n emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void {\n const state = this.host.getState();\n this.host.emitEvent(origin, {\n type: 'surface.statusChanged',\n payload: { status: state.status, error: state.error },\n });\n }\n\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.host.schedulePluginRefresh();\n const fingerprint = JSON.stringify({\n id: summary.id,\n title: summary.title,\n preview: summary.preview,\n cwd: summary.cwd,\n status: summary.status,\n turnCount: summary.turnCount,\n createdAt: summary.createdAt,\n });\n if (this.semanticEventValues.get(`summary:${summary.id}`) === fingerprint) return;\n this.semanticEventValues.set(`summary:${summary.id}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.summaryUpserted',\n conversationId: summary.id,\n payload: { summary: structuredClone(summary), reason },\n });\n }\n\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n const payload = {\n threadStatus: structuredClone(runtime.threadStatus),\n busy: runtime.busy,\n error: runtime.error,\n };\n const fingerprint = JSON.stringify(payload);\n if (this.semanticEventValues.get(`activity:${threadId}`) === fingerprint) return;\n this.semanticEventValues.set(`activity:${threadId}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.activityChanged',\n conversationId: threadId,\n payload,\n });\n }\n\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n const payload = {\n approvalPreset: runtime.approvalPreset,\n selectedModelId: runtime.selectedModelId,\n selectedReasoningEffort: runtime.selectedReasoningEffort,\n selectedServiceTier: runtime.selectedServiceTier,\n planMode: runtime.planMode,\n };\n const fingerprint = JSON.stringify(payload);\n if (this.semanticEventValues.get(`settings:${threadId}`) === fingerprint) return;\n this.semanticEventValues.set(`settings:${threadId}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.settingsChanged',\n conversationId: threadId,\n payload,\n });\n }\n\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.skillsChanged',\n conversationId: threadId,\n payload: {\n cwd: runtime.cwd,\n skills: structuredClone(runtime.skills),\n status: runtime.skillCatalogStatus,\n },\n });\n }\n\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.permissionsChanged',\n conversationId: threadId,\n payload: {\n cwd: runtime.cwd,\n permissionProfiles: structuredClone(runtime.permissionProfiles),\n approvalPresets: [...runtime.approvalPresets],\n },\n });\n }\n\n emitHistoryReplaced(\n threadId: string,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.historyReplaced' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.historyReplaced',\n conversationId: threadId,\n payload: {\n reason,\n messages: structuredClone(runtime.messages),\n threadStatus: structuredClone(runtime.threadStatus),\n state: historyReplacementState(runtime),\n },\n });\n }\n\n emitHistoryPrepended(\n threadId: string,\n messages: readonly SurfaceMessage[],\n origin: CodexSurfaceEventOrigin,\n ): void {\n if (messages.length === 0) return;\n const currentMessages = new Map(\n this.require(threadId).messages.map((message) => [message.id, message]),\n );\n this.host.emitEvent(origin, {\n type: 'conversation.historyPrepended',\n conversationId: threadId,\n payload: {\n messages: structuredClone(messages.map((message) => currentMessages.get(message.id) ?? message)),\n state: historyPrependState(this.require(threadId)),\n },\n });\n }\n\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null {\n return this.require(threadId).messages.find((message) => (\n message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === itemId)\n )) ?? null;\n }\n\n assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null {\n return [...this.require(threadId).messages].reverse().find((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n )) ?? null;\n }\n\n markTurnActive(runtime: ThreadRuntimeState, turnId: string): void {\n const expired = runtime.turnIds.includes(turnId) ? [] : this.projection(runtime).clientRequests.filter(request => (\n request.kind === 'ask_user' && request.payload.request.delivery === 'async'\n && request.turnId && request.turnId !== turnId\n ));\n runtime.activeTurnId = turnId;\n runtime.busy = true;\n runtime.turnStartPending = false;\n if (!runtime.turnIds.includes(turnId)) runtime.turnIds.push(turnId);\n runtime.turns = upsertSurfaceTurn(runtime.turns, {\n id: turnId,\n status: 'inProgress',\n error: null,\n willRetry: false,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n });\n if (expired.length > 0) {\n this.patch(runtime.threadId, {\n answeredClientRequestIds: [...new Set([...runtime.answeredClientRequestIds, ...expired.map(request => request.id)])],\n });\n for (const request of expired) this.host.emitEvent('notification', {\n type: 'clientRequest.resolved', conversationId: runtime.threadId, turnId: request.turnId ?? undefined,\n payload: { request: structuredClone(request), response: null, reason: 'server' },\n });\n }\n }\n\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, status, updatedAt: new Date().toISOString() }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.emitSummaryUpserted(summary, 'updated', origin);\n }\n\n patchConversationTurnCount(\n threadId: string,\n turnCount: number,\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, turnCount, updatedAt: new Date().toISOString() }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.emitSummaryUpserted(summary, 'updated', origin);\n }\n}\n\nfunction historyReplacementState(runtime: ThreadRuntimeState) {\n return structuredClone({\n activeTurnId: runtime.activeTurnId,\n answeredClientRequestIds: runtime.answeredClientRequestIds,\n busy: runtime.busy,\n contextUsage: runtime.contextUsage,\n error: runtime.error,\n executionPlan: runtime.executionPlan,\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n turnGitDiff: runtime.turnGitDiff,\n turnIds: runtime.turnIds,\n turns: runtime.turns,\n });\n}\n\nfunction historyPrependState(runtime: ThreadRuntimeState) {\n return structuredClone({\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n turnIds: runtime.turnIds,\n turns: runtime.turns,\n });\n}\n\nfunction runtimeHistoryState(runtime: ThreadRuntimeState) {\n return {\n loadingStrategy: runtime.loadingStrategy,\n ...(runtime.historyItemsView === 'summary' ? { itemsView: 'summary' as const } : {}),\n hasOlder: runtime.historyHasOlder,\n loadingOlder: runtime.historyLoadingOlder,\n fullyLoaded: runtime.fullHistoryHydrated,\n };\n}\n","import { RpcRemoteError } from '../codex/index';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type { ExperimentalFeatureListResponse } from '../codex/generated/v2/ExperimentalFeatureListResponse';\nimport type {\n CodexSurfaceAuthentication,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { surfaceAuthenticationKey } from './codex-surface-authentication';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport type {\n CodexSurfaceConfigRequirements,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n} from './codex-surface-contracts';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { CodexSurfaceLifecycleController } from './codex-surface-lifecycle-controller';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceRuntimeController } from './codex-surface-runtime-controller';\n\nexport interface CodexSurfaceConnectionHost {\n clearConversationHandles(): void;\n clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'surface_disconnected',\n ): void;\n closed(): boolean;\n emitAuthenticationChanged(authentication: CodexSurfaceAuthentication, origin: CodexSurfaceEventOrigin): void;\n emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n}\n\nconst SDK_RUNTIME_FEATURES = new Set([\n 'compaction_image_budget',\n 'default_mode_request_user_input',\n]);\n\nexport class CodexSurfaceConnectionController {\n private connectPromise: Promise<CodexSurfaceSnapshot> | null = null;\n private surfaceBootstrapPromise: Promise<void> | null = null;\n private bootstrappedAuthenticationKey: string | null = null;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly options: Pick<CodexSurfaceOptions, 'autoSelectFirstConversation' | 'clientInfo'>,\n private readonly authentication: CodexSurfaceAuthenticationController,\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly items: CodexSurfaceItemsController,\n private readonly lifecycle: CodexSurfaceLifecycleController,\n private readonly runtimeState: CodexSurfaceRuntimeController,\n private readonly host: CodexSurfaceConnectionHost,\n ) {}\n\n connect(): Promise<CodexSurfaceSnapshot> {\n if (this.host.getState().status === 'ready') return Promise.resolve(this.host.getSnapshot());\n if (this.connectPromise) return this.connectPromise;\n if (this.host.closed()) return Promise.reject(new Error('Codex surface is closed'));\n\n this.host.patch({ status: 'connecting', error: null });\n this.host.emitSurfaceStatus('lifecycle');\n this.connectPromise = (async () => {\n try {\n this.bootstrappedAuthenticationKey = null;\n this.catalog.reset(true);\n this.resetAppServerSessionState();\n await this.client.start();\n const clientInfo = this.options.clientInfo ?? {\n name: 'codex_app_sdk',\n title: 'Codex Surface',\n version: '0.1.0',\n };\n await this.client.initialize({\n clientInfo: {\n name: clientInfo.name,\n title: clientInfo.title ?? null,\n version: clientInfo.version,\n },\n capabilities: { experimentalApi: true, requestAttestation: false },\n });\n await this.enableSupportedRuntimeFeatures();\n const authenticationChanged = await this.authentication.load('lifecycle');\n if (authenticationChanged || this.authentication.blocksBootstrap()) {\n await this.clearAuthenticatedSurfaceData();\n }\n if (!this.authentication.blocksBootstrap()) await this.bootstrapSurfaceData();\n this.host.patch({ status: 'ready', error: null });\n this.host.emitSurfaceStatus('lifecycle');\n if (!this.authentication.blocksBootstrap()) this.catalog.schedulePluginRefresh();\n return this.host.getSnapshot();\n } catch (error) {\n this.host.patch({ status: 'error', error: errorMessage(error) });\n this.host.emitSurfaceStatus('lifecycle');\n throw error;\n } finally {\n this.connectPromise = null;\n }\n })();\n return this.connectPromise;\n }\n\n private async enableSupportedRuntimeFeatures(): Promise<void> {\n try {\n let cursor: string | null = null;\n const enablement: Record<string, boolean> = {};\n do {\n const response: ExperimentalFeatureListResponse = await this.client.request('experimentalFeature/list', {\n cursor,\n limit: 100,\n threadId: null,\n });\n for (const feature of response.data) {\n if (SDK_RUNTIME_FEATURES.has(feature.name) && !feature.enabled) {\n enablement[feature.name] = true;\n }\n }\n cursor = response.nextCursor;\n } while (cursor);\n if (Object.keys(enablement).length > 0) {\n await this.client.request('experimentalFeature/enablement/set', { enablement });\n }\n } catch (error) {\n // Older app-server releases do not expose feature discovery. They remain\n // usable, but cannot opt into SDK-supported runtime features.\n if (error instanceof RpcRemoteError && error.code === -32601) return;\n throw error;\n }\n }\n\n async ensureConnected(): Promise<void> {\n await this.connect();\n while (true) {\n const pending = this.authentication.pendingRefresh() ?? this.surfaceBootstrapPromise;\n if (!pending) return;\n await pending;\n }\n }\n\n bootstrapSurfaceData(force = false): Promise<void> {\n const authenticationKey = surfaceAuthenticationKey(this.host.getState().authentication);\n if (!force && this.bootstrappedAuthenticationKey === authenticationKey) return Promise.resolve();\n if (this.surfaceBootstrapPromise) {\n const pending = this.surfaceBootstrapPromise;\n return pending.then(() => this.bootstrapSurfaceData(force));\n }\n const bootstrap = (async () => {\n await Promise.all([\n this.catalog.loadModels(),\n this.catalog.loadSkills(force),\n this.catalog.loadPermissionProfiles(),\n this.catalog.loadRateLimits(),\n this.conversations.load(),\n ]);\n const state = this.host.getState();\n const activeConversation = state.activeConversationId\n ? state.conversations.find((conversation) => conversation.id === state.activeConversationId)\n : undefined;\n const conversationToResume = activeConversation\n ?? (this.options.autoSelectFirstConversation === false ? undefined : state.conversations[0]);\n if (conversationToResume && !this.runtimeState.get(conversationToResume.id)?.hydrated) {\n await this.lifecycle.resumeDuringBootstrap(conversationToResume.id);\n }\n this.bootstrappedAuthenticationKey = authenticationKey;\n this.catalog.schedulePluginRefresh(force);\n })();\n this.surfaceBootstrapPromise = bootstrap;\n void bootstrap.finally(() => {\n this.surfaceBootstrapPromise = null;\n }).catch(() => undefined);\n return bootstrap;\n }\n\n async refreshAccount(): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.refresh('action', true);\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n await this.ensureConnected();\n return this.authentication.startChatGptLogin();\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n await this.ensureConnected();\n return this.authentication.startChatGptDeviceCodeLogin();\n }\n\n async cancelLogin(loginId: string): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.cancelLogin(loginId);\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.logout();\n }\n\n async readRemoteControlStatus(): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/status/read', undefined);\n }\n\n async enableRemoteControl(options: v2.RemoteControlEnableParams = {}): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/enable', options);\n }\n\n async disableRemoteControl(options: v2.RemoteControlDisableParams = {}): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/disable', options);\n }\n\n async startRemoteControlPairing(\n options: v2.RemoteControlPairingStartParams = {},\n ): Promise<CodexSurfaceRemoteControlPairing> {\n await this.ensureConnected();\n return this.client.request('remoteControl/pairing/start', options);\n }\n\n async readRemoteControlPairingStatus(\n options: v2.RemoteControlPairingStatusParams = {},\n ): Promise<CodexSurfaceRemoteControlPairingStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/pairing/status', options);\n }\n\n async listRemoteControlClients(\n options: v2.RemoteControlClientsListParams,\n ): Promise<CodexSurfaceRemoteControlClientPage> {\n await this.ensureConnected();\n return this.client.request('remoteControl/client/list', options);\n }\n\n async revokeRemoteControlClient(\n options: v2.RemoteControlClientsRevokeParams,\n ): Promise<v2.RemoteControlClientsRevokeResponse> {\n await this.ensureConnected();\n return this.client.request('remoteControl/client/revoke', options);\n }\n\n async readConfigRequirements(): Promise<CodexSurfaceConfigRequirements | null> {\n await this.ensureConnected();\n return (await this.client.request('configRequirements/read', undefined)).requirements;\n }\n\n patchAuthentication(\n patch: Partial<CodexSurfaceAuthentication>,\n origin: CodexSurfaceEventOrigin,\n ): void {\n const authentication = { ...this.host.getState().authentication, ...patch };\n this.host.patch({ authentication });\n this.host.emitAuthenticationChanged(authentication, origin);\n }\n\n handleDisconnect(error: Error): void {\n if (this.host.closed()) return;\n this.catalog.reset(false);\n for (const runtime of this.runtimeState.values()) {\n this.host.clearPendingForThread(runtime.threadId, error.message, 'surface_disconnected');\n runtime.activeTurnId = null;\n runtime.busy = false;\n runtime.turnStartPending = false;\n runtime.historyLoading = false;\n runtime.error = error.message;\n }\n this.approvals.denyAll();\n this.clientRequests.clear();\n this.host.patch({\n status: 'error',\n activeTurnId: null,\n busy: false,\n approvals: [],\n clientRequests: [],\n historyLoading: false,\n error: error.message,\n });\n this.host.emitSurfaceStatus('lifecycle');\n }\n\n private resetAppServerSessionState(): void {\n this.runtimeState.clear();\n this.lifecycle.resetHydrations();\n this.conversations.reset();\n this.items.reset();\n }\n\n async clearAuthenticatedSurfaceData(): Promise<void> {\n const pendingBootstrap = this.surfaceBootstrapPromise;\n if (pendingBootstrap) await pendingBootstrap.catch(() => undefined);\n this.approvals.denyAll();\n this.clientRequests.rejectAll('Codex account signed out');\n this.runtimeState.clear();\n this.lifecycle.clear();\n this.conversations.reset();\n this.host.clearConversationHandles();\n this.items.reset();\n this.bootstrappedAuthenticationKey = null;\n this.catalog.reset(true);\n this.host.patch({\n conversations: [],\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n clientRequests: [],\n answeredClientRequestIds: [],\n approvals: [],\n models: [],\n modelCatalogStatus: 'notLoaded',\n skills: [],\n skillCatalogStatus: 'notLoaded',\n plugins: [],\n pluginCatalogStatus: 'notLoaded',\n permissionProfiles: [],\n approvalPresets: [],\n approvalPreset: null,\n selectedModelId: null,\n selectedReasoningEffort: null,\n selectedServiceTier: null,\n planMode: false,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n rateLimits: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n error: null,\n });\n }\n}\n","import { readTurnItems } from './codex-surface-conversations-controller';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { codexThreadToSurfaceMessages } from './codex-conversation-history';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { activeTurnId, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { normalizeMcpServers } from './codex-surface-mcp';\nimport {\n approvalPresetStartParams,\n collaborationMode,\n requireCatalogModel,\n selectedModel,\n sessionSelection,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\nimport {\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport type {\n CodexConversationLoadOptions,\n ForkCodexConversationOptions,\n} from './codex-surface-contracts';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceTurn } from './codex-surface-events';\n\nconst FORK_HISTORY_PAGE_SIZE = 5;\n\nexport type CodexSurfaceForkHost = {\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string): void;\n emitConversationPermissions(threadId: string): void;\n emitConversationSettings(threadId: string): void;\n emitConversationSkills(threadId: string): void;\n emitHistoryReplaced(threadId: string): void;\n hydrateOriginalImages?(threadId: string, path?: string | null): void;\n emitSummaryUpserted(summary: CodexConversationSummary): void;\n getState(): CodexSurfaceSnapshot;\n hydrateCompleteHistory(threadId: string): Promise<void>;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n rememberHostOptions(threadId: string, options: CodexConversationLoadOptions): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n};\n\ntype CodexForkBoundary = {\n beforeTurnId?: string;\n lastTurnId?: string;\n};\n\nexport class CodexSurfaceForkController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly loadingStrategy: 'eager' | 'lazy' | undefined,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly extensions: CodexSurfaceExtensionsController,\n private readonly host: CodexSurfaceForkHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n async fork(\n sourceThreadId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationLoadOptions = {},\n boundary: CodexForkBoundary = {},\n ): Promise<string> {\n const sourceRuntime = this.host.requireRuntime(sourceThreadId);\n if (\n (sourceRuntime.busy || sourceRuntime.activeTurnId)\n && !boundary.beforeTurnId\n && (!boundary.lastTurnId || boundary.lastTurnId === sourceRuntime.activeTurnId)\n ) {\n throw new Error('Cannot fork a conversation while its current turn is still active');\n }\n\n const cwd = options.cwd ?? sourceRuntime.cwd ?? hostOptions.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd ?? undefined);\n const state = this.host.getState();\n const requestedModel = options.model\n ? requireCatalogModel(state.models, options.model)\n : selectedModel(state.models, sourceRuntime.selectedModelId);\n validateReasoningEffort(requestedModel, options.reasoningEffort);\n validateServiceTier(requestedModel, options.serviceTier);\n\n const mcpServers = hostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(hostOptions.mcpServers);\n const extension = await this.extensions.conversationExtension({\n operation: 'start',\n conversationId: null,\n cwd: cwd ?? undefined,\n createOptions: options,\n extensionContext: hostOptions.extensionContext,\n }, options, mcpServers);\n const response = await this.client.request('thread/fork', {\n threadId: sourceThreadId,\n ...(boundary.beforeTurnId ? { beforeTurnId: boundary.beforeTurnId } : {}),\n ...(boundary.lastTurnId ? { lastTurnId: boundary.lastTurnId } : {}),\n excludeTurns: true,\n deferGoalContinuation: true,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.model && requestedModel ? { model: requestedModel.model } : {}),\n ...(options.serviceTier === undefined ? {} : { serviceTier: options.serviceTier }),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadForkParams['config'] }),\n ...forkApprovalSettings(options, catalogs.approvalPresets),\n });\n if (!response.thread.id || response.thread.id === sourceThreadId) {\n throw new Error(`Codex thread/fork returned an invalid new thread id '${response.thread.id}'`);\n }\n if (options.reasoningEffort) {\n await this.client.request('thread/settings/update', {\n threadId: response.thread.id,\n effort: options.reasoningEffort,\n ...(requestedModel ? {\n collaborationMode: collaborationMode(\n sourceRuntime.planMode,\n requestedModel.model,\n options.reasoningEffort,\n ),\n } : {}),\n });\n }\n\n const historyItemsView = hostOptions.historyItemsView ?? sourceRuntime.historyItemsView ?? 'full';\n const [initialPage, goal] = await Promise.all([\n this.client.request('thread/turns/list', {\n threadId: response.thread.id,\n cursor: null,\n limit: FORK_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n }),\n this.client.request('thread/goal/get', { threadId: response.thread.id })\n .then((result) => result.goal)\n .catch(() => null),\n ]);\n const turns = await Promise.all([...initialPage.data].reverse().map(async turn =>\n turn.status === 'inProgress' && (turn.itemsView === 'summary' || turn.itemsView === 'notLoaded')\n ? { ...turn, items: await readTurnItems(this.client, response.thread.id, turn.id), itemsView: 'full' as const } : turn));\n const originalProjection = historyItemsView === 'full' ? await this.originalImages?.prepare(response.thread.id, response.thread.path) : undefined;\n const runningTurnId = activeTurnId(turns);\n const historyMessages = codexThreadToSurfaceMessages({ ...response.thread, turns });\n let messages = runningTurnId\n ? ensureAssistantTurnMessage(historyMessages, response.thread.id, runningTurnId)\n : historyMessages;\n if (originalProjection) messages = originalProjection(messages);\n const effectiveLoadingStrategy = hostOptions.loadingStrategy ?? this.loadingStrategy ?? 'lazy';\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n loadingStrategy: effectiveLoadingStrategy,\n historyItemsView,\n historyCursor: initialPage.nextCursor,\n historyHasOlder: initialPage.nextCursor !== null,\n historyLoadingOlder: false,\n fullHistoryHydrated: initialPage.nextCursor === null,\n cwd: response.cwd ?? response.thread.cwd ?? cwd ?? null,\n activeTurnId: runningTurnId,\n turns: turns.map((turn) => surfaceTurn(turn)),\n turnIds: turns.map((turn) => turn.id),\n messages,\n busy: Boolean(runningTurnId),\n goal: goal ? { ...goal } : null,\n threadStatus: surfaceThreadStatus(response.thread.status),\n ...catalogs,\n ...sessionSelection(response, state.models, this.host.snapshotForRuntime(sourceRuntime)),\n });\n if (options.reasoningEffort) runtime.selectedReasoningEffort = options.reasoningEffort;\n if (options.serviceTier !== undefined) runtime.selectedServiceTier = options.serviceTier;\n if (options.model && requestedModel) runtime.selectedModelId = requestedModel.id;\n\n this.host.rememberHostOptions(response.thread.id, {\n ...hostOptions,\n ...(runtime.cwd ? { cwd: runtime.cwd } : {}),\n loadingStrategy: effectiveLoadingStrategy,\n historyItemsView,\n mcpServers,\n });\n const summary = { ...threadToSummary(response.thread), turnCount: turns.length };\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary);\n this.host.emitHistoryReplaced(response.thread.id);\n this.host.emitConversationActivity(response.thread.id);\n this.host.emitConversationSettings(response.thread.id);\n this.host.emitConversationSkills(response.thread.id);\n this.host.emitConversationPermissions(response.thread.id);\n if (historyItemsView === 'summary') this.host.hydrateOriginalImages?.(response.thread.id, response.thread.path);\n if (effectiveLoadingStrategy === 'eager' && initialPage.nextCursor !== null) {\n void this.host.hydrateCompleteHistory(response.thread.id).catch(() => undefined);\n }\n return response.thread.id;\n }\n\n async forkTurn(\n sourceThreadId: string,\n turnId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationLoadOptions = {},\n ): Promise<string> {\n const runtime = this.host.requireRuntime(sourceThreadId);\n if (!runtime.turnIds.includes(turnId)) {\n throw new Error(`Cannot fork at unknown Codex turn '${turnId}'`);\n }\n return this.fork(sourceThreadId, options, hostOptions, { lastTurnId: turnId });\n }\n}\n\nfunction forkApprovalSettings(\n options: ForkCodexConversationOptions,\n approvalPresets: readonly string[],\n): Pick<v2.ThreadForkParams, 'approvalPolicy' | 'approvalsReviewer' | 'permissions' | 'sandbox'> {\n if (options.approvalPreset) {\n if (!approvalPresets.includes(options.approvalPreset)) {\n throw new Error(`Approval preset '${options.approvalPreset}' is not available`);\n }\n return approvalPresetStartParams(options.approvalPreset);\n }\n return {\n ...(options.approvalMode === undefined\n ? {}\n : { approvalPolicy: options.approvalMode === 'ask' ? 'on-request' as const : 'never' as const }),\n ...(options.permissionMode === undefined\n ? {}\n : { sandbox: options.permissionMode === 'full-access' ? 'danger-full-access' as const : options.permissionMode }),\n };\n}\n","import { extname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { CodexAppServerClient } from '../codex/index';\nimport { codexImageDataUrl } from './codex-conversation-history';\n\ntype CodeBlockRange = { start: number; end: number };\ntype SourceReplacement = { start: number; end: number; value: string };\n\nconst markdownImageRegex = /(?<!\\[)!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+[\"']([^\"']*)[\"'])?\\)/g;\nconst supportedImageExtensions = new Set(['.avif', '.gif', '.jpeg', '.jpg', '.png', '.webp']);\n\n/**\n * Converts filesystem-backed Markdown images into renderer-safe data URLs.\n * The app-server owns the filesystem, so reading through fs/readFile works for\n * local, Electron, and remotely hosted Web surfaces without exposing paths to\n * the renderer.\n */\nexport class CodexMarkdownImageHydrator {\n constructor(private readonly client: CodexAppServerClient) {}\n\n async hydrate(content: string, cwd?: string | null): Promise<string> {\n const codeBlocks = findCodeBlocks(content);\n const replacements = await Promise.all(Array.from(content.matchAll(markdownImageRegex), async (match) => {\n const matchStart = match.index ?? 0;\n if (isInsideCodeBlock(matchStart, codeBlocks)) return null;\n const source = match[2]!;\n const path = localImagePath(source, cwd);\n if (!path) return null;\n\n try {\n const response = await this.client.request('fs/readFile', { path });\n const image = codexImageDataUrl(response.dataBase64);\n if (!image) return null;\n const sourceOffset = match[0].indexOf('](') + 2;\n return {\n start: matchStart + sourceOffset,\n end: matchStart + sourceOffset + source.length,\n value: image.url,\n } satisfies SourceReplacement;\n } catch {\n return null;\n }\n }));\n\n return applyReplacements(content, replacements.filter((item): item is SourceReplacement => item !== null));\n }\n}\n\nexport function localImagePath(source: string, cwd?: string | null): string | null {\n const value = source.trim();\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return null;\n\n let path: string;\n if (value.startsWith('file://')) {\n try {\n path = fileURLToPath(value);\n } catch {\n return null;\n }\n } else if (/^[a-z][a-z\\d+.-]*:/i.test(value)) {\n return null;\n } else {\n try {\n path = decodeURIComponent(value);\n } catch {\n return null;\n }\n }\n\n if (!supportedImageExtensions.has(extname(path).toLowerCase())) return null;\n if (isAbsolute(path)) return path;\n if (!cwd || !isAbsolute(cwd)) return null;\n const absolutePath = resolve(cwd, path);\n const relativePath = relative(cwd, absolutePath);\n if (relativePath === '..' || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)) {\n return null;\n }\n return absolutePath;\n}\n\nfunction applyReplacements(content: string, replacements: SourceReplacement[]): string {\n let hydrated = content;\n for (const replacement of replacements.sort((left, right) => right.start - left.start)) {\n hydrated = `${hydrated.slice(0, replacement.start)}${replacement.value}${hydrated.slice(replacement.end)}`;\n }\n return hydrated;\n}\n\nfunction findCodeBlocks(content: string): CodeBlockRange[] {\n const ranges: CodeBlockRange[] = [];\n const fenceRegex = /(^|\\n)(```|~~~)/g;\n let match: RegExpExecArray | null;\n\n while ((match = fenceRegex.exec(content)) !== null) {\n const fence = match[2]!;\n const prefix = match[1]!;\n const start = match.index + prefix.length;\n const closeRegex = new RegExp(`(^|\\\\n)${fence}`, 'g');\n closeRegex.lastIndex = start + fence.length;\n const close = closeRegex.exec(content);\n if (!close) {\n ranges.push({ start, end: content.length });\n break;\n }\n const end = close.index + close[1]!.length + fence.length;\n ranges.push({ start, end });\n fenceRegex.lastIndex = end;\n }\n\n return ranges;\n}\n\nfunction isInsideCodeBlock(index: number, ranges: CodeBlockRange[]): boolean {\n return ranges.some((range) => index >= range.start && index <= range.end);\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type { CodexConversationPromptHistory } from '@codex-app-sdk/core/surface';\nimport { normalizedConversationId } from './codex-surface-prompts';\n\nexport const CODEX_PROMPT_HISTORY_TURN_LIMIT = 100;\n\nconst contextTagRegex = /<context>[\\s\\S]*?<\\/context>\\s*/g;\nconst inAppBrowserContextTagRegex = /<in-app-browser-context(?:\\s[^>]*)?>[\\s\\S]*?<\\/in-app-browser-context>\\s*/g;\nconst ambientRequestHeadingRegex = /^[ \\t]*## My request for Codex:[ \\t]*$/m;\n\nexport async function readPromptHistory(\n client: CodexAppServerClient,\n conversationId: string,\n): Promise<CodexConversationPromptHistory> {\n const threadId = normalizedConversationId(conversationId);\n const response = await client.request('thread/turns/list', {\n threadId,\n cursor: null,\n limit: CODEX_PROMPT_HISTORY_TURN_LIMIT,\n sortDirection: 'desc',\n itemsView: 'summary',\n });\n return {\n conversationId: threadId,\n prompts: promptsFromSummaryTurns(response.data),\n };\n}\n\n/** Extracts only visible user-authored text without retaining the turn payload. */\nexport function promptsFromSummaryTurns(turns: readonly v2.Turn[]): string[] {\n return [...turns].reverse().flatMap((turn) => turn.items.flatMap((item) => {\n if (item.type !== 'userMessage') return [];\n const text = item.content\n .flatMap((input) => input.type === 'text' ? [input.text] : [])\n .join('');\n const prompt = stripPromptContext(text);\n return prompt && prompt !== '(no user instructions)' ? [prompt] : [];\n }));\n}\n\nfunction stripPromptContext(content: string): string {\n const withoutContext = content.replace(contextTagRegex, '');\n const withoutBrowserContext = withoutContext.replace(inAppBrowserContextTagRegex, '');\n return (withoutBrowserContext === withoutContext\n ? withoutBrowserContext\n : withoutBrowserContext.replace(ambientRequestHeadingRegex, ''))\n .trim();\n}\n","import { normalizeMcpServers, mcpServerConfig } from './codex-surface-mcp';\nimport type { CodexAppServerClient, ServerNotification, v2 } from '../codex/index';\nimport type { CodexSurfaceSnapshot } from '@codex-app-sdk/core/surface';\nimport type {\n CodexGeneratedText,\n GenerateCodexTextOptions,\n} from './codex-surface-contracts';\nimport {\n defaultReasoningEffort,\n requireCatalogModel,\n selectedModel,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\nimport { attachmentInput, validateAttachments } from './codex-surface-data';\n\nconst DEFAULT_GENERATION_TIMEOUT_MS = 120_000;\n\ntype PendingGeneration = {\n readonly promise: Promise<CodexGeneratedText>;\n readonly resolve: (result: CodexGeneratedText) => void;\n readonly reject: (error: Error) => void;\n readonly texts: string[];\n turnId: string | null;\n};\n\nexport type CodexSurfaceTextGenerationHost = {\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n};\n\n/** Runs isolated, non-persisted text turns without projecting them into surface state. */\nexport class CodexSurfaceTextGenerationController {\n private readonly hiddenThreadIds = new Set<string>();\n private readonly pendingByThread = new Map<string, PendingGeneration>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly defaultCwd: string | undefined,\n private readonly host: CodexSurfaceTextGenerationHost,\n ) {}\n\n /** Returns true when a notification belongs to an ephemeral thread and must stay hidden. */\n handleNotification(notification: ServerNotification): boolean {\n if (notification.method === 'thread/started' && notification.params.thread.ephemeral) {\n this.hiddenThreadIds.add(notification.params.thread.id);\n }\n const threadId = notificationThreadId(notification);\n if (!threadId || !this.hiddenThreadIds.has(threadId)) return false;\n\n const pending = this.pendingByThread.get(threadId);\n if (pending) this.consumeNotification(pending, notification);\n if (notification.method === 'thread/closed' || notification.method === 'thread/deleted') {\n this.hiddenThreadIds.delete(threadId);\n }\n return true;\n }\n\n async generate(prompt: string, options: GenerateCodexTextOptions = {}): Promise<CodexGeneratedText> {\n const text = prompt.trim();\n if (!text) throw new Error('Generation prompt cannot be empty');\n if (options.signal?.aborted) throw abortedError();\n if (options.attachments?.some(attachment => attachment.type !== 'image')) {\n throw new Error('Utility generation accepts image attachments only');\n }\n const attachments = validateAttachments(options.attachments ?? []);\n const servers = normalizeMcpServers(options.mcpServers ?? []);\n await this.host.ensureConnected();\n\n const state = this.host.getSnapshot();\n const currentModel = selectedModel(state.models, state.selectedModelId);\n const requestedModel = options.model ? requireCatalogModel(state.models, options.model) : currentModel;\n const model = requestedModel?.model;\n const reasoningEffort = options.reasoningEffort\n ?? (requestedModel?.id === currentModel?.id\n ? state.selectedReasoningEffort\n : requestedModel ? defaultReasoningEffort(requestedModel) : null)\n ?? undefined;\n const serviceTier = options.serviceTier !== undefined\n ? options.serviceTier\n : requestedModel?.id === currentModel?.id\n ? state.selectedServiceTier\n : requestedModel?.defaultServiceTier ?? null;\n validateReasoningEffort(requestedModel, reasoningEffort);\n validateServiceTier(requestedModel, serviceTier);\n\n const started = await this.client.request('thread/start', {\n approvalPolicy: 'never',\n approvalsReviewer: 'user',\n ...(options.baseInstructions === undefined ? {} : { baseInstructions: options.baseInstructions }),\n ...(options.developerInstructions === undefined\n ? {}\n : { developerInstructions: options.developerInstructions }),\n cwd: options.cwd ?? this.defaultCwd,\n dynamicTools: [],\n ...(servers.length ? { config: mcpServerConfig(servers) } : {}),\n ...(options.tools === 'read-only' ? {} : { environments: [] }),\n ephemeral: true,\n ...(model ? { model } : {}),\n permissions: ':read-only',\n serviceTier,\n serviceName: 'codex_app_sdk',\n threadSource: 'sdk_ephemeral_generation',\n });\n const threadId = started.thread.id;\n if (!started.thread.ephemeral) {\n await ignoreFailure(() => this.client.request('thread/delete', { threadId }));\n throw new Error('Codex app-server did not create an ephemeral generation thread');\n }\n this.hiddenThreadIds.add(threadId);\n if (options.signal?.aborted) {\n await ignoreFailure(() => this.client.request('thread/unsubscribe', { threadId }));\n this.hiddenThreadIds.delete(threadId);\n throw abortedError();\n }\n const pending = createPendingGeneration();\n this.pendingByThread.set(threadId, pending);\n let turnId: string | null = null;\n let completed = false;\n const abort = () => pending.reject(abortedError());\n options.signal?.addEventListener('abort', abort);\n const timeout = options.timeoutMs === null ? undefined : setTimeout(() => {\n pending.reject(new Error('Codex ephemeral generation timed out'));\n }, options.timeoutMs ?? DEFAULT_GENERATION_TIMEOUT_MS);\n\n try {\n const turnResponse = await this.client.request('turn/start', {\n threadId,\n input: [{ type: 'text', text, text_elements: [] }, ...attachments.map(attachmentInput)],\n ...(options.tools === 'read-only' ? {} : { environments: [] }),\n permissions: ':read-only',\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort as v2.TurnStartParams['effort'] } : {}),\n serviceTier,\n ...(options.outputSchema === undefined\n ? {}\n : { outputSchema: options.outputSchema as v2.TurnStartParams['outputSchema'] }),\n });\n turnId = turnResponse.turn.id;\n pending.turnId = turnId;\n completeFromTurn(pending, turnResponse.turn);\n const result = await pending.promise;\n completed = true;\n return result;\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n this.pendingByThread.delete(threadId);\n if (!completed && turnId) {\n const interruptedTurnId = turnId;\n await ignoreFailure(() => this.client.request('turn/interrupt', {\n threadId, turnId: interruptedTurnId,\n }));\n }\n await ignoreFailure(() => this.client.request('thread/unsubscribe', { threadId }));\n this.hiddenThreadIds.delete(threadId);\n }\n }\n\n close(error = new Error('Codex surface closed')): void {\n for (const pending of this.pendingByThread.values()) pending.reject(error);\n this.pendingByThread.clear();\n this.hiddenThreadIds.clear();\n }\n\n private consumeNotification(pending: PendingGeneration, notification: ServerNotification): void {\n if (notification.method === 'item/completed') {\n if (pending.turnId && notification.params.turnId !== pending.turnId) return;\n if (!pending.turnId) pending.turnId = notification.params.turnId;\n if (notification.params.item.type === 'agentMessage') {\n const text = notification.params.item.text.trim();\n if (text) pending.texts.push(text);\n }\n return;\n }\n if (notification.method === 'error') {\n if (pending.turnId && notification.params.turnId !== pending.turnId) return;\n if (!notification.params.willRetry) pending.reject(new Error(notification.params.error.message));\n return;\n }\n if (notification.method === 'turn/completed') {\n if (pending.turnId && notification.params.turn.id !== pending.turnId) return;\n completeFromTurn(pending, notification.params.turn);\n }\n }\n}\n\nasync function ignoreFailure(operation: () => Promise<unknown>): Promise<void> {\n try {\n await operation();\n } catch {\n // Best-effort cleanup must not replace the generation result or its original failure.\n }\n}\n\nfunction createPendingGeneration(): PendingGeneration {\n let resolvePromise!: (result: CodexGeneratedText) => void;\n let rejectPromise!: (error: Error) => void;\n const pending: PendingGeneration = {\n promise: new Promise<CodexGeneratedText>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n }),\n resolve: (result) => {\n resolvePromise(result);\n },\n reject: (error) => {\n rejectPromise(error);\n },\n texts: [],\n turnId: null,\n };\n // The turn/start RPC may still be in flight when an abort, disconnect, or\n // timeout rejects completion. Mark the promise handled until generate awaits it.\n void pending.promise.catch(() => undefined);\n return pending;\n}\n\nfunction completeFromTurn(pending: PendingGeneration, turn: v2.Turn): void {\n for (const item of turn.items) {\n if (item.type !== 'agentMessage') continue;\n const text = item.text.trim();\n if (text) pending.texts.push(text);\n }\n if (turn.status === 'failed') {\n pending.reject(new Error(turn.error?.message ?? 'Codex ephemeral generation failed'));\n return;\n }\n if (turn.status === 'interrupted') {\n pending.reject(new Error('Codex ephemeral generation was interrupted'));\n return;\n }\n if (turn.status !== 'completed') return;\n const text = pending.texts.at(-1);\n if (!text) {\n pending.reject(new Error('Codex ephemeral generation returned no text'));\n return;\n }\n pending.resolve({ text });\n}\n\nfunction notificationThreadId(notification: ServerNotification): string | null {\n if (notification.method === 'thread/started') return notification.params.thread.id;\n const params = notification.params as { threadId?: unknown };\n return typeof params.threadId === 'string' ? params.threadId : null;\n}\n\nfunction abortedError(): Error {\n return new Error('Codex ephemeral generation was aborted');\n}\n","import { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport { CodexOriginalHistoryUsage } from './codex-original-history-usage';\nimport { ConversationContentTransport } from './conversation-content-transport';\nimport {\n CodexAppServerClient,\n type ServerNotification,\n type v2,\n} from '../codex/index';\nimport { notifyListeners } from '../codex/listener-errors';\nimport type {\n CodexConversationSummary,\n CodexConversationEvent,\n CodexConversationHistory,\n CodexConversationHistoryPage,\n CodexConversationSnapshot,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceClientRequestResponse,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceModel,\n CodexSurfaceRateLimits,\n CodexSurfaceAccountUsage,\n ConsumeCodexRateLimitResetCreditOptions,\n CodexSurfaceRateLimitResetCreditResult,\n ReadCodexRateLimitsOptions,\n CodexSurfaceSnapshot,\n CodexSurfaceSkill,\n CreateCodexConversationOptions,\n ListCodexConversationsOptions,\n ListCodexModelsOptions,\n SendCodexMessageOptions,\n StartCodexRealtimeOptions,\n StartCodexLiveChatOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n UpdateCodexConversationSettings,\n CodexSurfaceStatePatch,\n CodexVersionedSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { diffCodexSurfaceState } from '@codex-app-sdk/core/surface-bridge';\nimport {\n CodexAppServerStdioTransport,\n} from './codex-stdio-transport';\nimport {\n CodexAppServerUnixSocketTransport,\n} from './codex-unix-socket-transport';\nimport {\n errorMessage,\n normalizedConversationId,\n} from './codex-surface-prompts';\nimport { startCodexRealtimeSession } from './codex-surface-realtime-session';\nimport type {\n CodexConversation,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexRealtimeSession,\n CodexSurfaceConfigRequirements,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n CodexGeneratedText,\n ForkCodexConversationOptions,\n GenerateCodexTextOptions,\n ListCodexSkillsOptions,\n} from './codex-surface-contracts';\nimport {\n initialSurfaceSnapshot,\n type ThreadRuntimePatch,\n type ThreadRuntimeState,\n} from './codex-surface-runtime';\nimport {\n initialAuthentication,\n surfaceAuthenticationIdentityKey,\n} from './codex-surface-authentication';\nimport { surfaceAccountUsage, surfaceRateLimits } from './codex-surface-data';\nimport {\n isUnixSocketTransportOptions,\n surfaceTransportOptions,\n} from './codex-surface-transport-options';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { createCodexConversationHandle } from './codex-conversation-handle';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport { CodexSurfaceConversationSettingsController } from './codex-surface-conversation-settings-controller';\nimport { CodexSurfaceTurnActionsController } from './codex-surface-turn-actions-controller';\nimport { CodexSurfaceMessagesController } from './codex-surface-messages-controller';\nimport { CodexSurfaceLifecycleController } from './codex-surface-lifecycle-controller';\nimport { CodexSurfaceNotificationsController } from './codex-surface-notifications-controller';\nimport { CodexSurfaceRuntimeController } from './codex-surface-runtime-controller';\nimport { CodexSurfaceConnectionController } from './codex-surface-connection-controller';\nimport { CodexSurfaceForkController } from './codex-surface-fork-controller';\nimport { CodexMarkdownImageHydrator } from './codex-markdown-images';\nimport {\n readPromptHistory,\n} from './codex-surface-prompt-history';\nimport { CodexSurfaceTextGenerationController } from './codex-surface-text-generation-controller';\nimport { CodexSurfaceUsageController } from './codex-surface-usage-controller';\n\nexport type {\n CodexAppServerTransportOptions,\n CodexConversation,\n CodexConversationDefaults,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexDynamicTool,\n CodexDynamicToolCall,\n CodexDynamicToolContent,\n CodexDynamicToolResult,\n CodexRealtimeSession,\n CodexSurfaceConfigRequirements,\n CodexSurfaceExtension,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClient,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n CodexThreadStartExtension,\n CodexGeneratedText,\n ForkCodexConversationOptions,\n GenerateCodexTextOptions,\n ListCodexSkillsOptions,\n} from './codex-surface-contracts';\n\nexport type {\n CodexMcpServerDefinition,\n CodexMcpServerTransport,\n CodexMcpServerToolApprovalMode,\n} from './codex-surface-mcp';\n\ntype StateListener = (snapshot: CodexSurfaceSnapshot) => void;\ntype StatePatchListener = (patch: CodexSurfaceStatePatch) => void;\ntype ConversationStateListener = (snapshot: CodexConversationSnapshot) => void;\ntype SurfaceEventListener = (event: CodexSurfaceEvent) => void;\ntype ConversationEventListener = (event: CodexConversationEvent) => void;\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport class CodexSurface {\n private readonly client: CodexAppServerClient;\n private readonly listeners = new Set<StateListener>();\n private readonly patchListeners = new Set<StatePatchListener>();\n private stateVersion = 0;\n private readonly eventListeners = new Set<SurfaceEventListener>();\n private readonly conversationListeners = new Map<string, Set<ConversationStateListener>>();\n private readonly conversationHandles = new Map<string, CodexConversation>();\n private readonly extensions: CodexSurfaceExtensionsController;\n private readonly authentication: CodexSurfaceAuthenticationController;\n private readonly items: CodexSurfaceItemsController;\n private readonly clientRequests: CodexSurfaceClientRequestsController;\n private readonly catalog: CodexSurfaceCatalogController;\n private readonly approvals: CodexSurfaceApprovalsController;\n private readonly conversations: CodexSurfaceConversationsController;\n private readonly conversationSettings: CodexSurfaceConversationSettingsController;\n private readonly turnActions: CodexSurfaceTurnActionsController;\n private readonly messagesController: CodexSurfaceMessagesController;\n private readonly lifecycle: CodexSurfaceLifecycleController;\n private readonly originalImages?: CodexOriginalHistoryImages;\n private readonly originalUsage?: CodexOriginalHistoryUsage;\n private readonly usageRefreshes = new Map<string, { again: boolean }>();\n private readonly forks: CodexSurfaceForkController;\n private readonly notifications: CodexSurfaceNotificationsController;\n private readonly runtimeState: CodexSurfaceRuntimeController;\n private readonly markdownImages: CodexMarkdownImageHydrator;\n private readonly connection: CodexSurfaceConnectionController;\n private readonly textGeneration: CodexSurfaceTextGenerationController;\n private readonly unsubscribeDisconnect: () => void;\n private readonly unsubscribeNotification: () => void;\n private readonly unsubscribeToolInputRequests: () => void;\n private readonly unsubscribeMcpElicitationRequests: () => void;\n private eventSequence = 0;\n private readonly usage = new CodexSurfaceUsageController();\n private accountGeneration = 0;\n private readonly pendingMarkdownImageHydrations = new Set<string>();\n private closed = false;\n private state: CodexSurfaceSnapshot = initialSurfaceSnapshot(initialAuthentication());\n\n constructor(private readonly options: CodexSurfaceOptions = {}) {\n this.extensions = new CodexSurfaceExtensionsController(\n options.extensions ?? [],\n options.mcpServers ?? [],\n (threadId) => this.lifecycle.hostOptions(threadId),\n );\n const transportOptions = surfaceTransportOptions(options);\n this.client = options.client ?? new CodexAppServerClient(\n isUnixSocketTransportOptions(transportOptions)\n ? new CodexAppServerUnixSocketTransport(transportOptions)\n : new CodexAppServerStdioTransport(transportOptions),\n options.onListenerError ? { onListenerError: options.onListenerError } : {},\n );\n this.originalImages = options.originalHistoryImages ? new CodexOriginalHistoryImages(this.client) : undefined;\n this.originalUsage = options.originalHistoryUsage ? new CodexOriginalHistoryUsage(this.client) : undefined;\n this.markdownImages = new CodexMarkdownImageHydrator(this.client);\n this.authentication = new CodexSurfaceAuthenticationController(this.client, {\n bootstrapSurfaceData: (force) => this.connection.bootstrapSurfaceData(force),\n clearAuthenticatedSurfaceData: () => this.connection.clearAuthenticatedSurfaceData(),\n getSnapshot: () => this.getSnapshot(),\n patchAuthentication: (patch, origin) => this.connection.patchAuthentication(patch, origin),\n reportError: (error) => this.patch({ error: errorMessage(error) }),\n });\n this.items = new CodexSurfaceItemsController({\n assistantMessageForTurn: (threadId, turnId) => this.assistantMessageForTurn(threadId, turnId),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n getState: () => this.state,\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n messageContainingTool: (threadId, turnId, itemId) => (\n this.messageContainingTool(threadId, turnId, itemId)\n ),\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n sendNextQueuedPrompt: (threadId) => { void this.messagesController.sendNextQueuedPrompt(threadId); },\n });\n this.approvals = new CodexSurfaceApprovalsController(this.client, {\n activeConversationId: () => this.state.activeConversationId,\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n maybeClearWaitingBusy: (threadId) => this.clientRequests.maybeClearWaitingBusy(threadId),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status) => this.patchConversationStatus(threadId, status),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n });\n this.clientRequests = new CodexSurfaceClientRequestsController({\n activeConversationId: () => this.state.activeConversationId,\n answerAsyncQuestion: (threadId, prompt, displayText) => (\n this.messagesController.answerAsyncQuestion(threadId, prompt, displayText)\n ),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n hasPendingApproval: (threadId) => this.approvals.hasForThread(threadId),\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n messageContainingTool: (threadId, turnId, itemId) => (\n this.messageContainingTool(threadId, turnId, itemId)\n ),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n });\n this.runtimeState = new CodexSurfaceRuntimeController(\n this.approvals,\n this.clientRequests,\n {\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n getState: () => this.state,\n notifyConversationListeners: (threadId) => this.notifyConversationListeners(threadId),\n patch: (patch, conversationId) => this.patch(patch, conversationId),\n schedulePluginRefresh: () => this.catalog.schedulePluginRefresh(),\n },\n );\n this.conversationSettings = new CodexSurfaceConversationSettingsController(\n this.client,\n {\n approvalMode: options.approvalMode,\n approvalPreset: options.approvalPreset,\n permissionMode: options.permissionMode,\n },\n {\n createConversation: async () => { await this.createConversation(); },\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n );\n this.turnActions = new CodexSurfaceTurnActionsController(this.client, {\n createConversation: async () => { await this.createConversation(); },\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n loadTurnHistory: (threadId, turnId) => this.conversations.loadTurnHistory(threadId, turnId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n hydrateCompleteHistory: (threadId, options) => this.conversations.hydrateCompleteHistory(threadId, options),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count, origin) => this.patchConversationTurnCount(threadId, count, origin),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n sendMessageToThread: (threadId, prompt, options) => this.messagesController.sendToThread(threadId, prompt, options),\n });\n this.messagesController = new CodexSurfaceMessagesController(this.client, {\n clearGoalForThread: (threadId) => this.conversationSettings.clearGoalForThread(threadId),\n compactForThread: (threadId) => this.turnActions.compactForThread(threadId),\n createConversation: async () => { await this.createConversation(); },\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n ensureConnected: () => this.ensureConnected(),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count, origin) => this.patchConversationTurnCount(threadId, count, origin),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n setGoal: (objective) => this.conversationSettings.setGoal(objective),\n setGoalForThread: (threadId, objective) => this.conversationSettings.setGoalForThread(threadId, objective),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n startReview: (options) => this.turnActions.startReview(options),\n startReviewForThread: (threadId, options) => this.turnActions.startReviewForThread(threadId, options),\n updateSettings: (settings) => this.conversationSettings.update(settings),\n updateSettingsForThread: (threadId, settings) => this.conversationSettings.updateForThread(threadId, settings),\n });\n this.catalog = new CodexSurfaceCatalogController(this.client, options.cwd, {\n authenticationBlocksBootstrap: () => this.authentication.blocksBootstrap(),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n ensureConnected: () => this.ensureConnected(),\n getState: () => this.state,\n isClosed: () => this.closed,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n preferredApprovalPreset: () => this.conversationSettings.preferredApprovalPreset(),\n runtimes: () => this.runtimeState.values(),\n });\n this.conversations = new CodexSurfaceConversationsController(\n this.client,\n options.conversationLimit,\n {\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitHistoryPrepended: (threadId, messages, origin) => this.emitHistoryPrepended(threadId, messages, origin),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n removeThread: (threadId, reason, origin) => this.removeThread(threadId, reason, origin),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n schedulePluginRefresh: (force) => this.catalog.schedulePluginRefresh(force),\n },\n this.originalImages,\n );\n this.lifecycle = new CodexSurfaceLifecycleController(\n this.client,\n options,\n this.catalog,\n this.extensions,\n this.conversationSettings,\n this.conversations,\n {\n activateRuntime: (runtime) => this.activateRuntime(runtime),\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitConversationPermissions: (threadId, origin) => this.emitConversationPermissions(threadId, origin),\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitSelected: (conversationId) => this.emitEvent('action', {\n type: 'conversation.selected',\n payload: { conversationId },\n }),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n observeEmptyConversation: (threadId) => this.usage.observeEmptyConversation(threadId),\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n runtimeProjection: (runtime) => this.runtimeProjection(runtime),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n this.originalImages,\n );\n this.forks = new CodexSurfaceForkController(\n this.client,\n options.loadingStrategy,\n this.catalog,\n this.extensions,\n {\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId) => this.emitConversationActivity(threadId, 'action'),\n emitConversationPermissions: (threadId) => this.emitConversationPermissions(threadId, 'action'),\n emitConversationSettings: (threadId) => this.emitConversationSettings(threadId, 'action'),\n emitConversationSkills: (threadId) => this.emitConversationSkills(threadId, 'action'),\n emitHistoryReplaced: (threadId) => this.emitHistoryReplaced(threadId, 'fork', 'action'),\n emitSummaryUpserted: (summary) => this.emitSummaryUpserted(summary, 'created', 'action'),\n getState: () => this.state,\n hydrateOriginalImages: (threadId, path) => this.conversations.hydrateOriginalImages(threadId, path),\n hydrateCompleteHistory: (threadId) => this.conversations.hydrateCompleteHistory(threadId),\n patch: (patch) => this.patch(patch),\n rememberHostOptions: (threadId, hostOptions) => (\n this.lifecycle.rememberHostOptions(threadId, hostOptions)\n ),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n this.originalImages,\n );\n this.connection = new CodexSurfaceConnectionController(\n this.client,\n options,\n this.authentication,\n this.approvals,\n this.catalog,\n this.clientRequests,\n this.conversations,\n this.items,\n this.lifecycle,\n this.runtimeState,\n {\n clearConversationHandles: () => this.conversationHandles.clear(),\n clearPendingForThread: (threadId, reason, eventReason) => (\n this.clearPendingForThread(threadId, reason, eventReason)\n ),\n closed: () => this.closed,\n emitAuthenticationChanged: (authentication, origin) => this.emitEvent(origin, {\n type: 'authentication.changed',\n payload: { authentication: structuredClone(authentication) },\n }),\n emitSurfaceStatus: (origin) => this.emitSurfaceStatus(origin),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n },\n );\n this.notifications = new CodexSurfaceNotificationsController(\n this.authentication,\n this.approvals,\n this.catalog,\n this.clientRequests,\n this.conversations,\n this.items,\n {\n clearPendingForThread: (threadId, reason, eventReason) => (\n this.clearPendingForThread(threadId, reason, eventReason)\n ),\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitConversationPermissions: (threadId, origin) => this.emitConversationPermissions(threadId, origin),\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n getState: () => this.state,\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count) => this.patchConversationTurnCount(threadId, count),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n removeThread: (threadId, reason) => this.removeThread(threadId, reason),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n runtimes: () => this.runtimeState.values(),\n sendNextQueuedPrompt: (threadId) => { void this.messagesController.sendNextQueuedPrompt(threadId); },\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n unknownNotification: (notification) => this.handleUnknownNotification(notification),\n },\n );\n this.textGeneration = new CodexSurfaceTextGenerationController(\n this.client,\n options.cwd,\n {\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n },\n );\n this.unsubscribeNotification = this.client.onNotification((notification) => {\n if (notification.method === 'account/updated' || notification.method === 'account/login/completed') {\n this.accountGeneration += 1;\n this.clearUsage();\n }\n if (!this.textGeneration.handleNotification(notification)) this.notifications.handle(notification);\n });\n this.unsubscribeDisconnect = this.client.onDisconnect((error) => {\n this.accountGeneration += 1;\n this.clearUsage();\n this.textGeneration.close(error);\n this.connection.handleDisconnect(error);\n });\n this.unsubscribeToolInputRequests = this.client.onServerRequest(\n 'item/tool/requestUserInput',\n (request, responder) => this.clientRequests.handleToolInputRequest(request, responder),\n );\n this.unsubscribeMcpElicitationRequests = this.client.onServerRequest(\n 'mcpServer/elicitation/request',\n (request, responder) => this.clientRequests.handleMcpElicitationRequest(request, responder),\n );\n this.client.onServerRequest('item/tool/call', async (request, responder) => {\n await this.extensions.handleDynamicToolCall(request, responder);\n });\n this.client.onServerRequest('account/chatgptAuthTokens/refresh', (_request, responder) => {\n responder.reject({ code: -32601, message: 'ChatGPT token refresh must be provided by the host application' });\n });\n this.client.onServerRequest('attestation/generate', (_request, responder) => {\n responder.reject({ code: -32601, message: 'Client attestation must be provided by the host application' });\n });\n this.client.onServerRequest('currentTime/read', (_request, responder) => {\n responder.resolve({ currentTimeAt: Math.floor(Date.now() / 1000) });\n });\n }\n\n connect(): Promise<CodexSurfaceSnapshot> {\n return this.connection.connect();\n }\n\n /** Runs one non-persisted Codex turn without changing visible surface state. */\n generateText(prompt: string, options: GenerateCodexTextOptions = {}): Promise<CodexGeneratedText> {\n return this.textGeneration.generate(prompt, options);\n }\n\n async refreshAccount(): Promise<CodexSurfaceSnapshot> {\n this.accountGeneration += 1;\n return this.connection.refreshAccount();\n }\n\n /** Reads fresh account limits; errors leave the last successful snapshot intact. */\n async readRateLimits(options?: ReadCodexRateLimitsOptions): Promise<CodexSurfaceRateLimits> {\n return this.requestForAccount(() => this.client.request('account/rateLimits/read', options), response => {\n const rateLimits = surfaceRateLimits(response);\n this.patch({ rateLimits });\n this.emitEvent('action', { type: 'rateLimits.changed', payload: { rateLimits: structuredClone(rateLimits) } });\n return structuredClone(rateLimits);\n });\n }\n\n /** Account-wide, on-demand usage; never collects thread estimates or changes surface state. */\n async readAccountUsage(): Promise<CodexSurfaceAccountUsage> {\n return this.requestForAccount(() => this.client.request('account/usage/read', {}), surfaceAccountUsage);\n }\n\n /** One explicit reset attempt; never retries or infers refreshed limits. */\n async consumeRateLimitResetCredit(options: ConsumeCodexRateLimitResetCreditOptions): Promise<CodexSurfaceRateLimitResetCreditResult> {\n if (!options || typeof options.idempotencyKey !== 'string' || !options.idempotencyKey.trim()\n || (options.creditId !== undefined && (typeof options.creditId !== 'string' || !options.creditId.trim()))) {\n throw new TypeError('Reset-credit options require non-empty identifiers');\n }\n const params = { idempotencyKey: options.idempotencyKey,\n ...(options.creditId === undefined ? {} : { creditId: options.creditId }) };\n return this.requestForAccount(() => this.client.request('account/rateLimitResetCredit/consume', params), result => {\n switch (result?.outcome) {\n case 'reset': case 'alreadyRedeemed': case 'nothingToReset': case 'noCredit':\n return { outcome: result.outcome };\n default: throw new Error('Invalid reset-credit outcome');\n }\n });\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n this.accountGeneration += 1;\n return this.connection.startChatGptLogin();\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n this.accountGeneration += 1;\n return this.connection.startChatGptDeviceCodeLogin();\n }\n\n /** Reads the app-server's current remote-control connection state. */\n async readRemoteControlStatus(): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.readRemoteControlStatus();\n }\n\n /** Enables the app-server's official remote-control connection. */\n async enableRemoteControl(\n options: v2.RemoteControlEnableParams = {},\n ): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.enableRemoteControl(options);\n }\n\n /** Disables the app-server's official remote-control connection. */\n async disableRemoteControl(\n options: v2.RemoteControlDisableParams = {},\n ): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.disableRemoteControl(options);\n }\n\n /** Starts a one-time remote-control pairing flow. Treat the returned code as opaque. */\n async startRemoteControlPairing(\n options: v2.RemoteControlPairingStartParams = {},\n ): Promise<CodexSurfaceRemoteControlPairing> {\n return this.connection.startRemoteControlPairing(options);\n }\n\n /** Checks whether a remote-control pairing code has been claimed. */\n async readRemoteControlPairingStatus(\n options: v2.RemoteControlPairingStatusParams = {},\n ): Promise<CodexSurfaceRemoteControlPairingStatus> {\n return this.connection.readRemoteControlPairingStatus(options);\n }\n\n /** Lists devices paired with a remote-control environment. */\n async listRemoteControlClients(\n options: v2.RemoteControlClientsListParams,\n ): Promise<CodexSurfaceRemoteControlClientPage> {\n return this.connection.listRemoteControlClients(options);\n }\n\n /** Revokes one device from a remote-control environment. */\n async revokeRemoteControlClient(\n options: v2.RemoteControlClientsRevokeParams,\n ): Promise<v2.RemoteControlClientsRevokeResponse> {\n return this.connection.revokeRemoteControlClient(options);\n }\n\n /** Reads managed app-server requirements, including allowRemoteControl. */\n async readConfigRequirements(): Promise<CodexSurfaceConfigRequirements | null> {\n return this.connection.readConfigRequirements();\n }\n\n async cancelLogin(loginId = this.state.authentication.login.loginId ?? ''): Promise<CodexSurfaceSnapshot> {\n return this.connection.cancelLogin(loginId);\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n this.accountGeneration += 1;\n return this.connection.logout();\n }\n\n\n async refreshConversations(): Promise<CodexSurfaceSnapshot> {\n return this.conversations.refresh();\n }\n\n async listConversations(options: ListCodexConversationsOptions = {}): Promise<CodexConversationSummary[]> {\n return this.conversations.list(options);\n }\n\n /** Reads one conversation's metadata without loading its turns or runtime. */\n async readConversationSummary(conversationId: string): Promise<CodexConversationSummary> {\n return this.conversations.readSummary(conversationId);\n }\n\n async archiveConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.archive(conversationId);\n }\n\n async deleteConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.delete(conversationId);\n }\n\n async unarchiveConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.unarchive(conversationId);\n }\n\n async listModels(options: ListCodexModelsOptions = {}): Promise<CodexSurfaceModel[]> {\n return this.catalog.listModels(options);\n }\n\n async listSkills(options: ListCodexSkillsOptions = {}): Promise<CodexSurfaceSkill[]> {\n return this.catalog.listSkills(options);\n }\n\n async createConversation(\n options: CreateCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n return this.lifecycle.create(options, hostOptions);\n }\n\n /** Forks the latest completed source conversation without selecting the new conversation. */\n async forkConversation(\n sourceConversationId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexConversationForkResult> {\n const sourceThreadId = normalizedConversationId(sourceConversationId);\n await this.ensureThreadReady(sourceThreadId);\n const inheritedHostOptions = this.lifecycle.hostOptions(sourceThreadId) ?? {};\n const conversationId = await this.forks.fork(sourceThreadId, options, {\n ...inheritedHostOptions,\n ...hostOptions,\n });\n return this.conversationForkResult(conversationId);\n }\n\n /** Forks after a completed turn without selecting the new conversation. */\n async forkConversationAtTurn(\n sourceConversationId: string,\n turnId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexConversationForkResult> {\n const sourceThreadId = normalizedConversationId(sourceConversationId);\n await this.ensureThreadReady(sourceThreadId);\n const inheritedHostOptions = this.lifecycle.hostOptions(sourceThreadId) ?? {};\n const conversationId = await this.forks.forkTurn(sourceThreadId, turnId, options, {\n ...inheritedHostOptions,\n ...hostOptions,\n });\n return this.conversationForkResult(conversationId);\n }\n\n async selectConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.lifecycle.select(conversationId);\n }\n\n /**\n * Releases one conversation from this surface's in-memory state without\n * changing the corresponding app-server thread. The summary remains in the\n * conversation catalog; `conversation(id).load()` or `readHistory()` can\n * hydrate it again later.\n */\n forgetConversation(conversationId: string): void {\n const threadId = normalizedConversationId(conversationId);\n const wasActive = this.state.activeConversationId === threadId;\n this.runtimeState.forget(threadId);\n this.lifecycle.forget(threadId);\n this.originalImages?.forget(threadId);\n this.conversations.forget(threadId);\n this.items.forget(threadId);\n this.conversationHandles.delete(threadId);\n this.conversationListeners.delete(threadId);\n if (!wasActive) return;\n this.patch({\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n answeredClientRequestIds: [],\n approvals: [],\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n historyState: {\n loadingStrategy: 'lazy',\n hasOlder: false,\n loadingOlder: false,\n fullyLoaded: false,\n },\n error: null,\n });\n }\n\n /** Main-process content reader. Every read is bound to the current runtime. */\n async readConversationContent(conversationId: string, contentId: string, offset: number) {\n if (!/^[a-f0-9]{64}$/.test(contentId) || !Number.isSafeInteger(offset) || offset < 0) throw new Error('Invalid conversation content request.');\n const runtime = this.runtimeState.get(conversationId);\n if (!runtime?.hydrated || this.closed) throw new Error('Conversation content is no longer available.');\n const reference = `conversation-image:${encodeURIComponent(conversationId)}:${contentId}`;\n const owns = () => !this.closed && this.runtimeState.get(conversationId) === runtime && runtime.messages.some(m => m.parts.some(p => p.type === 'media' && p.media.url === reference));\n if (this.originalImages && owns()) {\n const result = await this.originalImages.read(conversationId, contentId, offset);\n if (!owns()) throw new Error('Conversation content is no longer available.');\n return result;\n }\n return new ConversationContentTransport(conversationId).read({ messages: runtime.messages }, contentId, offset);\n }\n\n async readConversationHistory(conversationId = this.state.activeConversationId ?? ''): Promise<CodexConversationHistory> {\n return this.lifecycle.readHistory(conversationId);\n }\n\n /** Reads a bounded user-only prompt list without hydrating conversation history. */\n async readConversationPromptHistory(\n conversationId = this.state.activeConversationId ?? '',\n ) {\n await this.ensureConnected();\n return readPromptHistory(this.client, conversationId);\n }\n\n async loadTurnHistory(turnId: string, conversationId = this.state.activeConversationId ?? ''): Promise<CodexConversationSnapshot> {\n await this.ensureThreadReady(conversationId);\n await this.conversations.loadTurnHistory(conversationId, turnId);\n return this.getConversationSnapshot(conversationId);\n }\n\n async loadOlderConversationHistory(\n conversationId = this.state.activeConversationId ?? '',\n ): Promise<CodexConversationHistoryPage> {\n return this.conversations.loadOlderHistory(normalizedConversationId(conversationId));\n }\n\n async renameConversation(title: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.state.activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n await this.conversationSettings.rename(threadId, title);\n return this.getSnapshot();\n }\n\n async updateConversationSettings(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.update(settings);\n }\n\n async setGoal(objective: string, tokenBudget?: number | null): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.setGoal(objective, tokenBudget);\n }\n\n async clearGoal(): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.clearGoal();\n }\n\n async sendMessage(prompt: string, options: SendCodexMessageOptions = {}): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.send(prompt, options);\n }\n\n async continueInterruptedTurn(): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.continueInterruptedTurn();\n }\n\n async compactConversation(): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.compact();\n }\n\n async startReview(options: StartCodexReviewOptions = {}): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.startReview(options);\n }\n\n async steerMessage(\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.steer(prompt, options);\n }\n\n async interrupt(): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.interrupt();\n }\n\n async deleteTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.deleteTurn(turnId);\n }\n\n async editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.editTurn(turnId, content, options);\n }\n\n async retryTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.retryTurn(turnId);\n }\n\n /** Forks after an active-conversation turn and selects the new conversation. */\n async forkTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const conversationId = this.state.activeConversationId;\n if (!conversationId) throw new Error('There is no active conversation');\n const result = await this.forkConversationAtTurn(conversationId, turnId);\n return result.conversation.select();\n }\n\n async deleteQueuedPrompt(promptId: string): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.deleteQueuedPrompt(promptId);\n }\n\n async updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.updateQueuedPrompt(promptId, prompt, options);\n }\n\n async steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.steerQueuedPrompt(promptId, prompt, options);\n }\n\n async respondToClientRequest(response: CodexSurfaceClientRequestResponse): Promise<CodexSurfaceSnapshot> {\n await this.clientRequests.respond(undefined, response);\n return this.getSnapshot();\n }\n\n async resolveApproval(\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope = 'once',\n ): Promise<CodexSurfaceSnapshot> {\n await this.approvals.resolve(undefined, approvalId, decision, scope);\n return this.getSnapshot();\n }\n\n conversation(conversationId: string): CodexConversation {\n const id = normalizedConversationId(conversationId);\n const existing = this.conversationHandles.get(id);\n if (existing) return existing;\n const handle = createCodexConversationHandle(id, {\n clearGoal: () => this.conversationSettings.clearGoalForThread(id),\n compact: () => this.turnActions.compactForThread(id),\n continueInterruptedTurn: () => this.messagesController.continueInterruptedTurnForThread(id),\n deleteTurn: (turnId) => this.turnActions.deleteTurnForThread(id, turnId),\n deleteQueuedPrompt: (promptId) => this.messagesController.deleteQueuedPromptForThread(id, promptId),\n updateQueuedPrompt: (promptId, prompt, options) => this.messagesController.updateQueuedPromptForThread(id, promptId, prompt, options),\n editTurn: (turnId, content, options) => this.turnActions.editTurnForThread(id, turnId, content, options),\n fork: (options, hostOptions) => this.forkConversation(id, options, hostOptions),\n forkTurn: (turnId, options, hostOptions) => (\n this.forkConversationAtTurn(id, turnId, options, hostOptions)\n ),\n getSnapshot: () => this.getConversationSnapshot(id),\n interrupt: () => this.turnActions.interruptThread(id),\n load: async (options) => { await this.ensureThreadReady(id, options); },\n loadOlderHistory: () => this.loadOlderConversationHistory(id),\n loadTurnHistory: async (turnId) => { await this.loadTurnHistory(turnId, id); },\n onEvent: (listener) => this.onConversationEvent(id, listener),\n onStateChange: (listener) => this.onConversationStateChange(id, listener),\n readHistory: () => this.readConversationHistory(id),\n readContent: (contentId, offset) => this.readConversationContent(id, contentId, offset),\n readPromptHistory: () => this.readConversationPromptHistory(id),\n rename: (title) => this.conversationSettings.rename(id, title),\n resolveApproval: (approvalId, decision, scope = 'once') => (\n this.approvals.resolve(id, approvalId, decision, scope)\n ),\n respondToClientRequest: (response) => this.clientRequests.respond(id, response),\n retryTurn: (turnId) => this.turnActions.retryTurnForThread(id, turnId),\n select: async () => { await this.selectConversation(id); },\n sendMessage: (prompt, options) => this.messagesController.sendToThread(id, prompt, options),\n setGoal: (objective, tokenBudget) => this.conversationSettings.setGoalForThread(id, objective, tokenBudget),\n startRealtime: (options) => this.startRealtimeForThread(id, options),\n startReview: (options) => this.turnActions.startReviewForThread(id, options),\n steerMessage: (prompt, options) => this.messagesController.steerForThread(id, prompt, options),\n steerQueuedPrompt: (promptId, prompt, options) => this.messagesController.steerQueuedPromptForThread(id, promptId, prompt, options),\n updateSettings: (settings) => this.conversationSettings.updateForThread(id, settings),\n });\n this.conversationHandles.set(id, handle);\n return handle;\n }\n\n async startLiveChat(\n conversationId: string,\n options: StartCodexLiveChatOptions,\n ): Promise<{ sdp: string }> {\n const { sdp, ...settings } = options;\n const session = await this.startRealtimeForThread(conversationId, {\n ...settings,\n version: settings.version ?? 'v3',\n outputModality: 'audio',\n transport: { type: 'webrtc', sdp },\n });\n return { sdp: session.remoteSdp! };\n }\n\n async stopLiveChat(conversationId: string): Promise<void> {\n await this.client.request('thread/realtime/stop', { threadId: conversationId });\n }\n\n private startRealtimeForThread(\n threadId: string,\n options: StartCodexRealtimeOptions,\n ): Promise<CodexRealtimeSession> {\n return startCodexRealtimeSession({\n client: this.client,\n ensureThreadReady: async () => { await this.ensureThreadReady(threadId); },\n onConversationEvent: (listener) => this.onConversationEvent(threadId, listener),\n options,\n threadId,\n });\n }\n\n private conversationForkResult(conversationId: string): CodexConversationForkResult {\n const conversation = this.conversation(conversationId);\n return {\n conversationId,\n conversation,\n snapshot: conversation.getSnapshot(),\n };\n }\n\n getConversationSnapshot(conversationId: string): CodexConversationSnapshot {\n const runtime = this.requireRuntime(conversationId);\n return structuredClone({\n ...this.state,\n activeConversationId: conversationId,\n ...this.runtimeProjection(runtime),\n activeTurnId: runtime.activeTurnId,\n turnIds: runtime.turnIds,\n });\n }\n\n onConversationStateChange(conversationId: string, listener: ConversationStateListener): () => void {\n const listeners = this.conversationListeners.get(conversationId) ?? new Set<ConversationStateListener>();\n listeners.add(listener);\n this.conversationListeners.set(conversationId, listeners);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) this.conversationListeners.delete(conversationId);\n };\n }\n\n onConversationEvent(conversationId: string, listener: ConversationEventListener): () => void {\n return this.onEvent((event) => {\n if ('conversationId' in event && event.conversationId === conversationId) {\n listener(event as CodexConversationEvent);\n }\n });\n }\n\n getSnapshot(): CodexSurfaceSnapshot {\n return structuredClone(this.state);\n }\n\n onStateChange(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /** Returns the current snapshot with the version that the next state patch continues from. */\n getVersionedSnapshot(): CodexVersionedSurfaceSnapshot {\n return { version: this.stateVersion, snapshot: this.getSnapshot() };\n }\n\n /**\n * Streams structural state patches. Each patch carries only changed values\n * and list items, so its size tracks what changed rather than conversation\n * length. Start from `getVersionedSnapshot()` and apply patches in order.\n */\n onStatePatch(listener: StatePatchListener): () => void {\n this.patchListeners.add(listener);\n return () => this.patchListeners.delete(listener);\n }\n\n onEvent(listener: SurfaceEventListener): () => void {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.originalImages?.clear();\n this.clearUsage();\n this.unsubscribeNotification();\n this.unsubscribeToolInputRequests();\n this.unsubscribeMcpElicitationRequests();\n this.unsubscribeDisconnect();\n this.approvals.close();\n this.clientRequests.clear();\n this.items.reset();\n this.catalog.reset(false);\n this.textGeneration.close();\n for (const runtime of this.runtimeState.values()) {\n runtime.activeTurnId = null;\n runtime.busy = false;\n runtime.turnStartPending = false;\n }\n await this.client.close();\n this.patch({\n status: 'idle',\n activeTurnId: null,\n busy: false,\n approvals: [],\n clientRequests: [],\n historyLoading: false,\n });\n this.emitSurfaceStatus('lifecycle');\n }\n\n private async ensureConnected(): Promise<void> {\n return this.connection.ensureConnected();\n }\n\n private async ensureThreadReady(\n threadId: string,\n loadOptions: CodexConversationLoadOptions = {},\n ): Promise<ThreadRuntimeState> {\n return this.lifecycle.ensureReady(threadId, loadOptions);\n }\n\n private createRuntime(threadId: string, patch: ThreadRuntimePatch = {}): ThreadRuntimeState {\n const runtime = this.runtimeState.create(threadId, patch);\n if (patch.messages) this.scheduleMarkdownImageHydration(threadId, patch.messages);\n return runtime;\n }\n\n private requireRuntime(threadId: string): ThreadRuntimeState {\n return this.runtimeState.require(threadId);\n }\n\n private runtimeProjection(\n runtime: ThreadRuntimeState,\n ): ReturnType<CodexSurfaceRuntimeController['projection']> {\n return this.runtimeState.projection(runtime);\n }\n\n private snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot {\n return this.runtimeState.snapshot(runtime);\n }\n\n private activateRuntime(runtime: ThreadRuntimeState): void {\n this.runtimeState.activate(runtime);\n }\n\n private patchRuntime(threadId: string, patch: ThreadRuntimePatch): void {\n this.runtimeState.patch(threadId, patch);\n if (patch.messages) this.scheduleMarkdownImageHydration(threadId, patch.messages);\n }\n\n private scheduleMarkdownImageHydration(\n threadId: string,\n messages: readonly SurfaceMessage[],\n ): void {\n const cwd = this.runtimeState.get(threadId)?.cwd;\n for (const message of messages) {\n if (message.role !== 'assistant' || message.status === 'streaming') continue;\n message.parts.forEach((part, partIndex) => {\n if (part.type !== 'text' || !part.text.includes('![')) return;\n const key = `${threadId}\\u0000${message.id}\\u0000${part.itemId ?? partIndex}\\u0000${part.text}`;\n if (this.pendingMarkdownImageHydrations.has(key)) return;\n this.pendingMarkdownImageHydrations.add(key);\n void this.markdownImages.hydrate(part.text, cwd).then(async (hydratedText) => {\n if (this.closed || hydratedText === part.text) return;\n const runtime = this.runtimeState.get(threadId);\n if (!runtime) return;\n const messageIndex = runtime.messages.findIndex((candidate) => candidate.id === message.id);\n const currentMessage = runtime.messages[messageIndex];\n if (!currentMessage) return;\n const currentPart = currentMessage.parts[partIndex];\n if (currentPart?.type !== 'text' || currentPart.text !== part.text) return;\n const nextParts = [...currentMessage.parts];\n nextParts.splice(partIndex, 1, { ...currentPart, text: hydratedText });\n const hydratedMessage = { ...currentMessage, parts: nextParts };\n const nextMessages = [...runtime.messages];\n nextMessages.splice(messageIndex, 1, hydratedMessage);\n this.runtimeState.patch(threadId, { messages: nextMessages });\n\n await this.conversations.waitForHistoryEmission(threadId);\n if (this.closed) return;\n const currentRuntime = this.runtimeState.get(threadId);\n const publishedMessage = currentRuntime?.messages.find((candidate) => candidate.id === message.id);\n if (!publishedMessage) return;\n const publishedPart = publishedMessage.parts[partIndex];\n if (publishedPart?.type !== 'text' || publishedPart.text !== hydratedText) return;\n if (publishedMessage.turnId) this.emitEvent('lifecycle', {\n type: 'message.updated',\n conversationId: threadId,\n turnId: publishedMessage.turnId,\n payload: { message: structuredClone(publishedMessage) },\n });\n }).finally(() => this.pendingMarkdownImageHydrations.delete(key));\n });\n }\n }\n\n private emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitSurfaceStatus(origin);\n }\n\n private emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitSummaryUpserted(summary, reason, origin);\n }\n\n private emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationActivity(threadId, origin);\n }\n\n private emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationSettings(threadId, origin);\n }\n\n private emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationSkills(threadId, origin);\n }\n\n private emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationPermissions(threadId, origin);\n }\n\n private emitHistoryReplaced(\n threadId: string,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.historyReplaced' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitHistoryReplaced(threadId, reason, origin);\n }\n\n private emitHistoryPrepended(\n threadId: string,\n messages: readonly SurfaceMessage[],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitHistoryPrepended(threadId, messages, origin);\n }\n\n private messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null {\n return this.runtimeState.messageContainingTool(threadId, turnId, itemId);\n }\n\n private assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null {\n return this.runtimeState.assistantMessageForTurn(threadId, turnId);\n }\n\n private notifyConversationListeners(threadId: string): void {\n const listeners = this.conversationListeners.get(threadId);\n if (!listeners) return;\n const snapshot = this.getConversationSnapshot(threadId);\n notifyListeners(listeners, snapshot, this.options.onListenerError);\n }\n\n private markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void {\n this.runtimeState.markTurnActive(runtime, turnId);\n }\n\n private patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n this.runtimeState.patchConversationStatus(threadId, status, origin);\n }\n\n private patchConversationTurnCount(\n threadId: string,\n turnCount: number,\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n this.runtimeState.patchConversationTurnCount(threadId, turnCount, origin);\n }\n\n private clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'conversation_closed' | 'conversation_removed' | 'surface_disconnected',\n ): void {\n this.approvals.clearForThread(threadId, eventReason);\n this.clientRequests.clearForThread(threadId, reason, eventReason);\n }\n\n private removeThread(\n threadId: string,\n reason: 'archived' | 'deleted',\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const known = this.state.conversations.some((conversation) => conversation.id === threadId)\n || this.runtimeState.get(threadId) !== undefined\n || this.approvals.hasForThread(threadId)\n || this.clientRequests.hasForThread(threadId);\n if (!known) return;\n this.clearPendingForThread(threadId, 'Codex thread is no longer available', 'conversation_removed');\n this.runtimeState.forget(threadId);\n this.lifecycle.forget(threadId);\n this.originalImages?.forget(threadId);\n this.conversations.forget(threadId);\n this.conversationHandles.delete(threadId);\n const conversations = this.state.conversations.filter((conversation) => conversation.id !== threadId);\n if (this.state.activeConversationId !== threadId) {\n this.patch({ conversations });\n this.emitEvent(origin, {\n type: 'conversation.summaryRemoved',\n conversationId: threadId,\n payload: { reason },\n });\n return;\n }\n this.patch({\n conversations,\n activeConversationId: null,\n messages: [],\n answeredClientRequestIds: [],\n approvals: [],\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n error: null,\n });\n this.emitEvent(origin, {\n type: 'conversation.summaryRemoved',\n conversationId: threadId,\n payload: { reason },\n });\n this.emitEvent(origin, {\n type: 'conversation.selected',\n payload: { conversationId: null },\n });\n }\n\n\n private handleUnknownNotification(notification: ServerNotification): void {\n const runtimeNotification = notification as unknown as { method: string; params?: unknown };\n this.options.onUnknownNotification?.({\n method: runtimeNotification.method,\n ...('params' in runtimeNotification ? { params: runtimeNotification.params } : {}),\n });\n }\n\n\n private async requestForAccount<Response, Result>(\n request: () => Promise<Response>, project: (response: Response) => Result,\n ): Promise<Result> {\n await this.ensureConnected();\n await this.authentication.pendingRefresh();\n const generation = this.accountGeneration;\n const identity = surfaceAuthenticationIdentityKey(this.state.authentication);\n const result = await request();\n if (this.closed || generation !== this.accountGeneration\n || identity !== surfaceAuthenticationIdentityKey(this.state.authentication)) {\n throw new Error('Account changed during account operation');\n }\n return project(result);\n }\n\n private emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput, recovered = false): void {\n if (input.type === 'conversation.historyReplaced' && input.payload.reason !== 'details' && input.payload.reason !== 'images') {\n this.originalUsage?.forget(input.conversationId);\n }\n input = this.usage.observe(origin, input);\n if (input.type === 'turn.started' && origin !== 'lifecycle') {\n const runtime = this.runtimeState.get(input.conversationId);\n const turnId = input.turnId;\n const startedAt = input.payload.startedAt;\n if (runtime?.turns.some(turn => turn.id === turnId && turn.startedAt === null)) {\n this.patchRuntime(input.conversationId, {\n turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, startedAt } : turn),\n });\n }\n }\n if (input.type === 'conversation.executionUsageChanged' || input.type === 'turn.completed') {\n const runtime = this.runtimeState.get(input.conversationId);\n const executionUsage = input.type === 'turn.completed' ? input.payload.executionUsage : input.payload.usage;\n const turnId = input.turnId;\n if (runtime?.turns.some(turn => turn.id === turnId)) {\n this.patchRuntime(input.conversationId, {\n turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, executionUsage: structuredClone(executionUsage) } : turn),\n });\n }\n }\n const event = {\n ...input,\n seq: ++this.eventSequence,\n occurredAt: new Date().toISOString(),\n origin,\n } as CodexSurfaceEvent;\n notifyListeners(this.eventListeners, event, this.options.onListenerError);\n if (!recovered && (input.type === 'conversation.executionUsageChanged' || input.type === 'turn.completed' || input.type === 'context.compactionCompleted')) {\n void this.refreshOriginalUsage(input.conversationId, input.turnId);\n }\n }\n\n private clearUsage(): void {\n this.usage.clear();\n this.originalUsage?.clear();\n }\n\n private async refreshOriginalUsage(conversationId: string, turnId: string): Promise<void> {\n if (!this.originalUsage || this.closed) return;\n const key = `${conversationId}\\0${turnId}`;\n const pending = this.usageRefreshes.get(key);\n if (pending) { pending.again = true; return; }\n const work = { again: true };\n const generation = this.accountGeneration;\n this.usageRefreshes.set(key, work);\n try {\n while (work.again && !this.closed && generation === this.accountGeneration) {\n work.again = false;\n try {\n const records = await this.originalUsage.read(conversationId);\n if (this.closed || generation !== this.accountGeneration) return;\n const record = records.find(value => value.turnId === turnId);\n if (!record) continue;\n const usage = this.usage.recover(conversationId, turnId, record);\n if (usage) this.emitEvent('action', { type: 'conversation.executionUsageChanged', conversationId, turnId, payload: { usage } }, true);\n } catch { /* Optional native evidence never interrupts execution or invents a measurement. */ }\n }\n } finally { this.usageRefreshes.delete(key); }\n }\n\n private patch(patch: Partial<CodexSurfaceSnapshot>, conversationId?: string): void {\n const previous = this.state;\n this.state = { ...this.state, ...patch };\n const changes = diffCodexSurfaceState(previous, this.state);\n if (changes.length > 0) {\n this.stateVersion += 1;\n if (this.patchListeners.size > 0) {\n const statePatch = structuredClone({ version: this.stateVersion, changes });\n notifyListeners(this.patchListeners, statePatch, this.options.onListenerError);\n }\n }\n if (this.listeners.size > 0) {\n const snapshot = this.getSnapshot();\n notifyListeners(this.listeners, snapshot, this.options.onListenerError);\n }\n if (conversationId) {\n this.notifyConversationListeners(conversationId);\n return;\n }\n for (const subscribedConversationId of this.conversationListeners.keys()) {\n this.notifyConversationListeners(subscribedConversationId);\n }\n }\n}\n\nexport function createCodexSurface(options: CodexSurfaceOptions = {}): CodexSurface {\n return new CodexSurface(options);\n}\n","export type CodexAppBackendTtlCacheEvictionContext = {\n readonly id: string;\n readonly lastActivityAt: number;\n readonly now: number;\n readonly idleForMs: number;\n};\n\nexport type CodexAppBackendTtlCacheRecord<Value> = {\n readonly value: Value;\n readonly lastActivityAt: number;\n};\n\nexport type CodexAppBackendTtlTimer = {\n unref?: () => void;\n};\n\nexport type CodexAppBackendTtlCacheScheduler = {\n set(callback: () => void, delayMs: number): CodexAppBackendTtlTimer;\n clear(timer: CodexAppBackendTtlTimer): void;\n};\n\nexport type CodexAppBackendTtlCacheOptions<Value> = {\n /** Time without a newer activity touch before an entry becomes eligible. */\n ttlMs: number;\n /** Enables periodic sweeps. Omit it to use manual `sweep()` calls only. */\n sweepIntervalMs?: number | null;\n identity: (value: Value) => string;\n canEvict: (value: Value, context: CodexAppBackendTtlCacheEvictionContext) => boolean | Promise<boolean>;\n onEvict: (value: Value, context: CodexAppBackendTtlCacheEvictionContext) => void | Promise<void>;\n now?: () => number;\n scheduler?: CodexAppBackendTtlCacheScheduler;\n onEvictionError?: (\n error: unknown,\n value: Value,\n context: CodexAppBackendTtlCacheEvictionContext,\n ) => void | Promise<void>;\n};\n\ntype TtlCacheRecord<Value> = {\n value: Value;\n lastActivityAt: number;\n};\n\nconst defaultScheduler: CodexAppBackendTtlCacheScheduler = {\n set(callback, delayMs) {\n return setTimeout(callback, delayMs) as unknown as CodexAppBackendTtlTimer;\n },\n clear(timer) {\n clearTimeout(timer as unknown as ReturnType<typeof setTimeout>);\n },\n};\n\n/**\n * Host-owned cache metadata with an optional, unref'd periodic eviction loop.\n * The cache never decides whether an entry is safe to remove; `canEvict` and\n * `onEvict` remain application-owned policies and storage operations.\n */\nexport class CodexAppBackendTtlCache<Value> {\n private readonly records = new Map<string, TtlCacheRecord<Value>>();\n private readonly now: () => number;\n private readonly scheduler: CodexAppBackendTtlCacheScheduler;\n private readonly sweepIntervalMs: number | null;\n private timer: CodexAppBackendTtlTimer | null = null;\n private activeSweep: Promise<readonly string[]> | null = null;\n private closePromise: Promise<void> | null = null;\n private closed = false;\n\n constructor(private readonly options: CodexAppBackendTtlCacheOptions<Value>) {\n if (!Number.isFinite(options.ttlMs) || options.ttlMs <= 0) {\n throw new Error('Codex backend cache ttlMs must be greater than zero');\n }\n if (options.sweepIntervalMs !== undefined && options.sweepIntervalMs !== null\n && (!Number.isFinite(options.sweepIntervalMs) || options.sweepIntervalMs <= 0)) {\n throw new Error('Codex backend cache sweepIntervalMs must be greater than zero');\n }\n this.now = options.now ?? Date.now;\n this.scheduler = options.scheduler ?? defaultScheduler;\n this.sweepIntervalMs = options.sweepIntervalMs ?? null;\n }\n\n get size(): number {\n return this.records.size;\n }\n\n set(value: Value, activityAt = this.now()): string {\n this.assertOpen();\n const id = this.requireIdentity(value);\n const previous = this.records.get(id);\n this.records.set(id, {\n value,\n lastActivityAt: previous ? Math.max(previous.lastActivityAt, activityAt) : activityAt,\n });\n this.schedule();\n return id;\n }\n\n get(id: string): Value | undefined {\n return this.records.get(id)?.value;\n }\n\n getRecord(id: string): CodexAppBackendTtlCacheRecord<Value> | undefined {\n const record = this.records.get(id);\n return record\n ? { value: record.value, lastActivityAt: record.lastActivityAt }\n : undefined;\n }\n\n touch(id: string, activityAt = this.now()): boolean {\n this.assertOpen();\n const record = this.records.get(id);\n if (!record) return false;\n record.lastActivityAt = Math.max(record.lastActivityAt, activityAt);\n return true;\n }\n\n delete(id: string): boolean {\n this.assertOpen();\n const deleted = this.records.delete(id);\n if (this.records.size === 0) this.clearTimer();\n return deleted;\n }\n\n async sweep(): Promise<readonly string[]> {\n if (this.closed) return [];\n if (this.activeSweep) return this.activeSweep;\n const sweep = this.evictExpired();\n this.activeSweep = sweep;\n try {\n return await sweep;\n } finally {\n this.activeSweep = null;\n this.schedule();\n }\n }\n\n async close(): Promise<void> {\n if (!this.closePromise) {\n this.closed = true;\n this.clearTimer();\n this.closePromise = Promise.resolve(this.activeSweep).then(() => undefined);\n }\n await this.closePromise;\n }\n\n private async evictExpired(): Promise<readonly string[]> {\n const now = this.now();\n const evicted: string[] = [];\n for (const [id, record] of [...this.records.entries()]) {\n const idleForMs = now - record.lastActivityAt;\n if (idleForMs < this.options.ttlMs) continue;\n const context: CodexAppBackendTtlCacheEvictionContext = {\n id,\n lastActivityAt: record.lastActivityAt,\n now,\n idleForMs,\n };\n let safeToEvict: boolean;\n try {\n safeToEvict = await this.options.canEvict(record.value, context);\n } catch (error) {\n await this.reportEvictionError(error, record.value, context);\n continue;\n }\n if (!safeToEvict || this.records.get(id) !== record) continue;\n try {\n await this.options.onEvict(record.value, context);\n } catch (error) {\n await this.reportEvictionError(error, record.value, context);\n continue;\n }\n if (this.records.get(id) === record) {\n this.records.delete(id);\n evicted.push(id);\n }\n }\n return evicted;\n }\n\n private schedule(): void {\n if (this.closed || this.timer || this.records.size === 0 || this.sweepIntervalMs === null) return;\n this.timer = this.scheduler.set(() => {\n this.timer = null;\n void this.sweep();\n }, this.sweepIntervalMs);\n this.timer.unref?.();\n }\n\n private clearTimer(): void {\n if (!this.timer) return;\n this.scheduler.clear(this.timer);\n this.timer = null;\n }\n\n private async reportEvictionError(\n error: unknown,\n value: Value,\n context: CodexAppBackendTtlCacheEvictionContext,\n ): Promise<void> {\n const onEvictionError = this.options.onEvictionError;\n if (!onEvictionError) return;\n try {\n await onEvictionError(error, value, context);\n } catch {\n // Error reporting must not strand the periodic eviction loop.\n }\n }\n\n private requireIdentity(value: Value): string {\n const id = this.options.identity(value);\n if (!id.trim()) throw new Error('Codex backend cache identities cannot be empty');\n return id;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error('Codex backend cache is closed');\n }\n}\n","import { CodexSurface } from './codex-surface';\nimport {\n CodexAppBackendTtlCache,\n type CodexAppBackendTtlCacheOptions,\n} from './codex-app-backend-cache';\nimport type { CodexSurfaceOptions } from './codex-surface-contracts';\n\nexport type CodexAppBackendModuleContext = {\n surface: CodexSurface;\n closeBackend(): Promise<void>;\n createTtlCache<Value>(options: CodexAppBackendTtlCacheOptions<Value>): CodexAppBackendTtlCache<Value>;\n};\n\nexport type CodexAppBackendModule<Service = unknown> = {\n id: string;\n create(context: CodexAppBackendModuleContext): Service;\n};\n\nexport type CodexAppBackendOptions = {\n modules?: readonly CodexAppBackendModule[];\n surface?: CodexSurface;\n surfaceOptions?: CodexSurfaceOptions;\n};\n\n/**\n * Composable, in-process backend host for Codex applications.\n *\n * The SDK owns the product-neutral Codex runtime while modules own application\n * services such as agents, teams, or work integrations. Transport and process\n * ownership stay with the embedding application.\n */\nexport class CodexAppBackend {\n readonly surface: CodexSurface;\n private readonly moduleServices = new Map<string, unknown>();\n private readonly ttlCaches = new Set<{ close(): Promise<void> }>();\n private closePromise: Promise<void> | null = null;\n\n constructor(options: CodexAppBackendOptions = {}) {\n if (options.surface && options.surfaceOptions) {\n throw new Error('Provide either surface or surfaceOptions, not both');\n }\n const modules = (options.modules ?? []).map((module) => ({ id: module.id.trim(), module }));\n const moduleIds = new Set<string>();\n for (const { id } of modules) {\n if (!id) throw new Error('Codex backend module IDs cannot be empty');\n if (moduleIds.has(id)) throw new Error(`Duplicate Codex backend module '${id}'`);\n moduleIds.add(id);\n }\n this.surface = options.surface ?? new CodexSurface(options.surfaceOptions);\n for (const { id, module } of modules) {\n this.moduleServices.set(id, module.create({\n surface: this.surface,\n closeBackend: () => this.close(),\n createTtlCache: (cacheOptions) => this.createTtlCache(cacheOptions),\n }));\n }\n }\n\n module<Service>(id: string): Service {\n const normalizedId = id.trim();\n if (!this.moduleServices.has(normalizedId)) throw new Error(`Unknown Codex backend module '${normalizedId}'`);\n return this.moduleServices.get(normalizedId) as Service;\n }\n\n createTtlCache<Value>(options: CodexAppBackendTtlCacheOptions<Value>): CodexAppBackendTtlCache<Value> {\n if (this.closePromise) throw new Error('Cannot create a cache after the Codex backend is closed');\n const cache = new CodexAppBackendTtlCache(options);\n this.ttlCaches.add(cache);\n return cache;\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.closeResources();\n return this.closePromise;\n }\n\n private async closeResources(): Promise<void> {\n await Promise.all([...this.ttlCaches].map((cache) => cache.close()));\n await this.surface.close();\n }\n}\n\nexport function createCodexAppBackend(options: CodexAppBackendOptions = {}): CodexAppBackend {\n return new CodexAppBackend(options);\n}\n","import { spawn as nodeSpawn } from 'node:child_process';\nimport { existsSync as nodeExistsSync } from 'node:fs';\nimport { promises as nodeFs } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type AppleSpeechTranscriptionOptions = {\n locale?: string;\n live?: boolean;\n};\n\nexport type AppleSpeechTranscriptionResult = {\n text: string;\n error?: string;\n};\n\nexport type AppleSpeechAssetDiscoveryDependencies = {\n cwd?: () => string;\n env?: NodeJS.ProcessEnv;\n existsSync?: (filePath: string) => boolean;\n moduleUrl?: string | null;\n packageResolve?: ((specifier: string) => string) | null;\n resourcesPath?: string | null;\n};\n\ntype AppleSpeechFs = {\n chmod(filePath: string, mode: number): Promise<void>;\n copyFile(sourcePath: string, destinationPath: string): Promise<void>;\n mkdtemp(prefix: string): Promise<string>;\n readFile(filePath: string, encoding: BufferEncoding): Promise<string>;\n rm(filePath: string, options: { recursive: boolean; force: boolean }): Promise<void>;\n writeFile(filePath: string, data: Buffer): Promise<void>;\n};\n\ntype AppleSpeechChild = {\n stderr?: {\n on(event: 'data', listener: (chunk: Buffer | string) => void): unknown;\n };\n on(event: 'error', listener: (error: Error) => void): unknown;\n on(event: 'exit', listener: (code: number | null) => void): unknown;\n};\n\ntype AppleSpeechSpawn = (command: string, args: string[]) => AppleSpeechChild;\n\ntype AppleSpeechTranscriptionDeps = {\n assetsPath?: string;\n fs?: AppleSpeechFs;\n spawn?: AppleSpeechSpawn;\n tmpdir?: () => string;\n};\n\nexport async function transcribeWithAppleSpeechAnalyzer(\n audioData: Buffer,\n options: AppleSpeechTranscriptionOptions = {},\n deps: AppleSpeechTranscriptionDeps = {},\n): Promise<AppleSpeechTranscriptionResult> {\n const fs = deps.fs ?? nodeFs;\n const spawn = deps.spawn ?? nodeSpawn;\n const tmpdir = deps.tmpdir ?? os.tmpdir;\n const tempDir = await fs.mkdtemp(path.join(tmpdir(), 'codex-app-sdk-apple-stt-'));\n const inputPath = path.join(tempDir, 'input.wav');\n const outputPath = path.join(tempDir, 'output.txt');\n\n try {\n const bundledCliPath = resolveAppleSpeechAnalyzerPath(deps.assetsPath);\n const cliPath = await executableAppleSpeechPath(bundledCliPath, tempDir, fs);\n await fs.writeFile(inputPath, audioData);\n await runAppleSpeechCli(spawn, cliPath, buildAppleSpeechArgs(inputPath, outputPath, options));\n const text = await fs.readFile(outputPath, 'utf8');\n\n return { text: text.trim() };\n } catch (error) {\n return {\n text: '',\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nexport function resolveAppleSpeechAnalyzerPath(\n assetsPath?: string,\n dependencies: AppleSpeechAssetDiscoveryDependencies = {},\n): string {\n return path.join(assetsPath ?? defaultAssetsPath(dependencies), 'apple-speechanalyzer-cli');\n}\n\nfunction buildAppleSpeechArgs(\n inputPath: string,\n outputPath: string,\n options: AppleSpeechTranscriptionOptions,\n): string[] {\n const args = [\n '--input-audio-path',\n inputPath,\n '--output-txt-path',\n outputPath,\n ];\n\n const locale = options.locale?.trim();\n if (locale) {\n args.push('--locale', locale);\n }\n\n if (options.live) {\n args.push('--live');\n }\n\n return args;\n}\n\nfunction runAppleSpeechCli(\n spawn: AppleSpeechSpawn,\n cliPath: string,\n args: string[],\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cliPath, args);\n let stderr = '';\n\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on('error', (error: Error) => {\n reject(new Error(`Failed to spawn Apple speech CLI: ${error.message}`));\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`Apple speech CLI exited with code ${code}: ${stderr.trim()}`));\n });\n });\n}\n\nfunction defaultAssetsPath(dependencies: AppleSpeechAssetDiscoveryDependencies): string {\n const configuredAssetsPath = (dependencies.env ?? process.env).CODEX_APP_SDK_ASSETS_PATH?.trim();\n if (configuredAssetsPath) {\n return configuredAssetsPath;\n }\n\n const processResourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath;\n const resourcesPath = dependencies.resourcesPath === undefined\n ? processResourcesPath\n : dependencies.resourcesPath ?? undefined;\n const existsSync = dependencies.existsSync ?? nodeExistsSync;\n if (resourcesPath && !resourcesPath.endsWith('.vite/build')) {\n const resourceCandidates = [\n resourcesPath,\n path.join(resourcesPath, 'assets'),\n path.join(resourcesPath, 'app.asar.unpacked/node_modules/@codex-app-sdk/backend/assets'),\n path.join(resourcesPath, 'app.asar/node_modules/@codex-app-sdk/backend/assets'),\n path.join(resourcesPath, 'app.asar.unpacked/node_modules/codex-app-sdk/assets'),\n path.join(resourcesPath, 'app.asar/node_modules/codex-app-sdk/assets'),\n ];\n const match = resourceCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n ));\n if (match) return match;\n }\n\n const defaultPackageResolver = import.meta.resolve;\n const packageResolver = dependencies.packageResolve === undefined\n ? defaultPackageResolver\n : dependencies.packageResolve ?? undefined;\n if (packageResolver) {\n try {\n const packageNodeEntry = fileURLToPath(packageResolver('@codex-app-sdk/backend'));\n const packageAssetsPath = path.resolve(path.dirname(packageNodeEntry), '../assets');\n if (existsSync(path.join(packageAssetsPath, 'apple-speechanalyzer-cli'))) {\n return packageAssetsPath;\n }\n } catch {\n // Source checkouts fall through to module-relative candidates.\n }\n }\n\n const cwd = (dependencies.cwd ?? process.cwd)();\n const cwdCandidates = [\n path.resolve(cwd, 'node_modules/@codex-app-sdk/backend/assets'),\n path.resolve(cwd, '../node_modules/@codex-app-sdk/backend/assets'),\n path.resolve(cwd, 'node_modules/codex-app-sdk/assets'),\n path.resolve(cwd, '../node_modules/codex-app-sdk/assets'),\n path.resolve(cwd, '../codex-app-sdk/assets'),\n ];\n const cwdMatch = cwdCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n ));\n if (cwdMatch) return cwdMatch;\n\n const defaultModuleUrl = import.meta.url;\n const moduleUrl = dependencies.moduleUrl === undefined\n ? defaultModuleUrl\n : dependencies.moduleUrl ?? undefined;\n const moduleDirectory = moduleUrl\n ? path.dirname(fileURLToPath(moduleUrl))\n : cwd;\n const moduleCandidates = [\n path.resolve(moduleDirectory, '../assets'),\n path.resolve(moduleDirectory, '../../assets'),\n ];\n return moduleCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n )) ?? moduleCandidates[0]!;\n}\n\nasync function executableAppleSpeechPath(\n sourcePath: string,\n tempDir: string,\n fs: AppleSpeechFs,\n): Promise<string> {\n const executablePath = path.join(tempDir, 'apple-speechanalyzer-cli');\n await fs.copyFile(sourcePath, executablePath);\n await fs.chmod(executablePath, 0o700);\n return executablePath;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { mkdtemp, copyFile, chmod, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { StringDecoder } from 'node:string_decoder';\nimport type { CodexSpeechSessionEvent, CodexSpeechSessionOptions, CodexSpeechTranscriptionResult } from '@codex-app-sdk/core/native';\nimport { resolveAppleSpeechAnalyzerPath } from './apple-speech-transcription';\n\nexport type AppleSpeechSession = {\n append(audio: ArrayBuffer): Promise<void>;\n stop(): Promise<CodexSpeechTranscriptionResult>;\n cancel(): Promise<void>;\n};\n\nexport async function startAppleSpeechSession(\n options: CodexSpeechSessionOptions,\n onEvent: (event: CodexSpeechSessionEvent) => void,\n dependencies: { assetsPath?: string; signal?: AbortSignal; spawn?: (command: string, args: string[]) => ChildProcessWithoutNullStreams } = {},\n): Promise<AppleSpeechSession> {\n dependencies.signal?.throwIfAborted();\n if (!Number.isInteger(options.sampleRate) || options.sampleRate < 8000 || options.sampleRate > 96000) {\n throw new Error('Unsupported speech sample rate.');\n }\n const temp = await mkdtemp(path.join(tmpdir(), 'codex-sdk-live-speech-'));\n let child: ChildProcessWithoutNullStreams;\n try {\n const executable = path.join(temp, 'apple-speechanalyzer-cli');\n await copyFile(resolveAppleSpeechAnalyzerPath(dependencies.assetsPath), executable);\n await chmod(executable, 0o700);\n dependencies.signal?.throwIfAborted();\n child = (dependencies.spawn ?? spawn)(executable, ['--stream', '--sample-rate', String(options.sampleRate),\n ...(options.locale ? ['--locale', options.locale] : [])]);\n } catch (error) {\n await rm(temp, { recursive: true, force: true });\n throw error;\n }\n let closed = false;\n let stopping = false;\n let result: CodexSpeechTranscriptionResult | undefined;\n let line = '';\n const decoder = new StringDecoder('utf8');\n let stderr = '';\n let readyResolve!: () => void;\n let readyReject!: (error: Error) => void;\n const ready = new Promise<void>((resolve, reject) => { readyResolve = resolve; readyReject = reject; });\n let resolveDone!: (result: CodexSpeechTranscriptionResult) => void;\n const done = new Promise<CodexSpeechTranscriptionResult>((resolve) => { resolveDone = resolve; });\n let timeout = setTimeout(() => fail('Speech recognition took too long to start.'), 120_000);\n const finish = async () => {\n if (closed) return;\n closed = true;\n clearTimeout(timeout);\n dependencies.signal?.removeEventListener('abort', abort);\n const final = result ?? { text: '', error: stderr.trim() || 'Speech helper stopped without a final transcript.' };\n readyReject(new Error(final.error ?? 'Speech session closed.'));\n try { await rm(temp, { recursive: true, force: true }); }\n finally { resolveDone(final); }\n };\n function fail(message: string): void {\n if (closed || result?.error) return;\n result = { text: '', error: message };\n readyReject(new Error(message));\n publish({ type: 'error', sessionId: options.sessionId, error: message });\n child.kill('SIGKILL');\n void finish();\n }\n function publish(event: CodexSpeechSessionEvent): void {\n try { onEvent(event); } catch { /* A disconnected consumer cannot prevent process cleanup. */ }\n }\n function abort(): void {\n if (closed) return;\n result = { text: '', error: 'Speech recording cancelled.' };\n child.kill('SIGKILL');\n void finish();\n }\n dependencies.signal?.addEventListener('abort', abort, { once: true });\n child.stderr.on('data', (chunk: Buffer) => { stderr = (stderr + chunk.toString()).slice(-4096); });\n child.on('error', (error) => fail(error.message));\n child.stdin.on('error', (error) => fail(error.message));\n child.on('close', (code) => {\n if (code !== 0 && !result?.error) {\n fail(stderr.trim() || `Speech helper exited with code ${code}.`);\n }\n void finish();\n });\n child.stdout.on('data', (chunk: Buffer) => {\n if (closed) return;\n line += decoder.write(chunk);\n if (line.length > 1024 * 1024) { fail('Speech helper result exceeds the size limit.'); return; }\n let index: number;\n while ((index = line.indexOf('\\n')) >= 0 && !closed) {\n const input = line.slice(0, index);\n line = line.slice(index + 1);\n try {\n const event = JSON.parse(input);\n if (event.type === 'ready') { clearTimeout(timeout); readyResolve(); }\n else if (event.type === 'transcript' && typeof event.finalText === 'string' && typeof event.partialText === 'string') {\n publish({ type: 'transcript', sessionId: options.sessionId, finalText: event.finalText, partialText: event.partialText });\n } else if (event.type === 'done' && typeof event.text === 'string') result = { text: event.text };\n else if (event.type === 'error' && typeof event.message === 'string') fail(event.message);\n else fail('Invalid speech helper event.');\n } catch { fail('Invalid speech helper output.'); }\n }\n });\n if (dependencies.signal?.aborted) abort();\n await ready;\n return {\n append: (audio) => new Promise<void>((resolve, reject) => {\n if (closed || stopping) { reject(new Error('Speech session is no longer recording.')); return; }\n if (audio.byteLength % 4 || audio.byteLength > 256 * 1024) { reject(new Error('Invalid PCM audio chunk.')); return; }\n child.stdin.write(Buffer.from(audio), (error) => error ? reject(error) : resolve());\n }),\n stop: () => {\n if (!closed && !stopping) {\n stopping = true;\n timeout = setTimeout(() => fail('Speech recognition took too long to finalize.'), 30_000);\n child.stdin.end();\n }\n return done;\n },\n cancel: async () => {\n if (!closed) {\n result = { text: '', error: 'Speech recording cancelled.' };\n child.kill('SIGKILL');\n await finish();\n }\n },\n };\n}\n"],"x_google_ignoreList":[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["SIZE_HEADER","getImageSize"],"sources":["../src/node/codex-executable.ts","../src/node/codex-stdio-transport.ts","../src/node/codex-unix-socket-transport.ts","../src/node/codex-file-attachment.ts","../src/node/tool-output.ts","../src/node/codex-tool-part-adapter.ts","../src/node/codex-surface-prompts.ts","../src/node/codex-surface-message-state.ts","../src/node/codex-conversation-history.ts","../../../node_modules/image-size/dist/esm/types/utils.js","../../../node_modules/image-size/dist/esm/types/bmp.js","../../../node_modules/image-size/dist/esm/types/ico.js","../../../node_modules/image-size/dist/esm/types/cur.js","../../../node_modules/image-size/dist/esm/types/dds.js","../../../node_modules/image-size/dist/esm/types/gif.js","../../../node_modules/image-size/dist/esm/types/heif.js","../../../node_modules/image-size/dist/esm/types/icns.js","../../../node_modules/image-size/dist/esm/types/j2c.js","../../../node_modules/image-size/dist/esm/types/jp2.js","../../../node_modules/image-size/dist/esm/types/jpg.js","../../../node_modules/image-size/dist/esm/utils/bit-reader.js","../../../node_modules/image-size/dist/esm/types/jxl-stream.js","../../../node_modules/image-size/dist/esm/types/jxl.js","../../../node_modules/image-size/dist/esm/types/ktx.js","../../../node_modules/image-size/dist/esm/types/png.js","../../../node_modules/image-size/dist/esm/types/pnm.js","../../../node_modules/image-size/dist/esm/types/psd.js","../../../node_modules/image-size/dist/esm/types/svg.js","../../../node_modules/image-size/dist/esm/types/tga.js","../../../node_modules/image-size/dist/esm/types/tiff.js","../../../node_modules/image-size/dist/esm/types/webp.js","../../../node_modules/image-size/dist/esm/types/index.js","../../../node_modules/image-size/dist/esm/detector.js","../../../node_modules/image-size/dist/esm/lookup.js","../src/node/conversation-content-transport.ts","../src/node/codex-original-history-images.ts","../src/node/codex-surface-usage-controller.ts","../src/node/codex-original-history-usage.ts","../src/node/codex-surface-realtime.ts","../src/node/codex-surface-realtime-session.ts","../src/node/codex-surface-runtime.ts","../src/node/codex-surface-authentication.ts","../src/node/codex-surface-settings.ts","../src/node/codex-surface-data.ts","../src/node/codex-surface-transport-options.ts","../src/node/codex-surface-authentication-controller.ts","../src/node/codex-conversation-handle.ts","../src/node/codex-raw-response-item-adapter.ts","../src/node/codex-surface-events.ts","../src/node/codex-surface-subagents.ts","../src/node/codex-surface-items-controller.ts","../src/node/codex-surface-client-requests-controller.ts","../src/node/codex-surface-catalog.ts","../src/node/codex-surface-catalog-controller.ts","../src/node/codex-approvals.ts","../src/node/codex-surface-approvals-controller.ts","../src/node/codex-surface-mcp.ts","../src/node/codex-surface-extensions-controller.ts","../src/node/codex-surface-conversations-controller.ts","../src/node/codex-surface-conversation-settings-controller.ts","../src/node/codex-surface-turn-actions-controller.ts","../src/node/codex-surface-messages-controller.ts","../src/node/codex-surface-lifecycle-controller.ts","../src/node/codex-surface-notifications-controller.ts","../src/node/codex-surface-runtime-controller.ts","../src/node/codex-surface-connection-controller.ts","../src/node/codex-surface-fork-controller.ts","../src/node/codex-markdown-images.ts","../src/node/codex-surface-prompt-history.ts","../src/node/codex-surface-text-generation-controller.ts","../src/node/codex-surface.ts","../src/node/codex-app-backend-cache.ts","../src/node/codex-app-backend.ts","../src/node/apple-speech-transcription.ts","../src/node/apple-speech-session.ts"],"sourcesContent":["import { execFile as nodeExecFile, execFileSync as nodeExecFileSync } from 'node:child_process';\nimport { existsSync as nodeExistsSync, readFileSync as nodeReadFileSync, readdirSync as nodeReaddirSync } from 'node:fs';\nimport { homedir as nodeHomedir } from 'node:os';\nimport path from 'node:path';\n\ntype ExecFileSync = (\n file: string,\n args: string[],\n options?: { encoding?: BufferEncoding; env?: NodeJS.ProcessEnv; stdio?: 'ignore' | 'pipe'; timeout?: number },\n) => string | Buffer;\n\ntype ExecFile = (\n file: string,\n args: string[],\n options: { encoding: 'utf8'; env: NodeJS.ProcessEnv; timeout: number },\n) => Promise<string>;\n\nexport type CodexExecutableDiscoveryDependencies = {\n env?: NodeJS.ProcessEnv;\n /** Asynchronous login-shell runner used by `resolveCodexRuntime`. */\n execFile?: ExecFile;\n execFileSync?: ExecFileSync;\n existsSync?: (filePath: string) => boolean;\n homedir?: () => string;\n pathDelimiter?: string;\n platform?: NodeJS.Platform;\n readFileSync?: (filePath: string, encoding: BufferEncoding) => string;\n readdirSync?: (dirPath: string) => string[];\n shell?: string;\n /** Upper bound for each login-shell probe. Defaults to 5 seconds. */\n shellTimeoutMs?: number;\n};\n\nexport type CodexRuntime = {\n command: string;\n env: NodeJS.ProcessEnv;\n};\n\nexport type ResolveCodexRuntimeOptions = {\n command?: string;\n env?: NodeJS.ProcessEnv;\n discovery?: CodexExecutableDiscoveryDependencies;\n};\n\ntype ShellProbe = {\n path: string | null;\n nvmNodePath: string | null;\n};\n\nconst DEFAULT_SHELL_TIMEOUT_MS = 5_000;\nconst emptyShellProbe: ShellProbe = { path: null, nvmNodePath: null };\nconst shellProbeCache = new Map<string, Promise<ShellProbe>>();\n\nexport function discoverCodexExecutable(\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): string | null {\n return findExecutable('codex', codexRuntimePathEntries(dependencies), dependencies);\n}\n\nexport function codexRuntimePathEntries(\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): string[] {\n return runtimePathEntries(probeLoginShellSync(dependencies), dependencies);\n}\n\nexport function withCodexRuntimePath(\n env: NodeJS.ProcessEnv | undefined,\n dependencies: CodexExecutableDiscoveryDependencies = {},\n): NodeJS.ProcessEnv {\n const mergedEnv = { ...process.env, ...env };\n return withPathEntries(mergedEnv, codexRuntimePathEntries({ ...dependencies, env: mergedEnv }), dependencies);\n}\n\n/**\n * Resolves the Codex command and child-process environment without blocking\n * the event loop. Login-shell probes run concurrently, are bounded by\n * `shellTimeoutMs`, and are cached per shell, PATH, and home directory for the\n * life of the process, so reconnects do not spawn shells again.\n */\nexport async function resolveCodexRuntime(options: ResolveCodexRuntimeOptions = {}): Promise<CodexRuntime> {\n const env = { ...process.env, ...options.env };\n const dependencies = { ...options.discovery, env };\n const entries = runtimePathEntries(await probeLoginShell(dependencies), dependencies);\n return {\n command: options.command?.trim() || findExecutable('codex', entries, dependencies) || 'codex',\n env: withPathEntries(env, entries, dependencies),\n };\n}\n\nfunction runtimePathEntries(probe: ShellProbe, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n const delimiter = pathDelimiter(dependencies);\n const env = dependencies.env ?? process.env;\n return unique([\n ...bundledApplicationBinaryPaths(dependencies),\n ...pathEntries(env.PATH, delimiter),\n ...pathEntries(probe.path, delimiter),\n ...commonUserBinaryPaths(dependencies),\n ...nvmBinaryPaths(probe, dependencies),\n ]);\n}\n\nfunction withPathEntries(\n env: NodeJS.ProcessEnv,\n entries: string[],\n dependencies: CodexExecutableDiscoveryDependencies,\n): NodeJS.ProcessEnv {\n return { ...env, PATH: entries.join(pathDelimiter(dependencies)) };\n}\n\nfunction bundledApplicationBinaryPaths(dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if ((dependencies.platform ?? process.platform) !== 'darwin') return [];\n return [\n '/Applications/ChatGPT.app/Contents/Resources',\n '/Applications/Codex.app/Contents/Resources',\n ].filter((entry) => executableExists(path.join(entry, 'codex'), dependencies));\n}\n\nfunction findExecutable(\n executable: string,\n entries: string[],\n dependencies: CodexExecutableDiscoveryDependencies,\n): string | null {\n for (const entry of entries) {\n for (const candidate of executableCandidates(executable, dependencies)) {\n const filePath = path.join(entry, candidate);\n if (executableExists(filePath, dependencies)) {\n return filePath;\n }\n }\n }\n return null;\n}\n\nfunction probeLoginShellSync(dependencies: CodexExecutableDiscoveryDependencies): ShellProbe {\n if (isWindows(dependencies)) return emptyShellProbe;\n const run = (args: string[]): string | null => {\n try {\n return (dependencies.execFileSync ?? nodeExecFileSync)(loginShell(dependencies), args, {\n encoding: 'utf8',\n env: dependencies.env ?? process.env,\n stdio: 'pipe',\n timeout: shellTimeoutMs(dependencies),\n }).toString();\n } catch {\n return null;\n }\n };\n return {\n path: run(['-l', '-c', pathCommand(dependencies)]),\n nvmNodePath: run(['-l', '-c', 'nvm which current'])?.trim() || null,\n };\n}\n\nfunction probeLoginShell(dependencies: CodexExecutableDiscoveryDependencies): Promise<ShellProbe> {\n if (isWindows(dependencies)) return Promise.resolve(emptyShellProbe);\n if (dependencies.execFile || dependencies.execFileSync) return runLoginShellProbe(dependencies);\n const env = dependencies.env ?? process.env;\n const key = [loginShell(dependencies), env.PATH ?? '', homeDir(dependencies)].join('\\u0000');\n let probe = shellProbeCache.get(key);\n if (!probe) {\n probe = runLoginShellProbe(dependencies);\n shellProbeCache.set(key, probe);\n }\n return probe;\n}\n\nasync function runLoginShellProbe(dependencies: CodexExecutableDiscoveryDependencies): Promise<ShellProbe> {\n // Hosts that inject only a synchronous runner keep their existing contract.\n if (!dependencies.execFile && dependencies.execFileSync) return probeLoginShellSync(dependencies);\n const run = loginShellRunner(dependencies);\n const [shellPath, nvmNodePath] = await Promise.all([\n run(['-l', '-c', pathCommand(dependencies)]),\n run(['-l', '-c', 'nvm which current']),\n ]);\n return { path: shellPath, nvmNodePath: nvmNodePath?.trim() || null };\n}\n\nfunction loginShellRunner(\n dependencies: CodexExecutableDiscoveryDependencies,\n): (args: string[]) => Promise<string | null> {\n const shell = loginShell(dependencies);\n const env = dependencies.env ?? process.env;\n const timeout = shellTimeoutMs(dependencies);\n if (dependencies.execFile) {\n const execFile = dependencies.execFile;\n return (args) => withTimeout(execFile(shell, args, { encoding: 'utf8', env, timeout }), timeout);\n }\n return (args) => withTimeout(new Promise<string>((resolve, reject) => {\n nodeExecFile(shell, args, { encoding: 'utf8', env, timeout, killSignal: 'SIGKILL' }, (error, stdout) => {\n if (error) reject(error);\n else resolve(stdout);\n });\n }), timeout);\n}\n\n// A login shell can leave a background process holding stdout open after the\n// shell itself is killed, so the probe resolves on its own deadline too.\nfunction withTimeout(promise: Promise<string>, timeoutMs: number): Promise<string | null> {\n return new Promise((resolve) => {\n const timer = setTimeout(() => resolve(null), timeoutMs + 100);\n timer.unref?.();\n promise.then(\n (value) => { clearTimeout(timer); resolve(String(value)); },\n () => { clearTimeout(timer); resolve(null); },\n );\n });\n}\n\nfunction pathCommand(dependencies: CodexExecutableDiscoveryDependencies): string {\n const shell = loginShell(dependencies);\n return shell.endsWith('/nu') || shell === 'nu' ? 'print $env.PATH' : 'printf \"%s\" \"$PATH\"';\n}\n\nfunction loginShell(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.shell ?? dependencies.env?.SHELL ?? process.env.SHELL ?? '/bin/bash';\n}\n\nfunction shellTimeoutMs(dependencies: CodexExecutableDiscoveryDependencies): number {\n return dependencies.shellTimeoutMs ?? DEFAULT_SHELL_TIMEOUT_MS;\n}\n\nfunction commonUserBinaryPaths(dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (isWindows(dependencies)) {\n return [];\n }\n\n const home = homeDir(dependencies);\n return [\n path.join(home, '.local/bin'),\n path.join(home, 'bin'),\n '/opt/homebrew/bin',\n '/usr/local/bin',\n ].filter((entry) => executableExists(entry, dependencies));\n}\n\nfunction nvmBinaryPaths(probe: ShellProbe, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (isWindows(dependencies)) {\n return [];\n }\n const commandPath = probe.nvmNodePath && executableExists(probe.nvmNodePath, dependencies)\n ? path.dirname(probe.nvmNodePath)\n : null;\n return unique([commandPath, nvmBinaryPathFromFiles(dependencies)]);\n}\n\nfunction nvmBinaryPathFromFiles(dependencies: CodexExecutableDiscoveryDependencies): string | null {\n const home = homeDir(dependencies);\n const aliasPath = path.join(home, '.nvm/alias/default');\n const versionsPath = path.join(home, '.nvm/versions/node');\n if (!executableExists(aliasPath, dependencies) || !executableExists(versionsPath, dependencies)) {\n return null;\n }\n\n try {\n let current = (dependencies.readFileSync ?? nodeReadFileSync)(aliasPath, 'utf8').trim();\n if (!current) {\n return null;\n }\n if (!current.startsWith('v')) {\n current = `v${current}`;\n }\n const best = (dependencies.readdirSync ?? nodeReaddirSync)(versionsPath)\n .filter((version) => version.startsWith(current))\n .sort()\n .at(-1);\n return best ? path.join(versionsPath, best, 'bin') : null;\n } catch {}\n return null;\n}\n\nfunction executableCandidates(executable: string, dependencies: CodexExecutableDiscoveryDependencies): string[] {\n if (!isWindows(dependencies) || path.extname(executable)) {\n return [executable];\n }\n const pathExt = dependencies.env?.PATHEXT ?? process.env.PATHEXT ?? '.EXE;.CMD;.BAT;.COM';\n return [executable, ...pathExt.split(';').filter(Boolean).map((extension) => `${executable}${extension.toLowerCase()}`)];\n}\n\nfunction isWindows(dependencies: CodexExecutableDiscoveryDependencies): boolean {\n return (dependencies.platform ?? process.platform) === 'win32';\n}\n\nfunction pathEntries(value: string | undefined | null, delimiter: string): string[] {\n return value ? value.split(delimiter).map((entry) => entry.trim()) : [];\n}\n\nfunction unique(entries: Array<string | null | undefined>): string[] {\n return [...new Set(entries.filter((entry): entry is string => Boolean(entry)))];\n}\n\nfunction executableExists(filePath: string, dependencies: CodexExecutableDiscoveryDependencies): boolean {\n return (dependencies.existsSync ?? nodeExistsSync)(filePath);\n}\n\nfunction homeDir(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.homedir?.() ?? dependencies.env?.HOME ?? process.env.HOME ?? nodeHomedir();\n}\n\nfunction pathDelimiter(dependencies: CodexExecutableDiscoveryDependencies): string {\n return dependencies.pathDelimiter ?? path.delimiter;\n}\n","import { spawn, type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from 'node:child_process';\nimport { constants as bufferConstants } from 'node:buffer';\nimport { notifyListeners } from '../codex/listener-errors';\nimport { RpcTransportProtocolError, type RpcMessage, type RpcTransport } from '../codex/wire';\nimport {\n resolveCodexRuntime,\n type CodexExecutableDiscoveryDependencies,\n} from './codex-executable';\n\nexport type CodexAppServerExit = {\n code: number | null;\n signal: NodeJS.Signals | null;\n stderr: string;\n};\n\nexport type CodexAppServerStdioTransportOptions = {\n command?: string;\n configOverrides?: string[];\n codexHome?: string;\n cwd?: string;\n env?: NodeJS.ProcessEnv;\n executableDiscovery?: CodexExecutableDiscoveryDependencies;\n onExit?: (exit: CodexAppServerExit) => void;\n onStderr?: (text: string) => void;\n spawnProcess?: typeof spawn;\n shutdownTimeoutMs?: number;\n maxDiagnosticBufferChars?: number;\n maxOutputLineChars?: number;\n};\n\nconst DEFAULT_DIAGNOSTIC_BUFFER_CHARS = 64 * 1024;\nconst DEFAULT_CONFIG_OVERRIDES = ['features.default_mode_request_user_input=true'];\nconst DEFAULT_OUTPUT_LINE_CHARS = Math.min(\n 256 * 1024 * 1024,\n Math.floor(bufferConstants.MAX_STRING_LENGTH / 2),\n);\nconst DEFAULT_SHUTDOWN_TIMEOUT_MS = 12_000;\n\nexport class CodexAppServerStdioTransport implements RpcTransport {\n private child: ChildProcessWithoutNullStreams | null = null;\n private readonly expectedExits = new WeakSet<ChildProcessWithoutNullStreams>();\n private readonly messageListeners = new Set<(message: unknown) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n\n private starting: Promise<void> | null = null;\n private generation = 0;\n\n constructor(private readonly options: CodexAppServerStdioTransportOptions = {}) {}\n\n start(): Promise<void> {\n if (this.child) {\n return Promise.resolve();\n }\n this.starting ??= this.spawnAppServer().finally(() => { this.starting = null; });\n return this.starting;\n }\n\n private async spawnAppServer(): Promise<void> {\n const generation = this.generation;\n const { command, env } = await resolveCodexRuntime({\n command: this.options.command,\n env: this.options.env,\n discovery: this.options.executableDiscovery,\n });\n if (generation !== this.generation) {\n throw new Error('Codex app-server transport was closed while starting');\n }\n const configArgs = [\n ...DEFAULT_CONFIG_OVERRIDES,\n ...(this.options.configOverrides ?? []),\n ].flatMap((override) => ['-c', override]);\n const args = [...configArgs, 'app-server', '--listen', 'stdio://'];\n const processEnv = {\n ...env,\n ...(this.options.codexHome ? { CODEX_HOME: this.options.codexHome } : {}),\n };\n const spawnOptions: SpawnOptionsWithoutStdio = {\n ...(this.options.cwd ? { cwd: this.options.cwd } : {}),\n env: processEnv,\n stdio: 'pipe',\n };\n const child = (this.options.spawnProcess ?? spawn)(command, args, spawnOptions);\n this.child = child;\n let stdoutBuffer = '';\n let discardingOversizedLine = false;\n let stderrBuffer = '';\n const maxDiagnosticBufferChars = Math.max(1, this.options.maxDiagnosticBufferChars ?? DEFAULT_DIAGNOSTIC_BUFFER_CHARS);\n const maxOutputLineChars = Math.max(1, this.options.maxOutputLineChars ?? DEFAULT_OUTPUT_LINE_CHARS);\n\n child.stdout.setEncoding('utf8');\n child.stderr.setEncoding('utf8');\n child.stdout.on('data', (chunk: string | Buffer) => {\n let text = chunk.toString();\n if (discardingOversizedLine) {\n const discardedLineEnd = text.indexOf('\\n');\n if (discardedLineEnd < 0) return;\n discardingOversizedLine = false;\n text = text.slice(discardedLineEnd + 1);\n }\n stdoutBuffer += text;\n let newlineIndex = stdoutBuffer.indexOf('\\n');\n while (newlineIndex >= 0) {\n const line = stdoutBuffer.slice(0, newlineIndex).trim();\n stdoutBuffer = stdoutBuffer.slice(newlineIndex + 1);\n newlineIndex = stdoutBuffer.indexOf('\\n');\n if (line) {\n if (line.length > maxOutputLineChars) {\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server output line exceeded the configured limit',\n { requestId: rpcResponseIdFromPrefix(line) },\n ));\n } else {\n this.parseLine(line);\n }\n }\n }\n if (stdoutBuffer.length > maxOutputLineChars) {\n const requestId = rpcResponseIdFromPrefix(stdoutBuffer);\n stdoutBuffer = '';\n discardingOversizedLine = true;\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server output line exceeded the configured limit',\n { requestId },\n ));\n }\n });\n child.stderr.on('data', (chunk: string | Buffer) => {\n const text = chunk.toString();\n stderrBuffer = appendBounded(stderrBuffer, text, maxDiagnosticBufferChars);\n this.options.onStderr?.(text);\n });\n child.stdin.on('error', (error) => {\n if (this.child !== child || this.expectedExits.has(child)) return;\n this.child = null;\n this.expectedExits.add(child);\n child.kill();\n this.emitError(error);\n });\n child.once('error', (error) => {\n if (this.child === child) {\n this.child = null;\n }\n if (!this.expectedExits.has(child)) {\n this.expectedExits.add(child);\n this.emitError(error);\n }\n });\n child.once('exit', (code, signal) => {\n if (this.child === child) {\n this.child = null;\n }\n const exit = { code, signal, stderr: stderrBuffer.trim() };\n this.options.onExit?.(exit);\n if (!this.expectedExits.has(child)) {\n const status = code ?? signal ?? 'unknown';\n const detail = exit.stderr ? `: ${exit.stderr}` : '';\n this.emitError(new Error(`Codex app-server exited (${status})${detail}`));\n }\n });\n }\n\n send(message: RpcMessage): void {\n if (!this.child) {\n throw new Error('Codex app-server transport is not started');\n }\n this.child.stdin.write(`${JSON.stringify(message)}\\n`);\n }\n\n async close(): Promise<void> {\n this.generation += 1;\n const child = this.child;\n this.child = null;\n if (!child) {\n return;\n }\n this.expectedExits.add(child);\n const shutdownTimeoutMs = this.options.shutdownTimeoutMs ?? DEFAULT_SHUTDOWN_TIMEOUT_MS;\n const gracefulExit = waitForExit(child, shutdownTimeoutMs);\n // Stdio app-server shuts its threads down on EOF. SIGTERM bypasses that\n // path and can lose the tail of a rollout that has not been flushed yet.\n child.stdin.end();\n if (await gracefulExit) return;\n\n const signalTimeoutMs = Math.min(shutdownTimeoutMs, 1_000);\n const terminatedExit = waitForExit(child, signalTimeoutMs);\n child.kill();\n if (await terminatedExit) return;\n\n const forcedExit = waitForExit(child, signalTimeoutMs);\n child.kill('SIGKILL');\n if (!await forcedExit) {\n throw new Error('Codex app-server did not exit after SIGKILL');\n }\n }\n\n onMessage(listener: (message: unknown) => void): () => void {\n this.messageListeners.add(listener);\n return () => this.messageListeners.delete(listener);\n }\n\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n private parseLine(line: string): void {\n let message: unknown;\n try {\n message = JSON.parse(line);\n } catch (error) {\n this.emitError(new RpcTransportProtocolError(\n 'Codex app-server sent malformed JSON',\n { cause: error },\n ));\n return;\n }\n // Only a parse failure is a protocol error; a throwing subscriber must\n // neither masquerade as one nor fail every request in flight.\n notifyListeners(this.messageListeners, message);\n }\n\n private emitError(error: Error): void {\n for (const listener of this.errorListeners) {\n listener(error);\n }\n }\n}\n\nfunction appendBounded(current: string, chunk: string, limit: number): string {\n return (current + chunk).slice(-limit);\n}\n\nfunction rpcResponseIdFromPrefix(frame: string): string | number | undefined {\n const match = /^\\s*\\{\\s*\"id\"\\s*:\\s*(?:(-?\\d+)|(\"(?:\\\\.|[^\"\\\\])*\"))/.exec(frame);\n if (!match) return undefined;\n if (match[1] !== undefined) {\n const id = Number(match[1]);\n return Number.isSafeInteger(id) ? id : undefined;\n }\n try {\n return JSON.parse(match[2] as string) as string;\n } catch {}\n return undefined;\n}\n\nfunction waitForExit(child: ChildProcessWithoutNullStreams, timeoutMs: number): Promise<boolean> {\n if (child.exitCode !== null || child.signalCode !== null) return Promise.resolve(true);\n return new Promise((resolve) => {\n const onExit = (): void => {\n clearTimeout(timeout);\n resolve(true);\n };\n const timeout = setTimeout(() => {\n child.off('exit', onExit);\n resolve(false);\n }, Math.max(0, timeoutMs));\n child.once('exit', onExit);\n });\n}\n","import { randomBytes } from 'node:crypto';\nimport { homedir } from 'node:os';\nimport { join } from 'node:path';\nimport { createConnection, type Socket } from 'node:net';\nimport { notifyListeners } from '../codex/listener-errors';\nimport { RpcTransportProtocolError, type RpcMessage, type RpcTransport } from '../codex/wire';\n\nconst DEFAULT_MAX_FRAME_BYTES = 64 * 1024 * 1024;\n\nexport type CodexAppServerUnixSocketTransportOptions = {\n /** Discriminates this opt-in transport from the default spawned stdio transport. */\n type: 'unixSocket';\n /** Absolute path to an app-server control socket. */\n socketPath?: string;\n /** Used to derive the default control socket when socketPath is omitted. */\n codexHome?: string;\n maxFrameBytes?: number;\n};\n\n/**\n * Connects to an already-running Codex app-server listening on a Unix socket.\n * It never owns, starts, or stops the remote server.\n */\nexport class CodexAppServerUnixSocketTransport implements RpcTransport {\n private socket: Socket | null = null;\n private readonly messageListeners = new Set<(message: unknown) => void>();\n private readonly errorListeners = new Set<(error: Error) => void>();\n private handshakeBuffer = Buffer.alloc(0);\n private frameBuffer = Buffer.alloc(0);\n private fragments: Buffer[] = [];\n private fragmentOpcode: number | null = null;\n private started = false;\n private closed = false;\n\n constructor(private readonly options: CodexAppServerUnixSocketTransportOptions) {}\n\n async start(): Promise<void> {\n if (this.started) return;\n this.closed = false;\n const socket = createConnection(this.socketPath());\n this.socket = socket;\n await new Promise<void>((resolve, reject) => {\n const fail = (error: Error): void => {\n cleanup();\n this.socket = null;\n socket.destroy();\n reject(error);\n };\n const onConnect = (): void => {\n socket.write(websocketHandshakeRequest());\n };\n const onData = (chunk: Buffer): void => {\n this.handshakeBuffer = Buffer.concat([this.handshakeBuffer, chunk]);\n const boundary = this.handshakeBuffer.indexOf('\\r\\n\\r\\n');\n if (boundary < 0) return;\n const header = this.handshakeBuffer.subarray(0, boundary).toString('utf8');\n const remainder = this.handshakeBuffer.subarray(boundary + 4);\n this.handshakeBuffer = Buffer.alloc(0);\n if (!/^HTTP\\/1\\.1 101(?: |$)/m.test(header)) {\n fail(new Error(`Codex app-server rejected Unix socket WebSocket upgrade: ${header.split('\\r\\n', 1)[0]}`));\n return;\n }\n cleanup();\n socket.on('data', (data: Buffer) => this.handleFrameData(data));\n socket.on('error', (error) => this.handleSocketError(error));\n socket.on('close', () => this.handleSocketClose());\n this.started = true;\n this.handleFrameData(remainder);\n resolve();\n };\n const cleanup = (): void => {\n socket.off('connect', onConnect);\n socket.off('data', onData);\n socket.off('error', fail);\n socket.off('close', onClose);\n };\n const onClose = (): void => fail(new Error('Codex app-server closed the Unix socket during WebSocket upgrade'));\n socket.once('connect', onConnect);\n socket.on('data', onData);\n socket.once('error', fail);\n socket.once('close', onClose);\n });\n }\n\n send(message: RpcMessage): void {\n if (!this.socket || !this.started) throw new Error('Codex app-server Unix socket transport is not started');\n this.writeFrame(0x1, Buffer.from(JSON.stringify(message)), this.socket);\n }\n\n async close(): Promise<void> {\n this.closed = true;\n this.started = false;\n const socket = this.socket;\n this.socket = null;\n if (!socket) return;\n if (!socket.destroyed) {\n try {\n this.writeFrame(0x8, Buffer.alloc(0), socket);\n } finally {\n socket.end();\n }\n }\n }\n\n onMessage(listener: (message: unknown) => void): () => void {\n this.messageListeners.add(listener);\n return () => this.messageListeners.delete(listener);\n }\n\n onError(listener: (error: Error) => void): () => void {\n this.errorListeners.add(listener);\n return () => this.errorListeners.delete(listener);\n }\n\n private socketPath(): string {\n const explicit = this.options.socketPath?.trim();\n if (explicit) return explicit;\n const home = this.options.codexHome?.trim() || process.env.CODEX_HOME?.trim() || join(homedir(), '.codex');\n return join(home, 'app-server-control', 'app-server-control.sock');\n }\n\n private handleFrameData(chunk: Buffer): void {\n this.frameBuffer = Buffer.concat([this.frameBuffer, chunk]);\n try {\n while (true) {\n const frame = readFrame(this.frameBuffer, this.options.maxFrameBytes ?? DEFAULT_MAX_FRAME_BYTES);\n if (!frame) return;\n this.frameBuffer = this.frameBuffer.subarray(frame.bytesRead);\n this.handleFrame(frame.fin, frame.opcode, frame.payload);\n }\n } catch (error) {\n this.frameBuffer = Buffer.alloc(0);\n this.emitError(error instanceof Error ? error : new Error(String(error)));\n }\n }\n\n private handleFrame(fin: boolean, opcode: number, payload: Buffer): void {\n if (opcode === 0x8) {\n void this.close();\n return;\n }\n if (opcode === 0x9) {\n if (this.socket && !this.socket.destroyed) this.writeFrame(0xA, payload, this.socket);\n return;\n }\n if (opcode === 0xA) return;\n if (opcode === 0x0) {\n if (this.fragmentOpcode === null) return this.emitError(new RpcTransportProtocolError('Codex app-server sent an unexpected WebSocket continuation frame'));\n this.fragments.push(payload);\n if (!fin) return;\n const initialOpcode = this.fragmentOpcode;\n const complete = Buffer.concat(this.fragments);\n this.fragments = [];\n this.fragmentOpcode = null;\n return this.handleFrame(true, initialOpcode, complete);\n }\n if (opcode !== 0x1 || this.fragmentOpcode !== null) {\n return this.emitError(new RpcTransportProtocolError(`Codex app-server sent unsupported WebSocket opcode ${opcode}`));\n }\n if (!fin) {\n this.fragmentOpcode = opcode;\n this.fragments = [payload];\n return;\n }\n let message: unknown;\n try {\n message = JSON.parse(payload.toString('utf8'));\n } catch (error) {\n this.emitError(new RpcTransportProtocolError('Codex app-server sent malformed JSON', { cause: error }));\n return;\n }\n // A throwing subscriber is not a protocol error and must not fail the connection.\n notifyListeners(this.messageListeners, message);\n }\n\n private writeFrame(opcode: number, payload: Buffer, target: Socket): void {\n target.write(encodeClientFrame(opcode, payload));\n }\n\n private handleSocketError(error: Error): void {\n if (!this.closed) this.emitError(error);\n }\n\n private handleSocketClose(): void {\n this.started = false;\n this.socket = null;\n if (!this.closed) this.emitError(new Error('Codex app-server Unix socket connection closed'));\n }\n\n private emitError(error: Error): void {\n for (const listener of this.errorListeners) listener(error);\n }\n}\n\nfunction websocketHandshakeRequest(): string {\n const key = randomBytes(16).toString('base64');\n return [\n 'GET /rpc 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\nfunction encodeClientFrame(opcode: number, payload: Buffer): Buffer {\n const mask = randomBytes(4);\n const header = frameHeader(opcode, payload.length, true);\n const masked = Buffer.from(payload);\n for (let index = 0; index < masked.length; index += 1) masked[index] = (masked[index] ?? 0) ^ (mask[index % 4] ?? 0);\n return Buffer.concat([header, mask, masked]);\n}\n\nfunction frameHeader(opcode: number, length: number, masked: boolean): Buffer {\n const maskBit = masked ? 0x80 : 0;\n if (length < 126) return Buffer.from([0x80 | opcode, maskBit | length]);\n if (length <= 0xffff) {\n const header = Buffer.alloc(4);\n header[0] = 0x80 | opcode;\n header[1] = maskBit | 126;\n header.writeUInt16BE(length, 2);\n return header;\n }\n const header = Buffer.alloc(10);\n header[0] = 0x80 | opcode;\n header[1] = maskBit | 127;\n header.writeBigUInt64BE(BigInt(length), 2);\n return header;\n}\n\nfunction readFrame(buffer: Buffer, maxFrameBytes: number): { fin: boolean; opcode: number; payload: Buffer; bytesRead: number } | null {\n if (buffer.length < 2) return null;\n const firstByte = buffer[0] ?? 0;\n const secondByte = buffer[1] ?? 0;\n const fin = (firstByte & 0x80) !== 0;\n const opcode = firstByte & 0x0f;\n const masked = (secondByte & 0x80) !== 0;\n let length = secondByte & 0x7f;\n let offset = 2;\n if (length === 126) {\n if (buffer.length < offset + 2) return null;\n length = buffer.readUInt16BE(offset);\n offset += 2;\n } else if (length === 127) {\n if (buffer.length < offset + 8) return null;\n const longLength = buffer.readBigUInt64BE(offset);\n if (longLength > BigInt(Number.MAX_SAFE_INTEGER)) throw new RpcTransportProtocolError('Codex app-server sent an oversized WebSocket frame');\n length = Number(longLength);\n offset += 8;\n }\n if (length > maxFrameBytes) throw new RpcTransportProtocolError('Codex app-server WebSocket frame exceeded the configured limit');\n const maskLength = masked ? 4 : 0;\n if (buffer.length < offset + maskLength + length) return null;\n const mask = masked ? buffer.subarray(offset, offset + 4) : undefined;\n offset += maskLength;\n const payload = Buffer.from(buffer.subarray(offset, offset + length));\n if (mask) for (let index = 0; index < payload.length; index += 1) payload[index] = (payload[index] ?? 0) ^ (mask[index % 4] ?? 0);\n return { fin, opcode, payload, bytesRead: offset + length };\n}\n","import type { v2 } from '../codex';\n\nconst prefix = '<attached_file>\\n';\nconst suffix = '\\n</attached_file>';\n\n// Generic mentions are not forwarded to the model by app-server. Keep file\n// references in text, with an exact envelope we can restore as a history chip.\nexport function fileAttachmentInput(name: string, path: string): v2.UserInput {\n const reference = JSON.stringify({ name, path }).replaceAll('<', '\\\\u003c');\n return { type: 'text', text: `${prefix}${reference}${suffix}`, text_elements: [] };\n}\n\nexport function fileAttachmentReference(text: string): { name: string; path: string } | null {\n if (!text.startsWith(prefix) || !text.endsWith(suffix)) return null;\n try {\n const value: unknown = JSON.parse(text.slice(prefix.length, -suffix.length));\n if (typeof value !== 'object' || value === null || Array.isArray(value)) return null;\n const reference = value as Record<string, unknown>;\n return typeof reference.name === 'string' && typeof reference.path === 'string' && reference.path.length > 0\n ? { name: reference.name, path: reference.path }\n : null;\n } catch {\n return null;\n }\n}\n","const structuredToolResultNotice = 'Result returned in structuredContent.';\n\nexport function toolOutputText(output: unknown): string | undefined {\n if (typeof output === 'string') {\n return output;\n }\n\n if (Array.isArray(output)) {\n return output\n .map((entry) => toolOutputText(entry))\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n }\n\n if (!isRecord(output)) {\n return JSON.stringify(output);\n }\n\n const structuredText = 'structuredContent' in output ? toolOutputText(output.structuredContent) : undefined;\n if (structuredText) {\n const contentText = toolOutputContentText(output);\n if (!contentText || contentText.trim() === structuredToolResultNotice) {\n return structuredText;\n }\n\n return `${contentText}\\n\\n${structuredText}`;\n }\n\n return toolOutputContentText(output) ?? JSON.stringify(output);\n}\n\nfunction toolOutputContentText(output: Record<string, unknown>): string | undefined {\n if (typeof output.text === 'string') {\n return output.text;\n }\n\n if (typeof output.content === 'string') {\n return output.content;\n }\n\n if (Array.isArray(output.content)) {\n return toolOutputText(output.content);\n }\n\n return undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","import { isAbsolute, resolve } from 'node:path';\nimport type {\n CodexSurfaceFileActivityAction,\n CodexSurfaceFileActivityStatus,\n SurfaceMessageToolPart as RendererToolPart,\n SurfaceMessageToolPartUpdate as RendererToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport { toolOutputText } from './tool-output';\n\nconst structuredToolResultNotice = 'Result returned in structuredContent.';\nconst MAX_TOOL_PAYLOAD_BYTES = 32 * 1024;\n\nexport type CodexToolPartAdapterOptions = {\n includeCommandOutput?: boolean;\n cwd?: string | null;\n};\n\nexport type CodexFileActivity = {\n action: CodexSurfaceFileActivityAction;\n path: string;\n status: CodexSurfaceFileActivityStatus;\n};\n\nexport function codexToolPartFileActivities(\n toolPart: RendererToolPart,\n cwd?: string | null,\n): CodexFileActivity[] {\n const status = toolPart.status;\n if (toolPart.kind === 'command') {\n const input = isRecord(toolPart.input) ? toolPart.input : {};\n const commandCwd = typeof input.cwd === 'string' ? input.cwd : cwd ?? undefined;\n const actions = normalizedCommandActions(input.commandActions);\n return actions.flatMap((action) => {\n if (action.type !== 'read') return [];\n const path = fullFilePath(action.path ?? action.name, commandCwd);\n return path ? [{ action: 'read' as const, path, status }] : [];\n });\n }\n\n if (toolPart.kind !== 'fileChange') return [];\n const input = isRecord(toolPart.input) ? toolPart.input : {};\n const metadata = toolPart.metadata ?? {};\n const changes = Array.isArray(metadata.changes)\n ? metadata.changes\n : Array.isArray(input.changes) ? input.changes : [];\n return changes.flatMap((change) => {\n if (!isRecord(change) || typeof change.path !== 'string') return [];\n const kind = patchChangeKind(change.kind);\n if (kind === 'delete') return [];\n const path = fullFilePath(change.path, cwd ?? undefined);\n return path ? [{ action: kind === 'add' ? 'create' as const : 'edit' as const, path, status }] : [];\n });\n}\n\nexport function codexThreadItemToToolPart(item: unknown, options: CodexToolPartAdapterOptions = {}): RendererToolPart | null {\n if (!isRecord(item) || typeof item.id !== 'string') {\n return null;\n }\n\n if (item.type === 'commandExecution') {\n const command = typeof item.command === 'string' ? item.command : 'command';\n const status = rendererToolStatus(item.status);\n const statusText = commandStatusText(status, item.commandActions, command);\n const body = options.includeCommandOutput && typeof item.aggregatedOutput === 'string' ? item.aggregatedOutput : undefined;\n return {\n type: 'tool',\n id: item.id,\n kind: 'command',\n title: command,\n status,\n ...(statusText ? { statusText } : {}),\n ...(body !== undefined ? { body } : {}),\n input: {\n command,\n cwd: typeof item.cwd === 'string' ? item.cwd : undefined,\n commandActions: item.commandActions,\n },\n output: {\n exitCode: typeof item.exitCode === 'number' ? item.exitCode : undefined,\n durationMs: typeof item.durationMs === 'number' ? item.durationMs : undefined,\n },\n metadata: {\n source: item.source,\n processId: item.processId,\n },\n };\n }\n\n if (item.type === 'mcpToolCall') {\n const server = typeof item.server === 'string' ? item.server : 'mcp';\n const tool = typeof item.tool === 'string' ? item.tool : 'tool';\n const errorMessage = boundedToolText(mcpErrorMessage(item.error));\n const input = boundedToolPayload(item.arguments);\n const output = boundedToolPayload(item.result);\n return {\n type: 'tool',\n id: item.id,\n kind: 'mcp',\n title: `${server}.${tool}`,\n status: rendererToolStatus(item.status),\n body: errorMessage ?? boundedToolText(mcpResultText(output)),\n ...(input !== undefined ? { input } : {}),\n ...(output !== undefined ? { output } : {}),\n metadata: {\n server,\n tool,\n pluginId: item.pluginId,\n mcpAppResourceUri: item.mcpAppResourceUri,\n durationMs: item.durationMs,\n },\n };\n }\n\n if (item.type === 'dynamicToolCall') {\n const tool = typeof item.tool === 'string' ? item.tool : 'tool';\n const namespace = typeof item.namespace === 'string' ? item.namespace : null;\n const input = boundedToolPayload(item.arguments);\n const output = boundedToolPayload(item.contentItems);\n return {\n type: 'tool',\n id: item.id,\n kind: 'dynamic',\n title: namespace ? `${namespace}.${tool}` : tool,\n status: rendererToolStatus(item.status),\n body: boundedToolText(dynamicToolContentText(output)),\n ...(input !== undefined ? { input } : {}),\n ...(output !== undefined ? { output } : {}),\n metadata: {\n namespace,\n tool,\n success: item.success,\n durationMs: item.durationMs,\n },\n };\n }\n\n if (item.type === 'fileChange') {\n const changes = Array.isArray(item.changes) ? item.changes : [];\n const status = rendererToolStatus(item.status);\n const statusText = fileChangeStatusText(status, changes);\n return {\n type: 'tool',\n id: item.id,\n kind: 'fileChange',\n title: changes.length === 1 ? '1 file change' : `${changes.length} file changes`,\n status,\n ...(statusText ? { statusText } : {}),\n body: fileChangesText(changes),\n input: { changes },\n metadata: {\n changes,\n ...(typeof item.cwd === 'string' ? { cwd: item.cwd } : options.cwd ? { cwd: options.cwd } : {}),\n },\n };\n }\n\n if (item.type === 'webSearch') {\n const query = typeof item.query === 'string' && item.query.trim() ? item.query.trim() : 'web search';\n return {\n type: 'tool',\n id: item.id,\n kind: 'webSearch',\n title: 'Web search',\n status: 'completed',\n body: query,\n input: item.action ?? { query },\n metadata: {\n query,\n action: item.action,\n },\n };\n }\n\n if (item.type === 'imageView' && typeof item.path === 'string') {\n return { type: 'tool', id: item.id, kind: 'dynamic', title: 'view_image',\n status: 'completed', input: { path: item.path } };\n }\n\n if (item.type === 'imageGeneration') {\n return {\n type: 'tool',\n id: item.id,\n kind: 'dynamic',\n title: 'image_generation',\n status: rendererToolStatus(item.status),\n body: typeof item.revisedPrompt === 'string' ? item.revisedPrompt : undefined,\n input: {\n revisedPrompt: item.revisedPrompt,\n },\n output: item.savedPath,\n metadata: {\n savedPath: item.savedPath,\n },\n };\n }\n\n return null;\n}\n\nexport function shouldForwardCommandExecutionOutput(item: unknown): boolean {\n if (!isRecord(item) || item.type !== 'commandExecution' || typeof item.command !== 'string') {\n return false;\n }\n\n const command = item.command;\n return isApplyPatchCommand(command) || isShellRedirectWriteCommand(command) || isTeeWriteCommand(command);\n}\n\nexport function commandOutputDeltaToToolPartUpdate(itemId: string, delta: string): RendererToolPartUpdate {\n return {\n itemId,\n bodyDelta: delta,\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'command',\n title: 'Command',\n status: 'running',\n },\n };\n}\n\nexport function fileChangePatchToToolPartUpdate(itemId: string, changes: unknown[]): RendererToolPartUpdate {\n const statusText = fileChangeStatusText('running', changes);\n return {\n itemId,\n body: fileChangesText(changes),\n ...(statusText ? { statusText } : {}),\n input: { changes },\n metadata: { changes },\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'fileChange',\n title: changes.length === 1 ? '1 file change' : `${changes.length} file changes`,\n status: 'running',\n ...(statusText ? { statusText } : {}),\n body: fileChangesText(changes),\n input: { changes },\n metadata: { changes },\n },\n };\n}\n\nexport function mcpProgressToToolPartUpdate(itemId: string, message: string): RendererToolPartUpdate {\n return {\n itemId,\n bodyAppend: message,\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'mcp',\n title: 'MCP tool',\n status: 'running',\n },\n };\n}\n\nexport function rawOutputToToolPartUpdate(itemId: string, output: unknown, title?: string, status: unknown = 'completed'): RendererToolPartUpdate {\n const boundedOutput = boundedToolPayload(output);\n const body = boundedToolText(toolOutputText(boundedOutput));\n return {\n itemId,\n title: title && title.trim() ? title : undefined,\n status: rendererToolStatus(status),\n body,\n ...(boundedOutput !== undefined ? { output: boundedOutput } : {}),\n fallbackToolPart: {\n type: 'tool',\n id: itemId,\n kind: 'generic',\n title: title && title.trim() ? title : 'Tool output',\n status: rendererToolStatus(status),\n body,\n ...(boundedOutput !== undefined ? { output: boundedOutput } : {}),\n },\n };\n}\n\nfunction rendererToolStatus(status: unknown): RendererToolPart['status'] {\n if (status === 'completed' || status === 'succeeded' || status === 'success') {\n return 'completed';\n }\n\n if (status === 'failed' || status === 'error' || status === 'declined' || status === 'incomplete' || status === 'canceled' || status === 'cancelled') {\n return 'failed';\n }\n\n return 'running';\n}\n\nfunction commandStatusText(status: RendererToolPart['status'], commandActions: unknown, command: string): string | undefined {\n const descriptor = commandStatusDescriptor(status, commandActions, command);\n return descriptor ? JSON.stringify(descriptor) : undefined;\n}\n\nfunction commandStatusDescriptor(status: RendererToolPart['status'], commandActions: unknown, command: string): {\n action: 'edit' | 'explore' | 'list' | 'read' | 'run' | 'search';\n phase: RendererToolPart['status'];\n params: Record<string, unknown>;\n source: 'codex';\n} | undefined {\n const actions = normalizedCommandActions(commandActions);\n const actionTypes = new Set(actions.map((action) => action.type));\n if (actions.length === 0) {\n return {\n action: 'run',\n phase: status,\n params: { target: command },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('read')) {\n const names = uniqueNonEmpty(actions.map((action) => action.name ?? action.path));\n return {\n action: 'read',\n phase: status,\n params: {\n names,\n target: formatReadTargetList(names, command),\n },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('listFiles')) {\n const targets = uniqueNonEmpty(actions.map((action) => action.path ?? action.command));\n return {\n action: 'list',\n phase: status,\n params: {\n targets,\n target: formatTargetList(targets, command),\n },\n source: 'codex',\n };\n }\n\n if (actionTypes.size === 1 && actionTypes.has('search')) {\n const searches = actions.map((action) => {\n if (action.query && action.path) {\n return `\"${action.query}\" in ${action.path}`;\n }\n\n return action.query ?? action.path ?? action.command;\n });\n const targets = uniqueNonEmpty(searches);\n return {\n action: 'search',\n phase: status,\n params: {\n targets,\n target: formatTargetList(targets, command),\n },\n source: 'codex',\n };\n }\n\n return {\n action: 'explore',\n phase: status,\n params: {\n actions: actions.map((action) => action.type),\n target: formatTargetList(uniqueNonEmpty(actions.map(commandActionTarget)), command),\n },\n source: 'codex',\n };\n}\n\nfunction commandActionTarget(action: NormalizedCommandAction): string | undefined {\n return action.path ?? action.name ?? action.query ?? action.command;\n}\n\ntype NormalizedCommandAction = {\n command?: string;\n name?: string;\n path?: string;\n query?: string;\n type: 'listFiles' | 'read' | 'search';\n};\n\nfunction normalizedCommandActions(value: unknown): NormalizedCommandAction[] {\n if (!Array.isArray(value)) {\n return [];\n }\n\n return value.flatMap((entry) => {\n if (!isRecord(entry)) {\n return [];\n }\n\n if (entry.type !== 'read' && entry.type !== 'listFiles' && entry.type !== 'search') {\n return [];\n }\n\n return [{\n command: typeof entry.command === 'string' ? entry.command : undefined,\n name: typeof entry.name === 'string' ? entry.name : undefined,\n path: typeof entry.path === 'string' ? entry.path : undefined,\n query: typeof entry.query === 'string' ? entry.query : undefined,\n type: entry.type,\n }];\n });\n}\n\nfunction isApplyPatchCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])apply_patch(?:\\s|$)/u.test(command);\n}\n\nfunction isShellRedirectWriteCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])(?:cat|printf|echo)\\b[\\s\\S]*>>?\\s*(?:\"[^\"]+\"|'[^']+'|[^\\s;\"'&|]+)(?=$|[\\s;&|])/u.test(command);\n}\n\nfunction isTeeWriteCommand(command: string): boolean {\n return /(?:^|[\\s;\"'(|&])tee(?:\\s+-a)?\\s+(?!-)(?:\"[^\"]+\"|'[^']+'|[^\\s;\"'&|]+)(?=$|[\\s;&|])/u.test(command);\n}\n\nfunction uniqueNonEmpty(values: Array<string | undefined>): string[] {\n return [...new Set(values.map((value) => value?.trim()).filter((value): value is string => Boolean(value)))];\n}\n\nfunction formatTargetList(values: string[], fallback: string): string {\n if (values.length === 0) {\n return fallback;\n }\n\n if (values.length <= 3) {\n return values.join(', ');\n }\n\n return `${values.slice(0, 3).join(', ')} and ${values.length - 3} more`;\n}\n\nfunction formatReadTargetList(values: string[], fallback: string): string {\n return formatFileTargetList(values, fallback);\n}\n\nfunction formatFileTargetList(values: string[], fallback: string): string {\n const names = uniqueNonEmpty(values.map(fileName));\n return formatTargetList(names, fallback);\n}\n\nfunction fileChangeStatusText(status: RendererToolPart['status'], changes: unknown[]): string | undefined {\n const descriptor = fileChangeStatusDescriptor(status, changes);\n return descriptor ? JSON.stringify(descriptor) : undefined;\n}\n\nfunction fileChangeStatusDescriptor(status: RendererToolPart['status'], changes: unknown[]): {\n action: 'create' | 'delete' | 'edit';\n phase: RendererToolPart['status'];\n params: Record<string, unknown>;\n source: 'codex';\n} | undefined {\n const normalizedChanges = changes.flatMap((change) => {\n if (!isRecord(change)) {\n return [];\n }\n\n const path = typeof change.path === 'string' ? change.path : undefined;\n const kind = patchChangeKind(change.kind);\n const lineDiff = lineDiffFromFileChange(change);\n return [{\n addedLines: lineDiff.addedLines,\n kind,\n path,\n removedLines: lineDiff.removedLines,\n }];\n });\n\n if (!normalizedChanges.length) {\n return undefined;\n }\n\n const addedLines = normalizedChanges.reduce((total, change) => total + change.addedLines, 0);\n const removedLines = normalizedChanges.reduce((total, change) => total + change.removedLines, 0);\n const paths = uniqueNonEmpty(normalizedChanges.map((change) => change.path));\n const target = formatFileTargetList(paths, `${normalizedChanges.length} files`);\n return {\n action: fileChangeAction(normalizedChanges.map((change) => change.kind)),\n phase: status,\n params: {\n addedLines,\n path: paths.length === 1 ? paths[0] : undefined,\n removedLines,\n target,\n },\n source: 'codex',\n };\n}\n\nfunction fileChangeAction(kinds: Array<'add' | 'delete' | undefined>): 'create' | 'delete' | 'edit' {\n if (kinds.every((kind) => kind === 'add')) {\n return 'create';\n }\n\n if (kinds.every((kind) => kind === 'delete')) {\n return 'delete';\n }\n\n return 'edit';\n}\n\nfunction lineDiffFromFileChange(change: Record<string, unknown>): { addedLines: number; removedLines: number } {\n const diff = typeof change.diff === 'string' ? change.diff : undefined;\n const kind = patchChangeKind(change.kind);\n if (kind === 'add') {\n return { addedLines: rawContentLineCount(diff), removedLines: 0 };\n }\n if (kind === 'delete') {\n return { addedLines: 0, removedLines: rawContentLineCount(diff) };\n }\n\n return lineDiffFromUnifiedDiff(diff);\n}\n\nexport function lineDiffFromUnifiedDiff(diff: string | undefined): { addedLines: number; removedLines: number } {\n if (!diff) {\n return { addedLines: 0, removedLines: 0 };\n }\n\n let addedLines = 0;\n let removedLines = 0;\n for (const line of diff.split('\\n')) {\n if (line.startsWith('+++') || line.startsWith('---')) {\n continue;\n }\n\n if (line.startsWith('+')) {\n addedLines += 1;\n } else if (line.startsWith('-')) {\n removedLines += 1;\n }\n }\n\n return { addedLines, removedLines };\n}\n\nfunction patchChangeKind(kind: unknown): 'add' | 'delete' | undefined {\n if (kind === 'add' || kind === 'delete') {\n return kind;\n }\n\n if (isRecord(kind) && typeof kind.type === 'string') {\n return patchChangeKind(kind.type);\n }\n\n return undefined;\n}\n\nfunction fullFilePath(value: string | undefined, cwd: string | undefined): string | undefined {\n const path = value?.trim();\n if (!path) return undefined;\n if (isAbsolute(path)) return path;\n if (!cwd || !isAbsolute(cwd)) return undefined;\n return resolve(cwd, path);\n}\n\nfunction rawContentLineCount(content: string | undefined): number {\n if (!content) {\n return 0;\n }\n\n const lines = content.split(/\\r\\n|\\r|\\n/);\n while (lines.at(-1) === '') {\n lines.pop();\n }\n return lines.length;\n}\n\nfunction fileName(path: string): string {\n const parts = path.split(/[\\\\/]/).filter(Boolean);\n return parts.at(-1) ?? path;\n}\n\nfunction mcpErrorMessage(error: unknown): string | undefined {\n if (!isRecord(error)) {\n return undefined;\n }\n\n return typeof error.message === 'string' ? error.message : undefined;\n}\n\nfunction mcpResultText(result: unknown): string | undefined {\n if (!isRecord(result)) {\n return undefined;\n }\n\n const contentText = mcpContentText(result.content);\n const structuredText = 'structuredContent' in result ? toolOutputText(result.structuredContent) : undefined;\n if (!structuredText) {\n return contentText;\n }\n\n if (!contentText || contentText.trim() === structuredToolResultNotice) {\n return structuredText;\n }\n\n return `${contentText}\\n\\n${structuredText}`;\n}\n\nfunction mcpContentText(content: unknown): string | undefined {\n if (!Array.isArray(content)) {\n return undefined;\n }\n\n return content\n .map((entry) => {\n if (!isRecord(entry)) {\n return '';\n }\n\n if (typeof entry.text === 'string') {\n return entry.text;\n }\n\n return JSON.stringify(entry);\n })\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n}\n\nfunction dynamicToolContentText(contentItems: unknown): string | undefined {\n if (!Array.isArray(contentItems)) {\n return undefined;\n }\n\n return contentItems\n .map((entry) => {\n if (isRecord(entry) && typeof entry.text === 'string') {\n return entry.text;\n }\n\n return JSON.stringify(entry);\n })\n .filter(Boolean)\n .join('\\n\\n') || undefined;\n}\n\nfunction fileChangesText(changes: unknown[]): string | undefined {\n return changes\n .map((change) => {\n if (!isRecord(change)) {\n return JSON.stringify(change);\n }\n\n const kind = patchChangeKind(change.kind) ?? 'update';\n const path = typeof change.path === 'string' ? change.path : 'unknown';\n return `${kind} ${path}`;\n })\n .join('\\n') || undefined;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction boundedToolText(value: string | undefined): string | undefined {\n return value !== undefined && Buffer.byteLength(value) <= MAX_TOOL_PAYLOAD_BYTES ? value : undefined;\n}\n\nfunction boundedToolPayload(value: unknown): unknown {\n if (value === undefined || !jsonValueFitsByteBudget(value, MAX_TOOL_PAYLOAD_BYTES)) {\n return undefined;\n }\n return value;\n}\n\nfunction jsonValueFitsByteBudget(value: unknown, maxBytes: number): boolean {\n if (jsonValueContainsOversizedStringOrCycle(value, maxBytes, new Set<object>())) {\n return false;\n }\n try {\n const serialized = JSON.stringify(value);\n return serialized !== undefined && Buffer.byteLength(serialized) <= maxBytes;\n } catch {\n return false;\n }\n}\n\nfunction jsonValueContainsOversizedStringOrCycle(\n value: unknown,\n maxBytes: number,\n ancestors: Set<object>,\n): boolean {\n if (typeof value === 'string') return Buffer.byteLength(value) > maxBytes;\n if (value === null || typeof value !== 'object') return false;\n if (ancestors.has(value)) return true;\n\n ancestors.add(value);\n const entries = Array.isArray(value) ? value : Object.values(value);\n const oversized = entries.some((entry) => jsonValueContainsOversizedStringOrCycle(entry, maxBytes, ancestors));\n ancestors.delete(value);\n return oversized;\n}\n","import { normalizePromptContent, type CodexPromptPart } from '@codex-app-sdk/core/surface';\nimport type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceReviewTarget,\n CodexSurfaceSkill,\n CodexSurfaceSkillInput,\n SurfaceMessage,\n SurfaceMessageToolPart,\n} from '@codex-app-sdk/core/surface';\n\nexport type GoalSlashCommand =\n | { action: 'clear' }\n | { action: 'edit' }\n | { action: 'set'; objective: string }\n | { action: 'show' }\n | { action: 'unsupported' };\n\nexport function mcpElicitationResponse(\n decision: 'allow' | 'allow_conversation' | 'always_allow' | 'deny',\n): v2.McpServerElicitationRequestResponse {\n switch (decision) {\n case 'allow':\n return { action: 'accept', content: null, _meta: null };\n case 'allow_conversation':\n return { action: 'accept', content: null, _meta: { persist: 'session' } };\n case 'always_allow':\n return { action: 'accept', content: null, _meta: { persist: 'always' } };\n case 'deny':\n return { action: 'decline', content: null, _meta: null };\n }\n}\n\nexport function parsePlanSlashCommand(prompt: string): { prompt: string | null } | null {\n const match = /^\\/plan(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const planPrompt = match[1]?.trim() ?? '';\n return { prompt: planPrompt || null };\n}\n\nexport function parseGoalSlashCommand(prompt: string): GoalSlashCommand | null {\n const match = /^\\/goal(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const rest = match[1]?.trim() ?? '';\n if (!rest) return { action: 'show' };\n if (rest.toLowerCase() === 'clear') return { action: 'clear' };\n if (rest.toLowerCase() === 'edit') return { action: 'edit' };\n if (rest.toLowerCase() === 'pause' || rest.toLowerCase() === 'resume') return { action: 'unsupported' };\n return { action: 'set', objective: rest };\n}\n\nexport function parseReviewSlashCommand(prompt: string): CodexSurfaceReviewTarget | null {\n const match = /^\\/review(?:\\s(.*))?$/s.exec(prompt.trim());\n if (!match) return null;\n const instructions = match[1]?.trim() ?? '';\n return instructions ? { type: 'custom', instructions } : { type: 'uncommittedChanges' };\n}\n\nexport function normalizeReviewTarget(target: CodexSurfaceReviewTarget): v2.ReviewTarget {\n if (target.type === 'commit') return { ...target, title: target.title ?? null };\n return { ...target };\n}\n\nexport function authoredPromptContent(content?: readonly CodexPromptPart[]): CodexPromptPart[] | undefined {\n if (content === undefined) return undefined;\n const normalized = normalizePromptContent(content);\n return normalized;\n}\n\nexport function promptSkillInputsFromContent(content: readonly CodexPromptPart[] = []): CodexSurfaceSkillInput[] {\n return content.flatMap(part => part.type === 'mention' && part.kind === 'skill'\n ? [{ name: part.value, path: part.id }] : []);\n}\n\nexport function promptMentionInputs(content: readonly CodexPromptPart[] = []): Extract<v2.UserInput, { type: 'mention' }>[] {\n return content.flatMap(part => part.type === 'mention' && (part.kind === 'file' || part.kind === 'plugin')\n ? [{ type: 'mention' as const, name: part.label, path: part.kind === 'plugin' ? `plugin://${part.id}` : part.id }] : []);\n}\n\nexport function validateSkillInputs(\n inputs: readonly CodexSurfaceSkillInput[],\n catalog: readonly CodexSurfaceSkill[],\n): CodexSurfaceSkillInput[] {\n return inputs.map((input) => {\n const match = catalog.find((skill) => (\n skill.enabled\n && skill.name === input.name\n && skill.path === input.path\n ));\n if (!match) {\n throw new Error(`Skill '${input.name}' is not an enabled skill in the Codex catalog`);\n }\n return { name: match.name, path: match.path };\n });\n}\n\nexport function mergeSkillInputs(\n ...groups: readonly (readonly CodexSurfaceSkillInput[])[]\n): CodexSurfaceSkillInput[] {\n const seen = new Set<string>();\n return groups.flatMap((group) => group.filter((skill) => {\n const key = `${skill.name}\\u0000${skill.path}`;\n if (seen.has(key)) return false;\n seen.add(key);\n return true;\n }));\n}\n\nexport function findPendingMcpToolPart(\n messages: readonly SurfaceMessage[],\n turnId: string,\n server: string,\n tool: string,\n): SurfaceMessageToolPart | null {\n const running = messages\n .filter((message) => message.metadata?.turnId === turnId)\n .flatMap((message) => message.parts)\n .filter((part): part is SurfaceMessageToolPart => (\n part.type === 'tool' && part.kind === 'mcp' && part.status === 'running'\n ));\n const exact = running.find((part) => {\n const metadataServer = stringValue(part.metadata?.server);\n const metadataTool = stringValue(part.metadata?.tool);\n return (\n (metadataServer === server && metadataTool === tool)\n || part.title.endsWith(`.${tool}`)\n );\n });\n return exact ?? (running.length === 1 ? running[0] ?? null : null);\n}\n\nexport function argumentsPreview(meta: Record<string, unknown>): string {\n if (Array.isArray(meta.tool_params_display)) {\n const lines = meta.tool_params_display.map((entry) => {\n if (!isRecord(entry) || typeof entry.name !== 'string') return '';\n const label = stringValue(entry.display_name) ?? entry.name;\n const value = typeof entry.value === 'string' ? entry.value : JSON.stringify(entry.value);\n return `${label}: ${value}`;\n }).filter(Boolean);\n if (lines.length > 0) return lines.join('\\n');\n }\n return meta.tool_params === undefined ? '' : JSON.stringify(meta.tool_params, null, 2);\n}\n\nexport function persistSupports(value: unknown, mode: 'always' | 'session'): boolean {\n return value === mode || (Array.isArray(value) && value.includes(mode));\n}\n\nexport function stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.trim() ? value.trim() : null;\n}\n\nexport function normalizedConversationId(value: string): string {\n const conversationId = value.trim();\n if (!conversationId) throw new Error('Conversation id cannot be empty');\n return conversationId;\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nexport function errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error);\n}\n","import type { v2 } from '../codex/index';\nimport type {\n SurfaceMessage,\n SurfaceMessageMediaPart,\n SurfaceMessageQuestionPart,\n SurfaceMessageReasoningPart,\n SurfaceMessageTextPart,\n SurfaceMessageToolPart,\n SurfaceMessageToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport { isRecord } from './codex-surface-prompts';\n\nexport function activeTurnId(turns: v2.Turn[]): string | null {\n for (let index = turns.length - 1; index >= 0; index -= 1) {\n const turn = turns[index];\n if (turn?.status === 'inProgress') return turn.id;\n }\n return null;\n}\n\nexport function ensureAssistantTurnMessage(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n options: { createdAt?: string; forceSegment?: boolean } = {},\n): SurfaceMessage[] {\n const next = [...messages];\n const lastTurnIndex = findLastIndex(next, (message) => message.metadata?.turnId === turnId);\n const lastTurnMessage = lastTurnIndex >= 0 ? next[lastTurnIndex] : undefined;\n if (\n lastTurnMessage?.role === 'assistant'\n && lastTurnMessage.kind === undefined\n && lastTurnMessage.status === 'streaming'\n ) {\n return next;\n }\n\n if (options.forceSegment) {\n const previousAssistantIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const previousAssistant = previousAssistantIndex >= 0 ? next[previousAssistantIndex] : undefined;\n if (previousAssistant?.parts.length === 0) {\n next.splice(previousAssistantIndex, 1);\n } else if (previousAssistant) {\n next.splice(previousAssistantIndex, 1, { ...previousAssistant, status: 'complete' });\n }\n } else {\n const existing = next.find((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n && message.status === 'streaming'\n ));\n if (existing) return next;\n }\n\n const segmentCount = next.filter((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n )).length;\n const id = segmentCount === 0 ? `assistant-${turnId}` : `assistant-${turnId}-segment-${segmentCount}`;\n next.push({\n id,\n role: 'assistant',\n status: 'streaming',\n turnId,\n parts: [],\n createdAt: options.createdAt ?? new Date().toISOString(),\n metadata: { conversationId: threadId, turnId },\n });\n return next;\n}\n\nexport function assistantMessageContainingText(\n messages: readonly SurfaceMessage[],\n turnId: string,\n itemId: string,\n): SurfaceMessage | undefined {\n return messages[findLastIndex(messages, message => message.role === 'assistant'\n && message.kind === undefined && message.metadata?.turnId === turnId\n && message.parts.some(part => part.type === 'text' && part.itemId === itemId))];\n}\n\nexport function appendAssistantTextDelta(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n delta: string,\n phase?: SurfaceMessageTextPart['phase'],\n): SurfaceMessage[] {\n if (!delta) return [...messages];\n // Steering creates a new segment, but an in-flight item still owns its\n // existing text. Only a new item starts writing after the steering marker.\n const existing = assistantMessageContainingText(messages, turnId, itemId);\n const next = existing ? [...messages] : ensureAssistantTurnMessage(messages, threadId, turnId);\n const messageIndex = existing ? next.indexOf(existing) : findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const lastPart = parts.at(-1);\n if (lastPart?.type === 'text' && lastPart.itemId === itemId) {\n parts.splice(parts.length - 1, 1, {\n ...lastPart,\n text: `${lastPart.text}${delta}`,\n ...(phase ? { phase } : {}),\n });\n } else {\n parts.push({ type: 'text', text: delta, itemId, ...(phase ? { phase } : {}) });\n }\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantReasoningSummaries(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n summaries: readonly string[],\n): SurfaceMessage[] {\n const normalized = summaries\n .map((summary, summaryIndex): SurfaceMessageReasoningPart | null => {\n const text = summary.trim();\n return text ? { type: 'reasoning', summary: text, itemId, summaryIndex } : null;\n })\n .filter((part): part is SurfaceMessageReasoningPart => part !== null);\n if (normalized.length === 0) normalized.push({ type: 'reasoning', summary: '', itemId, summaryIndex: 0 });\n\n const next = ensureAssistantTurnMessage(messages, threadId, turnId);\n const messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n\n const firstExistingIndex = message.parts.findIndex((part) => (\n part.type === 'reasoning' && part.itemId === itemId\n ));\n const parts = message.parts.filter((part) => (\n part.type !== 'reasoning' || part.itemId !== itemId\n ));\n parts.splice(firstExistingIndex >= 0 ? firstExistingIndex : parts.length, 0, ...normalized);\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantText(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n text: string,\n phase?: SurfaceMessageTextPart['phase'],\n): SurfaceMessage[] {\n const next = [...messages];\n for (let messageIndex = next.length - 1; messageIndex >= 0; messageIndex -= 1) {\n const message = next[messageIndex];\n if (message?.role !== 'assistant' || message.metadata?.turnId !== turnId) continue;\n const partIndex = message.parts.findIndex((part) => part.type === 'text' && part.itemId === itemId);\n if (partIndex < 0) continue;\n const parts = [...message.parts];\n const existingPart = parts[partIndex] as SurfaceMessageTextPart;\n parts.splice(partIndex, 1, {\n ...existingPart,\n text,\n itemId,\n ...(phase ? { phase } : {}),\n });\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n }\n\n const ensured = ensureAssistantTurnMessage(next, threadId, turnId);\n const messageIndex = findLastIndex(ensured, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const message = messageIndex >= 0 ? ensured[messageIndex] : undefined;\n if (!message) return ensured;\n const textPart: SurfaceMessageTextPart = {\n type: 'text',\n text,\n itemId,\n ...(phase ? { phase } : {}),\n };\n ensured.splice(messageIndex, 1, {\n ...message,\n parts: [...message.parts, textPart],\n });\n return pruneEmptyAssistantPlaceholders(ensured, threadId);\n}\n\nexport function removeAssistantText(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n itemId: string,\n): SurfaceMessage[] {\n const next = messages.map((message) => {\n if (message.role !== 'assistant' || message.metadata?.turnId !== turnId) return message;\n const parts = message.parts.filter((part) => part.type !== 'text' || part.itemId !== itemId);\n return parts.length === message.parts.length ? message : { ...message, parts };\n });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function extractProposedPlanDocument(text: string): { markdown: string; visibleText: string } | null {\n const match = /<proposed_plan>([\\s\\S]*?)<\\/proposed_plan>/iu.exec(text);\n const markdown = match?.[1]?.trim() ?? '';\n if (!match || !markdown) return null;\n return {\n markdown,\n visibleText: `${text.slice(0, match.index)}${text.slice(match.index + match[0].length)}`.trim(),\n };\n}\n\nexport function upsertAssistantToolPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n toolPart: SurfaceMessageToolPart,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === toolPart.id)\n ));\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => part.type === 'tool' && part.id === toolPart.id);\n if (partIndex >= 0) {\n const existing = parts[partIndex] as SurfaceMessageToolPart;\n parts.splice(partIndex, 1, {\n ...existing,\n ...toolPart,\n body: toolPart.body ?? existing.body,\n input: toolPart.input ?? existing.input,\n output: toolPart.output ?? existing.output,\n statusText: toolPart.statusText ?? transitionedToolStatusText(existing.statusText, toolPart.status),\n metadata: { ...(existing.metadata ?? {}), ...(toolPart.metadata ?? {}) },\n });\n } else {\n parts.push(toolPart);\n }\n // A late tool result must not reopen a segment closed by compaction or steer.\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantMediaPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n mediaPart: SurfaceMessageMediaPart,\n sourceItemId = mediaPart.itemId,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'media' && part.itemId === mediaPart.itemId)\n ));\n if (messageIndex < 0 && mediaPart.itemId) {\n messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === sourceItemId)\n ));\n }\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => (\n part.type === 'media' && part.itemId === mediaPart.itemId\n ));\n if (partIndex >= 0) parts.splice(partIndex, 1, mediaPart);\n else parts.push(mediaPart);\n next.splice(messageIndex, 1, { ...message, status: 'streaming', parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function upsertAssistantQuestionPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n questionPart: SurfaceMessageQuestionPart,\n): SurfaceMessage[] {\n let next = [...messages];\n let messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => (\n part.type === 'question' && part.request.id === questionPart.request.id\n ))\n ));\n if (messageIndex < 0) {\n next = ensureAssistantTurnMessage(next, threadId, turnId);\n messageIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n }\n const message = messageIndex >= 0 ? next[messageIndex] : undefined;\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => (\n part.type === 'question' && part.request.id === questionPart.request.id\n ));\n if (partIndex >= 0) parts.splice(partIndex, 1, questionPart);\n else parts.push(questionPart);\n next.splice(messageIndex, 1, { ...message, parts });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function surfaceMediaPartsEqual(\n left: SurfaceMessageMediaPart,\n right: SurfaceMessageMediaPart,\n): boolean {\n return left.itemId === right.itemId\n && left.media.url === right.media.url\n && left.media.alt === right.media.alt\n && left.media.mimeType === right.media.mimeType\n && left.media.prompt === right.media.prompt\n && left.media.title === right.media.title;\n}\n\nexport function updateAssistantToolPart(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n update: SurfaceMessageToolPartUpdate,\n): SurfaceMessage[] {\n const next = [...messages];\n const messageIndex = next.findIndex((message) => (\n message.role === 'assistant'\n && message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === update.itemId)\n ));\n if (messageIndex < 0) {\n if (!update.fallbackToolPart) return next;\n const inserted = upsertAssistantToolPart(next, threadId, turnId, update.fallbackToolPart);\n return updateAssistantToolPart(inserted, threadId, turnId, {\n ...update,\n fallbackToolPart: undefined,\n });\n }\n const message = next[messageIndex];\n if (!message) return next;\n const parts = [...message.parts];\n const partIndex = parts.findIndex((part) => part.type === 'tool' && part.id === update.itemId);\n const existing = parts[partIndex] as SurfaceMessageToolPart | undefined;\n if (!existing) return next;\n parts.splice(partIndex, 1, {\n ...existing,\n ...(update.title !== undefined ? { title: update.title } : {}),\n ...(update.status !== undefined ? { status: update.status } : {}),\n ...(update.statusText !== undefined ? { statusText: update.statusText ?? undefined } : {}),\n ...(update.body !== undefined ? { body: update.body } : {}),\n ...(update.bodyDelta !== undefined ? { body: `${existing.body ?? ''}${update.bodyDelta}` } : {}),\n ...(update.bodyAppend !== undefined\n ? { body: [existing.body, update.bodyAppend].filter(Boolean).join('\\n') }\n : {}),\n ...(update.input !== undefined ? { input: update.input } : {}),\n ...(update.output !== undefined ? { output: update.output } : {}),\n ...(update.metadata !== undefined\n ? { metadata: { ...(existing.metadata ?? {}), ...update.metadata } }\n : {}),\n });\n next.splice(messageIndex, 1, { ...message, parts });\n return next;\n}\n\nexport function appendCompactionMarker(\n messages: readonly SurfaceMessage[],\n threadId: string,\n turnId: string,\n status: 'streaming' | 'complete' = 'streaming',\n): SurfaceMessage[] {\n if (messages.some((message) => message.kind === 'compaction' && message.metadata?.turnId === turnId)) {\n return messages.map((message) => (\n status === 'complete' && message.kind === 'compaction' && message.metadata?.turnId === turnId\n ? { ...message, status }\n : message\n ));\n }\n const next = [...messages];\n const activeAssistantIndex = findLastIndex(next, (message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n ));\n const activeAssistant = activeAssistantIndex >= 0 ? next[activeAssistantIndex] : undefined;\n if (activeAssistant?.parts.length === 0) {\n next.splice(activeAssistantIndex, 1);\n } else if (activeAssistant) {\n next.splice(activeAssistantIndex, 1, { ...activeAssistant, status: 'complete' });\n }\n next.push({\n id: `compaction-${turnId}`,\n kind: 'compaction',\n role: 'assistant',\n status,\n turnId,\n parts: [],\n createdAt: new Date().toISOString(),\n metadata: { conversationId: threadId, turnId },\n });\n return pruneEmptyAssistantPlaceholders(next, threadId);\n}\n\nexport function finalizeTurnToolParts(\n messages: SurfaceMessage[],\n turnId: string,\n turnStatus: v2.TurnStatus,\n): SurfaceMessage[] {\n const toolStatus: SurfaceMessageToolPart['status'] = turnStatus === 'completed' ? 'completed' : 'failed';\n return messages.map((message) => {\n if (message.metadata?.turnId !== turnId) return message;\n let changed = false;\n const parts = message.parts.map((part) => {\n if (part.type !== 'tool' || part.status !== 'running') return part;\n changed = true;\n return {\n ...part,\n status: toolStatus,\n statusText: transitionedToolStatusText(part.statusText, toolStatus),\n };\n });\n return changed ? { ...message, parts } : message;\n });\n}\n\nfunction transitionedToolStatusText(\n statusText: string | undefined,\n phase: SurfaceMessageToolPart['status'],\n): string | undefined {\n if (phase === 'running') return statusText;\n if (!statusText) return statusText;\n try {\n const parsed: unknown = JSON.parse(statusText);\n if (!isRecord(parsed)) return statusText;\n return JSON.stringify({ ...parsed, phase });\n } catch {\n return statusText;\n }\n}\n\nexport function pruneEmptyAssistantPlaceholders(messages: SurfaceMessage[], threadId: string): SurfaceMessage[] {\n const relevantIndexes = messages\n .map((message, index) => ({ message, index }))\n .filter(({ message }) => message.metadata?.conversationId === threadId);\n const lastIndex = relevantIndexes.at(-1)?.index ?? -1;\n return messages.filter((message, index) => (\n message.metadata?.conversationId !== threadId\n || index === lastIndex\n || message.role !== 'assistant'\n || message.kind !== undefined\n || message.parts.length > 0\n ));\n}\n\nfunction findLastIndex<T>(values: readonly T[], predicate: (value: T) => boolean): number {\n for (let index = values.length - 1; index >= 0; index -= 1) {\n const value = values[index];\n if (value !== undefined && predicate(value)) return index;\n }\n return -1;\n}\n\nexport function addUnique<T>(values: readonly T[], value: T): T[] {\n return values.includes(value) ? [...values] : [...values, value];\n}\n\nexport function formatPlanMarkdown(\n explanation: string | null,\n plan: readonly { step: string; status: string }[],\n): string {\n return [\n explanation?.trim() ?? '',\n ...plan.map((entry) => `${entry.status === 'completed' ? '- [x]' : '- [ ]'} ${entry.step}`),\n ].filter(Boolean).join('\\n');\n}\n\nexport function planProgressToolPart(\n turnId: string,\n markdown: string,\n status: SurfaceMessageToolPart['status'],\n): SurfaceMessageToolPart {\n return {\n type: 'tool',\n id: `plan-progress-${turnId}`,\n kind: 'generic',\n title: 'plan',\n status,\n body: markdown,\n statusText: JSON.stringify({\n source: 'codex',\n action: 'plan',\n phase: status,\n params: {\n addedLines: markdown.split('\\n').filter((line) => line.trim()).length,\n operation: 'write',\n target: 'plan',\n },\n }),\n metadata: { planProgress: true },\n };\n}\n","import { normalizePromptContent, promptContentText } from '@codex-app-sdk/core/surface';\nimport type { Thread } from '../codex/generated/v2/Thread';\nimport type { ThreadItem } from '../codex/generated/v2/ThreadItem';\nimport type { Turn } from '../codex/generated/v2/Turn';\nimport { basename, extname, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { fileAttachmentReference } from './codex-file-attachment';\nimport type {\n CodexSurfaceClientRequest,\n SurfaceMessage,\n SurfaceMessageAttachment,\n SurfaceMessageMediaPart,\n SurfaceMessagePart,\n SurfaceMessageQuestionPart,\n} from '@codex-app-sdk/core/surface';\nimport { codexThreadItemToToolPart } from './codex-tool-part-adapter';\nimport {\n extractProposedPlanDocument,\n finalizeTurnToolParts,\n} from './codex-surface-message-state';\n\nexport { codexThreadItemToToolPart as codexItemToToolPart } from './codex-tool-part-adapter';\n\nconst MAX_INLINE_GENERATED_IMAGE_BYTES = 16 * 1024 * 1024;\nconst supportedGeneratedImageMimeTypes = new Set([\n 'image/avif',\n 'image/gif',\n 'image/jpeg',\n 'image/png',\n 'image/webp',\n]);\n\nexport function codexThreadToSurfaceMessages(thread: Thread): SurfaceMessage[] {\n const turns = Array.isArray(thread.turns) ? thread.turns : [];\n return turns.flatMap((turn) => codexTurnToSurfaceMessages(thread.id, turn));\n}\n\n/**\n * Keep bounded data previews from optimistic messages when app-server history\n * rematerializes the same user attachment from its local filesystem path.\n * Filesystem URLs are not renderer-safe in Electron and are intentionally not\n * used as image sources.\n */\nexport function preserveHistoricalAttachmentPreviews(\n previousMessages: readonly SurfaceMessage[],\n historyMessages: readonly SurfaceMessage[],\n): SurfaceMessage[] {\n const previewsByPath = new Map<string, string>();\n for (const message of previousMessages) {\n for (const part of message.parts) {\n if (part.type !== 'attachment' || part.attachment.kind !== 'image' || !part.attachment.path) continue;\n if (isRendererSafeImagePreview(part.attachment.url)) {\n previewsByPath.set(part.attachment.path, part.attachment.url);\n }\n }\n }\n if (previewsByPath.size === 0) return [...historyMessages];\n\n return historyMessages.map((message) => {\n let changed = false;\n const parts = message.parts.map((part) => {\n if (part.type !== 'attachment' || part.attachment.kind !== 'image' || !part.attachment.path) {\n return part;\n }\n const previewUrl = previewsByPath.get(part.attachment.path);\n if (!previewUrl || part.attachment.url === previewUrl) return part;\n changed = true;\n return { ...part, attachment: { ...part.attachment, url: previewUrl } };\n });\n return changed ? { ...message, parts } : message;\n });\n}\n\n/** Preserve authored presentation by provider-echoed client identity, never text matching. */\nexport function preserveHistoricalMessagePresentation(previous: readonly SurfaceMessage[], history: readonly SurfaceMessage[]): SurfaceMessage[] {\n const authored = new Map(previous.filter(message => message.role === 'user' && message.metadata?.promptContent)\n .map(message => [message.id, message.metadata!.promptContent]));\n return preserveHistoricalAttachmentPreviews(previous, history).map(message => {\n const saved = authored.get(message.id);\n if (!saved || message.role !== 'user') return message;\n const content = normalizePromptContent(saved);\n return {\n ...message, metadata: { ...message.metadata, promptContent: content },\n parts: [{ type: 'text', text: promptContentText(content) }, ...message.parts.filter(part => part.type !== 'text')],\n };\n });\n}\n\nexport function codexTurnToSurfaceMessages(threadId: string, turn: Turn): SurfaceMessage[] {\n const messages: SurfaceMessage[] = [];\n const assistantParts: SurfaceMessagePart[] = [];\n const createdAt = timestampToIso(turn.startedAt ?? turn.completedAt);\n let assistantSegmentIndex = 0;\n let sawAssistantActivity = false;\n let sawFinalAnswer = false;\n const initialUserMessageKeys = new Set<string>();\n\n const flushAssistantMessage = () => {\n if (assistantParts.length === 0) {\n return;\n }\n\n const segmentSuffix = assistantSegmentIndex === 0 ? '' : `-segment-${assistantSegmentIndex}`;\n messages.push({\n id: `assistant-${turn.id}${segmentSuffix}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts: [...assistantParts],\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id },\n });\n assistantParts.length = 0;\n assistantSegmentIndex += 1;\n };\n\n for (const item of Array.isArray(turn.items) ? turn.items : []) {\n if (item.type === 'userMessage') {\n const parts = userMessageParts(item);\n const asyncQuestionRequestIds = asyncQuestionRequestIdsForUserMessage(item);\n if (parts.length > 0) {\n const isSteerMessage = sawAssistantActivity;\n const initialMessageKey = isSteerMessage ? null : JSON.stringify(parts);\n if (initialMessageKey && initialUserMessageKeys.has(initialMessageKey)) continue;\n if (initialMessageKey) initialUserMessageKeys.add(initialMessageKey);\n flushAssistantMessage();\n messages.push({\n id: item.clientId ?? `user-${threadId}-${turn.id}-${item.id ?? messages.length}`,\n ...(isSteerMessage ? { kind: 'steer' as const } : {}),\n role: 'user',\n status: 'complete',\n turnId: turn.id,\n parts,\n createdAt,\n metadata: {\n conversationId: threadId,\n turnId: turn.id,\n ...(asyncQuestionRequestIds.length > 0 ? {\n asyncQuestionRequestIds,\n asyncQuestionAnswers: asyncQuestionAnswersForUserMessage(item),\n } : {}),\n },\n });\n }\n continue;\n }\n\n if (item.type === 'contextCompaction') {\n sawAssistantActivity = true;\n flushAssistantMessage();\n const markerId = `compaction-${turn.id}`;\n if (!messages.some((message) => message.id === markerId)) {\n messages.push({\n id: markerId,\n kind: 'compaction',\n role: 'assistant',\n status: 'complete',\n turnId: turn.id,\n parts: [],\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id },\n });\n }\n continue;\n }\n\n if (item.type === 'agentMessage') {\n const text = typeof item.text === 'string' ? item.text : '';\n if (item.phase === 'final_answer' && text.trim()) sawFinalAnswer = true;\n const questionPart = codexItemToQuestionPart(threadId, turn.id, item, true);\n const proposedPlan = item.phase === 'final_answer'\n ? extractProposedPlanDocument(text)\n : null;\n if (proposedPlan && !questionPart) {\n if (proposedPlan.visibleText) {\n sawAssistantActivity = true;\n assistantParts.push({\n type: 'text',\n text: proposedPlan.visibleText,\n itemId: item.id,\n ...(item.phase ? { phase: item.phase } : {}),\n });\n }\n } else if (text && !questionPart) {\n sawAssistantActivity = true;\n assistantParts.push({\n type: 'text',\n text,\n itemId: item.id,\n ...(item.phase ? { phase: item.phase } : {}),\n });\n }\n if (questionPart) {\n sawAssistantActivity = true;\n assistantParts.push(questionPart);\n }\n continue;\n }\n\n if (item.type === 'reasoning') {\n const summaries = item.summary\n .map((summary, summaryIndex) => ({ summary: summary.trim(), summaryIndex }))\n .filter(({ summary }) => summary.length > 0);\n if (summaries.length === 0 && sawFinalAnswer) summaries.push({ summary: '', summaryIndex: 0 });\n if (summaries.length > 0) {\n sawAssistantActivity = true;\n assistantParts.push(...summaries.map(({ summary, summaryIndex }) => ({\n type: 'reasoning' as const,\n summary,\n itemId: item.id,\n summaryIndex,\n })));\n }\n continue;\n }\n\n if (item.type === 'exitedReviewMode') {\n const text = typeof item.review === 'string' ? item.review : '';\n if (text) {\n sawAssistantActivity = true;\n assistantParts.push({ type: 'text', text, itemId: item.id });\n }\n continue;\n }\n\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart) {\n sawAssistantActivity = true;\n assistantParts.push(toolPart);\n }\n const mediaParts = codexItemToMediaParts(item);\n if (mediaParts.length) {\n sawAssistantActivity = true;\n assistantParts.push(...mediaParts);\n }\n }\n\n flushAssistantMessage();\n if ((turn.itemsView === 'summary' || turn.itemsView === 'notLoaded') && !messages.some(m => m.role === 'assistant')) {\n messages.push({ id: `assistant-${turn.id}`, role: 'assistant', status: surfaceMessageStatus(turn.status), turnId: turn.id, parts: [], createdAt, metadata: { conversationId: threadId, turnId: turn.id } });\n }\n return turn.status === 'inProgress'\n ? messages\n : finalizeTurnToolParts(messages, turn.id, turn.status);\n}\n\nexport function codexItemToSurfaceMessage(\n threadId: string,\n turn: Pick<Turn, 'id' | 'status' | 'startedAt'>,\n item: ThreadItem,\n): SurfaceMessage | null {\n const createdAt = timestampToIso(turn.startedAt);\n if (item.type === 'userMessage') {\n const parts = userMessageParts(item);\n const asyncQuestionRequestIds = asyncQuestionRequestIdsForUserMessage(item);\n return parts.length > 0 ? {\n id: item.clientId ?? `user-${threadId}-${turn.id}-${item.id}`,\n role: 'user',\n status: 'complete',\n turnId: turn.id,\n parts,\n createdAt,\n metadata: {\n conversationId: threadId,\n turnId: turn.id,\n itemId: item.id,\n ...(asyncQuestionRequestIds.length > 0 ? {\n asyncQuestionRequestIds,\n asyncQuestionAnswers: asyncQuestionAnswersForUserMessage(item),\n } : {}),\n },\n } : null;\n }\n\n if (item.type === 'agentMessage' || item.type === 'exitedReviewMode') {\n const text = item.type === 'agentMessage' ? item.text : item.review;\n const proposedPlan = item.type === 'agentMessage' && item.phase === 'final_answer'\n ? extractProposedPlanDocument(text)\n : null;\n const questionPart = item.type === 'agentMessage'\n ? codexItemToQuestionPart(threadId, turn.id, item, true)\n : null;\n const parts: SurfaceMessagePart[] = [\n ...(!questionPart && (proposedPlan?.visibleText || (!proposedPlan && text)) ? [{\n type: 'text' as const,\n text: proposedPlan?.visibleText ?? text,\n itemId: item.id,\n ...(item.type === 'agentMessage' && item.phase ? { phase: item.phase } : {}),\n }] : []),\n ...(questionPart ? [questionPart] : []),\n ];\n return parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n }\n\n if (item.type === 'reasoning') {\n const parts = item.summary\n .map((summary, summaryIndex) => ({ summary: summary.trim(), summaryIndex }))\n .filter(({ summary }) => summary.length > 0)\n .map(({ summary, summaryIndex }) => ({\n type: 'reasoning' as const,\n summary,\n itemId: item.id,\n summaryIndex,\n }));\n return parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n }\n\n const parts: SurfaceMessagePart[] = [];\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart) parts.push(toolPart);\n parts.push(...codexItemToMediaParts(item));\n const message: SurfaceMessage | null = parts.length > 0 ? {\n id: `assistant-${item.id}`,\n role: 'assistant',\n status: surfaceMessageStatus(turn.status),\n turnId: turn.id,\n parts,\n createdAt,\n metadata: { conversationId: threadId, turnId: turn.id, itemId: item.id },\n } : null;\n if (!message || turn.status === 'inProgress') return message;\n return finalizeTurnToolParts([message], turn.id, turn.status)[0] ?? null;\n}\n\nexport function codexItemToQuestionPart(\n threadId: string,\n turnId: string,\n item: Extract<ThreadItem, { type: 'agentMessage' }>,\n historical = false,\n): SurfaceMessageQuestionPart | null {\n if (item.delivery !== 'async') return null;\n const structuredQuestions = item.questions ?? [];\n const questions = structuredQuestions.length > 0\n ? structuredQuestions.map((question, index) => ({\n id: JSON.stringify(['request_user_input_async', item.id, index]),\n header: question.title,\n question: question.title,\n isOther: true,\n isSecret: false,\n options: question.options?.map((label) => ({ label, description: '' })) ?? null,\n }))\n : item.text.trim()\n ? [{\n id: item.id,\n header: 'Question',\n question: item.text,\n isOther: true,\n isSecret: false,\n options: null,\n }]\n : [];\n if (questions.length === 0) return null;\n const request: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> = {\n id: `async-question:${item.id}`,\n kind: 'ask_user',\n conversationId: threadId,\n turnId,\n itemId: item.id,\n payload: {\n request: {\n itemId: item.id,\n delivery: 'async',\n blocking: false,\n questions,\n },\n },\n };\n return { type: 'question', request, ...(historical ? { historical: true } : {}) };\n}\n\nexport function codexItemToMediaPart(item: ThreadItem): SurfaceMessageMediaPart | null {\n if (item.type !== 'imageGeneration') return null;\n const toolPart = codexThreadItemToToolPart(item);\n if (toolPart?.status !== 'completed') return null;\n\n const candidatePath = typeof item.savedPath === 'string' && isAbsolute(item.savedPath)\n ? item.savedPath\n : null;\n const savedPathMimeType = candidatePath ? mimeTypeForSource(candidatePath) : undefined;\n const savedPath = savedPathMimeType && supportedGeneratedImageMimeTypes.has(savedPathMimeType)\n ? candidatePath\n : null;\n const result = 'result' in item && typeof item.result === 'string' ? item.result.trim() : '';\n const inlineImage = codexImageDataUrl(result);\n const url = inlineImage?.url ?? (savedPath ? pathToFileURL(savedPath).href : undefined);\n if (!url) return null;\n\n const prompt = typeof item.revisedPrompt === 'string' ? item.revisedPrompt.trim() : '';\n return {\n type: 'media',\n itemId: item.id,\n media: {\n url,\n alt: 'Generated image',\n title: 'Generated image',\n mimeType: inlineImage?.mimeType ?? savedPathMimeType ?? 'image/png',\n ...(prompt ? { prompt } : {}),\n },\n };\n}\n\n/** Tool result images are media, independently of the small text/JSON tool-output budget. */\nexport function codexItemToMediaParts(item: ThreadItem): SurfaceMessageMediaPart[] {\n if (item.type === 'imageView') {\n if (typeof item.path !== 'string') return [];\n const mimeType = mimeTypeForSource(item.path);\n return isAbsolute(item.path) && mimeType && supportedGeneratedImageMimeTypes.has(mimeType)\n ? [{ type: 'media', phase: 'commentary', itemId: item.id, media: { url: pathToFileURL(item.path).href, mimeType, alt: 'Viewed image', title: 'Viewed image' } }]\n : [];\n }\n const generated = codexItemToMediaPart(item);\n if (generated) return [generated];\n const content = item.type === 'mcpToolCall' && item.status === 'completed' ? item.result?.content\n : item.type === 'dynamicToolCall' && item.status === 'completed' ? item.contentItems : undefined;\n if (!Array.isArray(content)) return [];\n const parts: SurfaceMessageMediaPart[] = [];\n let remaining = 20 * 1024 * 1024;\n let parseBudget = 32 * 1024 * 1024;\n let entries = 256;\n // Only unwrap the provider's content/text JSON envelopes, never arbitrary\n // result properties. Cumulative limits bound both parsing work and images.\n const visit = (blocks: unknown[], depth: number): void => {\n for (const entry of blocks) {\n if (--entries < 0 || parts.length >= 8) return;\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) continue;\n const value = entry as Record<string, unknown>;\n if (value.type === 'text' || value.type === 'inputText') {\n if (depth >= 4 || typeof value.text !== 'string') continue;\n const byteLength = Buffer.byteLength(value.text);\n if (byteLength > parseBudget) continue;\n parseBudget -= byteLength;\n try {\n const envelope: unknown = JSON.parse(value.text);\n if (isRecord(envelope) && Array.isArray(envelope.content)) visit(envelope.content, depth + 1);\n } catch { /* Ordinary text and malformed envelopes are not media. */ }\n continue;\n }\n const source = value.type === 'image' && typeof value.data === 'string' ? value.data\n : value.type === 'inputImage' && typeof value.imageUrl === 'string' ? value.imageUrl : '';\n if (source.length > remaining) continue;\n const image = codexImageDataUrl(source);\n if (!image) continue;\n remaining -= image.url.length;\n parts.push({ type: 'media', phase: 'commentary', itemId: parts.length ? `${item.id}:image:${parts.length}` : item.id,\n media: { url: image.url, mimeType: image.mimeType, alt: 'Tool image', title: 'Tool image' } });\n }\n };\n visit(content, 0);\n return parts;\n}\n\nfunction userMessageParts(item: Extract<ThreadItem, { type: 'userMessage' }>): SurfaceMessagePart[] {\n const content = Array.isArray(item.content) ? item.content : [];\n const hasTextInput = content.some((input) => (\n isRecord(input) && input.type === 'text' && typeof input.text === 'string' && input.text.length > 0\n ));\n const parts: SurfaceMessagePart[] = [];\n let text: string[] = [];\n const renderedSkills = new Set<string>();\n const flushText = () => {\n if (text.length > 0) parts.push({ type: 'text', text: text.join('\\n') });\n text = [];\n };\n\n for (const input of content) {\n if (isRecord(input) && input.type === 'skill' && typeof input.name === 'string') {\n // app-server persists selected skills alongside the original prompt text.\n // The text is the canonical user-authored display value; rendering the\n // structured execution metadata too repeats the skill mention.\n if (hasTextInput) continue;\n const normalizedName = input.name.toLowerCase();\n if (renderedSkills.has(normalizedName)) continue;\n renderedSkills.add(normalizedName);\n }\n const inputText = userInputText(input);\n const file = fileAttachmentReference(inputText);\n if (file) {\n flushText();\n parts.push({ type: 'attachment', attachment: { kind: 'file', ...file } });\n continue;\n }\n if (inputText) {\n text.push(inputText);\n continue;\n }\n const attachment = userInputAttachment(input);\n if (!attachment) continue;\n flushText();\n parts.push({ type: 'attachment', attachment });\n }\n flushText();\n return parts;\n}\n\nfunction userInputText(input: unknown): string {\n if (!isRecord(input) || typeof input.type !== 'string') {\n return '';\n }\n if (input.type === 'text' && typeof input.text === 'string') {\n return asyncQuestionReply(input.text)?.displayText ?? input.text;\n }\n if (input.type === 'skill' && typeof input.name === 'string') return `$${input.name}`;\n return '';\n}\n\nfunction asyncQuestionRequestIdsForUserMessage(\n item: Extract<ThreadItem, { type: 'userMessage' }>,\n): string[] {\n const ids = new Set<string>();\n for (const input of Array.isArray(item.content) ? item.content : []) {\n if (!isRecord(input) || input.type !== 'text' || typeof input.text !== 'string') continue;\n for (const requestId of asyncQuestionReply(input.text)?.requestIds ?? []) ids.add(requestId);\n }\n return [...ids];\n}\n\nfunction asyncQuestionAnswersForUserMessage(item: Extract<ThreadItem, { type: 'userMessage' }>): Record<string, { answers: string[] }> {\n const answers: Record<string, { answers: string[] }> = {};\n for (const input of Array.isArray(item.content) ? item.content : []) {\n if (!isRecord(input) || input.type !== 'text' || typeof input.text !== 'string') continue;\n Object.assign(answers, asyncQuestionReply(input.text)?.answers);\n }\n return answers;\n}\n\nfunction asyncQuestionReply(text: string): { displayText: string; requestIds: string[]; answers: Record<string, { answers: string[] }> } | null {\n const match = text.match(\n /^<send_user_message_question_reply>\\s*([\\s\\S]*?)\\s*<\\/send_user_message_question_reply>$/,\n );\n if (!match?.[1]) return null;\n try {\n const value: unknown = JSON.parse(match[1]);\n if (!Array.isArray(value)) return null;\n const replies = value.filter((entry): entry is {\n questionItemId: string;\n question: string;\n answer: string;\n } => (\n isRecord(entry)\n && typeof entry.questionItemId === 'string'\n && typeof entry.question === 'string'\n && typeof entry.answer === 'string'\n ));\n if (replies.length === 0) return null;\n const requestIds = replies.flatMap((reply) => {\n try {\n const questionId: unknown = JSON.parse(reply.questionItemId);\n if (\n Array.isArray(questionId)\n && questionId[0] === 'request_user_input_async'\n && typeof questionId[1] === 'string'\n ) return [`async-question:${questionId[1]}`];\n } catch {\n // Open-ended asynchronous questions use their item id directly.\n }\n return [`async-question:${reply.questionItemId}`];\n });\n return {\n displayText: replies.length === 1\n ? replies[0]!.answer\n : replies.map((reply) => `${reply.question}: ${reply.answer}`).join('\\n'),\n requestIds,\n answers: Object.fromEntries(replies.map((reply) => [reply.questionItemId, { answers: [reply.answer] }])),\n };\n } catch {\n return null;\n }\n}\n\nfunction userInputAttachment(input: unknown): SurfaceMessageAttachment | null {\n if (!isRecord(input) || typeof input.type !== 'string') return null;\n if (input.type === 'mention' && typeof input.path === 'string' && !input.path.startsWith('plugin://')) {\n const name = typeof input.name === 'string' && input.name.trim()\n ? input.name.trim()\n : attachmentName(input.path, 'File');\n const mimeType = mimeTypeForSource(input.path);\n return {\n kind: 'file',\n name,\n path: input.path,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n if (input.type === 'image' && typeof input.url === 'string') {\n const mimeType = mimeTypeForSource(input.url);\n return {\n kind: 'image',\n name: attachmentName(input.url, 'Image'),\n url: input.url,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n if (input.type === 'localImage' && typeof input.path === 'string') {\n const mimeType = mimeTypeForSource(input.path);\n return {\n kind: 'image',\n name: attachmentName(input.path, 'Image'),\n path: input.path,\n ...(mimeType ? { mimeType } : {}),\n };\n }\n return null;\n}\n\nfunction attachmentName(source: string, fallback: string): string {\n try {\n const path = /^[a-z][a-z\\d+.-]*:/i.test(source) ? new URL(source).pathname : source;\n const name = basename(decodeURIComponent(path)).trim();\n return name || fallback;\n } catch {\n return basename(source).trim() || fallback;\n }\n}\n\nfunction mimeTypeForSource(source: string): string | undefined {\n const dataMimeType = /^data:([^;,]+)/i.exec(source)?.[1]?.toLowerCase();\n if (dataMimeType) return dataMimeType;\n let extension = '';\n try {\n const path = /^[a-z][a-z\\d+.-]*:/i.test(source) ? new URL(source).pathname : source;\n extension = extname(path).slice(1).toLowerCase();\n } catch {\n extension = extname(source).slice(1).toLowerCase();\n }\n return ({\n avif: 'image/avif',\n gif: 'image/gif',\n heic: 'image/heic',\n heif: 'image/heif',\n jpeg: 'image/jpeg',\n jpg: 'image/jpeg',\n pdf: 'application/pdf',\n png: 'image/png',\n svg: 'image/svg+xml',\n webp: 'image/webp',\n } as Record<string, string>)[extension];\n}\n\nexport function codexImageDataUrl(result: string): { url: string; mimeType: string } | null {\n if (!result) return null;\n const dataUrlMatch = /^data:image\\/[a-z0-9.+-]+;base64,([a-z0-9+/=\\s]+)$/i.exec(result);\n const compact = (dataUrlMatch?.[1] ?? result).replace(/\\s+/g, '');\n const maxEncodedLength = Math.ceil(MAX_INLINE_GENERATED_IMAGE_BYTES / 3) * 4 + 4;\n if (\n !compact\n || compact.length > maxEncodedLength\n || compact.length % 4 !== 0\n || !/^[a-z0-9+/]+={0,2}$/i.test(compact)\n ) {\n return null;\n }\n const bytes = Buffer.from(compact, 'base64');\n if (bytes.byteLength === 0 || bytes.byteLength > MAX_INLINE_GENERATED_IMAGE_BYTES) return null;\n const mimeType = generatedImageMimeType(bytes);\n if (!mimeType) return null;\n return { url: `data:${mimeType};base64,${compact}`, mimeType };\n}\n\nfunction isRendererSafeImagePreview(value: string | undefined): value is string {\n return Boolean(\n value\n && value.length <= 16 * 1024 * 1024\n && /^data:image\\/(?:avif|bmp|gif|heic|heif|jpe?g|png|webp);base64,[a-z\\d+/]+={0,2}$/i.test(value),\n );\n}\n\nfunction generatedImageMimeType(bytes: Uint8Array): string | null {\n if (startsWithBytes(bytes, [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a])) return 'image/png';\n if (startsWithBytes(bytes, [0xff, 0xd8, 0xff])) return 'image/jpeg';\n const header = Buffer.from(bytes.subarray(0, 12)).toString('ascii');\n if (header.startsWith('GIF87a') || header.startsWith('GIF89a')) return 'image/gif';\n if (header.startsWith('RIFF') && header.slice(8, 12) === 'WEBP') return 'image/webp';\n if (bytes.byteLength >= 12 && header.slice(4, 12) === 'ftypavif') return 'image/avif';\n return null;\n}\n\nfunction startsWithBytes(bytes: Uint8Array, prefix: readonly number[]): boolean {\n return prefix.every((value, index) => bytes[index] === value);\n}\n\nfunction surfaceMessageStatus(status: Turn['status']): SurfaceMessage['status'] {\n if (status === 'inProgress') return 'streaming';\n if (status === 'failed') return 'error';\n return 'complete';\n}\n\nfunction timestampToIso(timestamp: number | null | undefined): string {\n if (typeof timestamp !== 'number' || !Number.isFinite(timestamp)) {\n return new Date(0).toISOString();\n }\n return new Date(timestamp * 1000).toISOString();\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","const decoder = new TextDecoder();\nexport const toUTF8String = (input, start = 0, end = input.length) => decoder.decode(input.slice(start, end));\nexport const toHexString = (input, start = 0, end = input.length) => input\n .slice(start, end)\n .reduce((memo, i) => memo + `0${i.toString(16)}`.slice(-2), '');\nconst getView = (input, offset) => new DataView(input.buffer, input.byteOffset + offset);\nexport const readInt16LE = (input, offset = 0) => getView(input, offset).getInt16(0, true);\nexport const readUInt16BE = (input, offset = 0) => getView(input, offset).getUint16(0, false);\nexport const readUInt16LE = (input, offset = 0) => getView(input, offset).getUint16(0, true);\nexport const readUInt24LE = (input, offset = 0) => {\n const view = getView(input, offset);\n return view.getUint16(0, true) + (view.getUint8(2) << 16);\n};\nexport const readInt32LE = (input, offset = 0) => getView(input, offset).getInt32(0, true);\nexport const readUInt32BE = (input, offset = 0) => getView(input, offset).getUint32(0, false);\nexport const readUInt32LE = (input, offset = 0) => getView(input, offset).getUint32(0, true);\nexport const readUInt64 = (input, offset, isBigEndian) => getView(input, offset).getBigUint64(0, !isBigEndian);\nconst methods = {\n readUInt16BE,\n readUInt16LE,\n readUInt32BE,\n readUInt32LE,\n};\nexport function readUInt(input, bits, offset = 0, isBigEndian = false) {\n const endian = isBigEndian ? 'BE' : 'LE';\n const methodName = `readUInt${bits}${endian}`;\n return methods[methodName](input, offset);\n}\nconst BOX_HEADER_SIZE = 8;\nfunction readBox(input, offset) {\n if (input.length - offset < BOX_HEADER_SIZE)\n return undefined;\n const boxSize = readUInt32BE(input, offset);\n if (input.length - offset < boxSize)\n return undefined;\n return {\n name: toUTF8String(input, 4 + offset, 8 + offset),\n offset,\n size: boxSize,\n };\n}\nexport function findBox(input, boxName, startOffset) {\n let currentOffset = startOffset;\n while (currentOffset < input.length) {\n if (input.length - currentOffset < 4)\n break;\n const boxSize = readUInt32BE(input, currentOffset);\n if (boxSize < BOX_HEADER_SIZE) {\n currentOffset += BOX_HEADER_SIZE;\n continue;\n }\n const box = readBox(input, currentOffset);\n if (!box)\n break;\n if (box.name === boxName)\n return box;\n currentOffset += box.size;\n }\n return undefined;\n}\n","import { readInt32LE, readUInt32LE, toUTF8String } from './utils.js';\nexport const BMP = {\n validate: (input) => toUTF8String(input, 0, 2) === 'BM',\n calculate: (input) => ({\n height: Math.abs(readInt32LE(input, 22)),\n width: readUInt32LE(input, 18),\n }),\n};\n","import { readUInt16LE } from './utils.js';\nconst TYPE_ICON = 1;\nconst SIZE_HEADER = 2 + 2 + 2;\nconst SIZE_IMAGE_ENTRY = 1 + 1 + 1 + 1 + 2 + 2 + 4 + 4;\nfunction getSizeFromOffset(input, offset) {\n const value = input[offset];\n return value === 0 ? 256 : value;\n}\nfunction getImageSize(input, imageIndex) {\n const offset = SIZE_HEADER + imageIndex * SIZE_IMAGE_ENTRY;\n return {\n height: getSizeFromOffset(input, offset + 1),\n width: getSizeFromOffset(input, offset),\n };\n}\nexport const ICO = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0)\n return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_ICON;\n },\n calculate(input) {\n const nbImages = readUInt16LE(input, 4);\n if (SIZE_HEADER + nbImages * SIZE_IMAGE_ENTRY > input.length) {\n throw new TypeError('Invalid ICO');\n }\n const imageSize = getImageSize(input, 0);\n if (nbImages === 1)\n return imageSize;\n const images = [];\n for (let imageIndex = 0; imageIndex < nbImages; imageIndex += 1) {\n images.push(getImageSize(input, imageIndex));\n }\n return {\n width: imageSize.width,\n height: imageSize.height,\n images: images,\n };\n },\n};\n","import { ICO } from './ico.js';\nimport { readUInt16LE } from './utils.js';\nconst TYPE_CURSOR = 2;\nexport const CUR = {\n validate(input) {\n const reserved = readUInt16LE(input, 0);\n const imageCount = readUInt16LE(input, 4);\n if (reserved !== 0 || imageCount === 0)\n return false;\n const imageType = readUInt16LE(input, 2);\n return imageType === TYPE_CURSOR;\n },\n calculate: (input) => ICO.calculate(input),\n};\n","import { readUInt32LE } from './utils.js';\nexport const DDS = {\n validate: (input) => readUInt32LE(input, 0) === 0x20534444,\n calculate: (input) => ({\n height: readUInt32LE(input, 12),\n width: readUInt32LE(input, 16),\n }),\n};\n","import { readUInt16LE, toUTF8String } from './utils.js';\nconst gifRegexp = /^GIF8[79]a/;\nexport const GIF = {\n validate: (input) => gifRegexp.test(toUTF8String(input, 0, 6)),\n calculate: (input) => ({\n height: readUInt16LE(input, 8),\n width: readUInt16LE(input, 6),\n }),\n};\n","import { findBox, readUInt32BE, toUTF8String } from './utils.js';\nconst brandMap = {\n avif: 'avif',\n mif1: 'heif',\n msf1: 'heif',\n heic: 'heic',\n heix: 'heic',\n hevc: 'heic',\n hevx: 'heic',\n};\nexport const HEIF = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'ftyp')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand in brandMap;\n },\n calculate(input) {\n const metaBox = findBox(input, 'meta', 0);\n const iprpBox = metaBox && findBox(input, 'iprp', metaBox.offset + 12);\n const ipcoBox = iprpBox && findBox(input, 'ipco', iprpBox.offset + 8);\n if (!ipcoBox) {\n throw new TypeError('Invalid HEIF, no ipco box found');\n }\n const type = toUTF8String(input, 8, 12);\n const images = [];\n let currentOffset = ipcoBox.offset + 8;\n while (currentOffset < ipcoBox.offset + ipcoBox.size) {\n const ispeBox = findBox(input, 'ispe', currentOffset);\n if (!ispeBox)\n break;\n if (ispeBox.size < 20) {\n throw new TypeError('Invalid HEIF');\n }\n const rawWidth = readUInt32BE(input, ispeBox.offset + 12);\n const rawHeight = readUInt32BE(input, ispeBox.offset + 16);\n const clapBox = findBox(input, 'clap', currentOffset);\n let width = rawWidth;\n const height = rawHeight;\n if (clapBox &&\n clapBox.size >= 16 &&\n clapBox.offset < ipcoBox.offset + ipcoBox.size) {\n const cropRight = readUInt32BE(input, clapBox.offset + 12);\n width = rawWidth - cropRight;\n }\n images.push({ height, width });\n const nextOffset = ispeBox.offset + ispeBox.size;\n if (nextOffset <= currentOffset) {\n throw new TypeError('Invalid HEIF');\n }\n currentOffset = nextOffset;\n }\n if (images.length === 0) {\n throw new TypeError('Invalid HEIF, no sizes found');\n }\n return {\n width: images[0].width,\n height: images[0].height,\n type,\n ...(images.length > 1 ? { images } : {}),\n };\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nconst SIZE_HEADER = 4 + 4;\nconst FILE_LENGTH_OFFSET = 4;\nconst ENTRY_LENGTH_OFFSET = 4;\nconst ICON_TYPE_SIZE = {\n ICON: 32,\n 'ICN#': 32,\n 'icm#': 16,\n icm4: 16,\n icm8: 16,\n 'ics#': 16,\n ics4: 16,\n ics8: 16,\n is32: 16,\n s8mk: 16,\n icp4: 16,\n icl4: 32,\n icl8: 32,\n il32: 32,\n l8mk: 32,\n icp5: 32,\n ic11: 32,\n ich4: 48,\n ich8: 48,\n ih32: 48,\n h8mk: 48,\n icp6: 64,\n ic12: 32,\n it32: 128,\n t8mk: 128,\n ic07: 128,\n ic08: 256,\n ic13: 256,\n ic09: 512,\n ic14: 512,\n ic10: 1024,\n};\nfunction readImageHeader(input, imageOffset) {\n const imageLengthOffset = imageOffset + ENTRY_LENGTH_OFFSET;\n if (imageLengthOffset + 4 > input.length) {\n throw new TypeError('Invalid ICNS');\n }\n return [\n toUTF8String(input, imageOffset, imageLengthOffset),\n readUInt32BE(input, imageLengthOffset),\n ];\n}\nfunction getImageSize(type) {\n const size = ICON_TYPE_SIZE[type];\n return { width: size, height: size, type };\n}\nexport const ICNS = {\n validate: (input) => toUTF8String(input, 0, 4) === 'icns',\n calculate(input) {\n const inputLength = input.length;\n const fileLength = readUInt32BE(input, FILE_LENGTH_OFFSET);\n let imageOffset = SIZE_HEADER;\n const images = [];\n while (imageOffset < fileLength && imageOffset < inputLength) {\n const imageHeader = readImageHeader(input, imageOffset);\n const entryLength = imageHeader[1];\n if (entryLength < 8) {\n throw new TypeError('Invalid ICNS');\n }\n const imageSize = getImageSize(imageHeader[0]);\n images.push(imageSize);\n imageOffset += entryLength;\n }\n if (images.length === 0) {\n throw new TypeError('Invalid ICNS, no sizes found');\n }\n return {\n width: images[0].width,\n height: images[0].height,\n ...(images.length > 1 ? { images } : {}),\n };\n },\n};\n","import { readUInt32BE } from './utils.js';\nexport const J2C = {\n validate: (input) => readUInt32BE(input, 0) === 0xff4fff51,\n calculate: (input) => ({\n height: readUInt32BE(input, 12),\n width: readUInt32BE(input, 8),\n }),\n};\n","import { findBox, readUInt32BE, toUTF8String } from './utils.js';\nexport const JP2 = {\n validate(input) {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'jP ')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === 'jp2 ';\n },\n calculate(input) {\n const jp2hBox = findBox(input, 'jp2h', 0);\n const ihdrBox = jp2hBox && findBox(input, 'ihdr', jp2hBox.offset + 8);\n if (ihdrBox) {\n return {\n height: readUInt32BE(input, ihdrBox.offset + 8),\n width: readUInt32BE(input, ihdrBox.offset + 12),\n };\n }\n throw new TypeError('Unsupported JPEG 2000 format');\n },\n};\n","import { readUInt, readUInt16BE, toHexString } from './utils.js';\nconst EXIF_MARKER = '45786966';\nconst APP1_DATA_SIZE_BYTES = 2;\nconst EXIF_HEADER_BYTES = 6;\nconst TIFF_BYTE_ALIGN_BYTES = 2;\nconst BIG_ENDIAN_BYTE_ALIGN = '4d4d';\nconst LITTLE_ENDIAN_BYTE_ALIGN = '4949';\nconst IDF_ENTRY_BYTES = 12;\nconst NUM_DIRECTORY_ENTRIES_BYTES = 2;\nfunction isEXIF(input) {\n return toHexString(input, 2, 6) === EXIF_MARKER;\n}\nfunction extractSize(input, index) {\n return {\n height: readUInt16BE(input, index),\n width: readUInt16BE(input, index + 2),\n };\n}\nfunction extractOrientation(exifBlock, isBigEndian) {\n const idfOffset = 8;\n const offset = EXIF_HEADER_BYTES + idfOffset;\n const idfDirectoryEntries = readUInt(exifBlock, 16, offset, isBigEndian);\n for (let directoryEntryNumber = 0; directoryEntryNumber < idfDirectoryEntries; directoryEntryNumber++) {\n const start = offset +\n NUM_DIRECTORY_ENTRIES_BYTES +\n directoryEntryNumber * IDF_ENTRY_BYTES;\n const end = start + IDF_ENTRY_BYTES;\n if (start > exifBlock.length) {\n return;\n }\n const block = exifBlock.slice(start, end);\n const tagNumber = readUInt(block, 16, 0, isBigEndian);\n if (tagNumber === 274) {\n const dataFormat = readUInt(block, 16, 2, isBigEndian);\n if (dataFormat !== 3) {\n return;\n }\n const numberOfComponents = readUInt(block, 32, 4, isBigEndian);\n if (numberOfComponents !== 1) {\n return;\n }\n return readUInt(block, 16, 8, isBigEndian);\n }\n }\n}\nfunction validateExifBlock(input, index) {\n const exifBlock = input.slice(APP1_DATA_SIZE_BYTES, index);\n const byteAlign = toHexString(exifBlock, EXIF_HEADER_BYTES, EXIF_HEADER_BYTES + TIFF_BYTE_ALIGN_BYTES);\n const isBigEndian = byteAlign === BIG_ENDIAN_BYTE_ALIGN;\n const isLittleEndian = byteAlign === LITTLE_ENDIAN_BYTE_ALIGN;\n if (isBigEndian || isLittleEndian) {\n return extractOrientation(exifBlock, isBigEndian);\n }\n}\nfunction validateInput(input, index) {\n if (index > input.length) {\n throw new TypeError('Corrupt JPG, exceeded buffer limits');\n }\n}\nexport const JPG = {\n validate: (input) => toHexString(input, 0, 2) === 'ffd8',\n calculate(_input) {\n let input = _input.slice(4);\n let orientation;\n let next;\n while (input.length) {\n const i = readUInt16BE(input, 0);\n validateInput(input, i);\n if (input[i] !== 0xff) {\n input = input.slice(1);\n continue;\n }\n if (isEXIF(input)) {\n orientation = validateExifBlock(input, i);\n }\n next = input[i + 1];\n if (next === 0xc0 || next === 0xc1 || next === 0xc2) {\n const size = extractSize(input, i + 5);\n if (!orientation) {\n return size;\n }\n return {\n height: size.height,\n orientation,\n width: size.width,\n };\n }\n input = input.slice(i + 2);\n }\n throw new TypeError('Invalid JPG, no size found');\n },\n};\n","export class BitReader {\n input;\n endianness;\n byteOffset = 2;\n bitOffset = 0;\n constructor(input, endianness) {\n this.input = input;\n this.endianness = endianness;\n }\n getBits(length = 1) {\n let result = 0;\n let bitsRead = 0;\n while (bitsRead < length) {\n if (this.byteOffset >= this.input.length) {\n throw new Error('Reached end of input');\n }\n const currentByte = this.input[this.byteOffset];\n const bitsLeft = 8 - this.bitOffset;\n const bitsToRead = Math.min(length - bitsRead, bitsLeft);\n if (this.endianness === 'little-endian') {\n const mask = (1 << bitsToRead) - 1;\n const bits = (currentByte >> this.bitOffset) & mask;\n result |= bits << bitsRead;\n }\n else {\n const mask = ((1 << bitsToRead) - 1) << (8 - this.bitOffset - bitsToRead);\n const bits = (currentByte & mask) >> (8 - this.bitOffset - bitsToRead);\n result = (result << bitsToRead) | bits;\n }\n bitsRead += bitsToRead;\n this.bitOffset += bitsToRead;\n if (this.bitOffset === 8) {\n this.byteOffset++;\n this.bitOffset = 0;\n }\n }\n return result;\n }\n}\n","import { BitReader } from '../utils/bit-reader.js';\nimport { toHexString } from './utils.js';\nfunction calculateImageDimension(reader, isSmallImage) {\n if (isSmallImage) {\n return 8 * (1 + reader.getBits(5));\n }\n const sizeClass = reader.getBits(2);\n const extraBits = [9, 13, 18, 30][sizeClass];\n return 1 + reader.getBits(extraBits);\n}\nfunction calculateImageWidth(reader, isSmallImage, widthMode, height) {\n if (isSmallImage && widthMode === 0) {\n return 8 * (1 + reader.getBits(5));\n }\n if (widthMode === 0) {\n return calculateImageDimension(reader, false);\n }\n const aspectRatios = [1, 1.2, 4 / 3, 1.5, 16 / 9, 5 / 4, 2];\n return Math.floor(height * aspectRatios[widthMode - 1]);\n}\nexport const JXLStream = {\n validate: (input) => {\n return toHexString(input, 0, 2) === 'ff0a';\n },\n calculate(input) {\n const reader = new BitReader(input, 'little-endian');\n const isSmallImage = reader.getBits(1) === 1;\n const height = calculateImageDimension(reader, isSmallImage);\n const widthMode = reader.getBits(3);\n const width = calculateImageWidth(reader, isSmallImage, widthMode, height);\n return { width, height };\n },\n};\n","import { JXLStream } from './jxl-stream.js';\nimport { findBox, toUTF8String } from './utils.js';\nfunction extractCodestream(input) {\n const jxlcBox = findBox(input, 'jxlc', 0);\n if (jxlcBox) {\n return input.slice(jxlcBox.offset + 8, jxlcBox.offset + jxlcBox.size);\n }\n const partialStreams = extractPartialStreams(input);\n if (partialStreams.length > 0) {\n return concatenateCodestreams(partialStreams);\n }\n return undefined;\n}\nfunction extractPartialStreams(input) {\n const partialStreams = [];\n let offset = 0;\n while (offset < input.length) {\n const jxlpBox = findBox(input, 'jxlp', offset);\n if (!jxlpBox)\n break;\n if (jxlpBox.size < 12) {\n throw new TypeError('Invalid JXL');\n }\n partialStreams.push(input.slice(jxlpBox.offset + 12, jxlpBox.offset + jxlpBox.size));\n offset = jxlpBox.offset + jxlpBox.size;\n }\n return partialStreams;\n}\nfunction concatenateCodestreams(partialCodestreams) {\n const totalLength = partialCodestreams.reduce((acc, curr) => acc + curr.length, 0);\n const codestream = new Uint8Array(totalLength);\n let position = 0;\n for (const partial of partialCodestreams) {\n codestream.set(partial, position);\n position += partial.length;\n }\n return codestream;\n}\nexport const JXL = {\n validate: (input) => {\n const boxType = toUTF8String(input, 4, 8);\n if (boxType !== 'JXL ')\n return false;\n const ftypBox = findBox(input, 'ftyp', 0);\n if (!ftypBox)\n return false;\n const brand = toUTF8String(input, ftypBox.offset + 8, ftypBox.offset + 12);\n return brand === 'jxl ';\n },\n calculate(input) {\n const codestream = extractCodestream(input);\n if (codestream)\n return JXLStream.calculate(codestream);\n throw new TypeError('Invalid JXL');\n },\n};\n","import { readUInt32LE, toUTF8String } from './utils.js';\nexport const KTX = {\n validate: (input) => {\n const signature = toUTF8String(input, 1, 7);\n return ['KTX 11', 'KTX 20'].includes(signature);\n },\n calculate: (input) => {\n const type = input[5] === 0x31 ? 'ktx' : 'ktx2';\n const offset = type === 'ktx' ? 36 : 20;\n return {\n height: readUInt32LE(input, offset + 4),\n width: readUInt32LE(input, offset),\n type,\n };\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nconst pngSignature = 'PNG\\r\\n\\x1a\\n';\nconst pngImageHeaderChunkName = 'IHDR';\nconst pngFriedChunkName = 'CgBI';\nexport const PNG = {\n validate(input) {\n if (pngSignature === toUTF8String(input, 1, 8)) {\n let chunkName = toUTF8String(input, 12, 16);\n if (chunkName === pngFriedChunkName) {\n chunkName = toUTF8String(input, 28, 32);\n }\n if (chunkName !== pngImageHeaderChunkName) {\n throw new TypeError('Invalid PNG');\n }\n return true;\n }\n return false;\n },\n calculate(input) {\n if (toUTF8String(input, 12, 16) === pngFriedChunkName) {\n return {\n height: readUInt32BE(input, 36),\n width: readUInt32BE(input, 32),\n };\n }\n return {\n height: readUInt32BE(input, 20),\n width: readUInt32BE(input, 16),\n };\n },\n};\n","import { toUTF8String } from './utils.js';\nconst PNMTypes = {\n P1: 'pbm/ascii',\n P2: 'pgm/ascii',\n P3: 'ppm/ascii',\n P4: 'pbm',\n P5: 'pgm',\n P6: 'ppm',\n P7: 'pam',\n PF: 'pfm',\n};\nconst handlers = {\n default: (lines) => {\n let dimensions = [];\n while (lines.length > 0) {\n const line = lines.shift();\n if (line[0] === '#') {\n continue;\n }\n dimensions = line.split(' ');\n break;\n }\n if (dimensions.length === 2) {\n return {\n height: Number.parseInt(dimensions[1], 10),\n width: Number.parseInt(dimensions[0], 10),\n };\n }\n throw new TypeError('Invalid PNM');\n },\n pam: (lines) => {\n const size = {};\n while (lines.length > 0) {\n const line = lines.shift();\n if (line.length > 16 || line.charCodeAt(0) > 128) {\n continue;\n }\n const [key, value] = line.split(' ');\n if (key && value) {\n size[key.toLowerCase()] = Number.parseInt(value, 10);\n }\n if (size.height && size.width) {\n break;\n }\n }\n if (size.height && size.width) {\n return {\n height: size.height,\n width: size.width,\n };\n }\n throw new TypeError('Invalid PAM');\n },\n};\nexport const PNM = {\n validate: (input) => toUTF8String(input, 0, 2) in PNMTypes,\n calculate(input) {\n const signature = toUTF8String(input, 0, 2);\n const type = PNMTypes[signature];\n const lines = toUTF8String(input, 3).split(/[\\r\\n]+/);\n const handler = handlers[type] || handlers.default;\n return handler(lines);\n },\n};\n","import { readUInt32BE, toUTF8String } from './utils.js';\nexport const PSD = {\n validate: (input) => toUTF8String(input, 0, 4) === '8BPS',\n calculate: (input) => ({\n height: readUInt32BE(input, 14),\n width: readUInt32BE(input, 18),\n }),\n};\n","import { toUTF8String } from './utils.js';\nconst svgReg = /<svg\\s([^>\"']|\"[^\"]*\"|'[^']*')*>/;\nconst extractorRegExps = {\n height: /\\sheight=(['\"])([^%]+?)\\1/,\n root: svgReg,\n viewbox: /\\sviewBox=(['\"])(.+?)\\1/i,\n width: /\\swidth=(['\"])([^%]+?)\\1/,\n};\nconst INCH_CM = 2.54;\nconst units = {\n in: 96,\n cm: 96 / INCH_CM,\n em: 16,\n ex: 8,\n m: (96 / INCH_CM) * 100,\n mm: 96 / INCH_CM / 10,\n pc: 96 / 72 / 12,\n pt: 96 / 72,\n px: 1,\n};\nconst unitsReg = new RegExp(`^([0-9.]+(?:e\\\\d+)?)(${Object.keys(units).join('|')})?$`);\nfunction parseLength(len) {\n const m = unitsReg.exec(len);\n if (!m) {\n return undefined;\n }\n return Math.round(Number(m[1]) * (units[m[2]] || 1));\n}\nfunction parseViewbox(viewbox) {\n const bounds = viewbox.split(' ');\n return {\n height: parseLength(bounds[3]),\n width: parseLength(bounds[2]),\n };\n}\nfunction parseAttributes(root) {\n const width = root.match(extractorRegExps.width);\n const height = root.match(extractorRegExps.height);\n const viewbox = root.match(extractorRegExps.viewbox);\n return {\n height: height && parseLength(height[2]),\n viewbox: viewbox && parseViewbox(viewbox[2]),\n width: width && parseLength(width[2]),\n };\n}\nfunction calculateByDimensions(attrs) {\n return {\n height: attrs.height,\n width: attrs.width,\n };\n}\nfunction calculateByViewbox(attrs, viewbox) {\n const ratio = viewbox.width / viewbox.height;\n if (attrs.width) {\n return {\n height: Math.floor(attrs.width / ratio),\n width: attrs.width,\n };\n }\n if (attrs.height) {\n return {\n height: attrs.height,\n width: Math.floor(attrs.height * ratio),\n };\n }\n return {\n height: viewbox.height,\n width: viewbox.width,\n };\n}\nexport const SVG = {\n validate: (input) => svgReg.test(toUTF8String(input, 0, 1000)),\n calculate(input) {\n const root = toUTF8String(input).match(extractorRegExps.root);\n if (root) {\n const attrs = parseAttributes(root[0]);\n if (attrs.width && attrs.height) {\n return calculateByDimensions(attrs);\n }\n if (attrs.viewbox) {\n return calculateByViewbox(attrs, attrs.viewbox);\n }\n }\n throw new TypeError('Invalid SVG');\n },\n};\n","import { readUInt16LE } from './utils.js';\nexport const TGA = {\n validate(input) {\n return readUInt16LE(input, 0) === 0 && readUInt16LE(input, 4) === 0;\n },\n calculate(input) {\n return {\n height: readUInt16LE(input, 14),\n width: readUInt16LE(input, 12),\n };\n },\n};\n","import { readUInt, readUInt64, toHexString, toUTF8String } from './utils.js';\nconst CONSTANTS = {\n TAG: {\n WIDTH: 256,\n HEIGHT: 257,\n COMPRESSION: 259,\n },\n TYPE: {\n SHORT: 3,\n LONG: 4,\n LONG8: 16,\n },\n ENTRY_SIZE: {\n STANDARD: 12,\n BIG: 20,\n },\n COUNT_SIZE: {\n STANDARD: 2,\n BIG: 8,\n },\n};\nfunction readIFD(input, { isBigEndian, isBigTiff }) {\n const ifdOffset = isBigTiff\n ? Number(readUInt64(input, 8, isBigEndian))\n : readUInt(input, 32, 4, isBigEndian);\n const entryCountSize = isBigTiff\n ? CONSTANTS.COUNT_SIZE.BIG\n : CONSTANTS.COUNT_SIZE.STANDARD;\n return input.slice(ifdOffset + entryCountSize);\n}\nfunction readTagValue(input, type, offset, isBigEndian) {\n switch (type) {\n case CONSTANTS.TYPE.SHORT:\n return readUInt(input, 16, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG:\n return readUInt(input, 32, offset, isBigEndian);\n case CONSTANTS.TYPE.LONG8: {\n const value = Number(readUInt64(input, offset, isBigEndian));\n if (value > Number.MAX_SAFE_INTEGER) {\n throw new TypeError('Value too large');\n }\n return value;\n }\n default:\n return 0;\n }\n}\nfunction nextTag(input, isBigTiff) {\n const entrySize = isBigTiff\n ? CONSTANTS.ENTRY_SIZE.BIG\n : CONSTANTS.ENTRY_SIZE.STANDARD;\n if (input.length > entrySize) {\n return input.slice(entrySize);\n }\n}\nfunction extractTags(input, { isBigEndian, isBigTiff }) {\n const tags = {};\n let temp = input;\n while (temp?.length) {\n const code = readUInt(temp, 16, 0, isBigEndian);\n const type = readUInt(temp, 16, 2, isBigEndian);\n const length = isBigTiff\n ? Number(readUInt64(temp, 4, isBigEndian))\n : readUInt(temp, 32, 4, isBigEndian);\n if (code === 0)\n break;\n if (length === 1 &&\n (type === CONSTANTS.TYPE.SHORT ||\n type === CONSTANTS.TYPE.LONG ||\n (isBigTiff && type === CONSTANTS.TYPE.LONG8))) {\n const valueOffset = isBigTiff ? 12 : 8;\n tags[code] = readTagValue(temp, type, valueOffset, isBigEndian);\n }\n temp = nextTag(temp, isBigTiff);\n }\n return tags;\n}\nfunction determineFormat(input) {\n const signature = toUTF8String(input, 0, 2);\n const version = readUInt(input, 16, 2, signature === 'MM');\n return {\n isBigEndian: signature === 'MM',\n isBigTiff: version === 43,\n };\n}\nfunction validateBigTIFFHeader(input, isBigEndian) {\n const byteSize = readUInt(input, 16, 4, isBigEndian);\n const reserved = readUInt(input, 16, 6, isBigEndian);\n if (byteSize !== 8 || reserved !== 0) {\n throw new TypeError('Invalid BigTIFF header');\n }\n}\nconst signatures = new Set([\n '49492a00',\n '4d4d002a',\n '49492b00',\n '4d4d002b',\n]);\nexport const TIFF = {\n validate: (input) => {\n const signature = toHexString(input, 0, 4);\n return signatures.has(signature);\n },\n calculate(input) {\n const format = determineFormat(input);\n if (format.isBigTiff) {\n validateBigTIFFHeader(input, format.isBigEndian);\n }\n const ifdBuffer = readIFD(input, format);\n const tags = extractTags(ifdBuffer, format);\n const info = {\n height: tags[CONSTANTS.TAG.HEIGHT],\n width: tags[CONSTANTS.TAG.WIDTH],\n type: format.isBigTiff ? 'bigtiff' : 'tiff',\n };\n if (tags[CONSTANTS.TAG.COMPRESSION]) {\n info.compression = tags[CONSTANTS.TAG.COMPRESSION];\n }\n if (!info.width || !info.height) {\n throw new TypeError('Invalid Tiff. Missing tags');\n }\n return info;\n },\n};\n","import { readInt16LE, readUInt24LE, toHexString, toUTF8String } from './utils.js';\nfunction calculateExtended(input) {\n return {\n height: 1 + readUInt24LE(input, 7),\n width: 1 + readUInt24LE(input, 4),\n };\n}\nfunction calculateLossless(input) {\n return {\n height: 1 +\n (((input[4] & 0xf) << 10) | (input[3] << 2) | ((input[2] & 0xc0) >> 6)),\n width: 1 + (((input[2] & 0x3f) << 8) | input[1]),\n };\n}\nfunction calculateLossy(input) {\n return {\n height: readInt16LE(input, 8) & 0x3fff,\n width: readInt16LE(input, 6) & 0x3fff,\n };\n}\nexport const WEBP = {\n validate(input) {\n const riffHeader = 'RIFF' === toUTF8String(input, 0, 4);\n const webpHeader = 'WEBP' === toUTF8String(input, 8, 12);\n const vp8Header = 'VP8' === toUTF8String(input, 12, 15);\n return riffHeader && webpHeader && vp8Header;\n },\n calculate(_input) {\n const chunkHeader = toUTF8String(_input, 12, 16);\n const input = _input.slice(20, 30);\n if (chunkHeader === 'VP8X') {\n const extendedHeader = input[0];\n const validStart = (extendedHeader & 0xc0) === 0;\n const validEnd = (extendedHeader & 0x01) === 0;\n if (validStart && validEnd) {\n return calculateExtended(input);\n }\n throw new TypeError('Invalid WebP');\n }\n if (chunkHeader === 'VP8 ' && input[0] !== 0x2f) {\n return calculateLossy(input);\n }\n const signature = toHexString(input, 3, 6);\n if (chunkHeader === 'VP8L' && signature !== '9d012a') {\n return calculateLossless(input);\n }\n throw new TypeError('Invalid WebP');\n },\n};\n","import { BMP } from './bmp.js';\nimport { CUR } from './cur.js';\nimport { DDS } from './dds.js';\nimport { GIF } from './gif.js';\nimport { HEIF } from './heif.js';\nimport { ICNS } from './icns.js';\nimport { ICO } from './ico.js';\nimport { J2C } from './j2c.js';\nimport { JP2 } from './jp2.js';\nimport { JPG } from './jpg.js';\nimport { JXL } from './jxl.js';\nimport { JXLStream } from './jxl-stream.js';\nimport { KTX } from './ktx.js';\nimport { PNG } from './png.js';\nimport { PNM } from './pnm.js';\nimport { PSD } from './psd.js';\nimport { SVG } from './svg.js';\nimport { TGA } from './tga.js';\nimport { TIFF } from './tiff.js';\nimport { WEBP } from './webp.js';\nexport const typeHandlers = new Map([\n ['bmp', BMP],\n ['cur', CUR],\n ['dds', DDS],\n ['gif', GIF],\n ['heif', HEIF],\n ['icns', ICNS],\n ['ico', ICO],\n ['j2c', J2C],\n ['jp2', JP2],\n ['jpg', JPG],\n ['jxl', JXL],\n ['jxl-stream', JXLStream],\n ['ktx', KTX],\n ['png', PNG],\n ['pnm', PNM],\n ['psd', PSD],\n ['svg', SVG],\n ['tga', TGA],\n ['tiff', TIFF],\n ['webp', WEBP],\n]);\nexport const types = Array.from(typeHandlers.keys());\n","import { typeHandlers, types } from './types/index.js';\nconst firstBytes = new Map([\n [0x00, 'heif'],\n [0x38, 'psd'],\n [0x42, 'bmp'],\n [0x44, 'dds'],\n [0x47, 'gif'],\n [0x49, 'tiff'],\n [0x4d, 'tiff'],\n [0x52, 'webp'],\n [0x69, 'icns'],\n [0x89, 'png'],\n [0xff, 'jpg'],\n]);\nexport function detector(input) {\n const byte = input[0];\n const type = firstBytes.get(byte);\n if (type && typeHandlers.get(type)?.validate(input)) {\n return type;\n }\n return types.find((type) => typeHandlers.get(type)?.validate(input));\n}\n","import { detector } from './detector.js';\nimport { typeHandlers } from './types/index.js';\nconst globalOptions = {\n disabledTypes: [],\n};\nexport function imageSize(input) {\n const type = detector(input);\n if (typeof type !== 'undefined') {\n if (globalOptions.disabledTypes.indexOf(type) > -1) {\n throw new TypeError(`disabled file type: ${type}`);\n }\n const size = typeHandlers.get(type)?.calculate(input);\n if (size !== undefined) {\n size.type = size.type ?? type;\n if (size.images && size.images.length > 1) {\n const largestImage = size.images.reduce((largest, current) => {\n return current.width * current.height > largest.width * largest.height\n ? current\n : largest;\n }, size.images[0]);\n size.width = largestImage.width;\n size.height = largestImage.height;\n }\n return size;\n }\n }\n throw new TypeError(`unsupported file type: ${type}`);\n}\nexport const disableTypes = (types) => {\n globalOptions.disabledTypes = types;\n};\n","import { createHash } from 'node:crypto';\nimport { imageSize } from 'image-size';\n\ntype Content = { text: string; byteLength: number; charOffset: number; byteOffset: number };\ntype Projection = { value: unknown; contents: Map<string, Content> };\n/** Transport-only image and file-diff references. Reads require the caller's current authoritative\n * snapshot; the weak cache neither owns history nor keeps discarded snapshots alive. */\nexport class ConversationContentTransport {\n private readonly cache = new WeakMap<object, Projection>();\n constructor(private readonly conversationId: string) {}\n\n project<T>(source: T): T { return this.projection(source).value as T; }\n\n read(source: object, contentId: string, offset: number): { data: string; totalBytes: number; nextOffset: number | null } {\n const content = this.projection(source).contents.get(contentId);\n if (!content) throw new Error('Conversation content is no longer available.');\n if (!Number.isSafeInteger(offset) || offset < 0 || offset >= content.byteLength) throw new Error('Invalid content offset.');\n const end = Math.min(content.byteLength, offset + 64 * 1024);\n return { data: contentChunk(content, offset, end).toString('base64'), totalBytes: content.byteLength, nextOffset: end < content.byteLength ? end : null };\n }\n\n private projection(source: unknown): Projection {\n if (source && typeof source === 'object') {\n const cached = this.cache.get(source);\n if (cached) return cached;\n }\n const contents = new Map<string, Content>();\n const references = new Map<string, string>();\n const dimensions = new Map<string, { width: number; height: number } | undefined>();\n const visit = (value: unknown, field?: string): unknown => {\n if (typeof value === 'string' && ['url', 'imageUrl', 'image_url', 'previewUrl'].includes(field ?? '') && /^data:image\\/[a-z0-9.+-]+;base64,[a-z\\d+/]+=*$/i.test(value)) {\n let reference = references.get(value);\n if (!reference) {\n const id = contentHash(value);\n contents.set(id, { text: value, byteLength: value.length, charOffset: 0, byteOffset: 0 });\n reference = `conversation-image:${encodeURIComponent(this.conversationId)}:${id}`;\n references.set(value, reference);\n dimensions.set(reference, imageDimensions(value));\n }\n return reference;\n }\n if (!value || typeof value !== 'object') return value;\n const change = value as { path?: unknown; kind?: { type?: unknown }; diff?: unknown };\n if (typeof change.path === 'string' && ['add', 'update', 'delete'].includes(String(change.kind?.type))\n && typeof change.diff === 'string' && change.diff.length > 0) {\n const byteLength = Buffer.byteLength(change.diff);\n const contentId = contentHash(change.diff);\n contents.set(contentId, { text: change.diff, byteLength, charOffset: 0, byteOffset: 0 });\n return { ...value, diff: byteLength > 64 * 1024 ? '' : change.diff, diffContent: { sessionId: this.conversationId, contentId, byteLength, changeKind: change.kind!.type } };\n }\n let changed = false;\n let size: { width: number; height: number } | undefined;\n const entries = Object.entries(value).map(([key, child]) => {\n const next = visit(child, key); changed ||= next !== child;\n if (typeof next === 'string') size ??= dimensions.get(next);\n return [key, next] as const;\n });\n return changed ? Array.isArray(value) ? entries.map(([, child]) => child) : { ...Object.fromEntries(entries), ...size } : value;\n };\n const projection = { value: visit(source), contents };\n if (source && typeof source === 'object') this.cache.set(source, projection);\n return projection;\n }\n}\n\n/** Retain the provider string, not another full binary copy. Non-ASCII diffs are\n * encoded in bounded blocks; the cursor makes sequential chunk reads linear. */\nfunction contentChunk(content: Content, start: number, end: number): Buffer {\n if (content.byteLength === content.text.length) return Buffer.from(content.text.slice(start, end));\n if (start < content.byteOffset) { content.charOffset = 0; content.byteOffset = 0; }\n const chunks: Buffer[] = [];\n while (content.byteOffset < end) {\n const nextChar = blockEnd(content.text, content.charOffset);\n const text = content.text.slice(content.charOffset, nextChar);\n const nextByte = content.byteOffset + Buffer.byteLength(text);\n if (nextByte > start) chunks.push(Buffer.from(text).subarray(Math.max(0, start - content.byteOffset), Math.min(nextByte, end) - content.byteOffset));\n if (nextByte >= end) break;\n content.charOffset = nextChar; content.byteOffset = nextByte;\n }\n return Buffer.concat(chunks, end - start);\n}\n\nfunction blockEnd(text: string, start: number): number {\n const end = Math.min(text.length, start + 16 * 1024);\n const last = text.charCodeAt(end - 1);\n return end < text.length && last >= 0xd800 && last <= 0xdbff ? end - 1 : end;\n}\n\nfunction contentHash(text: string): string {\n const hash = createHash('sha256');\n for (let start = 0; start < text.length;) {\n const end = blockEnd(text, start);\n hash.update(text.slice(start, end)); start = end;\n }\n return hash.digest('hex');\n}\n\n/** Probe a bounded header, never decode or duplicate the full image. Unsupported\n * or truncated headers omit metadata; the image remains readable unchanged. */\nexport function imageDimensions(dataUrl: string): { width: number; height: number } | undefined {\n try {\n const start = dataUrl.indexOf(',') + 1;\n const { width, height, orientation } = imageSize(Buffer.from(dataUrl.slice(start, start + 64 * 1024), 'base64'));\n if (!Number.isSafeInteger(width) || !Number.isSafeInteger(height) || width <= 0 || height <= 0) return undefined;\n return orientation && orientation >= 5 && orientation <= 8 ? { width: height, height: width } : { width, height };\n } catch { return undefined; }\n}\n","import { createHash } from 'node:crypto';\nimport { open, stat } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport type { FileHandle } from 'node:fs/promises';\nimport type { CodexAppServerClient } from '../codex';\nimport type { SurfaceMessage, SurfaceMessageMediaPart } from '@codex-app-sdk/core/surface';\nimport { codexImageDataUrl } from './codex-conversation-history';\nimport { imageDimensions } from './conversation-content-transport';\n\nconst MAX_RECORD = 32 * 1024 * 1024;\nconst MAX_IMAGE = 20 * 1024 * 1024;\nconst MAX_IMAGES = 2048;\ntype Location = { offset: number; length: number; turnId: string; callId: string; imageIndex: number; byteLength: number; hash: string; part: SurfaceMessageMediaPart };\ntype Index = { path: string; signature: string; images: Map<string, Location> };\ntype RecordValue = { type?: string; payload?: Record<string, unknown> };\n\n/** Read-only provider history. Retains at most two small offset indexes and two\n * encoded images under a shared budget; never writes files or keeps a second transcript. */\nexport class CodexOriginalHistoryImages {\n private readonly paths = new Map<string, string>();\n private readonly indexes = new Map<string, Index>();\n private disposed = false;\n private work: Promise<unknown> = Promise.resolve();\n private readonly images = new Map<string, { signature: string; url: string }>();\n constructor(private readonly client: CodexAppServerClient) {}\n\n forget(threadId: string) { this.paths.delete(threadId); this.indexes.delete(threadId); this.images.clear(); }\n clear() { this.disposed = true; this.paths.clear(); this.indexes.clear(); this.images.clear(); }\n\n rememberPath(threadId: string, path?: string | null): void {\n if (path !== undefined && path !== this.paths.get(threadId)) { this.indexes.delete(threadId); this.paths.delete(threadId); if (path && isAbsolute(path)) this.paths.set(threadId, path); }\n }\n\n async prepare(threadId: string, path?: string | null): Promise<(messages: SurfaceMessage[]) => SurfaceMessage[]> {\n this.rememberPath(threadId, path);\n let index: Index | undefined;\n try { index = await this.exclusive(() => this.index(threadId)); } catch { /* Unavailable provider history does not hide the normal transcript. */ }\n const parts = new Map<string, SurfaceMessageMediaPart[]>();\n for (const image of index?.images.values() ?? []) {\n const group = parts.get(image.turnId) ?? []; group.push(image.part); parts.set(image.turnId, group);\n }\n return messages => {\n const lastAssistant = new Map(messages.filter(m => m.role === 'assistant').map(m => [m.turnId, m.id]));\n return messages.map(message => {\n if (message.role !== 'assistant' || message.status === 'streaming') return message;\n const viewed = new Set(message.parts.filter(p => p.type === 'tool' && p.title === 'view_image').map(p => p.type === 'tool' ? p.id : ''));\n const kept = message.parts.filter(p => p.type !== 'media' || (!viewed.has(p.itemId ?? '') && !p.itemId?.startsWith('original-image:')));\n const originals = lastAssistant.get(message.turnId) === message.id ? parts.get(message.turnId ?? '') ?? [] : [];\n const final = kept.findIndex(p => p.type === 'text' && p.phase === 'final_answer');\n const at = final < 0 ? kept.length : final;\n return { ...message, parts: [...kept.slice(0, at), ...originals, ...kept.slice(at)] };\n });\n };\n }\n\n read(threadId: string, contentId: string, offset: number) {\n return this.exclusive(() => this.readOriginal(threadId, contentId, offset));\n }\n\n private exclusive<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.work.then(operation, operation);\n this.work = result.then(() => undefined, () => undefined);\n return result;\n }\n\n private async readOriginal(threadId: string, contentId: string, offset: number) {\n const index = await this.index(threadId);\n const location = index.images.get(contentId);\n if (!location) throw new Error('Original conversation image is no longer available.');\n if (!Number.isSafeInteger(offset) || offset < 0 || offset >= location.byteLength) throw new Error('Invalid content offset.');\n const signature = fileSignature(await stat(index.path));\n if (this.disposed || this.paths.get(threadId) !== index.path) throw new Error('Conversation image reader was released.');\n const cached = this.images.get(contentId);\n let url = cached?.signature === signature ? cached.url : undefined;\n this.images.delete(contentId);\n if (!url) {\n const file = await open(index.path, 'r');\n try {\n await verifyOwner(file, threadId);\n const bytes = Buffer.alloc(location.length);\n for (let position = 0; position < bytes.length;) {\n const result = await file.read(bytes, position, Math.min(64 * 1024, bytes.length - position), location.offset + position);\n if (!result.bytesRead) throw new Error('Original image record was truncated.');\n position += result.bytesRead;\n }\n const record = JSON.parse(bytes.toString('utf8')) as RecordValue;\n const payload = record.payload;\n if (record.type !== 'response_item' || payload?.type !== 'custom_tool_call_output' || payload.call_id !== location.callId\n || turnId(payload) !== location.turnId || !Array.isArray(payload.output)) throw new Error('Original image identity changed.');\n const block = payload.output[location.imageIndex];\n const candidate = imageUrl(block);\n if (!candidate || hash(candidate) !== location.hash) throw new Error('Original image bytes changed.');\n url = candidate;\n if (this.disposed || this.paths.get(threadId) !== index.path) throw new Error('Conversation image reader was released.');\n } finally { await file.close(); }\n }\n this.images.set(contentId, { signature, url });\n while (this.images.size > 2 || [...this.images.values()].reduce((sum, image) => sum + image.url.length, 0) > MAX_IMAGE) {\n this.images.delete(this.images.keys().next().value!);\n }\n const end = Math.min(url.length, offset + 64 * 1024);\n return { data: Buffer.from(url.slice(offset, end)).toString('base64'), totalBytes: url.length, nextOffset: end < url.length ? end : null };\n }\n\n private async index(threadId: string): Promise<Index> {\n if (this.disposed) throw new Error('Conversation image reader was released.');\n let path = this.paths.get(threadId);\n if (!path) {\n const { thread } = await this.client.request('thread/read', { threadId, includeTurns: false });\n if (thread.id !== threadId || !thread.path || !isAbsolute(thread.path)) throw new Error('Original history is unavailable.');\n if (this.disposed) throw new Error('Conversation image reader was released.');\n path = thread.path; this.paths.set(threadId, path);\n }\n const metadata = await stat(path);\n if (!metadata.isFile()) throw new Error('Original history is not a file.');\n const signature = fileSignature(metadata);\n const cached = this.indexes.get(threadId);\n if (cached?.signature === signature) return cached;\n const images = new Map<string, Location>();\n const calls = new Map<string, string>();\n const file = await open(path, 'r');\n try {\n await verifyOwner(file, threadId);\n let records = 0;\n for await (const line of lines(file, metadata.size)) {\n if (++records > 100_000 || images.size >= MAX_IMAGES) break;\n let record: RecordValue;\n try { record = JSON.parse(line.text) as RecordValue; } catch { continue; }\n const payload = record?.payload;\n if (record?.type !== 'response_item' || !payload || typeof payload.call_id !== 'string' || !payload.call_id || payload.call_id.length > 256) continue;\n const turn = turnId(payload);\n if (!turn) continue;\n if (payload.type === 'custom_tool_call') {\n if (calls.size < 4096) calls.set(payload.call_id, turn);\n continue;\n }\n if (payload.type !== 'custom_tool_call_output' || calls.get(payload.call_id) !== turn || !Array.isArray(payload.output)) continue;\n calls.delete(payload.call_id);\n for (let i = 0; i < Math.min(payload.output.length, 256) && images.size < MAX_IMAGES; i++) {\n const url = imageUrl(payload.output[i]);\n if (!url) continue;\n const digest = hash(url);\n const id = hash(JSON.stringify([threadId, turn, payload.call_id, i, digest]));\n images.set(id, { offset: line.offset, length: line.length, turnId: turn, callId: payload.call_id, imageIndex: i, byteLength: url.length, hash: digest,\n part: { type: 'media', phase: 'commentary', itemId: `original-image:${payload.call_id}:${i}`, media: {\n url: `conversation-image:${encodeURIComponent(threadId)}:${id}`, mimeType: url.slice(5, url.indexOf(';')),\n title: 'Recorded tool image', alt: 'Recorded tool image', ...imageDimensions(url),\n } } });\n }\n }\n } finally { await file.close(); }\n if (this.disposed || this.paths.get(threadId) !== path) throw new Error('Conversation image reader was released.');\n const index = { path, signature, images };\n this.indexes.delete(threadId); this.indexes.set(threadId, index);\n while (this.indexes.size > 2) this.indexes.delete(this.indexes.keys().next().value!);\n return index;\n }\n}\n\nfunction turnId(payload: Record<string, unknown>): string | undefined {\n const metadata = payload.internal_chat_message_metadata_passthrough;\n return metadata && typeof metadata === 'object' && 'turn_id' in metadata && typeof metadata.turn_id === 'string' && metadata.turn_id.length <= 256 ? metadata.turn_id : undefined;\n}\nfunction imageUrl(block: unknown): string | undefined {\n if (!block || typeof block !== 'object' || !('type' in block) || block.type !== 'input_image' || !('image_url' in block)\n || typeof block.image_url !== 'string' || block.image_url.length > MAX_IMAGE) return;\n return codexImageDataUrl(block.image_url)?.url;\n}\nfunction hash(text: string) { return createHash('sha256').update(text).digest('hex'); }\nfunction fileSignature(value: { dev: number; ino: number; size: number; mtimeMs: number }) { return `${value.dev}:${value.ino}:${value.size}:${value.mtimeMs}`; }\nasync function verifyOwner(file: FileHandle, threadId: string) {\n const header = Buffer.alloc(64 * 1024); const { bytesRead } = await file.read(header, 0, header.length, 0);\n const line = header.subarray(0, bytesRead).toString('utf8').split('\\n', 1)[0]!;\n const record = JSON.parse(line) as RecordValue;\n if (record?.type !== 'session_meta' || record.payload?.id !== threadId) throw new Error('Original history belongs to a different conversation.');\n}\n\n/** Fixed-size file reads; oversized records are skipped without retaining them. */\nasync function* lines(file: FileHandle, size: number) {\n let offset = 0, start = 0, length = 0; let pieces: Buffer[] = [];\n while (offset < size) {\n const chunk = Buffer.alloc(Math.min(64 * 1024, size - offset));\n const { bytesRead } = await file.read(chunk, 0, chunk.length, offset);\n if (!bytesRead) break;\n let from = 0;\n while (from < bytesRead) {\n const newline = chunk.indexOf(10, from), end = newline < 0 || newline >= bytesRead ? bytesRead : newline;\n const piece = chunk.subarray(from, end); length += piece.length;\n if (length <= MAX_RECORD) pieces.push(piece); else pieces = [];\n if (newline >= 0 && newline < bytesRead) {\n if (length <= MAX_RECORD) yield { offset: start, length, text: Buffer.concat(pieces, length).toString('utf8') };\n start = offset + end + 1; length = 0; pieces = [];\n }\n from = end + 1;\n }\n offset += bytesRead;\n }\n // A trailing partial record is ignored until the provider appends its newline.\n}\n\n/** Keep mutable viewed files as operations, not historical screenshot substitutes. */\nexport function suppressViewedImagePreviews(messages: SurfaceMessage[]): SurfaceMessage[] {\n return messages.map(message => {\n const viewed = new Set(message.parts.filter(p => p.type === 'tool' && p.title === 'view_image').map(p => p.type === 'tool' ? p.id : ''));\n return viewed.size ? { ...message, parts: message.parts.filter(p => p.type !== 'media' || !viewed.has(p.itemId ?? '')) } : message;\n });\n}\n","import type {\n CodexSurfaceEvent, CodexSurfaceEventOrigin, CodexSurfaceExecutionUsage, CodexSurfaceRequestUsage, CodexSurfaceTokenUsage,\n} from '@codex-app-sdk/core/surface';\n\ntype EventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent ? Omit<Event, 'seq' | 'occurredAt' | 'origin'> : never\n : never;\nconst unavailableRequestUsage: CodexSurfaceRequestUsage = {\n status: 'unavailable',\n reason: 'public-runtime-request-evidence-unavailable',\n unavailableFields: [\n 'requestIdentity', 'timestamp', 'actualModel', 'actualProvider', 'requestTokenUsage',\n 'cacheWriteLifetimes', 'cacheWriteInputInclusion', 'pricingContext',\n 'requestedModel', 'requestedServiceTier', 'reportedServiceTier', 'finality',\n ],\n requests: null,\n};\n\ntype Execution = { baseline: CodexSurfaceTokenUsage | null; latest: CodexSurfaceExecutionUsage | null;\n native?: { total: CodexSurfaceTokenUsage; execution: CodexSurfaceTokenUsage } };\ntype ThreadUsage = {\n total: CodexSurfaceTokenUsage | null;\n lastUsageTurnId: string | null;\n activeTurnId: string | null;\n executions: Map<string, Execution>;\n};\n\n/** Attributes provider counters only across locally observed execution boundaries. */\nexport class CodexSurfaceUsageController {\n private readonly threads = new Map<string, ThreadUsage>();\n\n clear(): void { this.threads.clear(); }\n\n recover(id: string, turnId: string, value: { total: CodexSurfaceTokenUsage; last: CodexSurfaceTokenUsage; execution: CodexSurfaceTokenUsage }): CodexSurfaceExecutionUsage | undefined {\n const record = this.threads.get(id)?.executions.get(turnId);\n if (!record) return;\n // Native history can flush after the corresponding live packet. Preserve\n // the newer live suffix while adding any native-only compaction charge.\n const suffix = record.latest ? difference(value.total, record.latest.total) : null;\n const execution = suffix ? add(value.execution, suffix) ?? value.execution : value.execution;\n const total = suffix ? record.latest!.total : value.total;\n const last = suffix ? record.latest!.last : value.last;\n record.native = structuredClone({ total, execution });\n const usage = { ...structuredClone({ last, total, execution }), observedStart: true, model: record.latest?.model ?? null,\n requestUsage: structuredClone(unavailableRequestUsage) };\n record.latest = structuredClone(usage);\n return usage;\n }\n\n /** A successful thread/start establishes zero prior consumption, unlike resume or fork. */\n observeEmptyConversation(id: string): void {\n // Preserve any provider evidence that arrived before the start response.\n if (this.threads.has(id)) return;\n this.thread(id).total = {\n totalTokens: 0, inputTokens: 0, cachedInputTokens: 0, cacheWriteInputTokens: 0,\n outputTokens: 0, reasoningOutputTokens: 0,\n };\n }\n\n observe(origin: CodexSurfaceEventOrigin, input: EventInput): EventInput {\n if (!('conversationId' in input)) return input;\n const id = input.conversationId;\n if ((input.type === 'conversation.historyReplaced' && input.payload.reason !== 'details' && input.payload.reason !== 'images') || input.type === 'conversation.summaryRemoved') {\n this.threads.delete(id);\n return input;\n }\n if (input.type === 'turn.started' && origin !== 'lifecycle') {\n const thread = this.thread(id);\n if (!thread.executions.has(input.turnId)) {\n thread.executions.set(input.turnId, {\n baseline: thread.lastUsageTurnId === input.turnId ? null : thread.total, latest: null,\n });\n }\n thread.activeTurnId = input.turnId;\n return input;\n }\n if (input.type === 'turn.completed') {\n const thread = this.threads.get(id);\n if (thread?.activeTurnId === input.turnId) thread.activeTurnId = null;\n return { ...input, payload: { ...input.payload, executionUsage: structuredClone(thread?.executions.get(input.turnId)?.latest ?? null) } };\n }\n if (input.type !== 'conversation.executionUsageChanged') return input;\n\n const thread = this.thread(id);\n const record = thread.executions.get(input.turnId);\n const incoming = input.payload.usage;\n const overlapping = thread.activeTurnId !== null && thread.activeTurnId !== input.turnId;\n if (overlapping) {\n const active = thread.executions.get(thread.activeTurnId!);\n if (active) { active.baseline = null; active.native = undefined; }\n if (record) { record.baseline = null; record.native = undefined; }\n }\n if (record && (!validCounts(incoming.total)\n || (record.latest && !nondecreasing(record.latest.total, incoming.total)))) {\n record.baseline = null; record.native = undefined;\n }\n const nativeDelta = record?.native ? difference(record.native.total, incoming.total) : null;\n const execution = record?.native && nativeDelta ? add(record.native.execution, nativeDelta)\n : record?.baseline ? difference(record.baseline, incoming.total) : null;\n if (record && execution === null) record.baseline = null;\n const usage: CodexSurfaceExecutionUsage = {\n ...incoming, execution, observedStart: Boolean(record),\n requestUsage: structuredClone(unavailableRequestUsage),\n };\n if (record) record.latest = structuredClone(usage);\n thread.total = !overlapping && validCounts(incoming.total) ? structuredClone(incoming.total) : null;\n thread.lastUsageTurnId = input.turnId;\n return { ...input, payload: { usage } };\n }\n\n private thread(id: string): ThreadUsage {\n let thread = this.threads.get(id);\n if (!thread) {\n thread = { total: null, lastUsageTurnId: null, activeTurnId: null, executions: new Map() };\n this.threads.set(id, thread);\n }\n return thread;\n }\n}\n\nconst requiredCounts = ['totalTokens', 'inputTokens', 'cachedInputTokens', 'outputTokens', 'reasoningOutputTokens'] as const;\nexport function validCounts(usage: CodexSurfaceTokenUsage): boolean {\n return requiredCounts.every(key => Number.isSafeInteger(usage[key]) && usage[key] >= 0)\n && (usage.cacheWriteInputTokens === null || (Number.isSafeInteger(usage.cacheWriteInputTokens) && usage.cacheWriteInputTokens >= 0))\n && usage.totalTokens === usage.inputTokens + usage.outputTokens\n && usage.cachedInputTokens <= usage.inputTokens && usage.reasoningOutputTokens <= usage.outputTokens;\n}\n\nfunction nondecreasing(before: CodexSurfaceTokenUsage, after: CodexSurfaceTokenUsage): boolean {\n return requiredCounts.every(key => after[key] >= before[key])\n && (before.cacheWriteInputTokens === null || after.cacheWriteInputTokens === null\n || after.cacheWriteInputTokens >= before.cacheWriteInputTokens);\n}\n\nfunction difference(before: CodexSurfaceTokenUsage, after: CodexSurfaceTokenUsage): CodexSurfaceTokenUsage | null {\n if (!validCounts(before) || !validCounts(after) || !nondecreasing(before, after)) return null;\n const delta: CodexSurfaceTokenUsage = {\n totalTokens: after.totalTokens - before.totalTokens,\n inputTokens: after.inputTokens - before.inputTokens,\n cachedInputTokens: after.cachedInputTokens - before.cachedInputTokens,\n cacheWriteInputTokens: before.cacheWriteInputTokens === null || after.cacheWriteInputTokens === null\n ? null : after.cacheWriteInputTokens - before.cacheWriteInputTokens,\n outputTokens: after.outputTokens - before.outputTokens,\n reasoningOutputTokens: after.reasoningOutputTokens - before.reasoningOutputTokens,\n };\n return validCounts(delta) ? delta : null;\n}\n\nfunction add(before: CodexSurfaceTokenUsage, delta: CodexSurfaceTokenUsage): CodexSurfaceTokenUsage | null {\n const result = Object.fromEntries(requiredCounts.map(key => [key, before[key] + delta[key]])) as unknown as CodexSurfaceTokenUsage;\n result.cacheWriteInputTokens = before.cacheWriteInputTokens === null || delta.cacheWriteInputTokens === null\n ? null : before.cacheWriteInputTokens + delta.cacheWriteInputTokens;\n return validCounts(result) ? result : null;\n}\n","import { open } from 'node:fs/promises';\nimport { isAbsolute } from 'node:path';\nimport type { CodexAppServerClient } from '../codex';\nimport type { CodexSurfaceTokenUsage } from '@codex-app-sdk/core/surface';\nimport { validCounts } from './codex-surface-usage-controller';\n\nexport type CodexHistoricalExecutionUsage = {\n turnId: string;\n recordedAt: string;\n execution: CodexSurfaceTokenUsage;\n total: CodexSurfaceTokenUsage;\n last: CodexSurfaceTokenUsage;\n status?: 'completed' | 'interrupted';\n};\ntype Index = { identity: string; size: number; mtimeMs: number; offset: number;\n turns: Map<string, CodexHistoricalExecutionUsage>; statuses: Map<string, 'completed' | 'interrupted'> };\nconst MAX_RECORD = 1024 * 1024;\n\n/** Numeric-only, read-only index of native 0.163/0.164 per-turn replacement counters.\n * File identity and ownership are checked before append reuse; no transcript is retained. */\nexport class CodexOriginalHistoryUsage {\n private readonly indexes = new Map<string, Index>();\n private work: Promise<unknown> = Promise.resolve();\n private readonly paths = new Map<string, string>();\n constructor(private readonly client?: CodexAppServerClient) {}\n clear(): void { this.indexes.clear(); this.paths.clear(); }\n forget(conversationId: string): void { this.paths.delete(conversationId); }\n\n async read(conversationId: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n if (!this.client) throw new Error('A provider client is required.');\n let filePath = this.paths.get(conversationId);\n if (!filePath) {\n const { thread } = await this.client.request('thread/read', { threadId: conversationId, includeTurns: false });\n if (thread.id !== conversationId || !thread.path) throw new Error('Original usage is unavailable.');\n filePath = thread.path;\n this.paths.set(conversationId, filePath);\n }\n return this.readFile(conversationId, filePath);\n }\n\n readFile(conversationId: string, filePath: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n const next = this.work.then(() => this.scan(conversationId, filePath));\n this.work = next.catch(() => undefined);\n return next;\n }\n\n private async scan(conversationId: string, filePath: string): Promise<readonly CodexHistoricalExecutionUsage[]> {\n if (!isAbsolute(filePath)) throw new Error('Original usage requires an absolute provider path.');\n const file = await open(filePath, 'r');\n try {\n const metadata = await file.stat();\n if (!metadata.isFile() || metadata.size > 2 * 1024 ** 3) throw new Error('Original usage is unavailable.');\n const header = Buffer.alloc(64 * 1024);\n const { bytesRead } = await file.read(header, 0, header.length, 0);\n const first = JSON.parse(header.subarray(0, bytesRead).toString('utf8').split('\\n', 1)[0]!);\n if (first?.type !== 'session_meta' || first.payload?.id !== conversationId) throw new Error('Original usage belongs to a different conversation.');\n const key = `${conversationId}\\0${filePath}`;\n const identity = `${metadata.dev}:${metadata.ino}`;\n let index = this.indexes.get(key);\n if (!index || index.identity !== identity || metadata.size < index.size || (metadata.size === index.size && metadata.mtimeMs !== index.mtimeMs)) {\n index = { identity, size: 0, mtimeMs: 0, offset: 0, turns: new Map(), statuses: new Map() };\n }\n if (metadata.size !== index.size || metadata.mtimeMs !== index.mtimeMs) {\n let at = index.offset;\n let pending = Buffer.alloc(0);\n let skipped = false;\n const buffer = Buffer.alloc(64 * 1024);\n while (at < metadata.size) {\n const { bytesRead: count } = await file.read(buffer, 0, Math.min(buffer.length, metadata.size - at), at);\n if (!count) break;\n let start = 0;\n for (let i = 0; i < count; i++) {\n if (buffer[i] !== 10) continue;\n const fragment = buffer.subarray(start, i);\n if (!skipped && pending.length + fragment.length <= MAX_RECORD) {\n this.record(index, conversationId, Buffer.concat([pending, fragment]).toString('utf8'));\n }\n pending = Buffer.alloc(0); skipped = false; start = i + 1; index.offset = at + start;\n }\n const tail = buffer.subarray(start, count);\n if (pending.length + tail.length > MAX_RECORD) { skipped = true; pending = Buffer.alloc(0); }\n else if (!skipped) pending = Buffer.concat([pending, tail]);\n at += count;\n }\n index.size = metadata.size; index.mtimeMs = metadata.mtimeMs;\n }\n this.indexes.delete(key); this.indexes.set(key, index);\n while (this.indexes.size > 8) this.indexes.delete(this.indexes.keys().next().value!);\n return structuredClone([...index.turns.values()].map(value => ({ ...value,\n ...(index.statuses.has(value.turnId) ? { status: index.statuses.get(value.turnId)! } : {}) })));\n } finally { await file.close(); }\n }\n\n private record(index: Index, conversationId: string, line: string): void {\n if (!line.includes('token_usage_record') && !line.includes('task_complete') && !line.includes('turn_aborted')) return;\n let value: any;\n try { value = JSON.parse(line); } catch { return; }\n const record = value.payload;\n if (value?.type === 'event_msg' && typeof record?.turn_id === 'string'\n && (record.type === 'task_complete' || record.type === 'turn_aborted')) {\n index.statuses.set(record.turn_id, record.type === 'task_complete' ? 'completed' : 'interrupted');\n if (index.statuses.size > 50_000) index.statuses.delete(index.statuses.keys().next().value!);\n return;\n }\n if (value?.type !== 'token_usage_record') return;\n if (record?.thread_id !== conversationId || typeof record.turn_id !== 'string' || !record.turn_id || record.turn_id.length > 256) return;\n if (typeof value.timestamp !== 'string' || !Number.isFinite(Date.parse(value.timestamp))) return;\n const execution = nativeCounts(record.turn_token_usage);\n const total = nativeCounts(record.thread_token_usage);\n const last = nativeCounts(record.usage);\n if (!execution || !total || !last) return;\n index.turns.set(record.turn_id, { turnId: record.turn_id, recordedAt: value.timestamp, execution, total, last });\n if (index.turns.size > 50_000) index.turns.delete(index.turns.keys().next().value!);\n }\n}\n\nfunction nativeCounts(value: any): CodexSurfaceTokenUsage | undefined {\n if (!value || typeof value !== 'object') return;\n const result = { totalTokens: value.total_tokens, inputTokens: value.input_tokens, cachedInputTokens: value.cached_input_tokens,\n cacheWriteInputTokens: value.cache_write_input_tokens ?? null, outputTokens: value.output_tokens, reasoningOutputTokens: value.reasoning_output_tokens };\n return validCounts(result) ? result : undefined;\n}\n","import type { v2 } from '../codex/index';\nimport type { CodexRealtimeInputAudioChunk } from '@codex-app-sdk/core/surface';\n\nexport function normalizedOptionalRealtimeString(\n value: string | undefined,\n field: string,\n): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== 'string') throw new TypeError(`Realtime ${field} must be a string`);\n const normalized = value.trim();\n if (!normalized) throw new TypeError(`Realtime ${field} cannot be empty`);\n return normalized;\n}\n\nexport function normalizedRealtimeText(value: string, field: string): string {\n if (typeof value !== 'string') throw new TypeError(`Realtime ${field} must be a string`);\n const normalized = value.trim();\n if (!normalized) throw new TypeError(`Realtime ${field} cannot be empty`);\n return normalized;\n}\n\nexport function realtimeAudioChunkParams(audio: CodexRealtimeInputAudioChunk): v2.ThreadRealtimeAudioChunk {\n if (!(audio.data instanceof Uint8Array)) {\n throw new TypeError('Realtime audio data must be a Uint8Array');\n }\n const sampleRate = positiveInteger(audio.sampleRate, 'sampleRate');\n const numChannels = positiveInteger(audio.numChannels, 'numChannels');\n const samplesPerChannel = audio.samplesPerChannel === undefined\n ? Math.floor(audio.data.byteLength / 2 / numChannels)\n : nullableNonNegativeInteger(audio.samplesPerChannel, 'samplesPerChannel');\n const itemId = audio.itemId === undefined ? null : audio.itemId;\n if (itemId !== null && (typeof itemId !== 'string' || !itemId.trim())) {\n throw new TypeError('Realtime audio itemId must be a non-empty string or null');\n }\n return {\n data: Buffer.from(audio.data.buffer, audio.data.byteOffset, audio.data.byteLength).toString('base64'),\n sampleRate,\n numChannels,\n samplesPerChannel,\n itemId,\n };\n}\n\nexport function realtimeAudioChunk(audio: v2.ThreadRealtimeAudioChunk): {\n data: Uint8Array;\n sampleRate: number;\n numChannels: number;\n samplesPerChannel: number | null;\n itemId: string | null;\n} {\n return {\n data: new Uint8Array(Buffer.from(audio.data, 'base64')),\n sampleRate: audio.sampleRate,\n numChannels: audio.numChannels,\n samplesPerChannel: audio.samplesPerChannel,\n itemId: audio.itemId,\n };\n}\n\nfunction positiveInteger(value: number, field: string): number {\n if (!Number.isSafeInteger(value) || value <= 0) {\n throw new TypeError(`Realtime audio ${field} must be a positive integer`);\n }\n return value;\n}\n\nfunction nullableNonNegativeInteger(value: number | null, field: string): number | null {\n if (value === null) return null;\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new TypeError(`Realtime audio ${field} must be a non-negative integer or null`);\n }\n return value;\n}\n","import type { CodexAppServerClient, RealtimeVoice } from '../codex/index';\nimport type { CodexConversationEvent, CodexRealtimeEvent, StartCodexRealtimeOptions } from '@codex-app-sdk/core/surface';\nimport type { CodexRealtimeSession } from './codex-surface-contracts';\nimport {\n normalizedOptionalRealtimeString,\n normalizedRealtimeText,\n realtimeAudioChunkParams,\n} from './codex-surface-realtime';\n\nexport type StartCodexRealtimeSessionContext = {\n client: CodexAppServerClient;\n ensureThreadReady(): Promise<void>;\n onConversationEvent(listener: (event: CodexConversationEvent) => void): () => void;\n options: StartCodexRealtimeOptions;\n threadId: string;\n};\n\nexport async function startCodexRealtimeSession(\n context: StartCodexRealtimeSessionContext,\n): Promise<CodexRealtimeSession> {\n const { client, ensureThreadReady, onConversationEvent, options, threadId } = context;\n await ensureThreadReady();\n const outputModality = options.outputModality;\n if (outputModality !== 'text' && outputModality !== 'audio') {\n throw new TypeError(`Invalid realtime output modality '${String(outputModality)}'`);\n }\n const version = options.version;\n if (version !== undefined && version !== 'v1' && version !== 'v2' && version !== 'v3') {\n throw new TypeError(`Invalid realtime version '${String(version)}'`);\n }\n const model = normalizedOptionalRealtimeString(options.model, 'model');\n const voice = normalizedOptionalRealtimeString(options.voice, 'voice');\n const transport = options.transport ?? { type: 'websocket' };\n if (transport.type !== 'websocket' && transport.type !== 'webrtc') {\n throw new TypeError(`Invalid realtime transport '${String((transport as { type?: unknown }).type)}'`);\n }\n if (transport.type === 'webrtc' && !transport.sdp.trim()) {\n throw new TypeError('WebRTC realtime transport requires a non-empty SDP offer');\n }\n const answer = transport.type === 'webrtc' ? deferredRealtimeSdp(onConversationEvent) : null;\n let remoteSdp: string | null;\n try {\n const [, sdp] = await Promise.all([client.request('thread/realtime/start', {\n threadId,\n outputModality,\n ...(model ? { model } : {}),\n ...(version ? { version } : {}),\n ...(voice ? { voice: voice as RealtimeVoice } : {}),\n ...(options.includeStartupContext !== undefined\n ? { includeStartupContext: options.includeStartupContext }\n : {}),\n ...(options.prompt !== undefined ? { prompt: options.prompt } : {}),\n ...(options.flushTranscriptTailOnSessionEnd !== undefined\n ? { flushTranscriptTailOnSessionEnd: options.flushTranscriptTailOnSessionEnd }\n : {}),\n transport: transport.type === 'webrtc'\n ? { type: 'webrtc', sdp: transport.sdp }\n : { type: 'websocket' },\n }), answer?.promise ?? Promise.resolve(null)]);\n remoteSdp = sdp;\n } catch (error) {\n answer?.cancel();\n throw error;\n }\n\n let stopped = false;\n const requireActive = (): void => {\n if (stopped) throw new Error(`Realtime session for '${threadId}' is stopped`);\n };\n return {\n conversationId: threadId,\n transport: transport.type,\n remoteSdp,\n appendAudio: async (audio) => {\n requireActive();\n if (transport.type === 'webrtc') {\n throw new Error('WebRTC realtime audio must be sent through its negotiated media track');\n }\n await client.request('thread/realtime/appendAudio', {\n threadId,\n audio: realtimeAudioChunkParams(audio),\n });\n },\n appendText: async (text, role = 'user') => {\n requireActive();\n const normalizedText = normalizedRealtimeText(text, 'text');\n if (role !== 'user' && role !== 'developer' && role !== 'assistant') {\n throw new TypeError(`Invalid realtime text role '${String(role)}'`);\n }\n await client.request('thread/realtime/appendText', { threadId, text: normalizedText, role });\n },\n appendSpeech: async (text) => {\n requireActive();\n await client.request('thread/realtime/appendSpeech', {\n threadId,\n text: normalizedRealtimeText(text, 'speech'),\n });\n },\n stop: async () => {\n if (stopped) return;\n await client.request('thread/realtime/stop', { threadId });\n stopped = true;\n },\n onEvent: (listener) => onConversationEvent((event) => {\n if (event.type.startsWith('realtime.')) listener(event as CodexRealtimeEvent);\n }),\n };\n}\n\nfunction deferredRealtimeSdp(\n onConversationEvent: StartCodexRealtimeSessionContext['onConversationEvent'],\n): { promise: Promise<string>; cancel(): void } {\n let unsubscribe: () => void = () => undefined;\n let timer: NodeJS.Timeout | undefined;\n let settled = false;\n const cleanup = () => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n unsubscribe();\n };\n const promise = new Promise<string>((resolve, reject) => {\n unsubscribe = onConversationEvent((event) => {\n if (event.type === 'realtime.sdp') {\n cleanup();\n resolve(event.payload.sdp);\n } else if (event.type === 'realtime.error') {\n cleanup();\n reject(new Error(event.payload.message));\n } else if (event.type === 'realtime.closed') {\n cleanup();\n reject(new Error('Realtime session closed before returning its WebRTC answer'));\n }\n });\n timer = setTimeout(() => {\n cleanup();\n reject(new Error('Timed out waiting for the WebRTC realtime SDP answer'));\n }, 30_000);\n });\n return { promise, cancel: cleanup };\n}\n","import type {\n CodexSurfaceApproval,\n CodexSurfaceAuthentication,\n CodexSurfaceClientRequest,\n CodexSurfaceSnapshot,\n CodexConversationLoadingStrategy,\n CodexSurfaceSkill,\n CodexSurfaceThreadStatus,\n CodexSurfaceTurn,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport type { ThreadHistoryMode } from '../codex/generated/v2/ThreadHistoryMode';\n\nexport type ThreadRuntimeState = {\n threadId: string;\n cwd: string | null;\n hydrated: boolean;\n activeTurnId: string | null;\n turns: CodexSurfaceTurn[];\n turnIds: string[];\n messages: SurfaceMessage[];\n answeredClientRequestIds: string[];\n approvalPreset: CodexSurfaceSnapshot['approvalPreset'];\n approvalPresets: CodexSurfaceSnapshot['approvalPresets'];\n permissionProfiles: CodexSurfaceSnapshot['permissionProfiles'];\n skills: CodexSurfaceSkill[];\n skillCatalogStatus: CodexSurfaceSnapshot['skillCatalogStatus'];\n selectedModelId: string | null;\n selectedReasoningEffort: string | null;\n selectedServiceTier: string | null;\n planMode: boolean;\n executionPlan: CodexSurfaceSnapshot['executionPlan'];\n contextUsage: CodexSurfaceSnapshot['contextUsage'];\n goal: CodexSurfaceSnapshot['goal'];\n turnGitDiff: CodexSurfaceSnapshot['turnGitDiff'];\n threadStatus: CodexSurfaceThreadStatus | null;\n queuedPrompts: CodexSurfaceSnapshot['queuedPrompts'];\n busy: boolean;\n turnStartPending: boolean;\n historyLoading: boolean;\n historyMode: ThreadHistoryMode;\n loadingStrategy: CodexConversationLoadingStrategy;\n historyItemsView: 'full' | 'summary';\n historyCursor: string | null;\n historyHasOlder: boolean;\n historyLoadingOlder: boolean;\n fullHistoryHydrated: boolean;\n error: string | null;\n planMarkdownByTurn: Map<string, string>;\n};\n\nexport type ThreadRuntimePatch = Partial<Omit<ThreadRuntimeState, 'threadId' | 'planMarkdownByTurn'>>;\n\nexport type ConversationCatalogs = Pick<\n ThreadRuntimeState,\n 'approvalPresets' | 'permissionProfiles' | 'skillCatalogStatus' | 'skills'\n>;\n\nexport function initialSurfaceSnapshot(authentication: CodexSurfaceAuthentication): CodexSurfaceSnapshot {\n return {\n status: 'idle',\n authentication,\n conversations: [],\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n clientRequests: [],\n answeredClientRequestIds: [],\n approvals: [],\n models: [],\n modelCatalogStatus: 'notLoaded',\n skills: [],\n skillCatalogStatus: 'notLoaded',\n plugins: [],\n pluginCatalogStatus: 'notLoaded',\n permissionProfiles: [],\n approvalPresets: [],\n approvalPreset: null,\n selectedModelId: null,\n selectedReasoningEffort: null,\n selectedServiceTier: null,\n planMode: false,\n executionPlan: null,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n rateLimits: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n historyState: {\n loadingStrategy: 'lazy',\n hasOlder: false,\n loadingOlder: false,\n fullyLoaded: false,\n },\n error: null,\n };\n}\n\nexport function createThreadRuntime(\n threadId: string,\n state: CodexSurfaceSnapshot,\n patch: ThreadRuntimePatch = {},\n): ThreadRuntimeState {\n return {\n threadId,\n cwd: null,\n hydrated: false,\n activeTurnId: null,\n turns: [],\n turnIds: [],\n messages: [],\n answeredClientRequestIds: [],\n approvalPreset: state.approvalPreset,\n approvalPresets: [...state.approvalPresets],\n permissionProfiles: [...state.permissionProfiles],\n skills: [...state.skills],\n skillCatalogStatus: state.skillCatalogStatus,\n selectedModelId: state.selectedModelId,\n selectedReasoningEffort: state.selectedReasoningEffort,\n selectedServiceTier: state.selectedServiceTier ?? null,\n planMode: false,\n executionPlan: null,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n turnStartPending: false,\n historyLoading: false,\n historyMode: 'legacy',\n loadingStrategy: state.historyState?.loadingStrategy ?? 'lazy',\n historyItemsView: 'full',\n historyCursor: null,\n historyHasOlder: false,\n historyLoadingOlder: false,\n fullHistoryHydrated: false,\n error: null,\n planMarkdownByTurn: new Map(),\n ...patch,\n };\n}\n\nexport function runtimeProjection(\n runtime: ThreadRuntimeState,\n approvals: CodexSurfaceApproval[],\n clientRequests: CodexSurfaceClientRequest[],\n): Pick<\n CodexSurfaceSnapshot,\n | 'approvalPreset'\n | 'approvalPresets'\n | 'answeredClientRequestIds'\n | 'approvals'\n | 'activeTurnId'\n | 'busy'\n | 'clientRequests'\n | 'contextUsage'\n | 'error'\n | 'executionPlan'\n | 'goal'\n | 'historyLoading'\n | 'historyState'\n | 'messages'\n | 'permissionProfiles'\n | 'planMode'\n | 'queuedPrompts'\n | 'selectedModelId'\n | 'selectedReasoningEffort'\n | 'selectedServiceTier'\n | 'skillCatalogStatus'\n | 'skills'\n | 'threadStatus'\n | 'turnGitDiff'\n | 'turns'\n> {\n const projectedClientRequests = [...clientRequests];\n const knownClientRequestIds = new Set(projectedClientRequests.map((request) => request.id));\n const answeredClientRequestIds = new Set(runtime.answeredClientRequestIds);\n for (const message of runtime.messages) {\n const answeredByMessage = message.metadata?.asyncQuestionRequestIds;\n if (Array.isArray(answeredByMessage)) {\n for (const requestId of answeredByMessage) {\n if (typeof requestId === 'string') answeredClientRequestIds.add(requestId);\n }\n }\n }\n for (const message of runtime.messages) {\n for (const part of message.parts) {\n if (\n part.type !== 'question'\n || part.historical === true\n || knownClientRequestIds.has(part.request.id)\n || answeredClientRequestIds.has(part.request.id)\n ) continue;\n knownClientRequestIds.add(part.request.id);\n projectedClientRequests.push(part.request);\n }\n }\n return {\n activeTurnId: runtime.activeTurnId,\n approvalPreset: runtime.approvalPreset,\n approvalPresets: runtime.approvalPresets,\n answeredClientRequestIds: [...answeredClientRequestIds],\n approvals,\n busy: runtime.busy,\n clientRequests: projectedClientRequests,\n contextUsage: runtime.contextUsage,\n error: runtime.error,\n executionPlan: runtime.executionPlan,\n goal: runtime.goal,\n historyLoading: runtime.historyLoading,\n historyState: {\n loadingStrategy: runtime.loadingStrategy,\n ...(runtime.historyItemsView === 'summary' ? { itemsView: 'summary' as const } : {}),\n hasOlder: runtime.historyHasOlder,\n loadingOlder: runtime.historyLoadingOlder,\n fullyLoaded: runtime.fullHistoryHydrated,\n },\n messages: runtime.messages,\n permissionProfiles: runtime.permissionProfiles,\n planMode: runtime.planMode,\n queuedPrompts: runtime.queuedPrompts,\n selectedModelId: runtime.selectedModelId,\n selectedReasoningEffort: runtime.selectedReasoningEffort,\n selectedServiceTier: runtime.selectedServiceTier,\n skillCatalogStatus: runtime.skillCatalogStatus,\n skills: runtime.skills,\n threadStatus: runtime.threadStatus,\n turnGitDiff: runtime.turnGitDiff,\n turns: runtime.turns,\n };\n}\n","import type { v2 } from '../codex/index';\nimport type { CodexSurfaceAuthentication } from '@codex-app-sdk/core/surface';\n\nexport function initialAuthentication(): CodexSurfaceAuthentication {\n return {\n status: 'notLoaded',\n account: null,\n requiresOpenaiAuth: null,\n error: null,\n login: {\n status: 'idle',\n loginId: null,\n authUrl: null,\n error: null,\n },\n };\n}\n\nexport function surfaceAccount(account: v2.Account): NonNullable<CodexSurfaceAuthentication['account']> {\n if (account.type === 'chatgpt') {\n return { type: 'chatgpt', email: account.email, planType: account.planType };\n }\n if (account.type === 'amazonBedrock') {\n return {\n type: 'amazonBedrock',\n credentialSource: account.usesCodexManagedCredentials ? 'codexManaged' : 'awsManaged',\n };\n }\n return { type: 'apiKey' };\n}\n\nexport function surfaceAuthenticationKey(authentication: CodexSurfaceAuthentication): string {\n return JSON.stringify({\n account: authentication.account,\n requiresOpenaiAuth: authentication.requiresOpenaiAuth,\n });\n}\n\nexport function surfaceAuthenticationIdentityKey(authentication: CodexSurfaceAuthentication): string {\n const account = authentication.account;\n if (!account) {\n return JSON.stringify({ type: null, requiresOpenaiAuth: authentication.requiresOpenaiAuth });\n }\n if (account.type === 'chatgpt') return JSON.stringify({ type: account.type, email: account.email });\n if (account.type === 'amazonBedrock') {\n return JSON.stringify({ type: account.type, credentialSource: account.credentialSource });\n }\n return JSON.stringify({ type: account.type });\n}\n\nexport function normalizedLoginId(value: string): string {\n const loginId = value.trim();\n if (!loginId) throw new Error('Codex login id cannot be empty');\n return loginId;\n}\n\nexport function safeLoginUrl(value: string): string {\n let url: URL;\n try {\n url = new URL(value);\n } catch {\n throw new Error('Codex account/login/start returned an invalid authentication URL');\n }\n if (url.protocol !== 'https:' && url.protocol !== 'http:') {\n throw new Error(`Codex account/login/start returned unsupported authentication URL scheme '${url.protocol}'`);\n }\n return url.href;\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceApprovalPreset,\n CodexSurfaceModel,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\n\nexport type SurfaceSelection = Pick<\n CodexSurfaceSnapshot,\n 'approvalPreset' | 'planMode' | 'selectedModelId' | 'selectedReasoningEffort'\n | 'selectedServiceTier'\n>;\n\nexport function selectedModel(\n models: CodexSurfaceModel[],\n idOrModel: string | null,\n): CodexSurfaceModel | null {\n return models.find((model) => model.id === idOrModel || model.model === idOrModel)\n ?? models.find((model) => model.isDefault)\n ?? models[0]\n ?? null;\n}\n\nexport function requireCatalogModel(models: CodexSurfaceModel[], idOrModel: string): CodexSurfaceModel {\n const model = models.find((candidate) => candidate.id === idOrModel || candidate.model === idOrModel);\n if (!model) throw new Error(`Unknown model '${idOrModel}'`);\n return model;\n}\n\nexport function validateReasoningEffort(\n model: CodexSurfaceModel | null,\n reasoningEffort: string | undefined,\n): void {\n if (!reasoningEffort) return;\n if (!model) throw new Error(`Cannot select reasoning effort '${reasoningEffort}' without a model`);\n const supported = model.supportedReasoningEfforts?.map((option) => option.reasoningEffort) ?? [];\n if (supported.length > 0 && !supported.includes(reasoningEffort)) {\n throw new Error(`Reasoning effort '${reasoningEffort}' is not available for '${model.displayName}'`);\n }\n}\n\nexport function defaultReasoningEffort(model: CodexSurfaceModel): string | null {\n return model.defaultReasoningEffort\n ?? model.supportedReasoningEfforts?.[0]?.reasoningEffort\n ?? null;\n}\n\nexport function defaultServiceTier(model: CodexSurfaceModel): string | null {\n return model.defaultServiceTier ?? null;\n}\n\nexport function validateServiceTier(\n model: CodexSurfaceModel | null,\n serviceTier: string | null | undefined,\n): void {\n if (!serviceTier) return;\n if (!model) throw new Error(`Cannot select service tier '${serviceTier}' without a model`);\n if (serviceTier === 'default' || serviceTier === model.defaultServiceTier) return;\n const supported = model.serviceTiers?.map((option) => option.id) ?? [];\n if (supported.length > 0 && !supported.includes(serviceTier)) {\n throw new Error(`Service tier '${serviceTier}' is not available for '${model.displayName}'`);\n }\n}\n\nexport function approvalPresetsForProfiles(\n profiles: CodexSurfaceSnapshot['permissionProfiles'],\n requirements: v2.ConfigRequirements | null,\n): CodexSurfaceApprovalPreset[] {\n const allowed = new Set(profiles.filter((profile) => profile.allowed).map((profile) => profile.id));\n const presets: CodexSurfaceApprovalPreset[] = [];\n if (\n allowed.has(':workspace')\n && requirementAllows(requirements?.allowedApprovalPolicies, 'on-request')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'user')\n ) presets.push('ask-for-approval');\n if (\n allowed.has(':workspace')\n && requirementAllows(requirements?.allowedApprovalPolicies, 'on-request')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'auto_review')\n ) presets.push('approve-for-me');\n if (\n (allowed.has(':danger-full-access') || allowed.has(':danger-no-sandbox'))\n && requirementAllows(requirements?.allowedApprovalPolicies, 'never')\n && requirementAllows(requirements?.allowedApprovalsReviewers, 'user')\n ) presets.push('full-access');\n return presets;\n}\n\nfunction requirementAllows<T>(values: T[] | null | undefined, value: T): boolean {\n return !Array.isArray(values) || values.length === 0 || values.includes(value);\n}\n\nexport function approvalPresetStartParams(preset: CodexSurfaceApprovalPreset): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer: v2.ApprovalsReviewer;\n permissions: string;\n} {\n if (preset === 'full-access') {\n return {\n approvalPolicy: 'never',\n approvalsReviewer: 'user',\n permissions: ':danger-full-access',\n };\n }\n return {\n approvalPolicy: 'on-request',\n approvalsReviewer: preset === 'approve-for-me' ? 'auto_review' : 'user',\n permissions: ':workspace',\n };\n}\n\nexport function approvalPresetUpdateParams(preset: CodexSurfaceApprovalPreset): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer: v2.ApprovalsReviewer;\n permissions: string;\n} {\n return approvalPresetStartParams(preset);\n}\n\nexport function approvalPresetFromSettings(\n approvalPolicy: v2.AskForApproval,\n approvalsReviewer: v2.ApprovalsReviewer,\n sandbox: v2.SandboxPolicy,\n activePermissionProfile: v2.ActivePermissionProfile | null,\n): CodexSurfaceApprovalPreset | null {\n const profile = activePermissionProfile?.id;\n if (\n approvalPolicy === 'never'\n && (\n sandbox.type === 'dangerFullAccess'\n || profile === ':danger-full-access'\n || profile === ':danger-no-sandbox'\n )\n ) return 'full-access';\n if (\n approvalPolicy === 'on-request'\n && (approvalsReviewer === 'auto_review' || approvalsReviewer === 'guardian_subagent')\n ) return 'approve-for-me';\n if (approvalPolicy === 'on-request') return 'ask-for-approval';\n return null;\n}\n\nexport function sessionSelection(\n response: v2.ThreadForkResponse | v2.ThreadResumeResponse | v2.ThreadStartResponse,\n models: CodexSurfaceModel[],\n current: CodexSurfaceSnapshot,\n): SurfaceSelection {\n const model = selectedModel(models, response.model);\n return {\n approvalPreset: approvalPresetFromSettings(\n response.approvalPolicy,\n response.approvalsReviewer,\n response.sandbox,\n response.activePermissionProfile,\n ) ?? current.approvalPreset,\n planMode: current.planMode,\n selectedModelId: model?.id ?? current.selectedModelId,\n selectedReasoningEffort: response.reasoningEffort ?? (model ? defaultReasoningEffort(model) : null),\n selectedServiceTier: response.serviceTier !== undefined\n ? response.serviceTier\n : model ? defaultServiceTier(model) : null,\n };\n}\n\nexport function threadSettingsSelection(\n settings: v2.ThreadSettings,\n models: CodexSurfaceModel[],\n current: CodexSurfaceSnapshot,\n): SurfaceSelection {\n const model = selectedModel(models, settings.model);\n return {\n approvalPreset: approvalPresetFromSettings(\n settings.approvalPolicy,\n settings.approvalsReviewer,\n settings.sandboxPolicy,\n settings.activePermissionProfile,\n ) ?? current.approvalPreset,\n planMode: settings.collaborationMode.mode === 'plan',\n selectedModelId: model?.id ?? current.selectedModelId,\n selectedReasoningEffort: settings.effort ?? (model ? defaultReasoningEffort(model) : null),\n selectedServiceTier: settings.serviceTier !== undefined\n ? settings.serviceTier\n : model ? defaultServiceTier(model) : null,\n };\n}\n\nexport function nextSelection(\n current: CodexSurfaceSnapshot,\n settings: UpdateCodexConversationSettings,\n): SurfaceSelection {\n let model = selectedModel(current.models, current.selectedModelId);\n if (settings.modelId) {\n model = current.models.find((candidate) => candidate.id === settings.modelId) ?? null;\n if (!model) throw new Error(`Unknown model '${settings.modelId}'`);\n }\n\n let reasoningEffort = settings.reasoningEffort ?? current.selectedReasoningEffort;\n let serviceTier = settings.serviceTier !== undefined\n ? settings.serviceTier\n : current.selectedServiceTier ?? null;\n const supported = model?.supportedReasoningEfforts?.map((option) => option.reasoningEffort) ?? [];\n if (settings.reasoningEffort && supported.length > 0 && !supported.includes(settings.reasoningEffort)) {\n throw new Error(`Reasoning effort '${settings.reasoningEffort}' is not available for '${model!.displayName}'`);\n }\n if (settings.modelId && supported.length > 0 && (!reasoningEffort || !supported.includes(reasoningEffort))) {\n reasoningEffort = model ? defaultReasoningEffort(model) : null;\n }\n if (settings.serviceTier !== undefined) validateServiceTier(model, serviceTier);\n if (settings.serviceTier === undefined && settings.modelId && serviceTier\n && !model!.serviceTiers?.some((tier) => tier.id === serviceTier)) {\n serviceTier = model ? defaultServiceTier(model) : null;\n }\n\n return {\n approvalPreset: settings.approvalPreset ?? current.approvalPreset,\n planMode: settings.planMode ?? current.planMode,\n selectedModelId: model?.id ?? null,\n selectedReasoningEffort: reasoningEffort,\n selectedServiceTier: serviceTier,\n };\n}\n\nexport function collaborationMode(\n planMode: boolean,\n model: string,\n reasoningEffort: string | null,\n): NonNullable<v2.TurnStartParams['collaborationMode']> {\n return {\n mode: planMode ? 'plan' : 'default',\n settings: {\n model,\n reasoning_effort: reasoningEffort,\n developer_instructions: null,\n },\n };\n}\n\nexport function turnSettings(\n state: CodexSurfaceSnapshot,\n options: SendCodexMessageOptions,\n): Pick<v2.TurnStartParams, 'collaborationMode' | 'effort' | 'model' | 'serviceTier'> {\n const selected = selectedModel(state.models, state.selectedModelId);\n const model = options.model ?? selected?.model;\n const effort = options.reasoningEffort ?? state.selectedReasoningEffort;\n const planMode = options.planMode ?? state.planMode;\n return {\n ...(model ? { model } : {}),\n ...(effort ? { effort } : {}),\n ...(model ? { collaborationMode: collaborationMode(planMode, model, effort) } : {}),\n ...(options.serviceTier !== undefined\n ? { serviceTier: options.serviceTier }\n : state.selectedServiceTier ? { serviceTier: state.selectedServiceTier } : {}),\n };\n}\n","import { basename, isAbsolute } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { isDeepStrictEqual } from 'node:util';\nimport { fileAttachmentInput } from './codex-file-attachment';\nimport type { v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceAttachment,\n CodexSurfaceContextUsage,\n CodexSurfaceRateLimitSnapshot,\n CodexSurfaceRateLimits,\n CodexSurfaceSnapshot,\n CodexSurfaceThreadStatus,\n SendCodexMessageOptions,\n SurfaceMessage,\n SurfaceMessageAttachmentPart,\n} from '@codex-app-sdk/core/surface';\nimport {\n requireCatalogModel,\n selectedModel,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\n\nexport function threadToSummary(thread: v2.Thread): CodexConversationSummary {\n const preview = thread.preview.trim();\n const firstPreviewLine = preview.split('\\n')[0]!;\n return {\n id: thread.id,\n ...(thread.sessionId ? { sessionId: thread.sessionId } : {}),\n ...(thread.parentThreadId ? { parentConversationId: thread.parentThreadId } : {}),\n ...(thread.agentNickname ? { agentNickname: thread.agentNickname } : {}),\n ...(thread.agentRole ? { agentRole: thread.agentRole } : {}),\n title: thread.name?.trim() || firstPreviewLine.trim() || 'Untitled conversation',\n preview,\n cwd: thread.cwd,\n status: thread.status.type === 'active' ? 'active' : thread.status.type === 'systemError' ? 'error' : 'idle',\n turnCount: thread.turns.length,\n createdAt: new Date(thread.createdAt * 1000).toISOString(),\n updatedAt: new Date((thread.recencyAt ?? thread.updatedAt) * 1000).toISOString(),\n };\n}\n\n/**\n * Reuses previous items that a refresh left unchanged, and the previous list\n * itself when nothing changed, so state patches carry only real changes.\n */\nexport function reuseUnchangedItems<Item extends { id: string }>(previous: Item[], next: Item[]): Item[] {\n const previousById = new Map(previous.map((item) => [item.id, item]));\n const merged = next.map((item) => {\n const existing = previousById.get(item.id);\n return existing && isDeepStrictEqual(existing, item) ? existing : item;\n });\n return merged.length === previous.length && merged.every((item, index) => item === previous[index])\n ? previous\n : merged;\n}\n\nexport function upsertConversation(\n conversations: CodexConversationSummary[],\n next: CodexConversationSummary,\n): CodexConversationSummary[] {\n return [next, ...conversations.filter((conversation) => conversation.id !== next.id)]\n .sort((left, right) => right.updatedAt.localeCompare(left.updatedAt));\n}\n\nexport function validatedSendOptions(\n state: CodexSurfaceSnapshot,\n options: SendCodexMessageOptions,\n): SendCodexMessageOptions {\n const model = options.model\n ? requireCatalogModel(state.models, options.model)\n : selectedModel(state.models, state.selectedModelId);\n validateReasoningEffort(model, options.reasoningEffort);\n validateServiceTier(model, options.serviceTier);\n return {\n ...options,\n ...(options.attachments ? { attachments: validateAttachments(options.attachments) } : {}),\n ...(options.model && model ? { model: model.model } : {}),\n };\n}\n\nexport function validateAttachments(attachments: readonly CodexSurfaceAttachment[]): CodexSurfaceAttachment[] {\n return attachments.map((attachment) => {\n const path = attachment.path.trim();\n if (!path) throw new Error('Attachment paths cannot be empty');\n if (!isAbsolute(path)) throw new Error(`Attachment path must be absolute: '${path}'`);\n if (attachment.type === 'image') return { ...attachment, path };\n const name = attachment.name?.trim();\n return { ...attachment, path, ...(name ? { name } : {}) };\n });\n}\n\nexport function attachmentInput(attachment: CodexSurfaceAttachment): v2.UserInput {\n if (attachment.type === 'image') {\n return {\n type: 'localImage',\n path: attachment.path,\n ...(attachment.detail === undefined ? {} : { detail: attachment.detail }),\n };\n }\n return fileAttachmentInput(attachment.name ?? basename(attachment.path), attachment.path);\n}\n\nexport function surfaceAttachmentPart(attachment: CodexSurfaceAttachment): SurfaceMessageAttachmentPart {\n const name = attachment.name?.trim() || basename(attachment.path);\n if (attachment.type === 'image') {\n return {\n type: 'attachment',\n attachment: {\n kind: 'image',\n name,\n path: attachment.path,\n url: attachment.previewUrl ?? pathToFileURL(attachment.path).href,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n },\n };\n }\n return {\n type: 'attachment',\n attachment: {\n kind: 'file',\n name,\n path: attachment.path,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n },\n };\n}\n\nexport function messageTurnIdOrNull(message: SurfaceMessage): string | null {\n const metadataTurnId = message.metadata?.turnId;\n return message.turnId ?? (typeof metadataTurnId === 'string' ? metadataTurnId : null);\n}\n\nexport function messageTurnId(message: SurfaceMessage): string {\n const turnId = messageTurnIdOrNull(message);\n if (!turnId) throw new Error('This message is not associated with a Codex turn');\n return turnId;\n}\n\nexport function surfaceMessageText(message: SurfaceMessage): string {\n return message.parts\n .filter((part): part is Extract<SurfaceMessage['parts'][number], { type: 'text' }> => part.type === 'text')\n .map((part) => part.text)\n .join('\\n')\n .trim();\n}\n\nexport function surfaceMessageAttachments(message: SurfaceMessage): CodexSurfaceAttachment[] {\n return message.parts.flatMap((part): CodexSurfaceAttachment[] => {\n if (part.type !== 'attachment') return [];\n const attachment = part.attachment;\n const attachmentPath = attachment.path;\n if (!attachmentPath) return [];\n if (attachment.kind === 'image') {\n return [{\n type: 'image',\n path: attachmentPath,\n name: attachment.name,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n ...(attachment.url?.startsWith('data:image/') ? { previewUrl: attachment.url } : {}),\n }];\n }\n return [{\n type: 'file',\n path: attachmentPath,\n name: attachment.name,\n ...(attachment.mimeType ? { mimeType: attachment.mimeType } : {}),\n }];\n });\n}\n\nexport function surfaceTokenUsage(usage: v2.TokenUsageBreakdown): import('@codex-app-sdk/core/surface').CodexSurfaceTokenUsage {\n return {\n totalTokens: usage.totalTokens, inputTokens: usage.inputTokens,\n cachedInputTokens: usage.cachedInputTokens, cacheWriteInputTokens: usage.cacheWriteInputTokens ?? null,\n outputTokens: usage.outputTokens, reasoningOutputTokens: usage.reasoningOutputTokens,\n };\n}\n\nexport function surfaceContextUsage(tokenUsage: v2.ThreadTokenUsage): CodexSurfaceContextUsage {\n const modelContextWindow = tokenUsage.modelContextWindow;\n const contextTokens = tokenUsage.last.totalTokens;\n const usedPercent = typeof modelContextWindow === 'number' && modelContextWindow > 0\n ? Math.min(100, Math.max(0, (contextTokens / modelContextWindow) * 100))\n : null;\n return {\n totalTokens: tokenUsage.total.totalTokens,\n inputTokens: tokenUsage.total.inputTokens,\n cachedInputTokens: tokenUsage.total.cachedInputTokens,\n outputTokens: tokenUsage.total.outputTokens,\n reasoningOutputTokens: tokenUsage.total.reasoningOutputTokens,\n lastTotalTokens: tokenUsage.last.totalTokens,\n modelContextWindow,\n usedPercent,\n };\n}\n\nexport function surfaceThreadStatus(status: v2.ThreadStatus): CodexSurfaceThreadStatus {\n return status.type === 'active'\n ? { type: 'active', activeFlags: [...status.activeFlags] }\n : { type: status.type };\n}\n\nexport function conversationStatus(status: v2.ThreadStatus): CodexConversationSummary['status'] {\n if (status.type === 'active') return 'active';\n if (status.type === 'systemError') return 'error';\n return 'idle';\n}\n\nexport function surfaceRateLimits(response: v2.GetAccountRateLimitsResponse): CodexSurfaceRateLimits {\n const byLimitId = response.rateLimitsByLimitId\n ? Object.fromEntries(Object.entries(response.rateLimitsByLimitId)\n .filter((entry): entry is [string, v2.RateLimitSnapshot] => Boolean(entry[1]))\n .map(([limitId, snapshot]) => [limitId, surfaceRateLimitSnapshot(snapshot)]))\n : null;\n return {\n rateLimits: surfaceRateLimitSnapshot(response.rateLimits),\n rateLimitsByLimitId: byLimitId,\n rateLimitResetCredits: response.rateLimitResetCredits ? {\n availableCount: nonnegativeDecimal(response.rateLimitResetCredits.availableCount),\n credits: response.rateLimitResetCredits.credits?.map((credit) => ({ ...credit })) ?? null,\n } : null,\n };\n}\n\n/** JSON may decode protocol bigint fields as numbers. Never publish rounded counts. */\nexport function nonnegativeDecimal(value: unknown): string {\n if (typeof value === 'bigint' && value >= 0n) return value.toString();\n if (typeof value === 'number' && Number.isSafeInteger(value) && value >= 0) return String(value);\n if (typeof value === 'string' && /^(0|[1-9][0-9]*)$/.test(value)) return value;\n throw new Error('Invalid account count: expected an exact nonnegative integer');\n}\n\nexport function surfaceAccountUsage(response: v2.GetAccountTokenUsageResponse): import('@codex-app-sdk/core/surface').CodexSurfaceAccountUsage {\n const decimal = (value: bigint | null) => value === null ? null : nonnegativeDecimal(value);\n return {\n summary: {\n lifetimeTokens: decimal(response.summary.lifetimeTokens),\n peakDailyTokens: decimal(response.summary.peakDailyTokens),\n longestRunningTurnSec: decimal(response.summary.longestRunningTurnSec),\n currentStreakDays: decimal(response.summary.currentStreakDays),\n longestStreakDays: decimal(response.summary.longestStreakDays),\n },\n dailyUsageBuckets: response.dailyUsageBuckets?.map(bucket => ({\n startDate: bucket.startDate, tokens: nonnegativeDecimal(bucket.tokens),\n })) ?? null,\n };\n}\n\nexport function surfaceRateLimitSnapshot(snapshot: v2.RateLimitSnapshot): CodexSurfaceRateLimitSnapshot {\n return {\n limitId: snapshot.limitId,\n limitName: snapshot.limitName,\n primary: snapshot.primary ? { ...snapshot.primary } : null,\n secondary: snapshot.secondary ? { ...snapshot.secondary } : null,\n credits: snapshot.credits ? { ...snapshot.credits } : null,\n individualLimit: snapshot.individualLimit ? { ...snapshot.individualLimit } : null,\n planType: snapshot.planType,\n rateLimitReachedType: snapshot.rateLimitReachedType,\n };\n}\n\nexport function mergeSurfaceRateLimits(\n current: CodexSurfaceRateLimits | null,\n update: v2.RateLimitSnapshot,\n): CodexSurfaceRateLimits {\n const next = surfaceRateLimitSnapshot(update);\n if (!current) {\n return {\n rateLimits: next,\n rateLimitsByLimitId: next.limitId ? { [next.limitId]: next } : null,\n rateLimitResetCredits: null,\n };\n }\n const merged = mergeRateLimitSnapshot(current.rateLimits, next);\n const rateLimitsByLimitId = current.rateLimitsByLimitId ? { ...current.rateLimitsByLimitId } : {};\n if (merged.limitId) {\n rateLimitsByLimitId[merged.limitId] = mergeRateLimitSnapshot(\n rateLimitsByLimitId[merged.limitId] ?? merged,\n next,\n );\n }\n return {\n ...current,\n rateLimits: merged,\n rateLimitsByLimitId: Object.keys(rateLimitsByLimitId).length > 0 ? rateLimitsByLimitId : null,\n };\n}\n\nexport function mergeRateLimitSnapshot(\n current: CodexSurfaceRateLimitSnapshot,\n update: CodexSurfaceRateLimitSnapshot,\n): CodexSurfaceRateLimitSnapshot {\n return {\n limitId: update.limitId ?? current.limitId,\n limitName: update.limitName ?? current.limitName,\n primary: update.primary ? { ...(current.primary ?? {}), ...update.primary } : current.primary,\n secondary: update.secondary ? { ...(current.secondary ?? {}), ...update.secondary } : current.secondary,\n credits: update.credits ? { ...(current.credits ?? {}), ...update.credits } : current.credits,\n individualLimit: update.individualLimit\n ? { ...(current.individualLimit ?? {}), ...update.individualLimit }\n : current.individualLimit,\n planType: update.planType ?? current.planType,\n rateLimitReachedType: update.rateLimitReachedType ?? current.rateLimitReachedType,\n };\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexAppServerTransportOptions, CodexSurfaceOptions } from './codex-surface-contracts';\nimport type { CodexAppServerUnixSocketTransportOptions } from './codex-unix-socket-transport';\n\nexport function isUnixSocketTransportOptions(\n options: CodexAppServerTransportOptions,\n): options is CodexAppServerUnixSocketTransportOptions {\n return 'type' in options && options.type === 'unixSocket';\n}\n\nexport function surfaceTransportOptions(options: CodexSurfaceOptions): CodexAppServerTransportOptions {\n const topLevelHome = options.codexHome === undefined\n ? undefined\n : absoluteCodexHome(options.codexHome);\n const transportHome = options.transport?.codexHome;\n if (topLevelHome !== undefined && transportHome !== undefined && topLevelHome !== transportHome) {\n throw new Error('Codex surface codexHome conflicts with transport.codexHome');\n }\n const transport = options.transport ?? {};\n return {\n ...transport,\n ...(topLevelHome === undefined ? {} : { codexHome: topLevelHome }),\n };\n}\n\nexport function absoluteCodexHome(value: string): string {\n const codexHome = value.trim();\n if (!codexHome) throw new Error('Codex surface codexHome cannot be empty');\n if (!isAbsolute(codexHome)) throw new Error('Codex surface codexHome must be an absolute path');\n return codexHome;\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceAuthentication,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport {\n normalizedLoginId,\n safeLoginUrl,\n surfaceAccount,\n surfaceAuthenticationIdentityKey,\n} from './codex-surface-authentication';\nimport { errorMessage } from './codex-surface-prompts';\n\nexport type CodexSurfaceAuthenticationHost = {\n bootstrapSurfaceData(force?: boolean): Promise<void>;\n clearAuthenticatedSurfaceData(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n patchAuthentication(patch: Partial<CodexSurfaceAuthentication>, origin: CodexSurfaceEventOrigin): void;\n reportError(error: unknown): void;\n};\n\nexport class CodexSurfaceAuthenticationController {\n private accountRefreshPromise: Promise<CodexSurfaceSnapshot> | null = null;\n private accountRefreshRequested = false;\n private accountRefreshForceBootstrap = false;\n private accountRefreshOrigin: CodexSurfaceEventOrigin = 'action';\n private chatGptLoginPromise: Promise<CodexSurfaceChatGptLogin> | null = null;\n private chatGptDeviceCodeLoginPromise: Promise<CodexSurfaceChatGptDeviceCodeLogin> | null = null;\n private activeChatGptDeviceCodeLogin: CodexSurfaceChatGptDeviceCodeLogin | null = null;\n private lastLoadedAuthenticationIdentityKey: string | null = null;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceAuthenticationHost,\n ) {}\n\n pendingRefresh(): Promise<CodexSurfaceSnapshot> | null {\n return this.accountRefreshPromise;\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n const current = this.host.getSnapshot().authentication.login;\n if (current.status === 'pending' && current.loginId && current.authUrl) {\n return { loginId: current.loginId, authUrl: current.authUrl };\n }\n if (this.chatGptLoginPromise) return this.chatGptLoginPromise;\n const start = (async () => {\n this.host.patchAuthentication({\n login: { status: 'starting', loginId: null, authUrl: null, error: null },\n }, 'action');\n try {\n const response = await this.client.request('account/login/start', { type: 'chatgpt' });\n if (response.type !== 'chatgpt') {\n throw new Error(`Codex account/login/start returned unexpected login type '${response.type}'`);\n }\n const loginId = normalizedLoginId(response.loginId);\n const authUrl = safeLoginUrl(response.authUrl);\n this.host.patchAuthentication({\n login: { status: 'pending', loginId, authUrl, error: null },\n }, 'action');\n return { loginId, authUrl };\n } catch (error) {\n this.host.patchAuthentication({\n login: { status: 'error', loginId: null, authUrl: null, error: errorMessage(error) },\n }, 'action');\n throw error;\n }\n })();\n this.chatGptLoginPromise = start;\n void start.finally(() => {\n this.chatGptLoginPromise = null;\n }).catch(() => undefined);\n return start;\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n const current = this.host.getSnapshot().authentication.login;\n if (\n current.status === 'pending'\n && current.loginId === this.activeChatGptDeviceCodeLogin?.loginId\n && current.authUrl === this.activeChatGptDeviceCodeLogin.verificationUrl\n ) {\n return this.activeChatGptDeviceCodeLogin;\n }\n if (this.chatGptDeviceCodeLoginPromise) return this.chatGptDeviceCodeLoginPromise;\n const start = (async () => {\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: { status: 'starting', loginId: null, authUrl: null, error: null },\n }, 'action');\n try {\n const response = await this.client.request('account/login/start', { type: 'chatgptDeviceCode' });\n if (response.type !== 'chatgptDeviceCode') {\n throw new Error(`Codex account/login/start returned unexpected login type '${response.type}'`);\n }\n const loginId = normalizedLoginId(response.loginId);\n const verificationUrl = safeLoginUrl(response.verificationUrl);\n const userCode = response.userCode.trim();\n if (!userCode) throw new Error('Codex account/login/start returned an empty device user code');\n this.host.patchAuthentication({\n login: { status: 'pending', loginId, authUrl: verificationUrl, error: null },\n }, 'action');\n const login = { loginId, verificationUrl, userCode };\n this.activeChatGptDeviceCodeLogin = login;\n return login;\n } catch (error) {\n this.host.patchAuthentication({\n login: { status: 'error', loginId: null, authUrl: null, error: errorMessage(error) },\n }, 'action');\n throw error;\n }\n })();\n this.chatGptDeviceCodeLoginPromise = start;\n void start.finally(() => {\n this.chatGptDeviceCodeLoginPromise = null;\n }).catch(() => undefined);\n return start;\n }\n\n async cancelLogin(loginId: string): Promise<CodexSurfaceSnapshot> {\n const normalized = normalizedLoginId(loginId);\n const response = await this.client.request('account/login/cancel', { loginId: normalized });\n this.host.patchAuthentication({\n login: {\n status: response.status === 'canceled' ? 'cancelled' : 'idle',\n loginId: null,\n authUrl: null,\n error: null,\n },\n }, 'action');\n this.activeChatGptDeviceCodeLogin = null;\n return this.host.getSnapshot();\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n await this.client.request('account/logout', undefined);\n this.host.patchAuthentication({\n login: { status: 'idle', loginId: null, authUrl: null, error: null },\n }, 'action');\n this.activeChatGptDeviceCodeLogin = null;\n const authenticationChanged = await this.load('action');\n if (authenticationChanged || this.blocksBootstrap()) {\n await this.host.clearAuthenticatedSurfaceData();\n }\n if (!this.blocksBootstrap()) await this.host.bootstrapSurfaceData(true);\n return this.host.getSnapshot();\n }\n\n refresh(\n origin: CodexSurfaceEventOrigin,\n forceBootstrap = false,\n ): Promise<CodexSurfaceSnapshot> {\n this.accountRefreshRequested = true;\n this.accountRefreshForceBootstrap ||= forceBootstrap;\n this.accountRefreshOrigin = origin;\n if (this.accountRefreshPromise) return this.accountRefreshPromise;\n const refresh = (async () => {\n while (this.accountRefreshRequested) {\n const refreshOrigin = this.accountRefreshOrigin;\n const refreshForceBootstrap = this.accountRefreshForceBootstrap;\n this.accountRefreshRequested = false;\n this.accountRefreshForceBootstrap = false;\n try {\n const authenticationChanged = await this.load(refreshOrigin);\n if (authenticationChanged || this.blocksBootstrap()) {\n await this.host.clearAuthenticatedSurfaceData();\n }\n if (!this.blocksBootstrap()) {\n await this.host.bootstrapSurfaceData(refreshForceBootstrap);\n }\n } catch (error) {\n if (!this.accountRefreshRequested) throw error;\n this.accountRefreshForceBootstrap ||= refreshForceBootstrap;\n }\n }\n return this.host.getSnapshot();\n })();\n this.accountRefreshPromise = refresh;\n void refresh.finally(() => {\n this.accountRefreshPromise = null;\n }).catch(() => undefined);\n return refresh;\n }\n\n async load(origin: CodexSurfaceEventOrigin): Promise<boolean> {\n const previousAuthenticationIdentityKey = this.lastLoadedAuthenticationIdentityKey;\n this.host.patchAuthentication({ status: 'loading', error: null }, origin);\n try {\n const response = await this.client.request('account/read', { refreshToken: false });\n const account = response.account ? surfaceAccount(response.account) : null;\n const authentication = {\n ...this.host.getSnapshot().authentication,\n account,\n requiresOpenaiAuth: response.requiresOpenaiAuth,\n };\n const authenticationIdentityKey = surfaceAuthenticationIdentityKey(authentication);\n this.host.patchAuthentication({\n status: 'loaded', account, requiresOpenaiAuth: response.requiresOpenaiAuth, error: null,\n }, origin);\n this.lastLoadedAuthenticationIdentityKey = authenticationIdentityKey;\n return previousAuthenticationIdentityKey !== null\n && previousAuthenticationIdentityKey !== authenticationIdentityKey;\n } catch (error) {\n this.host.patchAuthentication({ status: 'error', error: errorMessage(error) }, origin);\n throw error;\n }\n }\n\n blocksBootstrap(): boolean {\n const authentication = this.host.getSnapshot().authentication;\n return authentication.status === 'loaded'\n && authentication.account === null\n && authentication.requiresOpenaiAuth === true;\n }\n\n handleLoginCompleted(params: v2.AccountLoginCompletedNotification): void {\n const current = this.host.getSnapshot().authentication.login;\n const loginId = params.loginId ?? current.loginId;\n if (!params.success) {\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: {\n status: 'error', loginId, authUrl: current.authUrl,\n error: params.error ?? 'Codex sign-in failed',\n },\n }, 'notification');\n return;\n }\n this.activeChatGptDeviceCodeLogin = null;\n this.host.patchAuthentication({\n login: { status: 'completed', loginId, authUrl: current.authUrl, error: null },\n }, 'notification');\n void this.refresh('notification').catch((error) => this.host.reportError(error));\n }\n}\n","import type {\n CodexConversationEvent,\n CodexConversationHistory,\n CodexConversationHistoryPage,\n CodexConversationPromptHistory,\n CodexConversationSnapshot,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceClientRequestResponse,\n SendCodexMessageOptions,\n StartCodexRealtimeOptions,\n StartCodexReviewOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport type {\n CodexConversation,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexRealtimeSession,\n ForkCodexConversationOptions,\n} from './codex-surface-contracts';\n\nexport type CodexConversationHandleOperations = {\n clearGoal(): Promise<void>;\n compact(): Promise<void>;\n continueInterruptedTurn(): Promise<void>;\n deleteTurn(turnId: string): Promise<void>;\n deleteQueuedPrompt(promptId: string): Promise<void>;\n updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<void>;\n fork(\n options?: ForkCodexConversationOptions,\n hostOptions?: CodexConversationHostOptions,\n ): Promise<CodexConversationForkResult>;\n forkTurn(\n turnId: string,\n options?: ForkCodexConversationOptions,\n hostOptions?: CodexConversationHostOptions,\n ): Promise<CodexConversationForkResult>;\n getSnapshot(): CodexConversationSnapshot;\n interrupt(): Promise<void>;\n load(options?: CodexConversationLoadOptions): Promise<void>;\n onEvent(listener: (event: CodexConversationEvent) => void): () => void;\n onStateChange(listener: (snapshot: CodexConversationSnapshot) => void): () => void;\n readHistory(): Promise<CodexConversationHistory>;\n readContent?: CodexConversation['readContent'];\n readPromptHistory(): Promise<CodexConversationPromptHistory>;\n loadOlderHistory?: () => Promise<CodexConversationHistoryPage>;\n loadTurnHistory?: (turnId: string) => Promise<void>;\n rename(title: string): Promise<void>;\n resolveApproval(\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope?: CodexSurfaceApprovalScope,\n ): Promise<void>;\n respondToClientRequest(response: CodexSurfaceClientRequestResponse): Promise<void>;\n retryTurn(turnId: string): Promise<void>;\n select(): Promise<void>;\n sendMessage(prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n setGoal(objective: string, tokenBudget?: number | null): Promise<void>;\n startRealtime(options: StartCodexRealtimeOptions): Promise<CodexRealtimeSession>;\n startReview(options?: StartCodexReviewOptions): Promise<void>;\n steerMessage(prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<void>;\n updateSettings(settings: UpdateCodexConversationSettings): Promise<void>;\n};\n\nexport function createCodexConversationHandle(\n id: string,\n operations: CodexConversationHandleOperations,\n): CodexConversation {\n const snapshotAfter = async (operation: () => Promise<void>): Promise<CodexConversationSnapshot> => {\n await operation();\n return operations.getSnapshot();\n };\n return {\n id,\n fork: operations.fork,\n forkTurn: operations.forkTurn,\n load: (options) => snapshotAfter(() => operations.load(options)),\n select: () => snapshotAfter(operations.select),\n readHistory: operations.readHistory,\n readContent: operations.readContent ?? (async () => { throw new Error('Content reads are unavailable.'); }),\n readPromptHistory: operations.readPromptHistory,\n loadTurnHistory: (turnId) => snapshotAfter(() => operations.loadTurnHistory?.(turnId) ?? Promise.reject(new Error('Turn history is unavailable.'))),\n loadOlderHistory: operations.loadOlderHistory ?? (\n async () => ({ conversationId: id, messages: [], hasOlder: false })\n ),\n rename: (title) => snapshotAfter(() => operations.rename(title)),\n updateSettings: (settings) => snapshotAfter(() => operations.updateSettings(settings)),\n sendMessage: (prompt, options) => snapshotAfter(() => operations.sendMessage(prompt, options)),\n startRealtime: operations.startRealtime,\n compact: () => snapshotAfter(operations.compact),\n continueInterruptedTurn: () => snapshotAfter(operations.continueInterruptedTurn),\n startReview: (options) => snapshotAfter(() => operations.startReview(options)),\n steerMessage: (prompt, options) => snapshotAfter(() => operations.steerMessage(prompt, options)),\n interrupt: () => snapshotAfter(operations.interrupt),\n deleteTurn: (turnId) => snapshotAfter(() => operations.deleteTurn(turnId)),\n editTurn: (turnId, content, options) => snapshotAfter(() => operations.editTurn(turnId, content, options)),\n retryTurn: (turnId) => snapshotAfter(() => operations.retryTurn(turnId)),\n deleteQueuedPrompt: (promptId) => snapshotAfter(() => operations.deleteQueuedPrompt(promptId)),\n updateQueuedPrompt: (promptId, prompt, options) => snapshotAfter(() => operations.updateQueuedPrompt(promptId, prompt, options)),\n steerQueuedPrompt: (promptId, prompt, options) => snapshotAfter(() => operations.steerQueuedPrompt(promptId, prompt, options)),\n respondToClientRequest: (response) => snapshotAfter(() => operations.respondToClientRequest(response)),\n resolveApproval: (approvalId, decision, scope) => snapshotAfter(\n () => operations.resolveApproval(approvalId, decision, scope),\n ),\n setGoal: (objective, tokenBudget) => snapshotAfter(() => operations.setGoal(objective, tokenBudget)),\n clearGoal: () => snapshotAfter(operations.clearGoal),\n getSnapshot: operations.getSnapshot,\n onStateChange: operations.onStateChange,\n onEvent: operations.onEvent,\n };\n}\n","import type { ResponseItem } from '../codex/generated/ResponseItem';\nimport type { SurfaceMessageToolPart, SurfaceMessageToolPartUpdate } from '@codex-app-sdk/core/surface';\nimport { codexThreadItemToToolPart, rawOutputToToolPartUpdate } from './codex-tool-part-adapter';\n\ntype AdaptedRawResponseItemEvent =\n | { type: 'item.started' | 'item.completed'; payload: { toolPart: SurfaceMessageToolPart } }\n | { type: 'item.updated'; payload: SurfaceMessageToolPartUpdate };\n\nexport function rawResponseItemToEvent(item: ResponseItem): AdaptedRawResponseItemEvent | null {\n if (!isRecord(item) || typeof item.type !== 'string') {\n return null;\n }\n\n if (item.type === 'local_shell_call') {\n const toolPart = codexThreadItemToToolPart(localShellCallToCommandExecution(item))!;\n\n return {\n type: rawStatusIsCompleted(item.status) ? 'item.completed' : 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'function_call') {\n const toolPart = codexThreadItemToToolPart(functionCallToThreadItem(item))!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'function_call_output') {\n return rawOutputUpdate(item.call_id, item.output);\n }\n\n if (item.type === 'custom_tool_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n namespace: null,\n tool: stringValue(item.name) ?? 'custom_tool',\n status: item.status,\n arguments: stringValue(item.input) ?? '',\n contentItems: null,\n success: null,\n durationMs: null,\n })!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'custom_tool_call_output') {\n return rawOutputUpdate(item.call_id, item.output, stringValue(item.name) ?? undefined);\n }\n\n if (item.type === 'tool_search_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n namespace: 'codex',\n tool: 'tool_search',\n status: item.status,\n arguments: item.arguments,\n contentItems: null,\n success: null,\n durationMs: null,\n execution: item.execution,\n })!;\n\n return {\n type: 'item.started',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'tool_search_output') {\n return {\n type: 'item.updated',\n payload: rawOutputToToolPartUpdate(stringValue(item.call_id) ?? fallbackRawItemId(item), item.tools, 'tool_search', item.status),\n };\n }\n\n if (item.type === 'web_search_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'webSearch',\n id: fallbackRawItemId(item),\n query: webSearchQuery(item.action),\n action: item.action,\n })!;\n\n return {\n type: 'item.completed',\n payload: { toolPart },\n };\n }\n\n if (item.type === 'image_generation_call') {\n const toolPart = codexThreadItemToToolPart({\n type: 'dynamicToolCall',\n id: stringValue(item.id) ?? fallbackRawItemId(item),\n namespace: null,\n tool: 'image_generation',\n status: item.status,\n arguments: {\n revisedPrompt: item.revised_prompt,\n },\n contentItems: null,\n success: item.status === 'completed',\n durationMs: null,\n })!;\n\n return {\n type: 'item.completed',\n payload: { toolPart },\n };\n }\n\n return null;\n}\n\nfunction localShellCallToCommandExecution(item: Record<string, unknown>): Record<string, unknown> {\n const action = isRecord(item.action) ? item.action : {};\n const command = Array.isArray(action.command)\n ? joinCommand(action.command)\n : stringValue(action.command) ?? 'local shell';\n\n return {\n type: 'commandExecution',\n id: stringValue(item.call_id) ?? fallbackRawItemId(item),\n command,\n cwd: stringValue(action.working_directory) ?? '',\n processId: null,\n source: 'agent',\n status: rawStatusToThreadStatus(item.status),\n commandActions: [],\n aggregatedOutput: null,\n exitCode: null,\n durationMs: null,\n };\n}\n\nfunction functionCallToThreadItem(item: Record<string, unknown>): Record<string, unknown> {\n const name = stringValue(item.name) ?? 'function_call';\n const args = parseArguments(item.arguments);\n const id = stringValue(item.call_id) ?? fallbackRawItemId(item);\n\n if (name === 'shell_command' && isRecord(args)) {\n return {\n type: 'commandExecution',\n id,\n command: stringValue(args.command) ?? name,\n cwd: stringValue(args.workdir) ?? stringValue(args.cwd) ?? '',\n processId: null,\n source: 'agent',\n status: 'inProgress',\n commandActions: [],\n aggregatedOutput: null,\n exitCode: null,\n durationMs: null,\n };\n }\n\n return {\n type: 'dynamicToolCall',\n id,\n namespace: stringValue(item.namespace),\n tool: name,\n status: 'inProgress',\n arguments: args,\n contentItems: null,\n success: null,\n durationMs: null,\n };\n}\n\nfunction rawOutputUpdate(callId: unknown, output: unknown, title?: string): AdaptedRawResponseItemEvent {\n return {\n type: 'item.updated',\n payload: rawOutputToToolPartUpdate(stringValue(callId) ?? 'raw-response-output', output, title),\n };\n}\n\nfunction rawStatusToThreadStatus(status: unknown): string {\n if (status === 'completed') {\n return 'completed';\n }\n\n if (status === 'incomplete' || status === 'failed' || status === 'error') {\n return 'failed';\n }\n\n return 'inProgress';\n}\n\nfunction rawStatusIsCompleted(status: unknown): boolean {\n return status === 'completed' || status === 'failed' || status === 'error' || status === 'incomplete';\n}\n\nfunction parseArguments(value: unknown): unknown {\n if (typeof value !== 'string') {\n return value;\n }\n\n try {\n return JSON.parse(value) as unknown;\n } catch {\n return value;\n }\n}\n\nfunction webSearchQuery(action: unknown): string {\n if (!isRecord(action)) {\n return 'web search';\n }\n\n return stringValue(action.query) ?? stringValue(action.searchTerm) ?? 'web search';\n}\n\nfunction joinCommand(parts: unknown[]): string {\n return parts.map((part) => {\n const value = String(part);\n return /\\s/.test(value) ? JSON.stringify(value) : value;\n }).join(' ');\n}\n\nfunction fallbackRawItemId(item: Record<string, unknown>): string {\n const callId = stringValue(item.call_id) ?? stringValue(item.id);\n if (callId) {\n return callId;\n }\n\n return `raw-${item.type}`;\n}\n\nfunction stringValue(value: unknown): string | null {\n return typeof value === 'string' && value.length > 0 ? value : null;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceEvent,\n CodexSurfaceJsonValue,\n CodexSurfaceTurn,\n CodexSurfaceTurnError,\n} from '@codex-app-sdk/core/surface';\n\nexport type SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport function threadItemKey(threadId: string, itemId: string): string {\n return `${threadId}\\u0000${itemId}`;\n}\n\nexport function timestampToIso(timestamp: number | null | undefined): string {\n return typeof timestamp === 'number' && Number.isFinite(timestamp)\n ? new Date(timestamp * 1000).toISOString()\n : new Date().toISOString();\n}\n\nexport function timestampToIsoOrNull(timestamp: number | null | undefined): string | null {\n return typeof timestamp === 'number' && Number.isFinite(timestamp)\n ? new Date(timestamp * 1000).toISOString()\n : null;\n}\n\nexport function surfaceTurnError(error: v2.TurnError | null): CodexSurfaceTurnError | null {\n if (!error) return null;\n return {\n message: error.message,\n additionalDetails: error.additionalDetails,\n codexErrorInfo: error.codexErrorInfo as CodexSurfaceJsonValue | null,\n };\n}\n\nexport function surfaceTurn(turn: v2.Turn, willRetry = false): CodexSurfaceTurn {\n return {\n id: turn.id,\n ...(turn.itemsView === 'summary' || turn.itemsView === 'notLoaded' ? { itemsView: 'summary' as const } : {}),\n status: turn.status,\n error: surfaceTurnError(turn.error),\n willRetry,\n startedAt: timestampToIsoOrNull(turn.startedAt),\n completedAt: timestampToIsoOrNull(turn.completedAt),\n durationMs: turn.durationMs ?? null,\n };\n}\n\nexport function upsertSurfaceTurn(\n turns: readonly CodexSurfaceTurn[],\n turn: CodexSurfaceTurn,\n): CodexSurfaceTurn[] {\n const index = turns.findIndex((candidate) => candidate.id === turn.id);\n if (index < 0) return [...turns, turn];\n const next = [...turns];\n next.splice(index, 1, { ...turn, startedAt: turn.startedAt ?? turns[index]!.startedAt });\n return next;\n}\n\nexport function sameValue(left: unknown, right: unknown): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nexport function createMessageId(): string {\n return `user-${globalThis.crypto.randomUUID()}`;\n}\n\nexport function createQueuedPromptId(): string {\n return `queued-prompt-${globalThis.crypto.randomUUID()}`;\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexSurfaceSubagentState,\n CodexSurfaceSubagentToolCall,\n} from '@codex-app-sdk/core/surface';\n\nexport function surfaceSubagentToolCall(\n item: Extract<v2.ThreadItem, { type: 'collabAgentToolCall' }>,\n): CodexSurfaceSubagentToolCall {\n const agentStates: Record<string, CodexSurfaceSubagentState> = {};\n for (const [conversationId, state] of Object.entries(item.agentsStates)) {\n if (state) agentStates[conversationId] = { status: state.status, message: state.message };\n }\n return {\n id: item.id,\n tool: item.tool,\n status: item.status,\n senderConversationId: item.senderThreadId,\n receiverConversationIds: [...item.receiverThreadIds],\n prompt: item.prompt,\n model: item.model,\n reasoningEffort: item.reasoningEffort,\n agentStates,\n };\n}\n","import type { v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n SurfaceMessage,\n SurfaceMessageTextPart,\n SurfaceMessageToolPart,\n SurfaceMessageToolPartUpdate,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexItemToMediaParts,\n codexItemToQuestionPart,\n codexItemToSurfaceMessage,\n codexItemToToolPart,\n} from './codex-conversation-history';\nimport { rawResponseItemToEvent } from './codex-raw-response-item-adapter';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n surfaceTurn,\n surfaceTurnError,\n threadItemKey,\n timestampToIsoOrNull,\n upsertSurfaceTurn,\n} from './codex-surface-events';\nimport {\n appendAssistantTextDelta,\n assistantMessageContainingText,\n appendCompactionMarker,\n ensureAssistantTurnMessage,\n extractProposedPlanDocument,\n finalizeTurnToolParts,\n formatPlanMarkdown,\n planProgressToolPart,\n removeAssistantText,\n surfaceMediaPartsEqual,\n updateAssistantToolPart,\n upsertAssistantMediaPart,\n upsertAssistantQuestionPart,\n upsertAssistantReasoningSummaries,\n upsertAssistantText,\n upsertAssistantToolPart,\n} from './codex-surface-message-state';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceSubagentToolCall } from './codex-surface-subagents';\nimport {\n codexToolPartFileActivities,\n shouldForwardCommandExecutionOutput,\n} from './codex-tool-part-adapter';\n\nexport type CodexSurfaceItemsHost = {\n assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'started' | 'listed' | 'resumed' | 'created' | 'updated',\n origin: CodexSurfaceEventOrigin,\n ): void;\n getState(): CodexSurfaceSnapshot;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n sendNextQueuedPrompt(threadId: string): void;\n};\n\nexport class CodexSurfaceItemsController {\n private readonly commandOutputForwardItemIds = new Set<string>();\n private readonly fileActivityKeys = new Set<string>();\n // app-server emits exitedReviewMode first, followed by a final agentMessage\n // rendered from the same ReviewOutputEvent. Full history retains only the\n // review-mode item, so it is the canonical surface representation.\n private readonly reviewOutputByTurn = new Map<string, string>();\n\n constructor(private readonly host: CodexSurfaceItemsHost) {}\n\n reset(): void {\n this.commandOutputForwardItemIds.clear();\n this.fileActivityKeys.clear();\n this.reviewOutputByTurn.clear();\n }\n\n forget(threadId: string): void {\n const prefix = `${threadId}\\u0000`;\n for (const key of this.commandOutputForwardItemIds) {\n if (key.startsWith(prefix)) this.commandOutputForwardItemIds.delete(key);\n }\n for (const key of this.fileActivityKeys) {\n if (key.startsWith(prefix)) this.fileActivityKeys.delete(key);\n }\n for (const key of this.reviewOutputByTurn.keys()) {\n if (key.startsWith(prefix)) this.reviewOutputByTurn.delete(key);\n }\n }\n\n isForwardingCommandOutput(threadId: string, itemId: string): boolean {\n return this.commandOutputForwardItemIds.has(threadItemKey(threadId, itemId));\n }\n\n applyAgentDelta(params: v2.AgentMessageDeltaNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const phase = assistantMessageContainingText(runtime.messages, params.turnId, params.itemId)?.parts\n .find((part): part is SurfaceMessageTextPart => (\n part.type === 'text' && part.itemId === params.itemId\n ))?.phase;\n this.host.patchRuntime(params.threadId, {\n messages: appendAssistantTextDelta(\n runtime.messages, params.threadId, params.turnId, params.itemId, params.delta, phase,\n ),\n });\n const message = assistantMessageContainingText(runtime.messages, params.turnId, params.itemId)\n ?? this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message) {\n this.host.emitEvent('notification', {\n type: 'message.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n messageId: message.id,\n itemId: params.itemId,\n delta: params.delta,\n ...(phase ? { phase } : {}),\n },\n });\n }\n }\n\n applyPlanDelta(params: v2.PlanDeltaNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const markdown = `${runtime.planMarkdownByTurn.get(params.turnId) ?? ''}${params.delta}`;\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'running'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.itemId, delta: params.delta, markdown },\n });\n }\n\n applyPlanUpdated(params: v2.TurnPlanUpdatedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const markdown = formatPlanMarkdown(params.explanation, params.plan);\n const updatedAt = new Date().toISOString();\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n executionPlan: {\n turnId: params.turnId,\n explanation: params.explanation,\n steps: structuredClone(params.plan),\n markdown,\n updatedAt,\n },\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'completed'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n explanation: params.explanation,\n steps: structuredClone(params.plan),\n markdown,\n status: 'completed',\n },\n });\n }\n\n applyRawResponseItem(params: v2.RawResponseItemCompletedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n this.host.markRuntimeTurnActive(runtime, params.turnId);\n const event = rawResponseItemToEvent(params.item);\n if (!event) return;\n if (event.type === 'item.updated') {\n this.applyToolUpdate(params.threadId, params.turnId, event.payload);\n return;\n }\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId, event.payload.toolPart,\n ),\n });\n const message = this.host.messageContainingTool(\n params.threadId, params.turnId, event.payload.toolPart.id,\n );\n if (message) {\n this.host.emitEvent('notification', {\n type: event.type === 'item.completed' ? 'tool.completed' : 'tool.started',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { messageId: message.id, toolPart: structuredClone(event.payload.toolPart) },\n });\n this.emitFileActivities(\n params.threadId,\n params.turnId,\n message.id,\n event.payload.toolPart.id,\n event.payload.toolPart,\n runtime.cwd,\n );\n }\n }\n\n applyItem(params: v2.ItemStartedNotification | v2.ItemCompletedNotification, completed: boolean): void {\n const runtime = this.host.requireRuntime(params.threadId);\n const turnStartPending = runtime.turnStartPending;\n if (!completed) this.host.markRuntimeTurnActive(runtime, params.turnId);\n const turn = {\n id: params.turnId,\n status: completed ? 'completed' : 'inProgress',\n startedAt: ('startedAtMs' in params ? params.startedAtMs : params.completedAtMs) / 1000,\n } as const;\n\n if (params.item.type === 'userMessage') {\n const message = codexItemToSurfaceMessage(params.threadId, turn, params.item);\n if (!message || runtime.messages.some((candidate) => candidate.id === message.id)) return;\n const isSteer = runtime.messages.some((candidate) => (\n candidate.role === 'assistant'\n && candidate.metadata?.turnId === params.turnId\n && candidate.parts.length > 0\n ));\n const pendingOptimisticIndex = !isSteer && turnStartPending\n ? runtime.messages.map((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && !candidate.turnId\n && JSON.stringify(candidate.parts) === JSON.stringify(message.parts)\n )).lastIndexOf(true)\n : -1;\n if (pendingOptimisticIndex >= 0) {\n const pending = runtime.messages[pendingOptimisticIndex]!;\n const reconciled = {\n ...message,\n id: pending.id,\n createdAt: pending.createdAt ?? message.createdAt,\n metadata: { ...pending.metadata, ...message.metadata },\n };\n const messages = [...runtime.messages];\n messages.splice(pendingOptimisticIndex, 1, reconciled);\n this.host.patchRuntime(params.threadId, { messages });\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(reconciled) },\n });\n return;\n }\n const duplicateInitialMessage = !isSteer && runtime.messages.some((candidate) => (\n candidate.role === 'user'\n && candidate.turnId === params.turnId\n && candidate.kind !== 'steer'\n && JSON.stringify(candidate.parts) === JSON.stringify(message.parts)\n ));\n if (duplicateInitialMessage) return;\n const appended = isSteer ? { ...message, kind: 'steer' as const } : message;\n const messages = [...runtime.messages, appended];\n this.host.patchRuntime(params.threadId, {\n messages: isSteer\n ? ensureAssistantTurnMessage(messages, params.threadId, params.turnId, { forceSegment: true })\n : messages,\n });\n this.host.emitEvent('notification', {\n type: 'message.appended', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(appended) },\n });\n return;\n }\n\n if (params.item.type === 'reasoning') {\n const previousMessage = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n const previousParts = previousMessage ? JSON.stringify(previousMessage.parts) : null;\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantReasoningSummaries(\n runtime.messages,\n params.threadId,\n params.turnId,\n params.item.id,\n params.item.summary,\n ),\n });\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (!message || JSON.stringify(message.parts) === previousParts) return;\n this.host.emitEvent('notification', {\n type: previousMessage ? 'message.updated' : 'message.appended',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n return;\n }\n\n if (\n params.item.type === 'agentMessage'\n && completed\n && runtime.planMode\n && params.item.phase === 'final_answer'\n ) {\n const proposedPlan = extractProposedPlanDocument(params.item.text);\n if (proposedPlan) {\n const previousMessage = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n let messages = removeAssistantText(\n runtime.messages, params.threadId, params.turnId, params.item.id,\n );\n if (proposedPlan.visibleText) {\n messages = upsertAssistantText(\n messages, params.threadId, params.turnId, params.item.id,\n proposedPlan.visibleText, params.item.phase,\n );\n }\n messages = upsertAssistantToolPart(\n messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, proposedPlan.markdown, 'completed'),\n );\n runtime.planMarkdownByTurn.set(params.turnId, proposedPlan.markdown);\n this.host.patchRuntime(params.threadId, { messages });\n const message = this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message) {\n this.host.emitEvent('notification', {\n type: previousMessage ? 'message.updated' : 'message.appended',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'plan.completed', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, markdown: proposedPlan.markdown },\n });\n return;\n }\n }\n\n if (params.item.type === 'agentMessage' || params.item.type === 'exitedReviewMode') {\n const text = params.item.type === 'agentMessage' ? params.item.text : params.item.review;\n const phase = params.item.type === 'agentMessage' ? params.item.phase ?? undefined : undefined;\n if (!text && params.item.type !== 'agentMessage') return;\n const reviewTurnKey = threadItemKey(params.threadId, params.turnId);\n if (\n params.item.type === 'agentMessage'\n && this.reviewOutputByTurn.get(reviewTurnKey) === text\n ) return;\n if (params.item.type === 'exitedReviewMode') {\n this.reviewOutputByTurn.set(reviewTurnKey, text);\n }\n const previousMessageIds = new Set(runtime.messages.map((message) => message.id));\n const previousMessage = assistantMessageContainingText(runtime.messages, params.turnId, params.item.id)\n ?? this.host.assistantMessageForTurn(params.threadId, params.turnId);\n const previousParts = previousMessage ? JSON.stringify(previousMessage.parts) : null;\n const previousQuestionRequestIds = new Set(previousMessage?.parts.flatMap((part) => (\n part.type === 'question' ? [part.request.id] : []\n )) ?? []);\n const previousText = previousMessage?.parts\n .find((part): part is Extract<SurfaceMessage['parts'][number], { type: 'text' }> => (\n part.type === 'text' && part.itemId === params.item.id\n ))?.text ?? '';\n const questionPart = params.item.type === 'agentMessage'\n ? codexItemToQuestionPart(params.threadId, params.turnId, params.item)\n : null;\n const visibleText = questionPart ? '' : text;\n let messages = questionPart\n ? removeAssistantText(runtime.messages, params.threadId, params.turnId, params.item.id)\n : upsertAssistantText(runtime.messages, params.threadId, params.turnId, params.item.id, text, phase);\n if (questionPart) {\n messages = upsertAssistantQuestionPart(\n messages, params.threadId, params.turnId, questionPart,\n );\n }\n this.host.patchRuntime(params.threadId, { messages });\n if (!visibleText && !questionPart && !phase) return;\n const message = (questionPart ? undefined : assistantMessageContainingText(runtime.messages, params.turnId, params.item.id))\n ?? this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message && !previousMessageIds.has(message.id)) {\n this.host.emitEvent('notification', {\n type: 'message.appended', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n } else if (message && JSON.stringify(message.parts) !== previousParts && (questionPart || visibleText === previousText)) {\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n } else if (message && visibleText !== previousText) {\n if (visibleText.startsWith(previousText)) {\n const delta = visibleText.slice(previousText.length);\n if (delta) this.host.emitEvent('notification', {\n type: 'message.delta', conversationId: params.threadId, turnId: params.turnId,\n payload: {\n messageId: message.id,\n itemId: params.item.id,\n delta,\n ...(phase ? { phase } : {}),\n },\n });\n } else {\n this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n }\n if (questionPart && !previousQuestionRequestIds.has(questionPart.request.id)) {\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { request: structuredClone(questionPart.request) },\n });\n }\n return;\n }\n\n if (params.item.type === 'plan') {\n if (!completed) return;\n const markdown = params.item.text.trim() || runtime.planMarkdownByTurn.get(params.turnId) || '';\n runtime.planMarkdownByTurn.set(params.turnId, markdown);\n this.host.patchRuntime(params.threadId, {\n messages: upsertAssistantToolPart(\n runtime.messages, params.threadId, params.turnId,\n planProgressToolPart(params.turnId, markdown, 'completed'),\n ),\n });\n this.host.emitEvent('notification', {\n type: 'plan.completed', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, markdown },\n });\n return;\n }\n\n if (params.item.type === 'contextCompaction') {\n this.host.patchRuntime(params.threadId, {\n messages: appendCompactionMarker(runtime.messages, params.threadId, params.turnId, completed ? 'complete' : 'streaming'),\n });\n if (completed) {\n const message = this.host.requireRuntime(params.threadId).messages.find((candidate) => (\n candidate.kind === 'compaction' && candidate.metadata?.turnId === params.turnId\n ));\n if (message) this.host.emitEvent('notification', {\n type: 'context.compactionCompleted', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id, message: structuredClone(message) },\n });\n } else {\n this.host.emitEvent('notification', {\n type: 'context.compactionStarted', conversationId: params.threadId, turnId: params.turnId,\n payload: { itemId: params.item.id },\n });\n }\n return;\n }\n\n if (params.item.type === 'collabAgentToolCall') {\n this.host.emitEvent('notification', {\n type: 'subagent.toolCallChanged',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: {\n lifecycle: completed ? 'completed' : 'started',\n toolCall: surfaceSubagentToolCall(params.item),\n },\n });\n return;\n }\n\n if (params.item.type === 'subAgentActivity') {\n this.host.emitEvent('notification', {\n type: 'subagent.activity',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: {\n lifecycle: completed ? 'completed' : 'started',\n activity: {\n id: params.item.id,\n kind: params.item.kind,\n agentConversationId: params.item.agentThreadId,\n agentPath: params.item.agentPath,\n },\n },\n });\n return;\n }\n\n const includeCommandOutput = this.shouldForwardCommandOutput(params.threadId, completed, params.item);\n const toolPart = codexItemToToolPart(params.item, { includeCommandOutput, cwd: runtime.cwd });\n const mediaParts = codexItemToMediaParts(params.item);\n if (!toolPart && !mediaParts.length) return;\n const mediaChanged = mediaParts.some(mediaPart => !runtime.messages.some((message) => (\n message.parts.some((part) => part.type === 'media' && surfaceMediaPartsEqual(part, mediaPart))\n )));\n let messages = toolPart\n ? upsertAssistantToolPart(runtime.messages, params.threadId, params.turnId, toolPart)\n : [...runtime.messages];\n for (const mediaPart of mediaParts) messages = upsertAssistantMediaPart(messages, params.threadId, params.turnId, mediaPart, params.item.id);\n this.host.patchRuntime(params.threadId, { messages });\n const message = toolPart\n ? this.host.messageContainingTool(params.threadId, params.turnId, toolPart.id)\n : this.host.assistantMessageForTurn(params.threadId, params.turnId);\n if (message && toolPart) this.host.emitEvent('notification', {\n type: completed ? 'tool.completed' : 'tool.started',\n conversationId: params.threadId,\n turnId: params.turnId,\n payload: { messageId: message.id, toolPart: structuredClone(toolPart) },\n });\n if (message && toolPart) {\n this.emitFileActivities(\n params.threadId,\n params.turnId,\n message.id,\n toolPart.id,\n toolPart,\n runtime.cwd,\n );\n }\n if (message && mediaChanged) this.host.emitEvent('notification', {\n type: 'message.updated', conversationId: params.threadId, turnId: params.turnId,\n payload: { message: structuredClone(message) },\n });\n }\n\n shouldForwardCommandOutput(threadId: string, completed: boolean, item: v2.ThreadItem): boolean {\n const itemId = 'id' in item && typeof item.id === 'string' ? item.id : null;\n if (!itemId) return false;\n const key = threadItemKey(threadId, itemId);\n if (!completed) {\n const shouldForward = shouldForwardCommandExecutionOutput(item);\n if (shouldForward) this.commandOutputForwardItemIds.add(key);\n else this.commandOutputForwardItemIds.delete(key);\n return shouldForward;\n }\n const shouldForward = this.commandOutputForwardItemIds.has(key)\n || shouldForwardCommandExecutionOutput(item);\n this.commandOutputForwardItemIds.delete(key);\n return shouldForward;\n }\n\n applyToolUpdate(threadId: string, turnId: string, update: SurfaceMessageToolPartUpdate): void {\n const runtime = this.host.requireRuntime(threadId);\n this.host.markRuntimeTurnActive(runtime, turnId);\n const effectiveUpdate = runtime.cwd && hasFileChangeData(update)\n ? { ...update, metadata: { ...update.metadata, cwd: runtime.cwd } }\n : update;\n this.host.patchRuntime(threadId, {\n messages: updateAssistantToolPart(runtime.messages, threadId, turnId, effectiveUpdate),\n });\n const message = this.host.messageContainingTool(threadId, turnId, update.itemId);\n if (message) this.host.emitEvent('notification', {\n type: 'tool.updated', conversationId: threadId, turnId,\n payload: { messageId: message.id, update: structuredClone(effectiveUpdate) },\n });\n const toolPart = message?.parts.find((part): part is SurfaceMessageToolPart => (\n part.type === 'tool' && part.id === update.itemId\n ));\n if (message && toolPart) {\n this.emitFileActivities(threadId, turnId, message.id, toolPart.id, toolPart, runtime.cwd);\n }\n }\n\n private emitFileActivities(\n threadId: string,\n turnId: string,\n messageId: string,\n itemId: string,\n toolPart: SurfaceMessageToolPart,\n cwd: string | null,\n ): void {\n for (const activity of codexToolPartFileActivities(toolPart, cwd)) {\n const key = `${threadId}\\u0000${itemId}\\u0000${activity.action}\\u0000${activity.path}\\u0000${activity.status}`;\n if (this.fileActivityKeys.has(key)) continue;\n this.fileActivityKeys.add(key);\n this.host.emitEvent('notification', {\n type: 'file.activity',\n conversationId: threadId,\n turnId,\n payload: {\n messageId,\n itemId,\n path: activity.path,\n action: activity.action,\n status: activity.status,\n },\n });\n }\n }\n\n applyTurnCompleted(params: v2.TurnCompletedNotification): void {\n const runtime = this.host.requireRuntime(params.threadId);\n if (!runtime.turnIds.includes(params.turn.id)) runtime.turnIds.push(params.turn.id);\n const turnStartPending = runtime.activeTurnId !== params.turn.id && runtime.turnStartPending;\n if (runtime.activeTurnId === params.turn.id) runtime.activeTurnId = null;\n const busy = turnStartPending || runtime.activeTurnId !== null;\n const status: SurfaceMessage['status'] = params.turn.status === 'failed' ? 'error' : 'complete';\n const messages = finalizeTurnToolParts(runtime.messages, params.turn.id, params.turn.status)\n .map((message) => message.metadata?.turnId === params.turn.id ? { ...message, status } : message)\n .filter((message) => !(\n message.role === 'assistant' && message.metadata?.turnId === params.turn.id\n && message.kind === undefined && message.parts.length === 0\n ));\n this.host.patchRuntime(params.threadId, {\n busy,\n ...(!busy ? { threadStatus: { type: 'idle' as const }, error: params.turn.error?.message ?? null } : {}),\n turnStartPending,\n messages,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(params.turn)),\n });\n this.host.patch({\n conversations: this.host.getState().conversations.map((conversation) => conversation.id === params.threadId\n ? {\n ...conversation,\n status: busy ? 'active' : params.turn.status === 'failed' ? 'error' : 'idle',\n turnCount: runtime.turnIds.length,\n updatedAt: new Date().toISOString(),\n }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === params.threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n this.host.emitEvent('notification', {\n type: 'turn.completed', conversationId: params.threadId, turnId: params.turn.id,\n payload: {\n status: params.turn.status,\n error: surfaceTurnError(params.turn.error),\n willRetry: false,\n startedAt: timestampToIsoOrNull(params.turn.startedAt),\n completedAt: timestampToIsoOrNull(params.turn.completedAt),\n durationMs: params.turn.durationMs ?? null,\n },\n });\n this.host.emitConversationActivity(params.threadId, 'notification');\n runtime.planMarkdownByTurn.delete(params.turn.id);\n this.host.sendNextQueuedPrompt(params.threadId);\n }\n}\n\nfunction hasFileChangeData(update: SurfaceMessageToolPartUpdate): boolean {\n if (update.fallbackToolPart?.kind === 'fileChange') return true;\n const input = update.input;\n const metadata = update.metadata;\n return (isRecord(input) && Array.isArray(input.changes))\n || (isRecord(metadata) && Array.isArray(metadata.changes));\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n","import type {\n CodexServerRequestResponder,\n ServerRequest,\n} from '../codex/index';\nimport type {\n CodexSurfaceClientRequest,\n CodexSurfaceClientRequestResponse,\n SurfaceMessage,\n SurfaceMessageToolPart,\n} from '@codex-app-sdk/core/surface';\nimport {\n argumentsPreview,\n findPendingMcpToolPart,\n isRecord,\n mcpElicitationResponse,\n persistSupports,\n stringValue,\n} from './codex-surface-prompts';\nimport { addUnique, updateAssistantToolPart, upsertAssistantToolPart } from './codex-surface-message-state';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { runtimeProjection, type ThreadRuntimePatch, type ThreadRuntimeState } from './codex-surface-runtime';\n\ntype ToolInputRequest = Extract<ServerRequest, { method: 'item/tool/requestUserInput' }>;\ntype McpElicitationRequest = Extract<ServerRequest, { method: 'mcpServer/elicitation/request' }>;\ntype ClientRequestResolutionReason =\n | 'conversation_closed'\n | 'conversation_removed'\n | 'surface_disconnected';\n\ntype PendingClientRequest =\n | {\n kind: 'ask_user';\n itemId: string;\n request: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }>;\n threadId: string;\n turnId: string;\n responder: CodexServerRequestResponder<'item/tool/requestUserInput'>;\n }\n | {\n kind: 'mcp_tool_approval';\n displayTurnId: string;\n itemId: string;\n request: Extract<CodexSurfaceClientRequest, { kind: 'confirm_tool' }>;\n threadId: string;\n turnId: string | null;\n responder: CodexServerRequestResponder<'mcpServer/elicitation/request'>;\n };\n\nexport type CodexSurfaceClientRequestsHost = {\n activeConversationId(): string | null;\n answerAsyncQuestion(threadId: string, prompt: string, displayText: string): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action' | 'notification'): void;\n emitEvent(origin: 'action' | 'notification', input: SurfaceEventInput): void;\n hasPendingApproval(threadId: string): boolean;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n};\n\nexport class CodexSurfaceClientRequestsController {\n private readonly pending = new Map<string, PendingClientRequest>();\n\n constructor(private readonly host: CodexSurfaceClientRequestsHost) {}\n\n requestsForThread(threadId: string): CodexSurfaceClientRequest[] {\n return [...this.pending.values()]\n .filter((pending) => pending.threadId === threadId)\n .map((pending) => pending.request);\n }\n\n hasForThread(threadId: string): boolean {\n return [...this.pending.values()].some((pending) => pending.threadId === threadId);\n }\n\n clear(): void {\n this.pending.clear();\n }\n\n rejectAll(reason: string): void {\n for (const pending of this.pending.values()) pending.responder.reject(reason);\n this.pending.clear();\n }\n\n clearForThread(threadId: string, reason: string, eventReason: ClientRequestResolutionReason): void {\n const resolved: PendingClientRequest[] = [];\n for (const [requestId, pending] of this.pending) {\n if (pending.threadId !== threadId) continue;\n pending.responder.reject(reason);\n this.pending.delete(requestId);\n resolved.push(pending);\n }\n this.host.patchRuntime(threadId, {});\n for (const pending of resolved) {\n this.host.emitEvent('notification', {\n type: 'clientRequest.resolved',\n conversationId: threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: {\n request: structuredClone(pending.request),\n response: null,\n reason: eventReason,\n },\n });\n }\n }\n\n async respond(\n threadId: string | undefined,\n response: CodexSurfaceClientRequestResponse,\n ): Promise<void> {\n const pending = this.pending.get(response.id);\n if (!pending) {\n await this.respondToAsyncQuestion(threadId, response);\n return;\n }\n if (threadId !== undefined && pending.threadId !== threadId) {\n throw new Error(`Client request '${response.id}' belongs to conversation '${pending.threadId}', not '${threadId}'`);\n }\n const confirmationDecision = response.payload?.decision ?? 'deny';\n if (\n pending.kind === 'mcp_tool_approval'\n && !['allow', 'allow_conversation', 'always_allow', 'deny'].includes(confirmationDecision)\n ) {\n throw new Error(`Invalid tool confirmation decision '${String(confirmationDecision)}'`);\n }\n this.pending.delete(response.id);\n const runtime = this.host.requireRuntime(pending.threadId);\n const answeredClientRequestIds = addUnique(runtime.answeredClientRequestIds, response.id);\n if (pending.kind === 'ask_user') {\n const answers = response.payload?.answers ?? {};\n pending.responder.resolve({ answers });\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds,\n messages: updateAssistantToolPart(runtime.messages, pending.threadId, pending.turnId, {\n itemId: pending.itemId,\n output: { answers },\n }),\n });\n } else {\n const decision = confirmationDecision;\n pending.responder.resolve(mcpElicitationResponse(decision));\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds,\n messages: updateAssistantToolPart(runtime.messages, pending.threadId, pending.displayTurnId, {\n itemId: pending.itemId,\n output: { decision },\n }),\n });\n }\n this.maybeClearWaitingBusy(pending.threadId);\n this.host.emitEvent('action', {\n type: 'clientRequest.resolved',\n conversationId: pending.threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: {\n request: structuredClone(pending.request),\n response: structuredClone(response),\n reason: 'host',\n },\n });\n this.host.emitConversationActivity(pending.threadId, 'action');\n }\n\n private async respondToAsyncQuestion(\n threadId: string | undefined,\n response: CodexSurfaceClientRequestResponse,\n ): Promise<void> {\n const resolvedThreadId = threadId ?? this.host.activeConversationId();\n const runtime = resolvedThreadId === null ? null : this.host.requireRuntime(resolvedThreadId);\n const request = runtime && runtimeProjection(runtime, [], []).clientRequests.find(\n (candidate): candidate is Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> => (\n candidate.kind === 'ask_user' && candidate.id === response.id\n ),\n );\n const match = runtime && request ? { request, runtime } : null;\n if (!match) throw new Error(`Unknown client request '${response.id}'`);\n if (match.request.payload.request.delivery !== 'async') {\n throw new Error(`Unknown client request '${response.id}'`);\n }\n const answers = response.payload?.answers ?? {};\n const entries = match.request.payload.request.questions.flatMap((question) => {\n const answer = answers[question.id]?.answers.join(', ').trim() ?? '';\n return answer ? [{\n questionItemId: question.id,\n question: question.question,\n answer,\n }] : [];\n });\n if (response.payload?.cancelled !== true) {\n if (entries.length === 0) throw new Error('At least one answer is required');\n const prompt = '<send_user_message_question_reply>\\n'\n + `${JSON.stringify(entries)}\\n`\n + '</send_user_message_question_reply>';\n const displayText = entries.length === 1\n ? entries[0]!.answer\n : entries.map((entry) => `${entry.question}: ${entry.answer}`).join('\\n');\n await this.host.answerAsyncQuestion(match.runtime.threadId, prompt, displayText);\n }\n this.host.patchRuntime(match.runtime.threadId, {\n answeredClientRequestIds: addUnique(match.runtime.answeredClientRequestIds, response.id),\n });\n this.host.emitEvent('action', {\n type: 'clientRequest.resolved',\n conversationId: match.runtime.threadId,\n ...(match.request.turnId ? { turnId: match.request.turnId } : {}),\n payload: {\n request: structuredClone(match.request),\n response: structuredClone(response),\n reason: 'host',\n },\n });\n this.host.emitConversationActivity(match.runtime.threadId, 'action');\n }\n\n handleServerResolved(requestId: string, threadId: string): void {\n const pending = this.pending.get(requestId);\n this.pending.delete(requestId);\n if (pending) {\n const runtime = this.host.requireRuntime(pending.threadId);\n this.host.patchRuntime(pending.threadId, {\n answeredClientRequestIds: addUnique(runtime.answeredClientRequestIds, requestId),\n });\n }\n this.maybeClearWaitingBusy(threadId);\n if (!pending) return;\n this.host.emitEvent('notification', {\n type: 'clientRequest.resolved',\n conversationId: pending.threadId,\n ...(pending.turnId ? { turnId: pending.turnId } : {}),\n payload: { request: structuredClone(pending.request), response: null, reason: 'server' },\n });\n }\n\n maybeClearWaitingBusy(threadId: string): void {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.turnStartPending || runtime.activeTurnId !== null) return;\n if (!this.host.hasPendingApproval(threadId) && !this.hasForThread(threadId)) {\n this.host.patchRuntime(threadId, { busy: false });\n }\n }\n\n handleToolInputRequest(\n request: ToolInputRequest,\n responder: CodexServerRequestResponder<'item/tool/requestUserInput'>,\n ): boolean {\n const { threadId, turnId, itemId, questions } = request.params;\n if (questions.length === 0) return false;\n const runtime = this.host.requireRuntime(threadId);\n this.host.markRuntimeTurnActive(runtime, turnId);\n const requestId = String(request.id);\n const normalizedQuestions = questions.map((question) => ({\n ...question,\n options: question.options?.map((option) => ({ ...option })) ?? null,\n }));\n const clientRequest: Extract<CodexSurfaceClientRequest, { kind: 'ask_user' }> = {\n id: requestId,\n kind: 'ask_user',\n conversationId: threadId,\n turnId,\n itemId,\n payload: {\n request: {\n itemId,\n delivery: 'tool',\n blocking: request.params.isBlocking ?? true,\n questions: normalizedQuestions,\n ...(request.params.autoResolutionMs === null\n ? {}\n : { autoResolutionMs: request.params.autoResolutionMs }),\n },\n },\n };\n this.pending.set(requestId, {\n kind: 'ask_user', itemId, request: clientRequest, threadId, turnId, responder,\n });\n this.host.patchRuntime(threadId, {\n busy: true,\n messages: upsertAssistantToolPart(runtime.messages, threadId, turnId, {\n type: 'tool',\n id: itemId,\n kind: 'generic',\n title: 'ask_user_question',\n status: 'running',\n statusText: JSON.stringify({\n source: 'codex', action: 'ask_user_question', phase: 'running',\n params: { requestId, questions: normalizedQuestions },\n }),\n input: normalizedQuestions,\n metadata: { requestId, question: normalizedQuestions[0]!.question },\n }),\n });\n const requestToolMessage = this.host.messageContainingTool(threadId, turnId, itemId);\n const requestToolPart = requestToolMessage?.parts.find((part) => part.type === 'tool' && part.id === itemId);\n if (requestToolMessage && requestToolPart?.type === 'tool') {\n this.host.emitEvent('notification', {\n type: 'tool.started', conversationId: threadId, turnId,\n payload: { messageId: requestToolMessage.id, toolPart: structuredClone(requestToolPart) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested', conversationId: threadId, turnId,\n payload: { request: structuredClone(clientRequest) },\n });\n this.host.emitConversationActivity(threadId, 'notification');\n return true;\n }\n\n handleMcpElicitationRequest(\n request: McpElicitationRequest,\n responder: CodexServerRequestResponder<'mcpServer/elicitation/request'>,\n ): boolean {\n const params = request.params;\n if (params.mode !== 'form') return false;\n const meta = params._meta;\n if (!isRecord(meta) || meta.codex_approval_kind !== 'mcp_tool_call') return false;\n const requestId = String(request.id);\n const toolName = stringValue(meta.tool_name) ?? stringValue(meta.tool_title) ?? 'tool';\n const runtime = this.host.requireRuntime(params.threadId);\n if (params.turnId) this.host.markRuntimeTurnActive(runtime, params.turnId);\n const displayTurnId = params.turnId ?? runtime.activeTurnId ?? `client-request-${requestId}`;\n const existingTool = findPendingMcpToolPart(\n runtime.messages, displayTurnId, params.serverName, toolName,\n );\n const itemId = existingTool?.id ?? `approval-${requestId}`;\n const summary = params.message.trim() || `Allow ${params.serverName} to run ${toolName}?`;\n const clientRequest: Extract<CodexSurfaceClientRequest, { kind: 'confirm_tool' }> = {\n id: requestId,\n kind: 'confirm_tool',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId,\n payload: {\n confirmation: {\n argumentsPreview: argumentsPreview(meta),\n integrationId: params.serverName,\n integrationName: stringValue(meta.connector_name) ?? params.serverName,\n summary,\n toolName,\n ...(persistSupports(meta.persist, 'session') ? { allowConversation: true } : {}),\n ...(persistSupports(meta.persist, 'always') ? { allowAlways: true } : {}),\n },\n },\n };\n this.pending.set(requestId, {\n kind: 'mcp_tool_approval', displayTurnId, itemId, request: clientRequest,\n threadId: params.threadId, turnId: params.turnId, responder,\n });\n const toolPart: SurfaceMessageToolPart = {\n type: 'tool',\n id: itemId,\n kind: 'mcp',\n title: `${params.serverName}.${toolName}`,\n status: 'running',\n statusText: JSON.stringify({\n source: 'mcp', action: 'confirm_tool', phase: 'running',\n params: {\n requestId, confirmationSummary: summary, argumentsPreview: argumentsPreview(meta),\n allowConversation: persistSupports(meta.persist, 'session'),\n allowAlways: persistSupports(meta.persist, 'always'),\n },\n }),\n input: meta.tool_params,\n metadata: {\n ...(existingTool?.metadata ?? {}),\n requestId, confirmationRequestId: requestId, server: params.serverName, tool: toolName,\n },\n };\n this.host.patchRuntime(params.threadId, {\n busy: true,\n messages: upsertAssistantToolPart(runtime.messages, params.threadId, displayTurnId, toolPart),\n });\n const toolMessage = this.host.messageContainingTool(params.threadId, displayTurnId, itemId);\n if (toolMessage) {\n this.host.emitEvent('notification', {\n type: 'tool.started', conversationId: params.threadId, turnId: displayTurnId,\n payload: { messageId: toolMessage.id, toolPart: structuredClone(toolPart) },\n });\n }\n this.host.emitEvent('notification', {\n type: 'clientRequest.requested',\n conversationId: params.threadId,\n ...(params.turnId ? { turnId: params.turnId } : {}),\n payload: { request: structuredClone(clientRequest) },\n });\n this.host.emitConversationActivity(params.threadId, 'notification');\n return true;\n }\n}\n","import { extname } from 'node:path';\nimport type { v2 } from '../codex/index';\nimport type { CodexSurfaceModel, CodexSurfacePlugin, CodexSurfaceSkill } from '@codex-app-sdk/core/surface';\n\nconst MAX_CATALOG_ICON_BYTES = 256 * 1024;\n\nexport function codexModelToSurfaceModel(model: v2.Model): CodexSurfaceModel {\n return {\n id: model.id,\n model: model.model,\n displayName: model.displayName,\n description: model.description,\n hidden: model.hidden,\n supportedReasoningEfforts: model.supportedReasoningEfforts,\n defaultReasoningEffort: model.defaultReasoningEffort,\n ...(model.serviceTiers.length > 0 ? {\n serviceTiers: model.serviceTiers.map((tier) => ({\n id: tier.id,\n name: tier.name,\n description: tier.description,\n })),\n } : {}),\n ...(model.defaultServiceTier ? { defaultServiceTier: model.defaultServiceTier } : {}),\n isDefault: model.isDefault,\n providerMetadata: {\n inputModalities: model.inputModalities,\n serviceTiers: model.serviceTiers,\n supportsPersonality: model.supportsPersonality,\n upgrade: model.upgrade,\n upgradeInfo: model.upgradeInfo,\n },\n };\n}\n\nexport async function surfaceSkills(\n skills: readonly v2.SkillMetadata[],\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfaceSkill[]> {\n return Promise.all(\n skills\n .filter((skill) => skill.enabled)\n .map((skill) => surfaceSkill(skill, localIconDataUrl)),\n );\n}\n\nexport async function surfaceSkill(\n skill: v2.SkillMetadata,\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfaceSkill> {\n const brandColor = nonEmpty(skill.interface?.brandColor);\n const defaultPrompt = stringOrUndefined(skill.interface?.defaultPrompt);\n const [iconSmall, iconLarge] = await Promise.all([\n skill.interface?.iconSmall ? localIconDataUrl(skill.interface.iconSmall) : undefined,\n skill.interface?.iconLarge ? localIconDataUrl(skill.interface.iconLarge) : undefined,\n ]);\n return {\n name: skill.name,\n description: skill.description,\n shortDescription: skill.shortDescription ?? skill.interface?.shortDescription,\n displayName: skill.interface?.displayName,\n iconSmall,\n iconLarge,\n ...(brandColor ? { brandColor } : {}),\n ...(defaultPrompt !== undefined ? { defaultPrompt } : {}),\n path: skill.path,\n scope: skill.scope,\n enabled: skill.enabled,\n };\n}\n\nexport async function surfacePlugin(\n plugin: v2.PluginSummary,\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<CodexSurfacePlugin> {\n const pluginInterface = plugin.interface;\n const composerIconUrl = safeRemoteImageUrl(pluginInterface?.composerIconUrl);\n const logoUrl = safeRemoteImageUrl(pluginInterface?.logoUrl);\n const logoUrlDark = safeRemoteImageUrl(pluginInterface?.logoUrlDark);\n const displayName = nonEmpty(pluginInterface?.displayName) ?? plugin.name;\n const shortDescription = nonEmpty(pluginInterface?.shortDescription);\n const longDescription = nonEmpty(pluginInterface?.longDescription);\n const brandColor = nonEmpty(pluginInterface?.brandColor);\n const iconUrl = composerIconUrl\n ?? logoUrl\n ?? await firstLocalPluginIcon([pluginInterface?.composerIcon, pluginInterface?.logo], localIconDataUrl);\n const iconUrlDark = composerIconUrl\n ?? logoUrlDark\n ?? logoUrl\n ?? await firstLocalPluginIcon([\n pluginInterface?.composerIcon,\n pluginInterface?.logoDark,\n pluginInterface?.logo,\n ], localIconDataUrl);\n return {\n id: plugin.id,\n name: plugin.name,\n displayName,\n ...(shortDescription ? { shortDescription } : {}),\n ...(longDescription ? { longDescription } : {}),\n ...(brandColor ? { brandColor } : {}),\n ...(iconUrl ? { iconUrl } : {}),\n ...(iconUrlDark ? { iconUrlDark } : {}),\n enabled: plugin.enabled,\n };\n}\n\nexport async function firstLocalPluginIcon(\n paths: readonly (string | null | undefined)[],\n localIconDataUrl: (path: string) => Promise<string | undefined>,\n): Promise<string | undefined> {\n for (const path of paths) {\n if (!path) continue;\n const dataUrl = await localIconDataUrl(path);\n if (dataUrl) return dataUrl;\n }\n return undefined;\n}\n\nexport function safeRemoteImageUrl(value: string | null | undefined): string | undefined {\n const url = nonEmpty(value);\n try {\n return new URL(url!).protocol === 'https:' ? url : undefined;\n } catch {}\n return undefined;\n}\n\nexport function catalogIconMimeType(path: string): string | undefined {\n switch (extname(path).toLowerCase()) {\n case '.avif': return 'image/avif';\n case '.bmp': return 'image/bmp';\n case '.gif': return 'image/gif';\n case '.ico': return 'image/x-icon';\n case '.jpeg':\n case '.jpg': return 'image/jpeg';\n case '.png': return 'image/png';\n case '.svg': return 'image/svg+xml';\n case '.webp': return 'image/webp';\n }\n return undefined;\n}\n\nexport function boundedImageDataUrl(mimeType: string, dataBase64: string): string | undefined {\n const encoded = dataBase64.trim();\n if (!/^[a-z\\d+/]+={0,2}$/i.test(encoded)) {\n return undefined;\n }\n const unpadded = encoded.replace(/=+$/, '');\n if (unpadded.length % 4 === 1) return undefined;\n const suppliedPadding = encoded.length - unpadded.length;\n const requiredPadding = (4 - (unpadded.length % 4)) % 4;\n if (suppliedPadding !== 0 && suppliedPadding !== requiredPadding) return undefined;\n const byteLength = Math.floor((unpadded.length * 3) / 4);\n if (byteLength > MAX_CATALOG_ICON_BYTES) return undefined;\n const padded = `${unpadded}${'='.repeat((4 - (unpadded.length % 4)) % 4)}`;\n return `data:${mimeType};base64,${padded}`;\n}\n\nfunction nonEmpty(value: unknown): string | undefined {\n const trimmed = typeof value === 'string' ? value.trim() : undefined;\n return trimmed || undefined;\n}\n\nfunction stringOrUndefined(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined;\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceApprovalPreset,\n CodexSurfaceEventOrigin,\n CodexSurfaceModel,\n CodexSurfaceSnapshot,\n CodexSurfaceSkill,\n ListCodexModelsOptions,\n} from '@codex-app-sdk/core/surface';\nimport {\n boundedImageDataUrl,\n catalogIconMimeType,\n codexModelToSurfaceModel,\n surfacePlugin,\n surfaceSkills,\n} from './codex-surface-catalog';\nimport { reuseUnchangedItems, surfaceRateLimits } from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n approvalPresetsForProfiles,\n defaultReasoningEffort,\n defaultServiceTier,\n selectedModel,\n} from './codex-surface-settings';\nimport type { ListCodexSkillsOptions } from './codex-surface-contracts';\nimport type { ConversationCatalogs, ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceCatalogHost = {\n authenticationBlocksBootstrap(): boolean;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n ensureConnected(): Promise<void>;\n getState(): CodexSurfaceSnapshot;\n isClosed(): boolean;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n preferredApprovalPreset(): CodexSurfaceApprovalPreset | null;\n runtimes(): Iterable<ThreadRuntimeState>;\n};\n\nexport class CodexSurfaceCatalogController {\n private readonly iconDataUrls = new Map<string, Promise<string | undefined>>();\n private readonly skillsByCwd = new Map<string | null, Pick<ConversationCatalogs, 'skills' | 'skillCatalogStatus'>>();\n private readonly skillRequests = new Map<string | null, Promise<CodexSurfaceSkill[]>>();\n private skillRevision = 0;\n private pluginPromise: Promise<void> | null = null;\n private pluginLastAttemptedCwdsKey: string | null = null;\n private pluginRefreshRequested = false;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly cwd: string | undefined,\n private readonly host: CodexSurfaceCatalogHost,\n ) {}\n\n reset(pluginRefreshRequested: boolean): void {\n this.iconDataUrls.clear();\n this.skillsByCwd.clear();\n this.skillRequests.clear();\n this.skillRevision += 1;\n this.pluginLastAttemptedCwdsKey = null;\n this.pluginRefreshRequested = pluginRefreshRequested;\n }\n\n async listModels(options: ListCodexModelsOptions = {}): Promise<CodexSurfaceModel[]> {\n await this.host.ensureConnected();\n const includeHidden = options.includeHidden ?? false;\n const forceReload = options.forceReload ?? true;\n const state = this.host.getState();\n if (!forceReload && !includeHidden && state.modelCatalogStatus === 'loaded') {\n return structuredClone(state.models);\n }\n const models = await this.requestModels(includeHidden);\n if (!includeHidden) this.applyModels(models, 'action');\n return structuredClone(models);\n }\n\n async loadModels(): Promise<void> {\n this.host.patch({ modelCatalogStatus: 'loading' });\n this.emitModels([], 'loading');\n try {\n this.applyModels(await this.requestModels(false), 'action');\n } catch {\n this.host.patch({ modelCatalogStatus: 'error', models: [] });\n this.emitModels([], 'error');\n }\n }\n\n async loadSkills(forceReload = false, origin: CodexSurfaceEventOrigin = 'action'): Promise<void> {\n if (forceReload) this.iconDataUrls.clear();\n this.host.patch({ skillCatalogStatus: 'loading' });\n this.emitSkills(this.cwd ?? null, [], 'loading', origin);\n try {\n const response = await this.client.request('skills/list', {\n ...(this.cwd ? { cwds: [this.cwd] } : {}), forceReload,\n });\n const skills = await surfaceSkills(\n response.data.flatMap((entry) => entry.skills),\n (path) => this.iconDataUrl(path),\n );\n this.host.patch({ skills, skillCatalogStatus: 'loaded' });\n this.skillsByCwd.set(this.cwd ?? null, { skills, skillCatalogStatus: 'loaded' });\n this.emitSkills(this.cwd ?? null, skills, 'loaded', origin);\n } catch {\n this.host.patch({ skills: [], skillCatalogStatus: 'error' });\n this.emitSkills(this.cwd ?? null, [], 'error', origin);\n }\n }\n\n async listSkills(options: ListCodexSkillsOptions = {}): Promise<CodexSurfaceSkill[]> {\n await this.host.ensureConnected();\n const key = options.cwd ?? null;\n const pending = this.skillRequests.get(key);\n if (pending) return structuredClone(await pending);\n const cached = this.skillsByCwd.get(key);\n if (!options.forceReload && cached?.skillCatalogStatus === 'loaded') return structuredClone(cached.skills);\n if (options.forceReload) this.iconDataUrls.clear();\n const revision = this.skillRevision;\n this.publishSkills(key, [], 'loading', 'action');\n const request = (async () => {\n try {\n const response = await this.client.request('skills/list', {\n ...(options.cwd ? { cwds: [options.cwd] } : {}), forceReload: options.forceReload ?? false,\n });\n const skills = await surfaceSkills(response.data.flatMap((entry) => entry.skills), (path) => this.iconDataUrl(path));\n if (revision !== this.skillRevision) throw new Error('Skill discovery was invalidated; retry the request');\n this.skillsByCwd.set(key, { skills, skillCatalogStatus: 'loaded' });\n this.publishSkills(key, skills, 'loaded', 'action');\n return skills;\n } catch (error) {\n if (revision === this.skillRevision) this.publishSkills(key, [], 'error', 'action');\n throw error;\n }\n })();\n this.skillRequests.set(key, request);\n try { return structuredClone(await request); }\n finally { if (this.skillRequests.get(key) === request) this.skillRequests.delete(key); }\n }\n\n invalidateSkills(): void {\n const discoveredScopes = new Set([...this.skillsByCwd.keys(), ...this.skillRequests.keys()]);\n this.skillRevision += 1;\n this.skillsByCwd.clear();\n this.skillRequests.clear();\n this.iconDataUrls.clear();\n this.host.patch({ skills: [], skillCatalogStatus: 'notLoaded' });\n this.emitSkills(this.cwd ?? null, [], 'notLoaded', 'notification');\n for (const runtime of this.host.runtimes()) {\n this.host.patchRuntime(runtime.threadId, { skills: [], skillCatalogStatus: 'notLoaded' });\n this.host.emitConversationSkills(runtime.threadId, 'notification');\n }\n // Keep catalogs already requested by clients fresh without discovering any\n // unopened workspace. Older renderer clients rely on pushed refreshes.\n for (const cwd of discoveredScopes) {\n void this.listSkills({ ...(cwd ? { cwd } : {}), forceReload: true }).catch(() => undefined);\n }\n }\n\n async loadPermissionProfiles(): Promise<void> {\n try {\n const profiles = await this.requestPermissionProfiles(this.cwd);\n const requirements = (await this.client.request('configRequirements/read', undefined)).requirements;\n const approvalPresets = approvalPresetsForProfiles(profiles, requirements);\n const preferred = this.host.preferredApprovalPreset();\n this.host.patch({\n permissionProfiles: profiles,\n approvalPresets,\n approvalPreset: preferred\n ? (approvalPresets.includes(preferred) ? preferred : approvalPresets[0] ?? null)\n : null,\n });\n this.emitPermissions(this.cwd ?? null, profiles, approvalPresets);\n } catch {\n this.host.patch({ permissionProfiles: [], approvalPresets: [], approvalPreset: null });\n this.emitPermissions(this.cwd ?? null, [], []);\n }\n }\n\n async loadRateLimits(): Promise<void> {\n try {\n const rateLimits = surfaceRateLimits(\n await this.client.request('account/rateLimits/read', undefined),\n );\n this.host.patch({ rateLimits });\n this.host.emitEvent('action', {\n type: 'rateLimits.changed', payload: { rateLimits: structuredClone(rateLimits) },\n });\n } catch {\n this.host.patch({ rateLimits: null });\n this.host.emitEvent('action', { type: 'rateLimits.changed', payload: { rateLimits: null } });\n }\n }\n\n async loadConversationCatalogs(cwd: string | undefined, forceReload = false): Promise<ConversationCatalogs> {\n const state = this.host.getState();\n const skills = this.skillsByCwd.get(cwd ?? null) ?? { skills: [], skillCatalogStatus: 'notLoaded' as const };\n if (!forceReload && cwd === this.cwd) {\n return {\n ...structuredClone(skills),\n permissionProfiles: [...state.permissionProfiles],\n approvalPresets: [...state.approvalPresets],\n };\n }\n const [permissionResult] = await Promise.allSettled([\n (async () => ({\n profiles: await this.requestPermissionProfiles(cwd),\n requirements: (await this.client.request('configRequirements/read', undefined)).requirements,\n }))(),\n ]);\n const permissionProfiles = permissionResult.status === 'fulfilled' ? permissionResult.value.profiles : [];\n return {\n ...structuredClone(skills),\n permissionProfiles,\n approvalPresets: permissionResult.status === 'fulfilled'\n ? approvalPresetsForProfiles(permissionProfiles, permissionResult.value.requirements)\n : [],\n };\n }\n\n schedulePluginRefresh(force = false): void {\n const state = this.host.getState();\n if (this.host.isClosed() || state.status !== 'ready' || this.host.authenticationBlocksBootstrap()) return;\n const scope = this.pluginScope();\n if (force) {\n this.pluginLastAttemptedCwdsKey = null;\n this.pluginRefreshRequested = true;\n }\n if (this.pluginPromise) return;\n if (!this.pluginRefreshRequested && this.pluginLastAttemptedCwdsKey === scope.key) return;\n this.pluginRefreshRequested = false;\n this.host.patch({ pluginCatalogStatus: 'loading' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged',\n payload: { plugins: structuredClone(state.plugins), status: 'loading' },\n });\n const loading = this.loadPluginCatalog(scope.cwds, scope.key);\n this.pluginPromise = loading;\n void loading.finally(() => {\n this.pluginPromise = null;\n if (this.pluginRefreshRequested || this.pluginScope().key !== scope.key) this.schedulePluginRefresh();\n }).catch(() => undefined);\n }\n\n private async requestModels(includeHidden: boolean): Promise<CodexSurfaceModel[]> {\n const models: CodexSurfaceModel[] = [];\n let cursor: string | null | undefined = null;\n do {\n const response: v2.ModelListResponse = await this.client.request('model/list', { cursor, includeHidden });\n models.push(...response.data.map(codexModelToSurfaceModel));\n cursor = response.nextCursor;\n } while (cursor);\n return models;\n }\n\n private applyModels(models: CodexSurfaceModel[], origin: CodexSurfaceEventOrigin): void {\n const selected = selectedModel(models, this.host.getState().selectedModelId);\n this.host.patch({\n models,\n modelCatalogStatus: 'loaded',\n selectedModelId: selected?.id ?? null,\n selectedReasoningEffort: selected ? defaultReasoningEffort(selected) : null,\n selectedServiceTier: selected ? defaultServiceTier(selected) : null,\n });\n this.emitModels(models, 'loaded', origin);\n }\n\n private emitModels(\n models: CodexSurfaceModel[],\n status: CodexSurfaceSnapshot['modelCatalogStatus'],\n origin: CodexSurfaceEventOrigin = 'action',\n ): void {\n this.host.emitEvent(origin, {\n type: 'catalog.modelsChanged', payload: { models: structuredClone(models), status },\n });\n }\n\n private publishSkills(cwd: string | null, skills: CodexSurfaceSkill[], status: CodexSurfaceSnapshot['skillCatalogStatus'], origin: CodexSurfaceEventOrigin): void {\n const activeId = this.host.getState().activeConversationId;\n if (!activeId) this.host.patch({ skills, skillCatalogStatus: status });\n for (const runtime of this.host.runtimes()) {\n if (runtime.cwd !== cwd) continue;\n this.host.patchRuntime(runtime.threadId, { skills, skillCatalogStatus: status });\n this.host.emitConversationSkills(runtime.threadId, origin);\n }\n this.emitSkills(cwd, skills, status, origin);\n }\n\n private emitSkills(\n cwd: string | null,\n skills: CodexSurfaceSkill[],\n status: CodexSurfaceSnapshot['skillCatalogStatus'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.host.emitEvent(origin, {\n type: 'catalog.skillsChanged', payload: { cwd, skills: structuredClone(skills), status },\n });\n }\n\n private emitPermissions(\n cwd: string | null,\n profiles: CodexSurfaceSnapshot['permissionProfiles'],\n approvalPresets: CodexSurfaceSnapshot['approvalPresets'],\n ): void {\n this.host.emitEvent('action', {\n type: 'catalog.permissionsChanged',\n payload: { cwd, permissionProfiles: structuredClone(profiles), approvalPresets: [...approvalPresets] },\n });\n }\n\n private async requestPermissionProfiles(cwd: string | undefined) {\n const profiles: CodexSurfaceSnapshot['permissionProfiles'] = [];\n let cursor: string | null | undefined = null;\n do {\n const response: v2.PermissionProfileListResponse = await this.client.request('permissionProfile/list', {\n cursor, ...(cwd ? { cwd } : {}),\n });\n profiles.push(...response.data);\n cursor = response.nextCursor;\n } while (cursor);\n return profiles;\n }\n\n private pluginScope(): { cwds: string[]; key: string } {\n const state = this.host.getState();\n const cwds = [...new Set([\n this.cwd,\n ...state.conversations.map((conversation) => conversation.cwd),\n ...[...this.host.runtimes()].map((runtime) => runtime.cwd ?? undefined),\n ].filter((cwd): cwd is string => typeof cwd === 'string' && cwd.trim().length > 0))].sort();\n return { cwds, key: JSON.stringify(cwds) };\n }\n\n private async loadPluginCatalog(cwds: readonly string[], key: string): Promise<void> {\n this.pluginLastAttemptedCwdsKey = key;\n try {\n const response = await this.client.request('plugin/installed', {\n ...(cwds.length > 0 ? { cwds: [...cwds] } : {}),\n });\n const summaries = new Map<string, v2.PluginSummary>();\n for (const marketplace of response.marketplaces) {\n for (const plugin of marketplace.plugins) {\n if (!summaries.has(plugin.id)) summaries.set(plugin.id, plugin);\n }\n }\n const plugins = reuseUnchangedItems(this.host.getState().plugins, await Promise.all(\n [...summaries.values()].map((plugin) => surfacePlugin(plugin, (path) => this.iconDataUrl(path))),\n ));\n if (this.host.isClosed() || this.host.authenticationBlocksBootstrap()) return;\n this.host.patch({ plugins, pluginCatalogStatus: 'loaded' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged', payload: { plugins: structuredClone(plugins), status: 'loaded' },\n });\n } catch {\n if (this.host.isClosed() || this.host.authenticationBlocksBootstrap()) return;\n this.pluginLastAttemptedCwdsKey = null;\n this.host.patch({ pluginCatalogStatus: 'error' });\n this.host.emitEvent('action', {\n type: 'catalog.pluginsChanged',\n payload: { plugins: structuredClone(this.host.getState().plugins), status: 'error' },\n });\n }\n }\n\n private iconDataUrl(path: string): Promise<string | undefined> {\n const existing = this.iconDataUrls.get(path);\n if (existing) return existing;\n const materialized = this.readIconDataUrl(path);\n this.iconDataUrls.set(path, materialized);\n return materialized;\n }\n\n private async readIconDataUrl(path: string): Promise<string | undefined> {\n if (!isAbsolute(path)) return undefined;\n const mimeType = catalogIconMimeType(path);\n if (!mimeType) return undefined;\n try {\n const response = await this.client.request('fs/readFile', { path });\n return boundedImageDataUrl(mimeType, response.dataBase64);\n } catch {\n return undefined;\n }\n }\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexSurfaceApproval,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceRequestedPermission,\n} from '@codex-app-sdk/core/surface';\n\nexport type PendingCodexApproval = {\n approval: CodexSurfaceApproval;\n resolve(decision: CodexSurfaceApprovalDecision, scope: CodexSurfaceApprovalScope): void;\n};\n\nexport function registerCodexApprovalHandlers(\n client: CodexAppServerClient,\n onApproval: (pending: PendingCodexApproval) => void,\n): () => void {\n const unsubscribers = [\n client.onServerRequest('item/commandExecution/requestApproval', (request, responder) => {\n onApproval({\n approval: commandApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n decision: commandDecision(request.params, decision, scope),\n }),\n });\n return true;\n }),\n client.onServerRequest('item/fileChange/requestApproval', (request, responder) => {\n onApproval({\n approval: fileChangeApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny' ? 'decline' : scope === 'session' ? 'acceptForSession' : 'accept',\n }),\n });\n return true;\n }),\n client.onServerRequest('item/permissions/requestApproval', (request, responder) => {\n onApproval({\n approval: permissionsApproval(request.id, request.params),\n resolve: (decision, scope) => responder.resolve({\n permissions: decision === 'deny' ? {} : {\n ...(request.params.permissions.fileSystem ? { fileSystem: request.params.permissions.fileSystem } : {}),\n ...(request.params.permissions.network ? { network: request.params.permissions.network } : {}),\n },\n scope: scope === 'session' ? 'session' : 'turn',\n }),\n });\n return true;\n }),\n client.onServerRequest('execCommandApproval', (request, responder) => {\n onApproval({\n approval: {\n id: String(request.id),\n kind: 'command',\n conversationId: request.params.conversationId,\n itemId: request.params.callId,\n title: 'Run command',\n command: request.params.command.join(' '),\n cwd: request.params.cwd,\n ...(request.params.reason ? { description: request.params.reason } : {}),\n },\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny'\n ? { denied: { rejection: 'Denied by user' } }\n : scope === 'session' ? 'approved_for_session' : 'approved',\n }),\n });\n return true;\n }),\n client.onServerRequest('applyPatchApproval', (request, responder) => {\n onApproval({\n approval: {\n id: String(request.id),\n kind: 'file-change',\n conversationId: request.params.conversationId,\n itemId: request.params.callId,\n title: 'Apply file changes',\n ...((request.params.reason || request.params.grantRoot) ? {\n description: request.params.reason ?? `Write under ${request.params.grantRoot}`,\n } : {}),\n },\n resolve: (decision, scope) => responder.resolve({\n decision: decision === 'deny'\n ? { denied: { rejection: 'Denied by user' } }\n : scope === 'session' ? 'approved_for_session' : 'approved',\n }),\n });\n return true;\n }),\n ];\n\n return () => {\n for (const unsubscribe of unsubscribers) unsubscribe();\n };\n}\n\nfunction commandApproval(\n id: string | number,\n params: v2.CommandExecutionRequestApprovalParams,\n): CodexSurfaceApproval {\n const availableDecisions = params.availableDecisions;\n const additionalPermissions = permissionDetails(params.additionalPermissions);\n const requestedPermissions = [\n ...(params.networkApprovalContext ? [{\n kind: 'network' as const,\n enabled: true,\n host: params.networkApprovalContext.host,\n protocol: params.networkApprovalContext.protocol,\n }] : []),\n ...additionalPermissions.filter((permission) => !params.networkApprovalContext || permission.kind !== 'network'),\n ];\n return {\n id: String(id),\n kind: 'command',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Run command',\n command: params.command ?? undefined,\n cwd: params.cwd ?? undefined,\n ...(params.reason ? { description: params.reason } : {}),\n ...(requestedPermissions.length ? { requestedPermissions } : {}),\n ...(availableDecisions ? {\n allowedScopes: [\n ...(availableDecisions.includes('accept') ? ['once' as const] : []),\n ...(availableDecisions.includes('acceptForSession') ? ['session' as const] : []),\n ],\n canDeny: availableDecisions.includes('decline') || availableDecisions.includes('cancel'),\n } : {}),\n };\n}\n\nfunction fileChangeApproval(\n id: string | number,\n params: v2.FileChangeRequestApprovalParams,\n): CodexSurfaceApproval {\n return {\n id: String(id),\n kind: 'file-change',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Apply file changes',\n ...((params.reason || params.grantRoot) ? {\n description: params.reason ?? `Write under ${params.grantRoot}`,\n } : {}),\n };\n}\n\nfunction permissionsApproval(\n id: string | number,\n params: v2.PermissionsRequestApprovalParams,\n): CodexSurfaceApproval {\n const requestedPermissions = permissionDetails(params.permissions);\n return {\n id: String(id),\n kind: 'permissions',\n conversationId: params.threadId,\n turnId: params.turnId,\n itemId: params.itemId,\n title: 'Grant additional permissions',\n description: params.reason ?? 'Codex requested additional access for this task.',\n cwd: params.cwd,\n ...(requestedPermissions.length ? { requestedPermissions } : {}),\n };\n}\n\nfunction commandDecision(\n params: v2.CommandExecutionRequestApprovalParams,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope,\n): v2.CommandExecutionApprovalDecision {\n const available = params.availableDecisions;\n const requested = decision === 'deny' ? 'decline' : scope === 'session' ? 'acceptForSession' : 'accept';\n if (!available || available.includes(requested)) return requested;\n if (decision === 'deny' && available.includes('cancel')) return 'cancel';\n throw new Error(`Approval decision '${decision}:${scope}' is not available for this command`);\n}\n\nfunction permissionDetails(\n profile: v2.RequestPermissionProfile | v2.AdditionalPermissionProfile | null | undefined,\n): CodexSurfaceRequestedPermission[] {\n if (!profile) return [];\n const permissions: CodexSurfaceRequestedPermission[] = [];\n if (profile.network) {\n permissions.push({ kind: 'network', enabled: profile.network.enabled ?? false });\n }\n if (profile.fileSystem) {\n for (const path of profile.fileSystem.read ?? []) {\n permissions.push({ kind: 'filesystem', access: 'read', path });\n }\n for (const path of profile.fileSystem.write ?? []) {\n permissions.push({ kind: 'filesystem', access: 'write', path });\n }\n for (const entry of profile.fileSystem.entries ?? []) {\n permissions.push({\n kind: 'filesystem',\n access: entry.access,\n path: fileSystemPath(entry.path),\n });\n }\n }\n return permissions;\n}\n\nfunction fileSystemPath(path: v2.FileSystemPath): string {\n if (path.type === 'path') return path.path;\n if (path.type === 'glob_pattern') return path.pattern;\n const special = path.value;\n switch (special.kind) {\n case 'project_roots': return special.subpath ? `project roots/${special.subpath}` : 'project roots';\n case 'tmpdir': return 'system temporary directory';\n case 'slash_tmp': return '/tmp';\n case 'root': return 'filesystem root';\n case 'minimal': return 'minimal runtime paths';\n case 'unknown': return [special.path, special.subpath].filter(Boolean).join('/');\n }\n}\n","import type { CodexAppServerClient } from '../codex/index';\nimport type {\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { registerCodexApprovalHandlers, type PendingCodexApproval } from './codex-approvals';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\ntype ApprovalResolutionReason =\n | 'conversation_closed'\n | 'conversation_removed'\n | 'surface_disconnected';\n\nexport type CodexSurfaceApprovalsHost = {\n activeConversationId(): string | null;\n createRuntime(threadId: string, patch: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n maybeClearWaitingBusy(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(threadId: string, status: 'active'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n};\n\nexport class CodexSurfaceApprovalsController {\n private readonly pending = new Map<string, PendingCodexApproval>();\n private readonly unsubscribeHandler: () => void;\n\n constructor(client: CodexAppServerClient, private readonly host: CodexSurfaceApprovalsHost) {\n this.unsubscribeHandler = registerCodexApprovalHandlers(client, (pending) => this.add(pending));\n }\n\n close(): void {\n this.unsubscribeHandler();\n this.pending.clear();\n }\n\n denyAll(): void {\n for (const pending of this.pending.values()) pending.resolve('deny', 'once');\n this.pending.clear();\n }\n\n approvalsForThread(threadId: string): CodexSurfaceSnapshot['approvals'] {\n return [...this.pending.values()]\n .map((pending) => pending.approval)\n .filter((approval) => approval.conversationId === threadId);\n }\n\n hasForThread(threadId: string): boolean {\n return [...this.pending.values()]\n .some((pending) => pending.approval.conversationId === threadId);\n }\n\n async resolve(\n threadId: string | undefined,\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope,\n ): Promise<void> {\n const pending = this.pending.get(approvalId);\n if (!pending) throw new Error(`Unknown approval '${approvalId}'`);\n if (threadId !== undefined && pending.approval.conversationId !== threadId) {\n throw new Error(\n `Approval '${approvalId}' belongs to conversation '${pending.approval.conversationId}', not '${threadId}'`,\n );\n }\n if (decision !== 'approve' && decision !== 'deny') {\n throw new Error(`Invalid approval decision '${String(decision)}'`);\n }\n if (scope !== 'once' && scope !== 'session') {\n throw new Error(`Invalid approval scope '${String(scope)}'`);\n }\n if (decision === 'approve' && pending.approval.allowedScopes && !pending.approval.allowedScopes.includes(scope)) {\n throw new Error(`Approval decision '${decision}:${scope}' is not available for '${approvalId}'`);\n }\n pending.resolve(decision, scope);\n this.pending.delete(approvalId);\n this.refreshActive();\n this.host.maybeClearWaitingBusy(pending.approval.conversationId);\n this.host.emitEvent('action', {\n type: 'approval.resolved',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval), decision, scope, reason: 'host',\n },\n });\n this.host.emitConversationActivity(pending.approval.conversationId, 'action');\n }\n\n clearForThread(threadId: string, eventReason: ApprovalResolutionReason): void {\n const resolved: PendingCodexApproval[] = [];\n for (const [approvalId, pending] of this.pending) {\n if (pending.approval.conversationId !== threadId) continue;\n pending.resolve('deny', 'once');\n this.pending.delete(approvalId);\n resolved.push(pending);\n }\n this.refreshActive();\n this.host.patchRuntime(threadId, {});\n for (const pending of resolved) {\n this.host.emitEvent('notification', {\n type: 'approval.resolved',\n conversationId: threadId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval),\n decision: 'deny', scope: 'once', reason: eventReason,\n },\n });\n }\n }\n\n handleServerResolved(requestId: string): void {\n const pending = this.pending.get(requestId);\n this.pending.delete(requestId);\n this.refreshActive();\n if (!pending) return;\n this.host.maybeClearWaitingBusy(pending.approval.conversationId);\n this.host.emitEvent('notification', {\n type: 'approval.resolved',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: {\n approval: structuredClone(pending.approval),\n decision: null, scope: null, reason: 'server',\n },\n });\n }\n\n private add(pending: PendingCodexApproval): void {\n this.pending.set(pending.approval.id, pending);\n const runtime = this.host.createRuntime(pending.approval.conversationId, { busy: true });\n if (pending.approval.turnId) this.host.markRuntimeTurnActive(runtime, pending.approval.turnId);\n this.host.patchRuntime(pending.approval.conversationId, { busy: true });\n this.host.patchConversationStatus(pending.approval.conversationId, 'active');\n this.refreshActive();\n this.host.emitEvent('notification', {\n type: 'approval.requested',\n conversationId: pending.approval.conversationId,\n ...(pending.approval.turnId ? { turnId: pending.approval.turnId } : {}),\n payload: { approval: structuredClone(pending.approval) },\n });\n this.host.emitConversationActivity(pending.approval.conversationId, 'notification');\n }\n\n private refreshActive(): void {\n const threadId = this.host.activeConversationId();\n this.host.patch({ approvals: threadId ? this.approvalsForThread(threadId) : [] });\n }\n}\n","import { isAbsolute } from 'node:path';\nimport type { CodexSurfaceJsonValue } from '@codex-app-sdk/core/surface';\n\nexport type CodexMcpServerToolApprovalMode = 'auto' | 'prompt' | 'writes' | 'approve';\n\nexport type CodexMcpServerTransport =\n | {\n type: 'stdio';\n command: string;\n args?: readonly string[];\n cwd?: string;\n env?: Readonly<Record<string, string>>;\n /** Environment variable names inherited by the app-server-launched process. */\n envVars?: readonly string[];\n }\n | {\n type: 'http';\n url: string;\n };\n\n/** Trusted main-process configuration for an app-owned MCP server. */\nexport type CodexMcpServerDefinition = {\n name: string;\n transport: CodexMcpServerTransport;\n toolApprovalMode?: CodexMcpServerToolApprovalMode;\n required?: boolean;\n enabledTools?: readonly string[];\n startupTimeoutMs?: number;\n toolTimeoutMs?: number;\n};\n\nexport function normalizeMcpServers(\n definitions: readonly CodexMcpServerDefinition[],\n): readonly CodexMcpServerDefinition[] {\n if (!Array.isArray(definitions)) throw new TypeError('Codex MCP servers must be an array');\n const names = new Set<string>();\n return definitions.map((definition, index) => {\n if (!definition || typeof definition !== 'object' || Array.isArray(definition)) {\n throw new TypeError(`Codex MCP server ${index + 1} must be an object`);\n }\n const name = definition.name?.trim();\n if (!name || !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(name)) {\n throw new TypeError(`Codex MCP server ${index + 1} name must match ^[A-Za-z0-9][A-Za-z0-9_-]*$`);\n }\n if (names.has(name)) throw new Error(`Duplicate Codex MCP server '${name}'`);\n names.add(name);\n const transport = normalizeMcpTransport(definition.transport, name);\n const toolApprovalMode = definition.toolApprovalMode;\n if (\n toolApprovalMode !== undefined\n && toolApprovalMode !== 'auto'\n && toolApprovalMode !== 'prompt'\n && toolApprovalMode !== 'writes'\n && toolApprovalMode !== 'approve'\n ) {\n throw new TypeError(`Codex MCP server '${name}' tool approval mode is invalid`);\n }\n if (definition.required !== undefined && typeof definition.required !== 'boolean') {\n throw new TypeError(`Codex MCP server '${name}' required flag must be a boolean`);\n }\n const enabledTools = definition.enabledTools === undefined\n ? undefined\n : normalizedNonEmptyStrings(definition.enabledTools, `Codex MCP server '${name}' enabled tool`);\n const startupTimeoutMs = optionalPositiveMilliseconds(\n definition.startupTimeoutMs,\n `Codex MCP server '${name}' startup timeout`,\n );\n const toolTimeoutMs = optionalPositiveMilliseconds(\n definition.toolTimeoutMs,\n `Codex MCP server '${name}' tool timeout`,\n );\n return {\n name,\n transport,\n ...(toolApprovalMode === undefined ? {} : { toolApprovalMode }),\n ...(definition.required === undefined ? {} : { required: definition.required }),\n ...(enabledTools === undefined ? {} : { enabledTools }),\n ...(startupTimeoutMs === undefined ? {} : { startupTimeoutMs }),\n ...(toolTimeoutMs === undefined ? {} : { toolTimeoutMs }),\n };\n });\n}\n\nfunction normalizeMcpTransport(\n transport: CodexMcpServerTransport,\n serverName: string,\n): CodexMcpServerTransport {\n if (!transport || typeof transport !== 'object' || Array.isArray(transport)) {\n throw new TypeError(`Codex MCP server '${serverName}' transport must be an object`);\n }\n if (transport.type === 'http') {\n const url = transport.url?.trim();\n let parsed: URL;\n try {\n parsed = new URL(url);\n } catch {\n throw new TypeError(`Codex MCP server '${serverName}' URL must be valid`);\n }\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n throw new TypeError(`Codex MCP server '${serverName}' URL must use HTTP or HTTPS`);\n }\n return { type: 'http', url };\n }\n if (transport.type !== 'stdio') {\n throw new TypeError(`Codex MCP server '${serverName}' transport type is invalid`);\n }\n const command = transport.command?.trim();\n if (!command) throw new TypeError(`Codex MCP server '${serverName}' command cannot be empty`);\n const args = transport.args === undefined\n ? undefined\n : normalizedNonEmptyStrings(transport.args, `Codex MCP server '${serverName}' argument`);\n const cwd = transport.cwd?.trim();\n if (cwd !== undefined && (!cwd || !isAbsolute(cwd))) {\n throw new TypeError(`Codex MCP server '${serverName}' cwd must be an absolute path`);\n }\n let env: Record<string, string> | undefined;\n if (transport.env !== undefined) {\n if (!transport.env || typeof transport.env !== 'object' || Array.isArray(transport.env)) {\n throw new TypeError(`Codex MCP server '${serverName}' env must be an object`);\n }\n env = {};\n for (const [key, value] of Object.entries(transport.env)) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(key) || typeof value !== 'string') {\n throw new TypeError(`Codex MCP server '${serverName}' env entries must be string environment variables`);\n }\n env[key] = value;\n }\n }\n const envVars = transport.envVars === undefined\n ? undefined\n : normalizedEnvironmentVariableNames(transport.envVars, serverName);\n return {\n type: 'stdio',\n command,\n ...(args === undefined ? {} : { args }),\n ...(cwd === undefined ? {} : { cwd }),\n ...(env === undefined ? {} : { env }),\n ...(envVars === undefined ? {} : { envVars }),\n };\n}\n\nfunction normalizedNonEmptyStrings(values: readonly string[], label: string): string[] {\n if (!Array.isArray(values)) throw new TypeError(`${label}s must be an array`);\n const normalized = values.map((value) => {\n if (typeof value !== 'string' || !value.trim()) throw new TypeError(`${label} cannot be empty`);\n return value.trim();\n });\n return [...new Set(normalized)];\n}\n\nfunction normalizedEnvironmentVariableNames(values: readonly string[], serverName: string): string[] {\n const names = normalizedNonEmptyStrings(values, `Codex MCP server '${serverName}' environment variable`);\n for (const name of names) {\n if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) {\n throw new TypeError(`Codex MCP server '${serverName}' environment variable '${name}' is invalid`);\n }\n }\n return names;\n}\n\nfunction optionalPositiveMilliseconds(value: number | undefined, label: string): number | undefined {\n if (value === undefined) return undefined;\n if (!Number.isFinite(value) || value <= 0) throw new TypeError(`${label} must be a positive finite number`);\n return value;\n}\n\nexport function mcpServerConfig(\n definitions: readonly CodexMcpServerDefinition[],\n): Record<string, CodexSurfaceJsonValue> {\n const config: Record<string, CodexSurfaceJsonValue> = {};\n for (const definition of definitions) {\n const server: Record<string, CodexSurfaceJsonValue> = definition.transport.type === 'http'\n ? { url: definition.transport.url }\n : {\n command: definition.transport.command,\n ...(definition.transport.args === undefined ? {} : { args: [...definition.transport.args] }),\n ...(definition.transport.cwd === undefined ? {} : { cwd: definition.transport.cwd }),\n ...(definition.transport.env === undefined ? {} : { env: { ...definition.transport.env } }),\n ...(definition.transport.envVars === undefined ? {} : { env_vars: [...definition.transport.envVars] }),\n };\n if (definition.toolApprovalMode !== undefined) {\n server.default_tools_approval_mode = definition.toolApprovalMode;\n }\n if (definition.required !== undefined) server.required = definition.required;\n if (definition.enabledTools !== undefined) server.enabled_tools = [...definition.enabledTools];\n if (definition.startupTimeoutMs !== undefined) server.startup_timeout_sec = definition.startupTimeoutMs / 1000;\n if (definition.toolTimeoutMs !== undefined) server.tool_timeout_sec = definition.toolTimeoutMs / 1000;\n config[`mcp_servers.${definition.name}`] = server;\n }\n return config;\n}\n\nexport function assertNoMcpConfigCollision(\n config: Readonly<Record<string, CodexSurfaceJsonValue>>,\n definitions: readonly CodexMcpServerDefinition[],\n): void {\n if (definitions.length === 0) return;\n for (const key of Object.keys(config)) {\n if (key === 'mcp_servers') {\n throw new Error('Raw mcp_servers config cannot be combined with typed Codex MCP servers');\n }\n for (const definition of definitions) {\n const path = `mcp_servers.${definition.name}`;\n if (key === path || key.startsWith(`${path}.`)) {\n throw new Error(`Raw config for Codex MCP server '${definition.name}' conflicts with its typed definition`);\n }\n }\n }\n}\n","import type { CodexServerRequestResponder, ServerRequest, v2 } from '../codex/index';\nimport type { CodexSurfaceJsonValue, CreateCodexConversationOptions } from '@codex-app-sdk/core/surface';\nimport {\n assertNoMcpConfigCollision,\n mcpServerConfig,\n normalizeMcpServers,\n type CodexMcpServerDefinition,\n} from './codex-surface-mcp';\nimport { errorMessage } from './codex-surface-prompts';\nimport type {\n CodexConversationLoadOptions,\n CodexDynamicTool,\n CodexSurfaceExtension,\n CodexThreadStartExtension,\n} from './codex-surface-contracts';\n\ntype DynamicToolRequest = Extract<ServerRequest, { method: 'item/tool/call' }>;\n\nexport class CodexSurfaceExtensionsController {\n private readonly dynamicTools = new Map<string, CodexDynamicTool>();\n readonly defaultMcpServers: readonly CodexMcpServerDefinition[];\n\n constructor(\n private readonly extensions: readonly CodexSurfaceExtension[],\n mcpServers: readonly CodexMcpServerDefinition[],\n private readonly hostOptionsForThread: (threadId: string) => CodexConversationLoadOptions | undefined,\n ) {\n this.defaultMcpServers = normalizeMcpServers(mcpServers);\n for (const extension of extensions) {\n for (const tool of extension.dynamicTools ?? []) {\n const name = tool.name.trim();\n if (!name) throw new Error('Dynamic tool names cannot be empty');\n if (this.dynamicTools.has(name)) throw new Error(`Duplicate dynamic tool '${name}'`);\n this.dynamicTools.set(name, { ...tool, name });\n }\n }\n }\n\n hasDynamicTools(): boolean {\n return this.dynamicTools.size > 0;\n }\n\n dynamicToolSpecs(): v2.DynamicToolSpec[] {\n return [...this.dynamicTools.values()].map((tool) => ({\n type: 'function',\n name: tool.name,\n description: tool.description,\n inputSchema: tool.inputSchema as v2.DynamicToolFunctionSpec['inputSchema'],\n ...(tool.deferLoading === undefined ? {} : { deferLoading: tool.deferLoading }),\n }));\n }\n\n async conversationExtension(\n context: Parameters<NonNullable<CodexSurfaceExtension['configureConversation']>>[0],\n createOptions: CreateCodexConversationOptions = {},\n mcpServers: readonly CodexMcpServerDefinition[] = this.defaultMcpServers,\n ): Promise<CodexThreadStartExtension> {\n const config: Record<string, CodexSurfaceJsonValue> = mcpServerConfig(mcpServers);\n const developerInstructions: string[] = [];\n let baseInstructions: string | undefined;\n for (const extension of this.extensions) {\n if (!extension.configureConversation) continue;\n const contribution = await extension.configureConversation(context);\n if (contribution.config) {\n assertNoMcpConfigCollision(contribution.config, mcpServers);\n Object.assign(config, contribution.config);\n }\n if (contribution.baseInstructions !== undefined) baseInstructions = contribution.baseInstructions;\n if (contribution.developerInstructions?.trim()) {\n developerInstructions.push(contribution.developerInstructions.trim());\n }\n }\n if (createOptions.config) {\n assertNoMcpConfigCollision(createOptions.config, mcpServers);\n Object.assign(config, createOptions.config);\n }\n if (createOptions.baseInstructions !== undefined) baseInstructions = createOptions.baseInstructions;\n if (createOptions.developerInstructions?.trim()) {\n developerInstructions.push(createOptions.developerInstructions.trim());\n }\n return {\n ...(baseInstructions === undefined ? {} : { baseInstructions }),\n ...(Object.keys(config).length === 0 ? {} : { config }),\n ...(developerInstructions.length === 0\n ? {}\n : { developerInstructions: developerInstructions.join('\\n\\n') }),\n };\n }\n\n async handleDynamicToolCall(\n request: DynamicToolRequest,\n responder: CodexServerRequestResponder<'item/tool/call'>,\n ): Promise<void> {\n if (request.params.namespace !== null) {\n responder.reject({\n code: -32601,\n message: `Dynamic tool namespace '${request.params.namespace}' is not configured`,\n });\n return;\n }\n const tool = this.dynamicTools.get(request.params.tool);\n if (!tool) {\n responder.reject({ code: -32601, message: `Unknown dynamic host tool '${request.params.tool}'` });\n return;\n }\n try {\n const result = await tool.execute({\n callId: request.params.callId,\n conversationId: request.params.threadId,\n turnId: request.params.turnId,\n arguments: request.params.arguments as CodexSurfaceJsonValue,\n extensionContext: this.hostOptionsForThread(request.params.threadId)?.extensionContext,\n });\n const normalized = typeof result === 'string'\n ? { content: [{ type: 'text' as const, text: result }], success: true }\n : { content: result.content, success: result.success ?? true };\n responder.resolve({\n success: normalized.success,\n contentItems: normalized.content.map((item) => item.type === 'image'\n ? { type: 'inputImage' as const, imageUrl: item.imageUrl }\n : { type: 'inputText' as const, text: item.text }),\n });\n } catch (error) {\n responder.resolve({\n success: false,\n contentItems: [{ type: 'inputText', text: errorMessage(error) }],\n });\n }\n }\n}\n","import { suppressViewedImagePreviews } from './codex-original-history-images';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n ListCodexConversationsOptions,\n SurfaceMessage,\n CodexSurfaceHistoryReason,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexTurnToSurfaceMessages,\n preserveHistoricalMessagePresentation,\n} from './codex-conversation-history';\nimport { normalizedConversationId, errorMessage } from './codex-surface-prompts';\nimport { reuseUnchangedItems, threadToSummary, upsertConversation } from './codex-surface-data';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceTurn } from './codex-surface-events';\n\nconst HISTORY_INITIAL_PAGE_SIZE = 50;\nconst HISTORY_PAGE_SIZE = 25;\nconst HISTORY_MESSAGE_BATCH_SIZE = 25;\n\ntype HistoryHydrationOptions = {\n initialPageLoaded?: boolean;\n cursor?: string | null;\n restart?: boolean;\n itemsView?: 'full' | 'summary';\n};\n\nexport type CodexSurfaceConversationsHost = {\n emitHistoryReplaced(threadId: string, reason: CodexSurfaceHistoryReason, origin: 'action'): void;\n emitHistoryPrepended(threadId: string, messages: readonly SurfaceMessage[], origin: 'lifecycle'): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'listed' | 'updated',\n origin: 'action',\n ): void;\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n removeThread(threadId: string, reason: 'archived' | 'deleted', origin: 'action'): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n schedulePluginRefresh(force: boolean): void;\n};\n\nexport class CodexSurfaceConversationsController {\n private readonly turnLoads = new Map<string, Map<string, Promise<void>>>();\n private readonly imageHydrations = new Map<string, Promise<void>>();\n private readonly historyHydrations = new Map<string, Promise<void>>();\n private readonly historyLoads = new Map<string, Promise<{\n conversationId: string;\n messages: SurfaceMessage[];\n hasOlder: boolean;\n }>>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly conversationLimit: number | undefined,\n private readonly host: CodexSurfaceConversationsHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n reset(): void {\n this.turnLoads.clear(); this.imageHydrations.clear();\n this.historyHydrations.clear();\n this.historyLoads.clear();\n }\n\n forget(threadId: string): void {\n this.turnLoads.delete(threadId); this.imageHydrations.delete(threadId);\n this.historyHydrations.delete(threadId);\n this.historyLoads.delete(threadId);\n }\n\n async loadTurnHistory(threadId: string, turnId: string): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n const prior = runtime.turns.find(turn => turn.id === turnId);\n if (!prior) throw new Error('Turn is not loaded in this conversation.');\n if (prior.itemsView !== 'summary') return;\n let loads = this.turnLoads.get(threadId);\n if (!loads) { loads = new Map(); this.turnLoads.set(threadId, loads); }\n const existing = loads.get(turnId); if (existing) return existing;\n const setDetails = (patch: Partial<typeof prior>) => {\n this.host.patchRuntime(threadId, { turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, ...patch } : turn) });\n this.host.emitHistoryReplaced(threadId, 'details', 'action');\n };\n const loading = (async () => {\n await Promise.resolve();\n try {\n if (this.host.runtime(threadId) !== runtime) throw new Error('Conversation changed while loading turn details.');\n setDetails({ detailsLoading: true, detailsError: null });\n const items = await readTurnItems(this.client, threadId, turnId);\n if (this.host.runtime(threadId) !== runtime) throw new Error('Conversation changed while loading turn details.');\n const current = runtime.turns.find(turn => turn.id === turnId);\n if (!current) throw new Error('Turn is no longer available.');\n // An already-streaming turn is authoritative; never replace its live work.\n if (runtime.activeTurnId !== turnId && current.status !== 'inProgress') {\n const native: v2.Turn = { id: turnId, rootTurnId: null, itemsView: 'full', items, status: current.status, error: null,\n startedAt: current.startedAt ? Date.parse(current.startedAt) / 1000 : null,\n completedAt: current.completedAt ? Date.parse(current.completedAt) / 1000 : null, durationMs: current.durationMs };\n let messages = preserveHistoricalMessagePresentation(runtime.messages, codexTurnToSurfaceMessages(threadId, native));\n if (this.originalImages) messages = suppressViewedImagePreviews(messages);\n const at = runtime.messages.findIndex(message => message.turnId === turnId);\n const merged = runtime.messages.filter(message => message.turnId !== turnId);\n merged.splice(at < 0 ? merged.length : at, 0, ...messages);\n this.host.patchRuntime(threadId, { messages: merged });\n }\n setDetails({ itemsView: 'full', detailsLoading: false, detailsError: null });\n this.hydrateOriginalImages(threadId);\n } catch (error) {\n if (this.host.runtime(threadId) === runtime) setDetails({ detailsLoading: false, detailsError: errorMessage(error) });\n throw error;\n } finally { if (this.turnLoads.get(threadId) === loads) loads.delete(turnId); }\n })();\n loads.set(turnId, loading); return loading;\n }\n\n async loadLoadedTurnHistory(threadId: string): Promise<void> {\n const paging = this.historyLoads.get(threadId);\n if (paging) await paging;\n for (const turn of [...this.host.requireRuntime(threadId).turns]) {\n if (turn.itemsView === 'summary') await this.loadTurnHistory(threadId, turn.id);\n }\n }\n\n hydrateOriginalImages(threadId: string, path?: string | null): void {\n if (!this.originalImages) return;\n this.originalImages.rememberPath(threadId, path);\n if (this.imageHydrations.has(threadId)) return;\n const runtime = this.host.runtime(threadId);\n if (!runtime || !runtime.turns.some(turn => turn.itemsView !== 'summary')) return;\n const work = (async () => {\n const project = await this.originalImages!.prepare(threadId, path);\n if (this.host.runtime(threadId) !== runtime) return;\n const summaryIds = new Set(runtime.turns.filter(turn => turn.itemsView === 'summary').map(turn => turn.id));\n this.host.patchRuntime(threadId, { messages: project(runtime.messages).map((message, index) => summaryIds.has(message.turnId ?? '') ? runtime.messages[index]! : message) });\n this.host.emitHistoryReplaced(threadId, 'images', 'action');\n })();\n this.imageHydrations.set(threadId, work);\n void work.finally(() => { if (this.imageHydrations.get(threadId) === work) this.imageHydrations.delete(threadId); }).catch(() => undefined);\n }\n\n async refresh(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n return this.load();\n }\n\n async load(): Promise<CodexSurfaceSnapshot> {\n const conversations = reuseUnchangedItems(\n this.host.getState().conversations,\n await this.requestConversations({ limit: this.conversationLimit }),\n );\n this.host.patch({ conversations });\n this.host.schedulePluginRefresh(true);\n for (const summary of conversations) this.host.emitSummaryUpserted(summary, 'listed', 'action');\n return this.host.getSnapshot();\n }\n\n async list(options: ListCodexConversationsOptions = {}): Promise<CodexConversationSummary[]> {\n await this.host.ensureConnected();\n return structuredClone(await this.requestConversations(options));\n }\n\n async readSummary(conversationId: string): Promise<CodexConversationSummary> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n const response: v2.ThreadReadResponse = await this.client.request('thread/read', {\n threadId,\n includeTurns: false,\n });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/read returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const summary = this.summaryWithKnownTurnCount(response.thread);\n return structuredClone(summary);\n }\n\n async archive(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n await this.client.request('thread/archive', { threadId });\n this.host.removeThread(threadId, 'archived', 'action');\n return this.host.getSnapshot();\n }\n\n async delete(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n await this.client.request('thread/delete', { threadId });\n this.host.removeThread(threadId, 'deleted', 'action');\n return this.host.getSnapshot();\n }\n\n async unarchive(conversationId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = normalizedConversationId(conversationId);\n await this.host.ensureConnected();\n const response = await this.client.request('thread/unarchive', { threadId });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/unarchive returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const summary = this.summaryWithKnownTurnCount(response.thread);\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n return this.host.getSnapshot();\n }\n\n hydrateCompleteHistory(threadId: string, options: HistoryHydrationOptions = {}): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.fullHistoryHydrated && !options.restart) return Promise.resolve();\n if (options.initialPageLoaded && options.cursor === null) {\n this.host.patchRuntime(threadId, {\n historyCursor: null,\n historyHasOlder: false,\n fullHistoryHydrated: true,\n });\n return Promise.resolve();\n }\n const existing = this.historyHydrations.get(threadId);\n if (existing) return existing;\n const hydration = (async () => {\n try {\n if (options.restart) {\n const response: v2.ThreadTurnsListResponse = await this.client.request('thread/turns/list', {\n threadId,\n cursor: null,\n limit: HISTORY_INITIAL_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: 'full',\n });\n await this.mergeHistoryPage(threadId, [...response.data].reverse(), new Set());\n this.host.patchRuntime(threadId, {\n historyCursor: response.nextCursor,\n historyHasOlder: response.nextCursor !== null,\n fullHistoryHydrated: response.nextCursor === null,\n });\n }\n if (options.cursor !== undefined) {\n this.host.patchRuntime(threadId, {\n historyCursor: options.cursor,\n historyHasOlder: options.cursor !== null,\n });\n }\n while (this.host.runtime(threadId)?.historyCursor !== null) {\n await this.loadOlderHistory(threadId, options.itemsView);\n }\n if (!this.host.runtime(threadId)) return;\n this.host.patchRuntime(threadId, {\n fullHistoryHydrated: true,\n historyHasOlder: false,\n });\n } catch (error) {\n if (this.host.runtime(threadId)) {\n this.host.patchRuntime(threadId, {\n error: `Could not load complete conversation history: ${errorMessage(error)}`,\n });\n }\n throw error;\n }\n })();\n this.historyHydrations.set(threadId, hydration);\n void hydration.finally(() => {\n if (this.historyHydrations.get(threadId) === hydration) this.historyHydrations.delete(threadId);\n }).catch(() => undefined);\n return hydration;\n }\n\n loadOlderHistory(threadId: string, itemsView?: 'full' | 'summary'): Promise<{\n conversationId: string;\n messages: SurfaceMessage[];\n hasOlder: boolean;\n }> {\n const runtime = this.host.requireRuntime(threadId);\n const existing = this.historyLoads.get(threadId);\n if (existing) return existing;\n if (runtime.fullHistoryHydrated || runtime.historyCursor === null) {\n return Promise.resolve({ conversationId: threadId, messages: [], hasOlder: false });\n }\n const load = (async () => {\n this.host.patchRuntime(threadId, { historyLoadingOlder: true, error: null });\n try {\n let cursor = this.host.requireRuntime(threadId).historyCursor;\n let messages: SurfaceMessage[] = [];\n const requestedCursors = new Set<string>();\n while (cursor !== null && messages.length === 0) {\n if (requestedCursors.has(cursor)) {\n throw new Error(`Codex app-server repeated a thread history cursor for '${threadId}'`);\n }\n requestedCursors.add(cursor);\n const materializedTurnIds = new Set(this.host.requireRuntime(threadId).turnIds);\n const requestedView = itemsView ?? this.host.requireRuntime(threadId).historyItemsView;\n let response: v2.ThreadTurnsListResponse = await this.client.request('thread/turns/list', {\n threadId, cursor, limit: HISTORY_PAGE_SIZE, sortDirection: 'desc', itemsView: requestedView,\n });\n if (requestedView === 'summary' && (itemsView ?? this.host.requireRuntime(threadId).historyItemsView) === 'full') {\n response = await this.client.request('thread/turns/list', { threadId, cursor, limit: HISTORY_PAGE_SIZE, sortDirection: 'desc', itemsView: 'full' });\n }\n const turns = [...response.data].reverse();\n const newTurnIds = new Set(turns\n .map((turn) => turn.id)\n .filter((turnId) => !materializedTurnIds.has(turnId)));\n messages = await this.mergeHistoryPage(threadId, turns, newTurnIds);\n cursor = response.nextCursor;\n this.host.patchRuntime(threadId, {\n historyCursor: cursor,\n historyHasOlder: cursor !== null,\n fullHistoryHydrated: cursor === null,\n });\n await this.emitHistoryChunks(threadId, messages);\n }\n return {\n conversationId: threadId,\n messages,\n hasOlder: this.host.requireRuntime(threadId).historyHasOlder,\n };\n } catch (error) {\n if (this.host.runtime(threadId)) this.host.patchRuntime(threadId, { error: errorMessage(error) });\n throw error;\n } finally {\n if (this.host.runtime(threadId)) this.host.patchRuntime(threadId, { historyLoadingOlder: false });\n }\n })();\n this.historyLoads.set(threadId, load);\n void load.finally(() => {\n if (this.historyLoads.get(threadId) === load) this.historyLoads.delete(threadId);\n }).catch(() => undefined);\n return load;\n }\n\n async waitForHistoryEmission(threadId: string): Promise<void> {\n const load = this.historyLoads.get(threadId);\n if (!load) return;\n await load.then(() => undefined, () => undefined);\n }\n\n private async emitHistoryChunks(threadId: string, messages: readonly SurfaceMessage[]): Promise<void> {\n for (let index = messages.length; index > 0;) {\n const start = Math.max(0, index - HISTORY_MESSAGE_BATCH_SIZE);\n this.host.emitHistoryPrepended(threadId, messages.slice(start, index), 'lifecycle');\n await yieldToRenderer();\n index = start;\n }\n }\n\n async refreshCompleteHistory(threadId: string): Promise<void> {\n const existing = this.historyHydrations.get(threadId);\n if (existing) await existing.catch(() => undefined);\n this.host.patchRuntime(threadId, {\n fullHistoryHydrated: false,\n historyCursor: null,\n historyHasOlder: true,\n });\n await this.hydrateCompleteHistory(threadId, { restart: true, itemsView: 'full' });\n }\n\n private async requestConversations(\n options: ListCodexConversationsOptions = {},\n ): Promise<CodexConversationSummary[]> {\n const conversations: CodexConversationSummary[] = [];\n // Paging is sorted by update time, so a thread updated mid-listing can\n // appear on two pages; keep its first, most recent position.\n const seenIds = new Set<string>();\n const totalLimit = options.limit === undefined\n ? Number.POSITIVE_INFINITY\n : Math.max(0, Math.floor(options.limit));\n let cursor: string | null | undefined = null;\n do {\n const limit = Math.min(100, totalLimit - conversations.length);\n if (limit <= 0) break;\n const response: v2.ThreadListResponse = await this.client.request('thread/list', {\n archived: options.archived ?? false,\n cursor,\n limit,\n sortDirection: 'desc',\n sortKey: 'updated_at',\n ...(options.cwd === undefined\n ? {}\n : { cwd: typeof options.cwd === 'string' ? options.cwd : [...options.cwd] }),\n ...(options.searchTerm === undefined ? {} : { searchTerm: options.searchTerm }),\n });\n for (const thread of response.data) {\n if (seenIds.has(thread.id)) continue;\n seenIds.add(thread.id);\n conversations.push(this.summaryWithKnownTurnCount(thread));\n }\n cursor = response.nextCursor;\n } while (cursor);\n return conversations;\n }\n\n private async mergeHistoryPage(\n threadId: string,\n turns: readonly v2.Turn[],\n newTurnIds: ReadonlySet<string>,\n ): Promise<SurfaceMessage[]> {\n const originalProjection = this.host.runtime(threadId)?.historyItemsView !== 'summary' ? await this.originalImages?.prepare(threadId) : undefined;\n const current = this.host.runtime(threadId);\n if (!current) return [];\n const protectedTurnIds = new Set<string>();\n if (current.activeTurnId) protectedTurnIds.add(current.activeTurnId);\n for (const turn of turns) {\n if ((turn.status === 'inProgress' || (turn.itemsView === 'summary' && current.turns.find(value => value.id === turn.id)?.itemsView !== 'summary')) && current.turnIds.includes(turn.id)) protectedTurnIds.add(turn.id);\n }\n const replaceableTurnIds = new Set(turns\n .filter((turn) => !protectedTurnIds.has(turn.id))\n .map((turn) => turn.id));\n const historicalTurns = turns.filter((turn) => replaceableTurnIds.has(turn.id));\n const preservedTurnIds = current.turnIds.filter((turnId) => !replaceableTurnIds.has(turnId));\n const preservedTurns = current.turns.filter((turn) => !replaceableTurnIds.has(turn.id));\n const preservedMessages = current.messages.filter((message) => (\n message.turnId === undefined || !replaceableTurnIds.has(message.turnId)\n ));\n let historyMessages = preserveHistoricalMessagePresentation(\n current.messages,\n historicalTurns.flatMap((turn) => codexTurnToSurfaceMessages(threadId, turn)),\n );\n if (originalProjection) historyMessages = originalProjection(historyMessages);\n else if (this.originalImages) historyMessages = suppressViewedImagePreviews(historyMessages);\n this.host.patchRuntime(threadId, {\n turnIds: [...historicalTurns.map((turn) => turn.id), ...preservedTurnIds],\n turns: [...historicalTurns.map((turn) => surfaceTurn(turn)), ...preservedTurns],\n messages: [...historyMessages, ...preservedMessages],\n });\n if (current.historyItemsView === 'summary') this.hydrateOriginalImages(threadId);\n const turnCount = this.host.requireRuntime(threadId).turnIds.length;\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, turnCount }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'action');\n return historyMessages.filter((message) => message.turnId !== undefined && newTurnIds.has(message.turnId));\n }\n\n private summaryWithKnownTurnCount(thread: v2.Thread): CodexConversationSummary {\n const summary = threadToSummary(thread);\n const runtime = this.host.runtime(thread.id);\n if (runtime?.hydrated) return { ...summary, turnCount: runtime.turnIds.length };\n const existing = this.host.getState().conversations.find((conversation) => conversation.id === thread.id);\n return existing ? { ...summary, turnCount: existing.turnCount } : summary;\n }\n}\n\nfunction yieldToRenderer(): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, 0));\n}\n\n/** Full-detail reads for one turn, independent of turn pagination. */\nexport async function readTurnItems(client: CodexAppServerClient, threadId: string, turnId: string): Promise<v2.ThreadItem[]> {\n const items = new Map<string, v2.ThreadItem>(); const cursors = new Set<string>(); let cursor: string | null = null;\n do {\n const page: v2.ThreadItemsListResponse = await client.request('thread/items/list', { threadId, turnId, cursor, limit: 100, sortDirection: 'asc' });\n if (page.data.some(entry => entry.turnId !== turnId)) throw new Error('Turn details belong to another turn.');\n for (const entry of page.data) items.set(entry.item.id, entry.item); cursor = page.nextCursor;\n if (cursor && cursors.has(cursor)) throw new Error('Repeated turn detail cursor.');\n if (cursor) cursors.add(cursor);\n } while (cursor);\n return [...items.values()];\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceApprovalMode,\n CodexSurfaceApprovalPreset,\n CodexSurfacePermissionMode,\n CodexSurfaceSnapshot,\n CreateCodexConversationOptions,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { sameValue } from './codex-surface-events';\nimport {\n approvalPresetStartParams,\n approvalPresetUpdateParams,\n collaborationMode,\n nextSelection,\n selectedModel,\n} from './codex-surface-settings';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceConversationSettingsHost = {\n createConversation(): Promise<void>;\n emitConversationSettings(threadId: string, origin: 'action'): void;\n emitEvent(origin: 'action', input: SurfaceEventInput): void;\n emitSummaryUpserted(summary: CodexConversationSummary, reason: 'updated', origin: 'action'): void;\n ensureConnected(): Promise<void>;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n};\n\nexport class CodexSurfaceConversationSettingsController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly defaults: {\n approvalMode?: CodexSurfaceApprovalMode;\n approvalPreset?: CodexSurfaceApprovalPreset;\n permissionMode?: CodexSurfacePermissionMode;\n },\n private readonly host: CodexSurfaceConversationSettingsHost,\n ) {}\n\n preferredApprovalPreset(): CodexSurfaceApprovalPreset | null {\n if (this.defaults.approvalPreset) return this.defaults.approvalPreset;\n if (this.defaults.approvalMode !== undefined || this.defaults.permissionMode !== undefined) {\n if (this.defaults.permissionMode === 'full-access' && this.defaults.approvalMode !== 'ask') {\n return 'full-access';\n }\n if (this.defaults.permissionMode === 'workspace-write' && this.defaults.approvalMode === 'ask') {\n return 'ask-for-approval';\n }\n return null;\n }\n return 'ask-for-approval';\n }\n\n threadStartSettings(\n options: CreateCodexConversationOptions,\n availablePresets: readonly CodexSurfaceApprovalPreset[],\n ): {\n approvalPolicy: v2.AskForApproval;\n approvalsReviewer?: v2.ApprovalsReviewer;\n permissions?: string;\n sandbox?: v2.SandboxMode;\n } {\n const preferred = this.preferredApprovalPreset();\n const preset = options.approvalPreset ?? (\n options.approvalMode === undefined && options.permissionMode === undefined\n ? (availablePresets.includes(preferred ?? 'ask-for-approval')\n ? preferred\n : availablePresets[0] ?? null)\n : null\n );\n if (preset) return approvalPresetStartParams(preset);\n const approvalMode = options.approvalMode ?? this.defaults.approvalMode;\n const permissionMode = options.permissionMode ?? this.defaults.permissionMode ?? 'read-only';\n return {\n approvalPolicy: approvalMode === 'ask' ? 'on-request' : 'never',\n sandbox: permissionMode === 'full-access' ? 'danger-full-access' : permissionMode,\n };\n }\n\n async rename(threadId: string, title: string): Promise<void> {\n await this.host.ensureThreadReady(threadId);\n const name = title.trim();\n if (!name) throw new Error('Conversation title cannot be empty');\n await this.client.request('thread/name/set', { threadId, name });\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, title: name }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'action');\n }\n\n async update(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot> {\n const state = this.host.getState();\n const threadId = state.activeConversationId;\n if (!threadId) {\n const next = nextSelection(state, settings);\n if (settings.approvalPreset && !state.approvalPresets.includes(settings.approvalPreset)) {\n throw new Error(`Approval preset '${settings.approvalPreset}' is not available`);\n }\n this.host.patch(next);\n return this.host.getSnapshot();\n }\n await this.updateForThread(threadId, settings);\n return this.host.getSnapshot();\n }\n\n async updateForThread(threadId: string, settings: UpdateCodexConversationSettings): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const runtimeSnapshot = this.host.snapshotForRuntime(runtime);\n const next = nextSelection(runtimeSnapshot, settings);\n const changed = runtime.approvalPreset !== next.approvalPreset\n || runtime.selectedModelId !== next.selectedModelId\n || runtime.selectedReasoningEffort !== next.selectedReasoningEffort\n || runtime.selectedServiceTier !== next.selectedServiceTier\n || runtime.planMode !== next.planMode;\n if (settings.approvalPreset && !runtimeSnapshot.approvalPresets.includes(settings.approvalPreset)) {\n throw new Error(`Approval preset '${settings.approvalPreset}' is not available`);\n }\n const model = selectedModel(this.host.getState().models, next.selectedModelId);\n await this.client.request('thread/settings/update', {\n threadId,\n ...(settings.approvalPreset ? approvalPresetUpdateParams(settings.approvalPreset) : {}),\n ...(settings.modelId && model ? { model: model.model } : {}),\n ...(settings.reasoningEffort || settings.modelId ? { effort: next.selectedReasoningEffort } : {}),\n ...(settings.serviceTier !== undefined || settings.modelId\n ? { serviceTier: next.selectedServiceTier }\n : {}),\n ...(model && (\n typeof settings.planMode === 'boolean'\n || Boolean(settings.modelId)\n || Boolean(settings.reasoningEffort)\n ) ? { collaborationMode: collaborationMode(next.planMode, model.model, next.selectedReasoningEffort) } : {}),\n });\n this.host.patchRuntime(threadId, next);\n if (changed) this.host.emitConversationSettings(threadId, 'action');\n }\n\n async setGoal(objective: string, tokenBudget?: number | null): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.setGoalForThread(threadId, objective, tokenBudget);\n return this.host.getSnapshot();\n }\n\n async setGoalForThread(threadId: string, objective: string, tokenBudget?: number | null): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const normalizedObjective = objective.trim();\n if (!normalizedObjective) throw new Error('Goal objective cannot be empty');\n const response = await this.client.request('thread/goal/set', {\n threadId, objective: normalizedObjective, status: 'active',\n ...(tokenBudget === undefined ? {} : { tokenBudget }),\n });\n if (response.goal.threadId !== threadId) {\n throw new Error(`Codex thread/goal/set returned a goal for '${response.goal.threadId}' instead of '${threadId}'`);\n }\n const changed = !sameValue(runtime.goal, response.goal);\n this.host.patchRuntime(threadId, { goal: { ...response.goal } });\n if (changed) {\n this.host.emitEvent('action', {\n type: 'conversation.goalChanged', conversationId: threadId,\n payload: { goal: structuredClone(response.goal) },\n });\n }\n }\n\n async clearGoal(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.clearGoalForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async clearGoalForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n await this.client.request('thread/goal/clear', { threadId });\n const changed = runtime.goal !== null;\n this.host.patchRuntime(threadId, { goal: null });\n if (changed) {\n this.host.emitEvent('action', {\n type: 'conversation.goalChanged', conversationId: threadId, payload: { goal: null },\n });\n }\n }\n}\n","import { normalizePromptContent } from '@codex-app-sdk/core/surface';\nimport type { CodexAppServerClient } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport { codexTurnToSurfaceMessages } from './codex-conversation-history';\nimport {\n messageTurnIdOrNull,\n surfaceMessageAttachments,\n surfaceMessageText,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport { surfaceTurn, timestampToIso, upsertSurfaceTurn } from './codex-surface-events';\nimport { errorMessage, normalizeReviewTarget } from './codex-surface-prompts';\nimport { ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nconst UNCOMMITTED_REVIEW_PROMPT = 'Review the current code changes (staged, unstaged, and untracked files) and provide prioritized findings.';\n\nexport type CodexSurfaceTurnActionsHost = {\n createConversation(): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action'): void;\n emitEvent(origin: 'action', input: SurfaceEventInput): void;\n emitHistoryReplaced(threadId: string, reason: 'rollback', origin: 'action'): void;\n emitSummaryUpserted(summary: CodexConversationSummary, reason: 'updated', origin: 'action'): void;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n loadTurnHistory?(threadId: string, turnId: string): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n hydrateCompleteHistory(threadId: string, options?: { initialPageLoaded?: boolean; cursor?: string | null }): Promise<void>;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(threadId: string, status: CodexConversationSummary['status'], origin: 'action'): void;\n patchConversationTurnCount(threadId: string, turnCount: number, origin: 'action'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n sendMessageToThread(threadId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void>;\n};\n\nexport class CodexSurfaceTurnActionsController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceTurnActionsHost,\n ) {}\n\n async compact(): Promise<CodexSurfaceSnapshot> {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.compactForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async compactForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('Cannot compact while Codex is responding');\n await this.client.request('thread/compact/start', { threadId });\n }\n\n async startReview(options: StartCodexReviewOptions = {}): Promise<CodexSurfaceSnapshot> {\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.startReviewForThread(threadId, options);\n return this.host.getSnapshot();\n }\n\n async startReviewForThread(\n threadId: string,\n options: StartCodexReviewOptions = {},\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('The conversation is already responding');\n this.host.patchRuntime(threadId, { busy: true, turnStartPending: true, error: null });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n try {\n const target = normalizeReviewTarget(options.target ?? { type: 'uncommittedChanges' });\n const response = await this.client.request('review/start', {\n threadId,\n target,\n delivery: 'inline',\n });\n if (response.reviewThreadId !== threadId) {\n throw new Error(\n `Codex review/start returned unexpected review thread '${response.reviewThreadId}' for inline review on thread '${threadId}'`,\n );\n }\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!runtime.turnIds.includes(response.turn.id)) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const responseMessages = codexTurnToSurfaceMessages(threadId, response.turn)\n .filter((message) => !runtime.messages.some((candidate) => candidate.id === message.id))\n .map((message) => message.role === 'user'\n ? {\n ...message,\n parts: target.type === 'uncommittedChanges'\n ? message.parts.map((part) => part.type === 'text' && part.text === 'current changes'\n ? { ...part, text: UNCOMMITTED_REVIEW_PROMPT }\n : part)\n : message.parts,\n metadata: { ...message.metadata, reviewPrompt: true },\n }\n : message);\n const messages = insertTurnMessages(runtime.messages, response.turn.id, responseMessages);\n this.host.patchRuntime(threadId, {\n busy: runtime.activeTurnId !== null,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: runtime.activeTurnId\n ? ensureAssistantTurnMessage(messages, threadId, response.turn.id)\n : messages,\n });\n for (const message of responseMessages) {\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId, turnId: response.turn.id,\n payload: { message: structuredClone(message) },\n });\n }\n this.host.patchConversationStatus(threadId, runtime.activeTurnId ? 'active' : 'idle', 'action');\n if (runtime.activeTurnId && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, { busy: false, turnStartPending: false, error: errorMessage(error) });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async interrupt(): Promise<CodexSurfaceSnapshot> {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) return this.host.getSnapshot();\n await this.interruptThread(threadId);\n return this.host.getSnapshot();\n }\n\n async interruptThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (!runtime.activeTurnId) return;\n await this.client.request('turn/interrupt', { threadId, turnId: runtime.activeTurnId });\n }\n\n async deleteTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.deleteTurnForThread(threadId, turnId);\n return this.host.getSnapshot();\n }\n\n async deleteTurnForThread(threadId: string, turnId: string): Promise<void> {\n await this.rollbackToTurn(threadId, turnId);\n }\n\n async editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.editTurnForThread(threadId, turnId, content, options);\n return this.host.getSnapshot();\n }\n\n async editTurnForThread(threadId: string, turnId: string, content: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.turns.find(turn => turn.id === turnId)?.itemsView === 'summary') await this.host.loadTurnHistory?.(threadId, turnId);\n const message = runtime.messages.find((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && messageTurnIdOrNull(candidate) === turnId\n ));\n if (!message) throw new Error(`Could not find the user prompt for Codex turn '${turnId}'`);\n const text = content.trim();\n if (!text) throw new Error('Cannot replace a turn prompt with empty content');\n const attachments = surfaceMessageAttachments(message);\n await this.rollbackToTurn(threadId, turnId);\n await this.host.sendMessageToThread(threadId, text, { ...options, ...(attachments.length > 0 ? { attachments } : {}) });\n }\n\n async retryTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.retryTurnForThread(threadId, turnId);\n return this.host.getSnapshot();\n }\n\n async retryTurnForThread(threadId: string, turnId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.turns.find(turn => turn.id === turnId)?.itemsView === 'summary') await this.host.loadTurnHistory?.(threadId, turnId);\n const prompt = runtime.messages.find((candidate) => (\n candidate.role === 'user'\n && candidate.kind !== 'steer'\n && messageTurnIdOrNull(candidate) === turnId\n ));\n if (!prompt) throw new Error('Could not find the user prompt for this turn');\n const text = surfaceMessageText(prompt);\n if (!text) throw new Error('Could not find the user prompt for this turn');\n const attachments = surfaceMessageAttachments(prompt);\n await this.rollbackToTurn(threadId, turnId);\n await this.host.sendMessageToThread(threadId, text, {\n ...(prompt.metadata?.promptContent ? { content: normalizePromptContent(prompt.metadata.promptContent) } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n });\n }\n\n async rollbackToTurn(threadId: string, turnId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy) throw new Error('Cannot roll back while Codex is responding');\n if (runtime.historyMode !== 'paginated') {\n throw new Error('Legacy conversation history does not support deleting, editing, or retrying turns with app-server 0.164.0. Start a new conversation to use these actions.');\n }\n let targetIndex = runtime.turnIds.indexOf(turnId);\n if (targetIndex < 0) {\n await this.host.hydrateCompleteHistory(threadId);\n targetIndex = runtime.turnIds.indexOf(turnId);\n }\n if (targetIndex < 0) throw new Error(`Cannot roll back to unknown Codex turn '${turnId}'`);\n await this.revertPaginatedThread(threadId, turnId, targetIndex, runtime);\n }\n\n private async revertPaginatedThread(\n threadId: string,\n turnId: string,\n targetIndex: number,\n runtime: ThreadRuntimeState,\n ): Promise<void> {\n const response = await this.client.request('thread/revert', {\n threadId,\n beforeTurnId: turnId,\n });\n if (response.thread.id !== threadId) {\n throw new Error(`Codex thread/revert returned '${response.thread.id}' for requested thread '${threadId}'`);\n }\n const retainedTurnIds = runtime.turnIds.slice(0, targetIndex);\n const retainedTurnIdSet = new Set(retainedTurnIds);\n const messages = runtime.messages.filter((message) => {\n const messageTurnId = messageTurnIdOrNull(message);\n return messageTurnId === null || retainedTurnIdSet.has(messageTurnId);\n });\n runtime.turnIds = retainedTurnIds;\n runtime.turns = runtime.turns.filter((turn) => retainedTurnIdSet.has(turn.id));\n runtime.activeTurnId = null;\n const summary = { ...threadToSummary(response.thread), turnCount: retainedTurnIds.length };\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.patchRuntime(threadId, {\n messages,\n answeredClientRequestIds: [],\n busy: false,\n turnStartPending: false,\n error: null,\n contextUsage: null,\n turnGitDiff: null,\n historyCursor: response.turnsBackwardsCursor,\n historyHasOlder: response.turnsBackwardsCursor !== null,\n fullHistoryHydrated: response.turnsBackwardsCursor === null,\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n this.host.emitHistoryReplaced(threadId, 'rollback', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n }\n\n private requiredActiveConversation(): string {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n return threadId;\n }\n}\n\nfunction insertTurnMessages(\n current: readonly SurfaceMessage[],\n turnId: string,\n incoming: readonly SurfaceMessage[],\n): SurfaceMessage[] {\n const firstTurnMessageIndex = current.findIndex((message) => message.turnId === turnId);\n if (firstTurnMessageIndex < 0) return [...current, ...incoming];\n return [\n ...current.slice(0, firstTurnMessageIndex),\n ...incoming,\n ...current.slice(firstTurnMessageIndex),\n ];\n}\n","import { promptContentDispatchText, promptContentText } from '@codex-app-sdk/core/surface';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEventOrigin,\n CodexSurfaceSkillInput,\n CodexSurfaceSnapshot,\n SendCodexMessageOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n UpdateCodexConversationSettings,\n} from '@codex-app-sdk/core/surface';\nimport {\n attachmentInput,\n surfaceAttachmentPart,\n validateAttachments,\n validatedSendOptions,\n} from './codex-surface-data';\nimport type { SurfaceEventInput } from './codex-surface-events';\nimport {\n createMessageId,\n createQueuedPromptId,\n surfaceTurn,\n timestampToIso,\n upsertSurfaceTurn,\n} from './codex-surface-events';\nimport {\n ensureAssistantTurnMessage,\n pruneEmptyAssistantPlaceholders,\n} from './codex-surface-message-state';\nimport {\n errorMessage,\n mergeSkillInputs,\n parseGoalSlashCommand,\n parsePlanSlashCommand,\n parseReviewSlashCommand,\n authoredPromptContent,\n promptSkillInputsFromContent,\n promptMentionInputs,\n validateSkillInputs,\n} from './codex-surface-prompts';\nimport { turnSettings } from './codex-surface-settings';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\n\nexport type CodexSurfaceMessagesHost = {\n clearGoalForThread(threadId: string): Promise<void>;\n compactForThread(threadId: string): Promise<void>;\n createConversation(): Promise<void>;\n emitConversationActivity(threadId: string, origin: 'action'): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n ensureConnected(): Promise<void>;\n ensureThreadReady(threadId: string): Promise<ThreadRuntimeState>;\n loadSkillsForThread(threadId: string): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: 'action',\n ): void;\n patchConversationTurnCount(threadId: string, turnCount: number, origin: 'action'): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n setGoal(objective: string): Promise<CodexSurfaceSnapshot>;\n setGoalForThread(threadId: string, objective: string): Promise<void>;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n startReview(options: StartCodexReviewOptions): Promise<CodexSurfaceSnapshot>;\n startReviewForThread(threadId: string, options: StartCodexReviewOptions): Promise<void>;\n updateSettings(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot>;\n updateSettingsForThread(threadId: string, settings: UpdateCodexConversationSettings): Promise<void>;\n};\n\nexport class CodexSurfaceMessagesController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly host: CodexSurfaceMessagesHost,\n ) {}\n\n async send(prompt: string, options: SendCodexMessageOptions = {}): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n let text = prompt.trim();\n if (!text) throw new Error('Cannot send an empty message');\n if (!this.host.getState().activeConversationId) {\n const planCommand = parsePlanSlashCommand(text);\n if (planCommand) {\n await this.host.createConversation();\n await this.host.updateSettings({ planMode: true });\n if (!planCommand.prompt) return this.host.getSnapshot();\n text = planCommand.prompt;\n options = { ...options, planMode: true };\n }\n const goalCommand = parseGoalSlashCommand(text);\n if (goalCommand) {\n if (goalCommand.action === 'clear' || goalCommand.action === 'show' || goalCommand.action === 'edit') {\n return this.host.getSnapshot();\n }\n if (goalCommand.action === 'set') return this.host.setGoal(goalCommand.objective);\n throw new Error('Pausing and resuming goals is not supported by Codex app-server');\n }\n if (text === '/compact') return this.host.getSnapshot();\n const reviewCommand = parseReviewSlashCommand(text);\n if (reviewCommand) {\n await this.host.createConversation();\n return this.host.startReview({ target: reviewCommand });\n }\n if (!this.host.getState().activeConversationId) await this.host.createConversation();\n }\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('Codex did not create a conversation');\n await this.sendToThread(threadId, text, options);\n return this.host.getSnapshot();\n }\n\n async sendToThread(\n threadId: string,\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n let text = prompt.trim();\n if (!text) throw new Error('Cannot send an empty message');\n const planCommand = parsePlanSlashCommand(text);\n if (planCommand) {\n await this.host.updateSettingsForThread(threadId, { planMode: true });\n if (!planCommand.prompt) return;\n text = planCommand.prompt;\n options = { ...options, planMode: true };\n }\n const goalCommand = parseGoalSlashCommand(text);\n if (goalCommand) {\n if (goalCommand.action === 'clear') return this.host.clearGoalForThread(threadId);\n if (goalCommand.action === 'set') return this.host.setGoalForThread(threadId, goalCommand.objective);\n if (goalCommand.action === 'unsupported') {\n throw new Error('Pausing and resuming goals is not supported by Codex app-server');\n }\n return;\n }\n if (text === '/compact') return this.host.compactForThread(threadId);\n const reviewCommand = parseReviewSlashCommand(text);\n if (reviewCommand) return this.host.startReviewForThread(threadId, { target: reviewCommand });\n options = {\n ...validatedSendOptions(this.host.snapshotForRuntime(runtime), options),\n ...(options.skills ? { skills: await this.validatedSkills(runtime, options.skills) } : {}),\n };\n await this.sendPromptToThread(threadId, text, options);\n }\n\n async continueInterruptedTurn(): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n await this.continueInterruptedTurnForThread(threadId);\n return this.host.getSnapshot();\n }\n\n async continueInterruptedTurnForThread(threadId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.busy || runtime.turnStartPending || runtime.activeTurnId) {\n throw new Error('Cannot continue while a turn is active');\n }\n const latestTurnId = runtime.turnIds.at(-1);\n const latestTurn = latestTurnId\n ? runtime.turns.find((turn) => turn.id === latestTurnId)\n : undefined;\n if (latestTurn?.status !== 'interrupted') {\n throw new Error('The latest turn is not interrupted');\n }\n\n this.host.patchRuntime(threadId, { busy: true, turnStartPending: true, error: null });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n\n try {\n const response = await this.client.request('turn/start', {\n threadId,\n input: [],\n ...turnSettings(this.host.snapshotForRuntime(runtime), {}),\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!wasKnownTurn) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const busy = response.turn.status === 'inProgress';\n this.host.patchRuntime(threadId, {\n busy,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: busy\n ? ensureAssistantTurnMessage(runtime.messages, threadId, response.turn.id)\n : runtime.messages,\n });\n this.host.patchConversationStatus(threadId, busy ? 'active' : 'idle', 'action');\n if (busy && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, {\n busy: false, turnStartPending: false, error: errorMessage(error),\n });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async sendPromptToThread(\n threadId: string,\n text: string,\n options: SendCodexMessageOptions = {},\n displayText?: string,\n ): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n const normalizedOptions = validatedSendOptions(this.host.snapshotForRuntime(runtime), options);\n const content = authoredPromptContent(normalizedOptions.content);\n if (content) normalizedOptions.content = content;\n const visibleText = content ? promptContentText(content) : displayText?.trim() || text;\n const skillInputs = await this.validatedSkills(runtime, mergeSkillInputs(promptSkillInputsFromContent(content), normalizedOptions.skills ?? []));\n const attachments = validateAttachments(normalizedOptions.attachments ?? []);\n if (runtime.busy) {\n this.host.patchRuntime(threadId, {\n queuedPrompts: [\n ...runtime.queuedPrompts,\n {\n id: createQueuedPromptId(),\n text: visibleText,\n ...(Object.keys(normalizedOptions).length > 0 ? { options: normalizedOptions } : {}),\n },\n ],\n });\n this.emitQueuedPrompts(threadId);\n return;\n }\n\n const messageId = createMessageId();\n const optimisticMessage: SurfaceMessage = {\n id: messageId,\n role: 'user',\n status: 'complete',\n parts: [{ type: 'text', text: visibleText }, ...attachments.map(surfaceAttachmentPart)],\n createdAt: new Date().toISOString(),\n metadata: {\n conversationId: threadId,\n ...(content ? { promptContent: content } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n },\n };\n this.host.patchRuntime(threadId, {\n busy: true, turnStartPending: true, error: null,\n messages: [...runtime.messages, optimisticMessage],\n });\n this.host.patchConversationStatus(threadId, 'active', 'action');\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId,\n payload: { message: structuredClone(optimisticMessage) },\n });\n this.host.emitConversationActivity(threadId, 'action');\n\n try {\n const response = await this.client.request('turn/start', {\n threadId,\n clientUserMessageId: messageId,\n input: [\n { type: 'text', text: promptContentDispatchText(content ?? [], text), text_elements: [] },\n ...attachments.map(attachmentInput),\n ...promptMentionInputs(content),\n ...skillInputs.map((skill) => ({ type: 'skill' as const, name: skill.name, path: skill.path })),\n ],\n ...turnSettings(this.host.snapshotForRuntime(runtime), normalizedOptions),\n ...(normalizedOptions.outputSchema === undefined\n ? {}\n : { outputSchema: normalizedOptions.outputSchema as v2.TurnStartParams['outputSchema'] }),\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turn.id);\n runtime.activeTurnId = response.turn.status === 'inProgress' ? response.turn.id : null;\n if (!runtime.turnIds.includes(response.turn.id)) runtime.turnIds.push(response.turn.id);\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const busy = response.turn.status === 'inProgress';\n const messages = runtime.messages.map((message) => message.id === messageId\n ? { ...message, turnId: response.turn.id, metadata: { ...message.metadata, turnId: response.turn.id } }\n : message);\n this.host.patchRuntime(threadId, {\n busy,\n turnStartPending: false,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(response.turn)),\n messages: busy ? ensureAssistantTurnMessage(messages, threadId, response.turn.id) : messages,\n });\n this.host.patchConversationStatus(threadId, busy ? 'active' : 'idle', 'action');\n const startedMessage = messages.find((message) => message.id === messageId);\n if (startedMessage) {\n this.host.emitEvent('action', {\n type: 'message.updated', conversationId: threadId, turnId: response.turn.id,\n payload: { message: structuredClone(startedMessage) },\n });\n }\n if (busy && !wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turn.id,\n payload: { startedAt: timestampToIso(response.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(threadId, 'action');\n } catch (error) {\n this.host.patchRuntime(threadId, {\n busy: false, turnStartPending: false, error: errorMessage(error),\n });\n this.host.patchConversationStatus(threadId, 'error', 'action');\n this.host.emitConversationActivity(threadId, 'action');\n throw error;\n }\n }\n\n async steer(\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.steerForThread(threadId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async steerForThread(\n threadId: string,\n prompt: string,\n options: SendCodexMessageOptions = {},\n displayText?: string,\n ): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const text = prompt.trim();\n const content = authoredPromptContent(options.content);\n const skillInputs = await this.validatedSkills(runtime, mergeSkillInputs(promptSkillInputsFromContent(content), options.skills ?? []));\n const visibleText = content ? promptContentText(content) : displayText?.trim() || text;\n if (!text) throw new Error('Cannot steer with an empty message');\n if (!runtime.activeTurnId) throw new Error('There is no active turn to steer');\n const attachments = validateAttachments(options.attachments ?? []);\n const messageId = createMessageId();\n const optimisticSteer: SurfaceMessage = {\n id: messageId, kind: 'steer', role: 'user', status: 'complete',\n parts: [{ type: 'text', text: visibleText }, ...attachments.map(surfaceAttachmentPart)],\n createdAt: new Date().toISOString(),\n turnId: runtime.activeTurnId,\n metadata: {\n conversationId: threadId,\n turnId: runtime.activeTurnId,\n ...(content ? { promptContent: content } : {}),\n ...(attachments.length > 0 ? { attachments } : {}),\n },\n };\n this.host.patchRuntime(threadId, {\n error: null,\n messages: ensureAssistantTurnMessage(\n [...runtime.messages, optimisticSteer], threadId, runtime.activeTurnId, { forceSegment: true },\n ),\n });\n this.host.emitEvent('action', {\n type: 'message.appended', conversationId: threadId, turnId: runtime.activeTurnId,\n payload: { message: structuredClone(optimisticSteer) },\n });\n try {\n const response = await this.client.request('turn/steer', {\n threadId,\n expectedTurnId: runtime.activeTurnId,\n clientUserMessageId: messageId,\n input: [\n { type: 'text', text: promptContentDispatchText(content ?? [], text), text_elements: [] },\n ...attachments.map(attachmentInput),\n ...promptMentionInputs(content),\n ...skillInputs.map(skill => ({ type: 'skill' as const, name: skill.name, path: skill.path })),\n ],\n });\n const wasKnownTurn = runtime.turnIds.includes(response.turnId);\n runtime.activeTurnId = response.turnId;\n if (!runtime.turnIds.includes(response.turnId)) runtime.turnIds.push(response.turnId);\n runtime.turns = upsertSurfaceTurn(runtime.turns, {\n id: response.turnId,\n status: 'inProgress',\n error: null,\n willRetry: false,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n });\n this.host.patchConversationTurnCount(threadId, runtime.turnIds.length, 'action');\n const steeredMessages = runtime.messages.map((message) => message.id === messageId\n ? { ...message, turnId: response.turnId, metadata: { ...message.metadata, turnId: response.turnId } }\n : message);\n this.host.patchRuntime(threadId, {\n messages: pruneEmptyAssistantPlaceholders(\n ensureAssistantTurnMessage(steeredMessages, threadId, response.turnId),\n threadId,\n ),\n });\n if (!wasKnownTurn) {\n this.host.emitEvent('action', {\n type: 'turn.started', conversationId: threadId, turnId: response.turnId,\n payload: { startedAt: new Date().toISOString() },\n });\n }\n } catch (error) {\n this.host.patchRuntime(threadId, { error: errorMessage(error) });\n throw error;\n }\n }\n\n async answerAsyncQuestion(threadId: string, prompt: string, displayText: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n if (runtime.activeTurnId) {\n await this.steerForThread(threadId, prompt, {}, displayText);\n return;\n }\n await this.sendPromptToThread(threadId, prompt, {}, displayText);\n }\n\n async deleteQueuedPrompt(promptId: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.deleteQueuedPromptForThread(threadId, promptId);\n return this.host.getSnapshot();\n }\n\n async deleteQueuedPromptForThread(threadId: string, promptId: string): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const queuedPrompts = runtime.queuedPrompts.filter((prompt) => prompt.id !== promptId);\n if (queuedPrompts.length === runtime.queuedPrompts.length) {\n throw new Error(`Unknown queued prompt '${promptId}'`);\n }\n this.host.patchRuntime(runtime.threadId, { queuedPrompts });\n this.emitQueuedPrompts(runtime.threadId);\n }\n\n async updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.updateQueuedPromptForThread(threadId, promptId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async updateQueuedPromptForThread(threadId: string, promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const text = prompt.trim();\n if (!text) throw new Error('Cannot update a queued prompt with empty content');\n const content = authoredPromptContent(options?.content);\n if (runtime.queuedPrompts.some(candidate => candidate.id === promptId)) {\n await this.validatedSkills(runtime, promptSkillInputsFromContent(content));\n }\n let found = false;\n const queuedPrompts = runtime.queuedPrompts.map((candidate) => {\n if (candidate.id !== promptId) return candidate;\n found = true;\n const nextOptions = { ...candidate.options, ...options };\n if (content) nextOptions.content = content;\n else delete nextOptions.content;\n return { ...candidate, text, options: nextOptions };\n });\n if (!found) throw new Error(`Unknown queued prompt '${promptId}'`);\n this.host.patchRuntime(runtime.threadId, { queuedPrompts });\n this.emitQueuedPrompts(runtime.threadId);\n }\n\n async steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n const threadId = this.requiredActiveConversation();\n await this.steerQueuedPromptForThread(threadId, promptId, prompt, options);\n return this.host.getSnapshot();\n }\n\n async steerQueuedPromptForThread(threadId: string, promptId: string, replacement?: string, options?: SendCodexMessageOptions): Promise<void> {\n const runtime = await this.host.ensureThreadReady(threadId);\n const prompt = runtime.queuedPrompts.find((candidate) => candidate.id === promptId);\n if (!prompt) throw new Error(`Unknown queued prompt '${promptId}'`);\n this.host.patchRuntime(runtime.threadId, {\n queuedPrompts: runtime.queuedPrompts.filter((candidate) => candidate.id !== promptId),\n });\n this.emitQueuedPrompts(runtime.threadId);\n const text = replacement ?? prompt.text;\n const sendOptions = replacement === undefined ? prompt.options : { ...prompt.options, ...options, content: options?.content };\n if (runtime.busy) await this.steerForThread(threadId, text, sendOptions);\n else await this.sendToThread(threadId, text, sendOptions);\n }\n\n async sendNextQueuedPrompt(threadId: string): Promise<void> {\n const runtime = this.host.requireRuntime(threadId);\n if (runtime.busy || runtime.queuedPrompts.length === 0) return;\n const next = runtime.queuedPrompts[0]!;\n const queuedPrompts = runtime.queuedPrompts.slice(1);\n this.host.patchRuntime(threadId, { queuedPrompts });\n this.emitQueuedPrompts(threadId, 'notification');\n try {\n await this.sendPromptToThread(threadId, next.text, next.options);\n } catch (error) {\n this.host.patchRuntime(threadId, {\n error: errorMessage(error), queuedPrompts: [next, ...runtime.queuedPrompts],\n });\n this.emitQueuedPrompts(threadId, 'notification');\n }\n }\n\n private emitQueuedPrompts(\n threadId: string,\n origin: CodexSurfaceEventOrigin = 'action',\n ): void {\n const queuedPrompts = this.host.requireRuntime(threadId).queuedPrompts;\n this.host.emitEvent(origin, {\n type: 'conversation.queueChanged',\n conversationId: threadId,\n payload: { queuedPrompts: structuredClone(queuedPrompts) },\n });\n }\n\n private requiredActiveConversation(): string {\n const threadId = this.host.getState().activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n return threadId;\n }\n\n private async validatedSkills(runtime: ThreadRuntimeState, inputs: readonly CodexSurfaceSkillInput[]): Promise<CodexSurfaceSkillInput[]> {\n if (inputs.length > 0 && runtime.skillCatalogStatus !== 'loaded') await this.host.loadSkillsForThread(runtime.threadId);\n return validateSkillInputs(inputs, runtime.skills);\n }\n}\n","import { readTurnItems } from './codex-surface-conversations-controller';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationHistory,\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n CreateCodexConversationOptions,\n} from '@codex-app-sdk/core/surface';\nimport {\n codexTurnToSurfaceMessages,\n preserveHistoricalMessagePresentation,\n} from './codex-conversation-history';\nimport type {\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexSurfaceOptions,\n} from './codex-surface-contracts';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceConversationSettingsController } from './codex-surface-conversation-settings-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport {\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { activeTurnId, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { surfaceTurn } from './codex-surface-events';\nimport { normalizeMcpServers } from './codex-surface-mcp';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport {\n collaborationMode,\n defaultReasoningEffort,\n validateServiceTier,\n requireCatalogModel,\n selectedModel,\n sessionSelection,\n validateReasoningEffort,\n} from './codex-surface-settings';\n\nconst CONVERSATION_HISTORY_PAGE_SIZE = 5;\n\ntype HistoryReason = Extract<\n CodexSurfaceEvent,\n { type: 'conversation.historyReplaced' }\n>['payload']['reason'];\n\nexport interface CodexSurfaceLifecycleHost {\n activateRuntime(runtime: ThreadRuntimeState): void;\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitHistoryReplaced(threadId: string, reason: HistoryReason, origin: CodexSurfaceEventOrigin): void;\n emitSelected(conversationId: string): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: 'created' | 'resumed' | 'updated',\n origin: CodexSurfaceEventOrigin,\n ): void;\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n observeEmptyConversation(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n runtimeProjection(runtime: ThreadRuntimeState): Partial<CodexSurfaceSnapshot>;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n}\n\nexport class CodexSurfaceLifecycleController {\n private readonly hydrationPromises = new Map<string, Promise<void>>();\n private readonly hostOptionsByThread = new Map<string, CodexConversationLoadOptions>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly options: Pick<CodexSurfaceOptions, 'conversationDefaults' | 'cwd' | 'loadingStrategy' | 'historyItemsView'>,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly extensions: CodexSurfaceExtensionsController,\n private readonly settings: CodexSurfaceConversationSettingsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly host: CodexSurfaceLifecycleHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n hostOptions(threadId: string): CodexConversationLoadOptions | undefined {\n return this.hostOptionsByThread.get(threadId);\n }\n\n rememberHostOptions(threadId: string, options: CodexConversationLoadOptions): void {\n this.hostOptionsByThread.set(threadId, options);\n }\n\n forget(threadId: string): void {\n this.hostOptionsByThread.delete(threadId);\n this.hydrationPromises.delete(threadId);\n }\n\n clear(): void {\n this.hostOptionsByThread.clear();\n this.hydrationPromises.clear();\n }\n\n resetHydrations(): void {\n this.hydrationPromises.clear();\n }\n\n async create(\n options: CreateCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n options = { ...this.options.conversationDefaults, ...options };\n const cwd = options.cwd ?? this.options.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd);\n if (options.approvalPreset && !catalogs.approvalPresets.includes(options.approvalPreset)) {\n throw new Error(`Approval preset '${options.approvalPreset}' is not available`);\n }\n const state = this.host.getState();\n const inheritedApprovalPreset = options.approvalPreset\n ?? (options.approvalMode === undefined\n && options.permissionMode === undefined\n && state.approvalPreset\n && catalogs.approvalPresets.includes(state.approvalPreset)\n ? state.approvalPreset\n : undefined);\n const settings = this.settings.threadStartSettings({\n ...options,\n ...(inheritedApprovalPreset ? { approvalPreset: inheritedApprovalPreset } : {}),\n }, catalogs.approvalPresets);\n const currentModel = selectedModel(state.models, state.selectedModelId);\n const requestedModel = options.model ? requireCatalogModel(state.models, options.model) : currentModel;\n const model = requestedModel?.model;\n const requestedReasoningEffort = options.reasoningEffort\n ?? (requestedModel?.id === currentModel?.id\n ? state.selectedReasoningEffort\n : requestedModel ? defaultReasoningEffort(requestedModel) : null)\n ?? undefined;\n const requestedServiceTier = options.serviceTier !== undefined\n ? options.serviceTier\n : requestedModel?.id === currentModel?.id\n ? (state.selectedServiceTier ?? null)\n : requestedModel?.defaultServiceTier ?? null;\n validateReasoningEffort(requestedModel, requestedReasoningEffort);\n validateServiceTier(requestedModel, requestedServiceTier);\n const mcpServers = hostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(hostOptions.mcpServers);\n const extension = await this.extensions.conversationExtension({\n operation: 'start',\n conversationId: null,\n cwd,\n createOptions: options,\n extensionContext: hostOptions.extensionContext,\n }, options, mcpServers);\n const response = await this.client.request('thread/start', {\n ...(cwd ? { cwd } : {}),\n ...(model ? { model } : {}),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadStartParams['config'] }),\n ...(this.extensions.hasDynamicTools() ? { dynamicTools: this.extensions.dynamicToolSpecs() } : {}),\n ...settings,\n ...(requestedServiceTier === undefined ? {} : { serviceTier: requestedServiceTier }),\n ...(options.threadSource === undefined ? {} : { threadSource: options.threadSource }),\n serviceName: 'codex_app_sdk',\n });\n this.host.observeEmptyConversation(response.thread.id);\n const selection = sessionSelection(response, state.models, state);\n if (requestedReasoningEffort) {\n await this.client.request('thread/settings/update', {\n threadId: response.thread.id,\n effort: requestedReasoningEffort,\n ...(requestedModel ? {\n collaborationMode: collaborationMode(state.planMode, requestedModel.model, requestedReasoningEffort),\n } : {}),\n });\n selection.selectedReasoningEffort = requestedReasoningEffort;\n }\n if (requestedServiceTier !== undefined) selection.selectedServiceTier = requestedServiceTier;\n if (requestedModel) selection.selectedModelId = requestedModel.id;\n if (inheritedApprovalPreset) selection.approvalPreset = inheritedApprovalPreset;\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n ...(this.options.historyItemsView ? { historyItemsView: this.options.historyItemsView } : {}),\n historyMode: response.thread.historyMode ?? 'legacy',\n cwd: response.cwd ?? response.thread.cwd,\n activeTurnId: null,\n turnIds: [],\n messages: [],\n answeredClientRequestIds: [],\n threadStatus: surfaceThreadStatus(response.thread.status),\n ...catalogs,\n ...selection,\n });\n this.hostOptionsByThread.set(response.thread.id, {\n ...(cwd ? { cwd } : {}),\n ...hostOptions,\n mcpServers,\n });\n const summary = threadToSummary(response.thread);\n this.host.patch({\n activeConversationId: response.thread.id,\n conversations: upsertConversation(state.conversations, summary),\n ...this.host.runtimeProjection(runtime),\n });\n this.host.emitSummaryUpserted(summary, 'created', 'action');\n this.host.emitSelected(response.thread.id);\n this.emitConversationState(response.thread.id);\n return this.host.getSnapshot();\n }\n\n async select(conversationId: string): Promise<CodexSurfaceSnapshot> {\n await this.host.ensureConnected();\n const runtime = this.host.runtime(conversationId);\n if (runtime?.hydrated && (runtime.busy || runtime.activeTurnId !== null)) {\n this.host.activateRuntime(runtime);\n return this.host.getSnapshot();\n }\n return this.resume(conversationId);\n }\n\n resumeDuringBootstrap(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.resume(conversationId);\n }\n\n async ensureReady(\n threadId: string,\n loadOptions: CodexConversationLoadOptions = {},\n ): Promise<ThreadRuntimeState> {\n await this.host.ensureConnected();\n const runtime = this.host.runtime(threadId);\n if (runtime?.hydrated && Object.keys(loadOptions).every(key => key === 'historyItemsView' || key === 'loadingStrategy')) {\n this.hostOptionsByThread.set(threadId, { ...this.hostOptionsByThread.get(threadId), ...loadOptions });\n this.host.patchRuntime(threadId, {\n ...(loadOptions.historyItemsView ? { historyItemsView: loadOptions.historyItemsView } : {}),\n ...(loadOptions.loadingStrategy ? { loadingStrategy: loadOptions.loadingStrategy } : {}),\n });\n if (loadOptions.historyItemsView === 'full') await this.conversations.loadLoadedTurnHistory(threadId);\n if (loadOptions.loadingStrategy === 'eager' && runtime.historyHasOlder) {\n void this.conversations.hydrateCompleteHistory(threadId).catch(() => undefined);\n }\n return runtime;\n }\n let hydration = this.hydrationPromises.get(threadId);\n if (!hydration) {\n hydration = this.resume(threadId, false, loadOptions, 'load').then(() => undefined);\n this.hydrationPromises.set(threadId, hydration);\n void hydration.finally(() => {\n if (this.hydrationPromises.get(threadId) === hydration) this.hydrationPromises.delete(threadId);\n }).catch(() => undefined);\n }\n await hydration;\n return this.host.requireRuntime(threadId);\n }\n\n async readHistory(conversationId: string): Promise<CodexConversationHistory> {\n await this.host.ensureConnected();\n if (!conversationId) throw new Error('There is no active conversation');\n const existing = await this.ensureReady(conversationId);\n if (existing.busy) { await this.conversations.loadLoadedTurnHistory(conversationId); return this.historySnapshot(conversationId, existing); }\n const loadingRuntime = this.host.createRuntime(conversationId, { historyLoading: true, error: null });\n if (this.host.getState().activeConversationId === conversationId) this.host.activateRuntime(loadingRuntime);\n try {\n const [response] = await Promise.all([\n this.client.request('thread/read', { threadId: conversationId, includeTurns: false }),\n this.conversations.refreshCompleteHistory(conversationId),\n ]);\n if (response.thread.id !== conversationId) {\n throw new Error(`Codex thread/read returned '${response.thread.id}' for requested thread '${conversationId}'`);\n }\n const hydratedRuntime = this.host.requireRuntime(conversationId);\n const runtime = this.host.createRuntime(conversationId, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n historyLoading: false,\n activeTurnId: hydratedRuntime.activeTurnId,\n turns: hydratedRuntime.turns,\n turnIds: hydratedRuntime.turnIds,\n messages: hydratedRuntime.messages,\n loadingStrategy: hydratedRuntime.loadingStrategy,\n historyCursor: null,\n historyHasOlder: false,\n historyLoadingOlder: false,\n fullHistoryHydrated: true,\n busy: Boolean(hydratedRuntime.activeTurnId),\n threadStatus: surfaceThreadStatus(response.thread.status),\n });\n const summary = { ...threadToSummary(response.thread), turnCount: runtime.turnIds.length };\n const state = this.host.getState();\n this.host.patch({\n conversations: upsertConversation(state.conversations, summary),\n ...(state.activeConversationId === conversationId ? this.host.runtimeProjection(runtime) : {}),\n });\n this.host.emitSummaryUpserted(summary, 'updated', 'action');\n this.host.emitHistoryReplaced(conversationId, 'resync', 'action');\n this.host.emitConversationActivity(conversationId, 'action');\n return this.historySnapshot(conversationId, runtime);\n } catch (error) {\n this.host.patchRuntime(conversationId, { historyLoading: false, error: errorMessage(error) });\n throw error;\n }\n }\n\n private async resume(\n conversationId: string,\n activate = true,\n loadOptions: CodexConversationLoadOptions = {},\n historyReason: 'load' | 'resume' = 'resume',\n ): Promise<CodexSurfaceSnapshot> {\n const requestedHostOptions = { ...this.hostOptionsByThread.get(conversationId), ...loadOptions };\n const timingStarted = performance.now();\n let timingPrevious = timingStarted;\n const markTiming = (stage: string) => {\n const now = performance.now();\n if (process.env.CODEX_APP_SDK_TRACE_CONVERSATION_LOAD === '1') console.warn('[conversation-load] ' + JSON.stringify({ layer: 'codex-sdk', stage,\n threadId: conversationId, at: performance.timeOrigin + now, stageMs: now - timingPrevious, elapsedMs: now - timingStarted }));\n timingPrevious = now;\n };\n markTiming('resume.begin');\n const hostOptions = {\n ...requestedHostOptions,\n mcpServers: requestedHostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(requestedHostOptions.mcpServers),\n };\n this.hostOptionsByThread.set(conversationId, hostOptions);\n const extension = await this.extensions.conversationExtension({\n operation: 'resume',\n conversationId,\n cwd: hostOptions.cwd,\n extensionContext: hostOptions.extensionContext,\n }, {}, hostOptions.mcpServers);\n markTiming('extensions.ready');\n const historyItemsView = hostOptions.historyItemsView ?? this.options.historyItemsView ?? 'full';\n const loadingRuntime = this.host.createRuntime(conversationId, { historyLoading: true, error: null });\n const initialTurns = new Map(loadingRuntime.turns.map((turn) => [turn.id, turn]));\n const initialMessages = new Map(loadingRuntime.messages.map((message) => [message.id, message]));\n const initialStatus = loadingRuntime.threadStatus;\n if (activate) this.host.activateRuntime(loadingRuntime);\n try {\n const [response, goal] = await Promise.all([\n this.client.request('thread/resume', {\n threadId: conversationId,\n excludeTurns: true,\n initialTurnsPage: {\n limit: CONVERSATION_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n },\n ...(hostOptions.cwd ? { cwd: hostOptions.cwd } : {}),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadResumeParams['config'] }),\n }),\n this.client.request('thread/goal/get', { threadId: conversationId })\n .then((result) => result.goal)\n .catch(() => null),\n ]);\n markTiming('resume-and-goal.ready');\n if (response.thread.id !== conversationId) {\n throw new Error(`Codex thread/resume returned '${response.thread.id}' for requested thread '${conversationId}'`);\n }\n const initialPage = response.initialTurnsPage ?? await this.client.request('thread/turns/list', {\n threadId: response.thread.id,\n cursor: null,\n limit: CONVERSATION_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n });\n const turns = await Promise.all([...initialPage.data].reverse().map(async turn =>\n turn.status === 'inProgress' && (turn.itemsView === 'summary' || turn.itemsView === 'notLoaded')\n ? { ...turn, items: await readTurnItems(this.client, response.thread.id, turn.id), itemsView: 'full' as const } : turn));\n markTiming('initial-page-and-active-items.ready');\n const cwd = response.cwd ?? response.thread.cwd ?? hostOptions.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd);\n markTiming('permission-catalog.ready');\n const originalProjection = historyItemsView === 'full' ? await this.originalImages?.prepare(response.thread.id, response.thread.path) : undefined;\n markTiming('original-images.ready');\n const changedTurns = loadingRuntime.turns.filter((turn) => initialTurns.get(turn.id) !== turn);\n const threadStatus = loadingRuntime.threadStatus !== initialStatus && loadingRuntime.threadStatus\n ? loadingRuntime.threadStatus\n : surfaceThreadStatus(response.thread.status);\n const restoredTurns = turns.map((turn) => threadStatus.type === 'idle' && turn.status === 'inProgress'\n ? { ...turn, status: 'interrupted' as const }\n : turn);\n const previouslyFull = new Set(loadingRuntime.turns.filter(turn => turn.itemsView !== 'summary').map(turn => turn.id));\n const projectedTurns = new Map(restoredTurns.map((turn) => [turn.id, turn.itemsView === 'summary' && previouslyFull.has(turn.id)\n ? { ...loadingRuntime.turns.find(value => value.id === turn.id)!, ...surfaceTurn(turn), itemsView: 'full' as const } : surfaceTurn(turn)]));\n for (const turn of changedTurns) projectedTurns.set(turn.id, turn);\n const runningTurnId = changedTurns.length > 0\n ? loadingRuntime.activeTurnId\n : threadStatus.type === 'active' ? activeTurnId(turns) : null;\n const historyMessages = preserveHistoricalMessagePresentation(\n loadingRuntime.messages,\n restoredTurns.flatMap(turn => turn.itemsView === 'summary' && previouslyFull.has(turn.id)\n ? loadingRuntime.messages.filter(message => message.turnId === turn.id) : codexTurnToSurfaceMessages(response.thread.id, turn)),\n );\n // Notifications received while hydration awaited RPC/catalog data are newer\n // than that response. Never replace them with the stale transcript page.\n const mergedMessages = new Map(historyMessages.map((message) => [message.id, message]));\n for (const message of loadingRuntime.messages) {\n if (initialMessages.get(message.id) !== message) mergedMessages.set(message.id, message);\n }\n let messages = runningTurnId\n ? ensureAssistantTurnMessage([...mergedMessages.values()], response.thread.id, runningTurnId)\n : [...mergedMessages.values()];\n if (originalProjection) messages = originalProjection(messages);\n markTiming('messages.projected');\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n loadingStrategy: hostOptions.loadingStrategy ?? this.options.loadingStrategy ?? 'lazy',\n historyItemsView,\n historyCursor: initialPage.nextCursor,\n historyHasOlder: initialPage.nextCursor !== null,\n historyLoadingOlder: false,\n fullHistoryHydrated: initialPage.nextCursor === null,\n cwd: cwd ?? null,\n historyLoading: false,\n activeTurnId: runningTurnId,\n turns: [...projectedTurns.values()],\n turnIds: [...projectedTurns.keys()],\n messages,\n busy: changedTurns.length > 0 ? loadingRuntime.busy : Boolean(runningTurnId) || threadStatus.type === 'active',\n goal: goal ? { ...goal } : null,\n threadStatus,\n ...catalogs,\n ...sessionSelection(response, this.host.getState().models, this.host.snapshotForRuntime(loadingRuntime)),\n });\n const summary = { ...threadToSummary(response.thread), turnCount: turns.length };\n markTiming('runtime.created');\n const state = this.host.getState();\n this.host.patch({\n conversations: upsertConversation(state.conversations, summary),\n ...(state.activeConversationId === response.thread.id ? this.host.runtimeProjection(runtime) : {}),\n });\n this.host.emitSummaryUpserted(summary, 'resumed', 'action');\n this.host.emitHistoryReplaced(response.thread.id, historyReason, 'action');\n this.emitConversationState(response.thread.id);\n markTiming('events.published');\n if (historyItemsView === 'summary') this.conversations.hydrateOriginalImages(response.thread.id, response.thread.path);\n if (runtime.loadingStrategy === 'eager' && initialPage.nextCursor !== null) {\n void this.conversations.hydrateCompleteHistory(response.thread.id, {\n cursor: initialPage.nextCursor,\n initialPageLoaded: true,\n }).catch(() => undefined);\n }\n const result = this.host.getSnapshot();\n markTiming('snapshot.cloned');\n return result;\n } catch (error) {\n markTiming('resume.failed');\n this.host.patchRuntime(conversationId, { historyLoading: false, error: errorMessage(error) });\n throw error;\n }\n }\n\n private emitConversationState(threadId: string): void {\n this.host.emitConversationActivity(threadId, 'action');\n this.host.emitConversationSettings(threadId, 'action');\n this.host.emitConversationSkills(threadId, 'action');\n this.host.emitConversationPermissions(threadId, 'action');\n }\n\n private historySnapshot(\n conversationId: string,\n runtime: Pick<ThreadRuntimeState, 'messages' | 'threadStatus'>,\n ): CodexConversationHistory {\n return {\n conversationId,\n messages: structuredClone(runtime.messages),\n threadStatus: structuredClone(runtime.threadStatus),\n };\n }\n}\n","import type { ServerNotification } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceJsonValue,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport {\n commandOutputDeltaToToolPartUpdate,\n fileChangePatchToToolPartUpdate,\n lineDiffFromUnifiedDiff,\n mcpProgressToToolPartUpdate,\n} from './codex-tool-part-adapter';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport {\n conversationStatus,\n mergeSurfaceRateLimits,\n surfaceContextUsage,\n surfaceTokenUsage,\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { appendCompactionMarker, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { realtimeAudioChunk } from './codex-surface-realtime';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { threadSettingsSelection } from './codex-surface-settings';\nimport {\n sameValue,\n surfaceTurn,\n surfaceTurnError,\n timestampToIso,\n upsertSurfaceTurn,\n} from './codex-surface-events';\n\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport interface CodexSurfaceNotificationsHost {\n clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'conversation_closed' | 'conversation_removed' | 'surface_disconnected',\n ): void;\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void;\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void;\n getState(): CodexSurfaceSnapshot;\n markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin?: CodexSurfaceEventOrigin,\n ): void;\n patchConversationTurnCount(threadId: string, turnCount: number): void;\n patchRuntime(threadId: string, patch: ThreadRuntimePatch): void;\n removeThread(threadId: string, reason: 'archived' | 'deleted'): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n runtime(threadId: string): ThreadRuntimeState | undefined;\n runtimes(): Iterable<ThreadRuntimeState>;\n sendNextQueuedPrompt(threadId: string): void;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n unknownNotification(notification: ServerNotification): void;\n}\n\nexport class CodexSurfaceNotificationsController {\n constructor(\n private readonly authentication: CodexSurfaceAuthenticationController,\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly items: CodexSurfaceItemsController,\n private readonly host: CodexSurfaceNotificationsHost,\n ) {}\n\n handle(notification: ServerNotification): void {\n switch (notification.method) {\n case 'thread/started': {\n this.host.createRuntime(notification.params.thread.id, {\n historyMode: notification.params.thread.historyMode ?? 'legacy',\n threadStatus: surfaceThreadStatus(notification.params.thread.status),\n });\n const summary = threadToSummary(notification.params.thread);\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary, 'started', 'notification');\n this.host.emitConversationActivity(notification.params.thread.id, 'notification');\n return;\n }\n case 'thread/status/changed': {\n const { threadId, status } = notification.params;\n const runtime = this.host.requireRuntime(threadId);\n const systemError = status.type === 'systemError';\n // Idle establishes readiness, not the outcome of the previous turn.\n // Keep its last-known record until an authoritative terminal arrives.\n if (systemError || (status.type === 'idle' && !runtime.turnStartPending)) runtime.activeTurnId = null;\n this.host.patchRuntime(threadId, {\n threadStatus: surfaceThreadStatus(status),\n busy: systemError\n ? false\n : runtime.turnStartPending || status.type === 'active' || runtime.activeTurnId !== null,\n ...(systemError\n ? { turnStartPending: false, error: 'Codex app-server reported a system error' }\n : {}),\n });\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, status: conversationStatus(status) }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n this.host.emitConversationActivity(threadId, 'notification');\n if (status.type === 'idle') this.host.sendNextQueuedPrompt(threadId);\n return;\n }\n case 'thread/archived':\n case 'thread/deleted':\n this.host.removeThread(\n notification.params.threadId,\n notification.method === 'thread/archived' ? 'archived' : 'deleted',\n );\n return;\n case 'thread/unarchived':\n void this.conversations.load().catch((error) => {\n this.host.patch({ error: errorMessage(error) });\n });\n return;\n case 'thread/closed': {\n const runtime = this.host.runtime(notification.params.threadId);\n if (runtime) {\n runtime.activeTurnId = null;\n this.host.patchRuntime(notification.params.threadId, {\n busy: false,\n turnStartPending: false,\n threadStatus: { type: 'idle' },\n });\n }\n this.host.clearPendingForThread(notification.params.threadId, 'Codex thread closed', 'conversation_closed');\n this.host.patchConversationStatus(notification.params.threadId, 'idle');\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'skills/changed':\n this.catalog.invalidateSkills();\n return;\n case 'thread/name/updated': {\n const state = this.host.getState();\n const previous = state.conversations.find((conversation) => conversation.id === notification.params.threadId);\n const title = notification.params.threadName?.trim() || previous?.preview || 'Untitled conversation';\n if (previous?.title === title) return;\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === notification.params.threadId\n ? { ...conversation, title }\n : conversation),\n });\n const summary = this.host.getState().conversations.find(\n (conversation) => conversation.id === notification.params.threadId,\n );\n if (summary) this.host.emitSummaryUpserted(summary, 'updated', 'notification');\n return;\n }\n case 'thread/settings/updated': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const state = this.host.getState();\n const next = threadSettingsSelection(\n notification.params.threadSettings,\n state.models,\n this.host.snapshotForRuntime(runtime),\n );\n const changed = runtime.approvalPreset !== next.approvalPreset\n || runtime.selectedModelId !== next.selectedModelId\n || runtime.selectedReasoningEffort !== next.selectedReasoningEffort\n || runtime.selectedServiceTier !== next.selectedServiceTier\n || runtime.planMode !== next.planMode;\n this.host.patchRuntime(notification.params.threadId, next);\n if (changed) this.host.emitConversationSettings(notification.params.threadId, 'notification');\n return;\n }\n case 'thread/goal/updated': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n if (sameValue(runtime.goal, notification.params.goal)) return;\n this.host.patchRuntime(notification.params.threadId, { goal: { ...notification.params.goal } });\n this.host.emitEvent('notification', {\n type: 'conversation.goalChanged',\n conversationId: notification.params.threadId,\n ...(notification.params.turnId ? { turnId: notification.params.turnId } : {}),\n payload: { goal: structuredClone(notification.params.goal) },\n });\n return;\n }\n case 'thread/goal/cleared':\n if (this.host.requireRuntime(notification.params.threadId).goal === null) return;\n this.host.patchRuntime(notification.params.threadId, { goal: null });\n this.host.emitEvent('notification', {\n type: 'conversation.goalChanged',\n conversationId: notification.params.threadId,\n payload: { goal: null },\n });\n return;\n case 'thread/tokenUsage/updated': {\n const contextUsage = surfaceContextUsage(notification.params.tokenUsage);\n this.host.patchRuntime(notification.params.threadId, { contextUsage });\n this.host.emitEvent('notification', {\n type: 'conversation.contextUsageChanged',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { contextUsage: structuredClone(contextUsage) },\n });\n this.host.emitEvent('notification', {\n type: 'conversation.executionUsageChanged',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { usage: {\n last: surfaceTokenUsage(notification.params.tokenUsage.last),\n total: surfaceTokenUsage(notification.params.tokenUsage.total),\n execution: null, model: null, observedStart: false,\n } },\n });\n return;\n }\n case 'model/rerouted':\n this.host.emitEvent('notification', {\n type: 'turn.modelRerouted', conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { fromModel: notification.params.fromModel, toModel: notification.params.toModel, reason: notification.params.reason },\n });\n return;\n case 'turn/started': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const alreadyActive = runtime.activeTurnId === notification.params.turn.id;\n this.host.markRuntimeTurnActive(runtime, notification.params.turn.id);\n this.host.patchConversationTurnCount(notification.params.threadId, runtime.turnIds.length);\n this.host.patchRuntime(notification.params.threadId, {\n busy: true,\n turnStartPending: false,\n error: null,\n turnGitDiff: null,\n turns: upsertSurfaceTurn(runtime.turns, surfaceTurn(notification.params.turn)),\n messages: ensureAssistantTurnMessage(\n runtime.messages,\n notification.params.threadId,\n notification.params.turn.id,\n { createdAt: timestampToIso(notification.params.turn.startedAt) },\n ),\n });\n this.host.patchConversationStatus(notification.params.threadId, 'active');\n if (!alreadyActive) {\n this.host.emitEvent('notification', {\n type: 'turn.started',\n conversationId: notification.params.threadId,\n turnId: notification.params.turn.id,\n payload: { startedAt: timestampToIso(notification.params.turn.startedAt) },\n });\n }\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'item/agentMessage/delta':\n this.items.applyAgentDelta(notification.params);\n return;\n case 'item/plan/delta':\n this.items.applyPlanDelta(notification.params);\n return;\n case 'item/started':\n case 'item/completed':\n this.items.applyItem(notification.params, notification.method === 'item/completed');\n return;\n case 'item/commandExecution/outputDelta':\n if (!this.items.isForwardingCommandOutput(notification.params.threadId, notification.params.itemId)) return;\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n commandOutputDeltaToToolPartUpdate(notification.params.itemId, notification.params.delta),\n );\n return;\n case 'item/fileChange/patchUpdated':\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n fileChangePatchToToolPartUpdate(notification.params.itemId, notification.params.changes),\n );\n return;\n case 'item/mcpToolCall/progress':\n this.items.applyToolUpdate(\n notification.params.threadId,\n notification.params.turnId,\n mcpProgressToToolPartUpdate(notification.params.itemId, notification.params.message),\n );\n return;\n case 'rawResponseItem/completed':\n this.items.applyRawResponseItem(notification.params);\n return;\n case 'turn/plan/updated':\n this.items.applyPlanUpdated(notification.params);\n return;\n case 'serverRequest/resolved': {\n const requestId = String(notification.params.requestId);\n this.clientRequests.handleServerResolved(requestId, notification.params.threadId);\n this.approvals.handleServerResolved(requestId);\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'turn/diff/updated': {\n const counts = lineDiffFromUnifiedDiff(notification.params.diff);\n this.host.patchRuntime(notification.params.threadId, {\n turnGitDiff: {\n turnId: notification.params.turnId,\n addedLines: counts.addedLines,\n removedLines: counts.removedLines,\n diff: notification.params.diff,\n updatedAt: new Date().toISOString(),\n },\n });\n this.host.emitEvent('notification', {\n type: 'conversation.diffUpdated',\n conversationId: notification.params.threadId,\n payload: { diff: structuredClone(this.host.requireRuntime(notification.params.threadId).turnGitDiff) },\n });\n return;\n }\n case 'thread/compacted': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n this.host.patchRuntime(notification.params.threadId, {\n messages: appendCompactionMarker(\n runtime.messages,\n notification.params.threadId,\n notification.params.turnId,\n 'complete',\n ),\n });\n const message = this.host.requireRuntime(notification.params.threadId).messages.find((candidate) => (\n candidate.kind === 'compaction' && candidate.metadata?.turnId === notification.params.turnId\n ))!;\n this.host.emitEvent('notification', {\n type: 'context.compactionCompleted',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: { itemId: null, message: structuredClone(message) },\n });\n return;\n }\n case 'turn/completed':\n this.items.applyTurnCompleted(notification.params);\n return;\n case 'error': {\n const runtime = this.host.requireRuntime(notification.params.threadId);\n const terminalCurrentTurn = !notification.params.willRetry\n && runtime.activeTurnId === notification.params.turnId;\n if (terminalCurrentTurn) runtime.activeTurnId = null;\n this.host.patchRuntime(notification.params.threadId, {\n error: notification.params.error.message,\n turns: upsertSurfaceTurn(runtime.turns, {\n ...(runtime.turns.find((turn) => turn.id === notification.params.turnId) ?? {\n id: notification.params.turnId,\n status: 'inProgress' as const,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n }),\n status: notification.params.willRetry ? 'inProgress' : 'failed',\n error: surfaceTurnError(notification.params.error),\n willRetry: notification.params.willRetry,\n }),\n ...(terminalCurrentTurn ? { busy: false, turnStartPending: false } : {}),\n });\n if (terminalCurrentTurn) this.host.patchConversationStatus(notification.params.threadId, 'error');\n this.host.emitEvent('notification', {\n type: 'turn.error',\n conversationId: notification.params.threadId,\n turnId: notification.params.turnId,\n payload: {\n error: surfaceTurnError(notification.params.error)!,\n willRetry: notification.params.willRetry,\n },\n });\n this.host.emitConversationActivity(notification.params.threadId, 'notification');\n return;\n }\n case 'account/rateLimits/updated': {\n const state = this.host.getState();\n this.host.patch({ rateLimits: mergeSurfaceRateLimits(state.rateLimits, notification.params.rateLimits) });\n this.host.emitEvent('notification', {\n type: 'rateLimits.changed',\n payload: { rateLimits: structuredClone(this.host.getState().rateLimits) },\n });\n return;\n }\n case 'account/updated':\n void this.authentication.refresh('notification').catch((error) => this.host.patch({ error: errorMessage(error) }));\n return;\n case 'account/login/completed':\n this.authentication.handleLoginCompleted(notification.params);\n return;\n case 'thread/realtime/started':\n this.host.emitEvent('notification', {\n type: 'realtime.started',\n conversationId: notification.params.threadId,\n payload: {\n realtimeSessionId: notification.params.realtimeSessionId,\n version: notification.params.version,\n },\n });\n return;\n case 'thread/realtime/itemAdded':\n this.host.emitEvent('notification', {\n type: 'realtime.itemAdded',\n conversationId: notification.params.threadId,\n payload: { item: structuredClone(notification.params.item) as CodexSurfaceJsonValue },\n });\n return;\n case 'thread/realtime/item/started':\n case 'thread/realtime/item/completed':\n this.host.emitEvent('notification', {\n type: notification.method === 'thread/realtime/item/started'\n ? 'realtime.itemStarted' : 'realtime.itemCompleted',\n conversationId: notification.params.threadId,\n payload: { item: structuredClone(notification.params.item) as CodexSurfaceJsonValue },\n });\n return;\n case 'thread/realtime/item/transcript/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.itemTranscriptDelta',\n conversationId: notification.params.threadId,\n payload: { itemId: notification.params.itemId, delta: notification.params.delta },\n });\n return;\n case 'thread/realtime/transcript/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.transcriptDelta',\n conversationId: notification.params.threadId,\n payload: { role: notification.params.role, delta: notification.params.delta },\n });\n return;\n case 'thread/realtime/transcript/done':\n this.host.emitEvent('notification', {\n type: 'realtime.transcriptCompleted',\n conversationId: notification.params.threadId,\n payload: { role: notification.params.role, text: notification.params.text },\n });\n return;\n case 'thread/realtime/outputAudio/delta':\n this.host.emitEvent('notification', {\n type: 'realtime.audioDelta',\n conversationId: notification.params.threadId,\n payload: { audio: realtimeAudioChunk(notification.params.audio) },\n });\n return;\n case 'thread/realtime/sdp':\n this.host.emitEvent('notification', {\n type: 'realtime.sdp',\n conversationId: notification.params.threadId,\n payload: { sdp: notification.params.sdp },\n });\n return;\n case 'thread/realtime/error':\n this.host.emitEvent('notification', {\n type: 'realtime.error',\n conversationId: notification.params.threadId,\n payload: { message: notification.params.message },\n });\n return;\n case 'thread/realtime/closed':\n this.host.emitEvent('notification', {\n type: 'realtime.closed',\n conversationId: notification.params.threadId,\n payload: { reason: notification.params.reason },\n });\n return;\n case 'hook/started':\n case 'hook/completed':\n case 'item/autoApprovalReview/started':\n case 'item/autoApprovalReview/completed':\n case 'command/exec/outputDelta':\n case 'process/outputDelta':\n case 'process/exited':\n case 'item/commandExecution/terminalInteraction':\n case 'item/fileChange/outputDelta':\n case 'mcpServer/oauthLogin/completed':\n case 'mcpServer/startupStatus/updated':\n case 'app/list/updated':\n case 'externalAgentConfig/import/progress':\n case 'externalAgentConfig/import/completed':\n case 'fs/changed':\n case 'item/reasoning/summaryTextDelta':\n case 'item/reasoning/summaryPartAdded':\n case 'item/reasoning/textDelta':\n case 'model/verification':\n case 'turn/moderationMetadata':\n case 'model/safetyBuffering/updated':\n case 'warning':\n case 'guardianWarning':\n case 'deprecationNotice':\n case 'configWarning':\n case 'fuzzyFileSearch/sessionUpdated':\n case 'fuzzyFileSearch/sessionCompleted':\n case 'windows/worldWritableWarning':\n case 'windowsSandbox/setupCompleted':\n return;\n case 'remoteControl/status/changed':\n this.host.emitEvent('notification', {\n type: 'remoteControl.statusChanged',\n payload: {\n status: {\n status: notification.params.status,\n serverName: notification.params.serverName,\n installationId: notification.params.installationId,\n environmentId: notification.params.environmentId,\n },\n },\n });\n return;\n default:\n return this.host.unknownNotification(notification);\n }\n }\n}\n","import type {\n CodexConversationSummary,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n SurfaceMessage,\n} from '@codex-app-sdk/core/surface';\nimport { upsertSurfaceTurn } from './codex-surface-events';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport {\n createThreadRuntime,\n runtimeProjection,\n type ThreadRuntimePatch,\n type ThreadRuntimeState,\n} from './codex-surface-runtime';\n\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport interface CodexSurfaceRuntimeHost {\n emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput): void;\n getState(): CodexSurfaceSnapshot;\n notifyConversationListeners(threadId: string): void;\n patch(patch: Partial<CodexSurfaceSnapshot>, conversationId?: string): void;\n schedulePluginRefresh(): void;\n}\n\nexport class CodexSurfaceRuntimeController {\n private readonly runtimes = new Map<string, ThreadRuntimeState>();\n private readonly semanticEventValues = new Map<string, string>();\n\n constructor(\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly host: CodexSurfaceRuntimeHost,\n ) {}\n\n get(threadId: string): ThreadRuntimeState | undefined {\n return this.runtimes.get(threadId);\n }\n\n values(): IterableIterator<ThreadRuntimeState> {\n return this.runtimes.values();\n }\n\n clear(): void {\n this.runtimes.clear();\n this.semanticEventValues.clear();\n }\n\n forget(threadId: string): void {\n this.runtimes.delete(threadId);\n this.semanticEventValues.delete(`summary:${threadId}`);\n this.semanticEventValues.delete(`activity:${threadId}`);\n this.semanticEventValues.delete(`settings:${threadId}`);\n }\n\n create(threadId: string, patch: ThreadRuntimePatch = {}): ThreadRuntimeState {\n const existing = this.runtimes.get(threadId);\n if (existing) {\n Object.assign(existing, patch);\n return existing;\n }\n const runtime = createThreadRuntime(threadId, this.host.getState(), patch);\n this.runtimes.set(threadId, runtime);\n return runtime;\n }\n\n require(threadId: string): ThreadRuntimeState {\n return this.runtimes.get(threadId) ?? this.create(threadId);\n }\n\n projection(runtime: ThreadRuntimeState): ReturnType<typeof runtimeProjection> {\n return runtimeProjection(\n runtime,\n this.approvals.approvalsForThread(runtime.threadId),\n this.clientRequests.requestsForThread(runtime.threadId),\n );\n }\n\n snapshot(runtime: ThreadRuntimeState): CodexSurfaceSnapshot {\n return { ...this.host.getState(), ...this.projection(runtime) };\n }\n\n activate(runtime: ThreadRuntimeState): void {\n this.host.patch({\n activeConversationId: runtime.threadId,\n ...this.projection(runtime),\n });\n this.host.emitEvent('action', {\n type: 'conversation.selected',\n payload: { conversationId: runtime.threadId },\n });\n }\n\n patch(threadId: string, patch: ThreadRuntimePatch): void {\n const runtime = this.require(threadId);\n const historyChanged = (['historyLoading', 'historyLoadingOlder', 'historyHasOlder', 'fullHistoryHydrated', 'loadingStrategy', 'historyItemsView'] as const)\n .some((key) => key in patch && patch[key] !== runtime[key]);\n Object.assign(runtime, patch);\n if (this.host.getState().activeConversationId === threadId) {\n this.host.patch(this.projection(runtime), threadId);\n } else {\n this.host.notifyConversationListeners(threadId);\n }\n if (historyChanged) {\n this.host.emitEvent('lifecycle', {\n type: 'conversation.historyStateChanged',\n conversationId: threadId,\n payload: {\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n error: runtime.error,\n },\n });\n }\n }\n\n emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void {\n const state = this.host.getState();\n this.host.emitEvent(origin, {\n type: 'surface.statusChanged',\n payload: { status: state.status, error: state.error },\n });\n }\n\n emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.host.schedulePluginRefresh();\n const fingerprint = JSON.stringify({\n id: summary.id,\n title: summary.title,\n preview: summary.preview,\n cwd: summary.cwd,\n status: summary.status,\n turnCount: summary.turnCount,\n createdAt: summary.createdAt,\n });\n if (this.semanticEventValues.get(`summary:${summary.id}`) === fingerprint) return;\n this.semanticEventValues.set(`summary:${summary.id}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.summaryUpserted',\n conversationId: summary.id,\n payload: { summary: structuredClone(summary), reason },\n });\n }\n\n emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n const payload = {\n threadStatus: structuredClone(runtime.threadStatus),\n busy: runtime.busy,\n error: runtime.error,\n };\n const fingerprint = JSON.stringify(payload);\n if (this.semanticEventValues.get(`activity:${threadId}`) === fingerprint) return;\n this.semanticEventValues.set(`activity:${threadId}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.activityChanged',\n conversationId: threadId,\n payload,\n });\n }\n\n emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n const payload = {\n approvalPreset: runtime.approvalPreset,\n selectedModelId: runtime.selectedModelId,\n selectedReasoningEffort: runtime.selectedReasoningEffort,\n selectedServiceTier: runtime.selectedServiceTier,\n planMode: runtime.planMode,\n };\n const fingerprint = JSON.stringify(payload);\n if (this.semanticEventValues.get(`settings:${threadId}`) === fingerprint) return;\n this.semanticEventValues.set(`settings:${threadId}`, fingerprint);\n this.host.emitEvent(origin, {\n type: 'conversation.settingsChanged',\n conversationId: threadId,\n payload,\n });\n }\n\n emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.skillsChanged',\n conversationId: threadId,\n payload: {\n cwd: runtime.cwd,\n skills: structuredClone(runtime.skills),\n status: runtime.skillCatalogStatus,\n },\n });\n }\n\n emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.permissionsChanged',\n conversationId: threadId,\n payload: {\n cwd: runtime.cwd,\n permissionProfiles: structuredClone(runtime.permissionProfiles),\n approvalPresets: [...runtime.approvalPresets],\n },\n });\n }\n\n emitHistoryReplaced(\n threadId: string,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.historyReplaced' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n const runtime = this.require(threadId);\n this.host.emitEvent(origin, {\n type: 'conversation.historyReplaced',\n conversationId: threadId,\n payload: {\n reason,\n messages: structuredClone(runtime.messages),\n threadStatus: structuredClone(runtime.threadStatus),\n state: historyReplacementState(runtime),\n },\n });\n }\n\n emitHistoryPrepended(\n threadId: string,\n messages: readonly SurfaceMessage[],\n origin: CodexSurfaceEventOrigin,\n ): void {\n if (messages.length === 0) return;\n const currentMessages = new Map(\n this.require(threadId).messages.map((message) => [message.id, message]),\n );\n this.host.emitEvent(origin, {\n type: 'conversation.historyPrepended',\n conversationId: threadId,\n payload: {\n messages: structuredClone(messages.map((message) => currentMessages.get(message.id) ?? message)),\n state: historyPrependState(this.require(threadId)),\n },\n });\n }\n\n messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null {\n return this.require(threadId).messages.find((message) => (\n message.metadata?.turnId === turnId\n && message.parts.some((part) => part.type === 'tool' && part.id === itemId)\n )) ?? null;\n }\n\n assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null {\n return [...this.require(threadId).messages].reverse().find((message) => (\n message.role === 'assistant'\n && message.kind === undefined\n && message.metadata?.turnId === turnId\n )) ?? null;\n }\n\n markTurnActive(runtime: ThreadRuntimeState, turnId: string): void {\n const expired = runtime.turnIds.includes(turnId) ? [] : this.projection(runtime).clientRequests.filter(request => (\n request.kind === 'ask_user' && request.payload.request.delivery === 'async'\n && request.turnId && request.turnId !== turnId\n ));\n runtime.activeTurnId = turnId;\n runtime.busy = true;\n runtime.turnStartPending = false;\n if (!runtime.turnIds.includes(turnId)) runtime.turnIds.push(turnId);\n runtime.turns = upsertSurfaceTurn(runtime.turns, {\n id: turnId,\n status: 'inProgress',\n error: null,\n willRetry: false,\n startedAt: null,\n completedAt: null,\n durationMs: null,\n });\n if (expired.length > 0) {\n this.patch(runtime.threadId, {\n answeredClientRequestIds: [...new Set([...runtime.answeredClientRequestIds, ...expired.map(request => request.id)])],\n });\n for (const request of expired) this.host.emitEvent('notification', {\n type: 'clientRequest.resolved', conversationId: runtime.threadId, turnId: request.turnId ?? undefined,\n payload: { request: structuredClone(request), response: null, reason: 'server' },\n });\n }\n }\n\n patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, status, updatedAt: new Date().toISOString() }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.emitSummaryUpserted(summary, 'updated', origin);\n }\n\n patchConversationTurnCount(\n threadId: string,\n turnCount: number,\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const state = this.host.getState();\n this.host.patch({\n conversations: state.conversations.map((conversation) => conversation.id === threadId\n ? { ...conversation, turnCount, updatedAt: new Date().toISOString() }\n : conversation),\n });\n const summary = this.host.getState().conversations.find((conversation) => conversation.id === threadId);\n if (summary) this.emitSummaryUpserted(summary, 'updated', origin);\n }\n}\n\nfunction historyReplacementState(runtime: ThreadRuntimeState) {\n return structuredClone({\n activeTurnId: runtime.activeTurnId,\n answeredClientRequestIds: runtime.answeredClientRequestIds,\n busy: runtime.busy,\n contextUsage: runtime.contextUsage,\n error: runtime.error,\n executionPlan: runtime.executionPlan,\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n turnGitDiff: runtime.turnGitDiff,\n turnIds: runtime.turnIds,\n turns: runtime.turns,\n });\n}\n\nfunction historyPrependState(runtime: ThreadRuntimeState) {\n return structuredClone({\n historyLoading: runtime.historyLoading,\n historyState: runtimeHistoryState(runtime),\n turnIds: runtime.turnIds,\n turns: runtime.turns,\n });\n}\n\nfunction runtimeHistoryState(runtime: ThreadRuntimeState) {\n return {\n loadingStrategy: runtime.loadingStrategy,\n ...(runtime.historyItemsView === 'summary' ? { itemsView: 'summary' as const } : {}),\n hasOlder: runtime.historyHasOlder,\n loadingOlder: runtime.historyLoadingOlder,\n fullyLoaded: runtime.fullHistoryHydrated,\n };\n}\n","import { RpcRemoteError } from '../codex/index';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type { ExperimentalFeatureListResponse } from '../codex/generated/v2/ExperimentalFeatureListResponse';\nimport type {\n CodexSurfaceAuthentication,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceEventOrigin,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { surfaceAuthenticationKey } from './codex-surface-authentication';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport type {\n CodexSurfaceConfigRequirements,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n} from './codex-surface-contracts';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { CodexSurfaceLifecycleController } from './codex-surface-lifecycle-controller';\nimport { errorMessage } from './codex-surface-prompts';\nimport { CodexSurfaceRuntimeController } from './codex-surface-runtime-controller';\n\nexport interface CodexSurfaceConnectionHost {\n clearConversationHandles(): void;\n clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'surface_disconnected',\n ): void;\n closed(): boolean;\n emitAuthenticationChanged(authentication: CodexSurfaceAuthentication, origin: CodexSurfaceEventOrigin): void;\n emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void;\n getSnapshot(): CodexSurfaceSnapshot;\n getState(): CodexSurfaceSnapshot;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n}\n\nconst SDK_RUNTIME_FEATURES = new Set([\n 'compaction_image_budget',\n 'default_mode_request_user_input',\n]);\n\nexport class CodexSurfaceConnectionController {\n private connectPromise: Promise<CodexSurfaceSnapshot> | null = null;\n private surfaceBootstrapPromise: Promise<void> | null = null;\n private bootstrappedAuthenticationKey: string | null = null;\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly options: Pick<CodexSurfaceOptions, 'autoSelectFirstConversation' | 'clientInfo'>,\n private readonly authentication: CodexSurfaceAuthenticationController,\n private readonly approvals: CodexSurfaceApprovalsController,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly clientRequests: CodexSurfaceClientRequestsController,\n private readonly conversations: CodexSurfaceConversationsController,\n private readonly items: CodexSurfaceItemsController,\n private readonly lifecycle: CodexSurfaceLifecycleController,\n private readonly runtimeState: CodexSurfaceRuntimeController,\n private readonly host: CodexSurfaceConnectionHost,\n ) {}\n\n connect(): Promise<CodexSurfaceSnapshot> {\n if (this.host.getState().status === 'ready') return Promise.resolve(this.host.getSnapshot());\n if (this.connectPromise) return this.connectPromise;\n if (this.host.closed()) return Promise.reject(new Error('Codex surface is closed'));\n\n this.host.patch({ status: 'connecting', error: null });\n this.host.emitSurfaceStatus('lifecycle');\n this.connectPromise = (async () => {\n try {\n this.bootstrappedAuthenticationKey = null;\n this.catalog.reset(true);\n this.resetAppServerSessionState();\n await this.client.start();\n const clientInfo = this.options.clientInfo ?? {\n name: 'codex_app_sdk',\n title: 'Codex Surface',\n version: '0.1.0',\n };\n await this.client.initialize({\n clientInfo: {\n name: clientInfo.name,\n title: clientInfo.title ?? null,\n version: clientInfo.version,\n },\n capabilities: { experimentalApi: true, requestAttestation: false },\n });\n await this.enableSupportedRuntimeFeatures();\n const authenticationChanged = await this.authentication.load('lifecycle');\n if (authenticationChanged || this.authentication.blocksBootstrap()) {\n await this.clearAuthenticatedSurfaceData();\n }\n if (!this.authentication.blocksBootstrap()) await this.bootstrapSurfaceData();\n this.host.patch({ status: 'ready', error: null });\n this.host.emitSurfaceStatus('lifecycle');\n if (!this.authentication.blocksBootstrap()) this.catalog.schedulePluginRefresh();\n return this.host.getSnapshot();\n } catch (error) {\n this.host.patch({ status: 'error', error: errorMessage(error) });\n this.host.emitSurfaceStatus('lifecycle');\n throw error;\n } finally {\n this.connectPromise = null;\n }\n })();\n return this.connectPromise;\n }\n\n private async enableSupportedRuntimeFeatures(): Promise<void> {\n try {\n let cursor: string | null = null;\n const enablement: Record<string, boolean> = {};\n do {\n const response: ExperimentalFeatureListResponse = await this.client.request('experimentalFeature/list', {\n cursor,\n limit: 100,\n threadId: null,\n });\n for (const feature of response.data) {\n if (SDK_RUNTIME_FEATURES.has(feature.name) && !feature.enabled) {\n enablement[feature.name] = true;\n }\n }\n cursor = response.nextCursor;\n } while (cursor);\n if (Object.keys(enablement).length > 0) {\n await this.client.request('experimentalFeature/enablement/set', { enablement });\n }\n } catch (error) {\n // Older app-server releases do not expose feature discovery. They remain\n // usable, but cannot opt into SDK-supported runtime features.\n if (error instanceof RpcRemoteError && error.code === -32601) return;\n throw error;\n }\n }\n\n async ensureConnected(): Promise<void> {\n await this.connect();\n while (true) {\n const pending = this.authentication.pendingRefresh() ?? this.surfaceBootstrapPromise;\n if (!pending) return;\n await pending;\n }\n }\n\n bootstrapSurfaceData(force = false): Promise<void> {\n const authenticationKey = surfaceAuthenticationKey(this.host.getState().authentication);\n if (!force && this.bootstrappedAuthenticationKey === authenticationKey) return Promise.resolve();\n if (this.surfaceBootstrapPromise) {\n const pending = this.surfaceBootstrapPromise;\n return pending.then(() => this.bootstrapSurfaceData(force));\n }\n const bootstrap = (async () => {\n await Promise.all([\n this.catalog.loadModels(),\n this.catalog.loadPermissionProfiles(),\n this.catalog.loadRateLimits(),\n this.conversations.load(),\n ]);\n const state = this.host.getState();\n const activeConversation = state.activeConversationId\n ? state.conversations.find((conversation) => conversation.id === state.activeConversationId)\n : undefined;\n const conversationToResume = activeConversation\n ?? (this.options.autoSelectFirstConversation === false ? undefined : state.conversations[0]);\n if (conversationToResume && !this.runtimeState.get(conversationToResume.id)?.hydrated) {\n await this.lifecycle.resumeDuringBootstrap(conversationToResume.id);\n }\n this.bootstrappedAuthenticationKey = authenticationKey;\n this.catalog.schedulePluginRefresh(force);\n })();\n this.surfaceBootstrapPromise = bootstrap;\n void bootstrap.finally(() => {\n this.surfaceBootstrapPromise = null;\n }).catch(() => undefined);\n return bootstrap;\n }\n\n async refreshAccount(): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.refresh('action', true);\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n await this.ensureConnected();\n return this.authentication.startChatGptLogin();\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n await this.ensureConnected();\n return this.authentication.startChatGptDeviceCodeLogin();\n }\n\n async cancelLogin(loginId: string): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.cancelLogin(loginId);\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n await this.ensureConnected();\n return this.authentication.logout();\n }\n\n async readRemoteControlStatus(): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/status/read', undefined);\n }\n\n async enableRemoteControl(options: v2.RemoteControlEnableParams = {}): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/enable', options);\n }\n\n async disableRemoteControl(options: v2.RemoteControlDisableParams = {}): Promise<CodexSurfaceRemoteControlStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/disable', options);\n }\n\n async startRemoteControlPairing(\n options: v2.RemoteControlPairingStartParams = {},\n ): Promise<CodexSurfaceRemoteControlPairing> {\n await this.ensureConnected();\n return this.client.request('remoteControl/pairing/start', options);\n }\n\n async readRemoteControlPairingStatus(\n options: v2.RemoteControlPairingStatusParams = {},\n ): Promise<CodexSurfaceRemoteControlPairingStatus> {\n await this.ensureConnected();\n return this.client.request('remoteControl/pairing/status', options);\n }\n\n async listRemoteControlClients(\n options: v2.RemoteControlClientsListParams,\n ): Promise<CodexSurfaceRemoteControlClientPage> {\n await this.ensureConnected();\n return this.client.request('remoteControl/client/list', options);\n }\n\n async revokeRemoteControlClient(\n options: v2.RemoteControlClientsRevokeParams,\n ): Promise<v2.RemoteControlClientsRevokeResponse> {\n await this.ensureConnected();\n return this.client.request('remoteControl/client/revoke', options);\n }\n\n async readConfigRequirements(): Promise<CodexSurfaceConfigRequirements | null> {\n await this.ensureConnected();\n return (await this.client.request('configRequirements/read', undefined)).requirements;\n }\n\n patchAuthentication(\n patch: Partial<CodexSurfaceAuthentication>,\n origin: CodexSurfaceEventOrigin,\n ): void {\n const authentication = { ...this.host.getState().authentication, ...patch };\n this.host.patch({ authentication });\n this.host.emitAuthenticationChanged(authentication, origin);\n }\n\n handleDisconnect(error: Error): void {\n if (this.host.closed()) return;\n this.catalog.reset(false);\n for (const runtime of this.runtimeState.values()) {\n this.host.clearPendingForThread(runtime.threadId, error.message, 'surface_disconnected');\n runtime.activeTurnId = null;\n runtime.busy = false;\n runtime.turnStartPending = false;\n runtime.historyLoading = false;\n runtime.error = error.message;\n }\n this.approvals.denyAll();\n this.clientRequests.clear();\n this.host.patch({\n status: 'error',\n activeTurnId: null,\n busy: false,\n approvals: [],\n clientRequests: [],\n historyLoading: false,\n error: error.message,\n });\n this.host.emitSurfaceStatus('lifecycle');\n }\n\n private resetAppServerSessionState(): void {\n this.runtimeState.clear();\n this.lifecycle.resetHydrations();\n this.conversations.reset();\n this.items.reset();\n }\n\n async clearAuthenticatedSurfaceData(): Promise<void> {\n const pendingBootstrap = this.surfaceBootstrapPromise;\n if (pendingBootstrap) await pendingBootstrap.catch(() => undefined);\n this.approvals.denyAll();\n this.clientRequests.rejectAll('Codex account signed out');\n this.runtimeState.clear();\n this.lifecycle.clear();\n this.conversations.reset();\n this.host.clearConversationHandles();\n this.items.reset();\n this.bootstrappedAuthenticationKey = null;\n this.catalog.reset(true);\n this.host.patch({\n conversations: [],\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n clientRequests: [],\n answeredClientRequestIds: [],\n approvals: [],\n models: [],\n modelCatalogStatus: 'notLoaded',\n skills: [],\n skillCatalogStatus: 'notLoaded',\n plugins: [],\n pluginCatalogStatus: 'notLoaded',\n permissionProfiles: [],\n approvalPresets: [],\n approvalPreset: null,\n selectedModelId: null,\n selectedReasoningEffort: null,\n selectedServiceTier: null,\n planMode: false,\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n rateLimits: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n error: null,\n });\n }\n}\n","import { readTurnItems } from './codex-surface-conversations-controller';\nimport type { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport type { CodexAppServerClient, v2 } from '../codex/index';\nimport type {\n CodexConversationSummary,\n CodexSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { codexThreadToSurfaceMessages } from './codex-conversation-history';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { activeTurnId, ensureAssistantTurnMessage } from './codex-surface-message-state';\nimport { normalizeMcpServers } from './codex-surface-mcp';\nimport {\n approvalPresetStartParams,\n collaborationMode,\n requireCatalogModel,\n selectedModel,\n sessionSelection,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\nimport {\n surfaceThreadStatus,\n threadToSummary,\n upsertConversation,\n} from './codex-surface-data';\nimport type {\n CodexConversationLoadOptions,\n ForkCodexConversationOptions,\n} from './codex-surface-contracts';\nimport type { ThreadRuntimePatch, ThreadRuntimeState } from './codex-surface-runtime';\nimport { surfaceTurn } from './codex-surface-events';\n\nconst FORK_HISTORY_PAGE_SIZE = 5;\n\nexport type CodexSurfaceForkHost = {\n createRuntime(threadId: string, patch?: ThreadRuntimePatch): ThreadRuntimeState;\n emitConversationActivity(threadId: string): void;\n emitConversationPermissions(threadId: string): void;\n emitConversationSettings(threadId: string): void;\n emitConversationSkills(threadId: string): void;\n emitHistoryReplaced(threadId: string): void;\n hydrateOriginalImages?(threadId: string, path?: string | null): void;\n emitSummaryUpserted(summary: CodexConversationSummary): void;\n getState(): CodexSurfaceSnapshot;\n hydrateCompleteHistory(threadId: string): Promise<void>;\n patch(patch: Partial<CodexSurfaceSnapshot>): void;\n rememberHostOptions(threadId: string, options: CodexConversationLoadOptions): void;\n requireRuntime(threadId: string): ThreadRuntimeState;\n snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot;\n};\n\ntype CodexForkBoundary = {\n beforeTurnId?: string;\n lastTurnId?: string;\n};\n\nexport class CodexSurfaceForkController {\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly loadingStrategy: 'eager' | 'lazy' | undefined,\n private readonly catalog: CodexSurfaceCatalogController,\n private readonly extensions: CodexSurfaceExtensionsController,\n private readonly host: CodexSurfaceForkHost,\n private readonly originalImages?: CodexOriginalHistoryImages,\n ) {}\n\n async fork(\n sourceThreadId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationLoadOptions = {},\n boundary: CodexForkBoundary = {},\n ): Promise<string> {\n const sourceRuntime = this.host.requireRuntime(sourceThreadId);\n if (\n (sourceRuntime.busy || sourceRuntime.activeTurnId)\n && !boundary.beforeTurnId\n && (!boundary.lastTurnId || boundary.lastTurnId === sourceRuntime.activeTurnId)\n ) {\n throw new Error('Cannot fork a conversation while its current turn is still active');\n }\n\n const cwd = options.cwd ?? sourceRuntime.cwd ?? hostOptions.cwd;\n const catalogs = await this.catalog.loadConversationCatalogs(cwd ?? undefined);\n const state = this.host.getState();\n const requestedModel = options.model\n ? requireCatalogModel(state.models, options.model)\n : selectedModel(state.models, sourceRuntime.selectedModelId);\n validateReasoningEffort(requestedModel, options.reasoningEffort);\n validateServiceTier(requestedModel, options.serviceTier);\n\n const mcpServers = hostOptions.mcpServers === undefined\n ? this.extensions.defaultMcpServers\n : normalizeMcpServers(hostOptions.mcpServers);\n const extension = await this.extensions.conversationExtension({\n operation: 'start',\n conversationId: null,\n cwd: cwd ?? undefined,\n createOptions: options,\n extensionContext: hostOptions.extensionContext,\n }, options, mcpServers);\n const response = await this.client.request('thread/fork', {\n threadId: sourceThreadId,\n ...(boundary.beforeTurnId ? { beforeTurnId: boundary.beforeTurnId } : {}),\n ...(boundary.lastTurnId ? { lastTurnId: boundary.lastTurnId } : {}),\n excludeTurns: true,\n deferGoalContinuation: true,\n ...(options.cwd ? { cwd: options.cwd } : {}),\n ...(options.model && requestedModel ? { model: requestedModel.model } : {}),\n ...(options.serviceTier === undefined ? {} : { serviceTier: options.serviceTier }),\n ...(extension.baseInstructions === undefined ? {} : { baseInstructions: extension.baseInstructions }),\n ...(extension.developerInstructions === undefined\n ? {}\n : { developerInstructions: extension.developerInstructions }),\n ...(extension.config === undefined ? {} : { config: extension.config as v2.ThreadForkParams['config'] }),\n ...forkApprovalSettings(options, catalogs.approvalPresets),\n });\n if (!response.thread.id || response.thread.id === sourceThreadId) {\n throw new Error(`Codex thread/fork returned an invalid new thread id '${response.thread.id}'`);\n }\n if (options.reasoningEffort) {\n await this.client.request('thread/settings/update', {\n threadId: response.thread.id,\n effort: options.reasoningEffort,\n ...(requestedModel ? {\n collaborationMode: collaborationMode(\n sourceRuntime.planMode,\n requestedModel.model,\n options.reasoningEffort,\n ),\n } : {}),\n });\n }\n\n const historyItemsView = hostOptions.historyItemsView ?? sourceRuntime.historyItemsView ?? 'full';\n const [initialPage, goal] = await Promise.all([\n this.client.request('thread/turns/list', {\n threadId: response.thread.id,\n cursor: null,\n limit: FORK_HISTORY_PAGE_SIZE,\n sortDirection: 'desc',\n itemsView: historyItemsView,\n }),\n this.client.request('thread/goal/get', { threadId: response.thread.id })\n .then((result) => result.goal)\n .catch(() => null),\n ]);\n const turns = await Promise.all([...initialPage.data].reverse().map(async turn =>\n turn.status === 'inProgress' && (turn.itemsView === 'summary' || turn.itemsView === 'notLoaded')\n ? { ...turn, items: await readTurnItems(this.client, response.thread.id, turn.id), itemsView: 'full' as const } : turn));\n const originalProjection = historyItemsView === 'full' ? await this.originalImages?.prepare(response.thread.id, response.thread.path) : undefined;\n const runningTurnId = activeTurnId(turns);\n const historyMessages = codexThreadToSurfaceMessages({ ...response.thread, turns });\n let messages = runningTurnId\n ? ensureAssistantTurnMessage(historyMessages, response.thread.id, runningTurnId)\n : historyMessages;\n if (originalProjection) messages = originalProjection(messages);\n const effectiveLoadingStrategy = hostOptions.loadingStrategy ?? this.loadingStrategy ?? 'lazy';\n const runtime = this.host.createRuntime(response.thread.id, {\n hydrated: true,\n historyMode: response.thread.historyMode ?? 'legacy',\n loadingStrategy: effectiveLoadingStrategy,\n historyItemsView,\n historyCursor: initialPage.nextCursor,\n historyHasOlder: initialPage.nextCursor !== null,\n historyLoadingOlder: false,\n fullHistoryHydrated: initialPage.nextCursor === null,\n cwd: response.cwd ?? response.thread.cwd ?? cwd ?? null,\n activeTurnId: runningTurnId,\n turns: turns.map((turn) => surfaceTurn(turn)),\n turnIds: turns.map((turn) => turn.id),\n messages,\n busy: Boolean(runningTurnId),\n goal: goal ? { ...goal } : null,\n threadStatus: surfaceThreadStatus(response.thread.status),\n ...catalogs,\n ...sessionSelection(response, state.models, this.host.snapshotForRuntime(sourceRuntime)),\n });\n if (options.reasoningEffort) runtime.selectedReasoningEffort = options.reasoningEffort;\n if (options.serviceTier !== undefined) runtime.selectedServiceTier = options.serviceTier;\n if (options.model && requestedModel) runtime.selectedModelId = requestedModel.id;\n\n this.host.rememberHostOptions(response.thread.id, {\n ...hostOptions,\n ...(runtime.cwd ? { cwd: runtime.cwd } : {}),\n loadingStrategy: effectiveLoadingStrategy,\n historyItemsView,\n mcpServers,\n });\n const summary = { ...threadToSummary(response.thread), turnCount: turns.length };\n this.host.patch({\n conversations: upsertConversation(this.host.getState().conversations, summary),\n });\n this.host.emitSummaryUpserted(summary);\n this.host.emitHistoryReplaced(response.thread.id);\n this.host.emitConversationActivity(response.thread.id);\n this.host.emitConversationSettings(response.thread.id);\n this.host.emitConversationSkills(response.thread.id);\n this.host.emitConversationPermissions(response.thread.id);\n if (historyItemsView === 'summary') this.host.hydrateOriginalImages?.(response.thread.id, response.thread.path);\n if (effectiveLoadingStrategy === 'eager' && initialPage.nextCursor !== null) {\n void this.host.hydrateCompleteHistory(response.thread.id).catch(() => undefined);\n }\n return response.thread.id;\n }\n\n async forkTurn(\n sourceThreadId: string,\n turnId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationLoadOptions = {},\n ): Promise<string> {\n const runtime = this.host.requireRuntime(sourceThreadId);\n if (!runtime.turnIds.includes(turnId)) {\n throw new Error(`Cannot fork at unknown Codex turn '${turnId}'`);\n }\n return this.fork(sourceThreadId, options, hostOptions, { lastTurnId: turnId });\n }\n}\n\nfunction forkApprovalSettings(\n options: ForkCodexConversationOptions,\n approvalPresets: readonly string[],\n): Pick<v2.ThreadForkParams, 'approvalPolicy' | 'approvalsReviewer' | 'permissions' | 'sandbox'> {\n if (options.approvalPreset) {\n if (!approvalPresets.includes(options.approvalPreset)) {\n throw new Error(`Approval preset '${options.approvalPreset}' is not available`);\n }\n return approvalPresetStartParams(options.approvalPreset);\n }\n return {\n ...(options.approvalMode === undefined\n ? {}\n : { approvalPolicy: options.approvalMode === 'ask' ? 'on-request' as const : 'never' as const }),\n ...(options.permissionMode === undefined\n ? {}\n : { sandbox: options.permissionMode === 'full-access' ? 'danger-full-access' as const : options.permissionMode }),\n };\n}\n","import { extname, isAbsolute, relative, resolve, sep } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { CodexAppServerClient } from '../codex/index';\nimport { codexImageDataUrl } from './codex-conversation-history';\n\ntype CodeBlockRange = { start: number; end: number };\ntype SourceReplacement = { start: number; end: number; value: string };\n\nconst markdownImageRegex = /(?<!\\[)!\\[([^\\]]*)\\]\\(([^)\\s]+)(?:\\s+[\"']([^\"']*)[\"'])?\\)/g;\nconst supportedImageExtensions = new Set(['.avif', '.gif', '.jpeg', '.jpg', '.png', '.webp']);\n\n/**\n * Converts filesystem-backed Markdown images into renderer-safe data URLs.\n * The app-server owns the filesystem, so reading through fs/readFile works for\n * local, Electron, and remotely hosted Web surfaces without exposing paths to\n * the renderer.\n */\nexport class CodexMarkdownImageHydrator {\n constructor(private readonly client: CodexAppServerClient) {}\n\n async hydrate(content: string, cwd?: string | null): Promise<string> {\n const codeBlocks = findCodeBlocks(content);\n const replacements = await Promise.all(Array.from(content.matchAll(markdownImageRegex), async (match) => {\n const matchStart = match.index ?? 0;\n if (isInsideCodeBlock(matchStart, codeBlocks)) return null;\n const source = match[2]!;\n const path = localImagePath(source, cwd);\n if (!path) return null;\n\n try {\n const response = await this.client.request('fs/readFile', { path });\n const image = codexImageDataUrl(response.dataBase64);\n if (!image) return null;\n const sourceOffset = match[0].indexOf('](') + 2;\n return {\n start: matchStart + sourceOffset,\n end: matchStart + sourceOffset + source.length,\n value: image.url,\n } satisfies SourceReplacement;\n } catch {\n return null;\n }\n }));\n\n return applyReplacements(content, replacements.filter((item): item is SourceReplacement => item !== null));\n }\n}\n\nexport function localImagePath(source: string, cwd?: string | null): string | null {\n const value = source.trim();\n if (!value || /[\\u0000-\\u001f\\u007f]/.test(value)) return null;\n\n let path: string;\n if (value.startsWith('file://')) {\n try {\n path = fileURLToPath(value);\n } catch {\n return null;\n }\n } else if (/^[a-z][a-z\\d+.-]*:/i.test(value)) {\n return null;\n } else {\n try {\n path = decodeURIComponent(value);\n } catch {\n return null;\n }\n }\n\n if (!supportedImageExtensions.has(extname(path).toLowerCase())) return null;\n if (isAbsolute(path)) return path;\n if (!cwd || !isAbsolute(cwd)) return null;\n const absolutePath = resolve(cwd, path);\n const relativePath = relative(cwd, absolutePath);\n if (relativePath === '..' || relativePath.startsWith(`..${sep}`) || isAbsolute(relativePath)) {\n return null;\n }\n return absolutePath;\n}\n\nfunction applyReplacements(content: string, replacements: SourceReplacement[]): string {\n let hydrated = content;\n for (const replacement of replacements.sort((left, right) => right.start - left.start)) {\n hydrated = `${hydrated.slice(0, replacement.start)}${replacement.value}${hydrated.slice(replacement.end)}`;\n }\n return hydrated;\n}\n\nfunction findCodeBlocks(content: string): CodeBlockRange[] {\n const ranges: CodeBlockRange[] = [];\n const fenceRegex = /(^|\\n)(```|~~~)/g;\n let match: RegExpExecArray | null;\n\n while ((match = fenceRegex.exec(content)) !== null) {\n const fence = match[2]!;\n const prefix = match[1]!;\n const start = match.index + prefix.length;\n const closeRegex = new RegExp(`(^|\\\\n)${fence}`, 'g');\n closeRegex.lastIndex = start + fence.length;\n const close = closeRegex.exec(content);\n if (!close) {\n ranges.push({ start, end: content.length });\n break;\n }\n const end = close.index + close[1]!.length + fence.length;\n ranges.push({ start, end });\n fenceRegex.lastIndex = end;\n }\n\n return ranges;\n}\n\nfunction isInsideCodeBlock(index: number, ranges: CodeBlockRange[]): boolean {\n return ranges.some((range) => index >= range.start && index <= range.end);\n}\n","import type { CodexAppServerClient, v2 } from '../codex/index';\nimport type { CodexConversationPromptHistory } from '@codex-app-sdk/core/surface';\nimport { normalizedConversationId } from './codex-surface-prompts';\n\nexport const CODEX_PROMPT_HISTORY_TURN_LIMIT = 100;\n\nconst contextTagRegex = /<context>[\\s\\S]*?<\\/context>\\s*/g;\nconst inAppBrowserContextTagRegex = /<in-app-browser-context(?:\\s[^>]*)?>[\\s\\S]*?<\\/in-app-browser-context>\\s*/g;\nconst ambientRequestHeadingRegex = /^[ \\t]*## My request for Codex:[ \\t]*$/m;\n\nexport async function readPromptHistory(\n client: CodexAppServerClient,\n conversationId: string,\n): Promise<CodexConversationPromptHistory> {\n const threadId = normalizedConversationId(conversationId);\n const response = await client.request('thread/turns/list', {\n threadId,\n cursor: null,\n limit: CODEX_PROMPT_HISTORY_TURN_LIMIT,\n sortDirection: 'desc',\n itemsView: 'summary',\n });\n return {\n conversationId: threadId,\n prompts: promptsFromSummaryTurns(response.data),\n };\n}\n\n/** Extracts only visible user-authored text without retaining the turn payload. */\nexport function promptsFromSummaryTurns(turns: readonly v2.Turn[]): string[] {\n return [...turns].reverse().flatMap((turn) => turn.items.flatMap((item) => {\n if (item.type !== 'userMessage') return [];\n const text = item.content\n .flatMap((input) => input.type === 'text' ? [input.text] : [])\n .join('');\n const prompt = stripPromptContext(text);\n return prompt && prompt !== '(no user instructions)' ? [prompt] : [];\n }));\n}\n\nfunction stripPromptContext(content: string): string {\n const withoutContext = content.replace(contextTagRegex, '');\n const withoutBrowserContext = withoutContext.replace(inAppBrowserContextTagRegex, '');\n return (withoutBrowserContext === withoutContext\n ? withoutBrowserContext\n : withoutBrowserContext.replace(ambientRequestHeadingRegex, ''))\n .trim();\n}\n","import { normalizeMcpServers, mcpServerConfig } from './codex-surface-mcp';\nimport type { CodexAppServerClient, ServerNotification, v2 } from '../codex/index';\nimport type { CodexSurfaceSnapshot } from '@codex-app-sdk/core/surface';\nimport type {\n CodexGeneratedText,\n GenerateCodexTextOptions,\n} from './codex-surface-contracts';\nimport {\n defaultReasoningEffort,\n requireCatalogModel,\n selectedModel,\n validateReasoningEffort,\n validateServiceTier,\n} from './codex-surface-settings';\nimport { attachmentInput, validateAttachments } from './codex-surface-data';\n\nconst DEFAULT_GENERATION_TIMEOUT_MS = 120_000;\n\ntype PendingGeneration = {\n readonly promise: Promise<CodexGeneratedText>;\n readonly resolve: (result: CodexGeneratedText) => void;\n readonly reject: (error: Error) => void;\n readonly texts: string[];\n turnId: string | null;\n};\n\nexport type CodexSurfaceTextGenerationHost = {\n ensureConnected(): Promise<void>;\n getSnapshot(): CodexSurfaceSnapshot;\n};\n\n/** Runs isolated, non-persisted text turns without projecting them into surface state. */\nexport class CodexSurfaceTextGenerationController {\n private readonly hiddenThreadIds = new Set<string>();\n private readonly pendingByThread = new Map<string, PendingGeneration>();\n\n constructor(\n private readonly client: CodexAppServerClient,\n private readonly defaultCwd: string | undefined,\n private readonly host: CodexSurfaceTextGenerationHost,\n ) {}\n\n /** Returns true when a notification belongs to an ephemeral thread and must stay hidden. */\n handleNotification(notification: ServerNotification): boolean {\n if (notification.method === 'thread/started' && notification.params.thread.ephemeral) {\n this.hiddenThreadIds.add(notification.params.thread.id);\n }\n const threadId = notificationThreadId(notification);\n if (!threadId || !this.hiddenThreadIds.has(threadId)) return false;\n\n const pending = this.pendingByThread.get(threadId);\n if (pending) this.consumeNotification(pending, notification);\n if (notification.method === 'thread/closed' || notification.method === 'thread/deleted') {\n this.hiddenThreadIds.delete(threadId);\n }\n return true;\n }\n\n async generate(prompt: string, options: GenerateCodexTextOptions = {}): Promise<CodexGeneratedText> {\n const text = prompt.trim();\n if (!text) throw new Error('Generation prompt cannot be empty');\n if (options.signal?.aborted) throw abortedError();\n if (options.attachments?.some(attachment => attachment.type !== 'image')) {\n throw new Error('Utility generation accepts image attachments only');\n }\n const attachments = validateAttachments(options.attachments ?? []);\n const servers = normalizeMcpServers(options.mcpServers ?? []);\n await this.host.ensureConnected();\n\n const state = this.host.getSnapshot();\n const currentModel = selectedModel(state.models, state.selectedModelId);\n const requestedModel = options.model ? requireCatalogModel(state.models, options.model) : currentModel;\n const model = requestedModel?.model;\n const reasoningEffort = options.reasoningEffort\n ?? (requestedModel?.id === currentModel?.id\n ? state.selectedReasoningEffort\n : requestedModel ? defaultReasoningEffort(requestedModel) : null)\n ?? undefined;\n const serviceTier = options.serviceTier !== undefined\n ? options.serviceTier\n : requestedModel?.id === currentModel?.id\n ? state.selectedServiceTier\n : requestedModel?.defaultServiceTier ?? null;\n validateReasoningEffort(requestedModel, reasoningEffort);\n validateServiceTier(requestedModel, serviceTier);\n\n const started = await this.client.request('thread/start', {\n approvalPolicy: 'never',\n approvalsReviewer: 'user',\n ...(options.baseInstructions === undefined ? {} : { baseInstructions: options.baseInstructions }),\n ...(options.developerInstructions === undefined\n ? {}\n : { developerInstructions: options.developerInstructions }),\n cwd: options.cwd ?? this.defaultCwd,\n dynamicTools: [],\n ...(servers.length ? { config: mcpServerConfig(servers) } : {}),\n ...(options.tools === 'read-only' ? {} : { environments: [] }),\n ephemeral: true,\n ...(model ? { model } : {}),\n permissions: ':read-only',\n serviceTier,\n serviceName: 'codex_app_sdk',\n threadSource: 'sdk_ephemeral_generation',\n });\n const threadId = started.thread.id;\n if (!started.thread.ephemeral) {\n await ignoreFailure(() => this.client.request('thread/delete', { threadId }));\n throw new Error('Codex app-server did not create an ephemeral generation thread');\n }\n this.hiddenThreadIds.add(threadId);\n if (options.signal?.aborted) {\n await ignoreFailure(() => this.client.request('thread/unsubscribe', { threadId }));\n this.hiddenThreadIds.delete(threadId);\n throw abortedError();\n }\n const pending = createPendingGeneration();\n this.pendingByThread.set(threadId, pending);\n let turnId: string | null = null;\n let completed = false;\n const abort = () => pending.reject(abortedError());\n options.signal?.addEventListener('abort', abort);\n const timeout = options.timeoutMs === null ? undefined : setTimeout(() => {\n pending.reject(new Error('Codex ephemeral generation timed out'));\n }, options.timeoutMs ?? DEFAULT_GENERATION_TIMEOUT_MS);\n\n try {\n const turnResponse = await this.client.request('turn/start', {\n threadId,\n input: [{ type: 'text', text, text_elements: [] }, ...attachments.map(attachmentInput)],\n ...(options.tools === 'read-only' ? {} : { environments: [] }),\n permissions: ':read-only',\n ...(model ? { model } : {}),\n ...(reasoningEffort ? { effort: reasoningEffort as v2.TurnStartParams['effort'] } : {}),\n serviceTier,\n ...(options.outputSchema === undefined\n ? {}\n : { outputSchema: options.outputSchema as v2.TurnStartParams['outputSchema'] }),\n });\n turnId = turnResponse.turn.id;\n pending.turnId = turnId;\n completeFromTurn(pending, turnResponse.turn);\n const result = await pending.promise;\n completed = true;\n return result;\n } finally {\n clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n this.pendingByThread.delete(threadId);\n if (!completed && turnId) {\n const interruptedTurnId = turnId;\n await ignoreFailure(() => this.client.request('turn/interrupt', {\n threadId, turnId: interruptedTurnId,\n }));\n }\n await ignoreFailure(() => this.client.request('thread/unsubscribe', { threadId }));\n this.hiddenThreadIds.delete(threadId);\n }\n }\n\n close(error = new Error('Codex surface closed')): void {\n for (const pending of this.pendingByThread.values()) pending.reject(error);\n this.pendingByThread.clear();\n this.hiddenThreadIds.clear();\n }\n\n private consumeNotification(pending: PendingGeneration, notification: ServerNotification): void {\n if (notification.method === 'item/completed') {\n if (pending.turnId && notification.params.turnId !== pending.turnId) return;\n if (!pending.turnId) pending.turnId = notification.params.turnId;\n if (notification.params.item.type === 'agentMessage') {\n const text = notification.params.item.text.trim();\n if (text) pending.texts.push(text);\n }\n return;\n }\n if (notification.method === 'error') {\n if (pending.turnId && notification.params.turnId !== pending.turnId) return;\n if (!notification.params.willRetry) pending.reject(new Error(notification.params.error.message));\n return;\n }\n if (notification.method === 'turn/completed') {\n if (pending.turnId && notification.params.turn.id !== pending.turnId) return;\n completeFromTurn(pending, notification.params.turn);\n }\n }\n}\n\nasync function ignoreFailure(operation: () => Promise<unknown>): Promise<void> {\n try {\n await operation();\n } catch {\n // Best-effort cleanup must not replace the generation result or its original failure.\n }\n}\n\nfunction createPendingGeneration(): PendingGeneration {\n let resolvePromise!: (result: CodexGeneratedText) => void;\n let rejectPromise!: (error: Error) => void;\n const pending: PendingGeneration = {\n promise: new Promise<CodexGeneratedText>((resolve, reject) => {\n resolvePromise = resolve;\n rejectPromise = reject;\n }),\n resolve: (result) => {\n resolvePromise(result);\n },\n reject: (error) => {\n rejectPromise(error);\n },\n texts: [],\n turnId: null,\n };\n // The turn/start RPC may still be in flight when an abort, disconnect, or\n // timeout rejects completion. Mark the promise handled until generate awaits it.\n void pending.promise.catch(() => undefined);\n return pending;\n}\n\nfunction completeFromTurn(pending: PendingGeneration, turn: v2.Turn): void {\n for (const item of turn.items) {\n if (item.type !== 'agentMessage') continue;\n const text = item.text.trim();\n if (text) pending.texts.push(text);\n }\n if (turn.status === 'failed') {\n pending.reject(new Error(turn.error?.message ?? 'Codex ephemeral generation failed'));\n return;\n }\n if (turn.status === 'interrupted') {\n pending.reject(new Error('Codex ephemeral generation was interrupted'));\n return;\n }\n if (turn.status !== 'completed') return;\n const text = pending.texts.at(-1);\n if (!text) {\n pending.reject(new Error('Codex ephemeral generation returned no text'));\n return;\n }\n pending.resolve({ text });\n}\n\nfunction notificationThreadId(notification: ServerNotification): string | null {\n if (notification.method === 'thread/started') return notification.params.thread.id;\n const params = notification.params as { threadId?: unknown };\n return typeof params.threadId === 'string' ? params.threadId : null;\n}\n\nfunction abortedError(): Error {\n return new Error('Codex ephemeral generation was aborted');\n}\n","import { CodexOriginalHistoryImages } from './codex-original-history-images';\nimport { CodexOriginalHistoryUsage } from './codex-original-history-usage';\nimport { ConversationContentTransport } from './conversation-content-transport';\nimport {\n CodexAppServerClient,\n type ServerNotification,\n type v2,\n} from '../codex/index';\nimport { notifyListeners } from '../codex/listener-errors';\nimport type {\n CodexConversationSummary,\n CodexConversationEvent,\n CodexConversationHistory,\n CodexConversationHistoryPage,\n CodexConversationSnapshot,\n CodexSurfaceApprovalDecision,\n CodexSurfaceApprovalScope,\n CodexSurfaceChatGptDeviceCodeLogin,\n CodexSurfaceChatGptLogin,\n CodexSurfaceClientRequestResponse,\n CodexSurfaceEvent,\n CodexSurfaceEventOrigin,\n CodexSurfaceModel,\n CodexSurfaceRateLimits,\n CodexSurfaceAccountUsage,\n ConsumeCodexRateLimitResetCreditOptions,\n CodexSurfaceRateLimitResetCreditResult,\n ReadCodexRateLimitsOptions,\n CodexSurfaceSnapshot,\n CodexSurfaceSkill,\n CreateCodexConversationOptions,\n ListCodexConversationsOptions,\n ListCodexModelsOptions,\n SendCodexMessageOptions,\n StartCodexRealtimeOptions,\n StartCodexLiveChatOptions,\n StartCodexReviewOptions,\n SurfaceMessage,\n UpdateCodexConversationSettings,\n CodexSurfaceStatePatch,\n CodexVersionedSurfaceSnapshot,\n} from '@codex-app-sdk/core/surface';\nimport { diffCodexSurfaceState } from '@codex-app-sdk/core/surface-bridge';\nimport {\n CodexAppServerStdioTransport,\n} from './codex-stdio-transport';\nimport {\n CodexAppServerUnixSocketTransport,\n} from './codex-unix-socket-transport';\nimport {\n errorMessage,\n normalizedConversationId,\n} from './codex-surface-prompts';\nimport { startCodexRealtimeSession } from './codex-surface-realtime-session';\nimport type {\n CodexConversation,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexRealtimeSession,\n CodexSurfaceConfigRequirements,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n CodexGeneratedText,\n ForkCodexConversationOptions,\n GenerateCodexTextOptions,\n ListCodexSkillsOptions,\n} from './codex-surface-contracts';\nimport {\n initialSurfaceSnapshot,\n type ThreadRuntimePatch,\n type ThreadRuntimeState,\n} from './codex-surface-runtime';\nimport {\n initialAuthentication,\n surfaceAuthenticationIdentityKey,\n} from './codex-surface-authentication';\nimport { surfaceAccountUsage, surfaceRateLimits } from './codex-surface-data';\nimport {\n isUnixSocketTransportOptions,\n surfaceTransportOptions,\n} from './codex-surface-transport-options';\nimport { CodexSurfaceAuthenticationController } from './codex-surface-authentication-controller';\nimport { createCodexConversationHandle } from './codex-conversation-handle';\nimport { CodexSurfaceItemsController } from './codex-surface-items-controller';\nimport { CodexSurfaceClientRequestsController } from './codex-surface-client-requests-controller';\nimport { CodexSurfaceCatalogController } from './codex-surface-catalog-controller';\nimport { CodexSurfaceApprovalsController } from './codex-surface-approvals-controller';\nimport { CodexSurfaceExtensionsController } from './codex-surface-extensions-controller';\nimport { CodexSurfaceConversationsController } from './codex-surface-conversations-controller';\nimport { CodexSurfaceConversationSettingsController } from './codex-surface-conversation-settings-controller';\nimport { CodexSurfaceTurnActionsController } from './codex-surface-turn-actions-controller';\nimport { CodexSurfaceMessagesController } from './codex-surface-messages-controller';\nimport { CodexSurfaceLifecycleController } from './codex-surface-lifecycle-controller';\nimport { CodexSurfaceNotificationsController } from './codex-surface-notifications-controller';\nimport { CodexSurfaceRuntimeController } from './codex-surface-runtime-controller';\nimport { CodexSurfaceConnectionController } from './codex-surface-connection-controller';\nimport { CodexSurfaceForkController } from './codex-surface-fork-controller';\nimport { CodexMarkdownImageHydrator } from './codex-markdown-images';\nimport {\n readPromptHistory,\n} from './codex-surface-prompt-history';\nimport { CodexSurfaceTextGenerationController } from './codex-surface-text-generation-controller';\nimport { CodexSurfaceUsageController } from './codex-surface-usage-controller';\n\nexport type {\n CodexAppServerTransportOptions,\n CodexConversation,\n CodexConversationDefaults,\n CodexConversationForkResult,\n CodexConversationHostOptions,\n CodexConversationLoadOptions,\n CodexDynamicTool,\n CodexDynamicToolCall,\n CodexDynamicToolContent,\n CodexDynamicToolResult,\n CodexRealtimeSession,\n CodexSurfaceConfigRequirements,\n CodexSurfaceExtension,\n CodexSurfaceOptions,\n CodexSurfaceRemoteControlClient,\n CodexSurfaceRemoteControlClientPage,\n CodexSurfaceRemoteControlPairing,\n CodexSurfaceRemoteControlPairingStatus,\n CodexSurfaceRemoteControlStatus,\n CodexThreadStartExtension,\n CodexGeneratedText,\n ForkCodexConversationOptions,\n GenerateCodexTextOptions,\n ListCodexSkillsOptions,\n} from './codex-surface-contracts';\n\nexport type {\n CodexMcpServerDefinition,\n CodexMcpServerTransport,\n CodexMcpServerToolApprovalMode,\n} from './codex-surface-mcp';\n\ntype StateListener = (snapshot: CodexSurfaceSnapshot) => void;\ntype StatePatchListener = (patch: CodexSurfaceStatePatch) => void;\ntype ConversationStateListener = (snapshot: CodexConversationSnapshot) => void;\ntype SurfaceEventListener = (event: CodexSurfaceEvent) => void;\ntype ConversationEventListener = (event: CodexConversationEvent) => void;\ntype SurfaceEventInput = CodexSurfaceEvent extends infer Event\n ? Event extends CodexSurfaceEvent\n ? Omit<Event, 'seq' | 'occurredAt' | 'origin'>\n : never\n : never;\n\nexport class CodexSurface {\n private readonly client: CodexAppServerClient;\n private readonly listeners = new Set<StateListener>();\n private readonly patchListeners = new Set<StatePatchListener>();\n private stateVersion = 0;\n private readonly eventListeners = new Set<SurfaceEventListener>();\n private readonly conversationListeners = new Map<string, Set<ConversationStateListener>>();\n private readonly conversationHandles = new Map<string, CodexConversation>();\n private readonly extensions: CodexSurfaceExtensionsController;\n private readonly authentication: CodexSurfaceAuthenticationController;\n private readonly items: CodexSurfaceItemsController;\n private readonly clientRequests: CodexSurfaceClientRequestsController;\n private readonly catalog: CodexSurfaceCatalogController;\n private readonly approvals: CodexSurfaceApprovalsController;\n private readonly conversations: CodexSurfaceConversationsController;\n private readonly conversationSettings: CodexSurfaceConversationSettingsController;\n private readonly turnActions: CodexSurfaceTurnActionsController;\n private readonly messagesController: CodexSurfaceMessagesController;\n private readonly lifecycle: CodexSurfaceLifecycleController;\n private readonly originalImages?: CodexOriginalHistoryImages;\n private readonly originalUsage?: CodexOriginalHistoryUsage;\n private readonly usageRefreshes = new Map<string, { again: boolean }>();\n private readonly forks: CodexSurfaceForkController;\n private readonly notifications: CodexSurfaceNotificationsController;\n private readonly runtimeState: CodexSurfaceRuntimeController;\n private readonly markdownImages: CodexMarkdownImageHydrator;\n private readonly connection: CodexSurfaceConnectionController;\n private readonly textGeneration: CodexSurfaceTextGenerationController;\n private readonly unsubscribeDisconnect: () => void;\n private readonly unsubscribeNotification: () => void;\n private readonly unsubscribeToolInputRequests: () => void;\n private readonly unsubscribeMcpElicitationRequests: () => void;\n private eventSequence = 0;\n private readonly usage = new CodexSurfaceUsageController();\n private accountGeneration = 0;\n private readonly pendingMarkdownImageHydrations = new Set<string>();\n private closed = false;\n private state: CodexSurfaceSnapshot = initialSurfaceSnapshot(initialAuthentication());\n\n constructor(private readonly options: CodexSurfaceOptions = {}) {\n this.extensions = new CodexSurfaceExtensionsController(\n options.extensions ?? [],\n options.mcpServers ?? [],\n (threadId) => this.lifecycle.hostOptions(threadId),\n );\n const transportOptions = surfaceTransportOptions(options);\n this.client = options.client ?? new CodexAppServerClient(\n isUnixSocketTransportOptions(transportOptions)\n ? new CodexAppServerUnixSocketTransport(transportOptions)\n : new CodexAppServerStdioTransport(transportOptions),\n options.onListenerError ? { onListenerError: options.onListenerError } : {},\n );\n this.originalImages = options.originalHistoryImages ? new CodexOriginalHistoryImages(this.client) : undefined;\n this.originalUsage = options.originalHistoryUsage ? new CodexOriginalHistoryUsage(this.client) : undefined;\n this.markdownImages = new CodexMarkdownImageHydrator(this.client);\n this.authentication = new CodexSurfaceAuthenticationController(this.client, {\n bootstrapSurfaceData: (force) => this.connection.bootstrapSurfaceData(force),\n clearAuthenticatedSurfaceData: () => this.connection.clearAuthenticatedSurfaceData(),\n getSnapshot: () => this.getSnapshot(),\n patchAuthentication: (patch, origin) => this.connection.patchAuthentication(patch, origin),\n reportError: (error) => this.patch({ error: errorMessage(error) }),\n });\n this.items = new CodexSurfaceItemsController({\n assistantMessageForTurn: (threadId, turnId) => this.assistantMessageForTurn(threadId, turnId),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n getState: () => this.state,\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n messageContainingTool: (threadId, turnId, itemId) => (\n this.messageContainingTool(threadId, turnId, itemId)\n ),\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n sendNextQueuedPrompt: (threadId) => { void this.messagesController.sendNextQueuedPrompt(threadId); },\n });\n this.approvals = new CodexSurfaceApprovalsController(this.client, {\n activeConversationId: () => this.state.activeConversationId,\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n maybeClearWaitingBusy: (threadId) => this.clientRequests.maybeClearWaitingBusy(threadId),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status) => this.patchConversationStatus(threadId, status),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n });\n this.clientRequests = new CodexSurfaceClientRequestsController({\n activeConversationId: () => this.state.activeConversationId,\n answerAsyncQuestion: (threadId, prompt, displayText) => (\n this.messagesController.answerAsyncQuestion(threadId, prompt, displayText)\n ),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n hasPendingApproval: (threadId) => this.approvals.hasForThread(threadId),\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n messageContainingTool: (threadId, turnId, itemId) => (\n this.messageContainingTool(threadId, turnId, itemId)\n ),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n });\n this.runtimeState = new CodexSurfaceRuntimeController(\n this.approvals,\n this.clientRequests,\n {\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n getState: () => this.state,\n notifyConversationListeners: (threadId) => this.notifyConversationListeners(threadId),\n patch: (patch, conversationId) => this.patch(patch, conversationId),\n schedulePluginRefresh: () => this.catalog.schedulePluginRefresh(),\n },\n );\n this.conversationSettings = new CodexSurfaceConversationSettingsController(\n this.client,\n {\n approvalMode: options.approvalMode,\n approvalPreset: options.approvalPreset,\n permissionMode: options.permissionMode,\n },\n {\n createConversation: async () => { await this.createConversation(); },\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n );\n this.turnActions = new CodexSurfaceTurnActionsController(this.client, {\n createConversation: async () => { await this.createConversation(); },\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n loadTurnHistory: (threadId, turnId) => this.conversations.loadTurnHistory(threadId, turnId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n hydrateCompleteHistory: (threadId, options) => this.conversations.hydrateCompleteHistory(threadId, options),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count, origin) => this.patchConversationTurnCount(threadId, count, origin),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n sendMessageToThread: (threadId, prompt, options) => this.messagesController.sendToThread(threadId, prompt, options),\n });\n this.messagesController = new CodexSurfaceMessagesController(this.client, {\n loadSkillsForThread: async threadId => {\n const runtime = this.requireRuntime(threadId);\n await this.catalog.listSkills({ ...(runtime.cwd ? { cwd: runtime.cwd } : {}) });\n },\n clearGoalForThread: (threadId) => this.conversationSettings.clearGoalForThread(threadId),\n compactForThread: (threadId) => this.turnActions.compactForThread(threadId),\n createConversation: async () => { await this.createConversation(); },\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n ensureConnected: () => this.ensureConnected(),\n ensureThreadReady: (threadId) => this.ensureThreadReady(threadId),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count, origin) => this.patchConversationTurnCount(threadId, count, origin),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n setGoal: (objective) => this.conversationSettings.setGoal(objective),\n setGoalForThread: (threadId, objective) => this.conversationSettings.setGoalForThread(threadId, objective),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n startReview: (options) => this.turnActions.startReview(options),\n startReviewForThread: (threadId, options) => this.turnActions.startReviewForThread(threadId, options),\n updateSettings: (settings) => this.conversationSettings.update(settings),\n updateSettingsForThread: (threadId, settings) => this.conversationSettings.updateForThread(threadId, settings),\n });\n this.catalog = new CodexSurfaceCatalogController(this.client, options.cwd, {\n authenticationBlocksBootstrap: () => this.authentication.blocksBootstrap(),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n ensureConnected: () => this.ensureConnected(),\n getState: () => this.state,\n isClosed: () => this.closed,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n preferredApprovalPreset: () => this.conversationSettings.preferredApprovalPreset(),\n runtimes: () => this.runtimeState.values(),\n });\n this.conversations = new CodexSurfaceConversationsController(\n this.client,\n options.conversationLimit,\n {\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitHistoryPrepended: (threadId, messages, origin) => this.emitHistoryPrepended(threadId, messages, origin),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n removeThread: (threadId, reason, origin) => this.removeThread(threadId, reason, origin),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n schedulePluginRefresh: (force) => this.catalog.schedulePluginRefresh(force),\n },\n this.originalImages,\n );\n this.lifecycle = new CodexSurfaceLifecycleController(\n this.client,\n options,\n this.catalog,\n this.extensions,\n this.conversationSettings,\n this.conversations,\n {\n activateRuntime: (runtime) => this.activateRuntime(runtime),\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitConversationPermissions: (threadId, origin) => this.emitConversationPermissions(threadId, origin),\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitHistoryReplaced: (threadId, reason, origin) => this.emitHistoryReplaced(threadId, reason, origin),\n emitSelected: (conversationId) => this.emitEvent('action', {\n type: 'conversation.selected',\n payload: { conversationId },\n }),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n observeEmptyConversation: (threadId) => this.usage.observeEmptyConversation(threadId),\n patch: (patch) => this.patch(patch),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n runtimeProjection: (runtime) => this.runtimeProjection(runtime),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n this.originalImages,\n );\n this.forks = new CodexSurfaceForkController(\n this.client,\n options.loadingStrategy,\n this.catalog,\n this.extensions,\n {\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId) => this.emitConversationActivity(threadId, 'action'),\n emitConversationPermissions: (threadId) => this.emitConversationPermissions(threadId, 'action'),\n emitConversationSettings: (threadId) => this.emitConversationSettings(threadId, 'action'),\n emitConversationSkills: (threadId) => this.emitConversationSkills(threadId, 'action'),\n emitHistoryReplaced: (threadId) => this.emitHistoryReplaced(threadId, 'fork', 'action'),\n emitSummaryUpserted: (summary) => this.emitSummaryUpserted(summary, 'created', 'action'),\n getState: () => this.state,\n hydrateOriginalImages: (threadId, path) => this.conversations.hydrateOriginalImages(threadId, path),\n hydrateCompleteHistory: (threadId) => this.conversations.hydrateCompleteHistory(threadId),\n patch: (patch) => this.patch(patch),\n rememberHostOptions: (threadId, hostOptions) => (\n this.lifecycle.rememberHostOptions(threadId, hostOptions)\n ),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n },\n this.originalImages,\n );\n this.connection = new CodexSurfaceConnectionController(\n this.client,\n options,\n this.authentication,\n this.approvals,\n this.catalog,\n this.clientRequests,\n this.conversations,\n this.items,\n this.lifecycle,\n this.runtimeState,\n {\n clearConversationHandles: () => this.conversationHandles.clear(),\n clearPendingForThread: (threadId, reason, eventReason) => (\n this.clearPendingForThread(threadId, reason, eventReason)\n ),\n closed: () => this.closed,\n emitAuthenticationChanged: (authentication, origin) => this.emitEvent(origin, {\n type: 'authentication.changed',\n payload: { authentication: structuredClone(authentication) },\n }),\n emitSurfaceStatus: (origin) => this.emitSurfaceStatus(origin),\n getSnapshot: () => this.getSnapshot(),\n getState: () => this.state,\n patch: (patch) => this.patch(patch),\n },\n );\n this.notifications = new CodexSurfaceNotificationsController(\n this.authentication,\n this.approvals,\n this.catalog,\n this.clientRequests,\n this.conversations,\n this.items,\n {\n clearPendingForThread: (threadId, reason, eventReason) => (\n this.clearPendingForThread(threadId, reason, eventReason)\n ),\n createRuntime: (threadId, patch) => this.createRuntime(threadId, patch),\n emitConversationActivity: (threadId, origin) => this.emitConversationActivity(threadId, origin),\n emitConversationPermissions: (threadId, origin) => this.emitConversationPermissions(threadId, origin),\n emitConversationSettings: (threadId, origin) => this.emitConversationSettings(threadId, origin),\n emitConversationSkills: (threadId, origin) => this.emitConversationSkills(threadId, origin),\n emitEvent: (origin, input) => this.emitEvent(origin, input),\n emitSummaryUpserted: (summary, reason, origin) => this.emitSummaryUpserted(summary, reason, origin),\n getState: () => this.state,\n markRuntimeTurnActive: (runtime, turnId) => this.markRuntimeTurnActive(runtime, turnId),\n patch: (patch) => this.patch(patch),\n patchConversationStatus: (threadId, status, origin) => this.patchConversationStatus(threadId, status, origin),\n patchConversationTurnCount: (threadId, count) => this.patchConversationTurnCount(threadId, count),\n patchRuntime: (threadId, patch) => this.patchRuntime(threadId, patch),\n removeThread: (threadId, reason) => this.removeThread(threadId, reason),\n requireRuntime: (threadId) => this.requireRuntime(threadId),\n runtime: (threadId) => this.runtimeState.get(threadId),\n runtimes: () => this.runtimeState.values(),\n sendNextQueuedPrompt: (threadId) => { void this.messagesController.sendNextQueuedPrompt(threadId); },\n snapshotForRuntime: (runtime) => this.snapshotForRuntime(runtime),\n unknownNotification: (notification) => this.handleUnknownNotification(notification),\n },\n );\n this.textGeneration = new CodexSurfaceTextGenerationController(\n this.client,\n options.cwd,\n {\n ensureConnected: () => this.ensureConnected(),\n getSnapshot: () => this.getSnapshot(),\n },\n );\n this.unsubscribeNotification = this.client.onNotification((notification) => {\n if (notification.method === 'account/updated' || notification.method === 'account/login/completed') {\n this.accountGeneration += 1;\n this.clearUsage();\n }\n if (!this.textGeneration.handleNotification(notification)) this.notifications.handle(notification);\n });\n this.unsubscribeDisconnect = this.client.onDisconnect((error) => {\n this.accountGeneration += 1;\n this.clearUsage();\n this.textGeneration.close(error);\n this.connection.handleDisconnect(error);\n });\n this.unsubscribeToolInputRequests = this.client.onServerRequest(\n 'item/tool/requestUserInput',\n (request, responder) => this.clientRequests.handleToolInputRequest(request, responder),\n );\n this.unsubscribeMcpElicitationRequests = this.client.onServerRequest(\n 'mcpServer/elicitation/request',\n (request, responder) => this.clientRequests.handleMcpElicitationRequest(request, responder),\n );\n this.client.onServerRequest('item/tool/call', async (request, responder) => {\n await this.extensions.handleDynamicToolCall(request, responder);\n });\n this.client.onServerRequest('account/chatgptAuthTokens/refresh', (_request, responder) => {\n responder.reject({ code: -32601, message: 'ChatGPT token refresh must be provided by the host application' });\n });\n this.client.onServerRequest('attestation/generate', (_request, responder) => {\n responder.reject({ code: -32601, message: 'Client attestation must be provided by the host application' });\n });\n this.client.onServerRequest('currentTime/read', (_request, responder) => {\n responder.resolve({ currentTimeAt: Math.floor(Date.now() / 1000) });\n });\n }\n\n connect(): Promise<CodexSurfaceSnapshot> {\n return this.connection.connect();\n }\n\n /** Runs one non-persisted Codex turn without changing visible surface state. */\n generateText(prompt: string, options: GenerateCodexTextOptions = {}): Promise<CodexGeneratedText> {\n return this.textGeneration.generate(prompt, options);\n }\n\n async refreshAccount(): Promise<CodexSurfaceSnapshot> {\n this.accountGeneration += 1;\n return this.connection.refreshAccount();\n }\n\n /** Reads fresh account limits; errors leave the last successful snapshot intact. */\n async readRateLimits(options?: ReadCodexRateLimitsOptions): Promise<CodexSurfaceRateLimits> {\n return this.requestForAccount(() => this.client.request('account/rateLimits/read', options), response => {\n const rateLimits = surfaceRateLimits(response);\n this.patch({ rateLimits });\n this.emitEvent('action', { type: 'rateLimits.changed', payload: { rateLimits: structuredClone(rateLimits) } });\n return structuredClone(rateLimits);\n });\n }\n\n /** Account-wide, on-demand usage; never collects thread estimates or changes surface state. */\n async readAccountUsage(): Promise<CodexSurfaceAccountUsage> {\n return this.requestForAccount(() => this.client.request('account/usage/read', {}), surfaceAccountUsage);\n }\n\n /** One explicit reset attempt; never retries or infers refreshed limits. */\n async consumeRateLimitResetCredit(options: ConsumeCodexRateLimitResetCreditOptions): Promise<CodexSurfaceRateLimitResetCreditResult> {\n if (!options || typeof options.idempotencyKey !== 'string' || !options.idempotencyKey.trim()\n || (options.creditId !== undefined && (typeof options.creditId !== 'string' || !options.creditId.trim()))) {\n throw new TypeError('Reset-credit options require non-empty identifiers');\n }\n const params = { idempotencyKey: options.idempotencyKey,\n ...(options.creditId === undefined ? {} : { creditId: options.creditId }) };\n return this.requestForAccount(() => this.client.request('account/rateLimitResetCredit/consume', params), result => {\n switch (result?.outcome) {\n case 'reset': case 'alreadyRedeemed': case 'nothingToReset': case 'noCredit':\n return { outcome: result.outcome };\n default: throw new Error('Invalid reset-credit outcome');\n }\n });\n }\n\n async startChatGptLogin(): Promise<CodexSurfaceChatGptLogin> {\n this.accountGeneration += 1;\n return this.connection.startChatGptLogin();\n }\n\n async startChatGptDeviceCodeLogin(): Promise<CodexSurfaceChatGptDeviceCodeLogin> {\n this.accountGeneration += 1;\n return this.connection.startChatGptDeviceCodeLogin();\n }\n\n /** Reads the app-server's current remote-control connection state. */\n async readRemoteControlStatus(): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.readRemoteControlStatus();\n }\n\n /** Enables the app-server's official remote-control connection. */\n async enableRemoteControl(\n options: v2.RemoteControlEnableParams = {},\n ): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.enableRemoteControl(options);\n }\n\n /** Disables the app-server's official remote-control connection. */\n async disableRemoteControl(\n options: v2.RemoteControlDisableParams = {},\n ): Promise<CodexSurfaceRemoteControlStatus> {\n return this.connection.disableRemoteControl(options);\n }\n\n /** Starts a one-time remote-control pairing flow. Treat the returned code as opaque. */\n async startRemoteControlPairing(\n options: v2.RemoteControlPairingStartParams = {},\n ): Promise<CodexSurfaceRemoteControlPairing> {\n return this.connection.startRemoteControlPairing(options);\n }\n\n /** Checks whether a remote-control pairing code has been claimed. */\n async readRemoteControlPairingStatus(\n options: v2.RemoteControlPairingStatusParams = {},\n ): Promise<CodexSurfaceRemoteControlPairingStatus> {\n return this.connection.readRemoteControlPairingStatus(options);\n }\n\n /** Lists devices paired with a remote-control environment. */\n async listRemoteControlClients(\n options: v2.RemoteControlClientsListParams,\n ): Promise<CodexSurfaceRemoteControlClientPage> {\n return this.connection.listRemoteControlClients(options);\n }\n\n /** Revokes one device from a remote-control environment. */\n async revokeRemoteControlClient(\n options: v2.RemoteControlClientsRevokeParams,\n ): Promise<v2.RemoteControlClientsRevokeResponse> {\n return this.connection.revokeRemoteControlClient(options);\n }\n\n /** Reads managed app-server requirements, including allowRemoteControl. */\n async readConfigRequirements(): Promise<CodexSurfaceConfigRequirements | null> {\n return this.connection.readConfigRequirements();\n }\n\n async cancelLogin(loginId = this.state.authentication.login.loginId ?? ''): Promise<CodexSurfaceSnapshot> {\n return this.connection.cancelLogin(loginId);\n }\n\n async logout(): Promise<CodexSurfaceSnapshot> {\n this.accountGeneration += 1;\n return this.connection.logout();\n }\n\n\n async refreshConversations(): Promise<CodexSurfaceSnapshot> {\n return this.conversations.refresh();\n }\n\n async listConversations(options: ListCodexConversationsOptions = {}): Promise<CodexConversationSummary[]> {\n return this.conversations.list(options);\n }\n\n /** Reads one conversation's metadata without loading its turns or runtime. */\n async readConversationSummary(conversationId: string): Promise<CodexConversationSummary> {\n return this.conversations.readSummary(conversationId);\n }\n\n async archiveConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.archive(conversationId);\n }\n\n async deleteConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.delete(conversationId);\n }\n\n async unarchiveConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.conversations.unarchive(conversationId);\n }\n\n async listModels(options: ListCodexModelsOptions = {}): Promise<CodexSurfaceModel[]> {\n return this.catalog.listModels(options);\n }\n\n async listSkills(options: ListCodexSkillsOptions = {}): Promise<CodexSurfaceSkill[]> {\n return this.catalog.listSkills(options);\n }\n\n async createConversation(\n options: CreateCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n return this.lifecycle.create(options, hostOptions);\n }\n\n /** Forks the latest completed source conversation without selecting the new conversation. */\n async forkConversation(\n sourceConversationId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexConversationForkResult> {\n const sourceThreadId = normalizedConversationId(sourceConversationId);\n await this.ensureThreadReady(sourceThreadId);\n const inheritedHostOptions = this.lifecycle.hostOptions(sourceThreadId) ?? {};\n const conversationId = await this.forks.fork(sourceThreadId, options, {\n ...inheritedHostOptions,\n ...hostOptions,\n });\n return this.conversationForkResult(conversationId);\n }\n\n /** Forks after a completed turn without selecting the new conversation. */\n async forkConversationAtTurn(\n sourceConversationId: string,\n turnId: string,\n options: ForkCodexConversationOptions = {},\n hostOptions: CodexConversationHostOptions = {},\n ): Promise<CodexConversationForkResult> {\n const sourceThreadId = normalizedConversationId(sourceConversationId);\n await this.ensureThreadReady(sourceThreadId);\n const inheritedHostOptions = this.lifecycle.hostOptions(sourceThreadId) ?? {};\n const conversationId = await this.forks.forkTurn(sourceThreadId, turnId, options, {\n ...inheritedHostOptions,\n ...hostOptions,\n });\n return this.conversationForkResult(conversationId);\n }\n\n async selectConversation(conversationId: string): Promise<CodexSurfaceSnapshot> {\n return this.lifecycle.select(conversationId);\n }\n\n /**\n * Releases one conversation from this surface's in-memory state without\n * changing the corresponding app-server thread. The summary remains in the\n * conversation catalog; `conversation(id).load()` or `readHistory()` can\n * hydrate it again later.\n */\n forgetConversation(conversationId: string): void {\n const threadId = normalizedConversationId(conversationId);\n const wasActive = this.state.activeConversationId === threadId;\n this.runtimeState.forget(threadId);\n this.lifecycle.forget(threadId);\n this.originalImages?.forget(threadId);\n this.conversations.forget(threadId);\n this.items.forget(threadId);\n this.conversationHandles.delete(threadId);\n this.conversationListeners.delete(threadId);\n if (!wasActive) return;\n this.patch({\n activeConversationId: null,\n activeTurnId: null,\n turns: [],\n messages: [],\n answeredClientRequestIds: [],\n approvals: [],\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n historyState: {\n loadingStrategy: 'lazy',\n hasOlder: false,\n loadingOlder: false,\n fullyLoaded: false,\n },\n error: null,\n });\n }\n\n /** Main-process content reader. Every read is bound to the current runtime. */\n async readConversationContent(conversationId: string, contentId: string, offset: number) {\n if (!/^[a-f0-9]{64}$/.test(contentId) || !Number.isSafeInteger(offset) || offset < 0) throw new Error('Invalid conversation content request.');\n const runtime = this.runtimeState.get(conversationId);\n if (!runtime?.hydrated || this.closed) throw new Error('Conversation content is no longer available.');\n const reference = `conversation-image:${encodeURIComponent(conversationId)}:${contentId}`;\n const owns = () => !this.closed && this.runtimeState.get(conversationId) === runtime && runtime.messages.some(m => m.parts.some(p => p.type === 'media' && p.media.url === reference));\n if (this.originalImages && owns()) {\n const result = await this.originalImages.read(conversationId, contentId, offset);\n if (!owns()) throw new Error('Conversation content is no longer available.');\n return result;\n }\n return new ConversationContentTransport(conversationId).read({ messages: runtime.messages }, contentId, offset);\n }\n\n async readConversationHistory(conversationId = this.state.activeConversationId ?? ''): Promise<CodexConversationHistory> {\n return this.lifecycle.readHistory(conversationId);\n }\n\n /** Reads a bounded user-only prompt list without hydrating conversation history. */\n async readConversationPromptHistory(\n conversationId = this.state.activeConversationId ?? '',\n ) {\n await this.ensureConnected();\n return readPromptHistory(this.client, conversationId);\n }\n\n async loadTurnHistory(turnId: string, conversationId = this.state.activeConversationId ?? ''): Promise<CodexConversationSnapshot> {\n await this.ensureThreadReady(conversationId);\n await this.conversations.loadTurnHistory(conversationId, turnId);\n return this.getConversationSnapshot(conversationId);\n }\n\n async loadOlderConversationHistory(\n conversationId = this.state.activeConversationId ?? '',\n ): Promise<CodexConversationHistoryPage> {\n return this.conversations.loadOlderHistory(normalizedConversationId(conversationId));\n }\n\n async renameConversation(title: string): Promise<CodexSurfaceSnapshot> {\n const threadId = this.state.activeConversationId;\n if (!threadId) throw new Error('There is no active conversation');\n await this.conversationSettings.rename(threadId, title);\n return this.getSnapshot();\n }\n\n async updateConversationSettings(settings: UpdateCodexConversationSettings): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.update(settings);\n }\n\n async setGoal(objective: string, tokenBudget?: number | null): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.setGoal(objective, tokenBudget);\n }\n\n async clearGoal(): Promise<CodexSurfaceSnapshot> {\n return this.conversationSettings.clearGoal();\n }\n\n async sendMessage(prompt: string, options: SendCodexMessageOptions = {}): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.send(prompt, options);\n }\n\n async continueInterruptedTurn(): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.continueInterruptedTurn();\n }\n\n async compactConversation(): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.compact();\n }\n\n async startReview(options: StartCodexReviewOptions = {}): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.startReview(options);\n }\n\n async steerMessage(\n prompt: string,\n options: SendCodexMessageOptions = {},\n ): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.steer(prompt, options);\n }\n\n async interrupt(): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.interrupt();\n }\n\n async deleteTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.deleteTurn(turnId);\n }\n\n async editTurn(turnId: string, content: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.editTurn(turnId, content, options);\n }\n\n async retryTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n return this.turnActions.retryTurn(turnId);\n }\n\n /** Forks after an active-conversation turn and selects the new conversation. */\n async forkTurn(turnId: string): Promise<CodexSurfaceSnapshot> {\n const conversationId = this.state.activeConversationId;\n if (!conversationId) throw new Error('There is no active conversation');\n const result = await this.forkConversationAtTurn(conversationId, turnId);\n return result.conversation.select();\n }\n\n async deleteQueuedPrompt(promptId: string): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.deleteQueuedPrompt(promptId);\n }\n\n async updateQueuedPrompt(promptId: string, prompt: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.updateQueuedPrompt(promptId, prompt, options);\n }\n\n async steerQueuedPrompt(promptId: string, prompt?: string, options?: SendCodexMessageOptions): Promise<CodexSurfaceSnapshot> {\n return this.messagesController.steerQueuedPrompt(promptId, prompt, options);\n }\n\n async respondToClientRequest(response: CodexSurfaceClientRequestResponse): Promise<CodexSurfaceSnapshot> {\n await this.clientRequests.respond(undefined, response);\n return this.getSnapshot();\n }\n\n async resolveApproval(\n approvalId: string,\n decision: CodexSurfaceApprovalDecision,\n scope: CodexSurfaceApprovalScope = 'once',\n ): Promise<CodexSurfaceSnapshot> {\n await this.approvals.resolve(undefined, approvalId, decision, scope);\n return this.getSnapshot();\n }\n\n conversation(conversationId: string): CodexConversation {\n const id = normalizedConversationId(conversationId);\n const existing = this.conversationHandles.get(id);\n if (existing) return existing;\n const handle = createCodexConversationHandle(id, {\n clearGoal: () => this.conversationSettings.clearGoalForThread(id),\n compact: () => this.turnActions.compactForThread(id),\n continueInterruptedTurn: () => this.messagesController.continueInterruptedTurnForThread(id),\n deleteTurn: (turnId) => this.turnActions.deleteTurnForThread(id, turnId),\n deleteQueuedPrompt: (promptId) => this.messagesController.deleteQueuedPromptForThread(id, promptId),\n updateQueuedPrompt: (promptId, prompt, options) => this.messagesController.updateQueuedPromptForThread(id, promptId, prompt, options),\n editTurn: (turnId, content, options) => this.turnActions.editTurnForThread(id, turnId, content, options),\n fork: (options, hostOptions) => this.forkConversation(id, options, hostOptions),\n forkTurn: (turnId, options, hostOptions) => (\n this.forkConversationAtTurn(id, turnId, options, hostOptions)\n ),\n getSnapshot: () => this.getConversationSnapshot(id),\n interrupt: () => this.turnActions.interruptThread(id),\n load: async (options) => { await this.ensureThreadReady(id, options); },\n loadOlderHistory: () => this.loadOlderConversationHistory(id),\n loadTurnHistory: async (turnId) => { await this.loadTurnHistory(turnId, id); },\n onEvent: (listener) => this.onConversationEvent(id, listener),\n onStateChange: (listener) => this.onConversationStateChange(id, listener),\n readHistory: () => this.readConversationHistory(id),\n readContent: (contentId, offset) => this.readConversationContent(id, contentId, offset),\n readPromptHistory: () => this.readConversationPromptHistory(id),\n rename: (title) => this.conversationSettings.rename(id, title),\n resolveApproval: (approvalId, decision, scope = 'once') => (\n this.approvals.resolve(id, approvalId, decision, scope)\n ),\n respondToClientRequest: (response) => this.clientRequests.respond(id, response),\n retryTurn: (turnId) => this.turnActions.retryTurnForThread(id, turnId),\n select: async () => { await this.selectConversation(id); },\n sendMessage: (prompt, options) => this.messagesController.sendToThread(id, prompt, options),\n setGoal: (objective, tokenBudget) => this.conversationSettings.setGoalForThread(id, objective, tokenBudget),\n startRealtime: (options) => this.startRealtimeForThread(id, options),\n startReview: (options) => this.turnActions.startReviewForThread(id, options),\n steerMessage: (prompt, options) => this.messagesController.steerForThread(id, prompt, options),\n steerQueuedPrompt: (promptId, prompt, options) => this.messagesController.steerQueuedPromptForThread(id, promptId, prompt, options),\n updateSettings: (settings) => this.conversationSettings.updateForThread(id, settings),\n });\n this.conversationHandles.set(id, handle);\n return handle;\n }\n\n async startLiveChat(\n conversationId: string,\n options: StartCodexLiveChatOptions,\n ): Promise<{ sdp: string }> {\n const { sdp, ...settings } = options;\n const session = await this.startRealtimeForThread(conversationId, {\n ...settings,\n version: settings.version ?? 'v3',\n outputModality: 'audio',\n transport: { type: 'webrtc', sdp },\n });\n return { sdp: session.remoteSdp! };\n }\n\n async stopLiveChat(conversationId: string): Promise<void> {\n await this.client.request('thread/realtime/stop', { threadId: conversationId });\n }\n\n private startRealtimeForThread(\n threadId: string,\n options: StartCodexRealtimeOptions,\n ): Promise<CodexRealtimeSession> {\n return startCodexRealtimeSession({\n client: this.client,\n ensureThreadReady: async () => { await this.ensureThreadReady(threadId); },\n onConversationEvent: (listener) => this.onConversationEvent(threadId, listener),\n options,\n threadId,\n });\n }\n\n private conversationForkResult(conversationId: string): CodexConversationForkResult {\n const conversation = this.conversation(conversationId);\n return {\n conversationId,\n conversation,\n snapshot: conversation.getSnapshot(),\n };\n }\n\n getConversationSnapshot(conversationId: string): CodexConversationSnapshot {\n const runtime = this.requireRuntime(conversationId);\n return structuredClone({\n ...this.state,\n activeConversationId: conversationId,\n ...this.runtimeProjection(runtime),\n activeTurnId: runtime.activeTurnId,\n turnIds: runtime.turnIds,\n });\n }\n\n onConversationStateChange(conversationId: string, listener: ConversationStateListener): () => void {\n const listeners = this.conversationListeners.get(conversationId) ?? new Set<ConversationStateListener>();\n listeners.add(listener);\n this.conversationListeners.set(conversationId, listeners);\n return () => {\n listeners.delete(listener);\n if (listeners.size === 0) this.conversationListeners.delete(conversationId);\n };\n }\n\n onConversationEvent(conversationId: string, listener: ConversationEventListener): () => void {\n return this.onEvent((event) => {\n if ('conversationId' in event && event.conversationId === conversationId) {\n listener(event as CodexConversationEvent);\n }\n });\n }\n\n getSnapshot(): CodexSurfaceSnapshot {\n return structuredClone(this.state);\n }\n\n onStateChange(listener: StateListener): () => void {\n this.listeners.add(listener);\n return () => this.listeners.delete(listener);\n }\n\n /** Returns the current snapshot with the version that the next state patch continues from. */\n getVersionedSnapshot(): CodexVersionedSurfaceSnapshot {\n return { version: this.stateVersion, snapshot: this.getSnapshot() };\n }\n\n /**\n * Streams structural state patches. Each patch carries only changed values\n * and list items, so its size tracks what changed rather than conversation\n * length. Start from `getVersionedSnapshot()` and apply patches in order.\n */\n onStatePatch(listener: StatePatchListener): () => void {\n this.patchListeners.add(listener);\n return () => this.patchListeners.delete(listener);\n }\n\n onEvent(listener: SurfaceEventListener): () => void {\n this.eventListeners.add(listener);\n return () => this.eventListeners.delete(listener);\n }\n\n async close(): Promise<void> {\n if (this.closed) return;\n this.closed = true;\n this.originalImages?.clear();\n this.clearUsage();\n this.unsubscribeNotification();\n this.unsubscribeToolInputRequests();\n this.unsubscribeMcpElicitationRequests();\n this.unsubscribeDisconnect();\n this.approvals.close();\n this.clientRequests.clear();\n this.items.reset();\n this.catalog.reset(false);\n this.textGeneration.close();\n for (const runtime of this.runtimeState.values()) {\n runtime.activeTurnId = null;\n runtime.busy = false;\n runtime.turnStartPending = false;\n }\n await this.client.close();\n this.patch({\n status: 'idle',\n activeTurnId: null,\n busy: false,\n approvals: [],\n clientRequests: [],\n historyLoading: false,\n });\n this.emitSurfaceStatus('lifecycle');\n }\n\n private async ensureConnected(): Promise<void> {\n return this.connection.ensureConnected();\n }\n\n private async ensureThreadReady(\n threadId: string,\n loadOptions: CodexConversationLoadOptions = {},\n ): Promise<ThreadRuntimeState> {\n return this.lifecycle.ensureReady(threadId, loadOptions);\n }\n\n private createRuntime(threadId: string, patch: ThreadRuntimePatch = {}): ThreadRuntimeState {\n const runtime = this.runtimeState.create(threadId, patch);\n if (patch.messages) this.scheduleMarkdownImageHydration(threadId, patch.messages);\n return runtime;\n }\n\n private requireRuntime(threadId: string): ThreadRuntimeState {\n return this.runtimeState.require(threadId);\n }\n\n private runtimeProjection(\n runtime: ThreadRuntimeState,\n ): ReturnType<CodexSurfaceRuntimeController['projection']> {\n return this.runtimeState.projection(runtime);\n }\n\n private snapshotForRuntime(runtime: ThreadRuntimeState): CodexSurfaceSnapshot {\n return this.runtimeState.snapshot(runtime);\n }\n\n private activateRuntime(runtime: ThreadRuntimeState): void {\n this.runtimeState.activate(runtime);\n }\n\n private patchRuntime(threadId: string, patch: ThreadRuntimePatch): void {\n this.runtimeState.patch(threadId, patch);\n if (patch.messages) this.scheduleMarkdownImageHydration(threadId, patch.messages);\n }\n\n private scheduleMarkdownImageHydration(\n threadId: string,\n messages: readonly SurfaceMessage[],\n ): void {\n const cwd = this.runtimeState.get(threadId)?.cwd;\n for (const message of messages) {\n if (message.role !== 'assistant' || message.status === 'streaming') continue;\n message.parts.forEach((part, partIndex) => {\n if (part.type !== 'text' || !part.text.includes('![')) return;\n const key = `${threadId}\\u0000${message.id}\\u0000${part.itemId ?? partIndex}\\u0000${part.text}`;\n if (this.pendingMarkdownImageHydrations.has(key)) return;\n this.pendingMarkdownImageHydrations.add(key);\n void this.markdownImages.hydrate(part.text, cwd).then(async (hydratedText) => {\n if (this.closed || hydratedText === part.text) return;\n const runtime = this.runtimeState.get(threadId);\n if (!runtime) return;\n const messageIndex = runtime.messages.findIndex((candidate) => candidate.id === message.id);\n const currentMessage = runtime.messages[messageIndex];\n if (!currentMessage) return;\n const currentPart = currentMessage.parts[partIndex];\n if (currentPart?.type !== 'text' || currentPart.text !== part.text) return;\n const nextParts = [...currentMessage.parts];\n nextParts.splice(partIndex, 1, { ...currentPart, text: hydratedText });\n const hydratedMessage = { ...currentMessage, parts: nextParts };\n const nextMessages = [...runtime.messages];\n nextMessages.splice(messageIndex, 1, hydratedMessage);\n this.runtimeState.patch(threadId, { messages: nextMessages });\n\n await this.conversations.waitForHistoryEmission(threadId);\n if (this.closed) return;\n const currentRuntime = this.runtimeState.get(threadId);\n const publishedMessage = currentRuntime?.messages.find((candidate) => candidate.id === message.id);\n if (!publishedMessage) return;\n const publishedPart = publishedMessage.parts[partIndex];\n if (publishedPart?.type !== 'text' || publishedPart.text !== hydratedText) return;\n if (publishedMessage.turnId) this.emitEvent('lifecycle', {\n type: 'message.updated',\n conversationId: threadId,\n turnId: publishedMessage.turnId,\n payload: { message: structuredClone(publishedMessage) },\n });\n }).finally(() => this.pendingMarkdownImageHydrations.delete(key));\n });\n }\n }\n\n private emitSurfaceStatus(origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitSurfaceStatus(origin);\n }\n\n private emitSummaryUpserted(\n summary: CodexConversationSummary,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.summaryUpserted' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitSummaryUpserted(summary, reason, origin);\n }\n\n private emitConversationActivity(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationActivity(threadId, origin);\n }\n\n private emitConversationSettings(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationSettings(threadId, origin);\n }\n\n private emitConversationSkills(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationSkills(threadId, origin);\n }\n\n private emitConversationPermissions(threadId: string, origin: CodexSurfaceEventOrigin): void {\n this.runtimeState.emitConversationPermissions(threadId, origin);\n }\n\n private emitHistoryReplaced(\n threadId: string,\n reason: Extract<CodexSurfaceEvent, { type: 'conversation.historyReplaced' }>['payload']['reason'],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitHistoryReplaced(threadId, reason, origin);\n }\n\n private emitHistoryPrepended(\n threadId: string,\n messages: readonly SurfaceMessage[],\n origin: CodexSurfaceEventOrigin,\n ): void {\n this.runtimeState.emitHistoryPrepended(threadId, messages, origin);\n }\n\n private messageContainingTool(threadId: string, turnId: string, itemId: string): SurfaceMessage | null {\n return this.runtimeState.messageContainingTool(threadId, turnId, itemId);\n }\n\n private assistantMessageForTurn(threadId: string, turnId: string): SurfaceMessage | null {\n return this.runtimeState.assistantMessageForTurn(threadId, turnId);\n }\n\n private notifyConversationListeners(threadId: string): void {\n const listeners = this.conversationListeners.get(threadId);\n if (!listeners) return;\n const snapshot = this.getConversationSnapshot(threadId);\n notifyListeners(listeners, snapshot, this.options.onListenerError);\n }\n\n private markRuntimeTurnActive(runtime: ThreadRuntimeState, turnId: string): void {\n this.runtimeState.markTurnActive(runtime, turnId);\n }\n\n private patchConversationStatus(\n threadId: string,\n status: CodexConversationSummary['status'],\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n this.runtimeState.patchConversationStatus(threadId, status, origin);\n }\n\n private patchConversationTurnCount(\n threadId: string,\n turnCount: number,\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n this.runtimeState.patchConversationTurnCount(threadId, turnCount, origin);\n }\n\n private clearPendingForThread(\n threadId: string,\n reason: string,\n eventReason: 'conversation_closed' | 'conversation_removed' | 'surface_disconnected',\n ): void {\n this.approvals.clearForThread(threadId, eventReason);\n this.clientRequests.clearForThread(threadId, reason, eventReason);\n }\n\n private removeThread(\n threadId: string,\n reason: 'archived' | 'deleted',\n origin: CodexSurfaceEventOrigin = 'notification',\n ): void {\n const known = this.state.conversations.some((conversation) => conversation.id === threadId)\n || this.runtimeState.get(threadId) !== undefined\n || this.approvals.hasForThread(threadId)\n || this.clientRequests.hasForThread(threadId);\n if (!known) return;\n this.clearPendingForThread(threadId, 'Codex thread is no longer available', 'conversation_removed');\n this.runtimeState.forget(threadId);\n this.lifecycle.forget(threadId);\n this.originalImages?.forget(threadId);\n this.conversations.forget(threadId);\n this.conversationHandles.delete(threadId);\n const conversations = this.state.conversations.filter((conversation) => conversation.id !== threadId);\n if (this.state.activeConversationId !== threadId) {\n this.patch({ conversations });\n this.emitEvent(origin, {\n type: 'conversation.summaryRemoved',\n conversationId: threadId,\n payload: { reason },\n });\n return;\n }\n this.patch({\n conversations,\n activeConversationId: null,\n messages: [],\n answeredClientRequestIds: [],\n approvals: [],\n contextUsage: null,\n goal: null,\n turnGitDiff: null,\n threadStatus: null,\n queuedPrompts: [],\n busy: false,\n historyLoading: false,\n error: null,\n });\n this.emitEvent(origin, {\n type: 'conversation.summaryRemoved',\n conversationId: threadId,\n payload: { reason },\n });\n this.emitEvent(origin, {\n type: 'conversation.selected',\n payload: { conversationId: null },\n });\n }\n\n\n private handleUnknownNotification(notification: ServerNotification): void {\n const runtimeNotification = notification as unknown as { method: string; params?: unknown };\n this.options.onUnknownNotification?.({\n method: runtimeNotification.method,\n ...('params' in runtimeNotification ? { params: runtimeNotification.params } : {}),\n });\n }\n\n\n private async requestForAccount<Response, Result>(\n request: () => Promise<Response>, project: (response: Response) => Result,\n ): Promise<Result> {\n await this.ensureConnected();\n await this.authentication.pendingRefresh();\n const generation = this.accountGeneration;\n const identity = surfaceAuthenticationIdentityKey(this.state.authentication);\n const result = await request();\n if (this.closed || generation !== this.accountGeneration\n || identity !== surfaceAuthenticationIdentityKey(this.state.authentication)) {\n throw new Error('Account changed during account operation');\n }\n return project(result);\n }\n\n private emitEvent(origin: CodexSurfaceEventOrigin, input: SurfaceEventInput, recovered = false): void {\n if (input.type === 'conversation.historyReplaced' && input.payload.reason !== 'details' && input.payload.reason !== 'images') {\n this.originalUsage?.forget(input.conversationId);\n }\n input = this.usage.observe(origin, input);\n if (input.type === 'turn.started' && origin !== 'lifecycle') {\n const runtime = this.runtimeState.get(input.conversationId);\n const turnId = input.turnId;\n const startedAt = input.payload.startedAt;\n if (runtime?.turns.some(turn => turn.id === turnId && turn.startedAt === null)) {\n this.patchRuntime(input.conversationId, {\n turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, startedAt } : turn),\n });\n }\n }\n if (input.type === 'conversation.executionUsageChanged' || input.type === 'turn.completed') {\n const runtime = this.runtimeState.get(input.conversationId);\n const executionUsage = input.type === 'turn.completed' ? input.payload.executionUsage : input.payload.usage;\n const turnId = input.turnId;\n if (runtime?.turns.some(turn => turn.id === turnId)) {\n this.patchRuntime(input.conversationId, {\n turns: runtime.turns.map(turn => turn.id === turnId ? { ...turn, executionUsage: structuredClone(executionUsage) } : turn),\n });\n }\n }\n const event = {\n ...input,\n seq: ++this.eventSequence,\n occurredAt: new Date().toISOString(),\n origin,\n } as CodexSurfaceEvent;\n notifyListeners(this.eventListeners, event, this.options.onListenerError);\n if (!recovered && (input.type === 'conversation.executionUsageChanged' || input.type === 'turn.completed' || input.type === 'context.compactionCompleted')) {\n void this.refreshOriginalUsage(input.conversationId, input.turnId);\n }\n }\n\n private clearUsage(): void {\n this.usage.clear();\n this.originalUsage?.clear();\n }\n\n private async refreshOriginalUsage(conversationId: string, turnId: string): Promise<void> {\n if (!this.originalUsage || this.closed) return;\n const key = `${conversationId}\\0${turnId}`;\n const pending = this.usageRefreshes.get(key);\n if (pending) { pending.again = true; return; }\n const work = { again: true };\n const generation = this.accountGeneration;\n this.usageRefreshes.set(key, work);\n try {\n while (work.again && !this.closed && generation === this.accountGeneration) {\n work.again = false;\n try {\n const records = await this.originalUsage.read(conversationId);\n if (this.closed || generation !== this.accountGeneration) return;\n const record = records.find(value => value.turnId === turnId);\n if (!record) continue;\n const usage = this.usage.recover(conversationId, turnId, record);\n if (usage) this.emitEvent('action', { type: 'conversation.executionUsageChanged', conversationId, turnId, payload: { usage } }, true);\n } catch { /* Optional native evidence never interrupts execution or invents a measurement. */ }\n }\n } finally { this.usageRefreshes.delete(key); }\n }\n\n private patch(patch: Partial<CodexSurfaceSnapshot>, conversationId?: string): void {\n const previous = this.state;\n this.state = { ...this.state, ...patch };\n const changes = diffCodexSurfaceState(previous, this.state);\n if (changes.length > 0) {\n this.stateVersion += 1;\n if (this.patchListeners.size > 0) {\n const statePatch = structuredClone({ version: this.stateVersion, changes });\n notifyListeners(this.patchListeners, statePatch, this.options.onListenerError);\n }\n }\n if (this.listeners.size > 0) {\n const snapshot = this.getSnapshot();\n notifyListeners(this.listeners, snapshot, this.options.onListenerError);\n }\n if (conversationId) {\n this.notifyConversationListeners(conversationId);\n return;\n }\n for (const subscribedConversationId of this.conversationListeners.keys()) {\n this.notifyConversationListeners(subscribedConversationId);\n }\n }\n}\n\nexport function createCodexSurface(options: CodexSurfaceOptions = {}): CodexSurface {\n return new CodexSurface(options);\n}\n","export type CodexAppBackendTtlCacheEvictionContext = {\n readonly id: string;\n readonly lastActivityAt: number;\n readonly now: number;\n readonly idleForMs: number;\n};\n\nexport type CodexAppBackendTtlCacheRecord<Value> = {\n readonly value: Value;\n readonly lastActivityAt: number;\n};\n\nexport type CodexAppBackendTtlTimer = {\n unref?: () => void;\n};\n\nexport type CodexAppBackendTtlCacheScheduler = {\n set(callback: () => void, delayMs: number): CodexAppBackendTtlTimer;\n clear(timer: CodexAppBackendTtlTimer): void;\n};\n\nexport type CodexAppBackendTtlCacheOptions<Value> = {\n /** Time without a newer activity touch before an entry becomes eligible. */\n ttlMs: number;\n /** Enables periodic sweeps. Omit it to use manual `sweep()` calls only. */\n sweepIntervalMs?: number | null;\n identity: (value: Value) => string;\n canEvict: (value: Value, context: CodexAppBackendTtlCacheEvictionContext) => boolean | Promise<boolean>;\n onEvict: (value: Value, context: CodexAppBackendTtlCacheEvictionContext) => void | Promise<void>;\n now?: () => number;\n scheduler?: CodexAppBackendTtlCacheScheduler;\n onEvictionError?: (\n error: unknown,\n value: Value,\n context: CodexAppBackendTtlCacheEvictionContext,\n ) => void | Promise<void>;\n};\n\ntype TtlCacheRecord<Value> = {\n value: Value;\n lastActivityAt: number;\n};\n\nconst defaultScheduler: CodexAppBackendTtlCacheScheduler = {\n set(callback, delayMs) {\n return setTimeout(callback, delayMs) as unknown as CodexAppBackendTtlTimer;\n },\n clear(timer) {\n clearTimeout(timer as unknown as ReturnType<typeof setTimeout>);\n },\n};\n\n/**\n * Host-owned cache metadata with an optional, unref'd periodic eviction loop.\n * The cache never decides whether an entry is safe to remove; `canEvict` and\n * `onEvict` remain application-owned policies and storage operations.\n */\nexport class CodexAppBackendTtlCache<Value> {\n private readonly records = new Map<string, TtlCacheRecord<Value>>();\n private readonly now: () => number;\n private readonly scheduler: CodexAppBackendTtlCacheScheduler;\n private readonly sweepIntervalMs: number | null;\n private timer: CodexAppBackendTtlTimer | null = null;\n private activeSweep: Promise<readonly string[]> | null = null;\n private closePromise: Promise<void> | null = null;\n private closed = false;\n\n constructor(private readonly options: CodexAppBackendTtlCacheOptions<Value>) {\n if (!Number.isFinite(options.ttlMs) || options.ttlMs <= 0) {\n throw new Error('Codex backend cache ttlMs must be greater than zero');\n }\n if (options.sweepIntervalMs !== undefined && options.sweepIntervalMs !== null\n && (!Number.isFinite(options.sweepIntervalMs) || options.sweepIntervalMs <= 0)) {\n throw new Error('Codex backend cache sweepIntervalMs must be greater than zero');\n }\n this.now = options.now ?? Date.now;\n this.scheduler = options.scheduler ?? defaultScheduler;\n this.sweepIntervalMs = options.sweepIntervalMs ?? null;\n }\n\n get size(): number {\n return this.records.size;\n }\n\n set(value: Value, activityAt = this.now()): string {\n this.assertOpen();\n const id = this.requireIdentity(value);\n const previous = this.records.get(id);\n this.records.set(id, {\n value,\n lastActivityAt: previous ? Math.max(previous.lastActivityAt, activityAt) : activityAt,\n });\n this.schedule();\n return id;\n }\n\n get(id: string): Value | undefined {\n return this.records.get(id)?.value;\n }\n\n getRecord(id: string): CodexAppBackendTtlCacheRecord<Value> | undefined {\n const record = this.records.get(id);\n return record\n ? { value: record.value, lastActivityAt: record.lastActivityAt }\n : undefined;\n }\n\n touch(id: string, activityAt = this.now()): boolean {\n this.assertOpen();\n const record = this.records.get(id);\n if (!record) return false;\n record.lastActivityAt = Math.max(record.lastActivityAt, activityAt);\n return true;\n }\n\n delete(id: string): boolean {\n this.assertOpen();\n const deleted = this.records.delete(id);\n if (this.records.size === 0) this.clearTimer();\n return deleted;\n }\n\n async sweep(): Promise<readonly string[]> {\n if (this.closed) return [];\n if (this.activeSweep) return this.activeSweep;\n const sweep = this.evictExpired();\n this.activeSweep = sweep;\n try {\n return await sweep;\n } finally {\n this.activeSweep = null;\n this.schedule();\n }\n }\n\n async close(): Promise<void> {\n if (!this.closePromise) {\n this.closed = true;\n this.clearTimer();\n this.closePromise = Promise.resolve(this.activeSweep).then(() => undefined);\n }\n await this.closePromise;\n }\n\n private async evictExpired(): Promise<readonly string[]> {\n const now = this.now();\n const evicted: string[] = [];\n for (const [id, record] of [...this.records.entries()]) {\n const idleForMs = now - record.lastActivityAt;\n if (idleForMs < this.options.ttlMs) continue;\n const context: CodexAppBackendTtlCacheEvictionContext = {\n id,\n lastActivityAt: record.lastActivityAt,\n now,\n idleForMs,\n };\n let safeToEvict: boolean;\n try {\n safeToEvict = await this.options.canEvict(record.value, context);\n } catch (error) {\n await this.reportEvictionError(error, record.value, context);\n continue;\n }\n if (!safeToEvict || this.records.get(id) !== record) continue;\n try {\n await this.options.onEvict(record.value, context);\n } catch (error) {\n await this.reportEvictionError(error, record.value, context);\n continue;\n }\n if (this.records.get(id) === record) {\n this.records.delete(id);\n evicted.push(id);\n }\n }\n return evicted;\n }\n\n private schedule(): void {\n if (this.closed || this.timer || this.records.size === 0 || this.sweepIntervalMs === null) return;\n this.timer = this.scheduler.set(() => {\n this.timer = null;\n void this.sweep();\n }, this.sweepIntervalMs);\n this.timer.unref?.();\n }\n\n private clearTimer(): void {\n if (!this.timer) return;\n this.scheduler.clear(this.timer);\n this.timer = null;\n }\n\n private async reportEvictionError(\n error: unknown,\n value: Value,\n context: CodexAppBackendTtlCacheEvictionContext,\n ): Promise<void> {\n const onEvictionError = this.options.onEvictionError;\n if (!onEvictionError) return;\n try {\n await onEvictionError(error, value, context);\n } catch {\n // Error reporting must not strand the periodic eviction loop.\n }\n }\n\n private requireIdentity(value: Value): string {\n const id = this.options.identity(value);\n if (!id.trim()) throw new Error('Codex backend cache identities cannot be empty');\n return id;\n }\n\n private assertOpen(): void {\n if (this.closed) throw new Error('Codex backend cache is closed');\n }\n}\n","import { CodexSurface } from './codex-surface';\nimport {\n CodexAppBackendTtlCache,\n type CodexAppBackendTtlCacheOptions,\n} from './codex-app-backend-cache';\nimport type { CodexSurfaceOptions } from './codex-surface-contracts';\n\nexport type CodexAppBackendModuleContext = {\n surface: CodexSurface;\n closeBackend(): Promise<void>;\n createTtlCache<Value>(options: CodexAppBackendTtlCacheOptions<Value>): CodexAppBackendTtlCache<Value>;\n};\n\nexport type CodexAppBackendModule<Service = unknown> = {\n id: string;\n create(context: CodexAppBackendModuleContext): Service;\n};\n\nexport type CodexAppBackendOptions = {\n modules?: readonly CodexAppBackendModule[];\n surface?: CodexSurface;\n surfaceOptions?: CodexSurfaceOptions;\n};\n\n/**\n * Composable, in-process backend host for Codex applications.\n *\n * The SDK owns the product-neutral Codex runtime while modules own application\n * services such as agents, teams, or work integrations. Transport and process\n * ownership stay with the embedding application.\n */\nexport class CodexAppBackend {\n readonly surface: CodexSurface;\n private readonly moduleServices = new Map<string, unknown>();\n private readonly ttlCaches = new Set<{ close(): Promise<void> }>();\n private closePromise: Promise<void> | null = null;\n\n constructor(options: CodexAppBackendOptions = {}) {\n if (options.surface && options.surfaceOptions) {\n throw new Error('Provide either surface or surfaceOptions, not both');\n }\n const modules = (options.modules ?? []).map((module) => ({ id: module.id.trim(), module }));\n const moduleIds = new Set<string>();\n for (const { id } of modules) {\n if (!id) throw new Error('Codex backend module IDs cannot be empty');\n if (moduleIds.has(id)) throw new Error(`Duplicate Codex backend module '${id}'`);\n moduleIds.add(id);\n }\n this.surface = options.surface ?? new CodexSurface(options.surfaceOptions);\n for (const { id, module } of modules) {\n this.moduleServices.set(id, module.create({\n surface: this.surface,\n closeBackend: () => this.close(),\n createTtlCache: (cacheOptions) => this.createTtlCache(cacheOptions),\n }));\n }\n }\n\n module<Service>(id: string): Service {\n const normalizedId = id.trim();\n if (!this.moduleServices.has(normalizedId)) throw new Error(`Unknown Codex backend module '${normalizedId}'`);\n return this.moduleServices.get(normalizedId) as Service;\n }\n\n createTtlCache<Value>(options: CodexAppBackendTtlCacheOptions<Value>): CodexAppBackendTtlCache<Value> {\n if (this.closePromise) throw new Error('Cannot create a cache after the Codex backend is closed');\n const cache = new CodexAppBackendTtlCache(options);\n this.ttlCaches.add(cache);\n return cache;\n }\n\n close(): Promise<void> {\n this.closePromise ??= this.closeResources();\n return this.closePromise;\n }\n\n private async closeResources(): Promise<void> {\n await Promise.all([...this.ttlCaches].map((cache) => cache.close()));\n await this.surface.close();\n }\n}\n\nexport function createCodexAppBackend(options: CodexAppBackendOptions = {}): CodexAppBackend {\n return new CodexAppBackend(options);\n}\n","import { spawn as nodeSpawn } from 'node:child_process';\nimport { existsSync as nodeExistsSync } from 'node:fs';\nimport { promises as nodeFs } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport os from 'node:os';\nimport path from 'node:path';\n\nexport type AppleSpeechTranscriptionOptions = {\n locale?: string;\n live?: boolean;\n};\n\nexport type AppleSpeechTranscriptionResult = {\n text: string;\n error?: string;\n};\n\nexport type AppleSpeechAssetDiscoveryDependencies = {\n cwd?: () => string;\n env?: NodeJS.ProcessEnv;\n existsSync?: (filePath: string) => boolean;\n moduleUrl?: string | null;\n packageResolve?: ((specifier: string) => string) | null;\n resourcesPath?: string | null;\n};\n\ntype AppleSpeechFs = {\n chmod(filePath: string, mode: number): Promise<void>;\n copyFile(sourcePath: string, destinationPath: string): Promise<void>;\n mkdtemp(prefix: string): Promise<string>;\n readFile(filePath: string, encoding: BufferEncoding): Promise<string>;\n rm(filePath: string, options: { recursive: boolean; force: boolean }): Promise<void>;\n writeFile(filePath: string, data: Buffer): Promise<void>;\n};\n\ntype AppleSpeechChild = {\n stderr?: {\n on(event: 'data', listener: (chunk: Buffer | string) => void): unknown;\n };\n on(event: 'error', listener: (error: Error) => void): unknown;\n on(event: 'exit', listener: (code: number | null) => void): unknown;\n};\n\ntype AppleSpeechSpawn = (command: string, args: string[]) => AppleSpeechChild;\n\ntype AppleSpeechTranscriptionDeps = {\n assetsPath?: string;\n fs?: AppleSpeechFs;\n spawn?: AppleSpeechSpawn;\n tmpdir?: () => string;\n};\n\nexport async function transcribeWithAppleSpeechAnalyzer(\n audioData: Buffer,\n options: AppleSpeechTranscriptionOptions = {},\n deps: AppleSpeechTranscriptionDeps = {},\n): Promise<AppleSpeechTranscriptionResult> {\n const fs = deps.fs ?? nodeFs;\n const spawn = deps.spawn ?? nodeSpawn;\n const tmpdir = deps.tmpdir ?? os.tmpdir;\n const tempDir = await fs.mkdtemp(path.join(tmpdir(), 'codex-app-sdk-apple-stt-'));\n const inputPath = path.join(tempDir, 'input.wav');\n const outputPath = path.join(tempDir, 'output.txt');\n\n try {\n const bundledCliPath = resolveAppleSpeechAnalyzerPath(deps.assetsPath);\n const cliPath = await executableAppleSpeechPath(bundledCliPath, tempDir, fs);\n await fs.writeFile(inputPath, audioData);\n await runAppleSpeechCli(spawn, cliPath, buildAppleSpeechArgs(inputPath, outputPath, options));\n const text = await fs.readFile(outputPath, 'utf8');\n\n return { text: text.trim() };\n } catch (error) {\n return {\n text: '',\n error: error instanceof Error ? error.message : String(error),\n };\n } finally {\n await fs.rm(tempDir, { recursive: true, force: true });\n }\n}\n\nexport function resolveAppleSpeechAnalyzerPath(\n assetsPath?: string,\n dependencies: AppleSpeechAssetDiscoveryDependencies = {},\n): string {\n return path.join(assetsPath ?? defaultAssetsPath(dependencies), 'apple-speechanalyzer-cli');\n}\n\nfunction buildAppleSpeechArgs(\n inputPath: string,\n outputPath: string,\n options: AppleSpeechTranscriptionOptions,\n): string[] {\n const args = [\n '--input-audio-path',\n inputPath,\n '--output-txt-path',\n outputPath,\n ];\n\n const locale = options.locale?.trim();\n if (locale) {\n args.push('--locale', locale);\n }\n\n if (options.live) {\n args.push('--live');\n }\n\n return args;\n}\n\nfunction runAppleSpeechCli(\n spawn: AppleSpeechSpawn,\n cliPath: string,\n args: string[],\n): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(cliPath, args);\n let stderr = '';\n\n child.stderr?.on('data', (chunk: Buffer | string) => {\n stderr += chunk.toString();\n });\n\n child.on('error', (error: Error) => {\n reject(new Error(`Failed to spawn Apple speech CLI: ${error.message}`));\n });\n\n child.on('exit', (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n\n reject(new Error(`Apple speech CLI exited with code ${code}: ${stderr.trim()}`));\n });\n });\n}\n\nfunction defaultAssetsPath(dependencies: AppleSpeechAssetDiscoveryDependencies): string {\n const configuredAssetsPath = (dependencies.env ?? process.env).CODEX_APP_SDK_ASSETS_PATH?.trim();\n if (configuredAssetsPath) {\n return configuredAssetsPath;\n }\n\n const processResourcesPath = (process as NodeJS.Process & { resourcesPath?: string }).resourcesPath;\n const resourcesPath = dependencies.resourcesPath === undefined\n ? processResourcesPath\n : dependencies.resourcesPath ?? undefined;\n const existsSync = dependencies.existsSync ?? nodeExistsSync;\n if (resourcesPath && !resourcesPath.endsWith('.vite/build')) {\n const resourceCandidates = [\n resourcesPath,\n path.join(resourcesPath, 'assets'),\n path.join(resourcesPath, 'app.asar.unpacked/node_modules/@codex-app-sdk/backend/assets'),\n path.join(resourcesPath, 'app.asar/node_modules/@codex-app-sdk/backend/assets'),\n path.join(resourcesPath, 'app.asar.unpacked/node_modules/codex-app-sdk/assets'),\n path.join(resourcesPath, 'app.asar/node_modules/codex-app-sdk/assets'),\n ];\n const match = resourceCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n ));\n if (match) return match;\n }\n\n const defaultPackageResolver = import.meta.resolve;\n const packageResolver = dependencies.packageResolve === undefined\n ? defaultPackageResolver\n : dependencies.packageResolve ?? undefined;\n if (packageResolver) {\n try {\n const packageNodeEntry = fileURLToPath(packageResolver('@codex-app-sdk/backend'));\n const packageAssetsPath = path.resolve(path.dirname(packageNodeEntry), '../assets');\n if (existsSync(path.join(packageAssetsPath, 'apple-speechanalyzer-cli'))) {\n return packageAssetsPath;\n }\n } catch {\n // Source checkouts fall through to module-relative candidates.\n }\n }\n\n const cwd = (dependencies.cwd ?? process.cwd)();\n const cwdCandidates = [\n path.resolve(cwd, 'node_modules/@codex-app-sdk/backend/assets'),\n path.resolve(cwd, '../node_modules/@codex-app-sdk/backend/assets'),\n path.resolve(cwd, 'node_modules/codex-app-sdk/assets'),\n path.resolve(cwd, '../node_modules/codex-app-sdk/assets'),\n path.resolve(cwd, '../codex-app-sdk/assets'),\n ];\n const cwdMatch = cwdCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n ));\n if (cwdMatch) return cwdMatch;\n\n const defaultModuleUrl = import.meta.url;\n const moduleUrl = dependencies.moduleUrl === undefined\n ? defaultModuleUrl\n : dependencies.moduleUrl ?? undefined;\n const moduleDirectory = moduleUrl\n ? path.dirname(fileURLToPath(moduleUrl))\n : cwd;\n const moduleCandidates = [\n path.resolve(moduleDirectory, '../assets'),\n path.resolve(moduleDirectory, '../../assets'),\n ];\n return moduleCandidates.find((candidate) => (\n existsSync(path.join(candidate, 'apple-speechanalyzer-cli'))\n )) ?? moduleCandidates[0]!;\n}\n\nasync function executableAppleSpeechPath(\n sourcePath: string,\n tempDir: string,\n fs: AppleSpeechFs,\n): Promise<string> {\n const executablePath = path.join(tempDir, 'apple-speechanalyzer-cli');\n await fs.copyFile(sourcePath, executablePath);\n await fs.chmod(executablePath, 0o700);\n return executablePath;\n}\n","import { spawn, type ChildProcessWithoutNullStreams } from 'node:child_process';\nimport { mkdtemp, copyFile, chmod, rm } from 'node:fs/promises';\nimport { tmpdir } from 'node:os';\nimport path from 'node:path';\nimport { StringDecoder } from 'node:string_decoder';\nimport type { CodexSpeechSessionEvent, CodexSpeechSessionOptions, CodexSpeechTranscriptionResult } from '@codex-app-sdk/core/native';\nimport { resolveAppleSpeechAnalyzerPath } from './apple-speech-transcription';\n\nexport type AppleSpeechSession = {\n append(audio: ArrayBuffer): Promise<void>;\n stop(): Promise<CodexSpeechTranscriptionResult>;\n cancel(): Promise<void>;\n};\n\nexport async function startAppleSpeechSession(\n options: CodexSpeechSessionOptions,\n onEvent: (event: CodexSpeechSessionEvent) => void,\n dependencies: { assetsPath?: string; signal?: AbortSignal; spawn?: (command: string, args: string[]) => ChildProcessWithoutNullStreams } = {},\n): Promise<AppleSpeechSession> {\n dependencies.signal?.throwIfAborted();\n if (!Number.isInteger(options.sampleRate) || options.sampleRate < 8000 || options.sampleRate > 96000) {\n throw new Error('Unsupported speech sample rate.');\n }\n const temp = await mkdtemp(path.join(tmpdir(), 'codex-sdk-live-speech-'));\n let child: ChildProcessWithoutNullStreams;\n try {\n const executable = path.join(temp, 'apple-speechanalyzer-cli');\n await copyFile(resolveAppleSpeechAnalyzerPath(dependencies.assetsPath), executable);\n await chmod(executable, 0o700);\n dependencies.signal?.throwIfAborted();\n child = (dependencies.spawn ?? spawn)(executable, ['--stream', '--sample-rate', String(options.sampleRate),\n ...(options.locale ? ['--locale', options.locale] : [])]);\n } catch (error) {\n await rm(temp, { recursive: true, force: true });\n throw error;\n }\n let closed = false;\n let stopping = false;\n let result: CodexSpeechTranscriptionResult | undefined;\n let line = '';\n const decoder = new StringDecoder('utf8');\n let stderr = '';\n let readyResolve!: () => void;\n let readyReject!: (error: Error) => void;\n const ready = new Promise<void>((resolve, reject) => { readyResolve = resolve; readyReject = reject; });\n let resolveDone!: (result: CodexSpeechTranscriptionResult) => void;\n const done = new Promise<CodexSpeechTranscriptionResult>((resolve) => { resolveDone = resolve; });\n let timeout = setTimeout(() => fail('Speech recognition took too long to start.'), 120_000);\n const finish = async () => {\n if (closed) return;\n closed = true;\n clearTimeout(timeout);\n dependencies.signal?.removeEventListener('abort', abort);\n const final = result ?? { text: '', error: stderr.trim() || 'Speech helper stopped without a final transcript.' };\n readyReject(new Error(final.error ?? 'Speech session closed.'));\n try { await rm(temp, { recursive: true, force: true }); }\n finally { resolveDone(final); }\n };\n function fail(message: string): void {\n if (closed || result?.error) return;\n result = { text: '', error: message };\n readyReject(new Error(message));\n publish({ type: 'error', sessionId: options.sessionId, error: message });\n child.kill('SIGKILL');\n void finish();\n }\n function publish(event: CodexSpeechSessionEvent): void {\n try { onEvent(event); } catch { /* A disconnected consumer cannot prevent process cleanup. */ }\n }\n function abort(): void {\n if (closed) return;\n result = { text: '', error: 'Speech recording cancelled.' };\n child.kill('SIGKILL');\n void finish();\n }\n dependencies.signal?.addEventListener('abort', abort, { once: true });\n child.stderr.on('data', (chunk: Buffer) => { stderr = (stderr + chunk.toString()).slice(-4096); });\n child.on('error', (error) => fail(error.message));\n child.stdin.on('error', (error) => fail(error.message));\n child.on('close', (code) => {\n if (code !== 0 && !result?.error) {\n fail(stderr.trim() || `Speech helper exited with code ${code}.`);\n }\n void finish();\n });\n child.stdout.on('data', (chunk: Buffer) => {\n if (closed) return;\n line += decoder.write(chunk);\n if (line.length > 1024 * 1024) { fail('Speech helper result exceeds the size limit.'); return; }\n let index: number;\n while ((index = line.indexOf('\\n')) >= 0 && !closed) {\n const input = line.slice(0, index);\n line = line.slice(index + 1);\n try {\n const event = JSON.parse(input);\n if (event.type === 'ready') { clearTimeout(timeout); readyResolve(); }\n else if (event.type === 'transcript' && typeof event.finalText === 'string' && typeof event.partialText === 'string') {\n publish({ type: 'transcript', sessionId: options.sessionId, finalText: event.finalText, partialText: event.partialText });\n } else if (event.type === 'done' && typeof event.text === 'string') result = { text: event.text };\n else if (event.type === 'error' && typeof event.message === 'string') fail(event.message);\n else fail('Invalid speech helper event.');\n } catch { fail('Invalid speech helper output.'); }\n }\n });\n if (dependencies.signal?.aborted) abort();\n await ready;\n return {\n append: (audio) => new Promise<void>((resolve, reject) => {\n if (closed || stopping) { reject(new Error('Speech session is no longer recording.')); return; }\n if (audio.byteLength % 4 || audio.byteLength > 256 * 1024) { reject(new Error('Invalid PCM audio chunk.')); return; }\n child.stdin.write(Buffer.from(audio), (error) => error ? reject(error) : resolve());\n }),\n stop: () => {\n if (!closed && !stopping) {\n stopping = true;\n timeout = setTimeout(() => fail('Speech recognition took too long to finalize.'), 30_000);\n child.stdin.end();\n }\n return done;\n },\n cancel: async () => {\n if (!closed) {\n result = { text: '', error: 'Speech recording cancelled.' };\n child.kill('SIGKILL');\n await finish();\n }\n },\n };\n}\n"],"x_google_ignoreList":[9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33],"mappings":"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"}
|