@codex-native/sdk 0.0.13 → 0.0.18

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/cli.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../src/cli/index.ts","../package.json","../src/cli/config.ts","../src/cli/run.ts","../src/nativeBinding.ts","../src/events/convert.ts","../src/cli/optionParsers.ts","../src/cli/hooks.ts","../src/cli/elevatedDefaults.ts","../src/lsp/bridge.ts","../src/lsp/manager.ts","../src/lsp/servers.ts","../src/lsp/client.ts","../src/lsp/format.ts","../src/lsp/hooks.ts","../src/cli/lspBridge.ts","../src/cli/tui.ts","../src/exec.ts","../src/thread.ts","../src/outputSchemaFile.ts","../src/tui.ts","../src/skills.ts","../src/reviewOptions.ts","../src/codex.ts","../src/cli/reverie.ts","../src/cli/runtime.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath } from \"node:url\";\n\nimport packageJson from \"../../package.json\";\nimport { loadCliConfig } from \"./config\";\nimport { executeRunCommand } from \"./run\";\nimport { executeTuiCommand } from \"./tui\";\nimport { executeReverieCommand } from \"./reverie\";\nimport { runApplyPatch } from \"../nativeBinding\";\nimport type {\n CliContext,\n ConfigLoaderOptions,\n GlobalOptions,\n RunCommandOptions,\n TuiCommandOptions,\n CommandName,\n} from \"./types\";\nimport { applyNativeRegistrations, buildCombinedConfig } from \"./runtime\";\n\nconst VERSION = packageJson.version;\nconst SANDBOX_CHOICES = [\"read-only\", \"workspace-write\", \"danger-full-access\"] as const;\nconst APPROVAL_CHOICES = [\"never\", \"on-request\", \"on-failure\", \"untrusted\"] as const;\nconst APPLY_PATCH_FLAG = \"--codex-run-as-apply-patch\";\nconst CLI_ENTRYPOINT_ENV = \"CODEX_NODE_CLI_ENTRYPOINT\";\n\ntry {\n const entrypoint = fileURLToPath(import.meta.url);\n process.env[CLI_ENTRYPOINT_ENV] = entrypoint;\n} catch {\n if (process.argv[1]) {\n process.env[CLI_ENTRYPOINT_ENV] = process.argv[1];\n }\n}\n\nconst GLOBAL_OPTION_DEFS = {\n config: { type: \"string\" } as const,\n \"no-config\": { type: \"boolean\" } as const,\n plugin: { type: \"string\", multiple: true } as const,\n};\n\nconst RUN_OPTION_DEFS = {\n model: { type: \"string\" } as const,\n oss: { type: \"boolean\" } as const,\n sandbox: { type: \"string\" } as const,\n approval: { type: \"string\" } as const,\n schema: { type: \"string\" } as const,\n \"thread-id\": { type: \"string\" } as const,\n \"base-url\": { type: \"string\" } as const,\n \"api-key\": { type: \"string\" } as const,\n \"linux-sandbox-path\": { type: \"string\" } as const,\n \"full-auto\": { type: \"boolean\" } as const,\n \"skip-git-repo-check\": { type: \"boolean\" } as const,\n cd: { type: \"string\" } as const,\n image: { type: \"string\", multiple: true } as const,\n \"review-mode\": { type: \"boolean\" } as const,\n \"review-hint\": { type: \"string\" } as const,\n};\n\nconst TUI_OPTION_DEFS = {\n model: { type: \"string\" } as const,\n oss: { type: \"boolean\" } as const,\n sandbox: { type: \"string\" } as const,\n approval: { type: \"string\" } as const,\n resume: { type: \"string\" } as const,\n \"resume-last\": { type: \"boolean\" } as const,\n \"resume-picker\": { type: \"boolean\" } as const,\n \"full-auto\": { type: \"boolean\" } as const,\n \"dangerously-bypass-approvals-and-sandbox\": { type: \"boolean\" } as const,\n cd: { type: \"string\" } as const,\n \"config-profile\": { type: \"string\" } as const,\n \"config-overrides\": { type: \"string\", multiple: true } as const,\n \"add-dir\": { type: \"string\", multiple: true } as const,\n image: { type: \"string\", multiple: true } as const,\n \"web-search\": { type: \"boolean\" } as const,\n \"linux-sandbox-path\": { type: \"string\" } as const,\n \"base-url\": { type: \"string\" } as const,\n \"api-key\": { type: \"string\" } as const,\n};\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n if (maybeHandleApplyPatch(rawArgs)) {\n return;\n }\n\n if (hasFlag(rawArgs, \"--version\") || hasFlag(rawArgs, \"-v\")) {\n printVersion();\n return;\n }\n\n const generalHelpRequested = hasFlag(rawArgs, \"--help\") || hasFlag(rawArgs, \"-h\");\n\n if (generalHelpRequested && !hasExplicitCommand(rawArgs)) {\n printGeneralHelp();\n return;\n }\n\n const { command, args } = selectCommand(rawArgs);\n\n if (hasCommandHelpFlag(args)) {\n printCommandHelp(command);\n return;\n }\n\n if (command === \"reverie-index\") {\n await executeReverieCommand(args);\n return;\n }\n\n const options = command === \"tui\" ? parseTuiCommand(args) : parseRunCommand(args);\n\n validateOptionChoices(command, options);\n\n const context = await createContext(options);\n\n if (command === \"tui\") {\n await executeTuiCommand(options as TuiCommandOptions, context);\n } else {\n await executeRunCommand(options as RunCommandOptions, context);\n }\n}\n\nfunction maybeHandleApplyPatch(args: string[]): boolean {\n if (args.length === 0 || args[0] !== APPLY_PATCH_FLAG) {\n return false;\n }\n\n const patch = args[1];\n if (!patch) {\n console.error(`${APPLY_PATCH_FLAG} requires a patch argument.`);\n process.exitCode = 1;\n return true;\n }\n\n try {\n runApplyPatch(patch);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`apply_patch failed: ${message}`);\n process.exitCode = 1;\n }\n return true;\n}\n\nfunction selectCommand(argv: string[]): { command: CommandName; args: string[] } {\n // Handle explicit \"tui\" and \"run\" subcommands\n if (argv.length > 0) {\n const [first, ...rest] = argv;\n if (first === \"tui\") {\n return { command: \"tui\", args: rest };\n }\n if (first === \"run\") {\n return { command: \"run\", args: rest };\n }\n if (first === \"reverie\") {\n if (rest.length === 0) {\n return { command: \"reverie-index\", args: [] };\n }\n return { command: \"reverie-index\", args: rest };\n }\n // Unrecognized first arg: treat as prompt\n }\n\n // Default behavior when no arguments: start TUI only when a TTY is available\n // This matches codex-rs behavior for interactive shells; headless users can rely on\n // the run command without needing additional flags\n if (argv.length === 0) {\n const isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n return { command: isInteractive ? \"tui\" : \"run\", args: [] };\n }\n\n // Non-empty argv without explicit command: treat as prompt\n // Smart default based on whether we're in an interactive terminal\n const isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n return { command: isInteractive ? \"tui\" : \"run\", args: argv };\n}\n\nfunction hasExplicitCommand(argv: string[]): boolean {\n if (argv.length === 0) {\n return false;\n }\n const first = argv[0];\n return first === \"tui\" || first === \"run\" || first === \"reverie\";\n}\n\nfunction parseRunCommand(args: string[]): RunCommandOptions {\n const { values, positionals } = parseArgs({\n args,\n options: { ...GLOBAL_OPTION_DEFS, ...RUN_OPTION_DEFS },\n allowPositionals: true,\n strict: true,\n });\n const options = camelCaseKeys(values);\n const runOptions: RunCommandOptions = {\n ...(options as RunCommandOptions),\n };\n if (!runOptions.prompt && positionals.length > 0) {\n runOptions.prompt = positionals[0];\n }\n return runOptions;\n}\n\nfunction parseTuiCommand(args: string[]): TuiCommandOptions {\n const { values, positionals } = parseArgs({\n args,\n options: { ...GLOBAL_OPTION_DEFS, ...TUI_OPTION_DEFS },\n allowPositionals: true,\n strict: true,\n });\n const options = camelCaseKeys(values);\n const tuiOptions: TuiCommandOptions = {\n ...(options as TuiCommandOptions),\n };\n if (!tuiOptions.prompt && positionals.length > 0) {\n tuiOptions.prompt = positionals[0];\n }\n return tuiOptions;\n}\n\nasync function createContext(options: GlobalOptions): Promise<CliContext> {\n const cwd = process.cwd();\n const configOptions: ConfigLoaderOptions = {\n cwd,\n explicitConfigPath: options.config,\n noConfig: options.noConfig,\n pluginPaths: normalizeStringArray(options.plugin),\n };\n const config = await loadCliConfig(configOptions);\n const combinedConfig = await buildCombinedConfig({ cwd, config });\n applyNativeRegistrations(combinedConfig);\n return { cwd, config, combinedConfig };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item));\n }\n if (typeof value === \"string\") {\n return [value];\n }\n return [];\n}\n\nfunction camelCaseKeys(record: Record<string, unknown>): Record<string, unknown> {\n return Object.entries(record).reduce<Record<string, unknown>>((acc, [key, value]) => {\n acc[toCamelCase(key)] = value;\n return acc;\n }, {});\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction hasCommandHelpFlag(args: string[]): boolean {\n return hasFlag(args, \"--help\") || hasFlag(args, \"-h\");\n}\n\nfunction printVersion(): void {\n console.log(VERSION);\n}\n\nfunction printGeneralHelp(): void {\n console.log(`codex-native v${VERSION}\n\nUsage:\n codex-native [options] [prompt]\n codex-native run [options] [prompt]\n codex-native tui [options] [prompt]\n\nDefault behavior:\n Running 'codex-native' without arguments launches the interactive TUI.\n Use 'codex-native run <prompt>' for non-interactive exec mode.\n\nCommands:\n (default) Launch the interactive TUI (with optional initial prompt)\n run Run Codex in non-interactive exec mode\n tui Explicitly launch the interactive TUI\n reverie index Pre-compute reverie embeddings for the current repo\n\nGlobal options:\n --config <path> Path to codex.config.js (or similar)\n --no-config Skip automatic config discovery\n --plugin <path> Additional plugin module (repeatable)\n\nRun options:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --schema <file> Path to final-output JSON schema\n --thread-id <id> Resume an existing thread\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --full-auto Enable workspace-write auto approvals\n --skip-git-repo-check Skip git repository validation\n --cd <path> Working directory for the run\n --image <path> Attach an image (repeatable)\n --review-mode Enable review mode\n --review-hint <text> Hint text for review mode\n\nTUI options:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --resume <id> Resume a saved session by id\n --resume-last Resume the most recent saved session\n --resume-picker Show the resume picker on startup\n --full-auto Enable workspace-write auto approvals\n --dangerously-bypass-approvals-and-sandbox\n Disable approvals and sandboxing (unsafe)\n --cd <path> Working directory for the session\n --config-profile <name> Config profile to activate\n --config-overrides <kv> Config overrides (key=value, repeatable)\n --add-dir <path> Additional writable directory (repeatable)\n --image <path> Attach an image (repeatable)\n --web-search Enable web search tool\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n`);\n}\n\nfunction printCommandHelp(command: CommandName): void {\n if (command === \"reverie-index\") {\n console.log(`codex-native reverie index [options]\n\nOptions:\n --codex-home <path> Override CODEX_HOME (defaults to ~/.codex)\n --project-root <path> Project root for scoping + embedding cache (default: cwd)\n --limit <n> Maximum conversations to index (default: 10)\n --max-candidates <n> Scan window before filtering (default: 80)\n --batch-size <n> Batch size forwarded to FastEmbed\n --normalize Force vector normalization (default: embed config)\n --no-normalize Disable normalization\n --cache / --no-cache Override embedding cache behavior\n --embed-model <name> FastEmbed model (default: BAAI/bge-large-en-v1.5)\n --embed-cache-dir <dir> Cache directory (defaults to $CODEX_EMBED_CACHE or system tmp)\n --embed-max-length <n> Override FastEmbed max token length\n --no-progress Hide FastEmbed download progress\n --skip-embed-init Assume fastEmbedInit was already called in this process\n`);\n return;\n }\n if (command === \"tui\") {\n console.log(`codex-native tui [options] [prompt]\n\nOptions:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --resume <id> Resume a saved session by id\n --resume-last Resume the most recent saved session\n --resume-picker Show the resume picker on startup\n --full-auto Enable workspace-write auto approvals\n --dangerously-bypass-approvals-and-sandbox\n Disable approvals and sandboxing (unsafe)\n --cd <path> Working directory for the session\n --config-profile <name> Config profile to activate\n --config-overrides <kv> Config overrides (key=value, repeatable)\n --add-dir <path> Additional writable directory (repeatable)\n --image <path> Attach an image (repeatable)\n --web-search Enable web search tool\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n`);\n } else {\n console.log(`codex-native run [options] [prompt]\n\nOptions:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --schema <file> Path to final-output JSON schema\n --thread-id <id> Resume an existing thread\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --full-auto Enable workspace-write auto approvals\n --skip-git-repo-check Skip git repository validation\n --cd <path> Working directory for the run\n --image <path> Attach an image (repeatable)\n --review-mode Enable review mode\n --review-hint <text> Hint text for review mode\n`);\n }\n}\n\nfunction validateOptionChoices(\n command: CommandName,\n options: RunCommandOptions | TuiCommandOptions,\n): void {\n const sandbox = options.sandbox;\n if (sandbox && !SANDBOX_CHOICES.includes(sandbox as (typeof SANDBOX_CHOICES)[number])) {\n throw new Error(\n `Invalid sandbox mode \"${sandbox}\". Valid modes: ${SANDBOX_CHOICES.join(\", \")}.`,\n );\n }\n const approval = options.approval;\n if (approval && !APPROVAL_CHOICES.includes(approval as (typeof APPROVAL_CHOICES)[number])) {\n throw new Error(\n `Invalid approval policy \"${approval}\". Valid policies: ${APPROVAL_CHOICES.join(\", \")}.`,\n );\n }\n}\n\nfunction logError(error: unknown): void {\n if (error instanceof Error) {\n console.error(error.message);\n if (process.env.CODEX_NATIVE_DEBUG) {\n console.error(error.stack);\n }\n } else {\n console.error(String(error));\n }\n}\n\nmain().catch((error) => {\n logError(error);\n process.exitCode = 1;\n});\n","{\n \"name\": \"@codex-native/sdk\",\n \"version\": \"0.0.13\",\n \"description\": \"Native NAPI-based Codex SDK - complete standalone implementation.\",\n \"main\": \"dist/index.cjs\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"bin\": {\n \"codex-native\": \"dist/cli.cjs\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"artifacts\": \"napi artifacts\",\n \"build\": \"tsup && napi build --platform --release --output-dir dist\",\n \"build:debug\": \"tsup && napi build --platform --output-dir dist\",\n \"release\": \"node scripts/publish.mjs\",\n \"test\": \"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand\",\n \"version\": \"napi version\"\n },\n \"napi\": {\n \"binaryName\": \"codex_native\",\n \"targets\": [\n \"aarch64-apple-darwin\",\n \"x86_64-apple-darwin\",\n \"aarch64-unknown-linux-gnu\",\n \"x86_64-unknown-linux-gnu\",\n \"aarch64-unknown-linux-musl\",\n \"x86_64-unknown-linux-musl\",\n \"aarch64-pc-windows-msvc\",\n \"x86_64-pc-windows-msvc\"\n ]\n },\n \"optionalDependencies\": {\n \"@codex-native/sdk-darwin-arm64\": \"0.0.12\",\n \"@codex-native/sdk-darwin-x64\": \"0.0.12\",\n \"@codex-native/sdk-linux-arm64-gnu\": \"0.0.12\",\n \"@codex-native/sdk-linux-x64-gnu\": \"0.0.12\",\n \"@codex-native/sdk-linux-arm64-musl\": \"0.0.12\",\n \"@codex-native/sdk-linux-x64-musl\": \"0.0.12\",\n \"@codex-native/sdk-win32-arm64-msvc\": \"0.0.12\",\n \"@codex-native/sdk-win32-x64-msvc\": \"0.0.12\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.22.0\",\n \"@openai/agents\": \"^0.3.3\",\n \"@openai/agents-core\": \"^0.3.3\",\n \"@opencode-ai/sdk\": \"^1.0.164\",\n \"@toon-format/toon\": \"^1.0.0\",\n \"pyright\": \"^1.1.386\",\n \"typescript-language-server\": \"^4.3.3\",\n \"vscode-jsonrpc\": \"^8.2.1\",\n \"vscode-languageserver-types\": \"^3.17.5\"\n },\n \"devDependencies\": {\n \"@babel/core\": \"7.25.2\",\n \"@babel/preset-env\": \"7.25.4\",\n \"@babel/preset-typescript\": \"7.28.5\",\n \"@jest/globals\": \"^29.7.0\",\n \"@napi-rs/cli\": \"^3.4.1\",\n \"@openai/agents\": \"^0.3.0\",\n \"@types/jest\": \"29.5.14\",\n \"@types/node\": \"^22.0.0\",\n \"babel-jest\": \"29.7.0\",\n \"jest\": \"^29.7.0\",\n \"ts-jest\": \"^29.1.1\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.7.2\",\n \"zod\": \"^3.25.76\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type {\n CodexNativeConfig,\n ConfigLoaderOptions,\n LoadedConfigFile,\n LoadedPlugin,\n} from \"./types\";\n\nconst requireFromThisModule = createRequire(import.meta.url);\n\nconst CONFIG_CANDIDATES = [\n \"codex.config.js\",\n \"codex.config.cjs\",\n \"codex.config.mjs\",\n \"codex.config.ts\",\n \"codex.js\",\n \".codexrc.js\",\n \".codexrc.cjs\",\n \".codexrc.mjs\",\n \".codexrc.json\",\n] as const;\n\ntype ConfigDiscovery =\n | { path: string; type: \"file\" }\n | { path: string; type: \"package-json\"; field: string };\n\nexport async function loadCliConfig(options: ConfigLoaderOptions): Promise<LoadedConfigFile> {\n const warnings: string[] = [];\n\n const discovery = await resolveConfigPath(options);\n const configPath = discovery?.path ?? null;\n let config: CodexNativeConfig | null = null;\n\n if (discovery) {\n const loadResult = await loadConfig(discovery, warnings);\n config = loadResult ?? null;\n if (config && typeof config !== \"object\") {\n warnings.push(\n `Config at ${discovery.path} must export an object. Received ${typeof config}.`,\n );\n config = null;\n }\n }\n\n const plugins = await resolvePlugins({\n config,\n configPath,\n cliPluginPaths: options.pluginPaths ?? [],\n cwd: options.cwd,\n warnings,\n });\n\n return {\n configPath,\n config,\n plugins,\n warnings,\n };\n}\n\nasync function resolveConfigPath(options: ConfigLoaderOptions): Promise<ConfigDiscovery | null> {\n if (options.explicitConfigPath) {\n const explicitPath = path.resolve(options.cwd, options.explicitConfigPath);\n if (!fs.existsSync(explicitPath)) {\n throw new Error(`Config file not found at ${explicitPath}`);\n }\n return classifyPath(explicitPath);\n }\n\n if (options.noConfig) {\n return null;\n }\n\n let currentDir = path.resolve(options.cwd);\n const visited = new Set<string>();\n\n while (!visited.has(currentDir)) {\n visited.add(currentDir);\n\n for (const candidate of CONFIG_CANDIDATES) {\n const candidatePath = path.join(currentDir, candidate);\n if (fs.existsSync(candidatePath) && fs.statSync(candidatePath).isFile()) {\n return classifyPath(candidatePath);\n }\n }\n\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (fs.existsSync(packageJsonPath) && fs.statSync(packageJsonPath).isFile()) {\n const manifest = await readJson(packageJsonPath);\n if (manifest && manifest.codexNative != null) {\n return { path: packageJsonPath, type: \"package-json\", field: \"codexNative\" };\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\nasync function loadConfig(discovery: ConfigDiscovery, warnings: string[]): Promise<CodexNativeConfig | null> {\n if (discovery.type === \"package-json\") {\n const manifest = await readJson(discovery.path);\n if (!manifest) {\n warnings.push(`Failed to parse ${discovery.path}; ignoring config.`);\n return null;\n }\n const raw = manifest[discovery.field];\n if (typeof raw === \"string\") {\n const baseDir = path.dirname(discovery.path);\n const nestedPath = path.resolve(baseDir, raw);\n if (!fs.existsSync(nestedPath)) {\n throw new Error(\n `Config path \"${raw}\" referenced by ${discovery.field} in ${discovery.path} was not found.`,\n );\n }\n return loadConfig({ path: nestedPath, type: \"file\" }, warnings);\n }\n if (typeof raw === \"object\" && raw !== null) {\n return raw as CodexNativeConfig;\n }\n warnings.push(\n `The ${discovery.field} field in ${discovery.path} must be an object or path string.`,\n );\n return null;\n }\n\n const ext = path.extname(discovery.path).toLowerCase();\n if (ext === \".json\") {\n const json = await readJson(discovery.path);\n if (json === null) {\n warnings.push(`Failed to parse JSON config at ${discovery.path}`);\n }\n return json as CodexNativeConfig | null;\n }\n\n if (ext === \".js\" || ext === \".cjs\") {\n return extractModuleDefault(await loadCommonJsModule(discovery.path)) as CodexNativeConfig | null;\n }\n\n if (ext === \".mjs\") {\n return extractModuleDefault(await importModule(discovery.path)) as CodexNativeConfig | null;\n }\n\n if (ext === \".ts\") {\n return extractModuleDefault(await loadTypeScriptModule(discovery.path, warnings)) as\n | CodexNativeConfig\n | null;\n }\n\n throw new Error(`Unsupported config extension \"${ext}\" at ${discovery.path}`);\n}\n\nasync function resolvePlugins(params: {\n config: CodexNativeConfig | null;\n configPath: string | null;\n cliPluginPaths: string[];\n cwd: string;\n warnings: string[];\n}): Promise<LoadedPlugin[]> {\n const plugins: LoadedPlugin[] = [];\n const { config, configPath, cliPluginPaths, cwd, warnings } = params;\n\n const configDir = configPath ? path.dirname(configPath) : cwd;\n\n const rawConfigPlugins = (config as { plugins?: unknown })?.plugins;\n const configPlugins = Array.isArray(rawConfigPlugins) ? (rawConfigPlugins as unknown[]) : [];\n for (const spec of configPlugins) {\n if (typeof spec === \"string\") {\n const loaded = await loadPlugin(spec, configDir, \"config\", warnings);\n if (loaded) {\n plugins.push(loaded);\n }\n } else if (spec != null) {\n plugins.push({\n source: \"config\",\n spec: \"<inline>\",\n plugin: spec,\n });\n }\n }\n\n for (const spec of cliPluginPaths) {\n const loaded = await loadPlugin(spec, cwd, \"cli\", warnings);\n if (loaded) {\n plugins.push(loaded);\n }\n }\n\n return plugins;\n}\n\nasync function loadPlugin(\n spec: string,\n baseDir: string,\n source: LoadedPlugin[\"source\"],\n warnings: string[],\n): Promise<LoadedPlugin | null> {\n try {\n const resolved = resolveModule(spec, baseDir);\n const moduleExports = await loadModuleForPath(resolved);\n return {\n source,\n spec,\n resolvedPath: resolved,\n plugin: extractModuleDefault(moduleExports),\n };\n } catch (err) {\n warnings.push(`Failed to load plugin \"${spec}\": ${(err as Error).message}`);\n return null;\n }\n}\n\nasync function loadModuleForPath(modulePath: string): Promise<unknown> {\n const ext = path.extname(modulePath).toLowerCase();\n if (ext === \".cjs\") {\n return loadCommonJsModule(modulePath);\n }\n if (ext === \".mjs\") {\n return importModule(modulePath);\n }\n if (ext === \".ts\") {\n return loadTypeScriptModule(modulePath);\n }\n if (ext === \".json\") {\n return readJson(modulePath);\n }\n if (ext === \".js\") {\n try {\n return loadCommonJsModule(modulePath);\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"ERR_REQUIRE_ESM\")) {\n return importModule(modulePath);\n }\n throw err;\n }\n }\n return loadCommonJsModule(modulePath);\n}\n\nasync function loadCommonJsModule(modulePath: string): Promise<unknown> {\n return requireFromThisModule(modulePath);\n}\n\nasync function importModule(modulePath: string): Promise<unknown> {\n const href = pathToFileURL(modulePath).href;\n return import(href);\n}\n\nasync function loadTypeScriptModule(modulePath: string, warnings?: string[]): Promise<unknown> {\n try {\n const { register } = requireFromThisModule(\"tsx/cjs/api\");\n const unregister = register({ transpileOnly: true });\n try {\n return requireFromThisModule(modulePath);\n } finally {\n await maybeCall(unregister);\n }\n } catch (cjsError) {\n try {\n const tsxEsmSpecifier = \"tsx/esm/api\";\n // Use a dynamic specifier so type resolution doesn't require this module to exist at compile-time.\n const apiModule: any = await import(tsxEsmSpecifier as any);\n const unregister =\n typeof apiModule.register === \"function\"\n ? apiModule.register({ transpileOnly: true })\n : apiModule.default({ transpileOnly: true });\n try {\n return importModule(modulePath);\n } finally {\n await maybeCall(unregister);\n }\n } catch (esmError) {\n const message = [\n `Failed to load TypeScript module ${modulePath}.`,\n \"Install the \\\"tsx\\\" package or convert the config to JavaScript.\",\n ].join(\" \");\n if (warnings) {\n warnings.push(message);\n return null;\n }\n throw new Error(message);\n }\n }\n}\n\nasync function readJson(filePath: string): Promise<any> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nfunction extractModuleDefault<T>(module: T): T | unknown {\n if (module && typeof module === \"object\" && \"default\" in (module as Record<string, unknown>)) {\n const value = (module as Record<string, unknown>).default;\n if (value !== undefined) {\n return value;\n }\n }\n return module;\n}\n\nfunction resolveModule(specifier: string, baseDir: string): string {\n if (path.isAbsolute(specifier)) {\n return specifier;\n }\n return requireFromThisModule.resolve(specifier, { paths: [baseDir] });\n}\n\nfunction classifyPath(filePath: string): ConfigDiscovery {\n if (path.basename(filePath) === \"package.json\") {\n return { path: filePath, type: \"package-json\", field: \"codexNative\" };\n }\n return { path: filePath, type: \"file\" };\n}\n\nasync function maybeCall(candidate: unknown): Promise<void> {\n if (typeof candidate === \"function\") {\n await Promise.resolve(candidate());\n }\n}\n\n","import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { type NativeRunRequest, getNativeBinding } from \"../nativeBinding\";\nimport type { ThreadEvent } from \"../events\";\nimport { convertRustEventToThreadEvent } from \"../events/convert\";\nimport { parseApprovalModeFlag, parseSandboxModeFlag } from \"./optionParsers\";\nimport { emitWarnings, runBeforeStartHooks, runEventHooks } from \"./hooks\";\nimport { applyElevatedRunDefaults } from \"./elevatedDefaults\";\nimport type {\n CliContext,\n CommandName,\n RunCommandOptions,\n} from \"./types\";\nimport { createRunCommandLspBridge } from \"./lspBridge\";\n\nexport async function executeRunCommand(\n argv: RunCommandOptions,\n context: CliContext,\n): Promise<void> {\n const { combinedConfig } = context;\n emitWarnings(combinedConfig.warnings);\n const warningCount = combinedConfig.warnings.length;\n\n const prompt = await resolvePrompt(argv, combinedConfig.runDefaults.prompt, context.cwd);\n const request = await buildRunRequest({\n prompt,\n argv,\n combinedDefaults: combinedConfig.runDefaults,\n cwd: context.cwd,\n });\n\n if (!request.skipGitRepoCheck) {\n await assertTrustedDirectory(request.workingDirectory);\n }\n\n const hookContext = {\n command: \"run\" as CommandName,\n cwd: context.cwd,\n options: argv,\n };\n\n await runBeforeStartHooks(combinedConfig.beforeStartHooks, hookContext, combinedConfig.warnings);\n\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native N-API binding is not available.\");\n }\n\n const queue = new AsyncQueue<string>();\n let conversationId: string | null = null;\n const lspBridge = createRunCommandLspBridge({\n binding,\n workingDirectory: request.workingDirectory ?? context.cwd,\n initialThreadId: request.threadId,\n });\n\n const handleEvent = async (eventJson: string | null | undefined) => {\n if (!eventJson) {\n return;\n }\n process.stdout.write(eventJson);\n process.stdout.write(\"\\n\");\n\n let eventPayload: unknown = eventJson;\n try {\n eventPayload = JSON.parse(eventJson);\n } catch {\n // Leave as string if parsing fails.\n }\n\n conversationId ??= extractConversationId(eventPayload);\n const threadEvent = toThreadEvent(eventPayload);\n if (threadEvent && lspBridge) {\n lspBridge.handleEvent(threadEvent);\n }\n await runEventHooks(\n combinedConfig.onEventHooks,\n eventPayload,\n hookContext,\n combinedConfig.warnings,\n );\n };\n\n let runPromise: Promise<void> = Promise.resolve();\n runPromise = binding\n .runThreadStream(request, (err, eventJson) => {\n if (err) {\n queue.fail(err);\n return;\n }\n queue.push(eventJson ?? null);\n })\n .then(\n () => queue.end(),\n (error) => {\n queue.fail(error);\n },\n );\n\n let loopError: unknown;\n try {\n for await (const eventJson of queue) {\n try {\n await handleEvent(eventJson);\n } catch (error) {\n combinedConfig.warnings.push(\n `Event handler failed: ${(error as Error).message ?? String(error)}`,\n );\n }\n }\n await runPromise;\n } catch (error) {\n loopError = error;\n throw error;\n } finally {\n queue.end();\n if (loopError) {\n await runPromise.catch(() => {});\n }\n if (lspBridge) {\n lspBridge.dispose();\n }\n }\n\n if (conversationId) {\n process.stdout.write(`\\nTo resume, run: codex-native tui --resume ${conversationId}\\n`);\n }\n\n emitWarnings(combinedConfig.warnings, warningCount);\n}\n\nfunction toThreadEvent(payload: unknown): ThreadEvent | null {\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n try {\n return convertRustEventToThreadEvent(payload);\n } catch {\n return null;\n }\n}\n\nasync function resolvePrompt(\n argv: RunCommandOptions,\n defaultPrompt: string | undefined,\n cwd: string,\n): Promise<string> {\n if (argv.prompt && argv.prompt.trim().length > 0) {\n return argv.prompt;\n }\n if (defaultPrompt && defaultPrompt.trim().length > 0) {\n return defaultPrompt;\n }\n\n const stdinPrompt = await readPromptFromStdin();\n if (stdinPrompt && stdinPrompt.trim().length > 0) {\n return stdinPrompt;\n }\n\n if (argv.threadId) {\n // Resume runs without a prompt are permitted.\n return \"\";\n }\n\n const baseMessage = \"No prompt provided. Supply a prompt or pipe one via stdin.\";\n if (process.stdin.isTTY) {\n throw new Error(baseMessage);\n }\n throw new Error(baseMessage);\n}\n\nasync function buildRunRequest(params: {\n prompt: string;\n argv: RunCommandOptions;\n combinedDefaults: Partial<NativeRunRequest>;\n cwd: string;\n}): Promise<NativeRunRequest> {\n const { prompt, argv, combinedDefaults, cwd } = params;\n const request: NativeRunRequest = {\n ...(combinedDefaults as NativeRunRequest),\n prompt,\n };\n\n if (combinedDefaults.images) {\n request.images = [...combinedDefaults.images];\n }\n if (combinedDefaults.workspaceWriteOptions) {\n request.workspaceWriteOptions = { ...combinedDefaults.workspaceWriteOptions };\n }\n\n if (argv.model !== undefined) request.model = argv.model;\n if (argv.oss !== undefined) request.oss = argv.oss;\n const sandboxMode = parseSandboxModeFlag(argv.sandbox, \"--sandbox\");\n if (sandboxMode !== undefined) {\n request.sandboxMode = sandboxMode;\n }\n\n const approvalMode = parseApprovalModeFlag(argv.approval, \"--approval\");\n if (approvalMode !== undefined) {\n request.approvalMode = approvalMode;\n }\n if (argv.threadId !== undefined) request.threadId = argv.threadId;\n if (argv.baseUrl !== undefined) request.baseUrl = argv.baseUrl;\n if (argv.apiKey !== undefined) request.apiKey = argv.apiKey;\n if (argv.linuxSandboxPath !== undefined) request.linuxSandboxPath = argv.linuxSandboxPath;\n if (argv.fullAuto !== undefined) request.fullAuto = argv.fullAuto;\n if (argv.skipGitRepoCheck !== undefined) request.skipGitRepoCheck = argv.skipGitRepoCheck;\n if (argv.cd !== undefined) request.workingDirectory = argv.cd;\n if (argv.reviewMode !== undefined) request.reviewMode = argv.reviewMode;\n if (argv.reviewHint !== undefined) request.reviewHint = argv.reviewHint;\n\n const images = [\n ...(Array.isArray(request.images) ? request.images : []),\n ...(argv.image ?? []),\n ];\n request.images = images.length > 0 ? images : undefined;\n\n if (argv.schema) {\n request.outputSchema = await readJsonFile(argv.schema);\n }\n\n applyElevatedRunDefaults(request, cwd);\n return request;\n}\n\nasync function readJsonFile(filePath: string): Promise<unknown> {\n const absolute = path.resolve(process.cwd(), filePath);\n const data = await fsPromises.readFile(absolute, \"utf8\");\n try {\n return JSON.parse(data);\n } catch (error) {\n throw new Error(\n `Failed to parse JSON schema from ${absolute}: ${(error as Error).message ?? error}`,\n );\n }\n}\n\nasync function readPromptFromStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n return null;\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n if (chunks.length === 0) {\n return null;\n }\n return Buffer.concat(chunks).toString(\"utf8\").trimEnd();\n}\n\nfunction extractConversationId(eventPayload: unknown): string | null {\n if (!eventPayload || typeof eventPayload !== \"object\") {\n return null;\n }\n\n const record = eventPayload as Record<string, unknown>;\n\n if (typeof record.session_id === \"string\") {\n return record.session_id;\n }\n\n const sessionConfigured = record.SessionConfigured ?? record.sessionConfigured;\n if (sessionConfigured && typeof sessionConfigured === \"object\") {\n const configuredSessionId = (sessionConfigured as Record<string, unknown>).session_id;\n if (typeof configuredSessionId === \"string\") {\n return configuredSessionId;\n }\n }\n\n const nestedSession =\n typeof record.session === \"object\" && record.session\n ? (record.session as Record<string, unknown>).id\n : undefined;\n if (typeof nestedSession === \"string\") {\n return nestedSession;\n }\n\n return null;\n}\n\n\nasync function assertTrustedDirectory(workingDirectory?: string): Promise<void> {\n const directory = workingDirectory ? path.resolve(workingDirectory) : process.cwd();\n if (await findGitRoot(directory)) {\n return;\n }\n throw new Error(\n \"Not inside a trusted directory and --skip-git-repo-check was not specified.\",\n );\n}\n\nasync function findGitRoot(startDir: string): Promise<string | null> {\n let current = path.resolve(startDir);\n\n while (true) {\n const gitPath = path.join(current, \".git\");\n if (fs.existsSync(gitPath)) {\n try {\n const stats = await fsPromises.stat(gitPath);\n if (stats.isDirectory() || stats.isFile()) {\n return current;\n }\n } catch {\n // Ignore filesystem race conditions and keep searching upwards.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return null;\n}\n\nclass AsyncQueue<T> implements AsyncIterable<T> {\n private readonly buffer: T[] = [];\n private waiters: Array<{ resolve: (value: IteratorResult<T>) => void; reject: (error: unknown) => void }> = [];\n private ended = false;\n private error: unknown;\n\n push(value: T | null) {\n if (this.ended) return;\n if (value === null) {\n return;\n }\n if (this.waiters.length > 0) {\n const waiter = this.waiters.shift()!;\n waiter.resolve({ value, done: false });\n return;\n }\n this.buffer.push(value);\n }\n\n end() {\n if (this.ended) return;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.resolve({ value: undefined as never, done: true });\n }\n }\n\n fail(error: unknown) {\n if (this.ended) return;\n this.error = error;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.reject(error);\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.buffer.length > 0) {\n const value = this.buffer.shift()!;\n return { value, done: false };\n }\n if (this.error) {\n return Promise.reject(this.error);\n }\n if (this.ended) {\n return { value: undefined as never, done: true };\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n}\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ApprovalMode, SandboxMode, WorkspaceWriteOptions, ReasoningEffort, ReasoningSummary } from \"./threadOptions\";\n\nconst CLI_ENTRYPOINT_ENV = \"CODEX_NODE_CLI_ENTRYPOINT\";\n\nexport type NativeUserInputItem =\n | { type: \"text\"; text: string }\n | { type: \"local_image\"; path: string }\n | { type: \"skill_inline\"; name: string; contents: string };\n\nexport type NativeRunRequest = {\n prompt: string;\n threadId?: string;\n inputItems?: NativeUserInputItem[];\n images?: string[];\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n outputSchema?: unknown;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n /** @deprecated Use sandboxMode and approvalMode instead */\n fullAuto?: boolean;\n reviewMode?: boolean;\n reviewHint?: string;\n};\n\nexport type NativeForkRequest = {\n threadId: string;\n nthUserMessage: number;\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n fullAuto?: boolean;\n};\n\nexport type NativeConversationConfig = {\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n fullAuto?: boolean;\n};\n\nexport type NativeConversationListRequest = {\n config?: NativeConversationConfig;\n pageSize?: number;\n cursor?: string;\n modelProviders?: string[];\n};\n\nexport type NativeConversationSummary = {\n id: string;\n path: string;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type NativeConversationListPage = {\n conversations: NativeConversationSummary[];\n nextCursor?: string;\n numScannedFiles: number;\n reachedScanCap: boolean;\n};\n\nexport type NativeDeleteConversationRequest = {\n id: string;\n config?: NativeConversationConfig;\n};\n\nexport type NativeDeleteConversationResult = {\n deleted: boolean;\n};\n\nexport type NativeResumeFromRolloutRequest = {\n rolloutPath: string;\n config?: NativeConversationConfig;\n};\n\nexport type NativeTuiRequest = {\n prompt?: string;\n images?: string[];\n model?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n resumeSessionId?: string;\n resumeLast?: boolean;\n resumePicker?: boolean;\n fullAuto?: boolean;\n dangerouslyBypassApprovalsAndSandbox?: boolean;\n workingDirectory?: string;\n configProfile?: string;\n configOverrides?: string[];\n addDir?: string[];\n webSearch?: boolean;\n linuxSandboxPath?: string;\n baseUrl?: string;\n apiKey?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n};\n\nexport type PlanStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport type NativeEmitBackgroundEventRequest = {\n threadId: string;\n message: string;\n};\n\nexport type NativeEmitPlanUpdateRequest = {\n threadId: string;\n explanation?: string;\n plan: Array<{\n step: string;\n status: PlanStatus;\n }>;\n};\n\nexport type NativeModifyPlanRequest = {\n threadId: string;\n operations: PlanOperation[];\n};\n\nexport type PlanOperation =\n | { type: \"add\"; item: { step: string; status?: PlanStatus } }\n | { type: \"update\"; index: number; updates: { step?: string; status?: PlanStatus } }\n | { type: \"remove\"; index: number }\n | { type: \"reorder\"; newOrder: number[] };\n\nexport type NativeToolInterceptorNativeContext = {\n invocation: NativeToolInvocation;\n token: string;\n};\n\nexport type NativeTokenUsage = {\n inputTokens: number;\n cachedInputTokens: number;\n outputTokens: number;\n reasoningOutputTokens: number;\n totalTokens: number;\n};\n\nexport type NativeUpdateActionKind = \"npmGlobalLatest\" | \"bunGlobalLatest\" | \"brewUpgrade\";\n\nexport type NativeUpdateActionInfo = {\n kind: NativeUpdateActionKind;\n command: string;\n};\n\nexport type NativeTuiExitInfo = {\n tokenUsage: NativeTokenUsage;\n conversationId?: string;\n updateAction?: NativeUpdateActionInfo;\n};\n\nexport type NativeTuiSession = {\n wait(): Promise<NativeTuiExitInfo>;\n shutdown(): void;\n readonly closed: boolean;\n};\n\n// ============================================================================ \n// Repo diff summaries\n// ============================================================================ \n\nexport type RepoDiffFileChange = {\n path: string;\n status: string;\n diff: string;\n truncated: boolean;\n previousPath?: string | null;\n};\n\nexport type RepoDiffSummary = {\n repoPath: string;\n branch: string;\n baseBranch: string;\n upstreamRef?: string | null;\n mergeBase: string;\n statusSummary: string;\n diffStat: string;\n recentCommits: string;\n changedFiles: RepoDiffFileChange[];\n totalChangedFiles: number;\n};\n\nexport type RepoDiffSummaryOptions = {\n cwd?: string;\n baseBranchOverride?: string;\n maxFiles?: number;\n diffContextLines?: number;\n diffCharLimit?: number;\n};\n\n// ============================================================================\n// Reverie System Types\n// ============================================================================\n\nexport type ReverieConversation = {\n id: string;\n path: string;\n createdAt?: string;\n updatedAt?: string;\n headRecords: string[];\n tailRecords: string[];\n headRecordsToon: string[];\n tailRecordsToon: string[];\n};\n\nexport type ReverieSearchResult = {\n conversation: ReverieConversation;\n relevanceScore: number;\n matchingExcerpts: string[];\n insights: string[];\n rerankerScore?: number;\n};\n\nexport type FastEmbedRerankerModelCode =\n | \"BAAI/bge-reranker-base\"\n | \"rozgo/bge-reranker-v2-m3\"\n | \"jinaai/jina-reranker-v1-turbo-en\"\n | \"jinaai/jina-reranker-v2-base-multilingual\";\n\nexport type ReverieSemanticSearchOptions = {\n limit?: number;\n maxCandidates?: number;\n projectRoot?: string;\n batchSize?: number;\n normalize?: boolean;\n cache?: boolean;\n rerankerModel?: FastEmbedRerankerModelCode;\n rerankerCacheDir?: string;\n rerankerMaxLength?: number;\n rerankerShowProgress?: boolean;\n rerankerBatchSize?: number;\n rerankerTopK?: number;\n};\n\nexport type ReverieSemanticIndexStats = {\n conversationsIndexed: number;\n documentsEmbedded: number;\n batches: number;\n};\n\n// ============================================================================\n// FastEmbed Types\n// ============================================================================\n\nexport type FastEmbedInitOptions = {\n model?: string;\n cacheDir?: string;\n maxLength?: number;\n showDownloadProgress?: boolean;\n};\n\nexport type FastEmbedEmbedRequest = {\n inputs: string[];\n batchSize?: number;\n normalize?: boolean;\n projectRoot?: string;\n cache?: boolean;\n};\n\n// ============================================================================\n// Tokenizer Types\n// ============================================================================\n\nexport type TokenizerOptions = {\n model?: string;\n encoding?: \"o200k_base\" | \"cl100k_base\";\n};\n\nexport type TokenizerEncodeOptions = TokenizerOptions & {\n withSpecialTokens?: boolean;\n};\n\nfunction ensureCliEntrypointEnv(): void {\n if (process.env[CLI_ENTRYPOINT_ENV]) {\n return;\n }\n\n const filename = fileURLToPath(import.meta.url);\n const dirname = path.dirname(filename);\n const candidates = [\n path.resolve(dirname, \"cli.cjs\"),\n path.resolve(dirname, \"../cli.cjs\"),\n path.resolve(dirname, \"../dist/cli.cjs\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n process.env[CLI_ENTRYPOINT_ENV] = candidate;\n break;\n }\n }\n}\n\nensureCliEntrypointEnv();\n\nexport type NativeBinding = {\n runThread(request: NativeRunRequest): Promise<string[]>;\n runThreadStream(\n request: NativeRunRequest,\n onEvent: (err: unknown, eventJson?: string) => void,\n ): Promise<void>;\n compactThread(request: NativeRunRequest): Promise<string[]>;\n forkThread(request: NativeForkRequest): Promise<NativeForkResult>;\n listConversations(request: NativeConversationListRequest): Promise<NativeConversationListPage>;\n deleteConversation(request: NativeDeleteConversationRequest): Promise<NativeDeleteConversationResult>;\n resumeConversationFromRollout(request: NativeResumeFromRolloutRequest): Promise<NativeForkResult>;\n runTui(request: NativeTuiRequest): Promise<NativeTuiExitInfo>;\n tuiTestRun?(request: {\n width: number;\n height: number;\n viewport: { x: number; y: number; width: number; height: number };\n lines: string[];\n }): Promise<string[]>;\n callToolBuiltin(token: string, invocation?: NativeToolInvocation): Promise<NativeToolResult>;\n clearRegisteredTools(): void;\n registerTool(info: NativeToolInfo, handler: (call: NativeToolInvocation) => Promise<NativeToolResult> | NativeToolResult): void;\n registerToolInterceptor(toolName: string, handler: (context: NativeToolInterceptorNativeContext) => Promise<NativeToolResult> | NativeToolResult): void;\n registerApprovalCallback?(\n handler: (request: ApprovalRequest) => boolean | Promise<boolean>,\n ): void;\n emitBackgroundEvent(request: NativeEmitBackgroundEventRequest): Promise<void>;\n emitPlanUpdate(request: NativeEmitPlanUpdateRequest): Promise<void>;\n modifyPlan(request: NativeModifyPlanRequest): Promise<void>;\n startTui?(request: NativeTuiRequest): NativeTuiSession;\n // SSE test helpers (exposed for TypeScript tests)\n ev_completed(id: string): string;\n ev_response_created(id: string): string;\n ev_assistant_message(id: string, text: string): string;\n ev_function_call(callId: string, name: string, args: string): string;\n sse(events: string[]): string;\n ensureTokioRuntime?: () => void;\n isTokioRuntimeAvailable?: () => boolean;\n // Cloud tasks support (JSON-string payload responses)\n cloudTasksList?(env?: string, baseUrl?: string, apiKey?: string): Promise<string>;\n cloudTasksGetDiff?(taskId: string, baseUrl?: string, apiKey?: string): Promise<string>;\n cloudTasksApplyPreflight?(\n taskId: string,\n diffOverride?: string,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n cloudTasksApply?(\n taskId: string,\n diffOverride?: string,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n cloudTasksCreate?(\n envId: string,\n prompt: string,\n gitRef?: string,\n qaMode?: boolean,\n bestOfN?: number,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n // Reverie system - conversation search and insights\n reverieListConversations(codexHomePath: string, limit?: number, offset?: number): Promise<ReverieConversation[]>;\n reverieSearchConversations(codexHomePath: string, query: string, limit?: number): Promise<ReverieSearchResult[]>;\n reverieSearchSemantic?(\n codexHomePath: string,\n context: string,\n options?: ReverieSemanticSearchOptions,\n ): Promise<ReverieSearchResult[]>;\n reverieIndexSemantic?(\n codexHomePath: string,\n options?: ReverieSemanticSearchOptions,\n ): Promise<ReverieSemanticIndexStats>;\n reverieGetConversationInsights(conversationPath: string, query?: string): Promise<string[]>;\n toonEncode(value: unknown): string;\n // FastEmbed hooks\n fastEmbedInit?(options: FastEmbedInitOptions): Promise<void>;\n fastEmbedEmbed?(request: FastEmbedEmbedRequest): Promise<number[][]>;\n // Tokenizer helpers\n tokenizerCount(text: string, options?: TokenizerOptions): number;\n tokenizerEncode(text: string, options?: TokenizerEncodeOptions): number[];\n tokenizerDecode(tokens: number[], options?: TokenizerOptions): string;\n collectRepoDiffSummary?(\n cwd: string,\n baseBranchOverride?: string,\n options?: NativeRepoDiffOptions,\n ): Promise<RepoDiffSummary>;\n};\n\nexport type NativeToolInfo = {\n name: string;\n description?: string;\n parameters?: unknown;\n strict?: boolean;\n supportsParallel?: boolean;\n};\n\nexport type NativeToolInvocation = {\n toolName: string;\n callId: string;\n arguments?: string;\n input?: string;\n};\n\nexport type NativeToolResult = {\n output?: string;\n success?: boolean;\n error?: string;\n};\n\nexport type NativeForkResult = {\n threadId: string;\n rolloutPath: string;\n};\n\nexport type ApprovalRequest = {\n type: \"shell\" | \"file_write\" | \"network_access\";\n details?: unknown;\n context?: string;\n};\n\ntype NativeRepoDiffOptions = {\n maxFiles?: number;\n diffContextLines?: number;\n diffCharLimit?: number;\n};\n\nlet cachedBinding: NativeBinding | null | undefined;\n\nfunction getImportMetaUrl(): string | undefined {\n try {\n return Function(\n \"return typeof import.meta !== 'undefined' && import.meta.url ? import.meta.url : undefined;\",\n )() as string | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolvePackageRoots(): string[] {\n const roots: string[] = [];\n const pushRoot = (root: string | undefined) => {\n if (!root) {\n return;\n }\n if (!roots.includes(root)) {\n roots.push(root);\n }\n };\n\n if (typeof __dirname === \"string\") {\n pushRoot(path.resolve(__dirname, \"..\"));\n }\n\n const importMetaUrl = getImportMetaUrl();\n if (importMetaUrl) {\n try {\n const filePath = fileURLToPath(importMetaUrl);\n pushRoot(path.resolve(path.dirname(filePath), \"..\"));\n } catch {\n // fall through to process.cwd()\n }\n }\n\n pushRoot(process.cwd());\n return roots;\n}\n\nfunction isFileMusl(file: string): boolean {\n return file.includes(\"libc.musl-\") || file.includes(\"ld-musl-\");\n}\n\nfunction isMusl(): boolean {\n if (process.platform !== \"linux\") {\n return false;\n }\n\n try {\n return fs.readFileSync(\"/usr/bin/ldd\", \"utf8\").includes(\"musl\");\n } catch {\n // ignore and fall back to report checks\n }\n\n const report =\n typeof process.report?.getReport === \"function\"\n ? (process.report.getReport() as { header?: { glibcVersionRuntime?: string }; sharedObjects?: string[] })\n : null;\n if (!report) {\n return false;\n }\n if (report.header && report.header.glibcVersionRuntime) {\n return false;\n }\n if (Array.isArray(report.sharedObjects) && report.sharedObjects.some(isFileMusl)) {\n return true;\n }\n\n try {\n return require(\"node:child_process\").execSync(\"ldd --version\", { encoding: \"utf8\" }).includes(\"musl\");\n } catch {\n return false;\n }\n}\n\nfunction resolvePlatformPackageName(): string | null {\n const platformArchAbi = resolvePlatformArchAbi();\n return platformArchAbi ? `@codex-native/sdk-${platformArchAbi}` : null;\n}\n\nfunction resolvePlatformArchAbi(): string | null {\n if (process.platform === \"darwin\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `darwin-${process.arch}`;\n }\n return null;\n }\n\n if (process.platform === \"linux\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `linux-${process.arch}-${isMusl() ? \"musl\" : \"gnu\"}`;\n }\n return null;\n }\n\n if (process.platform === \"win32\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `win32-${process.arch}-msvc`;\n }\n return null;\n }\n\n return null;\n}\n\nfunction resolveLocalBinaryCandidates(): string[] {\n const platformArchAbi = resolvePlatformArchAbi();\n if (!platformArchAbi) {\n return [];\n }\n\n const filename = `codex_native.${platformArchAbi}.node`;\n const candidates: string[] = [];\n\n // Check locations in order:\n // 1. dist/ (where our build outputs for local dev)\n // 2. npm/<platform>/ (where napi prepublish copies for publishing)\n for (const root of resolvePackageRoots()) {\n candidates.push(path.join(root, \"dist\", filename));\n candidates.push(path.join(root, \"npm\", platformArchAbi, filename));\n }\n\n return candidates;\n}\n\nfunction tryRequireNativeBinding(requireFn: NodeJS.Require, candidate: string): NativeBinding | null {\n try {\n const binding: NativeBinding = requireFn(candidate);\n binding.ensureTokioRuntime?.();\n return binding;\n } catch {\n return null;\n }\n}\n\nfunction resolveRequire() {\n const globalRequire = (globalThis as typeof globalThis & { require?: NodeJS.Require }).require;\n if (typeof globalRequire === \"function\") {\n return globalRequire;\n }\n\n if (typeof __filename === \"string\") {\n try {\n return createRequire(__filename);\n } catch {\n // fall through to other strategies\n }\n }\n\n const importMetaUrl = getImportMetaUrl();\n if (importMetaUrl) {\n try {\n return createRequire(importMetaUrl);\n } catch {\n // fall through to fallback strategy\n }\n }\n\n const fallbackBase = typeof __dirname === \"string\" ? __dirname : process.cwd();\n const fallbackPath = path.join(fallbackBase, \"noop.js\");\n return createRequire(fallbackPath);\n}\n\nexport function getNativeBinding(): NativeBinding | null {\n if (cachedBinding !== undefined) {\n return cachedBinding;\n }\n\n const requireFn = resolveRequire();\n const envPath = process.env.CODEX_NATIVE_BINDING;\n if (envPath && envPath.length > 0) {\n // Allow napi-rs loaders and direct requires to honor the override.\n process.env.NAPI_RS_NATIVE_LIBRARY_PATH = envPath;\n }\n if (envPath && envPath.length > 0) {\n const binding = tryRequireNativeBinding(requireFn, envPath);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n let lastError: unknown;\n\n const localBinaryCandidates = resolveLocalBinaryCandidates();\n for (const candidate of localBinaryCandidates) {\n if (!fs.existsSync(candidate)) {\n continue;\n }\n\n const binding = tryRequireNativeBinding(requireFn, candidate);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n const platformPackage = resolvePlatformPackageName();\n if (platformPackage) {\n const binding = tryRequireNativeBinding(requireFn, platformPackage);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n const error =\n lastError ??\n new Error(\n `Native binding entrypoint not found. Checked: ${localBinaryCandidates.join(\n \", \",\n )} and ${platformPackage ?? \"no platform package\"}`,\n );\n console.warn(\"Failed to load native NAPI binding:\", error);\n cachedBinding = null;\n return cachedBinding;\n}\n\n// SSE test helpers (exposed for TypeScript tests)\nexport function ev_completed(id: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evCompleted(id);\n}\n\nexport function ev_response_created(id: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evResponseCreated(id);\n}\n\nexport function ev_assistant_message(id: string, text: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evAssistantMessage(id, text);\n}\n\nexport function ev_function_call(callId: string, name: string, args: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evFunctionCall(callId, name, args);\n}\n\nexport function sse(events: string[]): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).sse(events);\n}\n\nexport function runApplyPatch(patch: string): void {\n if (!patch) {\n throw new Error(\"apply_patch requires patch contents\");\n }\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n (binding as any).runApplyPatch(patch);\n}\n\n// Reverie system helpers\nexport async function reverieListConversations(\n codexHomePath: string,\n limit?: number,\n offset?: number,\n): Promise<ReverieConversation[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieListConversations) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieListConversations(codexHomePath, limit, offset);\n}\n\nexport async function reverieSearchConversations(\n codexHomePath: string,\n query: string,\n limit?: number,\n): Promise<ReverieSearchResult[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieSearchConversations) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieSearchConversations(codexHomePath, query, limit);\n}\n\nexport async function reverieSearchSemantic(\n codexHomePath: string,\n context: string,\n options?: ReverieSemanticSearchOptions,\n): Promise<ReverieSearchResult[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieSearchSemantic) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieSearchSemantic(codexHomePath, context, options);\n}\n\nexport async function reverieIndexSemantic(\n codexHomePath: string,\n options?: ReverieSemanticSearchOptions,\n): Promise<ReverieSemanticIndexStats> {\n const binding = getNativeBinding();\n if (!binding?.reverieIndexSemantic) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieIndexSemantic(codexHomePath, options);\n}\n\nexport async function reverieGetConversationInsights(\n conversationPath: string,\n query?: string,\n): Promise<string[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieGetConversationInsights) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieGetConversationInsights(conversationPath, query);\n}\n\nexport function encodeToToon(value: unknown): string {\n const binding = getNativeBinding();\n if (!binding?.toonEncode) throw new Error(\"Native binding not available or toon encoder not supported\");\n return (binding as any).toonEncode(value);\n}\n\n// FastEmbed helpers\nexport async function fastEmbedInit(options: FastEmbedInitOptions): Promise<void> {\n const binding = getNativeBinding();\n if (!binding?.fastEmbedInit) throw new Error(\"Native binding not available or FastEmbed functions not supported\");\n await binding.fastEmbedInit(options);\n}\n\nexport async function fastEmbedEmbed(request: FastEmbedEmbedRequest): Promise<number[][]> {\n const binding = getNativeBinding();\n if (!binding?.fastEmbedEmbed) throw new Error(\"Native binding not available or FastEmbed functions not supported\");\n return binding.fastEmbedEmbed(request);\n}\n\n// Tokenizer helpers\nexport function tokenizerCount(text: string, options?: TokenizerOptions): number {\n const binding = getNativeBinding();\n if (!binding?.tokenizerCount) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerCount(text, options);\n}\n\nexport function tokenizerEncode(text: string, options?: TokenizerEncodeOptions): number[] {\n const binding = getNativeBinding();\n if (!binding?.tokenizerEncode) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerEncode(text, options);\n}\n\nexport function tokenizerDecode(tokens: number[], options?: TokenizerOptions): string {\n const binding = getNativeBinding();\n if (!binding?.tokenizerDecode) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerDecode(tokens, options);\n}\n\nexport async function collectRepoDiffSummary(\n options?: RepoDiffSummaryOptions,\n): Promise<RepoDiffSummary> {\n const binding = getNativeBinding();\n if (!binding?.collectRepoDiffSummary) {\n throw new Error(\"Native binding not available or repo diff helpers not supported\");\n }\n const cwd = options?.cwd ?? process.cwd();\n const nativeOptions: NativeRepoDiffOptions | undefined =\n options &&\n (options.maxFiles !== undefined ||\n options.diffContextLines !== undefined ||\n options.diffCharLimit !== undefined)\n ? {\n maxFiles: options.maxFiles,\n diffContextLines: options.diffContextLines,\n diffCharLimit: options.diffCharLimit,\n }\n : undefined;\n return binding.collectRepoDiffSummary(cwd, options?.baseBranchOverride, nativeOptions);\n}\n","import type { ThreadEvent } from \"../events\";\n\n/**\n * Converts the raw Rust event payload emitted by the native binding into the structured\n * {@link ThreadEvent} shape expected by the TypeScript SDK.\n */\nexport function convertRustEventToThreadEvent(rustEvent: any): ThreadEvent {\n if (rustEvent?.ThreadStarted) {\n return {\n type: \"thread.started\",\n thread_id: rustEvent.ThreadStarted.thread_id,\n };\n }\n if (rustEvent?.TurnStarted) {\n return { type: \"turn.started\" };\n }\n if (rustEvent?.TurnCompleted) {\n return {\n type: \"turn.completed\",\n usage: rustEvent.TurnCompleted.usage,\n };\n }\n if (rustEvent?.TurnFailed) {\n return {\n type: \"turn.failed\",\n error: rustEvent.TurnFailed.error,\n };\n }\n if (rustEvent?.ItemStarted) {\n return {\n type: \"item.started\",\n item: rustEvent.ItemStarted.item,\n };\n }\n if (rustEvent?.ItemUpdated) {\n return {\n type: \"item.updated\",\n item: rustEvent.ItemUpdated.item,\n };\n }\n if (rustEvent?.ItemCompleted) {\n return {\n type: \"item.completed\",\n item: rustEvent.ItemCompleted.item,\n };\n }\n if (rustEvent?.Error) {\n return {\n type: \"error\",\n message: rustEvent.Error.message,\n };\n }\n if (rustEvent?.BackgroundEvent) {\n return {\n type: \"background_event\",\n message: rustEvent.BackgroundEvent.message,\n };\n }\n if (rustEvent?.type === \"background_event\" && typeof rustEvent.message === \"string\") {\n return {\n type: \"background_event\",\n message: rustEvent.message,\n };\n }\n if (rustEvent?.type === \"plan_update_scheduled\" && rustEvent.plan) {\n const planData = rustEvent.plan;\n const planItems = planData.plan || [];\n return {\n type: \"item.completed\",\n item: {\n id: `plan-${Date.now()}`,\n type: \"todo_list\",\n items: planItems.map((item: any) => ({\n text: item.step,\n completed: item.status === \"completed\",\n })),\n },\n } as ThreadEvent;\n }\n if (rustEvent?.type) {\n return rustEvent as ThreadEvent;\n }\n return rustEvent as ThreadEvent;\n}\n","import type { ApprovalMode, SandboxMode } from \"../threadOptions\";\n\nconst SANDBOX_MODE_VALUES = [\"read-only\", \"workspace-write\", \"danger-full-access\"] as const;\nconst APPROVAL_MODE_VALUES = [\"never\", \"on-request\", \"on-failure\", \"untrusted\"] as const;\n\nfunction isSandboxMode(value: string): value is SandboxMode {\n return (SANDBOX_MODE_VALUES as readonly string[]).includes(value);\n}\n\nfunction isApprovalMode(value: string): value is ApprovalMode {\n return (APPROVAL_MODE_VALUES as readonly string[]).includes(value);\n}\n\nexport function parseSandboxModeFlag(\n value: string | undefined,\n origin: string,\n): SandboxMode | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (isSandboxMode(value)) {\n return value;\n }\n throw new Error(\n `Invalid sandbox mode \"${value}\" from ${origin}. Valid values: ${SANDBOX_MODE_VALUES.join(\n \", \",\n )}.`,\n );\n}\n\nexport function parseApprovalModeFlag(\n value: string | undefined,\n origin: string,\n): ApprovalMode | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (isApprovalMode(value)) {\n return value;\n }\n throw new Error(\n `Invalid approval mode \"${value}\" from ${origin}. Valid values: ${APPROVAL_MODE_VALUES.join(\n \", \",\n )}.`,\n );\n}\n\n","import type {\n BeforeStartHook,\n EventHook,\n HookContext,\n HookRegistration,\n} from \"./types\";\n\nexport function emitWarnings(warnings: string[], fromIndex = 0): void {\n for (let i = fromIndex; i < warnings.length; i += 1) {\n const message = warnings[i];\n process.stderr.write(`[codex-native] Warning: ${message}\\n`);\n }\n}\n\nexport async function runBeforeStartHooks(\n hooks: Array<HookRegistration<BeforeStartHook>>,\n context: HookContext,\n warnings: string[],\n): Promise<void> {\n for (const hook of hooks) {\n try {\n await hook.callback(context);\n } catch (error) {\n warnings.push(\n `beforeStart hook \"${hook.source}\" threw: ${(error as Error).message ?? String(error)}`,\n );\n }\n }\n}\n\nexport async function runEventHooks(\n hooks: Array<HookRegistration<EventHook>>,\n event: unknown,\n context: HookContext,\n warnings: string[],\n): Promise<void> {\n for (const hook of hooks) {\n try {\n await hook.callback(event, context);\n } catch (error) {\n warnings.push(`onEvent hook \"${hook.source}\" threw: ${(error as Error).message ?? String(error)}`);\n }\n }\n}\n\n","import path from \"node:path\";\n\nimport type { NativeRunRequest, NativeTuiRequest } from \"../nativeBinding\";\nimport type {\n ApprovalMode,\n SandboxMode,\n ThreadOptions,\n WorkspaceWriteOptions,\n} from \"../threadOptions\";\n\nconst FULL_ACCESS_SANDBOX: SandboxMode = \"workspace-write\";\nconst FULL_ACCESS_APPROVAL: ApprovalMode = \"never\";\n\ntype SandboxTarget = {\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n};\n\nexport function applyElevatedRunDefaults(request: NativeRunRequest, cwd: string): void {\n const workingDirectory = resolveWorkingDirectory(request.workingDirectory, cwd);\n request.workingDirectory = workingDirectory;\n ensureSandboxModes(request);\n request.workspaceWriteOptions = ensureWorkspaceWriteOptions(\n request.workspaceWriteOptions,\n workingDirectory,\n );\n}\n\nexport function applyElevatedTuiDefaults(params: {\n request: NativeTuiRequest;\n thread: ThreadOptions;\n cwd: string;\n}): void {\n const { request, thread, cwd } = params;\n const workingDirectory = resolveWorkingDirectory(\n request.workingDirectory ?? thread.workingDirectory,\n cwd,\n );\n\n request.workingDirectory = workingDirectory;\n thread.workingDirectory = workingDirectory;\n\n ensureSandboxModes(request);\n thread.sandboxMode = request.sandboxMode ?? thread.sandboxMode ?? FULL_ACCESS_SANDBOX;\n thread.approvalMode = request.approvalMode ?? thread.approvalMode ?? FULL_ACCESS_APPROVAL;\n\n thread.workspaceWriteOptions = ensureWorkspaceWriteOptions(\n thread.workspaceWriteOptions,\n workingDirectory,\n );\n}\n\nfunction ensureSandboxModes(target: SandboxTarget): void {\n if (!target.sandboxMode) {\n target.sandboxMode = FULL_ACCESS_SANDBOX;\n }\n if (!target.approvalMode) {\n target.approvalMode = FULL_ACCESS_APPROVAL;\n }\n}\n\nfunction ensureWorkspaceWriteOptions(\n options: WorkspaceWriteOptions | undefined,\n workingDirectory: string,\n): WorkspaceWriteOptions {\n const resolved = path.resolve(workingDirectory);\n const writableRoots = new Set(options?.writableRoots ?? []);\n writableRoots.add(resolved);\n\n return {\n ...options,\n networkAccess: options?.networkAccess ?? true,\n writableRoots: Array.from(writableRoots),\n };\n}\n\nfunction resolveWorkingDirectory(candidate: string | undefined, cwd: string): string {\n if (!candidate || candidate.trim().length === 0) {\n return path.resolve(cwd);\n }\n return path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);\n}\n","import * as path from \"node:path\";\n\nimport type { Thread } from \"../thread\";\nimport type { ThreadItem } from \"../items\";\n\nimport { LspManager } from \"./manager\";\nimport type { FileDiagnostics, LspManagerOptions } from \"./types\";\nimport { formatDiagnosticsForBackgroundEvent } from \"./format\";\n\nexport class LspDiagnosticsBridge {\n private readonly manager: LspManager;\n private readonly attached = new WeakSet<Thread>();\n\n constructor(private readonly options: LspManagerOptions) {\n this.manager = new LspManager(options);\n }\n\n attach(thread: Thread): () => void {\n if (this.attached.has(thread)) {\n return () => {};\n }\n this.attached.add(thread);\n const unsubscribe = thread.onEvent((event) => {\n if (event.type !== \"item.completed\") {\n return;\n }\n\n if (event.item.type === \"file_change\") {\n const targets = event.item.changes\n .filter((change) => change.kind !== \"delete\")\n .map((change) => path.resolve(this.options.workingDirectory, change.path));\n if (targets.length === 0) {\n return;\n }\n void this.processDiagnostics(thread, targets);\n return;\n }\n\n if (event.item.type === \"mcp_tool_call\") {\n const targets = extractReadFileTargets(event.item, this.options.workingDirectory);\n if (targets.length === 0) {\n return;\n }\n void this.processDiagnostics(thread, targets);\n }\n });\n return () => {\n this.attached.delete(thread);\n unsubscribe();\n };\n }\n\n async dispose(): Promise<void> {\n await this.manager.dispose();\n }\n\n private async processDiagnostics(thread: Thread, files: string[]): Promise<void> {\n try {\n const diagnostics = await this.manager.collectDiagnostics(files);\n if (diagnostics.length === 0) {\n return;\n }\n const summary = formatDiagnosticsForBackgroundEvent(\n diagnostics,\n this.options.workingDirectory,\n );\n console.log(`\\n📟 LSP diagnostics detected:\\n${summary}\\n`);\n try {\n await thread.sendBackgroundEvent(`LSP diagnostics detected:\\n${summary}`);\n } catch {\n // Thread may have ended; ignore.\n }\n } catch (error) {\n console.warn(\"[lsp] failed to collect diagnostics\", error);\n }\n }\n}\n\nfunction extractReadFileTargets(item: ThreadItem, cwd: string): string[] {\n if (item.type !== \"mcp_tool_call\") {\n return [];\n }\n const toolName = item.tool?.toLowerCase?.();\n if (toolName !== \"read_file\" && toolName !== \"read_file_v2\") {\n return [];\n }\n\n let args: unknown = item.arguments;\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n return [];\n }\n }\n\n if (!args || typeof args !== \"object\") {\n return [];\n }\n\n const filePath =\n (args as { file_path?: unknown; path?: unknown }).file_path ?? (args as { path?: unknown }).path;\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n return [];\n }\n\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);\n return [resolved];\n}\n","import * as path from \"node:path\";\n\nimport type { Diagnostic } from \"vscode-languageserver-types\";\n\nimport { findServerForFile, resolveWorkspaceRoot } from \"./servers\";\nimport { LspClient, normalizeSeverity } from \"./client\";\nimport type {\n FileDiagnostics,\n LspManagerOptions,\n LspServerConfig,\n NormalizedDiagnostic,\n} from \"./types\";\n\nexport class LspManager {\n private clients = new Map<string, Promise<LspClient | null>>();\n\n constructor(private readonly options: LspManagerOptions) {}\n\n async collectDiagnostics(files: string[]): Promise<FileDiagnostics[]> {\n const unique = Array.from(new Set(files.map((file) => path.resolve(file))));\n const results: FileDiagnostics[] = [];\n for (const filePath of unique) {\n const server = findServerForFile(filePath);\n if (!server) {\n continue;\n }\n const root = resolveWorkspaceRoot(filePath, server.workspace, this.options.workingDirectory);\n const client = await this.getClient(server, root);\n if (!client) {\n continue;\n }\n try {\n await client.openFile(filePath, this.options.waitForDiagnostics !== false);\n } catch (error) {\n console.warn(`[lsp] failed to open ${filePath}:`, error);\n continue;\n }\n const normalized = client\n .getDiagnostics(filePath)\n .map((diag) => normalizeDiagnostic(diag))\n .filter((diag) => diag.message.trim().length > 0);\n if (normalized.length > 0) {\n results.push({ path: filePath, diagnostics: normalized });\n }\n }\n return results;\n }\n\n async dispose(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(async (promise) => {\n const client = await promise;\n await client?.shutdown();\n }),\n );\n this.clients.clear();\n }\n\n private async getClient(server: LspServerConfig, root: string): Promise<LspClient | null> {\n const key = `${server.id}:${root}`;\n let existing = this.clients.get(key);\n if (!existing) {\n existing = this.createClient(server, root);\n this.clients.set(key, existing);\n }\n const client = await existing;\n if (!client) {\n this.clients.delete(key);\n }\n return client;\n }\n\n private async createClient(server: LspServerConfig, root: string): Promise<LspClient | null> {\n try {\n return await LspClient.start(server, root);\n } catch (error) {\n console.warn(`[lsp] unable to start ${server.displayName}:`, error);\n return null;\n }\n }\n}\n\nfunction normalizeDiagnostic(diag: Diagnostic): NormalizedDiagnostic {\n return {\n message: diag.message ?? \"\",\n severity: normalizeSeverity(diag.severity),\n source: diag.source,\n code: diag.code,\n range: diag.range,\n };\n}\n\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type { LspServerConfig, WorkspaceLocator } from \"./types\";\n\nconst MARKERS_NODE = [\"package-lock.json\", \"pnpm-lock.yaml\", \"yarn.lock\", \"bun.lockb\", \"bun.lock\"];\nconst MARKERS_PY = [\"pyproject.toml\", \"requirements.txt\", \"Pipfile\", \"setup.py\", \"setup.cfg\", \"poetry.lock\"];\nconst MARKERS_RUST = [\"Cargo.toml\"];\n\nexport const DEFAULT_SERVERS: LspServerConfig[] = [\n {\n id: \"typescript\",\n displayName: \"TypeScript Language Server\",\n command: [\"typescript-language-server\", \"--stdio\"],\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"],\n workspace: { type: \"markers\", include: MARKERS_NODE },\n },\n {\n id: \"pyright\",\n displayName: \"Pyright\",\n command: [\"pyright-langserver\", \"--stdio\"],\n extensions: [\".py\", \".pyi\"],\n workspace: { type: \"markers\", include: MARKERS_PY },\n },\n {\n id: \"rust-analyzer\",\n displayName: \"rust-analyzer\",\n command: [\"rust-analyzer\"],\n extensions: [\".rs\"],\n workspace: { type: \"markers\", include: MARKERS_RUST },\n },\n];\n\nexport function findServerForFile(filePath: string): LspServerConfig | undefined {\n const lower = filePath.toLowerCase();\n return DEFAULT_SERVERS.find((server) => server.extensions.some((ext) => lower.endsWith(ext)));\n}\n\nexport function resolveWorkspaceRoot(\n filePath: string,\n locator: WorkspaceLocator | undefined,\n fallbackDir: string,\n): string {\n if (!locator) {\n return fallbackDir;\n }\n if (locator.type === \"fixed\") {\n return locator.path;\n }\n const include = locator.include ?? [];\n const exclude = locator.exclude ?? [];\n let current = fs.statSync(filePath, { throwIfNoEntry: false })?.isDirectory()\n ? filePath\n : path.dirname(filePath);\n const root = path.parse(current).root;\n while (true) {\n if (exclude.some((pattern) => fs.existsSync(path.join(current, pattern)))) {\n break;\n }\n if (include.some((pattern) => fs.existsSync(path.join(current, pattern)))) {\n return current;\n }\n if (current === root) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return fallbackDir;\n}\n\n","import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { EventEmitter } from \"node:events\";\nimport { createMessageConnection, type MessageConnection } from \"vscode-jsonrpc\";\nimport { StreamMessageReader, StreamMessageWriter } from \"vscode-jsonrpc/lib/node/main.js\";\nimport type { Diagnostic } from \"vscode-languageserver-types\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-types\";\n\nimport type { LspServerConfig } from \"./types\";\n\nconst DEFAULT_TIMEOUT_MS = 3_000;\n\nexport class LspClient {\n private connection: MessageConnection | null = null;\n private process: ChildProcessWithoutNullStreams | null = null;\n private diagnostics = new Map<string, Diagnostic[]>();\n private versions = new Map<string, number>();\n private emitter = new EventEmitter();\n\n private constructor(\n private readonly config: LspServerConfig,\n private readonly root: string,\n ) {}\n\n static async start(server: LspServerConfig, root: string): Promise<LspClient> {\n const client = new LspClient(server, root);\n await client.initialize();\n return client;\n }\n\n private async initialize(): Promise<void> {\n const [command, ...args] = this.config.command;\n if (!command) {\n throw new Error(`LSP server ${this.config.id} is missing a command executable`);\n }\n try {\n this.process = spawn(command, args, {\n cwd: this.root,\n env: { ...process.env, ...this.config.env },\n stdio: \"pipe\",\n });\n } catch (error) {\n throw new Error(`Failed to spawn ${this.config.displayName} (${command}): ${String(error)}`);\n }\n\n const child = this.process;\n // LSP stderr is suppressed from console - agents still get diagnostics via publishDiagnostics\n child.stderr.on(\"data\", (_chunk) => {\n // Silently consume stderr to avoid console spam during merge resolution\n });\n\n const reader = new StreamMessageReader(child.stdout);\n const writer = new StreamMessageWriter(child.stdin);\n this.connection = createMessageConnection(reader, writer);\n\n this.connection.onNotification(\"textDocument/publishDiagnostics\", (payload: PublishDiagnosticsParams) => {\n const fsPath = fileURLToPath(payload.uri);\n this.diagnostics.set(fsPath, payload.diagnostics);\n this.emitter.emit(`diagnostics:${fsPath}`);\n });\n this.connection.onError((err: unknown) => {\n console.warn(`[lsp:${this.config.id}] connection error`, err);\n });\n this.connection.listen();\n\n await this.connection.sendRequest(\"initialize\", {\n rootUri: pathToFileURL(this.root).href,\n processId: process.pid,\n initializationOptions: this.config.initializationOptions ?? {},\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n },\n publishDiagnostics: {\n versionSupport: true,\n },\n },\n workspace: {\n workspaceFolders: true,\n },\n },\n workspaceFolders: [\n {\n name: path.basename(this.root),\n uri: pathToFileURL(this.root).href,\n },\n ],\n });\n await this.connection.sendNotification(\"initialized\", {});\n }\n\n async openFile(filePath: string, waitForDiagnostics: boolean): Promise<void> {\n if (!this.connection) return;\n const absolute = path.resolve(filePath);\n const text = await fs.readFile(absolute, \"utf8\");\n const uri = pathToFileURL(absolute).href;\n const languageId = detectLanguageId(absolute);\n\n const existingVersion = this.versions.get(absolute);\n if (existingVersion === undefined) {\n this.versions.set(absolute, 0);\n await this.connection.sendNotification(\"textDocument/didOpen\", {\n textDocument: {\n uri,\n languageId,\n version: 0,\n text,\n },\n });\n } else {\n const next = existingVersion + 1;\n this.versions.set(absolute, next);\n await this.connection.sendNotification(\"textDocument/didChange\", {\n textDocument: {\n uri,\n version: next,\n },\n contentChanges: [{ text }],\n });\n }\n\n if (waitForDiagnostics) {\n await this.waitForDiagnostics(absolute);\n }\n }\n\n getDiagnostics(filePath: string): Diagnostic[] {\n const absolute = path.resolve(filePath);\n return this.diagnostics.get(absolute) ?? [];\n }\n\n private waitForDiagnostics(filePath: string, timeoutMs = DEFAULT_TIMEOUT_MS): Promise<void> {\n const absolute = path.resolve(filePath);\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, timeoutMs).unref();\n this.emitter.once(`diagnostics:${absolute}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.connection?.dispose();\n } catch {\n // ignore\n }\n if (this.process && !this.process.killed) {\n this.process.kill();\n }\n }\n}\n\ntype PublishDiagnosticsParams = {\n uri: string;\n diagnostics: Diagnostic[];\n};\n\nfunction detectLanguageId(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case \".ts\":\n case \".mts\":\n case \".cts\":\n return \"typescript\";\n case \".tsx\":\n return \"typescriptreact\";\n case \".js\":\n case \".mjs\":\n case \".cjs\":\n return \"javascript\";\n case \".jsx\":\n return \"javascriptreact\";\n case \".py\":\n case \".pyi\":\n return \"python\";\n case \".rs\":\n return \"rust\";\n default:\n return \"plaintext\";\n }\n}\n\nexport function normalizeSeverity(severity?: Diagnostic[\"severity\"]): \"error\" | \"warning\" | \"info\" | \"hint\" {\n switch (severity) {\n case DiagnosticSeverity.Error:\n return \"error\";\n case DiagnosticSeverity.Warning:\n return \"warning\";\n case DiagnosticSeverity.Information:\n return \"info\";\n case DiagnosticSeverity.Hint:\n return \"hint\";\n default:\n return \"error\";\n }\n}\n","import * as path from \"node:path\";\n\nimport type { FileDiagnostics, NormalizedDiagnostic } from \"./types\";\n\nconst MAX_DIAGNOSTICS_PER_FILE = 5;\n\nexport type DiagnosticSeverity = \"error\" | \"warning\" | \"info\" | \"hint\";\n\nexport function formatDiagnosticsForTool(diagnostics: FileDiagnostics[]): string {\n return diagnostics\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = filePath;\n const lines = entries.slice(0, MAX_DIAGNOSTICS_PER_FILE).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > MAX_DIAGNOSTICS_PER_FILE ? \" - …\" : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nexport function formatDiagnosticsForBackgroundEvent(\n diagnostics: FileDiagnostics[],\n cwd: string,\n): string {\n return diagnostics\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = path.relative(cwd, filePath) || filePath;\n const lines = entries.slice(0, MAX_DIAGNOSTICS_PER_FILE).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > MAX_DIAGNOSTICS_PER_FILE ? \" - …\" : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\n/**\n * Filter diagnostics by minimum severity level\n */\nexport function filterBySeverity(\n diagnostics: FileDiagnostics[],\n minSeverity: DiagnosticSeverity = \"error\",\n): FileDiagnostics[] {\n const severityOrder: Record<DiagnosticSeverity, number> = {\n error: 0,\n warning: 1,\n info: 2,\n hint: 3,\n };\n const threshold = severityOrder[minSeverity];\n\n return diagnostics\n .map((file) => ({\n ...file,\n diagnostics: file.diagnostics.filter(\n (diag) => severityOrder[diag.severity as DiagnosticSeverity] <= threshold,\n ),\n }))\n .filter((file) => file.diagnostics.length > 0);\n}\n\n/**\n * Generate summary statistics for diagnostics\n */\nexport function summarizeDiagnostics(diagnostics: FileDiagnostics[]): {\n fileCount: number;\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n totalCount: number;\n} {\n let errorCount = 0;\n let warningCount = 0;\n let infoCount = 0;\n let hintCount = 0;\n\n for (const file of diagnostics) {\n for (const diag of file.diagnostics) {\n switch (diag.severity) {\n case \"error\":\n errorCount++;\n break;\n case \"warning\":\n warningCount++;\n break;\n case \"info\":\n infoCount++;\n break;\n case \"hint\":\n hintCount++;\n break;\n }\n }\n }\n\n return {\n fileCount: diagnostics.length,\n errorCount,\n warningCount,\n infoCount,\n hintCount,\n totalCount: errorCount + warningCount + infoCount + hintCount,\n };\n}\n\n/**\n * Format diagnostics with summary (concise format for post-merge validation)\n */\nexport function formatDiagnosticsWithSummary(\n diagnostics: FileDiagnostics[],\n cwd: string,\n options: {\n minSeverity?: DiagnosticSeverity;\n maxPerFile?: number;\n } = {},\n): string {\n const filtered = options.minSeverity\n ? filterBySeverity(diagnostics, options.minSeverity)\n : diagnostics;\n\n if (filtered.length === 0) {\n return \"No diagnostics found.\";\n }\n\n const summary = summarizeDiagnostics(filtered);\n const maxPerFile = options.maxPerFile ?? MAX_DIAGNOSTICS_PER_FILE;\n\n const header = `LSP Diagnostics Summary: ${summary.errorCount} error${summary.errorCount !== 1 ? \"s\" : \"\"}, ${summary.warningCount} warning${summary.warningCount !== 1 ? \"s\" : \"\"} across ${summary.fileCount} file${summary.fileCount !== 1 ? \"s\" : \"\"}`;\n\n const details = filtered\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = path.relative(cwd, filePath) || filePath;\n const lines = entries.slice(0, maxPerFile).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > maxPerFile ? ` - … (${entries.length - maxPerFile} more)` : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n\n return `${header}\\n\\n${details}`;\n}\n\n","import type { Thread } from \"../thread\";\nimport type { LspManagerOptions } from \"./types\";\nimport { LspDiagnosticsBridge } from \"./bridge\";\n\n/**\n * Attaches the LSP diagnostics bridge to a thread.\n * Returns a cleanup function that detaches the bridge and disposes shared resources.\n */\nexport function attachLspDiagnostics(thread: Thread, options: LspManagerOptions): () => void {\n const bridge = new LspDiagnosticsBridge(options);\n const detach = bridge.attach(thread);\n return () => {\n detach();\n void bridge.dispose().catch((error) => {\n console.warn(\"Failed to dispose LSP bridge\", error);\n });\n };\n}\n\n","import type { Thread } from \"../thread\";\nimport type { ThreadEvent } from \"../events\";\nimport type { NativeBinding } from \"../nativeBinding\";\nimport { attachLspDiagnostics } from \"../lsp\";\n\ntype EventListener = (event: ThreadEvent) => void;\n\nclass RunCommandThreadRelay implements Pick<Thread, \"onEvent\" | \"sendBackgroundEvent\"> {\n private readonly listeners = new Set<EventListener>();\n private threadId: string | null;\n\n constructor(private readonly binding: NativeBinding, initialThreadId?: string) {\n this.threadId = initialThreadId ?? null;\n }\n\n onEvent(listener: EventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async sendBackgroundEvent(message: string): Promise<void> {\n const trimmed = typeof message === \"string\" ? message.trim() : \"\";\n if (!trimmed) {\n throw new Error(\"Background event message must be a non-empty string\");\n }\n if (!this.threadId) {\n throw new Error(\"Cannot emit a background event before the thread has started\");\n }\n if (typeof this.binding.emitBackgroundEvent !== \"function\") {\n throw new Error(\"emitBackgroundEvent is not available in this build\");\n }\n await this.binding.emitBackgroundEvent({ threadId: this.threadId, message: trimmed });\n }\n\n handleEvent(event: ThreadEvent): void {\n if (event.type === \"thread.started\" && typeof event.thread_id === \"string\") {\n this.threadId = event.thread_id;\n }\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.warn(\"[codex-native] LSP listener failed\", error);\n }\n }\n }\n\n setThreadId(id: string | undefined): void {\n if (id) {\n this.threadId = id;\n }\n }\n}\n\nexport function createRunCommandLspBridge(params: {\n binding: NativeBinding;\n workingDirectory: string;\n initialThreadId?: string;\n}): {\n handleEvent: (event: ThreadEvent) => void;\n dispose: () => void;\n} | null {\n try {\n const relay = new RunCommandThreadRelay(params.binding, params.initialThreadId);\n const detach = attachLspDiagnostics(relay as unknown as Thread, {\n workingDirectory: params.workingDirectory,\n waitForDiagnostics: true,\n });\n relay.setThreadId(params.initialThreadId);\n return {\n handleEvent: (event: ThreadEvent) => relay.handleEvent(event),\n dispose: () => detach(),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[codex-native] Failed to initialize LSP diagnostics bridge: ${message}`);\n return null;\n }\n}\n","import process from \"node:process\";\n\nimport { Codex } from \"../codex\";\nimport type { ThreadOptions } from \"../threadOptions\";\nimport type { NativeTuiRequest } from \"../nativeBinding\";\nimport { emitWarnings, runBeforeStartHooks } from \"./hooks\";\nimport { parseApprovalModeFlag, parseSandboxModeFlag } from \"./optionParsers\";\nimport type { CliContext, CommandName, TuiCommandOptions } from \"./types\";\nimport { applyElevatedTuiDefaults } from \"./elevatedDefaults\";\n\nexport async function executeTuiCommand(\n argv: TuiCommandOptions,\n context: CliContext,\n): Promise<void> {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new Error(\"The interactive TUI requires an interactive terminal (TTY).\");\n }\n\n const { combinedConfig } = context;\n emitWarnings(combinedConfig.warnings);\n const warningCount = combinedConfig.warnings.length;\n\n const { request, thread: threadOptions } = buildTuiConfig({\n argv,\n defaults: combinedConfig.tuiDefaults,\n cwd: context.cwd,\n });\n\n applyElevatedTuiDefaults({ request, thread: threadOptions, cwd: context.cwd });\n\n const hookContext = {\n command: \"tui\" as CommandName,\n cwd: context.cwd,\n options: argv,\n };\n\n await runBeforeStartHooks(combinedConfig.beforeStartHooks, hookContext, combinedConfig.warnings);\n\n const codex = new Codex({\n baseUrl: request.baseUrl,\n apiKey: request.apiKey,\n preserveRegisteredTools: true,\n });\n const thread = codex.startThread(threadOptions);\n\n const exitInfo = await thread.tui(request);\n if (exitInfo.conversationId) {\n process.stdout.write(`\\nConversation ID: ${exitInfo.conversationId}\\n`);\n }\n if (exitInfo.updateAction) {\n process.stdout.write(\n `Update available (${exitInfo.updateAction.kind}): ${exitInfo.updateAction.command}\\n`,\n );\n }\n\n emitWarnings(combinedConfig.warnings, warningCount);\n}\n\nfunction buildTuiConfig(params: {\n argv: TuiCommandOptions;\n defaults: Partial<NativeTuiRequest>;\n cwd: string;\n}): { request: NativeTuiRequest; thread: ThreadOptions } {\n const { argv, defaults, cwd } = params;\n const request: NativeTuiRequest = {\n ...(defaults as NativeTuiRequest),\n };\n\n if (argv.prompt !== undefined) request.prompt = argv.prompt;\n if (argv.model !== undefined) request.model = argv.model;\n if (argv.oss !== undefined) request.oss = argv.oss;\n const sandboxMode = parseSandboxModeFlag(argv.sandbox, \"--sandbox\");\n if (sandboxMode !== undefined) {\n request.sandboxMode = sandboxMode;\n }\n\n const approvalMode = parseApprovalModeFlag(argv.approval, \"--approval\");\n if (approvalMode !== undefined) {\n request.approvalMode = approvalMode;\n }\n if (argv.resume !== undefined) request.resumeSessionId = argv.resume;\n if (argv.resumeLast !== undefined) request.resumeLast = argv.resumeLast;\n if (argv.resumePicker !== undefined) request.resumePicker = argv.resumePicker;\n if (argv.fullAuto !== undefined) request.fullAuto = argv.fullAuto;\n if (argv.dangerouslyBypassApprovalsAndSandbox !== undefined) {\n request.dangerouslyBypassApprovalsAndSandbox = argv.dangerouslyBypassApprovalsAndSandbox;\n }\n if (argv.cd !== undefined) request.workingDirectory = argv.cd;\n if (argv.configProfile !== undefined) request.configProfile = argv.configProfile;\n if (argv.webSearch !== undefined) request.webSearch = argv.webSearch;\n if (argv.linuxSandboxPath !== undefined) request.linuxSandboxPath = argv.linuxSandboxPath;\n if (argv.baseUrl !== undefined) request.baseUrl = argv.baseUrl;\n if (argv.apiKey !== undefined) request.apiKey = argv.apiKey;\n\n if (argv.configOverrides) {\n const defaultsOverrides = Array.isArray(request.configOverrides)\n ? [...request.configOverrides]\n : [];\n request.configOverrides = [...defaultsOverrides, ...argv.configOverrides];\n }\n\n if (argv.addDir) {\n const defaultsAddDir = Array.isArray(request.addDir) ? [...request.addDir] : [];\n request.addDir = [...defaultsAddDir, ...argv.addDir];\n }\n\n if (argv.image) {\n const defaultsImages = Array.isArray(request.images) ? [...request.images] : [];\n request.images = [...defaultsImages, ...argv.image];\n }\n\n const thread: ThreadOptions = {\n model: request.model,\n oss: request.oss,\n sandboxMode: request.sandboxMode,\n approvalMode: request.approvalMode,\n workingDirectory: request.workingDirectory ?? cwd,\n skipGitRepoCheck: false,\n };\n\n return { request, thread };\n}\n","import {\n ApprovalMode,\n ReasoningEffort,\n ReasoningSummary,\n SandboxMode,\n WorkspaceWriteOptions,\n} from \"./threadOptions\";\nimport {\n NativeBinding,\n NativeConversationListPage,\n NativeConversationListRequest,\n NativeDeleteConversationRequest,\n NativeDeleteConversationResult,\n NativeForkRequest,\n NativeForkResult,\n NativeResumeFromRolloutRequest,\n NativeRunRequest,\n NativeUserInputItem,\n getNativeBinding,\n} from \"./nativeBinding\";\n\nexport type CodexExecArgs = {\n input: string;\n baseUrl?: string;\n apiKey?: string;\n modelProvider?: string;\n threadId?: string | null;\n images?: string[];\n inputItems?: NativeUserInputItem[];\n model?: string;\n /** Use local OSS provider via Ollama (pulls models as needed) */\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n outputSchemaFile?: string;\n outputSchema?: unknown;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n /** @deprecated Use sandboxMode and approvalMode instead */\n fullAuto?: boolean;\n review?: ReviewExecOptions | null;\n};\n\nexport type ReviewExecOptions = {\n userFacingHint?: string;\n};\n\nexport type CodexForkArgs = {\n threadId: string;\n nthUserMessage: number;\n baseUrl?: string;\n apiKey?: string;\n modelProvider?: string;\n model?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n linuxSandboxPath?: string;\n fullAuto?: boolean;\n};\n\n/**\n * CodexExec for the native package - uses NAPI bindings exclusively.\n * No CLI fallback.\n */\nexport class CodexExec {\n private readonly native: NativeBinding;\n\n constructor() {\n const nativeBinding = getNativeBinding();\n if (!nativeBinding) {\n throw new Error(\n \"Native NAPI binding not available. Make sure @codex-native/sdk is properly installed and built.\"\n );\n }\n this.native = nativeBinding;\n }\n\n requiresOutputSchemaFile(): boolean {\n return false;\n }\n\n async *run(args: CodexExecArgs): AsyncGenerator<string> {\n const binding = this.native;\n const queue = new AsyncQueue<string>();\n\n const request: NativeRunRequest = {\n prompt: args.input,\n threadId: args.threadId ?? undefined,\n inputItems: args.inputItems,\n images: args.images && args.images.length > 0 ? args.images : undefined,\n model: args.model,\n oss: args.oss,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n sandboxMode: args.sandboxMode,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n outputSchema: args.outputSchema,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n modelProvider: args.modelProvider,\n reasoningEffort: args.reasoningEffort,\n reasoningSummary: args.reasoningSummary,\n fullAuto: args.fullAuto,\n reviewMode: args.review ? true : undefined,\n reviewHint: args.review?.userFacingHint,\n };\n\n let runPromise: Promise<void> = Promise.resolve();\n try {\n runPromise = binding\n .runThreadStream(request, (err, eventJson) => {\n if (err) {\n queue.fail(err);\n return;\n }\n try {\n queue.push(eventJson ?? \"null\");\n } catch (error) {\n queue.fail(error);\n }\n })\n .then(\n () => {\n queue.end();\n },\n (error) => {\n queue.fail(error);\n },\n );\n } catch (error) {\n queue.fail(error);\n throw error;\n }\n\n let loopError: unknown;\n try {\n for await (const value of queue) {\n yield value;\n }\n await runPromise;\n } catch (error) {\n loopError = error;\n throw error;\n } finally {\n queue.end();\n if (loopError) {\n await runPromise.catch(() => {});\n }\n }\n }\n\n async compact(args: CodexExecArgs): Promise<string[]> {\n const request: NativeRunRequest = {\n prompt: args.input,\n threadId: args.threadId ?? undefined,\n images: args.images && args.images.length > 0 ? args.images : undefined,\n model: args.model,\n modelProvider: args.modelProvider,\n oss: args.oss,\n sandboxMode: args.sandboxMode,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n outputSchema: args.outputSchema,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n fullAuto: args.fullAuto,\n reasoningEffort: args.reasoningEffort,\n reasoningSummary: args.reasoningSummary,\n reviewMode: args.review ? true : undefined,\n reviewHint: args.review?.userFacingHint,\n };\n return this.native.compactThread(request);\n }\n\n async fork(args: CodexForkArgs): Promise<NativeForkResult> {\n if (!args.threadId) {\n throw new Error(\"threadId is required to fork a conversation\");\n }\n const request: NativeForkRequest = {\n threadId: args.threadId,\n nthUserMessage: args.nthUserMessage,\n model: args.model,\n oss: args.oss,\n sandboxMode: args.sandboxMode,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n modelProvider: args.modelProvider,\n linuxSandboxPath: args.linuxSandboxPath,\n fullAuto: args.fullAuto,\n };\n return this.native.forkThread(request);\n }\n\n async listConversations(\n request: NativeConversationListRequest,\n ): Promise<NativeConversationListPage> {\n return this.native.listConversations(request);\n }\n\n async deleteConversation(\n request: NativeDeleteConversationRequest,\n ): Promise<NativeDeleteConversationResult> {\n return this.native.deleteConversation(request);\n }\n\n async resumeConversationFromRollout(\n request: NativeResumeFromRolloutRequest,\n ): Promise<NativeForkResult> {\n return this.native.resumeConversationFromRollout(request);\n }\n}\n\ntype Resolver<T> = {\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n};\n\nclass AsyncQueue<T> implements AsyncIterable<T> {\n private readonly buffer: T[] = [];\n private waiters: Resolver<T>[] = [];\n private ended = false;\n private error: unknown;\n\n push(value: T) {\n if (this.ended) return;\n if (this.waiters.length > 0) {\n const waiter = this.waiters.shift()!;\n waiter.resolve({ value, done: false });\n return;\n }\n this.buffer.push(value);\n }\n\n end() {\n if (this.ended) return;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.resolve({ value: undefined as never, done: true });\n }\n }\n\n fail(error: unknown) {\n if (this.ended) return;\n this.error = error;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.reject(error);\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.buffer.length > 0) {\n const value = this.buffer.shift()!;\n return { value, done: false };\n }\n if (this.error) {\n return Promise.reject(this.error);\n }\n if (this.ended) {\n return { value: undefined as never, done: true };\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { CodexOptions } from \"./codexOptions\";\nimport { ThreadEvent, ThreadError, Usage } from \"./events\";\nimport { convertRustEventToThreadEvent } from \"./events/convert\";\nimport { CodexExec, CodexForkArgs } from \"./exec\";\nimport { ThreadItem } from \"./items\";\nimport { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\nimport { createOutputSchemaFile, normalizeOutputSchema } from \"./outputSchemaFile\";\nimport { runTui, startTui } from \"./tui\";\nimport { getNativeBinding } from \"./nativeBinding\";\nimport type { NativeTuiRequest, NativeTuiExitInfo, ApprovalRequest, NativeUserInputItem } from \"./nativeBinding\";\nimport type { RunTuiOptions, TuiSession } from \"./tui\";\nimport { attachLspDiagnostics } from \"./lsp\";\nimport type { SkillDefinition, SkillMentionTrigger, SkillRegistry } from \"./skills\";\nimport { findSkillMentions, normalizeSkillDefinition } from \"./skills\";\n\n/** Completed turn. */\nexport type Turn = {\n items: ThreadItem[];\n finalResponse: string;\n usage: Usage | null;\n};\n\n/** Alias for `Turn` to describe the result of `run()`. */\nexport type RunResult = Turn;\n\n/** The result of the `runStreamed` method. */\nexport type StreamedTurn = {\n events: AsyncGenerator<ThreadEvent>;\n};\n\n/** Alias for `StreamedTurn` to describe the result of `runStreamed()`. */\nexport type RunStreamedResult = StreamedTurn;\n\n/** An input to send to the agent. */\nexport type UserInput =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"local_image\";\n path: string;\n };\n\nexport type Input = string | UserInput[];\n\nexport type ForkOptions = {\n nthUserMessage: number;\n threadOptions?: Partial<ThreadOptions>;\n};\n\nconst UNTRUSTED_DIRECTORY_ERROR =\n \"Not inside a trusted directory and --skip-git-repo-check was not specified.\";\n\nfunction findGitRoot(startDir: string): string | null {\n let current = path.resolve(startDir);\n\n while (true) {\n const gitPath = path.join(current, \".git\");\n if (fs.existsSync(gitPath)) {\n try {\n const stats = fs.statSync(gitPath);\n if (stats.isDirectory() || stats.isFile()) {\n return current;\n }\n } catch {\n // Ignore filesystem race conditions and keep searching upwards.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return null;\n}\n\nfunction assertTrustedDirectory(workingDirectory?: string): void {\n const directory = workingDirectory ? path.resolve(workingDirectory) : process.cwd();\n if (!findGitRoot(directory)) {\n throw new Error(UNTRUSTED_DIRECTORY_ERROR);\n }\n}\n\n/** Respesent a thread of conversation with the agent. One thread can have multiple consecutive turns. */\nexport class Thread {\n private _exec: CodexExec;\n private _options: CodexOptions;\n private _id: string | null;\n private _threadOptions: ThreadOptions;\n private _eventListeners: Array<(event: ThreadEvent) => void> = [];\n private _approvalHandler: ((request: ApprovalRequest) => boolean | Promise<boolean>) | null = null;\n private readonly _skills: SkillRegistry = new Map();\n private readonly _skillMentionTriggers: SkillMentionTrigger[];\n private readonly _codexSkills?: SkillRegistry;\n\n /** Returns the ID of the thread. Populated after the first turn starts. */\n public get id(): string | null {\n return this._id;\n }\n\n /**\n * Register an event listener for thread events.\n * @param listener Callback function that receives ThreadEvent objects\n * @returns Unsubscribe function to remove the listener\n */\n onEvent(listener: (event: ThreadEvent) => void): () => void {\n this._eventListeners.push(listener);\n return () => {\n const index = this._eventListeners.indexOf(listener);\n if (index !== -1) {\n this._eventListeners.splice(index, 1);\n }\n };\n }\n\n /**\n * Remove an event listener.\n * @param listener The listener function to remove\n */\n offEvent(listener: (event: ThreadEvent) => void): void {\n const index = this._eventListeners.indexOf(listener);\n if (index !== -1) {\n this._eventListeners.splice(index, 1);\n }\n }\n\n /**\n * Register a callback to handle approval requests from the agent.\n * The handler should return true to approve the action, false to deny it.\n *\n * @param handler Callback function that receives ApprovalRequest and returns approval decision\n * @example\n * ```typescript\n * thread.onApprovalRequest(async (request) => {\n * console.log(`Approval requested for ${request.type}`);\n * return true; // Auto-approve\n * });\n * ```\n */\n onApprovalRequest(handler: (request: ApprovalRequest) => boolean | Promise<boolean>): void {\n this._approvalHandler = handler;\n const binding = getNativeBinding();\n if (binding && typeof binding.registerApprovalCallback === \"function\") {\n binding.registerApprovalCallback(handler);\n }\n }\n\n /**\n * Emit a background notification while the agent is running the current turn.\n * The message is surfaced to event subscribers but does not modify the user input queue.\n *\n * @throws Error if the thread has not been started yet.\n */\n async sendBackgroundEvent(message: string): Promise<void> {\n const trimmed = message?.toString();\n if (!trimmed || trimmed.trim().length === 0) {\n throw new Error(\"Background event message must be a non-empty string\");\n }\n if (!this._id) {\n throw new Error(\"Cannot emit a background event before the thread has started\");\n }\n const binding = getNativeBinding();\n if (!binding || typeof binding.emitBackgroundEvent !== \"function\") {\n throw new Error(\"emitBackgroundEvent is not available in this build\");\n }\n await binding.emitBackgroundEvent({ threadId: this._id, message: trimmed });\n }\n\n /**\n * Programmatically update the agent's plan/todo list.\n * The plan will be applied at the start of the next turn.\n *\n * @param args The plan update arguments\n * @throws Error if no thread ID is available\n */\n updatePlan(args: {\n explanation?: string;\n plan: Array<{\n step: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n }>;\n }): void {\n if (!this._id) {\n throw new Error(\"Cannot update plan: no active thread\");\n }\n\n const binding = getNativeBinding();\n if (!binding || typeof binding.emitPlanUpdate !== 'function') {\n throw new Error(\"emitPlanUpdate is not available in this build\");\n }\n\n binding.emitPlanUpdate({\n threadId: this._id,\n explanation: args.explanation,\n plan: args.plan,\n });\n }\n\n /**\n * Modify the agent's plan/todo list with granular operations.\n * Changes will be applied at the start of the next turn.\n *\n * @param operations Array of operations to perform on the plan\n * @throws Error if no thread ID is available\n */\n modifyPlan(operations: Array<\n | { type: \"add\"; item: { step: string; status?: \"pending\" | \"in_progress\" | \"completed\" } }\n | { type: \"update\"; index: number; updates: Partial<{ step: string; status: \"pending\" | \"in_progress\" | \"completed\" }> }\n | { type: \"remove\"; index: number }\n | { type: \"reorder\"; newOrder: number[] }\n >): void {\n if (!this._id) {\n throw new Error(\"Cannot modify plan: no active thread\");\n }\n\n const binding = getNativeBinding();\n if (!binding || typeof binding.modifyPlan !== 'function') {\n throw new Error(\"modifyPlan is not available in this build\");\n }\n\n binding.modifyPlan({\n threadId: this._id,\n operations,\n });\n }\n\n /**\n * Add a new todo item to the agent's plan.\n *\n * @param step The todo step description\n * @param status The initial status (defaults to \"pending\")\n */\n addTodo(step: string, status: \"pending\" | \"in_progress\" | \"completed\" = \"pending\"): void {\n this.modifyPlan([{ type: \"add\", item: { step, status } }]);\n }\n\n /**\n * Update an existing todo item.\n *\n * @param index The index of the todo item to update\n * @param updates The updates to apply\n */\n updateTodo(\n index: number,\n updates: Partial<{ step: string; status: \"pending\" | \"in_progress\" | \"completed\" }>\n ): void {\n this.modifyPlan([{ type: \"update\", index, updates }]);\n }\n\n /**\n * Remove a todo item from the plan.\n *\n * @param index The index of the todo item to remove\n */\n removeTodo(index: number): void {\n this.modifyPlan([{ type: \"remove\", index }]);\n }\n\n /**\n * Reorder the todo items in the plan.\n *\n * @param newOrder Array of indices representing the new order\n */\n reorderTodos(newOrder: number[]): void {\n this.modifyPlan([{ type: \"reorder\", newOrder }]);\n }\n\n /** Compacts the conversation history for this thread using Codex's builtin compaction. */\n async compact(): Promise<void> {\n const skipGitRepoCheck =\n this._threadOptions?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(this._threadOptions?.workingDirectory);\n }\n const events: string[] = await this._exec.compact({\n input: \"compact\",\n threadId: this._id,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n model: this._threadOptions?.model ?? this._options.defaultModel,\n sandboxMode: this._threadOptions?.sandboxMode,\n approvalMode: this._threadOptions?.approvalMode,\n workspaceWriteOptions: this._threadOptions?.workspaceWriteOptions,\n reasoningEffort: this._threadOptions?.reasoningEffort,\n reasoningSummary: this._threadOptions?.reasoningSummary,\n workingDirectory: this._threadOptions?.workingDirectory,\n skipGitRepoCheck,\n modelProvider: this._options.modelProvider,\n });\n // No return value needed; compaction modifies server-side history.\n if (!Array.isArray(events)) {\n throw new Error(\"Compact did not return event list\");\n }\n }\n\n /**\n * Fork this thread at the specified user message, returning a new thread that starts\n * from the conversation history prior to that message.\n *\n * @param options Fork configuration including which user message to branch before and optional thread overrides.\n */\n async fork(options: ForkOptions): Promise<Thread> {\n if (!this._id) {\n throw new Error(\"Cannot fork: no active thread\");\n }\n const nthUserMessage = options?.nthUserMessage;\n if (\n typeof nthUserMessage !== \"number\" ||\n !Number.isInteger(nthUserMessage) ||\n nthUserMessage < 0\n ) {\n throw new Error(\"nthUserMessage must be a non-negative integer\");\n }\n\n const overrides = options.threadOptions ?? {};\n const nextThreadOptions: ThreadOptions = {\n ...this._threadOptions,\n ...overrides,\n };\n\n const skipGitRepoCheck =\n nextThreadOptions.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n nextThreadOptions.skipGitRepoCheck = skipGitRepoCheck;\n\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(nextThreadOptions.workingDirectory);\n }\n\n const forkArgs: CodexForkArgs = {\n threadId: this._id,\n nthUserMessage,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n model: nextThreadOptions.model ?? this._options.defaultModel,\n oss: nextThreadOptions.oss,\n sandboxMode: nextThreadOptions.sandboxMode,\n approvalMode: nextThreadOptions.approvalMode,\n workspaceWriteOptions: nextThreadOptions.workspaceWriteOptions,\n workingDirectory: nextThreadOptions.workingDirectory,\n skipGitRepoCheck,\n fullAuto: nextThreadOptions.fullAuto,\n modelProvider: this._options.modelProvider,\n };\n\n const result = await this._exec.fork(forkArgs);\n\n const skillsContext = this._codexSkills\n ? {\n codexSkills: this._codexSkills,\n codexSkillMentionTriggers: this._skillMentionTriggers,\n }\n : undefined;\n\n return new Thread(\n this._exec,\n this._options,\n nextThreadOptions,\n result.threadId,\n skillsContext,\n );\n }\n /* @internal */\n constructor(\n exec: CodexExec,\n options: CodexOptions,\n threadOptions: ThreadOptions,\n id: string | null = null,\n skillsContext?: {\n codexSkills: SkillRegistry;\n codexSkillMentionTriggers: SkillMentionTrigger[];\n },\n ) {\n this._exec = exec;\n this._options = options;\n this._id = id;\n this._threadOptions = threadOptions;\n this._codexSkills = skillsContext?.codexSkills;\n this._skillMentionTriggers = normalizeSkillMentionTriggers(\n threadOptions.skillMentionTriggers ?? skillsContext?.codexSkillMentionTriggers,\n );\n this.registerSkillsFromConfig(threadOptions.skills);\n }\n\n /** Provides the input to the agent and streams events as they are produced during the turn. */\n async runStreamed(input: Input, turnOptions: TurnOptions = {}): Promise<StreamedTurn> {\n return { events: this.runStreamedInternal(input, turnOptions, false) };\n }\n\n private async *runStreamedInternal(\n input: Input,\n turnOptions: TurnOptions = {},\n emitRawEvents: boolean = true,\n ): AsyncGenerator<ThreadEvent> {\n const normalizedSchema = normalizeOutputSchema(turnOptions.outputSchema);\n const needsSchemaFile = this._exec.requiresOutputSchemaFile();\n const schemaFile = needsSchemaFile\n ? await createOutputSchemaFile(normalizedSchema)\n : { schemaPath: undefined, cleanup: async () => {} };\n const options = this._threadOptions;\n const { prompt, images } = normalizeInput(input);\n const inputItems = this.buildNativeInputItems(prompt, images);\n const skipGitRepoCheck =\n options?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(options?.workingDirectory);\n }\n const generator = this._exec.run({\n input: prompt,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n threadId: this._id,\n images: inputItems ? undefined : images,\n inputItems,\n model: options?.model,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n oss: turnOptions?.oss ?? options?.oss,\n sandboxMode: options?.sandboxMode,\n approvalMode: options?.approvalMode,\n workspaceWriteOptions: options?.workspaceWriteOptions,\n workingDirectory: options?.workingDirectory,\n skipGitRepoCheck,\n outputSchemaFile: schemaFile.schemaPath,\n outputSchema: normalizedSchema,\n fullAuto: options?.fullAuto,\n });\n try {\n for await (const item of generator) {\n let parsed: any;\n try {\n parsed = JSON.parse(item);\n } catch (error) {\n throw new Error(`Failed to parse item: ${item}. Parse error: ${error}`);\n }\n\n // Skip null events (used for Raw events that should not be emitted)\n if (parsed === null) {\n continue;\n }\n\n // Conditionally forward the raw event payload\n if (emitRawEvents) {\n // Forward raw\n yield { type: \"raw_event\", raw: parsed } as ThreadEvent;\n }\n // Convert and forward mapped\n const threadEvent = convertRustEventToThreadEvent(parsed);\n if (threadEvent.type === \"thread.started\") {\n this._id = threadEvent.thread_id;\n }\n\n // Notify event listeners\n for (const listener of this._eventListeners) {\n try {\n listener(threadEvent);\n } catch (error) {\n // Don't let listener errors break the stream\n console.warn(\"Thread event listener threw error:\", error);\n }\n }\n\n yield threadEvent;\n }\n } finally {\n await schemaFile.cleanup();\n }\n }\n\n /** Provides the input to the agent and returns the completed turn. */\n async run(input: Input, turnOptions: TurnOptions = {}): Promise<Turn> {\n const generator = this.runStreamedInternal(input, turnOptions, true);\n const items: ThreadItem[] = [];\n let finalResponse: string = \"\";\n let usage: Usage | null = null;\n let turnFailure: ThreadError | null = null;\n for await (const event of generator) {\n if (event.type === \"item.completed\") {\n if (event.item.type === \"agent_message\") {\n finalResponse = event.item.text;\n }\n items.push(event.item);\n } else if (event.type === \"turn.completed\") {\n usage = event.usage;\n } else if (event.type === \"turn.failed\") {\n turnFailure = event.error;\n break;\n }\n }\n if (turnFailure) {\n throw new Error(turnFailure.message);\n }\n return { items, finalResponse, usage };\n }\n\n private buildTuiRequest(overrides: Partial<NativeTuiRequest> = {}): NativeTuiRequest {\n const skipGitRepoCheck =\n this._threadOptions?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(this._threadOptions?.workingDirectory);\n }\n\n const request: NativeTuiRequest = { ...overrides };\n const assignIfUndefined = <K extends keyof NativeTuiRequest>(\n key: K,\n value: NativeTuiRequest[K] | undefined,\n ) => {\n if (request[key] === undefined && value !== undefined) {\n request[key] = value;\n }\n };\n\n assignIfUndefined(\"model\", this._threadOptions?.model ?? this._options.defaultModel);\n assignIfUndefined(\"oss\", this._threadOptions?.oss);\n assignIfUndefined(\"sandboxMode\", this._threadOptions?.sandboxMode);\n assignIfUndefined(\"approvalMode\", this._threadOptions?.approvalMode);\n assignIfUndefined(\"fullAuto\", this._threadOptions?.fullAuto);\n assignIfUndefined(\"workingDirectory\", this._threadOptions?.workingDirectory);\n assignIfUndefined(\"baseUrl\", this._options.baseUrl);\n assignIfUndefined(\"apiKey\", this._options.apiKey);\n\n if (\n request.resumeSessionId === undefined &&\n request.resumePicker !== true &&\n request.resumeLast !== true &&\n this._id\n ) {\n request.resumeSessionId = this._id;\n }\n\n return request;\n }\n\n /**\n * Launches the interactive Codex TUI (Terminal User Interface) for this thread and returns a session handle.\n *\n * The handle allows advanced workflows where the TUI can be started and stopped programmatically,\n * while preserving the underlying conversation state.\n */\n launchTui(overrides: Partial<NativeTuiRequest> = {}): TuiSession {\n const request = this.buildTuiRequest(overrides);\n const detachLsp = this.attachDefaultLspBridge(request);\n const session = startTui(request);\n return this.wrapTuiSession(session, detachLsp);\n }\n\n /**\n * Launches the interactive Codex TUI (Terminal User Interface) for this thread.\n *\n * This method enables seamless transition from programmatic agent interaction to\n * interactive terminal chat within the same session. The TUI takes over the terminal\n * and allows you to continue the conversation interactively.\n *\n * @param overrides - Optional configuration to override thread defaults. Supports all TUI options\n * including prompt, sandbox mode, approval mode, and resume options.\n * @param options - Optional run options including an AbortSignal to request shutdown.\n * @returns A Promise that resolves to TUI exit information including:\n * - tokenUsage: Token consumption statistics\n * - conversationId: Session ID for resuming later\n * - updateAction: Optional suggested update command\n * @throws {Error} If not in a trusted git repository (unless skipGitRepoCheck is set)\n * @throws {Error} If the terminal is not interactive (TTY required)\n */\n async tui(\n overrides: Partial<NativeTuiRequest> = {},\n options: RunTuiOptions = {},\n ): Promise<NativeTuiExitInfo> {\n const request = this.buildTuiRequest(overrides);\n const detachLsp = this.attachDefaultLspBridge(request);\n try {\n return await runTui(request, options);\n } finally {\n detachLsp();\n }\n }\n\n private wrapTuiSession(session: TuiSession, cleanup: () => void): TuiSession {\n let released = false;\n const release = () => {\n if (released) {\n return;\n }\n released = true;\n cleanup();\n };\n return {\n wait: async () => {\n try {\n return await session.wait();\n } finally {\n release();\n }\n },\n shutdown: () => {\n release();\n session.shutdown();\n },\n get closed() {\n return session.closed;\n },\n };\n }\n\n private attachDefaultLspBridge(request: NativeTuiRequest): () => void {\n const workingDirectory =\n request.workingDirectory ??\n this._threadOptions?.workingDirectory ??\n (typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : \".\");\n return attachLspDiagnostics(this, {\n workingDirectory,\n waitForDiagnostics: true,\n });\n }\n\n private registerSkillsFromConfig(config: ThreadOptions[\"skills\"]): void {\n if (!config) {\n return;\n }\n if (Array.isArray(config)) {\n for (const skill of config) {\n const normalized = normalizeSkillDefinition(skill);\n this._skills.set(normalized.name, normalized);\n }\n return;\n }\n if (typeof config !== \"object\") {\n throw new Error(\"ThreadOptions.skills must be an array or object when provided\");\n }\n for (const [name, value] of Object.entries(config)) {\n if (typeof value === \"string\") {\n const normalized = normalizeSkillDefinition({ name, contents: value });\n this._skills.set(normalized.name, normalized);\n continue;\n }\n if (!value || typeof value !== \"object\") {\n throw new Error(`Invalid skill entry for ${name}`);\n }\n const normalized = normalizeSkillDefinition({ name, ...value });\n this._skills.set(normalized.name, normalized);\n }\n }\n\n private buildNativeInputItems(\n prompt: string,\n images: string[],\n ): NativeUserInputItem[] | undefined {\n if (!prompt) {\n return undefined;\n }\n\n const triggers = this._skillMentionTriggers;\n const fromThread = findSkillMentions(prompt, this._skills, triggers);\n const fromCodex = this._codexSkills\n ? findSkillMentions(prompt, this._codexSkills, triggers)\n : [];\n\n const seen = new Set<string>();\n const mentioned: SkillDefinition[] = [];\n for (const skill of [...fromThread, ...fromCodex]) {\n if (seen.has(skill.name)) {\n continue;\n }\n seen.add(skill.name);\n mentioned.push(skill);\n }\n\n if (mentioned.length === 0) {\n return undefined;\n }\n\n const items: NativeUserInputItem[] = [{ type: \"text\", text: prompt }];\n for (const path of images) {\n items.push({ type: \"local_image\", path });\n }\n\n for (const skill of mentioned) {\n items.push({\n type: \"skill_inline\",\n name: skill.name,\n contents: skill.contents,\n });\n }\n\n return items;\n }\n}\n\nfunction normalizeSkillMentionTriggers(\n triggers: SkillMentionTrigger[] | undefined,\n): SkillMentionTrigger[] {\n const filtered = (triggers ?? []).filter(\n (value): value is SkillMentionTrigger => value === \"$\" || value === \"@\",\n );\n return filtered.length > 0 ? filtered : [\"$\"];\n}\n\nfunction normalizeInput(input: Input): { prompt: string; images: string[] } {\n if (typeof input === \"string\") {\n return { prompt: input, images: [] };\n }\n const promptParts: string[] = [];\n const images: string[] = [];\n for (const item of input) {\n if (item.type === \"text\") {\n promptParts.push(item.text);\n } else if (item.type === \"local_image\") {\n images.push(item.path);\n }\n }\n return { prompt: promptParts.join(\"\\n\\n\"), images };\n}\n","import { promises as fs } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type OutputSchemaFile = {\n schemaPath?: string;\n cleanup: () => Promise<void>;\n};\n\nexport function normalizeOutputSchema(schema: unknown): Record<string, unknown> | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n // OpenAI Responses-style wrapper:\n // { type: \"json_schema\", json_schema: { name, schema, strict } }\n if (\n isJsonObject(schema) &&\n (schema.type === \"json_schema\" || schema.type === \"json-schema\") &&\n isJsonObject(schema.json_schema) &&\n isJsonObject(schema.json_schema.schema)\n ) {\n const strict =\n typeof schema.json_schema.strict === \"boolean\" ? schema.json_schema.strict : true;\n return normalizeJsonSchemaObject(schema.json_schema.schema, strict);\n }\n\n // Lenient wrapper we also accept:\n // { schema, strict?, name? }\n if (isJsonObject(schema) && isJsonObject(schema.schema)) {\n const strict = typeof schema.strict === \"boolean\" ? schema.strict : true;\n return normalizeJsonSchemaObject(schema.schema, strict);\n }\n\n // Back-compat: plain JSON schema object\n if (!isJsonObject(schema)) {\n throw new Error(\n \"outputSchema must be a plain JSON object or an OpenAI-style json_schema wrapper\",\n );\n }\n\n return normalizeJsonSchemaObject(schema, true);\n}\n\nexport async function createOutputSchemaFile(schema: unknown): Promise<OutputSchemaFile> {\n const normalizedSchema = normalizeOutputSchema(schema);\n if (!normalizedSchema) {\n return { cleanup: async () => {} };\n }\n\n const schemaDir = await fs.mkdtemp(path.join(os.tmpdir(), \"codex-output-schema-\"));\n const schemaPath = path.join(schemaDir, \"schema.json\");\n const cleanup = async () => {\n try {\n await fs.rm(schemaDir, { recursive: true, force: true });\n } catch {\n // suppress\n }\n };\n\n try {\n await fs.writeFile(schemaPath, JSON.stringify(normalizedSchema), \"utf8\");\n return { schemaPath, cleanup };\n } catch (error) {\n await cleanup();\n throw error;\n }\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeJsonSchemaObject(\n schema: Record<string, unknown>,\n strict: boolean,\n): Record<string, unknown> {\n const record = { ...schema } as Record<string, unknown> & {\n additionalProperties?: unknown;\n };\n const hasExplicitAdditional =\n typeof record.additionalProperties === \"boolean\" ||\n typeof record.additionalProperties === \"object\";\n // If strict=true, default additionalProperties to false unless explicitly provided.\n // If strict=false, preserve as-is and do not force false.\n const additionalProperties =\n hasExplicitAdditional ? record.additionalProperties : strict ? false : record.additionalProperties;\n\n return {\n ...record,\n ...(hasExplicitAdditional || strict ? { additionalProperties } : {}),\n };\n}\n","import { getNativeBinding } from \"./nativeBinding\";\nimport type {\n NativeBinding,\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n NativeTuiSession,\n} from \"./nativeBinding\";\n\nexport interface TuiSession {\n wait(): Promise<NativeTuiExitInfo>;\n shutdown(): void;\n readonly closed: boolean;\n}\n\nexport interface RunTuiOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Starts the Codex TUI (Terminal User Interface) and returns a controllable session handle.\n *\n * Use {@link TuiSession.wait} to await completion or {@link TuiSession.shutdown} to\n * request a graceful exit from another part of your program.\n */\nexport function startTui(request: NativeTuiRequest): TuiSession {\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native binding is not available\");\n }\n\n if (typeof binding.startTui === \"function\") {\n const nativeSession = binding.startTui(request);\n return wrapNativeSession(nativeSession);\n }\n\n if (typeof binding.runTui === \"function\") {\n return createLegacySession(binding, request);\n }\n\n throw new Error(\"Native binding does not expose startTui or runTui\");\n}\n\n/**\n * Launches the Codex TUI and waits for it to exit. Supports optional cancellation via AbortSignal.\n */\nexport async function runTui(\n request: NativeTuiRequest,\n options: RunTuiOptions = {},\n): Promise<NativeTuiExitInfo> {\n const session = startTui(request);\n const { signal } = options;\n let abortListener: (() => void) | undefined;\n\n try {\n if (signal) {\n if (signal.aborted) {\n session.shutdown();\n } else {\n abortListener = () => session.shutdown();\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n }\n return await session.wait();\n } finally {\n if (abortListener && signal) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n}\n\nfunction wrapNativeSession(nativeSession: NativeTuiSession): TuiSession {\n return {\n wait: () => nativeSession.wait(),\n shutdown: () => nativeSession.shutdown(),\n get closed() {\n return nativeSession.closed;\n },\n };\n}\n\nfunction createLegacySession(binding: NativeBinding, request: NativeTuiRequest): TuiSession {\n if (typeof binding.runTui !== \"function\") {\n throw new Error(\"Native binding does not expose runTui\");\n }\n\n let closed = false;\n const promise = binding.runTui(request).then(\n (result) => {\n closed = true;\n return result;\n },\n (error) => {\n closed = true;\n throw error;\n },\n );\n\n return {\n wait: () => promise,\n shutdown() {\n throw new Error(\n \"Programmatic shutdown is not supported by this native binding build. Rebuild the SDK to enable startTui().\",\n );\n },\n get closed() {\n return closed;\n },\n };\n}\n\nexport type {\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n};\n\n","export type SkillDefinition = {\n /**\n * Skill name referenced via `$<name>` (default) or `@<name>` in prompts.\n */\n name: string;\n /**\n * Optional human description (not currently injected automatically).\n */\n description?: string;\n /**\n * The skill body/instructions that will be injected when referenced.\n */\n contents: string;\n};\n\nexport type SkillRegistry = Map<string, SkillDefinition>;\n\nexport type SkillMentionTrigger = \"$\" | \"@\";\n\nfunction normalizeOneLine(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function validateSkillDefinition(skill: SkillDefinition): void {\n if (!skill || typeof skill !== \"object\") {\n throw new Error(\"Skill must be an object\");\n }\n\n if (typeof skill.name !== \"string\") {\n throw new Error(\"Skill.name must be a string\");\n }\n const name = normalizeOneLine(skill.name);\n if (name.length === 0) {\n throw new Error(\"Skill.name must be non-empty\");\n }\n if (name.length > 100) {\n throw new Error(\"Skill.name must be <= 100 characters\");\n }\n\n if (skill.description !== undefined) {\n if (typeof skill.description !== \"string\") {\n throw new Error(\"Skill.description must be a string when provided\");\n }\n const description = normalizeOneLine(skill.description);\n if (description.length > 500) {\n throw new Error(\"Skill.description must be <= 500 characters\");\n }\n }\n\n if (typeof skill.contents !== \"string\") {\n throw new Error(\"Skill.contents must be a string\");\n }\n if (skill.contents.length === 0) {\n throw new Error(\"Skill.contents must be non-empty\");\n }\n}\n\nexport function normalizeSkillDefinition(skill: SkillDefinition): SkillDefinition {\n validateSkillDefinition(skill);\n return {\n name: normalizeOneLine(skill.name),\n description: skill.description === undefined ? undefined : normalizeOneLine(skill.description),\n contents: skill.contents,\n };\n}\n\nexport function findSkillMentions(\n text: string,\n registry: SkillRegistry,\n triggers: ReadonlyArray<SkillMentionTrigger>,\n): SkillDefinition[] {\n if (!text || triggers.length === 0 || registry.size === 0) {\n return [];\n }\n\n const seen = new Set<string>();\n const matches: SkillDefinition[] = [];\n\n for (const skill of registry.values()) {\n if (seen.has(skill.name)) {\n continue;\n }\n\n for (const trigger of triggers) {\n const needle = `${trigger}${skill.name}`;\n if (text.includes(needle)) {\n seen.add(skill.name);\n matches.push(skill);\n break;\n }\n }\n }\n\n return matches;\n}\n","import { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\n\nexport type CurrentChangesReview = {\n type: \"current_changes\";\n};\n\nexport type BranchReview = {\n type: \"branch\";\n baseBranch: string;\n};\n\nexport type CommitReview = {\n type: \"commit\";\n sha: string;\n subject?: string;\n};\n\nexport type CustomReview = {\n type: \"custom\";\n prompt: string;\n hint?: string;\n};\n\nexport type ReviewTarget =\n | CurrentChangesReview\n | BranchReview\n | CommitReview\n | CustomReview;\n\nexport type ReviewInvocationOptions = {\n target: ReviewTarget;\n threadOptions?: ThreadOptions;\n turnOptions?: TurnOptions;\n};\n\nexport type ReviewPrompt = {\n prompt: string;\n hint: string;\n};\n\nexport function buildReviewPrompt(target: ReviewTarget): ReviewPrompt {\n switch (target.type) {\n case \"current_changes\":\n return {\n prompt:\n \"Review the current code changes (staged, unstaged, and untracked files) and provide prioritized findings.\",\n hint: \"current changes\",\n };\n case \"branch\": {\n const branch = target.baseBranch;\n const prompt = `Review the code changes against the base branch '${branch}'. Start by finding the merge diff between the current branch and ${branch}'s upstream e.g. (\\`git merge-base HEAD \"$(git rev-parse --abbrev-ref \"${branch}@{upstream}\")\"\\`), then run \\`git diff\\` against that SHA to see what changes we would merge into the ${branch} branch. Provide prioritized, actionable findings.`;\n return {\n prompt,\n hint: `changes against '${branch}'`,\n };\n }\n case \"commit\": {\n const shortSha = target.sha.slice(0, 7);\n const subject = target.subject ?? target.sha;\n return {\n prompt: `Review the code changes introduced by commit ${target.sha} (\"${subject}\"). Provide prioritized, actionable findings.`,\n hint: `commit ${shortSha}`,\n };\n }\n case \"custom\": {\n const hint = target.hint ?? \"custom review\";\n return {\n prompt: target.prompt,\n hint,\n };\n }\n default: {\n const exhaustive: never = target;\n throw new Error(`Unsupported review target: ${String(exhaustive)}`);\n }\n }\n}\n","import { CodexOptions, NativeToolDefinition } from \"./codexOptions\";\nimport { CodexExec } from \"./exec\";\nimport {\n NativeBinding,\n getNativeBinding,\n NativeToolInvocation,\n NativeToolResult,\n NativeToolInterceptorNativeContext,\n ApprovalRequest,\n} from \"./nativeBinding\";\nimport type {\n NativeConversationConfig,\n NativeConversationListPage,\n NativeConversationSummary,\n} from \"./nativeBinding\";\nimport type { StreamedTurn, Turn } from \"./thread\";\nimport { Thread } from \"./thread\";\nimport { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\nimport { ThreadEvent, ThreadError, Usage } from \"./events\";\nimport { ThreadItem } from \"./items\";\nimport { createOutputSchemaFile, normalizeOutputSchema } from \"./outputSchemaFile\";\nimport { buildReviewPrompt, type ReviewInvocationOptions } from \"./reviewOptions\";\nimport { LspManager } from \"./lsp/manager\";\nimport type { LspManagerOptions } from \"./lsp/types\";\nimport { formatDiagnosticsForTool } from \"./lsp/format\";\nimport type { SkillDefinition, SkillMentionTrigger, SkillRegistry } from \"./skills\";\nimport { normalizeSkillDefinition } from \"./skills\";\n\nexport type NativeToolInterceptorContext = {\n invocation: NativeToolInvocation;\n callBuiltin: (invocation?: NativeToolInvocation) => Promise<NativeToolResult>;\n};\n\nexport type ConversationSummary = NativeConversationSummary;\n\nexport type ConversationListPage = NativeConversationListPage;\n\nexport type ConversationListOptions = ThreadOptions & {\n pageSize?: number;\n cursor?: string;\n modelProviders?: string[];\n};\n\nexport type { ApprovalRequest } from \"./nativeBinding\";\n\n/**\n * Codex is the main class for interacting with the Codex agent.\n *\n * This is the native NAPI-based implementation that uses Rust bindings directly.\n *\n * Use the `startThread()` method to start a new thread or `resumeThread()` to resume a previously started thread.\n */\nexport class Codex {\n private exec: CodexExec;\n private options: CodexOptions;\n private readonly nativeBinding: NativeBinding | null;\n private readonly lspForTools: LspManager | null;\n private readonly skills: SkillRegistry = new Map();\n private readonly skillMentionTriggers: SkillMentionTrigger[];\n\n constructor(options: CodexOptions = {}) {\n const predefinedTools = options.tools ? [...options.tools] : [];\n const preserveRegisteredTools = options.preserveRegisteredTools === true;\n this.nativeBinding = getNativeBinding();\n this.options = { ...options, tools: [] };\n if (this.nativeBinding) {\n // clearRegisteredTools may not be available in all builds\n if (!preserveRegisteredTools && typeof this.nativeBinding.clearRegisteredTools === \"function\") {\n this.nativeBinding.clearRegisteredTools();\n }\n for (const tool of predefinedTools) {\n this.registerTool(tool);\n }\n }\n this.lspForTools = this.createLspManagerForTools();\n if (this.lspForTools && this.nativeBinding) {\n this.registerDefaultReadFileInterceptor();\n }\n this.skillMentionTriggers = normalizeSkillMentionTriggers(options.skillMentionTriggers);\n this.registerSkillsFromConfig(options.skills);\n this.exec = new CodexExec();\n }\n\n registerSkill(skill: SkillDefinition): void {\n const normalized = normalizeSkillDefinition(skill);\n this.skills.set(normalized.name, normalized);\n }\n\n registerSkills(skills: SkillDefinition[]): void {\n for (const skill of skills) {\n this.registerSkill(skill);\n }\n }\n\n listSkills(): SkillDefinition[] {\n return [...this.skills.values()];\n }\n\n clearSkills(): void {\n this.skills.clear();\n }\n\n private registerSkillsFromConfig(config: CodexOptions[\"skills\"]): void {\n if (!config) {\n return;\n }\n if (Array.isArray(config)) {\n this.registerSkills(config);\n return;\n }\n if (typeof config !== \"object\") {\n throw new Error(\"skills must be an array or object when provided\");\n }\n for (const [name, value] of Object.entries(config)) {\n if (typeof value === \"string\") {\n this.registerSkill({ name, contents: value });\n continue;\n }\n if (!value || typeof value !== \"object\") {\n throw new Error(`Invalid skill entry for ${name}`);\n }\n this.registerSkill({ name, ...value });\n }\n }\n\n /**\n * Register a tool for Codex. When `tool.name` matches a built-in Codex tool,\n * the native implementation is replaced for this Codex instance.\n */\n registerTool(tool: NativeToolDefinition): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool registration requires the NAPI binding\");\n }\n // registerTool may not be available in all builds\n if (typeof this.nativeBinding.registerTool !== \"function\") {\n console.warn(\"registerTool is not available in this build - tools feature may be incomplete\");\n return;\n }\n const { handler, ...info } = tool;\n this.nativeBinding.registerTool(info, handler);\n if (!this.options.tools) {\n this.options.tools = [];\n }\n this.options.tools.push(tool);\n }\n\n /**\n * Register a tool interceptor for Codex. Interceptors can modify tool invocations\n * and results, and can call the built-in implementation.\n */\n registerToolInterceptor(\n toolName: string,\n handler: (context: NativeToolInterceptorContext) => Promise<NativeToolResult> | NativeToolResult,\n ): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool interceptor registration requires the NAPI binding\");\n }\n // registerToolInterceptor may not be available in all builds\n if (\n typeof this.nativeBinding.registerToolInterceptor !== \"function\" ||\n typeof this.nativeBinding.callToolBuiltin !== \"function\"\n ) {\n console.warn(\"registerToolInterceptor is not available in this build - interceptor feature may be incomplete\");\n return;\n }\n this.nativeBinding.registerToolInterceptor(toolName, async (...args: unknown[]) => {\n const context = (args.length === 1 ? args[0] : args[1]) as\n | NativeToolInterceptorNativeContext\n | null\n | undefined;\n if (!context || typeof context !== \"object\") {\n throw new Error(\"Native interceptor callback did not receive a context object\");\n }\n const { invocation, token } = context;\n const callBuiltin = (override?: NativeToolInvocation) =>\n this.nativeBinding!.callToolBuiltin(token, override ?? invocation);\n return handler({ invocation, callBuiltin });\n });\n }\n\n /**\n * Clear all registered tools, restoring built-in defaults.\n */\n clearTools(): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool management requires the NAPI binding\");\n }\n if (typeof this.nativeBinding.clearRegisteredTools === \"function\") {\n this.nativeBinding.clearRegisteredTools();\n }\n if (this.options.tools) {\n this.options.tools = [];\n }\n }\n\n private buildConversationConfig(options: ThreadOptions = {}): NativeConversationConfig {\n return {\n model: options.model ?? this.options.defaultModel,\n modelProvider: options.modelProvider ?? this.options.modelProvider,\n oss: options.oss,\n sandboxMode: options.sandboxMode,\n approvalMode: options.approvalMode,\n workspaceWriteOptions: options.workspaceWriteOptions,\n workingDirectory: options.workingDirectory,\n skipGitRepoCheck: options.skipGitRepoCheck,\n reasoningEffort: options.reasoningEffort,\n reasoningSummary: options.reasoningSummary,\n fullAuto: options.fullAuto,\n baseUrl: this.options.baseUrl,\n apiKey: this.options.apiKey,\n };\n }\n\n private createLspManagerForTools(): LspManager | null {\n const cwd =\n typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : \".\";\n const options: LspManagerOptions = {\n workingDirectory: cwd,\n waitForDiagnostics: true,\n };\n try {\n return new LspManager(options);\n } catch {\n return null;\n }\n }\n\n private registerDefaultReadFileInterceptor(): void {\n if (!this.lspForTools) {\n return;\n }\n try {\n this.registerToolInterceptor(\"read_file\", async ({ invocation, callBuiltin }) => {\n let base: NativeToolResult;\n try {\n base = await callBuiltin();\n } catch (err) {\n // If the native binding no longer has a pending builtin (e.g., token mismatch),\n // fall back to the raw invocation result instead of failing the turn.\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n output: undefined,\n };\n }\n if (!base.output || base.success === false) {\n return base;\n }\n\n let filePath: string | undefined;\n if (invocation.arguments) {\n try {\n const args = JSON.parse(invocation.arguments) as {\n file_path?: unknown;\n path?: unknown;\n };\n const candidate =\n (typeof args.file_path === \"string\" && args.file_path) ||\n (typeof args.path === \"string\" && args.path) ||\n undefined;\n if (candidate && candidate.trim().length > 0) {\n filePath = candidate;\n }\n } catch {\n // ignore malformed args\n }\n }\n if (!filePath) {\n return base;\n }\n\n let diagnosticsText = \"\";\n try {\n const results = await this.lspForTools!.collectDiagnostics([filePath]);\n if (!results.length) {\n return base;\n }\n diagnosticsText = formatDiagnosticsForTool(results);\n } catch {\n return base;\n }\n\n if (!diagnosticsText) {\n return base;\n }\n\n const header = `LSP diagnostics for ${filePath}:\\n${diagnosticsText}`;\n return prependSystemHintToToolResult(base, header);\n });\n } catch {\n // Interceptor support may be unavailable; fail silently.\n }\n }\n\n /**\n * Register a programmatic approval callback that Codex will call before executing\n * sensitive operations (e.g., shell commands, file writes).\n */\n setApprovalCallback(\n handler: (request: ApprovalRequest) => boolean | Promise<boolean>,\n ): void {\n if (!this.nativeBinding || typeof this.nativeBinding.registerApprovalCallback !== \"function\") {\n console.warn(\"Approval callback is not available in this build\");\n return;\n }\n this.nativeBinding.registerApprovalCallback(handler);\n }\n\n /**\n * Starts a new conversation with an agent.\n * @returns A new thread instance.\n */\n startThread(options: ThreadOptions = {}): Thread {\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, null, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n /**\n * Resumes a conversation with an agent based on the thread id.\n * Threads are persisted in ~/.codex/sessions.\n *\n * @param id The id of the thread to resume.\n * @returns A new thread instance.\n */\n resumeThread(id: string, options: ThreadOptions = {}): Thread {\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, id, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n async listConversations(options: ConversationListOptions = {}): Promise<ConversationListPage> {\n const request = {\n config: this.buildConversationConfig(options),\n pageSize: options.pageSize,\n cursor: options.cursor,\n modelProviders: options.modelProviders,\n };\n return this.exec.listConversations(request);\n }\n\n async deleteConversation(id: string, options: ThreadOptions = {}): Promise<boolean> {\n const result = await this.exec.deleteConversation({\n id,\n config: this.buildConversationConfig(options),\n });\n return result.deleted;\n }\n\n async resumeConversationFromRollout(\n rolloutPath: string,\n options: ThreadOptions = {},\n ): Promise<Thread> {\n const result = await this.exec.resumeConversationFromRollout({\n rolloutPath,\n config: this.buildConversationConfig(options),\n });\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, result.threadId, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n /**\n * Starts a review task using the built-in Codex review flow.\n */\n async review(options: ReviewInvocationOptions): Promise<Turn> {\n const generator = this.reviewStreamedInternal(options);\n const items: ThreadItem[] = [];\n let finalResponse = \"\";\n let usage: Usage | null = null;\n let turnFailure: ThreadError | null = null;\n for await (const event of generator) {\n if (event === null) continue;\n if (event.type === \"item.completed\") {\n if (event.item.type === \"agent_message\") {\n finalResponse = event.item.text;\n }\n items.push(event.item);\n } else if (event.type === \"exited_review_mode\") {\n // Capture the structured review output\n if (event.review_output) {\n const reviewOutput = event.review_output;\n let reviewText = \"\";\n\n // Add overall explanation\n if (reviewOutput.overall_explanation) {\n reviewText += reviewOutput.overall_explanation;\n }\n\n // Add findings if present\n if (reviewOutput.findings && reviewOutput.findings.length > 0) {\n if (reviewText) reviewText += \"\\n\\n\";\n reviewText += \"## Review Findings\\n\\n\";\n reviewOutput.findings.forEach((finding, index) => {\n reviewText += `### ${index + 1}. ${finding.title}\\n`;\n reviewText += `${finding.body}\\n`;\n reviewText += `**Priority:** ${finding.priority} | **Confidence:** ${finding.confidence_score}\\n`;\n reviewText += `**Location:** ${finding.code_location.absolute_file_path}:${finding.code_location.line_range.start}-${finding.code_location.line_range.end}\\n\\n`;\n });\n }\n\n finalResponse = reviewText;\n }\n } else if (event.type === \"turn.completed\") {\n usage = event.usage;\n } else if (event.type === \"turn.failed\") {\n turnFailure = event.error;\n break;\n }\n }\n if (turnFailure) {\n throw new Error(turnFailure.message);\n }\n return { items, finalResponse, usage };\n }\n\n /**\n * Starts a review task and returns the event stream.\n */\n async reviewStreamed(options: ReviewInvocationOptions): Promise<StreamedTurn> {\n return { events: this.reviewStreamedInternal(options) };\n }\n\n private async *reviewStreamedInternal(\n options: ReviewInvocationOptions,\n ): AsyncGenerator<ThreadEvent> {\n const { target, threadOptions = {}, turnOptions = {} } = options;\n const { prompt, hint } = buildReviewPrompt(target);\n const normalizedSchema = normalizeOutputSchema(turnOptions.outputSchema);\n const needsSchemaFile = this.exec.requiresOutputSchemaFile();\n const schemaFile = needsSchemaFile\n ? await createOutputSchemaFile(normalizedSchema)\n : { schemaPath: undefined, cleanup: async () => {} };\n const generator = this.exec.run({\n input: prompt,\n baseUrl: this.options.baseUrl,\n apiKey: this.options.apiKey,\n model: threadOptions.model,\n modelProvider: threadOptions.modelProvider ?? this.options.modelProvider,\n oss: threadOptions.oss,\n sandboxMode: threadOptions.sandboxMode,\n approvalMode: threadOptions.approvalMode,\n workspaceWriteOptions: threadOptions.workspaceWriteOptions,\n workingDirectory: threadOptions.workingDirectory,\n skipGitRepoCheck: threadOptions.skipGitRepoCheck,\n outputSchemaFile: schemaFile.schemaPath,\n outputSchema: normalizedSchema,\n fullAuto: threadOptions.fullAuto,\n review: {\n userFacingHint: hint,\n },\n });\n try {\n for await (const item of generator) {\n let parsed: ThreadEvent;\n try {\n parsed = JSON.parse(item) as ThreadEvent;\n } catch (error) {\n throw new Error(`Failed to parse item: ${item}`, { cause: error });\n }\n yield parsed;\n }\n } finally {\n await schemaFile.cleanup();\n }\n }\n}\n\nfunction normalizeSkillMentionTriggers(\n triggers: CodexOptions[\"skillMentionTriggers\"],\n): SkillMentionTrigger[] {\n if (!triggers) {\n return [\"$\"];\n }\n if (!Array.isArray(triggers)) {\n throw new Error(\"skillMentionTriggers must be an array when provided\");\n }\n const normalized = triggers.filter(\n (value): value is SkillMentionTrigger => value === \"$\" || value === \"@\",\n );\n return normalized.length > 0 ? normalized : [\"$\"];\n}\n\nfunction prependSystemHintToToolResult(\n base: NativeToolResult,\n hint: string,\n): NativeToolResult {\n const trimmedHint = hint.trim();\n if (!trimmedHint) {\n return base;\n }\n const existing = base.output ?? \"\";\n const separator = existing.length === 0 || existing.startsWith(\"\\n\") ? \"\\n\\n\" : \"\\n\\n\";\n const output = existing.length === 0\n ? `[SYSTEM_HINT]\\n${trimmedHint}`\n : `[SYSTEM_HINT]\\n${trimmedHint}${separator}${existing}`;\n return {\n ...base,\n output,\n };\n}\n","import path from \"node:path\";\nimport os from \"node:os\";\nimport { parseArgs } from \"node:util\";\n\nimport { fastEmbedInit, reverieIndexSemantic, type ReverieSemanticSearchOptions } from \"../nativeBinding\";\n\nconst DEFAULT_MODEL = \"mixedbread-ai/mxbai-embed-large-v1\";\n\nconst INDEX_OPTION_DEFS = {\n \"codex-home\": { type: \"string\" } as const,\n \"project-root\": { type: \"string\" } as const,\n limit: { type: \"string\" } as const,\n \"max-candidates\": { type: \"string\" } as const,\n \"batch-size\": { type: \"string\" } as const,\n normalize: { type: \"boolean\" } as const,\n cache: { type: \"boolean\" } as const,\n \"embed-model\": { type: \"string\" } as const,\n \"embed-cache-dir\": { type: \"string\" } as const,\n \"embed-max-length\": { type: \"string\" } as const,\n \"no-progress\": { type: \"boolean\" } as const,\n \"skip-embed-init\": { type: \"boolean\" } as const,\n};\n\nexport async function executeReverieCommand(args: string[]): Promise<void> {\n const [first, ...rest] = args;\n const isFlag = first?.startsWith(\"-\");\n const command = !first || isFlag ? \"index\" : first;\n const tail = !first || isFlag ? args : rest;\n if (command !== \"index\") {\n throw new Error(`Unknown reverie command '${command}'. Supported subcommands: index`);\n }\n await runReverieIndex(tail);\n}\n\nasync function runReverieIndex(args: string[]): Promise<void> {\n const { values } = parseArgs({ args, options: INDEX_OPTION_DEFS, allowPositionals: false, strict: true });\n\n const codexHome = resolveCodexHome(values[\"codex-home\"]);\n const projectRoot = resolveProjectRoot(values[\"project-root\"]);\n const limit = parseOptionalInt(values.limit);\n const maxCandidates = parseOptionalInt(values[\"max-candidates\"]);\n const batchSize = parseOptionalInt(values[\"batch-size\"]);\n const embedMaxLength = parseOptionalInt(values[\"embed-max-length\"]);\n const normalize = typeof values.normalize === \"boolean\" ? values.normalize : undefined;\n const cache = typeof values.cache === \"boolean\" ? values.cache : undefined;\n const embedModel = typeof values[\"embed-model\"] === \"string\" ? values[\"embed-model\"] : DEFAULT_MODEL;\n const embedCacheDir = typeof values[\"embed-cache-dir\"] === \"string\" ? values[\"embed-cache-dir\"] : undefined;\n const showDownloadProgress = values[\"no-progress\"] ? false : true;\n const skipEmbedInit = values[\"skip-embed-init\"] === true;\n\n if (!skipEmbedInit) {\n await fastEmbedInit({\n model: embedModel,\n cacheDir: embedCacheDir ? path.resolve(embedCacheDir) : defaultCacheDir(),\n maxLength: embedMaxLength ?? undefined,\n showDownloadProgress,\n });\n }\n\n const options: ReverieSemanticSearchOptions = {\n limit,\n maxCandidates,\n projectRoot,\n batchSize,\n normalize,\n cache,\n };\n\n console.log(`📂 Codex home: ${codexHome}`);\n console.log(`📁 Project root: ${projectRoot}`);\n const stats = await reverieIndexSemantic(codexHome, options);\n console.log(\n `✅ Indexed ${stats.documentsEmbedded} conversation(s) across ${stats.batches} batch(es); cache warmed at ${projectRoot}`,\n );\n}\n\nfunction resolveCodexHome(explicit?: string): string {\n if (explicit) {\n return path.resolve(explicit);\n }\n if (process.env.CODEX_HOME) {\n return process.env.CODEX_HOME;\n }\n const home = os.homedir() || process.cwd();\n return path.join(home, \".codex\");\n}\n\nfunction resolveProjectRoot(explicit?: string): string {\n if (explicit) {\n return path.resolve(explicit);\n }\n return process.cwd();\n}\n\nfunction parseOptionalInt(value: unknown): number | undefined {\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction defaultCacheDir(): string | undefined {\n if (process.env.CODEX_EMBED_CACHE) {\n return path.resolve(process.env.CODEX_EMBED_CACHE);\n }\n return path.join(os.tmpdir(), \"codex-embed-cache\");\n}\n","import { getNativeBinding } from \"../nativeBinding\";\nimport type {\n ApprovalHandler,\n ApprovalRegistration,\n CodexNativeConfig,\n CombinedConfig,\n HookConfig,\n HookRegistration,\n LoadedConfigFile,\n LoadedPlugin,\n PluginContext,\n ToolConfig,\n ToolInterceptorConfig,\n} from \"./types\";\n\nexport async function buildCombinedConfig(params: {\n cwd: string;\n config: LoadedConfigFile;\n}): Promise<CombinedConfig> {\n const { cwd, config } = params;\n const warnings = [...config.warnings];\n const combined: CombinedConfig = {\n runDefaults: {},\n tuiDefaults: {},\n tools: [],\n interceptors: [],\n approval: undefined,\n beforeStartHooks: [],\n onEventHooks: [],\n warnings,\n allowReservedInterceptors: false,\n };\n\n const pluginContext: PluginContext = { cwd, configPath: config.configPath };\n\n if (config.config) {\n accumulateConfig({\n combined,\n config: config.config,\n source: config.configPath ?? \"config\",\n warnings,\n });\n }\n\n for (const loaded of config.plugins) {\n const pluginConfig = await evaluatePlugin(loaded, pluginContext, warnings);\n if (pluginConfig) {\n accumulateConfig({\n combined,\n config: pluginConfig,\n source: loaded.spec,\n warnings,\n });\n }\n }\n\n combined.warnings = warnings;\n return combined;\n}\n\nexport function applyNativeRegistrations(combined: CombinedConfig): void {\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native binding is not available.\");\n }\n\n binding.clearRegisteredTools();\n\n // De‑dupe tools by name: first registration wins\n const seenTools = new Set<string>();\n for (const tool of combined.tools) {\n const { handler, ...info } = tool;\n const name = String((info as any).name);\n if (seenTools.has(name)) {\n combined.warnings.push(`Duplicate tool \"${name}\" ignored (first definition wins).`);\n continue;\n }\n seenTools.add(name);\n binding.registerTool(info as any, handler as any);\n }\n\n // Register approval callback first so its interceptors have priority\n if (combined.approval && typeof binding.registerApprovalCallback === \"function\") {\n binding.registerApprovalCallback(combined.approval.handler);\n }\n\n const RESERVED = new Set<string>([\"local_shell\", \"exec_command\", \"apply_patch\", \"web_search\"]);\n const seenInterceptors = new Set<string>();\n\n for (const interceptor of combined.interceptors) {\n const name = interceptor.toolName;\n if (RESERVED.has(name) && !combined.allowReservedInterceptors) {\n combined.warnings.push(\n `Interceptor for \"${name}\" ignored: reserved for approval gating. Use approvals() hook instead.`,\n );\n continue;\n }\n if (seenInterceptors.has(name)) {\n combined.warnings.push(\n `Multiple interceptors for \"${name}\" detected; only the first will be used.`,\n );\n continue;\n }\n seenInterceptors.add(name);\n binding.registerToolInterceptor(interceptor.toolName, interceptor.handler);\n }\n}\n\nasync function evaluatePlugin(\n loaded: LoadedPlugin,\n context: PluginContext,\n warnings: string[],\n): Promise<CodexNativeConfig | null> {\n const { plugin, spec } = loaded;\n\n try {\n if (typeof plugin === \"function\") {\n const result = await plugin(context);\n return coerceConfig(result, spec, warnings);\n }\n\n if (plugin && typeof plugin === \"object\") {\n const candidate = plugin as CodexNativeConfig & {\n setup?: (ctx: PluginContext) => unknown;\n config?: CodexNativeConfig | ((ctx: PluginContext) => unknown);\n };\n\n if (typeof candidate.setup === \"function\") {\n await candidate.setup(context);\n }\n\n if (typeof candidate.config === \"function\") {\n return coerceConfig(await candidate.config(context), spec, warnings);\n }\n\n if (candidate.config) {\n return coerceConfig(candidate.config, spec, warnings);\n }\n\n return coerceConfig(candidate, spec, warnings);\n }\n\n return coerceConfig(plugin, spec, warnings);\n } catch (error) {\n warnings.push(`Plugin \"${spec}\" threw an error: ${(error as Error).message}`);\n return null;\n }\n}\n\nfunction coerceConfig(\n value: unknown,\n source: string,\n warnings: string[],\n): CodexNativeConfig | null {\n if (!value) {\n return null;\n }\n\n if (typeof value === \"object\") {\n return value as CodexNativeConfig;\n }\n\n warnings.push(`Plugin \"${source}\" did not return a config object.`);\n return null;\n}\n\nfunction accumulateConfig(params: {\n combined: CombinedConfig;\n config: CodexNativeConfig;\n source: string;\n warnings: string[];\n}) {\n const { combined, config, source, warnings } = params;\n\n if (config.defaults?.run) {\n combined.runDefaults = { ...combined.runDefaults, ...config.defaults.run };\n }\n if (config.defaults?.tui) {\n combined.tuiDefaults = { ...combined.tuiDefaults, ...config.defaults.tui };\n }\n\n if (Array.isArray(config.tools)) {\n for (const tool of config.tools) {\n if (!tool || typeof tool !== \"object\" || typeof tool.handler !== \"function\") {\n warnings.push(`Invalid tool definition supplied by \"${source}\".`);\n continue;\n }\n combined.tools.push(tool);\n }\n }\n\n if (Array.isArray(config.interceptors)) {\n for (const interceptor of config.interceptors) {\n if (\n !interceptor ||\n typeof interceptor !== \"object\" ||\n typeof interceptor.toolName !== \"string\" ||\n typeof interceptor.handler !== \"function\"\n ) {\n warnings.push(`Invalid interceptor definition supplied by \"${source}\".`);\n continue;\n }\n combined.interceptors.push(interceptor);\n }\n }\n\n if (config.approvals) {\n if (typeof config.approvals !== \"function\") {\n warnings.push(`Approval callback from \"${source}\" must be a function.`);\n } else {\n if (combined.approval) {\n warnings.push(\n `Approval callback from \"${source}\" overrides handler from \"${combined.approval.source}\".`,\n );\n }\n combined.approval = { source, handler: config.approvals as ApprovalHandler };\n }\n }\n\n if (config.hooks) {\n addHooks(combined, config.hooks, source, warnings);\n }\n\n if (config.allowReservedInterceptors === true) {\n combined.allowReservedInterceptors = true;\n }\n}\n\nfunction addHooks(\n combined: CombinedConfig,\n hooks: HookConfig,\n source: string,\n warnings: string[],\n): void {\n if (hooks.beforeStart) {\n const beforeStartCallbacks = Array.isArray(hooks.beforeStart)\n ? hooks.beforeStart\n : [hooks.beforeStart];\n for (const callback of beforeStartCallbacks) {\n if (typeof callback !== \"function\") {\n warnings.push(`beforeStart hook from \"${source}\" must be a function.`);\n continue;\n }\n combined.beforeStartHooks.push({ source, callback });\n }\n }\n\n if (hooks.onEvent) {\n const eventCallbacks = Array.isArray(hooks.onEvent) ? hooks.onEvent : [hooks.onEvent];\n for (const callback of eventCallbacks) {\n if (typeof callback !== \"function\") {\n warnings.push(`onEvent hook from \"${source}\" must be a function.`);\n continue;\n }\n combined.onEventHooks.push({ source, callback });\n }\n }\n}\n\n"],"mappings":"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","names":["import_node_process","import_node_util","import_node_url","path","fs","fsPromises","module","import_node_fs","import_promises","import_node_path","import_node_fs","import_node_module","import_node_path","import_node_url","dirname","path","fs","getImportMetaUrl","importMetaUrl","import_node_path","path","path","path","fs","path","fs","path","import_node_url","resolve","path","process","path","fsPromises","fs","resolve","import_node_process","AsyncQueue","resolve","fs","path","import_node_fs","import_node_path","fs","path","os","findGitRoot","assertTrustedDirectory","normalized","path","normalizeSkillMentionTriggers","process","import_node_path","import_node_os","path","os","CLI_ENTRYPOINT_ENV","process","isInteractive"]}
1
+ {"version":3,"sources":["../../../node_modules/tsup/assets/cjs_shims.js","../src/cli/index.ts","../package.json","../src/cli/config.ts","../src/cli/run.ts","../src/nativeBinding.ts","../src/events/convert.ts","../src/cli/optionParsers.ts","../src/cli/hooks.ts","../src/cli/elevatedDefaults.ts","../src/lsp/bridge.ts","../src/lsp/manager.ts","../src/lsp/servers.ts","../src/lsp/client.ts","../src/lsp/format.ts","../src/lsp/hooks.ts","../src/cli/lspBridge.ts","../src/cli/tui.ts","../src/exec.ts","../src/thread.ts","../src/outputSchemaFile.ts","../src/tui.ts","../src/skills.ts","../src/reviewOptions.ts","../src/codex.ts","../src/cli/reverie.ts","../src/cli/runtime.ts"],"sourcesContent":["// Shim globals in cjs bundle\n// There's a weird bug that esbuild will always inject importMetaUrl\n// if we export it as `const importMetaUrl = ... __filename ...`\n// But using a function will not cause this issue\n\nconst getImportMetaUrl = () =>\n typeof document === 'undefined'\n ? new URL(`file:${__filename}`).href\n : (document.currentScript && document.currentScript.src) ||\n new URL('main.js', document.baseURI).href\n\nexport const importMetaUrl = /* @__PURE__ */ getImportMetaUrl()\n","#!/usr/bin/env node\n\nimport process from \"node:process\";\nimport { parseArgs } from \"node:util\";\nimport { fileURLToPath } from \"node:url\";\n\nimport packageJson from \"../../package.json\";\nimport { loadCliConfig } from \"./config\";\nimport { executeRunCommand } from \"./run\";\nimport { executeTuiCommand } from \"./tui\";\nimport { executeReverieCommand } from \"./reverie\";\nimport { runApplyPatch } from \"../nativeBinding\";\nimport type {\n CliContext,\n ConfigLoaderOptions,\n GlobalOptions,\n RunCommandOptions,\n TuiCommandOptions,\n CommandName,\n} from \"./types\";\nimport { applyNativeRegistrations, buildCombinedConfig } from \"./runtime\";\n\nconst VERSION = packageJson.version;\nconst SANDBOX_CHOICES = [\"read-only\", \"workspace-write\", \"danger-full-access\"] as const;\nconst APPROVAL_CHOICES = [\"never\", \"on-request\", \"on-failure\", \"untrusted\"] as const;\nconst APPLY_PATCH_FLAG = \"--codex-run-as-apply-patch\";\nconst CLI_ENTRYPOINT_ENV = \"CODEX_NODE_CLI_ENTRYPOINT\";\n\ntry {\n const entrypoint = fileURLToPath(import.meta.url);\n process.env[CLI_ENTRYPOINT_ENV] = entrypoint;\n} catch {\n if (process.argv[1]) {\n process.env[CLI_ENTRYPOINT_ENV] = process.argv[1];\n }\n}\n\nconst GLOBAL_OPTION_DEFS = {\n config: { type: \"string\" } as const,\n \"no-config\": { type: \"boolean\" } as const,\n plugin: { type: \"string\", multiple: true } as const,\n};\n\nconst RUN_OPTION_DEFS = {\n model: { type: \"string\" } as const,\n oss: { type: \"boolean\" } as const,\n sandbox: { type: \"string\" } as const,\n approval: { type: \"string\" } as const,\n schema: { type: \"string\" } as const,\n \"thread-id\": { type: \"string\" } as const,\n \"base-url\": { type: \"string\" } as const,\n \"api-key\": { type: \"string\" } as const,\n \"linux-sandbox-path\": { type: \"string\" } as const,\n \"full-auto\": { type: \"boolean\" } as const,\n \"skip-git-repo-check\": { type: \"boolean\" } as const,\n cd: { type: \"string\" } as const,\n image: { type: \"string\", multiple: true } as const,\n \"review-mode\": { type: \"boolean\" } as const,\n \"review-hint\": { type: \"string\" } as const,\n};\n\nconst TUI_OPTION_DEFS = {\n model: { type: \"string\" } as const,\n oss: { type: \"boolean\" } as const,\n sandbox: { type: \"string\" } as const,\n approval: { type: \"string\" } as const,\n resume: { type: \"string\" } as const,\n \"resume-last\": { type: \"boolean\" } as const,\n \"resume-picker\": { type: \"boolean\" } as const,\n \"full-auto\": { type: \"boolean\" } as const,\n \"dangerously-bypass-approvals-and-sandbox\": { type: \"boolean\" } as const,\n cd: { type: \"string\" } as const,\n \"config-profile\": { type: \"string\" } as const,\n \"config-overrides\": { type: \"string\", multiple: true } as const,\n \"add-dir\": { type: \"string\", multiple: true } as const,\n image: { type: \"string\", multiple: true } as const,\n \"web-search\": { type: \"boolean\" } as const,\n \"linux-sandbox-path\": { type: \"string\" } as const,\n \"base-url\": { type: \"string\" } as const,\n \"api-key\": { type: \"string\" } as const,\n};\n\nasync function main(): Promise<void> {\n const rawArgs = process.argv.slice(2);\n\n if (maybeHandleApplyPatch(rawArgs)) {\n return;\n }\n\n if (hasFlag(rawArgs, \"--version\") || hasFlag(rawArgs, \"-v\")) {\n printVersion();\n return;\n }\n\n const generalHelpRequested = hasFlag(rawArgs, \"--help\") || hasFlag(rawArgs, \"-h\");\n\n if (generalHelpRequested && !hasExplicitCommand(rawArgs)) {\n printGeneralHelp();\n return;\n }\n\n const { command, args } = selectCommand(rawArgs);\n\n if (hasCommandHelpFlag(args)) {\n printCommandHelp(command);\n return;\n }\n\n if (command === \"reverie-index\") {\n await executeReverieCommand(args);\n return;\n }\n\n const options = command === \"tui\" ? parseTuiCommand(args) : parseRunCommand(args);\n\n validateOptionChoices(command, options);\n\n const context = await createContext(options);\n\n if (command === \"tui\") {\n await executeTuiCommand(options as TuiCommandOptions, context);\n } else {\n await executeRunCommand(options as RunCommandOptions, context);\n }\n}\n\nfunction maybeHandleApplyPatch(args: string[]): boolean {\n if (args.length === 0 || args[0] !== APPLY_PATCH_FLAG) {\n return false;\n }\n\n const patch = args[1];\n if (!patch) {\n console.error(`${APPLY_PATCH_FLAG} requires a patch argument.`);\n process.exitCode = 1;\n return true;\n }\n\n try {\n runApplyPatch(patch);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.error(`apply_patch failed: ${message}`);\n process.exitCode = 1;\n }\n return true;\n}\n\nfunction selectCommand(argv: string[]): { command: CommandName; args: string[] } {\n // Handle explicit \"tui\" and \"run\" subcommands\n if (argv.length > 0) {\n const [first, ...rest] = argv;\n if (first === \"tui\") {\n return { command: \"tui\", args: rest };\n }\n if (first === \"run\") {\n return { command: \"run\", args: rest };\n }\n if (first === \"reverie\") {\n if (rest.length === 0) {\n return { command: \"reverie-index\", args: [] };\n }\n return { command: \"reverie-index\", args: rest };\n }\n // Unrecognized first arg: treat as prompt\n }\n\n // Default behavior when no arguments: start TUI only when a TTY is available\n // This matches codex-rs behavior for interactive shells; headless users can rely on\n // the run command without needing additional flags\n if (argv.length === 0) {\n const isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n return { command: isInteractive ? \"tui\" : \"run\", args: [] };\n }\n\n // Non-empty argv without explicit command: treat as prompt\n // Smart default based on whether we're in an interactive terminal\n const isInteractive = process.stdout.isTTY && process.stdin.isTTY;\n return { command: isInteractive ? \"tui\" : \"run\", args: argv };\n}\n\nfunction hasExplicitCommand(argv: string[]): boolean {\n if (argv.length === 0) {\n return false;\n }\n const first = argv[0];\n return first === \"tui\" || first === \"run\" || first === \"reverie\";\n}\n\nfunction parseRunCommand(args: string[]): RunCommandOptions {\n const { values, positionals } = parseArgs({\n args,\n options: { ...GLOBAL_OPTION_DEFS, ...RUN_OPTION_DEFS },\n allowPositionals: true,\n strict: true,\n });\n const options = camelCaseKeys(values);\n const runOptions: RunCommandOptions = {\n ...(options as RunCommandOptions),\n };\n if (!runOptions.prompt && positionals.length > 0) {\n runOptions.prompt = positionals[0];\n }\n return runOptions;\n}\n\nfunction parseTuiCommand(args: string[]): TuiCommandOptions {\n const { values, positionals } = parseArgs({\n args,\n options: { ...GLOBAL_OPTION_DEFS, ...TUI_OPTION_DEFS },\n allowPositionals: true,\n strict: true,\n });\n const options = camelCaseKeys(values);\n const tuiOptions: TuiCommandOptions = {\n ...(options as TuiCommandOptions),\n };\n if (!tuiOptions.prompt && positionals.length > 0) {\n tuiOptions.prompt = positionals[0];\n }\n return tuiOptions;\n}\n\nasync function createContext(options: GlobalOptions): Promise<CliContext> {\n const cwd = process.cwd();\n const configOptions: ConfigLoaderOptions = {\n cwd,\n explicitConfigPath: options.config,\n noConfig: options.noConfig,\n pluginPaths: normalizeStringArray(options.plugin),\n };\n const config = await loadCliConfig(configOptions);\n const combinedConfig = await buildCombinedConfig({ cwd, config });\n applyNativeRegistrations(combinedConfig);\n return { cwd, config, combinedConfig };\n}\n\nfunction normalizeStringArray(value: unknown): string[] {\n if (Array.isArray(value)) {\n return value.map((item) => String(item));\n }\n if (typeof value === \"string\") {\n return [value];\n }\n return [];\n}\n\nfunction camelCaseKeys(record: Record<string, unknown>): Record<string, unknown> {\n return Object.entries(record).reduce<Record<string, unknown>>((acc, [key, value]) => {\n acc[toCamelCase(key)] = value;\n return acc;\n }, {});\n}\n\nfunction toCamelCase(value: string): string {\n return value.replace(/-([a-z])/g, (_, char) => char.toUpperCase());\n}\n\nfunction hasFlag(args: string[], flag: string): boolean {\n return args.includes(flag);\n}\n\nfunction hasCommandHelpFlag(args: string[]): boolean {\n return hasFlag(args, \"--help\") || hasFlag(args, \"-h\");\n}\n\nfunction printVersion(): void {\n console.log(VERSION);\n}\n\nfunction printGeneralHelp(): void {\n console.log(`codex-native v${VERSION}\n\nUsage:\n codex-native [options] [prompt]\n codex-native run [options] [prompt]\n codex-native tui [options] [prompt]\n\nDefault behavior:\n Running 'codex-native' without arguments launches the interactive TUI.\n Use 'codex-native run <prompt>' for non-interactive exec mode.\n\nCommands:\n (default) Launch the interactive TUI (with optional initial prompt)\n run Run Codex in non-interactive exec mode\n tui Explicitly launch the interactive TUI\n reverie index Pre-compute reverie embeddings for the current repo\n\nGlobal options:\n --config <path> Path to codex.config.js (or similar)\n --no-config Skip automatic config discovery\n --plugin <path> Additional plugin module (repeatable)\n\nRun options:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --schema <file> Path to final-output JSON schema\n --thread-id <id> Resume an existing thread\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --full-auto Enable workspace-write auto approvals\n --skip-git-repo-check Skip git repository validation\n --cd <path> Working directory for the run\n --image <path> Attach an image (repeatable)\n --review-mode Enable review mode\n --review-hint <text> Hint text for review mode\n\nTUI options:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --resume <id> Resume a saved session by id\n --resume-last Resume the most recent saved session\n --resume-picker Show the resume picker on startup\n --full-auto Enable workspace-write auto approvals\n --dangerously-bypass-approvals-and-sandbox\n Disable approvals and sandboxing (unsafe)\n --cd <path> Working directory for the session\n --config-profile <name> Config profile to activate\n --config-overrides <kv> Config overrides (key=value, repeatable)\n --add-dir <path> Additional writable directory (repeatable)\n --image <path> Attach an image (repeatable)\n --web-search Enable web search tool\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n`);\n}\n\nfunction printCommandHelp(command: CommandName): void {\n if (command === \"reverie-index\") {\n console.log(`codex-native reverie index [options]\n\nOptions:\n --codex-home <path> Override CODEX_HOME (defaults to ~/.codex)\n --project-root <path> Project root for scoping + embedding cache (default: cwd)\n --limit <n> Maximum conversations to index (default: 10)\n --max-candidates <n> Scan window before filtering (default: 80)\n --batch-size <n> Batch size forwarded to FastEmbed\n --normalize Force vector normalization (default: embed config)\n --no-normalize Disable normalization\n --cache / --no-cache Override embedding cache behavior\n --embed-model <name> FastEmbed model (default: BAAI/bge-large-en-v1.5)\n --embed-cache-dir <dir> Cache directory (defaults to $CODEX_EMBED_CACHE or system tmp)\n --embed-max-length <n> Override FastEmbed max token length\n --no-progress Hide FastEmbed download progress\n --skip-embed-init Assume fastEmbedInit was already called in this process\n`);\n return;\n }\n if (command === \"tui\") {\n console.log(`codex-native tui [options] [prompt]\n\nOptions:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --resume <id> Resume a saved session by id\n --resume-last Resume the most recent saved session\n --resume-picker Show the resume picker on startup\n --full-auto Enable workspace-write auto approvals\n --dangerously-bypass-approvals-and-sandbox\n Disable approvals and sandboxing (unsafe)\n --cd <path> Working directory for the session\n --config-profile <name> Config profile to activate\n --config-overrides <kv> Config overrides (key=value, repeatable)\n --add-dir <path> Additional writable directory (repeatable)\n --image <path> Attach an image (repeatable)\n --web-search Enable web search tool\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n`);\n } else {\n console.log(`codex-native run [options] [prompt]\n\nOptions:\n --model <slug> Model slug to use\n --oss Use the built-in OSS provider\n --sandbox <mode> ${SANDBOX_CHOICES.join(\" | \")}\n --approval <policy> ${APPROVAL_CHOICES.join(\" | \")}\n --schema <file> Path to final-output JSON schema\n --thread-id <id> Resume an existing thread\n --base-url <url> Override the Codex API base URL\n --api-key <key> API key for Codex requests\n --linux-sandbox-path Path to codex-linux-sandbox binary\n --full-auto Enable workspace-write auto approvals\n --skip-git-repo-check Skip git repository validation\n --cd <path> Working directory for the run\n --image <path> Attach an image (repeatable)\n --review-mode Enable review mode\n --review-hint <text> Hint text for review mode\n`);\n }\n}\n\nfunction validateOptionChoices(\n command: CommandName,\n options: RunCommandOptions | TuiCommandOptions,\n): void {\n const sandbox = options.sandbox;\n if (sandbox && !SANDBOX_CHOICES.includes(sandbox as (typeof SANDBOX_CHOICES)[number])) {\n throw new Error(\n `Invalid sandbox mode \"${sandbox}\". Valid modes: ${SANDBOX_CHOICES.join(\", \")}.`,\n );\n }\n const approval = options.approval;\n if (approval && !APPROVAL_CHOICES.includes(approval as (typeof APPROVAL_CHOICES)[number])) {\n throw new Error(\n `Invalid approval policy \"${approval}\". Valid policies: ${APPROVAL_CHOICES.join(\", \")}.`,\n );\n }\n}\n\nfunction logError(error: unknown): void {\n if (error instanceof Error) {\n console.error(error.message);\n if (process.env.CODEX_NATIVE_DEBUG) {\n console.error(error.stack);\n }\n } else {\n console.error(String(error));\n }\n}\n\nmain().catch((error) => {\n logError(error);\n process.exitCode = 1;\n});\n","{\n \"name\": \"@codex-native/sdk\",\n \"version\": \"0.0.18\",\n \"description\": \"Native NAPI-based Codex SDK - complete standalone implementation.\",\n \"main\": \"dist/index.cjs\",\n \"module\": \"dist/index.mjs\",\n \"types\": \"dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.mjs\",\n \"require\": \"./dist/index.cjs\"\n }\n },\n \"bin\": {\n \"codex-native\": \"dist/cli.cjs\"\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"scripts\": {\n \"artifacts\": \"napi artifacts\",\n \"build\": \"pnpm run build:ts && pnpm run build:napi\",\n \"build:ts\": \"tsup\",\n \"build:napi\": \"node -e \\\"const {execFileSync}=require('node:child_process');const {readFileSync,readdirSync,rmSync}=require('node:fs');const {platform,arch}=process;for(const entry of readdirSync(process.cwd())){if(entry.endsWith('.node')&&entry.startsWith('codex_native.')){try{rmSync(entry);}catch{}}}const isMusl=()=>{if(platform!=='linux')return false;try{if(readFileSync('/usr/bin/ldd','utf8').includes('musl'))return true;}catch{}if(typeof process.report?.getReport==='function'){const r=process.report.getReport();if(r?.header?.glibcVersionRuntime)return false;if(Array.isArray(r?.sharedObjects)&&r.sharedObjects.some((p)=>p.includes('libc.musl-')||p.includes('ld-musl-')))return true;}try{return require('node:child_process').execSync('ldd --version',{encoding:'utf8'}).includes('musl');}catch{}return false;};let dir=null;if(platform==='darwin'){dir=arch==='arm64'?'darwin-arm64':arch==='x64'?'darwin-x64':null;}else if(platform==='linux'){const suffix=isMusl()?'musl':'gnu';dir=arch==='arm64'?'linux-arm64-'+suffix:arch==='x64'?'linux-x64-'+suffix:null;}else if(platform==='win32'){dir=arch==='arm64'?'win32-arm64-msvc':arch==='x64'?'win32-x64-msvc':null;}if(!dir){throw new Error('Unsupported platform/arch: '+platform+' '+arch);}execFileSync('napi',['build','--platform','--release','--features','napi-bindings','--no-js','--output-dir','npm/'+dir],{stdio:'inherit'});\\\"\",\n \"build:napi:debug\": \"node -e \\\"const {execFileSync}=require('node:child_process');const {readFileSync}=require('node:fs');const {platform,arch}=process;const isMusl=()=>{if(platform!=='linux')return false;try{if(readFileSync('/usr/bin/ldd','utf8').includes('musl'))return true;}catch{}if(typeof process.report?.getReport==='function'){const r=process.report.getReport();if(r?.header?.glibcVersionRuntime)return false;if(Array.isArray(r?.sharedObjects)&&r.sharedObjects.some((p)=>p.includes('libc.musl-')||p.includes('ld-musl-')))return true;}try{return require('node:child_process').execSync('ldd --version',{encoding:'utf8'}).includes('musl');}catch{}return false;};let dir=null;if(platform==='darwin'){dir=arch==='arm64'?'darwin-arm64':arch==='x64'?'darwin-x64':null;}else if(platform==='linux'){const suffix=isMusl()?'musl':'gnu';dir=arch==='arm64'?'linux-arm64-'+suffix:arch==='x64'?'linux-x64-'+suffix:null;}else if(platform==='win32'){dir=arch==='arm64'?'win32-arm64-msvc':arch==='x64'?'win32-x64-msvc':null;}if(!dir){throw new Error('Unsupported platform/arch: '+platform+' '+arch);}execFileSync('napi',['build','--platform','--features','napi-bindings','--no-js','--output-dir','npm/'+dir],{stdio:'inherit'});\\\"\",\n \"release\": \"node scripts/publish.mjs\",\n \"test\": \"NODE_OPTIONS='--experimental-vm-modules' jest --runInBand\",\n \"version\": \"napi version\"\n },\n \"napi\": {\n \"binaryName\": \"codex_native\",\n \"targets\": [\n \"aarch64-apple-darwin\",\n \"x86_64-apple-darwin\",\n \"aarch64-unknown-linux-gnu\",\n \"x86_64-unknown-linux-gnu\",\n \"aarch64-unknown-linux-musl\",\n \"x86_64-unknown-linux-musl\",\n \"aarch64-pc-windows-msvc\",\n \"x86_64-pc-windows-msvc\"\n ]\n },\n \"optionalDependencies\": {\n \"@codex-native/sdk-darwin-arm64\": \"0.0.15\",\n \"@codex-native/sdk-darwin-x64\": \"0.0.15\",\n \"@codex-native/sdk-linux-arm64-gnu\": \"0.0.15\",\n \"@codex-native/sdk-linux-x64-gnu\": \"0.0.15\",\n \"@codex-native/sdk-linux-arm64-musl\": \"0.0.15\",\n \"@codex-native/sdk-linux-x64-musl\": \"0.0.15\",\n \"@codex-native/sdk-win32-arm64-msvc\": \"0.0.15\",\n \"@codex-native/sdk-win32-x64-msvc\": \"0.0.15\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.22.0\",\n \"@openai/agents\": \"^0.3.3\",\n \"@openai/agents-core\": \"^0.3.3\",\n \"@opencode-ai/sdk\": \"^1.0.164\",\n \"@toon-format/toon\": \"^1.0.0\",\n \"pyright\": \"^1.1.386\",\n \"typescript-language-server\": \"^4.3.3\",\n \"vscode-jsonrpc\": \"^8.2.1\",\n \"vscode-languageserver-types\": \"^3.17.5\"\n },\n \"devDependencies\": {\n \"@babel/core\": \"7.25.2\",\n \"@babel/preset-env\": \"7.25.4\",\n \"@babel/preset-typescript\": \"7.28.5\",\n \"@jest/globals\": \"^29.7.0\",\n \"@napi-rs/cli\": \"^3.4.1\",\n \"@openai/agents\": \"^0.3.0\",\n \"@types/jest\": \"29.5.14\",\n \"@types/node\": \"^22.0.0\",\n \"babel-jest\": \"29.7.0\",\n \"jest\": \"^29.7.0\",\n \"ts-jest\": \"^29.1.1\",\n \"tsup\": \"^8.5.0\",\n \"tsx\": \"^4.20.6\",\n \"typescript\": \"^5.7.2\",\n \"zod\": \"^3.25.76\"\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"publishConfig\": {\n \"access\": \"public\"\n }\n}\n","import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createRequire } from \"node:module\";\nimport { pathToFileURL } from \"node:url\";\n\nimport type {\n CodexNativeConfig,\n ConfigLoaderOptions,\n LoadedConfigFile,\n LoadedPlugin,\n} from \"./types\";\n\nconst requireFromThisModule = createRequire(import.meta.url);\n\nconst CONFIG_CANDIDATES = [\n \"codex.config.js\",\n \"codex.config.cjs\",\n \"codex.config.mjs\",\n \"codex.config.ts\",\n \"codex.js\",\n \".codexrc.js\",\n \".codexrc.cjs\",\n \".codexrc.mjs\",\n \".codexrc.json\",\n] as const;\n\ntype ConfigDiscovery =\n | { path: string; type: \"file\" }\n | { path: string; type: \"package-json\"; field: string };\n\nexport async function loadCliConfig(options: ConfigLoaderOptions): Promise<LoadedConfigFile> {\n const warnings: string[] = [];\n\n const discovery = await resolveConfigPath(options);\n const configPath = discovery?.path ?? null;\n let config: CodexNativeConfig | null = null;\n\n if (discovery) {\n const loadResult = await loadConfig(discovery, warnings);\n config = loadResult ?? null;\n if (config && typeof config !== \"object\") {\n warnings.push(\n `Config at ${discovery.path} must export an object. Received ${typeof config}.`,\n );\n config = null;\n }\n }\n\n const plugins = await resolvePlugins({\n config,\n configPath,\n cliPluginPaths: options.pluginPaths ?? [],\n cwd: options.cwd,\n warnings,\n });\n\n return {\n configPath,\n config,\n plugins,\n warnings,\n };\n}\n\nasync function resolveConfigPath(options: ConfigLoaderOptions): Promise<ConfigDiscovery | null> {\n if (options.explicitConfigPath) {\n const explicitPath = path.resolve(options.cwd, options.explicitConfigPath);\n if (!fs.existsSync(explicitPath)) {\n throw new Error(`Config file not found at ${explicitPath}`);\n }\n return classifyPath(explicitPath);\n }\n\n if (options.noConfig) {\n return null;\n }\n\n let currentDir = path.resolve(options.cwd);\n const visited = new Set<string>();\n\n while (!visited.has(currentDir)) {\n visited.add(currentDir);\n\n for (const candidate of CONFIG_CANDIDATES) {\n const candidatePath = path.join(currentDir, candidate);\n if (fs.existsSync(candidatePath) && fs.statSync(candidatePath).isFile()) {\n return classifyPath(candidatePath);\n }\n }\n\n const packageJsonPath = path.join(currentDir, \"package.json\");\n if (fs.existsSync(packageJsonPath) && fs.statSync(packageJsonPath).isFile()) {\n const manifest = await readJson(packageJsonPath);\n if (manifest && manifest.codexNative != null) {\n return { path: packageJsonPath, type: \"package-json\", field: \"codexNative\" };\n }\n }\n\n const parentDir = path.dirname(currentDir);\n if (parentDir === currentDir) {\n break;\n }\n currentDir = parentDir;\n }\n\n return null;\n}\n\nasync function loadConfig(discovery: ConfigDiscovery, warnings: string[]): Promise<CodexNativeConfig | null> {\n if (discovery.type === \"package-json\") {\n const manifest = await readJson(discovery.path);\n if (!manifest) {\n warnings.push(`Failed to parse ${discovery.path}; ignoring config.`);\n return null;\n }\n const raw = manifest[discovery.field];\n if (typeof raw === \"string\") {\n const baseDir = path.dirname(discovery.path);\n const nestedPath = path.resolve(baseDir, raw);\n if (!fs.existsSync(nestedPath)) {\n throw new Error(\n `Config path \"${raw}\" referenced by ${discovery.field} in ${discovery.path} was not found.`,\n );\n }\n return loadConfig({ path: nestedPath, type: \"file\" }, warnings);\n }\n if (typeof raw === \"object\" && raw !== null) {\n return raw as CodexNativeConfig;\n }\n warnings.push(\n `The ${discovery.field} field in ${discovery.path} must be an object or path string.`,\n );\n return null;\n }\n\n const ext = path.extname(discovery.path).toLowerCase();\n if (ext === \".json\") {\n const json = await readJson(discovery.path);\n if (json === null) {\n warnings.push(`Failed to parse JSON config at ${discovery.path}`);\n }\n return json as CodexNativeConfig | null;\n }\n\n if (ext === \".js\" || ext === \".cjs\") {\n return extractModuleDefault(await loadCommonJsModule(discovery.path)) as CodexNativeConfig | null;\n }\n\n if (ext === \".mjs\") {\n return extractModuleDefault(await importModule(discovery.path)) as CodexNativeConfig | null;\n }\n\n if (ext === \".ts\") {\n return extractModuleDefault(await loadTypeScriptModule(discovery.path, warnings)) as\n | CodexNativeConfig\n | null;\n }\n\n throw new Error(`Unsupported config extension \"${ext}\" at ${discovery.path}`);\n}\n\nasync function resolvePlugins(params: {\n config: CodexNativeConfig | null;\n configPath: string | null;\n cliPluginPaths: string[];\n cwd: string;\n warnings: string[];\n}): Promise<LoadedPlugin[]> {\n const plugins: LoadedPlugin[] = [];\n const { config, configPath, cliPluginPaths, cwd, warnings } = params;\n\n const configDir = configPath ? path.dirname(configPath) : cwd;\n\n const rawConfigPlugins = (config as { plugins?: unknown })?.plugins;\n const configPlugins = Array.isArray(rawConfigPlugins) ? (rawConfigPlugins as unknown[]) : [];\n for (const spec of configPlugins) {\n if (typeof spec === \"string\") {\n const loaded = await loadPlugin(spec, configDir, \"config\", warnings);\n if (loaded) {\n plugins.push(loaded);\n }\n } else if (spec != null) {\n plugins.push({\n source: \"config\",\n spec: \"<inline>\",\n plugin: spec,\n });\n }\n }\n\n for (const spec of cliPluginPaths) {\n const loaded = await loadPlugin(spec, cwd, \"cli\", warnings);\n if (loaded) {\n plugins.push(loaded);\n }\n }\n\n return plugins;\n}\n\nasync function loadPlugin(\n spec: string,\n baseDir: string,\n source: LoadedPlugin[\"source\"],\n warnings: string[],\n): Promise<LoadedPlugin | null> {\n try {\n const resolved = resolveModule(spec, baseDir);\n const moduleExports = await loadModuleForPath(resolved);\n return {\n source,\n spec,\n resolvedPath: resolved,\n plugin: extractModuleDefault(moduleExports),\n };\n } catch (err) {\n warnings.push(`Failed to load plugin \"${spec}\": ${(err as Error).message}`);\n return null;\n }\n}\n\nasync function loadModuleForPath(modulePath: string): Promise<unknown> {\n const ext = path.extname(modulePath).toLowerCase();\n if (ext === \".cjs\") {\n return loadCommonJsModule(modulePath);\n }\n if (ext === \".mjs\") {\n return importModule(modulePath);\n }\n if (ext === \".ts\") {\n return loadTypeScriptModule(modulePath);\n }\n if (ext === \".json\") {\n return readJson(modulePath);\n }\n if (ext === \".js\") {\n try {\n return loadCommonJsModule(modulePath);\n } catch (err) {\n if (err instanceof Error && err.message.includes(\"ERR_REQUIRE_ESM\")) {\n return importModule(modulePath);\n }\n throw err;\n }\n }\n return loadCommonJsModule(modulePath);\n}\n\nasync function loadCommonJsModule(modulePath: string): Promise<unknown> {\n return requireFromThisModule(modulePath);\n}\n\nasync function importModule(modulePath: string): Promise<unknown> {\n const href = pathToFileURL(modulePath).href;\n return import(href);\n}\n\nasync function loadTypeScriptModule(modulePath: string, warnings?: string[]): Promise<unknown> {\n try {\n const { register } = requireFromThisModule(\"tsx/cjs/api\");\n const unregister = register({ transpileOnly: true });\n try {\n return requireFromThisModule(modulePath);\n } finally {\n await maybeCall(unregister);\n }\n } catch (cjsError) {\n try {\n const tsxEsmSpecifier = \"tsx/esm/api\";\n // Use a dynamic specifier so type resolution doesn't require this module to exist at compile-time.\n const apiModule: any = await import(tsxEsmSpecifier as any);\n const unregister =\n typeof apiModule.register === \"function\"\n ? apiModule.register({ transpileOnly: true })\n : apiModule.default({ transpileOnly: true });\n try {\n return importModule(modulePath);\n } finally {\n await maybeCall(unregister);\n }\n } catch (esmError) {\n const message = [\n `Failed to load TypeScript module ${modulePath}.`,\n \"Install the \\\"tsx\\\" package or convert the config to JavaScript.\",\n ].join(\" \");\n if (warnings) {\n warnings.push(message);\n return null;\n }\n throw new Error(message);\n }\n }\n}\n\nasync function readJson(filePath: string): Promise<any> {\n try {\n const raw = await fsPromises.readFile(filePath, \"utf8\");\n return JSON.parse(raw);\n } catch {\n return null;\n }\n}\n\nfunction extractModuleDefault<T>(module: T): T | unknown {\n if (module && typeof module === \"object\" && \"default\" in (module as Record<string, unknown>)) {\n const value = (module as Record<string, unknown>).default;\n if (value !== undefined) {\n return value;\n }\n }\n return module;\n}\n\nfunction resolveModule(specifier: string, baseDir: string): string {\n if (path.isAbsolute(specifier)) {\n return specifier;\n }\n return requireFromThisModule.resolve(specifier, { paths: [baseDir] });\n}\n\nfunction classifyPath(filePath: string): ConfigDiscovery {\n if (path.basename(filePath) === \"package.json\") {\n return { path: filePath, type: \"package-json\", field: \"codexNative\" };\n }\n return { path: filePath, type: \"file\" };\n}\n\nasync function maybeCall(candidate: unknown): Promise<void> {\n if (typeof candidate === \"function\") {\n await Promise.resolve(candidate());\n }\n}\n\n","import fs from \"node:fs\";\nimport fsPromises from \"node:fs/promises\";\nimport path from \"node:path\";\nimport process from \"node:process\";\n\nimport { type NativeRunRequest, getNativeBinding } from \"../nativeBinding\";\nimport type { ThreadEvent } from \"../events\";\nimport { convertRustEventToThreadEvent } from \"../events/convert\";\nimport { parseApprovalModeFlag, parseSandboxModeFlag } from \"./optionParsers\";\nimport { emitWarnings, runBeforeStartHooks, runEventHooks } from \"./hooks\";\nimport { applyElevatedRunDefaults } from \"./elevatedDefaults\";\nimport type {\n CliContext,\n CommandName,\n RunCommandOptions,\n} from \"./types\";\nimport { createRunCommandLspBridge } from \"./lspBridge\";\n\nexport async function executeRunCommand(\n argv: RunCommandOptions,\n context: CliContext,\n): Promise<void> {\n const { combinedConfig } = context;\n emitWarnings(combinedConfig.warnings);\n const warningCount = combinedConfig.warnings.length;\n\n const prompt = await resolvePrompt(argv, combinedConfig.runDefaults.prompt, context.cwd);\n const request = await buildRunRequest({\n prompt,\n argv,\n combinedDefaults: combinedConfig.runDefaults,\n cwd: context.cwd,\n });\n\n if (!request.skipGitRepoCheck) {\n await assertTrustedDirectory(request.workingDirectory);\n }\n\n const hookContext = {\n command: \"run\" as CommandName,\n cwd: context.cwd,\n options: argv,\n };\n\n await runBeforeStartHooks(combinedConfig.beforeStartHooks, hookContext, combinedConfig.warnings);\n\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native N-API binding is not available.\");\n }\n\n const queue = new AsyncQueue<string>();\n let conversationId: string | null = null;\n const lspBridge = createRunCommandLspBridge({\n binding,\n workingDirectory: request.workingDirectory ?? context.cwd,\n initialThreadId: request.threadId,\n });\n\n const handleEvent = async (eventJson: string | null | undefined) => {\n if (!eventJson) {\n return;\n }\n process.stdout.write(eventJson);\n process.stdout.write(\"\\n\");\n\n let eventPayload: unknown = eventJson;\n try {\n eventPayload = JSON.parse(eventJson);\n } catch {\n // Leave as string if parsing fails.\n }\n\n conversationId ??= extractConversationId(eventPayload);\n const threadEvent = toThreadEvent(eventPayload);\n if (threadEvent && lspBridge) {\n lspBridge.handleEvent(threadEvent);\n }\n await runEventHooks(\n combinedConfig.onEventHooks,\n eventPayload,\n hookContext,\n combinedConfig.warnings,\n );\n };\n\n let runPromise: Promise<void> = Promise.resolve();\n runPromise = binding\n .runThreadStream(request, (err, eventJson) => {\n if (err) {\n queue.fail(err);\n return;\n }\n queue.push(eventJson ?? null);\n })\n .then(\n () => queue.end(),\n (error) => {\n queue.fail(error);\n },\n );\n\n let loopError: unknown;\n try {\n for await (const eventJson of queue) {\n try {\n await handleEvent(eventJson);\n } catch (error) {\n combinedConfig.warnings.push(\n `Event handler failed: ${(error as Error).message ?? String(error)}`,\n );\n }\n }\n await runPromise;\n } catch (error) {\n loopError = error;\n throw error;\n } finally {\n queue.end();\n if (loopError) {\n await runPromise.catch(() => {});\n }\n if (lspBridge) {\n lspBridge.dispose();\n }\n }\n\n if (conversationId) {\n process.stdout.write(`\\nTo resume, run: codex-native tui --resume ${conversationId}\\n`);\n }\n\n emitWarnings(combinedConfig.warnings, warningCount);\n}\n\nfunction toThreadEvent(payload: unknown): ThreadEvent | null {\n if (!payload || typeof payload !== \"object\") {\n return null;\n }\n try {\n return convertRustEventToThreadEvent(payload);\n } catch {\n return null;\n }\n}\n\nasync function resolvePrompt(\n argv: RunCommandOptions,\n defaultPrompt: string | undefined,\n cwd: string,\n): Promise<string> {\n if (argv.prompt && argv.prompt.trim().length > 0) {\n return argv.prompt;\n }\n if (defaultPrompt && defaultPrompt.trim().length > 0) {\n return defaultPrompt;\n }\n\n const stdinPrompt = await readPromptFromStdin();\n if (stdinPrompt && stdinPrompt.trim().length > 0) {\n return stdinPrompt;\n }\n\n if (argv.threadId) {\n // Resume runs without a prompt are permitted.\n return \"\";\n }\n\n const baseMessage = \"No prompt provided. Supply a prompt or pipe one via stdin.\";\n if (process.stdin.isTTY) {\n throw new Error(baseMessage);\n }\n throw new Error(baseMessage);\n}\n\nasync function buildRunRequest(params: {\n prompt: string;\n argv: RunCommandOptions;\n combinedDefaults: Partial<NativeRunRequest>;\n cwd: string;\n}): Promise<NativeRunRequest> {\n const { prompt, argv, combinedDefaults, cwd } = params;\n const request: NativeRunRequest = {\n ...(combinedDefaults as NativeRunRequest),\n prompt,\n };\n\n if (combinedDefaults.images) {\n request.images = [...combinedDefaults.images];\n }\n if (combinedDefaults.workspaceWriteOptions) {\n request.workspaceWriteOptions = { ...combinedDefaults.workspaceWriteOptions };\n }\n\n if (argv.model !== undefined) request.model = argv.model;\n if (argv.oss !== undefined) request.oss = argv.oss;\n const sandboxMode = parseSandboxModeFlag(argv.sandbox, \"--sandbox\");\n if (sandboxMode !== undefined) {\n request.sandboxMode = sandboxMode;\n }\n\n const approvalMode = parseApprovalModeFlag(argv.approval, \"--approval\");\n if (approvalMode !== undefined) {\n request.approvalMode = approvalMode;\n }\n if (argv.threadId !== undefined) request.threadId = argv.threadId;\n if (argv.baseUrl !== undefined) request.baseUrl = argv.baseUrl;\n if (argv.apiKey !== undefined) request.apiKey = argv.apiKey;\n if (argv.linuxSandboxPath !== undefined) request.linuxSandboxPath = argv.linuxSandboxPath;\n if (argv.fullAuto !== undefined) request.fullAuto = argv.fullAuto;\n if (argv.skipGitRepoCheck !== undefined) request.skipGitRepoCheck = argv.skipGitRepoCheck;\n if (argv.cd !== undefined) request.workingDirectory = argv.cd;\n if (argv.reviewMode !== undefined) request.reviewMode = argv.reviewMode;\n if (argv.reviewHint !== undefined) request.reviewHint = argv.reviewHint;\n\n const images = [\n ...(Array.isArray(request.images) ? request.images : []),\n ...(argv.image ?? []),\n ];\n request.images = images.length > 0 ? images : undefined;\n\n if (argv.schema) {\n request.outputSchema = await readJsonFile(argv.schema);\n }\n\n applyElevatedRunDefaults(request, cwd);\n return request;\n}\n\nasync function readJsonFile(filePath: string): Promise<unknown> {\n const absolute = path.resolve(process.cwd(), filePath);\n const data = await fsPromises.readFile(absolute, \"utf8\");\n try {\n return JSON.parse(data);\n } catch (error) {\n throw new Error(\n `Failed to parse JSON schema from ${absolute}: ${(error as Error).message ?? error}`,\n );\n }\n}\n\nasync function readPromptFromStdin(): Promise<string | null> {\n if (process.stdin.isTTY) {\n return null;\n }\n const chunks: Buffer[] = [];\n for await (const chunk of process.stdin) {\n chunks.push(typeof chunk === \"string\" ? Buffer.from(chunk) : chunk);\n }\n if (chunks.length === 0) {\n return null;\n }\n return Buffer.concat(chunks).toString(\"utf8\").trimEnd();\n}\n\nfunction extractConversationId(eventPayload: unknown): string | null {\n if (!eventPayload || typeof eventPayload !== \"object\") {\n return null;\n }\n\n const record = eventPayload as Record<string, unknown>;\n\n if (typeof record.session_id === \"string\") {\n return record.session_id;\n }\n\n const sessionConfigured = record.SessionConfigured ?? record.sessionConfigured;\n if (sessionConfigured && typeof sessionConfigured === \"object\") {\n const configuredSessionId = (sessionConfigured as Record<string, unknown>).session_id;\n if (typeof configuredSessionId === \"string\") {\n return configuredSessionId;\n }\n }\n\n const nestedSession =\n typeof record.session === \"object\" && record.session\n ? (record.session as Record<string, unknown>).id\n : undefined;\n if (typeof nestedSession === \"string\") {\n return nestedSession;\n }\n\n return null;\n}\n\n\nasync function assertTrustedDirectory(workingDirectory?: string): Promise<void> {\n const directory = workingDirectory ? path.resolve(workingDirectory) : process.cwd();\n if (await findGitRoot(directory)) {\n return;\n }\n throw new Error(\n \"Not inside a trusted directory and --skip-git-repo-check was not specified.\",\n );\n}\n\nasync function findGitRoot(startDir: string): Promise<string | null> {\n let current = path.resolve(startDir);\n\n while (true) {\n const gitPath = path.join(current, \".git\");\n if (fs.existsSync(gitPath)) {\n try {\n const stats = await fsPromises.stat(gitPath);\n if (stats.isDirectory() || stats.isFile()) {\n return current;\n }\n } catch {\n // Ignore filesystem race conditions and keep searching upwards.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return null;\n}\n\nclass AsyncQueue<T> implements AsyncIterable<T> {\n private readonly buffer: T[] = [];\n private waiters: Array<{ resolve: (value: IteratorResult<T>) => void; reject: (error: unknown) => void }> = [];\n private ended = false;\n private error: unknown;\n\n push(value: T | null) {\n if (this.ended) return;\n if (value === null) {\n return;\n }\n if (this.waiters.length > 0) {\n const waiter = this.waiters.shift()!;\n waiter.resolve({ value, done: false });\n return;\n }\n this.buffer.push(value);\n }\n\n end() {\n if (this.ended) return;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.resolve({ value: undefined as never, done: true });\n }\n }\n\n fail(error: unknown) {\n if (this.ended) return;\n this.error = error;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.reject(error);\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.buffer.length > 0) {\n const value = this.buffer.shift()!;\n return { value, done: false };\n }\n if (this.error) {\n return Promise.reject(this.error);\n }\n if (this.ended) {\n return { value: undefined as never, done: true };\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n}\n","import fs from \"node:fs\";\nimport { createRequire } from \"node:module\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport type { ApprovalMode, SandboxMode, WorkspaceWriteOptions, ReasoningEffort, ReasoningSummary } from \"./threadOptions\";\n\nconst CLI_ENTRYPOINT_ENV = \"CODEX_NODE_CLI_ENTRYPOINT\";\n\nexport type NativeUserInputItem =\n | { type: \"text\"; text: string }\n | { type: \"local_image\"; path: string }\n | { type: \"skill_inline\"; name: string; contents: string };\n\nexport type NativeRunRequest = {\n prompt: string;\n threadId?: string;\n inputItems?: NativeUserInputItem[];\n images?: string[];\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n outputSchema?: unknown;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n /** @deprecated Use sandboxMode and approvalMode instead */\n fullAuto?: boolean;\n reviewMode?: boolean;\n reviewHint?: string;\n};\n\nexport type NativeForkRequest = {\n threadId: string;\n nthUserMessage: number;\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n fullAuto?: boolean;\n};\n\nexport type NativeConversationConfig = {\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n baseUrl?: string;\n apiKey?: string;\n linuxSandboxPath?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n fullAuto?: boolean;\n};\n\nexport type NativeConversationListRequest = {\n config?: NativeConversationConfig;\n pageSize?: number;\n cursor?: string;\n modelProviders?: string[];\n};\n\nexport type NativeConversationSummary = {\n id: string;\n path: string;\n createdAt?: string;\n updatedAt?: string;\n};\n\nexport type NativeConversationListPage = {\n conversations: NativeConversationSummary[];\n nextCursor?: string;\n numScannedFiles: number;\n reachedScanCap: boolean;\n};\n\nexport type NativeDeleteConversationRequest = {\n id: string;\n config?: NativeConversationConfig;\n};\n\nexport type NativeDeleteConversationResult = {\n deleted: boolean;\n};\n\nexport type NativeResumeFromRolloutRequest = {\n rolloutPath: string;\n config?: NativeConversationConfig;\n};\n\nexport type NativeTuiRequest = {\n prompt?: string;\n images?: string[];\n model?: string;\n modelProvider?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n resumeSessionId?: string;\n resumeLast?: boolean;\n resumePicker?: boolean;\n fullAuto?: boolean;\n dangerouslyBypassApprovalsAndSandbox?: boolean;\n workingDirectory?: string;\n configProfile?: string;\n configOverrides?: string[];\n addDir?: string[];\n webSearch?: boolean;\n linuxSandboxPath?: string;\n baseUrl?: string;\n apiKey?: string;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n};\n\nexport type PlanStatus = \"pending\" | \"in_progress\" | \"completed\";\n\nexport type NativeEmitBackgroundEventRequest = {\n threadId: string;\n message: string;\n};\n\nexport type NativeEmitPlanUpdateRequest = {\n threadId: string;\n explanation?: string;\n plan: Array<{\n step: string;\n status: PlanStatus;\n }>;\n};\n\nexport type NativeModifyPlanRequest = {\n threadId: string;\n operations: PlanOperation[];\n};\n\nexport type PlanOperation =\n | { type: \"add\"; item: { step: string; status?: PlanStatus } }\n | { type: \"update\"; index: number; updates: { step?: string; status?: PlanStatus } }\n | { type: \"remove\"; index: number }\n | { type: \"reorder\"; newOrder: number[] };\n\nexport type NativeToolInterceptorNativeContext = {\n invocation: NativeToolInvocation;\n token: string;\n};\n\nexport type NativeTokenUsage = {\n inputTokens: number;\n cachedInputTokens: number;\n outputTokens: number;\n reasoningOutputTokens: number;\n totalTokens: number;\n};\n\nexport type NativeUpdateActionKind = \"npmGlobalLatest\" | \"bunGlobalLatest\" | \"brewUpgrade\";\n\nexport type NativeUpdateActionInfo = {\n kind: NativeUpdateActionKind;\n command: string;\n};\n\nexport type NativeTuiExitInfo = {\n tokenUsage: NativeTokenUsage;\n conversationId?: string;\n updateAction?: NativeUpdateActionInfo;\n};\n\nexport type NativeTuiSession = {\n wait(): Promise<NativeTuiExitInfo>;\n shutdown(): void;\n readonly closed: boolean;\n};\n\n// ============================================================================ \n// Repo diff summaries\n// ============================================================================ \n\nexport type RepoDiffFileChange = {\n path: string;\n status: string;\n diff: string;\n truncated: boolean;\n previousPath?: string | null;\n};\n\nexport type RepoDiffSummary = {\n repoPath: string;\n branch: string;\n baseBranch: string;\n upstreamRef?: string | null;\n mergeBase: string;\n statusSummary: string;\n diffStat: string;\n recentCommits: string;\n changedFiles: RepoDiffFileChange[];\n totalChangedFiles: number;\n};\n\nexport type RepoDiffSummaryOptions = {\n cwd?: string;\n baseBranchOverride?: string;\n maxFiles?: number;\n diffContextLines?: number;\n diffCharLimit?: number;\n};\n\n// ============================================================================\n// Reverie System Types\n// ============================================================================\n\nexport type ReverieConversation = {\n id: string;\n path: string;\n createdAt?: string;\n updatedAt?: string;\n headRecords: string[];\n tailRecords: string[];\n headRecordsToon: string[];\n tailRecordsToon: string[];\n};\n\nexport type ReverieSearchResult = {\n conversation: ReverieConversation;\n relevanceScore: number;\n matchingExcerpts: string[];\n insights: string[];\n rerankerScore?: number;\n};\n\nexport type FastEmbedRerankerModelCode =\n | \"BAAI/bge-reranker-base\"\n | \"rozgo/bge-reranker-v2-m3\"\n | \"jinaai/jina-reranker-v1-turbo-en\"\n | \"jinaai/jina-reranker-v2-base-multilingual\";\n\nexport type ReverieSemanticSearchOptions = {\n limit?: number;\n maxCandidates?: number;\n projectRoot?: string;\n batchSize?: number;\n normalize?: boolean;\n cache?: boolean;\n rerankerModel?: FastEmbedRerankerModelCode;\n rerankerCacheDir?: string;\n rerankerMaxLength?: number;\n rerankerShowProgress?: boolean;\n rerankerBatchSize?: number;\n rerankerTopK?: number;\n};\n\nexport type ReverieSemanticIndexStats = {\n conversationsIndexed: number;\n documentsEmbedded: number;\n batches: number;\n};\n\n// ============================================================================\n// FastEmbed Types\n// ============================================================================\n\nexport type FastEmbedInitOptions = {\n model?: string;\n cacheDir?: string;\n maxLength?: number;\n showDownloadProgress?: boolean;\n};\n\nexport type FastEmbedEmbedRequest = {\n inputs: string[];\n batchSize?: number;\n normalize?: boolean;\n projectRoot?: string;\n cache?: boolean;\n};\n\n// ============================================================================\n// Tokenizer Types\n// ============================================================================\n\nexport type TokenizerOptions = {\n model?: string;\n encoding?: \"o200k_base\" | \"cl100k_base\";\n};\n\nexport type TokenizerEncodeOptions = TokenizerOptions & {\n withSpecialTokens?: boolean;\n};\n\nfunction ensureCliEntrypointEnv(): void {\n if (process.env[CLI_ENTRYPOINT_ENV]) {\n return;\n }\n\n const filename = fileURLToPath(import.meta.url);\n const dirname = path.dirname(filename);\n const candidates = [\n path.resolve(dirname, \"cli.cjs\"),\n path.resolve(dirname, \"../cli.cjs\"),\n path.resolve(dirname, \"../dist/cli.cjs\"),\n ];\n\n for (const candidate of candidates) {\n if (fs.existsSync(candidate)) {\n process.env[CLI_ENTRYPOINT_ENV] = candidate;\n break;\n }\n }\n}\n\nensureCliEntrypointEnv();\n\nexport type NativeBinding = {\n runThread(request: NativeRunRequest): Promise<string[]>;\n runThreadStream(\n request: NativeRunRequest,\n onEvent: (err: unknown, eventJson?: string) => void,\n ): Promise<void>;\n compactThread(request: NativeRunRequest): Promise<string[]>;\n forkThread(request: NativeForkRequest): Promise<NativeForkResult>;\n listConversations(request: NativeConversationListRequest): Promise<NativeConversationListPage>;\n deleteConversation(request: NativeDeleteConversationRequest): Promise<NativeDeleteConversationResult>;\n resumeConversationFromRollout(request: NativeResumeFromRolloutRequest): Promise<NativeForkResult>;\n runTui(request: NativeTuiRequest): Promise<NativeTuiExitInfo>;\n tuiTestRun?(request: {\n width: number;\n height: number;\n viewport: { x: number; y: number; width: number; height: number };\n lines: string[];\n }): Promise<string[]>;\n callToolBuiltin(token: string, invocation?: NativeToolInvocation): Promise<NativeToolResult>;\n clearRegisteredTools(): void;\n registerTool(info: NativeToolInfo, handler: (call: NativeToolInvocation) => Promise<NativeToolResult> | NativeToolResult): void;\n registerToolInterceptor(toolName: string, handler: (context: NativeToolInterceptorNativeContext) => Promise<NativeToolResult> | NativeToolResult): void;\n listRegisteredTools(): NativeToolInfo[];\n registerApprovalCallback?(\n handler: (request: ApprovalRequest) => boolean | Promise<boolean>,\n ): void;\n emitBackgroundEvent(request: NativeEmitBackgroundEventRequest): Promise<void>;\n emitPlanUpdate(request: NativeEmitPlanUpdateRequest): Promise<void>;\n modifyPlan(request: NativeModifyPlanRequest): Promise<void>;\n startTui?(request: NativeTuiRequest): NativeTuiSession;\n // SSE test helpers (exposed for TypeScript tests)\n ev_completed(id: string): string;\n ev_response_created(id: string): string;\n ev_assistant_message(id: string, text: string): string;\n ev_function_call(callId: string, name: string, args: string): string;\n sse(events: string[]): string;\n ensureTokioRuntime?: () => void;\n isTokioRuntimeAvailable?: () => boolean;\n // Cloud tasks support (JSON-string payload responses)\n cloudTasksList?(env?: string, baseUrl?: string, apiKey?: string): Promise<string>;\n cloudTasksGetDiff?(taskId: string, baseUrl?: string, apiKey?: string): Promise<string>;\n cloudTasksApplyPreflight?(\n taskId: string,\n diffOverride?: string,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n cloudTasksApply?(\n taskId: string,\n diffOverride?: string,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n cloudTasksCreate?(\n envId: string,\n prompt: string,\n gitRef?: string,\n qaMode?: boolean,\n bestOfN?: number,\n baseUrl?: string,\n apiKey?: string,\n ): Promise<string>;\n // Reverie system - conversation search and insights\n reverieListConversations(codexHomePath: string, limit?: number, offset?: number): Promise<ReverieConversation[]>;\n reverieSearchConversations(codexHomePath: string, query: string, limit?: number): Promise<ReverieSearchResult[]>;\n reverieSearchSemantic?(\n codexHomePath: string,\n context: string,\n options?: ReverieSemanticSearchOptions,\n ): Promise<ReverieSearchResult[]>;\n reverieIndexSemantic?(\n codexHomePath: string,\n options?: ReverieSemanticSearchOptions,\n ): Promise<ReverieSemanticIndexStats>;\n reverieGetConversationInsights(conversationPath: string, query?: string): Promise<string[]>;\n toonEncode(value: unknown): string;\n // FastEmbed hooks\n fastEmbedInit?(options: FastEmbedInitOptions): Promise<void>;\n fastEmbedEmbed?(request: FastEmbedEmbedRequest): Promise<number[][]>;\n // Tokenizer helpers\n tokenizerCount(text: string, options?: TokenizerOptions): number;\n tokenizerEncode(text: string, options?: TokenizerEncodeOptions): number[];\n tokenizerDecode(tokens: number[], options?: TokenizerOptions): string;\n collectRepoDiffSummary?(\n cwd: string,\n baseBranchOverride?: string,\n options?: NativeRepoDiffOptions,\n ): Promise<RepoDiffSummary>;\n};\n\nexport type NativeToolInfo = {\n name: string;\n description?: string;\n parameters?: unknown;\n strict?: boolean;\n supportsParallel?: boolean;\n};\n\nexport type NativeToolInvocation = {\n toolName: string;\n callId: string;\n arguments?: string;\n input?: string;\n};\n\nexport type NativeToolResult = {\n output?: string;\n success?: boolean;\n error?: string;\n};\n\nexport type NativeForkResult = {\n threadId: string;\n rolloutPath: string;\n};\n\nexport type ApprovalRequest = {\n type: \"shell\" | \"file_write\" | \"network_access\";\n details?: unknown;\n context?: string;\n};\n\ntype NativeRepoDiffOptions = {\n maxFiles?: number;\n diffContextLines?: number;\n diffCharLimit?: number;\n};\n\nlet cachedBinding: NativeBinding | null | undefined;\n\nfunction getImportMetaUrl(): string | undefined {\n try {\n return Function(\n \"return typeof import.meta !== 'undefined' && import.meta.url ? import.meta.url : undefined;\",\n )() as string | undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction resolvePackageRoots(): string[] {\n const roots: string[] = [];\n const pushRoot = (root: string | undefined) => {\n if (!root) {\n return;\n }\n if (!roots.includes(root)) {\n roots.push(root);\n }\n };\n\n if (typeof __dirname === \"string\") {\n pushRoot(path.resolve(__dirname, \"..\"));\n }\n\n const importMetaUrl = getImportMetaUrl();\n if (importMetaUrl) {\n try {\n const filePath = fileURLToPath(importMetaUrl);\n pushRoot(path.resolve(path.dirname(filePath), \"..\"));\n } catch {\n // fall through to process.cwd()\n }\n }\n\n pushRoot(process.cwd());\n return roots;\n}\n\nfunction isFileMusl(file: string): boolean {\n return file.includes(\"libc.musl-\") || file.includes(\"ld-musl-\");\n}\n\nfunction isMusl(): boolean {\n if (process.platform !== \"linux\") {\n return false;\n }\n\n try {\n return fs.readFileSync(\"/usr/bin/ldd\", \"utf8\").includes(\"musl\");\n } catch {\n // ignore and fall back to report checks\n }\n\n const report =\n typeof process.report?.getReport === \"function\"\n ? (process.report.getReport() as { header?: { glibcVersionRuntime?: string }; sharedObjects?: string[] })\n : null;\n if (!report) {\n return false;\n }\n if (report.header && report.header.glibcVersionRuntime) {\n return false;\n }\n if (Array.isArray(report.sharedObjects) && report.sharedObjects.some(isFileMusl)) {\n return true;\n }\n\n try {\n return require(\"node:child_process\").execSync(\"ldd --version\", { encoding: \"utf8\" }).includes(\"musl\");\n } catch {\n return false;\n }\n}\n\nfunction resolvePlatformPackageName(): string | null {\n const platformArchAbi = resolvePlatformArchAbi();\n return platformArchAbi ? `@codex-native/sdk-${platformArchAbi}` : null;\n}\n\nfunction resolvePlatformArchAbi(): string | null {\n if (process.platform === \"darwin\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `darwin-${process.arch}`;\n }\n return null;\n }\n\n if (process.platform === \"linux\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `linux-${process.arch}-${isMusl() ? \"musl\" : \"gnu\"}`;\n }\n return null;\n }\n\n if (process.platform === \"win32\") {\n if (process.arch === \"arm64\" || process.arch === \"x64\") {\n return `win32-${process.arch}-msvc`;\n }\n return null;\n }\n\n return null;\n}\n\nfunction resolveLocalBinaryCandidates(): string[] {\n const platformArchAbi = resolvePlatformArchAbi();\n if (!platformArchAbi) {\n return [];\n }\n\n const filename = `codex_native.${platformArchAbi}.node`;\n const candidates: string[] = [];\n\n // Check locations in order:\n // 1. dist/ (where our build outputs for local dev)\n // 2. npm/<platform>/ (where napi prepublish copies for publishing)\n for (const root of resolvePackageRoots()) {\n candidates.push(path.join(root, \"dist\", filename));\n candidates.push(path.join(root, \"npm\", platformArchAbi, filename));\n }\n\n return candidates;\n}\n\nfunction tryRequireNativeBinding(requireFn: NodeJS.Require, candidate: string): NativeBinding | null {\n try {\n const binding: NativeBinding = requireFn(candidate);\n binding.ensureTokioRuntime?.();\n return binding;\n } catch {\n return null;\n }\n}\n\nfunction resolveRequire() {\n const globalRequire = (globalThis as typeof globalThis & { require?: NodeJS.Require }).require;\n if (typeof globalRequire === \"function\") {\n return globalRequire;\n }\n\n if (typeof __filename === \"string\") {\n try {\n return createRequire(__filename);\n } catch {\n // fall through to other strategies\n }\n }\n\n const importMetaUrl = getImportMetaUrl();\n if (importMetaUrl) {\n try {\n return createRequire(importMetaUrl);\n } catch {\n // fall through to fallback strategy\n }\n }\n\n const fallbackBase = typeof __dirname === \"string\" ? __dirname : process.cwd();\n const fallbackPath = path.join(fallbackBase, \"noop.js\");\n return createRequire(fallbackPath);\n}\n\nexport function getNativeBinding(): NativeBinding | null {\n if (cachedBinding !== undefined) {\n return cachedBinding;\n }\n\n const requireFn = resolveRequire();\n const envPath = process.env.CODEX_NATIVE_BINDING;\n if (envPath && envPath.length > 0) {\n // Allow napi-rs loaders and direct requires to honor the override.\n process.env.NAPI_RS_NATIVE_LIBRARY_PATH = envPath;\n }\n if (envPath && envPath.length > 0) {\n const binding = tryRequireNativeBinding(requireFn, envPath);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n let lastError: unknown;\n\n const localBinaryCandidates = resolveLocalBinaryCandidates();\n for (const candidate of localBinaryCandidates) {\n if (!fs.existsSync(candidate)) {\n continue;\n }\n\n const binding = tryRequireNativeBinding(requireFn, candidate);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n const platformPackage = resolvePlatformPackageName();\n if (platformPackage) {\n const binding = tryRequireNativeBinding(requireFn, platformPackage);\n if (binding) {\n cachedBinding = binding;\n return cachedBinding;\n }\n }\n\n const error =\n lastError ??\n new Error(\n `Native binding entrypoint not found. Checked: ${localBinaryCandidates.join(\n \", \",\n )} and ${platformPackage ?? \"no platform package\"}`,\n );\n console.warn(\"Failed to load native NAPI binding:\", error);\n cachedBinding = null;\n return cachedBinding;\n}\n\n// SSE test helpers (exposed for TypeScript tests)\nexport function ev_completed(id: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evCompleted(id);\n}\n\nexport function ev_response_created(id: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evResponseCreated(id);\n}\n\nexport function ev_assistant_message(id: string, text: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evAssistantMessage(id, text);\n}\n\nexport function ev_function_call(callId: string, name: string, args: string): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).evFunctionCall(callId, name, args);\n}\n\nexport function sse(events: string[]): string {\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n return (binding as any).sse(events);\n}\n\nexport function runApplyPatch(patch: string): void {\n if (!patch) {\n throw new Error(\"apply_patch requires patch contents\");\n }\n const binding = getNativeBinding();\n if (!binding) throw new Error(\"Native binding not available\");\n (binding as any).runApplyPatch(patch);\n}\n\n// Reverie system helpers\nexport async function reverieListConversations(\n codexHomePath: string,\n limit?: number,\n offset?: number,\n): Promise<ReverieConversation[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieListConversations) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieListConversations(codexHomePath, limit, offset);\n}\n\nexport async function reverieSearchConversations(\n codexHomePath: string,\n query: string,\n limit?: number,\n): Promise<ReverieSearchResult[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieSearchConversations) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieSearchConversations(codexHomePath, query, limit);\n}\n\nexport async function reverieSearchSemantic(\n codexHomePath: string,\n context: string,\n options?: ReverieSemanticSearchOptions,\n): Promise<ReverieSearchResult[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieSearchSemantic) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieSearchSemantic(codexHomePath, context, options);\n}\n\nexport async function reverieIndexSemantic(\n codexHomePath: string,\n options?: ReverieSemanticSearchOptions,\n): Promise<ReverieSemanticIndexStats> {\n const binding = getNativeBinding();\n if (!binding?.reverieIndexSemantic) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieIndexSemantic(codexHomePath, options);\n}\n\nexport async function reverieGetConversationInsights(\n conversationPath: string,\n query?: string,\n): Promise<string[]> {\n const binding = getNativeBinding();\n if (!binding?.reverieGetConversationInsights) throw new Error(\"Native binding not available or reverie functions not supported\");\n return (binding as any).reverieGetConversationInsights(conversationPath, query);\n}\n\nexport function encodeToToon(value: unknown): string {\n const binding = getNativeBinding();\n if (!binding?.toonEncode) throw new Error(\"Native binding not available or toon encoder not supported\");\n return (binding as any).toonEncode(value);\n}\n\n// FastEmbed helpers\nexport async function fastEmbedInit(options: FastEmbedInitOptions): Promise<void> {\n const binding = getNativeBinding();\n if (!binding?.fastEmbedInit) throw new Error(\"Native binding not available or FastEmbed functions not supported\");\n await binding.fastEmbedInit(options);\n}\n\nexport async function fastEmbedEmbed(request: FastEmbedEmbedRequest): Promise<number[][]> {\n const binding = getNativeBinding();\n if (!binding?.fastEmbedEmbed) throw new Error(\"Native binding not available or FastEmbed functions not supported\");\n return binding.fastEmbedEmbed(request);\n}\n\n// Tokenizer helpers\nexport function tokenizerCount(text: string, options?: TokenizerOptions): number {\n const binding = getNativeBinding();\n if (!binding?.tokenizerCount) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerCount(text, options);\n}\n\nexport function tokenizerEncode(text: string, options?: TokenizerEncodeOptions): number[] {\n const binding = getNativeBinding();\n if (!binding?.tokenizerEncode) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerEncode(text, options);\n}\n\nexport function tokenizerDecode(tokens: number[], options?: TokenizerOptions): string {\n const binding = getNativeBinding();\n if (!binding?.tokenizerDecode) throw new Error(\"Native binding not available or tokenizer functions not supported\");\n return (binding as any).tokenizerDecode(tokens, options);\n}\n\nexport async function collectRepoDiffSummary(\n options?: RepoDiffSummaryOptions,\n): Promise<RepoDiffSummary> {\n const binding = getNativeBinding();\n if (!binding?.collectRepoDiffSummary) {\n throw new Error(\"Native binding not available or repo diff helpers not supported\");\n }\n const cwd = options?.cwd ?? process.cwd();\n const nativeOptions: NativeRepoDiffOptions | undefined =\n options &&\n (options.maxFiles !== undefined ||\n options.diffContextLines !== undefined ||\n options.diffCharLimit !== undefined)\n ? {\n maxFiles: options.maxFiles,\n diffContextLines: options.diffContextLines,\n diffCharLimit: options.diffCharLimit,\n }\n : undefined;\n return binding.collectRepoDiffSummary(cwd, options?.baseBranchOverride, nativeOptions);\n}\n","import type { ThreadEvent } from \"../events\";\n\n/**\n * Converts the raw Rust event payload emitted by the native binding into the structured\n * {@link ThreadEvent} shape expected by the TypeScript SDK.\n */\nexport function convertRustEventToThreadEvent(rustEvent: any): ThreadEvent {\n if (rustEvent?.ThreadStarted) {\n return {\n type: \"thread.started\",\n thread_id: rustEvent.ThreadStarted.thread_id,\n };\n }\n if (rustEvent?.TurnStarted) {\n return { type: \"turn.started\" };\n }\n if (rustEvent?.TurnCompleted) {\n return {\n type: \"turn.completed\",\n usage: rustEvent.TurnCompleted.usage,\n };\n }\n if (rustEvent?.TurnFailed) {\n return {\n type: \"turn.failed\",\n error: rustEvent.TurnFailed.error,\n };\n }\n if (rustEvent?.ItemStarted) {\n return {\n type: \"item.started\",\n item: rustEvent.ItemStarted.item,\n };\n }\n if (rustEvent?.ItemUpdated) {\n return {\n type: \"item.updated\",\n item: rustEvent.ItemUpdated.item,\n };\n }\n if (rustEvent?.ItemCompleted) {\n return {\n type: \"item.completed\",\n item: rustEvent.ItemCompleted.item,\n };\n }\n if (rustEvent?.Error) {\n return {\n type: \"error\",\n message: rustEvent.Error.message,\n };\n }\n if (rustEvent?.BackgroundEvent) {\n return {\n type: \"background_event\",\n message: rustEvent.BackgroundEvent.message,\n };\n }\n if (rustEvent?.type === \"background_event\" && typeof rustEvent.message === \"string\") {\n return {\n type: \"background_event\",\n message: rustEvent.message,\n };\n }\n if (rustEvent?.type === \"plan_update_scheduled\" && rustEvent.plan) {\n const planData = rustEvent.plan;\n const planItems = planData.plan || [];\n return {\n type: \"item.completed\",\n item: {\n id: `plan-${Date.now()}`,\n type: \"todo_list\",\n items: planItems.map((item: any) => ({\n text: item.step,\n completed: item.status === \"completed\",\n })),\n },\n } as ThreadEvent;\n }\n if (rustEvent?.type) {\n return rustEvent as ThreadEvent;\n }\n return rustEvent as ThreadEvent;\n}\n","import type { ApprovalMode, SandboxMode } from \"../threadOptions\";\n\nconst SANDBOX_MODE_VALUES = [\"read-only\", \"workspace-write\", \"danger-full-access\"] as const;\nconst APPROVAL_MODE_VALUES = [\"never\", \"on-request\", \"on-failure\", \"untrusted\"] as const;\n\nfunction isSandboxMode(value: string): value is SandboxMode {\n return (SANDBOX_MODE_VALUES as readonly string[]).includes(value);\n}\n\nfunction isApprovalMode(value: string): value is ApprovalMode {\n return (APPROVAL_MODE_VALUES as readonly string[]).includes(value);\n}\n\nexport function parseSandboxModeFlag(\n value: string | undefined,\n origin: string,\n): SandboxMode | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (isSandboxMode(value)) {\n return value;\n }\n throw new Error(\n `Invalid sandbox mode \"${value}\" from ${origin}. Valid values: ${SANDBOX_MODE_VALUES.join(\n \", \",\n )}.`,\n );\n}\n\nexport function parseApprovalModeFlag(\n value: string | undefined,\n origin: string,\n): ApprovalMode | undefined {\n if (value === undefined) {\n return undefined;\n }\n if (isApprovalMode(value)) {\n return value;\n }\n throw new Error(\n `Invalid approval mode \"${value}\" from ${origin}. Valid values: ${APPROVAL_MODE_VALUES.join(\n \", \",\n )}.`,\n );\n}\n\n","import type {\n BeforeStartHook,\n EventHook,\n HookContext,\n HookRegistration,\n} from \"./types\";\n\nexport function emitWarnings(warnings: string[], fromIndex = 0): void {\n for (let i = fromIndex; i < warnings.length; i += 1) {\n const message = warnings[i];\n process.stderr.write(`[codex-native] Warning: ${message}\\n`);\n }\n}\n\nexport async function runBeforeStartHooks(\n hooks: Array<HookRegistration<BeforeStartHook>>,\n context: HookContext,\n warnings: string[],\n): Promise<void> {\n for (const hook of hooks) {\n try {\n await hook.callback(context);\n } catch (error) {\n warnings.push(\n `beforeStart hook \"${hook.source}\" threw: ${(error as Error).message ?? String(error)}`,\n );\n }\n }\n}\n\nexport async function runEventHooks(\n hooks: Array<HookRegistration<EventHook>>,\n event: unknown,\n context: HookContext,\n warnings: string[],\n): Promise<void> {\n for (const hook of hooks) {\n try {\n await hook.callback(event, context);\n } catch (error) {\n warnings.push(`onEvent hook \"${hook.source}\" threw: ${(error as Error).message ?? String(error)}`);\n }\n }\n}\n\n","import path from \"node:path\";\n\nimport type { NativeRunRequest, NativeTuiRequest } from \"../nativeBinding\";\nimport type {\n ApprovalMode,\n SandboxMode,\n ThreadOptions,\n WorkspaceWriteOptions,\n} from \"../threadOptions\";\n\nconst FULL_ACCESS_SANDBOX: SandboxMode = \"workspace-write\";\nconst FULL_ACCESS_APPROVAL: ApprovalMode = \"never\";\n\ntype SandboxTarget = {\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n};\n\nexport function applyElevatedRunDefaults(request: NativeRunRequest, cwd: string): void {\n const workingDirectory = resolveWorkingDirectory(request.workingDirectory, cwd);\n request.workingDirectory = workingDirectory;\n ensureSandboxModes(request);\n request.workspaceWriteOptions = ensureWorkspaceWriteOptions(\n request.workspaceWriteOptions,\n workingDirectory,\n );\n}\n\nexport function applyElevatedTuiDefaults(params: {\n request: NativeTuiRequest;\n thread: ThreadOptions;\n cwd: string;\n}): void {\n const { request, thread, cwd } = params;\n const workingDirectory = resolveWorkingDirectory(\n request.workingDirectory ?? thread.workingDirectory,\n cwd,\n );\n\n request.workingDirectory = workingDirectory;\n thread.workingDirectory = workingDirectory;\n\n ensureSandboxModes(request);\n thread.sandboxMode = request.sandboxMode ?? thread.sandboxMode ?? FULL_ACCESS_SANDBOX;\n thread.approvalMode = request.approvalMode ?? thread.approvalMode ?? FULL_ACCESS_APPROVAL;\n\n thread.workspaceWriteOptions = ensureWorkspaceWriteOptions(\n thread.workspaceWriteOptions,\n workingDirectory,\n );\n}\n\nfunction ensureSandboxModes(target: SandboxTarget): void {\n if (!target.sandboxMode) {\n target.sandboxMode = FULL_ACCESS_SANDBOX;\n }\n if (!target.approvalMode) {\n target.approvalMode = FULL_ACCESS_APPROVAL;\n }\n}\n\nfunction ensureWorkspaceWriteOptions(\n options: WorkspaceWriteOptions | undefined,\n workingDirectory: string,\n): WorkspaceWriteOptions {\n const resolved = path.resolve(workingDirectory);\n const writableRoots = new Set(options?.writableRoots ?? []);\n writableRoots.add(resolved);\n\n return {\n ...options,\n networkAccess: options?.networkAccess ?? true,\n writableRoots: Array.from(writableRoots),\n };\n}\n\nfunction resolveWorkingDirectory(candidate: string | undefined, cwd: string): string {\n if (!candidate || candidate.trim().length === 0) {\n return path.resolve(cwd);\n }\n return path.isAbsolute(candidate) ? candidate : path.resolve(cwd, candidate);\n}\n","import * as path from \"node:path\";\n\nimport type { Thread } from \"../thread\";\nimport type { ThreadItem } from \"../items\";\n\nimport { LspManager } from \"./manager\";\nimport type { FileDiagnostics, LspManagerOptions } from \"./types\";\nimport { formatDiagnosticsForBackgroundEvent } from \"./format\";\n\nexport class LspDiagnosticsBridge {\n private readonly manager: LspManager;\n private readonly attached = new WeakSet<Thread>();\n\n constructor(private readonly options: LspManagerOptions) {\n this.manager = new LspManager(options);\n }\n\n attach(thread: Thread): () => void {\n if (this.attached.has(thread)) {\n return () => {};\n }\n this.attached.add(thread);\n const unsubscribe = thread.onEvent((event) => {\n if (event.type !== \"item.completed\") {\n return;\n }\n\n if (event.item.type === \"file_change\") {\n const targets = event.item.changes\n .filter((change) => change.kind !== \"delete\")\n .map((change) => path.resolve(this.options.workingDirectory, change.path));\n if (targets.length === 0) {\n return;\n }\n void this.processDiagnostics(thread, targets);\n return;\n }\n\n if (event.item.type === \"mcp_tool_call\") {\n const targets = extractReadFileTargets(event.item, this.options.workingDirectory);\n if (targets.length === 0) {\n return;\n }\n void this.processDiagnostics(thread, targets);\n }\n });\n return () => {\n this.attached.delete(thread);\n unsubscribe();\n };\n }\n\n async dispose(): Promise<void> {\n await this.manager.dispose();\n }\n\n private async processDiagnostics(thread: Thread, files: string[]): Promise<void> {\n try {\n const diagnostics = await this.manager.collectDiagnostics(files);\n if (diagnostics.length === 0) {\n return;\n }\n const summary = formatDiagnosticsForBackgroundEvent(\n diagnostics,\n this.options.workingDirectory,\n );\n console.log(`\\n📟 LSP diagnostics detected:\\n${summary}\\n`);\n try {\n await thread.sendBackgroundEvent(`LSP diagnostics detected:\\n${summary}`);\n } catch {\n // Thread may have ended; ignore.\n }\n } catch (error) {\n console.warn(\"[lsp] failed to collect diagnostics\", error);\n }\n }\n}\n\nfunction extractReadFileTargets(item: ThreadItem, cwd: string): string[] {\n if (item.type !== \"mcp_tool_call\") {\n return [];\n }\n const toolName = item.tool?.toLowerCase?.();\n if (toolName !== \"read_file\" && toolName !== \"read_file_v2\") {\n return [];\n }\n\n let args: unknown = item.arguments;\n if (typeof args === \"string\") {\n try {\n args = JSON.parse(args);\n } catch {\n return [];\n }\n }\n\n if (!args || typeof args !== \"object\") {\n return [];\n }\n\n const filePath =\n (args as { file_path?: unknown; path?: unknown }).file_path ?? (args as { path?: unknown }).path;\n if (typeof filePath !== \"string\" || filePath.trim().length === 0) {\n return [];\n }\n\n const resolved = path.isAbsolute(filePath) ? filePath : path.resolve(cwd, filePath);\n return [resolved];\n}\n","import * as path from \"node:path\";\n\nimport type { Diagnostic } from \"vscode-languageserver-types\";\n\nimport { findServerForFile, resolveWorkspaceRoot } from \"./servers\";\nimport { LspClient, normalizeSeverity } from \"./client\";\nimport type {\n FileDiagnostics,\n LspManagerOptions,\n LspServerConfig,\n NormalizedDiagnostic,\n} from \"./types\";\n\nexport class LspManager {\n private clients = new Map<string, Promise<LspClient | null>>();\n\n constructor(private readonly options: LspManagerOptions) {}\n\n async collectDiagnostics(files: string[]): Promise<FileDiagnostics[]> {\n const unique = Array.from(new Set(files.map((file) => path.resolve(file))));\n const results: FileDiagnostics[] = [];\n for (const filePath of unique) {\n const server = findServerForFile(filePath);\n if (!server) {\n continue;\n }\n const root = resolveWorkspaceRoot(filePath, server.workspace, this.options.workingDirectory);\n const client = await this.getClient(server, root);\n if (!client) {\n continue;\n }\n try {\n await client.openFile(filePath, this.options.waitForDiagnostics !== false);\n } catch (error) {\n console.warn(`[lsp] failed to open ${filePath}:`, error);\n continue;\n }\n const normalized = client\n .getDiagnostics(filePath)\n .map((diag) => normalizeDiagnostic(diag))\n .filter((diag) => diag.message.trim().length > 0);\n if (normalized.length > 0) {\n results.push({ path: filePath, diagnostics: normalized });\n }\n }\n return results;\n }\n\n async dispose(): Promise<void> {\n await Promise.all(\n Array.from(this.clients.values()).map(async (promise) => {\n const client = await promise;\n await client?.shutdown();\n }),\n );\n this.clients.clear();\n }\n\n private async getClient(server: LspServerConfig, root: string): Promise<LspClient | null> {\n const key = `${server.id}:${root}`;\n let existing = this.clients.get(key);\n if (!existing) {\n existing = this.createClient(server, root);\n this.clients.set(key, existing);\n }\n const client = await existing;\n if (!client) {\n this.clients.delete(key);\n }\n return client;\n }\n\n private async createClient(server: LspServerConfig, root: string): Promise<LspClient | null> {\n try {\n return await LspClient.start(server, root);\n } catch (error) {\n console.warn(`[lsp] unable to start ${server.displayName}:`, error);\n return null;\n }\n }\n}\n\nfunction normalizeDiagnostic(diag: Diagnostic): NormalizedDiagnostic {\n return {\n message: diag.message ?? \"\",\n severity: normalizeSeverity(diag.severity),\n source: diag.source,\n code: diag.code,\n range: diag.range,\n };\n}\n\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport type { LspServerConfig, WorkspaceLocator } from \"./types\";\n\nconst MARKERS_NODE = [\"package-lock.json\", \"pnpm-lock.yaml\", \"yarn.lock\", \"bun.lockb\", \"bun.lock\"];\nconst MARKERS_PY = [\"pyproject.toml\", \"requirements.txt\", \"Pipfile\", \"setup.py\", \"setup.cfg\", \"poetry.lock\"];\nconst MARKERS_RUST = [\"Cargo.toml\"];\n\nexport const DEFAULT_SERVERS: LspServerConfig[] = [\n {\n id: \"typescript\",\n displayName: \"TypeScript Language Server\",\n command: [\"typescript-language-server\", \"--stdio\"],\n extensions: [\".ts\", \".tsx\", \".js\", \".jsx\", \".mjs\", \".cjs\"],\n workspace: { type: \"markers\", include: MARKERS_NODE },\n },\n {\n id: \"pyright\",\n displayName: \"Pyright\",\n command: [\"pyright-langserver\", \"--stdio\"],\n extensions: [\".py\", \".pyi\"],\n workspace: { type: \"markers\", include: MARKERS_PY },\n },\n {\n id: \"rust-analyzer\",\n displayName: \"rust-analyzer\",\n command: [\"rust-analyzer\"],\n extensions: [\".rs\"],\n workspace: { type: \"markers\", include: MARKERS_RUST },\n },\n];\n\nexport function findServerForFile(filePath: string): LspServerConfig | undefined {\n const lower = filePath.toLowerCase();\n return DEFAULT_SERVERS.find((server) => server.extensions.some((ext) => lower.endsWith(ext)));\n}\n\nexport function resolveWorkspaceRoot(\n filePath: string,\n locator: WorkspaceLocator | undefined,\n fallbackDir: string,\n): string {\n if (!locator) {\n return fallbackDir;\n }\n if (locator.type === \"fixed\") {\n return locator.path;\n }\n const include = locator.include ?? [];\n const exclude = locator.exclude ?? [];\n let current = fs.statSync(filePath, { throwIfNoEntry: false })?.isDirectory()\n ? filePath\n : path.dirname(filePath);\n const root = path.parse(current).root;\n while (true) {\n if (exclude.some((pattern) => fs.existsSync(path.join(current, pattern)))) {\n break;\n }\n if (include.some((pattern) => fs.existsSync(path.join(current, pattern)))) {\n return current;\n }\n if (current === root) {\n break;\n }\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return fallbackDir;\n}\n\n","import { spawn, type ChildProcessWithoutNullStreams } from \"node:child_process\";\nimport * as fs from \"node:fs/promises\";\nimport * as path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { EventEmitter } from \"node:events\";\nimport { createMessageConnection, type MessageConnection } from \"vscode-jsonrpc\";\nimport { StreamMessageReader, StreamMessageWriter } from \"vscode-jsonrpc/lib/node/main.js\";\nimport type { Diagnostic } from \"vscode-languageserver-types\";\nimport { DiagnosticSeverity } from \"vscode-languageserver-types\";\n\nimport type { LspServerConfig } from \"./types\";\n\nconst DEFAULT_TIMEOUT_MS = 3_000;\n\nexport class LspClient {\n private connection: MessageConnection | null = null;\n private process: ChildProcessWithoutNullStreams | null = null;\n private diagnostics = new Map<string, Diagnostic[]>();\n private versions = new Map<string, number>();\n private emitter = new EventEmitter();\n\n private constructor(\n private readonly config: LspServerConfig,\n private readonly root: string,\n ) {}\n\n static async start(server: LspServerConfig, root: string): Promise<LspClient> {\n const client = new LspClient(server, root);\n await client.initialize();\n return client;\n }\n\n private async initialize(): Promise<void> {\n const [command, ...args] = this.config.command;\n if (!command) {\n throw new Error(`LSP server ${this.config.id} is missing a command executable`);\n }\n try {\n this.process = spawn(command, args, {\n cwd: this.root,\n env: { ...process.env, ...this.config.env },\n stdio: \"pipe\",\n });\n } catch (error) {\n throw new Error(`Failed to spawn ${this.config.displayName} (${command}): ${String(error)}`);\n }\n\n const child = this.process;\n // LSP stderr is suppressed from console - agents still get diagnostics via publishDiagnostics\n child.stderr.on(\"data\", (_chunk) => {\n // Silently consume stderr to avoid console spam during merge resolution\n });\n\n const reader = new StreamMessageReader(child.stdout);\n const writer = new StreamMessageWriter(child.stdin);\n this.connection = createMessageConnection(reader, writer);\n\n this.connection.onNotification(\"textDocument/publishDiagnostics\", (payload: PublishDiagnosticsParams) => {\n const fsPath = fileURLToPath(payload.uri);\n this.diagnostics.set(fsPath, payload.diagnostics);\n this.emitter.emit(`diagnostics:${fsPath}`);\n });\n this.connection.onError((err: unknown) => {\n console.warn(`[lsp:${this.config.id}] connection error`, err);\n });\n this.connection.listen();\n\n await this.connection.sendRequest(\"initialize\", {\n rootUri: pathToFileURL(this.root).href,\n processId: process.pid,\n initializationOptions: this.config.initializationOptions ?? {},\n capabilities: {\n textDocument: {\n synchronization: {\n didOpen: true,\n didChange: true,\n },\n publishDiagnostics: {\n versionSupport: true,\n },\n },\n workspace: {\n workspaceFolders: true,\n },\n },\n workspaceFolders: [\n {\n name: path.basename(this.root),\n uri: pathToFileURL(this.root).href,\n },\n ],\n });\n await this.connection.sendNotification(\"initialized\", {});\n }\n\n async openFile(filePath: string, waitForDiagnostics: boolean): Promise<void> {\n if (!this.connection) return;\n const absolute = path.resolve(filePath);\n const text = await fs.readFile(absolute, \"utf8\");\n const uri = pathToFileURL(absolute).href;\n const languageId = detectLanguageId(absolute);\n\n const existingVersion = this.versions.get(absolute);\n if (existingVersion === undefined) {\n this.versions.set(absolute, 0);\n await this.connection.sendNotification(\"textDocument/didOpen\", {\n textDocument: {\n uri,\n languageId,\n version: 0,\n text,\n },\n });\n } else {\n const next = existingVersion + 1;\n this.versions.set(absolute, next);\n await this.connection.sendNotification(\"textDocument/didChange\", {\n textDocument: {\n uri,\n version: next,\n },\n contentChanges: [{ text }],\n });\n }\n\n if (waitForDiagnostics) {\n await this.waitForDiagnostics(absolute);\n }\n }\n\n getDiagnostics(filePath: string): Diagnostic[] {\n const absolute = path.resolve(filePath);\n return this.diagnostics.get(absolute) ?? [];\n }\n\n private waitForDiagnostics(filePath: string, timeoutMs = DEFAULT_TIMEOUT_MS): Promise<void> {\n const absolute = path.resolve(filePath);\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, timeoutMs).unref();\n this.emitter.once(`diagnostics:${absolute}`, () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n async shutdown(): Promise<void> {\n try {\n await this.connection?.dispose();\n } catch {\n // ignore\n }\n if (this.process && !this.process.killed) {\n this.process.kill();\n }\n }\n}\n\ntype PublishDiagnosticsParams = {\n uri: string;\n diagnostics: Diagnostic[];\n};\n\nfunction detectLanguageId(filePath: string): string {\n const ext = path.extname(filePath).toLowerCase();\n switch (ext) {\n case \".ts\":\n case \".mts\":\n case \".cts\":\n return \"typescript\";\n case \".tsx\":\n return \"typescriptreact\";\n case \".js\":\n case \".mjs\":\n case \".cjs\":\n return \"javascript\";\n case \".jsx\":\n return \"javascriptreact\";\n case \".py\":\n case \".pyi\":\n return \"python\";\n case \".rs\":\n return \"rust\";\n default:\n return \"plaintext\";\n }\n}\n\nexport function normalizeSeverity(severity?: Diagnostic[\"severity\"]): \"error\" | \"warning\" | \"info\" | \"hint\" {\n switch (severity) {\n case DiagnosticSeverity.Error:\n return \"error\";\n case DiagnosticSeverity.Warning:\n return \"warning\";\n case DiagnosticSeverity.Information:\n return \"info\";\n case DiagnosticSeverity.Hint:\n return \"hint\";\n default:\n return \"error\";\n }\n}\n","import * as path from \"node:path\";\n\nimport type { FileDiagnostics, NormalizedDiagnostic } from \"./types\";\n\nconst MAX_DIAGNOSTICS_PER_FILE = 5;\n\nexport type DiagnosticSeverity = \"error\" | \"warning\" | \"info\" | \"hint\";\n\nexport function formatDiagnosticsForTool(diagnostics: FileDiagnostics[]): string {\n return diagnostics\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = filePath;\n const lines = entries.slice(0, MAX_DIAGNOSTICS_PER_FILE).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > MAX_DIAGNOSTICS_PER_FILE ? \" - …\" : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\nexport function formatDiagnosticsForBackgroundEvent(\n diagnostics: FileDiagnostics[],\n cwd: string,\n): string {\n return diagnostics\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = path.relative(cwd, filePath) || filePath;\n const lines = entries.slice(0, MAX_DIAGNOSTICS_PER_FILE).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > MAX_DIAGNOSTICS_PER_FILE ? \" - …\" : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n}\n\n/**\n * Filter diagnostics by minimum severity level\n */\nexport function filterBySeverity(\n diagnostics: FileDiagnostics[],\n minSeverity: DiagnosticSeverity = \"error\",\n): FileDiagnostics[] {\n const severityOrder: Record<DiagnosticSeverity, number> = {\n error: 0,\n warning: 1,\n info: 2,\n hint: 3,\n };\n const threshold = severityOrder[minSeverity];\n\n return diagnostics\n .map((file) => ({\n ...file,\n diagnostics: file.diagnostics.filter(\n (diag) => severityOrder[diag.severity as DiagnosticSeverity] <= threshold,\n ),\n }))\n .filter((file) => file.diagnostics.length > 0);\n}\n\n/**\n * Generate summary statistics for diagnostics\n */\nexport function summarizeDiagnostics(diagnostics: FileDiagnostics[]): {\n fileCount: number;\n errorCount: number;\n warningCount: number;\n infoCount: number;\n hintCount: number;\n totalCount: number;\n} {\n let errorCount = 0;\n let warningCount = 0;\n let infoCount = 0;\n let hintCount = 0;\n\n for (const file of diagnostics) {\n for (const diag of file.diagnostics) {\n switch (diag.severity) {\n case \"error\":\n errorCount++;\n break;\n case \"warning\":\n warningCount++;\n break;\n case \"info\":\n infoCount++;\n break;\n case \"hint\":\n hintCount++;\n break;\n }\n }\n }\n\n return {\n fileCount: diagnostics.length,\n errorCount,\n warningCount,\n infoCount,\n hintCount,\n totalCount: errorCount + warningCount + infoCount + hintCount,\n };\n}\n\n/**\n * Format diagnostics with summary (concise format for post-merge validation)\n */\nexport function formatDiagnosticsWithSummary(\n diagnostics: FileDiagnostics[],\n cwd: string,\n options: {\n minSeverity?: DiagnosticSeverity;\n maxPerFile?: number;\n } = {},\n): string {\n const filtered = options.minSeverity\n ? filterBySeverity(diagnostics, options.minSeverity)\n : diagnostics;\n\n if (filtered.length === 0) {\n return \"No diagnostics found.\";\n }\n\n const summary = summarizeDiagnostics(filtered);\n const maxPerFile = options.maxPerFile ?? MAX_DIAGNOSTICS_PER_FILE;\n\n const header = `LSP Diagnostics Summary: ${summary.errorCount} error${summary.errorCount !== 1 ? \"s\" : \"\"}, ${summary.warningCount} warning${summary.warningCount !== 1 ? \"s\" : \"\"} across ${summary.fileCount} file${summary.fileCount !== 1 ? \"s\" : \"\"}`;\n\n const details = filtered\n .map(({ path: filePath, diagnostics: entries }) => {\n const rel = path.relative(cwd, filePath) || filePath;\n const lines = entries.slice(0, maxPerFile).map((diag) => {\n const { line, character } = diag.range.start;\n const location = `${line + 1}:${character + 1}`;\n const source = diag.source ? ` · ${diag.source}` : \"\";\n return ` - [${diag.severity.toUpperCase()}] ${diag.message} (${location}${source})`;\n });\n const trimmed = entries.length > maxPerFile ? ` - … (${entries.length - maxPerFile} more)` : \"\";\n return [`• ${rel}`, ...lines, trimmed].filter(Boolean).join(\"\\n\");\n })\n .join(\"\\n\");\n\n return `${header}\\n\\n${details}`;\n}\n\n","import type { Thread } from \"../thread\";\nimport type { LspManagerOptions } from \"./types\";\nimport { LspDiagnosticsBridge } from \"./bridge\";\n\n/**\n * Attaches the LSP diagnostics bridge to a thread.\n * Returns a cleanup function that detaches the bridge and disposes shared resources.\n */\nexport function attachLspDiagnostics(thread: Thread, options: LspManagerOptions): () => void {\n const bridge = new LspDiagnosticsBridge(options);\n const detach = bridge.attach(thread);\n return () => {\n detach();\n void bridge.dispose().catch((error) => {\n console.warn(\"Failed to dispose LSP bridge\", error);\n });\n };\n}\n\n","import type { Thread } from \"../thread\";\nimport type { ThreadEvent } from \"../events\";\nimport type { NativeBinding } from \"../nativeBinding\";\nimport { attachLspDiagnostics } from \"../lsp\";\n\ntype EventListener = (event: ThreadEvent) => void;\n\nclass RunCommandThreadRelay implements Pick<Thread, \"onEvent\" | \"sendBackgroundEvent\"> {\n private readonly listeners = new Set<EventListener>();\n private threadId: string | null;\n\n constructor(private readonly binding: NativeBinding, initialThreadId?: string) {\n this.threadId = initialThreadId ?? null;\n }\n\n onEvent(listener: EventListener): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async sendBackgroundEvent(message: string): Promise<void> {\n const trimmed = typeof message === \"string\" ? message.trim() : \"\";\n if (!trimmed) {\n throw new Error(\"Background event message must be a non-empty string\");\n }\n if (!this.threadId) {\n throw new Error(\"Cannot emit a background event before the thread has started\");\n }\n if (typeof this.binding.emitBackgroundEvent !== \"function\") {\n throw new Error(\"emitBackgroundEvent is not available in this build\");\n }\n await this.binding.emitBackgroundEvent({ threadId: this.threadId, message: trimmed });\n }\n\n handleEvent(event: ThreadEvent): void {\n if (event.type === \"thread.started\" && typeof event.thread_id === \"string\") {\n this.threadId = event.thread_id;\n }\n for (const listener of this.listeners) {\n try {\n listener(event);\n } catch (error) {\n console.warn(\"[codex-native] LSP listener failed\", error);\n }\n }\n }\n\n setThreadId(id: string | undefined): void {\n if (id) {\n this.threadId = id;\n }\n }\n}\n\nexport function createRunCommandLspBridge(params: {\n binding: NativeBinding;\n workingDirectory: string;\n initialThreadId?: string;\n}): {\n handleEvent: (event: ThreadEvent) => void;\n dispose: () => void;\n} | null {\n try {\n const relay = new RunCommandThreadRelay(params.binding, params.initialThreadId);\n const detach = attachLspDiagnostics(relay as unknown as Thread, {\n workingDirectory: params.workingDirectory,\n waitForDiagnostics: true,\n });\n relay.setThreadId(params.initialThreadId);\n return {\n handleEvent: (event: ThreadEvent) => relay.handleEvent(event),\n dispose: () => detach(),\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n console.warn(`[codex-native] Failed to initialize LSP diagnostics bridge: ${message}`);\n return null;\n }\n}\n","import process from \"node:process\";\n\nimport { Codex } from \"../codex\";\nimport type { ThreadOptions } from \"../threadOptions\";\nimport type { NativeTuiRequest } from \"../nativeBinding\";\nimport { emitWarnings, runBeforeStartHooks } from \"./hooks\";\nimport { parseApprovalModeFlag, parseSandboxModeFlag } from \"./optionParsers\";\nimport type { CliContext, CommandName, TuiCommandOptions } from \"./types\";\nimport { applyElevatedTuiDefaults } from \"./elevatedDefaults\";\n\nexport async function executeTuiCommand(\n argv: TuiCommandOptions,\n context: CliContext,\n): Promise<void> {\n if (!process.stdout.isTTY || !process.stdin.isTTY) {\n throw new Error(\"The interactive TUI requires an interactive terminal (TTY).\");\n }\n\n const { combinedConfig } = context;\n emitWarnings(combinedConfig.warnings);\n const warningCount = combinedConfig.warnings.length;\n\n const { request, thread: threadOptions } = buildTuiConfig({\n argv,\n defaults: combinedConfig.tuiDefaults,\n cwd: context.cwd,\n });\n\n applyElevatedTuiDefaults({ request, thread: threadOptions, cwd: context.cwd });\n\n const hookContext = {\n command: \"tui\" as CommandName,\n cwd: context.cwd,\n options: argv,\n };\n\n await runBeforeStartHooks(combinedConfig.beforeStartHooks, hookContext, combinedConfig.warnings);\n\n const codex = new Codex({\n baseUrl: request.baseUrl,\n apiKey: request.apiKey,\n preserveRegisteredTools: true,\n });\n const thread = codex.startThread(threadOptions);\n\n const exitInfo = await thread.tui(request);\n if (exitInfo.conversationId) {\n process.stdout.write(`\\nConversation ID: ${exitInfo.conversationId}\\n`);\n }\n if (exitInfo.updateAction) {\n process.stdout.write(\n `Update available (${exitInfo.updateAction.kind}): ${exitInfo.updateAction.command}\\n`,\n );\n }\n\n emitWarnings(combinedConfig.warnings, warningCount);\n}\n\nfunction buildTuiConfig(params: {\n argv: TuiCommandOptions;\n defaults: Partial<NativeTuiRequest>;\n cwd: string;\n}): { request: NativeTuiRequest; thread: ThreadOptions } {\n const { argv, defaults, cwd } = params;\n const request: NativeTuiRequest = {\n ...(defaults as NativeTuiRequest),\n };\n\n if (argv.prompt !== undefined) request.prompt = argv.prompt;\n if (argv.model !== undefined) request.model = argv.model;\n if (argv.oss !== undefined) request.oss = argv.oss;\n const sandboxMode = parseSandboxModeFlag(argv.sandbox, \"--sandbox\");\n if (sandboxMode !== undefined) {\n request.sandboxMode = sandboxMode;\n }\n\n const approvalMode = parseApprovalModeFlag(argv.approval, \"--approval\");\n if (approvalMode !== undefined) {\n request.approvalMode = approvalMode;\n }\n if (argv.resume !== undefined) request.resumeSessionId = argv.resume;\n if (argv.resumeLast !== undefined) request.resumeLast = argv.resumeLast;\n if (argv.resumePicker !== undefined) request.resumePicker = argv.resumePicker;\n if (argv.fullAuto !== undefined) request.fullAuto = argv.fullAuto;\n if (argv.dangerouslyBypassApprovalsAndSandbox !== undefined) {\n request.dangerouslyBypassApprovalsAndSandbox = argv.dangerouslyBypassApprovalsAndSandbox;\n }\n if (argv.cd !== undefined) request.workingDirectory = argv.cd;\n if (argv.configProfile !== undefined) request.configProfile = argv.configProfile;\n if (argv.webSearch !== undefined) request.webSearch = argv.webSearch;\n if (argv.linuxSandboxPath !== undefined) request.linuxSandboxPath = argv.linuxSandboxPath;\n if (argv.baseUrl !== undefined) request.baseUrl = argv.baseUrl;\n if (argv.apiKey !== undefined) request.apiKey = argv.apiKey;\n\n if (argv.configOverrides) {\n const defaultsOverrides = Array.isArray(request.configOverrides)\n ? [...request.configOverrides]\n : [];\n request.configOverrides = [...defaultsOverrides, ...argv.configOverrides];\n }\n\n if (argv.addDir) {\n const defaultsAddDir = Array.isArray(request.addDir) ? [...request.addDir] : [];\n request.addDir = [...defaultsAddDir, ...argv.addDir];\n }\n\n if (argv.image) {\n const defaultsImages = Array.isArray(request.images) ? [...request.images] : [];\n request.images = [...defaultsImages, ...argv.image];\n }\n\n const thread: ThreadOptions = {\n model: request.model,\n oss: request.oss,\n sandboxMode: request.sandboxMode,\n approvalMode: request.approvalMode,\n workingDirectory: request.workingDirectory ?? cwd,\n skipGitRepoCheck: false,\n };\n\n return { request, thread };\n}\n","import {\n ApprovalMode,\n ReasoningEffort,\n ReasoningSummary,\n SandboxMode,\n WorkspaceWriteOptions,\n} from \"./threadOptions\";\nimport {\n NativeBinding,\n NativeConversationListPage,\n NativeConversationListRequest,\n NativeDeleteConversationRequest,\n NativeDeleteConversationResult,\n NativeForkRequest,\n NativeForkResult,\n NativeResumeFromRolloutRequest,\n NativeRunRequest,\n NativeUserInputItem,\n getNativeBinding,\n} from \"./nativeBinding\";\n\nexport type CodexExecArgs = {\n input: string;\n baseUrl?: string;\n apiKey?: string;\n modelProvider?: string;\n threadId?: string | null;\n images?: string[];\n inputItems?: NativeUserInputItem[];\n model?: string;\n /** Use local OSS provider via Ollama (pulls models as needed) */\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n outputSchemaFile?: string;\n outputSchema?: unknown;\n reasoningEffort?: ReasoningEffort;\n reasoningSummary?: ReasoningSummary;\n /** @deprecated Use sandboxMode and approvalMode instead */\n fullAuto?: boolean;\n review?: ReviewExecOptions | null;\n};\n\nexport type ReviewExecOptions = {\n userFacingHint?: string;\n};\n\nexport type CodexForkArgs = {\n threadId: string;\n nthUserMessage: number;\n baseUrl?: string;\n apiKey?: string;\n modelProvider?: string;\n model?: string;\n oss?: boolean;\n sandboxMode?: SandboxMode;\n approvalMode?: ApprovalMode;\n workspaceWriteOptions?: WorkspaceWriteOptions;\n workingDirectory?: string;\n skipGitRepoCheck?: boolean;\n linuxSandboxPath?: string;\n fullAuto?: boolean;\n};\n\n/**\n * CodexExec for the native package - uses NAPI bindings exclusively.\n * No CLI fallback.\n */\nexport class CodexExec {\n private readonly native: NativeBinding;\n\n constructor() {\n const nativeBinding = getNativeBinding();\n if (!nativeBinding) {\n throw new Error(\n \"Native NAPI binding not available. Make sure @codex-native/sdk is properly installed and built.\"\n );\n }\n this.native = nativeBinding;\n }\n\n requiresOutputSchemaFile(): boolean {\n return false;\n }\n\n async *run(args: CodexExecArgs): AsyncGenerator<string> {\n const binding = this.native;\n const queue = new AsyncQueue<string>();\n\n const request: NativeRunRequest = {\n prompt: args.input,\n threadId: args.threadId ?? undefined,\n inputItems: args.inputItems,\n images: args.images && args.images.length > 0 ? args.images : undefined,\n model: args.model,\n oss: args.oss,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n sandboxMode: args.sandboxMode,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n outputSchema: args.outputSchema,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n modelProvider: args.modelProvider,\n reasoningEffort: args.reasoningEffort,\n reasoningSummary: args.reasoningSummary,\n fullAuto: args.fullAuto,\n reviewMode: args.review ? true : undefined,\n reviewHint: args.review?.userFacingHint,\n };\n\n let runPromise: Promise<void> = Promise.resolve();\n try {\n runPromise = binding\n .runThreadStream(request, (err, eventJson) => {\n if (err) {\n queue.fail(err);\n return;\n }\n try {\n queue.push(eventJson ?? \"null\");\n } catch (error) {\n queue.fail(error);\n }\n })\n .then(\n () => {\n queue.end();\n },\n (error) => {\n queue.fail(error);\n },\n );\n } catch (error) {\n queue.fail(error);\n throw error;\n }\n\n let loopError: unknown;\n try {\n for await (const value of queue) {\n yield value;\n }\n await runPromise;\n } catch (error) {\n loopError = error;\n throw error;\n } finally {\n queue.end();\n if (loopError) {\n await runPromise.catch(() => {});\n }\n }\n }\n\n async compact(args: CodexExecArgs): Promise<string[]> {\n const request: NativeRunRequest = {\n prompt: args.input,\n threadId: args.threadId ?? undefined,\n images: args.images && args.images.length > 0 ? args.images : undefined,\n model: args.model,\n modelProvider: args.modelProvider,\n oss: args.oss,\n sandboxMode: args.sandboxMode,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n outputSchema: args.outputSchema,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n fullAuto: args.fullAuto,\n reasoningEffort: args.reasoningEffort,\n reasoningSummary: args.reasoningSummary,\n reviewMode: args.review ? true : undefined,\n reviewHint: args.review?.userFacingHint,\n };\n return this.native.compactThread(request);\n }\n\n async fork(args: CodexForkArgs): Promise<NativeForkResult> {\n if (!args.threadId) {\n throw new Error(\"threadId is required to fork a conversation\");\n }\n const request: NativeForkRequest = {\n threadId: args.threadId,\n nthUserMessage: args.nthUserMessage,\n model: args.model,\n oss: args.oss,\n sandboxMode: args.sandboxMode,\n approvalMode: args.approvalMode,\n workspaceWriteOptions: args.workspaceWriteOptions,\n workingDirectory: args.workingDirectory,\n skipGitRepoCheck: args.skipGitRepoCheck,\n baseUrl: args.baseUrl,\n apiKey: args.apiKey,\n modelProvider: args.modelProvider,\n linuxSandboxPath: args.linuxSandboxPath,\n fullAuto: args.fullAuto,\n };\n return this.native.forkThread(request);\n }\n\n async listConversations(\n request: NativeConversationListRequest,\n ): Promise<NativeConversationListPage> {\n return this.native.listConversations(request);\n }\n\n async deleteConversation(\n request: NativeDeleteConversationRequest,\n ): Promise<NativeDeleteConversationResult> {\n return this.native.deleteConversation(request);\n }\n\n async resumeConversationFromRollout(\n request: NativeResumeFromRolloutRequest,\n ): Promise<NativeForkResult> {\n return this.native.resumeConversationFromRollout(request);\n }\n}\n\ntype Resolver<T> = {\n resolve: (result: IteratorResult<T>) => void;\n reject: (error: unknown) => void;\n};\n\nclass AsyncQueue<T> implements AsyncIterable<T> {\n private readonly buffer: T[] = [];\n private waiters: Resolver<T>[] = [];\n private ended = false;\n private error: unknown;\n\n push(value: T) {\n if (this.ended) return;\n if (this.waiters.length > 0) {\n const waiter = this.waiters.shift()!;\n waiter.resolve({ value, done: false });\n return;\n }\n this.buffer.push(value);\n }\n\n end() {\n if (this.ended) return;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.resolve({ value: undefined as never, done: true });\n }\n }\n\n fail(error: unknown) {\n if (this.ended) return;\n this.error = error;\n this.ended = true;\n const waiters = this.waiters;\n this.waiters = [];\n for (const waiter of waiters) {\n waiter.reject(error);\n }\n }\n\n async next(): Promise<IteratorResult<T>> {\n if (this.buffer.length > 0) {\n const value = this.buffer.shift()!;\n return { value, done: false };\n }\n if (this.error) {\n return Promise.reject(this.error);\n }\n if (this.ended) {\n return { value: undefined as never, done: true };\n }\n\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this.waiters.push({ resolve, reject });\n });\n }\n\n [Symbol.asyncIterator](): AsyncIterableIterator<T> {\n return this;\n }\n}\n","import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\n\nimport { CodexOptions } from \"./codexOptions\";\nimport { ThreadEvent, ThreadError, Usage } from \"./events\";\nimport { convertRustEventToThreadEvent } from \"./events/convert\";\nimport { CodexExec, CodexForkArgs } from \"./exec\";\nimport { ThreadItem } from \"./items\";\nimport { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\nimport { createOutputSchemaFile, normalizeOutputSchema } from \"./outputSchemaFile\";\nimport { runTui, startTui } from \"./tui\";\nimport { getNativeBinding } from \"./nativeBinding\";\nimport type { NativeTuiRequest, NativeTuiExitInfo, ApprovalRequest, NativeUserInputItem } from \"./nativeBinding\";\nimport type { RunTuiOptions, TuiSession } from \"./tui\";\nimport { attachLspDiagnostics } from \"./lsp\";\nimport type { SkillDefinition, SkillMentionTrigger, SkillRegistry } from \"./skills\";\nimport { findSkillMentions, normalizeSkillDefinition } from \"./skills\";\n\n/** Completed turn. */\nexport type Turn = {\n items: ThreadItem[];\n finalResponse: string;\n usage: Usage | null;\n};\n\n/** Alias for `Turn` to describe the result of `run()`. */\nexport type RunResult = Turn;\n\n/** The result of the `runStreamed` method. */\nexport type StreamedTurn = {\n events: AsyncGenerator<ThreadEvent>;\n};\n\n/** Alias for `StreamedTurn` to describe the result of `runStreamed()`. */\nexport type RunStreamedResult = StreamedTurn;\n\n/** An input to send to the agent. */\nexport type UserInput =\n | {\n type: \"text\";\n text: string;\n }\n | {\n type: \"local_image\";\n path: string;\n };\n\nexport type Input = string | UserInput[];\n\nexport type ForkOptions = {\n nthUserMessage: number;\n threadOptions?: Partial<ThreadOptions>;\n};\n\nconst UNTRUSTED_DIRECTORY_ERROR =\n \"Not inside a trusted directory and --skip-git-repo-check was not specified.\";\n\nfunction findGitRoot(startDir: string): string | null {\n let current = path.resolve(startDir);\n\n while (true) {\n const gitPath = path.join(current, \".git\");\n if (fs.existsSync(gitPath)) {\n try {\n const stats = fs.statSync(gitPath);\n if (stats.isDirectory() || stats.isFile()) {\n return current;\n }\n } catch {\n // Ignore filesystem race conditions and keep searching upwards.\n }\n }\n\n const parent = path.dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n\n return null;\n}\n\nfunction assertTrustedDirectory(workingDirectory?: string): void {\n const directory = workingDirectory ? path.resolve(workingDirectory) : process.cwd();\n if (!findGitRoot(directory)) {\n throw new Error(UNTRUSTED_DIRECTORY_ERROR);\n }\n}\n\n/** Respesent a thread of conversation with the agent. One thread can have multiple consecutive turns. */\nexport class Thread {\n private _exec: CodexExec;\n private _options: CodexOptions;\n private _id: string | null;\n private _threadOptions: ThreadOptions;\n private _eventListeners: Array<(event: ThreadEvent) => void> = [];\n private _approvalHandler: ((request: ApprovalRequest) => boolean | Promise<boolean>) | null = null;\n private readonly _skills: SkillRegistry = new Map();\n private readonly _skillMentionTriggers: SkillMentionTrigger[];\n private readonly _codexSkills?: SkillRegistry;\n\n /** Returns the ID of the thread. Populated after the first turn starts. */\n public get id(): string | null {\n return this._id;\n }\n\n /**\n * Register an event listener for thread events.\n * @param listener Callback function that receives ThreadEvent objects\n * @returns Unsubscribe function to remove the listener\n */\n onEvent(listener: (event: ThreadEvent) => void): () => void {\n this._eventListeners.push(listener);\n return () => {\n const index = this._eventListeners.indexOf(listener);\n if (index !== -1) {\n this._eventListeners.splice(index, 1);\n }\n };\n }\n\n /**\n * Remove an event listener.\n * @param listener The listener function to remove\n */\n offEvent(listener: (event: ThreadEvent) => void): void {\n const index = this._eventListeners.indexOf(listener);\n if (index !== -1) {\n this._eventListeners.splice(index, 1);\n }\n }\n\n /**\n * Register a callback to handle approval requests from the agent.\n * The handler should return true to approve the action, false to deny it.\n *\n * @param handler Callback function that receives ApprovalRequest and returns approval decision\n * @example\n * ```typescript\n * thread.onApprovalRequest(async (request) => {\n * console.log(`Approval requested for ${request.type}`);\n * return true; // Auto-approve\n * });\n * ```\n */\n onApprovalRequest(handler: (request: ApprovalRequest) => boolean | Promise<boolean>): void {\n this._approvalHandler = handler;\n const binding = getNativeBinding();\n if (binding && typeof binding.registerApprovalCallback === \"function\") {\n binding.registerApprovalCallback(handler);\n }\n }\n\n /**\n * Emit a background notification while the agent is running the current turn.\n * The message is surfaced to event subscribers but does not modify the user input queue.\n *\n * @throws Error if the thread has not been started yet.\n */\n async sendBackgroundEvent(message: string): Promise<void> {\n const trimmed = message?.toString();\n if (!trimmed || trimmed.trim().length === 0) {\n throw new Error(\"Background event message must be a non-empty string\");\n }\n if (!this._id) {\n throw new Error(\"Cannot emit a background event before the thread has started\");\n }\n const binding = getNativeBinding();\n if (!binding || typeof binding.emitBackgroundEvent !== \"function\") {\n throw new Error(\"emitBackgroundEvent is not available in this build\");\n }\n await binding.emitBackgroundEvent({ threadId: this._id, message: trimmed });\n }\n\n /**\n * Programmatically update the agent's plan/todo list.\n * The plan will be applied at the start of the next turn.\n *\n * @param args The plan update arguments\n * @throws Error if no thread ID is available\n */\n updatePlan(args: {\n explanation?: string;\n plan: Array<{\n step: string;\n status: \"pending\" | \"in_progress\" | \"completed\";\n }>;\n }): void {\n if (!this._id) {\n throw new Error(\"Cannot update plan: no active thread\");\n }\n\n const binding = getNativeBinding();\n if (!binding || typeof binding.emitPlanUpdate !== 'function') {\n throw new Error(\"emitPlanUpdate is not available in this build\");\n }\n\n binding.emitPlanUpdate({\n threadId: this._id,\n explanation: args.explanation,\n plan: args.plan,\n });\n }\n\n /**\n * Modify the agent's plan/todo list with granular operations.\n * Changes will be applied at the start of the next turn.\n *\n * @param operations Array of operations to perform on the plan\n * @throws Error if no thread ID is available\n */\n modifyPlan(operations: Array<\n | { type: \"add\"; item: { step: string; status?: \"pending\" | \"in_progress\" | \"completed\" } }\n | { type: \"update\"; index: number; updates: Partial<{ step: string; status: \"pending\" | \"in_progress\" | \"completed\" }> }\n | { type: \"remove\"; index: number }\n | { type: \"reorder\"; newOrder: number[] }\n >): void {\n if (!this._id) {\n throw new Error(\"Cannot modify plan: no active thread\");\n }\n\n const binding = getNativeBinding();\n if (!binding || typeof binding.modifyPlan !== 'function') {\n throw new Error(\"modifyPlan is not available in this build\");\n }\n\n binding.modifyPlan({\n threadId: this._id,\n operations,\n });\n }\n\n /**\n * Add a new todo item to the agent's plan.\n *\n * @param step The todo step description\n * @param status The initial status (defaults to \"pending\")\n */\n addTodo(step: string, status: \"pending\" | \"in_progress\" | \"completed\" = \"pending\"): void {\n this.modifyPlan([{ type: \"add\", item: { step, status } }]);\n }\n\n /**\n * Update an existing todo item.\n *\n * @param index The index of the todo item to update\n * @param updates The updates to apply\n */\n updateTodo(\n index: number,\n updates: Partial<{ step: string; status: \"pending\" | \"in_progress\" | \"completed\" }>\n ): void {\n this.modifyPlan([{ type: \"update\", index, updates }]);\n }\n\n /**\n * Remove a todo item from the plan.\n *\n * @param index The index of the todo item to remove\n */\n removeTodo(index: number): void {\n this.modifyPlan([{ type: \"remove\", index }]);\n }\n\n /**\n * Reorder the todo items in the plan.\n *\n * @param newOrder Array of indices representing the new order\n */\n reorderTodos(newOrder: number[]): void {\n this.modifyPlan([{ type: \"reorder\", newOrder }]);\n }\n\n /** Compacts the conversation history for this thread using Codex's builtin compaction. */\n async compact(): Promise<void> {\n const skipGitRepoCheck =\n this._threadOptions?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(this._threadOptions?.workingDirectory);\n }\n const events: string[] = await this._exec.compact({\n input: \"compact\",\n threadId: this._id,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n model: this._threadOptions?.model ?? this._options.defaultModel,\n sandboxMode: this._threadOptions?.sandboxMode,\n approvalMode: this._threadOptions?.approvalMode,\n workspaceWriteOptions: this._threadOptions?.workspaceWriteOptions,\n reasoningEffort: this._threadOptions?.reasoningEffort,\n reasoningSummary: this._threadOptions?.reasoningSummary,\n workingDirectory: this._threadOptions?.workingDirectory,\n skipGitRepoCheck,\n modelProvider: this._options.modelProvider,\n });\n // No return value needed; compaction modifies server-side history.\n if (!Array.isArray(events)) {\n throw new Error(\"Compact did not return event list\");\n }\n }\n\n /**\n * Fork this thread at the specified user message, returning a new thread that starts\n * from the conversation history prior to that message.\n *\n * @param options Fork configuration including which user message to branch before and optional thread overrides.\n */\n async fork(options: ForkOptions): Promise<Thread> {\n if (!this._id) {\n throw new Error(\"Cannot fork: no active thread\");\n }\n const nthUserMessage = options?.nthUserMessage;\n if (\n typeof nthUserMessage !== \"number\" ||\n !Number.isInteger(nthUserMessage) ||\n nthUserMessage < 0\n ) {\n throw new Error(\"nthUserMessage must be a non-negative integer\");\n }\n\n const overrides = options.threadOptions ?? {};\n const nextThreadOptions: ThreadOptions = {\n ...this._threadOptions,\n ...overrides,\n };\n\n const skipGitRepoCheck =\n nextThreadOptions.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n nextThreadOptions.skipGitRepoCheck = skipGitRepoCheck;\n\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(nextThreadOptions.workingDirectory);\n }\n\n const forkArgs: CodexForkArgs = {\n threadId: this._id,\n nthUserMessage,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n model: nextThreadOptions.model ?? this._options.defaultModel,\n oss: nextThreadOptions.oss,\n sandboxMode: nextThreadOptions.sandboxMode,\n approvalMode: nextThreadOptions.approvalMode,\n workspaceWriteOptions: nextThreadOptions.workspaceWriteOptions,\n workingDirectory: nextThreadOptions.workingDirectory,\n skipGitRepoCheck,\n fullAuto: nextThreadOptions.fullAuto,\n modelProvider: this._options.modelProvider,\n };\n\n const result = await this._exec.fork(forkArgs);\n\n const skillsContext = this._codexSkills\n ? {\n codexSkills: this._codexSkills,\n codexSkillMentionTriggers: this._skillMentionTriggers,\n }\n : undefined;\n\n return new Thread(\n this._exec,\n this._options,\n nextThreadOptions,\n result.threadId,\n skillsContext,\n );\n }\n /* @internal */\n constructor(\n exec: CodexExec,\n options: CodexOptions,\n threadOptions: ThreadOptions,\n id: string | null = null,\n skillsContext?: {\n codexSkills: SkillRegistry;\n codexSkillMentionTriggers: SkillMentionTrigger[];\n },\n ) {\n this._exec = exec;\n this._options = options;\n this._id = id;\n this._threadOptions = threadOptions;\n this._codexSkills = skillsContext?.codexSkills;\n this._skillMentionTriggers = normalizeSkillMentionTriggers(\n threadOptions.skillMentionTriggers ?? skillsContext?.codexSkillMentionTriggers,\n );\n this.registerSkillsFromConfig(threadOptions.skills);\n }\n\n /** Provides the input to the agent and streams events as they are produced during the turn. */\n async runStreamed(input: Input, turnOptions: TurnOptions = {}): Promise<StreamedTurn> {\n return { events: this.runStreamedInternal(input, turnOptions, false) };\n }\n\n private async *runStreamedInternal(\n input: Input,\n turnOptions: TurnOptions = {},\n emitRawEvents: boolean = true,\n ): AsyncGenerator<ThreadEvent> {\n const normalizedSchema = normalizeOutputSchema(turnOptions.outputSchema);\n const needsSchemaFile = this._exec.requiresOutputSchemaFile();\n const schemaFile = needsSchemaFile\n ? await createOutputSchemaFile(normalizedSchema)\n : { schemaPath: undefined, cleanup: async () => {} };\n const options = this._threadOptions;\n const { prompt, images } = normalizeInput(input);\n const inputItems = this.buildNativeInputItems(prompt, images);\n const skipGitRepoCheck =\n options?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(options?.workingDirectory);\n }\n const generator = this._exec.run({\n input: prompt,\n baseUrl: this._options.baseUrl,\n apiKey: this._options.apiKey,\n threadId: this._id,\n images: inputItems ? undefined : images,\n inputItems,\n model: options?.model,\n reasoningEffort: options?.reasoningEffort,\n reasoningSummary: options?.reasoningSummary,\n modelProvider: turnOptions?.modelProvider ?? options?.modelProvider ?? this._options.modelProvider,\n oss: turnOptions?.oss ?? options?.oss,\n sandboxMode: options?.sandboxMode,\n approvalMode: options?.approvalMode,\n workspaceWriteOptions: options?.workspaceWriteOptions,\n workingDirectory: options?.workingDirectory,\n skipGitRepoCheck,\n outputSchemaFile: schemaFile.schemaPath,\n outputSchema: normalizedSchema,\n fullAuto: options?.fullAuto,\n });\n try {\n for await (const item of generator) {\n let parsed: any;\n try {\n parsed = JSON.parse(item);\n } catch (error) {\n throw new Error(`Failed to parse item: ${item}. Parse error: ${error}`);\n }\n\n // Skip null events (used for Raw events that should not be emitted)\n if (parsed === null) {\n continue;\n }\n\n // Conditionally forward the raw event payload\n if (emitRawEvents) {\n // Forward raw\n yield { type: \"raw_event\", raw: parsed } as ThreadEvent;\n }\n // Convert and forward mapped\n const threadEvent = convertRustEventToThreadEvent(parsed);\n if (threadEvent.type === \"thread.started\") {\n this._id = threadEvent.thread_id;\n }\n\n // Notify event listeners\n for (const listener of this._eventListeners) {\n try {\n listener(threadEvent);\n } catch (error) {\n // Don't let listener errors break the stream\n console.warn(\"Thread event listener threw error:\", error);\n }\n }\n\n yield threadEvent;\n }\n } finally {\n await schemaFile.cleanup();\n }\n }\n\n /** Provides the input to the agent and returns the completed turn. */\n async run(input: Input, turnOptions: TurnOptions = {}): Promise<Turn> {\n const generator = this.runStreamedInternal(input, turnOptions, true);\n const items: ThreadItem[] = [];\n let finalResponse: string = \"\";\n let usage: Usage | null = null;\n let turnFailure: ThreadError | null = null;\n for await (const event of generator) {\n if (event.type === \"item.completed\") {\n if (event.item.type === \"agent_message\") {\n finalResponse = event.item.text;\n }\n items.push(event.item);\n } else if (event.type === \"turn.completed\") {\n usage = event.usage;\n } else if (event.type === \"turn.failed\") {\n turnFailure = event.error;\n break;\n }\n }\n if (turnFailure) {\n throw new Error(turnFailure.message);\n }\n return { items, finalResponse, usage };\n }\n\n private buildTuiRequest(overrides: Partial<NativeTuiRequest> = {}): NativeTuiRequest {\n const skipGitRepoCheck =\n this._threadOptions?.skipGitRepoCheck ??\n (typeof process !== \"undefined\" &&\n process.env &&\n process.env.CODEX_TEST_SKIP_GIT_REPO_CHECK === \"1\");\n if (!skipGitRepoCheck) {\n assertTrustedDirectory(this._threadOptions?.workingDirectory);\n }\n\n const request: NativeTuiRequest = { ...overrides };\n const assignIfUndefined = <K extends keyof NativeTuiRequest>(\n key: K,\n value: NativeTuiRequest[K] | undefined,\n ) => {\n if (request[key] === undefined && value !== undefined) {\n request[key] = value;\n }\n };\n\n assignIfUndefined(\"model\", this._threadOptions?.model ?? this._options.defaultModel);\n assignIfUndefined(\"modelProvider\", this._threadOptions?.modelProvider ?? this._options.modelProvider);\n assignIfUndefined(\"oss\", this._threadOptions?.oss);\n assignIfUndefined(\"sandboxMode\", this._threadOptions?.sandboxMode);\n assignIfUndefined(\"approvalMode\", this._threadOptions?.approvalMode);\n assignIfUndefined(\"fullAuto\", this._threadOptions?.fullAuto);\n assignIfUndefined(\"workingDirectory\", this._threadOptions?.workingDirectory);\n assignIfUndefined(\"baseUrl\", this._options.baseUrl);\n assignIfUndefined(\"apiKey\", this._options.apiKey);\n\n if (\n request.resumeSessionId === undefined &&\n request.resumePicker !== true &&\n request.resumeLast !== true &&\n this._id\n ) {\n request.resumeSessionId = this._id;\n }\n\n return request;\n }\n\n /**\n * Launches the interactive Codex TUI (Terminal User Interface) for this thread and returns a session handle.\n *\n * The handle allows advanced workflows where the TUI can be started and stopped programmatically,\n * while preserving the underlying conversation state.\n */\n launchTui(overrides: Partial<NativeTuiRequest> = {}): TuiSession {\n const request = this.buildTuiRequest(overrides);\n const detachLsp = this.attachDefaultLspBridge(request);\n const session = startTui(request);\n return this.wrapTuiSession(session, detachLsp);\n }\n\n /**\n * Launches the interactive Codex TUI (Terminal User Interface) for this thread.\n *\n * This method enables seamless transition from programmatic agent interaction to\n * interactive terminal chat within the same session. The TUI takes over the terminal\n * and allows you to continue the conversation interactively.\n *\n * @param overrides - Optional configuration to override thread defaults. Supports all TUI options\n * including prompt, sandbox mode, approval mode, and resume options.\n * @param options - Optional run options including an AbortSignal to request shutdown.\n * @returns A Promise that resolves to TUI exit information including:\n * - tokenUsage: Token consumption statistics\n * - conversationId: Session ID for resuming later\n * - updateAction: Optional suggested update command\n * @throws {Error} If not in a trusted git repository (unless skipGitRepoCheck is set)\n * @throws {Error} If the terminal is not interactive (TTY required)\n */\n async tui(\n overrides: Partial<NativeTuiRequest> = {},\n options: RunTuiOptions = {},\n ): Promise<NativeTuiExitInfo> {\n const request = this.buildTuiRequest(overrides);\n const detachLsp = this.attachDefaultLspBridge(request);\n try {\n return await runTui(request, options);\n } finally {\n detachLsp();\n }\n }\n\n private wrapTuiSession(session: TuiSession, cleanup: () => void): TuiSession {\n let released = false;\n const release = () => {\n if (released) {\n return;\n }\n released = true;\n cleanup();\n };\n return {\n wait: async () => {\n try {\n return await session.wait();\n } finally {\n release();\n }\n },\n shutdown: () => {\n release();\n session.shutdown();\n },\n get closed() {\n return session.closed;\n },\n };\n }\n\n private attachDefaultLspBridge(request: NativeTuiRequest): () => void {\n const workingDirectory =\n request.workingDirectory ??\n this._threadOptions?.workingDirectory ??\n (typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : \".\");\n return attachLspDiagnostics(this, {\n workingDirectory,\n waitForDiagnostics: true,\n });\n }\n\n private registerSkillsFromConfig(config: ThreadOptions[\"skills\"]): void {\n if (!config) {\n return;\n }\n if (Array.isArray(config)) {\n for (const skill of config) {\n const normalized = normalizeSkillDefinition(skill);\n this._skills.set(normalized.name, normalized);\n }\n return;\n }\n if (typeof config !== \"object\") {\n throw new Error(\"ThreadOptions.skills must be an array or object when provided\");\n }\n for (const [name, value] of Object.entries(config)) {\n if (typeof value === \"string\") {\n const normalized = normalizeSkillDefinition({ name, contents: value });\n this._skills.set(normalized.name, normalized);\n continue;\n }\n if (!value || typeof value !== \"object\") {\n throw new Error(`Invalid skill entry for ${name}`);\n }\n const normalized = normalizeSkillDefinition({ name, ...value });\n this._skills.set(normalized.name, normalized);\n }\n }\n\n private buildNativeInputItems(\n prompt: string,\n images: string[],\n ): NativeUserInputItem[] | undefined {\n if (!prompt) {\n return undefined;\n }\n\n const triggers = this._skillMentionTriggers;\n const fromThread = findSkillMentions(prompt, this._skills, triggers);\n const fromCodex = this._codexSkills\n ? findSkillMentions(prompt, this._codexSkills, triggers)\n : [];\n\n const seen = new Set<string>();\n const mentioned: SkillDefinition[] = [];\n for (const skill of [...fromThread, ...fromCodex]) {\n if (seen.has(skill.name)) {\n continue;\n }\n seen.add(skill.name);\n mentioned.push(skill);\n }\n\n if (mentioned.length === 0) {\n return undefined;\n }\n\n const items: NativeUserInputItem[] = [{ type: \"text\", text: prompt }];\n for (const path of images) {\n items.push({ type: \"local_image\", path });\n }\n\n for (const skill of mentioned) {\n items.push({\n type: \"skill_inline\",\n name: skill.name,\n contents: skill.contents,\n });\n }\n\n return items;\n }\n}\n\nfunction normalizeSkillMentionTriggers(\n triggers: SkillMentionTrigger[] | undefined,\n): SkillMentionTrigger[] {\n const filtered = (triggers ?? []).filter(\n (value): value is SkillMentionTrigger => value === \"$\" || value === \"@\",\n );\n return filtered.length > 0 ? filtered : [\"$\"];\n}\n\nfunction normalizeInput(input: Input): { prompt: string; images: string[] } {\n if (typeof input === \"string\") {\n return { prompt: input, images: [] };\n }\n const promptParts: string[] = [];\n const images: string[] = [];\n for (const item of input) {\n if (item.type === \"text\") {\n promptParts.push(item.text);\n } else if (item.type === \"local_image\") {\n images.push(item.path);\n }\n }\n return { prompt: promptParts.join(\"\\n\\n\"), images };\n}\n","import { promises as fs } from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nexport type OutputSchemaFile = {\n schemaPath?: string;\n cleanup: () => Promise<void>;\n};\n\nexport function normalizeOutputSchema(schema: unknown): Record<string, unknown> | undefined {\n if (schema === undefined) {\n return undefined;\n }\n\n // OpenAI Responses-style wrapper:\n // { type: \"json_schema\", json_schema: { name, schema, strict } }\n if (\n isJsonObject(schema) &&\n (schema.type === \"json_schema\" || schema.type === \"json-schema\") &&\n isJsonObject(schema.json_schema) &&\n isJsonObject(schema.json_schema.schema)\n ) {\n const strict =\n typeof schema.json_schema.strict === \"boolean\" ? schema.json_schema.strict : true;\n return normalizeJsonSchemaObject(schema.json_schema.schema, strict);\n }\n\n // Lenient wrapper we also accept:\n // { schema, strict?, name? }\n if (isJsonObject(schema) && isJsonObject(schema.schema)) {\n const strict = typeof schema.strict === \"boolean\" ? schema.strict : true;\n return normalizeJsonSchemaObject(schema.schema, strict);\n }\n\n // Back-compat: plain JSON schema object\n if (!isJsonObject(schema)) {\n throw new Error(\n \"outputSchema must be a plain JSON object or an OpenAI-style json_schema wrapper\",\n );\n }\n\n return normalizeJsonSchemaObject(schema, true);\n}\n\nexport async function createOutputSchemaFile(schema: unknown): Promise<OutputSchemaFile> {\n const normalizedSchema = normalizeOutputSchema(schema);\n if (!normalizedSchema) {\n return { cleanup: async () => {} };\n }\n\n const schemaDir = await fs.mkdtemp(path.join(os.tmpdir(), \"codex-output-schema-\"));\n const schemaPath = path.join(schemaDir, \"schema.json\");\n const cleanup = async () => {\n try {\n await fs.rm(schemaDir, { recursive: true, force: true });\n } catch {\n // suppress\n }\n };\n\n try {\n await fs.writeFile(schemaPath, JSON.stringify(normalizedSchema), \"utf8\");\n return { schemaPath, cleanup };\n } catch (error) {\n await cleanup();\n throw error;\n }\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction normalizeJsonSchemaObject(\n schema: Record<string, unknown>,\n strict: boolean,\n): Record<string, unknown> {\n const record = { ...schema } as Record<string, unknown> & {\n additionalProperties?: unknown;\n };\n const hasExplicitAdditional =\n typeof record.additionalProperties === \"boolean\" ||\n typeof record.additionalProperties === \"object\";\n // If strict=true, default additionalProperties to false unless explicitly provided.\n // If strict=false, preserve as-is and do not force false.\n const additionalProperties =\n hasExplicitAdditional ? record.additionalProperties : strict ? false : record.additionalProperties;\n\n return {\n ...record,\n ...(hasExplicitAdditional || strict ? { additionalProperties } : {}),\n };\n}\n","import { getNativeBinding } from \"./nativeBinding\";\nimport type {\n NativeBinding,\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n NativeTuiSession,\n} from \"./nativeBinding\";\n\nexport interface TuiSession {\n wait(): Promise<NativeTuiExitInfo>;\n shutdown(): void;\n readonly closed: boolean;\n}\n\nexport interface RunTuiOptions {\n signal?: AbortSignal;\n}\n\n/**\n * Starts the Codex TUI (Terminal User Interface) and returns a controllable session handle.\n *\n * Use {@link TuiSession.wait} to await completion or {@link TuiSession.shutdown} to\n * request a graceful exit from another part of your program.\n */\nexport function startTui(request: NativeTuiRequest): TuiSession {\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native binding is not available\");\n }\n\n if (typeof binding.startTui === \"function\") {\n const nativeSession = binding.startTui(request);\n return wrapNativeSession(nativeSession);\n }\n\n if (typeof binding.runTui === \"function\") {\n return createLegacySession(binding, request);\n }\n\n throw new Error(\"Native binding does not expose startTui or runTui\");\n}\n\n/**\n * Launches the Codex TUI and waits for it to exit. Supports optional cancellation via AbortSignal.\n */\nexport async function runTui(\n request: NativeTuiRequest,\n options: RunTuiOptions = {},\n): Promise<NativeTuiExitInfo> {\n const session = startTui(request);\n const { signal } = options;\n let abortListener: (() => void) | undefined;\n\n try {\n if (signal) {\n if (signal.aborted) {\n session.shutdown();\n } else {\n abortListener = () => session.shutdown();\n signal.addEventListener(\"abort\", abortListener, { once: true });\n }\n }\n return await session.wait();\n } finally {\n if (abortListener && signal) {\n signal.removeEventListener(\"abort\", abortListener);\n }\n }\n}\n\nfunction wrapNativeSession(nativeSession: NativeTuiSession): TuiSession {\n return {\n wait: () => nativeSession.wait(),\n shutdown: () => nativeSession.shutdown(),\n get closed() {\n return nativeSession.closed;\n },\n };\n}\n\nfunction createLegacySession(binding: NativeBinding, request: NativeTuiRequest): TuiSession {\n if (typeof binding.runTui !== \"function\") {\n throw new Error(\"Native binding does not expose runTui\");\n }\n\n let closed = false;\n const promise = binding.runTui(request).then(\n (result) => {\n closed = true;\n return result;\n },\n (error) => {\n closed = true;\n throw error;\n },\n );\n\n return {\n wait: () => promise,\n shutdown() {\n throw new Error(\n \"Programmatic shutdown is not supported by this native binding build. Rebuild the SDK to enable startTui().\",\n );\n },\n get closed() {\n return closed;\n },\n };\n}\n\nexport type {\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n};\n\n","export type SkillDefinition = {\n /**\n * Skill name referenced via `$<name>` (default) or `@<name>` in prompts.\n */\n name: string;\n /**\n * Optional human description (not currently injected automatically).\n */\n description?: string;\n /**\n * The skill body/instructions that will be injected when referenced.\n */\n contents: string;\n};\n\nexport type SkillRegistry = Map<string, SkillDefinition>;\n\nexport type SkillMentionTrigger = \"$\" | \"@\";\n\nfunction normalizeOneLine(value: string): string {\n return value.replace(/\\s+/g, \" \").trim();\n}\n\nexport function validateSkillDefinition(skill: SkillDefinition): void {\n if (!skill || typeof skill !== \"object\") {\n throw new Error(\"Skill must be an object\");\n }\n\n if (typeof skill.name !== \"string\") {\n throw new Error(\"Skill.name must be a string\");\n }\n const name = normalizeOneLine(skill.name);\n if (name.length === 0) {\n throw new Error(\"Skill.name must be non-empty\");\n }\n if (name.length > 100) {\n throw new Error(\"Skill.name must be <= 100 characters\");\n }\n\n if (skill.description !== undefined) {\n if (typeof skill.description !== \"string\") {\n throw new Error(\"Skill.description must be a string when provided\");\n }\n const description = normalizeOneLine(skill.description);\n if (description.length > 500) {\n throw new Error(\"Skill.description must be <= 500 characters\");\n }\n }\n\n if (typeof skill.contents !== \"string\") {\n throw new Error(\"Skill.contents must be a string\");\n }\n if (skill.contents.length === 0) {\n throw new Error(\"Skill.contents must be non-empty\");\n }\n}\n\nexport function normalizeSkillDefinition(skill: SkillDefinition): SkillDefinition {\n validateSkillDefinition(skill);\n return {\n name: normalizeOneLine(skill.name),\n description: skill.description === undefined ? undefined : normalizeOneLine(skill.description),\n contents: skill.contents,\n };\n}\n\nexport function findSkillMentions(\n text: string,\n registry: SkillRegistry,\n triggers: ReadonlyArray<SkillMentionTrigger>,\n): SkillDefinition[] {\n if (!text || triggers.length === 0 || registry.size === 0) {\n return [];\n }\n\n const seen = new Set<string>();\n const matches: SkillDefinition[] = [];\n\n for (const skill of registry.values()) {\n if (seen.has(skill.name)) {\n continue;\n }\n\n for (const trigger of triggers) {\n const needle = `${trigger}${skill.name}`;\n if (text.includes(needle)) {\n seen.add(skill.name);\n matches.push(skill);\n break;\n }\n }\n }\n\n return matches;\n}\n","import { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\n\nexport type CurrentChangesReview = {\n type: \"current_changes\";\n};\n\nexport type BranchReview = {\n type: \"branch\";\n baseBranch: string;\n};\n\nexport type CommitReview = {\n type: \"commit\";\n sha: string;\n subject?: string;\n};\n\nexport type CustomReview = {\n type: \"custom\";\n prompt: string;\n hint?: string;\n};\n\nexport type ReviewTarget =\n | CurrentChangesReview\n | BranchReview\n | CommitReview\n | CustomReview;\n\nexport type ReviewInvocationOptions = {\n target: ReviewTarget;\n threadOptions?: ThreadOptions;\n turnOptions?: TurnOptions;\n};\n\nexport type ReviewPrompt = {\n prompt: string;\n hint: string;\n};\n\nexport function buildReviewPrompt(target: ReviewTarget): ReviewPrompt {\n switch (target.type) {\n case \"current_changes\":\n return {\n prompt:\n \"Review the current code changes (staged, unstaged, and untracked files) and provide prioritized findings.\",\n hint: \"current changes\",\n };\n case \"branch\": {\n const branch = target.baseBranch;\n const prompt = `Review the code changes against the base branch '${branch}'. Start by finding the merge diff between the current branch and ${branch}'s upstream e.g. (\\`git merge-base HEAD \"$(git rev-parse --abbrev-ref \"${branch}@{upstream}\")\"\\`), then run \\`git diff\\` against that SHA to see what changes we would merge into the ${branch} branch. Provide prioritized, actionable findings.`;\n return {\n prompt,\n hint: `changes against '${branch}'`,\n };\n }\n case \"commit\": {\n const shortSha = target.sha.slice(0, 7);\n const subject = target.subject ?? target.sha;\n return {\n prompt: `Review the code changes introduced by commit ${target.sha} (\"${subject}\"). Provide prioritized, actionable findings.`,\n hint: `commit ${shortSha}`,\n };\n }\n case \"custom\": {\n const hint = target.hint ?? \"custom review\";\n return {\n prompt: target.prompt,\n hint,\n };\n }\n default: {\n const exhaustive: never = target;\n throw new Error(`Unsupported review target: ${String(exhaustive)}`);\n }\n }\n}\n","import { CodexOptions, NativeToolDefinition } from \"./codexOptions\";\nimport { CodexExec } from \"./exec\";\nimport {\n NativeBinding,\n getNativeBinding,\n NativeToolInvocation,\n NativeToolResult,\n NativeToolInterceptorNativeContext,\n ApprovalRequest,\n NativeToolInfo,\n} from \"./nativeBinding\";\nimport type {\n NativeConversationConfig,\n NativeConversationListPage,\n NativeConversationSummary,\n} from \"./nativeBinding\";\nimport type { StreamedTurn, Turn } from \"./thread\";\nimport { Thread } from \"./thread\";\nimport { ThreadOptions } from \"./threadOptions\";\nimport { TurnOptions } from \"./turnOptions\";\nimport { ThreadEvent, ThreadError, Usage } from \"./events\";\nimport { ThreadItem } from \"./items\";\nimport { createOutputSchemaFile, normalizeOutputSchema } from \"./outputSchemaFile\";\nimport { buildReviewPrompt, type ReviewInvocationOptions } from \"./reviewOptions\";\nimport { LspManager } from \"./lsp/manager\";\nimport type { LspManagerOptions } from \"./lsp/types\";\nimport { formatDiagnosticsForTool } from \"./lsp/format\";\nimport type { SkillDefinition, SkillMentionTrigger, SkillRegistry } from \"./skills\";\nimport { normalizeSkillDefinition } from \"./skills\";\n\nexport type NativeToolInterceptorContext = {\n invocation: NativeToolInvocation;\n callBuiltin: (invocation?: NativeToolInvocation) => Promise<NativeToolResult>;\n};\n\nexport type ConversationSummary = NativeConversationSummary;\n\nexport type ConversationListPage = NativeConversationListPage;\n\nexport type ConversationListOptions = ThreadOptions & {\n pageSize?: number;\n cursor?: string;\n modelProviders?: string[];\n};\n\nexport type { ApprovalRequest } from \"./nativeBinding\";\n\n/**\n * Codex is the main class for interacting with the Codex agent.\n *\n * This is the native NAPI-based implementation that uses Rust bindings directly.\n *\n * Use the `startThread()` method to start a new thread or `resumeThread()` to resume a previously started thread.\n */\nexport class Codex {\n private exec: CodexExec;\n private options: CodexOptions;\n private readonly nativeBinding: NativeBinding | null;\n private readonly lspForTools: LspManager | null;\n private readonly skills: SkillRegistry = new Map();\n private readonly skillMentionTriggers: SkillMentionTrigger[];\n\n constructor(options: CodexOptions = {}) {\n const predefinedTools = options.tools ? [...options.tools] : [];\n const preserveRegisteredTools = options.preserveRegisteredTools === true;\n this.nativeBinding = getNativeBinding();\n this.options = { ...options, tools: [] };\n if (this.nativeBinding) {\n // clearRegisteredTools may not be available in all builds\n if (!preserveRegisteredTools && typeof this.nativeBinding.clearRegisteredTools === \"function\") {\n this.nativeBinding.clearRegisteredTools();\n }\n for (const tool of predefinedTools) {\n this.registerTool(tool);\n }\n }\n this.lspForTools = this.createLspManagerForTools();\n if (this.lspForTools && this.nativeBinding) {\n this.registerDefaultReadFileInterceptor();\n }\n this.skillMentionTriggers = normalizeSkillMentionTriggers(options.skillMentionTriggers);\n this.registerSkillsFromConfig(options.skills);\n this.exec = new CodexExec();\n }\n\n registerSkill(skill: SkillDefinition): void {\n const normalized = normalizeSkillDefinition(skill);\n this.skills.set(normalized.name, normalized);\n }\n\n registerSkills(skills: SkillDefinition[]): void {\n for (const skill of skills) {\n this.registerSkill(skill);\n }\n }\n\n listSkills(): SkillDefinition[] {\n return [...this.skills.values()];\n }\n\n clearSkills(): void {\n this.skills.clear();\n }\n\n /**\n * Inspect currently registered native tools (for debugging/testing).\n */\n listRegisteredTools(): NativeToolInfo[] {\n if (!this.nativeBinding || typeof this.nativeBinding.listRegisteredTools !== \"function\") {\n return [];\n }\n return this.nativeBinding.listRegisteredTools();\n }\n\n private registerSkillsFromConfig(config: CodexOptions[\"skills\"]): void {\n if (!config) {\n return;\n }\n if (Array.isArray(config)) {\n this.registerSkills(config);\n return;\n }\n if (typeof config !== \"object\") {\n throw new Error(\"skills must be an array or object when provided\");\n }\n for (const [name, value] of Object.entries(config)) {\n if (typeof value === \"string\") {\n this.registerSkill({ name, contents: value });\n continue;\n }\n if (!value || typeof value !== \"object\") {\n throw new Error(`Invalid skill entry for ${name}`);\n }\n this.registerSkill({ name, ...value });\n }\n }\n\n /**\n * Register a tool for Codex. When `tool.name` matches a built-in Codex tool,\n * the native implementation is replaced for this Codex instance.\n */\n registerTool(tool: NativeToolDefinition): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool registration requires the NAPI binding\");\n }\n // registerTool may not be available in all builds\n if (typeof this.nativeBinding.registerTool !== \"function\") {\n console.warn(\"registerTool is not available in this build - tools feature may be incomplete\");\n return;\n }\n const { handler, ...info } = tool;\n this.nativeBinding.registerTool(info, handler);\n if (!this.options.tools) {\n this.options.tools = [];\n }\n this.options.tools.push(tool);\n }\n\n /**\n * Register a tool interceptor for Codex. Interceptors can modify tool invocations\n * and results, and can call the built-in implementation.\n */\n registerToolInterceptor(\n toolName: string,\n handler: (context: NativeToolInterceptorContext) => Promise<NativeToolResult> | NativeToolResult,\n ): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool interceptor registration requires the NAPI binding\");\n }\n // registerToolInterceptor may not be available in all builds\n if (\n typeof this.nativeBinding.registerToolInterceptor !== \"function\" ||\n typeof this.nativeBinding.callToolBuiltin !== \"function\"\n ) {\n console.warn(\"registerToolInterceptor is not available in this build - interceptor feature may be incomplete\");\n return;\n }\n this.nativeBinding.registerToolInterceptor(toolName, async (...args: unknown[]) => {\n const context = (args.length === 1 ? args[0] : args[1]) as\n | NativeToolInterceptorNativeContext\n | null\n | undefined;\n if (!context || typeof context !== \"object\") {\n throw new Error(\"Native interceptor callback did not receive a context object\");\n }\n const { invocation, token } = context;\n const callBuiltin = (override?: NativeToolInvocation) =>\n this.nativeBinding!.callToolBuiltin(token, override ?? invocation);\n return handler({ invocation, callBuiltin });\n });\n }\n\n /**\n * Clear all registered tools, restoring built-in defaults.\n */\n clearTools(): void {\n if (!this.nativeBinding) {\n throw new Error(\"Native tool management requires the NAPI binding\");\n }\n if (typeof this.nativeBinding.clearRegisteredTools === \"function\") {\n this.nativeBinding.clearRegisteredTools();\n }\n if (this.options.tools) {\n this.options.tools = [];\n }\n }\n\n private buildConversationConfig(options: ThreadOptions = {}): NativeConversationConfig {\n return {\n model: options.model ?? this.options.defaultModel,\n modelProvider: options.modelProvider ?? this.options.modelProvider,\n oss: options.oss,\n sandboxMode: options.sandboxMode,\n approvalMode: options.approvalMode,\n workspaceWriteOptions: options.workspaceWriteOptions,\n workingDirectory: options.workingDirectory,\n skipGitRepoCheck: options.skipGitRepoCheck,\n reasoningEffort: options.reasoningEffort,\n reasoningSummary: options.reasoningSummary,\n fullAuto: options.fullAuto,\n baseUrl: this.options.baseUrl,\n apiKey: this.options.apiKey,\n };\n }\n\n private createLspManagerForTools(): LspManager | null {\n const cwd =\n typeof process !== \"undefined\" && typeof process.cwd === \"function\"\n ? process.cwd()\n : \".\";\n const options: LspManagerOptions = {\n workingDirectory: cwd,\n waitForDiagnostics: true,\n };\n try {\n return new LspManager(options);\n } catch {\n return null;\n }\n }\n\n private registerDefaultReadFileInterceptor(): void {\n if (!this.lspForTools) {\n return;\n }\n try {\n this.registerToolInterceptor(\"read_file\", async ({ invocation, callBuiltin }) => {\n let base: NativeToolResult;\n try {\n base = await callBuiltin();\n } catch (err) {\n // If the native binding no longer has a pending builtin (e.g., token mismatch),\n // fall back to the raw invocation result instead of failing the turn.\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n output: undefined,\n };\n }\n if (!base.output || base.success === false) {\n return base;\n }\n\n let filePath: string | undefined;\n if (invocation.arguments) {\n try {\n const args = JSON.parse(invocation.arguments) as {\n file_path?: unknown;\n path?: unknown;\n };\n const candidate =\n (typeof args.file_path === \"string\" && args.file_path) ||\n (typeof args.path === \"string\" && args.path) ||\n undefined;\n if (candidate && candidate.trim().length > 0) {\n filePath = candidate;\n }\n } catch {\n // ignore malformed args\n }\n }\n if (!filePath) {\n return base;\n }\n\n let diagnosticsText = \"\";\n try {\n const results = await this.lspForTools!.collectDiagnostics([filePath]);\n if (!results.length) {\n return base;\n }\n diagnosticsText = formatDiagnosticsForTool(results);\n } catch {\n return base;\n }\n\n if (!diagnosticsText) {\n return base;\n }\n\n const header = `LSP diagnostics for ${filePath}:\\n${diagnosticsText}`;\n return prependSystemHintToToolResult(base, header);\n });\n } catch {\n // Interceptor support may be unavailable; fail silently.\n }\n }\n\n /**\n * Register a programmatic approval callback that Codex will call before executing\n * sensitive operations (e.g., shell commands, file writes).\n */\n setApprovalCallback(\n handler: (request: ApprovalRequest) => boolean | Promise<boolean>,\n ): void {\n if (!this.nativeBinding || typeof this.nativeBinding.registerApprovalCallback !== \"function\") {\n console.warn(\"Approval callback is not available in this build\");\n return;\n }\n this.nativeBinding.registerApprovalCallback(handler);\n }\n\n /**\n * Starts a new conversation with an agent.\n * @returns A new thread instance.\n */\n startThread(options: ThreadOptions = {}): Thread {\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, null, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n /**\n * Resumes a conversation with an agent based on the thread id.\n * Threads are persisted in ~/.codex/sessions.\n *\n * @param id The id of the thread to resume.\n * @returns A new thread instance.\n */\n resumeThread(id: string, options: ThreadOptions = {}): Thread {\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, id, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n async listConversations(options: ConversationListOptions = {}): Promise<ConversationListPage> {\n const request = {\n config: this.buildConversationConfig(options),\n pageSize: options.pageSize,\n cursor: options.cursor,\n modelProviders: options.modelProviders,\n };\n return this.exec.listConversations(request);\n }\n\n async deleteConversation(id: string, options: ThreadOptions = {}): Promise<boolean> {\n const result = await this.exec.deleteConversation({\n id,\n config: this.buildConversationConfig(options),\n });\n return result.deleted;\n }\n\n async resumeConversationFromRollout(\n rolloutPath: string,\n options: ThreadOptions = {},\n ): Promise<Thread> {\n const result = await this.exec.resumeConversationFromRollout({\n rolloutPath,\n config: this.buildConversationConfig(options),\n });\n const threadOptions: ThreadOptions = {\n ...options,\n model: options.model ?? this.options.defaultModel,\n };\n return new Thread(this.exec, this.options, threadOptions, result.threadId, {\n codexSkills: this.skills,\n codexSkillMentionTriggers: this.skillMentionTriggers,\n });\n }\n\n /**\n * Starts a review task using the built-in Codex review flow.\n */\n async review(options: ReviewInvocationOptions): Promise<Turn> {\n const generator = this.reviewStreamedInternal(options);\n const items: ThreadItem[] = [];\n let finalResponse = \"\";\n let usage: Usage | null = null;\n let turnFailure: ThreadError | null = null;\n for await (const event of generator) {\n if (event === null) continue;\n if (event.type === \"item.completed\") {\n if (event.item.type === \"agent_message\") {\n finalResponse = event.item.text;\n }\n items.push(event.item);\n } else if (event.type === \"exited_review_mode\") {\n // Capture the structured review output\n if (event.review_output) {\n const reviewOutput = event.review_output;\n let reviewText = \"\";\n\n // Add overall explanation\n if (reviewOutput.overall_explanation) {\n reviewText += reviewOutput.overall_explanation;\n }\n\n // Add findings if present\n if (reviewOutput.findings && reviewOutput.findings.length > 0) {\n if (reviewText) reviewText += \"\\n\\n\";\n reviewText += \"## Review Findings\\n\\n\";\n reviewOutput.findings.forEach((finding, index) => {\n reviewText += `### ${index + 1}. ${finding.title}\\n`;\n reviewText += `${finding.body}\\n`;\n reviewText += `**Priority:** ${finding.priority} | **Confidence:** ${finding.confidence_score}\\n`;\n reviewText += `**Location:** ${finding.code_location.absolute_file_path}:${finding.code_location.line_range.start}-${finding.code_location.line_range.end}\\n\\n`;\n });\n }\n\n finalResponse = reviewText;\n }\n } else if (event.type === \"turn.completed\") {\n usage = event.usage;\n } else if (event.type === \"turn.failed\") {\n turnFailure = event.error;\n break;\n }\n }\n if (turnFailure) {\n throw new Error(turnFailure.message);\n }\n return { items, finalResponse, usage };\n }\n\n /**\n * Starts a review task and returns the event stream.\n */\n async reviewStreamed(options: ReviewInvocationOptions): Promise<StreamedTurn> {\n return { events: this.reviewStreamedInternal(options) };\n }\n\n private async *reviewStreamedInternal(\n options: ReviewInvocationOptions,\n ): AsyncGenerator<ThreadEvent> {\n const { target, threadOptions = {}, turnOptions = {} } = options;\n const { prompt, hint } = buildReviewPrompt(target);\n const normalizedSchema = normalizeOutputSchema(turnOptions.outputSchema);\n const needsSchemaFile = this.exec.requiresOutputSchemaFile();\n const schemaFile = needsSchemaFile\n ? await createOutputSchemaFile(normalizedSchema)\n : { schemaPath: undefined, cleanup: async () => {} };\n const generator = this.exec.run({\n input: prompt,\n baseUrl: this.options.baseUrl,\n apiKey: this.options.apiKey,\n model: threadOptions.model,\n modelProvider: threadOptions.modelProvider ?? this.options.modelProvider,\n oss: threadOptions.oss,\n sandboxMode: threadOptions.sandboxMode,\n approvalMode: threadOptions.approvalMode,\n workspaceWriteOptions: threadOptions.workspaceWriteOptions,\n workingDirectory: threadOptions.workingDirectory,\n skipGitRepoCheck: threadOptions.skipGitRepoCheck,\n outputSchemaFile: schemaFile.schemaPath,\n outputSchema: normalizedSchema,\n fullAuto: threadOptions.fullAuto,\n review: {\n userFacingHint: hint,\n },\n });\n try {\n for await (const item of generator) {\n let parsed: ThreadEvent;\n try {\n parsed = JSON.parse(item) as ThreadEvent;\n } catch (error) {\n throw new Error(`Failed to parse item: ${item}`, { cause: error });\n }\n yield parsed;\n }\n } finally {\n await schemaFile.cleanup();\n }\n }\n}\n\nfunction normalizeSkillMentionTriggers(\n triggers: CodexOptions[\"skillMentionTriggers\"],\n): SkillMentionTrigger[] {\n if (!triggers) {\n return [\"$\"];\n }\n if (!Array.isArray(triggers)) {\n throw new Error(\"skillMentionTriggers must be an array when provided\");\n }\n const normalized = triggers.filter(\n (value): value is SkillMentionTrigger => value === \"$\" || value === \"@\",\n );\n return normalized.length > 0 ? normalized : [\"$\"];\n}\n\nfunction prependSystemHintToToolResult(\n base: NativeToolResult,\n hint: string,\n): NativeToolResult {\n const trimmedHint = hint.trim();\n if (!trimmedHint) {\n return base;\n }\n const existing = base.output ?? \"\";\n const separator = existing.length === 0 || existing.startsWith(\"\\n\") ? \"\\n\\n\" : \"\\n\\n\";\n const output = existing.length === 0\n ? `[SYSTEM_HINT]\\n${trimmedHint}`\n : `[SYSTEM_HINT]\\n${trimmedHint}${separator}${existing}`;\n return {\n ...base,\n output,\n };\n}\n","import path from \"node:path\";\nimport os from \"node:os\";\nimport { parseArgs } from \"node:util\";\n\nimport { fastEmbedInit, reverieIndexSemantic, type ReverieSemanticSearchOptions } from \"../nativeBinding\";\n\nconst DEFAULT_MODEL = \"mixedbread-ai/mxbai-embed-large-v1\";\n\nconst INDEX_OPTION_DEFS = {\n \"codex-home\": { type: \"string\" } as const,\n \"project-root\": { type: \"string\" } as const,\n limit: { type: \"string\" } as const,\n \"max-candidates\": { type: \"string\" } as const,\n \"batch-size\": { type: \"string\" } as const,\n normalize: { type: \"boolean\" } as const,\n cache: { type: \"boolean\" } as const,\n \"embed-model\": { type: \"string\" } as const,\n \"embed-cache-dir\": { type: \"string\" } as const,\n \"embed-max-length\": { type: \"string\" } as const,\n \"no-progress\": { type: \"boolean\" } as const,\n \"skip-embed-init\": { type: \"boolean\" } as const,\n};\n\nexport async function executeReverieCommand(args: string[]): Promise<void> {\n const [first, ...rest] = args;\n const isFlag = first?.startsWith(\"-\");\n const command = !first || isFlag ? \"index\" : first;\n const tail = !first || isFlag ? args : rest;\n if (command !== \"index\") {\n throw new Error(`Unknown reverie command '${command}'. Supported subcommands: index`);\n }\n await runReverieIndex(tail);\n}\n\nasync function runReverieIndex(args: string[]): Promise<void> {\n const { values } = parseArgs({ args, options: INDEX_OPTION_DEFS, allowPositionals: false, strict: true });\n\n const codexHome = resolveCodexHome(values[\"codex-home\"]);\n const projectRoot = resolveProjectRoot(values[\"project-root\"]);\n const limit = parseOptionalInt(values.limit);\n const maxCandidates = parseOptionalInt(values[\"max-candidates\"]);\n const batchSize = parseOptionalInt(values[\"batch-size\"]);\n const embedMaxLength = parseOptionalInt(values[\"embed-max-length\"]);\n const normalize = typeof values.normalize === \"boolean\" ? values.normalize : undefined;\n const cache = typeof values.cache === \"boolean\" ? values.cache : undefined;\n const embedModel = typeof values[\"embed-model\"] === \"string\" ? values[\"embed-model\"] : DEFAULT_MODEL;\n const embedCacheDir = typeof values[\"embed-cache-dir\"] === \"string\" ? values[\"embed-cache-dir\"] : undefined;\n const showDownloadProgress = values[\"no-progress\"] ? false : true;\n const skipEmbedInit = values[\"skip-embed-init\"] === true;\n\n if (!skipEmbedInit) {\n await fastEmbedInit({\n model: embedModel,\n cacheDir: embedCacheDir ? path.resolve(embedCacheDir) : defaultCacheDir(),\n maxLength: embedMaxLength ?? undefined,\n showDownloadProgress,\n });\n }\n\n const options: ReverieSemanticSearchOptions = {\n limit,\n maxCandidates,\n projectRoot,\n batchSize,\n normalize,\n cache,\n };\n\n console.log(`📂 Codex home: ${codexHome}`);\n console.log(`📁 Project root: ${projectRoot}`);\n const stats = await reverieIndexSemantic(codexHome, options);\n console.log(\n `✅ Indexed ${stats.documentsEmbedded} conversation(s) across ${stats.batches} batch(es); cache warmed at ${projectRoot}`,\n );\n}\n\nfunction resolveCodexHome(explicit?: string): string {\n if (explicit) {\n return path.resolve(explicit);\n }\n if (process.env.CODEX_HOME) {\n return process.env.CODEX_HOME;\n }\n const home = os.homedir() || process.cwd();\n return path.join(home, \".codex\");\n}\n\nfunction resolveProjectRoot(explicit?: string): string {\n if (explicit) {\n return path.resolve(explicit);\n }\n return process.cwd();\n}\n\nfunction parseOptionalInt(value: unknown): number | undefined {\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction defaultCacheDir(): string | undefined {\n if (process.env.CODEX_EMBED_CACHE) {\n return path.resolve(process.env.CODEX_EMBED_CACHE);\n }\n return path.join(os.tmpdir(), \"codex-embed-cache\");\n}\n","import { getNativeBinding } from \"../nativeBinding\";\nimport type {\n ApprovalHandler,\n ApprovalRegistration,\n CodexNativeConfig,\n CombinedConfig,\n HookConfig,\n HookRegistration,\n LoadedConfigFile,\n LoadedPlugin,\n PluginContext,\n ToolConfig,\n ToolInterceptorConfig,\n} from \"./types\";\n\nexport async function buildCombinedConfig(params: {\n cwd: string;\n config: LoadedConfigFile;\n}): Promise<CombinedConfig> {\n const { cwd, config } = params;\n const warnings = [...config.warnings];\n const combined: CombinedConfig = {\n runDefaults: {},\n tuiDefaults: {},\n tools: [],\n interceptors: [],\n approval: undefined,\n beforeStartHooks: [],\n onEventHooks: [],\n warnings,\n allowReservedInterceptors: false,\n };\n\n const pluginContext: PluginContext = { cwd, configPath: config.configPath };\n\n if (config.config) {\n accumulateConfig({\n combined,\n config: config.config,\n source: config.configPath ?? \"config\",\n warnings,\n });\n }\n\n for (const loaded of config.plugins) {\n const pluginConfig = await evaluatePlugin(loaded, pluginContext, warnings);\n if (pluginConfig) {\n accumulateConfig({\n combined,\n config: pluginConfig,\n source: loaded.spec,\n warnings,\n });\n }\n }\n\n combined.warnings = warnings;\n return combined;\n}\n\nexport function applyNativeRegistrations(combined: CombinedConfig): void {\n const binding = getNativeBinding();\n if (!binding) {\n throw new Error(\"Native binding is not available.\");\n }\n\n binding.clearRegisteredTools();\n\n // De‑dupe tools by name: first registration wins\n const seenTools = new Set<string>();\n for (const tool of combined.tools) {\n const { handler, ...info } = tool;\n const name = String((info as any).name);\n if (seenTools.has(name)) {\n combined.warnings.push(`Duplicate tool \"${name}\" ignored (first definition wins).`);\n continue;\n }\n seenTools.add(name);\n binding.registerTool(info as any, handler as any);\n }\n\n // Register approval callback first so its interceptors have priority\n if (combined.approval && typeof binding.registerApprovalCallback === \"function\") {\n binding.registerApprovalCallback(combined.approval.handler);\n }\n\n const RESERVED = new Set<string>([\"local_shell\", \"exec_command\", \"apply_patch\", \"web_search\"]);\n const seenInterceptors = new Set<string>();\n\n for (const interceptor of combined.interceptors) {\n const name = interceptor.toolName;\n if (RESERVED.has(name) && !combined.allowReservedInterceptors) {\n combined.warnings.push(\n `Interceptor for \"${name}\" ignored: reserved for approval gating. Use approvals() hook instead.`,\n );\n continue;\n }\n if (seenInterceptors.has(name)) {\n combined.warnings.push(\n `Multiple interceptors for \"${name}\" detected; only the first will be used.`,\n );\n continue;\n }\n seenInterceptors.add(name);\n binding.registerToolInterceptor(interceptor.toolName, interceptor.handler);\n }\n}\n\nasync function evaluatePlugin(\n loaded: LoadedPlugin,\n context: PluginContext,\n warnings: string[],\n): Promise<CodexNativeConfig | null> {\n const { plugin, spec } = loaded;\n\n try {\n if (typeof plugin === \"function\") {\n const result = await plugin(context);\n return coerceConfig(result, spec, warnings);\n }\n\n if (plugin && typeof plugin === \"object\") {\n const candidate = plugin as CodexNativeConfig & {\n setup?: (ctx: PluginContext) => unknown;\n config?: CodexNativeConfig | ((ctx: PluginContext) => unknown);\n };\n\n if (typeof candidate.setup === \"function\") {\n await candidate.setup(context);\n }\n\n if (typeof candidate.config === \"function\") {\n return coerceConfig(await candidate.config(context), spec, warnings);\n }\n\n if (candidate.config) {\n return coerceConfig(candidate.config, spec, warnings);\n }\n\n return coerceConfig(candidate, spec, warnings);\n }\n\n return coerceConfig(plugin, spec, warnings);\n } catch (error) {\n warnings.push(`Plugin \"${spec}\" threw an error: ${(error as Error).message}`);\n return null;\n }\n}\n\nfunction coerceConfig(\n value: unknown,\n source: string,\n warnings: string[],\n): CodexNativeConfig | null {\n if (!value) {\n return null;\n }\n\n if (typeof value === \"object\") {\n return value as CodexNativeConfig;\n }\n\n warnings.push(`Plugin \"${source}\" did not return a config object.`);\n return null;\n}\n\nfunction accumulateConfig(params: {\n combined: CombinedConfig;\n config: CodexNativeConfig;\n source: string;\n warnings: string[];\n}) {\n const { combined, config, source, warnings } = params;\n\n if (config.defaults?.run) {\n combined.runDefaults = { ...combined.runDefaults, ...config.defaults.run };\n }\n if (config.defaults?.tui) {\n combined.tuiDefaults = { ...combined.tuiDefaults, ...config.defaults.tui };\n }\n\n if (Array.isArray(config.tools)) {\n for (const tool of config.tools) {\n if (!tool || typeof tool !== \"object\" || typeof tool.handler !== \"function\") {\n warnings.push(`Invalid tool definition supplied by \"${source}\".`);\n continue;\n }\n combined.tools.push(tool);\n }\n }\n\n if (Array.isArray(config.interceptors)) {\n for (const interceptor of config.interceptors) {\n if (\n !interceptor ||\n typeof interceptor !== \"object\" ||\n typeof interceptor.toolName !== \"string\" ||\n typeof interceptor.handler !== \"function\"\n ) {\n warnings.push(`Invalid interceptor definition supplied by \"${source}\".`);\n continue;\n }\n combined.interceptors.push(interceptor);\n }\n }\n\n if (config.approvals) {\n if (typeof config.approvals !== \"function\") {\n warnings.push(`Approval callback from \"${source}\" must be a function.`);\n } else {\n if (combined.approval) {\n warnings.push(\n `Approval callback from \"${source}\" overrides handler from \"${combined.approval.source}\".`,\n );\n }\n combined.approval = { source, handler: config.approvals as ApprovalHandler };\n }\n }\n\n if (config.hooks) {\n addHooks(combined, config.hooks, source, warnings);\n }\n\n if (config.allowReservedInterceptors === true) {\n combined.allowReservedInterceptors = true;\n }\n}\n\nfunction addHooks(\n combined: CombinedConfig,\n hooks: HookConfig,\n source: string,\n warnings: string[],\n): void {\n if (hooks.beforeStart) {\n const beforeStartCallbacks = Array.isArray(hooks.beforeStart)\n ? hooks.beforeStart\n : [hooks.beforeStart];\n for (const callback of beforeStartCallbacks) {\n if (typeof callback !== \"function\") {\n warnings.push(`beforeStart hook from \"${source}\" must be a function.`);\n continue;\n }\n combined.beforeStartHooks.push({ source, callback });\n }\n }\n\n if (hooks.onEvent) {\n const eventCallbacks = Array.isArray(hooks.onEvent) ? hooks.onEvent : [hooks.onEvent];\n for (const callback of eventCallbacks) {\n if (typeof callback !== \"function\") {\n warnings.push(`onEvent hook from \"${source}\" must be a function.`);\n continue;\n }\n combined.onEventHooks.push({ source, callback });\n }\n }\n}\n\n"],"mappings":"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","names":["import_node_process","import_node_util","import_node_url","path","fs","fsPromises","module","import_node_fs","import_promises","import_node_path","import_node_fs","import_node_module","import_node_path","import_node_url","dirname","path","fs","getImportMetaUrl","importMetaUrl","import_node_path","path","path","path","fs","path","fs","path","import_node_url","resolve","path","process","path","fsPromises","fs","resolve","import_node_process","AsyncQueue","resolve","fs","path","import_node_fs","import_node_path","fs","path","os","findGitRoot","assertTrustedDirectory","normalized","path","normalizeSkillMentionTriggers","process","import_node_path","import_node_os","path","os","CLI_ENTRYPOINT_ENV","process","isInteractive"]}