@codex-native/sdk 0.0.15 → 0.0.19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../../../node_modules/tsup/assets/cjs_shims.js","../src/thread.ts","../src/events/convert.ts","../src/outputSchemaFile.ts","../src/nativeBinding.ts","../src/tui.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/skills.ts","../src/exec.ts","../src/reviewOptions.ts","../src/codex.ts","../src/agents/toolRegistry.ts","../src/agents/CodexProvider.ts","../src/agents/types.ts","../src/agents/codexTool.ts","../src/agents/streamFormatter.ts","../src/agents/OpenCodeAgent.ts","../src/cloudTasks.ts","../src/logging/types.ts","../src/logging/logger.ts","../src/logging/threadLogger.ts","../src/reverie/constants.ts","../src/reverie/quality.ts","../src/reverie/boilerplate.ts","../src/reverie/logger.ts","../src/reverie/symbols.ts","../src/reverie/episodes.ts","../src/reverie/search.ts","../src/reverie/grader.ts","../src/reverie/context.ts","../src/reverie/pipeline.ts"],"sourcesContent":["export type {\n ThreadEvent,\n ThreadStartedEvent,\n TurnStartedEvent,\n TurnCompletedEvent,\n TurnFailedEvent,\n ItemStartedEvent,\n ItemUpdatedEvent,\n ItemCompletedEvent,\n ThreadError,\n ThreadErrorEvent,\n Usage,\n} from \"./events\";\nexport type {\n ThreadItem,\n AgentMessageItem,\n ReasoningItem,\n CommandExecutionItem,\n CommandExecutionStatus,\n FileChangeItem,\n PatchApplyStatus,\n PatchChangeKind,\n FileUpdateChange,\n McpToolCallItem,\n McpToolCallStatus,\n WebSearchItem,\n TodoListItem,\n TodoItem,\n ErrorItem,\n} from \"./items\";\n\nexport { Thread } from \"./thread\";\nexport type { RunResult, RunStreamedResult, Input, UserInput, ForkOptions } from \"./thread\";\n\nexport { Codex } from \"./codex\";\nexport type { ConversationListOptions, ConversationListPage, ConversationSummary } from \"./codex\";\n\nexport type { CodexOptions, NativeToolDefinition } from \"./codexOptions\";\nexport type { NativeToolInterceptorContext } from \"./codex\";\nexport type { NativeToolInvocation, NativeToolResult, NativeForkResult } from \"./nativeBinding\";\nexport type { ApprovalRequest } from \"./nativeBinding\";\nexport type { TokenizerOptions, TokenizerEncodeOptions } from \"./nativeBinding\";\n\nexport { startTui, runTui } from \"./tui\";\nexport type {\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n RunTuiOptions,\n TuiSession,\n} from \"./tui\";\n\nexport type { ThreadOptions, ApprovalMode, SandboxMode } from \"./threadOptions\";\nexport type { TurnOptions } from \"./turnOptions\";\nexport type { SkillDefinition, SkillMentionTrigger } from \"./skills\";\nexport type {\n ReviewInvocationOptions,\n ReviewTarget,\n CurrentChangesReview,\n BranchReview,\n CommitReview,\n CustomReview,\n} from \"./reviewOptions\";\nexport type {\n FastEmbedInitOptions,\n FastEmbedEmbedRequest,\n RepoDiffSummary,\n RepoDiffFileChange,\n RepoDiffSummaryOptions,\n} from \"./nativeBinding\";\n\n// LSP diagnostics integration\nexport {\n LspDiagnosticsBridge,\n attachLspDiagnostics,\n LspManager,\n DEFAULT_SERVERS,\n findServerForFile,\n resolveWorkspaceRoot,\n formatDiagnosticsForBackgroundEvent,\n formatDiagnosticsForTool,\n formatDiagnosticsWithSummary,\n filterBySeverity,\n summarizeDiagnostics,\n} from \"./lsp\";\nexport type {\n FileDiagnostics,\n LspDiagnosticSeverity,\n LspManagerOptions,\n LspServerConfig,\n NormalizedDiagnostic,\n WorkspaceLocator,\n DiagnosticSeverity,\n} from \"./lsp\";\n\n// OpenAI Agents framework integration\nexport { CodexProvider, codexTool } from \"./agents\";\nexport type { CodexProviderOptions, CodexToolOptions } from \"./agents\";\nexport { formatStream } from \"./agents\";\nexport type { FormattedStream, FormatStreamOptions, ToolCallEvent } from \"./agents\";\nexport { OpenCodeAgent } from \"./agents\";\nexport type { OpenCodeAgentOptions, DelegationResult, PermissionDecision, PermissionRequest } from \"./agents\";\n\n// Cloud tasks (remote agent tasks; applied locally)\nexport { CloudTasks } from \"./cloudTasks\";\nexport type {\n CloudTaskSummary,\n CloudTasksOptions,\n CloudApplyOutcome,\n CloudTaskStatus,\n CloudApplyStatus,\n DiffSummary as CloudDiffSummary,\n} from \"./cloudTasks\";\n\n// Unified logging system\nexport { Logger, ScopedLogger, logger, createThreadLogger, runThreadTurnWithLogs, LogLevel } from \"./logging\";\nexport type { LogScope, LoggerConfig, LogOutput, ThreadLoggingSink, LogEntry } from \"./logging\";\n\n// Reverie semantic search and quality filtering\nexport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_EMBED_MODEL,\n REVERIE_RERANKER_MODEL,\n REVERIE_CANDIDATE_MULTIPLIER,\n REVERIE_LLM_GRADE_THRESHOLD,\n DEFAULT_RERANKER_TOP_K,\n DEFAULT_RERANKER_BATCH_SIZE,\n isValidReverieExcerpt,\n deduplicateReverieInsights,\n applyQualityPipeline,\n logReverieSearch,\n logReverieFiltering,\n logReverieInsights,\n logReverieHintQuality,\n logLLMGrading,\n logApprovedReveries,\n logMultiLevelSearch,\n logLevelResults,\n logMultiLevelSummary,\n truncateText,\n gradeReverieRelevance,\n gradeReveriesInParallel,\n extractKeySymbols,\n searchReveries,\n applyReveriePipeline,\n applyFileReveriePipeline,\n searchMultiLevel,\n searchProjectLevel,\n searchBranchLevel,\n searchFileLevel,\n buildProjectContext,\n buildBranchContext,\n buildFileContext,\n contextToQuery,\n formatFileList,\n} from \"./reverie\";\nexport type {\n ReverieInsight,\n ReverieEpisodeSummary,\n ReverieSearchOptions,\n GradingOptions,\n ReverieFilterStats,\n ReverieResult,\n QualityFilterStats,\n AgentRunner,\n ReveriePipelineOptions,\n ReveriePipelineResult,\n ReverieSearchLevel,\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n ReverieContext,\n} from \"./reverie\";\n\n// SSE test helpers (exposed for TypeScript tests)\n// Re-export the native binding functions directly\nimport { getNativeBinding } from \"./nativeBinding\";\nexport {\n reverieListConversations,\n reverieSearchConversations,\n reverieSearchSemantic,\n reverieIndexSemantic,\n reverieGetConversationInsights,\n encodeToToon,\n fastEmbedInit,\n fastEmbedEmbed,\n tokenizerCount,\n tokenizerEncode,\n tokenizerDecode,\n collectRepoDiffSummary,\n} from \"./nativeBinding\";\n\nexport type {\n ReverieSemanticSearchOptions,\n ReverieSemanticIndexStats,\n FastEmbedRerankerModelCode,\n} from \"./nativeBinding\";\n\nexport function evCompleted(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 evResponseCreated(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 evAssistantMessage(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 evFunctionCall(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","// 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","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 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 { 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 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 { 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","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","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 {\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 { 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 type { NativeToolInvocation, NativeToolResult } from \"../nativeBinding\";\n\nexport interface ToolExecutionContext {\n name: string;\n callId: string;\n arguments: unknown;\n rawInvocation: NativeToolInvocation;\n}\n\nexport type ToolExecutorResult = string | NativeToolResult | { output?: string; error?: string; success?: boolean } | void;\nexport type ToolExecutor = (context: ToolExecutionContext) => Promise<ToolExecutorResult> | ToolExecutorResult;\n\nconst executors = new Map<string, ToolExecutor>();\n\nexport function registerCodexToolExecutor(name: string, executor: ToolExecutor) {\n executors.set(name, executor);\n}\n\nexport function getCodexToolExecutor(name: string): ToolExecutor | undefined {\n return executors.get(name);\n}\n\nexport function clearCodexToolExecutors() {\n executors.clear();\n}\n","import { Codex, type ApprovalRequest } from \"../codex\";\nimport type { Thread } from \"../thread\";\nimport type { ThreadEvent, Usage as CodexUsage } from \"../events\";\nimport type { ThreadItem } from \"../items\";\nimport type { Input, UserInput } from \"../thread\";\nimport type { CodexOptions, NativeToolDefinition } from \"../codexOptions\";\nimport type { ThreadOptions } from \"../threadOptions\";\nimport type { NativeToolInvocation, NativeToolResult } from \"../nativeBinding\";\nimport { attachLspDiagnostics } from \"../lsp\";\nimport { getCodexToolExecutor, type ToolExecutor, type ToolExecutionContext, type ToolExecutorResult } from \"./toolRegistry\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport type {\n ModelProvider,\n Model,\n ModelRequest,\n ModelResponse,\n StreamEvent,\n AgentInputItem,\n AgentOutputItem,\n AssistantMessageItem,\n OutputText,\n SerializedTool,\n} from \"./types\";\nimport { Usage } from \"./types\";\n\n/**\n * Options for creating a CodexProvider\n */\nexport interface CodexProviderOptions extends CodexOptions {\n /**\n * Default model to use when none is specified\n */\n defaultModel?: string;\n /**\n * Approval policy forwarded to threads created by this provider.\n */\n approvalMode?: ThreadOptions[\"approvalMode\"];\n /**\n * Use local OSS provider via Ollama (pulls models as needed)\n */\n oss?: boolean;\n\n /**\n * Working directory for Codex operations\n * @default process.cwd()\n */\n workingDirectory?: string;\n\n /**\n * Skip git repository check\n * @default false\n */\n skipGitRepoCheck?: boolean;\n\n /**\n * Sandbox policy to use when executing shell commands\n * @default \"danger-full-access\"\n */\n sandboxMode?: ThreadOptions[\"sandboxMode\"];\n\n /**\n * Reasoning effort level for reasoning-capable models\n * @default \"medium\"\n */\n reasoningEffort?: ThreadOptions[\"reasoningEffort\"];\n\n /**\n * Reasoning summary preference for reasoning-capable models\n * @default \"auto\"\n */\n reasoningSummary?: ThreadOptions[\"reasoningSummary\"];\n\n /**\n * Enable LSP diagnostics for threads created by this provider\n * @default true\n */\n enableLsp?: boolean;\n}\n\n/**\n * Provider implementation that uses Codex as the backend for OpenAI Agents\n *\n * @example\n * ```typescript\n * import { CodexProvider } from '@codex-native/sdk/agents';\n * import { Agent, Runner } from '@openai/agents';\n *\n * const provider = new CodexProvider({\n * defaultModel: 'gpt-5.2-codex'\n * });\n *\n * const agent = new Agent({\n * name: 'CodeAssistant',\n * instructions: 'You are a helpful coding assistant'\n * });\n *\n * const runner = new Runner({ modelProvider: provider });\n * const result = await runner.run(agent, 'Fix the failing tests');\n * ```\n */\nexport class CodexProvider implements ModelProvider {\n private codex: Codex | null = null;\n private options: CodexProviderOptions;\n\n constructor(options: CodexProviderOptions = {}) {\n this.options = {\n workingDirectory: options.workingDirectory || process.cwd(),\n skipGitRepoCheck: options.skipGitRepoCheck ?? false,\n ...options,\n };\n }\n\n /**\n * Lazy initialization of Codex instance\n */\n private getCodex(): Codex {\n if (!this.codex) {\n try {\n this.codex = new Codex({\n apiKey: this.options.apiKey,\n baseUrl: this.options.baseUrl,\n modelProvider: this.options.modelProvider,\n defaultModel: this.options.defaultModel,\n tools: this.options.tools,\n preserveRegisteredTools: this.options.preserveRegisteredTools,\n skills: this.options.skills,\n skillMentionTriggers: this.options.skillMentionTriggers,\n });\n } catch (error) {\n throw new Error(\n `Failed to initialize Codex: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return this.codex;\n }\n\n getModel(modelName?: string): Model {\n const model = modelName || this.options.defaultModel;\n return new CodexModel(this.getCodex(), model, this.options);\n }\n\n /**\n * Register a programmatic approval callback on the underlying Codex instance.\n */\n setApprovalCallback(callback: (request: ApprovalRequest) => boolean | Promise<boolean>): void {\n this.getCodex().setApprovalCallback(callback);\n }\n}\n\n/**\n * Model implementation that wraps a Codex Thread\n */\nclass CodexModel implements Model {\n private codex: Codex;\n private modelName?: string;\n private thread: Thread | null = null;\n private options: CodexProviderOptions;\n private registeredTools: Set<string> = new Set();\n private toolExecutors: Map<string, ToolExecutor> = new Map();\n private tempImageFiles: Set<string> = new Set();\n private streamedTurnItems: ThreadItem[] = [];\n private lastStreamedMessage: string | null = null;\n private detachDiagnostics?: () => void;\n private diagnosticsThread?: Thread | null;\n\n constructor(codex: Codex, modelName: string | undefined, options: CodexProviderOptions) {\n this.codex = codex;\n this.modelName = modelName;\n this.options = options;\n }\n\n /**\n * Cleanup temporary image files created during request processing\n */\n private async cleanupTempFiles(): Promise<void> {\n for (const filepath of this.tempImageFiles) {\n try {\n await fs.promises.unlink(filepath);\n } catch (error) {\n // Silently ignore cleanup errors (file may already be deleted)\n }\n }\n this.tempImageFiles.clear();\n }\n\n /**\n * Get or create the thread for this model instance\n */\n private getThread(conversationId?: string): Thread {\n // If we have a conversation ID and either no thread or a different thread\n if (conversationId) {\n if (!this.thread || this.thread.id !== conversationId) {\n // Resume the specified thread\n this.detachDiagnostics?.();\n this.thread = this.codex.resumeThread(conversationId, this.getThreadOptions());\n this.diagnosticsThread = null;\n }\n } else if (!this.thread) {\n // Create new thread only if we don't have one\n this.detachDiagnostics?.();\n this.thread = this.codex.startThread(this.getThreadOptions());\n this.diagnosticsThread = null;\n }\n const thread = this.thread;\n if (!thread) {\n throw new Error(\"Thread initialization failed\");\n }\n this.ensureDiagnosticsBridge(thread);\n return thread;\n }\n\n private ensureDiagnosticsBridge(thread: Thread): void {\n // Skip LSP attachment if explicitly disabled\n if (this.options.enableLsp === false) {\n return;\n }\n if (this.diagnosticsThread === thread && this.detachDiagnostics) {\n return;\n }\n this.detachDiagnostics?.();\n this.diagnosticsThread = thread;\n this.detachDiagnostics = attachLspDiagnostics(thread, {\n workingDirectory: this.options.workingDirectory ?? process.cwd(),\n waitForDiagnostics: true,\n });\n }\n\n private getThreadOptions(): ThreadOptions {\n return {\n model: this.modelName,\n // When a custom baseUrl is provided (e.g., test proxy), do not enable OSS mode,\n // since the backend is not Ollama in that case.\n oss: this.options.baseUrl ? false : this.options.oss,\n workingDirectory: this.options.workingDirectory,\n skipGitRepoCheck: this.options.skipGitRepoCheck,\n sandboxMode: this.options.sandboxMode ?? \"danger-full-access\",\n approvalMode: this.options.approvalMode,\n reasoningEffort: this.options.reasoningEffort,\n reasoningSummary: this.options.reasoningSummary,\n };\n }\n\n async getResponse(request: ModelRequest): Promise<ModelResponse> {\n try {\n const thread = this.getThread(request.conversationId || request.previousResponseId);\n\n // Register any tools provided in the request\n if (request.tools && request.tools.length > 0) {\n this.registerRequestTools(request.tools);\n }\n\n const input = await this.convertRequestToInput(request);\n\n // Note: ModelSettings like temperature, maxTokens, topP, etc. are not currently\n // supported by the Codex native binding. The Rust layer handles model configuration.\n\n // Run Codex (tools are now registered and will be available)\n const turn = await thread.run(input, {\n outputSchema: normalizeAgentsOutputType(request.outputType),\n oss: this.options.oss,\n });\n\n const planItem = turn.items\n .filter((item): item is Extract<ThreadItem, { type: \"todo_list\" }> => item.type === \"todo_list\")\n .slice(-1)[0];\n\n // Convert Codex response to ModelResponse format\n const response: {\n usage: Usage;\n output: AgentOutputItem[];\n responseId: string | undefined;\n plan?: { items: Array<{ text: string; completed: boolean }> };\n } = {\n usage: this.convertUsage(turn.usage),\n output: this.convertItemsToOutput(turn.items, turn.finalResponse),\n responseId: thread.id || undefined,\n };\n\n if (planItem) {\n response.plan = { items: planItem.items };\n }\n\n return response;\n } finally {\n // Clean up temporary image files\n await this.cleanupTempFiles();\n }\n }\n\n async *getStreamedResponse(request: ModelRequest): AsyncIterable<StreamEvent> {\n const MAX_ACCUMULATED_SIZE = 10_000_000; // 10MB limit\n\n try {\n const thread = this.getThread(request.conversationId || request.previousResponseId);\n\n // Register any tools provided in the request\n if (request.tools && request.tools.length > 0) {\n this.registerRequestTools(request.tools);\n }\n\n const input = await this.convertRequestToInput(request);\n\n const { events } = await thread.runStreamed(input, {\n outputSchema: normalizeAgentsOutputType(request.outputType),\n oss: this.options.oss,\n });\n\n // Track text accumulation for delta calculation\n const textAccumulator = new Map<string, string>();\n\n for await (const event of events) {\n // Check accumulated text size to prevent memory issues\n let totalSize = 0;\n for (const text of textAccumulator.values()) {\n totalSize += text.length;\n }\n if (totalSize > MAX_ACCUMULATED_SIZE) {\n throw new Error(`Accumulated text exceeded maximum size limit (${MAX_ACCUMULATED_SIZE} bytes)`);\n }\n\n const streamEvents = this.convertCodexEventToStreamEvent(event, textAccumulator);\n\n for (const streamEvent of streamEvents) {\n yield streamEvent;\n }\n }\n } finally {\n // Clean up temporary image files\n await this.cleanupTempFiles();\n }\n }\n\n /**\n * Register tools from ModelRequest with the Codex instance\n *\n * Converts SerializedTool format (OpenAI Agents) to NativeToolDefinition format (Codex)\n * and registers them with the Codex instance for bidirectional tool execution.\n */\n private registerRequestTools(tools: SerializedTool[]): void {\n this.toolExecutors.clear();\n\n for (const tool of tools) {\n if (tool.type !== \"function\") {\n continue;\n }\n\n // Skip if already registered\n if (this.registeredTools.has(tool.name)) {\n const executor = this.resolveToolExecutor(tool.name);\n if (executor) {\n this.toolExecutors.set(tool.name, executor);\n }\n continue;\n }\n\n try {\n const executor = this.resolveToolExecutor(tool.name);\n if (executor) {\n this.toolExecutors.set(tool.name, executor);\n }\n\n // Convert SerializedTool to NativeToolDefinition\n const nativeToolDef: NativeToolDefinition = {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n // The handler is called when Codex wants to execute this tool\n handler: async (invocation: NativeToolInvocation): Promise<NativeToolResult> => {\n return await this.executeToolViaFramework(invocation);\n },\n };\n\n // Register the tool with Codex\n this.codex.registerTool(nativeToolDef);\n this.registeredTools.add(tool.name);\n\n console.log(`Registered tool with Codex: ${tool.name}`);\n } catch (error) {\n const errorMessage = `Failed to register tool ${tool.name}: ${error instanceof Error ? error.message : String(error)}`;\n console.error(errorMessage);\n // Don't throw - allow other tools to register even if one fails\n // Individual tool failures shouldn't block the entire request\n }\n }\n }\n\n private resolveToolExecutor(toolName: string): ToolExecutor | undefined {\n return getCodexToolExecutor(toolName);\n }\n\n /**\n * Execute a tool via the OpenAI Agents framework\n *\n * This is the bridge between Codex's tool execution and the framework's tool handlers.\n *\n * FRAMEWORK INTEGRATION NOTE:\n * This method currently returns a placeholder result because the actual execution\n * requires integration with the OpenAI Agents framework's tool execution loop.\n *\n * In a full implementation, this would:\n * 1. Emit a \"tool_call_requested\" event that the framework can listen to\n * 2. Wait for the framework to execute the tool and provide the result\n * 3. Return that result to Codex\n *\n * For now, this creates a promise that could be resolved by framework code,\n * but the framework integration is not yet complete.\n */\n private async executeToolViaFramework(\n invocation: NativeToolInvocation\n ): Promise<NativeToolResult> {\n if (!invocation) {\n console.warn('Codex requested a tool execution without invocation data.');\n return {\n output: JSON.stringify({\n message: 'Tool invocation payload missing',\n note: 'Codex returned null invocation data so the tool was not executed.',\n }),\n success: false,\n error: 'Missing tool invocation data from Codex',\n };\n }\n\n console.log(\n `Tool execution requested by Codex: ${invocation.toolName} (callId: ${invocation.callId})`\n );\n const executor = this.toolExecutors.get(invocation.toolName) ?? getCodexToolExecutor(invocation.toolName);\n if (!executor) {\n const message = `No Codex executor registered for tool '${invocation.toolName}'. Use codexTool() or provide a codexExecute handler.`;\n console.warn(message);\n return {\n success: false,\n error: message,\n output: undefined,\n };\n }\n\n let parsedArguments: unknown = {};\n if (invocation.arguments) {\n try {\n parsedArguments = JSON.parse(invocation.arguments);\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse tool arguments: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n const context: ToolExecutionContext = {\n name: invocation.toolName,\n callId: invocation.callId,\n arguments: parsedArguments,\n rawInvocation: invocation,\n };\n\n try {\n const result = await executor(context);\n return this.normalizeToolResult(result);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle image input by converting to local file path\n * Supports: base64 data URLs, HTTP(S) URLs, and file IDs (not yet implemented)\n */\n private normalizeToolResult(result: ToolExecutorResult): NativeToolResult {\n if (result === undefined || result === null) {\n return { success: true };\n }\n\n if (typeof result === \"string\") {\n return { success: true, output: result };\n }\n\n if (typeof result === \"object\" && (\"output\" in result || \"error\" in result || \"success\" in result)) {\n return {\n success: result.success ?? !result.error,\n output: result.output,\n error: result.error,\n };\n }\n\n return {\n success: true,\n output: JSON.stringify(result),\n };\n }\n\n private async handleImageInput(item: any): Promise<string | null> {\n const imageValue = item.image;\n\n // Case 1: Already a local file path (less common but possible)\n if (typeof imageValue === \"string\") {\n // Check if it's a base64 data URL\n if (imageValue.startsWith(\"data:image/\")) {\n return await this.saveBase64Image(imageValue);\n }\n // Check if it's an HTTP(S) URL\n else if (imageValue.startsWith(\"http://\") || imageValue.startsWith(\"https://\")) {\n return await this.downloadImage(imageValue);\n }\n // Assume it's already a file path\n else if (fs.existsSync(imageValue)) {\n return imageValue;\n }\n // Invalid format\n else {\n throw new Error(`Invalid image format: ${imageValue.substring(0, 50)}...`);\n }\n }\n // Case 2: Object with url property\n else if (typeof imageValue === \"object\" && \"url\" in imageValue) {\n return await this.downloadImage(imageValue.url);\n }\n // Case 3: Object with fileId property (would need API access to download)\n else if (typeof imageValue === \"object\" && \"fileId\" in imageValue) {\n throw new Error(\n `Image fileId references are not yet supported. ` +\n `File IDs would need to be downloaded from the service first.`\n );\n }\n\n return null;\n }\n\n /**\n * Save base64-encoded image to temporary file\n */\n private async saveBase64Image(dataUrl: string): Promise<string> {\n // Extract media type and base64 data\n const matches = dataUrl.match(/^data:image\\/([^;]+);base64,(.+)$/);\n if (!matches) {\n throw new Error(\"Invalid base64 image data URL\");\n }\n\n const mediaType = matches[1];\n const base64Data = matches[2];\n if (!base64Data) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const sanitizedBase64 = base64Data.replace(/\\s/g, \"\");\n if (sanitizedBase64.length === 0) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n if (!/^[A-Za-z0-9+/=_-]+$/.test(sanitizedBase64)) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const normalizedBase64 = sanitizedBase64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n let buffer: Buffer;\n try {\n buffer = Buffer.from(normalizedBase64, \"base64\");\n } catch {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n if (buffer.length === 0) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const reencoded = buffer.toString(\"base64\").replace(/=+$/, \"\");\n const normalizedInput = normalizedBase64.replace(/=+$/, \"\");\n if (reencoded !== normalizedInput) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n // Extract extension from media type, handling various formats\n // Examples: \"png\", \"jpeg\", \"svg+xml\", \"vnd.microsoft.icon\"\n const extension = this.getExtensionFromMediaType(mediaType, \"png\");\n\n // Create temp file\n const tempDir = os.tmpdir();\n const filename = `codex-image-${Date.now()}.${extension}`;\n const filepath = path.join(tempDir, filename);\n\n await fs.promises.writeFile(filepath, buffer);\n this.tempImageFiles.add(filepath);\n return filepath;\n }\n\n /**\n * Download image from URL to temporary file\n */\n private async downloadImage(url: string): Promise<string> {\n // Use fetch to download the image\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download image from ${url}: ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer();\n const contentType = response.headers.get(\"content-type\") || \"image/png\";\n\n // Extract media type from content-type (e.g., \"image/png; charset=utf-8\" -> \"png\")\n const mediaTypePart = contentType.split(\";\")[0]?.trim() || \"image/png\";\n const mediaType = mediaTypePart.split(\"/\")[1] || \"png\";\n const extension = this.getExtensionFromMediaType(mediaType, \"png\");\n\n // Create temp file\n const tempDir = os.tmpdir();\n const filename = `codex-image-${Date.now()}.${extension}`;\n const filepath = path.join(tempDir, filename);\n\n await fs.promises.writeFile(filepath, Buffer.from(buffer));\n this.tempImageFiles.add(filepath);\n return filepath;\n }\n\n /**\n * Convert media type to file extension\n * Handles special cases like \"jpeg\" -> \"jpg\", \"svg+xml\" -> \"svg\"\n */\n private getExtensionFromMediaType(mediaType: string | undefined, defaultExt: string): string {\n if (!mediaType) {\n return defaultExt;\n }\n\n // Normalize the media type\n const normalized = mediaType.toLowerCase().trim();\n\n // Handle special cases\n const extensionMap: Record<string, string> = {\n \"jpeg\": \"jpg\",\n \"svg+xml\": \"svg\",\n \"vnd.microsoft.icon\": \"ico\",\n \"x-icon\": \"ico\",\n };\n\n // Check if we have a mapping for this media type\n if (extensionMap[normalized]) {\n return extensionMap[normalized];\n }\n\n // For standard types like \"png\", \"gif\", \"webp\", \"bmp\", \"tiff\"\n // Just use the media type as the extension\n const simpleExtension = normalized.split(\"+\")[0]; // Handle cases like \"svg+xml\"\n\n // Validate it's a reasonable extension (alphanumeric only)\n if (simpleExtension && /^[a-z0-9]+$/.test(simpleExtension)) {\n return simpleExtension;\n }\n\n // Fall back to default if we can't determine a valid extension\n return defaultExt;\n }\n\n private async convertRequestToInput(request: ModelRequest): Promise<Input> {\n const parts: UserInput[] = [];\n\n // Add system instructions as a text preamble if provided\n if (request.systemInstructions) {\n parts.push({\n type: \"text\",\n text: `<system>\\n${request.systemInstructions}\\n</system>\\n\\n`,\n });\n }\n\n // Convert input\n if (typeof request.input === \"string\") {\n parts.push({ type: \"text\", text: request.input });\n } else {\n // Convert AgentInputItem[] to UserInput[]\n for (const item of request.input) {\n // Check for unsupported types first using property checks\n if ('file' in item && 'type' in item) {\n throw new Error(\n `CodexProvider does not yet support input_file type. ` +\n `File handling needs to be implemented based on file type and format.`\n );\n }\n if ('audio' in item && 'type' in item) {\n throw new Error(\n `CodexProvider does not yet support input_audio type. ` +\n `Audio handling needs to be implemented.`\n );\n }\n if ('image' in item && 'type' in item && item.type !== \"message\") {\n const imageItem = item;\n const imagePath = await this.handleImageInput(imageItem);\n if (imagePath) {\n parts.push({ type: \"local_image\", path: imagePath });\n }\n continue;\n }\n\n // Handle different item types\n if (item.type === \"function_call_result\") {\n // Tool results - for now, convert to text describing the result\n if ('name' in item && 'result' in item) {\n parts.push({\n type: \"text\",\n text: `[Tool ${item.name} returned: ${item.result}]`\n });\n }\n } else if (item.type === \"reasoning\") {\n // Reasoning content\n let text = '';\n if ('content' in item && typeof item.content === 'string') {\n text = item.content;\n } else if ('reasoning' in item && typeof item.reasoning === 'string') {\n text = item.reasoning;\n }\n if (text) {\n parts.push({\n type: \"text\",\n text: `[Reasoning: ${text}]`\n });\n }\n } else if ((item.type === \"message\" || item.type === undefined) && 'role' in item) {\n // Message item - extract content\n if (!('content' in item)) continue;\n const content = item.content;\n\n if (typeof content === \"string\") {\n parts.push({ type: \"text\", text: content });\n } else if (Array.isArray(content)) {\n // Process content array\n for (const contentItem of content) {\n if (contentItem.type === \"input_text\") {\n parts.push({ type: \"text\", text: contentItem.text });\n } else if (contentItem.type === \"input_image\") {\n const imagePath = await this.handleImageInput(contentItem);\n if (imagePath) {\n parts.push({ type: \"local_image\", path: imagePath });\n }\n } else if (contentItem.type === \"input_file\") {\n throw new Error(\n `CodexProvider does not yet support input_file type. ` +\n `File handling needs to be implemented based on file type and format.`\n );\n } else if (contentItem.type === \"audio\") {\n throw new Error(\n `CodexProvider does not yet support audio type. ` +\n `Audio handling needs to be implemented.`\n );\n } else if (contentItem.type === \"refusal\") {\n parts.push({\n type: \"text\",\n text: `[Refusal: ${contentItem.refusal}]`\n });\n } else if (contentItem.type === \"output_text\") {\n parts.push({ type: \"text\", text: contentItem.text });\n }\n }\n }\n }\n }\n }\n\n // If only one text part, return as string\n if (parts.length === 1 && parts[0]!.type === \"text\") {\n return parts[0]!.text;\n }\n\n return parts;\n }\n\n /**\n * Convert Codex Usage to ModelResponse Usage\n */\n private convertUsage(usage: CodexUsage | null): Usage {\n if (!usage) {\n return new Usage();\n }\n\n const converted = new Usage({\n requests: 1,\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n });\n\n if (usage.cached_input_tokens) {\n converted.inputTokensDetails = [{ cachedTokens: usage.cached_input_tokens }];\n }\n\n return converted;\n }\n\n /**\n * Convert Codex ThreadItems to AgentOutputItems\n */\n private convertItemsToOutput(items: ThreadItem[], finalResponse: string): AgentOutputItem[] {\n const output: AgentOutputItem[] = [];\n\n for (const item of items) {\n switch (item.type) {\n case \"agent_message\": {\n const content = [\n {\n type: \"output_text\" as const,\n text: item.text,\n },\n ];\n\n output.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content,\n } as AssistantMessageItem);\n break;\n }\n\n // For final output, omit internal \"reasoning\" items. Streaming already surfaces reasoning events.\n case \"reasoning\":\n break;\n\n // Codex handles tools internally, so we don't expose them as function calls\n // The results are already incorporated into the agent_message\n case \"command_execution\":\n case \"file_change\":\n case \"mcp_tool_call\":\n // Skip - these are internal to Codex\n break;\n\n default:\n // Unknown item type - skip\n break;\n }\n }\n\n // If no items were converted, add the final response as a message\n if (output.length === 0 && finalResponse) {\n output.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: [\n {\n type: \"output_text\" as const,\n text: finalResponse,\n },\n ],\n } as AssistantMessageItem);\n }\n\n return output;\n }\n\n private buildStreamResponse(\n usage: Usage,\n responseId: string,\n items: ThreadItem[],\n lastMessage: string | null\n ): {\n id: string;\n responseId: string;\n usage: any;\n output: AgentOutputItem[];\n plan?: { items: any[] };\n } {\n const messageItems = items.filter(\n (item): item is Extract<ThreadItem, { type: \"agent_message\" }> => item.type === \"agent_message\"\n );\n const output = this.convertItemsToOutput(messageItems, lastMessage ?? \"\");\n\n // Convert Usage to plain object format expected by StreamEvent\n const usageData = {\n requests: usage.requests,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n inputTokensDetails: usage.inputTokensDetails?.[0],\n outputTokensDetails: usage.outputTokensDetails?.[0],\n };\n\n // Include latest plan information from todo_list items\n const latestPlan = items\n .filter((item): item is Extract<ThreadItem, { type: \"todo_list\" }> => item.type === \"todo_list\")\n .slice(-1)[0]; // Get the most recent plan\n\n const response: {\n id: string;\n responseId: string;\n usage: any;\n output: AgentOutputItem[];\n plan?: { items: any[] };\n } = {\n id: responseId,\n responseId,\n usage: usageData,\n output,\n };\n\n if (latestPlan) {\n response.plan = { items: latestPlan.items };\n }\n\n return response;\n }\n\n /**\n * Convert Codex ThreadEvent to OpenAI Agents StreamEvent\n */\n private convertCodexEventToStreamEvent(\n event: ThreadEvent,\n textAccumulator: Map<string, string>\n ): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n switch (event.type) {\n case \"thread.started\": {\n events.push({ type: \"response_started\" });\n // Also emit OpenAI-style start event for Agents Runner\n const responseId = this.thread?.id ?? \"codex-stream-response\";\n events.push({\n type: \"response.created\",\n response: { id: responseId },\n } as unknown as StreamEvent);\n break;\n }\n\n case \"turn.started\":\n // No equivalent in StreamEvent - skip\n this.streamedTurnItems = [];\n this.lastStreamedMessage = null;\n break;\n\n case \"item.started\":\n // Initialize accumulator for this item\n if (event.item.type === \"agent_message\" || event.item.type === \"reasoning\") {\n const itemKey = `${event.item.type}`;\n textAccumulator.set(itemKey, \"\");\n }\n break;\n\n case \"background_event\":\n events.push({\n type: \"model\",\n event: {\n type: \"background_event\",\n message: event.message,\n },\n } as StreamEvent);\n break;\n\n case \"item.updated\":\n // Emit delta events for incremental text updates\n if (event.item.type === \"agent_message\") {\n const itemKey = \"agent_message\";\n const previousText = textAccumulator.get(itemKey) || \"\";\n const currentText = event.item.text;\n\n // Validate: current text should be longer than previous (no backwards updates)\n if (currentText.length < previousText.length) {\n console.warn(\"Received backwards update for text - ignoring delta\");\n break;\n }\n\n if (currentText.length > previousText.length) {\n const delta = currentText.slice(previousText.length);\n textAccumulator.set(itemKey, currentText);\n\n // Codex SDK delta\n events.push({\n type: \"output_text_delta\",\n delta,\n });\n // OpenAI Responses-style delta for Agents Runner\n events.push({\n type: \"response.output_text.delta\",\n delta,\n } as unknown as StreamEvent);\n }\n } else if (event.item.type === \"reasoning\") {\n const itemKey = \"reasoning\";\n const previousText = textAccumulator.get(itemKey) || \"\";\n const currentText = event.item.text;\n\n if (currentText.length > previousText.length) {\n const delta = currentText.slice(previousText.length);\n textAccumulator.set(itemKey, currentText);\n\n // Use \"model\" type for custom reasoning events\n events.push({\n type: \"model\",\n event: {\n type: \"reasoning_delta\",\n delta,\n },\n } as StreamEvent);\n }\n }\n break;\n\n case \"item.completed\":\n this.streamedTurnItems.push(event.item);\n\n if (event.item.type === \"agent_message\") {\n // Final text is available in response_done; we only clear accumulator here.\n textAccumulator.delete(\"agent_message\");\n this.lastStreamedMessage = event.item.text;\n } else if (event.item.type === \"reasoning\") {\n events.push({\n type: \"model\",\n event: {\n type: \"reasoning_done\",\n reasoning: event.item.text,\n },\n } as StreamEvent);\n textAccumulator.delete(\"reasoning\");\n } else if (event.item.type === \"todo_list\") {\n // Emit plan update event for OpenAI Agents consumers\n events.push({\n type: \"model\",\n event: {\n type: \"plan_update\",\n items: event.item.items,\n },\n } as StreamEvent);\n }\n break;\n\n case \"turn.completed\": {\n // Emit response done with full response\n const usage = this.convertUsage(event.usage);\n const responseId = this.thread?.id ?? \"codex-stream-response\";\n const response = this.buildStreamResponse(\n usage,\n responseId,\n this.streamedTurnItems,\n this.lastStreamedMessage\n );\n this.streamedTurnItems = [];\n this.lastStreamedMessage = null;\n\n // Emit OpenAI Responses-style completion before the Codex-specific finale\n // Map usage to snake_case and include final output_text if available\n events.push({\n type: \"response.completed\",\n response: {\n id: response.id,\n usage: {\n input_tokens: usage.inputTokens,\n input_tokens_details: usage.inputTokensDetails?.[0] ?? null,\n output_tokens: usage.outputTokens,\n output_tokens_details: usage.outputTokensDetails?.[0] ?? null,\n total_tokens: usage.totalTokens,\n },\n ...(response.output && response.output.length > 0\n ? {\n output: response.output.map((item) => {\n if (item.type === \"message\" && item.role === \"assistant\") {\n return {\n id: item.id ?? \"msg_1\",\n role: item.role,\n content: item.content,\n };\n }\n return item;\n }),\n output_text:\n response.output\n .filter((item): item is AssistantMessageItem =>\n item.type === \"message\" && item.role === \"assistant\"\n )[0]?.content?.find(\n (c) => c.type === \"output_text\"\n )?.text ?? (this.lastStreamedMessage ?? \"\"),\n }\n : {}),\n },\n } as unknown as StreamEvent);\n\n // Codex SDK stream event (used by formatStream) should remain the terminal event\n events.push({\n type: \"response_done\",\n response,\n } as StreamEvent);\n break;\n }\n\n case \"turn.failed\":\n events.push({\n type: \"model\",\n event: {\n type: \"error\",\n error: {\n message: event.error.message,\n },\n },\n } as StreamEvent);\n break;\n\n case \"error\":\n events.push({\n type: \"model\",\n event: {\n type: \"error\",\n error: {\n message: event.message,\n },\n },\n } as StreamEvent);\n break;\n\n case \"raw_event\":\n break;\n\n default:\n break;\n }\n\n // Only include raw events for non-raw_event inputs\n if ((event as Record<string, unknown>)?.type !== \"raw_event\") {\n const rawEvent = {\n type: \"raw_event\",\n raw: event,\n } as unknown as StreamEvent;\n\n if (events.length === 0) {\n return [rawEvent];\n }\n\n const result = [...events];\n const insertIndex = Math.min(1, result.length);\n result.splice(insertIndex, 0, rawEvent);\n return result;\n }\n\n return events;\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Accept OpenAI Agents outputType when it is:\n * - A plain JSON schema object\n * - An OpenAI-style wrapper: { type: 'json_schema', json_schema: { name?, strict?, schema } }\n * - A lenient wrapper: { schema, strict?, name? }\n * Otherwise, return undefined (text output).\n */\nfunction normalizeAgentsOutputType(outputType: unknown): unknown | undefined {\n if (!isObject(outputType)) return undefined;\n const outType = outputType as Record<string, unknown>;\n // Wrapper form with explicit discriminator\n const t = typeof outType.type === \"string\" ? (outType.type as string) : undefined;\n if (t === \"json_schema\" || t === \"json-schema\") {\n // Support both { type: 'json_schema', schema: {...} } and\n // { type: 'json_schema', json_schema: { schema: {...} } }\n const topLevelSchema = outType.schema;\n if (isObject(topLevelSchema)) {\n return topLevelSchema;\n }\n const nested = outType.json_schema;\n if (isObject(nested)) {\n const nestedSchema = (nested as Record<string, unknown>).schema;\n if (isObject(nestedSchema)) {\n return nestedSchema;\n }\n }\n return undefined;\n }\n // Lenient wrapper { schema: {...} }\n if (\"schema\" in outType && isObject(outType.schema)) {\n return outType.schema as Record<string, unknown>;\n }\n // Plain JSON schema (must look like a schema)\n if (\n (\"type\" in outType && outType.type === \"object\") ||\n \"properties\" in outType ||\n \"required\" in outType\n ) {\n return outType;\n }\n return undefined;\n}\n","export type {\n ModelProvider,\n Model,\n ModelRequest,\n ModelResponse,\n ModelSettings,\n ModelSettingsToolChoice,\n SerializedTool,\n SerializedHandoff,\n SerializedOutputType,\n} from \"@openai/agents-core\";\n\nexport type { Prompt } from \"@openai/agents-core/model\";\n\nexport type {\n AgentInputItem,\n AgentOutputItem,\n AssistantMessageItem,\n StreamEvent,\n TextOutput as OutputText,\n} from \"@openai/agents-core\";\n\nexport { Usage } from \"@openai/agents-core\";\n","import { tool } from \"@openai/agents\";\nimport type { ToolExecutor, ToolExecutorResult } from \"./toolRegistry\";\nimport { registerCodexToolExecutor } from \"./toolRegistry\";\n\ntype BaseToolOptions = Parameters<typeof tool>[0];\ntype AgentTool = ReturnType<typeof tool>;\n\nexport type CodexToolOptions = BaseToolOptions & {\n codexExecute: (input: unknown) => Promise<unknown> | unknown;\n};\n\nexport function codexTool(options: CodexToolOptions): AgentTool {\n const { codexExecute, ...delegate } = options;\n const agentTool = tool(delegate as BaseToolOptions);\n\n const executor = createCodexExecutor(agentTool.name, codexExecute);\n registerCodexToolExecutor(agentTool.name, executor);\n\n return agentTool;\n}\n\nfunction createCodexExecutor(toolName: string, customExecutor: (input: unknown) => Promise<unknown> | unknown): ToolExecutor {\n return async ({ arguments: args }) => {\n const parsedArgs = args ?? {};\n try {\n const result = await customExecutor(parsedArgs);\n return result as ToolExecutorResult;\n } catch (error) {\n throw new Error(`Codex tool '${toolName}' failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n","import type { StreamEvent } from \"./types\";\n\ntype UsageObject = {\n inputTokensDetails?: Array<Record<string, number>>;\n outputTokensDetails?: Array<Record<string, number>>;\n requests?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\ntype ModelEvent = {\n type?: string;\n delta?: string;\n reasoning?: string;\n error?: { message?: string };\n name?: string;\n input?: unknown;\n output?: unknown;\n status?: string;\n};\n\nexport type ToolCallEvent = {\n name?: string;\n input?: unknown;\n output?: unknown;\n status?: \"started\" | \"completed\";\n};\n\nexport type FormattedStream = {\n text: string;\n reasoning: string;\n toolCalls: ToolCallEvent[];\n usage?: {\n requests?: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n inputTokensDetails?: Record<string, number>;\n outputTokensDetails?: Record<string, number>;\n };\n /**\n * Convenience field when providers report cached tokens (e.g. via inputTokensDetails.cachedTokens)\n */\n cachedTokens?: number;\n responseId?: string;\n /**\n * Raw provider-specific data (e.g., costs, cache hit ratios, rate limit info)\n */\n providerData?: Record<string, unknown>;\n errors: { message: string }[];\n};\n\nexport type FormatStreamOptions = {\n onUpdate?: (partial: Partial<FormattedStream>) => void;\n};\n\n/**\n * Consume a stream of StreamEvent and aggregate into a coherent object:\n * - Concatenates output_text deltas into `text`\n * - Concatenates reasoning deltas into `reasoning`\n * - Captures usage and responseId on response_done\n * - Prepares space for tool call events (future-friendly; empty for now)\n *\n * Optionally invokes `onUpdate` with partial snapshots as data arrives.\n */\nexport async function formatStream(\n stream: AsyncIterable<StreamEvent>,\n options: FormatStreamOptions = {},\n): Promise<FormattedStream> {\n const state: FormattedStream = {\n text: \"\",\n reasoning: \"\",\n toolCalls: [],\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n errors: [],\n };\n\n for await (const event of stream) {\n switch (event.type) {\n case \"response_started\":\n // emit initial usage snapshot\n options.onUpdate?.({ usage: state.usage });\n break;\n case \"output_text_delta\":\n state.text += event.delta;\n options.onUpdate?.({ text: state.text });\n break;\n case \"model\": {\n const e = (event as { event?: unknown }).event as ModelEvent;\n if (e && typeof e === \"object\") {\n if (e.type === \"reasoning_delta\" && typeof e.delta === \"string\") {\n state.reasoning += e.delta;\n options.onUpdate?.({ reasoning: state.reasoning });\n } else if (e.type === \"reasoning_done\" && typeof e.reasoning === \"string\") {\n // Ensure final reasoning is reflected (prefer completed text if provided)\n state.reasoning = e.reasoning || state.reasoning;\n options.onUpdate?.({ reasoning: state.reasoning });\n } else if (e.type === \"error\" && e.error && typeof e.error.message === \"string\") {\n state.errors.push({ message: e.error.message });\n options.onUpdate?.({ errors: state.errors.slice() });\n } else if (typeof e.type === \"string\" && e.type.startsWith(\"tool_\")) {\n // Future-friendly hook for tool events if surfaced via \"model\" channel\n state.toolCalls.push({\n name: e.name,\n input: e.input,\n output: e.output,\n status: e.status === \"started\" || e.status === \"completed\" ? e.status : undefined,\n });\n options.onUpdate?.({ toolCalls: state.toolCalls.slice() });\n }\n }\n break;\n }\n case \"response_done\":\n state.responseId = event.response.id;\n // Normalize usage into a plain object and compute cachedTokens if present\n {\n const u = event.response.usage as UsageObject;\n // Merge details arrays (agents-core uses arrays for details)\n const mergeDetails = (arr?: Array<Record<string, number>>): Record<string, number> | undefined => {\n if (!arr || arr.length === 0) return undefined;\n const out: Record<string, number> = {};\n for (const rec of arr) {\n for (const [k, v] of Object.entries(rec)) {\n out[k] = (out[k] ?? 0) + (typeof v === \"number\" ? v : 0);\n }\n }\n return out;\n };\n const inputDetails = mergeDetails(u.inputTokensDetails);\n const outputDetails = mergeDetails(u.outputTokensDetails);\n state.usage = {\n requests: u.requests,\n inputTokens: u.inputTokens ?? 0,\n outputTokens: u.outputTokens ?? 0,\n totalTokens: u.totalTokens ?? 0,\n inputTokensDetails: inputDetails,\n outputTokensDetails: outputDetails,\n };\n state.cachedTokens = inputDetails?.cachedTokens ?? state.cachedTokens;\n }\n // Provider-specific data passthrough (may include cost, cache stats, etc.)\n if (event.response.providerData && typeof event.response.providerData === \"object\") {\n state.providerData = event.response.providerData as Record<string, unknown>;\n options.onUpdate?.({ providerData: state.providerData });\n }\n options.onUpdate?.({ responseId: state.responseId, usage: state.usage, cachedTokens: state.cachedTokens });\n break;\n default:\n // ignore unknown events\n break;\n }\n }\n\n return state;\n}\n\n\n","import type {\n Event as OpencodeEvent,\n OpencodeClient,\n Permission,\n Session,\n SessionPromptResponses,\n} from \"@opencode-ai/sdk\";\nimport type { Usage } from \"../events\";\nimport net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\n\nexport type PermissionDecision = boolean | \"once\" | \"always\" | \"reject\" | { response: \"once\" | \"always\" | \"reject\" };\n\nconst DEFAULT_MODEL = \"anthropic/claude-sonnet-4-5-20250929\";\nconst DEFAULT_HOSTNAME = \"127.0.0.1\";\nconst DEFAULT_PORT = 4096;\n\ntype OpencodeModule = typeof import(\"@opencode-ai/sdk\");\n\nlet opencodeModulePromise: Promise<OpencodeModule> | null = null;\n\nasync function loadOpencodeModule(): Promise<OpencodeModule> {\n if (!opencodeModulePromise) {\n opencodeModulePromise = import(\"@opencode-ai/sdk\");\n }\n return opencodeModulePromise;\n}\n\nasync function isPortAvailable(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const tester = net.createServer()\n .once(\"error\", () => resolve(false))\n .once(\"listening\", () => tester.close(() => resolve(true)))\n .listen(port, host);\n });\n}\n\nasync function findAvailablePort(host: string, preferred?: number): Promise<number> {\n if (preferred !== undefined && (await isPortAvailable(preferred, host))) {\n return preferred;\n }\n\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => reject(new Error(\"Failed to determine available port\")));\n return;\n }\n const { port } = address as AddressInfo;\n server.close(() => resolve(port));\n });\n });\n}\n\nexport interface PermissionRequest {\n id: string;\n type: string;\n title: string;\n sessionId: string;\n metadata: Record<string, unknown>;\n pattern?: string | string[];\n}\n\nexport interface OpenCodeAgentOptions {\n /** Fully qualified base URL for an existing opencode server. When omitted the agent will start its own server. */\n baseUrl?: string;\n /** Hostname passed to `createOpencode` when auto-starting the server. */\n hostname?: string;\n /** Port passed to `createOpencode` when auto-starting the server. */\n port?: number;\n /** Additional configuration forwarded to `createOpencode`. */\n config?: Record<string, unknown>;\n /** Preferred model string in the form `provider/model`. */\n model?: string;\n /** Directory the OpenCode session should operate within. Defaults to the current working directory. */\n workingDirectory?: string;\n /** Optional user-friendly session title. */\n title?: string;\n /** Callback invoked whenever opencode asks for a permission decision. */\n onApprovalRequest?: (request: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n /** Override for tests – returns a hydrated opencode client. */\n clientFactory?: () => Promise<{ client: OpencodeClient; close?: () => void }>;\n}\n\nexport interface DelegationResult {\n sessionId: string;\n /** Deprecated alias retained for backwards compatibility. */\n threadId?: string;\n output: string;\n success: boolean;\n error?: string;\n usage?: Usage | null;\n}\n\ntype PromptResponse = SessionPromptResponses[keyof SessionPromptResponses];\n\nexport class OpenCodeAgent {\n private readonly options: OpenCodeAgentOptions;\n private readonly approvalHandler?: (request: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n private clientPromise?: Promise<OpencodeClient>;\n private closeCallback?: () => void;\n\n constructor(options: OpenCodeAgentOptions = {}) {\n this.options = options;\n this.approvalHandler = options.onApprovalRequest;\n }\n\n /**\n * Cleanup method to shut down the OpenCode server if one was started.\n * Should be called when done using the agent to prevent zombie processes.\n */\n async close(): Promise<void> {\n if (this.closeCallback) {\n this.closeCallback();\n this.closeCallback = undefined;\n }\n }\n\n async delegate(task: string): Promise<DelegationResult> {\n return this.executeTask(task);\n }\n\n async delegateStreaming(task: string, onEvent?: (event: OpencodeEvent) => void, sessionId?: string): Promise<DelegationResult> {\n return this.executeTask(task, { sessionId, onEvent });\n }\n\n async resume(sessionId: string, task: string): Promise<DelegationResult> {\n return this.executeTask(task, { sessionId });\n }\n\n async workflow(steps: string[]): Promise<DelegationResult[]> {\n const results: DelegationResult[] = [];\n let sessionId: string | undefined;\n\n for (const step of steps) {\n const result = await this.executeTask(step, { sessionId });\n results.push(result);\n if (!result.success) {\n break;\n }\n sessionId = result.sessionId;\n }\n\n return results;\n }\n\n private async executeTask(prompt: string, options?: { sessionId?: string; onEvent?: (event: OpencodeEvent) => void }): Promise<DelegationResult> {\n let sessionId = options?.sessionId;\n try {\n const client = await this.ensureClient();\n sessionId = await this.ensureSession(client, sessionId, prompt);\n\n const shouldStream = Boolean(this.approvalHandler || options?.onEvent);\n const controller = new AbortController();\n const watcher = shouldStream\n ? this.watchEvents(client, sessionId, options?.onEvent, controller.signal).catch((error) => {\n if (!controller.signal.aborted) {\n throw error;\n }\n })\n : null;\n\n try {\n const promptBody: NonNullable<Parameters<OpencodeClient[\"session\"][\"prompt\"]>[0]>[\"body\"] = {\n parts: [{ type: \"text\", text: prompt }],\n };\n\n const parsedModel = this.parseModel(this.options.model ?? DEFAULT_MODEL);\n if (parsedModel) {\n promptBody.model = parsedModel;\n }\n\n const response = await client.session.prompt({\n path: { id: sessionId },\n body: promptBody,\n query: { directory: this.getWorkingDirectory() },\n });\n\n const data = this.extractData<PromptResponse>(response);\n return {\n sessionId,\n threadId: sessionId,\n output: this.collectText(data),\n success: true,\n usage: this.toUsage(data),\n };\n } finally {\n if (watcher) {\n controller.abort();\n await watcher;\n }\n }\n } catch (error) {\n return {\n sessionId: sessionId ?? \"\",\n threadId: sessionId,\n output: \"\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private async ensureClient(): Promise<OpencodeClient> {\n if (this.clientPromise) {\n return this.clientPromise;\n }\n\n if (this.options.clientFactory) {\n this.clientPromise = this.options.clientFactory().then(({ client }) => client);\n return this.clientPromise;\n }\n\n if (this.options.baseUrl) {\n this.clientPromise = loadOpencodeModule().then(({ createOpencodeClient }) =>\n createOpencodeClient({\n baseUrl: this.options.baseUrl!,\n }),\n );\n return this.clientPromise;\n }\n\n this.clientPromise = loadOpencodeModule().then(async ({ createOpencode }) => {\n const hostname = this.options.hostname ?? DEFAULT_HOSTNAME;\n const port = await findAvailablePort(hostname, this.options.port ?? DEFAULT_PORT);\n const { client, server } = await createOpencode({ hostname, port, config: this.options.config });\n this.closeCallback = () => server.close();\n return client;\n });\n\n return this.clientPromise;\n }\n\n private async ensureSession(client: OpencodeClient, existingId: string | undefined, prompt: string): Promise<string> {\n if (existingId) {\n return existingId;\n }\n\n const result = await client.session.create({\n body: {\n title: this.options.title ?? this.createSessionTitle(prompt),\n },\n query: { directory: this.getWorkingDirectory() },\n });\n\n const session = this.extractData<Session>(result);\n return session.id;\n }\n\n private createSessionTitle(prompt: string): string {\n const [firstLineRaw = \"\"] = prompt.trim().split(/\\r?\\n/);\n const firstLine = firstLineRaw || \"OpenCode Session\";\n return firstLine.length > 60 ? `${firstLine.slice(0, 57)}...` : firstLine;\n }\n\n private parseModel(model?: string): { providerID: string; modelID: string } | undefined {\n if (!model) {\n return undefined;\n }\n\n if (model.includes(\"/\")) {\n const [providerPart, modelPart] = model.split(\"/\", 2);\n const providerID = providerPart || \"anthropic\";\n const modelID = modelPart || providerPart || model;\n return { providerID, modelID };\n }\n\n return { providerID: \"anthropic\", modelID: model };\n }\n\n private collectText(response: PromptResponse): string {\n const texts = response.parts?.filter((part) => part.type === \"text\") ?? [];\n return texts.map((part) => part.text).join(\"\\n\").trim();\n }\n\n private toUsage(response: PromptResponse): Usage | null {\n const tokens = response.info?.tokens;\n if (!tokens) {\n return null;\n }\n\n return {\n input_tokens: tokens.input ?? 0,\n output_tokens: tokens.output ?? 0,\n cached_input_tokens: tokens.cache?.read ?? 0,\n };\n }\n\n private extractData<T>(result: unknown): T {\n if (result && typeof result === \"object\" && \"data\" in result) {\n const record = result as { data?: T; error?: unknown };\n if (record.data !== undefined) {\n return record.data;\n }\n\n throw new Error(this.describeError(record.error));\n }\n\n return result as T;\n }\n\n private describeError(error: unknown): string {\n if (!error) {\n return \"Unknown OpenCode error\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"object\" && \"message\" in error && typeof (error as any).message === \"string\") {\n return (error as any).message;\n }\n\n return JSON.stringify(error);\n }\n\n private async watchEvents(\n client: OpencodeClient,\n sessionId: string,\n onEvent: ((event: OpencodeEvent) => void) | undefined,\n signal: AbortSignal,\n ): Promise<void> {\n const { stream } = await client.event.subscribe({\n signal,\n query: { directory: this.getWorkingDirectory() },\n });\n const handledPermissions = new Set<string>();\n\n for await (const event of stream) {\n if (signal.aborted) {\n break;\n }\n\n const targetSessionId = this.extractSessionId(event);\n if (this.approvalHandler && event.type === \"permission.updated\") {\n const permission = event.properties as Permission;\n if (permission.sessionID === sessionId && !handledPermissions.has(permission.id)) {\n handledPermissions.add(permission.id);\n await this.respondToPermission(client, permission);\n }\n }\n\n if (onEvent && targetSessionId === sessionId) {\n onEvent(event);\n }\n }\n }\n\n private extractSessionId(event: OpencodeEvent): string | undefined {\n const properties: Record<string, unknown> | undefined = (event as any).properties;\n if (!properties) {\n return undefined;\n }\n\n if (typeof properties.sessionID === \"string\") {\n return properties.sessionID;\n }\n\n if (typeof properties.info === \"object\" && properties.info !== null && \"sessionID\" in (properties.info as Record<string, unknown>)) {\n const value = (properties.info as Record<string, unknown>).sessionID;\n return typeof value === \"string\" ? value : undefined;\n }\n\n return undefined;\n }\n\n private async respondToPermission(client: OpencodeClient, permission: Permission): Promise<void> {\n if (!this.approvalHandler) {\n return;\n }\n\n const decision = await this.approvalHandler({\n id: permission.id,\n type: permission.type,\n title: permission.title,\n sessionId: permission.sessionID,\n metadata: (permission.metadata ?? {}) as Record<string, unknown>,\n pattern: Array.isArray(permission.pattern) ? permission.pattern.slice() : permission.pattern,\n });\n\n const response = this.normalizeDecision(decision);\n await client.postSessionIdPermissionsPermissionId({\n path: {\n id: permission.sessionID,\n permissionID: permission.id,\n },\n body: { response },\n });\n }\n\n private normalizeDecision(decision: PermissionDecision): \"once\" | \"always\" | \"reject\" {\n if (typeof decision === \"boolean\") {\n return decision ? \"once\" : \"reject\";\n }\n\n if (typeof decision === \"string\") {\n return decision;\n }\n\n return decision.response;\n }\n\n private getWorkingDirectory(): string {\n return this.options.workingDirectory ?? process.cwd();\n }\n}\n","import { getNativeBinding } from \"./nativeBinding\";\n\n// Types reflect the Rust JSON (snake_case) to avoid extra transforms.\nexport type CloudTaskStatus = \"pending\" | \"ready\" | \"applied\" | \"error\";\n\nexport type DiffSummary = {\n files_changed: number;\n lines_added: number;\n lines_removed: number;\n};\n\nexport type CloudTaskSummary = {\n id: string; // serde transparent TaskId\n title: string;\n status: CloudTaskStatus;\n updated_at: string; // ISO timestamp\n environment_id?: string | null;\n environment_label?: string | null;\n summary: DiffSummary;\n is_review?: boolean;\n attempt_total?: number | null;\n};\n\nexport type CloudApplyStatus = \"success\" | \"partial\" | \"error\";\n\nexport type CloudApplyOutcome = {\n applied: boolean;\n status: CloudApplyStatus;\n message: string;\n skipped_paths: string[];\n conflict_paths: string[];\n};\n\nexport type CloudTaskCreateResult = {\n id: string;\n};\n\nexport type CloudTasksOptions = {\n baseUrl?: string;\n apiKey?: string;\n};\n\nexport class CloudTasks {\n constructor(private readonly options: CloudTasksOptions = {}) {}\n\n private binding() {\n const b = getNativeBinding();\n if (!b) throw new Error(\"Native binding not available\");\n return b;\n }\n\n async list(env?: string): Promise<CloudTaskSummary[]> {\n const b = this.binding();\n if (!b.cloudTasksList) throw new Error(\"cloudTasksList is not available in this build\");\n const json = await b.cloudTasksList(env, this.options.baseUrl, this.options.apiKey);\n return JSON.parse(json) as CloudTaskSummary[];\n }\n\n async getDiff(taskId: string): Promise<string | null> {\n const b = this.binding();\n if (!b.cloudTasksGetDiff) throw new Error(\"cloudTasksGetDiff is not available in this build\");\n const json = await b.cloudTasksGetDiff(taskId, this.options.baseUrl, this.options.apiKey);\n const parsed = JSON.parse(json) as { diff: string | null };\n return parsed.diff ?? null;\n }\n\n async applyPreflight(taskId: string, diffOverride?: string): Promise<CloudApplyOutcome> {\n const b = this.binding();\n if (!b.cloudTasksApplyPreflight) {\n throw new Error(\"cloudTasksApplyPreflight is not available in this build\");\n }\n const json = await b.cloudTasksApplyPreflight(\n taskId,\n diffOverride,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudApplyOutcome;\n }\n\n async apply(taskId: string, diffOverride?: string): Promise<CloudApplyOutcome> {\n const b = this.binding();\n if (!b.cloudTasksApply) throw new Error(\"cloudTasksApply is not available in this build\");\n const json = await b.cloudTasksApply(\n taskId,\n diffOverride,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudApplyOutcome;\n }\n\n async create(\n envId: string,\n prompt: string,\n opts?: { gitRef?: string; qaMode?: boolean; bestOfN?: number },\n ): Promise<CloudTaskCreateResult> {\n const b = this.binding();\n if (!b.cloudTasksCreate) throw new Error(\"cloudTasksCreate is not available in this build\");\n const json = await b.cloudTasksCreate(\n envId,\n prompt,\n opts?.gitRef,\n opts?.qaMode,\n opts?.bestOfN,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudTaskCreateResult;\n }\n}\n\n\n","import type { Usage } from \"../events\";\n\n/**\n * Log level enumeration\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4,\n}\n\n/**\n * Log scopes for different subsystems\n */\nexport type LogScope =\n | \"thread\"\n | \"merge\"\n | \"git\"\n | \"coordinator\"\n | \"worker\"\n | \"supervisor\"\n | \"reviewer\"\n | \"validation\"\n | \"lsp\"\n | \"agent\"\n | \"provider\"\n | \"ci\"\n | \"test\"\n | \"system\";\n\n/**\n * Configuration for logger instances\n */\nexport interface LoggerConfig {\n /** Minimum log level to output */\n level?: LogLevel;\n /** Enable colored output (default: true for TTY) */\n colors?: boolean;\n /** Include timestamps in output (default: false) */\n timestamps?: boolean;\n /** Prefix for all log messages */\n prefix?: string;\n /** Enable structured JSON output instead of formatted text */\n json?: boolean;\n /** Custom output stream (default: console) */\n output?: LogOutput;\n}\n\n/**\n * Output interface for log messages\n */\nexport interface LogOutput {\n debug(message: string): void;\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\n/**\n * Thread logging sink interface\n */\nexport interface ThreadLoggingSink {\n info(message: string): void;\n warn(message: string): void;\n recordUsage?(usage: Usage): void;\n}\n\n/**\n * Structured log entry for JSON output\n */\nexport interface LogEntry {\n timestamp: string;\n level: string;\n scope?: string;\n subject?: string;\n message: string;\n data?: Record<string, unknown>;\n}\n","import type { LogLevel, LogScope, LoggerConfig, LogOutput, LogEntry, ThreadLoggingSink } from \"./types\";\nimport { LogLevel as Level } from \"./types\";\n\n/**\n * ANSI color codes for different log levels and scopes\n */\nconst COLORS = {\n reset: \"\\x1b[0m\",\n // Log levels\n debug: \"\\x1b[90m\", // Gray\n info: \"\\x1b[36m\", // Cyan\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n // Scopes\n thread: \"\\x1b[94m\", // Bright blue\n merge: \"\\x1b[35m\", // Magenta\n git: \"\\x1b[34m\", // Blue\n coordinator: \"\\x1b[36m\", // Cyan\n worker: \"\\x1b[33m\", // Yellow\n supervisor: \"\\x1b[95m\", // Bright magenta\n reviewer: \"\\x1b[32m\", // Green\n validation: \"\\x1b[92m\", // Bright green\n lsp: \"\\x1b[96m\", // Bright cyan\n agent: \"\\x1b[93m\", // Bright yellow\n provider: \"\\x1b[91m\", // Bright red\n ci: \"\\x1b[35m\", // Magenta\n test: \"\\x1b[32m\", // Green\n system: \"\\x1b[37m\", // White\n};\n\n/**\n * Default console output\n */\nconst consoleOutput: LogOutput = {\n debug: (msg) => console.debug(msg),\n info: (msg) => console.log(msg),\n warn: (msg) => console.warn(msg),\n error: (msg) => console.error(msg),\n};\n\n/**\n * Centralized logger with support for scopes, levels, and structured output\n */\nexport class Logger {\n private level: LogLevel;\n private colors: boolean;\n private timestamps: boolean;\n private prefix: string;\n private json: boolean;\n private output: LogOutput;\n\n constructor(config: LoggerConfig = {}) {\n this.level = config.level ?? Level.INFO;\n this.colors = config.colors ?? (typeof process !== \"undefined\" && process.stdout?.isTTY === true);\n this.timestamps = config.timestamps ?? false;\n this.prefix = config.prefix ?? \"\";\n this.json = config.json ?? false;\n this.output = config.output ?? consoleOutput;\n }\n\n /**\n * Create a new logger with modified configuration\n */\n configure(config: Partial<LoggerConfig>): Logger {\n return new Logger({\n level: config.level ?? this.level,\n colors: config.colors ?? this.colors,\n timestamps: config.timestamps ?? this.timestamps,\n prefix: config.prefix ?? this.prefix,\n json: config.json ?? this.json,\n output: config.output ?? this.output,\n });\n }\n\n /**\n * Create a scoped logger\n */\n scope(scope: LogScope, subject?: string): ScopedLogger {\n return new ScopedLogger(this, scope, subject);\n }\n\n /**\n * Log a debug message\n */\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(Level.DEBUG, message, data);\n }\n\n /**\n * Log an info message\n */\n info(message: string, data?: Record<string, unknown>): void {\n this.log(Level.INFO, message, data);\n }\n\n /**\n * Log a warning message\n */\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(Level.WARN, message, data);\n }\n\n /**\n * Log an error message\n */\n error(message: string, data?: Record<string, unknown>): void {\n this.log(Level.ERROR, message, data);\n }\n\n /**\n * Internal log method\n */\n private log(level: LogLevel, message: string, data?: Record<string, unknown>, scope?: LogScope, subject?: string): void {\n if (level < this.level) {\n return;\n }\n\n if (this.json) {\n this.logJson(level, message, data, scope, subject);\n } else {\n this.logFormatted(level, message, scope, subject);\n }\n }\n\n /**\n * Log in JSON format\n */\n private logJson(level: LogLevel, message: string, data?: Record<string, unknown>, scope?: LogScope, subject?: string): void {\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: Level[level],\n message,\n ...(scope && { scope }),\n ...(subject && { subject }),\n ...(data && { data }),\n };\n\n const output = JSON.stringify(entry);\n this.output.info(output);\n }\n\n /**\n * Log in formatted text\n */\n private logFormatted(level: LogLevel, message: string, scope?: LogScope, subject?: string): void {\n const parts: string[] = [];\n\n // Timestamp\n if (this.timestamps) {\n const ts = new Date().toISOString();\n parts.push(this.colors ? `\\x1b[90m[${ts}]\\x1b[0m` : `[${ts}]`);\n }\n\n // Level\n const levelName = Level[level];\n if (this.colors) {\n const color = COLORS[levelName.toLowerCase() as keyof typeof COLORS] ?? COLORS.reset;\n parts.push(`${color}[${levelName}]${COLORS.reset}`);\n } else {\n parts.push(`[${levelName}]`);\n }\n\n // Scope and subject\n if (scope) {\n const label = subject ? `${scope}:${subject}` : scope;\n if (this.colors) {\n const color = COLORS[scope] ?? COLORS.reset;\n parts.push(`${color}[${label}]${COLORS.reset}`);\n } else {\n parts.push(`[${label}]`);\n }\n }\n\n // Prefix\n if (this.prefix) {\n parts.push(this.prefix);\n }\n\n // Message\n parts.push(message);\n\n const formatted = parts.join(\" \");\n\n // Output based on level\n switch (level) {\n case Level.DEBUG:\n this.output.debug(formatted);\n break;\n case Level.INFO:\n this.output.info(formatted);\n break;\n case Level.WARN:\n this.output.warn(formatted);\n break;\n case Level.ERROR:\n this.output.error(formatted);\n break;\n }\n }\n\n /**\n * Internal scoped log method (used by ScopedLogger)\n */\n logScoped(level: LogLevel, message: string, scope: LogScope, subject?: string, data?: Record<string, unknown>): void {\n this.log(level, message, data, scope, subject);\n }\n}\n\n/**\n * Scoped logger for a specific subsystem\n */\nexport class ScopedLogger {\n constructor(\n private logger: Logger,\n private scope: LogScope,\n private subject?: string,\n ) {}\n\n /**\n * Log a debug message\n */\n debug(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.DEBUG, message, this.scope, this.subject, data);\n }\n\n /**\n * Log an info message\n */\n info(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.INFO, message, this.scope, this.subject, data);\n }\n\n /**\n * Log a warning message\n */\n warn(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.WARN, message, this.scope, this.subject, data);\n }\n\n /**\n * Log an error message\n */\n error(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.ERROR, message, this.scope, this.subject, data);\n }\n\n /**\n * Create a ThreadLoggingSink adapter\n */\n asThreadSink(): ThreadLoggingSink {\n return {\n info: (message: string) => this.info(message),\n warn: (message: string) => this.warn(message),\n };\n }\n}\n\n/**\n * Global default logger instance\n */\nexport const logger = new Logger({\n level: process.env.CODEX_LOG_LEVEL\n ? (Level[process.env.CODEX_LOG_LEVEL as keyof typeof Level] ?? Level.INFO)\n : Level.INFO,\n colors: process.env.CODEX_LOG_COLORS !== \"false\",\n timestamps: process.env.CODEX_LOG_TIMESTAMPS === \"true\",\n json: process.env.CODEX_LOG_JSON === \"true\",\n});\n","import type { Thread } from \"../thread\";\nimport type { ThreadEvent } from \"../events\";\nimport type { ThreadItem } from \"../items\";\nimport type { TurnOptions } from \"../turnOptions\";\nimport type { Usage } from \"../events\";\nimport type { ThreadLoggingSink } from \"./types\";\nimport type { ScopedLogger } from \"./logger\";\n\nconst THREAD_EVENT_TEXT_LIMIT = 400;\n\n/**\n * Create a thread logging sink from a scoped logger\n */\nexport function createThreadLogger(scopedLogger: ScopedLogger, onUsage?: (usage: Usage) => void): ThreadLoggingSink {\n return {\n info: (message: string) => scopedLogger.info(message),\n warn: (message: string) => scopedLogger.warn(message),\n recordUsage: onUsage,\n };\n}\n\n/**\n * Run a thread turn with automatic event logging\n */\nexport async function runThreadTurnWithLogs(\n thread: Thread,\n sink: ThreadLoggingSink,\n prompt: string,\n turnOptions?: TurnOptions,\n) {\n const unsubscribe = thread.onEvent((event) => logThreadEvent(event, sink));\n try {\n if (turnOptions) {\n return await thread.run(prompt, turnOptions);\n }\n return await thread.run(prompt);\n } finally {\n unsubscribe();\n }\n}\n\n/**\n * Log a thread event to a sink\n */\nfunction logThreadEvent(event: ThreadEvent, sink: ThreadLoggingSink): void {\n switch (event.type) {\n case \"thread.started\":\n sink.info(`Thread started (id: ${event.thread_id})`);\n return;\n case \"turn.started\":\n sink.info(\"Turn started\");\n return;\n case \"turn.completed\":\n sink.info(\n `Turn completed (input ${event.usage.input_tokens}, cached ${event.usage.cached_input_tokens}, output ${event.usage.output_tokens})`,\n );\n if (\"recordUsage\" in sink && sink.recordUsage) {\n sink.recordUsage(event.usage);\n }\n return;\n case \"turn.failed\":\n sink.warn(`Turn failed: ${event.error.message}`);\n return;\n case \"item.started\":\n sink.info(`Item started: ${describeThreadItemForLog(event.item)}`);\n return;\n case \"item.updated\":\n sink.info(`Item updated: ${describeThreadItemForLog(event.item)}`);\n return;\n case \"item.completed\": {\n const message = `Item completed: ${describeThreadItemForLog(event.item)}`;\n if (event.item.type === \"error\") {\n sink.warn(message);\n } else {\n sink.info(message);\n }\n return;\n }\n case \"background_event\":\n sink.info(`Background: ${summarizeLogText(event.message)}`);\n return;\n case \"exited_review_mode\":\n sink.info(\"Exited review mode\");\n return;\n case \"error\":\n sink.warn(`Stream error: ${event.message}`);\n return;\n case \"raw_event\":\n return;\n default:\n return;\n }\n}\n\n/**\n * Describe a thread item for logging\n */\nfunction describeThreadItemForLog(item: ThreadItem): string {\n switch (item.type) {\n case \"agent_message\":\n return `agent message → ${summarizeLogText(item.text)}`;\n case \"reasoning\":\n return `reasoning → ${summarizeLogText(item.text)}`;\n case \"command_execution\": {\n const exit = item.exit_code !== undefined ? ` exit=${item.exit_code}` : \"\";\n return `command \"${summarizeLogText(item.command)}\" [${item.status}${exit}]`;\n }\n case \"file_change\": {\n const changeList = item.changes.map((change) => `${change.kind}:${change.path}`).join(\", \");\n return `file change [${item.status}] ${summarizeLogText(changeList)}`;\n }\n case \"mcp_tool_call\":\n return `mcp ${item.server}.${item.tool} [${item.status}]`;\n case \"web_search\":\n return `web search \"${summarizeLogText(item.query)}\"`;\n case \"todo_list\": {\n const completed = item.items.filter((todo) => todo.completed).length;\n return `todo list ${completed}/${item.items.length}`;\n }\n case \"error\":\n return `error → ${summarizeLogText(item.message)}`;\n default: {\n // Exhaustive check - this should never happen\n const _exhaustive: never = item;\n return \"unknown event\";\n }\n }\n}\n\n/**\n * Summarize text for logging (truncate if too long)\n */\nfunction summarizeLogText(text: string | undefined, limit = THREAD_EVENT_TEXT_LIMIT): string {\n if (!text) {\n return \"\";\n }\n const flattened = text.replace(/\\s+/g, \" \").trim();\n if (flattened.length <= limit) {\n return flattened;\n }\n return `${flattened.slice(0, limit)}…`;\n}\n","/**\n * Reverie System Constants\n *\n * Configuration constants for reverie search, filtering, and grading.\n * These values are tuned for optimal balance between result quality and performance.\n */\n\n/**\n * Default number of final reverie insights to return.\n * After all filtering and grading, this is the target result count.\n */\nexport const DEFAULT_REVERIE_LIMIT = 6;\n\n/**\n * Maximum number of candidate insights to fetch initially.\n * We fetch many candidates upfront and then filter aggressively.\n */\nexport const DEFAULT_REVERIE_MAX_CANDIDATES = 80;\n\n/**\n * Embedding model for semantic search.\n * Large model provides better semantic understanding at cost of memory/speed.\n */\nexport const REVERIE_EMBED_MODEL = \"BAAI/bge-large-en-v1.5\";\n\n/**\n * Reranker model for improving search precision.\n * Applied after initial embedding search to rerank top candidates.\n */\nexport const REVERIE_RERANKER_MODEL = \"rozgo/bge-reranker-v2-m3\";\n\n/**\n * Candidate multiplier for aggressive filtering.\n * Fetch 3x candidates since we'll filter heavily for quality.\n */\nexport const REVERIE_CANDIDATE_MULTIPLIER = 3;\n\n/**\n * Minimum relevance score threshold for LLM grading.\n * Only insights scoring >= 0.7 are sent for expensive LLM evaluation.\n * This optimizes API costs by skipping obvious low-quality candidates.\n */\nexport const REVERIE_LLM_GRADE_THRESHOLD = 0.7;\n\n/**\n * Default reranker top-k value.\n * Number of results to rerank after initial retrieval.\n */\nexport const DEFAULT_RERANKER_TOP_K = 20;\n\n/**\n * Default reranker batch size.\n * Number of candidates to process per reranker batch.\n */\nexport const DEFAULT_RERANKER_BATCH_SIZE = 8;\n","/**\n * Reverie Quality Utilities\n *\n * Provides filtering, deduplication, and quality assessment for reverie search results.\n * Ensures that only meaningful conversation excerpts are surfaced to agents and users.\n */\n\n/**\n * Represents a single reverie insight from past conversations.\n * This is a generic interface that can be extended with additional metadata.\n */\nexport interface ReverieInsight {\n /** Unique identifier for the conversation */\n conversationId: string;\n /** ISO timestamp of when the conversation occurred */\n timestamp: string;\n /** Relevance score from semantic search (0-1) */\n relevance: number;\n /** Text excerpt from the conversation */\n excerpt: string;\n /** Extracted insights or key points from the excerpt */\n insights: string[];\n}\n\n/**\n * Type alias for reverie results (used for logging compatibility).\n */\nexport type ReverieResult = ReverieInsight;\n\n/**\n * Statistics from the quality filtering pipeline.\n */\nexport interface QualityFilterStats {\n /** Number of insights before filtering */\n initial: number;\n /** Number after validity filtering */\n afterValidityFilter: number;\n /** Number after deduplication */\n afterDeduplication: number;\n /** Final number of insights */\n final: number;\n}\n\n/**\n * Validates whether a reverie excerpt contains meaningful content worth indexing.\n *\n * Filters out:\n * - Very short excerpts (< 20 chars)\n * - System prompts and boilerplate text\n * - Tool outputs and structured data\n * - Excerpts with excessive XML/HTML tags\n * - JSON objects and configuration snippets\n *\n * @param excerpt - The text excerpt to validate\n * @returns true if the excerpt contains meaningful content, false otherwise\n *\n * @example\n * ```typescript\n * const excerpt = \"Let's refactor the auth module to use async/await\";\n * isValidReverieExcerpt(excerpt); // true\n *\n * const systemPrompt = \"<INSTRUCTIONS>You are a coding assistant</INSTRUCTIONS>\";\n * isValidReverieExcerpt(systemPrompt); // false\n * ```\n */\nexport function isValidReverieExcerpt(excerpt: string): boolean {\n if (!excerpt || excerpt.trim().length < 20) {\n return false;\n }\n\n const trimmed = excerpt.trim();\n const normalized = trimmed.toLowerCase();\n const lines = trimmed.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n const rawTokens = trimmed.split(/\\s+/).filter(Boolean);\n const tokens = rawTokens.map((token) => token.toLowerCase());\n\n if (rawTokens.length === 0) {\n return false;\n }\n\n const uppercaseTokens = rawTokens.filter((token) => {\n const alphabetic = token.replace(/[^a-z]/gi, \"\");\n return alphabetic.length >= 3 && alphabetic === alphabetic.toUpperCase();\n });\n const uppercaseRatio = uppercaseTokens.length / rawTokens.length;\n\n const snakeTokens = rawTokens.filter((token) => token.includes(\"_\"));\n const underscoreRatio = snakeTokens.length / rawTokens.length;\n\n const headingLines = lines.filter((line) => /^#{1,6}\\s/.test(line));\n const bulletLines = lines.filter((line) => /^\\s*[\\-\\*]\\s/.test(line));\n const numericBulletLines = lines.filter((line) => /^\\s*\\d+[\\).]/.test(line));\n const colonLabelLines = lines.filter((line) => /^[A-Za-z0-9 _-]{1,24}:/.test(line));\n\n const headingRatio = headingLines.length / Math.max(lines.length, 1);\n const bulletRatio = bulletLines.length / Math.max(lines.length, 1);\n const colonLabelRatio = colonLabelLines.length / Math.max(lines.length, 1);\n const numericRatio = numericBulletLines.length / Math.max(lines.length, 1);\n const enumeratedRatio = (bulletLines.length + numericBulletLines.length) / Math.max(lines.length, 1);\n\n const initialTitleCaseRun = (() => {\n let run = 0;\n for (const token of rawTokens) {\n const cleaned = token.replace(/[^a-z]/gi, \"\");\n if (cleaned.length === 0) {\n break;\n }\n const rest = cleaned.slice(1);\n const isTitleCase = cleaned[0]?.toUpperCase() === cleaned[0] && rest === rest.toLowerCase();\n const isAllCaps = cleaned.length >= 2 && cleaned === cleaned.toUpperCase();\n if (isTitleCase || isAllCaps) {\n run += 1;\n } else {\n break;\n }\n }\n return run;\n })();\n\n const tokenFrequencies = tokens.reduce((map, token) => map.set(token, (map.get(token) ?? 0) + 1), new Map<string, number>());\n const frequencyValues = Array.from(tokenFrequencies.values());\n const mostCommonTokenCount = Math.max(...frequencyValues);\n const repeatedWordRatio = mostCommonTokenCount / tokens.length;\n\n if (snakeTokens.length >= 2 && underscoreRatio > 0.15) {\n return false;\n }\n\n if (headingRatio > 0.6 && lines.length <= 4) {\n return false;\n }\n\n if (initialTitleCaseRun >= 3 && rawTokens.length <= 20) {\n return false;\n }\n\n if (enumeratedRatio > 0.6 && lines.length >= 3) {\n return false;\n }\n\n const metadataScore = [\n uppercaseRatio > 0.45,\n underscoreRatio > 0.2,\n bulletRatio > 0.7,\n colonLabelRatio > 0.6 || (lines.length <= 2 && colonLabelRatio > 0),\n initialTitleCaseRun >= 3,\n repeatedWordRatio > 0.45 && tokens.length > 15,\n rawTokens.length < 12 && colonLabelRatio > 0,\n numericRatio > 0.5,\n ].filter(Boolean).length;\n\n if (metadataScore >= 2) {\n return false;\n }\n\n const tagMatches = trimmed.match(/<[^>]+>/g) || [];\n if (tagMatches.length > 3) {\n return false;\n }\n\n const blockTagMatch = trimmed.match(/^<([a-z0-9_\\-]+)>[\\s\\S]*<\\/\\1>$/i);\n if (blockTagMatch) {\n const tagName = blockTagMatch[1]?.toLowerCase() ?? \"\";\n const looksLikeSystem = tagName.includes(\"system\") || tagName.includes(\"context\") || tagName.includes(\"env\");\n if (tagName.includes(\"_\") || looksLikeSystem) {\n return false;\n }\n }\n\n if (/\\(\\d{2,3}%\\)\\s*$/.test(trimmed)) {\n return false;\n }\n\n const looksJsonLike = (/^\\{[\\s\\S]*\\}$/.test(trimmed) || /^\\[[\\s\\S]*\\]$/.test(trimmed)) && /\"\\w+\"\\s*:/.test(trimmed);\n if (looksJsonLike) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Removes duplicate or highly similar reverie insights based on content fingerprinting.\n *\n * CRITICAL FIX: Groups by fingerprint and keeps the insight with the HIGHEST relevance score.\n * Previous implementations incorrectly kept the first occurrence, which could discard\n * higher-quality duplicates found later in the list.\n *\n * Uses the first 100 characters of each excerpt (normalized) as a fingerprint\n * to identify duplicates. This prevents redundant insights from being shown\n * to the user while preserving the most relevant unique insights.\n *\n * @param insights - Array of reverie insights to deduplicate\n * @returns Deduplicated array of reverie insights, sorted by relevance (highest first)\n *\n * @example\n * ```typescript\n * const insights = [\n * { excerpt: \"We refactored the auth module...\", relevance: 0.7, ... },\n * { excerpt: \"We refactored the auth module to use async/await\", relevance: 0.9, ... },\n * { excerpt: \"Updated the database schema\", relevance: 0.8, ... }\n * ];\n *\n * const deduplicated = deduplicateReverieInsights(insights);\n * // Returns 2 insights: the higher-scoring auth one (0.9) and the database one (0.8)\n * ```\n */\nexport function deduplicateReverieInsights<T extends ReverieInsight>(insights: T[]): T[] {\n // Group insights by fingerprint, keeping the one with highest relevance\n const fingerprintMap = new Map<string, T>();\n\n for (const insight of insights) {\n // Create a fingerprint based on first 100 chars\n const fingerprint = insight.excerpt.slice(0, 100).toLowerCase().replace(/\\s+/g, \" \");\n\n const existing = fingerprintMap.get(fingerprint);\n if (!existing || insight.relevance > existing.relevance) {\n // Keep the insight with higher relevance\n fingerprintMap.set(fingerprint, insight);\n }\n }\n\n // Convert back to array and sort by relevance (highest first)\n return Array.from(fingerprintMap.values()).sort((a, b) => b.relevance - a.relevance);\n}\n\n/**\n * Applies the complete quality pipeline to reverie insights.\n *\n * Pipeline steps:\n * 1. Filter out invalid excerpts (system prompts, boilerplate, etc.)\n * 2. Deduplicate similar insights, keeping highest relevance\n * 3. Sort by relevance score (highest first)\n * 4. Limit to top N results\n *\n * @param insights - Raw reverie insights from search\n * @param limit - Maximum number of insights to return (default: 10)\n * @returns Filtered, deduplicated, and sorted insights with statistics\n *\n * @example\n * ```typescript\n * const rawInsights = await reverieSearchSemantic(codexHome, query, options);\n * const { insights, stats } = applyQualityPipeline(rawInsights, 5);\n *\n * console.log(`Filtered ${stats.initial} → ${stats.final} insights`);\n * insights.forEach(insight => {\n * console.log(`[${insight.relevance.toFixed(2)}] ${insight.excerpt.slice(0, 100)}`);\n * });\n * ```\n */\nexport function applyQualityPipeline<T extends ReverieInsight>(\n insights: T[],\n limit: number = 10\n): { insights: T[]; stats: QualityFilterStats } {\n const stats: QualityFilterStats = {\n initial: insights.length,\n afterValidityFilter: 0,\n afterDeduplication: 0,\n final: 0,\n };\n\n // Step 1: Filter out invalid excerpts\n const validInsights = insights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n stats.afterValidityFilter = validInsights.length;\n\n // Step 2: Deduplicate similar insights (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(validInsights);\n stats.afterDeduplication = deduplicated.length;\n\n // Step 3: Already sorted by relevance in deduplicateReverieInsights\n // Step 4: Limit to top N\n const final = deduplicated.slice(0, limit);\n stats.final = final.length;\n\n return { insights: final, stats };\n}\n","import { fastEmbedEmbed } from \"../nativeBinding.js\";\nimport type { ReverieInsight } from \"./types.js\";\n\ntype BoilerplateFilterOptions = {\n projectRoot?: string;\n threshold?: number;\n maxExcerptLength?: number;\n};\n\nconst DEFAULT_THRESHOLD = 0.8;\nconst DEFAULT_MAX_EXCERPT_LENGTH = 512;\n\nconst BOILERPLATE_SEEDS = [\n \"<system>Focus on summarizing repo context and keep instructions short.\",\n \"<environment_context>Working directory: /repo/codex sandbox_mode: workspace-write network_access: disabled</environment_context>\",\n \"# AGENTS.md instructions for this task require you to enumerate files before running commands.\",\n \"Tool output: command completed successfully with exit code 0.\",\n \"You are coordinating multiple agents. Respond with JSON describing the plan.\",\n \"Sandbox env vars: CODEX_SANDBOX=seatbelt CODEX_SANDBOX_NETWORK_DISABLED=1\",\n \"1. Inspect repository status; 2. List directories; 3. Review README/AGENTS instructions before acting.\",\n \"1. Inventory tooling - run `just --list` for recipes. 2. Verify Rust toolchain. 3. Read AGENTS.md for repo-specific guidance before editing.\",\n];\n\nlet seedVectorsPromise: Promise<number[][] | null> | null = null;\nlet embeddingDisabled = false;\n\nconst dot = (a: number[], b: number[]): number => a.reduce((sum, value, idx) => sum + value * (b[idx] ?? 0), 0);\n\nfunction truncateExcerpt(text: string, maxLength: number): string {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxLength) {\n return normalized;\n }\n return normalized.slice(0, maxLength);\n}\n\nasync function embedTexts(inputs: string[], projectRoot?: string): Promise<number[][] | null> {\n if (embeddingDisabled || inputs.length === 0) {\n return null;\n }\n\n try {\n const embeddings = await fastEmbedEmbed({\n inputs,\n projectRoot,\n normalize: true,\n });\n return embeddings;\n } catch (error) {\n embeddingDisabled = true;\n console.warn(`⚠️ Reverie boilerplate filter disabled (fastEmbedEmbed unavailable: ${(error as Error).message ?? error})`);\n return null;\n }\n}\n\nasync function getSeedVectors(projectRoot?: string): Promise<number[][] | null> {\n if (seedVectorsPromise) {\n return seedVectorsPromise;\n }\n seedVectorsPromise = embedTexts(BOILERPLATE_SEEDS, projectRoot);\n return seedVectorsPromise;\n}\n\nexport async function filterBoilerplateInsights(\n insights: ReverieInsight[],\n options?: BoilerplateFilterOptions,\n): Promise<{ kept: ReverieInsight[]; removed: number }> {\n if (insights.length === 0) {\n return { kept: [], removed: 0 };\n }\n\n const projectRoot = options?.projectRoot;\n const threshold = options?.threshold ?? DEFAULT_THRESHOLD;\n const maxExcerpt = options?.maxExcerptLength ?? DEFAULT_MAX_EXCERPT_LENGTH;\n\n const seeds = await getSeedVectors(projectRoot);\n if (!seeds || seeds.length === 0) {\n return { kept: insights, removed: 0 };\n }\n\n const excerptBatch = insights.map((insight) => truncateExcerpt(insight.excerpt, maxExcerpt));\n const excerptVectors = await embedTexts(excerptBatch, projectRoot);\n if (!excerptVectors) {\n return { kept: insights, removed: 0 };\n }\n\n const kept: ReverieInsight[] = [];\n let removed = 0;\n\n for (let i = 0; i < insights.length; i += 1) {\n const vector = excerptVectors[i];\n if (!vector) {\n kept.push(insights[i]!);\n continue;\n }\n\n const maxSimilarity = seeds.reduce((currentMax, seedVec) => {\n const similarity = dot(vector, seedVec);\n return similarity > currentMax ? similarity : currentMax;\n }, -Infinity);\n\n if (Number.isFinite(maxSimilarity) && maxSimilarity >= threshold) {\n removed += 1;\n } else {\n kept.push(insights[i]!);\n }\n }\n\n if (removed > 0) {\n console.log(`🧹 Reverie boilerplate filter removed ${removed}/${insights.length} excerpts (threshold ${threshold.toFixed(2)})`);\n }\n\n return { kept, removed };\n}\n","/**\n * Reverie logging utilities.\n * Provides transparent logging for reverie search and filtering operations.\n */\n\nimport type { ReverieResult } from \"./quality.js\";\nimport type { ReverieSearchLevel } from \"./types.js\";\nimport type { ReveriePipelineResult } from \"./pipeline.js\";\n\n/**\n * Logs reverie search operation details.\n *\n * @param query - The search query\n * @param context - Optional context about the search\n */\nexport function logReverieSearch(query: string, context?: string): void {\n const contextStr = context ? ` (${context})` : \"\";\n console.log(`🔍 Reverie search${contextStr}: \"${query}\"`);\n}\n\n/**\n * Logs reverie filtering pipeline statistics.\n *\n * @param stats - Filtering statistics\n */\nexport function logReverieFiltering(stats: {\n total: number;\n afterQuality: number;\n afterBoilerplate?: number;\n afterScore: number;\n afterDedup: number;\n minScore?: number;\n}): void {\n const { total, afterQuality, afterBoilerplate, afterScore, afterDedup, minScore = 0.7 } = stats;\n const qualityFiltered = total - afterQuality;\n const boilerplateStage = (afterBoilerplate ?? afterQuality);\n const boilerplateFiltered = afterQuality - boilerplateStage;\n const scoreFiltered = boilerplateStage - afterScore;\n const duplicatesFiltered = afterScore - afterDedup;\n\n console.log(\n `📊 Reverie filtering: ${total} raw → ${afterQuality} valid → ${boilerplateStage} conversational → ${afterScore} high-scoring (≥${minScore}) → ${afterDedup} unique` +\n ` (filtered: ${qualityFiltered} low-quality, ${boilerplateFiltered} boilerplate, ${scoreFiltered} low-score, ${duplicatesFiltered} duplicates)`\n );\n}\n\n/**\n * Logs top reverie insights for debugging.\n *\n * @param insights - Filtered reverie insights\n * @param limit - Maximum number of insights to log (default: 3)\n */\nexport function logReverieInsights(insights: ReverieResult[], limit: number = 3): void {\n if (insights.length === 0) {\n console.log(\"📭 No reverie insights found\");\n return;\n }\n\n console.log(`✨ Top ${Math.min(limit, insights.length)} reverie insights:`);\n const topInsights = insights.slice(0, limit);\n\n for (let i = 0; i < topInsights.length; i++) {\n const insight = topInsights[i];\n if (!insight) continue;\n const score = `${Math.round(insight.relevance * 100)}%`;\n const excerpt = truncate(insight.excerpt, 150);\n const insightText = insight.insights.length > 0 ? truncate(insight.insights[0] ?? \"\", 100) : \"\";\n\n console.log(` ${i + 1}. [${score}] ${excerpt}`);\n if (insightText) {\n console.log(` → ${insightText}`);\n }\n }\n}\n\n/**\n * Logs quality filtering statistics for hint collection.\n *\n * @param stats - Hint collection statistics\n */\nexport function logReverieHintQuality(stats: {\n totalRaw: number;\n afterQuality: number;\n afterDedup: number;\n}): void {\n const { totalRaw, afterQuality, afterDedup } = stats;\n const qualityFiltered = totalRaw - afterQuality;\n const duplicatesFiltered = afterQuality - afterDedup;\n\n if (totalRaw > 0) {\n console.log(\n `🪄 Reverie hint quality: ${totalRaw} raw → ${afterQuality} valid → ${afterDedup} unique ` +\n `(filtered ${qualityFiltered} low-quality, ${duplicatesFiltered} duplicates)`\n );\n }\n}\n\n/**\n * Logs LLM grading statistics showing approved vs rejected counts.\n *\n * @param stats - LLM grading statistics\n */\nexport function logLLMGrading(stats: {\n total: number;\n approved: number;\n rejected: number;\n minScore?: number;\n}): void {\n const { total, approved, rejected, minScore = 0.7 } = stats;\n const approvalRate = total > 0 ? Math.round((approved / total) * 100) : 0;\n\n console.log(\n `🤖 LLM grading: ${approved}/${total} approved (${approvalRate}%) ` +\n `[high-scoring ≥${minScore}, rejected ${rejected}]`\n );\n}\n\n/**\n * Logs approved reverie excerpts with relevance scores (verbose mode).\n *\n * @param insights - Approved reverie insights to log\n * @param maxToShow - Maximum number of insights to display (default: 5)\n */\nexport function logApprovedReveries(insights: ReverieResult[], maxToShow: number = 5): void {\n if (insights.length === 0) {\n console.log(\" No reveries passed LLM grading\");\n return;\n }\n\n console.log(` ${insights.length} reveries approved by LLM:`);\n const toShow = insights.slice(0, maxToShow);\n\n for (let i = 0; i < toShow.length; i++) {\n const insight = toShow[i];\n if (!insight) continue;\n const score = insight.relevance.toFixed(2);\n const preview = truncate(insight.excerpt.replace(/\\s+/g, \" \").trim(), 200);\n const insightText = insight.insights[0] || \"Context from past work\";\n\n console.log(` ${i + 1}. [${score}] ${insightText}`);\n console.log(` \"${preview}\"`);\n }\n\n if (insights.length > maxToShow) {\n console.log(` ... and ${insights.length - maxToShow} more`);\n }\n}\n\n/**\n * Truncates a string to a maximum length, adding ellipsis if needed.\n */\nfunction truncate(text: string, maxLength: number): string {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text;\n}\n\n/**\n * Exports truncateText for external use.\n */\nexport { truncate as truncateText };\n\n/**\n * Logs multi-level search initiation.\n *\n * @param levels - Array of search levels being executed\n *\n * @example\n * ```typescript\n * logMultiLevelSearch(['project', 'branch', 'file']);\n * // Output: \"🔍 Multi-level reverie search: project → branch → file\"\n * ```\n */\nexport function logMultiLevelSearch(levels: ReverieSearchLevel[]): void {\n if (levels.length === 0) {\n console.log(\"🔍 Multi-level reverie search: (no levels specified)\");\n return;\n }\n\n const levelIcons: Record<ReverieSearchLevel, string> = {\n project: '🌐',\n branch: '🌿',\n file: '📄',\n };\n\n const levelLabels = levels.map(level => `${levelIcons[level]} ${level}`).join(' → ');\n console.log(`🔍 Multi-level reverie search: ${levelLabels}`);\n}\n\n/**\n * Logs results for a specific search level.\n *\n * @param level - The search level\n * @param result - Pipeline result for this level\n *\n * @example\n * ```typescript\n * logLevelResults('project', {\n * insights: [...],\n * stats: { total: 50, final: 8, ... }\n * });\n * // Output: \" 🌐 Project level: 8 insights (50 → 8, 84% filtered)\"\n * ```\n */\nexport function logLevelResults(level: ReverieSearchLevel, result: ReveriePipelineResult): void {\n const levelIcons: Record<ReverieSearchLevel, string> = {\n project: '🌐',\n branch: '🌿',\n file: '📄',\n };\n\n const icon = levelIcons[level];\n const { stats, insights } = result;\n const filterRate = stats.total > 0\n ? Math.round(((stats.total - stats.final) / stats.total) * 100)\n : 0;\n\n const levelName = level.charAt(0).toUpperCase() + level.slice(1);\n console.log(\n ` ${icon} ${levelName} level: ${insights.length} insights ` +\n `(${stats.total} → ${stats.final}, ${filterRate}% filtered)`\n );\n\n // Log quality breakdown if verbose\n if (stats.total > 0) {\n const qualityFiltered = stats.total - stats.afterQuality;\n const scoreFiltered = stats.afterQuality - stats.afterScore;\n const dedupFiltered = stats.afterScore - (stats.afterDedup || stats.afterScore);\n\n if (qualityFiltered > 0 || scoreFiltered > 0 || dedupFiltered > 0) {\n console.log(\n ` ↳ Quality: -${qualityFiltered}, Score: -${scoreFiltered}, Dedup: -${dedupFiltered}`\n );\n }\n }\n}\n\n/**\n * Logs a summary of multi-level search results.\n *\n * @param results - Map of level to pipeline results\n *\n * @example\n * ```typescript\n * const results = new Map([\n * ['project', { insights: [...], stats: {...} }],\n * ['branch', { insights: [...], stats: {...} }],\n * ['file', { insights: [...], stats: {...} }]\n * ]);\n *\n * logMultiLevelSummary(results);\n * // Output summary of all levels with total counts\n * ```\n */\nexport function logMultiLevelSummary(\n results: Map<ReverieSearchLevel, ReveriePipelineResult>\n): void {\n const totalInsights = Array.from(results.values())\n .reduce((sum, result) => sum + result.insights.length, 0);\n\n const totalProcessed = Array.from(results.values())\n .reduce((sum, result) => sum + result.stats.total, 0);\n\n console.log(\n `\\n✨ Multi-level search complete: ${totalInsights} total insights ` +\n `(processed ${totalProcessed} candidates across ${results.size} levels)`\n );\n\n // Show breakdown by level\n const levelCounts: string[] = [];\n for (const [level, result] of results) {\n levelCounts.push(`${level}: ${result.insights.length}`);\n }\n console.log(` Breakdown: ${levelCounts.join(', ')}`);\n}\n","/**\n * Symbol Extraction for Reverie Search\n *\n * Extracts key code symbols from diffs to create more focused search queries.\n * This improves search precision by targeting specific functions, classes, and variables.\n */\n\n/**\n * Extracts key symbols and terms from a diff to make search queries more targeted.\n *\n * Focuses on:\n * - Function and class definitions\n * - Variable declarations (const, let, var)\n * - Exported symbols\n * - Interface and type definitions\n *\n * Avoids:\n * - Language keywords (true, false, null, etc.)\n * - Very short symbols (< 3 chars)\n * - Boilerplate patterns\n *\n * @param diff - Git diff content to extract symbols from\n * @returns Comma-separated string of top 5 symbols, or \"code changes\" if none found\n *\n * @example\n * ```typescript\n * const diff = `\n * +function processUser(user: User) {\n * + const userName = user.name;\n * + return userName;\n * +}\n * `;\n *\n * extractKeySymbols(diff); // \"processUser, userName\"\n * ```\n */\nexport function extractKeySymbols(diff: string): string {\n // Extract function/class names, avoiding boilerplate patterns\n const symbols = new Set<string>();\n\n // Match function/class definitions, variable declarations, exports, interfaces, types\n const functionMatch = diff.match(/(?:function|class|const|let|var|export|interface|type)\\s+(\\w+)/g);\n\n if (functionMatch) {\n for (const match of functionMatch) {\n const name = match.split(/\\s+/).pop();\n\n // Filter out keywords and very short symbols\n if (name && name.length > 2 && !name.match(/^(true|false|null|undefined|const|let|var)$/)) {\n symbols.add(name);\n }\n }\n }\n\n // If no symbols found, return a generic placeholder\n if (symbols.size === 0) {\n return \"code changes\";\n }\n\n // Return top 5 symbols as comma-separated string\n return Array.from(symbols).slice(0, 5).join(\", \");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { fastEmbedEmbed } from \"../nativeBinding.js\";\nimport type { ReverieEpisodeSummary } from \"./types.js\";\n\nconst EPISODES_FILENAME = \"reverie_episodes.json\";\n\nasync function readEpisodesFile(codexHome: string): Promise<ReverieEpisodeSummary[]> {\n try {\n const file = await fs.readFile(path.join(codexHome, EPISODES_FILENAME), \"utf8\");\n const parsed = JSON.parse(file);\n if (Array.isArray(parsed)) {\n return parsed as ReverieEpisodeSummary[];\n }\n return [];\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n}\n\nexport async function searchEpisodeSummaries(\n codexHome: string,\n query: string,\n repo: string,\n limit = 20,\n): Promise<ReverieEpisodeSummary[]> {\n const summaries = await readEpisodesFile(codexHome);\n if (!summaries.length || !query.trim()) {\n return [];\n }\n\n const documents = summaries.map((episode) =>\n [episode.summary, ...(episode.keyDecisions ?? [])].join(\"\\n\"),\n );\n const inputs = [query, ...documents];\n\n const embeddings = await fastEmbedEmbed({\n inputs,\n projectRoot: repo,\n normalize: true,\n cache: true,\n });\n\n if (embeddings.length !== inputs.length) {\n return [];\n }\n\n const [queryVector, ...docVectors] = embeddings;\n if (!queryVector) {\n return [];\n }\n const scored = summaries.map((episode, idx) => {\n const vector = docVectors[idx] ?? [];\n return {\n episode,\n score: cosineSimilarity(queryVector, vector),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored\n .slice(0, limit)\n .map(({ episode }) => episode);\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n const length = Math.min(a.length, b.length);\n if (length === 0) {\n return 0;\n }\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < length; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n magA += av * av;\n magB += bv * bv;\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB);\n return denom === 0 ? 0 : dot / denom;\n}\n","/**\n * Advanced Reverie Search\n *\n * Provides semantic search over past conversation history with sophisticated filtering:\n * - 3x candidate multiplier for aggressive filtering\n * - Reranker support for improved precision\n * - Multi-stage filtering with transparent logging\n * - Quality and deduplication pipelines\n */\n\nimport { reverieSearchSemantic, reverieSearchConversations } from \"../nativeBinding.js\";\nimport type { ReverieSemanticSearchOptions, ReverieSearchResult } from \"../nativeBinding.js\";\nimport type { ReverieInsight, ReverieSearchOptions } from \"./types.js\";\nimport { isValidReverieExcerpt, deduplicateReverieInsights } from \"./quality.js\";\nimport { filterBoilerplateInsights } from \"./boilerplate.js\";\nimport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_CANDIDATE_MULTIPLIER,\n REVERIE_RERANKER_MODEL,\n DEFAULT_RERANKER_TOP_K,\n DEFAULT_RERANKER_BATCH_SIZE,\n} from \"./constants.js\";\nimport { searchEpisodeSummaries } from \"./episodes.js\";\n\n/**\n * Performs advanced semantic search over reverie conversation history.\n *\n * Search pipeline:\n * 1. Fetch 3x candidates (candidateMultiplier × limit)\n * 2. Apply quality filtering (remove boilerplate, system prompts)\n * 3. Deduplicate similar excerpts (keep highest relevance)\n * 4. Apply reranker if enabled (improve precision)\n * 5. Return top N results\n *\n * Key features:\n * - Aggressive candidate fetching for better filtering headroom\n * - Optional reranker support for precision improvement\n * - Quality filtering removes system prompts and boilerplate\n * - Deduplication preserves highest-relevance duplicates\n * - Transparent logging at each stage\n *\n * @param codexHome - Path to .codex directory containing conversation data\n * @param text - Search query text\n * @param repo - Repository root path for filtering conversations\n * @param options - Search configuration options\n * @returns Array of relevant reverie insights, sorted by relevance\n *\n * @example\n * ```typescript\n * const insights = await searchReveries(\n * \"/Users/me/.codex\",\n * \"authentication bug with JWT tokens\",\n * \"/Users/me/my-project\",\n * {\n * limit: 6,\n * useReranker: true,\n * candidateMultiplier: 3\n * }\n * );\n *\n * console.log(`Found ${insights.length} relevant insights`);\n * insights.forEach(insight => {\n * console.log(`[${insight.relevance.toFixed(2)}] ${insight.excerpt.slice(0, 100)}`);\n * });\n * ```\n */\nexport async function searchReveries(\n codexHome: string,\n text: string,\n repo: string,\n options?: ReverieSearchOptions\n): Promise<ReverieInsight[]> {\n const {\n limit = DEFAULT_REVERIE_LIMIT,\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n useReranker = true,\n rerankerModel = REVERIE_RERANKER_MODEL,\n rerankerTopK = DEFAULT_RERANKER_TOP_K,\n rerankerBatchSize = DEFAULT_RERANKER_BATCH_SIZE,\n candidateMultiplier = REVERIE_CANDIDATE_MULTIPLIER,\n } = options || {};\n\n // Normalize and validate input\n const normalized = text.trim();\n if (!normalized) {\n return [];\n }\n\n // Configure search with aggressive candidate fetching\n const searchOptions: ReverieSemanticSearchOptions = {\n projectRoot: repo,\n limit: maxCandidates * candidateMultiplier, // Get 3x candidates for heavy filtering\n maxCandidates: maxCandidates * candidateMultiplier,\n normalize: true,\n cache: true,\n };\n\n // Add reranker if enabled\n if (useReranker) {\n searchOptions.rerankerModel = rerankerModel as any;\n searchOptions.rerankerTopK = rerankerTopK;\n searchOptions.rerankerBatchSize = rerankerBatchSize;\n }\n\n try {\n // Execute semantic search\n const regexMatches = looksLikeStructuredQuery(normalized)\n ? await reverieSearchConversations(codexHome, normalized, limit).catch(() => [])\n : [];\n\n const matches = await reverieSearchSemantic(codexHome, normalized, searchOptions);\n const combinedMatches = mergeSearchResults(regexMatches, matches);\n\n // Convert search results to insights\n const insights = convertSearchResultsToInsights(combinedMatches);\n\n // Apply quality filtering\n const validInsights = insights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n\n const { kept: conversational } = await filterBoilerplateInsights(validInsights, {\n projectRoot: repo,\n });\n\n // Deduplicate similar excerpts (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(conversational);\n\n const episodeMatches = await searchEpisodeSummaries(codexHome, normalized, repo, limit * 4).catch(() => []);\n const episodeBoost = new Map<string, number>();\n for (const episode of episodeMatches) {\n episodeBoost.set(episode.conversationId, Math.max(episodeBoost.get(episode.conversationId) ?? 0, episode.importance ?? 0));\n }\n\n const ranked = deduplicated\n .map((insight) => {\n const bonus = episodeBoost.get(insight.conversationId) ?? 0;\n return {\n insight,\n score: insight.relevance + bonus / 10,\n };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map(({ insight }) => insight);\n\n return ranked;\n } catch (error) {\n console.warn(\n `Reverie search failed: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n}\n\n/**\n * Converts native search results to standardized ReverieInsight format.\n *\n * @param results - Raw search results from reverieSearchSemantic\n * @returns Array of ReverieInsight objects\n */\nfunction convertSearchResultsToInsights(results: ReverieSearchResult[]): ReverieInsight[] {\n const flattened: ReverieInsight[] = [];\n\n for (const match of results) {\n const base: ReverieInsight = {\n conversationId: match.conversation?.id || \"unknown\",\n timestamp: match.conversation?.createdAt || match.conversation?.updatedAt || new Date().toISOString(),\n relevance: typeof match.relevanceScore === \"number\" ? match.relevanceScore : 0,\n excerpt: \"\",\n insights: Array.isArray(match.insights) ? match.insights : [],\n };\n\n const excerpts = match.matchingExcerpts?.length ? match.matchingExcerpts : [\"\"];\n for (const excerpt of excerpts) {\n if (!excerpt.trim()) {\n continue;\n }\n flattened.push({ ...base, excerpt });\n }\n }\n\n return flattened;\n}\n\nfunction mergeSearchResults(primary: ReverieSearchResult[], secondary: ReverieSearchResult[]): ReverieSearchResult[] {\n const seen = new Set<string>();\n const merged: ReverieSearchResult[] = [];\n\n for (const list of [primary, secondary]) {\n for (const match of list) {\n const convoId = match.conversation?.id || \"unknown\";\n const excerptKey = match.matchingExcerpts?.[0] || String(match.relevanceScore ?? 0);\n const key = `${convoId}:${excerptKey}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n merged.push(match);\n }\n }\n\n return merged;\n}\n\nfunction looksLikeStructuredQuery(text: string): boolean {\n if (!text) {\n return false;\n }\n\n const structuredPatterns = [\n /traceback \\(most recent call last\\)/i, // Python\n /exception in thread/i,\n /java\\.lang\\./i,\n /org\\.junit/i,\n /at\\s+org\\./i,\n /AssertionError:/i,\n /panic!|thread '.+' panicked/i,\n /FAIL\\s+\\S+\\s+\\(/i, // Jest/Vitest\n /(?:error|fail|fatal):/i,\n /Caused by:/i,\n /\\bundefined reference to\\b/i,\n ];\n\n for (const pattern of structuredPatterns) {\n if (pattern.test(text)) {\n return true;\n }\n }\n\n const hashPattern = /\\b[0-9a-f]{32,}\\b/i; // commit or build IDs\n if (hashPattern.test(text)) {\n return true;\n }\n\n const uuidPattern = /\\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\b/i;\n if (uuidPattern.test(text)) {\n return true;\n }\n\n const stackFrameMatches = text.match(/\\bat\\s+[^\\s]+\\s*\\(|\\b\\S+\\.\\w+:\\d+/gi);\n if ((stackFrameMatches?.length ?? 0) >= 2) {\n return true;\n }\n\n const severityTokens = text.match(/\\b(?:fail|error|panic|assert|fatal)\\b/gi)?.length ?? 0;\n if (severityTokens >= 3 && text.length > 50) {\n return true;\n }\n\n return false;\n}\n","/**\n * LLM-Based Relevance Grading for Reverie Insights\n *\n * Uses an LLM to evaluate whether reverie excerpts contain specific technical details\n * relevant to the current work context. This provides a more sophisticated filter than\n * simple keyword matching or relevance scores.\n *\n * Key optimizations:\n * - Only grades high-scoring candidates (relevance >= 0.7) to minimize API costs\n * - Parallel grading for performance\n * - Strict filtering to reject boilerplate and generic content\n */\n\nimport { Agent } from \"@openai/agents\";\nimport type { ReverieInsight, GradingOptions } from \"./types.js\";\n\n/**\n * Minimal interface for an agent runner that can execute prompts.\n * Compatible with @openai/agents Runner and similar implementations.\n */\nexport interface AgentRunner {\n run(\n agent: {\n name: string;\n instructions: string | ((...args: any[]) => any);\n outputType?: unknown;\n getEnabledHandoffs?: (...args: any[]) => Promise<unknown> | unknown;\n getAllTools?: (...args: any[]) => Promise<unknown> | unknown;\n },\n prompt: string\n ): Promise<{ finalOutput?: unknown }>;\n}\n\n/**\n * JSON schema for structured reverie grading response.\n * Ensures the LLM returns a validated, type-safe result.\n */\nconst REVERIE_GRADING_SCHEMA = {\n type: \"object\" as const,\n properties: {\n is_relevant: {\n type: \"boolean\" as const,\n description: \"True if excerpt contains specific technical details relevant to the work context\",\n },\n reasoning: {\n type: \"string\" as const,\n description: \"Brief explanation (1-2 sentences) of why the excerpt was approved or rejected\",\n },\n },\n required: [\"is_relevant\", \"reasoning\"],\n additionalProperties: false,\n};\n\n/**\n * Type-safe interface for grading results.\n */\ninterface GradingResult {\n is_relevant: boolean;\n reasoning: string;\n}\n\n/**\n * Uses LLM to evaluate if a reverie excerpt contains specific technical details\n * relevant to the search context.\n *\n * The grader is extremely strict and only approves excerpts with:\n * - Specific code/file references\n * - Technical decisions and rationale\n * - Error messages and debugging details\n * - Implementation specifics\n *\n * It rejects:\n * - Greetings and pleasantries\n * - Thinking markers (**, ##)\n * - JSON objects and structured data\n * - Generic phrases (\"Context from past work\")\n * - Metadata and system information\n *\n * @param runner - Agent runner capable of executing LLM prompts\n * @param searchContext - Context describing what we're searching for\n * @param insight - Reverie insight to evaluate\n * @returns true if the excerpt contains valuable technical details, false otherwise\n *\n * @example\n * ```typescript\n * const context = \"Implementing authentication with JWT tokens\";\n * const insight = {\n * excerpt: \"We decided to use RS256 for JWT signing because...\",\n * relevance: 0.85,\n * // ...\n * };\n *\n * const isRelevant = await gradeReverieRelevance(runner, context, insight);\n * // Returns: true (contains specific technical decision)\n * ```\n */\nexport async function gradeReverieRelevance(\n runner: AgentRunner,\n searchContext: string,\n insight: ReverieInsight\n): Promise<boolean> {\n const graderAgent = new Agent({\n name: \"ReverieGrader\",\n instructions: `You are a STRICT filter for conversation excerpts. Only approve excerpts with SPECIFIC technical details.\n\nREJECT excerpts containing:\n- Greetings and pleasantries\n- Thinking markers (**, ##, <thinking>)\n- JSON objects or structured data dumps\n- Generic phrases (\"Context from past work\", \"working on this\", etc.)\n- Metadata and system information\n- Boilerplate text\n- Task or checklist instructions (\"1.\", \"2.\", \"Plan:\")\n- AGENTS.md guidance, sandbox instructions, or environment descriptions\n- Tool output summaries or command transcript blocks\n\nAPPROVE ONLY excerpts with:\n- Specific code/file references (file paths, function names, variable names)\n- Technical decisions and rationale\n- Error messages and debugging details\n- Implementation specifics and algorithms\n- Architecture patterns and design choices\n\nReturn a JSON object with:\n- is_relevant: boolean indicating if this excerpt should be kept\n- reasoning: brief 1-2 sentence explanation of your decision`,\n outputType: {\n type: \"json_schema\" as const,\n schema: REVERIE_GRADING_SCHEMA,\n name: \"ReverieGrading\",\n strict: true,\n },\n });\n\n const prompt = `Context: ${searchContext}\n\nExcerpt to grade:\n\"\"\"\n${insight.excerpt.slice(0, 400)}\n\"\"\"\n\nEvaluate whether this excerpt contains specific technical details relevant to the work context.`;\n\n const result = await runner.run(graderAgent, prompt);\n\n // Parse structured output\n if (result.finalOutput && typeof result.finalOutput === \"object\") {\n const grading = result.finalOutput as GradingResult;\n return grading.is_relevant;\n }\n\n // Fallback: if structured output fails, default to rejecting (conservative)\n console.warn(\"Reverie grading failed to return structured output, defaulting to reject\");\n return false;\n}\n\n/**\n * Grades multiple reverie insights in parallel using LLM evaluation.\n *\n * Pipeline:\n * 1. Filter insights by minimum relevance threshold (default: 0.7)\n * 2. Send high-scoring insights to LLM grader in parallel\n * 3. Return only insights that pass LLM evaluation\n *\n * This approach optimizes API costs by:\n * - Skipping low-scoring candidates entirely\n * - Running high-scoring evaluations in parallel for speed\n * - Using strict filtering to minimize false positives\n *\n * @param runner - Agent runner capable of executing LLM prompts\n * @param context - Search context describing what we're looking for\n * @param insights - Array of insights to grade\n * @param options - Grading configuration options\n * @returns Filtered array containing only LLM-approved insights\n *\n * @example\n * ```typescript\n * const allInsights = await searchReveries(\"authentication bug\", repo);\n * const approved = await gradeReveriesInParallel(\n * runner,\n * \"Fix authentication token validation\",\n * allInsights,\n * { minRelevanceForGrading: 0.75, parallel: true }\n * );\n *\n * console.log(`${approved.length}/${allInsights.length} insights approved`);\n * ```\n */\nexport async function gradeReveriesInParallel(\n runner: AgentRunner,\n context: string,\n insights: ReverieInsight[],\n options?: GradingOptions\n): Promise<ReverieInsight[]> {\n const { minRelevanceForGrading = 0.7, parallel = true } = options || {};\n\n // Split insights by relevance threshold\n const highScoring = insights.filter((insight) => insight.relevance >= minRelevanceForGrading);\n const lowScoring = insights.filter((insight) => insight.relevance < minRelevanceForGrading);\n\n // Skip LLM grading for low-scoring insights (cost optimization)\n if (highScoring.length === 0) {\n return [];\n }\n\n // Grade high-scoring insights\n if (parallel) {\n // Parallel grading for performance\n const gradingPromises = highScoring.map((insight) =>\n gradeReverieRelevance(runner, context, insight).then((isRelevant) => ({\n insight,\n isRelevant,\n }))\n );\n\n const gradedResults = await Promise.all(gradingPromises);\n return gradedResults.filter((r) => r.isRelevant).map((r) => r.insight);\n } else {\n // Sequential grading (for rate-limited scenarios)\n const approved: ReverieInsight[] = [];\n\n for (const insight of highScoring) {\n const isRelevant = await gradeReverieRelevance(runner, context, insight);\n if (isRelevant) {\n approved.push(insight);\n }\n }\n\n return approved;\n }\n}\n","/**\n * Reverie Context Builders\n *\n * Utilities for building search contexts at different levels:\n * - Project level: Repository-wide patterns and architecture\n * - Branch level: Feature/branch-specific work and intent\n * - File level: Individual file changes and symbols\n */\n\nimport type {\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n ReverieContext,\n} from \"./types.js\";\nimport { extractKeySymbols } from \"./symbols.js\";\n\n/**\n * Builds project-level search context for repository-wide patterns.\n *\n * Use this for searching architectural decisions, common practices,\n * and project-wide patterns across the entire codebase.\n *\n * @param query - Natural language query describing what to find\n * @param options - Optional configuration\n * @returns Project-level context ready for search\n *\n * @example\n * ```typescript\n * const context = buildProjectContext(\n * \"How we handle database migrations in this repository\",\n * { repoPath: \"/Users/me/my-project\" }\n * );\n *\n * const results = await searchProjectLevel(codexHome, context, runner);\n * ```\n */\nexport function buildProjectContext(\n query: string,\n options?: {\n repoPath?: string;\n filePatterns?: string[];\n }\n): ProjectLevelContext {\n return {\n level: 'project',\n repoPath: options?.repoPath || process.cwd(),\n query,\n filePatterns: options?.filePatterns,\n };\n}\n\n/**\n * Builds branch-level search context for feature/branch-specific work.\n *\n * Use this for understanding branch intent, feature context, and changes\n * made across multiple files in a feature branch.\n *\n * @param branch - Current branch name\n * @param changedFiles - List of files modified in this branch\n * @param options - Optional configuration\n * @returns Branch-level context ready for search\n *\n * @example\n * ```typescript\n * const context = buildBranchContext(\n * \"feat/oauth2\",\n * [\"src/auth.ts\", \"src/login.ts\", \"test/auth.test.ts\"],\n * {\n * baseBranch: \"main\",\n * recentCommits: \"Add OAuth2 support\\nImplement token refresh\",\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n *\n * const results = await searchBranchLevel(codexHome, context, runner);\n * ```\n */\nexport function buildBranchContext(\n branch: string,\n changedFiles: string[],\n options?: {\n baseBranch?: string;\n recentCommits?: string;\n repoPath?: string;\n }\n): BranchLevelContext {\n return {\n level: 'branch',\n repoPath: options?.repoPath || process.cwd(),\n branch,\n baseBranch: options?.baseBranch,\n changedFiles,\n recentCommits: options?.recentCommits,\n };\n}\n\n/**\n * Builds file-level search context for individual file changes.\n *\n * Use this for focused searches on specific file modifications,\n * with optional symbol extraction for better targeting.\n *\n * @param filePath - Path to the file being analyzed\n * @param options - Optional configuration\n * @returns File-level context ready for search\n *\n * @example\n * ```typescript\n * // Without symbol extraction\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"... git diff content ...\",\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n *\n * // With automatic symbol extraction\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"+function validateToken(...)\\n+function refreshToken(...)\",\n * extractSymbols: true,\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n * // context.symbols will be: [\"validateToken\", \"refreshToken\"]\n *\n * const results = await searchFileLevel(codexHome, context, runner);\n * ```\n */\nexport function buildFileContext(\n filePath: string,\n options?: {\n diff?: string;\n extractSymbols?: boolean;\n repoPath?: string;\n }\n): FileLevelContext {\n const context: FileLevelContext = {\n level: 'file',\n repoPath: options?.repoPath || process.cwd(),\n filePath,\n diff: options?.diff,\n };\n\n // Extract symbols if requested and diff is provided\n if (options?.extractSymbols && options?.diff) {\n const symbolsText = extractKeySymbols(options.diff);\n if (symbolsText) {\n context.symbols = symbolsText.split(',').map(s => s.trim()).filter(Boolean);\n }\n }\n\n return context;\n}\n\n/**\n * Converts a ReverieContext to a search query string.\n *\n * Transforms structured context objects into natural language queries\n * suitable for semantic search.\n *\n * @param context - Any level of reverie context\n * @returns Formatted search query string\n *\n * @example\n * ```typescript\n * const projectCtx = buildProjectContext(\"Authentication patterns\");\n * const query = contextToQuery(projectCtx);\n * // Returns: \"Project-wide: Authentication patterns\"\n *\n * const branchCtx = buildBranchContext(\"feat/auth\", [\"auth.ts\", \"login.ts\"]);\n * const query = contextToQuery(branchCtx);\n * // Returns: \"Branch: feat/auth\\nFiles: auth.ts, login.ts\"\n *\n * const fileCtx = buildFileContext(\"auth.ts\", {\n * symbols: [\"validateToken\", \"refreshToken\"]\n * });\n * const query = contextToQuery(fileCtx);\n * // Returns: \"File: auth.ts\\nSymbols: validateToken, refreshToken\"\n * ```\n */\nexport function contextToQuery(context: ReverieContext): string {\n switch (context.level) {\n case 'project': {\n let query = `Project-wide: ${context.query}`;\n if (context.filePatterns && context.filePatterns.length > 0) {\n query += `\\nScope: ${context.filePatterns.join(', ')}`;\n }\n return query;\n }\n\n case 'branch': {\n let query = `Branch: ${context.branch}`;\n if (context.baseBranch) {\n query += ` (base: ${context.baseBranch})`;\n }\n query += `\\nFiles changed: ${context.changedFiles.join(', ')}`;\n if (context.recentCommits) {\n query += `\\nRecent commits: ${context.recentCommits}`;\n }\n return query;\n }\n\n case 'file': {\n let query = `File: ${context.filePath}`;\n if (context.symbols && context.symbols.length > 0) {\n query += `\\nSymbols: ${context.symbols.join(', ')}`;\n }\n if (context.diff) {\n // Include a truncated version of the diff for context\n const truncatedDiff = context.diff.length > 500\n ? context.diff.slice(0, 500) + '...'\n : context.diff;\n query += `\\nChanges:\\n${truncatedDiff}`;\n }\n return query;\n }\n }\n}\n\n/**\n * Helper to format file paths for display in contexts.\n *\n * @param files - Array of file paths\n * @param maxFiles - Maximum number of files to show before truncating\n * @returns Formatted file list string\n */\nexport function formatFileList(files: string[], maxFiles: number = 10): string {\n if (files.length === 0) {\n return '(no files)';\n }\n\n if (files.length <= maxFiles) {\n return files.join(', ');\n }\n\n const shown = files.slice(0, maxFiles);\n const remaining = files.length - maxFiles;\n return `${shown.join(', ')} ... and ${remaining} more`;\n}\n","/**\n * Complete Reverie Pipeline\n *\n * Orchestrates the full reverie search and filtering process:\n * 1. Search with 3x candidates for aggressive filtering headroom\n * 2. Basic quality filter (remove boilerplate and system prompts)\n * 3. Split by relevance threshold (high vs low scoring)\n * 4. LLM grade high-scoring candidates only (cost optimization)\n * 5. Deduplicate results (keep highest relevance)\n * 6. Log statistics at every stage (transparent operation)\n *\n * This pipeline matches diff-agent's sophistication while being fully generic\n * and reusable across different contexts.\n */\n\nimport { searchReveries } from \"./search.js\";\nimport { gradeReveriesInParallel } from \"./grader.js\";\nimport type { AgentRunner } from \"./grader.js\";\nimport type {\n ReverieInsight,\n ReveriePipelineOptions,\n ReverieFilterStats,\n ReverieSearchLevel,\n ReverieContext,\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n} from \"./types.js\";\nimport { isValidReverieExcerpt, deduplicateReverieInsights } from \"./quality.js\";\nimport { filterBoilerplateInsights } from \"./boilerplate.js\";\nimport {\n logReverieSearch,\n logReverieFiltering,\n logLLMGrading,\n logApprovedReveries,\n logMultiLevelSearch,\n logLevelResults,\n} from \"./logger.js\";\nimport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_LLM_GRADE_THRESHOLD,\n} from \"./constants.js\";\nimport { contextToQuery } from \"./context.js\";\n\n/**\n * Result from the complete reverie pipeline.\n */\nexport interface ReveriePipelineResult {\n /** Final filtered and graded insights */\n insights: ReverieInsight[];\n /** Statistics from each pipeline stage */\n stats: ReverieFilterStats;\n}\n\n/**\n * Applies the complete reverie pipeline with all sophisticated features from diff-agent.\n *\n * Pipeline stages:\n * 1. **Search** - Fetch 3x candidates with optional reranking\n * 2. **Quality Filter** - Remove system prompts, boilerplate, JSON objects\n * 3. **Score Split** - Separate high-scoring (≥0.7) from low-scoring candidates\n * 4. **LLM Grading** - Grade only high-scoring candidates (cost optimization)\n * 5. **Deduplication** - Remove similar excerpts, keeping highest relevance\n * 6. **Logging** - Transparent statistics at each stage\n *\n * Key optimizations:\n * - 3x candidate multiplier provides headroom for aggressive filtering\n * - LLM grading only applied to high-scoring candidates (≥0.7)\n * - Parallel grading for performance\n * - Deduplication preserves highest-relevance duplicates\n * - Comprehensive logging for debugging and monitoring\n *\n * @param codexHome - Path to .codex directory containing conversation data\n * @param searchText - Search query describing what to look for\n * @param repo - Repository root path for filtering conversations\n * @param runner - Agent runner for LLM-based relevance grading (required unless skipLLMGrading is true)\n * @param options - Pipeline configuration options\n * @returns Pipeline result with filtered insights and statistics\n *\n * @example\n * ```typescript\n * // Full pipeline with LLM grading\n * const result = await applyReveriePipeline(\n * \"/Users/me/.codex\",\n * \"authentication bug with JWT tokens\",\n * \"/Users/me/my-project\",\n * runner,\n * {\n * limit: 6,\n * useReranker: true,\n * minRelevanceForGrading: 0.7\n * }\n * );\n *\n * console.log(`Found ${result.insights.length} relevant insights`);\n * console.log(`Filtered: ${result.stats.total} → ${result.stats.final}`);\n *\n * // Without LLM grading (faster, lower quality)\n * const fastResult = await applyReveriePipeline(\n * codexHome,\n * query,\n * repo,\n * null,\n * { skipLLMGrading: true }\n * );\n * ```\n */\nexport async function applyReveriePipeline(\n codexHome: string,\n searchText: string,\n repo: string,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const {\n limit = DEFAULT_REVERIE_LIMIT,\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n minRelevanceForGrading = REVERIE_LLM_GRADE_THRESHOLD,\n skipLLMGrading = false,\n ...searchOptions\n } = options || {};\n\n // Log search initiation\n logReverieSearch(searchText, `repo: ${repo}`);\n\n // Stage 1: Search with aggressive candidate fetching\n const rawInsights = await searchReveries(codexHome, searchText, repo, {\n limit,\n maxCandidates,\n ...searchOptions,\n });\n\n // Initialize statistics\n const stats: ReverieFilterStats = {\n total: rawInsights.length,\n afterQuality: 0,\n afterBoilerplate: 0,\n afterScore: 0,\n afterDedup: 0,\n final: 0,\n };\n\n // Stage 2: Basic quality filtering\n const validInsights = rawInsights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n stats.afterQuality = validInsights.length;\n\n // Stage 3: Embedding-based boilerplate filtering\n const { kept: conversationalInsights } = await filterBoilerplateInsights(validInsights, {\n projectRoot: repo,\n });\n stats.afterBoilerplate = conversationalInsights.length;\n\n // Stage 4: Split by relevance threshold\n const highScoring = conversationalInsights.filter((insight) => insight.relevance >= minRelevanceForGrading);\n const lowScoring = conversationalInsights.filter((insight) => insight.relevance < minRelevanceForGrading);\n stats.afterScore = highScoring.length;\n\n // Stage 5: LLM grading (optional, only for high-scoring)\n let gradedInsights: ReverieInsight[];\n\n if (skipLLMGrading || !runner) {\n // Skip LLM grading - just use high-scoring insights\n gradedInsights = highScoring;\n stats.afterLLMGrade = highScoring.length;\n } else {\n // Apply LLM grading to high-scoring candidates\n gradedInsights = await gradeReveriesInParallel(runner, searchText, highScoring, {\n minRelevanceForGrading,\n parallel: true,\n });\n stats.afterLLMGrade = gradedInsights.length;\n\n // Log LLM grading results\n logLLMGrading({\n total: highScoring.length,\n approved: gradedInsights.length,\n rejected: highScoring.length - gradedInsights.length,\n minScore: minRelevanceForGrading,\n });\n\n // Log approved reveries (verbose)\n if (gradedInsights.length > 0) {\n logApprovedReveries(gradedInsights);\n }\n }\n\n // Stage 6: Deduplication (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(gradedInsights);\n stats.afterDedup = deduplicated.length;\n\n // Final results\n const finalInsights = deduplicated.slice(0, limit);\n stats.final = finalInsights.length;\n\n // Log filtering statistics\n logReverieFiltering({\n total: stats.total,\n afterQuality: stats.afterQuality,\n afterBoilerplate: stats.afterBoilerplate,\n afterScore: stats.afterScore,\n afterDedup: stats.afterDedup,\n minScore: minRelevanceForGrading,\n });\n\n return {\n insights: finalInsights,\n stats,\n };\n}\n\n/**\n * Simplified pipeline for file-specific searches.\n *\n * Similar to main pipeline but optimized for individual file contexts:\n * - Uses fewer candidates (maxCandidates / 2)\n * - Same filtering and grading logic\n * - Transparent logging\n *\n * @param codexHome - Path to .codex directory\n * @param filePath - File path being analyzed\n * @param fileContext - Contextual information about the file (symbols, changes, etc.)\n * @param repo - Repository root path\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with file-specific insights\n *\n * @example\n * ```typescript\n * const fileInsights = await applyFileReveriePipeline(\n * codexHome,\n * \"src/auth/jwt.ts\",\n * \"File: src/auth/jwt.ts\\nImplementing: validateToken, generateToken\",\n * repo,\n * runner,\n * { limit: 3 }\n * );\n * ```\n */\nexport async function applyFileReveriePipeline(\n codexHome: string,\n filePath: string,\n fileContext: string,\n repo: string,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const {\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n limit = DEFAULT_REVERIE_LIMIT,\n ...restOptions\n } = options || {};\n\n // Use fewer candidates for file-specific searches\n const fileOptions = {\n ...restOptions,\n maxCandidates: Math.floor(maxCandidates / 2),\n limit,\n };\n\n // Run standard pipeline with file-specific context\n return applyReveriePipeline(codexHome, fileContext, repo, runner, fileOptions);\n}\n\n/**\n * Multi-level reverie search pipeline.\n *\n * Executes searches at multiple levels (project, branch, file) and returns\n * results organized by level. This enables comprehensive context gathering\n * from different scopes in a single operation.\n *\n * @param codexHome - Path to .codex directory\n * @param contexts - Array of search contexts at different levels\n * @param runner - Agent runner for LLM grading (optional if skipLLMGrading is true)\n * @param options - Pipeline options\n * @returns Map of search level to pipeline results\n *\n * @example\n * ```typescript\n * import { buildProjectContext, buildBranchContext, buildFileContext } from './context.js';\n *\n * const contexts = [\n * buildProjectContext(\"Testing conventions in this codebase\"),\n * buildBranchContext(\"feat/auth\", [\"src/auth.ts\", \"src/login.ts\"]),\n * buildFileContext(\"src/auth.ts\", { extractSymbols: true })\n * ];\n *\n * const results = await searchMultiLevel(codexHome, contexts, runner, {\n * limit: 5,\n * useReranker: true\n * });\n *\n * // Access results by level\n * const projectInsights = results.get('project')?.insights || [];\n * const branchInsights = results.get('branch')?.insights || [];\n * const fileInsights = results.get('file')?.insights || [];\n * ```\n */\nexport async function searchMultiLevel(\n codexHome: string,\n contexts: ReverieContext[],\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<Map<ReverieSearchLevel, ReveriePipelineResult>> {\n const levels = contexts.map(ctx => ctx.level);\n logMultiLevelSearch(levels);\n\n const results = new Map<ReverieSearchLevel, ReveriePipelineResult>();\n\n // Execute searches sequentially to maintain order and avoid overwhelming the system\n for (const context of contexts) {\n let result: ReveriePipelineResult;\n\n switch (context.level) {\n case 'project':\n result = await searchProjectLevel(codexHome, context, runner, options);\n break;\n case 'branch':\n result = await searchBranchLevel(codexHome, context, runner, options);\n break;\n case 'file':\n result = await searchFileLevel(codexHome, context, runner, options);\n break;\n }\n\n results.set(context.level, result);\n logLevelResults(context.level, result);\n }\n\n return results;\n}\n\n/**\n * Search at project level for repository-wide patterns.\n *\n * Optimized for broad searches across the entire codebase to find\n * architectural decisions, common practices, and project conventions.\n *\n * @param codexHome - Path to .codex directory\n * @param context - Project-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with project-wide insights\n *\n * @example\n * ```typescript\n * const context = buildProjectContext(\n * \"How we handle database migrations\",\n * { repoPath: \"/Users/me/my-project\" }\n * );\n *\n * const result = await searchProjectLevel(codexHome, context, runner, {\n * limit: 8,\n * useReranker: true\n * });\n *\n * console.log(`Found ${result.insights.length} project-wide insights`);\n * ```\n */\nexport async function searchProjectLevel(\n codexHome: string,\n context: ProjectLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Use larger candidate pool for project-wide searches\n const projectOptions = {\n ...options,\n maxCandidates: (options?.maxCandidates || DEFAULT_REVERIE_MAX_CANDIDATES) * 1.5,\n };\n\n return applyReveriePipeline(\n codexHome,\n searchQuery,\n context.repoPath,\n runner,\n projectOptions\n );\n}\n\n/**\n * Search at branch level for feature-specific context.\n *\n * Optimized for understanding work done in a specific branch,\n * including intent, changed files, and commit history.\n *\n * @param codexHome - Path to .codex directory\n * @param context - Branch-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with branch-specific insights\n *\n * @example\n * ```typescript\n * const context = buildBranchContext(\n * \"feat/oauth2\",\n * [\"src/auth.ts\", \"src/login.ts\"],\n * {\n * baseBranch: \"main\",\n * recentCommits: \"Add OAuth2 support\\nImplement token refresh\"\n * }\n * );\n *\n * const result = await searchBranchLevel(codexHome, context, runner, {\n * limit: 6\n * });\n *\n * console.log(`Found ${result.insights.length} branch insights`);\n * ```\n */\nexport async function searchBranchLevel(\n codexHome: string,\n context: BranchLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Standard pipeline for branch-level searches\n return applyReveriePipeline(\n codexHome,\n searchQuery,\n context.repoPath,\n runner,\n options\n );\n}\n\n/**\n * Search at file level for specific file changes.\n *\n * Optimized for focused searches on individual file modifications,\n * using extracted symbols for better targeting.\n *\n * @param codexHome - Path to .codex directory\n * @param context - File-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with file-specific insights\n *\n * @example\n * ```typescript\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"+function validateToken(...)\\n+function refreshToken(...)\",\n * extractSymbols: true\n * }\n * );\n *\n * const result = await searchFileLevel(codexHome, context, runner, {\n * limit: 3\n * });\n *\n * console.log(`Found ${result.insights.length} file-specific insights`);\n * ```\n */\nexport async function searchFileLevel(\n codexHome: string,\n context: FileLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Use existing file pipeline which reduces candidate count\n return applyFileReveriePipeline(\n codexHome,\n context.filePath,\n searchQuery,\n context.repoPath,\n runner,\n options\n );\n}\n"],"mappings":"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","names":["fs","path","fs","path","os","import_node_fs","import_node_path","dirname","path","fs","getImportMetaUrl","importMetaUrl","path","path","fs","path","fs","path","import_node_url","resolve","path","normalized","path","resolve","tool","normalizeSkillMentionTriggers","fs","path","os","tool","resolve","net","LogLevel","logger","import_node_path","fs","path","dot","import_agents"]}
1
+ {"version":3,"sources":["../src/index.ts","../../../node_modules/tsup/assets/cjs_shims.js","../src/thread.ts","../src/events/convert.ts","../src/outputSchemaFile.ts","../src/nativeBinding.ts","../src/tui.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/skills.ts","../src/exec.ts","../src/reviewOptions.ts","../src/codex.ts","../src/agents/toolRegistry.ts","../src/agents/CodexProvider.ts","../src/agents/types.ts","../src/agents/codexTool.ts","../src/agents/streamFormatter.ts","../src/agents/OpenCodeAgent.ts","../src/cloudTasks.ts","../src/logging/types.ts","../src/logging/logger.ts","../src/logging/threadLogger.ts","../src/reverie/constants.ts","../src/reverie/quality.ts","../src/reverie/boilerplate.ts","../src/reverie/logger.ts","../src/reverie/symbols.ts","../src/reverie/episodes.ts","../src/reverie/search.ts","../src/reverie/grader.ts","../src/reverie/context.ts","../src/reverie/pipeline.ts"],"sourcesContent":["export type {\n ThreadEvent,\n ThreadStartedEvent,\n TurnStartedEvent,\n TurnCompletedEvent,\n TurnFailedEvent,\n ItemStartedEvent,\n ItemUpdatedEvent,\n ItemCompletedEvent,\n ThreadError,\n ThreadErrorEvent,\n Usage,\n} from \"./events\";\nexport type {\n ThreadItem,\n AgentMessageItem,\n ReasoningItem,\n CommandExecutionItem,\n CommandExecutionStatus,\n FileChangeItem,\n PatchApplyStatus,\n PatchChangeKind,\n FileUpdateChange,\n McpToolCallItem,\n McpToolCallStatus,\n WebSearchItem,\n TodoListItem,\n TodoItem,\n ErrorItem,\n} from \"./items\";\n\nexport { Thread } from \"./thread\";\nexport type { RunResult, RunStreamedResult, Input, UserInput, ForkOptions } from \"./thread\";\n\nexport { Codex } from \"./codex\";\nexport type { ConversationListOptions, ConversationListPage, ConversationSummary } from \"./codex\";\n\nexport type { CodexOptions, NativeToolDefinition } from \"./codexOptions\";\nexport type { NativeToolInterceptorContext } from \"./codex\";\nexport type { NativeToolInvocation, NativeToolResult, NativeForkResult } from \"./nativeBinding\";\nexport type { ApprovalRequest } from \"./nativeBinding\";\nexport type { TokenizerOptions, TokenizerEncodeOptions } from \"./nativeBinding\";\n\nexport { startTui, runTui } from \"./tui\";\nexport type {\n NativeTuiRequest,\n NativeTuiExitInfo,\n NativeTokenUsage,\n NativeUpdateActionInfo,\n NativeUpdateActionKind,\n RunTuiOptions,\n TuiSession,\n} from \"./tui\";\n\nexport type { ThreadOptions, ApprovalMode, SandboxMode } from \"./threadOptions\";\nexport type { TurnOptions } from \"./turnOptions\";\nexport type { SkillDefinition, SkillMentionTrigger } from \"./skills\";\nexport type {\n ReviewInvocationOptions,\n ReviewTarget,\n CurrentChangesReview,\n BranchReview,\n CommitReview,\n CustomReview,\n} from \"./reviewOptions\";\nexport type {\n FastEmbedInitOptions,\n FastEmbedEmbedRequest,\n RepoDiffSummary,\n RepoDiffFileChange,\n RepoDiffSummaryOptions,\n} from \"./nativeBinding\";\n\n// LSP diagnostics integration\nexport {\n LspDiagnosticsBridge,\n attachLspDiagnostics,\n LspManager,\n DEFAULT_SERVERS,\n findServerForFile,\n resolveWorkspaceRoot,\n formatDiagnosticsForBackgroundEvent,\n formatDiagnosticsForTool,\n formatDiagnosticsWithSummary,\n filterBySeverity,\n summarizeDiagnostics,\n} from \"./lsp\";\nexport type {\n FileDiagnostics,\n LspDiagnosticSeverity,\n LspManagerOptions,\n LspServerConfig,\n NormalizedDiagnostic,\n WorkspaceLocator,\n DiagnosticSeverity,\n} from \"./lsp\";\n\n// OpenAI Agents framework integration\nexport { CodexProvider, codexTool } from \"./agents\";\nexport type { CodexProviderOptions, CodexToolOptions } from \"./agents\";\nexport { formatStream } from \"./agents\";\nexport type { FormattedStream, FormatStreamOptions, ToolCallEvent } from \"./agents\";\nexport { OpenCodeAgent } from \"./agents\";\nexport type { OpenCodeAgentOptions, DelegationResult, PermissionDecision, PermissionRequest } from \"./agents\";\nexport {\n clearCodexToolExecutors,\n getCodexToolExecutor,\n registerCodexToolExecutor,\n type ToolExecutionContext,\n type ToolExecutor,\n type ToolExecutorResult,\n} from \"./agents/toolRegistry\";\n\n// Cloud tasks (remote agent tasks; applied locally)\nexport { CloudTasks } from \"./cloudTasks\";\nexport type {\n CloudTaskSummary,\n CloudTasksOptions,\n CloudApplyOutcome,\n CloudTaskStatus,\n CloudApplyStatus,\n DiffSummary as CloudDiffSummary,\n} from \"./cloudTasks\";\n\n// Unified logging system\nexport { Logger, ScopedLogger, logger, createThreadLogger, runThreadTurnWithLogs, LogLevel } from \"./logging\";\nexport type { LogScope, LoggerConfig, LogOutput, ThreadLoggingSink, LogEntry } from \"./logging\";\n\n// Reverie semantic search and quality filtering\nexport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_EMBED_MODEL,\n REVERIE_RERANKER_MODEL,\n REVERIE_CANDIDATE_MULTIPLIER,\n REVERIE_LLM_GRADE_THRESHOLD,\n DEFAULT_RERANKER_TOP_K,\n DEFAULT_RERANKER_BATCH_SIZE,\n isValidReverieExcerpt,\n deduplicateReverieInsights,\n applyQualityPipeline,\n logReverieSearch,\n logReverieFiltering,\n logReverieInsights,\n logReverieHintQuality,\n logLLMGrading,\n logApprovedReveries,\n logMultiLevelSearch,\n logLevelResults,\n logMultiLevelSummary,\n truncateText,\n gradeReverieRelevance,\n gradeReveriesInParallel,\n extractKeySymbols,\n searchReveries,\n applyReveriePipeline,\n applyFileReveriePipeline,\n searchMultiLevel,\n searchProjectLevel,\n searchBranchLevel,\n searchFileLevel,\n buildProjectContext,\n buildBranchContext,\n buildFileContext,\n contextToQuery,\n formatFileList,\n} from \"./reverie\";\nexport type {\n ReverieInsight,\n ReverieEpisodeSummary,\n ReverieSearchOptions,\n GradingOptions,\n ReverieFilterStats,\n ReverieResult,\n QualityFilterStats,\n AgentRunner,\n ReveriePipelineOptions,\n ReveriePipelineResult,\n ReverieSearchLevel,\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n ReverieContext,\n} from \"./reverie\";\n\n// SSE test helpers (exposed for TypeScript tests)\n// Re-export the native binding functions directly\nimport { getNativeBinding } from \"./nativeBinding\";\nexport {\n reverieListConversations,\n reverieSearchConversations,\n reverieSearchSemantic,\n reverieIndexSemantic,\n reverieGetConversationInsights,\n encodeToToon,\n fastEmbedInit,\n fastEmbedEmbed,\n tokenizerCount,\n tokenizerEncode,\n tokenizerDecode,\n collectRepoDiffSummary,\n} from \"./nativeBinding\";\n\nexport type {\n ReverieSemanticSearchOptions,\n ReverieSemanticIndexStats,\n FastEmbedRerankerModelCode,\n} from \"./nativeBinding\";\n\nexport function evCompleted(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 evResponseCreated(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 evAssistantMessage(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 evFunctionCall(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","// 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","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 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 { 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 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 { 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","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","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 {\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 { 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 type { NativeToolInvocation, NativeToolResult } from \"../nativeBinding\";\n\nexport interface ToolExecutionContext {\n name: string;\n callId: string;\n arguments: unknown;\n rawInvocation: NativeToolInvocation;\n}\n\nexport type ToolExecutorResult = string | NativeToolResult | { output?: string; error?: string; success?: boolean } | void;\nexport type ToolExecutor = (context: ToolExecutionContext) => Promise<ToolExecutorResult> | ToolExecutorResult;\n\nconst executors = new Map<string, ToolExecutor>();\n\nexport function registerCodexToolExecutor(name: string, executor: ToolExecutor) {\n executors.set(name, executor);\n}\n\nexport function getCodexToolExecutor(name: string): ToolExecutor | undefined {\n return executors.get(name);\n}\n\nexport function clearCodexToolExecutors() {\n executors.clear();\n}\n","import { Codex, type ApprovalRequest } from \"../codex\";\nimport type { Thread } from \"../thread\";\nimport type { ThreadEvent, Usage as CodexUsage } from \"../events\";\nimport type { ThreadItem } from \"../items\";\nimport type { Input, UserInput } from \"../thread\";\nimport type { CodexOptions, NativeToolDefinition } from \"../codexOptions\";\nimport type { ThreadOptions } from \"../threadOptions\";\nimport type { NativeToolInvocation, NativeToolResult } from \"../nativeBinding\";\nimport { attachLspDiagnostics } from \"../lsp\";\nimport { getCodexToolExecutor, type ToolExecutor, type ToolExecutionContext, type ToolExecutorResult } from \"./toolRegistry\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport type {\n ModelProvider,\n Model,\n ModelRequest,\n ModelResponse,\n StreamEvent,\n AgentInputItem,\n AgentOutputItem,\n AssistantMessageItem,\n OutputText,\n SerializedTool,\n} from \"./types\";\nimport { Usage } from \"./types\";\n\n/**\n * Options for creating a CodexProvider\n */\nexport interface CodexProviderOptions extends CodexOptions {\n /**\n * Default model to use when none is specified\n */\n defaultModel?: string;\n /**\n * Approval policy forwarded to threads created by this provider.\n */\n approvalMode?: ThreadOptions[\"approvalMode\"];\n /**\n * Use local OSS provider via Ollama (pulls models as needed)\n */\n oss?: boolean;\n\n /**\n * Working directory for Codex operations\n * @default process.cwd()\n */\n workingDirectory?: string;\n\n /**\n * Skip git repository check\n * @default false\n */\n skipGitRepoCheck?: boolean;\n\n /**\n * Sandbox policy to use when executing shell commands\n * @default \"danger-full-access\"\n */\n sandboxMode?: ThreadOptions[\"sandboxMode\"];\n\n /**\n * Reasoning effort level for reasoning-capable models\n * @default \"medium\"\n */\n reasoningEffort?: ThreadOptions[\"reasoningEffort\"];\n\n /**\n * Reasoning summary preference for reasoning-capable models\n * @default \"auto\"\n */\n reasoningSummary?: ThreadOptions[\"reasoningSummary\"];\n\n /**\n * Enable LSP diagnostics for threads created by this provider\n * @default true\n */\n enableLsp?: boolean;\n}\n\n/**\n * Provider implementation that uses Codex as the backend for OpenAI Agents\n *\n * @example\n * ```typescript\n * import { CodexProvider } from '@codex-native/sdk/agents';\n * import { Agent, Runner } from '@openai/agents';\n *\n * const provider = new CodexProvider({\n * defaultModel: 'gpt-5.2-codex'\n * });\n *\n * const agent = new Agent({\n * name: 'CodeAssistant',\n * instructions: 'You are a helpful coding assistant'\n * });\n *\n * const runner = new Runner({ modelProvider: provider });\n * const result = await runner.run(agent, 'Fix the failing tests');\n * ```\n */\nexport class CodexProvider implements ModelProvider {\n private codex: Codex | null = null;\n private options: CodexProviderOptions;\n\n constructor(options: CodexProviderOptions = {}) {\n this.options = {\n workingDirectory: options.workingDirectory || process.cwd(),\n skipGitRepoCheck: options.skipGitRepoCheck ?? false,\n ...options,\n };\n }\n\n /**\n * Lazy initialization of Codex instance\n */\n private getCodex(): Codex {\n if (!this.codex) {\n try {\n this.codex = new Codex({\n apiKey: this.options.apiKey,\n baseUrl: this.options.baseUrl,\n modelProvider: this.options.modelProvider,\n defaultModel: this.options.defaultModel,\n tools: this.options.tools,\n preserveRegisteredTools: this.options.preserveRegisteredTools,\n skills: this.options.skills,\n skillMentionTriggers: this.options.skillMentionTriggers,\n });\n } catch (error) {\n throw new Error(\n `Failed to initialize Codex: ${error instanceof Error ? error.message : String(error)}`\n );\n }\n }\n return this.codex;\n }\n\n getModel(modelName?: string): Model {\n const model = modelName || this.options.defaultModel;\n return new CodexModel(this.getCodex(), model, this.options);\n }\n\n /**\n * Register a programmatic approval callback on the underlying Codex instance.\n */\n setApprovalCallback(callback: (request: ApprovalRequest) => boolean | Promise<boolean>): void {\n this.getCodex().setApprovalCallback(callback);\n }\n}\n\n/**\n * Model implementation that wraps a Codex Thread\n */\nclass CodexModel implements Model {\n private codex: Codex;\n private modelName?: string;\n private thread: Thread | null = null;\n private options: CodexProviderOptions;\n private registeredTools: Set<string> = new Set();\n private toolExecutors: Map<string, ToolExecutor> = new Map();\n private tempImageFiles: Set<string> = new Set();\n private streamedTurnItems: ThreadItem[] = [];\n private lastStreamedMessage: string | null = null;\n private detachDiagnostics?: () => void;\n private diagnosticsThread?: Thread | null;\n\n constructor(codex: Codex, modelName: string | undefined, options: CodexProviderOptions) {\n this.codex = codex;\n this.modelName = modelName;\n this.options = options;\n }\n\n /**\n * Cleanup temporary image files created during request processing\n */\n private async cleanupTempFiles(): Promise<void> {\n for (const filepath of this.tempImageFiles) {\n try {\n await fs.promises.unlink(filepath);\n } catch (error) {\n // Silently ignore cleanup errors (file may already be deleted)\n }\n }\n this.tempImageFiles.clear();\n }\n\n /**\n * Get or create the thread for this model instance\n */\n private getThread(conversationId?: string): Thread {\n // If we have a conversation ID and either no thread or a different thread\n if (conversationId) {\n if (!this.thread || this.thread.id !== conversationId) {\n // Resume the specified thread\n this.detachDiagnostics?.();\n this.thread = this.codex.resumeThread(conversationId, this.getThreadOptions());\n this.diagnosticsThread = null;\n }\n } else if (!this.thread) {\n // Create new thread only if we don't have one\n this.detachDiagnostics?.();\n this.thread = this.codex.startThread(this.getThreadOptions());\n this.diagnosticsThread = null;\n }\n const thread = this.thread;\n if (!thread) {\n throw new Error(\"Thread initialization failed\");\n }\n this.ensureDiagnosticsBridge(thread);\n return thread;\n }\n\n private ensureDiagnosticsBridge(thread: Thread): void {\n // Skip LSP attachment if explicitly disabled\n if (this.options.enableLsp === false) {\n return;\n }\n if (this.diagnosticsThread === thread && this.detachDiagnostics) {\n return;\n }\n this.detachDiagnostics?.();\n this.diagnosticsThread = thread;\n this.detachDiagnostics = attachLspDiagnostics(thread, {\n workingDirectory: this.options.workingDirectory ?? process.cwd(),\n waitForDiagnostics: true,\n });\n }\n\n private getThreadOptions(): ThreadOptions {\n return {\n model: this.modelName,\n // When a custom baseUrl is provided (e.g., test proxy), do not enable OSS mode,\n // since the backend is not Ollama in that case.\n oss: this.options.baseUrl ? false : this.options.oss,\n workingDirectory: this.options.workingDirectory,\n skipGitRepoCheck: this.options.skipGitRepoCheck,\n sandboxMode: this.options.sandboxMode ?? \"danger-full-access\",\n approvalMode: this.options.approvalMode,\n reasoningEffort: this.options.reasoningEffort,\n reasoningSummary: this.options.reasoningSummary,\n };\n }\n\n async getResponse(request: ModelRequest): Promise<ModelResponse> {\n try {\n const thread = this.getThread(request.conversationId || request.previousResponseId);\n\n // Register any tools provided in the request\n if (request.tools && request.tools.length > 0) {\n this.registerRequestTools(request.tools);\n }\n\n const input = await this.convertRequestToInput(request);\n\n // Note: ModelSettings like temperature, maxTokens, topP, etc. are not currently\n // supported by the Codex native binding. The Rust layer handles model configuration.\n\n // Run Codex (tools are now registered and will be available)\n const turn = await thread.run(input, {\n outputSchema: normalizeAgentsOutputType(request.outputType),\n oss: this.options.oss,\n });\n\n const planItem = turn.items\n .filter((item): item is Extract<ThreadItem, { type: \"todo_list\" }> => item.type === \"todo_list\")\n .slice(-1)[0];\n\n // Convert Codex response to ModelResponse format\n const response: {\n usage: Usage;\n output: AgentOutputItem[];\n responseId: string | undefined;\n plan?: { items: Array<{ text: string; completed: boolean }> };\n } = {\n usage: this.convertUsage(turn.usage),\n output: this.convertItemsToOutput(turn.items, turn.finalResponse),\n responseId: thread.id || undefined,\n };\n\n if (planItem) {\n response.plan = { items: planItem.items };\n }\n\n return response;\n } finally {\n // Clean up temporary image files\n await this.cleanupTempFiles();\n }\n }\n\n async *getStreamedResponse(request: ModelRequest): AsyncIterable<StreamEvent> {\n const MAX_ACCUMULATED_SIZE = 10_000_000; // 10MB limit\n\n try {\n const thread = this.getThread(request.conversationId || request.previousResponseId);\n\n // Register any tools provided in the request\n if (request.tools && request.tools.length > 0) {\n this.registerRequestTools(request.tools);\n }\n\n const input = await this.convertRequestToInput(request);\n\n const { events } = await thread.runStreamed(input, {\n outputSchema: normalizeAgentsOutputType(request.outputType),\n oss: this.options.oss,\n });\n\n // Track text accumulation for delta calculation\n const textAccumulator = new Map<string, string>();\n\n for await (const event of events) {\n // Check accumulated text size to prevent memory issues\n let totalSize = 0;\n for (const text of textAccumulator.values()) {\n totalSize += text.length;\n }\n if (totalSize > MAX_ACCUMULATED_SIZE) {\n throw new Error(`Accumulated text exceeded maximum size limit (${MAX_ACCUMULATED_SIZE} bytes)`);\n }\n\n const streamEvents = this.convertCodexEventToStreamEvent(event, textAccumulator);\n\n for (const streamEvent of streamEvents) {\n yield streamEvent;\n }\n }\n } finally {\n // Clean up temporary image files\n await this.cleanupTempFiles();\n }\n }\n\n /**\n * Register tools from ModelRequest with the Codex instance\n *\n * Converts SerializedTool format (OpenAI Agents) to NativeToolDefinition format (Codex)\n * and registers them with the Codex instance for bidirectional tool execution.\n */\n private registerRequestTools(tools: SerializedTool[]): void {\n this.toolExecutors.clear();\n\n for (const tool of tools) {\n if (tool.type !== \"function\") {\n continue;\n }\n\n // Skip if already registered\n if (this.registeredTools.has(tool.name)) {\n const executor = this.resolveToolExecutor(tool.name);\n if (executor) {\n this.toolExecutors.set(tool.name, executor);\n }\n continue;\n }\n\n try {\n const executor = this.resolveToolExecutor(tool.name);\n if (executor) {\n this.toolExecutors.set(tool.name, executor);\n }\n\n // Convert SerializedTool to NativeToolDefinition\n const nativeToolDef: NativeToolDefinition = {\n name: tool.name,\n description: tool.description,\n parameters: tool.parameters,\n // The handler is called when Codex wants to execute this tool\n handler: async (invocation: NativeToolInvocation): Promise<NativeToolResult> => {\n return await this.executeToolViaFramework(invocation);\n },\n };\n\n // Register the tool with Codex\n this.codex.registerTool(nativeToolDef);\n this.registeredTools.add(tool.name);\n\n console.log(`Registered tool with Codex: ${tool.name}`);\n } catch (error) {\n const errorMessage = `Failed to register tool ${tool.name}: ${error instanceof Error ? error.message : String(error)}`;\n console.error(errorMessage);\n // Don't throw - allow other tools to register even if one fails\n // Individual tool failures shouldn't block the entire request\n }\n }\n }\n\n private resolveToolExecutor(toolName: string): ToolExecutor | undefined {\n return getCodexToolExecutor(toolName);\n }\n\n /**\n * Execute a tool via the OpenAI Agents framework\n *\n * This is the bridge between Codex's tool execution and the framework's tool handlers.\n *\n * FRAMEWORK INTEGRATION NOTE:\n * This method currently returns a placeholder result because the actual execution\n * requires integration with the OpenAI Agents framework's tool execution loop.\n *\n * In a full implementation, this would:\n * 1. Emit a \"tool_call_requested\" event that the framework can listen to\n * 2. Wait for the framework to execute the tool and provide the result\n * 3. Return that result to Codex\n *\n * For now, this creates a promise that could be resolved by framework code,\n * but the framework integration is not yet complete.\n */\n private async executeToolViaFramework(\n invocation: NativeToolInvocation\n ): Promise<NativeToolResult> {\n if (!invocation) {\n console.warn('Codex requested a tool execution without invocation data.');\n return {\n output: JSON.stringify({\n message: 'Tool invocation payload missing',\n note: 'Codex returned null invocation data so the tool was not executed.',\n }),\n success: false,\n error: 'Missing tool invocation data from Codex',\n };\n }\n\n console.log(\n `Tool execution requested by Codex: ${invocation.toolName} (callId: ${invocation.callId})`\n );\n const executor = this.toolExecutors.get(invocation.toolName) ?? getCodexToolExecutor(invocation.toolName);\n if (!executor) {\n const message = `No Codex executor registered for tool '${invocation.toolName}'. Use codexTool() or provide a codexExecute handler.`;\n console.warn(message);\n return {\n success: false,\n error: message,\n output: undefined,\n };\n }\n\n let parsedArguments: unknown = {};\n if (invocation.arguments) {\n try {\n parsedArguments = JSON.parse(invocation.arguments);\n } catch (error) {\n return {\n success: false,\n error: `Failed to parse tool arguments: ${error instanceof Error ? error.message : String(error)}`,\n };\n }\n }\n\n const context: ToolExecutionContext = {\n name: invocation.toolName,\n callId: invocation.callId,\n arguments: parsedArguments,\n rawInvocation: invocation,\n };\n\n try {\n const result = await executor(context);\n return this.normalizeToolResult(result);\n } catch (error) {\n return {\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n /**\n * Handle image input by converting to local file path\n * Supports: base64 data URLs, HTTP(S) URLs, and file IDs (not yet implemented)\n */\n private normalizeToolResult(result: ToolExecutorResult): NativeToolResult {\n if (result === undefined || result === null) {\n return { success: true };\n }\n\n if (typeof result === \"string\") {\n return { success: true, output: result };\n }\n\n if (typeof result === \"object\" && (\"output\" in result || \"error\" in result || \"success\" in result)) {\n return {\n success: result.success ?? !result.error,\n output: result.output,\n error: result.error,\n };\n }\n\n return {\n success: true,\n output: JSON.stringify(result),\n };\n }\n\n private async handleImageInput(item: any): Promise<string | null> {\n const imageValue = item.image;\n\n // Case 1: Already a local file path (less common but possible)\n if (typeof imageValue === \"string\") {\n // Check if it's a base64 data URL\n if (imageValue.startsWith(\"data:image/\")) {\n return await this.saveBase64Image(imageValue);\n }\n // Check if it's an HTTP(S) URL\n else if (imageValue.startsWith(\"http://\") || imageValue.startsWith(\"https://\")) {\n return await this.downloadImage(imageValue);\n }\n // Assume it's already a file path\n else if (fs.existsSync(imageValue)) {\n return imageValue;\n }\n // Invalid format\n else {\n throw new Error(`Invalid image format: ${imageValue.substring(0, 50)}...`);\n }\n }\n // Case 2: Object with url property\n else if (typeof imageValue === \"object\" && \"url\" in imageValue) {\n return await this.downloadImage(imageValue.url);\n }\n // Case 3: Object with fileId property (would need API access to download)\n else if (typeof imageValue === \"object\" && \"fileId\" in imageValue) {\n throw new Error(\n `Image fileId references are not yet supported. ` +\n `File IDs would need to be downloaded from the service first.`\n );\n }\n\n return null;\n }\n\n /**\n * Save base64-encoded image to temporary file\n */\n private async saveBase64Image(dataUrl: string): Promise<string> {\n // Extract media type and base64 data\n const matches = dataUrl.match(/^data:image\\/([^;]+);base64,(.+)$/);\n if (!matches) {\n throw new Error(\"Invalid base64 image data URL\");\n }\n\n const mediaType = matches[1];\n const base64Data = matches[2];\n if (!base64Data) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const sanitizedBase64 = base64Data.replace(/\\s/g, \"\");\n if (sanitizedBase64.length === 0) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n if (!/^[A-Za-z0-9+/=_-]+$/.test(sanitizedBase64)) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const normalizedBase64 = sanitizedBase64.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\n let buffer: Buffer;\n try {\n buffer = Buffer.from(normalizedBase64, \"base64\");\n } catch {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n if (buffer.length === 0) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n const reencoded = buffer.toString(\"base64\").replace(/=+$/, \"\");\n const normalizedInput = normalizedBase64.replace(/=+$/, \"\");\n if (reencoded !== normalizedInput) {\n throw new Error(\"Invalid base64 data in image URL\");\n }\n\n // Extract extension from media type, handling various formats\n // Examples: \"png\", \"jpeg\", \"svg+xml\", \"vnd.microsoft.icon\"\n const extension = this.getExtensionFromMediaType(mediaType, \"png\");\n\n // Create temp file\n const tempDir = os.tmpdir();\n const filename = `codex-image-${Date.now()}.${extension}`;\n const filepath = path.join(tempDir, filename);\n\n await fs.promises.writeFile(filepath, buffer);\n this.tempImageFiles.add(filepath);\n return filepath;\n }\n\n /**\n * Download image from URL to temporary file\n */\n private async downloadImage(url: string): Promise<string> {\n // Use fetch to download the image\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`Failed to download image from ${url}: ${response.statusText}`);\n }\n\n const buffer = await response.arrayBuffer();\n const contentType = response.headers.get(\"content-type\") || \"image/png\";\n\n // Extract media type from content-type (e.g., \"image/png; charset=utf-8\" -> \"png\")\n const mediaTypePart = contentType.split(\";\")[0]?.trim() || \"image/png\";\n const mediaType = mediaTypePart.split(\"/\")[1] || \"png\";\n const extension = this.getExtensionFromMediaType(mediaType, \"png\");\n\n // Create temp file\n const tempDir = os.tmpdir();\n const filename = `codex-image-${Date.now()}.${extension}`;\n const filepath = path.join(tempDir, filename);\n\n await fs.promises.writeFile(filepath, Buffer.from(buffer));\n this.tempImageFiles.add(filepath);\n return filepath;\n }\n\n /**\n * Convert media type to file extension\n * Handles special cases like \"jpeg\" -> \"jpg\", \"svg+xml\" -> \"svg\"\n */\n private getExtensionFromMediaType(mediaType: string | undefined, defaultExt: string): string {\n if (!mediaType) {\n return defaultExt;\n }\n\n // Normalize the media type\n const normalized = mediaType.toLowerCase().trim();\n\n // Handle special cases\n const extensionMap: Record<string, string> = {\n \"jpeg\": \"jpg\",\n \"svg+xml\": \"svg\",\n \"vnd.microsoft.icon\": \"ico\",\n \"x-icon\": \"ico\",\n };\n\n // Check if we have a mapping for this media type\n if (extensionMap[normalized]) {\n return extensionMap[normalized];\n }\n\n // For standard types like \"png\", \"gif\", \"webp\", \"bmp\", \"tiff\"\n // Just use the media type as the extension\n const simpleExtension = normalized.split(\"+\")[0]; // Handle cases like \"svg+xml\"\n\n // Validate it's a reasonable extension (alphanumeric only)\n if (simpleExtension && /^[a-z0-9]+$/.test(simpleExtension)) {\n return simpleExtension;\n }\n\n // Fall back to default if we can't determine a valid extension\n return defaultExt;\n }\n\n private async convertRequestToInput(request: ModelRequest): Promise<Input> {\n const parts: UserInput[] = [];\n\n // Add system instructions as a text preamble if provided\n if (request.systemInstructions) {\n parts.push({\n type: \"text\",\n text: `<system>\\n${request.systemInstructions}\\n</system>\\n\\n`,\n });\n }\n\n // Convert input\n if (typeof request.input === \"string\") {\n parts.push({ type: \"text\", text: request.input });\n } else {\n // Convert AgentInputItem[] to UserInput[]\n for (const item of request.input) {\n // Check for unsupported types first using property checks\n if ('file' in item && 'type' in item) {\n throw new Error(\n `CodexProvider does not yet support input_file type. ` +\n `File handling needs to be implemented based on file type and format.`\n );\n }\n if ('audio' in item && 'type' in item) {\n throw new Error(\n `CodexProvider does not yet support input_audio type. ` +\n `Audio handling needs to be implemented.`\n );\n }\n if ('image' in item && 'type' in item && item.type !== \"message\") {\n const imageItem = item;\n const imagePath = await this.handleImageInput(imageItem);\n if (imagePath) {\n parts.push({ type: \"local_image\", path: imagePath });\n }\n continue;\n }\n\n // Handle different item types\n if (item.type === \"function_call_result\") {\n // Tool results - for now, convert to text describing the result\n if ('name' in item && 'result' in item) {\n parts.push({\n type: \"text\",\n text: `[Tool ${item.name} returned: ${item.result}]`\n });\n }\n } else if (item.type === \"reasoning\") {\n // Reasoning content\n let text = '';\n if ('content' in item && typeof item.content === 'string') {\n text = item.content;\n } else if ('reasoning' in item && typeof item.reasoning === 'string') {\n text = item.reasoning;\n }\n if (text) {\n parts.push({\n type: \"text\",\n text: `[Reasoning: ${text}]`\n });\n }\n } else if ((item.type === \"message\" || item.type === undefined) && 'role' in item) {\n // Message item - extract content\n if (!('content' in item)) continue;\n const content = item.content;\n\n if (typeof content === \"string\") {\n parts.push({ type: \"text\", text: content });\n } else if (Array.isArray(content)) {\n // Process content array\n for (const contentItem of content) {\n if (contentItem.type === \"input_text\") {\n parts.push({ type: \"text\", text: contentItem.text });\n } else if (contentItem.type === \"input_image\") {\n const imagePath = await this.handleImageInput(contentItem);\n if (imagePath) {\n parts.push({ type: \"local_image\", path: imagePath });\n }\n } else if (contentItem.type === \"input_file\") {\n throw new Error(\n `CodexProvider does not yet support input_file type. ` +\n `File handling needs to be implemented based on file type and format.`\n );\n } else if (contentItem.type === \"audio\") {\n throw new Error(\n `CodexProvider does not yet support audio type. ` +\n `Audio handling needs to be implemented.`\n );\n } else if (contentItem.type === \"refusal\") {\n parts.push({\n type: \"text\",\n text: `[Refusal: ${contentItem.refusal}]`\n });\n } else if (contentItem.type === \"output_text\") {\n parts.push({ type: \"text\", text: contentItem.text });\n }\n }\n }\n }\n }\n }\n\n // If only one text part, return as string\n if (parts.length === 1 && parts[0]!.type === \"text\") {\n return parts[0]!.text;\n }\n\n return parts;\n }\n\n /**\n * Convert Codex Usage to ModelResponse Usage\n */\n private convertUsage(usage: CodexUsage | null): Usage {\n if (!usage) {\n return new Usage();\n }\n\n const converted = new Usage({\n requests: 1,\n inputTokens: usage.input_tokens,\n outputTokens: usage.output_tokens,\n totalTokens: usage.input_tokens + usage.output_tokens,\n });\n\n if (usage.cached_input_tokens) {\n converted.inputTokensDetails = [{ cachedTokens: usage.cached_input_tokens }];\n }\n\n return converted;\n }\n\n /**\n * Convert Codex ThreadItems to AgentOutputItems\n */\n private convertItemsToOutput(items: ThreadItem[], finalResponse: string): AgentOutputItem[] {\n const output: AgentOutputItem[] = [];\n\n for (const item of items) {\n switch (item.type) {\n case \"agent_message\": {\n const content = [\n {\n type: \"output_text\" as const,\n text: item.text,\n },\n ];\n\n output.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content,\n } as AssistantMessageItem);\n break;\n }\n\n // For final output, omit internal \"reasoning\" items. Streaming already surfaces reasoning events.\n case \"reasoning\":\n break;\n\n // Codex handles tools internally, so we don't expose them as function calls\n // The results are already incorporated into the agent_message\n case \"command_execution\":\n case \"file_change\":\n case \"mcp_tool_call\":\n // Skip - these are internal to Codex\n break;\n\n default:\n // Unknown item type - skip\n break;\n }\n }\n\n // If no items were converted, add the final response as a message\n if (output.length === 0 && finalResponse) {\n output.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: [\n {\n type: \"output_text\" as const,\n text: finalResponse,\n },\n ],\n } as AssistantMessageItem);\n }\n\n return output;\n }\n\n private buildStreamResponse(\n usage: Usage,\n responseId: string,\n items: ThreadItem[],\n lastMessage: string | null\n ): {\n id: string;\n responseId: string;\n usage: any;\n output: AgentOutputItem[];\n plan?: { items: any[] };\n } {\n const messageItems = items.filter(\n (item): item is Extract<ThreadItem, { type: \"agent_message\" }> => item.type === \"agent_message\"\n );\n const output = this.convertItemsToOutput(messageItems, lastMessage ?? \"\");\n\n // Convert Usage to plain object format expected by StreamEvent\n const usageData = {\n requests: usage.requests,\n inputTokens: usage.inputTokens,\n outputTokens: usage.outputTokens,\n totalTokens: usage.totalTokens,\n inputTokensDetails: usage.inputTokensDetails?.[0],\n outputTokensDetails: usage.outputTokensDetails?.[0],\n };\n\n // Include latest plan information from todo_list items\n const latestPlan = items\n .filter((item): item is Extract<ThreadItem, { type: \"todo_list\" }> => item.type === \"todo_list\")\n .slice(-1)[0]; // Get the most recent plan\n\n const response: {\n id: string;\n responseId: string;\n usage: any;\n output: AgentOutputItem[];\n plan?: { items: any[] };\n } = {\n id: responseId,\n responseId,\n usage: usageData,\n output,\n };\n\n if (latestPlan) {\n response.plan = { items: latestPlan.items };\n }\n\n return response;\n }\n\n /**\n * Convert Codex ThreadEvent to OpenAI Agents StreamEvent\n */\n private convertCodexEventToStreamEvent(\n event: ThreadEvent,\n textAccumulator: Map<string, string>\n ): StreamEvent[] {\n const events: StreamEvent[] = [];\n\n switch (event.type) {\n case \"thread.started\": {\n events.push({ type: \"response_started\" });\n // Also emit OpenAI-style start event for Agents Runner\n const responseId = this.thread?.id ?? \"codex-stream-response\";\n events.push({\n type: \"response.created\",\n response: { id: responseId },\n } as unknown as StreamEvent);\n break;\n }\n\n case \"turn.started\":\n // No equivalent in StreamEvent - skip\n this.streamedTurnItems = [];\n this.lastStreamedMessage = null;\n break;\n\n case \"item.started\":\n // Initialize accumulator for this item\n if (event.item.type === \"agent_message\" || event.item.type === \"reasoning\") {\n const itemKey = `${event.item.type}`;\n textAccumulator.set(itemKey, \"\");\n }\n break;\n\n case \"background_event\":\n events.push({\n type: \"model\",\n event: {\n type: \"background_event\",\n message: event.message,\n },\n } as StreamEvent);\n break;\n\n case \"item.updated\":\n // Emit delta events for incremental text updates\n if (event.item.type === \"agent_message\") {\n const itemKey = \"agent_message\";\n const previousText = textAccumulator.get(itemKey) || \"\";\n const currentText = event.item.text;\n\n // Validate: current text should be longer than previous (no backwards updates)\n if (currentText.length < previousText.length) {\n console.warn(\"Received backwards update for text - ignoring delta\");\n break;\n }\n\n if (currentText.length > previousText.length) {\n const delta = currentText.slice(previousText.length);\n textAccumulator.set(itemKey, currentText);\n\n // Codex SDK delta\n events.push({\n type: \"output_text_delta\",\n delta,\n });\n // OpenAI Responses-style delta for Agents Runner\n events.push({\n type: \"response.output_text.delta\",\n delta,\n } as unknown as StreamEvent);\n }\n } else if (event.item.type === \"reasoning\") {\n const itemKey = \"reasoning\";\n const previousText = textAccumulator.get(itemKey) || \"\";\n const currentText = event.item.text;\n\n if (currentText.length > previousText.length) {\n const delta = currentText.slice(previousText.length);\n textAccumulator.set(itemKey, currentText);\n\n // Use \"model\" type for custom reasoning events\n events.push({\n type: \"model\",\n event: {\n type: \"reasoning_delta\",\n delta,\n },\n } as StreamEvent);\n }\n }\n break;\n\n case \"item.completed\":\n this.streamedTurnItems.push(event.item);\n\n if (event.item.type === \"agent_message\") {\n // Final text is available in response_done; we only clear accumulator here.\n textAccumulator.delete(\"agent_message\");\n this.lastStreamedMessage = event.item.text;\n } else if (event.item.type === \"reasoning\") {\n events.push({\n type: \"model\",\n event: {\n type: \"reasoning_done\",\n reasoning: event.item.text,\n },\n } as StreamEvent);\n textAccumulator.delete(\"reasoning\");\n } else if (event.item.type === \"todo_list\") {\n // Emit plan update event for OpenAI Agents consumers\n events.push({\n type: \"model\",\n event: {\n type: \"plan_update\",\n items: event.item.items,\n },\n } as StreamEvent);\n }\n break;\n\n case \"turn.completed\": {\n // Emit response done with full response\n const usage = this.convertUsage(event.usage);\n const responseId = this.thread?.id ?? \"codex-stream-response\";\n const response = this.buildStreamResponse(\n usage,\n responseId,\n this.streamedTurnItems,\n this.lastStreamedMessage\n );\n this.streamedTurnItems = [];\n this.lastStreamedMessage = null;\n\n // Emit OpenAI Responses-style completion before the Codex-specific finale\n // Map usage to snake_case and include final output_text if available\n events.push({\n type: \"response.completed\",\n response: {\n id: response.id,\n usage: {\n input_tokens: usage.inputTokens,\n input_tokens_details: usage.inputTokensDetails?.[0] ?? null,\n output_tokens: usage.outputTokens,\n output_tokens_details: usage.outputTokensDetails?.[0] ?? null,\n total_tokens: usage.totalTokens,\n },\n ...(response.output && response.output.length > 0\n ? {\n output: response.output.map((item) => {\n if (item.type === \"message\" && item.role === \"assistant\") {\n return {\n id: item.id ?? \"msg_1\",\n role: item.role,\n content: item.content,\n };\n }\n return item;\n }),\n output_text:\n response.output\n .filter((item): item is AssistantMessageItem =>\n item.type === \"message\" && item.role === \"assistant\"\n )[0]?.content?.find(\n (c) => c.type === \"output_text\"\n )?.text ?? (this.lastStreamedMessage ?? \"\"),\n }\n : {}),\n },\n } as unknown as StreamEvent);\n\n // Codex SDK stream event (used by formatStream) should remain the terminal event\n events.push({\n type: \"response_done\",\n response,\n } as StreamEvent);\n break;\n }\n\n case \"turn.failed\":\n events.push({\n type: \"model\",\n event: {\n type: \"error\",\n error: {\n message: event.error.message,\n },\n },\n } as StreamEvent);\n break;\n\n case \"error\":\n events.push({\n type: \"model\",\n event: {\n type: \"error\",\n error: {\n message: event.message,\n },\n },\n } as StreamEvent);\n break;\n\n case \"raw_event\":\n break;\n\n default:\n break;\n }\n\n // Only include raw events for non-raw_event inputs\n if ((event as Record<string, unknown>)?.type !== \"raw_event\") {\n const rawEvent = {\n type: \"raw_event\",\n raw: event,\n } as unknown as StreamEvent;\n\n if (events.length === 0) {\n return [rawEvent];\n }\n\n const result = [...events];\n const insertIndex = Math.min(1, result.length);\n result.splice(insertIndex, 0, rawEvent);\n return result;\n }\n\n return events;\n }\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\n/**\n * Accept OpenAI Agents outputType when it is:\n * - A plain JSON schema object\n * - An OpenAI-style wrapper: { type: 'json_schema', json_schema: { name?, strict?, schema } }\n * - A lenient wrapper: { schema, strict?, name? }\n * Otherwise, return undefined (text output).\n */\nfunction normalizeAgentsOutputType(outputType: unknown): unknown | undefined {\n if (!isObject(outputType)) return undefined;\n const outType = outputType as Record<string, unknown>;\n // Wrapper form with explicit discriminator\n const t = typeof outType.type === \"string\" ? (outType.type as string) : undefined;\n if (t === \"json_schema\" || t === \"json-schema\") {\n // Support both { type: 'json_schema', schema: {...} } and\n // { type: 'json_schema', json_schema: { schema: {...} } }\n const topLevelSchema = outType.schema;\n if (isObject(topLevelSchema)) {\n return topLevelSchema;\n }\n const nested = outType.json_schema;\n if (isObject(nested)) {\n const nestedSchema = (nested as Record<string, unknown>).schema;\n if (isObject(nestedSchema)) {\n return nestedSchema;\n }\n }\n return undefined;\n }\n // Lenient wrapper { schema: {...} }\n if (\"schema\" in outType && isObject(outType.schema)) {\n return outType.schema as Record<string, unknown>;\n }\n // Plain JSON schema (must look like a schema)\n if (\n (\"type\" in outType && outType.type === \"object\") ||\n \"properties\" in outType ||\n \"required\" in outType\n ) {\n return outType;\n }\n return undefined;\n}\n","export type {\n ModelProvider,\n Model,\n ModelRequest,\n ModelResponse,\n ModelSettings,\n ModelSettingsToolChoice,\n SerializedTool,\n SerializedHandoff,\n SerializedOutputType,\n} from \"@openai/agents-core\";\n\nexport type { Prompt } from \"@openai/agents-core/model\";\n\nexport type {\n AgentInputItem,\n AgentOutputItem,\n AssistantMessageItem,\n StreamEvent,\n TextOutput as OutputText,\n} from \"@openai/agents-core\";\n\nexport { Usage } from \"@openai/agents-core\";\n","import { tool } from \"@openai/agents\";\nimport type { ToolExecutor, ToolExecutorResult } from \"./toolRegistry\";\nimport { registerCodexToolExecutor } from \"./toolRegistry\";\n\ntype BaseToolOptions = Parameters<typeof tool>[0];\ntype AgentTool = ReturnType<typeof tool>;\n\nexport type CodexToolOptions = BaseToolOptions & {\n codexExecute?: (input: unknown) => Promise<unknown> | unknown;\n};\n\nexport function codexTool(options: CodexToolOptions): AgentTool {\n const { codexExecute, ...delegate } = options;\n const agentTool = tool(delegate as BaseToolOptions);\n\n // Use codexExecute if provided, otherwise use execute from the tool options\n const executeFn = codexExecute ?? (delegate as BaseToolOptions).execute;\n const executor = createCodexExecutor(agentTool.name, executeFn);\n registerCodexToolExecutor(agentTool.name, executor);\n\n return agentTool;\n}\n\nfunction createCodexExecutor(toolName: string, customExecutor: (input: unknown) => Promise<unknown> | unknown): ToolExecutor {\n return async ({ arguments: args }) => {\n const parsedArgs = args ?? {};\n try {\n const result = await customExecutor(parsedArgs);\n return result as ToolExecutorResult;\n } catch (error) {\n throw new Error(`Codex tool '${toolName}' failed: ${error instanceof Error ? error.message : String(error)}`);\n }\n };\n}\n","import type { StreamEvent } from \"./types\";\n\ntype UsageObject = {\n inputTokensDetails?: Array<Record<string, number>>;\n outputTokensDetails?: Array<Record<string, number>>;\n requests?: number;\n inputTokens?: number;\n outputTokens?: number;\n totalTokens?: number;\n};\n\ntype ModelEvent = {\n type?: string;\n delta?: string;\n reasoning?: string;\n error?: { message?: string };\n name?: string;\n input?: unknown;\n output?: unknown;\n status?: string;\n};\n\nexport type ToolCallEvent = {\n name?: string;\n input?: unknown;\n output?: unknown;\n status?: \"started\" | \"completed\";\n};\n\nexport type FormattedStream = {\n text: string;\n reasoning: string;\n toolCalls: ToolCallEvent[];\n usage?: {\n requests?: number;\n inputTokens: number;\n outputTokens: number;\n totalTokens: number;\n inputTokensDetails?: Record<string, number>;\n outputTokensDetails?: Record<string, number>;\n };\n /**\n * Convenience field when providers report cached tokens (e.g. via inputTokensDetails.cachedTokens)\n */\n cachedTokens?: number;\n responseId?: string;\n /**\n * Raw provider-specific data (e.g., costs, cache hit ratios, rate limit info)\n */\n providerData?: Record<string, unknown>;\n errors: { message: string }[];\n};\n\nexport type FormatStreamOptions = {\n onUpdate?: (partial: Partial<FormattedStream>) => void;\n};\n\n/**\n * Consume a stream of StreamEvent and aggregate into a coherent object:\n * - Concatenates output_text deltas into `text`\n * - Concatenates reasoning deltas into `reasoning`\n * - Captures usage and responseId on response_done\n * - Prepares space for tool call events (future-friendly; empty for now)\n *\n * Optionally invokes `onUpdate` with partial snapshots as data arrives.\n */\nexport async function formatStream(\n stream: AsyncIterable<StreamEvent>,\n options: FormatStreamOptions = {},\n): Promise<FormattedStream> {\n const state: FormattedStream = {\n text: \"\",\n reasoning: \"\",\n toolCalls: [],\n usage: {\n inputTokens: 0,\n outputTokens: 0,\n totalTokens: 0,\n },\n errors: [],\n };\n\n for await (const event of stream) {\n switch (event.type) {\n case \"response_started\":\n // emit initial usage snapshot\n options.onUpdate?.({ usage: state.usage });\n break;\n case \"output_text_delta\":\n state.text += event.delta;\n options.onUpdate?.({ text: state.text });\n break;\n case \"model\": {\n const e = (event as { event?: unknown }).event as ModelEvent;\n if (e && typeof e === \"object\") {\n if (e.type === \"reasoning_delta\" && typeof e.delta === \"string\") {\n state.reasoning += e.delta;\n options.onUpdate?.({ reasoning: state.reasoning });\n } else if (e.type === \"reasoning_done\" && typeof e.reasoning === \"string\") {\n // Ensure final reasoning is reflected (prefer completed text if provided)\n state.reasoning = e.reasoning || state.reasoning;\n options.onUpdate?.({ reasoning: state.reasoning });\n } else if (e.type === \"error\" && e.error && typeof e.error.message === \"string\") {\n state.errors.push({ message: e.error.message });\n options.onUpdate?.({ errors: state.errors.slice() });\n } else if (typeof e.type === \"string\" && e.type.startsWith(\"tool_\")) {\n // Future-friendly hook for tool events if surfaced via \"model\" channel\n state.toolCalls.push({\n name: e.name,\n input: e.input,\n output: e.output,\n status: e.status === \"started\" || e.status === \"completed\" ? e.status : undefined,\n });\n options.onUpdate?.({ toolCalls: state.toolCalls.slice() });\n }\n }\n break;\n }\n case \"response_done\":\n state.responseId = event.response.id;\n // Normalize usage into a plain object and compute cachedTokens if present\n {\n const u = event.response.usage as UsageObject;\n // Merge details arrays (agents-core uses arrays for details)\n const mergeDetails = (arr?: Array<Record<string, number>>): Record<string, number> | undefined => {\n if (!arr || arr.length === 0) return undefined;\n const out: Record<string, number> = {};\n for (const rec of arr) {\n for (const [k, v] of Object.entries(rec)) {\n out[k] = (out[k] ?? 0) + (typeof v === \"number\" ? v : 0);\n }\n }\n return out;\n };\n const inputDetails = mergeDetails(u.inputTokensDetails);\n const outputDetails = mergeDetails(u.outputTokensDetails);\n state.usage = {\n requests: u.requests,\n inputTokens: u.inputTokens ?? 0,\n outputTokens: u.outputTokens ?? 0,\n totalTokens: u.totalTokens ?? 0,\n inputTokensDetails: inputDetails,\n outputTokensDetails: outputDetails,\n };\n state.cachedTokens = inputDetails?.cachedTokens ?? state.cachedTokens;\n }\n // Provider-specific data passthrough (may include cost, cache stats, etc.)\n if (event.response.providerData && typeof event.response.providerData === \"object\") {\n state.providerData = event.response.providerData as Record<string, unknown>;\n options.onUpdate?.({ providerData: state.providerData });\n }\n options.onUpdate?.({ responseId: state.responseId, usage: state.usage, cachedTokens: state.cachedTokens });\n break;\n default:\n // ignore unknown events\n break;\n }\n }\n\n return state;\n}\n\n\n","import type {\n Event as OpencodeEvent,\n OpencodeClient,\n Permission,\n Session,\n SessionPromptResponses,\n} from \"@opencode-ai/sdk\";\nimport type { Usage } from \"../events\";\nimport net from \"node:net\";\nimport type { AddressInfo } from \"node:net\";\n\nexport type PermissionDecision = boolean | \"once\" | \"always\" | \"reject\" | { response: \"once\" | \"always\" | \"reject\" };\n\nconst DEFAULT_MODEL = \"anthropic/claude-sonnet-4-5-20250929\";\nconst DEFAULT_HOSTNAME = \"127.0.0.1\";\nconst DEFAULT_PORT = 4096;\n\ntype OpencodeModule = typeof import(\"@opencode-ai/sdk\");\n\nlet opencodeModulePromise: Promise<OpencodeModule> | null = null;\n\nasync function loadOpencodeModule(): Promise<OpencodeModule> {\n if (!opencodeModulePromise) {\n opencodeModulePromise = import(\"@opencode-ai/sdk\");\n }\n return opencodeModulePromise;\n}\n\nasync function isPortAvailable(port: number, host: string): Promise<boolean> {\n return new Promise((resolve) => {\n const tester = net.createServer()\n .once(\"error\", () => resolve(false))\n .once(\"listening\", () => tester.close(() => resolve(true)))\n .listen(port, host);\n });\n}\n\nasync function findAvailablePort(host: string, preferred?: number): Promise<number> {\n if (preferred !== undefined && (await isPortAvailable(preferred, host))) {\n return preferred;\n }\n\n return new Promise((resolve, reject) => {\n const server = net.createServer();\n server.once(\"error\", reject);\n server.listen(0, host, () => {\n const address = server.address();\n if (!address || typeof address === \"string\") {\n server.close(() => reject(new Error(\"Failed to determine available port\")));\n return;\n }\n const { port } = address as AddressInfo;\n server.close(() => resolve(port));\n });\n });\n}\n\nexport interface PermissionRequest {\n id: string;\n type: string;\n title: string;\n sessionId: string;\n metadata: Record<string, unknown>;\n pattern?: string | string[];\n}\n\nexport interface OpenCodeAgentOptions {\n /** Fully qualified base URL for an existing opencode server. When omitted the agent will start its own server. */\n baseUrl?: string;\n /** Hostname passed to `createOpencode` when auto-starting the server. */\n hostname?: string;\n /** Port passed to `createOpencode` when auto-starting the server. */\n port?: number;\n /** Additional configuration forwarded to `createOpencode`. */\n config?: Record<string, unknown>;\n /** Preferred model string in the form `provider/model`. */\n model?: string;\n /** Directory the OpenCode session should operate within. Defaults to the current working directory. */\n workingDirectory?: string;\n /** Optional user-friendly session title. */\n title?: string;\n /** Callback invoked whenever opencode asks for a permission decision. */\n onApprovalRequest?: (request: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n /** Override for tests – returns a hydrated opencode client. */\n clientFactory?: () => Promise<{ client: OpencodeClient; close?: () => void }>;\n}\n\nexport interface DelegationResult {\n sessionId: string;\n /** Deprecated alias retained for backwards compatibility. */\n threadId?: string;\n output: string;\n success: boolean;\n error?: string;\n usage?: Usage | null;\n}\n\ntype PromptResponse = SessionPromptResponses[keyof SessionPromptResponses];\n\nexport class OpenCodeAgent {\n private readonly options: OpenCodeAgentOptions;\n private readonly approvalHandler?: (request: PermissionRequest) => PermissionDecision | Promise<PermissionDecision>;\n private clientPromise?: Promise<OpencodeClient>;\n private closeCallback?: () => void;\n\n constructor(options: OpenCodeAgentOptions = {}) {\n this.options = options;\n this.approvalHandler = options.onApprovalRequest;\n }\n\n /**\n * Cleanup method to shut down the OpenCode server if one was started.\n * Should be called when done using the agent to prevent zombie processes.\n */\n async close(): Promise<void> {\n if (this.closeCallback) {\n this.closeCallback();\n this.closeCallback = undefined;\n }\n }\n\n async delegate(task: string): Promise<DelegationResult> {\n return this.executeTask(task);\n }\n\n async delegateStreaming(task: string, onEvent?: (event: OpencodeEvent) => void, sessionId?: string): Promise<DelegationResult> {\n return this.executeTask(task, { sessionId, onEvent });\n }\n\n async resume(sessionId: string, task: string): Promise<DelegationResult> {\n return this.executeTask(task, { sessionId });\n }\n\n async workflow(steps: string[]): Promise<DelegationResult[]> {\n const results: DelegationResult[] = [];\n let sessionId: string | undefined;\n\n for (const step of steps) {\n const result = await this.executeTask(step, { sessionId });\n results.push(result);\n if (!result.success) {\n break;\n }\n sessionId = result.sessionId;\n }\n\n return results;\n }\n\n private async executeTask(prompt: string, options?: { sessionId?: string; onEvent?: (event: OpencodeEvent) => void }): Promise<DelegationResult> {\n let sessionId = options?.sessionId;\n try {\n const client = await this.ensureClient();\n sessionId = await this.ensureSession(client, sessionId, prompt);\n\n const shouldStream = Boolean(this.approvalHandler || options?.onEvent);\n const controller = new AbortController();\n const watcher = shouldStream\n ? this.watchEvents(client, sessionId, options?.onEvent, controller.signal).catch((error) => {\n if (!controller.signal.aborted) {\n throw error;\n }\n })\n : null;\n\n try {\n const promptBody: NonNullable<Parameters<OpencodeClient[\"session\"][\"prompt\"]>[0]>[\"body\"] = {\n parts: [{ type: \"text\", text: prompt }],\n };\n\n const parsedModel = this.parseModel(this.options.model ?? DEFAULT_MODEL);\n if (parsedModel) {\n promptBody.model = parsedModel;\n }\n\n const response = await client.session.prompt({\n path: { id: sessionId },\n body: promptBody,\n query: { directory: this.getWorkingDirectory() },\n });\n\n const data = this.extractData<PromptResponse>(response);\n return {\n sessionId,\n threadId: sessionId,\n output: this.collectText(data),\n success: true,\n usage: this.toUsage(data),\n };\n } finally {\n if (watcher) {\n controller.abort();\n await watcher;\n }\n }\n } catch (error) {\n return {\n sessionId: sessionId ?? \"\",\n threadId: sessionId,\n output: \"\",\n success: false,\n error: error instanceof Error ? error.message : String(error),\n };\n }\n }\n\n private async ensureClient(): Promise<OpencodeClient> {\n if (this.clientPromise) {\n return this.clientPromise;\n }\n\n if (this.options.clientFactory) {\n this.clientPromise = this.options.clientFactory().then(({ client }) => client);\n return this.clientPromise;\n }\n\n if (this.options.baseUrl) {\n this.clientPromise = loadOpencodeModule().then(({ createOpencodeClient }) =>\n createOpencodeClient({\n baseUrl: this.options.baseUrl!,\n }),\n );\n return this.clientPromise;\n }\n\n this.clientPromise = loadOpencodeModule().then(async ({ createOpencode }) => {\n const hostname = this.options.hostname ?? DEFAULT_HOSTNAME;\n const port = await findAvailablePort(hostname, this.options.port ?? DEFAULT_PORT);\n const { client, server } = await createOpencode({ hostname, port, config: this.options.config });\n this.closeCallback = () => server.close();\n return client;\n });\n\n return this.clientPromise;\n }\n\n private async ensureSession(client: OpencodeClient, existingId: string | undefined, prompt: string): Promise<string> {\n if (existingId) {\n return existingId;\n }\n\n const result = await client.session.create({\n body: {\n title: this.options.title ?? this.createSessionTitle(prompt),\n },\n query: { directory: this.getWorkingDirectory() },\n });\n\n const session = this.extractData<Session>(result);\n return session.id;\n }\n\n private createSessionTitle(prompt: string): string {\n const [firstLineRaw = \"\"] = prompt.trim().split(/\\r?\\n/);\n const firstLine = firstLineRaw || \"OpenCode Session\";\n return firstLine.length > 60 ? `${firstLine.slice(0, 57)}...` : firstLine;\n }\n\n private parseModel(model?: string): { providerID: string; modelID: string } | undefined {\n if (!model) {\n return undefined;\n }\n\n if (model.includes(\"/\")) {\n const [providerPart, modelPart] = model.split(\"/\", 2);\n const providerID = providerPart || \"anthropic\";\n const modelID = modelPart || providerPart || model;\n return { providerID, modelID };\n }\n\n return { providerID: \"anthropic\", modelID: model };\n }\n\n private collectText(response: PromptResponse): string {\n const texts = response.parts?.filter((part) => part.type === \"text\") ?? [];\n return texts.map((part) => part.text).join(\"\\n\").trim();\n }\n\n private toUsage(response: PromptResponse): Usage | null {\n const tokens = response.info?.tokens;\n if (!tokens) {\n return null;\n }\n\n return {\n input_tokens: tokens.input ?? 0,\n output_tokens: tokens.output ?? 0,\n cached_input_tokens: tokens.cache?.read ?? 0,\n };\n }\n\n private extractData<T>(result: unknown): T {\n if (result && typeof result === \"object\" && \"data\" in result) {\n const record = result as { data?: T; error?: unknown };\n if (record.data !== undefined) {\n return record.data;\n }\n\n throw new Error(this.describeError(record.error));\n }\n\n return result as T;\n }\n\n private describeError(error: unknown): string {\n if (!error) {\n return \"Unknown OpenCode error\";\n }\n\n if (typeof error === \"string\") {\n return error;\n }\n\n if (error instanceof Error) {\n return error.message;\n }\n\n if (typeof error === \"object\" && \"message\" in error && typeof (error as any).message === \"string\") {\n return (error as any).message;\n }\n\n return JSON.stringify(error);\n }\n\n private async watchEvents(\n client: OpencodeClient,\n sessionId: string,\n onEvent: ((event: OpencodeEvent) => void) | undefined,\n signal: AbortSignal,\n ): Promise<void> {\n const { stream } = await client.event.subscribe({\n signal,\n query: { directory: this.getWorkingDirectory() },\n });\n const handledPermissions = new Set<string>();\n\n for await (const event of stream) {\n if (signal.aborted) {\n break;\n }\n\n const targetSessionId = this.extractSessionId(event);\n if (this.approvalHandler && event.type === \"permission.updated\") {\n const permission = event.properties as Permission;\n if (permission.sessionID === sessionId && !handledPermissions.has(permission.id)) {\n handledPermissions.add(permission.id);\n await this.respondToPermission(client, permission);\n }\n }\n\n if (onEvent && targetSessionId === sessionId) {\n onEvent(event);\n }\n }\n }\n\n private extractSessionId(event: OpencodeEvent): string | undefined {\n const properties: Record<string, unknown> | undefined = (event as any).properties;\n if (!properties) {\n return undefined;\n }\n\n if (typeof properties.sessionID === \"string\") {\n return properties.sessionID;\n }\n\n if (typeof properties.info === \"object\" && properties.info !== null && \"sessionID\" in (properties.info as Record<string, unknown>)) {\n const value = (properties.info as Record<string, unknown>).sessionID;\n return typeof value === \"string\" ? value : undefined;\n }\n\n return undefined;\n }\n\n private async respondToPermission(client: OpencodeClient, permission: Permission): Promise<void> {\n if (!this.approvalHandler) {\n return;\n }\n\n const decision = await this.approvalHandler({\n id: permission.id,\n type: permission.type,\n title: permission.title,\n sessionId: permission.sessionID,\n metadata: (permission.metadata ?? {}) as Record<string, unknown>,\n pattern: Array.isArray(permission.pattern) ? permission.pattern.slice() : permission.pattern,\n });\n\n const response = this.normalizeDecision(decision);\n await client.postSessionIdPermissionsPermissionId({\n path: {\n id: permission.sessionID,\n permissionID: permission.id,\n },\n body: { response },\n });\n }\n\n private normalizeDecision(decision: PermissionDecision): \"once\" | \"always\" | \"reject\" {\n if (typeof decision === \"boolean\") {\n return decision ? \"once\" : \"reject\";\n }\n\n if (typeof decision === \"string\") {\n return decision;\n }\n\n return decision.response;\n }\n\n private getWorkingDirectory(): string {\n return this.options.workingDirectory ?? process.cwd();\n }\n}\n","import { getNativeBinding } from \"./nativeBinding\";\n\n// Types reflect the Rust JSON (snake_case) to avoid extra transforms.\nexport type CloudTaskStatus = \"pending\" | \"ready\" | \"applied\" | \"error\";\n\nexport type DiffSummary = {\n files_changed: number;\n lines_added: number;\n lines_removed: number;\n};\n\nexport type CloudTaskSummary = {\n id: string; // serde transparent TaskId\n title: string;\n status: CloudTaskStatus;\n updated_at: string; // ISO timestamp\n environment_id?: string | null;\n environment_label?: string | null;\n summary: DiffSummary;\n is_review?: boolean;\n attempt_total?: number | null;\n};\n\nexport type CloudApplyStatus = \"success\" | \"partial\" | \"error\";\n\nexport type CloudApplyOutcome = {\n applied: boolean;\n status: CloudApplyStatus;\n message: string;\n skipped_paths: string[];\n conflict_paths: string[];\n};\n\nexport type CloudTaskCreateResult = {\n id: string;\n};\n\nexport type CloudTasksOptions = {\n baseUrl?: string;\n apiKey?: string;\n};\n\nexport class CloudTasks {\n constructor(private readonly options: CloudTasksOptions = {}) {}\n\n private binding() {\n const b = getNativeBinding();\n if (!b) throw new Error(\"Native binding not available\");\n return b;\n }\n\n async list(env?: string): Promise<CloudTaskSummary[]> {\n const b = this.binding();\n if (!b.cloudTasksList) throw new Error(\"cloudTasksList is not available in this build\");\n const json = await b.cloudTasksList(env, this.options.baseUrl, this.options.apiKey);\n return JSON.parse(json) as CloudTaskSummary[];\n }\n\n async getDiff(taskId: string): Promise<string | null> {\n const b = this.binding();\n if (!b.cloudTasksGetDiff) throw new Error(\"cloudTasksGetDiff is not available in this build\");\n const json = await b.cloudTasksGetDiff(taskId, this.options.baseUrl, this.options.apiKey);\n const parsed = JSON.parse(json) as { diff: string | null };\n return parsed.diff ?? null;\n }\n\n async applyPreflight(taskId: string, diffOverride?: string): Promise<CloudApplyOutcome> {\n const b = this.binding();\n if (!b.cloudTasksApplyPreflight) {\n throw new Error(\"cloudTasksApplyPreflight is not available in this build\");\n }\n const json = await b.cloudTasksApplyPreflight(\n taskId,\n diffOverride,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudApplyOutcome;\n }\n\n async apply(taskId: string, diffOverride?: string): Promise<CloudApplyOutcome> {\n const b = this.binding();\n if (!b.cloudTasksApply) throw new Error(\"cloudTasksApply is not available in this build\");\n const json = await b.cloudTasksApply(\n taskId,\n diffOverride,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudApplyOutcome;\n }\n\n async create(\n envId: string,\n prompt: string,\n opts?: { gitRef?: string; qaMode?: boolean; bestOfN?: number },\n ): Promise<CloudTaskCreateResult> {\n const b = this.binding();\n if (!b.cloudTasksCreate) throw new Error(\"cloudTasksCreate is not available in this build\");\n const json = await b.cloudTasksCreate(\n envId,\n prompt,\n opts?.gitRef,\n opts?.qaMode,\n opts?.bestOfN,\n this.options.baseUrl,\n this.options.apiKey,\n );\n return JSON.parse(json) as CloudTaskCreateResult;\n }\n}\n\n\n","import type { Usage } from \"../events\";\n\n/**\n * Log level enumeration\n */\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARN = 2,\n ERROR = 3,\n SILENT = 4,\n}\n\n/**\n * Log scopes for different subsystems\n */\nexport type LogScope =\n | \"thread\"\n | \"merge\"\n | \"git\"\n | \"coordinator\"\n | \"worker\"\n | \"supervisor\"\n | \"reviewer\"\n | \"validation\"\n | \"lsp\"\n | \"agent\"\n | \"provider\"\n | \"ci\"\n | \"test\"\n | \"system\";\n\n/**\n * Configuration for logger instances\n */\nexport interface LoggerConfig {\n /** Minimum log level to output */\n level?: LogLevel;\n /** Enable colored output (default: true for TTY) */\n colors?: boolean;\n /** Include timestamps in output (default: false) */\n timestamps?: boolean;\n /** Prefix for all log messages */\n prefix?: string;\n /** Enable structured JSON output instead of formatted text */\n json?: boolean;\n /** Custom output stream (default: console) */\n output?: LogOutput;\n}\n\n/**\n * Output interface for log messages\n */\nexport interface LogOutput {\n debug(message: string): void;\n info(message: string): void;\n warn(message: string): void;\n error(message: string): void;\n}\n\n/**\n * Thread logging sink interface\n */\nexport interface ThreadLoggingSink {\n info(message: string): void;\n warn(message: string): void;\n recordUsage?(usage: Usage): void;\n}\n\n/**\n * Structured log entry for JSON output\n */\nexport interface LogEntry {\n timestamp: string;\n level: string;\n scope?: string;\n subject?: string;\n message: string;\n data?: Record<string, unknown>;\n}\n","import type { LogLevel, LogScope, LoggerConfig, LogOutput, LogEntry, ThreadLoggingSink } from \"./types\";\nimport { LogLevel as Level } from \"./types\";\n\n/**\n * ANSI color codes for different log levels and scopes\n */\nconst COLORS = {\n reset: \"\\x1b[0m\",\n // Log levels\n debug: \"\\x1b[90m\", // Gray\n info: \"\\x1b[36m\", // Cyan\n warn: \"\\x1b[33m\", // Yellow\n error: \"\\x1b[31m\", // Red\n // Scopes\n thread: \"\\x1b[94m\", // Bright blue\n merge: \"\\x1b[35m\", // Magenta\n git: \"\\x1b[34m\", // Blue\n coordinator: \"\\x1b[36m\", // Cyan\n worker: \"\\x1b[33m\", // Yellow\n supervisor: \"\\x1b[95m\", // Bright magenta\n reviewer: \"\\x1b[32m\", // Green\n validation: \"\\x1b[92m\", // Bright green\n lsp: \"\\x1b[96m\", // Bright cyan\n agent: \"\\x1b[93m\", // Bright yellow\n provider: \"\\x1b[91m\", // Bright red\n ci: \"\\x1b[35m\", // Magenta\n test: \"\\x1b[32m\", // Green\n system: \"\\x1b[37m\", // White\n};\n\n/**\n * Default console output\n */\nconst consoleOutput: LogOutput = {\n debug: (msg) => console.debug(msg),\n info: (msg) => console.log(msg),\n warn: (msg) => console.warn(msg),\n error: (msg) => console.error(msg),\n};\n\n/**\n * Centralized logger with support for scopes, levels, and structured output\n */\nexport class Logger {\n private level: LogLevel;\n private colors: boolean;\n private timestamps: boolean;\n private prefix: string;\n private json: boolean;\n private output: LogOutput;\n\n constructor(config: LoggerConfig = {}) {\n this.level = config.level ?? Level.INFO;\n this.colors = config.colors ?? (typeof process !== \"undefined\" && process.stdout?.isTTY === true);\n this.timestamps = config.timestamps ?? false;\n this.prefix = config.prefix ?? \"\";\n this.json = config.json ?? false;\n this.output = config.output ?? consoleOutput;\n }\n\n /**\n * Create a new logger with modified configuration\n */\n configure(config: Partial<LoggerConfig>): Logger {\n return new Logger({\n level: config.level ?? this.level,\n colors: config.colors ?? this.colors,\n timestamps: config.timestamps ?? this.timestamps,\n prefix: config.prefix ?? this.prefix,\n json: config.json ?? this.json,\n output: config.output ?? this.output,\n });\n }\n\n /**\n * Create a scoped logger\n */\n scope(scope: LogScope, subject?: string): ScopedLogger {\n return new ScopedLogger(this, scope, subject);\n }\n\n /**\n * Log a debug message\n */\n debug(message: string, data?: Record<string, unknown>): void {\n this.log(Level.DEBUG, message, data);\n }\n\n /**\n * Log an info message\n */\n info(message: string, data?: Record<string, unknown>): void {\n this.log(Level.INFO, message, data);\n }\n\n /**\n * Log a warning message\n */\n warn(message: string, data?: Record<string, unknown>): void {\n this.log(Level.WARN, message, data);\n }\n\n /**\n * Log an error message\n */\n error(message: string, data?: Record<string, unknown>): void {\n this.log(Level.ERROR, message, data);\n }\n\n /**\n * Internal log method\n */\n private log(level: LogLevel, message: string, data?: Record<string, unknown>, scope?: LogScope, subject?: string): void {\n if (level < this.level) {\n return;\n }\n\n if (this.json) {\n this.logJson(level, message, data, scope, subject);\n } else {\n this.logFormatted(level, message, scope, subject);\n }\n }\n\n /**\n * Log in JSON format\n */\n private logJson(level: LogLevel, message: string, data?: Record<string, unknown>, scope?: LogScope, subject?: string): void {\n const entry: LogEntry = {\n timestamp: new Date().toISOString(),\n level: Level[level],\n message,\n ...(scope && { scope }),\n ...(subject && { subject }),\n ...(data && { data }),\n };\n\n const output = JSON.stringify(entry);\n this.output.info(output);\n }\n\n /**\n * Log in formatted text\n */\n private logFormatted(level: LogLevel, message: string, scope?: LogScope, subject?: string): void {\n const parts: string[] = [];\n\n // Timestamp\n if (this.timestamps) {\n const ts = new Date().toISOString();\n parts.push(this.colors ? `\\x1b[90m[${ts}]\\x1b[0m` : `[${ts}]`);\n }\n\n // Level\n const levelName = Level[level];\n if (this.colors) {\n const color = COLORS[levelName.toLowerCase() as keyof typeof COLORS] ?? COLORS.reset;\n parts.push(`${color}[${levelName}]${COLORS.reset}`);\n } else {\n parts.push(`[${levelName}]`);\n }\n\n // Scope and subject\n if (scope) {\n const label = subject ? `${scope}:${subject}` : scope;\n if (this.colors) {\n const color = COLORS[scope] ?? COLORS.reset;\n parts.push(`${color}[${label}]${COLORS.reset}`);\n } else {\n parts.push(`[${label}]`);\n }\n }\n\n // Prefix\n if (this.prefix) {\n parts.push(this.prefix);\n }\n\n // Message\n parts.push(message);\n\n const formatted = parts.join(\" \");\n\n // Output based on level\n switch (level) {\n case Level.DEBUG:\n this.output.debug(formatted);\n break;\n case Level.INFO:\n this.output.info(formatted);\n break;\n case Level.WARN:\n this.output.warn(formatted);\n break;\n case Level.ERROR:\n this.output.error(formatted);\n break;\n }\n }\n\n /**\n * Internal scoped log method (used by ScopedLogger)\n */\n logScoped(level: LogLevel, message: string, scope: LogScope, subject?: string, data?: Record<string, unknown>): void {\n this.log(level, message, data, scope, subject);\n }\n}\n\n/**\n * Scoped logger for a specific subsystem\n */\nexport class ScopedLogger {\n constructor(\n private logger: Logger,\n private scope: LogScope,\n private subject?: string,\n ) {}\n\n /**\n * Log a debug message\n */\n debug(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.DEBUG, message, this.scope, this.subject, data);\n }\n\n /**\n * Log an info message\n */\n info(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.INFO, message, this.scope, this.subject, data);\n }\n\n /**\n * Log a warning message\n */\n warn(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.WARN, message, this.scope, this.subject, data);\n }\n\n /**\n * Log an error message\n */\n error(message: string, data?: Record<string, unknown>): void {\n this.logger.logScoped(Level.ERROR, message, this.scope, this.subject, data);\n }\n\n /**\n * Create a ThreadLoggingSink adapter\n */\n asThreadSink(): ThreadLoggingSink {\n return {\n info: (message: string) => this.info(message),\n warn: (message: string) => this.warn(message),\n };\n }\n}\n\n/**\n * Global default logger instance\n */\nexport const logger = new Logger({\n level: process.env.CODEX_LOG_LEVEL\n ? (Level[process.env.CODEX_LOG_LEVEL as keyof typeof Level] ?? Level.INFO)\n : Level.INFO,\n colors: process.env.CODEX_LOG_COLORS !== \"false\",\n timestamps: process.env.CODEX_LOG_TIMESTAMPS === \"true\",\n json: process.env.CODEX_LOG_JSON === \"true\",\n});\n","import type { Thread } from \"../thread\";\nimport type { ThreadEvent } from \"../events\";\nimport type { ThreadItem } from \"../items\";\nimport type { TurnOptions } from \"../turnOptions\";\nimport type { Usage } from \"../events\";\nimport type { ThreadLoggingSink } from \"./types\";\nimport type { ScopedLogger } from \"./logger\";\n\nconst THREAD_EVENT_TEXT_LIMIT = 400;\n\n/**\n * Create a thread logging sink from a scoped logger\n */\nexport function createThreadLogger(scopedLogger: ScopedLogger, onUsage?: (usage: Usage) => void): ThreadLoggingSink {\n return {\n info: (message: string) => scopedLogger.info(message),\n warn: (message: string) => scopedLogger.warn(message),\n recordUsage: onUsage,\n };\n}\n\n/**\n * Run a thread turn with automatic event logging\n */\nexport async function runThreadTurnWithLogs(\n thread: Thread,\n sink: ThreadLoggingSink,\n prompt: string,\n turnOptions?: TurnOptions,\n) {\n const unsubscribe = thread.onEvent((event) => logThreadEvent(event, sink));\n try {\n if (turnOptions) {\n return await thread.run(prompt, turnOptions);\n }\n return await thread.run(prompt);\n } finally {\n unsubscribe();\n }\n}\n\n/**\n * Log a thread event to a sink\n */\nfunction logThreadEvent(event: ThreadEvent, sink: ThreadLoggingSink): void {\n switch (event.type) {\n case \"thread.started\":\n sink.info(`Thread started (id: ${event.thread_id})`);\n return;\n case \"turn.started\":\n sink.info(\"Turn started\");\n return;\n case \"turn.completed\":\n sink.info(\n `Turn completed (input ${event.usage.input_tokens}, cached ${event.usage.cached_input_tokens}, output ${event.usage.output_tokens})`,\n );\n if (\"recordUsage\" in sink && sink.recordUsage) {\n sink.recordUsage(event.usage);\n }\n return;\n case \"turn.failed\":\n sink.warn(`Turn failed: ${event.error.message}`);\n return;\n case \"item.started\":\n sink.info(`Item started: ${describeThreadItemForLog(event.item)}`);\n return;\n case \"item.updated\":\n sink.info(`Item updated: ${describeThreadItemForLog(event.item)}`);\n return;\n case \"item.completed\": {\n const message = `Item completed: ${describeThreadItemForLog(event.item)}`;\n if (event.item.type === \"error\") {\n sink.warn(message);\n } else {\n sink.info(message);\n }\n return;\n }\n case \"background_event\":\n sink.info(`Background: ${summarizeLogText(event.message)}`);\n return;\n case \"exited_review_mode\":\n sink.info(\"Exited review mode\");\n return;\n case \"error\":\n sink.warn(`Stream error: ${event.message}`);\n return;\n case \"raw_event\":\n return;\n default:\n return;\n }\n}\n\n/**\n * Describe a thread item for logging\n */\nfunction describeThreadItemForLog(item: ThreadItem): string {\n switch (item.type) {\n case \"agent_message\":\n return `agent message → ${summarizeLogText(item.text)}`;\n case \"reasoning\":\n return `reasoning → ${summarizeLogText(item.text)}`;\n case \"command_execution\": {\n const exit = item.exit_code !== undefined ? ` exit=${item.exit_code}` : \"\";\n return `command \"${summarizeLogText(item.command)}\" [${item.status}${exit}]`;\n }\n case \"file_change\": {\n const changeList = item.changes.map((change) => `${change.kind}:${change.path}`).join(\", \");\n return `file change [${item.status}] ${summarizeLogText(changeList)}`;\n }\n case \"mcp_tool_call\":\n return `mcp ${item.server}.${item.tool} [${item.status}]`;\n case \"web_search\":\n return `web search \"${summarizeLogText(item.query)}\"`;\n case \"todo_list\": {\n const completed = item.items.filter((todo) => todo.completed).length;\n return `todo list ${completed}/${item.items.length}`;\n }\n case \"error\":\n return `error → ${summarizeLogText(item.message)}`;\n default: {\n // Exhaustive check - this should never happen\n const _exhaustive: never = item;\n return \"unknown event\";\n }\n }\n}\n\n/**\n * Summarize text for logging (truncate if too long)\n */\nfunction summarizeLogText(text: string | undefined, limit = THREAD_EVENT_TEXT_LIMIT): string {\n if (!text) {\n return \"\";\n }\n const flattened = text.replace(/\\s+/g, \" \").trim();\n if (flattened.length <= limit) {\n return flattened;\n }\n return `${flattened.slice(0, limit)}…`;\n}\n","/**\n * Reverie System Constants\n *\n * Configuration constants for reverie search, filtering, and grading.\n * These values are tuned for optimal balance between result quality and performance.\n */\n\n/**\n * Default number of final reverie insights to return.\n * After all filtering and grading, this is the target result count.\n */\nexport const DEFAULT_REVERIE_LIMIT = 6;\n\n/**\n * Maximum number of candidate insights to fetch initially.\n * We fetch many candidates upfront and then filter aggressively.\n */\nexport const DEFAULT_REVERIE_MAX_CANDIDATES = 80;\n\n/**\n * Embedding model for semantic search.\n * Large model provides better semantic understanding at cost of memory/speed.\n */\nexport const REVERIE_EMBED_MODEL = \"BAAI/bge-large-en-v1.5\";\n\n/**\n * Reranker model for improving search precision.\n * Applied after initial embedding search to rerank top candidates.\n */\nexport const REVERIE_RERANKER_MODEL = \"rozgo/bge-reranker-v2-m3\";\n\n/**\n * Candidate multiplier for aggressive filtering.\n * Fetch 3x candidates since we'll filter heavily for quality.\n */\nexport const REVERIE_CANDIDATE_MULTIPLIER = 3;\n\n/**\n * Minimum relevance score threshold for LLM grading.\n * Only insights scoring >= 0.7 are sent for expensive LLM evaluation.\n * This optimizes API costs by skipping obvious low-quality candidates.\n */\nexport const REVERIE_LLM_GRADE_THRESHOLD = 0.7;\n\n/**\n * Default reranker top-k value.\n * Number of results to rerank after initial retrieval.\n */\nexport const DEFAULT_RERANKER_TOP_K = 20;\n\n/**\n * Default reranker batch size.\n * Number of candidates to process per reranker batch.\n */\nexport const DEFAULT_RERANKER_BATCH_SIZE = 8;\n","/**\n * Reverie Quality Utilities\n *\n * Provides filtering, deduplication, and quality assessment for reverie search results.\n * Ensures that only meaningful conversation excerpts are surfaced to agents and users.\n */\n\n/**\n * Represents a single reverie insight from past conversations.\n * This is a generic interface that can be extended with additional metadata.\n */\nexport interface ReverieInsight {\n /** Unique identifier for the conversation */\n conversationId: string;\n /** ISO timestamp of when the conversation occurred */\n timestamp: string;\n /** Relevance score from semantic search (0-1) */\n relevance: number;\n /** Text excerpt from the conversation */\n excerpt: string;\n /** Extracted insights or key points from the excerpt */\n insights: string[];\n}\n\n/**\n * Type alias for reverie results (used for logging compatibility).\n */\nexport type ReverieResult = ReverieInsight;\n\n/**\n * Statistics from the quality filtering pipeline.\n */\nexport interface QualityFilterStats {\n /** Number of insights before filtering */\n initial: number;\n /** Number after validity filtering */\n afterValidityFilter: number;\n /** Number after deduplication */\n afterDeduplication: number;\n /** Final number of insights */\n final: number;\n}\n\n/**\n * Validates whether a reverie excerpt contains meaningful content worth indexing.\n *\n * Filters out:\n * - Very short excerpts (< 20 chars)\n * - System prompts and boilerplate text\n * - Tool outputs and structured data\n * - Excerpts with excessive XML/HTML tags\n * - JSON objects and configuration snippets\n *\n * @param excerpt - The text excerpt to validate\n * @returns true if the excerpt contains meaningful content, false otherwise\n *\n * @example\n * ```typescript\n * const excerpt = \"Let's refactor the auth module to use async/await\";\n * isValidReverieExcerpt(excerpt); // true\n *\n * const systemPrompt = \"<INSTRUCTIONS>You are a coding assistant</INSTRUCTIONS>\";\n * isValidReverieExcerpt(systemPrompt); // false\n * ```\n */\nexport function isValidReverieExcerpt(excerpt: string): boolean {\n if (!excerpt || excerpt.trim().length < 20) {\n return false;\n }\n\n const trimmed = excerpt.trim();\n const normalized = trimmed.toLowerCase();\n const lines = trimmed.split(/\\r?\\n/).map((line) => line.trim()).filter(Boolean);\n const rawTokens = trimmed.split(/\\s+/).filter(Boolean);\n const tokens = rawTokens.map((token) => token.toLowerCase());\n\n if (rawTokens.length === 0) {\n return false;\n }\n\n const uppercaseTokens = rawTokens.filter((token) => {\n const alphabetic = token.replace(/[^a-z]/gi, \"\");\n return alphabetic.length >= 3 && alphabetic === alphabetic.toUpperCase();\n });\n const uppercaseRatio = uppercaseTokens.length / rawTokens.length;\n\n const snakeTokens = rawTokens.filter((token) => token.includes(\"_\"));\n const underscoreRatio = snakeTokens.length / rawTokens.length;\n\n const headingLines = lines.filter((line) => /^#{1,6}\\s/.test(line));\n const bulletLines = lines.filter((line) => /^\\s*[\\-\\*]\\s/.test(line));\n const numericBulletLines = lines.filter((line) => /^\\s*\\d+[\\).]/.test(line));\n const colonLabelLines = lines.filter((line) => /^[A-Za-z0-9 _-]{1,24}:/.test(line));\n\n const headingRatio = headingLines.length / Math.max(lines.length, 1);\n const bulletRatio = bulletLines.length / Math.max(lines.length, 1);\n const colonLabelRatio = colonLabelLines.length / Math.max(lines.length, 1);\n const numericRatio = numericBulletLines.length / Math.max(lines.length, 1);\n const enumeratedRatio = (bulletLines.length + numericBulletLines.length) / Math.max(lines.length, 1);\n\n const initialTitleCaseRun = (() => {\n let run = 0;\n for (const token of rawTokens) {\n const cleaned = token.replace(/[^a-z]/gi, \"\");\n if (cleaned.length === 0) {\n break;\n }\n const rest = cleaned.slice(1);\n const isTitleCase = cleaned[0]?.toUpperCase() === cleaned[0] && rest === rest.toLowerCase();\n const isAllCaps = cleaned.length >= 2 && cleaned === cleaned.toUpperCase();\n if (isTitleCase || isAllCaps) {\n run += 1;\n } else {\n break;\n }\n }\n return run;\n })();\n\n const tokenFrequencies = tokens.reduce((map, token) => map.set(token, (map.get(token) ?? 0) + 1), new Map<string, number>());\n const frequencyValues = Array.from(tokenFrequencies.values());\n const mostCommonTokenCount = Math.max(...frequencyValues);\n const repeatedWordRatio = mostCommonTokenCount / tokens.length;\n\n if (snakeTokens.length >= 2 && underscoreRatio > 0.15) {\n return false;\n }\n\n if (headingRatio > 0.6 && lines.length <= 4) {\n return false;\n }\n\n if (initialTitleCaseRun >= 3 && rawTokens.length <= 20) {\n return false;\n }\n\n if (enumeratedRatio > 0.6 && lines.length >= 3) {\n return false;\n }\n\n const metadataScore = [\n uppercaseRatio > 0.45,\n underscoreRatio > 0.2,\n bulletRatio > 0.7,\n colonLabelRatio > 0.6 || (lines.length <= 2 && colonLabelRatio > 0),\n initialTitleCaseRun >= 3,\n repeatedWordRatio > 0.45 && tokens.length > 15,\n rawTokens.length < 12 && colonLabelRatio > 0,\n numericRatio > 0.5,\n ].filter(Boolean).length;\n\n if (metadataScore >= 2) {\n return false;\n }\n\n const tagMatches = trimmed.match(/<[^>]+>/g) || [];\n if (tagMatches.length > 3) {\n return false;\n }\n\n const blockTagMatch = trimmed.match(/^<([a-z0-9_\\-]+)>[\\s\\S]*<\\/\\1>$/i);\n if (blockTagMatch) {\n const tagName = blockTagMatch[1]?.toLowerCase() ?? \"\";\n const looksLikeSystem = tagName.includes(\"system\") || tagName.includes(\"context\") || tagName.includes(\"env\");\n if (tagName.includes(\"_\") || looksLikeSystem) {\n return false;\n }\n }\n\n if (/\\(\\d{2,3}%\\)\\s*$/.test(trimmed)) {\n return false;\n }\n\n const looksJsonLike = (/^\\{[\\s\\S]*\\}$/.test(trimmed) || /^\\[[\\s\\S]*\\]$/.test(trimmed)) && /\"\\w+\"\\s*:/.test(trimmed);\n if (looksJsonLike) {\n return false;\n }\n\n return true;\n}\n\n/**\n * Removes duplicate or highly similar reverie insights based on content fingerprinting.\n *\n * CRITICAL FIX: Groups by fingerprint and keeps the insight with the HIGHEST relevance score.\n * Previous implementations incorrectly kept the first occurrence, which could discard\n * higher-quality duplicates found later in the list.\n *\n * Uses the first 100 characters of each excerpt (normalized) as a fingerprint\n * to identify duplicates. This prevents redundant insights from being shown\n * to the user while preserving the most relevant unique insights.\n *\n * @param insights - Array of reverie insights to deduplicate\n * @returns Deduplicated array of reverie insights, sorted by relevance (highest first)\n *\n * @example\n * ```typescript\n * const insights = [\n * { excerpt: \"We refactored the auth module...\", relevance: 0.7, ... },\n * { excerpt: \"We refactored the auth module to use async/await\", relevance: 0.9, ... },\n * { excerpt: \"Updated the database schema\", relevance: 0.8, ... }\n * ];\n *\n * const deduplicated = deduplicateReverieInsights(insights);\n * // Returns 2 insights: the higher-scoring auth one (0.9) and the database one (0.8)\n * ```\n */\nexport function deduplicateReverieInsights<T extends ReverieInsight>(insights: T[]): T[] {\n // Group insights by fingerprint, keeping the one with highest relevance\n const fingerprintMap = new Map<string, T>();\n\n for (const insight of insights) {\n // Create a fingerprint based on first 100 chars\n const fingerprint = insight.excerpt.slice(0, 100).toLowerCase().replace(/\\s+/g, \" \");\n\n const existing = fingerprintMap.get(fingerprint);\n if (!existing || insight.relevance > existing.relevance) {\n // Keep the insight with higher relevance\n fingerprintMap.set(fingerprint, insight);\n }\n }\n\n // Convert back to array and sort by relevance (highest first)\n return Array.from(fingerprintMap.values()).sort((a, b) => b.relevance - a.relevance);\n}\n\n/**\n * Applies the complete quality pipeline to reverie insights.\n *\n * Pipeline steps:\n * 1. Filter out invalid excerpts (system prompts, boilerplate, etc.)\n * 2. Deduplicate similar insights, keeping highest relevance\n * 3. Sort by relevance score (highest first)\n * 4. Limit to top N results\n *\n * @param insights - Raw reverie insights from search\n * @param limit - Maximum number of insights to return (default: 10)\n * @returns Filtered, deduplicated, and sorted insights with statistics\n *\n * @example\n * ```typescript\n * const rawInsights = await reverieSearchSemantic(codexHome, query, options);\n * const { insights, stats } = applyQualityPipeline(rawInsights, 5);\n *\n * console.log(`Filtered ${stats.initial} → ${stats.final} insights`);\n * insights.forEach(insight => {\n * console.log(`[${insight.relevance.toFixed(2)}] ${insight.excerpt.slice(0, 100)}`);\n * });\n * ```\n */\nexport function applyQualityPipeline<T extends ReverieInsight>(\n insights: T[],\n limit: number = 10\n): { insights: T[]; stats: QualityFilterStats } {\n const stats: QualityFilterStats = {\n initial: insights.length,\n afterValidityFilter: 0,\n afterDeduplication: 0,\n final: 0,\n };\n\n // Step 1: Filter out invalid excerpts\n const validInsights = insights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n stats.afterValidityFilter = validInsights.length;\n\n // Step 2: Deduplicate similar insights (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(validInsights);\n stats.afterDeduplication = deduplicated.length;\n\n // Step 3: Already sorted by relevance in deduplicateReverieInsights\n // Step 4: Limit to top N\n const final = deduplicated.slice(0, limit);\n stats.final = final.length;\n\n return { insights: final, stats };\n}\n","import { fastEmbedEmbed } from \"../nativeBinding.js\";\nimport type { ReverieInsight } from \"./types.js\";\n\ntype BoilerplateFilterOptions = {\n projectRoot?: string;\n threshold?: number;\n maxExcerptLength?: number;\n};\n\nconst DEFAULT_THRESHOLD = 0.8;\nconst DEFAULT_MAX_EXCERPT_LENGTH = 512;\n\nconst BOILERPLATE_SEEDS = [\n \"<system>Focus on summarizing repo context and keep instructions short.\",\n \"<environment_context>Working directory: /repo/codex sandbox_mode: workspace-write network_access: disabled</environment_context>\",\n \"# AGENTS.md instructions for this task require you to enumerate files before running commands.\",\n \"Tool output: command completed successfully with exit code 0.\",\n \"You are coordinating multiple agents. Respond with JSON describing the plan.\",\n \"Sandbox env vars: CODEX_SANDBOX=seatbelt CODEX_SANDBOX_NETWORK_DISABLED=1\",\n \"1. Inspect repository status; 2. List directories; 3. Review README/AGENTS instructions before acting.\",\n \"1. Inventory tooling - run `just --list` for recipes. 2. Verify Rust toolchain. 3. Read AGENTS.md for repo-specific guidance before editing.\",\n];\n\nlet seedVectorsPromise: Promise<number[][] | null> | null = null;\nlet embeddingDisabled = false;\n\nconst dot = (a: number[], b: number[]): number => a.reduce((sum, value, idx) => sum + value * (b[idx] ?? 0), 0);\n\nfunction truncateExcerpt(text: string, maxLength: number): string {\n const normalized = text.replace(/\\s+/g, \" \").trim();\n if (normalized.length <= maxLength) {\n return normalized;\n }\n return normalized.slice(0, maxLength);\n}\n\nasync function embedTexts(inputs: string[], projectRoot?: string): Promise<number[][] | null> {\n if (embeddingDisabled || inputs.length === 0) {\n return null;\n }\n\n try {\n const embeddings = await fastEmbedEmbed({\n inputs,\n projectRoot,\n normalize: true,\n });\n return embeddings;\n } catch (error) {\n embeddingDisabled = true;\n console.warn(`⚠️ Reverie boilerplate filter disabled (fastEmbedEmbed unavailable: ${(error as Error).message ?? error})`);\n return null;\n }\n}\n\nasync function getSeedVectors(projectRoot?: string): Promise<number[][] | null> {\n if (seedVectorsPromise) {\n return seedVectorsPromise;\n }\n seedVectorsPromise = embedTexts(BOILERPLATE_SEEDS, projectRoot);\n return seedVectorsPromise;\n}\n\nexport async function filterBoilerplateInsights(\n insights: ReverieInsight[],\n options?: BoilerplateFilterOptions,\n): Promise<{ kept: ReverieInsight[]; removed: number }> {\n if (insights.length === 0) {\n return { kept: [], removed: 0 };\n }\n\n const projectRoot = options?.projectRoot;\n const threshold = options?.threshold ?? DEFAULT_THRESHOLD;\n const maxExcerpt = options?.maxExcerptLength ?? DEFAULT_MAX_EXCERPT_LENGTH;\n\n const seeds = await getSeedVectors(projectRoot);\n if (!seeds || seeds.length === 0) {\n return { kept: insights, removed: 0 };\n }\n\n const excerptBatch = insights.map((insight) => truncateExcerpt(insight.excerpt, maxExcerpt));\n const excerptVectors = await embedTexts(excerptBatch, projectRoot);\n if (!excerptVectors) {\n return { kept: insights, removed: 0 };\n }\n\n const kept: ReverieInsight[] = [];\n let removed = 0;\n\n for (let i = 0; i < insights.length; i += 1) {\n const vector = excerptVectors[i];\n if (!vector) {\n kept.push(insights[i]!);\n continue;\n }\n\n const maxSimilarity = seeds.reduce((currentMax, seedVec) => {\n const similarity = dot(vector, seedVec);\n return similarity > currentMax ? similarity : currentMax;\n }, -Infinity);\n\n if (Number.isFinite(maxSimilarity) && maxSimilarity >= threshold) {\n removed += 1;\n } else {\n kept.push(insights[i]!);\n }\n }\n\n if (removed > 0) {\n console.log(`🧹 Reverie boilerplate filter removed ${removed}/${insights.length} excerpts (threshold ${threshold.toFixed(2)})`);\n }\n\n return { kept, removed };\n}\n","/**\n * Reverie logging utilities.\n * Provides transparent logging for reverie search and filtering operations.\n */\n\nimport type { ReverieResult } from \"./quality.js\";\nimport type { ReverieSearchLevel } from \"./types.js\";\nimport type { ReveriePipelineResult } from \"./pipeline.js\";\n\n/**\n * Logs reverie search operation details.\n *\n * @param query - The search query\n * @param context - Optional context about the search\n */\nexport function logReverieSearch(query: string, context?: string): void {\n const contextStr = context ? ` (${context})` : \"\";\n console.log(`🔍 Reverie search${contextStr}: \"${query}\"`);\n}\n\n/**\n * Logs reverie filtering pipeline statistics.\n *\n * @param stats - Filtering statistics\n */\nexport function logReverieFiltering(stats: {\n total: number;\n afterQuality: number;\n afterBoilerplate?: number;\n afterScore: number;\n afterDedup: number;\n minScore?: number;\n}): void {\n const { total, afterQuality, afterBoilerplate, afterScore, afterDedup, minScore = 0.7 } = stats;\n const qualityFiltered = total - afterQuality;\n const boilerplateStage = (afterBoilerplate ?? afterQuality);\n const boilerplateFiltered = afterQuality - boilerplateStage;\n const scoreFiltered = boilerplateStage - afterScore;\n const duplicatesFiltered = afterScore - afterDedup;\n\n console.log(\n `📊 Reverie filtering: ${total} raw → ${afterQuality} valid → ${boilerplateStage} conversational → ${afterScore} high-scoring (≥${minScore}) → ${afterDedup} unique` +\n ` (filtered: ${qualityFiltered} low-quality, ${boilerplateFiltered} boilerplate, ${scoreFiltered} low-score, ${duplicatesFiltered} duplicates)`\n );\n}\n\n/**\n * Logs top reverie insights for debugging.\n *\n * @param insights - Filtered reverie insights\n * @param limit - Maximum number of insights to log (default: 3)\n */\nexport function logReverieInsights(insights: ReverieResult[], limit: number = 3): void {\n if (insights.length === 0) {\n console.log(\"📭 No reverie insights found\");\n return;\n }\n\n console.log(`✨ Top ${Math.min(limit, insights.length)} reverie insights:`);\n const topInsights = insights.slice(0, limit);\n\n for (let i = 0; i < topInsights.length; i++) {\n const insight = topInsights[i];\n if (!insight) continue;\n const score = `${Math.round(insight.relevance * 100)}%`;\n const excerpt = truncate(insight.excerpt, 150);\n const insightText = insight.insights.length > 0 ? truncate(insight.insights[0] ?? \"\", 100) : \"\";\n\n console.log(` ${i + 1}. [${score}] ${excerpt}`);\n if (insightText) {\n console.log(` → ${insightText}`);\n }\n }\n}\n\n/**\n * Logs quality filtering statistics for hint collection.\n *\n * @param stats - Hint collection statistics\n */\nexport function logReverieHintQuality(stats: {\n totalRaw: number;\n afterQuality: number;\n afterDedup: number;\n}): void {\n const { totalRaw, afterQuality, afterDedup } = stats;\n const qualityFiltered = totalRaw - afterQuality;\n const duplicatesFiltered = afterQuality - afterDedup;\n\n if (totalRaw > 0) {\n console.log(\n `🪄 Reverie hint quality: ${totalRaw} raw → ${afterQuality} valid → ${afterDedup} unique ` +\n `(filtered ${qualityFiltered} low-quality, ${duplicatesFiltered} duplicates)`\n );\n }\n}\n\n/**\n * Logs LLM grading statistics showing approved vs rejected counts.\n *\n * @param stats - LLM grading statistics\n */\nexport function logLLMGrading(stats: {\n total: number;\n approved: number;\n rejected: number;\n minScore?: number;\n}): void {\n const { total, approved, rejected, minScore = 0.7 } = stats;\n const approvalRate = total > 0 ? Math.round((approved / total) * 100) : 0;\n\n console.log(\n `🤖 LLM grading: ${approved}/${total} approved (${approvalRate}%) ` +\n `[high-scoring ≥${minScore}, rejected ${rejected}]`\n );\n}\n\n/**\n * Logs approved reverie excerpts with relevance scores (verbose mode).\n *\n * @param insights - Approved reverie insights to log\n * @param maxToShow - Maximum number of insights to display (default: 5)\n */\nexport function logApprovedReveries(insights: ReverieResult[], maxToShow: number = 5): void {\n if (insights.length === 0) {\n console.log(\" No reveries passed LLM grading\");\n return;\n }\n\n console.log(` ${insights.length} reveries approved by LLM:`);\n const toShow = insights.slice(0, maxToShow);\n\n for (let i = 0; i < toShow.length; i++) {\n const insight = toShow[i];\n if (!insight) continue;\n const score = insight.relevance.toFixed(2);\n const preview = truncate(insight.excerpt.replace(/\\s+/g, \" \").trim(), 200);\n const insightText = insight.insights[0] || \"Context from past work\";\n\n console.log(` ${i + 1}. [${score}] ${insightText}`);\n console.log(` \"${preview}\"`);\n }\n\n if (insights.length > maxToShow) {\n console.log(` ... and ${insights.length - maxToShow} more`);\n }\n}\n\n/**\n * Truncates a string to a maximum length, adding ellipsis if needed.\n */\nfunction truncate(text: string, maxLength: number): string {\n if (!text) return \"\";\n return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text;\n}\n\n/**\n * Exports truncateText for external use.\n */\nexport { truncate as truncateText };\n\n/**\n * Logs multi-level search initiation.\n *\n * @param levels - Array of search levels being executed\n *\n * @example\n * ```typescript\n * logMultiLevelSearch(['project', 'branch', 'file']);\n * // Output: \"🔍 Multi-level reverie search: project → branch → file\"\n * ```\n */\nexport function logMultiLevelSearch(levels: ReverieSearchLevel[]): void {\n if (levels.length === 0) {\n console.log(\"🔍 Multi-level reverie search: (no levels specified)\");\n return;\n }\n\n const levelIcons: Record<ReverieSearchLevel, string> = {\n project: '🌐',\n branch: '🌿',\n file: '📄',\n };\n\n const levelLabels = levels.map(level => `${levelIcons[level]} ${level}`).join(' → ');\n console.log(`🔍 Multi-level reverie search: ${levelLabels}`);\n}\n\n/**\n * Logs results for a specific search level.\n *\n * @param level - The search level\n * @param result - Pipeline result for this level\n *\n * @example\n * ```typescript\n * logLevelResults('project', {\n * insights: [...],\n * stats: { total: 50, final: 8, ... }\n * });\n * // Output: \" 🌐 Project level: 8 insights (50 → 8, 84% filtered)\"\n * ```\n */\nexport function logLevelResults(level: ReverieSearchLevel, result: ReveriePipelineResult): void {\n const levelIcons: Record<ReverieSearchLevel, string> = {\n project: '🌐',\n branch: '🌿',\n file: '📄',\n };\n\n const icon = levelIcons[level];\n const { stats, insights } = result;\n const filterRate = stats.total > 0\n ? Math.round(((stats.total - stats.final) / stats.total) * 100)\n : 0;\n\n const levelName = level.charAt(0).toUpperCase() + level.slice(1);\n console.log(\n ` ${icon} ${levelName} level: ${insights.length} insights ` +\n `(${stats.total} → ${stats.final}, ${filterRate}% filtered)`\n );\n\n // Log quality breakdown if verbose\n if (stats.total > 0) {\n const qualityFiltered = stats.total - stats.afterQuality;\n const scoreFiltered = stats.afterQuality - stats.afterScore;\n const dedupFiltered = stats.afterScore - (stats.afterDedup || stats.afterScore);\n\n if (qualityFiltered > 0 || scoreFiltered > 0 || dedupFiltered > 0) {\n console.log(\n ` ↳ Quality: -${qualityFiltered}, Score: -${scoreFiltered}, Dedup: -${dedupFiltered}`\n );\n }\n }\n}\n\n/**\n * Logs a summary of multi-level search results.\n *\n * @param results - Map of level to pipeline results\n *\n * @example\n * ```typescript\n * const results = new Map([\n * ['project', { insights: [...], stats: {...} }],\n * ['branch', { insights: [...], stats: {...} }],\n * ['file', { insights: [...], stats: {...} }]\n * ]);\n *\n * logMultiLevelSummary(results);\n * // Output summary of all levels with total counts\n * ```\n */\nexport function logMultiLevelSummary(\n results: Map<ReverieSearchLevel, ReveriePipelineResult>\n): void {\n const totalInsights = Array.from(results.values())\n .reduce((sum, result) => sum + result.insights.length, 0);\n\n const totalProcessed = Array.from(results.values())\n .reduce((sum, result) => sum + result.stats.total, 0);\n\n console.log(\n `\\n✨ Multi-level search complete: ${totalInsights} total insights ` +\n `(processed ${totalProcessed} candidates across ${results.size} levels)`\n );\n\n // Show breakdown by level\n const levelCounts: string[] = [];\n for (const [level, result] of results) {\n levelCounts.push(`${level}: ${result.insights.length}`);\n }\n console.log(` Breakdown: ${levelCounts.join(', ')}`);\n}\n","/**\n * Symbol Extraction for Reverie Search\n *\n * Extracts key code symbols from diffs to create more focused search queries.\n * This improves search precision by targeting specific functions, classes, and variables.\n */\n\n/**\n * Extracts key symbols and terms from a diff to make search queries more targeted.\n *\n * Focuses on:\n * - Function and class definitions\n * - Variable declarations (const, let, var)\n * - Exported symbols\n * - Interface and type definitions\n *\n * Avoids:\n * - Language keywords (true, false, null, etc.)\n * - Very short symbols (< 3 chars)\n * - Boilerplate patterns\n *\n * @param diff - Git diff content to extract symbols from\n * @returns Comma-separated string of top 5 symbols, or \"code changes\" if none found\n *\n * @example\n * ```typescript\n * const diff = `\n * +function processUser(user: User) {\n * + const userName = user.name;\n * + return userName;\n * +}\n * `;\n *\n * extractKeySymbols(diff); // \"processUser, userName\"\n * ```\n */\nexport function extractKeySymbols(diff: string): string {\n // Extract function/class names, avoiding boilerplate patterns\n const symbols = new Set<string>();\n\n // Match function/class definitions, variable declarations, exports, interfaces, types\n const functionMatch = diff.match(/(?:function|class|const|let|var|export|interface|type)\\s+(\\w+)/g);\n\n if (functionMatch) {\n for (const match of functionMatch) {\n const name = match.split(/\\s+/).pop();\n\n // Filter out keywords and very short symbols\n if (name && name.length > 2 && !name.match(/^(true|false|null|undefined|const|let|var)$/)) {\n symbols.add(name);\n }\n }\n }\n\n // If no symbols found, return a generic placeholder\n if (symbols.size === 0) {\n return \"code changes\";\n }\n\n // Return top 5 symbols as comma-separated string\n return Array.from(symbols).slice(0, 5).join(\", \");\n}\n","import fs from \"node:fs/promises\";\nimport path from \"node:path\";\n\nimport { fastEmbedEmbed } from \"../nativeBinding.js\";\nimport type { ReverieEpisodeSummary } from \"./types.js\";\n\nconst EPISODES_FILENAME = \"reverie_episodes.json\";\n\nasync function readEpisodesFile(codexHome: string): Promise<ReverieEpisodeSummary[]> {\n try {\n const file = await fs.readFile(path.join(codexHome, EPISODES_FILENAME), \"utf8\");\n const parsed = JSON.parse(file);\n if (Array.isArray(parsed)) {\n return parsed as ReverieEpisodeSummary[];\n }\n return [];\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") {\n return [];\n }\n throw error;\n }\n}\n\nexport async function searchEpisodeSummaries(\n codexHome: string,\n query: string,\n repo: string,\n limit = 20,\n): Promise<ReverieEpisodeSummary[]> {\n const summaries = await readEpisodesFile(codexHome);\n if (!summaries.length || !query.trim()) {\n return [];\n }\n\n const documents = summaries.map((episode) =>\n [episode.summary, ...(episode.keyDecisions ?? [])].join(\"\\n\"),\n );\n const inputs = [query, ...documents];\n\n const embeddings = await fastEmbedEmbed({\n inputs,\n projectRoot: repo,\n normalize: true,\n cache: true,\n });\n\n if (embeddings.length !== inputs.length) {\n return [];\n }\n\n const [queryVector, ...docVectors] = embeddings;\n if (!queryVector) {\n return [];\n }\n const scored = summaries.map((episode, idx) => {\n const vector = docVectors[idx] ?? [];\n return {\n episode,\n score: cosineSimilarity(queryVector, vector),\n };\n });\n\n scored.sort((a, b) => b.score - a.score);\n return scored\n .slice(0, limit)\n .map(({ episode }) => episode);\n}\n\nfunction cosineSimilarity(a: number[], b: number[]): number {\n const length = Math.min(a.length, b.length);\n if (length === 0) {\n return 0;\n }\n let dot = 0;\n let magA = 0;\n let magB = 0;\n for (let i = 0; i < length; i += 1) {\n const av = a[i] ?? 0;\n const bv = b[i] ?? 0;\n dot += av * bv;\n magA += av * av;\n magB += bv * bv;\n }\n const denom = Math.sqrt(magA) * Math.sqrt(magB);\n return denom === 0 ? 0 : dot / denom;\n}\n","/**\n * Advanced Reverie Search\n *\n * Provides semantic search over past conversation history with sophisticated filtering:\n * - 3x candidate multiplier for aggressive filtering\n * - Reranker support for improved precision\n * - Multi-stage filtering with transparent logging\n * - Quality and deduplication pipelines\n */\n\nimport { reverieSearchSemantic, reverieSearchConversations } from \"../nativeBinding.js\";\nimport type { ReverieSemanticSearchOptions, ReverieSearchResult } from \"../nativeBinding.js\";\nimport type { ReverieInsight, ReverieSearchOptions } from \"./types.js\";\nimport { isValidReverieExcerpt, deduplicateReverieInsights } from \"./quality.js\";\nimport { filterBoilerplateInsights } from \"./boilerplate.js\";\nimport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_CANDIDATE_MULTIPLIER,\n REVERIE_RERANKER_MODEL,\n DEFAULT_RERANKER_TOP_K,\n DEFAULT_RERANKER_BATCH_SIZE,\n} from \"./constants.js\";\nimport { searchEpisodeSummaries } from \"./episodes.js\";\n\n/**\n * Performs advanced semantic search over reverie conversation history.\n *\n * Search pipeline:\n * 1. Fetch 3x candidates (candidateMultiplier × limit)\n * 2. Apply quality filtering (remove boilerplate, system prompts)\n * 3. Deduplicate similar excerpts (keep highest relevance)\n * 4. Apply reranker if enabled (improve precision)\n * 5. Return top N results\n *\n * Key features:\n * - Aggressive candidate fetching for better filtering headroom\n * - Optional reranker support for precision improvement\n * - Quality filtering removes system prompts and boilerplate\n * - Deduplication preserves highest-relevance duplicates\n * - Transparent logging at each stage\n *\n * @param codexHome - Path to .codex directory containing conversation data\n * @param text - Search query text\n * @param repo - Repository root path for filtering conversations\n * @param options - Search configuration options\n * @returns Array of relevant reverie insights, sorted by relevance\n *\n * @example\n * ```typescript\n * const insights = await searchReveries(\n * \"/Users/me/.codex\",\n * \"authentication bug with JWT tokens\",\n * \"/Users/me/my-project\",\n * {\n * limit: 6,\n * useReranker: true,\n * candidateMultiplier: 3\n * }\n * );\n *\n * console.log(`Found ${insights.length} relevant insights`);\n * insights.forEach(insight => {\n * console.log(`[${insight.relevance.toFixed(2)}] ${insight.excerpt.slice(0, 100)}`);\n * });\n * ```\n */\nexport async function searchReveries(\n codexHome: string,\n text: string,\n repo: string,\n options?: ReverieSearchOptions\n): Promise<ReverieInsight[]> {\n const {\n limit = DEFAULT_REVERIE_LIMIT,\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n useReranker = true,\n rerankerModel = REVERIE_RERANKER_MODEL,\n rerankerTopK = DEFAULT_RERANKER_TOP_K,\n rerankerBatchSize = DEFAULT_RERANKER_BATCH_SIZE,\n candidateMultiplier = REVERIE_CANDIDATE_MULTIPLIER,\n } = options || {};\n\n // Normalize and validate input\n const normalized = text.trim();\n if (!normalized) {\n return [];\n }\n\n // Configure search with aggressive candidate fetching\n const searchOptions: ReverieSemanticSearchOptions = {\n projectRoot: repo,\n limit: maxCandidates * candidateMultiplier, // Get 3x candidates for heavy filtering\n maxCandidates: maxCandidates * candidateMultiplier,\n normalize: true,\n cache: true,\n };\n\n // Add reranker if enabled\n if (useReranker) {\n searchOptions.rerankerModel = rerankerModel as any;\n searchOptions.rerankerTopK = rerankerTopK;\n searchOptions.rerankerBatchSize = rerankerBatchSize;\n }\n\n try {\n // Execute semantic search\n const regexMatches = looksLikeStructuredQuery(normalized)\n ? await reverieSearchConversations(codexHome, normalized, limit).catch(() => [])\n : [];\n\n const matches = await reverieSearchSemantic(codexHome, normalized, searchOptions);\n const combinedMatches = mergeSearchResults(regexMatches, matches);\n\n // Convert search results to insights\n const insights = convertSearchResultsToInsights(combinedMatches);\n\n // Apply quality filtering\n const validInsights = insights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n\n const { kept: conversational } = await filterBoilerplateInsights(validInsights, {\n projectRoot: repo,\n });\n\n // Deduplicate similar excerpts (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(conversational);\n\n const episodeMatches = await searchEpisodeSummaries(codexHome, normalized, repo, limit * 4).catch(() => []);\n const episodeBoost = new Map<string, number>();\n for (const episode of episodeMatches) {\n episodeBoost.set(episode.conversationId, Math.max(episodeBoost.get(episode.conversationId) ?? 0, episode.importance ?? 0));\n }\n\n const ranked = deduplicated\n .map((insight) => {\n const bonus = episodeBoost.get(insight.conversationId) ?? 0;\n return {\n insight,\n score: insight.relevance + bonus / 10,\n };\n })\n .sort((a, b) => b.score - a.score)\n .slice(0, limit)\n .map(({ insight }) => insight);\n\n return ranked;\n } catch (error) {\n console.warn(\n `Reverie search failed: ${error instanceof Error ? error.message : String(error)}`\n );\n return [];\n }\n}\n\n/**\n * Converts native search results to standardized ReverieInsight format.\n *\n * @param results - Raw search results from reverieSearchSemantic\n * @returns Array of ReverieInsight objects\n */\nfunction convertSearchResultsToInsights(results: ReverieSearchResult[]): ReverieInsight[] {\n const flattened: ReverieInsight[] = [];\n\n for (const match of results) {\n const base: ReverieInsight = {\n conversationId: match.conversation?.id || \"unknown\",\n timestamp: match.conversation?.createdAt || match.conversation?.updatedAt || new Date().toISOString(),\n relevance: typeof match.relevanceScore === \"number\" ? match.relevanceScore : 0,\n excerpt: \"\",\n insights: Array.isArray(match.insights) ? match.insights : [],\n };\n\n const excerpts = match.matchingExcerpts?.length ? match.matchingExcerpts : [\"\"];\n for (const excerpt of excerpts) {\n if (!excerpt.trim()) {\n continue;\n }\n flattened.push({ ...base, excerpt });\n }\n }\n\n return flattened;\n}\n\nfunction mergeSearchResults(primary: ReverieSearchResult[], secondary: ReverieSearchResult[]): ReverieSearchResult[] {\n const seen = new Set<string>();\n const merged: ReverieSearchResult[] = [];\n\n for (const list of [primary, secondary]) {\n for (const match of list) {\n const convoId = match.conversation?.id || \"unknown\";\n const excerptKey = match.matchingExcerpts?.[0] || String(match.relevanceScore ?? 0);\n const key = `${convoId}:${excerptKey}`;\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n merged.push(match);\n }\n }\n\n return merged;\n}\n\nfunction looksLikeStructuredQuery(text: string): boolean {\n if (!text) {\n return false;\n }\n\n const structuredPatterns = [\n /traceback \\(most recent call last\\)/i, // Python\n /exception in thread/i,\n /java\\.lang\\./i,\n /org\\.junit/i,\n /at\\s+org\\./i,\n /AssertionError:/i,\n /panic!|thread '.+' panicked/i,\n /FAIL\\s+\\S+\\s+\\(/i, // Jest/Vitest\n /(?:error|fail|fatal):/i,\n /Caused by:/i,\n /\\bundefined reference to\\b/i,\n ];\n\n for (const pattern of structuredPatterns) {\n if (pattern.test(text)) {\n return true;\n }\n }\n\n const hashPattern = /\\b[0-9a-f]{32,}\\b/i; // commit or build IDs\n if (hashPattern.test(text)) {\n return true;\n }\n\n const uuidPattern = /\\b[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}\\b/i;\n if (uuidPattern.test(text)) {\n return true;\n }\n\n const stackFrameMatches = text.match(/\\bat\\s+[^\\s]+\\s*\\(|\\b\\S+\\.\\w+:\\d+/gi);\n if ((stackFrameMatches?.length ?? 0) >= 2) {\n return true;\n }\n\n const severityTokens = text.match(/\\b(?:fail|error|panic|assert|fatal)\\b/gi)?.length ?? 0;\n if (severityTokens >= 3 && text.length > 50) {\n return true;\n }\n\n return false;\n}\n","/**\n * LLM-Based Relevance Grading for Reverie Insights\n *\n * Uses an LLM to evaluate whether reverie excerpts contain specific technical details\n * relevant to the current work context. This provides a more sophisticated filter than\n * simple keyword matching or relevance scores.\n *\n * Key optimizations:\n * - Only grades high-scoring candidates (relevance >= 0.7) to minimize API costs\n * - Parallel grading for performance\n * - Strict filtering to reject boilerplate and generic content\n */\n\nimport { Agent } from \"@openai/agents\";\nimport type { ReverieInsight, GradingOptions } from \"./types.js\";\n\n/**\n * Minimal interface for an agent runner that can execute prompts.\n * Compatible with @openai/agents Runner and similar implementations.\n */\nexport interface AgentRunner {\n run(\n agent: {\n name: string;\n instructions: string | ((...args: any[]) => any);\n outputType?: unknown;\n getEnabledHandoffs?: (...args: any[]) => Promise<unknown> | unknown;\n getAllTools?: (...args: any[]) => Promise<unknown> | unknown;\n },\n prompt: string\n ): Promise<{ finalOutput?: unknown }>;\n}\n\n/**\n * JSON schema for structured reverie grading response.\n * Ensures the LLM returns a validated, type-safe result.\n */\nconst REVERIE_GRADING_SCHEMA = {\n type: \"object\" as const,\n properties: {\n is_relevant: {\n type: \"boolean\" as const,\n description: \"True if excerpt contains specific technical details relevant to the work context\",\n },\n reasoning: {\n type: \"string\" as const,\n description: \"Brief explanation (1-2 sentences) of why the excerpt was approved or rejected\",\n },\n },\n required: [\"is_relevant\", \"reasoning\"],\n additionalProperties: false,\n};\n\n/**\n * Type-safe interface for grading results.\n */\ninterface GradingResult {\n is_relevant: boolean;\n reasoning: string;\n}\n\n/**\n * Uses LLM to evaluate if a reverie excerpt contains specific technical details\n * relevant to the search context.\n *\n * The grader is extremely strict and only approves excerpts with:\n * - Specific code/file references\n * - Technical decisions and rationale\n * - Error messages and debugging details\n * - Implementation specifics\n *\n * It rejects:\n * - Greetings and pleasantries\n * - Thinking markers (**, ##)\n * - JSON objects and structured data\n * - Generic phrases (\"Context from past work\")\n * - Metadata and system information\n *\n * @param runner - Agent runner capable of executing LLM prompts\n * @param searchContext - Context describing what we're searching for\n * @param insight - Reverie insight to evaluate\n * @returns true if the excerpt contains valuable technical details, false otherwise\n *\n * @example\n * ```typescript\n * const context = \"Implementing authentication with JWT tokens\";\n * const insight = {\n * excerpt: \"We decided to use RS256 for JWT signing because...\",\n * relevance: 0.85,\n * // ...\n * };\n *\n * const isRelevant = await gradeReverieRelevance(runner, context, insight);\n * // Returns: true (contains specific technical decision)\n * ```\n */\nexport async function gradeReverieRelevance(\n runner: AgentRunner,\n searchContext: string,\n insight: ReverieInsight\n): Promise<boolean> {\n const graderAgent = new Agent({\n name: \"ReverieGrader\",\n instructions: `You are a STRICT filter for conversation excerpts. Only approve excerpts with SPECIFIC technical details.\n\nREJECT excerpts containing:\n- Greetings and pleasantries\n- Thinking markers (**, ##, <thinking>)\n- JSON objects or structured data dumps\n- Generic phrases (\"Context from past work\", \"working on this\", etc.)\n- Metadata and system information\n- Boilerplate text\n- Task or checklist instructions (\"1.\", \"2.\", \"Plan:\")\n- AGENTS.md guidance, sandbox instructions, or environment descriptions\n- Tool output summaries or command transcript blocks\n\nAPPROVE ONLY excerpts with:\n- Specific code/file references (file paths, function names, variable names)\n- Technical decisions and rationale\n- Error messages and debugging details\n- Implementation specifics and algorithms\n- Architecture patterns and design choices\n\nReturn a JSON object with:\n- is_relevant: boolean indicating if this excerpt should be kept\n- reasoning: brief 1-2 sentence explanation of your decision`,\n outputType: {\n type: \"json_schema\" as const,\n schema: REVERIE_GRADING_SCHEMA,\n name: \"ReverieGrading\",\n strict: true,\n },\n });\n\n const prompt = `Context: ${searchContext}\n\nExcerpt to grade:\n\"\"\"\n${insight.excerpt.slice(0, 400)}\n\"\"\"\n\nEvaluate whether this excerpt contains specific technical details relevant to the work context.`;\n\n const result = await runner.run(graderAgent, prompt);\n\n // Parse structured output\n if (result.finalOutput && typeof result.finalOutput === \"object\") {\n const grading = result.finalOutput as GradingResult;\n return grading.is_relevant;\n }\n\n // Fallback: if structured output fails, default to rejecting (conservative)\n console.warn(\"Reverie grading failed to return structured output, defaulting to reject\");\n return false;\n}\n\n/**\n * Grades multiple reverie insights in parallel using LLM evaluation.\n *\n * Pipeline:\n * 1. Filter insights by minimum relevance threshold (default: 0.7)\n * 2. Send high-scoring insights to LLM grader in parallel\n * 3. Return only insights that pass LLM evaluation\n *\n * This approach optimizes API costs by:\n * - Skipping low-scoring candidates entirely\n * - Running high-scoring evaluations in parallel for speed\n * - Using strict filtering to minimize false positives\n *\n * @param runner - Agent runner capable of executing LLM prompts\n * @param context - Search context describing what we're looking for\n * @param insights - Array of insights to grade\n * @param options - Grading configuration options\n * @returns Filtered array containing only LLM-approved insights\n *\n * @example\n * ```typescript\n * const allInsights = await searchReveries(\"authentication bug\", repo);\n * const approved = await gradeReveriesInParallel(\n * runner,\n * \"Fix authentication token validation\",\n * allInsights,\n * { minRelevanceForGrading: 0.75, parallel: true }\n * );\n *\n * console.log(`${approved.length}/${allInsights.length} insights approved`);\n * ```\n */\nexport async function gradeReveriesInParallel(\n runner: AgentRunner,\n context: string,\n insights: ReverieInsight[],\n options?: GradingOptions\n): Promise<ReverieInsight[]> {\n const { minRelevanceForGrading = 0.7, parallel = true } = options || {};\n\n // Split insights by relevance threshold\n const highScoring = insights.filter((insight) => insight.relevance >= minRelevanceForGrading);\n const lowScoring = insights.filter((insight) => insight.relevance < minRelevanceForGrading);\n\n // Skip LLM grading for low-scoring insights (cost optimization)\n if (highScoring.length === 0) {\n return [];\n }\n\n // Grade high-scoring insights\n if (parallel) {\n // Parallel grading for performance\n const gradingPromises = highScoring.map((insight) =>\n gradeReverieRelevance(runner, context, insight).then((isRelevant) => ({\n insight,\n isRelevant,\n }))\n );\n\n const gradedResults = await Promise.all(gradingPromises);\n return gradedResults.filter((r) => r.isRelevant).map((r) => r.insight);\n } else {\n // Sequential grading (for rate-limited scenarios)\n const approved: ReverieInsight[] = [];\n\n for (const insight of highScoring) {\n const isRelevant = await gradeReverieRelevance(runner, context, insight);\n if (isRelevant) {\n approved.push(insight);\n }\n }\n\n return approved;\n }\n}\n","/**\n * Reverie Context Builders\n *\n * Utilities for building search contexts at different levels:\n * - Project level: Repository-wide patterns and architecture\n * - Branch level: Feature/branch-specific work and intent\n * - File level: Individual file changes and symbols\n */\n\nimport type {\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n ReverieContext,\n} from \"./types.js\";\nimport { extractKeySymbols } from \"./symbols.js\";\n\n/**\n * Builds project-level search context for repository-wide patterns.\n *\n * Use this for searching architectural decisions, common practices,\n * and project-wide patterns across the entire codebase.\n *\n * @param query - Natural language query describing what to find\n * @param options - Optional configuration\n * @returns Project-level context ready for search\n *\n * @example\n * ```typescript\n * const context = buildProjectContext(\n * \"How we handle database migrations in this repository\",\n * { repoPath: \"/Users/me/my-project\" }\n * );\n *\n * const results = await searchProjectLevel(codexHome, context, runner);\n * ```\n */\nexport function buildProjectContext(\n query: string,\n options?: {\n repoPath?: string;\n filePatterns?: string[];\n }\n): ProjectLevelContext {\n return {\n level: 'project',\n repoPath: options?.repoPath || process.cwd(),\n query,\n filePatterns: options?.filePatterns,\n };\n}\n\n/**\n * Builds branch-level search context for feature/branch-specific work.\n *\n * Use this for understanding branch intent, feature context, and changes\n * made across multiple files in a feature branch.\n *\n * @param branch - Current branch name\n * @param changedFiles - List of files modified in this branch\n * @param options - Optional configuration\n * @returns Branch-level context ready for search\n *\n * @example\n * ```typescript\n * const context = buildBranchContext(\n * \"feat/oauth2\",\n * [\"src/auth.ts\", \"src/login.ts\", \"test/auth.test.ts\"],\n * {\n * baseBranch: \"main\",\n * recentCommits: \"Add OAuth2 support\\nImplement token refresh\",\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n *\n * const results = await searchBranchLevel(codexHome, context, runner);\n * ```\n */\nexport function buildBranchContext(\n branch: string,\n changedFiles: string[],\n options?: {\n baseBranch?: string;\n recentCommits?: string;\n repoPath?: string;\n }\n): BranchLevelContext {\n return {\n level: 'branch',\n repoPath: options?.repoPath || process.cwd(),\n branch,\n baseBranch: options?.baseBranch,\n changedFiles,\n recentCommits: options?.recentCommits,\n };\n}\n\n/**\n * Builds file-level search context for individual file changes.\n *\n * Use this for focused searches on specific file modifications,\n * with optional symbol extraction for better targeting.\n *\n * @param filePath - Path to the file being analyzed\n * @param options - Optional configuration\n * @returns File-level context ready for search\n *\n * @example\n * ```typescript\n * // Without symbol extraction\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"... git diff content ...\",\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n *\n * // With automatic symbol extraction\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"+function validateToken(...)\\n+function refreshToken(...)\",\n * extractSymbols: true,\n * repoPath: \"/Users/me/my-project\"\n * }\n * );\n * // context.symbols will be: [\"validateToken\", \"refreshToken\"]\n *\n * const results = await searchFileLevel(codexHome, context, runner);\n * ```\n */\nexport function buildFileContext(\n filePath: string,\n options?: {\n diff?: string;\n extractSymbols?: boolean;\n repoPath?: string;\n }\n): FileLevelContext {\n const context: FileLevelContext = {\n level: 'file',\n repoPath: options?.repoPath || process.cwd(),\n filePath,\n diff: options?.diff,\n };\n\n // Extract symbols if requested and diff is provided\n if (options?.extractSymbols && options?.diff) {\n const symbolsText = extractKeySymbols(options.diff);\n if (symbolsText) {\n context.symbols = symbolsText.split(',').map(s => s.trim()).filter(Boolean);\n }\n }\n\n return context;\n}\n\n/**\n * Converts a ReverieContext to a search query string.\n *\n * Transforms structured context objects into natural language queries\n * suitable for semantic search.\n *\n * @param context - Any level of reverie context\n * @returns Formatted search query string\n *\n * @example\n * ```typescript\n * const projectCtx = buildProjectContext(\"Authentication patterns\");\n * const query = contextToQuery(projectCtx);\n * // Returns: \"Project-wide: Authentication patterns\"\n *\n * const branchCtx = buildBranchContext(\"feat/auth\", [\"auth.ts\", \"login.ts\"]);\n * const query = contextToQuery(branchCtx);\n * // Returns: \"Branch: feat/auth\\nFiles: auth.ts, login.ts\"\n *\n * const fileCtx = buildFileContext(\"auth.ts\", {\n * symbols: [\"validateToken\", \"refreshToken\"]\n * });\n * const query = contextToQuery(fileCtx);\n * // Returns: \"File: auth.ts\\nSymbols: validateToken, refreshToken\"\n * ```\n */\nexport function contextToQuery(context: ReverieContext): string {\n switch (context.level) {\n case 'project': {\n let query = `Project-wide: ${context.query}`;\n if (context.filePatterns && context.filePatterns.length > 0) {\n query += `\\nScope: ${context.filePatterns.join(', ')}`;\n }\n return query;\n }\n\n case 'branch': {\n let query = `Branch: ${context.branch}`;\n if (context.baseBranch) {\n query += ` (base: ${context.baseBranch})`;\n }\n query += `\\nFiles changed: ${context.changedFiles.join(', ')}`;\n if (context.recentCommits) {\n query += `\\nRecent commits: ${context.recentCommits}`;\n }\n return query;\n }\n\n case 'file': {\n let query = `File: ${context.filePath}`;\n if (context.symbols && context.symbols.length > 0) {\n query += `\\nSymbols: ${context.symbols.join(', ')}`;\n }\n if (context.diff) {\n // Include a truncated version of the diff for context\n const truncatedDiff = context.diff.length > 500\n ? context.diff.slice(0, 500) + '...'\n : context.diff;\n query += `\\nChanges:\\n${truncatedDiff}`;\n }\n return query;\n }\n }\n}\n\n/**\n * Helper to format file paths for display in contexts.\n *\n * @param files - Array of file paths\n * @param maxFiles - Maximum number of files to show before truncating\n * @returns Formatted file list string\n */\nexport function formatFileList(files: string[], maxFiles: number = 10): string {\n if (files.length === 0) {\n return '(no files)';\n }\n\n if (files.length <= maxFiles) {\n return files.join(', ');\n }\n\n const shown = files.slice(0, maxFiles);\n const remaining = files.length - maxFiles;\n return `${shown.join(', ')} ... and ${remaining} more`;\n}\n","/**\n * Complete Reverie Pipeline\n *\n * Orchestrates the full reverie search and filtering process:\n * 1. Search with 3x candidates for aggressive filtering headroom\n * 2. Basic quality filter (remove boilerplate and system prompts)\n * 3. Split by relevance threshold (high vs low scoring)\n * 4. LLM grade high-scoring candidates only (cost optimization)\n * 5. Deduplicate results (keep highest relevance)\n * 6. Log statistics at every stage (transparent operation)\n *\n * This pipeline matches diff-agent's sophistication while being fully generic\n * and reusable across different contexts.\n */\n\nimport { searchReveries } from \"./search.js\";\nimport { gradeReveriesInParallel } from \"./grader.js\";\nimport type { AgentRunner } from \"./grader.js\";\nimport type {\n ReverieInsight,\n ReveriePipelineOptions,\n ReverieFilterStats,\n ReverieSearchLevel,\n ReverieContext,\n ProjectLevelContext,\n BranchLevelContext,\n FileLevelContext,\n} from \"./types.js\";\nimport { isValidReverieExcerpt, deduplicateReverieInsights } from \"./quality.js\";\nimport { filterBoilerplateInsights } from \"./boilerplate.js\";\nimport {\n logReverieSearch,\n logReverieFiltering,\n logLLMGrading,\n logApprovedReveries,\n logMultiLevelSearch,\n logLevelResults,\n} from \"./logger.js\";\nimport {\n DEFAULT_REVERIE_LIMIT,\n DEFAULT_REVERIE_MAX_CANDIDATES,\n REVERIE_LLM_GRADE_THRESHOLD,\n} from \"./constants.js\";\nimport { contextToQuery } from \"./context.js\";\n\n/**\n * Result from the complete reverie pipeline.\n */\nexport interface ReveriePipelineResult {\n /** Final filtered and graded insights */\n insights: ReverieInsight[];\n /** Statistics from each pipeline stage */\n stats: ReverieFilterStats;\n}\n\n/**\n * Applies the complete reverie pipeline with all sophisticated features from diff-agent.\n *\n * Pipeline stages:\n * 1. **Search** - Fetch 3x candidates with optional reranking\n * 2. **Quality Filter** - Remove system prompts, boilerplate, JSON objects\n * 3. **Score Split** - Separate high-scoring (≥0.7) from low-scoring candidates\n * 4. **LLM Grading** - Grade only high-scoring candidates (cost optimization)\n * 5. **Deduplication** - Remove similar excerpts, keeping highest relevance\n * 6. **Logging** - Transparent statistics at each stage\n *\n * Key optimizations:\n * - 3x candidate multiplier provides headroom for aggressive filtering\n * - LLM grading only applied to high-scoring candidates (≥0.7)\n * - Parallel grading for performance\n * - Deduplication preserves highest-relevance duplicates\n * - Comprehensive logging for debugging and monitoring\n *\n * @param codexHome - Path to .codex directory containing conversation data\n * @param searchText - Search query describing what to look for\n * @param repo - Repository root path for filtering conversations\n * @param runner - Agent runner for LLM-based relevance grading (required unless skipLLMGrading is true)\n * @param options - Pipeline configuration options\n * @returns Pipeline result with filtered insights and statistics\n *\n * @example\n * ```typescript\n * // Full pipeline with LLM grading\n * const result = await applyReveriePipeline(\n * \"/Users/me/.codex\",\n * \"authentication bug with JWT tokens\",\n * \"/Users/me/my-project\",\n * runner,\n * {\n * limit: 6,\n * useReranker: true,\n * minRelevanceForGrading: 0.7\n * }\n * );\n *\n * console.log(`Found ${result.insights.length} relevant insights`);\n * console.log(`Filtered: ${result.stats.total} → ${result.stats.final}`);\n *\n * // Without LLM grading (faster, lower quality)\n * const fastResult = await applyReveriePipeline(\n * codexHome,\n * query,\n * repo,\n * null,\n * { skipLLMGrading: true }\n * );\n * ```\n */\nexport async function applyReveriePipeline(\n codexHome: string,\n searchText: string,\n repo: string,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const {\n limit = DEFAULT_REVERIE_LIMIT,\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n minRelevanceForGrading = REVERIE_LLM_GRADE_THRESHOLD,\n skipLLMGrading = false,\n ...searchOptions\n } = options || {};\n\n // Log search initiation\n logReverieSearch(searchText, `repo: ${repo}`);\n\n // Stage 1: Search with aggressive candidate fetching\n const rawInsights = await searchReveries(codexHome, searchText, repo, {\n limit,\n maxCandidates,\n ...searchOptions,\n });\n\n // Initialize statistics\n const stats: ReverieFilterStats = {\n total: rawInsights.length,\n afterQuality: 0,\n afterBoilerplate: 0,\n afterScore: 0,\n afterDedup: 0,\n final: 0,\n };\n\n // Stage 2: Basic quality filtering\n const validInsights = rawInsights.filter((insight) => isValidReverieExcerpt(insight.excerpt));\n stats.afterQuality = validInsights.length;\n\n // Stage 3: Embedding-based boilerplate filtering\n const { kept: conversationalInsights } = await filterBoilerplateInsights(validInsights, {\n projectRoot: repo,\n });\n stats.afterBoilerplate = conversationalInsights.length;\n\n // Stage 4: Split by relevance threshold\n const highScoring = conversationalInsights.filter((insight) => insight.relevance >= minRelevanceForGrading);\n const lowScoring = conversationalInsights.filter((insight) => insight.relevance < minRelevanceForGrading);\n stats.afterScore = highScoring.length;\n\n // Stage 5: LLM grading (optional, only for high-scoring)\n let gradedInsights: ReverieInsight[];\n\n if (skipLLMGrading || !runner) {\n // Skip LLM grading - just use high-scoring insights\n gradedInsights = highScoring;\n stats.afterLLMGrade = highScoring.length;\n } else {\n // Apply LLM grading to high-scoring candidates\n gradedInsights = await gradeReveriesInParallel(runner, searchText, highScoring, {\n minRelevanceForGrading,\n parallel: true,\n });\n stats.afterLLMGrade = gradedInsights.length;\n\n // Log LLM grading results\n logLLMGrading({\n total: highScoring.length,\n approved: gradedInsights.length,\n rejected: highScoring.length - gradedInsights.length,\n minScore: minRelevanceForGrading,\n });\n\n // Log approved reveries (verbose)\n if (gradedInsights.length > 0) {\n logApprovedReveries(gradedInsights);\n }\n }\n\n // Stage 6: Deduplication (keeps highest relevance)\n const deduplicated = deduplicateReverieInsights(gradedInsights);\n stats.afterDedup = deduplicated.length;\n\n // Final results\n const finalInsights = deduplicated.slice(0, limit);\n stats.final = finalInsights.length;\n\n // Log filtering statistics\n logReverieFiltering({\n total: stats.total,\n afterQuality: stats.afterQuality,\n afterBoilerplate: stats.afterBoilerplate,\n afterScore: stats.afterScore,\n afterDedup: stats.afterDedup,\n minScore: minRelevanceForGrading,\n });\n\n return {\n insights: finalInsights,\n stats,\n };\n}\n\n/**\n * Simplified pipeline for file-specific searches.\n *\n * Similar to main pipeline but optimized for individual file contexts:\n * - Uses fewer candidates (maxCandidates / 2)\n * - Same filtering and grading logic\n * - Transparent logging\n *\n * @param codexHome - Path to .codex directory\n * @param filePath - File path being analyzed\n * @param fileContext - Contextual information about the file (symbols, changes, etc.)\n * @param repo - Repository root path\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with file-specific insights\n *\n * @example\n * ```typescript\n * const fileInsights = await applyFileReveriePipeline(\n * codexHome,\n * \"src/auth/jwt.ts\",\n * \"File: src/auth/jwt.ts\\nImplementing: validateToken, generateToken\",\n * repo,\n * runner,\n * { limit: 3 }\n * );\n * ```\n */\nexport async function applyFileReveriePipeline(\n codexHome: string,\n filePath: string,\n fileContext: string,\n repo: string,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const {\n maxCandidates = DEFAULT_REVERIE_MAX_CANDIDATES,\n limit = DEFAULT_REVERIE_LIMIT,\n ...restOptions\n } = options || {};\n\n // Use fewer candidates for file-specific searches\n const fileOptions = {\n ...restOptions,\n maxCandidates: Math.floor(maxCandidates / 2),\n limit,\n };\n\n // Run standard pipeline with file-specific context\n return applyReveriePipeline(codexHome, fileContext, repo, runner, fileOptions);\n}\n\n/**\n * Multi-level reverie search pipeline.\n *\n * Executes searches at multiple levels (project, branch, file) and returns\n * results organized by level. This enables comprehensive context gathering\n * from different scopes in a single operation.\n *\n * @param codexHome - Path to .codex directory\n * @param contexts - Array of search contexts at different levels\n * @param runner - Agent runner for LLM grading (optional if skipLLMGrading is true)\n * @param options - Pipeline options\n * @returns Map of search level to pipeline results\n *\n * @example\n * ```typescript\n * import { buildProjectContext, buildBranchContext, buildFileContext } from './context.js';\n *\n * const contexts = [\n * buildProjectContext(\"Testing conventions in this codebase\"),\n * buildBranchContext(\"feat/auth\", [\"src/auth.ts\", \"src/login.ts\"]),\n * buildFileContext(\"src/auth.ts\", { extractSymbols: true })\n * ];\n *\n * const results = await searchMultiLevel(codexHome, contexts, runner, {\n * limit: 5,\n * useReranker: true\n * });\n *\n * // Access results by level\n * const projectInsights = results.get('project')?.insights || [];\n * const branchInsights = results.get('branch')?.insights || [];\n * const fileInsights = results.get('file')?.insights || [];\n * ```\n */\nexport async function searchMultiLevel(\n codexHome: string,\n contexts: ReverieContext[],\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<Map<ReverieSearchLevel, ReveriePipelineResult>> {\n const levels = contexts.map(ctx => ctx.level);\n logMultiLevelSearch(levels);\n\n const results = new Map<ReverieSearchLevel, ReveriePipelineResult>();\n\n // Execute searches sequentially to maintain order and avoid overwhelming the system\n for (const context of contexts) {\n let result: ReveriePipelineResult;\n\n switch (context.level) {\n case 'project':\n result = await searchProjectLevel(codexHome, context, runner, options);\n break;\n case 'branch':\n result = await searchBranchLevel(codexHome, context, runner, options);\n break;\n case 'file':\n result = await searchFileLevel(codexHome, context, runner, options);\n break;\n }\n\n results.set(context.level, result);\n logLevelResults(context.level, result);\n }\n\n return results;\n}\n\n/**\n * Search at project level for repository-wide patterns.\n *\n * Optimized for broad searches across the entire codebase to find\n * architectural decisions, common practices, and project conventions.\n *\n * @param codexHome - Path to .codex directory\n * @param context - Project-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with project-wide insights\n *\n * @example\n * ```typescript\n * const context = buildProjectContext(\n * \"How we handle database migrations\",\n * { repoPath: \"/Users/me/my-project\" }\n * );\n *\n * const result = await searchProjectLevel(codexHome, context, runner, {\n * limit: 8,\n * useReranker: true\n * });\n *\n * console.log(`Found ${result.insights.length} project-wide insights`);\n * ```\n */\nexport async function searchProjectLevel(\n codexHome: string,\n context: ProjectLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Use larger candidate pool for project-wide searches\n const projectOptions = {\n ...options,\n maxCandidates: (options?.maxCandidates || DEFAULT_REVERIE_MAX_CANDIDATES) * 1.5,\n };\n\n return applyReveriePipeline(\n codexHome,\n searchQuery,\n context.repoPath,\n runner,\n projectOptions\n );\n}\n\n/**\n * Search at branch level for feature-specific context.\n *\n * Optimized for understanding work done in a specific branch,\n * including intent, changed files, and commit history.\n *\n * @param codexHome - Path to .codex directory\n * @param context - Branch-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with branch-specific insights\n *\n * @example\n * ```typescript\n * const context = buildBranchContext(\n * \"feat/oauth2\",\n * [\"src/auth.ts\", \"src/login.ts\"],\n * {\n * baseBranch: \"main\",\n * recentCommits: \"Add OAuth2 support\\nImplement token refresh\"\n * }\n * );\n *\n * const result = await searchBranchLevel(codexHome, context, runner, {\n * limit: 6\n * });\n *\n * console.log(`Found ${result.insights.length} branch insights`);\n * ```\n */\nexport async function searchBranchLevel(\n codexHome: string,\n context: BranchLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Standard pipeline for branch-level searches\n return applyReveriePipeline(\n codexHome,\n searchQuery,\n context.repoPath,\n runner,\n options\n );\n}\n\n/**\n * Search at file level for specific file changes.\n *\n * Optimized for focused searches on individual file modifications,\n * using extracted symbols for better targeting.\n *\n * @param codexHome - Path to .codex directory\n * @param context - File-level search context\n * @param runner - Agent runner for LLM grading\n * @param options - Pipeline options\n * @returns Pipeline result with file-specific insights\n *\n * @example\n * ```typescript\n * const context = buildFileContext(\n * \"src/auth/jwt.ts\",\n * {\n * diff: \"+function validateToken(...)\\n+function refreshToken(...)\",\n * extractSymbols: true\n * }\n * );\n *\n * const result = await searchFileLevel(codexHome, context, runner, {\n * limit: 3\n * });\n *\n * console.log(`Found ${result.insights.length} file-specific insights`);\n * ```\n */\nexport async function searchFileLevel(\n codexHome: string,\n context: FileLevelContext,\n runner: AgentRunner | null,\n options?: ReveriePipelineOptions\n): Promise<ReveriePipelineResult> {\n const searchQuery = contextToQuery(context);\n\n // Use existing file pipeline which reduces candidate count\n return applyFileReveriePipeline(\n codexHome,\n context.filePath,\n searchQuery,\n context.repoPath,\n runner,\n options\n );\n}\n"],"mappings":"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","names":["fs","path","fs","path","os","import_node_fs","import_node_path","dirname","path","fs","getImportMetaUrl","importMetaUrl","path","path","fs","path","fs","path","import_node_url","resolve","path","normalized","path","resolve","tool","normalizeSkillMentionTriggers","fs","path","os","tool","resolve","net","LogLevel","logger","import_node_path","fs","path","dot","import_agents"]}