@codex-native/sdk 0.0.19 → 0.0.20

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/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","../src/index.ts"],"sourcesContent":["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","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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAYA,IAAM,YAAY,oBAAI,IAA0B;AAEzC,SAAS,0BAA0B,MAAc,UAAwB;AAC9E,YAAU,IAAI,MAAM,QAAQ;AAC9B;AAEO,SAAS,qBAAqB,MAAwC;AAC3E,SAAO,UAAU,IAAI,IAAI;AAC3B;AAEO,SAAS,0BAA0B;AACxC,YAAU,MAAM;AAClB;;;ACdA,YAAY,QAAQ;AACpB,YAAY,UAAU;AACtB,YAAY,QAAQ;;;ACUpB,SAAS,aAAa;;;ADgFf,IAAM,gBAAN,MAA6C;AAAA,EAC1C,QAAsB;AAAA,EACtB;AAAA,EAER,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,UAAU;AAAA,MACb,kBAAkB,QAAQ,oBAAoB,QAAQ,IAAI;AAAA,MAC1D,kBAAkB,QAAQ,oBAAoB;AAAA,MAC9C,GAAG;AAAA,IACL;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,WAAkB;AACxB,QAAI,CAAC,KAAK,OAAO;AACf,UAAI;AACF,aAAK,QAAQ,IAAI,MAAM;AAAA,UACrB,QAAQ,KAAK,QAAQ;AAAA,UACrB,SAAS,KAAK,QAAQ;AAAA,UACtB,eAAe,KAAK,QAAQ;AAAA,UAC5B,cAAc,KAAK,QAAQ;AAAA,UAC3B,OAAO,KAAK,QAAQ;AAAA,UACpB,yBAAyB,KAAK,QAAQ;AAAA,UACtC,QAAQ,KAAK,QAAQ;AAAA,UACrB,sBAAsB,KAAK,QAAQ;AAAA,QACrC,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,IAAI;AAAA,UACR,+BAA+B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QACvF;AAAA,MACF;AAAA,IACF;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,SAAS,WAA2B;AAClC,UAAM,QAAQ,aAAa,KAAK,QAAQ;AACxC,WAAO,IAAI,WAAW,KAAK,SAAS,GAAG,OAAO,KAAK,OAAO;AAAA,EAC5D;AAAA;AAAA;AAAA;AAAA,EAKA,oBAAoB,UAA0E;AAC5F,SAAK,SAAS,EAAE,oBAAoB,QAAQ;AAAA,EAC9C;AACF;AAKA,IAAM,aAAN,MAAkC;AAAA,EACxB;AAAA,EACA;AAAA,EACA,SAAwB;AAAA,EACxB;AAAA,EACA,kBAA+B,oBAAI,IAAI;AAAA,EACvC,gBAA2C,oBAAI,IAAI;AAAA,EACnD,iBAA8B,oBAAI,IAAI;AAAA,EACtC,oBAAkC,CAAC;AAAA,EACnC,sBAAqC;AAAA,EACrC;AAAA,EACA;AAAA,EAER,YAAY,OAAc,WAA+B,SAA+B;AACtF,SAAK,QAAQ;AACb,SAAK,YAAY;AACjB,SAAK,UAAU;AAAA,EACjB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,mBAAkC;AAC9C,eAAW,YAAY,KAAK,gBAAgB;AAC1C,UAAI;AACF,cAAS,YAAS,OAAO,QAAQ;AAAA,MACnC,SAAS,OAAO;AAAA,MAEhB;AAAA,IACF;AACA,SAAK,eAAe,MAAM;AAAA,EAC5B;AAAA;AAAA;AAAA;AAAA,EAKQ,UAAU,gBAAiC;AAEjD,QAAI,gBAAgB;AAClB,UAAI,CAAC,KAAK,UAAU,KAAK,OAAO,OAAO,gBAAgB;AAErD,aAAK,oBAAoB;AACzB,aAAK,SAAS,KAAK,MAAM,aAAa,gBAAgB,KAAK,iBAAiB,CAAC;AAC7E,aAAK,oBAAoB;AAAA,MAC3B;AAAA,IACF,WAAW,CAAC,KAAK,QAAQ;AAEvB,WAAK,oBAAoB;AACzB,WAAK,SAAS,KAAK,MAAM,YAAY,KAAK,iBAAiB,CAAC;AAC5D,WAAK,oBAAoB;AAAA,IAC3B;AACA,UAAM,SAAS,KAAK;AACpB,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,SAAK,wBAAwB,MAAM;AACnC,WAAO;AAAA,EACT;AAAA,EAEQ,wBAAwB,QAAsB;AAEpD,QAAI,KAAK,QAAQ,cAAc,OAAO;AACpC;AAAA,IACF;AACA,QAAI,KAAK,sBAAsB,UAAU,KAAK,mBAAmB;AAC/D;AAAA,IACF;AACA,SAAK,oBAAoB;AACzB,SAAK,oBAAoB;AACzB,SAAK,oBAAoB,qBAAqB,QAAQ;AAAA,MACpD,kBAAkB,KAAK,QAAQ,oBAAoB,QAAQ,IAAI;AAAA,MAC/D,oBAAoB;AAAA,IACtB,CAAC;AAAA,EACH;AAAA,EAEQ,mBAAkC;AACxC,WAAO;AAAA,MACL,OAAO,KAAK;AAAA;AAAA;AAAA,MAGZ,KAAK,KAAK,QAAQ,UAAU,QAAQ,KAAK,QAAQ;AAAA,MACjD,kBAAkB,KAAK,QAAQ;AAAA,MAC/B,kBAAkB,KAAK,QAAQ;AAAA,MAC/B,aAAa,KAAK,QAAQ,eAAe;AAAA,MACzC,cAAc,KAAK,QAAQ;AAAA,MAC3B,iBAAiB,KAAK,QAAQ;AAAA,MAC9B,kBAAkB,KAAK,QAAQ;AAAA,IACjC;AAAA,EACF;AAAA,EAEA,MAAM,YAAY,SAA+C;AAC/D,QAAI;AACF,YAAM,SAAS,KAAK,UAAU,QAAQ,kBAAkB,QAAQ,kBAAkB;AAGlF,UAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,aAAK,qBAAqB,QAAQ,KAAK;AAAA,MACzC;AAEA,YAAM,QAAQ,MAAM,KAAK,sBAAsB,OAAO;AAMtD,YAAM,OAAO,MAAM,OAAO,IAAI,OAAO;AAAA,QACnC,cAAc,0BAA0B,QAAQ,UAAU;AAAA,QAC1D,KAAK,KAAK,QAAQ;AAAA,MACpB,CAAC;AAED,YAAM,WAAW,KAAK,MACnB,OAAO,CAAC,SAA6D,KAAK,SAAS,WAAW,EAC9F,MAAM,EAAE,EAAE,CAAC;AAGd,YAAM,WAKF;AAAA,QACF,OAAO,KAAK,aAAa,KAAK,KAAK;AAAA,QACnC,QAAQ,KAAK,qBAAqB,KAAK,OAAO,KAAK,aAAa;AAAA,QAChE,YAAY,OAAO,MAAM;AAAA,MAC3B;AAEA,UAAI,UAAU;AACZ,iBAAS,OAAO,EAAE,OAAO,SAAS,MAAM;AAAA,MAC1C;AAEA,aAAO;AAAA,IACT,UAAE;AAEA,YAAM,KAAK,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA,EAEA,OAAO,oBAAoB,SAAmD;AAC5E,UAAM,uBAAuB;AAE7B,QAAI;AACF,YAAM,SAAS,KAAK,UAAU,QAAQ,kBAAkB,QAAQ,kBAAkB;AAGlF,UAAI,QAAQ,SAAS,QAAQ,MAAM,SAAS,GAAG;AAC7C,aAAK,qBAAqB,QAAQ,KAAK;AAAA,MACzC;AAEA,YAAM,QAAQ,MAAM,KAAK,sBAAsB,OAAO;AAEtD,YAAM,EAAE,OAAO,IAAI,MAAM,OAAO,YAAY,OAAO;AAAA,QACjD,cAAc,0BAA0B,QAAQ,UAAU;AAAA,QAC1D,KAAK,KAAK,QAAQ;AAAA,MACpB,CAAC;AAGD,YAAM,kBAAkB,oBAAI,IAAoB;AAEhD,uBAAiB,SAAS,QAAQ;AAEhC,YAAI,YAAY;AAChB,mBAAW,QAAQ,gBAAgB,OAAO,GAAG;AAC3C,uBAAa,KAAK;AAAA,QACpB;AACA,YAAI,YAAY,sBAAsB;AACpC,gBAAM,IAAI,MAAM,iDAAiD,oBAAoB,SAAS;AAAA,QAChG;AAEA,cAAM,eAAe,KAAK,+BAA+B,OAAO,eAAe;AAE/E,mBAAW,eAAe,cAAc;AACtC,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,UAAE;AAEA,YAAM,KAAK,iBAAiB;AAAA,IAC9B;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQQ,qBAAqB,OAA+B;AAC1D,SAAK,cAAc,MAAM;AAEzB,eAAWA,SAAQ,OAAO;AACxB,UAAIA,MAAK,SAAS,YAAY;AAC5B;AAAA,MACF;AAGA,UAAI,KAAK,gBAAgB,IAAIA,MAAK,IAAI,GAAG;AACvC,cAAM,WAAW,KAAK,oBAAoBA,MAAK,IAAI;AACnD,YAAI,UAAU;AACZ,eAAK,cAAc,IAAIA,MAAK,MAAM,QAAQ;AAAA,QAC5C;AACA;AAAA,MACF;AAEA,UAAI;AACF,cAAM,WAAW,KAAK,oBAAoBA,MAAK,IAAI;AACnD,YAAI,UAAU;AACZ,eAAK,cAAc,IAAIA,MAAK,MAAM,QAAQ;AAAA,QAC5C;AAGA,cAAM,gBAAsC;AAAA,UAC1C,MAAMA,MAAK;AAAA,UACX,aAAaA,MAAK;AAAA,UAClB,YAAYA,MAAK;AAAA;AAAA,UAEjB,SAAS,OAAO,eAAgE;AAC9E,mBAAO,MAAM,KAAK,wBAAwB,UAAU;AAAA,UACtD;AAAA,QACF;AAGA,aAAK,MAAM,aAAa,aAAa;AACrC,aAAK,gBAAgB,IAAIA,MAAK,IAAI;AAElC,gBAAQ,IAAI,+BAA+BA,MAAK,IAAI,EAAE;AAAA,MACxD,SAAS,OAAO;AACd,cAAM,eAAe,2BAA2BA,MAAK,IAAI,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AACpH,gBAAQ,MAAM,YAAY;AAAA,MAG5B;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,oBAAoB,UAA4C;AACtE,WAAO,qBAAqB,QAAQ;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAmBA,MAAc,wBACZ,YAC2B;AAC3B,QAAI,CAAC,YAAY;AACf,cAAQ,KAAK,2DAA2D;AACxE,aAAO;AAAA,QACL,QAAQ,KAAK,UAAU;AAAA,UACrB,SAAS;AAAA,UACT,MAAM;AAAA,QACR,CAAC;AAAA,QACD,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,IACF;AAEA,YAAQ;AAAA,MACN,sCAAsC,WAAW,QAAQ,aAAa,WAAW,MAAM;AAAA,IACzF;AACA,UAAM,WAAW,KAAK,cAAc,IAAI,WAAW,QAAQ,KAAK,qBAAqB,WAAW,QAAQ;AACxG,QAAI,CAAC,UAAU;AACb,YAAM,UAAU,0CAA0C,WAAW,QAAQ;AAC7E,cAAQ,KAAK,OAAO;AACpB,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,QACP,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,QAAI,kBAA2B,CAAC;AAChC,QAAI,WAAW,WAAW;AACxB,UAAI;AACF,0BAAkB,KAAK,MAAM,WAAW,SAAS;AAAA,MACnD,SAAS,OAAO;AACd,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,QAClG;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAgC;AAAA,MACpC,MAAM,WAAW;AAAA,MACjB,QAAQ,WAAW;AAAA,MACnB,WAAW;AAAA,MACX,eAAe;AAAA,IACjB;AAEA,QAAI;AACF,YAAM,SAAS,MAAM,SAAS,OAAO;AACrC,aAAO,KAAK,oBAAoB,MAAM;AAAA,IACxC,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,oBAAoB,QAA8C;AACxE,QAAI,WAAW,UAAa,WAAW,MAAM;AAC3C,aAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAEA,QAAI,OAAO,WAAW,UAAU;AAC9B,aAAO,EAAE,SAAS,MAAM,QAAQ,OAAO;AAAA,IACzC;AAEA,QAAI,OAAO,WAAW,aAAa,YAAY,UAAU,WAAW,UAAU,aAAa,SAAS;AAClG,aAAO;AAAA,QACL,SAAS,OAAO,WAAW,CAAC,OAAO;AAAA,QACnC,QAAQ,OAAO;AAAA,QACf,OAAO,OAAO;AAAA,MAChB;AAAA,IACF;AAEA,WAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ,KAAK,UAAU,MAAM;AAAA,IAC/B;AAAA,EACF;AAAA,EAEA,MAAc,iBAAiB,MAAmC;AAChE,UAAM,aAAa,KAAK;AAGxB,QAAI,OAAO,eAAe,UAAU;AAElC,UAAI,WAAW,WAAW,aAAa,GAAG;AACxC,eAAO,MAAM,KAAK,gBAAgB,UAAU;AAAA,MAC9C,WAES,WAAW,WAAW,SAAS,KAAK,WAAW,WAAW,UAAU,GAAG;AAC9E,eAAO,MAAM,KAAK,cAAc,UAAU;AAAA,MAC5C,WAEY,cAAW,UAAU,GAAG;AAClC,eAAO;AAAA,MACT,OAEK;AACH,cAAM,IAAI,MAAM,yBAAyB,WAAW,UAAU,GAAG,EAAE,CAAC,KAAK;AAAA,MAC3E;AAAA,IACF,WAES,OAAO,eAAe,YAAY,SAAS,YAAY;AAC9D,aAAO,MAAM,KAAK,cAAc,WAAW,GAAG;AAAA,IAChD,WAES,OAAO,eAAe,YAAY,YAAY,YAAY;AACjE,YAAM,IAAI;AAAA,QACR;AAAA,MAEF;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,gBAAgB,SAAkC;AAE9D,UAAM,UAAU,QAAQ,MAAM,mCAAmC;AACjE,QAAI,CAAC,SAAS;AACZ,YAAM,IAAI,MAAM,+BAA+B;AAAA,IACjD;AAEA,UAAM,YAAY,QAAQ,CAAC;AAC3B,UAAM,aAAa,QAAQ,CAAC;AAC5B,QAAI,CAAC,YAAY;AACf,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,kBAAkB,WAAW,QAAQ,OAAO,EAAE;AACpD,QAAI,gBAAgB,WAAW,GAAG;AAChC,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,QAAI,CAAC,sBAAsB,KAAK,eAAe,GAAG;AAChD,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,mBAAmB,gBAAgB,QAAQ,MAAM,GAAG,EAAE,QAAQ,MAAM,GAAG;AAE7E,QAAI;AACJ,QAAI;AACF,eAAS,OAAO,KAAK,kBAAkB,QAAQ;AAAA,IACjD,QAAQ;AACN,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,QAAI,OAAO,WAAW,GAAG;AACvB,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,YAAY,OAAO,SAAS,QAAQ,EAAE,QAAQ,OAAO,EAAE;AAC7D,UAAM,kBAAkB,iBAAiB,QAAQ,OAAO,EAAE;AAC1D,QAAI,cAAc,iBAAiB;AACjC,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAIA,UAAM,YAAY,KAAK,0BAA0B,WAAW,KAAK;AAGjE,UAAM,UAAa,UAAO;AAC1B,UAAM,WAAW,eAAe,KAAK,IAAI,CAAC,IAAI,SAAS;AACvD,UAAM,WAAgB,UAAK,SAAS,QAAQ;AAE5C,UAAS,YAAS,UAAU,UAAU,MAAM;AAC5C,SAAK,eAAe,IAAI,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,cAAc,KAA8B;AAExD,UAAM,WAAW,MAAM,MAAM,GAAG;AAChC,QAAI,CAAC,SAAS,IAAI;AAChB,YAAM,IAAI,MAAM,iCAAiC,GAAG,KAAK,SAAS,UAAU,EAAE;AAAA,IAChF;AAEA,UAAM,SAAS,MAAM,SAAS,YAAY;AAC1C,UAAM,cAAc,SAAS,QAAQ,IAAI,cAAc,KAAK;AAG5D,UAAM,gBAAgB,YAAY,MAAM,GAAG,EAAE,CAAC,GAAG,KAAK,KAAK;AAC3D,UAAM,YAAY,cAAc,MAAM,GAAG,EAAE,CAAC,KAAK;AACjD,UAAM,YAAY,KAAK,0BAA0B,WAAW,KAAK;AAGjE,UAAM,UAAa,UAAO;AAC1B,UAAM,WAAW,eAAe,KAAK,IAAI,CAAC,IAAI,SAAS;AACvD,UAAM,WAAgB,UAAK,SAAS,QAAQ;AAE5C,UAAS,YAAS,UAAU,UAAU,OAAO,KAAK,MAAM,CAAC;AACzD,SAAK,eAAe,IAAI,QAAQ;AAChC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAMQ,0BAA0B,WAA+B,YAA4B;AAC3F,QAAI,CAAC,WAAW;AACd,aAAO;AAAA,IACT;AAGA,UAAM,aAAa,UAAU,YAAY,EAAE,KAAK;AAGhD,UAAM,eAAuC;AAAA,MAC3C,QAAQ;AAAA,MACR,WAAW;AAAA,MACX,sBAAsB;AAAA,MACtB,UAAU;AAAA,IACZ;AAGA,QAAI,aAAa,UAAU,GAAG;AAC5B,aAAO,aAAa,UAAU;AAAA,IAChC;AAIA,UAAM,kBAAkB,WAAW,MAAM,GAAG,EAAE,CAAC;AAG/C,QAAI,mBAAmB,cAAc,KAAK,eAAe,GAAG;AAC1D,aAAO;AAAA,IACT;AAGA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,sBAAsB,SAAuC;AACzE,UAAM,QAAqB,CAAC;AAG5B,QAAI,QAAQ,oBAAoB;AAC9B,YAAM,KAAK;AAAA,QACT,MAAM;AAAA,QACN,MAAM;AAAA,EAAa,QAAQ,kBAAkB;AAAA;AAAA;AAAA;AAAA,MAC/C,CAAC;AAAA,IACH;AAGA,QAAI,OAAO,QAAQ,UAAU,UAAU;AACrC,YAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,MAAM,CAAC;AAAA,IAClD,OAAO;AAEL,iBAAW,QAAQ,QAAQ,OAAO;AAEhC,YAAI,UAAU,QAAQ,UAAU,MAAM;AACpC,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,YAAI,WAAW,QAAQ,UAAU,MAAM;AACrC,gBAAM,IAAI;AAAA,YACR;AAAA,UAEF;AAAA,QACF;AACA,YAAI,WAAW,QAAQ,UAAU,QAAQ,KAAK,SAAS,WAAW;AAChE,gBAAM,YAAY;AAClB,gBAAM,YAAY,MAAM,KAAK,iBAAiB,SAAS;AACvD,cAAI,WAAW;AACb,kBAAM,KAAK,EAAE,MAAM,eAAe,MAAM,UAAU,CAAC;AAAA,UACrD;AACA;AAAA,QACF;AAGA,YAAI,KAAK,SAAS,wBAAwB;AAExC,cAAI,UAAU,QAAQ,YAAY,MAAM;AACtC,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,MAAM,SAAS,KAAK,IAAI,cAAc,KAAK,MAAM;AAAA,YACnD,CAAC;AAAA,UACH;AAAA,QACF,WAAW,KAAK,SAAS,aAAa;AAEpC,cAAI,OAAO;AACX,cAAI,aAAa,QAAQ,OAAO,KAAK,YAAY,UAAU;AACzD,mBAAO,KAAK;AAAA,UACd,WAAW,eAAe,QAAQ,OAAO,KAAK,cAAc,UAAU;AACpE,mBAAO,KAAK;AAAA,UACd;AACA,cAAI,MAAM;AACR,kBAAM,KAAK;AAAA,cACT,MAAM;AAAA,cACN,MAAM,eAAe,IAAI;AAAA,YAC3B,CAAC;AAAA,UACH;AAAA,QACF,YAAY,KAAK,SAAS,aAAa,KAAK,SAAS,WAAc,UAAU,MAAM;AAEjF,cAAI,EAAE,aAAa,MAAO;AAC1B,gBAAM,UAAU,KAAK;AAErB,cAAI,OAAO,YAAY,UAAU;AAC/B,kBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,QAAQ,CAAC;AAAA,UAC5C,WAAW,MAAM,QAAQ,OAAO,GAAG;AAEjC,uBAAW,eAAe,SAAS;AACjC,kBAAI,YAAY,SAAS,cAAc;AACrC,sBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,CAAC;AAAA,cACrD,WAAW,YAAY,SAAS,eAAe;AAC7C,sBAAM,YAAY,MAAM,KAAK,iBAAiB,WAAW;AACzD,oBAAI,WAAW;AACb,wBAAM,KAAK,EAAE,MAAM,eAAe,MAAM,UAAU,CAAC;AAAA,gBACrD;AAAA,cACF,WAAW,YAAY,SAAS,cAAc;AAC5C,sBAAM,IAAI;AAAA,kBACR;AAAA,gBAEF;AAAA,cACF,WAAW,YAAY,SAAS,SAAS;AACvC,sBAAM,IAAI;AAAA,kBACR;AAAA,gBAEF;AAAA,cACF,WAAW,YAAY,SAAS,WAAW;AACzC,sBAAM,KAAK;AAAA,kBACT,MAAM;AAAA,kBACN,MAAM,aAAa,YAAY,OAAO;AAAA,gBACxC,CAAC;AAAA,cACH,WAAW,YAAY,SAAS,eAAe;AAC7C,sBAAM,KAAK,EAAE,MAAM,QAAQ,MAAM,YAAY,KAAK,CAAC;AAAA,cACrD;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,MAAM,WAAW,KAAK,MAAM,CAAC,EAAG,SAAS,QAAQ;AACnD,aAAO,MAAM,CAAC,EAAG;AAAA,IACnB;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAiC;AACpD,QAAI,CAAC,OAAO;AACV,aAAO,IAAI,MAAM;AAAA,IACnB;AAEA,UAAM,YAAY,IAAI,MAAM;AAAA,MAC1B,UAAU;AAAA,MACV,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM,eAAe,MAAM;AAAA,IAC1C,CAAC;AAED,QAAI,MAAM,qBAAqB;AAC7B,gBAAU,qBAAqB,CAAC,EAAE,cAAc,MAAM,oBAAoB,CAAC;AAAA,IAC7E;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,qBAAqB,OAAqB,eAA0C;AAC1F,UAAM,SAA4B,CAAC;AAEnC,eAAW,QAAQ,OAAO;AACxB,cAAQ,KAAK,MAAM;AAAA,QACjB,KAAK,iBAAiB;AACpB,gBAAM,UAAU;AAAA,YACd;AAAA,cACE,MAAM;AAAA,cACN,MAAM,KAAK;AAAA,YACb;AAAA,UACF;AAEA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,MAAM;AAAA,YACN,QAAQ;AAAA,YACR;AAAA,UACF,CAAyB;AACzB;AAAA,QACF;AAAA;AAAA,QAGA,KAAK;AACH;AAAA;AAAA;AAAA,QAIF,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAEH;AAAA,QAEF;AAEE;AAAA,MACJ;AAAA,IACF;AAGA,QAAI,OAAO,WAAW,KAAK,eAAe;AACxC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,MAAM;AAAA,QACN,QAAQ;AAAA,QACR,SAAS;AAAA,UACP;AAAA,YACE,MAAM;AAAA,YACN,MAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF,CAAyB;AAAA,IAC3B;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,oBACN,OACA,YACA,OACA,aAOA;AACA,UAAM,eAAe,MAAM;AAAA,MACzB,CAAC,SAAiE,KAAK,SAAS;AAAA,IAClF;AACA,UAAM,SAAS,KAAK,qBAAqB,cAAc,eAAe,EAAE;AAGxE,UAAM,YAAY;AAAA,MAChB,UAAU,MAAM;AAAA,MAChB,aAAa,MAAM;AAAA,MACnB,cAAc,MAAM;AAAA,MACpB,aAAa,MAAM;AAAA,MACnB,oBAAoB,MAAM,qBAAqB,CAAC;AAAA,MAChD,qBAAqB,MAAM,sBAAsB,CAAC;AAAA,IACpD;AAGA,UAAM,aAAa,MAChB,OAAO,CAAC,SAA6D,KAAK,SAAS,WAAW,EAC9F,MAAM,EAAE,EAAE,CAAC;AAEd,UAAM,WAMF;AAAA,MACF,IAAI;AAAA,MACJ;AAAA,MACA,OAAO;AAAA,MACP;AAAA,IACF;AAEA,QAAI,YAAY;AACd,eAAS,OAAO,EAAE,OAAO,WAAW,MAAM;AAAA,IAC5C;AAEA,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,+BACN,OACA,iBACe;AACf,UAAM,SAAwB,CAAC;AAE/B,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK,kBAAkB;AACrB,eAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAExC,cAAM,aAAa,KAAK,QAAQ,MAAM;AACtC,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU,EAAE,IAAI,WAAW;AAAA,QAC7B,CAA2B;AAC3B;AAAA,MACF;AAAA,MAEA,KAAK;AAEH,aAAK,oBAAoB,CAAC;AAC1B,aAAK,sBAAsB;AAC3B;AAAA,MAEF,KAAK;AAEH,YAAI,MAAM,KAAK,SAAS,mBAAmB,MAAM,KAAK,SAAS,aAAa;AAC1E,gBAAM,UAAU,GAAG,MAAM,KAAK,IAAI;AAClC,0BAAgB,IAAI,SAAS,EAAE;AAAA,QACjC;AACA;AAAA,MAEF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,SAAS,MAAM;AAAA,UACjB;AAAA,QACF,CAAgB;AAChB;AAAA,MAEF,KAAK;AAEH,YAAI,MAAM,KAAK,SAAS,iBAAiB;AACvC,gBAAM,UAAU;AAChB,gBAAM,eAAe,gBAAgB,IAAI,OAAO,KAAK;AACrD,gBAAM,cAAc,MAAM,KAAK;AAG/B,cAAI,YAAY,SAAS,aAAa,QAAQ;AAC5C,oBAAQ,KAAK,qDAAqD;AAClE;AAAA,UACF;AAEA,cAAI,YAAY,SAAS,aAAa,QAAQ;AAC5C,kBAAM,QAAQ,YAAY,MAAM,aAAa,MAAM;AACnD,4BAAgB,IAAI,SAAS,WAAW;AAGxC,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,YACF,CAAC;AAED,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN;AAAA,YACF,CAA2B;AAAA,UAC7B;AAAA,QACF,WAAW,MAAM,KAAK,SAAS,aAAa;AAC1C,gBAAM,UAAU;AAChB,gBAAM,eAAe,gBAAgB,IAAI,OAAO,KAAK;AACrD,gBAAM,cAAc,MAAM,KAAK;AAE/B,cAAI,YAAY,SAAS,aAAa,QAAQ;AAC5C,kBAAM,QAAQ,YAAY,MAAM,aAAa,MAAM;AACnD,4BAAgB,IAAI,SAAS,WAAW;AAGxC,mBAAO,KAAK;AAAA,cACV,MAAM;AAAA,cACN,OAAO;AAAA,gBACL,MAAM;AAAA,gBACN;AAAA,cACF;AAAA,YACF,CAAgB;AAAA,UAClB;AAAA,QACF;AACA;AAAA,MAEF,KAAK;AACH,aAAK,kBAAkB,KAAK,MAAM,IAAI;AAEtC,YAAI,MAAM,KAAK,SAAS,iBAAiB;AAEvC,0BAAgB,OAAO,eAAe;AACtC,eAAK,sBAAsB,MAAM,KAAK;AAAA,QACxC,WAAW,MAAM,KAAK,SAAS,aAAa;AAC1C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,cACL,MAAM;AAAA,cACN,WAAW,MAAM,KAAK;AAAA,YACxB;AAAA,UACF,CAAgB;AAChB,0BAAgB,OAAO,WAAW;AAAA,QACpC,WAAW,MAAM,KAAK,SAAS,aAAa;AAE1C,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,OAAO;AAAA,cACL,MAAM;AAAA,cACN,OAAO,MAAM,KAAK;AAAA,YACpB;AAAA,UACF,CAAgB;AAAA,QAClB;AACA;AAAA,MAEF,KAAK,kBAAkB;AAErB,cAAM,QAAQ,KAAK,aAAa,MAAM,KAAK;AAC3C,cAAM,aAAa,KAAK,QAAQ,MAAM;AACtC,cAAM,WAAW,KAAK;AAAA,UACpB;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL,KAAK;AAAA,QACP;AACA,aAAK,oBAAoB,CAAC;AAC1B,aAAK,sBAAsB;AAI3B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,UAAU;AAAA,YACR,IAAI,SAAS;AAAA,YACb,OAAO;AAAA,cACL,cAAc,MAAM;AAAA,cACpB,sBAAsB,MAAM,qBAAqB,CAAC,KAAK;AAAA,cACvD,eAAe,MAAM;AAAA,cACrB,uBAAuB,MAAM,sBAAsB,CAAC,KAAK;AAAA,cACzD,cAAc,MAAM;AAAA,YACtB;AAAA,YACA,GAAI,SAAS,UAAU,SAAS,OAAO,SAAS,IAC5C;AAAA,cACE,QAAQ,SAAS,OAAO,IAAI,CAAC,SAAS;AACpC,oBAAI,KAAK,SAAS,aAAa,KAAK,SAAS,aAAa;AACxD,yBAAO;AAAA,oBACL,IAAI,KAAK,MAAM;AAAA,oBACf,MAAM,KAAK;AAAA,oBACX,SAAS,KAAK;AAAA,kBAChB;AAAA,gBACF;AACA,uBAAO;AAAA,cACT,CAAC;AAAA,cACD,aACE,SAAS,OACN;AAAA,gBAAO,CAAC,SACP,KAAK,SAAS,aAAa,KAAK,SAAS;AAAA,cAC3C,EAAE,CAAC,GAAG,SAAS;AAAA,gBACb,CAAC,MAAM,EAAE,SAAS;AAAA,cACpB,GAAG,SAAS,KAAK,uBAAuB;AAAA,YAC9C,IACA,CAAC;AAAA,UACP;AAAA,QACF,CAA2B;AAG3B,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN;AAAA,QACF,CAAgB;AAChB;AAAA,MACF;AAAA,MAEA,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,cACL,SAAS,MAAM,MAAM;AAAA,YACvB;AAAA,UACF;AAAA,QACF,CAAgB;AAChB;AAAA,MAEF,KAAK;AACH,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,YACL,MAAM;AAAA,YACN,OAAO;AAAA,cACL,SAAS,MAAM;AAAA,YACjB;AAAA,UACF;AAAA,QACF,CAAgB;AAChB;AAAA,MAEF,KAAK;AACH;AAAA,MAEF;AACE;AAAA,IACJ;AAGA,QAAK,OAAmC,SAAS,aAAa;AAC5D,YAAM,WAAW;AAAA,QACf,MAAM;AAAA,QACN,KAAK;AAAA,MACP;AAEA,UAAI,OAAO,WAAW,GAAG;AACvB,eAAO,CAAC,QAAQ;AAAA,MAClB;AAEA,YAAM,SAAS,CAAC,GAAG,MAAM;AACzB,YAAM,cAAc,KAAK,IAAI,GAAG,OAAO,MAAM;AAC7C,aAAO,OAAO,aAAa,GAAG,QAAQ;AACtC,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AASA,SAAS,0BAA0B,YAA0C;AAC3E,MAAI,CAAC,SAAS,UAAU,EAAG,QAAO;AAClC,QAAM,UAAU;AAEhB,QAAM,IAAI,OAAO,QAAQ,SAAS,WAAY,QAAQ,OAAkB;AACxE,MAAI,MAAM,iBAAiB,MAAM,eAAe;AAG9C,UAAM,iBAAiB,QAAQ;AAC/B,QAAI,SAAS,cAAc,GAAG;AAC5B,aAAO;AAAA,IACT;AACA,UAAM,SAAS,QAAQ;AACvB,QAAI,SAAS,MAAM,GAAG;AACpB,YAAM,eAAgB,OAAmC;AACzD,UAAI,SAAS,YAAY,GAAG;AAC1B,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAEA,MAAI,YAAY,WAAW,SAAS,QAAQ,MAAM,GAAG;AACnD,WAAO,QAAQ;AAAA,EACjB;AAEA,MACG,UAAU,WAAW,QAAQ,SAAS,YACvC,gBAAgB,WAChB,cAAc,SACd;AACA,WAAO;AAAA,EACT;AACA,SAAO;AACT;;;AE5pCA,SAAS,YAAY;AAWd,SAAS,UAAU,SAAsC;AAC9D,QAAM,EAAE,cAAc,GAAG,SAAS,IAAI;AACtC,QAAM,YAAY,KAAK,QAA2B;AAGlD,QAAM,YAAY,gBAAiB,SAA6B;AAChE,QAAM,WAAW,oBAAoB,UAAU,MAAM,SAAS;AAC9D,4BAA0B,UAAU,MAAM,QAAQ;AAElD,SAAO;AACT;AAEA,SAAS,oBAAoB,UAAkB,gBAA8E;AAC3H,SAAO,OAAO,EAAE,WAAW,KAAK,MAAM;AACpC,UAAM,aAAa,QAAQ,CAAC;AAC5B,QAAI;AACF,YAAM,SAAS,MAAM,eAAe,UAAU;AAC9C,aAAO;AAAA,IACT,SAAS,OAAO;AACd,YAAM,IAAI,MAAM,eAAe,QAAQ,aAAa,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC,EAAE;AAAA,IAC9G;AAAA,EACF;AACF;;;ACiCA,eAAsB,aACpB,QACA,UAA+B,CAAC,GACN;AAC1B,QAAM,QAAyB;AAAA,IAC7B,MAAM;AAAA,IACN,WAAW;AAAA,IACX,WAAW,CAAC;AAAA,IACZ,OAAO;AAAA,MACL,aAAa;AAAA,MACb,cAAc;AAAA,MACd,aAAa;AAAA,IACf;AAAA,IACA,QAAQ,CAAC;AAAA,EACX;AAEA,mBAAiB,SAAS,QAAQ;AAChC,YAAQ,MAAM,MAAM;AAAA,MAClB,KAAK;AAEH,gBAAQ,WAAW,EAAE,OAAO,MAAM,MAAM,CAAC;AACzC;AAAA,MACF,KAAK;AACH,cAAM,QAAQ,MAAM;AACpB,gBAAQ,WAAW,EAAE,MAAM,MAAM,KAAK,CAAC;AACvC;AAAA,MACF,KAAK,SAAS;AACZ,cAAM,IAAK,MAA8B;AACzC,YAAI,KAAK,OAAO,MAAM,UAAU;AAC9B,cAAI,EAAE,SAAS,qBAAqB,OAAO,EAAE,UAAU,UAAU;AAC/D,kBAAM,aAAa,EAAE;AACrB,oBAAQ,WAAW,EAAE,WAAW,MAAM,UAAU,CAAC;AAAA,UACnD,WAAW,EAAE,SAAS,oBAAoB,OAAO,EAAE,cAAc,UAAU;AAEzE,kBAAM,YAAY,EAAE,aAAa,MAAM;AACvC,oBAAQ,WAAW,EAAE,WAAW,MAAM,UAAU,CAAC;AAAA,UACnD,WAAW,EAAE,SAAS,WAAW,EAAE,SAAS,OAAO,EAAE,MAAM,YAAY,UAAU;AAC/E,kBAAM,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC9C,oBAAQ,WAAW,EAAE,QAAQ,MAAM,OAAO,MAAM,EAAE,CAAC;AAAA,UACrD,WAAW,OAAO,EAAE,SAAS,YAAY,EAAE,KAAK,WAAW,OAAO,GAAG;AAEnE,kBAAM,UAAU,KAAK;AAAA,cACnB,MAAM,EAAE;AAAA,cACR,OAAO,EAAE;AAAA,cACT,QAAQ,EAAE;AAAA,cACV,QAAQ,EAAE,WAAW,aAAa,EAAE,WAAW,cAAc,EAAE,SAAS;AAAA,YAC1E,CAAC;AACD,oBAAQ,WAAW,EAAE,WAAW,MAAM,UAAU,MAAM,EAAE,CAAC;AAAA,UAC3D;AAAA,QACF;AACA;AAAA,MACF;AAAA,MACA,KAAK;AACH,cAAM,aAAa,MAAM,SAAS;AAElC;AACE,gBAAM,IAAI,MAAM,SAAS;AAEzB,gBAAM,eAAe,CAAC,QAA4E;AAChG,gBAAI,CAAC,OAAO,IAAI,WAAW,EAAG,QAAO;AACrC,kBAAM,MAA8B,CAAC;AACrC,uBAAW,OAAO,KAAK;AACrB,yBAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG,GAAG;AACxC,oBAAI,CAAC,KAAK,IAAI,CAAC,KAAK,MAAM,OAAO,MAAM,WAAW,IAAI;AAAA,cACxD;AAAA,YACF;AACA,mBAAO;AAAA,UACT;AACA,gBAAM,eAAe,aAAa,EAAE,kBAAkB;AACtD,gBAAM,gBAAgB,aAAa,EAAE,mBAAmB;AACxD,gBAAM,QAAQ;AAAA,YACZ,UAAU,EAAE;AAAA,YACZ,aAAa,EAAE,eAAe;AAAA,YAC9B,cAAc,EAAE,gBAAgB;AAAA,YAChC,aAAa,EAAE,eAAe;AAAA,YAC9B,oBAAoB;AAAA,YACpB,qBAAqB;AAAA,UACvB;AACA,gBAAM,eAAe,cAAc,gBAAgB,MAAM;AAAA,QAC3D;AAEA,YAAI,MAAM,SAAS,gBAAgB,OAAO,MAAM,SAAS,iBAAiB,UAAU;AAClF,gBAAM,eAAe,MAAM,SAAS;AACpC,kBAAQ,WAAW,EAAE,cAAc,MAAM,aAAa,CAAC;AAAA,QACzD;AACA,gBAAQ,WAAW,EAAE,YAAY,MAAM,YAAY,OAAO,MAAM,OAAO,cAAc,MAAM,aAAa,CAAC;AACzG;AAAA,MACF;AAEE;AAAA,IACJ;AAAA,EACF;AAEA,SAAO;AACT;;;ACxJA,OAAO,SAAS;AAKhB,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,eAAe;AAIrB,IAAI,wBAAwD;AAE5D,eAAe,qBAA8C;AAC3D,MAAI,CAAC,uBAAuB;AAC1B,4BAAwB,OAAO,kBAAkB;AAAA,EACnD;AACA,SAAO;AACT;AAEA,eAAe,gBAAgB,MAAc,MAAgC;AAC3E,SAAO,IAAI,QAAQ,CAAC,YAAY;AAC9B,UAAM,SAAS,IAAI,aAAa,EAC7B,KAAK,SAAS,MAAM,QAAQ,KAAK,CAAC,EAClC,KAAK,aAAa,MAAM,OAAO,MAAM,MAAM,QAAQ,IAAI,CAAC,CAAC,EACzD,OAAO,MAAM,IAAI;AAAA,EACtB,CAAC;AACH;AAEA,eAAe,kBAAkB,MAAc,WAAqC;AAClF,MAAI,cAAc,UAAc,MAAM,gBAAgB,WAAW,IAAI,GAAI;AACvE,WAAO;AAAA,EACT;AAEA,SAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,UAAM,SAAS,IAAI,aAAa;AAChC,WAAO,KAAK,SAAS,MAAM;AAC3B,WAAO,OAAO,GAAG,MAAM,MAAM;AAC3B,YAAM,UAAU,OAAO,QAAQ;AAC/B,UAAI,CAAC,WAAW,OAAO,YAAY,UAAU;AAC3C,eAAO,MAAM,MAAM,OAAO,IAAI,MAAM,oCAAoC,CAAC,CAAC;AAC1E;AAAA,MACF;AACA,YAAM,EAAE,KAAK,IAAI;AACjB,aAAO,MAAM,MAAM,QAAQ,IAAI,CAAC;AAAA,IAClC,CAAC;AAAA,EACH,CAAC;AACH;AA4CO,IAAM,gBAAN,MAAoB;AAAA,EACR;AAAA,EACA;AAAA,EACT;AAAA,EACA;AAAA,EAER,YAAY,UAAgC,CAAC,GAAG;AAC9C,SAAK,UAAU;AACf,SAAK,kBAAkB,QAAQ;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,QAAuB;AAC3B,QAAI,KAAK,eAAe;AACtB,WAAK,cAAc;AACnB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,SAAS,MAAyC;AACtD,WAAO,KAAK,YAAY,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAM,kBAAkB,MAAc,SAA0C,WAA+C;AAC7H,WAAO,KAAK,YAAY,MAAM,EAAE,WAAW,QAAQ,CAAC;AAAA,EACtD;AAAA,EAEA,MAAM,OAAO,WAAmB,MAAyC;AACvE,WAAO,KAAK,YAAY,MAAM,EAAE,UAAU,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,SAAS,OAA8C;AAC3D,UAAM,UAA8B,CAAC;AACrC,QAAI;AAEJ,eAAW,QAAQ,OAAO;AACxB,YAAM,SAAS,MAAM,KAAK,YAAY,MAAM,EAAE,UAAU,CAAC;AACzD,cAAQ,KAAK,MAAM;AACnB,UAAI,CAAC,OAAO,SAAS;AACnB;AAAA,MACF;AACA,kBAAY,OAAO;AAAA,IACrB;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,YAAY,QAAgB,SAAuG;AAC/I,QAAI,YAAY,SAAS;AACzB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK,aAAa;AACvC,kBAAY,MAAM,KAAK,cAAc,QAAQ,WAAW,MAAM;AAE9D,YAAM,eAAe,QAAQ,KAAK,mBAAmB,SAAS,OAAO;AACrE,YAAM,aAAa,IAAI,gBAAgB;AACvC,YAAM,UAAU,eACZ,KAAK,YAAY,QAAQ,WAAW,SAAS,SAAS,WAAW,MAAM,EAAE,MAAM,CAAC,UAAU;AACxF,YAAI,CAAC,WAAW,OAAO,SAAS;AAC9B,gBAAM;AAAA,QACR;AAAA,MACF,CAAC,IACD;AAEJ,UAAI;AACF,cAAM,aAAsF;AAAA,UAC1F,OAAO,CAAC,EAAE,MAAM,QAAQ,MAAM,OAAO,CAAC;AAAA,QACxC;AAEA,cAAM,cAAc,KAAK,WAAW,KAAK,QAAQ,SAAS,aAAa;AACvE,YAAI,aAAa;AACf,qBAAW,QAAQ;AAAA,QACrB;AAEA,cAAM,WAAW,MAAM,OAAO,QAAQ,OAAO;AAAA,UAC3C,MAAM,EAAE,IAAI,UAAU;AAAA,UACtB,MAAM;AAAA,UACN,OAAO,EAAE,WAAW,KAAK,oBAAoB,EAAE;AAAA,QACjD,CAAC;AAED,cAAM,OAAO,KAAK,YAA4B,QAAQ;AACtD,eAAO;AAAA,UACL;AAAA,UACA,UAAU;AAAA,UACV,QAAQ,KAAK,YAAY,IAAI;AAAA,UAC7B,SAAS;AAAA,UACT,OAAO,KAAK,QAAQ,IAAI;AAAA,QAC1B;AAAA,MACF,UAAE;AACA,YAAI,SAAS;AACX,qBAAW,MAAM;AACjB,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,WAAW,aAAa;AAAA,QACxB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,MAC9D;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,eAAwC;AACpD,QAAI,KAAK,eAAe;AACtB,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,QAAQ,eAAe;AAC9B,WAAK,gBAAgB,KAAK,QAAQ,cAAc,EAAE,KAAK,CAAC,EAAE,OAAO,MAAM,MAAM;AAC7E,aAAO,KAAK;AAAA,IACd;AAEA,QAAI,KAAK,QAAQ,SAAS;AACxB,WAAK,gBAAgB,mBAAmB,EAAE;AAAA,QAAK,CAAC,EAAE,qBAAqB,MACrE,qBAAqB;AAAA,UACnB,SAAS,KAAK,QAAQ;AAAA,QACxB,CAAC;AAAA,MACH;AACA,aAAO,KAAK;AAAA,IACd;AAEA,SAAK,gBAAgB,mBAAmB,EAAE,KAAK,OAAO,EAAE,eAAe,MAAM;AAC3E,YAAM,WAAW,KAAK,QAAQ,YAAY;AAC1C,YAAM,OAAO,MAAM,kBAAkB,UAAU,KAAK,QAAQ,QAAQ,YAAY;AAChF,YAAM,EAAE,QAAQ,OAAO,IAAI,MAAM,eAAe,EAAE,UAAU,MAAM,QAAQ,KAAK,QAAQ,OAAO,CAAC;AAC/F,WAAK,gBAAgB,MAAM,OAAO,MAAM;AACxC,aAAO;AAAA,IACT,CAAC;AAED,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAc,cAAc,QAAwB,YAAgC,QAAiC;AACnH,QAAI,YAAY;AACd,aAAO;AAAA,IACT;AAEA,UAAM,SAAS,MAAM,OAAO,QAAQ,OAAO;AAAA,MACzC,MAAM;AAAA,QACJ,OAAO,KAAK,QAAQ,SAAS,KAAK,mBAAmB,MAAM;AAAA,MAC7D;AAAA,MACA,OAAO,EAAE,WAAW,KAAK,oBAAoB,EAAE;AAAA,IACjD,CAAC;AAED,UAAM,UAAU,KAAK,YAAqB,MAAM;AAChD,WAAO,QAAQ;AAAA,EACjB;AAAA,EAEQ,mBAAmB,QAAwB;AACjD,UAAM,CAAC,eAAe,EAAE,IAAI,OAAO,KAAK,EAAE,MAAM,OAAO;AACvD,UAAM,YAAY,gBAAgB;AAClC,WAAO,UAAU,SAAS,KAAK,GAAG,UAAU,MAAM,GAAG,EAAE,CAAC,QAAQ;AAAA,EAClE;AAAA,EAEQ,WAAW,OAAqE;AACtF,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,MAAM,SAAS,GAAG,GAAG;AACvB,YAAM,CAAC,cAAc,SAAS,IAAI,MAAM,MAAM,KAAK,CAAC;AACpD,YAAM,aAAa,gBAAgB;AACnC,YAAM,UAAU,aAAa,gBAAgB;AAC7C,aAAO,EAAE,YAAY,QAAQ;AAAA,IAC/B;AAEA,WAAO,EAAE,YAAY,aAAa,SAAS,MAAM;AAAA,EACnD;AAAA,EAEQ,YAAY,UAAkC;AACpD,UAAM,QAAQ,SAAS,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,MAAM,KAAK,CAAC;AACzE,WAAO,MAAM,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,KAAK,IAAI,EAAE,KAAK;AAAA,EACxD;AAAA,EAEQ,QAAQ,UAAwC;AACtD,UAAM,SAAS,SAAS,MAAM;AAC9B,QAAI,CAAC,QAAQ;AACX,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,cAAc,OAAO,SAAS;AAAA,MAC9B,eAAe,OAAO,UAAU;AAAA,MAChC,qBAAqB,OAAO,OAAO,QAAQ;AAAA,IAC7C;AAAA,EACF;AAAA,EAEQ,YAAe,QAAoB;AACzC,QAAI,UAAU,OAAO,WAAW,YAAY,UAAU,QAAQ;AAC5D,YAAM,SAAS;AACf,UAAI,OAAO,SAAS,QAAW;AAC7B,eAAO,OAAO;AAAA,MAChB;AAEA,YAAM,IAAI,MAAM,KAAK,cAAc,OAAO,KAAK,CAAC;AAAA,IAClD;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,cAAc,OAAwB;AAC5C,QAAI,CAAC,OAAO;AACV,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,UAAU,UAAU;AAC7B,aAAO;AAAA,IACT;AAEA,QAAI,iBAAiB,OAAO;AAC1B,aAAO,MAAM;AAAA,IACf;AAEA,QAAI,OAAO,UAAU,YAAY,aAAa,SAAS,OAAQ,MAAc,YAAY,UAAU;AACjG,aAAQ,MAAc;AAAA,IACxB;AAEA,WAAO,KAAK,UAAU,KAAK;AAAA,EAC7B;AAAA,EAEA,MAAc,YACZ,QACA,WACA,SACA,QACe;AACf,UAAM,EAAE,OAAO,IAAI,MAAM,OAAO,MAAM,UAAU;AAAA,MAC9C;AAAA,MACA,OAAO,EAAE,WAAW,KAAK,oBAAoB,EAAE;AAAA,IACjD,CAAC;AACD,UAAM,qBAAqB,oBAAI,IAAY;AAE3C,qBAAiB,SAAS,QAAQ;AAChC,UAAI,OAAO,SAAS;AAClB;AAAA,MACF;AAEA,YAAM,kBAAkB,KAAK,iBAAiB,KAAK;AACnD,UAAI,KAAK,mBAAmB,MAAM,SAAS,sBAAsB;AAC/D,cAAM,aAAa,MAAM;AACzB,YAAI,WAAW,cAAc,aAAa,CAAC,mBAAmB,IAAI,WAAW,EAAE,GAAG;AAChF,6BAAmB,IAAI,WAAW,EAAE;AACpC,gBAAM,KAAK,oBAAoB,QAAQ,UAAU;AAAA,QACnD;AAAA,MACF;AAEA,UAAI,WAAW,oBAAoB,WAAW;AAC5C,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,iBAAiB,OAA0C;AACjE,UAAM,aAAmD,MAAc;AACvE,QAAI,CAAC,YAAY;AACf,aAAO;AAAA,IACT;AAEA,QAAI,OAAO,WAAW,cAAc,UAAU;AAC5C,aAAO,WAAW;AAAA,IACpB;AAEA,QAAI,OAAO,WAAW,SAAS,YAAY,WAAW,SAAS,QAAQ,eAAgB,WAAW,MAAkC;AAClI,YAAM,QAAS,WAAW,KAAiC;AAC3D,aAAO,OAAO,UAAU,WAAW,QAAQ;AAAA,IAC7C;AAEA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,oBAAoB,QAAwB,YAAuC;AAC/F,QAAI,CAAC,KAAK,iBAAiB;AACzB;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,KAAK,gBAAgB;AAAA,MAC1C,IAAI,WAAW;AAAA,MACf,MAAM,WAAW;AAAA,MACjB,OAAO,WAAW;AAAA,MAClB,WAAW,WAAW;AAAA,MACtB,UAAW,WAAW,YAAY,CAAC;AAAA,MACnC,SAAS,MAAM,QAAQ,WAAW,OAAO,IAAI,WAAW,QAAQ,MAAM,IAAI,WAAW;AAAA,IACvF,CAAC;AAED,UAAM,WAAW,KAAK,kBAAkB,QAAQ;AAChD,UAAM,OAAO,qCAAqC;AAAA,MAChD,MAAM;AAAA,QACJ,IAAI,WAAW;AAAA,QACf,cAAc,WAAW;AAAA,MAC3B;AAAA,MACA,MAAM,EAAE,SAAS;AAAA,IACnB,CAAC;AAAA,EACH;AAAA,EAEQ,kBAAkB,UAA4D;AACpF,QAAI,OAAO,aAAa,WAAW;AACjC,aAAO,WAAW,SAAS;AAAA,IAC7B;AAEA,QAAI,OAAO,aAAa,UAAU;AAChC,aAAO;AAAA,IACT;AAEA,WAAO,SAAS;AAAA,EAClB;AAAA,EAEQ,sBAA8B;AACpC,WAAO,KAAK,QAAQ,oBAAoB,QAAQ,IAAI;AAAA,EACtD;AACF;;;ACnXO,IAAM,aAAN,MAAiB;AAAA,EACtB,YAA6B,UAA6B,CAAC,GAAG;AAAjC;AAAA,EAAkC;AAAA,EAEvD,UAAU;AAChB,UAAM,IAAI,iBAAiB;AAC3B,QAAI,CAAC,EAAG,OAAM,IAAI,MAAM,8BAA8B;AACtD,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,KAAK,KAA2C;AACpD,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,CAAC,EAAE,eAAgB,OAAM,IAAI,MAAM,+CAA+C;AACtF,UAAM,OAAO,MAAM,EAAE,eAAe,KAAK,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAAM;AAClF,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,QAAQ,QAAwC;AACpD,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,CAAC,EAAE,kBAAmB,OAAM,IAAI,MAAM,kDAAkD;AAC5F,UAAM,OAAO,MAAM,EAAE,kBAAkB,QAAQ,KAAK,QAAQ,SAAS,KAAK,QAAQ,MAAM;AACxF,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,WAAO,OAAO,QAAQ;AAAA,EACxB;AAAA,EAEA,MAAM,eAAe,QAAgB,cAAmD;AACtF,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,CAAC,EAAE,0BAA0B;AAC/B,YAAM,IAAI,MAAM,yDAAyD;AAAA,IAC3E;AACA,UAAM,OAAO,MAAM,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,IACf;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,MAAM,QAAgB,cAAmD;AAC7E,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,CAAC,EAAE,gBAAiB,OAAM,IAAI,MAAM,gDAAgD;AACxF,UAAM,OAAO,MAAM,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,MACA,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,IACf;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AAAA,EAEA,MAAM,OACJ,OACA,QACA,MACgC;AAChC,UAAM,IAAI,KAAK,QAAQ;AACvB,QAAI,CAAC,EAAE,iBAAkB,OAAM,IAAI,MAAM,iDAAiD;AAC1F,UAAM,OAAO,MAAM,EAAE;AAAA,MACnB;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN,MAAM;AAAA,MACN,MAAM;AAAA,MACN,KAAK,QAAQ;AAAA,MACb,KAAK,QAAQ;AAAA,IACf;AACA,WAAO,KAAK,MAAM,IAAI;AAAA,EACxB;AACF;;;ACzGO,IAAK,WAAL,kBAAKC,cAAL;AACL,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,UAAO,KAAP;AACA,EAAAA,oBAAA,WAAQ,KAAR;AACA,EAAAA,oBAAA,YAAS,KAAT;AALU,SAAAA;AAAA,GAAA;;;ACCZ,IAAM,SAAS;AAAA,EACb,OAAO;AAAA;AAAA,EAEP,OAAO;AAAA;AAAA,EACP,MAAM;AAAA;AAAA,EACN,MAAM;AAAA;AAAA,EACN,OAAO;AAAA;AAAA;AAAA,EAEP,QAAQ;AAAA;AAAA,EACR,OAAO;AAAA;AAAA,EACP,KAAK;AAAA;AAAA,EACL,aAAa;AAAA;AAAA,EACb,QAAQ;AAAA;AAAA,EACR,YAAY;AAAA;AAAA,EACZ,UAAU;AAAA;AAAA,EACV,YAAY;AAAA;AAAA,EACZ,KAAK;AAAA;AAAA,EACL,OAAO;AAAA;AAAA,EACP,UAAU;AAAA;AAAA,EACV,IAAI;AAAA;AAAA,EACJ,MAAM;AAAA;AAAA,EACN,QAAQ;AAAA;AACV;AAKA,IAAM,gBAA2B;AAAA,EAC/B,OAAO,CAAC,QAAQ,QAAQ,MAAM,GAAG;AAAA,EACjC,MAAM,CAAC,QAAQ,QAAQ,IAAI,GAAG;AAAA,EAC9B,MAAM,CAAC,QAAQ,QAAQ,KAAK,GAAG;AAAA,EAC/B,OAAO,CAAC,QAAQ,QAAQ,MAAM,GAAG;AACnC;AAKO,IAAM,SAAN,MAAM,QAAO;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAER,YAAY,SAAuB,CAAC,GAAG;AACrC,SAAK,QAAQ,OAAO;AACpB,SAAK,SAAS,OAAO,WAAW,OAAO,YAAY,eAAe,QAAQ,QAAQ,UAAU;AAC5F,SAAK,aAAa,OAAO,cAAc;AACvC,SAAK,SAAS,OAAO,UAAU;AAC/B,SAAK,OAAO,OAAO,QAAQ;AAC3B,SAAK,SAAS,OAAO,UAAU;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,QAAuC;AAC/C,WAAO,IAAI,QAAO;AAAA,MAChB,OAAO,OAAO,SAAS,KAAK;AAAA,MAC5B,QAAQ,OAAO,UAAU,KAAK;AAAA,MAC9B,YAAY,OAAO,cAAc,KAAK;AAAA,MACtC,QAAQ,OAAO,UAAU,KAAK;AAAA,MAC9B,MAAM,OAAO,QAAQ,KAAK;AAAA,MAC1B,QAAQ,OAAO,UAAU,KAAK;AAAA,IAChC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,OAAiB,SAAgC;AACrD,WAAO,IAAI,aAAa,MAAM,OAAO,OAAO;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,mBAAiB,SAAS,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,kBAAgB,SAAS,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,kBAAgB,SAAS,IAAI;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,mBAAiB,SAAS,IAAI;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKQ,IAAI,OAAiB,SAAiB,MAAgC,OAAkB,SAAwB;AACtH,QAAI,QAAQ,KAAK,OAAO;AACtB;AAAA,IACF;AAEA,QAAI,KAAK,MAAM;AACb,WAAK,QAAQ,OAAO,SAAS,MAAM,OAAO,OAAO;AAAA,IACnD,OAAO;AACL,WAAK,aAAa,OAAO,SAAS,OAAO,OAAO;AAAA,IAClD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,QAAQ,OAAiB,SAAiB,MAAgC,OAAkB,SAAwB;AAC1H,UAAM,QAAkB;AAAA,MACtB,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,OAAO,SAAM,KAAK;AAAA,MAClB;AAAA,MACA,GAAI,SAAS,EAAE,MAAM;AAAA,MACrB,GAAI,WAAW,EAAE,QAAQ;AAAA,MACzB,GAAI,QAAQ,EAAE,KAAK;AAAA,IACrB;AAEA,UAAM,SAAS,KAAK,UAAU,KAAK;AACnC,SAAK,OAAO,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,OAAiB,SAAiB,OAAkB,SAAwB;AAC/F,UAAM,QAAkB,CAAC;AAGzB,QAAI,KAAK,YAAY;AACnB,YAAM,MAAK,oBAAI,KAAK,GAAE,YAAY;AAClC,YAAM,KAAK,KAAK,SAAS,YAAY,EAAE,aAAa,IAAI,EAAE,GAAG;AAAA,IAC/D;AAGA,UAAM,YAAY,SAAM,KAAK;AAC7B,QAAI,KAAK,QAAQ;AACf,YAAM,QAAQ,OAAO,UAAU,YAAY,CAAwB,KAAK,OAAO;AAC/E,YAAM,KAAK,GAAG,KAAK,IAAI,SAAS,IAAI,OAAO,KAAK,EAAE;AAAA,IACpD,OAAO;AACL,YAAM,KAAK,IAAI,SAAS,GAAG;AAAA,IAC7B;AAGA,QAAI,OAAO;AACT,YAAM,QAAQ,UAAU,GAAG,KAAK,IAAI,OAAO,KAAK;AAChD,UAAI,KAAK,QAAQ;AACf,cAAM,QAAQ,OAAO,KAAK,KAAK,OAAO;AACtC,cAAM,KAAK,GAAG,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,EAAE;AAAA,MAChD,OAAO;AACL,cAAM,KAAK,IAAI,KAAK,GAAG;AAAA,MACzB;AAAA,IACF;AAGA,QAAI,KAAK,QAAQ;AACf,YAAM,KAAK,KAAK,MAAM;AAAA,IACxB;AAGA,UAAM,KAAK,OAAO;AAElB,UAAM,YAAY,MAAM,KAAK,GAAG;AAGhC,YAAQ,OAAO;AAAA,MACb;AACE,aAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,MACF;AACE,aAAK,OAAO,KAAK,SAAS;AAC1B;AAAA,MACF;AACE,aAAK,OAAO,KAAK,SAAS;AAC1B;AAAA,MACF;AACE,aAAK,OAAO,MAAM,SAAS;AAC3B;AAAA,IACJ;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU,OAAiB,SAAiB,OAAiB,SAAkB,MAAsC;AACnH,SAAK,IAAI,OAAO,SAAS,MAAM,OAAO,OAAO;AAAA,EAC/C;AACF;AAKO,IAAM,eAAN,MAAmB;AAAA,EACxB,YACUC,SACA,OACA,SACR;AAHQ,kBAAAA;AACA;AACA;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAKH,MAAM,SAAiB,MAAsC;AAC3D,SAAK,OAAO,yBAAuB,SAAS,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,OAAO,wBAAsB,SAAS,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,KAAK,SAAiB,MAAsC;AAC1D,SAAK,OAAO,wBAAsB,SAAS,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,EAC3E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,SAAiB,MAAsC;AAC3D,SAAK,OAAO,yBAAuB,SAAS,KAAK,OAAO,KAAK,SAAS,IAAI;AAAA,EAC5E;AAAA;AAAA;AAAA;AAAA,EAKA,eAAkC;AAChC,WAAO;AAAA,MACL,MAAM,CAAC,YAAoB,KAAK,KAAK,OAAO;AAAA,MAC5C,MAAM,CAAC,YAAoB,KAAK,KAAK,OAAO;AAAA,IAC9C;AAAA,EACF;AACF;AAKO,IAAM,SAAS,IAAI,OAAO;AAAA,EAC/B,OAAO,QAAQ,IAAI,kBACd,SAAM,QAAQ,IAAI,eAAqC;AAAA,EAE5D,QAAQ,QAAQ,IAAI,qBAAqB;AAAA,EACzC,YAAY,QAAQ,IAAI,yBAAyB;AAAA,EACjD,MAAM,QAAQ,IAAI,mBAAmB;AACvC,CAAC;;;ACnQD,IAAM,0BAA0B;AAKzB,SAAS,mBAAmB,cAA4B,SAAqD;AAClH,SAAO;AAAA,IACL,MAAM,CAAC,YAAoB,aAAa,KAAK,OAAO;AAAA,IACpD,MAAM,CAAC,YAAoB,aAAa,KAAK,OAAO;AAAA,IACpD,aAAa;AAAA,EACf;AACF;AAKA,eAAsB,sBACpB,QACA,MACA,QACA,aACA;AACA,QAAM,cAAc,OAAO,QAAQ,CAAC,UAAU,eAAe,OAAO,IAAI,CAAC;AACzE,MAAI;AACF,QAAI,aAAa;AACf,aAAO,MAAM,OAAO,IAAI,QAAQ,WAAW;AAAA,IAC7C;AACA,WAAO,MAAM,OAAO,IAAI,MAAM;AAAA,EAChC,UAAE;AACA,gBAAY;AAAA,EACd;AACF;AAKA,SAAS,eAAe,OAAoB,MAA+B;AACzE,UAAQ,MAAM,MAAM;AAAA,IAClB,KAAK;AACH,WAAK,KAAK,uBAAuB,MAAM,SAAS,GAAG;AACnD;AAAA,IACF,KAAK;AACH,WAAK,KAAK,cAAc;AACxB;AAAA,IACF,KAAK;AACH,WAAK;AAAA,QACH,yBAAyB,MAAM,MAAM,YAAY,YAAY,MAAM,MAAM,mBAAmB,YAAY,MAAM,MAAM,aAAa;AAAA,MACnI;AACA,UAAI,iBAAiB,QAAQ,KAAK,aAAa;AAC7C,aAAK,YAAY,MAAM,KAAK;AAAA,MAC9B;AACA;AAAA,IACF,KAAK;AACH,WAAK,KAAK,gBAAgB,MAAM,MAAM,OAAO,EAAE;AAC/C;AAAA,IACF,KAAK;AACH,WAAK,KAAK,iBAAiB,yBAAyB,MAAM,IAAI,CAAC,EAAE;AACjE;AAAA,IACF,KAAK;AACH,WAAK,KAAK,iBAAiB,yBAAyB,MAAM,IAAI,CAAC,EAAE;AACjE;AAAA,IACF,KAAK,kBAAkB;AACrB,YAAM,UAAU,mBAAmB,yBAAyB,MAAM,IAAI,CAAC;AACvE,UAAI,MAAM,KAAK,SAAS,SAAS;AAC/B,aAAK,KAAK,OAAO;AAAA,MACnB,OAAO;AACL,aAAK,KAAK,OAAO;AAAA,MACnB;AACA;AAAA,IACF;AAAA,IACA,KAAK;AACH,WAAK,KAAK,eAAe,iBAAiB,MAAM,OAAO,CAAC,EAAE;AAC1D;AAAA,IACF,KAAK;AACH,WAAK,KAAK,oBAAoB;AAC9B;AAAA,IACF,KAAK;AACH,WAAK,KAAK,iBAAiB,MAAM,OAAO,EAAE;AAC1C;AAAA,IACF,KAAK;AACH;AAAA,IACF;AACE;AAAA,EACJ;AACF;AAKA,SAAS,yBAAyB,MAA0B;AAC1D,UAAQ,KAAK,MAAM;AAAA,IACjB,KAAK;AACH,aAAO,wBAAmB,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACvD,KAAK;AACH,aAAO,oBAAe,iBAAiB,KAAK,IAAI,CAAC;AAAA,IACnD,KAAK,qBAAqB;AACxB,YAAM,OAAO,KAAK,cAAc,SAAY,SAAS,KAAK,SAAS,KAAK;AACxE,aAAO,YAAY,iBAAiB,KAAK,OAAO,CAAC,MAAM,KAAK,MAAM,GAAG,IAAI;AAAA,IAC3E;AAAA,IACA,KAAK,eAAe;AAClB,YAAM,aAAa,KAAK,QAAQ,IAAI,CAAC,WAAW,GAAG,OAAO,IAAI,IAAI,OAAO,IAAI,EAAE,EAAE,KAAK,IAAI;AAC1F,aAAO,gBAAgB,KAAK,MAAM,KAAK,iBAAiB,UAAU,CAAC;AAAA,IACrE;AAAA,IACA,KAAK;AACH,aAAO,OAAO,KAAK,MAAM,IAAI,KAAK,IAAI,KAAK,KAAK,MAAM;AAAA,IACxD,KAAK;AACH,aAAO,eAAe,iBAAiB,KAAK,KAAK,CAAC;AAAA,IACpD,KAAK,aAAa;AAChB,YAAM,YAAY,KAAK,MAAM,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE;AAC9D,aAAO,aAAa,SAAS,IAAI,KAAK,MAAM,MAAM;AAAA,IACpD;AAAA,IACA,KAAK;AACH,aAAO,gBAAW,iBAAiB,KAAK,OAAO,CAAC;AAAA,IAClD,SAAS;AAEP,YAAM,cAAqB;AAC3B,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAKA,SAAS,iBAAiB,MAA0B,QAAQ,yBAAiC;AAC3F,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AACA,QAAM,YAAY,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AACjD,MAAI,UAAU,UAAU,OAAO;AAC7B,WAAO;AAAA,EACT;AACA,SAAO,GAAG,UAAU,MAAM,GAAG,KAAK,CAAC;AACrC;;;AClIO,IAAM,wBAAwB;AAM9B,IAAM,iCAAiC;AAMvC,IAAM,sBAAsB;AAM5B,IAAM,yBAAyB;AAM/B,IAAM,+BAA+B;AAOrC,IAAM,8BAA8B;AAMpC,IAAM,yBAAyB;AAM/B,IAAM,8BAA8B;;;ACWpC,SAAS,sBAAsB,SAA0B;AAC9D,MAAI,CAAC,WAAW,QAAQ,KAAK,EAAE,SAAS,IAAI;AAC1C,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,QAAQ,KAAK;AAC7B,QAAM,aAAa,QAAQ,YAAY;AACvC,QAAM,QAAQ,QAAQ,MAAM,OAAO,EAAE,IAAI,CAAC,SAAS,KAAK,KAAK,CAAC,EAAE,OAAO,OAAO;AAC9E,QAAM,YAAY,QAAQ,MAAM,KAAK,EAAE,OAAO,OAAO;AACrD,QAAM,SAAS,UAAU,IAAI,CAAC,UAAU,MAAM,YAAY,CAAC;AAE3D,MAAI,UAAU,WAAW,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,kBAAkB,UAAU,OAAO,CAAC,UAAU;AAClD,UAAM,aAAa,MAAM,QAAQ,YAAY,EAAE;AAC/C,WAAO,WAAW,UAAU,KAAK,eAAe,WAAW,YAAY;AAAA,EACzE,CAAC;AACD,QAAM,iBAAiB,gBAAgB,SAAS,UAAU;AAE1D,QAAM,cAAc,UAAU,OAAO,CAAC,UAAU,MAAM,SAAS,GAAG,CAAC;AACnE,QAAM,kBAAkB,YAAY,SAAS,UAAU;AAEvD,QAAM,eAAe,MAAM,OAAO,CAAC,SAAS,YAAY,KAAK,IAAI,CAAC;AAClE,QAAM,cAAc,MAAM,OAAO,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC;AACpE,QAAM,qBAAqB,MAAM,OAAO,CAAC,SAAS,eAAe,KAAK,IAAI,CAAC;AAC3E,QAAM,kBAAkB,MAAM,OAAO,CAAC,SAAS,yBAAyB,KAAK,IAAI,CAAC;AAElF,QAAM,eAAe,aAAa,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC;AACnE,QAAM,cAAc,YAAY,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC;AACjE,QAAM,kBAAkB,gBAAgB,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC;AACzE,QAAM,eAAe,mBAAmB,SAAS,KAAK,IAAI,MAAM,QAAQ,CAAC;AACzE,QAAM,mBAAmB,YAAY,SAAS,mBAAmB,UAAU,KAAK,IAAI,MAAM,QAAQ,CAAC;AAEnG,QAAM,uBAAuB,MAAM;AACjC,QAAI,MAAM;AACV,eAAW,SAAS,WAAW;AAC7B,YAAM,UAAU,MAAM,QAAQ,YAAY,EAAE;AAC5C,UAAI,QAAQ,WAAW,GAAG;AACxB;AAAA,MACF;AACA,YAAM,OAAO,QAAQ,MAAM,CAAC;AAC5B,YAAM,cAAc,QAAQ,CAAC,GAAG,YAAY,MAAM,QAAQ,CAAC,KAAK,SAAS,KAAK,YAAY;AAC1F,YAAM,YAAY,QAAQ,UAAU,KAAK,YAAY,QAAQ,YAAY;AACzE,UAAI,eAAe,WAAW;AAC5B,eAAO;AAAA,MACT,OAAO;AACL;AAAA,MACF;AAAA,IACF;AACA,WAAO;AAAA,EACT,GAAG;AAEH,QAAM,mBAAmB,OAAO,OAAO,CAAC,KAAK,UAAU,IAAI,IAAI,QAAQ,IAAI,IAAI,KAAK,KAAK,KAAK,CAAC,GAAG,oBAAI,IAAoB,CAAC;AAC3H,QAAM,kBAAkB,MAAM,KAAK,iBAAiB,OAAO,CAAC;AAC5D,QAAM,uBAAuB,KAAK,IAAI,GAAG,eAAe;AACxD,QAAM,oBAAoB,uBAAuB,OAAO;AAExD,MAAI,YAAY,UAAU,KAAK,kBAAkB,MAAM;AACrD,WAAO;AAAA,EACT;AAEA,MAAI,eAAe,OAAO,MAAM,UAAU,GAAG;AAC3C,WAAO;AAAA,EACT;AAEA,MAAI,uBAAuB,KAAK,UAAU,UAAU,IAAI;AACtD,WAAO;AAAA,EACT;AAEA,MAAI,kBAAkB,OAAO,MAAM,UAAU,GAAG;AAC9C,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB;AAAA,IACpB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,cAAc;AAAA,IACd,kBAAkB,OAAQ,MAAM,UAAU,KAAK,kBAAkB;AAAA,IACjE,uBAAuB;AAAA,IACvB,oBAAoB,QAAQ,OAAO,SAAS;AAAA,IAC5C,UAAU,SAAS,MAAM,kBAAkB;AAAA,IAC3C,eAAe;AAAA,EACjB,EAAE,OAAO,OAAO,EAAE;AAElB,MAAI,iBAAiB,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,MAAM,UAAU,KAAK,CAAC;AACjD,MAAI,WAAW,SAAS,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,QAAM,gBAAgB,QAAQ,MAAM,kCAAkC;AACtE,MAAI,eAAe;AACjB,UAAM,UAAU,cAAc,CAAC,GAAG,YAAY,KAAK;AACnD,UAAM,kBAAkB,QAAQ,SAAS,QAAQ,KAAK,QAAQ,SAAS,SAAS,KAAK,QAAQ,SAAS,KAAK;AAC3G,QAAI,QAAQ,SAAS,GAAG,KAAK,iBAAiB;AAC5C,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,mBAAmB,KAAK,OAAO,GAAG;AACpC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,gBAAgB,KAAK,OAAO,KAAK,gBAAgB,KAAK,OAAO,MAAM,YAAY,KAAK,OAAO;AAClH,MAAI,eAAe;AACjB,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AA4BO,SAAS,2BAAqD,UAAoB;AAEvF,QAAM,iBAAiB,oBAAI,IAAe;AAE1C,aAAW,WAAW,UAAU;AAE9B,UAAM,cAAc,QAAQ,QAAQ,MAAM,GAAG,GAAG,EAAE,YAAY,EAAE,QAAQ,QAAQ,GAAG;AAEnF,UAAM,WAAW,eAAe,IAAI,WAAW;AAC/C,QAAI,CAAC,YAAY,QAAQ,YAAY,SAAS,WAAW;AAEvD,qBAAe,IAAI,aAAa,OAAO;AAAA,IACzC;AAAA,EACF;AAGA,SAAO,MAAM,KAAK,eAAe,OAAO,CAAC,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,YAAY,EAAE,SAAS;AACrF;AA0BO,SAAS,qBACd,UACA,QAAgB,IAC8B;AAC9C,QAAM,QAA4B;AAAA,IAChC,SAAS,SAAS;AAAA,IAClB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,OAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,SAAS,OAAO,CAAC,YAAY,sBAAsB,QAAQ,OAAO,CAAC;AACzF,QAAM,sBAAsB,cAAc;AAG1C,QAAM,eAAe,2BAA2B,aAAa;AAC7D,QAAM,qBAAqB,aAAa;AAIxC,QAAM,QAAQ,aAAa,MAAM,GAAG,KAAK;AACzC,QAAM,QAAQ,MAAM;AAEpB,SAAO,EAAE,UAAU,OAAO,MAAM;AAClC;;;AC1QA,IAAM,oBAAoB;AAC1B,IAAM,6BAA6B;AAEnC,IAAM,oBAAoB;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAI,qBAAwD;AAC5D,IAAI,oBAAoB;AAExB,IAAM,MAAM,CAAC,GAAa,MAAwB,EAAE,OAAO,CAAC,KAAK,OAAO,QAAQ,MAAM,SAAS,EAAE,GAAG,KAAK,IAAI,CAAC;AAE9G,SAAS,gBAAgB,MAAc,WAA2B;AAChE,QAAM,aAAa,KAAK,QAAQ,QAAQ,GAAG,EAAE,KAAK;AAClD,MAAI,WAAW,UAAU,WAAW;AAClC,WAAO;AAAA,EACT;AACA,SAAO,WAAW,MAAM,GAAG,SAAS;AACtC;AAEA,eAAe,WAAW,QAAkB,aAAkD;AAC5F,MAAI,qBAAqB,OAAO,WAAW,GAAG;AAC5C,WAAO;AAAA,EACT;AAEA,MAAI;AACF,UAAM,aAAa,MAAM,eAAe;AAAA,MACtC;AAAA,MACA;AAAA,MACA,WAAW;AAAA,IACb,CAAC;AACD,WAAO;AAAA,EACT,SAAS,OAAO;AACd,wBAAoB;AACpB,YAAQ,KAAK,kFAAyE,MAAgB,WAAW,KAAK,GAAG;AACzH,WAAO;AAAA,EACT;AACF;AAEA,eAAe,eAAe,aAAkD;AAC9E,MAAI,oBAAoB;AACtB,WAAO;AAAA,EACT;AACA,uBAAqB,WAAW,mBAAmB,WAAW;AAC9D,SAAO;AACT;AAEA,eAAsB,0BACpB,UACA,SACsD;AACtD,MAAI,SAAS,WAAW,GAAG;AACzB,WAAO,EAAE,MAAM,CAAC,GAAG,SAAS,EAAE;AAAA,EAChC;AAEA,QAAM,cAAc,SAAS;AAC7B,QAAM,YAAY,SAAS,aAAa;AACxC,QAAM,aAAa,SAAS,oBAAoB;AAEhD,QAAM,QAAQ,MAAM,eAAe,WAAW;AAC9C,MAAI,CAAC,SAAS,MAAM,WAAW,GAAG;AAChC,WAAO,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,EACtC;AAEA,QAAM,eAAe,SAAS,IAAI,CAAC,YAAY,gBAAgB,QAAQ,SAAS,UAAU,CAAC;AAC3F,QAAM,iBAAiB,MAAM,WAAW,cAAc,WAAW;AACjE,MAAI,CAAC,gBAAgB;AACnB,WAAO,EAAE,MAAM,UAAU,SAAS,EAAE;AAAA,EACtC;AAEA,QAAM,OAAyB,CAAC;AAChC,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,SAAS,QAAQ,KAAK,GAAG;AAC3C,UAAM,SAAS,eAAe,CAAC;AAC/B,QAAI,CAAC,QAAQ;AACX,WAAK,KAAK,SAAS,CAAC,CAAE;AACtB;AAAA,IACF;AAEA,UAAM,gBAAgB,MAAM,OAAO,CAAC,YAAY,YAAY;AAC1D,YAAM,aAAa,IAAI,QAAQ,OAAO;AACtC,aAAO,aAAa,aAAa,aAAa;AAAA,IAChD,GAAG,SAAS;AAEZ,QAAI,OAAO,SAAS,aAAa,KAAK,iBAAiB,WAAW;AAChE,iBAAW;AAAA,IACb,OAAO;AACL,WAAK,KAAK,SAAS,CAAC,CAAE;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,UAAU,GAAG;AACf,YAAQ,IAAI,gDAAyC,OAAO,IAAI,SAAS,MAAM,wBAAwB,UAAU,QAAQ,CAAC,CAAC,GAAG;AAAA,EAChI;AAEA,SAAO,EAAE,MAAM,QAAQ;AACzB;;;AClGO,SAAS,iBAAiB,OAAe,SAAwB;AACtE,QAAM,aAAa,UAAU,KAAK,OAAO,MAAM;AAC/C,UAAQ,IAAI,2BAAoB,UAAU,MAAM,KAAK,GAAG;AAC1D;AAOO,SAAS,oBAAoB,OAO3B;AACP,QAAM,EAAE,OAAO,cAAc,kBAAkB,YAAY,YAAY,WAAW,IAAI,IAAI;AAC1F,QAAM,kBAAkB,QAAQ;AAChC,QAAM,mBAAoB,oBAAoB;AAC9C,QAAM,sBAAsB,eAAe;AAC3C,QAAM,gBAAgB,mBAAmB;AACzC,QAAM,qBAAqB,aAAa;AAExC,UAAQ;AAAA,IACN,gCAAyB,KAAK,eAAU,YAAY,iBAAY,gBAAgB,0BAAqB,UAAU,wBAAmB,QAAQ,YAAO,UAAU,sBAC5I,eAAe,iBAAiB,mBAAmB,iBAAiB,aAAa,eAAe,kBAAkB;AAAA,EACnI;AACF;AAQO,SAAS,mBAAmB,UAA2B,QAAgB,GAAS;AACrF,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,qCAA8B;AAC1C;AAAA,EACF;AAEA,UAAQ,IAAI,cAAS,KAAK,IAAI,OAAO,SAAS,MAAM,CAAC,oBAAoB;AACzE,QAAM,cAAc,SAAS,MAAM,GAAG,KAAK;AAE3C,WAAS,IAAI,GAAG,IAAI,YAAY,QAAQ,KAAK;AAC3C,UAAM,UAAU,YAAY,CAAC;AAC7B,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,GAAG,KAAK,MAAM,QAAQ,YAAY,GAAG,CAAC;AACpD,UAAM,UAAU,SAAS,QAAQ,SAAS,GAAG;AAC7C,UAAM,cAAc,QAAQ,SAAS,SAAS,IAAI,SAAS,QAAQ,SAAS,CAAC,KAAK,IAAI,GAAG,IAAI;AAE7F,YAAQ,IAAI,KAAK,IAAI,CAAC,MAAM,KAAK,KAAK,OAAO,EAAE;AAC/C,QAAI,aAAa;AACf,cAAQ,IAAI,eAAU,WAAW,EAAE;AAAA,IACrC;AAAA,EACF;AACF;AAOO,SAAS,sBAAsB,OAI7B;AACP,QAAM,EAAE,UAAU,cAAc,WAAW,IAAI;AAC/C,QAAM,kBAAkB,WAAW;AACnC,QAAM,qBAAqB,eAAe;AAE1C,MAAI,WAAW,GAAG;AAChB,YAAQ;AAAA,MACN,mCAA4B,QAAQ,eAAU,YAAY,iBAAY,UAAU,qBACnE,eAAe,iBAAiB,kBAAkB;AAAA,IACjE;AAAA,EACF;AACF;AAOO,SAAS,cAAc,OAKrB;AACP,QAAM,EAAE,OAAO,UAAU,UAAU,WAAW,IAAI,IAAI;AACtD,QAAM,eAAe,QAAQ,IAAI,KAAK,MAAO,WAAW,QAAS,GAAG,IAAI;AAExE,UAAQ;AAAA,IACN,0BAAmB,QAAQ,IAAI,KAAK,cAAc,YAAY,0BAC5C,QAAQ,cAAc,QAAQ;AAAA,EAClD;AACF;AAQO,SAAS,oBAAoB,UAA2B,YAAoB,GAAS;AAC1F,MAAI,SAAS,WAAW,GAAG;AACzB,YAAQ,IAAI,kCAAkC;AAC9C;AAAA,EACF;AAEA,UAAQ,IAAI,KAAK,SAAS,MAAM,4BAA4B;AAC5D,QAAM,SAAS,SAAS,MAAM,GAAG,SAAS;AAE1C,WAAS,IAAI,GAAG,IAAI,OAAO,QAAQ,KAAK;AACtC,UAAM,UAAU,OAAO,CAAC;AACxB,QAAI,CAAC,QAAS;AACd,UAAM,QAAQ,QAAQ,UAAU,QAAQ,CAAC;AACzC,UAAM,UAAU,SAAS,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,EAAE,KAAK,GAAG,GAAG;AACzE,UAAM,cAAc,QAAQ,SAAS,CAAC,KAAK;AAE3C,YAAQ,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,KAAK,WAAW,EAAE;AACrD,YAAQ,IAAI,WAAW,OAAO,GAAG;AAAA,EACnC;AAEA,MAAI,SAAS,SAAS,WAAW;AAC/B,YAAQ,IAAI,aAAa,SAAS,SAAS,SAAS,OAAO;AAAA,EAC7D;AACF;AAKA,SAAS,SAAS,MAAc,WAA2B;AACzD,MAAI,CAAC,KAAM,QAAO;AAClB,SAAO,KAAK,SAAS,YAAY,GAAG,KAAK,MAAM,GAAG,SAAS,CAAC,WAAM;AACpE;AAkBO,SAAS,oBAAoB,QAAoC;AACtE,MAAI,OAAO,WAAW,GAAG;AACvB,YAAQ,IAAI,6DAAsD;AAClE;AAAA,EACF;AAEA,QAAM,aAAiD;AAAA,IACrD,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAEA,QAAM,cAAc,OAAO,IAAI,WAAS,GAAG,WAAW,KAAK,CAAC,IAAI,KAAK,EAAE,EAAE,KAAK,UAAK;AACnF,UAAQ,IAAI,yCAAkC,WAAW,EAAE;AAC7D;AAiBO,SAAS,gBAAgB,OAA2B,QAAqC;AAC9F,QAAM,aAAiD;AAAA,IACrD,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,EACR;AAEA,QAAM,OAAO,WAAW,KAAK;AAC7B,QAAM,EAAE,OAAO,SAAS,IAAI;AAC5B,QAAM,aAAa,MAAM,QAAQ,IAC7B,KAAK,OAAQ,MAAM,QAAQ,MAAM,SAAS,MAAM,QAAS,GAAG,IAC5D;AAEJ,QAAM,YAAY,MAAM,OAAO,CAAC,EAAE,YAAY,IAAI,MAAM,MAAM,CAAC;AAC/D,UAAQ;AAAA,IACN,KAAK,IAAI,IAAI,SAAS,WAAW,SAAS,MAAM,cAC5C,MAAM,KAAK,WAAM,MAAM,KAAK,KAAK,UAAU;AAAA,EACjD;AAGA,MAAI,MAAM,QAAQ,GAAG;AACnB,UAAM,kBAAkB,MAAM,QAAQ,MAAM;AAC5C,UAAM,gBAAgB,MAAM,eAAe,MAAM;AACjD,UAAM,gBAAgB,MAAM,cAAc,MAAM,cAAc,MAAM;AAEpE,QAAI,kBAAkB,KAAK,gBAAgB,KAAK,gBAAgB,GAAG;AACjE,cAAQ;AAAA,QACN,wBAAmB,eAAe,aAAa,aAAa,aAAa,aAAa;AAAA,MACxF;AAAA,IACF;AAAA,EACF;AACF;AAmBO,SAAS,qBACd,SACM;AACN,QAAM,gBAAgB,MAAM,KAAK,QAAQ,OAAO,CAAC,EAC9C,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,SAAS,QAAQ,CAAC;AAE1D,QAAM,iBAAiB,MAAM,KAAK,QAAQ,OAAO,CAAC,EAC/C,OAAO,CAAC,KAAK,WAAW,MAAM,OAAO,MAAM,OAAO,CAAC;AAEtD,UAAQ;AAAA,IACN;AAAA,sCAAoC,aAAa,8BACnC,cAAc,sBAAsB,QAAQ,IAAI;AAAA,EAChE;AAGA,QAAM,cAAwB,CAAC;AAC/B,aAAW,CAAC,OAAO,MAAM,KAAK,SAAS;AACrC,gBAAY,KAAK,GAAG,KAAK,KAAK,OAAO,SAAS,MAAM,EAAE;AAAA,EACxD;AACA,UAAQ,IAAI,iBAAiB,YAAY,KAAK,IAAI,CAAC,EAAE;AACvD;;;AC7OO,SAAS,kBAAkB,MAAsB;AAEtD,QAAM,UAAU,oBAAI,IAAY;AAGhC,QAAM,gBAAgB,KAAK,MAAM,iEAAiE;AAElG,MAAI,eAAe;AACjB,eAAW,SAAS,eAAe;AACjC,YAAM,OAAO,MAAM,MAAM,KAAK,EAAE,IAAI;AAGpC,UAAI,QAAQ,KAAK,SAAS,KAAK,CAAC,KAAK,MAAM,6CAA6C,GAAG;AACzF,gBAAQ,IAAI,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAGA,MAAI,QAAQ,SAAS,GAAG;AACtB,WAAO;AAAA,EACT;AAGA,SAAO,MAAM,KAAK,OAAO,EAAE,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI;AAClD;;;AC7DA,OAAOC,SAAQ;AACf,OAAOC,WAAU;AAKjB,IAAM,oBAAoB;AAE1B,eAAe,iBAAiB,WAAqD;AACnF,MAAI;AACF,UAAM,OAAO,MAAMC,IAAG,SAASC,MAAK,KAAK,WAAW,iBAAiB,GAAG,MAAM;AAC9E,UAAM,SAAS,KAAK,MAAM,IAAI;AAC9B,QAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,aAAO;AAAA,IACT;AACA,WAAO,CAAC;AAAA,EACV,SAAS,OAAO;AACd,QAAK,MAAgC,SAAS,UAAU;AACtD,aAAO,CAAC;AAAA,IACV;AACA,UAAM;AAAA,EACR;AACF;AAEA,eAAsB,uBACpB,WACA,OACA,MACA,QAAQ,IAC0B;AAClC,QAAM,YAAY,MAAM,iBAAiB,SAAS;AAClD,MAAI,CAAC,UAAU,UAAU,CAAC,MAAM,KAAK,GAAG;AACtC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,UAAU;AAAA,IAAI,CAAC,YAC/B,CAAC,QAAQ,SAAS,GAAI,QAAQ,gBAAgB,CAAC,CAAE,EAAE,KAAK,IAAI;AAAA,EAC9D;AACA,QAAM,SAAS,CAAC,OAAO,GAAG,SAAS;AAEnC,QAAM,aAAa,MAAM,eAAe;AAAA,IACtC;AAAA,IACA,aAAa;AAAA,IACb,WAAW;AAAA,IACX,OAAO;AAAA,EACT,CAAC;AAED,MAAI,WAAW,WAAW,OAAO,QAAQ;AACvC,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,CAAC,aAAa,GAAG,UAAU,IAAI;AACrC,MAAI,CAAC,aAAa;AAChB,WAAO,CAAC;AAAA,EACV;AACA,QAAM,SAAS,UAAU,IAAI,CAAC,SAAS,QAAQ;AAC7C,UAAM,SAAS,WAAW,GAAG,KAAK,CAAC;AACnC,WAAO;AAAA,MACL;AAAA,MACA,OAAO,iBAAiB,aAAa,MAAM;AAAA,IAC7C;AAAA,EACF,CAAC;AAED,SAAO,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AACvC,SAAO,OACJ,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AACjC;AAEA,SAAS,iBAAiB,GAAa,GAAqB;AAC1D,QAAM,SAAS,KAAK,IAAI,EAAE,QAAQ,EAAE,MAAM;AAC1C,MAAI,WAAW,GAAG;AAChB,WAAO;AAAA,EACT;AACA,MAAIC,OAAM;AACV,MAAI,OAAO;AACX,MAAI,OAAO;AACX,WAAS,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AAClC,UAAM,KAAK,EAAE,CAAC,KAAK;AACnB,UAAM,KAAK,EAAE,CAAC,KAAK;AACnB,IAAAA,QAAO,KAAK;AACZ,YAAQ,KAAK;AACb,YAAQ,KAAK;AAAA,EACf;AACA,QAAM,QAAQ,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,IAAI;AAC9C,SAAO,UAAU,IAAI,IAAIA,OAAM;AACjC;;;ACnBA,eAAsB,eACpB,WACA,MACA,MACA,SAC2B;AAC3B,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,cAAc;AAAA,IACd,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,oBAAoB;AAAA,IACpB,sBAAsB;AAAA,EACxB,IAAI,WAAW,CAAC;AAGhB,QAAM,aAAa,KAAK,KAAK;AAC7B,MAAI,CAAC,YAAY;AACf,WAAO,CAAC;AAAA,EACV;AAGA,QAAM,gBAA8C;AAAA,IAClD,aAAa;AAAA,IACb,OAAO,gBAAgB;AAAA;AAAA,IACvB,eAAe,gBAAgB;AAAA,IAC/B,WAAW;AAAA,IACX,OAAO;AAAA,EACT;AAGA,MAAI,aAAa;AACf,kBAAc,gBAAgB;AAC9B,kBAAc,eAAe;AAC7B,kBAAc,oBAAoB;AAAA,EACpC;AAEA,MAAI;AAEF,UAAM,eAAe,yBAAyB,UAAU,IACpD,MAAM,2BAA2B,WAAW,YAAY,KAAK,EAAE,MAAM,MAAM,CAAC,CAAC,IAC7E,CAAC;AAEL,UAAM,UAAU,MAAM,sBAAsB,WAAW,YAAY,aAAa;AAChF,UAAM,kBAAkB,mBAAmB,cAAc,OAAO;AAGhE,UAAM,WAAW,+BAA+B,eAAe;AAG/D,UAAM,gBAAgB,SAAS,OAAO,CAAC,YAAY,sBAAsB,QAAQ,OAAO,CAAC;AAEzF,UAAM,EAAE,MAAM,eAAe,IAAI,MAAM,0BAA0B,eAAe;AAAA,MAC9E,aAAa;AAAA,IACf,CAAC;AAGD,UAAM,eAAe,2BAA2B,cAAc;AAE9D,UAAM,iBAAiB,MAAM,uBAAuB,WAAW,YAAY,MAAM,QAAQ,CAAC,EAAE,MAAM,MAAM,CAAC,CAAC;AAC1G,UAAM,eAAe,oBAAI,IAAoB;AAC7C,eAAW,WAAW,gBAAgB;AACpC,mBAAa,IAAI,QAAQ,gBAAgB,KAAK,IAAI,aAAa,IAAI,QAAQ,cAAc,KAAK,GAAG,QAAQ,cAAc,CAAC,CAAC;AAAA,IAC3H;AAEA,UAAM,SAAS,aACZ,IAAI,CAAC,YAAY;AAChB,YAAM,QAAQ,aAAa,IAAI,QAAQ,cAAc,KAAK;AAC1D,aAAO;AAAA,QACL;AAAA,QACA,OAAO,QAAQ,YAAY,QAAQ;AAAA,MACrC;AAAA,IACF,CAAC,EACA,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK,EAChC,MAAM,GAAG,KAAK,EACd,IAAI,CAAC,EAAE,QAAQ,MAAM,OAAO;AAE/B,WAAO;AAAA,EACT,SAAS,OAAO;AACd,YAAQ;AAAA,MACN,0BAA0B,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IAClF;AACA,WAAO,CAAC;AAAA,EACV;AACF;AAQA,SAAS,+BAA+B,SAAkD;AACxF,QAAM,YAA8B,CAAC;AAErC,aAAW,SAAS,SAAS;AAC3B,UAAM,OAAuB;AAAA,MAC3B,gBAAgB,MAAM,cAAc,MAAM;AAAA,MAC1C,WAAW,MAAM,cAAc,aAAa,MAAM,cAAc,cAAa,oBAAI,KAAK,GAAE,YAAY;AAAA,MACpG,WAAW,OAAO,MAAM,mBAAmB,WAAW,MAAM,iBAAiB;AAAA,MAC7E,SAAS;AAAA,MACT,UAAU,MAAM,QAAQ,MAAM,QAAQ,IAAI,MAAM,WAAW,CAAC;AAAA,IAC9D;AAEA,UAAM,WAAW,MAAM,kBAAkB,SAAS,MAAM,mBAAmB,CAAC,EAAE;AAC9E,eAAW,WAAW,UAAU;AAC9B,UAAI,CAAC,QAAQ,KAAK,GAAG;AACnB;AAAA,MACF;AACA,gBAAU,KAAK,EAAE,GAAG,MAAM,QAAQ,CAAC;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,mBAAmB,SAAgC,WAAyD;AACnH,QAAM,OAAO,oBAAI,IAAY;AAC7B,QAAM,SAAgC,CAAC;AAEvC,aAAW,QAAQ,CAAC,SAAS,SAAS,GAAG;AACvC,eAAW,SAAS,MAAM;AACxB,YAAM,UAAU,MAAM,cAAc,MAAM;AAC1C,YAAM,aAAa,MAAM,mBAAmB,CAAC,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAClF,YAAM,MAAM,GAAG,OAAO,IAAI,UAAU;AACpC,UAAI,KAAK,IAAI,GAAG,GAAG;AACjB;AAAA,MACF;AACA,WAAK,IAAI,GAAG;AACZ,aAAO,KAAK,KAAK;AAAA,IACnB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,yBAAyB,MAAuB;AACvD,MAAI,CAAC,MAAM;AACT,WAAO;AAAA,EACT;AAEA,QAAM,qBAAqB;AAAA,IACzB;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,aAAW,WAAW,oBAAoB;AACxC,QAAI,QAAQ,KAAK,IAAI,GAAG;AACtB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,QAAM,cAAc;AACpB,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,cAAc;AACpB,MAAI,YAAY,KAAK,IAAI,GAAG;AAC1B,WAAO;AAAA,EACT;AAEA,QAAM,oBAAoB,KAAK,MAAM,qCAAqC;AAC1E,OAAK,mBAAmB,UAAU,MAAM,GAAG;AACzC,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB,KAAK,MAAM,yCAAyC,GAAG,UAAU;AACxF,MAAI,kBAAkB,KAAK,KAAK,SAAS,IAAI;AAC3C,WAAO;AAAA,EACT;AAEA,SAAO;AACT;;;AC7OA,SAAS,aAAa;AAwBtB,IAAM,yBAAyB;AAAA,EAC7B,MAAM;AAAA,EACN,YAAY;AAAA,IACV,aAAa;AAAA,MACX,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,WAAW;AAAA,MACT,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,EACF;AAAA,EACA,UAAU,CAAC,eAAe,WAAW;AAAA,EACrC,sBAAsB;AACxB;AA6CA,eAAsB,sBACpB,QACA,eACA,SACkB;AAClB,QAAM,cAAc,IAAI,MAAM;AAAA,IAC5B,MAAM;AAAA,IACN,cAAc;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAuBd,YAAY;AAAA,MACV,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF,CAAC;AAED,QAAM,SAAS,YAAY,aAAa;AAAA;AAAA;AAAA;AAAA,EAIxC,QAAQ,QAAQ,MAAM,GAAG,GAAG,CAAC;AAAA;AAAA;AAAA;AAK7B,QAAM,SAAS,MAAM,OAAO,IAAI,aAAa,MAAM;AAGnD,MAAI,OAAO,eAAe,OAAO,OAAO,gBAAgB,UAAU;AAChE,UAAM,UAAU,OAAO;AACvB,WAAO,QAAQ;AAAA,EACjB;AAGA,UAAQ,KAAK,0EAA0E;AACvF,SAAO;AACT;AAkCA,eAAsB,wBACpB,QACA,SACA,UACA,SAC2B;AAC3B,QAAM,EAAE,yBAAyB,KAAK,WAAW,KAAK,IAAI,WAAW,CAAC;AAGtE,QAAM,cAAc,SAAS,OAAO,CAAC,YAAY,QAAQ,aAAa,sBAAsB;AAC5F,QAAM,aAAa,SAAS,OAAO,CAAC,YAAY,QAAQ,YAAY,sBAAsB;AAG1F,MAAI,YAAY,WAAW,GAAG;AAC5B,WAAO,CAAC;AAAA,EACV;AAGA,MAAI,UAAU;AAEZ,UAAM,kBAAkB,YAAY;AAAA,MAAI,CAAC,YACvC,sBAAsB,QAAQ,SAAS,OAAO,EAAE,KAAK,CAAC,gBAAgB;AAAA,QACpE;AAAA,QACA;AAAA,MACF,EAAE;AAAA,IACJ;AAEA,UAAM,gBAAgB,MAAM,QAAQ,IAAI,eAAe;AACvD,WAAO,cAAc,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EACvE,OAAO;AAEL,UAAM,WAA6B,CAAC;AAEpC,eAAW,WAAW,aAAa;AACjC,YAAM,aAAa,MAAM,sBAAsB,QAAQ,SAAS,OAAO;AACvE,UAAI,YAAY;AACd,iBAAS,KAAK,OAAO;AAAA,MACvB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AACF;;;ACjMO,SAAS,oBACd,OACA,SAIqB;AACrB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC3C;AAAA,IACA,cAAc,SAAS;AAAA,EACzB;AACF;AA4BO,SAAS,mBACd,QACA,cACA,SAKoB;AACpB,SAAO;AAAA,IACL,OAAO;AAAA,IACP,UAAU,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC3C;AAAA,IACA,YAAY,SAAS;AAAA,IACrB;AAAA,IACA,eAAe,SAAS;AAAA,EAC1B;AACF;AAqCO,SAAS,iBACd,UACA,SAKkB;AAClB,QAAM,UAA4B;AAAA,IAChC,OAAO;AAAA,IACP,UAAU,SAAS,YAAY,QAAQ,IAAI;AAAA,IAC3C;AAAA,IACA,MAAM,SAAS;AAAA,EACjB;AAGA,MAAI,SAAS,kBAAkB,SAAS,MAAM;AAC5C,UAAM,cAAc,kBAAkB,QAAQ,IAAI;AAClD,QAAI,aAAa;AACf,cAAQ,UAAU,YAAY,MAAM,GAAG,EAAE,IAAI,OAAK,EAAE,KAAK,CAAC,EAAE,OAAO,OAAO;AAAA,IAC5E;AAAA,EACF;AAEA,SAAO;AACT;AA4BO,SAAS,eAAe,SAAiC;AAC9D,UAAQ,QAAQ,OAAO;AAAA,IACrB,KAAK,WAAW;AACd,UAAI,QAAQ,iBAAiB,QAAQ,KAAK;AAC1C,UAAI,QAAQ,gBAAgB,QAAQ,aAAa,SAAS,GAAG;AAC3D,iBAAS;AAAA,SAAY,QAAQ,aAAa,KAAK,IAAI,CAAC;AAAA,MACtD;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,UAAU;AACb,UAAI,QAAQ,WAAW,QAAQ,MAAM;AACrC,UAAI,QAAQ,YAAY;AACtB,iBAAS,WAAW,QAAQ,UAAU;AAAA,MACxC;AACA,eAAS;AAAA,iBAAoB,QAAQ,aAAa,KAAK,IAAI,CAAC;AAC5D,UAAI,QAAQ,eAAe;AACzB,iBAAS;AAAA,kBAAqB,QAAQ,aAAa;AAAA,MACrD;AACA,aAAO;AAAA,IACT;AAAA,IAEA,KAAK,QAAQ;AACX,UAAI,QAAQ,SAAS,QAAQ,QAAQ;AACrC,UAAI,QAAQ,WAAW,QAAQ,QAAQ,SAAS,GAAG;AACjD,iBAAS;AAAA,WAAc,QAAQ,QAAQ,KAAK,IAAI,CAAC;AAAA,MACnD;AACA,UAAI,QAAQ,MAAM;AAEhB,cAAM,gBAAgB,QAAQ,KAAK,SAAS,MACxC,QAAQ,KAAK,MAAM,GAAG,GAAG,IAAI,QAC7B,QAAQ;AACZ,iBAAS;AAAA;AAAA,EAAe,aAAa;AAAA,MACvC;AACA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AASO,SAAS,eAAe,OAAiB,WAAmB,IAAY;AAC7E,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,UAAU,UAAU;AAC5B,WAAO,MAAM,KAAK,IAAI;AAAA,EACxB;AAEA,QAAM,QAAQ,MAAM,MAAM,GAAG,QAAQ;AACrC,QAAM,YAAY,MAAM,SAAS;AACjC,SAAO,GAAG,MAAM,KAAK,IAAI,CAAC,YAAY,SAAS;AACjD;;;ACtIA,eAAsB,qBACpB,WACA,YACA,MACA,QACA,SACgC;AAChC,QAAM;AAAA,IACJ,QAAQ;AAAA,IACR,gBAAgB;AAAA,IAChB,yBAAyB;AAAA,IACzB,iBAAiB;AAAA,IACjB,GAAG;AAAA,EACL,IAAI,WAAW,CAAC;AAGhB,mBAAiB,YAAY,SAAS,IAAI,EAAE;AAG5C,QAAM,cAAc,MAAM,eAAe,WAAW,YAAY,MAAM;AAAA,IACpE;AAAA,IACA;AAAA,IACA,GAAG;AAAA,EACL,CAAC;AAGD,QAAM,QAA4B;AAAA,IAChC,OAAO,YAAY;AAAA,IACnB,cAAc;AAAA,IACd,kBAAkB;AAAA,IAClB,YAAY;AAAA,IACZ,YAAY;AAAA,IACZ,OAAO;AAAA,EACT;AAGA,QAAM,gBAAgB,YAAY,OAAO,CAAC,YAAY,sBAAsB,QAAQ,OAAO,CAAC;AAC5F,QAAM,eAAe,cAAc;AAGnC,QAAM,EAAE,MAAM,uBAAuB,IAAI,MAAM,0BAA0B,eAAe;AAAA,IACtF,aAAa;AAAA,EACf,CAAC;AACD,QAAM,mBAAmB,uBAAuB;AAGhD,QAAM,cAAc,uBAAuB,OAAO,CAAC,YAAY,QAAQ,aAAa,sBAAsB;AAC1G,QAAM,aAAa,uBAAuB,OAAO,CAAC,YAAY,QAAQ,YAAY,sBAAsB;AACxG,QAAM,aAAa,YAAY;AAG/B,MAAI;AAEJ,MAAI,kBAAkB,CAAC,QAAQ;AAE7B,qBAAiB;AACjB,UAAM,gBAAgB,YAAY;AAAA,EACpC,OAAO;AAEL,qBAAiB,MAAM,wBAAwB,QAAQ,YAAY,aAAa;AAAA,MAC9E;AAAA,MACA,UAAU;AAAA,IACZ,CAAC;AACD,UAAM,gBAAgB,eAAe;AAGrC,kBAAc;AAAA,MACZ,OAAO,YAAY;AAAA,MACnB,UAAU,eAAe;AAAA,MACzB,UAAU,YAAY,SAAS,eAAe;AAAA,MAC9C,UAAU;AAAA,IACZ,CAAC;AAGD,QAAI,eAAe,SAAS,GAAG;AAC7B,0BAAoB,cAAc;AAAA,IACpC;AAAA,EACF;AAGA,QAAM,eAAe,2BAA2B,cAAc;AAC9D,QAAM,aAAa,aAAa;AAGhC,QAAM,gBAAgB,aAAa,MAAM,GAAG,KAAK;AACjD,QAAM,QAAQ,cAAc;AAG5B,sBAAoB;AAAA,IAClB,OAAO,MAAM;AAAA,IACb,cAAc,MAAM;AAAA,IACpB,kBAAkB,MAAM;AAAA,IACxB,YAAY,MAAM;AAAA,IAClB,YAAY,MAAM;AAAA,IAClB,UAAU;AAAA,EACZ,CAAC;AAED,SAAO;AAAA,IACL,UAAU;AAAA,IACV;AAAA,EACF;AACF;AA8BA,eAAsB,yBACpB,WACA,UACA,aACA,MACA,QACA,SACgC;AAChC,QAAM;AAAA,IACJ,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,GAAG;AAAA,EACL,IAAI,WAAW,CAAC;AAGhB,QAAM,cAAc;AAAA,IAClB,GAAG;AAAA,IACH,eAAe,KAAK,MAAM,gBAAgB,CAAC;AAAA,IAC3C;AAAA,EACF;AAGA,SAAO,qBAAqB,WAAW,aAAa,MAAM,QAAQ,WAAW;AAC/E;AAoCA,eAAsB,iBACpB,WACA,UACA,QACA,SACyD;AACzD,QAAM,SAAS,SAAS,IAAI,SAAO,IAAI,KAAK;AAC5C,sBAAoB,MAAM;AAE1B,QAAM,UAAU,oBAAI,IAA+C;AAGnE,aAAW,WAAW,UAAU;AAC9B,QAAI;AAEJ,YAAQ,QAAQ,OAAO;AAAA,MACrB,KAAK;AACH,iBAAS,MAAM,mBAAmB,WAAW,SAAS,QAAQ,OAAO;AACrE;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,kBAAkB,WAAW,SAAS,QAAQ,OAAO;AACpE;AAAA,MACF,KAAK;AACH,iBAAS,MAAM,gBAAgB,WAAW,SAAS,QAAQ,OAAO;AAClE;AAAA,IACJ;AAEA,YAAQ,IAAI,QAAQ,OAAO,MAAM;AACjC,oBAAgB,QAAQ,OAAO,MAAM;AAAA,EACvC;AAEA,SAAO;AACT;AA6BA,eAAsB,mBACpB,WACA,SACA,QACA,SACgC;AAChC,QAAM,cAAc,eAAe,OAAO;AAG1C,QAAM,iBAAiB;AAAA,IACrB,GAAG;AAAA,IACH,gBAAgB,SAAS,iBAAiB,kCAAkC;AAAA,EAC9E;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AAgCA,eAAsB,kBACpB,WACA,SACA,QACA,SACgC;AAChC,QAAM,cAAc,eAAe,OAAO;AAG1C,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;AA+BA,eAAsB,gBACpB,WACA,SACA,QACA,SACgC;AAChC,QAAM,cAAc,eAAe,OAAO;AAG1C,SAAO;AAAA,IACL;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,EACF;AACF;;;AC3QO,SAAS,YAAY,IAAoB;AAC9C,QAAM,UAAU,iBAAiB;AACjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,SAAQ,QAAgB,YAAY,EAAE;AACxC;AAEO,SAAS,kBAAkB,IAAoB;AACpD,QAAM,UAAU,iBAAiB;AACjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,SAAQ,QAAgB,kBAAkB,EAAE;AAC9C;AAEO,SAAS,mBAAmB,IAAY,MAAsB;AACnE,QAAM,UAAU,iBAAiB;AACjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,SAAQ,QAAgB,mBAAmB,IAAI,IAAI;AACrD;AAEO,SAAS,eAAe,QAAgB,MAAc,MAAsB;AACjF,QAAM,UAAU,iBAAiB;AACjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,SAAQ,QAAgB,eAAe,QAAQ,MAAM,IAAI;AAC3D;AAEO,SAAS,IAAI,QAA0B;AAC5C,QAAM,UAAU,iBAAiB;AACjC,MAAI,CAAC,QAAS,OAAM,IAAI,MAAM,8BAA8B;AAC5D,SAAQ,QAAgB,IAAI,MAAM;AACpC;","names":["tool","LogLevel","logger","fs","path","fs","path","dot"]}
1
+ {"version":3,"sources":["../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","../src/index.ts"],"sourcesContent":["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 console.log('[DEBUG executeToolViaFramework] invocation:', JSON.stringify(invocation, null, 2));\n console.log('[DEBUG executeToolViaFramework] invocation type:', typeof invocation);\n console.log('[DEBUG executeToolViaFramework] invocation keys:', invocation ? Object.keys(invocation) : 'null/undefined');\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","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"],"mappings":"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","names":["tool","LogLevel","logger","fs","path","fs","path","dot"]}