@khalilgharbaoui/opencode-claude-code-plugin 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +0 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -2739,7 +2739,6 @@ function toConfigModel(model) {
|
|
|
2739
2739
|
attachment: model.capabilities.attachment,
|
|
2740
2740
|
tool_call: model.capabilities.toolcall,
|
|
2741
2741
|
modalities: { input: inputMods, output: outputMods },
|
|
2742
|
-
interleaved: model.capabilities.interleaved,
|
|
2743
2742
|
cost: {
|
|
2744
2743
|
input: model.cost.input,
|
|
2745
2744
|
output: model.cost.output,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/claude-code-language-model.ts","../src/logger.ts","../src/tool-mapping.ts","../src/message-builder.ts","../src/mcp-bridge.ts","../src/runtime-status.ts","../src/session-manager.ts","../src/proxy-mcp.ts","../src/proxy-broker.ts","../src/models.ts","../src/accounts.ts","../src/cleanup-stale.ts","../src/index.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\"\nimport { generateId } from \"@ai-sdk/provider-utils\"\nimport type {\n ClaudeCodeConfig,\n ControlRequestBehavior,\n ClaudeStreamMessage,\n ReasoningEffort,\n} from \"./types.js\"\nimport { mapTool } from \"./tool-mapping.js\"\nimport { getClaudeUserMessage } from \"./message-builder.js\"\nimport { bridgeOpencodeMcp, type RuntimeMcpStatus } from \"./mcp-bridge.js\"\nimport { getRuntimeMcpStatus } from \"./runtime-status.js\"\nimport {\n getActiveProcess,\n spawnClaudeProcess,\n buildCliArgs,\n setClaudeSessionId,\n getClaudeSessionId,\n deleteClaudeSessionId,\n deleteActiveProcess,\n sessionKey,\n} from \"./session-manager.js\"\nimport { log } from \"./logger.js\"\nimport {\n createProxyMcpServer,\n disallowedToolFlags,\n DEFAULT_PROXY_TOOLS,\n PROXY_TOOL_PREFIX,\n type ProxyMcpServer,\n type ProxyToolCall,\n type ProxyToolDef,\n type ProxyToolResult,\n} from \"./proxy-mcp.js\"\nimport {\n getPendingProxyCall,\n onPendingProxyCall,\n queuePendingProxyCall,\n resolvePendingProxyCall,\n rejectPendingProxyCall,\n type PendingProxyCall,\n} from \"./proxy-broker.js\"\nimport { readFileSync, writeFileSync } from \"node:fs\"\nimport { unlink } from \"node:fs/promises\"\nimport { homedir, tmpdir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\nimport { dirname, join } from \"node:path\"\n\nfunction readPromptFileIfPresent(path: string): string | undefined {\n try {\n const content = readFileSync(path, \"utf8\").trim()\n return content || undefined\n } catch {\n return undefined\n }\n}\n\nfunction nearestWorkspaceAgentsPrompt(cwd: string): string | undefined {\n let dir = cwd\n while (true) {\n const content = readPromptFileIfPresent(join(dir, \"AGENTS.md\"))\n if (content) return content\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nfunction buildAppendedSystemPrompt(cwd: string): string | undefined {\n const parts: string[] = []\n const configRoot =\n process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\")\n const globalAgents = readPromptFileIfPresent(join(configRoot, \"opencode\", \"AGENTS.md\"))\n const workspaceAgents = nearestWorkspaceAgentsPrompt(cwd)\n\n if (globalAgents) parts.push(globalAgents)\n if (workspaceAgents && workspaceAgents !== globalAgents) parts.push(workspaceAgents)\n\n const content = parts.join(\"\\n\\n\")\n if (!content) return undefined\n\n const path = join(tmpdir(), `opencode-cc-sys-${randomUUID()}.md`)\n try {\n writeFileSync(path, content, \"utf8\")\n return path\n } catch (err) {\n log.warn(\"failed to write system prompt file\", { error: String(err) })\n return undefined\n }\n}\n\nexport class ClaudeCodeLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\"\n readonly modelId: string\n private readonly config: ClaudeCodeConfig\n\n constructor(modelId: string, config: ClaudeCodeConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n get provider(): string {\n return this.config.provider\n }\n\n private toUsage(rawUsage?: ClaudeStreamMessage[\"usage\"]): LanguageModelV3Usage {\n // Prefer the last iteration's counters over cumulative totals.\n // CLI usage is the sum across all internal tool-use iterations;\n // using it directly inflates context size and triggers premature compaction.\n const iter = rawUsage?.iterations\n const effective = iter?.length ? iter[iter.length - 1] : rawUsage\n // Claude CLI reports input_tokens as non-cached input only.\n // OpenCode expects total = noCache + cacheRead + cacheWrite.\n const noCache = effective?.input_tokens ?? 0\n const cacheRead = effective?.cache_read_input_tokens ?? 0\n const cacheWrite = effective?.cache_creation_input_tokens ?? 0\n return {\n inputTokens: {\n total: noCache + cacheRead + cacheWrite,\n noCache,\n cacheRead: cacheRead || undefined,\n cacheWrite: cacheWrite || undefined,\n },\n outputTokens: {\n total: effective?.output_tokens,\n text: effective?.output_tokens,\n reasoning: undefined,\n },\n raw: rawUsage as any,\n }\n }\n\n private toFinishReason(\n reason: \"stop\" | \"tool-calls\" = \"stop\",\n ): LanguageModelV3FinishReason {\n return {\n unified: reason,\n raw: reason,\n }\n }\n\n private requestScope(options: { tools?: unknown }): \"tools\" | \"no-tools\" {\n const tools = options?.tools\n if (Array.isArray(tools)) return \"tools\"\n if (tools && typeof tools === \"object\") {\n return Object.keys(tools as Record<string, unknown>).length > 0\n ? \"tools\"\n : \"no-tools\"\n }\n return \"no-tools\"\n }\n\n /**\n * Build the combined `--mcp-config` list and return both the list and the\n * hash of the bridged opencode MCP block (or null when bridging is off /\n * yields nothing). The hash is used to detect mid-session config changes\n * and respawn the underlying claude process.\n *\n * `runtimeStatus` is a snapshot of opencode's `client.mcp.status()`. When\n * provided it overlays opencode's UI-toggled state on top of disk config\n * so `/mcps` toggles propagate without a config file write.\n */\n private effectiveMcpConfig(\n cwd: string,\n proxyConfigPath?: string,\n runtimeStatus?: RuntimeMcpStatus,\n ): { paths: string[]; bridgedHash: string | null } {\n const paths = Array.isArray(this.config.mcpConfig)\n ? this.config.mcpConfig.slice()\n : this.config.mcpConfig\n ? [this.config.mcpConfig]\n : []\n let bridgedHash: string | null = null\n if (this.config.bridgeOpencodeMcp !== false) {\n const bridged = bridgeOpencodeMcp(cwd, runtimeStatus)\n if (bridged) {\n paths.push(bridged.path)\n bridgedHash = bridged.hash\n }\n }\n if (proxyConfigPath) paths.push(proxyConfigPath)\n return { paths, bridgedHash }\n }\n\n /** Resolve ProxyToolDef[] for the configured proxyTools names. */\n private resolvedProxyTools(): ProxyToolDef[] | null {\n const names = this.config.proxyTools\n if (!names || names.length === 0) return null\n const defsByName = new Map(\n DEFAULT_PROXY_TOOLS.map((t) => [t.name.toLowerCase(), t]),\n )\n const picked: ProxyToolDef[] = []\n for (const n of names) {\n const def = defsByName.get(String(n).toLowerCase())\n if (def) picked.push(def)\n }\n return picked.length > 0 ? picked : null\n }\n\n /**\n * Create a proxy MCP server for a single active Claude process/session.\n * The process lifecycle owns the server lifecycle via session-manager.\n */\n private async ensureProxyServer(\n tools: ProxyToolDef[],\n sessionKeyForCalls: string,\n ): Promise<ProxyMcpServer> {\n const srv = await createProxyMcpServer(tools)\n srv.calls.on(\"call\", (call: ProxyToolCall) => {\n queuePendingProxyCall(sessionKeyForCalls, call)\n })\n return srv\n }\n\n private extractPendingProxyResult(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n toolCallId: string,\n ): ProxyToolResult | null {\n for (let i = prompt.length - 1; i >= 0; i--) {\n const msg = prompt[i]\n if (msg.role !== \"tool\" || !Array.isArray(msg.content)) continue\n\n for (const part of msg.content) {\n if (part.type !== \"tool-result\" || part.toolCallId !== toolCallId) continue\n\n const output = part.output as any\n if (!output || typeof output !== \"object\") {\n return {\n kind: \"text\",\n text: String(output ?? \"\"),\n }\n }\n\n if (output.type === \"text\") {\n return {\n kind: \"text\",\n text: String(output.value ?? \"\"),\n }\n }\n\n if (output.type === \"json\") {\n return {\n kind: \"text\",\n text: JSON.stringify(output.value),\n }\n }\n\n if (output.type === \"content\" && Array.isArray(output.value)) {\n const text = output.value\n .filter((v: any) => v?.type === \"text\" && typeof v.text === \"string\")\n .map((v: any) => v.text)\n .join(\"\\n\")\n return {\n kind: \"text\",\n text,\n }\n }\n\n return {\n kind: \"text\",\n text: JSON.stringify(output),\n }\n }\n }\n\n return null\n }\n\n /**\n * Opencode sets `x-session-affinity: <sessionID>` on LLM calls for\n * third-party providers (packages/opencode/src/session/llm.ts). Use it so\n * two chats in the same cwd+model get separate CLI processes instead of\n * stomping on each other. Falls back to \"default\" when absent (older\n * opencode, direct AI-SDK use, title synthesis paths, etc).\n */\n private sessionAffinity(\n options: LanguageModelV3CallOptions,\n ): string {\n const headers = (options as any)?.headers as\n | Record<string, string | undefined>\n | undefined\n if (!headers) return \"default\"\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === \"x-session-affinity\") {\n const v = headers[key]\n if (typeof v === \"string\" && v.length > 0) return v\n }\n }\n return \"default\"\n }\n\n private controlRequestBehaviorForTool(toolName: string): ControlRequestBehavior {\n const configured = this.config.controlRequestToolBehaviors\n if (configured && toolName) {\n const direct = configured[toolName] ?? configured[toolName.toLowerCase()]\n if (direct === \"allow\" || direct === \"deny\") return direct\n\n const lower = toolName.toLowerCase()\n for (const [key, behavior] of Object.entries(configured)) {\n if (key.toLowerCase() === lower && (behavior === \"allow\" || behavior === \"deny\")) {\n return behavior\n }\n }\n }\n\n return this.config.controlRequestBehavior ?? \"allow\"\n }\n\n private writeControlResponse(\n proc: import(\"child_process\").ChildProcess,\n requestId: string,\n response?: Record<string, unknown>,\n ): void {\n const payload = {\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n }\n\n try {\n proc.stdin?.write(JSON.stringify(payload) + \"\\n\")\n } catch (error) {\n log.warn(\"failed to write control response\", {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Handle Claude stream-json control requests (`can_use_tool`, etc.) and\n * respond via stdin with a matching `control_response`.\n */\n private handleControlRequest(\n msg: ClaudeStreamMessage,\n proc: import(\"child_process\").ChildProcess,\n ): boolean {\n if (msg.type !== \"control_request\") return false\n const requestId = msg.request_id\n const request = msg.request\n if (!requestId || !request?.subtype) return false\n\n if (request.subtype === \"can_use_tool\") {\n const toolName = request.tool_name ?? \"unknown\"\n const behavior = this.controlRequestBehaviorForTool(toolName)\n\n if (behavior === \"allow\") {\n this.writeControlResponse(proc, requestId, {\n behavior: \"allow\",\n updatedInput: request.input ?? {},\n toolUseID: request.tool_use_id,\n })\n log.info(\"control request auto-allowed\", {\n requestId,\n toolName,\n })\n } else {\n this.writeControlResponse(proc, requestId, {\n behavior: \"deny\",\n message:\n this.config.controlRequestDenyMessage ??\n `Denied by opencode-claude-code policy for tool ${toolName}`,\n toolUseID: request.tool_use_id,\n })\n log.info(\"control request auto-denied\", {\n requestId,\n toolName,\n })\n }\n\n return true\n }\n\n // For control request subtypes we don't actively handle yet, acknowledge\n // with an empty success so the CLI stream does not stall.\n this.writeControlResponse(proc, requestId, {})\n log.debug(\"control request acknowledged\", {\n requestId,\n subtype: request.subtype,\n })\n return true\n }\n\n private getReasoningEffort(\n providerOptions?: LanguageModelV3CallOptions[\"providerOptions\"],\n ): ReasoningEffort | undefined {\n if (!providerOptions) return undefined\n const ownKey = this.config.provider\n const bag =\n (providerOptions as any)[ownKey] ??\n (providerOptions as any)[\"claude-code\"]\n const effort = bag?.reasoningEffort\n const valid: ReasoningEffort[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n ]\n return valid.includes(effort) ? effort : undefined\n }\n\n private latestUserText(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n ): string {\n for (let i = prompt.length - 1; i >= 0; i--) {\n const msg = prompt[i]\n if (msg.role !== \"user\") continue\n\n if (typeof msg.content === \"string\") {\n return String(msg.content).trim()\n }\n\n if (Array.isArray(msg.content)) {\n const text = (msg.content as any[])\n .filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n .map((part: any) => String(part.text).trim())\n .filter(Boolean)\n .join(\" \")\n if (text) return text\n }\n }\n\n return \"\"\n }\n\n private synthesizeTitle(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n ): string {\n const source = this.latestUserText(prompt)\n .replace(/\\s+/g, \" \")\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, \" \")\n .trim()\n\n if (!source) return \"New Session\"\n\n const stop = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"and\",\n \"or\",\n \"but\",\n \"to\",\n \"for\",\n \"of\",\n \"in\",\n \"on\",\n \"at\",\n \"with\",\n \"can\",\n \"could\",\n \"would\",\n \"should\",\n \"please\",\n \"hi\",\n \"hello\",\n \"hey\",\n \"there\",\n \"you\",\n \"your\",\n \"this\",\n \"that\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"do\",\n \"does\",\n \"did\",\n \"summarize\",\n \"summary\",\n \"project\",\n ])\n\n const words = source\n .split(\" \")\n .map((word) => word.trim())\n .filter(Boolean)\n .filter((word) => !stop.has(word.toLowerCase()))\n\n const picked = (words.length > 0 ? words : source.split(\" \").filter(Boolean))\n .slice(0, 6)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \")\n\n return picked || \"New Session\"\n }\n\n private async doGenerateViaStream(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doGenerate\"]>>> {\n const result = await this.doStream(options)\n const reader = result.stream.getReader()\n\n let text = \"\"\n let reasoning = \"\"\n const toolCalls: LanguageModelV3Content[] = []\n let finishReason = this.toFinishReason(\"stop\")\n let usage: LanguageModelV3Usage = this.toUsage()\n let providerMetadata: any\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n\n switch ((value as any).type) {\n case \"text-delta\":\n text += (value as any).delta ?? \"\"\n break\n case \"reasoning-delta\":\n reasoning += (value as any).delta ?? \"\"\n break\n case \"tool-call\":\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: (value as any).toolCallId,\n toolName: (value as any).toolName,\n input: (value as any).input,\n providerExecuted: (value as any).providerExecuted,\n } as any)\n break\n case \"finish\":\n finishReason = (value as any).finishReason ?? finishReason\n usage = (value as any).usage ?? usage\n providerMetadata = (value as any).providerMetadata ?? providerMetadata\n break\n }\n }\n\n const content: LanguageModelV3Content[] = []\n if (reasoning) {\n content.push({ type: \"reasoning\", text: reasoning } as any)\n }\n if (text) {\n content.push({ type: \"text\", text, providerMetadata } as any)\n }\n content.push(...toolCalls)\n\n return {\n content,\n finishReason,\n usage,\n request: result.request,\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata,\n warnings: [],\n }\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doGenerate\"]>>> {\n const warnings: SharedV3Warning[] = []\n const cwd = this.config.cwd ?? process.cwd()\n const scope = this.requestScope(options as any)\n const affinity = this.sessionAffinity(options)\n const sk = sessionKey(cwd, `${this.modelId}::${scope}::${affinity}`)\n\n // When selective proxying is enabled, doGenerate must not bypass the\n // proxy path. Reuse doStream and aggregate its events so proxied tools\n // still route through opencode permissions/execution.\n if (scope === \"tools\" && this.resolvedProxyTools()) {\n return this.doGenerateViaStream(options)\n }\n\n if (scope === \"no-tools\") {\n const text = this.synthesizeTitle(options.prompt)\n return {\n content: [{ type: \"text\", text }] as any,\n finishReason: this.toFinishReason(\"stop\"),\n usage: this.toUsage({ input_tokens: 0, output_tokens: 0 }),\n request: { body: { text: \"\" } },\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata: {\n \"claude-code\": {\n synthetic: true,\n path: \"no-tools\",\n },\n },\n warnings,\n }\n }\n\n const hasPriorConversation =\n options.prompt.filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .length > 1\n\n // New session — clear any stale state from a previous session\n if (!hasPriorConversation) {\n deleteClaudeSessionId(sk)\n deleteActiveProcess(sk)\n }\n\n const hasExistingSession = !!getClaudeSessionId(sk)\n const includeHistoryContext = !hasExistingSession && hasPriorConversation\n\n const reasoningEffort = this.getReasoningEffort(options.providerOptions)\n const userMsg = getClaudeUserMessage(\n options.prompt,\n includeHistoryContext,\n reasoningEffort,\n )\n\n // doGenerate always spawns a fresh process, never reuse session ID.\n // Pre-fetch opencode's MCP runtime status so the bridge overlays\n // UI-toggled state on top of disk config.\n const runtimeStatus = await getRuntimeMcpStatus()\n const systemPromptFile = buildAppendedSystemPrompt(cwd)\n const cliArgs = buildCliArgs({\n sessionKey: sk,\n skipPermissions: this.config.skipPermissions !== false,\n includeSessionId: false,\n model: this.modelId,\n permissionMode: this.config.permissionMode,\n mcpConfig: this.effectiveMcpConfig(cwd, undefined, runtimeStatus).paths,\n strictMcpConfig: this.config.strictMcpConfig,\n disallowedTools:\n this.config.webSearch === \"disabled\" ? [\"WebSearch\"] : undefined,\n appendSystemPromptFile: systemPromptFile,\n })\n\n log.info(\"doGenerate starting\", {\n cwd,\n model: this.modelId,\n textLength: userMsg.length,\n includeHistoryContext,\n })\n\n const { spawn } = await import(\"node:child_process\")\n const { createInterface } = await import(\"node:readline\")\n\n const proc = spawn(this.config.cliPath, cliArgs, {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, TERM: \"xterm-256color\" },\n shell: process.platform === \"win32\",\n })\n\n if (systemPromptFile) {\n proc.on(\"exit\", () => {\n void unlink(systemPromptFile).catch(() => {})\n })\n }\n\n const rl = createInterface({ input: proc.stdout! })\n\n let responseText = \"\"\n let thinkingText = \"\"\n let resultMeta: {\n sessionId?: string\n costUsd?: number\n durationMs?: number\n usage?: ClaudeStreamMessage[\"usage\"]\n } = {}\n const toolCalls: Array<{ id: string; name: string; args: unknown }> = []\n\n const result = await new Promise<\n typeof resultMeta & {\n text: string\n thinking: string\n toolCalls: typeof toolCalls\n }\n >((resolve, reject) => {\n rl.on(\"line\", (line) => {\n if (!line.trim()) return\n try {\n const msg: ClaudeStreamMessage = JSON.parse(line)\n\n if (this.handleControlRequest(msg, proc)) {\n return\n }\n\n if (msg.type === \"system\" && msg.subtype === \"init\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n }\n\n if (msg.type === \"assistant\" && msg.message?.content) {\n for (const block of msg.message.content) {\n if (block.type === \"text\" && block.text) {\n responseText += block.text\n }\n if (block.type === \"thinking\" && block.thinking) {\n thinkingText += block.thinking\n }\n if (block.type === \"tool_use\" && block.id && block.name) {\n if (\n block.name === \"AskUserQuestion\" ||\n block.name === \"ask_user_question\"\n ) {\n // Emit question as text\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n const question =\n (parsedInput?.question as string) || \"Question?\"\n responseText += `\\n\\n_Asking: ${question}_\\n\\n`\n continue\n }\n\n if (block.name === \"ExitPlanMode\") {\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n const plan = (parsedInput?.plan as string) || \"\"\n responseText += `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`\n continue\n }\n\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input ?? {},\n })\n }\n }\n }\n\n if (msg.type === \"content_block_start\" && msg.content_block) {\n if (\n msg.content_block.type === \"tool_use\" &&\n msg.content_block.id &&\n msg.content_block.name\n ) {\n toolCalls.push({\n id: msg.content_block.id,\n name: msg.content_block.name,\n args: {},\n })\n }\n }\n\n if (msg.type === \"content_block_delta\" && msg.delta) {\n if (msg.delta.type === \"text_delta\" && msg.delta.text) {\n responseText += msg.delta.text\n }\n if (msg.delta.type === \"thinking_delta\" && msg.delta.thinking) {\n thinkingText += msg.delta.thinking\n }\n if (\n msg.delta.type === \"input_json_delta\" &&\n msg.delta.partial_json &&\n msg.index !== undefined\n ) {\n const tc = toolCalls[msg.index]\n if (tc) {\n try {\n tc.args = JSON.parse(msg.delta.partial_json)\n } catch {\n // Partial JSON, accumulate\n }\n }\n }\n }\n\n if (msg.type === \"result\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n\n // Some CLI failures only surface user-readable text on the final\n // `result` message (without prior assistant text blocks). Preserve\n // that so callers don't receive an empty response.\n if (\n !responseText &&\n msg.is_error &&\n typeof msg.result === \"string\" &&\n msg.result.trim().length > 0\n ) {\n responseText = msg.result\n }\n\n resultMeta = {\n sessionId: msg.session_id,\n costUsd: msg.total_cost_usd,\n durationMs: msg.duration_ms,\n usage: msg.usage,\n }\n resolve({\n ...resultMeta,\n text: responseText,\n thinking: thinkingText,\n toolCalls,\n })\n }\n } catch {\n // Ignore non-JSON lines\n }\n })\n\n rl.on(\"close\", () => {\n resolve({\n ...resultMeta,\n text: responseText,\n thinking: thinkingText,\n toolCalls,\n })\n })\n\n proc.on(\"error\", (err) => {\n log.error(\"process error\", { error: err.message })\n reject(err)\n })\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n log.debug(\"stderr\", { data: data.toString().slice(0, 200) })\n })\n\n proc.stdin?.write(userMsg + \"\\n\")\n })\n\n const content: LanguageModelV3Content[] = []\n\n if (result.thinking) {\n content.push({\n type: \"reasoning\",\n text: result.thinking,\n } as any)\n }\n\n if (result.text) {\n content.push({\n type: \"text\",\n text: result.text,\n providerMetadata: {\n \"claude-code\": {\n sessionId: result.sessionId ?? null,\n costUsd: result.costUsd ?? null,\n durationMs: result.durationMs ?? null,\n },\n ...(typeof result.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n result.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n })\n }\n\n for (const tc of result.toolCalls) {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(tc.name, tc.args, { webSearch: this.config.webSearch })\n if (skip) continue\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n\n const usage = this.toUsage(result.usage)\n\n return {\n content,\n // Claude CLI's `result` message signals a fully-completed turn —\n // tools have already been executed internally and final assistant\n // text has been produced. Always report \"stop\" so opencode doesn't\n // loop expecting to run tools itself.\n finishReason: this.toFinishReason(\"stop\"),\n usage,\n request: { body: { text: userMsg } },\n response: {\n id: result.sessionId ?? generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata: {\n \"claude-code\": {\n sessionId: result.sessionId ?? null,\n costUsd: result.costUsd ?? null,\n durationMs: result.durationMs ?? null,\n },\n ...(typeof result.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n result.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n warnings,\n }\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doStream\"]>>> {\n const warnings: SharedV3Warning[] = []\n const cwd = this.config.cwd ?? process.cwd()\n const cliPath = this.config.cliPath\n const skipPermissions = this.config.skipPermissions !== false\n const scope = this.requestScope(options as any)\n const affinity = this.sessionAffinity(options)\n const sk = sessionKey(cwd, `${this.modelId}::${scope}::${affinity}`)\n const toUsage = this.toUsage.bind(this)\n const toFinishReason = this.toFinishReason.bind(this)\n const handleControlRequest = this.handleControlRequest.bind(this)\n\n if (scope === \"no-tools\") {\n const text = this.synthesizeTitle(options.prompt)\n const textId = generateId()\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings })\n controller.enqueue({ type: \"text-start\", id: textId } as any)\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: text,\n })\n controller.enqueue({ type: \"text-end\", id: textId })\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage({ input_tokens: 0, output_tokens: 0 }),\n providerMetadata: {\n \"claude-code\": {\n synthetic: true,\n path: \"no-tools\",\n },\n },\n })\n controller.close()\n },\n })\n\n return {\n stream,\n request: { body: { text: \"\" } },\n }\n }\n\n const hasPriorConversation =\n options.prompt.filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .length > 1\n\n // New session — clear any stale state from a previous session\n if (!hasPriorConversation) {\n deleteClaudeSessionId(sk)\n deleteActiveProcess(sk)\n }\n\n const hasExistingSession = !!getClaudeSessionId(sk)\n const hasActiveProcess = !!getActiveProcess(sk)\n const includeHistoryContext =\n !hasExistingSession && !hasActiveProcess && hasPriorConversation\n\n const reasoningEffort = this.getReasoningEffort(options.providerOptions)\n const userMsg = getClaudeUserMessage(\n options.prompt,\n includeHistoryContext,\n reasoningEffort,\n )\n const resolvedProxy = this.resolvedProxyTools()\n const self = this\n\n const pendingProxyCall = getPendingProxyCall(sk)\n const pendingProxyResult = pendingProxyCall\n ? this.extractPendingProxyResult(options.prompt, pendingProxyCall.toolCallId)\n : null\n\n // Pre-fetch opencode's MCP runtime status before constructing the\n // ReadableStream so the sync hot-reload check and async setup() see\n // the same overlay snapshot. One in-process call per turn — cheap;\n // the SDK client routes through `Server.app.fetch` (no socket).\n const runtimeStatus = await getRuntimeMcpStatus()\n\n log.info(\"doStream starting\", {\n cwd,\n model: this.modelId,\n textLength: userMsg.length,\n includeHistoryContext,\n hasActiveProcess,\n reasoningEffort,\n proxyTools: resolvedProxy?.map((t) => t.name) ?? null,\n })\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n let activeProcess = getActiveProcess(sk)\n let proc: import(\"child_process\").ChildProcess\n let lineEmitter: import(\"events\").EventEmitter\n let proxyServer: ProxyMcpServer | null = activeProcess?.proxyServer ?? null\n\n // Hot reload: evict cached subprocess if the bridged opencode MCP\n // config has drifted since spawn. Only checked between turns (here,\n // before setup() runs), never mid tool-call. The stored claude\n // session id is preserved so the respawn resumes the conversation\n // via `--session-id` (handled by buildCliArgs).\n if (\n activeProcess &&\n self.config.hotReloadMcp !== false &&\n self.config.bridgeOpencodeMcp !== false\n ) {\n const probe = self.effectiveMcpConfig(cwd, undefined, runtimeStatus)\n const previousHash = activeProcess.mcpHash ?? null\n if (previousHash !== probe.bridgedHash) {\n log.info(\"opencode MCP config changed, respawning claude\", {\n sk,\n previousHash,\n currentHash: probe.bridgedHash,\n })\n deleteActiveProcess(sk)\n activeProcess = undefined\n proxyServer = null\n }\n }\n\n const setup = async () => {\n if (!proxyServer && resolvedProxy) {\n proxyServer = await self.ensureProxyServer(resolvedProxy, sk)\n }\n\n const proxyDisallowed = resolvedProxy ? disallowedToolFlags(resolvedProxy) : []\n const extraDisallowed: string[] = []\n if (self.config.webSearch === \"disabled\") extraDisallowed.push(\"WebSearch\")\n const allDisallowed = [...proxyDisallowed, ...extraDisallowed]\n const mcp = self.effectiveMcpConfig(\n cwd,\n proxyServer?.configPath(),\n runtimeStatus,\n )\n const systemPromptFile = activeProcess\n ? undefined\n : buildAppendedSystemPrompt(cwd)\n const cliArgs = buildCliArgs({\n sessionKey: sk,\n skipPermissions,\n model: self.modelId,\n permissionMode: self.config.permissionMode,\n mcpConfig: mcp.paths,\n strictMcpConfig: self.config.strictMcpConfig,\n disallowedTools: allDisallowed.length > 0 ? allDisallowed : undefined,\n appendSystemPromptFile: systemPromptFile,\n })\n\n if (activeProcess) {\n proc = activeProcess.proc\n lineEmitter = activeProcess.lineEmitter\n log.debug(\"reusing active process\", { sk })\n } else {\n const ap = spawnClaudeProcess(\n cliPath,\n cliArgs,\n cwd,\n sk,\n proxyServer,\n mcp.bridgedHash,\n systemPromptFile,\n )\n proc = ap.proc\n lineEmitter = ap.lineEmitter\n activeProcess = ap\n }\n\n controller.enqueue({ type: \"stream-start\", warnings })\n\n let currentTextId: string | null = null\n const textBlockIndices = new Set<number>()\n\n const startTextBlock = (): string => {\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId })\n }\n const id = generateId()\n currentTextId = id\n controller.enqueue({ type: \"text-start\", id } as any)\n return id\n }\n\n const endTextBlock = (): void => {\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId })\n currentTextId = null\n }\n }\n\n const reasoningIds = new Map<number, string>()\n const reasoningStarted = new Map<number, boolean>()\n\n let turnCompleted = false\n let controllerClosed = false\n let pendingProxyUnsubscribe: (() => void) | null = null\n let resultFallbackTimer: ReturnType<typeof setTimeout> | null = null\n let hasReceivedContent = false\n\n const clearFallbackTimer = () => {\n if (resultFallbackTimer) {\n clearTimeout(resultFallbackTimer)\n resultFallbackTimer = null\n }\n }\n\n const startResultFallback = () => {\n clearFallbackTimer()\n if (!hasReceivedContent || controllerClosed) return\n resultFallbackTimer = setTimeout(() => {\n if (controllerClosed) return\n log.warn(\"result fallback timer fired — closing stream without result event\")\n closeHandler()\n }, 5000)\n }\n\n const toolCallMap = new Map<\n number,\n { id: string; name: string; inputJson: string }\n >()\n // Tool calls the plugin reported as providerExecuted:false — opencode\n // will run these itself and emit its own tool-result, so we must NOT\n // forward Claude CLI's tool_result for them (would short-circuit\n // opencode's execute).\n const skipResultForIds = new Set<string>()\n const toolCallsById = new Map<\n string,\n { id: string; name: string; input: unknown }\n >()\n\n let resultMeta: {\n sessionId?: string\n costUsd?: number\n durationMs?: number\n usage?: ClaudeStreamMessage[\"usage\"]\n } = {}\n\n const finishWithToolCall = (call: PendingProxyCall) => {\n if (controllerClosed) return\n controller.enqueue({\n type: \"tool-input-start\",\n id: call.toolCallId,\n toolName: call.toolName,\n } as any)\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: JSON.stringify(call.input),\n providerExecuted: false,\n } as any)\n skipResultForIds.add(call.toolCallId)\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"tool-calls\"),\n usage: toUsage(resultMeta.usage),\n providerMetadata: {\n \"claude-code\": resultMeta,\n },\n })\n controllerClosed = true\n cleanupTurn()\n try {\n controller.close()\n } catch {}\n }\n\n const lineHandler = (line: string) => {\n if (!line.trim()) return\n if (controllerClosed) return\n\n try {\n const msg: ClaudeStreamMessage = JSON.parse(line)\n\n if (handleControlRequest(msg, proc)) {\n return\n }\n\n log.debug(\"stream message\", {\n type: msg.type,\n subtype: msg.subtype,\n })\n\n // Handle system init\n if (msg.type === \"system\" && msg.subtype === \"init\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n log.info(\"session initialized\", {\n claudeSessionId: msg.session_id,\n })\n }\n }\n\n // content_block_start\n if (\n msg.type === \"content_block_start\" &&\n msg.content_block &&\n msg.index !== undefined\n ) {\n const block = msg.content_block\n const idx = msg.index\n\n if (block.type === \"thinking\") {\n const reasoningId = generateId()\n reasoningIds.set(idx, reasoningId)\n controller.enqueue({\n type: \"reasoning-start\",\n id: reasoningId,\n } as any)\n reasoningStarted.set(idx, true)\n }\n\n if (block.type === \"text\") {\n clearFallbackTimer()\n textBlockIndices.add(idx)\n if (block.text) {\n if (!currentTextId) startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: block.text,\n })\n hasReceivedContent = true\n }\n }\n\n if (block.type === \"tool_use\" && block.id && block.name) {\n clearFallbackTimer()\n toolCallMap.set(idx, {\n id: block.id,\n name: block.name,\n inputJson: \"\",\n })\n\n if (\n block.name !== \"AskUserQuestion\" &&\n block.name !== \"ask_user_question\" &&\n block.name !== \"ExitPlanMode\" &&\n !block.name.startsWith(PROXY_TOOL_PREFIX)\n ) {\n const { name: mappedName, skip, executed } = mapTool(\n block.name,\n undefined,\n { webSearch: self.config.webSearch },\n )\n if (!skip) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: block.id,\n toolName: mappedName,\n providerExecuted: executed,\n } as any)\n log.info(\"tool started\", {\n name: block.name,\n mappedName,\n id: block.id,\n })\n }\n }\n }\n }\n\n // content_block_delta\n if (\n msg.type === \"content_block_delta\" &&\n msg.delta &&\n msg.index !== undefined\n ) {\n const delta = msg.delta\n const idx = msg.index\n\n if (delta.type === \"thinking_delta\" && delta.thinking) {\n const reasoningId = reasoningIds.get(idx)\n if (reasoningId) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: reasoningId,\n delta: delta.thinking,\n } as any)\n }\n }\n\n if (delta.type === \"text_delta\" && delta.text) {\n if (!currentTextId) startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: delta.text,\n })\n hasReceivedContent = true\n }\n\n if (delta.type === \"input_json_delta\" && delta.partial_json) {\n const tc = toolCallMap.get(idx)\n if (tc) {\n tc.inputJson += delta.partial_json\n controller.enqueue({\n type: \"tool-input-delta\",\n id: tc.id,\n delta: delta.partial_json,\n } as any)\n }\n }\n }\n\n // content_block_stop\n if (\n msg.type === \"content_block_stop\" &&\n msg.index !== undefined\n ) {\n const idx = msg.index\n\n const reasoningId = reasoningIds.get(idx)\n if (reasoningId && reasoningStarted.get(idx)) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: reasoningId,\n } as any)\n reasoningStarted.delete(idx)\n }\n\n if (textBlockIndices.has(idx)) {\n endTextBlock()\n textBlockIndices.delete(idx)\n startResultFallback()\n }\n\n const tc = toolCallMap.get(idx)\n if (tc) {\n let parsedInput: any = {}\n try {\n parsedInput = JSON.parse(tc.inputJson || \"{}\")\n } catch {}\n\n if (\n tc.name === \"AskUserQuestion\" ||\n tc.name === \"ask_user_question\"\n ) {\n let question = \"Question?\"\n if (\n parsedInput?.questions &&\n Array.isArray(parsedInput.questions) &&\n parsedInput.questions.length > 0\n ) {\n question =\n parsedInput.questions[0].question ||\n parsedInput.questions[0].text ||\n \"Question?\"\n } else {\n question =\n parsedInput?.question ||\n parsedInput?.text ||\n \"Question?\"\n }\n\n const askId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: askId,\n delta: `\\n\\n_Asking: ${question}_\\n\\n`,\n })\n endTextBlock()\n } else if (tc.name === \"ExitPlanMode\") {\n const plan = (parsedInput?.plan as string) || \"\"\n\n const planId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: planId,\n delta: `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`,\n })\n endTextBlock()\n } else if (tc.name.startsWith(PROXY_TOOL_PREFIX)) {\n log.debug(\"ignoring proxy tool_use block; broker handles it\", {\n name: tc.name,\n id: tc.id,\n })\n } else {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(tc.name, parsedInput, { webSearch: self.config.webSearch })\n\n if (!skip) {\n toolCallsById.set(tc.id, {\n id: tc.id,\n name: tc.name,\n input: parsedInput,\n })\n if (!executed) skipResultForIds.add(tc.id)\n\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n log.info(\"tool call complete\", {\n name: tc.name,\n mappedName,\n id: tc.id,\n executed,\n })\n }\n }\n }\n\n // assistant message (complete, not streaming)\n if (msg.type === \"assistant\" && msg.message?.content) {\n const hasText = msg.message.content.some(\n (b: any) => b.type === \"text\" && b.text,\n )\n const hasToolUse = msg.message.content.some(\n (b: any) => b.type === \"tool_use\",\n )\n\n if (hasText) {\n hasReceivedContent = true\n }\n\n if (hasText && !hasToolUse) {\n startResultFallback()\n }\n if (hasToolUse) {\n clearFallbackTimer()\n }\n\n for (const block of msg.message.content) {\n if (block.type === \"text\" && block.text) {\n const blockId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: blockId,\n delta: block.text,\n })\n endTextBlock()\n hasReceivedContent = true\n }\n\n if (block.type === \"thinking\" && block.thinking) {\n const thinkingId = generateId()\n controller.enqueue({\n type: \"reasoning-start\",\n id: thinkingId,\n } as any)\n controller.enqueue({\n type: \"reasoning-delta\",\n id: thinkingId,\n delta: block.thinking,\n } as any)\n controller.enqueue({\n type: \"reasoning-end\",\n id: thinkingId,\n } as any)\n }\n\n if (block.type === \"tool_use\" && block.id && block.name) {\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n toolCallsById.set(block.id, {\n id: block.id,\n name: block.name,\n input: parsedInput,\n })\n\n if (\n block.name === \"AskUserQuestion\" ||\n block.name === \"ask_user_question\"\n ) {\n let question = \"Question?\"\n if (\n parsedInput?.questions &&\n Array.isArray(parsedInput.questions) &&\n parsedInput.questions.length > 0\n ) {\n const q = parsedInput.questions[0] as any\n question = q.question || q.text || \"Question?\"\n } else {\n question =\n (parsedInput?.question as string) ||\n (parsedInput?.text as string) ||\n \"Question?\"\n }\n\n const askId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: askId,\n delta: `\\n\\n_Asking: ${question}_\\n\\n`,\n })\n endTextBlock()\n } else if (block.name === \"ExitPlanMode\") {\n const plan = (parsedInput?.plan as string) || \"\"\n\n const planId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: planId,\n delta: `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`,\n })\n endTextBlock()\n } else if (block.name.startsWith(PROXY_TOOL_PREFIX)) {\n log.debug(\"ignoring proxy tool_use from assistant message\", {\n name: block.name,\n id: block.id,\n })\n } else {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(block.name, parsedInput, { webSearch: self.config.webSearch })\n\n if (!skip) {\n if (!executed) skipResultForIds.add(block.id)\n controller.enqueue({\n type: \"tool-input-start\",\n id: block.id,\n toolName: mappedName,\n providerExecuted: executed,\n } as any)\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: block.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n log.info(\"tool_use from assistant message\", {\n name: block.name,\n mappedName,\n id: block.id,\n executed,\n })\n }\n }\n\n if (block.type === \"tool_result\") {\n log.debug(\"tool_result\", {\n toolUseId: block.tool_use_id,\n })\n }\n }\n }\n\n // user message (tool results from Claude CLI)\n if (msg.type === \"user\" && msg.message?.content) {\n for (const block of msg.message.content) {\n if (block.type === \"tool_result\" && block.tool_use_id) {\n if (skipResultForIds.has(block.tool_use_id)) {\n log.debug(\"skipping tool-result (opencode runs it)\", {\n toolUseId: block.tool_use_id,\n })\n continue\n }\n const toolCall = toolCallsById.get(block.tool_use_id)\n if (toolCall) {\n let resultText = \"\"\n if (typeof block.content === \"string\") {\n resultText = block.content\n } else if (Array.isArray(block.content)) {\n resultText = block.content\n .filter(\n (\n c,\n ): c is { type: string; text: string } =>\n c.type === \"text\" &&\n typeof c.text === \"string\",\n )\n .map((c) => c.text)\n .join(\"\\n\")\n }\n\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: block.tool_use_id,\n toolName: toolCall.name,\n result: {\n output: resultText,\n title: toolCall.name,\n metadata: {},\n },\n providerExecuted: true,\n } as any)\n log.info(\"tool result emitted\", {\n toolUseId: block.tool_use_id,\n name: toolCall.name,\n })\n toolCallsById.delete(block.tool_use_id)\n }\n }\n }\n }\n\n // result - end of conversation turn\n if (msg.type === \"result\") {\n clearFallbackTimer()\n\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n\n // Some CLI failures only include user-readable text in\n // `result.result` (no prior assistant text blocks). Emit it so\n // opencode users don't see a blank turn.\n if (\n !currentTextId &&\n msg.is_error &&\n typeof msg.result === \"string\" &&\n msg.result.trim().length > 0\n ) {\n const errId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: errId,\n delta: msg.result,\n })\n }\n\n resultMeta = {\n sessionId: msg.session_id,\n costUsd: msg.total_cost_usd,\n durationMs: msg.duration_ms,\n usage: msg.usage,\n }\n\n log.info(\"conversation result\", {\n sessionId: msg.session_id,\n durationMs: msg.duration_ms,\n numTurns: msg.num_turns,\n isError: msg.is_error,\n })\n\n turnCompleted = true\n\n endTextBlock()\n\n for (const [idx, reasoningId] of reasoningIds) {\n if (reasoningStarted.get(idx)) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: reasoningId,\n } as any)\n }\n }\n\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage(msg.usage),\n providerMetadata: {\n \"claude-code\": resultMeta,\n ...(typeof msg.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n msg.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n })\n\n controllerClosed = true\n cleanupTurn()\n\n try {\n controller.close()\n } catch {}\n }\n } catch (e) {\n log.debug(\"failed to parse line\", {\n error:\n e instanceof Error ? e.message : String(e),\n })\n }\n }\n\n const closeHandler = () => {\n log.debug(\"readline closed\")\n if (controllerClosed) return\n controllerClosed = true\n cleanupTurn()\n endTextBlock()\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage(),\n providerMetadata: {\n \"claude-code\": resultMeta,\n },\n })\n try {\n controller.close()\n } catch {}\n }\n\n // Centralised per-turn teardown. Every exit path funnels through here\n // so we don't accumulate listeners across turns on a reused process.\n let cleanedUp = false\n const cleanupTurn = () => {\n if (cleanedUp) return\n cleanedUp = true\n clearFallbackTimer()\n lineEmitter.off(\"line\", lineHandler)\n lineEmitter.off(\"close\", closeHandler)\n pendingProxyUnsubscribe?.()\n pendingProxyUnsubscribe = null\n proc.off(\"error\", procErrorHandler)\n }\n\n const procErrorHandler = (err: Error) => {\n log.error(\"process error\", { error: err.message })\n if (controllerClosed) return\n controllerClosed = true\n cleanupTurn()\n controller.enqueue({ type: \"error\", error: err })\n try {\n controller.close()\n } catch {}\n }\n\n lineEmitter.on(\"line\", lineHandler)\n lineEmitter.on(\"close\", closeHandler)\n\n pendingProxyUnsubscribe = onPendingProxyCall(sk, (call) => {\n log.info(\"received pending proxy call for session\", {\n sessionKey: sk,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n })\n finishWithToolCall(call)\n })\n\n proc.on(\"error\", procErrorHandler)\n\n // On abort, keep process alive for next message\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", () => {\n if (turnCompleted || controllerClosed) return\n\n if (!hasReceivedContent) {\n log.info(\n \"abort signal received before content, closing stream immediately\",\n { cwd },\n )\n controllerClosed = true\n cleanupTurn()\n try {\n controller.close()\n } catch {}\n return\n }\n\n log.info(\n \"abort signal received mid-turn, starting grace period\",\n { cwd },\n )\n startResultFallback()\n })\n }\n\n if (pendingProxyCall && pendingProxyResult) {\n log.info(\"resolving pending proxy call from tool result prompt\", {\n sessionKey: sk,\n toolCallId: pendingProxyCall.toolCallId,\n toolName: pendingProxyCall.toolName,\n })\n const resolved = resolvePendingProxyCall(sk, pendingProxyResult)\n if (!resolved) {\n log.warn(\"failed to resolve pending proxy call; no pending state\", {\n sessionKey: sk,\n toolCallId: pendingProxyCall.toolCallId,\n })\n }\n return\n }\n\n // Send the user message for a fresh turn.\n proc.stdin?.write(userMsg + \"\\n\")\n log.debug(\"sent user message\", { textLength: userMsg.length })\n }\n\n void setup().catch((err) => {\n log.error(\"failed to set up doStream\", {\n error: err instanceof Error ? err.message : String(err),\n })\n controller.enqueue({\n type: \"error\",\n error: err instanceof Error ? err : new Error(String(err)),\n })\n try {\n controller.close()\n } catch {}\n })\n },\n cancel() {\n // Consumer cancelled the stream\n },\n })\n\n return {\n stream,\n request: { body: { text: userMsg } },\n response: { headers: {} },\n }\n }\n}\n","const DEBUG = process.env.DEBUG?.includes(\"opencode-claude-code\") ?? false\n\nfunction fmt(level: string, msg: string, data?: Record<string, unknown>): string {\n const ts = new Date().toISOString()\n const base = `[${ts}] [opencode-claude-code] ${level}: ${msg}`\n if (data && Object.keys(data).length > 0) {\n return `${base} ${JSON.stringify(data)}`\n }\n return base\n}\n\nexport const log = {\n info(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"INFO\", msg, data))\n },\n notice(msg: string, data?: Record<string, unknown>) {\n console.error(fmt(\"NOTICE\", msg, data))\n },\n warn(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"WARN\", msg, data))\n },\n error(msg: string, data?: Record<string, unknown>) {\n console.error(fmt(\"ERROR\", msg, data))\n },\n debug(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"DEBUG\", msg, data))\n },\n}\n","import { log } from \"./logger.js\"\nimport type { WebSearchRouting } from \"./types.js\"\n\nexport interface MapToolOptions {\n webSearch?: WebSearchRouting\n}\n\n/**\n * Map Claude CLI tool input (snake_case) to OpenCode tool input (camelCase)\n */\nfunction mapToolInput(name: string, input: any): any {\n if (!input) return input\n\n switch (name) {\n case \"Write\":\n return {\n filePath: input.file_path ?? input.filePath,\n content: input.content,\n }\n case \"Edit\":\n return {\n filePath: input.file_path ?? input.filePath,\n oldString: input.old_string ?? input.oldString,\n newString: input.new_string ?? input.newString,\n replaceAll: input.replace_all ?? input.replaceAll,\n }\n case \"Read\":\n return {\n filePath: input.file_path ?? input.filePath,\n offset: input.offset,\n limit: input.limit,\n }\n case \"Bash\":\n return {\n command: input.command,\n description:\n input.description ||\n `Execute: ${String(input.command || \"\").slice(0, 50)}${String(input.command || \"\").length > 50 ? \"...\" : \"\"}`,\n timeout: input.timeout,\n }\n case \"NotebookEdit\":\n return {\n notebookPath: input.notebook_path ?? input.notebookPath,\n cellNumber: input.cell_number ?? input.cellNumber,\n newSource: input.new_source ?? input.newSource,\n cellType: input.cell_type ?? input.cellType,\n editMode: input.edit_mode ?? input.editMode,\n }\n case \"Glob\":\n return {\n pattern: input.pattern,\n path: input.path,\n }\n case \"Grep\":\n return {\n pattern: input.pattern,\n path: input.path,\n include: input.include,\n }\n case \"TodoWrite\":\n if (Array.isArray(input.todos)) {\n const mappedTodos = input.todos.map((todo: any, index: number) => ({\n content: todo.content,\n status: todo.status || \"pending\",\n priority: todo.priority || \"medium\",\n id: todo.id || `todo_${Date.now()}_${index}`,\n }))\n return { todos: mappedTodos }\n }\n return input\n default:\n return input\n }\n}\n\n// Tools that Claude CLI executes internally but we report to opencode for UI display\nconst OPENCODE_HANDLED_TOOLS = new Set([\n \"Edit\",\n \"Write\",\n \"Bash\",\n \"NotebookEdit\",\n \"Read\",\n \"Glob\",\n \"Grep\",\n])\n\n// Claude CLI internal tools that should not be forwarded to opencode.\n// These are part of Claude Code's own system and have no opencode equivalent.\nconst CLAUDE_INTERNAL_TOOLS = new Set([\n \"ToolSearch\",\n \"Agent\",\n \"AskFollowupQuestion\",\n])\n\nexport function mapTool(\n name: string,\n input?: any,\n opts?: MapToolOptions,\n): { name: string; input?: any; executed: boolean; skip?: boolean } {\n // Claude CLI internal tools — skip entirely\n if (CLAUDE_INTERNAL_TOOLS.has(name)) {\n log.debug(\"skipping Claude CLI internal tool\", { name })\n return { name, input, executed: true, skip: true }\n }\n // Plan mode tools\n if (name === \"EnterPlanMode\") return { name: \"plan_enter\", input: {}, executed: false }\n if (name === \"ExitPlanMode\") return { name: \"plan_exit\", input, executed: false }\n\n // TodoWrite needs opencode to run it locally so Todo.Service (and the UI\n // widget backed by it) gets populated. Reporting as provider-executed would\n // short-circuit opencode's own execute and leave the todo panel empty.\n if (name === \"TodoWrite\") {\n const mappedInput = mapToolInput(name, input)\n return { name: \"todowrite\", input: mappedInput, executed: false }\n }\n\n // WebSearch — routing controlled by config.webSearch\n if (name === \"WebSearch\" || name === \"web_search\") {\n const mappedInput = input?.query ? { query: input.query } : input\n const route = opts?.webSearch\n if (route && route !== \"claude\" && route !== \"disabled\") {\n log.debug(\"routing WebSearch to opencode tool\", { target: route, mappedInput })\n return { name: route, input: mappedInput, executed: false }\n }\n log.debug(\"WebSearch executed by Claude CLI\", { mappedInput })\n return { name: \"WebSearch\", input: mappedInput, executed: true }\n }\n\n // TaskOutput -> bash echo\n if (name === \"TaskOutput\") {\n if (!input) return { name: \"bash\", executed: false }\n const output = input?.content || input?.output || JSON.stringify(input)\n return {\n name: \"bash\",\n input: {\n command: `echo \"TASK OUTPUT: ${String(output).replace(/\"/g, '\\\\\"')}\"`,\n description: \"Displaying task output\",\n },\n executed: false,\n }\n }\n\n // MCP tools: mcp__<server>__<tool> -> <server>_<tool>\n if (name.startsWith(\"mcp__\")) {\n const parts = name.slice(5).split(\"__\")\n if (parts.length >= 2) {\n const serverName = parts[0]\n const toolName = parts.slice(1).join(\"_\")\n const openCodeName = `${serverName}_${toolName}`\n log.debug(\"mapping MCP tool\", { original: name, mapped: openCodeName })\n return { name: openCodeName, input, executed: false }\n }\n }\n\n // Tools executed by Claude CLI internally - map to lowercase for opencode\n if (OPENCODE_HANDLED_TOOLS.has(name)) {\n const mappedInput = mapToolInput(name, input)\n const openCodeName = name.toLowerCase()\n log.debug(\"mapping CLI-executed tool\", { name, openCodeName })\n return { name: openCodeName, input: mappedInput, executed: true }\n }\n\n // Unknown tools - treated as provider-executed\n return { name, input, executed: true }\n}\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\"\nimport { log } from \"./logger.js\"\nimport type { ReasoningEffort } from \"./types.js\"\n\ntype Prompt = Parameters<LanguageModelV3[\"doGenerate\"]>[0][\"prompt\"]\n\nconst THINKING_KEYWORDS: Record<ReasoningEffort, string | null> = {\n minimal: null,\n low: \"think\",\n medium: \"think hard\",\n high: \"think harder\",\n xhigh: \"megathink\",\n max: \"ultrathink\",\n}\n\nexport function reasoningKeyword(effort?: ReasoningEffort): string | null {\n if (!effort) return null\n return THINKING_KEYWORDS[effort] ?? null\n}\n\nconst SUPPORTED_IMAGE_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n])\n\nfunction toImageBlock(part: any): any | null {\n const raw: unknown = part.data ?? part.url ?? part.source?.data\n if (!raw) {\n log.warn(\"file part without data, skipping\")\n return null\n }\n\n let resolvedMediaType: string = part.mediaType || part.mimeType || part.mime || \"\"\n let base64: string | null = null\n\n if (typeof raw === \"string\") {\n if (raw.startsWith(\"data:\")) {\n const match = /^data:([^;,]+)(?:;[^,]*)*(?:;base64)?,(.*)$/s.exec(raw)\n if (!match) {\n log.warn(\"malformed data URI, skipping file part\")\n return null\n }\n resolvedMediaType = resolvedMediaType || match[1]\n base64 = match[2]\n } else if (/^https?:\\/\\//i.test(raw)) {\n log.warn(\"remote URL images are not supported by Claude CLI, skipping\")\n return null\n } else {\n base64 = raw\n }\n } else if (raw instanceof URL) {\n log.warn(\"remote URL images are not supported by Claude CLI, skipping\")\n return null\n } else if (raw instanceof Uint8Array || Buffer.isBuffer(raw)) {\n base64 = Buffer.from(raw as Uint8Array).toString(\"base64\")\n } else {\n log.warn(\"unsupported file part data type\", { dataType: typeof raw })\n return null\n }\n\n if (!resolvedMediaType || !SUPPORTED_IMAGE_TYPES.has(resolvedMediaType)) {\n log.warn(\"unsupported media type for Claude image block, skipping\", {\n mediaType: resolvedMediaType,\n })\n return null\n }\n\n return {\n type: \"image\",\n source: { type: \"base64\", media_type: resolvedMediaType, data: base64 },\n }\n}\n\nfunction getToolResultText(part: any): string {\n const value = part.output ?? part.result\n\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\") {\n return JSON.stringify(value)\n }\n\n switch (value.type) {\n case \"text\":\n case \"error-text\":\n return String(value.value)\n case \"json\":\n case \"error-json\":\n return JSON.stringify(value.value)\n case \"execution-denied\":\n return value.reason ? `Execution denied: ${value.reason}` : \"Execution denied\"\n case \"content\":\n return Array.isArray(value.value)\n ? value.value\n .map((item: any) => {\n if (item?.type === \"text\") return item.text\n return JSON.stringify(item)\n })\n .join(\"\\n\")\n : JSON.stringify(value.value)\n default:\n return JSON.stringify(value)\n }\n}\n\n/**\n * Compact conversation history into a context summary for when we start\n * a fresh Claude CLI session but want to preserve conversation context.\n */\nexport function compactConversationHistory(prompt: Prompt): string | null {\n const conversationMessages = prompt.filter(\n (m) => m.role === \"user\" || m.role === \"assistant\",\n )\n\n if (conversationMessages.length <= 1) {\n return null\n }\n\n const historyParts: string[] = []\n\n for (let i = 0; i < conversationMessages.length - 1; i++) {\n const msg = conversationMessages[i]\n const role = msg.role === \"user\" ? \"User\" : \"Assistant\"\n\n let text = \"\"\n if (typeof msg.content === \"string\") {\n text = msg.content\n } else if (Array.isArray(msg.content)) {\n const textParts = (msg.content as any[])\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text)\n text = textParts.join(\"\\n\")\n\n const toolCalls = (msg.content as any[]).filter(\n (p) => p.type === \"tool-call\",\n )\n const toolResults = (msg.content as any[]).filter(\n (p) => p.type === \"tool-result\",\n )\n\n if (toolCalls.length > 0) {\n text += `\\n[Called ${toolCalls.length} tool(s): ${toolCalls.map((t: any) => t.toolName).join(\", \")}]`\n }\n if (toolResults.length > 0) {\n text += `\\n[Received ${toolResults.length} tool result(s)]`\n }\n }\n\n if (text.trim()) {\n const truncated =\n text.length > 2000 ? text.slice(0, 2000) + \"...\" : text\n historyParts.push(`${role}: ${truncated}`)\n }\n }\n\n if (historyParts.length === 0) {\n return null\n }\n\n return historyParts.join(\"\\n\\n\")\n}\n\n/**\n * Convert AI SDK prompt into a Claude CLI stream-json user message.\n */\nexport function getClaudeUserMessage(\n prompt: Prompt,\n includeHistoryContext: boolean = false,\n reasoningEffort?: ReasoningEffort,\n): string {\n const content: any[] = []\n\n if (includeHistoryContext) {\n const historyContext = compactConversationHistory(prompt)\n if (historyContext) {\n log.info(\"including conversation history context\", {\n historyLength: historyContext.length,\n })\n content.push({\n type: \"text\",\n text: `<conversation_history>\nThe following is a summary of our conversation so far (from a previous session that couldn't be resumed):\n\n${historyContext}\n\n</conversation_history>\n\nNow continuing with the current message:\n\n`,\n })\n }\n }\n\n // Find messages since last assistant message\n const messages: typeof prompt = []\n for (let i = prompt.length - 1; i >= 0; i--) {\n if (prompt[i].role === \"assistant\") break\n messages.unshift(prompt[i])\n }\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n const str = msg.content as string\n if (str.trim()) {\n content.push({ type: \"text\", text: str })\n }\n } else if (Array.isArray(msg.content)) {\n for (const part of msg.content as any[]) {\n if (part.type === \"text\") {\n if (part.text && part.text.trim()) {\n content.push({ type: \"text\", text: part.text })\n }\n } else if (part.type === \"file\" || part.type === \"image\") {\n const block = toImageBlock(part)\n if (block) {\n content.push(block)\n } else {\n log.debug(\"skipped non-image file part\", {\n mediaType: part.mediaType,\n })\n }\n } else if (part.type === \"tool-result\") {\n const p = part as any\n content.push({\n type: \"tool_result\",\n tool_use_id: p.toolCallId,\n content: getToolResultText(p),\n })\n }\n }\n }\n }\n }\n\n if (content.length === 0) {\n // CLI rejects a zero-block message with 400, and Anthropic rejects\n // whitespace-only text blocks — so we need a non-whitespace sentinel.\n // \"(empty)\" matches the parenthetical meta-note convention this file\n // already uses for reasoning keywords (\"(think)\", \"(megathink)\", etc.),\n // which the model reads as out-of-band metadata rather than a prompt to\n // continue its previous turn.\n log.warn(\"empty user content; sending sentinel to satisfy CLI\")\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"(empty)\" }],\n },\n })\n }\n\n const keyword = reasoningKeyword(reasoningEffort)\n if (keyword) {\n const lastTextPart = [...content].reverse().find((p) => p.type === \"text\")\n if (lastTextPart) {\n lastTextPart.text = lastTextPart.text\n ? `${lastTextPart.text}\\n\\n(${keyword})`\n : `(${keyword})`\n } else {\n content.push({ type: \"text\", text: `(${keyword})` })\n }\n log.debug(\"injected reasoning keyword\", { effort: reasoningEffort, keyword })\n }\n\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content,\n },\n })\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\nimport * as crypto from \"node:crypto\"\nimport { log } from \"./logger.js\"\n\n/**\n * Bridge opencode's `mcp` config block into a Claude CLI `--mcp-config` file.\n *\n * Opencode core schema (packages/opencode/src/config/mcp.ts):\n * {\n * \"mcp\": {\n * \"name\": {\n * \"type\": \"local\" | \"remote\",\n * \"command\"?: string[], // local\n * \"environment\"?: Record<string,string>,\n * \"url\"?: string, // remote\n * \"headers\"?: Record<string,string>,\n * \"oauth\"?: object | false, // remote — NOT bridged (Claude --mcp-config has no slot)\n * \"timeout\"?: number, // NOT bridged (Claude --mcp-config has no slot)\n * \"enabled\"?: boolean\n * }\n * }\n * }\n *\n * Claude CLI `--mcp-config` schema:\n * {\n * \"mcpServers\": {\n * \"name\": {\n * \"type\": \"stdio\" | \"http\",\n * \"command\"?: string, \"args\"?: string[], \"env\"?: Record<string,string>,\n * \"url\"?: string, \"headers\"?: Record<string,string>\n * }\n * }\n * }\n *\n * Discovery + merge are aligned with opencode core's `loadInstanceState`\n * (packages/opencode/src/config/config.ts). In merge order (last wins),\n * opencode loads:\n *\n * 1. Auth `.well-known` remote configs ← NOT bridged\n * 2. Global: ~/.config/opencode/{config.json,opencode.json,opencode.jsonc}\n * — all three deep-merged, jsonc highest priority\n * 3. OPENCODE_CONFIG env var (single file)\n * 4. Project walk-up: opencode.json[c] in each dir from cwd up to (not past)\n * worktree, both extensions per dir, parent-most first\n * 5. .opencode/ siblings: from cwd up + home dir + OPENCODE_CONFIG_DIR,\n * both extensions per dir, opencode-iteration order (cwd-most first\n * in walk-up — so parent-most `.opencode/` wins, matching upstream)\n * 6. OPENCODE_CONFIG_CONTENT env var (inline JSON) ← NOT bridged\n * 7. Active org remote config ← NOT bridged\n * 8. Managed config dir / macOS MDM ← NOT bridged\n *\n * Sources marked NOT bridged are niche and would require live opencode\n * runtime state (auth tokens, account context, MDM access). Document them\n * here so the gap is explicit; functionality of the common path is intact.\n *\n * Per-server merge is deep-merge (matching opencode's `mergeConfigConcatArrays`\n * → `mergeDeep`), so a project layer can override one field of a global server\n * spec — e.g. `{ \"linear\": { \"enabled\": true } }` lifts global linear's URL.\n */\n\nconst FILE_NAMES = [\"opencode.jsonc\", \"opencode.json\", \"config.json\"] as const\nconst PROJECT_FILE_NAMES = [\"opencode.json\", \"opencode.jsonc\"] as const\n\nfunction fileExists(p: string): boolean {\n try {\n return fs.statSync(p).isFile()\n } catch {\n return false\n }\n}\n\nfunction dirExists(p: string): boolean {\n try {\n return fs.statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n\n/** Strip `//` and `/* *\\/` comments so JSONC parses via JSON.parse. */\nfunction stripJsonComments(text: string): string {\n let out = \"\"\n let i = 0\n let inString: string | null = null\n while (i < text.length) {\n const c = text[i]\n if (inString) {\n out += c\n if (c === \"\\\\\" && i + 1 < text.length) {\n out += text[i + 1]\n i += 2\n continue\n }\n if (c === inString) inString = null\n i++\n continue\n }\n if (c === '\"' || c === \"'\") {\n inString = c\n out += c\n i++\n continue\n }\n if (c === \"/\" && text[i + 1] === \"/\") {\n while (i < text.length && text[i] !== \"\\n\") i++\n continue\n }\n if (c === \"/\" && text[i + 1] === \"*\") {\n i += 2\n while (\n i < text.length &&\n !(text[i] === \"*\" && text[i + 1] === \"/\")\n )\n i++\n i += 2\n continue\n }\n out += c\n i++\n }\n return out\n}\n\nfunction readAndParse(file: string): Record<string, unknown> | null {\n try {\n const raw = fs.readFileSync(file, \"utf8\")\n return JSON.parse(stripJsonComments(raw)) as Record<string, unknown>\n } catch (e) {\n log.warn(\"failed to parse opencode config\", {\n file,\n error: e instanceof Error ? e.message : String(e),\n })\n return null\n }\n}\n\n/**\n * Deep merge two plain-object trees. Arrays and primitives are replaced\n * (not concatenated). Matches the effective behavior of opencode's\n * `mergeDeep` from `remeda` for the MCP block — opencode does not special\n * case array fields inside `mcp.<server>` (its only special case is\n * `instructions`, which is concat-deduped at the config root).\n */\nfunction isPlainObject(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x)\n}\n\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...target }\n for (const [k, v] of Object.entries(source)) {\n if (v === undefined) continue\n const existing = out[k]\n if (isPlainObject(existing) && isPlainObject(v)) {\n out[k] = deepMerge(existing, v)\n } else {\n out[k] = v\n }\n }\n return out\n}\n\n/**\n * Walk up from `start` toward filesystem root (or `stop` if provided),\n * collecting paths where each `target` exists. Mirrors opencode core's\n * `FileSystem.up` (packages/core/src/filesystem.ts): cwd-most first,\n * parent-most last.\n */\nfunction walkUp(opts: {\n start: string\n stop?: string\n targets: readonly string[]\n predicate: (p: string) => boolean\n}): string[] {\n const out: string[] = []\n let current = path.resolve(opts.start)\n while (true) {\n for (const target of opts.targets) {\n const candidate = path.join(current, target)\n if (opts.predicate(candidate)) out.push(candidate)\n }\n if (opts.stop && current === path.resolve(opts.stop)) break\n const parent = path.dirname(current)\n if (parent === current) break\n current = parent\n }\n return out\n}\n\n/**\n * Find the worktree root by walking up from `cwd` looking for a `.git`\n * entry (file or directory — submodules use a file). If no `.git` is\n * found, walk to filesystem root. Honors OPENCODE_WORKTREE override.\n */\nfunction detectWorktree(cwd: string): string | undefined {\n const override = process.env.OPENCODE_WORKTREE\n if (override) return path.resolve(override)\n let current = path.resolve(cwd)\n while (true) {\n const gitPath = path.join(current, \".git\")\n try {\n if (fs.existsSync(gitPath)) return current\n } catch {\n // ignore\n }\n const parent = path.dirname(current)\n if (parent === current) return undefined\n current = parent\n }\n}\n\nfunction globalConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\")\n return path.join(xdg, \"opencode\")\n}\n\n/**\n * Load the merged global config from `~/.config/opencode/`. Mirrors\n * opencode core's `loadGlobal`: deep-merges config.json → opencode.json\n * → opencode.jsonc in that order (jsonc wins).\n */\nfunction loadGlobalConfig(): Record<string, unknown> {\n const dir = globalConfigDir()\n let merged: Record<string, unknown> = {}\n for (const name of FILE_NAMES.slice().reverse()) {\n // FILE_NAMES is jsonc-first; reverse to get config.json-first order.\n const file = path.join(dir, name)\n if (!fileExists(file)) continue\n const parsed = readAndParse(file)\n if (parsed) merged = deepMerge(merged, parsed)\n }\n return merged\n}\n\n/** Load both `opencode.json` and `opencode.jsonc` in `dir`, deep-merged. */\nfunction loadProjectFilesInDir(dir: string): Record<string, unknown> {\n let merged: Record<string, unknown> = {}\n for (const name of PROJECT_FILE_NAMES) {\n const file = path.join(dir, name)\n if (!fileExists(file)) continue\n const parsed = readAndParse(file)\n if (parsed) merged = deepMerge(merged, parsed)\n }\n return merged\n}\n\n/**\n * Build the list of `.opencode/` directories to consider, in opencode core's\n * order (matching `ConfigPaths.directories`):\n * project walk-up (cwd-most first) → home-dir `.opencode/` → OPENCODE_CONFIG_DIR\n */\nfunction dotOpencodeDirs(cwd: string, worktree?: string): string[] {\n const dirs: string[] = []\n const seen = new Set<string>()\n const push = (p: string) => {\n const abs = path.resolve(p)\n if (!seen.has(abs) && dirExists(abs)) {\n seen.add(abs)\n dirs.push(abs)\n }\n }\n\n for (const dir of walkUp({\n start: cwd,\n stop: worktree,\n targets: [\".opencode\"],\n predicate: dirExists,\n })) {\n push(dir)\n }\n\n const home = os.homedir()\n if (home) {\n const homeDot = path.join(home, \".opencode\")\n if (dirExists(homeDot)) push(homeDot)\n }\n\n const envDir = process.env.OPENCODE_CONFIG_DIR\n if (envDir && dirExists(envDir)) push(envDir)\n\n return dirs\n}\n\ninterface OpencodeLocalServer {\n type?: \"local\"\n command?: string[]\n environment?: Record<string, string>\n enabled?: boolean\n}\n\ninterface OpencodeRemoteServer {\n type?: \"remote\"\n url?: string\n headers?: Record<string, string>\n enabled?: boolean\n}\n\ntype OpencodeServer = OpencodeLocalServer | OpencodeRemoteServer | { enabled?: boolean }\n\nfunction translateServer(\n name: string,\n spec: Record<string, unknown>,\n): Record<string, unknown> | null {\n if (spec.enabled === false) return null\n\n const type = spec.type\n if (type === \"local\") {\n const cmd = spec.command\n if (!Array.isArray(cmd) || cmd.length === 0) {\n log.warn(\"skipping local MCP server with no command\", { name })\n return null\n }\n const out: Record<string, unknown> = {\n type: \"stdio\",\n command: String(cmd[0]),\n }\n if (cmd.length > 1) out.args = cmd.slice(1).map((s) => String(s))\n if (spec.environment && typeof spec.environment === \"object\") {\n out.env = spec.environment\n }\n return out\n }\n\n if (type === \"remote\") {\n if (typeof spec.url !== \"string\" || !spec.url) {\n log.warn(\"skipping remote MCP server with no url\", { name })\n return null\n }\n const out: Record<string, unknown> = {\n type: \"http\",\n url: spec.url,\n }\n if (spec.headers && typeof spec.headers === \"object\") {\n out.headers = spec.headers\n }\n return out\n }\n\n log.warn(\"skipping MCP server with unknown type\", {\n name,\n type: type ?? null,\n })\n return null\n}\n\nfunction extractMcpBlock(\n config: Record<string, unknown>,\n): Record<string, OpencodeServer> {\n const mcp = config.mcp\n if (!mcp || typeof mcp !== \"object\" || Array.isArray(mcp)) return {}\n return mcp as Record<string, OpencodeServer>\n}\n\n/**\n * Deep-merge per-server specs from `source` into `target`. Mirrors opencode's\n * `mergeDeep` semantics for the `mcp` record: each server entry is recursively\n * merged so a partial layer (e.g. `{ \"linear\": { \"enabled\": true } }`) can\n * override one field without dropping the rest.\n */\nfunction mergeMcp(\n target: Record<string, OpencodeServer>,\n source: Record<string, OpencodeServer>,\n): Record<string, OpencodeServer> {\n const out: Record<string, OpencodeServer> = { ...target }\n for (const [name, spec] of Object.entries(source)) {\n if (!spec || typeof spec !== \"object\") continue\n const existing = out[name]\n if (existing && typeof existing === \"object\") {\n out[name] = deepMerge(\n existing as Record<string, unknown>,\n spec as Record<string, unknown>,\n ) as OpencodeServer\n } else {\n out[name] = spec\n }\n }\n return out\n}\n\nexport interface BridgedMcp {\n /** Path to the temp file containing the translated `--mcp-config`. */\n path: string\n /** Stable hash of the merged opencode mcp block (pre-translation). */\n hash: string\n}\n\n/**\n * Per-server runtime status from opencode's `client.mcp.status()`. Used as\n * an overlay on top of the on-disk merged config so opencode's UI-toggled\n * state — which lives only in-memory; `connect()`/`disconnect()` never\n * touch disk — propagates to the bridged claude subprocess.\n *\n * Treatment per server:\n * - \"connected\" → force `enabled: true` (mirror opencode)\n * - any other status → force `enabled: false` (don't ship a server\n * opencode can't run; user fixes it in opencode first)\n * - missing entry → leave disk value\n *\n * Omit the overlay and the bridge falls back to disk-only.\n */\nexport type RuntimeMcpStatus = Record<string, string>\n\n/**\n * Read opencode config layers, deep-merge their `mcp` blocks per opencode's\n * own semantics, optionally apply an opencode runtime-status overlay, then\n * translate each server to Claude CLI format, write a scratch file, and\n * return its path + a stable hash. Returns null when no enabled MCP servers\n * remain after the merge + overlay.\n */\nexport function bridgeOpencodeMcp(\n cwd: string,\n runtimeStatus?: RuntimeMcpStatus,\n): BridgedMcp | null {\n const worktree = detectWorktree(cwd)\n\n // Layer 1: global merged\n let merged: Record<string, OpencodeServer> = {}\n merged = mergeMcp(merged, extractMcpBlock(loadGlobalConfig()))\n\n // Layer 2: OPENCODE_CONFIG (single file, applied before project walk-up)\n const explicitConfig = process.env.OPENCODE_CONFIG\n if (explicitConfig && fileExists(explicitConfig)) {\n const parsed = readAndParse(explicitConfig)\n if (parsed) merged = mergeMcp(merged, extractMcpBlock(parsed))\n }\n\n // Layer 3: project walk-up — opencode.json[c] in each dir from cwd to\n // (not past) worktree, both extensions per dir. walkUp returns cwd-most\n // first; collect distinct dirs in that order then reverse for merge so\n // cwd-most wins under last-merge-wins.\n const projectFiles = walkUp({\n start: cwd,\n stop: worktree,\n targets: PROJECT_FILE_NAMES,\n predicate: fileExists,\n })\n const projectDirs: string[] = []\n const seenProjectDirs = new Set<string>()\n for (const f of projectFiles) {\n const d = path.dirname(f)\n if (!seenProjectDirs.has(d)) {\n seenProjectDirs.add(d)\n projectDirs.push(d)\n }\n }\n for (const dir of projectDirs.slice().reverse()) {\n merged = mergeMcp(merged, extractMcpBlock(loadProjectFilesInDir(dir)))\n }\n\n // Layer 4: `.opencode/` siblings — project walk-up then home-dir then\n // OPENCODE_CONFIG_DIR, in that order. Iteration order matches opencode's\n // (cwd-most first within walk-up), so under deep-merge \"later wins\"\n // parent-most `.opencode/` overrides cwd-most. This is upstream's\n // behavior, surprising though it is.\n for (const dir of dotOpencodeDirs(cwd, worktree)) {\n merged = mergeMcp(merged, extractMcpBlock(loadProjectFilesInDir(dir)))\n }\n\n // Layer 5: opencode runtime overlay. opencode's `/mcps` UI toggle calls\n // `mcp.connect()` / `mcp.disconnect()` which only mutate in-memory state,\n // never the on-disk config. Without this overlay the bridge can't see\n // those toggles and claude misses servers the user just enabled.\n if (runtimeStatus) {\n for (const name of Object.keys(merged)) {\n const status = runtimeStatus[name]\n if (status === undefined) continue\n const existing = merged[name]\n const base =\n existing && typeof existing === \"object\"\n ? (existing as Record<string, unknown>)\n : {}\n merged[name] = { ...base, enabled: status === \"connected\" } as OpencodeServer\n }\n }\n\n // Translate every still-enabled server.\n const servers: Record<string, unknown> = {}\n for (const [name, spec] of Object.entries(merged)) {\n if (!spec || typeof spec !== \"object\") continue\n const translated = translateServer(name, spec as Record<string, unknown>)\n if (translated) servers[name] = translated\n }\n\n if (Object.keys(servers).length === 0) return null\n\n const body = JSON.stringify({ mcpServers: servers }, null, 2)\n const hash = crypto.createHash(\"sha256\").update(body).digest(\"hex\").slice(0, 12)\n const outPath = path.join(\n os.tmpdir(),\n `opencode-claude-code-mcp-${hash}.json`,\n )\n try {\n if (!fileExists(outPath)) {\n fs.writeFileSync(outPath, body, { encoding: \"utf8\", mode: 0o600 })\n }\n } catch (e) {\n log.warn(\"failed to write bridged MCP config\", {\n error: e instanceof Error ? e.message : String(e),\n })\n return null\n }\n\n log.info(\"bridged opencode MCP config\", {\n target: outPath,\n hash,\n servers: Object.keys(servers),\n })\n return { path: outPath, hash }\n}\n\n// Internal helpers exported for tests only.\nexport const __test = {\n deepMerge,\n mergeMcp,\n translateServer,\n detectWorktree,\n loadGlobalConfig,\n loadProjectFilesInDir,\n dotOpencodeDirs,\n}\n","import type { RuntimeMcpStatus } from \"./mcp-bridge.js\"\nimport { log } from \"./logger.js\"\n\n/**\n * Captured opencode SDK client from `PluginInput`. Lives in its own module\n * to break the cycle that would otherwise form between `index.ts` and\n * `claude-code-language-model.ts`. `null` until the plugin's `server`\n * factory runs (e.g. early provider lookups, direct AI-SDK use, tests).\n */\nlet opencodeClient:\n | { mcp?: { status?: () => Promise<{ data?: unknown; error?: unknown }> } }\n | null = null\n\nexport function setOpencodeClient(client: unknown): void {\n if (client && typeof client === \"object\") {\n opencodeClient = client as typeof opencodeClient\n }\n}\n\n/**\n * Snapshot opencode's current MCP runtime status so the bridge can overlay\n * UI-toggled state on top of disk config. Returns `undefined` on any\n * failure (no client captured, status call rejected, malformed response)\n * so the bridge falls back to disk-only.\n */\nexport async function getRuntimeMcpStatus(): Promise<\n RuntimeMcpStatus | undefined\n> {\n const client = opencodeClient\n if (!client?.mcp?.status) return undefined\n try {\n const res = await client.mcp.status()\n const data = (res as { data?: unknown }).data\n if (!data || typeof data !== \"object\") return undefined\n const out: RuntimeMcpStatus = {}\n for (const [name, entry] of Object.entries(data as Record<string, unknown>)) {\n if (entry && typeof entry === \"object\") {\n const status = (entry as { status?: unknown }).status\n if (typeof status === \"string\") out[name] = status\n }\n }\n return out\n } catch (err) {\n log.warn(\"failed to fetch opencode MCP runtime status\", {\n error: err instanceof Error ? err.message : String(err),\n })\n return undefined\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\"\nimport { createInterface } from \"node:readline\"\nimport { EventEmitter } from \"node:events\"\nimport { unlink } from \"node:fs/promises\"\nimport { log } from \"./logger.js\"\nimport type { ProxyMcpServer } from \"./proxy-mcp.js\"\n\nexport interface ActiveProcess {\n proc: ChildProcess\n lineEmitter: EventEmitter\n proxyServer?: ProxyMcpServer | null\n /**\n * Hash of the bridged opencode MCP config the process was spawned with.\n * `null` when the bridge produced nothing (no MCP servers). `undefined`\n * when the bridge was disabled. Used to detect mid-session config drift\n * and force a respawn.\n */\n mcpHash?: string | null\n /** Temp file holding `--append-system-prompt-file` content; unlinked on exit. */\n systemPromptFile?: string\n}\n\n// One active CLI process per session key. Keyed by a composite\n// (cwd + model + opencode session-affinity) so two chats don't race.\n// Iteration order is insertion order, which we refresh on access to\n// make this a poor-man's LRU; see `touch()` below.\nconst activeProcesses = new Map<string, ActiveProcess>()\nconst claudeSessions = new Map<string, string>()\n\n// Cap on live CLI subprocesses. Session-affinity-keyed entries accumulate\n// one-per-chat, so an unbounded map would leak processes as users open new\n// chats. This caps at a reasonable working-set and evicts the oldest.\nconst MAX_ACTIVE_PROCESSES = 16\n\nfunction touch(key: string): void {\n const existing = activeProcesses.get(key)\n if (existing) {\n activeProcesses.delete(key)\n activeProcesses.set(key, existing)\n }\n}\n\nfunction evictIfNeeded(): void {\n while (activeProcesses.size >= MAX_ACTIVE_PROCESSES) {\n const oldestKey = activeProcesses.keys().next().value\n if (!oldestKey) break\n log.info(\"evicting LRU claude process\", { sessionKey: oldestKey })\n deleteActiveProcess(oldestKey)\n }\n}\n\nexport function getActiveProcess(key: string): ActiveProcess | undefined {\n const ap = activeProcesses.get(key)\n if (ap) touch(key)\n return ap\n}\n\nexport function setActiveProcess(key: string, ap: ActiveProcess): void {\n activeProcesses.set(key, ap)\n}\n\nexport function deleteActiveProcess(key: string): void {\n const ap = activeProcesses.get(key)\n if (ap) {\n void ap.proxyServer?.close()\n ap.proc.kill()\n activeProcesses.delete(key)\n }\n}\n\nexport function getClaudeSessionId(key: string): string | undefined {\n return claudeSessions.get(key)\n}\n\nexport function setClaudeSessionId(key: string, sessionId: string): void {\n claudeSessions.set(key, sessionId)\n}\n\nexport function deleteClaudeSessionId(key: string): void {\n claudeSessions.delete(key)\n}\n\nexport function spawnClaudeProcess(\n cliPath: string,\n cliArgs: string[],\n cwd: string,\n sessionKey: string,\n proxyServer?: ProxyMcpServer | null,\n mcpHash?: string | null,\n systemPromptFile?: string,\n): ActiveProcess {\n evictIfNeeded()\n log.info(\"spawning new claude process\", { cliPath, cliArgs, cwd, sessionKey })\n\n const proc = spawn(cliPath, cliArgs, {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, TERM: \"xterm-256color\" },\n shell: process.platform === \"win32\",\n })\n\n const lineEmitter = new EventEmitter()\n\n const rl = createInterface({ input: proc.stdout! })\n rl.on(\"line\", (line: string) => {\n lineEmitter.emit(\"line\", line)\n })\n rl.on(\"close\", () => {\n lineEmitter.emit(\"close\")\n })\n\n const ap: ActiveProcess = {\n proc,\n lineEmitter,\n proxyServer: proxyServer ?? null,\n mcpHash,\n systemPromptFile,\n }\n activeProcesses.set(sessionKey, ap)\n\n // Baseline 'error' listener so Node doesn't throw when the process emits\n // an error between stream turns (no per-stream listener attached then).\n proc.on(\"error\", (err) => {\n log.error(\"claude process error\", { sessionKey, error: err.message })\n })\n\n proc.on(\"exit\", (code, signal) => {\n log.info(\"claude process exited\", { code, signal, sessionKey })\n void proxyServer?.close()\n if (systemPromptFile) {\n void unlink(systemPromptFile).catch(() => {})\n }\n activeProcesses.delete(sessionKey)\n if (code !== 0 && code !== null) {\n log.info(\"process exited with error, clearing session\", {\n code,\n sessionKey,\n })\n claudeSessions.delete(sessionKey)\n }\n })\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n const stderr = data.toString()\n log.debug(\"stderr\", { data: stderr.slice(0, 200) })\n\n if (\n stderr.includes(\"Session ID\") &&\n (stderr.includes(\"already in use\") ||\n stderr.includes(\"not found\") ||\n stderr.includes(\"invalid\"))\n ) {\n log.warn(\"claude session ID error, clearing session\", {\n sessionKey,\n error: stderr.slice(0, 200),\n })\n claudeSessions.delete(sessionKey)\n }\n })\n\n return ap\n}\n\nexport function buildCliArgs(opts: {\n sessionKey: string\n skipPermissions: boolean\n includeSessionId?: boolean\n model?: string\n permissionMode?: string\n mcpConfig?: string | string[]\n strictMcpConfig?: boolean\n disallowedTools?: string[]\n appendSystemPromptFile?: string\n}): string[] {\n const {\n sessionKey,\n skipPermissions,\n includeSessionId = true,\n model,\n permissionMode,\n mcpConfig,\n strictMcpConfig,\n disallowedTools,\n appendSystemPromptFile,\n } = opts\n const args = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n \"--verbose\",\n ]\n\n if (model) {\n args.push(\"--model\", model)\n }\n\n if (permissionMode) {\n args.push(\"--permission-mode\", permissionMode)\n }\n\n if (includeSessionId) {\n const sessionId = claudeSessions.get(sessionKey)\n if (sessionId && !activeProcesses.has(sessionKey)) {\n args.push(\"--session-id\", sessionId)\n }\n }\n\n if (mcpConfig) {\n const configs = Array.isArray(mcpConfig) ? mcpConfig : [mcpConfig]\n const filtered = configs.filter((c) => typeof c === \"string\" && c.length > 0)\n if (filtered.length > 0) {\n args.push(\"--mcp-config\", ...filtered)\n }\n }\n\n if (strictMcpConfig) {\n args.push(\"--strict-mcp-config\")\n }\n\n if (disallowedTools && disallowedTools.length > 0) {\n args.push(\"--disallowedTools\", ...disallowedTools)\n }\n\n if (appendSystemPromptFile) {\n args.push(\"--append-system-prompt-file\", appendSystemPromptFile)\n }\n\n if (skipPermissions) {\n args.push(\"--dangerously-skip-permissions\")\n }\n\n return args\n}\n\n/**\n * Build a session key that includes both cwd and model,\n * so different models get separate processes.\n */\nexport function sessionKey(cwd: string, modelId: string): string {\n return `${cwd}::${modelId}`\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\nimport * as crypto from \"node:crypto\"\nimport { EventEmitter } from \"node:events\"\nimport { log } from \"./logger.js\"\n\n/**\n * Minimal MCP HTTP server embedded in-process. Exposes a set of \"proxy\"\n * tools (Bash, Edit, Write, etc.) that Claude CLI calls when its built-in\n * equivalents are disabled via --disallowedTools. Our handler blocks until\n * an external broker resolves the call, then responds to Claude.\n *\n * Wire protocol: JSON-RPC 2.0 over plain HTTP POST to `/mcp`. MCP spec\n * also supports SSE streaming, but Claude's HTTP transport accepts single\n * JSON responses for short-lived tool calls, so we keep it simple.\n */\n\nexport interface ProxyMcpServer {\n url: string\n serverName: string\n tools: ProxyToolDef[]\n /** Fires when Claude invokes one of our proxy tools. The handler resolves\n * the returned pending call once a result is available. */\n calls: EventEmitter\n /** Write `--mcp-config <path>`-compatible scratch file and return its path. */\n configPath(): string\n close(): Promise<void>\n}\n\nexport interface ProxyToolDef {\n /** Raw name as seen by Claude once proxied: the MCP exposed tool name. */\n name: string\n description: string\n inputSchema: Record<string, unknown>\n}\n\nexport interface ProxyToolCall {\n id: string\n toolName: string\n input: Record<string, unknown>\n resolve: (result: ProxyToolResult) => void\n reject: (err: Error) => void\n}\n\nexport type ProxyToolResult =\n | { kind: \"text\"; text: string; isError?: boolean }\n | { kind: \"error\"; message: string }\n\nconst PROTOCOL_VERSION = \"2024-11-05\"\nconst SERVER_NAME = \"opencode_proxy\"\nexport const PROXY_TOOL_PREFIX = `mcp__${SERVER_NAME}__`\n\nexport const DEFAULT_PROXY_TOOLS: ProxyToolDef[] = [\n {\n name: \"bash\",\n description:\n \"Execute a shell command. Routed through opencode's bash tool so\" +\n \" permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to execute.\",\n },\n description: {\n type: \"string\",\n description: \"Short human-readable description of what the command does.\",\n },\n timeout: {\n type: \"number\",\n description: \"Optional timeout in milliseconds.\",\n },\n },\n required: [\"command\"],\n },\n },\n {\n name: \"write\",\n description:\n \"Write a file. Routed through opencode's write tool so permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n filePath: {\n type: \"string\",\n description: \"The file to write. Absolute paths are preferred.\",\n },\n content: {\n type: \"string\",\n description: \"The full content to write to the file.\",\n },\n },\n required: [\"filePath\", \"content\"],\n },\n },\n {\n name: \"edit\",\n description:\n \"Replace text in an existing file. Routed through opencode's edit tool so permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n filePath: {\n type: \"string\",\n description: \"The file to edit. Absolute paths are preferred.\",\n },\n oldString: {\n type: \"string\",\n description: \"The exact text to replace.\",\n },\n newString: {\n type: \"string\",\n description: \"The replacement text.\",\n },\n replaceAll: {\n type: \"boolean\",\n description: \"Replace all occurrences instead of just the first one.\",\n },\n },\n required: [\"filePath\", \"oldString\", \"newString\"],\n },\n },\n {\n name: \"webfetch\",\n description:\n \"Fetch content from a URL. Routed through opencode's webfetch tool so\" +\n \" permission prompts flow through opencode's UI. Returns the page\" +\n \" content in the requested format.\",\n inputSchema: {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL to fetch content from. Must start with http:// or https://.\",\n },\n format: {\n type: \"string\",\n enum: [\"text\", \"markdown\", \"html\"],\n description:\n \"The format to return the content in. Defaults to markdown.\",\n },\n timeout: {\n type: \"number\",\n description: \"Optional timeout in seconds (max 120).\",\n },\n },\n required: [\"url\"],\n },\n },\n]\n\nexport async function createProxyMcpServer(\n tools: ProxyToolDef[] = DEFAULT_PROXY_TOOLS,\n): Promise<ProxyMcpServer> {\n const calls = new EventEmitter()\n const pending = new Map<string, ProxyToolCall>()\n\n const server = createServer(async (req, res) => {\n if (req.method !== \"POST\" || !req.url?.startsWith(\"/mcp\")) {\n res.statusCode = 404\n res.end()\n return\n }\n try {\n const body = await readBody(req)\n const request = JSON.parse(body) as {\n jsonrpc?: string\n id?: number | string | null\n method?: string\n params?: Record<string, unknown>\n }\n\n if (request?.jsonrpc !== \"2.0\" || typeof request.method !== \"string\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request?.id ?? null,\n error: { code: -32600, message: \"Invalid request\" },\n })\n return\n }\n\n log.debug(\"proxy-mcp request\", {\n method: request.method,\n id: request.id,\n })\n\n if (request.method === \"initialize\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: { tools: {} },\n serverInfo: {\n name: SERVER_NAME,\n version: \"0.1.0\",\n },\n },\n })\n return\n }\n\n if (request.method === \"notifications/initialized\") {\n res.statusCode = 204\n res.end()\n return\n }\n\n if (request.method === \"tools/list\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n },\n })\n return\n }\n\n if (request.method === \"tools/call\") {\n const params = request.params ?? {}\n const toolName = String(params.name ?? \"\")\n const input = (params.arguments ?? {}) as Record<string, unknown>\n\n if (!tools.some((t) => t.name === toolName)) {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: -32601,\n message: `Unknown proxy tool: ${toolName}`,\n },\n })\n return\n }\n\n const callId = crypto.randomUUID()\n log.info(\"proxy-mcp tool call received\", {\n callId,\n toolName,\n hasInput: input != null,\n })\n\n const result = await new Promise<ProxyToolResult>(\n (resolve, reject) => {\n const entry: ProxyToolCall = {\n id: callId,\n toolName,\n input,\n resolve,\n reject,\n }\n pending.set(callId, entry)\n calls.emit(\"call\", entry)\n },\n ).finally(() => {\n pending.delete(callId)\n })\n\n if (result.kind === \"error\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: -32000,\n message: result.message,\n },\n })\n return\n }\n\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n content: [{ type: \"text\", text: result.text }],\n isError: result.isError === true,\n },\n })\n return\n }\n\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: { code: -32601, message: `Unknown method: ${request.method}` },\n })\n } catch (error) {\n log.warn(\"proxy-mcp error handling request\", {\n error: error instanceof Error ? error.message : String(error),\n })\n try {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : \"Internal error\",\n },\n })\n } catch {\n try {\n res.statusCode = 500\n res.end()\n } catch {}\n }\n }\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n\n const addr = server.address() as AddressInfo | null\n if (!addr) {\n server.close()\n throw new Error(\"Failed to bind proxy MCP server\")\n }\n\n const url = `http://127.0.0.1:${addr.port}/mcp`\n\n log.info(\"proxy-mcp server started\", {\n url,\n tools: tools.map((t) => t.name),\n })\n\n let configFilePath: string | null = null\n\n const api: ProxyMcpServer = {\n url,\n serverName: SERVER_NAME,\n tools,\n calls,\n configPath() {\n if (configFilePath) return configFilePath\n const body = JSON.stringify(\n {\n mcpServers: {\n [SERVER_NAME]: {\n type: \"http\",\n url,\n },\n },\n },\n null,\n 2,\n )\n const hash = crypto\n .createHash(\"sha256\")\n .update(body)\n .digest(\"hex\")\n .slice(0, 12)\n const outPath = path.join(\n os.tmpdir(),\n `opencode-claude-code-proxy-${hash}.json`,\n )\n fs.writeFileSync(outPath, body, { encoding: \"utf8\", mode: 0o600 })\n configFilePath = outPath\n return outPath\n },\n async close() {\n for (const entry of pending.values()) {\n entry.reject(new Error(\"proxy MCP server closed\"))\n }\n pending.clear()\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n },\n }\n\n return api\n}\n\n/** CLI-ready list of Claude tool names to disable, for each proxied tool. */\nexport function disallowedToolFlags(tools: ProxyToolDef[]): string[] {\n // Map our lowercase MCP tool names to Claude's capitalized internal names.\n const nameMap: Record<string, string> = {\n bash: \"Bash\",\n read: \"Read\",\n write: \"Write\",\n edit: \"Edit\",\n glob: \"Glob\",\n grep: \"Grep\",\n webfetch: \"WebFetch\",\n }\n const out: string[] = []\n for (const t of tools) {\n const mapped = nameMap[t.name.toLowerCase()]\n if (mapped) out.push(mapped)\n }\n return out\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk))\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")))\n req.on(\"error\", reject)\n })\n}\n\nfunction writeJson(res: ServerResponse, body: unknown): void {\n const payload = JSON.stringify(body)\n res.statusCode = 200\n res.setHeader(\"Content-Type\", \"application/json\")\n res.setHeader(\"Content-Length\", Buffer.byteLength(payload).toString())\n res.end(payload)\n}\n","import { EventEmitter } from \"node:events\"\nimport type { ProxyToolCall, ProxyToolResult } from \"./proxy-mcp.js\"\nimport { log } from \"./logger.js\"\n\nexport interface PendingProxyCall {\n sessionKey: string\n toolCallId: string\n toolName: string\n input: Record<string, unknown>\n}\n\ntype InternalPending = PendingProxyCall & {\n resolve(result: ProxyToolResult): void\n reject(error: Error): void\n}\n\nconst pendingBySession = new Map<string, InternalPending>()\nconst emitter = new EventEmitter()\n\nfunction eventName(sessionKey: string) {\n return `pending:${sessionKey}`\n}\n\nexport function onPendingProxyCall(\n sessionKey: string,\n handler: (call: PendingProxyCall) => void,\n): () => void {\n const name = eventName(sessionKey)\n emitter.on(name, handler)\n return () => emitter.off(name, handler)\n}\n\nexport function queuePendingProxyCall(\n sessionKey: string,\n call: ProxyToolCall,\n): PendingProxyCall {\n const existing = pendingBySession.get(sessionKey)\n if (existing) {\n existing.reject(\n new Error(`Another proxy tool call is already pending for ${sessionKey}`),\n )\n pendingBySession.delete(sessionKey)\n }\n\n const pending: InternalPending = {\n sessionKey,\n toolCallId: call.id,\n toolName: call.toolName,\n input: call.input,\n resolve: call.resolve,\n reject: call.reject,\n }\n pendingBySession.set(sessionKey, pending)\n emitter.emit(eventName(sessionKey), pending)\n log.info(\"queued pending proxy call\", {\n sessionKey,\n toolCallId: call.id,\n toolName: call.toolName,\n })\n return pending\n}\n\nexport function getPendingProxyCall(\n sessionKey: string,\n): PendingProxyCall | undefined {\n return pendingBySession.get(sessionKey)\n}\n\nexport function resolvePendingProxyCall(\n sessionKey: string,\n result: ProxyToolResult,\n): boolean {\n const pending = pendingBySession.get(sessionKey)\n if (!pending) return false\n pendingBySession.delete(sessionKey)\n pending.resolve(result)\n log.info(\"resolved pending proxy call\", {\n sessionKey,\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n })\n return true\n}\n\nexport function rejectPendingProxyCall(\n sessionKey: string,\n error: Error,\n): boolean {\n const pending = pendingBySession.get(sessionKey)\n if (!pending) return false\n pendingBySession.delete(sessionKey)\n pending.reject(error)\n log.warn(\"rejected pending proxy call\", {\n sessionKey,\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n error: error.message,\n })\n return true\n}\n","import type { OpenCodeModel } from \"./opencode-types.js\"\n\nconst PROVIDER_ID = \"claude-code\"\nconst NPM = \"@khalilgharbaoui/opencode-claude-code-plugin\"\n\nconst reasoningVariants: Record<string, Record<string, unknown>> = {\n low: { reasoningEffort: \"low\" },\n medium: { reasoningEffort: \"medium\" },\n high: { reasoningEffort: \"high\" },\n xhigh: { reasoningEffort: \"xhigh\" },\n max: { reasoningEffort: \"max\" },\n}\n\nconst baseCapabilities = {\n temperature: false,\n attachment: true,\n toolcall: true,\n input: { text: true, audio: false, image: true, video: false, pdf: false },\n output: { text: true, audio: false, image: false, video: false, pdf: false },\n interleaved: false as const,\n}\n\nfunction defineModel(opts: {\n id: string\n name: string\n family: string\n reasoning: boolean\n context: number\n output: number\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number }\n releaseDate: string\n status?: OpenCodeModel[\"status\"]\n}): OpenCodeModel {\n return {\n id: opts.id,\n providerID: PROVIDER_ID,\n api: { id: opts.id, url: \"\", npm: NPM },\n name: opts.name,\n family: opts.family,\n capabilities: { ...baseCapabilities, reasoning: opts.reasoning },\n cost: {\n input: opts.cost.input,\n output: opts.cost.output,\n cache: { read: opts.cost.cacheRead, write: opts.cost.cacheWrite },\n },\n limit: { context: opts.context, output: opts.output },\n status: opts.status ?? \"active\",\n options: {},\n headers: {},\n release_date: opts.releaseDate,\n variants: opts.reasoning ? reasoningVariants : undefined,\n }\n}\n\n// Per-token costs derived from Anthropic per-million-token pricing\nconst haikuCost = { input: 1e-6, output: 5e-6, cacheRead: 1e-7, cacheWrite: 1.25e-6 }\nconst sonnetCost = { input: 3e-6, output: 15e-6, cacheRead: 3e-7, cacheWrite: 3.75e-6 }\nconst opusCost = { input: 15e-6, output: 75e-6, cacheRead: 1.5e-6, cacheWrite: 18.75e-6 }\n\n/**\n * Convert an OpenCodeModel to the flat config schema that OpenCode's\n * provider.ts config parser expects (model.temperature, model.reasoning,\n * model.cost.cache_read, model.modalities, etc.).\n */\nexport function toConfigModel(model: OpenCodeModel): Record<string, unknown> {\n const inputMods: string[] = []\n const outputMods: string[] = []\n for (const [k, v] of Object.entries(model.capabilities.input)) {\n if (v) inputMods.push(k)\n }\n for (const [k, v] of Object.entries(model.capabilities.output)) {\n if (v) outputMods.push(k)\n }\n\n return {\n id: model.api.id,\n name: model.name,\n status: model.status,\n family: model.family ?? \"\",\n release_date: model.release_date,\n\n temperature: model.capabilities.temperature,\n reasoning: model.capabilities.reasoning,\n attachment: model.capabilities.attachment,\n tool_call: model.capabilities.toolcall,\n modalities: { input: inputMods, output: outputMods },\n interleaved: model.capabilities.interleaved,\n\n cost: {\n input: model.cost.input,\n output: model.cost.output,\n cache_read: model.cost.cache.read,\n cache_write: model.cost.cache.write,\n },\n\n limit: model.limit,\n options: model.options,\n headers: model.headers,\n variants: model.variants,\n }\n}\n\nexport const defaultModels: Record<string, OpenCodeModel> = {\n \"claude-haiku-4-5\": defineModel({\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n family: \"haiku\",\n reasoning: false,\n context: 200_000,\n output: 8_192,\n cost: haikuCost,\n releaseDate: \"2024-10-22\",\n }),\n \"claude-sonnet-4-5\": defineModel({\n id: \"claude-sonnet-4-5\",\n name: \"Claude Sonnet 4.5\",\n family: \"sonnet\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: sonnetCost,\n releaseDate: \"2025-04-14\",\n }),\n \"claude-sonnet-4-6\": defineModel({\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n family: \"sonnet\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: sonnetCost,\n releaseDate: \"2025-06-19\",\n }),\n \"claude-opus-4-5\": defineModel({\n id: \"claude-opus-4-5\",\n name: \"Claude Opus 4.5\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-04-14\",\n }),\n \"claude-opus-4-6\": defineModel({\n id: \"claude-opus-4-6\",\n name: \"Claude Opus 4.6\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-06-19\",\n }),\n \"claude-opus-4-7\": defineModel({\n id: \"claude-opus-4-7\",\n name: \"Claude Opus 4.7\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-07-16\",\n }),\n}\n","import { chmod, lstat, mkdir, readlink, symlink, writeFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { log } from \"./logger.js\"\n\nexport const BASE_PROVIDER_ID = \"claude-code\"\nexport const DEFAULT_ACCOUNT = \"default\"\n\nconst SHARED_CAPABILITY_ITEMS = [\n \"CLAUDE.md\",\n \"settings.json\",\n \"skills\",\n \"agents\",\n \"commands\",\n \"plugins\",\n]\n\nexport function normalizeAccountName(account: string): string {\n return account\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nexport function resolveAccounts(value: unknown): string[] | null {\n if (!Array.isArray(value)) return null\n\n const accounts = value\n .map((account) => normalizeAccountName(String(account)))\n .filter(Boolean)\n\n return Array.from(new Set([DEFAULT_ACCOUNT, ...accounts]))\n}\n\nexport function accountProviderId(account: string): string {\n return `${BASE_PROVIDER_ID}-${normalizeAccountName(account)}`\n}\n\nexport function accountDisplayName(account: string): string {\n return `Claude Code (${titleizeAccount(account)})`\n}\n\nexport function accountModelSuffix(account: string): string | undefined {\n const normalized = normalizeAccountName(account)\n return normalized === DEFAULT_ACCOUNT ? undefined : normalized\n}\n\nexport function accountConfigDir(account: string): string | undefined {\n const normalized = normalizeAccountName(account)\n\n if (!normalized || normalized === DEFAULT_ACCOUNT) return undefined\n\n return `~/.claude-${normalized}`\n}\n\nexport function expandHome(value: string): string {\n const home = process.env.HOME ?? process.env.USERPROFILE\n\n if (value === \"~\") return home ?? value\n\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\n return home ? path.join(home, value.slice(2)) : value\n }\n\n return value\n}\n\nexport async function ensureAccountRuntime(\n account: string,\n baseCliPath: string,\n): Promise<{ cliPath: string; configDir?: string }> {\n const configDir = accountConfigDir(account)\n\n if (!configDir) return { cliPath: baseCliPath }\n\n const expandedConfigDir = expandHome(configDir)\n await mkdir(expandedConfigDir, { recursive: true })\n\n try {\n await ensureSharedCapabilities(expandedConfigDir)\n } catch (err) {\n log.warn(\"failed to symlink shared capabilities; continuing anyway\", {\n account,\n configDir: expandedConfigDir,\n error: String(err),\n })\n }\n\n const cliPath = await writeAccountWrapper(\n normalizeAccountName(account),\n baseCliPath,\n expandedConfigDir,\n )\n\n return { cliPath, configDir }\n}\n\nasync function ensureSharedCapabilities(targetRoot: string): Promise<void> {\n const sourceRoot = expandHome(\"~/.claude\")\n\n for (const item of SHARED_CAPABILITY_ITEMS) {\n await ensureSharedCapabilityItem(sourceRoot, targetRoot, item)\n }\n}\n\nasync function ensureSharedCapabilityItem(\n sourceRoot: string,\n targetRoot: string,\n item: string,\n): Promise<void> {\n const source = path.join(sourceRoot, item)\n const target = path.join(targetRoot, item)\n\n let sourceStat\n try {\n sourceStat = await lstat(source)\n } catch {\n return\n }\n\n try {\n const targetStat = await lstat(target)\n\n if (targetStat.isSymbolicLink()) {\n const current = await readlink(target)\n const resolvedCurrent = path.resolve(path.dirname(target), current)\n const resolvedSource = path.resolve(source)\n\n if (resolvedCurrent === resolvedSource) return\n }\n\n log.warn(\"shared Claude capability already exists; leaving untouched\", {\n item,\n target,\n source,\n })\n\n return\n } catch {\n // Missing target is expected.\n }\n\n const type = sourceStat.isDirectory()\n ? process.platform === \"win32\"\n ? \"junction\"\n : \"dir\"\n : \"file\"\n\n await symlink(source, target, type)\n}\n\nasync function writeAccountWrapper(\n account: string,\n baseCliPath: string,\n configDir: string,\n): Promise<string> {\n const cacheRoot = path.join(\n process.env.XDG_CACHE_HOME ?? expandHome(\"~/.cache\"),\n \"opencode-claude-code-plugin\",\n )\n const wrapperPath = path.join(cacheRoot, `claude-${account}`)\n const suffix = `@${account}`\n\n await mkdir(cacheRoot, { recursive: true })\n\n const script = `#!/usr/bin/env bash\nset -euo pipefail\n\nargs=()\nwhile [[ $# -gt 0 ]]; do\n if [[ \"$1\" == \"--model\" && $# -ge 2 ]]; then\n model=\"$2\"\n if [[ \"$model\" == *${shellDoubleQuote(suffix)} ]]; then\n model=\"\\${model%${shellDoubleQuote(suffix)}}\"\n fi\n args+=(\"$1\" \"$model\")\n shift 2\n else\n args+=(\"$1\")\n shift\n fi\ndone\n\nexport CLAUDE_CONFIG_DIR=${shellSingleQuote(configDir)}\nexec ${shellSingleQuote(baseCliPath)} \"\\${args[@]}\"\n`\n\n await writeFile(wrapperPath, script, \"utf8\")\n await chmod(wrapperPath, 0o755)\n\n return wrapperPath\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction shellDoubleQuote(value: string): string {\n return value.replace(/[$`\"\\\\]/g, \"\\\\$&\")\n}\n\nfunction titleizeAccount(account: string): string {\n return normalizeAccountName(account)\n .split(\"-\")\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \")\n}\n","// Removes a stale unscoped `opencode-claude-code-plugin` install left in\n// opencode's plugin cache by older configs. The unscoped name is a different\n// artifact than this scoped plugin and shadows it when both coexist.\n// Disable with OPENCODE_CLAUDE_CODE_PLUGIN_NO_CLEANUP=1.\n\nimport {\n existsSync,\n readFileSync,\n realpathSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { log } from \"./logger.js\"\n\nconst STALE_PACKAGE_NAME = \"opencode-claude-code-plugin\"\nconst SUSPECT_DESCRIPTION_TOKEN = \"Claude Code\"\n\nlet alreadyRan = false\n\nfunction candidateCacheRoots(): string[] {\n const xdg = process.env.XDG_CACHE_HOME\n return [\n xdg ? join(xdg, \"opencode\") : null,\n join(homedir(), \".cache\", \"opencode\"),\n join(homedir(), \"Library\", \"Caches\", \"opencode\"),\n ].filter((p): p is string => Boolean(p))\n}\n\nfunction userOpencodeJsonPath(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\")\n return join(xdgConfig, \"opencode\", \"opencode.json\")\n}\n\nfunction userIntendsToUseUnscoped(): boolean {\n const cfg = userOpencodeJsonPath()\n if (!existsSync(cfg)) return false\n try {\n const json = JSON.parse(readFileSync(cfg, \"utf8\"))\n const plugins: unknown = json.plugin\n if (!Array.isArray(plugins)) return false\n return plugins.some(\n (entry) =>\n typeof entry === \"string\" &&\n /^opencode-claude-code-plugin(@[^/]+)?$/.test(entry),\n )\n } catch {\n return false\n }\n}\n\nfunction ourLoadedDir(): string | null {\n try {\n const filePath = fileURLToPath(import.meta.url)\n return realpathSync(resolve(filePath, \"..\", \"..\"))\n } catch {\n return null\n }\n}\n\nexport function cleanupStaleUnscopedInstall(): void {\n if (alreadyRan) return\n alreadyRan = true\n\n if (process.env.OPENCODE_CLAUDE_CODE_PLUGIN_NO_CLEANUP === \"1\") return\n if (userIntendsToUseUnscoped()) return\n\n const ourDir = ourLoadedDir()\n\n for (const cacheRoot of candidateCacheRoots()) {\n try {\n cleanupOne(cacheRoot, ourDir)\n } catch (err) {\n log.warn(\"cleanup-stale: error processing cache root\", {\n cacheRoot,\n error: String(err),\n })\n }\n }\n}\n\nfunction cleanupOne(cacheRoot: string, ourDir: string | null): void {\n if (!existsSync(cacheRoot)) return\n\n const stalePath = join(cacheRoot, \"node_modules\", STALE_PACKAGE_NAME)\n if (!existsSync(stalePath)) return\n\n // Don't self-delete if we are the unscoped install.\n let realStalePath = stalePath\n try {\n realStalePath = realpathSync(stalePath)\n } catch {\n // ignore\n }\n if (ourDir && realStalePath === ourDir) return\n\n // Verify identity before removing.\n const pkgJsonPath = join(stalePath, \"package.json\")\n if (!existsSync(pkgJsonPath)) return\n let pkg: { name?: string; description?: string } = {}\n try {\n pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\"))\n } catch {\n return\n }\n if (pkg.name !== STALE_PACKAGE_NAME) return\n if (!pkg.description?.includes(SUSPECT_DESCRIPTION_TOKEN)) return\n\n log.info(\"cleanup-stale: removing unscoped install\", { stalePath })\n try {\n rmSync(stalePath, { recursive: true, force: true })\n } catch (err) {\n log.warn(\"cleanup-stale: rmSync failed\", {\n stalePath,\n error: String(err),\n })\n return\n }\n\n // Drop the dep from the cache root's package.json so opencode's installer\n // doesn't reinstate it on its next pass. Lockfile is left alone; bun\n // reconciles against package.json on the next install.\n const cachePkgJson = join(cacheRoot, \"package.json\")\n if (!existsSync(cachePkgJson)) return\n try {\n const cfg = JSON.parse(readFileSync(cachePkgJson, \"utf8\"))\n if (cfg?.dependencies?.[STALE_PACKAGE_NAME]) {\n delete cfg.dependencies[STALE_PACKAGE_NAME]\n writeFileSync(cachePkgJson, JSON.stringify(cfg, null, 2) + \"\\n\")\n log.info(\"cleanup-stale: pruned dep from cache package.json\")\n }\n } catch (err) {\n log.warn(\"cleanup-stale: cache package.json update failed\", {\n error: String(err),\n })\n }\n}\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\"\nimport { ClaudeCodeLanguageModel } from \"./claude-code-language-model.js\"\nimport { defaultModels, toConfigModel } from \"./models.js\"\nimport type { OpenCodeModel, OpenCodePlugin, OpenCodeProvider } from \"./opencode-types.js\"\nimport type { ClaudeCodeProviderSettings } from \"./types.js\"\nimport {\n BASE_PROVIDER_ID,\n accountDisplayName,\n accountModelSuffix,\n accountProviderId,\n ensureAccountRuntime,\n resolveAccounts,\n} from \"./accounts.js\"\nimport { cleanupStaleUnscopedInstall } from \"./cleanup-stale.js\"\nimport { log } from \"./logger.js\"\nimport { setOpencodeClient } from \"./runtime-status.js\"\n\nexport interface ClaudeCodeProvider {\n specificationVersion: \"v3\"\n (modelId: string): LanguageModelV3\n languageModel(modelId: string): LanguageModelV3\n}\n\nexport function createClaudeCode(\n settings: ClaudeCodeProviderSettings = {},\n): ClaudeCodeProvider {\n const cliPath =\n settings.cliPath ?? process.env.CLAUDE_CLI_PATH ?? \"claude\"\n const providerName = settings.providerID ?? settings.name ?? \"claude-code\"\n const proxyTools = settings.proxyTools ?? [\"Bash\", \"Edit\", \"Write\", \"WebFetch\"]\n\n const createModel = (modelId: string): LanguageModelV3 => {\n return new ClaudeCodeLanguageModel(modelId, {\n provider: providerName,\n cliPath,\n cwd: settings.cwd,\n account: settings.account,\n configDir: settings.configDir,\n providerID: settings.providerID,\n skipPermissions: settings.skipPermissions ?? true,\n permissionMode: settings.permissionMode,\n mcpConfig: settings.mcpConfig,\n strictMcpConfig: settings.strictMcpConfig,\n bridgeOpencodeMcp: settings.bridgeOpencodeMcp ?? true,\n controlRequestBehavior: settings.controlRequestBehavior ?? \"allow\",\n controlRequestToolBehaviors: settings.controlRequestToolBehaviors,\n controlRequestDenyMessage: settings.controlRequestDenyMessage,\n proxyTools,\n webSearch: settings.webSearch,\n hotReloadMcp: settings.hotReloadMcp ?? true,\n })\n }\n\n const provider = function (modelId: string) {\n return createModel(modelId)\n } as ClaudeCodeProvider\n\n provider.specificationVersion = \"v3\"\n provider.languageModel = createModel\n\n return provider\n}\n\n// ---------------------------------------------------------------------------\n// OpenCode plugin interface\n// ---------------------------------------------------------------------------\n\nconst PROVIDER_ID = BASE_PROVIDER_ID\nconst PACKAGE_NPM = \"@khalilgharbaoui/opencode-claude-code-plugin\"\n\nfunction pluginEntrypoint(): string {\n return import.meta.url.startsWith(\"file:\") ? import.meta.url : PACKAGE_NPM\n}\n\nfunction cleanProviderOptions(\n options: Record<string, unknown> = {},\n): Record<string, unknown> {\n const result = { ...options }\n delete result.accounts\n return result\n}\n\nfunction mergeDefaultVariants(models: Record<string, unknown> = {}) {\n const result = { ...models } as Record<string, Record<string, unknown>>\n\n for (const [id, model] of Object.entries(defaultModels)) {\n if (!model.variants) continue\n\n const existing =\n result[id] && typeof result[id] === \"object\" ? result[id] : {}\n const variants =\n existing.variants && typeof existing.variants === \"object\"\n ? (existing.variants as Record<string, Record<string, unknown>>)\n : {}\n\n result[id] = {\n ...existing,\n variants: {\n ...model.variants,\n ...variants,\n },\n }\n }\n\n return result\n}\n\nfunction defaultModelsForProvider(\n providerModels: OpenCodeProvider[\"models\"],\n providerID = PROVIDER_ID,\n modelSuffix?: string,\n) {\n const models = Object.fromEntries(\n Object.entries(defaultModels).map(([id, model]) => {\n const modelId = modelSuffix ? `${id}@${modelSuffix}` : id\n const existing = providerModels[id] ?? providerModels[modelId]\n return [\n modelId,\n {\n ...model,\n id: modelId,\n providerID,\n api: {\n ...model.api,\n id: modelId,\n npm: existing?.api?.npm ?? model.api.npm,\n url: existing?.api?.url ?? model.api.url,\n },\n },\n ]\n }),\n )\n\n for (const [id, model] of Object.entries(providerModels)) {\n if (!(id in models)) {\n models[id] = {\n ...model,\n providerID,\n }\n }\n }\n\n return models\n}\n\n/**\n * Build models in OpenCode's config schema format (flat properties like\n * `temperature`, `reasoning`, `cost.cache_read`, `modalities`, etc.)\n * so the config-path provider loader parses them correctly.\n */\nfunction configModelsForProvider(\n providerModels: OpenCodeProvider[\"models\"],\n providerID: string,\n modelSuffix?: string,\n): Record<string, Record<string, unknown>> {\n const models: Record<string, Record<string, unknown>> = {}\n\n for (const [id, model] of Object.entries(defaultModels)) {\n const modelId = modelSuffix ? `${id}@${modelSuffix}` : id\n const existing = providerModels[id] ?? providerModels[modelId]\n const full: OpenCodeModel = {\n ...model,\n id: modelId,\n providerID,\n api: {\n ...model.api,\n id: modelId,\n npm: existing?.api?.npm ?? model.api.npm,\n url: existing?.api?.url ?? model.api.url,\n },\n }\n models[modelId] = toConfigModel(full)\n }\n\n for (const [id, model] of Object.entries(providerModels)) {\n if (!(id in models)) {\n models[id] = toConfigModel({ ...model, providerID } as OpenCodeModel)\n }\n }\n\n return models\n}\n\nasync function providerConfig(\n existing: {\n name?: string\n npm?: string\n options?: Record<string, unknown>\n models?: Record<string, unknown>\n } | undefined,\n providerID = PROVIDER_ID,\n optionDefaults: Record<string, unknown> = {},\n displayName?: string,\n) {\n const mergedOptions: Record<string, unknown> = {\n cliPath: \"claude\",\n proxyTools: [\"Bash\", \"Edit\", \"Write\", \"WebFetch\"],\n ...optionDefaults,\n ...cleanProviderOptions(existing?.options),\n providerID,\n }\n\n const cliPath = String(mergedOptions.cliPath ?? \"claude\")\n const account =\n typeof mergedOptions.account === \"string\" ? mergedOptions.account : undefined\n const runtime = account\n ? await ensureAccountRuntime(account, cliPath)\n : { cliPath }\n\n return {\n name: displayName ?? existing?.name,\n npm: existing?.npm ?? pluginEntrypoint(),\n options: {\n ...mergedOptions,\n ...runtime,\n },\n models: mergeDefaultVariants(existing?.models),\n }\n}\n\nasync function expandAccountProviders(config: {\n provider?: Record<\n string,\n {\n name?: string\n npm?: string\n options?: Record<string, unknown>\n models?: Record<string, unknown>\n }\n >\n}): Promise<boolean> {\n const seed = config.provider?.[PROVIDER_ID]\n const accounts = resolveAccounts(seed?.options?.accounts)\n\n if (!accounts) return false\n\n config.provider ??= {}\n\n const seedOptions = cleanProviderOptions(seed?.options)\n let expandedCount = 0\n\n for (const account of accounts) {\n const providerID = accountProviderId(account)\n try {\n const existing = config.provider[providerID]\n const modelSuffix = accountModelSuffix(account)\n\n config.provider[providerID] = {\n ...existing,\n ...(await providerConfig(\n existing,\n providerID,\n {\n ...seedOptions,\n account,\n },\n accountDisplayName(account),\n )),\n models: configModelsForProvider(\n (existing?.models ?? seed?.models ?? {}) as OpenCodeProvider[\"models\"],\n providerID,\n modelSuffix,\n ),\n }\n expandedCount++\n } catch (err) {\n log.error(\"failed to expand account provider\", {\n account,\n providerID,\n error: String(err),\n })\n }\n }\n\n if (expandedCount > 0) {\n delete config.provider[PROVIDER_ID]\n }\n\n return expandedCount > 0\n}\n\nconst server: OpenCodePlugin = async (input) => {\n cleanupStaleUnscopedInstall()\n\n // Capture the SDK client so the language model can query opencode's\n // in-memory MCP state per-turn for the runtime overlay. `input` is\n // `unknown` here (kept loose since opencode adds fields over time);\n // narrow defensively.\n if (input && typeof input === \"object\" && \"client\" in input) {\n setOpencodeClient((input as { client?: unknown }).client)\n }\n\n return {\n config: async (config) => {\n config.provider ??= {}\n\n const expanded = await expandAccountProviders(config)\n if (expanded) {\n const registered = Object.entries(config.provider)\n .filter(([id]) => id === PROVIDER_ID || id.startsWith(`${PROVIDER_ID}-`))\n .map(([id, p]) => ({ id, name: p?.name ?? id }))\n log.notice(\"registered claude-code providers\", { providers: registered })\n return\n }\n\n const existing = config.provider[PROVIDER_ID]\n config.provider[PROVIDER_ID] = {\n ...existing,\n ...(await providerConfig(existing)),\n }\n log.notice(\"registered claude-code provider\", {\n id: PROVIDER_ID,\n name: config.provider[PROVIDER_ID]?.name ?? PROVIDER_ID,\n })\n },\n // No `event` hook: MCP config drift is detected at turn start by the\n // hot-reload check in `claude-code-language-model.ts`, which respawns\n // claude safely between turns. Eviction on `global.disposed` would kill\n // an in-flight stream and abort the user's current turn.\n provider: {\n id: PROVIDER_ID,\n models: async (provider) => defaultModelsForProvider(provider.models),\n },\n }\n}\n\nexport default {\n id: \"@khalilgharbaoui/opencode-claude-code-plugin\",\n server,\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport { ClaudeCodeLanguageModel } from \"./claude-code-language-model.js\"\nexport { bridgeOpencodeMcp } from \"./mcp-bridge.js\"\nexport { defaultModels } from \"./models.js\"\nexport type {\n ClaudeCodeConfig,\n ClaudeCodeProviderSettings,\n ClaudeStreamMessage,\n} from \"./types.js\"\nexport type { OpenCodeHooks, OpenCodeModel, OpenCodePlugin } from \"./opencode-types.js\"\n"],"mappings":"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","names":["sessionKey","fs","path","os","crypto","EventEmitter","EventEmitter","server","resolve","EventEmitter","EventEmitter","sessionKey","readFileSync","writeFileSync","unlink","homedir","tmpdir","randomUUID","dirname","join","path","spawn","createInterface","resolve","stream","path","path","existsSync","readFileSync","writeFileSync","homedir","join","resolve","join","homedir","existsSync","readFileSync","resolve","writeFileSync","PROVIDER_ID"]}
|
|
1
|
+
{"version":3,"sources":["../src/claude-code-language-model.ts","../src/logger.ts","../src/tool-mapping.ts","../src/message-builder.ts","../src/mcp-bridge.ts","../src/runtime-status.ts","../src/session-manager.ts","../src/proxy-mcp.ts","../src/proxy-broker.ts","../src/models.ts","../src/accounts.ts","../src/cleanup-stale.ts","../src/index.ts"],"sourcesContent":["import type {\n LanguageModelV3,\n LanguageModelV3CallOptions,\n LanguageModelV3Content,\n LanguageModelV3FinishReason,\n LanguageModelV3StreamPart,\n LanguageModelV3Usage,\n SharedV3Warning,\n} from \"@ai-sdk/provider\"\nimport { generateId } from \"@ai-sdk/provider-utils\"\nimport type {\n ClaudeCodeConfig,\n ControlRequestBehavior,\n ClaudeStreamMessage,\n ReasoningEffort,\n} from \"./types.js\"\nimport { mapTool } from \"./tool-mapping.js\"\nimport { getClaudeUserMessage } from \"./message-builder.js\"\nimport { bridgeOpencodeMcp, type RuntimeMcpStatus } from \"./mcp-bridge.js\"\nimport { getRuntimeMcpStatus } from \"./runtime-status.js\"\nimport {\n getActiveProcess,\n spawnClaudeProcess,\n buildCliArgs,\n setClaudeSessionId,\n getClaudeSessionId,\n deleteClaudeSessionId,\n deleteActiveProcess,\n sessionKey,\n} from \"./session-manager.js\"\nimport { log } from \"./logger.js\"\nimport {\n createProxyMcpServer,\n disallowedToolFlags,\n DEFAULT_PROXY_TOOLS,\n PROXY_TOOL_PREFIX,\n type ProxyMcpServer,\n type ProxyToolCall,\n type ProxyToolDef,\n type ProxyToolResult,\n} from \"./proxy-mcp.js\"\nimport {\n getPendingProxyCall,\n onPendingProxyCall,\n queuePendingProxyCall,\n resolvePendingProxyCall,\n rejectPendingProxyCall,\n type PendingProxyCall,\n} from \"./proxy-broker.js\"\nimport { readFileSync, writeFileSync } from \"node:fs\"\nimport { unlink } from \"node:fs/promises\"\nimport { homedir, tmpdir } from \"node:os\"\nimport { randomUUID } from \"node:crypto\"\nimport { dirname, join } from \"node:path\"\n\nfunction readPromptFileIfPresent(path: string): string | undefined {\n try {\n const content = readFileSync(path, \"utf8\").trim()\n return content || undefined\n } catch {\n return undefined\n }\n}\n\nfunction nearestWorkspaceAgentsPrompt(cwd: string): string | undefined {\n let dir = cwd\n while (true) {\n const content = readPromptFileIfPresent(join(dir, \"AGENTS.md\"))\n if (content) return content\n const parent = dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\nfunction buildAppendedSystemPrompt(cwd: string): string | undefined {\n const parts: string[] = []\n const configRoot =\n process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\")\n const globalAgents = readPromptFileIfPresent(join(configRoot, \"opencode\", \"AGENTS.md\"))\n const workspaceAgents = nearestWorkspaceAgentsPrompt(cwd)\n\n if (globalAgents) parts.push(globalAgents)\n if (workspaceAgents && workspaceAgents !== globalAgents) parts.push(workspaceAgents)\n\n const content = parts.join(\"\\n\\n\")\n if (!content) return undefined\n\n const path = join(tmpdir(), `opencode-cc-sys-${randomUUID()}.md`)\n try {\n writeFileSync(path, content, \"utf8\")\n return path\n } catch (err) {\n log.warn(\"failed to write system prompt file\", { error: String(err) })\n return undefined\n }\n}\n\nexport class ClaudeCodeLanguageModel implements LanguageModelV3 {\n readonly specificationVersion = \"v3\"\n readonly modelId: string\n private readonly config: ClaudeCodeConfig\n\n constructor(modelId: string, config: ClaudeCodeConfig) {\n this.modelId = modelId\n this.config = config\n }\n\n readonly supportedUrls: Record<string, RegExp[]> = {}\n\n get provider(): string {\n return this.config.provider\n }\n\n private toUsage(rawUsage?: ClaudeStreamMessage[\"usage\"]): LanguageModelV3Usage {\n // Prefer the last iteration's counters over cumulative totals.\n // CLI usage is the sum across all internal tool-use iterations;\n // using it directly inflates context size and triggers premature compaction.\n const iter = rawUsage?.iterations\n const effective = iter?.length ? iter[iter.length - 1] : rawUsage\n // Claude CLI reports input_tokens as non-cached input only.\n // OpenCode expects total = noCache + cacheRead + cacheWrite.\n const noCache = effective?.input_tokens ?? 0\n const cacheRead = effective?.cache_read_input_tokens ?? 0\n const cacheWrite = effective?.cache_creation_input_tokens ?? 0\n return {\n inputTokens: {\n total: noCache + cacheRead + cacheWrite,\n noCache,\n cacheRead: cacheRead || undefined,\n cacheWrite: cacheWrite || undefined,\n },\n outputTokens: {\n total: effective?.output_tokens,\n text: effective?.output_tokens,\n reasoning: undefined,\n },\n raw: rawUsage as any,\n }\n }\n\n private toFinishReason(\n reason: \"stop\" | \"tool-calls\" = \"stop\",\n ): LanguageModelV3FinishReason {\n return {\n unified: reason,\n raw: reason,\n }\n }\n\n private requestScope(options: { tools?: unknown }): \"tools\" | \"no-tools\" {\n const tools = options?.tools\n if (Array.isArray(tools)) return \"tools\"\n if (tools && typeof tools === \"object\") {\n return Object.keys(tools as Record<string, unknown>).length > 0\n ? \"tools\"\n : \"no-tools\"\n }\n return \"no-tools\"\n }\n\n /**\n * Build the combined `--mcp-config` list and return both the list and the\n * hash of the bridged opencode MCP block (or null when bridging is off /\n * yields nothing). The hash is used to detect mid-session config changes\n * and respawn the underlying claude process.\n *\n * `runtimeStatus` is a snapshot of opencode's `client.mcp.status()`. When\n * provided it overlays opencode's UI-toggled state on top of disk config\n * so `/mcps` toggles propagate without a config file write.\n */\n private effectiveMcpConfig(\n cwd: string,\n proxyConfigPath?: string,\n runtimeStatus?: RuntimeMcpStatus,\n ): { paths: string[]; bridgedHash: string | null } {\n const paths = Array.isArray(this.config.mcpConfig)\n ? this.config.mcpConfig.slice()\n : this.config.mcpConfig\n ? [this.config.mcpConfig]\n : []\n let bridgedHash: string | null = null\n if (this.config.bridgeOpencodeMcp !== false) {\n const bridged = bridgeOpencodeMcp(cwd, runtimeStatus)\n if (bridged) {\n paths.push(bridged.path)\n bridgedHash = bridged.hash\n }\n }\n if (proxyConfigPath) paths.push(proxyConfigPath)\n return { paths, bridgedHash }\n }\n\n /** Resolve ProxyToolDef[] for the configured proxyTools names. */\n private resolvedProxyTools(): ProxyToolDef[] | null {\n const names = this.config.proxyTools\n if (!names || names.length === 0) return null\n const defsByName = new Map(\n DEFAULT_PROXY_TOOLS.map((t) => [t.name.toLowerCase(), t]),\n )\n const picked: ProxyToolDef[] = []\n for (const n of names) {\n const def = defsByName.get(String(n).toLowerCase())\n if (def) picked.push(def)\n }\n return picked.length > 0 ? picked : null\n }\n\n /**\n * Create a proxy MCP server for a single active Claude process/session.\n * The process lifecycle owns the server lifecycle via session-manager.\n */\n private async ensureProxyServer(\n tools: ProxyToolDef[],\n sessionKeyForCalls: string,\n ): Promise<ProxyMcpServer> {\n const srv = await createProxyMcpServer(tools)\n srv.calls.on(\"call\", (call: ProxyToolCall) => {\n queuePendingProxyCall(sessionKeyForCalls, call)\n })\n return srv\n }\n\n private extractPendingProxyResult(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n toolCallId: string,\n ): ProxyToolResult | null {\n for (let i = prompt.length - 1; i >= 0; i--) {\n const msg = prompt[i]\n if (msg.role !== \"tool\" || !Array.isArray(msg.content)) continue\n\n for (const part of msg.content) {\n if (part.type !== \"tool-result\" || part.toolCallId !== toolCallId) continue\n\n const output = part.output as any\n if (!output || typeof output !== \"object\") {\n return {\n kind: \"text\",\n text: String(output ?? \"\"),\n }\n }\n\n if (output.type === \"text\") {\n return {\n kind: \"text\",\n text: String(output.value ?? \"\"),\n }\n }\n\n if (output.type === \"json\") {\n return {\n kind: \"text\",\n text: JSON.stringify(output.value),\n }\n }\n\n if (output.type === \"content\" && Array.isArray(output.value)) {\n const text = output.value\n .filter((v: any) => v?.type === \"text\" && typeof v.text === \"string\")\n .map((v: any) => v.text)\n .join(\"\\n\")\n return {\n kind: \"text\",\n text,\n }\n }\n\n return {\n kind: \"text\",\n text: JSON.stringify(output),\n }\n }\n }\n\n return null\n }\n\n /**\n * Opencode sets `x-session-affinity: <sessionID>` on LLM calls for\n * third-party providers (packages/opencode/src/session/llm.ts). Use it so\n * two chats in the same cwd+model get separate CLI processes instead of\n * stomping on each other. Falls back to \"default\" when absent (older\n * opencode, direct AI-SDK use, title synthesis paths, etc).\n */\n private sessionAffinity(\n options: LanguageModelV3CallOptions,\n ): string {\n const headers = (options as any)?.headers as\n | Record<string, string | undefined>\n | undefined\n if (!headers) return \"default\"\n for (const key of Object.keys(headers)) {\n if (key.toLowerCase() === \"x-session-affinity\") {\n const v = headers[key]\n if (typeof v === \"string\" && v.length > 0) return v\n }\n }\n return \"default\"\n }\n\n private controlRequestBehaviorForTool(toolName: string): ControlRequestBehavior {\n const configured = this.config.controlRequestToolBehaviors\n if (configured && toolName) {\n const direct = configured[toolName] ?? configured[toolName.toLowerCase()]\n if (direct === \"allow\" || direct === \"deny\") return direct\n\n const lower = toolName.toLowerCase()\n for (const [key, behavior] of Object.entries(configured)) {\n if (key.toLowerCase() === lower && (behavior === \"allow\" || behavior === \"deny\")) {\n return behavior\n }\n }\n }\n\n return this.config.controlRequestBehavior ?? \"allow\"\n }\n\n private writeControlResponse(\n proc: import(\"child_process\").ChildProcess,\n requestId: string,\n response?: Record<string, unknown>,\n ): void {\n const payload = {\n type: \"control_response\",\n response: {\n subtype: \"success\",\n request_id: requestId,\n response,\n },\n }\n\n try {\n proc.stdin?.write(JSON.stringify(payload) + \"\\n\")\n } catch (error) {\n log.warn(\"failed to write control response\", {\n requestId,\n error: error instanceof Error ? error.message : String(error),\n })\n }\n }\n\n /**\n * Handle Claude stream-json control requests (`can_use_tool`, etc.) and\n * respond via stdin with a matching `control_response`.\n */\n private handleControlRequest(\n msg: ClaudeStreamMessage,\n proc: import(\"child_process\").ChildProcess,\n ): boolean {\n if (msg.type !== \"control_request\") return false\n const requestId = msg.request_id\n const request = msg.request\n if (!requestId || !request?.subtype) return false\n\n if (request.subtype === \"can_use_tool\") {\n const toolName = request.tool_name ?? \"unknown\"\n const behavior = this.controlRequestBehaviorForTool(toolName)\n\n if (behavior === \"allow\") {\n this.writeControlResponse(proc, requestId, {\n behavior: \"allow\",\n updatedInput: request.input ?? {},\n toolUseID: request.tool_use_id,\n })\n log.info(\"control request auto-allowed\", {\n requestId,\n toolName,\n })\n } else {\n this.writeControlResponse(proc, requestId, {\n behavior: \"deny\",\n message:\n this.config.controlRequestDenyMessage ??\n `Denied by opencode-claude-code policy for tool ${toolName}`,\n toolUseID: request.tool_use_id,\n })\n log.info(\"control request auto-denied\", {\n requestId,\n toolName,\n })\n }\n\n return true\n }\n\n // For control request subtypes we don't actively handle yet, acknowledge\n // with an empty success so the CLI stream does not stall.\n this.writeControlResponse(proc, requestId, {})\n log.debug(\"control request acknowledged\", {\n requestId,\n subtype: request.subtype,\n })\n return true\n }\n\n private getReasoningEffort(\n providerOptions?: LanguageModelV3CallOptions[\"providerOptions\"],\n ): ReasoningEffort | undefined {\n if (!providerOptions) return undefined\n const ownKey = this.config.provider\n const bag =\n (providerOptions as any)[ownKey] ??\n (providerOptions as any)[\"claude-code\"]\n const effort = bag?.reasoningEffort\n const valid: ReasoningEffort[] = [\n \"minimal\",\n \"low\",\n \"medium\",\n \"high\",\n \"xhigh\",\n \"max\",\n ]\n return valid.includes(effort) ? effort : undefined\n }\n\n private latestUserText(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n ): string {\n for (let i = prompt.length - 1; i >= 0; i--) {\n const msg = prompt[i]\n if (msg.role !== \"user\") continue\n\n if (typeof msg.content === \"string\") {\n return String(msg.content).trim()\n }\n\n if (Array.isArray(msg.content)) {\n const text = (msg.content as any[])\n .filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n .map((part: any) => String(part.text).trim())\n .filter(Boolean)\n .join(\" \")\n if (text) return text\n }\n }\n\n return \"\"\n }\n\n private synthesizeTitle(\n prompt: LanguageModelV3CallOptions[\"prompt\"],\n ): string {\n const source = this.latestUserText(prompt)\n .replace(/\\s+/g, \" \")\n .replace(/[^\\p{L}\\p{N}\\s-]/gu, \" \")\n .trim()\n\n if (!source) return \"New Session\"\n\n const stop = new Set([\n \"a\",\n \"an\",\n \"the\",\n \"and\",\n \"or\",\n \"but\",\n \"to\",\n \"for\",\n \"of\",\n \"in\",\n \"on\",\n \"at\",\n \"with\",\n \"can\",\n \"could\",\n \"would\",\n \"should\",\n \"please\",\n \"hi\",\n \"hello\",\n \"hey\",\n \"there\",\n \"you\",\n \"your\",\n \"this\",\n \"that\",\n \"is\",\n \"are\",\n \"was\",\n \"were\",\n \"be\",\n \"do\",\n \"does\",\n \"did\",\n \"summarize\",\n \"summary\",\n \"project\",\n ])\n\n const words = source\n .split(\" \")\n .map((word) => word.trim())\n .filter(Boolean)\n .filter((word) => !stop.has(word.toLowerCase()))\n\n const picked = (words.length > 0 ? words : source.split(\" \").filter(Boolean))\n .slice(0, 6)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\" \")\n\n return picked || \"New Session\"\n }\n\n private async doGenerateViaStream(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doGenerate\"]>>> {\n const result = await this.doStream(options)\n const reader = result.stream.getReader()\n\n let text = \"\"\n let reasoning = \"\"\n const toolCalls: LanguageModelV3Content[] = []\n let finishReason = this.toFinishReason(\"stop\")\n let usage: LanguageModelV3Usage = this.toUsage()\n let providerMetadata: any\n\n while (true) {\n const { value, done } = await reader.read()\n if (done) break\n\n switch ((value as any).type) {\n case \"text-delta\":\n text += (value as any).delta ?? \"\"\n break\n case \"reasoning-delta\":\n reasoning += (value as any).delta ?? \"\"\n break\n case \"tool-call\":\n toolCalls.push({\n type: \"tool-call\",\n toolCallId: (value as any).toolCallId,\n toolName: (value as any).toolName,\n input: (value as any).input,\n providerExecuted: (value as any).providerExecuted,\n } as any)\n break\n case \"finish\":\n finishReason = (value as any).finishReason ?? finishReason\n usage = (value as any).usage ?? usage\n providerMetadata = (value as any).providerMetadata ?? providerMetadata\n break\n }\n }\n\n const content: LanguageModelV3Content[] = []\n if (reasoning) {\n content.push({ type: \"reasoning\", text: reasoning } as any)\n }\n if (text) {\n content.push({ type: \"text\", text, providerMetadata } as any)\n }\n content.push(...toolCalls)\n\n return {\n content,\n finishReason,\n usage,\n request: result.request,\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata,\n warnings: [],\n }\n }\n\n async doGenerate(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doGenerate\"]>>> {\n const warnings: SharedV3Warning[] = []\n const cwd = this.config.cwd ?? process.cwd()\n const scope = this.requestScope(options as any)\n const affinity = this.sessionAffinity(options)\n const sk = sessionKey(cwd, `${this.modelId}::${scope}::${affinity}`)\n\n // When selective proxying is enabled, doGenerate must not bypass the\n // proxy path. Reuse doStream and aggregate its events so proxied tools\n // still route through opencode permissions/execution.\n if (scope === \"tools\" && this.resolvedProxyTools()) {\n return this.doGenerateViaStream(options)\n }\n\n if (scope === \"no-tools\") {\n const text = this.synthesizeTitle(options.prompt)\n return {\n content: [{ type: \"text\", text }] as any,\n finishReason: this.toFinishReason(\"stop\"),\n usage: this.toUsage({ input_tokens: 0, output_tokens: 0 }),\n request: { body: { text: \"\" } },\n response: {\n id: generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata: {\n \"claude-code\": {\n synthetic: true,\n path: \"no-tools\",\n },\n },\n warnings,\n }\n }\n\n const hasPriorConversation =\n options.prompt.filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .length > 1\n\n // New session — clear any stale state from a previous session\n if (!hasPriorConversation) {\n deleteClaudeSessionId(sk)\n deleteActiveProcess(sk)\n }\n\n const hasExistingSession = !!getClaudeSessionId(sk)\n const includeHistoryContext = !hasExistingSession && hasPriorConversation\n\n const reasoningEffort = this.getReasoningEffort(options.providerOptions)\n const userMsg = getClaudeUserMessage(\n options.prompt,\n includeHistoryContext,\n reasoningEffort,\n )\n\n // doGenerate always spawns a fresh process, never reuse session ID.\n // Pre-fetch opencode's MCP runtime status so the bridge overlays\n // UI-toggled state on top of disk config.\n const runtimeStatus = await getRuntimeMcpStatus()\n const systemPromptFile = buildAppendedSystemPrompt(cwd)\n const cliArgs = buildCliArgs({\n sessionKey: sk,\n skipPermissions: this.config.skipPermissions !== false,\n includeSessionId: false,\n model: this.modelId,\n permissionMode: this.config.permissionMode,\n mcpConfig: this.effectiveMcpConfig(cwd, undefined, runtimeStatus).paths,\n strictMcpConfig: this.config.strictMcpConfig,\n disallowedTools:\n this.config.webSearch === \"disabled\" ? [\"WebSearch\"] : undefined,\n appendSystemPromptFile: systemPromptFile,\n })\n\n log.info(\"doGenerate starting\", {\n cwd,\n model: this.modelId,\n textLength: userMsg.length,\n includeHistoryContext,\n })\n\n const { spawn } = await import(\"node:child_process\")\n const { createInterface } = await import(\"node:readline\")\n\n const proc = spawn(this.config.cliPath, cliArgs, {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, TERM: \"xterm-256color\" },\n shell: process.platform === \"win32\",\n })\n\n if (systemPromptFile) {\n proc.on(\"exit\", () => {\n void unlink(systemPromptFile).catch(() => {})\n })\n }\n\n const rl = createInterface({ input: proc.stdout! })\n\n let responseText = \"\"\n let thinkingText = \"\"\n let resultMeta: {\n sessionId?: string\n costUsd?: number\n durationMs?: number\n usage?: ClaudeStreamMessage[\"usage\"]\n } = {}\n const toolCalls: Array<{ id: string; name: string; args: unknown }> = []\n\n const result = await new Promise<\n typeof resultMeta & {\n text: string\n thinking: string\n toolCalls: typeof toolCalls\n }\n >((resolve, reject) => {\n rl.on(\"line\", (line) => {\n if (!line.trim()) return\n try {\n const msg: ClaudeStreamMessage = JSON.parse(line)\n\n if (this.handleControlRequest(msg, proc)) {\n return\n }\n\n if (msg.type === \"system\" && msg.subtype === \"init\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n }\n\n if (msg.type === \"assistant\" && msg.message?.content) {\n for (const block of msg.message.content) {\n if (block.type === \"text\" && block.text) {\n responseText += block.text\n }\n if (block.type === \"thinking\" && block.thinking) {\n thinkingText += block.thinking\n }\n if (block.type === \"tool_use\" && block.id && block.name) {\n if (\n block.name === \"AskUserQuestion\" ||\n block.name === \"ask_user_question\"\n ) {\n // Emit question as text\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n const question =\n (parsedInput?.question as string) || \"Question?\"\n responseText += `\\n\\n_Asking: ${question}_\\n\\n`\n continue\n }\n\n if (block.name === \"ExitPlanMode\") {\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n const plan = (parsedInput?.plan as string) || \"\"\n responseText += `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`\n continue\n }\n\n toolCalls.push({\n id: block.id,\n name: block.name,\n args: block.input ?? {},\n })\n }\n }\n }\n\n if (msg.type === \"content_block_start\" && msg.content_block) {\n if (\n msg.content_block.type === \"tool_use\" &&\n msg.content_block.id &&\n msg.content_block.name\n ) {\n toolCalls.push({\n id: msg.content_block.id,\n name: msg.content_block.name,\n args: {},\n })\n }\n }\n\n if (msg.type === \"content_block_delta\" && msg.delta) {\n if (msg.delta.type === \"text_delta\" && msg.delta.text) {\n responseText += msg.delta.text\n }\n if (msg.delta.type === \"thinking_delta\" && msg.delta.thinking) {\n thinkingText += msg.delta.thinking\n }\n if (\n msg.delta.type === \"input_json_delta\" &&\n msg.delta.partial_json &&\n msg.index !== undefined\n ) {\n const tc = toolCalls[msg.index]\n if (tc) {\n try {\n tc.args = JSON.parse(msg.delta.partial_json)\n } catch {\n // Partial JSON, accumulate\n }\n }\n }\n }\n\n if (msg.type === \"result\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n\n // Some CLI failures only surface user-readable text on the final\n // `result` message (without prior assistant text blocks). Preserve\n // that so callers don't receive an empty response.\n if (\n !responseText &&\n msg.is_error &&\n typeof msg.result === \"string\" &&\n msg.result.trim().length > 0\n ) {\n responseText = msg.result\n }\n\n resultMeta = {\n sessionId: msg.session_id,\n costUsd: msg.total_cost_usd,\n durationMs: msg.duration_ms,\n usage: msg.usage,\n }\n resolve({\n ...resultMeta,\n text: responseText,\n thinking: thinkingText,\n toolCalls,\n })\n }\n } catch {\n // Ignore non-JSON lines\n }\n })\n\n rl.on(\"close\", () => {\n resolve({\n ...resultMeta,\n text: responseText,\n thinking: thinkingText,\n toolCalls,\n })\n })\n\n proc.on(\"error\", (err) => {\n log.error(\"process error\", { error: err.message })\n reject(err)\n })\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n log.debug(\"stderr\", { data: data.toString().slice(0, 200) })\n })\n\n proc.stdin?.write(userMsg + \"\\n\")\n })\n\n const content: LanguageModelV3Content[] = []\n\n if (result.thinking) {\n content.push({\n type: \"reasoning\",\n text: result.thinking,\n } as any)\n }\n\n if (result.text) {\n content.push({\n type: \"text\",\n text: result.text,\n providerMetadata: {\n \"claude-code\": {\n sessionId: result.sessionId ?? null,\n costUsd: result.costUsd ?? null,\n durationMs: result.durationMs ?? null,\n },\n ...(typeof result.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n result.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n })\n }\n\n for (const tc of result.toolCalls) {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(tc.name, tc.args, { webSearch: this.config.webSearch })\n if (skip) continue\n content.push({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n\n const usage = this.toUsage(result.usage)\n\n return {\n content,\n // Claude CLI's `result` message signals a fully-completed turn —\n // tools have already been executed internally and final assistant\n // text has been produced. Always report \"stop\" so opencode doesn't\n // loop expecting to run tools itself.\n finishReason: this.toFinishReason(\"stop\"),\n usage,\n request: { body: { text: userMsg } },\n response: {\n id: result.sessionId ?? generateId(),\n timestamp: new Date(),\n modelId: this.modelId,\n },\n providerMetadata: {\n \"claude-code\": {\n sessionId: result.sessionId ?? null,\n costUsd: result.costUsd ?? null,\n durationMs: result.durationMs ?? null,\n },\n ...(typeof result.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n result.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n warnings,\n }\n }\n\n async doStream(\n options: LanguageModelV3CallOptions,\n ): Promise<Awaited<ReturnType<LanguageModelV3[\"doStream\"]>>> {\n const warnings: SharedV3Warning[] = []\n const cwd = this.config.cwd ?? process.cwd()\n const cliPath = this.config.cliPath\n const skipPermissions = this.config.skipPermissions !== false\n const scope = this.requestScope(options as any)\n const affinity = this.sessionAffinity(options)\n const sk = sessionKey(cwd, `${this.modelId}::${scope}::${affinity}`)\n const toUsage = this.toUsage.bind(this)\n const toFinishReason = this.toFinishReason.bind(this)\n const handleControlRequest = this.handleControlRequest.bind(this)\n\n if (scope === \"no-tools\") {\n const text = this.synthesizeTitle(options.prompt)\n const textId = generateId()\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n controller.enqueue({ type: \"stream-start\", warnings })\n controller.enqueue({ type: \"text-start\", id: textId } as any)\n controller.enqueue({\n type: \"text-delta\",\n id: textId,\n delta: text,\n })\n controller.enqueue({ type: \"text-end\", id: textId })\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage({ input_tokens: 0, output_tokens: 0 }),\n providerMetadata: {\n \"claude-code\": {\n synthetic: true,\n path: \"no-tools\",\n },\n },\n })\n controller.close()\n },\n })\n\n return {\n stream,\n request: { body: { text: \"\" } },\n }\n }\n\n const hasPriorConversation =\n options.prompt.filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .length > 1\n\n // New session — clear any stale state from a previous session\n if (!hasPriorConversation) {\n deleteClaudeSessionId(sk)\n deleteActiveProcess(sk)\n }\n\n const hasExistingSession = !!getClaudeSessionId(sk)\n const hasActiveProcess = !!getActiveProcess(sk)\n const includeHistoryContext =\n !hasExistingSession && !hasActiveProcess && hasPriorConversation\n\n const reasoningEffort = this.getReasoningEffort(options.providerOptions)\n const userMsg = getClaudeUserMessage(\n options.prompt,\n includeHistoryContext,\n reasoningEffort,\n )\n const resolvedProxy = this.resolvedProxyTools()\n const self = this\n\n const pendingProxyCall = getPendingProxyCall(sk)\n const pendingProxyResult = pendingProxyCall\n ? this.extractPendingProxyResult(options.prompt, pendingProxyCall.toolCallId)\n : null\n\n // Pre-fetch opencode's MCP runtime status before constructing the\n // ReadableStream so the sync hot-reload check and async setup() see\n // the same overlay snapshot. One in-process call per turn — cheap;\n // the SDK client routes through `Server.app.fetch` (no socket).\n const runtimeStatus = await getRuntimeMcpStatus()\n\n log.info(\"doStream starting\", {\n cwd,\n model: this.modelId,\n textLength: userMsg.length,\n includeHistoryContext,\n hasActiveProcess,\n reasoningEffort,\n proxyTools: resolvedProxy?.map((t) => t.name) ?? null,\n })\n\n const stream = new ReadableStream<LanguageModelV3StreamPart>({\n start(controller) {\n let activeProcess = getActiveProcess(sk)\n let proc: import(\"child_process\").ChildProcess\n let lineEmitter: import(\"events\").EventEmitter\n let proxyServer: ProxyMcpServer | null = activeProcess?.proxyServer ?? null\n\n // Hot reload: evict cached subprocess if the bridged opencode MCP\n // config has drifted since spawn. Only checked between turns (here,\n // before setup() runs), never mid tool-call. The stored claude\n // session id is preserved so the respawn resumes the conversation\n // via `--session-id` (handled by buildCliArgs).\n if (\n activeProcess &&\n self.config.hotReloadMcp !== false &&\n self.config.bridgeOpencodeMcp !== false\n ) {\n const probe = self.effectiveMcpConfig(cwd, undefined, runtimeStatus)\n const previousHash = activeProcess.mcpHash ?? null\n if (previousHash !== probe.bridgedHash) {\n log.info(\"opencode MCP config changed, respawning claude\", {\n sk,\n previousHash,\n currentHash: probe.bridgedHash,\n })\n deleteActiveProcess(sk)\n activeProcess = undefined\n proxyServer = null\n }\n }\n\n const setup = async () => {\n if (!proxyServer && resolvedProxy) {\n proxyServer = await self.ensureProxyServer(resolvedProxy, sk)\n }\n\n const proxyDisallowed = resolvedProxy ? disallowedToolFlags(resolvedProxy) : []\n const extraDisallowed: string[] = []\n if (self.config.webSearch === \"disabled\") extraDisallowed.push(\"WebSearch\")\n const allDisallowed = [...proxyDisallowed, ...extraDisallowed]\n const mcp = self.effectiveMcpConfig(\n cwd,\n proxyServer?.configPath(),\n runtimeStatus,\n )\n const systemPromptFile = activeProcess\n ? undefined\n : buildAppendedSystemPrompt(cwd)\n const cliArgs = buildCliArgs({\n sessionKey: sk,\n skipPermissions,\n model: self.modelId,\n permissionMode: self.config.permissionMode,\n mcpConfig: mcp.paths,\n strictMcpConfig: self.config.strictMcpConfig,\n disallowedTools: allDisallowed.length > 0 ? allDisallowed : undefined,\n appendSystemPromptFile: systemPromptFile,\n })\n\n if (activeProcess) {\n proc = activeProcess.proc\n lineEmitter = activeProcess.lineEmitter\n log.debug(\"reusing active process\", { sk })\n } else {\n const ap = spawnClaudeProcess(\n cliPath,\n cliArgs,\n cwd,\n sk,\n proxyServer,\n mcp.bridgedHash,\n systemPromptFile,\n )\n proc = ap.proc\n lineEmitter = ap.lineEmitter\n activeProcess = ap\n }\n\n controller.enqueue({ type: \"stream-start\", warnings })\n\n let currentTextId: string | null = null\n const textBlockIndices = new Set<number>()\n\n const startTextBlock = (): string => {\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId })\n }\n const id = generateId()\n currentTextId = id\n controller.enqueue({ type: \"text-start\", id } as any)\n return id\n }\n\n const endTextBlock = (): void => {\n if (currentTextId) {\n controller.enqueue({ type: \"text-end\", id: currentTextId })\n currentTextId = null\n }\n }\n\n const reasoningIds = new Map<number, string>()\n const reasoningStarted = new Map<number, boolean>()\n\n let turnCompleted = false\n let controllerClosed = false\n let pendingProxyUnsubscribe: (() => void) | null = null\n let resultFallbackTimer: ReturnType<typeof setTimeout> | null = null\n let hasReceivedContent = false\n\n const clearFallbackTimer = () => {\n if (resultFallbackTimer) {\n clearTimeout(resultFallbackTimer)\n resultFallbackTimer = null\n }\n }\n\n const startResultFallback = () => {\n clearFallbackTimer()\n if (!hasReceivedContent || controllerClosed) return\n resultFallbackTimer = setTimeout(() => {\n if (controllerClosed) return\n log.warn(\"result fallback timer fired — closing stream without result event\")\n closeHandler()\n }, 5000)\n }\n\n const toolCallMap = new Map<\n number,\n { id: string; name: string; inputJson: string }\n >()\n // Tool calls the plugin reported as providerExecuted:false — opencode\n // will run these itself and emit its own tool-result, so we must NOT\n // forward Claude CLI's tool_result for them (would short-circuit\n // opencode's execute).\n const skipResultForIds = new Set<string>()\n const toolCallsById = new Map<\n string,\n { id: string; name: string; input: unknown }\n >()\n\n let resultMeta: {\n sessionId?: string\n costUsd?: number\n durationMs?: number\n usage?: ClaudeStreamMessage[\"usage\"]\n } = {}\n\n const finishWithToolCall = (call: PendingProxyCall) => {\n if (controllerClosed) return\n controller.enqueue({\n type: \"tool-input-start\",\n id: call.toolCallId,\n toolName: call.toolName,\n } as any)\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n input: JSON.stringify(call.input),\n providerExecuted: false,\n } as any)\n skipResultForIds.add(call.toolCallId)\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"tool-calls\"),\n usage: toUsage(resultMeta.usage),\n providerMetadata: {\n \"claude-code\": resultMeta,\n },\n })\n controllerClosed = true\n cleanupTurn()\n try {\n controller.close()\n } catch {}\n }\n\n const lineHandler = (line: string) => {\n if (!line.trim()) return\n if (controllerClosed) return\n\n try {\n const msg: ClaudeStreamMessage = JSON.parse(line)\n\n if (handleControlRequest(msg, proc)) {\n return\n }\n\n log.debug(\"stream message\", {\n type: msg.type,\n subtype: msg.subtype,\n })\n\n // Handle system init\n if (msg.type === \"system\" && msg.subtype === \"init\") {\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n log.info(\"session initialized\", {\n claudeSessionId: msg.session_id,\n })\n }\n }\n\n // content_block_start\n if (\n msg.type === \"content_block_start\" &&\n msg.content_block &&\n msg.index !== undefined\n ) {\n const block = msg.content_block\n const idx = msg.index\n\n if (block.type === \"thinking\") {\n const reasoningId = generateId()\n reasoningIds.set(idx, reasoningId)\n controller.enqueue({\n type: \"reasoning-start\",\n id: reasoningId,\n } as any)\n reasoningStarted.set(idx, true)\n }\n\n if (block.type === \"text\") {\n clearFallbackTimer()\n textBlockIndices.add(idx)\n if (block.text) {\n if (!currentTextId) startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: block.text,\n })\n hasReceivedContent = true\n }\n }\n\n if (block.type === \"tool_use\" && block.id && block.name) {\n clearFallbackTimer()\n toolCallMap.set(idx, {\n id: block.id,\n name: block.name,\n inputJson: \"\",\n })\n\n if (\n block.name !== \"AskUserQuestion\" &&\n block.name !== \"ask_user_question\" &&\n block.name !== \"ExitPlanMode\" &&\n !block.name.startsWith(PROXY_TOOL_PREFIX)\n ) {\n const { name: mappedName, skip, executed } = mapTool(\n block.name,\n undefined,\n { webSearch: self.config.webSearch },\n )\n if (!skip) {\n controller.enqueue({\n type: \"tool-input-start\",\n id: block.id,\n toolName: mappedName,\n providerExecuted: executed,\n } as any)\n log.info(\"tool started\", {\n name: block.name,\n mappedName,\n id: block.id,\n })\n }\n }\n }\n }\n\n // content_block_delta\n if (\n msg.type === \"content_block_delta\" &&\n msg.delta &&\n msg.index !== undefined\n ) {\n const delta = msg.delta\n const idx = msg.index\n\n if (delta.type === \"thinking_delta\" && delta.thinking) {\n const reasoningId = reasoningIds.get(idx)\n if (reasoningId) {\n controller.enqueue({\n type: \"reasoning-delta\",\n id: reasoningId,\n delta: delta.thinking,\n } as any)\n }\n }\n\n if (delta.type === \"text_delta\" && delta.text) {\n if (!currentTextId) startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: currentTextId!,\n delta: delta.text,\n })\n hasReceivedContent = true\n }\n\n if (delta.type === \"input_json_delta\" && delta.partial_json) {\n const tc = toolCallMap.get(idx)\n if (tc) {\n tc.inputJson += delta.partial_json\n controller.enqueue({\n type: \"tool-input-delta\",\n id: tc.id,\n delta: delta.partial_json,\n } as any)\n }\n }\n }\n\n // content_block_stop\n if (\n msg.type === \"content_block_stop\" &&\n msg.index !== undefined\n ) {\n const idx = msg.index\n\n const reasoningId = reasoningIds.get(idx)\n if (reasoningId && reasoningStarted.get(idx)) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: reasoningId,\n } as any)\n reasoningStarted.delete(idx)\n }\n\n if (textBlockIndices.has(idx)) {\n endTextBlock()\n textBlockIndices.delete(idx)\n startResultFallback()\n }\n\n const tc = toolCallMap.get(idx)\n if (tc) {\n let parsedInput: any = {}\n try {\n parsedInput = JSON.parse(tc.inputJson || \"{}\")\n } catch {}\n\n if (\n tc.name === \"AskUserQuestion\" ||\n tc.name === \"ask_user_question\"\n ) {\n let question = \"Question?\"\n if (\n parsedInput?.questions &&\n Array.isArray(parsedInput.questions) &&\n parsedInput.questions.length > 0\n ) {\n question =\n parsedInput.questions[0].question ||\n parsedInput.questions[0].text ||\n \"Question?\"\n } else {\n question =\n parsedInput?.question ||\n parsedInput?.text ||\n \"Question?\"\n }\n\n const askId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: askId,\n delta: `\\n\\n_Asking: ${question}_\\n\\n`,\n })\n endTextBlock()\n } else if (tc.name === \"ExitPlanMode\") {\n const plan = (parsedInput?.plan as string) || \"\"\n\n const planId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: planId,\n delta: `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`,\n })\n endTextBlock()\n } else if (tc.name.startsWith(PROXY_TOOL_PREFIX)) {\n log.debug(\"ignoring proxy tool_use block; broker handles it\", {\n name: tc.name,\n id: tc.id,\n })\n } else {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(tc.name, parsedInput, { webSearch: self.config.webSearch })\n\n if (!skip) {\n toolCallsById.set(tc.id, {\n id: tc.id,\n name: tc.name,\n input: parsedInput,\n })\n if (!executed) skipResultForIds.add(tc.id)\n\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: tc.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n log.info(\"tool call complete\", {\n name: tc.name,\n mappedName,\n id: tc.id,\n executed,\n })\n }\n }\n }\n\n // assistant message (complete, not streaming)\n if (msg.type === \"assistant\" && msg.message?.content) {\n const hasText = msg.message.content.some(\n (b: any) => b.type === \"text\" && b.text,\n )\n const hasToolUse = msg.message.content.some(\n (b: any) => b.type === \"tool_use\",\n )\n\n if (hasText) {\n hasReceivedContent = true\n }\n\n if (hasText && !hasToolUse) {\n startResultFallback()\n }\n if (hasToolUse) {\n clearFallbackTimer()\n }\n\n for (const block of msg.message.content) {\n if (block.type === \"text\" && block.text) {\n const blockId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: blockId,\n delta: block.text,\n })\n endTextBlock()\n hasReceivedContent = true\n }\n\n if (block.type === \"thinking\" && block.thinking) {\n const thinkingId = generateId()\n controller.enqueue({\n type: \"reasoning-start\",\n id: thinkingId,\n } as any)\n controller.enqueue({\n type: \"reasoning-delta\",\n id: thinkingId,\n delta: block.thinking,\n } as any)\n controller.enqueue({\n type: \"reasoning-end\",\n id: thinkingId,\n } as any)\n }\n\n if (block.type === \"tool_use\" && block.id && block.name) {\n const parsedInput = (block.input ?? {}) as Record<\n string,\n unknown\n >\n toolCallsById.set(block.id, {\n id: block.id,\n name: block.name,\n input: parsedInput,\n })\n\n if (\n block.name === \"AskUserQuestion\" ||\n block.name === \"ask_user_question\"\n ) {\n let question = \"Question?\"\n if (\n parsedInput?.questions &&\n Array.isArray(parsedInput.questions) &&\n parsedInput.questions.length > 0\n ) {\n const q = parsedInput.questions[0] as any\n question = q.question || q.text || \"Question?\"\n } else {\n question =\n (parsedInput?.question as string) ||\n (parsedInput?.text as string) ||\n \"Question?\"\n }\n\n const askId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: askId,\n delta: `\\n\\n_Asking: ${question}_\\n\\n`,\n })\n endTextBlock()\n } else if (block.name === \"ExitPlanMode\") {\n const plan = (parsedInput?.plan as string) || \"\"\n\n const planId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: planId,\n delta: `\\n\\n${plan}\\n\\n---\\n**Do you want to proceed with this plan?** (yes/no)\\n`,\n })\n endTextBlock()\n } else if (block.name.startsWith(PROXY_TOOL_PREFIX)) {\n log.debug(\"ignoring proxy tool_use from assistant message\", {\n name: block.name,\n id: block.id,\n })\n } else {\n const {\n name: mappedName,\n input: mappedInput,\n executed,\n skip,\n } = mapTool(block.name, parsedInput, { webSearch: self.config.webSearch })\n\n if (!skip) {\n if (!executed) skipResultForIds.add(block.id)\n controller.enqueue({\n type: \"tool-input-start\",\n id: block.id,\n toolName: mappedName,\n providerExecuted: executed,\n } as any)\n controller.enqueue({\n type: \"tool-call\",\n toolCallId: block.id,\n toolName: mappedName,\n input: JSON.stringify(mappedInput),\n providerExecuted: executed,\n } as any)\n }\n log.info(\"tool_use from assistant message\", {\n name: block.name,\n mappedName,\n id: block.id,\n executed,\n })\n }\n }\n\n if (block.type === \"tool_result\") {\n log.debug(\"tool_result\", {\n toolUseId: block.tool_use_id,\n })\n }\n }\n }\n\n // user message (tool results from Claude CLI)\n if (msg.type === \"user\" && msg.message?.content) {\n for (const block of msg.message.content) {\n if (block.type === \"tool_result\" && block.tool_use_id) {\n if (skipResultForIds.has(block.tool_use_id)) {\n log.debug(\"skipping tool-result (opencode runs it)\", {\n toolUseId: block.tool_use_id,\n })\n continue\n }\n const toolCall = toolCallsById.get(block.tool_use_id)\n if (toolCall) {\n let resultText = \"\"\n if (typeof block.content === \"string\") {\n resultText = block.content\n } else if (Array.isArray(block.content)) {\n resultText = block.content\n .filter(\n (\n c,\n ): c is { type: string; text: string } =>\n c.type === \"text\" &&\n typeof c.text === \"string\",\n )\n .map((c) => c.text)\n .join(\"\\n\")\n }\n\n controller.enqueue({\n type: \"tool-result\",\n toolCallId: block.tool_use_id,\n toolName: toolCall.name,\n result: {\n output: resultText,\n title: toolCall.name,\n metadata: {},\n },\n providerExecuted: true,\n } as any)\n log.info(\"tool result emitted\", {\n toolUseId: block.tool_use_id,\n name: toolCall.name,\n })\n toolCallsById.delete(block.tool_use_id)\n }\n }\n }\n }\n\n // result - end of conversation turn\n if (msg.type === \"result\") {\n clearFallbackTimer()\n\n if (msg.session_id) {\n setClaudeSessionId(sk, msg.session_id)\n }\n\n // Some CLI failures only include user-readable text in\n // `result.result` (no prior assistant text blocks). Emit it so\n // opencode users don't see a blank turn.\n if (\n !currentTextId &&\n msg.is_error &&\n typeof msg.result === \"string\" &&\n msg.result.trim().length > 0\n ) {\n const errId = startTextBlock()\n controller.enqueue({\n type: \"text-delta\",\n id: errId,\n delta: msg.result,\n })\n }\n\n resultMeta = {\n sessionId: msg.session_id,\n costUsd: msg.total_cost_usd,\n durationMs: msg.duration_ms,\n usage: msg.usage,\n }\n\n log.info(\"conversation result\", {\n sessionId: msg.session_id,\n durationMs: msg.duration_ms,\n numTurns: msg.num_turns,\n isError: msg.is_error,\n })\n\n turnCompleted = true\n\n endTextBlock()\n\n for (const [idx, reasoningId] of reasoningIds) {\n if (reasoningStarted.get(idx)) {\n controller.enqueue({\n type: \"reasoning-end\",\n id: reasoningId,\n } as any)\n }\n }\n\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage(msg.usage),\n providerMetadata: {\n \"claude-code\": resultMeta,\n ...(typeof msg.usage?.cache_creation_input_tokens === \"number\"\n ? {\n anthropic: {\n cacheCreationInputTokens:\n msg.usage.cache_creation_input_tokens,\n },\n }\n : {}),\n },\n })\n\n controllerClosed = true\n cleanupTurn()\n\n try {\n controller.close()\n } catch {}\n }\n } catch (e) {\n log.debug(\"failed to parse line\", {\n error:\n e instanceof Error ? e.message : String(e),\n })\n }\n }\n\n const closeHandler = () => {\n log.debug(\"readline closed\")\n if (controllerClosed) return\n controllerClosed = true\n cleanupTurn()\n endTextBlock()\n controller.enqueue({\n type: \"finish\",\n finishReason: toFinishReason(\"stop\"),\n usage: toUsage(),\n providerMetadata: {\n \"claude-code\": resultMeta,\n },\n })\n try {\n controller.close()\n } catch {}\n }\n\n // Centralised per-turn teardown. Every exit path funnels through here\n // so we don't accumulate listeners across turns on a reused process.\n let cleanedUp = false\n const cleanupTurn = () => {\n if (cleanedUp) return\n cleanedUp = true\n clearFallbackTimer()\n lineEmitter.off(\"line\", lineHandler)\n lineEmitter.off(\"close\", closeHandler)\n pendingProxyUnsubscribe?.()\n pendingProxyUnsubscribe = null\n proc.off(\"error\", procErrorHandler)\n }\n\n const procErrorHandler = (err: Error) => {\n log.error(\"process error\", { error: err.message })\n if (controllerClosed) return\n controllerClosed = true\n cleanupTurn()\n controller.enqueue({ type: \"error\", error: err })\n try {\n controller.close()\n } catch {}\n }\n\n lineEmitter.on(\"line\", lineHandler)\n lineEmitter.on(\"close\", closeHandler)\n\n pendingProxyUnsubscribe = onPendingProxyCall(sk, (call) => {\n log.info(\"received pending proxy call for session\", {\n sessionKey: sk,\n toolCallId: call.toolCallId,\n toolName: call.toolName,\n })\n finishWithToolCall(call)\n })\n\n proc.on(\"error\", procErrorHandler)\n\n // On abort, keep process alive for next message\n if (options.abortSignal) {\n options.abortSignal.addEventListener(\"abort\", () => {\n if (turnCompleted || controllerClosed) return\n\n if (!hasReceivedContent) {\n log.info(\n \"abort signal received before content, closing stream immediately\",\n { cwd },\n )\n controllerClosed = true\n cleanupTurn()\n try {\n controller.close()\n } catch {}\n return\n }\n\n log.info(\n \"abort signal received mid-turn, starting grace period\",\n { cwd },\n )\n startResultFallback()\n })\n }\n\n if (pendingProxyCall && pendingProxyResult) {\n log.info(\"resolving pending proxy call from tool result prompt\", {\n sessionKey: sk,\n toolCallId: pendingProxyCall.toolCallId,\n toolName: pendingProxyCall.toolName,\n })\n const resolved = resolvePendingProxyCall(sk, pendingProxyResult)\n if (!resolved) {\n log.warn(\"failed to resolve pending proxy call; no pending state\", {\n sessionKey: sk,\n toolCallId: pendingProxyCall.toolCallId,\n })\n }\n return\n }\n\n // Send the user message for a fresh turn.\n proc.stdin?.write(userMsg + \"\\n\")\n log.debug(\"sent user message\", { textLength: userMsg.length })\n }\n\n void setup().catch((err) => {\n log.error(\"failed to set up doStream\", {\n error: err instanceof Error ? err.message : String(err),\n })\n controller.enqueue({\n type: \"error\",\n error: err instanceof Error ? err : new Error(String(err)),\n })\n try {\n controller.close()\n } catch {}\n })\n },\n cancel() {\n // Consumer cancelled the stream\n },\n })\n\n return {\n stream,\n request: { body: { text: userMsg } },\n response: { headers: {} },\n }\n }\n}\n","const DEBUG = process.env.DEBUG?.includes(\"opencode-claude-code\") ?? false\n\nfunction fmt(level: string, msg: string, data?: Record<string, unknown>): string {\n const ts = new Date().toISOString()\n const base = `[${ts}] [opencode-claude-code] ${level}: ${msg}`\n if (data && Object.keys(data).length > 0) {\n return `${base} ${JSON.stringify(data)}`\n }\n return base\n}\n\nexport const log = {\n info(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"INFO\", msg, data))\n },\n notice(msg: string, data?: Record<string, unknown>) {\n console.error(fmt(\"NOTICE\", msg, data))\n },\n warn(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"WARN\", msg, data))\n },\n error(msg: string, data?: Record<string, unknown>) {\n console.error(fmt(\"ERROR\", msg, data))\n },\n debug(msg: string, data?: Record<string, unknown>) {\n if (DEBUG) console.error(fmt(\"DEBUG\", msg, data))\n },\n}\n","import { log } from \"./logger.js\"\nimport type { WebSearchRouting } from \"./types.js\"\n\nexport interface MapToolOptions {\n webSearch?: WebSearchRouting\n}\n\n/**\n * Map Claude CLI tool input (snake_case) to OpenCode tool input (camelCase)\n */\nfunction mapToolInput(name: string, input: any): any {\n if (!input) return input\n\n switch (name) {\n case \"Write\":\n return {\n filePath: input.file_path ?? input.filePath,\n content: input.content,\n }\n case \"Edit\":\n return {\n filePath: input.file_path ?? input.filePath,\n oldString: input.old_string ?? input.oldString,\n newString: input.new_string ?? input.newString,\n replaceAll: input.replace_all ?? input.replaceAll,\n }\n case \"Read\":\n return {\n filePath: input.file_path ?? input.filePath,\n offset: input.offset,\n limit: input.limit,\n }\n case \"Bash\":\n return {\n command: input.command,\n description:\n input.description ||\n `Execute: ${String(input.command || \"\").slice(0, 50)}${String(input.command || \"\").length > 50 ? \"...\" : \"\"}`,\n timeout: input.timeout,\n }\n case \"NotebookEdit\":\n return {\n notebookPath: input.notebook_path ?? input.notebookPath,\n cellNumber: input.cell_number ?? input.cellNumber,\n newSource: input.new_source ?? input.newSource,\n cellType: input.cell_type ?? input.cellType,\n editMode: input.edit_mode ?? input.editMode,\n }\n case \"Glob\":\n return {\n pattern: input.pattern,\n path: input.path,\n }\n case \"Grep\":\n return {\n pattern: input.pattern,\n path: input.path,\n include: input.include,\n }\n case \"TodoWrite\":\n if (Array.isArray(input.todos)) {\n const mappedTodos = input.todos.map((todo: any, index: number) => ({\n content: todo.content,\n status: todo.status || \"pending\",\n priority: todo.priority || \"medium\",\n id: todo.id || `todo_${Date.now()}_${index}`,\n }))\n return { todos: mappedTodos }\n }\n return input\n default:\n return input\n }\n}\n\n// Tools that Claude CLI executes internally but we report to opencode for UI display\nconst OPENCODE_HANDLED_TOOLS = new Set([\n \"Edit\",\n \"Write\",\n \"Bash\",\n \"NotebookEdit\",\n \"Read\",\n \"Glob\",\n \"Grep\",\n])\n\n// Claude CLI internal tools that should not be forwarded to opencode.\n// These are part of Claude Code's own system and have no opencode equivalent.\nconst CLAUDE_INTERNAL_TOOLS = new Set([\n \"ToolSearch\",\n \"Agent\",\n \"AskFollowupQuestion\",\n])\n\nexport function mapTool(\n name: string,\n input?: any,\n opts?: MapToolOptions,\n): { name: string; input?: any; executed: boolean; skip?: boolean } {\n // Claude CLI internal tools — skip entirely\n if (CLAUDE_INTERNAL_TOOLS.has(name)) {\n log.debug(\"skipping Claude CLI internal tool\", { name })\n return { name, input, executed: true, skip: true }\n }\n // Plan mode tools\n if (name === \"EnterPlanMode\") return { name: \"plan_enter\", input: {}, executed: false }\n if (name === \"ExitPlanMode\") return { name: \"plan_exit\", input, executed: false }\n\n // TodoWrite needs opencode to run it locally so Todo.Service (and the UI\n // widget backed by it) gets populated. Reporting as provider-executed would\n // short-circuit opencode's own execute and leave the todo panel empty.\n if (name === \"TodoWrite\") {\n const mappedInput = mapToolInput(name, input)\n return { name: \"todowrite\", input: mappedInput, executed: false }\n }\n\n // WebSearch — routing controlled by config.webSearch\n if (name === \"WebSearch\" || name === \"web_search\") {\n const mappedInput = input?.query ? { query: input.query } : input\n const route = opts?.webSearch\n if (route && route !== \"claude\" && route !== \"disabled\") {\n log.debug(\"routing WebSearch to opencode tool\", { target: route, mappedInput })\n return { name: route, input: mappedInput, executed: false }\n }\n log.debug(\"WebSearch executed by Claude CLI\", { mappedInput })\n return { name: \"WebSearch\", input: mappedInput, executed: true }\n }\n\n // TaskOutput -> bash echo\n if (name === \"TaskOutput\") {\n if (!input) return { name: \"bash\", executed: false }\n const output = input?.content || input?.output || JSON.stringify(input)\n return {\n name: \"bash\",\n input: {\n command: `echo \"TASK OUTPUT: ${String(output).replace(/\"/g, '\\\\\"')}\"`,\n description: \"Displaying task output\",\n },\n executed: false,\n }\n }\n\n // MCP tools: mcp__<server>__<tool> -> <server>_<tool>\n if (name.startsWith(\"mcp__\")) {\n const parts = name.slice(5).split(\"__\")\n if (parts.length >= 2) {\n const serverName = parts[0]\n const toolName = parts.slice(1).join(\"_\")\n const openCodeName = `${serverName}_${toolName}`\n log.debug(\"mapping MCP tool\", { original: name, mapped: openCodeName })\n return { name: openCodeName, input, executed: false }\n }\n }\n\n // Tools executed by Claude CLI internally - map to lowercase for opencode\n if (OPENCODE_HANDLED_TOOLS.has(name)) {\n const mappedInput = mapToolInput(name, input)\n const openCodeName = name.toLowerCase()\n log.debug(\"mapping CLI-executed tool\", { name, openCodeName })\n return { name: openCodeName, input: mappedInput, executed: true }\n }\n\n // Unknown tools - treated as provider-executed\n return { name, input, executed: true }\n}\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\"\nimport { log } from \"./logger.js\"\nimport type { ReasoningEffort } from \"./types.js\"\n\ntype Prompt = Parameters<LanguageModelV3[\"doGenerate\"]>[0][\"prompt\"]\n\nconst THINKING_KEYWORDS: Record<ReasoningEffort, string | null> = {\n minimal: null,\n low: \"think\",\n medium: \"think hard\",\n high: \"think harder\",\n xhigh: \"megathink\",\n max: \"ultrathink\",\n}\n\nexport function reasoningKeyword(effort?: ReasoningEffort): string | null {\n if (!effort) return null\n return THINKING_KEYWORDS[effort] ?? null\n}\n\nconst SUPPORTED_IMAGE_TYPES = new Set([\n \"image/jpeg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n])\n\nfunction toImageBlock(part: any): any | null {\n const raw: unknown = part.data ?? part.url ?? part.source?.data\n if (!raw) {\n log.warn(\"file part without data, skipping\")\n return null\n }\n\n let resolvedMediaType: string = part.mediaType || part.mimeType || part.mime || \"\"\n let base64: string | null = null\n\n if (typeof raw === \"string\") {\n if (raw.startsWith(\"data:\")) {\n const match = /^data:([^;,]+)(?:;[^,]*)*(?:;base64)?,(.*)$/s.exec(raw)\n if (!match) {\n log.warn(\"malformed data URI, skipping file part\")\n return null\n }\n resolvedMediaType = resolvedMediaType || match[1]\n base64 = match[2]\n } else if (/^https?:\\/\\//i.test(raw)) {\n log.warn(\"remote URL images are not supported by Claude CLI, skipping\")\n return null\n } else {\n base64 = raw\n }\n } else if (raw instanceof URL) {\n log.warn(\"remote URL images are not supported by Claude CLI, skipping\")\n return null\n } else if (raw instanceof Uint8Array || Buffer.isBuffer(raw)) {\n base64 = Buffer.from(raw as Uint8Array).toString(\"base64\")\n } else {\n log.warn(\"unsupported file part data type\", { dataType: typeof raw })\n return null\n }\n\n if (!resolvedMediaType || !SUPPORTED_IMAGE_TYPES.has(resolvedMediaType)) {\n log.warn(\"unsupported media type for Claude image block, skipping\", {\n mediaType: resolvedMediaType,\n })\n return null\n }\n\n return {\n type: \"image\",\n source: { type: \"base64\", media_type: resolvedMediaType, data: base64 },\n }\n}\n\nfunction getToolResultText(part: any): string {\n const value = part.output ?? part.result\n\n if (typeof value === \"string\") {\n return value\n }\n\n if (!value || typeof value !== \"object\") {\n return JSON.stringify(value)\n }\n\n switch (value.type) {\n case \"text\":\n case \"error-text\":\n return String(value.value)\n case \"json\":\n case \"error-json\":\n return JSON.stringify(value.value)\n case \"execution-denied\":\n return value.reason ? `Execution denied: ${value.reason}` : \"Execution denied\"\n case \"content\":\n return Array.isArray(value.value)\n ? value.value\n .map((item: any) => {\n if (item?.type === \"text\") return item.text\n return JSON.stringify(item)\n })\n .join(\"\\n\")\n : JSON.stringify(value.value)\n default:\n return JSON.stringify(value)\n }\n}\n\n/**\n * Compact conversation history into a context summary for when we start\n * a fresh Claude CLI session but want to preserve conversation context.\n */\nexport function compactConversationHistory(prompt: Prompt): string | null {\n const conversationMessages = prompt.filter(\n (m) => m.role === \"user\" || m.role === \"assistant\",\n )\n\n if (conversationMessages.length <= 1) {\n return null\n }\n\n const historyParts: string[] = []\n\n for (let i = 0; i < conversationMessages.length - 1; i++) {\n const msg = conversationMessages[i]\n const role = msg.role === \"user\" ? \"User\" : \"Assistant\"\n\n let text = \"\"\n if (typeof msg.content === \"string\") {\n text = msg.content\n } else if (Array.isArray(msg.content)) {\n const textParts = (msg.content as any[])\n .filter((p) => p.type === \"text\" && p.text)\n .map((p) => p.text)\n text = textParts.join(\"\\n\")\n\n const toolCalls = (msg.content as any[]).filter(\n (p) => p.type === \"tool-call\",\n )\n const toolResults = (msg.content as any[]).filter(\n (p) => p.type === \"tool-result\",\n )\n\n if (toolCalls.length > 0) {\n text += `\\n[Called ${toolCalls.length} tool(s): ${toolCalls.map((t: any) => t.toolName).join(\", \")}]`\n }\n if (toolResults.length > 0) {\n text += `\\n[Received ${toolResults.length} tool result(s)]`\n }\n }\n\n if (text.trim()) {\n const truncated =\n text.length > 2000 ? text.slice(0, 2000) + \"...\" : text\n historyParts.push(`${role}: ${truncated}`)\n }\n }\n\n if (historyParts.length === 0) {\n return null\n }\n\n return historyParts.join(\"\\n\\n\")\n}\n\n/**\n * Convert AI SDK prompt into a Claude CLI stream-json user message.\n */\nexport function getClaudeUserMessage(\n prompt: Prompt,\n includeHistoryContext: boolean = false,\n reasoningEffort?: ReasoningEffort,\n): string {\n const content: any[] = []\n\n if (includeHistoryContext) {\n const historyContext = compactConversationHistory(prompt)\n if (historyContext) {\n log.info(\"including conversation history context\", {\n historyLength: historyContext.length,\n })\n content.push({\n type: \"text\",\n text: `<conversation_history>\nThe following is a summary of our conversation so far (from a previous session that couldn't be resumed):\n\n${historyContext}\n\n</conversation_history>\n\nNow continuing with the current message:\n\n`,\n })\n }\n }\n\n // Find messages since last assistant message\n const messages: typeof prompt = []\n for (let i = prompt.length - 1; i >= 0; i--) {\n if (prompt[i].role === \"assistant\") break\n messages.unshift(prompt[i])\n }\n\n for (const msg of messages) {\n if (msg.role === \"user\") {\n if (typeof msg.content === \"string\") {\n const str = msg.content as string\n if (str.trim()) {\n content.push({ type: \"text\", text: str })\n }\n } else if (Array.isArray(msg.content)) {\n for (const part of msg.content as any[]) {\n if (part.type === \"text\") {\n if (part.text && part.text.trim()) {\n content.push({ type: \"text\", text: part.text })\n }\n } else if (part.type === \"file\" || part.type === \"image\") {\n const block = toImageBlock(part)\n if (block) {\n content.push(block)\n } else {\n log.debug(\"skipped non-image file part\", {\n mediaType: part.mediaType,\n })\n }\n } else if (part.type === \"tool-result\") {\n const p = part as any\n content.push({\n type: \"tool_result\",\n tool_use_id: p.toolCallId,\n content: getToolResultText(p),\n })\n }\n }\n }\n }\n }\n\n if (content.length === 0) {\n // CLI rejects a zero-block message with 400, and Anthropic rejects\n // whitespace-only text blocks — so we need a non-whitespace sentinel.\n // \"(empty)\" matches the parenthetical meta-note convention this file\n // already uses for reasoning keywords (\"(think)\", \"(megathink)\", etc.),\n // which the model reads as out-of-band metadata rather than a prompt to\n // continue its previous turn.\n log.warn(\"empty user content; sending sentinel to satisfy CLI\")\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content: [{ type: \"text\", text: \"(empty)\" }],\n },\n })\n }\n\n const keyword = reasoningKeyword(reasoningEffort)\n if (keyword) {\n const lastTextPart = [...content].reverse().find((p) => p.type === \"text\")\n if (lastTextPart) {\n lastTextPart.text = lastTextPart.text\n ? `${lastTextPart.text}\\n\\n(${keyword})`\n : `(${keyword})`\n } else {\n content.push({ type: \"text\", text: `(${keyword})` })\n }\n log.debug(\"injected reasoning keyword\", { effort: reasoningEffort, keyword })\n }\n\n return JSON.stringify({\n type: \"user\",\n message: {\n role: \"user\",\n content,\n },\n })\n}\n","import * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\nimport * as crypto from \"node:crypto\"\nimport { log } from \"./logger.js\"\n\n/**\n * Bridge opencode's `mcp` config block into a Claude CLI `--mcp-config` file.\n *\n * Opencode core schema (packages/opencode/src/config/mcp.ts):\n * {\n * \"mcp\": {\n * \"name\": {\n * \"type\": \"local\" | \"remote\",\n * \"command\"?: string[], // local\n * \"environment\"?: Record<string,string>,\n * \"url\"?: string, // remote\n * \"headers\"?: Record<string,string>,\n * \"oauth\"?: object | false, // remote — NOT bridged (Claude --mcp-config has no slot)\n * \"timeout\"?: number, // NOT bridged (Claude --mcp-config has no slot)\n * \"enabled\"?: boolean\n * }\n * }\n * }\n *\n * Claude CLI `--mcp-config` schema:\n * {\n * \"mcpServers\": {\n * \"name\": {\n * \"type\": \"stdio\" | \"http\",\n * \"command\"?: string, \"args\"?: string[], \"env\"?: Record<string,string>,\n * \"url\"?: string, \"headers\"?: Record<string,string>\n * }\n * }\n * }\n *\n * Discovery + merge are aligned with opencode core's `loadInstanceState`\n * (packages/opencode/src/config/config.ts). In merge order (last wins),\n * opencode loads:\n *\n * 1. Auth `.well-known` remote configs ← NOT bridged\n * 2. Global: ~/.config/opencode/{config.json,opencode.json,opencode.jsonc}\n * — all three deep-merged, jsonc highest priority\n * 3. OPENCODE_CONFIG env var (single file)\n * 4. Project walk-up: opencode.json[c] in each dir from cwd up to (not past)\n * worktree, both extensions per dir, parent-most first\n * 5. .opencode/ siblings: from cwd up + home dir + OPENCODE_CONFIG_DIR,\n * both extensions per dir, opencode-iteration order (cwd-most first\n * in walk-up — so parent-most `.opencode/` wins, matching upstream)\n * 6. OPENCODE_CONFIG_CONTENT env var (inline JSON) ← NOT bridged\n * 7. Active org remote config ← NOT bridged\n * 8. Managed config dir / macOS MDM ← NOT bridged\n *\n * Sources marked NOT bridged are niche and would require live opencode\n * runtime state (auth tokens, account context, MDM access). Document them\n * here so the gap is explicit; functionality of the common path is intact.\n *\n * Per-server merge is deep-merge (matching opencode's `mergeConfigConcatArrays`\n * → `mergeDeep`), so a project layer can override one field of a global server\n * spec — e.g. `{ \"linear\": { \"enabled\": true } }` lifts global linear's URL.\n */\n\nconst FILE_NAMES = [\"opencode.jsonc\", \"opencode.json\", \"config.json\"] as const\nconst PROJECT_FILE_NAMES = [\"opencode.json\", \"opencode.jsonc\"] as const\n\nfunction fileExists(p: string): boolean {\n try {\n return fs.statSync(p).isFile()\n } catch {\n return false\n }\n}\n\nfunction dirExists(p: string): boolean {\n try {\n return fs.statSync(p).isDirectory()\n } catch {\n return false\n }\n}\n\n/** Strip `//` and `/* *\\/` comments so JSONC parses via JSON.parse. */\nfunction stripJsonComments(text: string): string {\n let out = \"\"\n let i = 0\n let inString: string | null = null\n while (i < text.length) {\n const c = text[i]\n if (inString) {\n out += c\n if (c === \"\\\\\" && i + 1 < text.length) {\n out += text[i + 1]\n i += 2\n continue\n }\n if (c === inString) inString = null\n i++\n continue\n }\n if (c === '\"' || c === \"'\") {\n inString = c\n out += c\n i++\n continue\n }\n if (c === \"/\" && text[i + 1] === \"/\") {\n while (i < text.length && text[i] !== \"\\n\") i++\n continue\n }\n if (c === \"/\" && text[i + 1] === \"*\") {\n i += 2\n while (\n i < text.length &&\n !(text[i] === \"*\" && text[i + 1] === \"/\")\n )\n i++\n i += 2\n continue\n }\n out += c\n i++\n }\n return out\n}\n\nfunction readAndParse(file: string): Record<string, unknown> | null {\n try {\n const raw = fs.readFileSync(file, \"utf8\")\n return JSON.parse(stripJsonComments(raw)) as Record<string, unknown>\n } catch (e) {\n log.warn(\"failed to parse opencode config\", {\n file,\n error: e instanceof Error ? e.message : String(e),\n })\n return null\n }\n}\n\n/**\n * Deep merge two plain-object trees. Arrays and primitives are replaced\n * (not concatenated). Matches the effective behavior of opencode's\n * `mergeDeep` from `remeda` for the MCP block — opencode does not special\n * case array fields inside `mcp.<server>` (its only special case is\n * `instructions`, which is concat-deduped at the config root).\n */\nfunction isPlainObject(x: unknown): x is Record<string, unknown> {\n return typeof x === \"object\" && x !== null && !Array.isArray(x)\n}\n\nfunction deepMerge(\n target: Record<string, unknown>,\n source: Record<string, unknown>,\n): Record<string, unknown> {\n const out: Record<string, unknown> = { ...target }\n for (const [k, v] of Object.entries(source)) {\n if (v === undefined) continue\n const existing = out[k]\n if (isPlainObject(existing) && isPlainObject(v)) {\n out[k] = deepMerge(existing, v)\n } else {\n out[k] = v\n }\n }\n return out\n}\n\n/**\n * Walk up from `start` toward filesystem root (or `stop` if provided),\n * collecting paths where each `target` exists. Mirrors opencode core's\n * `FileSystem.up` (packages/core/src/filesystem.ts): cwd-most first,\n * parent-most last.\n */\nfunction walkUp(opts: {\n start: string\n stop?: string\n targets: readonly string[]\n predicate: (p: string) => boolean\n}): string[] {\n const out: string[] = []\n let current = path.resolve(opts.start)\n while (true) {\n for (const target of opts.targets) {\n const candidate = path.join(current, target)\n if (opts.predicate(candidate)) out.push(candidate)\n }\n if (opts.stop && current === path.resolve(opts.stop)) break\n const parent = path.dirname(current)\n if (parent === current) break\n current = parent\n }\n return out\n}\n\n/**\n * Find the worktree root by walking up from `cwd` looking for a `.git`\n * entry (file or directory — submodules use a file). If no `.git` is\n * found, walk to filesystem root. Honors OPENCODE_WORKTREE override.\n */\nfunction detectWorktree(cwd: string): string | undefined {\n const override = process.env.OPENCODE_WORKTREE\n if (override) return path.resolve(override)\n let current = path.resolve(cwd)\n while (true) {\n const gitPath = path.join(current, \".git\")\n try {\n if (fs.existsSync(gitPath)) return current\n } catch {\n // ignore\n }\n const parent = path.dirname(current)\n if (parent === current) return undefined\n current = parent\n }\n}\n\nfunction globalConfigDir(): string {\n const xdg = process.env.XDG_CONFIG_HOME ?? path.join(os.homedir(), \".config\")\n return path.join(xdg, \"opencode\")\n}\n\n/**\n * Load the merged global config from `~/.config/opencode/`. Mirrors\n * opencode core's `loadGlobal`: deep-merges config.json → opencode.json\n * → opencode.jsonc in that order (jsonc wins).\n */\nfunction loadGlobalConfig(): Record<string, unknown> {\n const dir = globalConfigDir()\n let merged: Record<string, unknown> = {}\n for (const name of FILE_NAMES.slice().reverse()) {\n // FILE_NAMES is jsonc-first; reverse to get config.json-first order.\n const file = path.join(dir, name)\n if (!fileExists(file)) continue\n const parsed = readAndParse(file)\n if (parsed) merged = deepMerge(merged, parsed)\n }\n return merged\n}\n\n/** Load both `opencode.json` and `opencode.jsonc` in `dir`, deep-merged. */\nfunction loadProjectFilesInDir(dir: string): Record<string, unknown> {\n let merged: Record<string, unknown> = {}\n for (const name of PROJECT_FILE_NAMES) {\n const file = path.join(dir, name)\n if (!fileExists(file)) continue\n const parsed = readAndParse(file)\n if (parsed) merged = deepMerge(merged, parsed)\n }\n return merged\n}\n\n/**\n * Build the list of `.opencode/` directories to consider, in opencode core's\n * order (matching `ConfigPaths.directories`):\n * project walk-up (cwd-most first) → home-dir `.opencode/` → OPENCODE_CONFIG_DIR\n */\nfunction dotOpencodeDirs(cwd: string, worktree?: string): string[] {\n const dirs: string[] = []\n const seen = new Set<string>()\n const push = (p: string) => {\n const abs = path.resolve(p)\n if (!seen.has(abs) && dirExists(abs)) {\n seen.add(abs)\n dirs.push(abs)\n }\n }\n\n for (const dir of walkUp({\n start: cwd,\n stop: worktree,\n targets: [\".opencode\"],\n predicate: dirExists,\n })) {\n push(dir)\n }\n\n const home = os.homedir()\n if (home) {\n const homeDot = path.join(home, \".opencode\")\n if (dirExists(homeDot)) push(homeDot)\n }\n\n const envDir = process.env.OPENCODE_CONFIG_DIR\n if (envDir && dirExists(envDir)) push(envDir)\n\n return dirs\n}\n\ninterface OpencodeLocalServer {\n type?: \"local\"\n command?: string[]\n environment?: Record<string, string>\n enabled?: boolean\n}\n\ninterface OpencodeRemoteServer {\n type?: \"remote\"\n url?: string\n headers?: Record<string, string>\n enabled?: boolean\n}\n\ntype OpencodeServer = OpencodeLocalServer | OpencodeRemoteServer | { enabled?: boolean }\n\nfunction translateServer(\n name: string,\n spec: Record<string, unknown>,\n): Record<string, unknown> | null {\n if (spec.enabled === false) return null\n\n const type = spec.type\n if (type === \"local\") {\n const cmd = spec.command\n if (!Array.isArray(cmd) || cmd.length === 0) {\n log.warn(\"skipping local MCP server with no command\", { name })\n return null\n }\n const out: Record<string, unknown> = {\n type: \"stdio\",\n command: String(cmd[0]),\n }\n if (cmd.length > 1) out.args = cmd.slice(1).map((s) => String(s))\n if (spec.environment && typeof spec.environment === \"object\") {\n out.env = spec.environment\n }\n return out\n }\n\n if (type === \"remote\") {\n if (typeof spec.url !== \"string\" || !spec.url) {\n log.warn(\"skipping remote MCP server with no url\", { name })\n return null\n }\n const out: Record<string, unknown> = {\n type: \"http\",\n url: spec.url,\n }\n if (spec.headers && typeof spec.headers === \"object\") {\n out.headers = spec.headers\n }\n return out\n }\n\n log.warn(\"skipping MCP server with unknown type\", {\n name,\n type: type ?? null,\n })\n return null\n}\n\nfunction extractMcpBlock(\n config: Record<string, unknown>,\n): Record<string, OpencodeServer> {\n const mcp = config.mcp\n if (!mcp || typeof mcp !== \"object\" || Array.isArray(mcp)) return {}\n return mcp as Record<string, OpencodeServer>\n}\n\n/**\n * Deep-merge per-server specs from `source` into `target`. Mirrors opencode's\n * `mergeDeep` semantics for the `mcp` record: each server entry is recursively\n * merged so a partial layer (e.g. `{ \"linear\": { \"enabled\": true } }`) can\n * override one field without dropping the rest.\n */\nfunction mergeMcp(\n target: Record<string, OpencodeServer>,\n source: Record<string, OpencodeServer>,\n): Record<string, OpencodeServer> {\n const out: Record<string, OpencodeServer> = { ...target }\n for (const [name, spec] of Object.entries(source)) {\n if (!spec || typeof spec !== \"object\") continue\n const existing = out[name]\n if (existing && typeof existing === \"object\") {\n out[name] = deepMerge(\n existing as Record<string, unknown>,\n spec as Record<string, unknown>,\n ) as OpencodeServer\n } else {\n out[name] = spec\n }\n }\n return out\n}\n\nexport interface BridgedMcp {\n /** Path to the temp file containing the translated `--mcp-config`. */\n path: string\n /** Stable hash of the merged opencode mcp block (pre-translation). */\n hash: string\n}\n\n/**\n * Per-server runtime status from opencode's `client.mcp.status()`. Used as\n * an overlay on top of the on-disk merged config so opencode's UI-toggled\n * state — which lives only in-memory; `connect()`/`disconnect()` never\n * touch disk — propagates to the bridged claude subprocess.\n *\n * Treatment per server:\n * - \"connected\" → force `enabled: true` (mirror opencode)\n * - any other status → force `enabled: false` (don't ship a server\n * opencode can't run; user fixes it in opencode first)\n * - missing entry → leave disk value\n *\n * Omit the overlay and the bridge falls back to disk-only.\n */\nexport type RuntimeMcpStatus = Record<string, string>\n\n/**\n * Read opencode config layers, deep-merge their `mcp` blocks per opencode's\n * own semantics, optionally apply an opencode runtime-status overlay, then\n * translate each server to Claude CLI format, write a scratch file, and\n * return its path + a stable hash. Returns null when no enabled MCP servers\n * remain after the merge + overlay.\n */\nexport function bridgeOpencodeMcp(\n cwd: string,\n runtimeStatus?: RuntimeMcpStatus,\n): BridgedMcp | null {\n const worktree = detectWorktree(cwd)\n\n // Layer 1: global merged\n let merged: Record<string, OpencodeServer> = {}\n merged = mergeMcp(merged, extractMcpBlock(loadGlobalConfig()))\n\n // Layer 2: OPENCODE_CONFIG (single file, applied before project walk-up)\n const explicitConfig = process.env.OPENCODE_CONFIG\n if (explicitConfig && fileExists(explicitConfig)) {\n const parsed = readAndParse(explicitConfig)\n if (parsed) merged = mergeMcp(merged, extractMcpBlock(parsed))\n }\n\n // Layer 3: project walk-up — opencode.json[c] in each dir from cwd to\n // (not past) worktree, both extensions per dir. walkUp returns cwd-most\n // first; collect distinct dirs in that order then reverse for merge so\n // cwd-most wins under last-merge-wins.\n const projectFiles = walkUp({\n start: cwd,\n stop: worktree,\n targets: PROJECT_FILE_NAMES,\n predicate: fileExists,\n })\n const projectDirs: string[] = []\n const seenProjectDirs = new Set<string>()\n for (const f of projectFiles) {\n const d = path.dirname(f)\n if (!seenProjectDirs.has(d)) {\n seenProjectDirs.add(d)\n projectDirs.push(d)\n }\n }\n for (const dir of projectDirs.slice().reverse()) {\n merged = mergeMcp(merged, extractMcpBlock(loadProjectFilesInDir(dir)))\n }\n\n // Layer 4: `.opencode/` siblings — project walk-up then home-dir then\n // OPENCODE_CONFIG_DIR, in that order. Iteration order matches opencode's\n // (cwd-most first within walk-up), so under deep-merge \"later wins\"\n // parent-most `.opencode/` overrides cwd-most. This is upstream's\n // behavior, surprising though it is.\n for (const dir of dotOpencodeDirs(cwd, worktree)) {\n merged = mergeMcp(merged, extractMcpBlock(loadProjectFilesInDir(dir)))\n }\n\n // Layer 5: opencode runtime overlay. opencode's `/mcps` UI toggle calls\n // `mcp.connect()` / `mcp.disconnect()` which only mutate in-memory state,\n // never the on-disk config. Without this overlay the bridge can't see\n // those toggles and claude misses servers the user just enabled.\n if (runtimeStatus) {\n for (const name of Object.keys(merged)) {\n const status = runtimeStatus[name]\n if (status === undefined) continue\n const existing = merged[name]\n const base =\n existing && typeof existing === \"object\"\n ? (existing as Record<string, unknown>)\n : {}\n merged[name] = { ...base, enabled: status === \"connected\" } as OpencodeServer\n }\n }\n\n // Translate every still-enabled server.\n const servers: Record<string, unknown> = {}\n for (const [name, spec] of Object.entries(merged)) {\n if (!spec || typeof spec !== \"object\") continue\n const translated = translateServer(name, spec as Record<string, unknown>)\n if (translated) servers[name] = translated\n }\n\n if (Object.keys(servers).length === 0) return null\n\n const body = JSON.stringify({ mcpServers: servers }, null, 2)\n const hash = crypto.createHash(\"sha256\").update(body).digest(\"hex\").slice(0, 12)\n const outPath = path.join(\n os.tmpdir(),\n `opencode-claude-code-mcp-${hash}.json`,\n )\n try {\n if (!fileExists(outPath)) {\n fs.writeFileSync(outPath, body, { encoding: \"utf8\", mode: 0o600 })\n }\n } catch (e) {\n log.warn(\"failed to write bridged MCP config\", {\n error: e instanceof Error ? e.message : String(e),\n })\n return null\n }\n\n log.info(\"bridged opencode MCP config\", {\n target: outPath,\n hash,\n servers: Object.keys(servers),\n })\n return { path: outPath, hash }\n}\n\n// Internal helpers exported for tests only.\nexport const __test = {\n deepMerge,\n mergeMcp,\n translateServer,\n detectWorktree,\n loadGlobalConfig,\n loadProjectFilesInDir,\n dotOpencodeDirs,\n}\n","import type { RuntimeMcpStatus } from \"./mcp-bridge.js\"\nimport { log } from \"./logger.js\"\n\n/**\n * Captured opencode SDK client from `PluginInput`. Lives in its own module\n * to break the cycle that would otherwise form between `index.ts` and\n * `claude-code-language-model.ts`. `null` until the plugin's `server`\n * factory runs (e.g. early provider lookups, direct AI-SDK use, tests).\n */\nlet opencodeClient:\n | { mcp?: { status?: () => Promise<{ data?: unknown; error?: unknown }> } }\n | null = null\n\nexport function setOpencodeClient(client: unknown): void {\n if (client && typeof client === \"object\") {\n opencodeClient = client as typeof opencodeClient\n }\n}\n\n/**\n * Snapshot opencode's current MCP runtime status so the bridge can overlay\n * UI-toggled state on top of disk config. Returns `undefined` on any\n * failure (no client captured, status call rejected, malformed response)\n * so the bridge falls back to disk-only.\n */\nexport async function getRuntimeMcpStatus(): Promise<\n RuntimeMcpStatus | undefined\n> {\n const client = opencodeClient\n if (!client?.mcp?.status) return undefined\n try {\n const res = await client.mcp.status()\n const data = (res as { data?: unknown }).data\n if (!data || typeof data !== \"object\") return undefined\n const out: RuntimeMcpStatus = {}\n for (const [name, entry] of Object.entries(data as Record<string, unknown>)) {\n if (entry && typeof entry === \"object\") {\n const status = (entry as { status?: unknown }).status\n if (typeof status === \"string\") out[name] = status\n }\n }\n return out\n } catch (err) {\n log.warn(\"failed to fetch opencode MCP runtime status\", {\n error: err instanceof Error ? err.message : String(err),\n })\n return undefined\n }\n}\n","import { spawn, type ChildProcess } from \"node:child_process\"\nimport { createInterface } from \"node:readline\"\nimport { EventEmitter } from \"node:events\"\nimport { unlink } from \"node:fs/promises\"\nimport { log } from \"./logger.js\"\nimport type { ProxyMcpServer } from \"./proxy-mcp.js\"\n\nexport interface ActiveProcess {\n proc: ChildProcess\n lineEmitter: EventEmitter\n proxyServer?: ProxyMcpServer | null\n /**\n * Hash of the bridged opencode MCP config the process was spawned with.\n * `null` when the bridge produced nothing (no MCP servers). `undefined`\n * when the bridge was disabled. Used to detect mid-session config drift\n * and force a respawn.\n */\n mcpHash?: string | null\n /** Temp file holding `--append-system-prompt-file` content; unlinked on exit. */\n systemPromptFile?: string\n}\n\n// One active CLI process per session key. Keyed by a composite\n// (cwd + model + opencode session-affinity) so two chats don't race.\n// Iteration order is insertion order, which we refresh on access to\n// make this a poor-man's LRU; see `touch()` below.\nconst activeProcesses = new Map<string, ActiveProcess>()\nconst claudeSessions = new Map<string, string>()\n\n// Cap on live CLI subprocesses. Session-affinity-keyed entries accumulate\n// one-per-chat, so an unbounded map would leak processes as users open new\n// chats. This caps at a reasonable working-set and evicts the oldest.\nconst MAX_ACTIVE_PROCESSES = 16\n\nfunction touch(key: string): void {\n const existing = activeProcesses.get(key)\n if (existing) {\n activeProcesses.delete(key)\n activeProcesses.set(key, existing)\n }\n}\n\nfunction evictIfNeeded(): void {\n while (activeProcesses.size >= MAX_ACTIVE_PROCESSES) {\n const oldestKey = activeProcesses.keys().next().value\n if (!oldestKey) break\n log.info(\"evicting LRU claude process\", { sessionKey: oldestKey })\n deleteActiveProcess(oldestKey)\n }\n}\n\nexport function getActiveProcess(key: string): ActiveProcess | undefined {\n const ap = activeProcesses.get(key)\n if (ap) touch(key)\n return ap\n}\n\nexport function setActiveProcess(key: string, ap: ActiveProcess): void {\n activeProcesses.set(key, ap)\n}\n\nexport function deleteActiveProcess(key: string): void {\n const ap = activeProcesses.get(key)\n if (ap) {\n void ap.proxyServer?.close()\n ap.proc.kill()\n activeProcesses.delete(key)\n }\n}\n\nexport function getClaudeSessionId(key: string): string | undefined {\n return claudeSessions.get(key)\n}\n\nexport function setClaudeSessionId(key: string, sessionId: string): void {\n claudeSessions.set(key, sessionId)\n}\n\nexport function deleteClaudeSessionId(key: string): void {\n claudeSessions.delete(key)\n}\n\nexport function spawnClaudeProcess(\n cliPath: string,\n cliArgs: string[],\n cwd: string,\n sessionKey: string,\n proxyServer?: ProxyMcpServer | null,\n mcpHash?: string | null,\n systemPromptFile?: string,\n): ActiveProcess {\n evictIfNeeded()\n log.info(\"spawning new claude process\", { cliPath, cliArgs, cwd, sessionKey })\n\n const proc = spawn(cliPath, cliArgs, {\n cwd,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n env: { ...process.env, TERM: \"xterm-256color\" },\n shell: process.platform === \"win32\",\n })\n\n const lineEmitter = new EventEmitter()\n\n const rl = createInterface({ input: proc.stdout! })\n rl.on(\"line\", (line: string) => {\n lineEmitter.emit(\"line\", line)\n })\n rl.on(\"close\", () => {\n lineEmitter.emit(\"close\")\n })\n\n const ap: ActiveProcess = {\n proc,\n lineEmitter,\n proxyServer: proxyServer ?? null,\n mcpHash,\n systemPromptFile,\n }\n activeProcesses.set(sessionKey, ap)\n\n // Baseline 'error' listener so Node doesn't throw when the process emits\n // an error between stream turns (no per-stream listener attached then).\n proc.on(\"error\", (err) => {\n log.error(\"claude process error\", { sessionKey, error: err.message })\n })\n\n proc.on(\"exit\", (code, signal) => {\n log.info(\"claude process exited\", { code, signal, sessionKey })\n void proxyServer?.close()\n if (systemPromptFile) {\n void unlink(systemPromptFile).catch(() => {})\n }\n activeProcesses.delete(sessionKey)\n if (code !== 0 && code !== null) {\n log.info(\"process exited with error, clearing session\", {\n code,\n sessionKey,\n })\n claudeSessions.delete(sessionKey)\n }\n })\n\n proc.stderr?.on(\"data\", (data: Buffer) => {\n const stderr = data.toString()\n log.debug(\"stderr\", { data: stderr.slice(0, 200) })\n\n if (\n stderr.includes(\"Session ID\") &&\n (stderr.includes(\"already in use\") ||\n stderr.includes(\"not found\") ||\n stderr.includes(\"invalid\"))\n ) {\n log.warn(\"claude session ID error, clearing session\", {\n sessionKey,\n error: stderr.slice(0, 200),\n })\n claudeSessions.delete(sessionKey)\n }\n })\n\n return ap\n}\n\nexport function buildCliArgs(opts: {\n sessionKey: string\n skipPermissions: boolean\n includeSessionId?: boolean\n model?: string\n permissionMode?: string\n mcpConfig?: string | string[]\n strictMcpConfig?: boolean\n disallowedTools?: string[]\n appendSystemPromptFile?: string\n}): string[] {\n const {\n sessionKey,\n skipPermissions,\n includeSessionId = true,\n model,\n permissionMode,\n mcpConfig,\n strictMcpConfig,\n disallowedTools,\n appendSystemPromptFile,\n } = opts\n const args = [\n \"--output-format\",\n \"stream-json\",\n \"--input-format\",\n \"stream-json\",\n \"--verbose\",\n ]\n\n if (model) {\n args.push(\"--model\", model)\n }\n\n if (permissionMode) {\n args.push(\"--permission-mode\", permissionMode)\n }\n\n if (includeSessionId) {\n const sessionId = claudeSessions.get(sessionKey)\n if (sessionId && !activeProcesses.has(sessionKey)) {\n args.push(\"--session-id\", sessionId)\n }\n }\n\n if (mcpConfig) {\n const configs = Array.isArray(mcpConfig) ? mcpConfig : [mcpConfig]\n const filtered = configs.filter((c) => typeof c === \"string\" && c.length > 0)\n if (filtered.length > 0) {\n args.push(\"--mcp-config\", ...filtered)\n }\n }\n\n if (strictMcpConfig) {\n args.push(\"--strict-mcp-config\")\n }\n\n if (disallowedTools && disallowedTools.length > 0) {\n args.push(\"--disallowedTools\", ...disallowedTools)\n }\n\n if (appendSystemPromptFile) {\n args.push(\"--append-system-prompt-file\", appendSystemPromptFile)\n }\n\n if (skipPermissions) {\n args.push(\"--dangerously-skip-permissions\")\n }\n\n return args\n}\n\n/**\n * Build a session key that includes both cwd and model,\n * so different models get separate processes.\n */\nexport function sessionKey(cwd: string, modelId: string): string {\n return `${cwd}::${modelId}`\n}\n","import { createServer, type IncomingMessage, type ServerResponse } from \"node:http\"\nimport type { AddressInfo } from \"node:net\"\nimport * as fs from \"node:fs\"\nimport * as path from \"node:path\"\nimport * as os from \"node:os\"\nimport * as crypto from \"node:crypto\"\nimport { EventEmitter } from \"node:events\"\nimport { log } from \"./logger.js\"\n\n/**\n * Minimal MCP HTTP server embedded in-process. Exposes a set of \"proxy\"\n * tools (Bash, Edit, Write, etc.) that Claude CLI calls when its built-in\n * equivalents are disabled via --disallowedTools. Our handler blocks until\n * an external broker resolves the call, then responds to Claude.\n *\n * Wire protocol: JSON-RPC 2.0 over plain HTTP POST to `/mcp`. MCP spec\n * also supports SSE streaming, but Claude's HTTP transport accepts single\n * JSON responses for short-lived tool calls, so we keep it simple.\n */\n\nexport interface ProxyMcpServer {\n url: string\n serverName: string\n tools: ProxyToolDef[]\n /** Fires when Claude invokes one of our proxy tools. The handler resolves\n * the returned pending call once a result is available. */\n calls: EventEmitter\n /** Write `--mcp-config <path>`-compatible scratch file and return its path. */\n configPath(): string\n close(): Promise<void>\n}\n\nexport interface ProxyToolDef {\n /** Raw name as seen by Claude once proxied: the MCP exposed tool name. */\n name: string\n description: string\n inputSchema: Record<string, unknown>\n}\n\nexport interface ProxyToolCall {\n id: string\n toolName: string\n input: Record<string, unknown>\n resolve: (result: ProxyToolResult) => void\n reject: (err: Error) => void\n}\n\nexport type ProxyToolResult =\n | { kind: \"text\"; text: string; isError?: boolean }\n | { kind: \"error\"; message: string }\n\nconst PROTOCOL_VERSION = \"2024-11-05\"\nconst SERVER_NAME = \"opencode_proxy\"\nexport const PROXY_TOOL_PREFIX = `mcp__${SERVER_NAME}__`\n\nexport const DEFAULT_PROXY_TOOLS: ProxyToolDef[] = [\n {\n name: \"bash\",\n description:\n \"Execute a shell command. Routed through opencode's bash tool so\" +\n \" permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n command: {\n type: \"string\",\n description: \"The shell command to execute.\",\n },\n description: {\n type: \"string\",\n description: \"Short human-readable description of what the command does.\",\n },\n timeout: {\n type: \"number\",\n description: \"Optional timeout in milliseconds.\",\n },\n },\n required: [\"command\"],\n },\n },\n {\n name: \"write\",\n description:\n \"Write a file. Routed through opencode's write tool so permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n filePath: {\n type: \"string\",\n description: \"The file to write. Absolute paths are preferred.\",\n },\n content: {\n type: \"string\",\n description: \"The full content to write to the file.\",\n },\n },\n required: [\"filePath\", \"content\"],\n },\n },\n {\n name: \"edit\",\n description:\n \"Replace text in an existing file. Routed through opencode's edit tool so permission prompts flow through opencode's UI.\",\n inputSchema: {\n type: \"object\",\n properties: {\n filePath: {\n type: \"string\",\n description: \"The file to edit. Absolute paths are preferred.\",\n },\n oldString: {\n type: \"string\",\n description: \"The exact text to replace.\",\n },\n newString: {\n type: \"string\",\n description: \"The replacement text.\",\n },\n replaceAll: {\n type: \"boolean\",\n description: \"Replace all occurrences instead of just the first one.\",\n },\n },\n required: [\"filePath\", \"oldString\", \"newString\"],\n },\n },\n {\n name: \"webfetch\",\n description:\n \"Fetch content from a URL. Routed through opencode's webfetch tool so\" +\n \" permission prompts flow through opencode's UI. Returns the page\" +\n \" content in the requested format.\",\n inputSchema: {\n type: \"object\",\n properties: {\n url: {\n type: \"string\",\n description: \"The URL to fetch content from. Must start with http:// or https://.\",\n },\n format: {\n type: \"string\",\n enum: [\"text\", \"markdown\", \"html\"],\n description:\n \"The format to return the content in. Defaults to markdown.\",\n },\n timeout: {\n type: \"number\",\n description: \"Optional timeout in seconds (max 120).\",\n },\n },\n required: [\"url\"],\n },\n },\n]\n\nexport async function createProxyMcpServer(\n tools: ProxyToolDef[] = DEFAULT_PROXY_TOOLS,\n): Promise<ProxyMcpServer> {\n const calls = new EventEmitter()\n const pending = new Map<string, ProxyToolCall>()\n\n const server = createServer(async (req, res) => {\n if (req.method !== \"POST\" || !req.url?.startsWith(\"/mcp\")) {\n res.statusCode = 404\n res.end()\n return\n }\n try {\n const body = await readBody(req)\n const request = JSON.parse(body) as {\n jsonrpc?: string\n id?: number | string | null\n method?: string\n params?: Record<string, unknown>\n }\n\n if (request?.jsonrpc !== \"2.0\" || typeof request.method !== \"string\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request?.id ?? null,\n error: { code: -32600, message: \"Invalid request\" },\n })\n return\n }\n\n log.debug(\"proxy-mcp request\", {\n method: request.method,\n id: request.id,\n })\n\n if (request.method === \"initialize\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: { tools: {} },\n serverInfo: {\n name: SERVER_NAME,\n version: \"0.1.0\",\n },\n },\n })\n return\n }\n\n if (request.method === \"notifications/initialized\") {\n res.statusCode = 204\n res.end()\n return\n }\n\n if (request.method === \"tools/list\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n tools: tools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n })),\n },\n })\n return\n }\n\n if (request.method === \"tools/call\") {\n const params = request.params ?? {}\n const toolName = String(params.name ?? \"\")\n const input = (params.arguments ?? {}) as Record<string, unknown>\n\n if (!tools.some((t) => t.name === toolName)) {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: -32601,\n message: `Unknown proxy tool: ${toolName}`,\n },\n })\n return\n }\n\n const callId = crypto.randomUUID()\n log.info(\"proxy-mcp tool call received\", {\n callId,\n toolName,\n hasInput: input != null,\n })\n\n const result = await new Promise<ProxyToolResult>(\n (resolve, reject) => {\n const entry: ProxyToolCall = {\n id: callId,\n toolName,\n input,\n resolve,\n reject,\n }\n pending.set(callId, entry)\n calls.emit(\"call\", entry)\n },\n ).finally(() => {\n pending.delete(callId)\n })\n\n if (result.kind === \"error\") {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: {\n code: -32000,\n message: result.message,\n },\n })\n return\n }\n\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n result: {\n content: [{ type: \"text\", text: result.text }],\n isError: result.isError === true,\n },\n })\n return\n }\n\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: request.id ?? null,\n error: { code: -32601, message: `Unknown method: ${request.method}` },\n })\n } catch (error) {\n log.warn(\"proxy-mcp error handling request\", {\n error: error instanceof Error ? error.message : String(error),\n })\n try {\n writeJson(res, {\n jsonrpc: \"2.0\",\n id: null,\n error: {\n code: -32603,\n message: error instanceof Error ? error.message : \"Internal error\",\n },\n })\n } catch {\n try {\n res.statusCode = 500\n res.end()\n } catch {}\n }\n }\n })\n\n await new Promise<void>((resolve, reject) => {\n server.once(\"error\", reject)\n server.listen(0, \"127.0.0.1\", () => {\n server.off(\"error\", reject)\n resolve()\n })\n })\n\n const addr = server.address() as AddressInfo | null\n if (!addr) {\n server.close()\n throw new Error(\"Failed to bind proxy MCP server\")\n }\n\n const url = `http://127.0.0.1:${addr.port}/mcp`\n\n log.info(\"proxy-mcp server started\", {\n url,\n tools: tools.map((t) => t.name),\n })\n\n let configFilePath: string | null = null\n\n const api: ProxyMcpServer = {\n url,\n serverName: SERVER_NAME,\n tools,\n calls,\n configPath() {\n if (configFilePath) return configFilePath\n const body = JSON.stringify(\n {\n mcpServers: {\n [SERVER_NAME]: {\n type: \"http\",\n url,\n },\n },\n },\n null,\n 2,\n )\n const hash = crypto\n .createHash(\"sha256\")\n .update(body)\n .digest(\"hex\")\n .slice(0, 12)\n const outPath = path.join(\n os.tmpdir(),\n `opencode-claude-code-proxy-${hash}.json`,\n )\n fs.writeFileSync(outPath, body, { encoding: \"utf8\", mode: 0o600 })\n configFilePath = outPath\n return outPath\n },\n async close() {\n for (const entry of pending.values()) {\n entry.reject(new Error(\"proxy MCP server closed\"))\n }\n pending.clear()\n await new Promise<void>((resolve) => {\n server.close(() => resolve())\n })\n },\n }\n\n return api\n}\n\n/** CLI-ready list of Claude tool names to disable, for each proxied tool. */\nexport function disallowedToolFlags(tools: ProxyToolDef[]): string[] {\n // Map our lowercase MCP tool names to Claude's capitalized internal names.\n const nameMap: Record<string, string> = {\n bash: \"Bash\",\n read: \"Read\",\n write: \"Write\",\n edit: \"Edit\",\n glob: \"Glob\",\n grep: \"Grep\",\n webfetch: \"WebFetch\",\n }\n const out: string[] = []\n for (const t of tools) {\n const mapped = nameMap[t.name.toLowerCase()]\n if (mapped) out.push(mapped)\n }\n return out\n}\n\nfunction readBody(req: IncomingMessage): Promise<string> {\n return new Promise((resolve, reject) => {\n const chunks: Buffer[] = []\n req.on(\"data\", (chunk: Buffer) => chunks.push(chunk))\n req.on(\"end\", () => resolve(Buffer.concat(chunks).toString(\"utf8\")))\n req.on(\"error\", reject)\n })\n}\n\nfunction writeJson(res: ServerResponse, body: unknown): void {\n const payload = JSON.stringify(body)\n res.statusCode = 200\n res.setHeader(\"Content-Type\", \"application/json\")\n res.setHeader(\"Content-Length\", Buffer.byteLength(payload).toString())\n res.end(payload)\n}\n","import { EventEmitter } from \"node:events\"\nimport type { ProxyToolCall, ProxyToolResult } from \"./proxy-mcp.js\"\nimport { log } from \"./logger.js\"\n\nexport interface PendingProxyCall {\n sessionKey: string\n toolCallId: string\n toolName: string\n input: Record<string, unknown>\n}\n\ntype InternalPending = PendingProxyCall & {\n resolve(result: ProxyToolResult): void\n reject(error: Error): void\n}\n\nconst pendingBySession = new Map<string, InternalPending>()\nconst emitter = new EventEmitter()\n\nfunction eventName(sessionKey: string) {\n return `pending:${sessionKey}`\n}\n\nexport function onPendingProxyCall(\n sessionKey: string,\n handler: (call: PendingProxyCall) => void,\n): () => void {\n const name = eventName(sessionKey)\n emitter.on(name, handler)\n return () => emitter.off(name, handler)\n}\n\nexport function queuePendingProxyCall(\n sessionKey: string,\n call: ProxyToolCall,\n): PendingProxyCall {\n const existing = pendingBySession.get(sessionKey)\n if (existing) {\n existing.reject(\n new Error(`Another proxy tool call is already pending for ${sessionKey}`),\n )\n pendingBySession.delete(sessionKey)\n }\n\n const pending: InternalPending = {\n sessionKey,\n toolCallId: call.id,\n toolName: call.toolName,\n input: call.input,\n resolve: call.resolve,\n reject: call.reject,\n }\n pendingBySession.set(sessionKey, pending)\n emitter.emit(eventName(sessionKey), pending)\n log.info(\"queued pending proxy call\", {\n sessionKey,\n toolCallId: call.id,\n toolName: call.toolName,\n })\n return pending\n}\n\nexport function getPendingProxyCall(\n sessionKey: string,\n): PendingProxyCall | undefined {\n return pendingBySession.get(sessionKey)\n}\n\nexport function resolvePendingProxyCall(\n sessionKey: string,\n result: ProxyToolResult,\n): boolean {\n const pending = pendingBySession.get(sessionKey)\n if (!pending) return false\n pendingBySession.delete(sessionKey)\n pending.resolve(result)\n log.info(\"resolved pending proxy call\", {\n sessionKey,\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n })\n return true\n}\n\nexport function rejectPendingProxyCall(\n sessionKey: string,\n error: Error,\n): boolean {\n const pending = pendingBySession.get(sessionKey)\n if (!pending) return false\n pendingBySession.delete(sessionKey)\n pending.reject(error)\n log.warn(\"rejected pending proxy call\", {\n sessionKey,\n toolCallId: pending.toolCallId,\n toolName: pending.toolName,\n error: error.message,\n })\n return true\n}\n","import type { OpenCodeModel } from \"./opencode-types.js\"\n\nconst PROVIDER_ID = \"claude-code\"\nconst NPM = \"@khalilgharbaoui/opencode-claude-code-plugin\"\n\nconst reasoningVariants: Record<string, Record<string, unknown>> = {\n low: { reasoningEffort: \"low\" },\n medium: { reasoningEffort: \"medium\" },\n high: { reasoningEffort: \"high\" },\n xhigh: { reasoningEffort: \"xhigh\" },\n max: { reasoningEffort: \"max\" },\n}\n\nconst baseCapabilities = {\n temperature: false,\n attachment: true,\n toolcall: true,\n input: { text: true, audio: false, image: true, video: false, pdf: false },\n output: { text: true, audio: false, image: false, video: false, pdf: false },\n interleaved: false as const,\n}\n\nfunction defineModel(opts: {\n id: string\n name: string\n family: string\n reasoning: boolean\n context: number\n output: number\n cost: { input: number; output: number; cacheRead: number; cacheWrite: number }\n releaseDate: string\n status?: OpenCodeModel[\"status\"]\n}): OpenCodeModel {\n return {\n id: opts.id,\n providerID: PROVIDER_ID,\n api: { id: opts.id, url: \"\", npm: NPM },\n name: opts.name,\n family: opts.family,\n capabilities: { ...baseCapabilities, reasoning: opts.reasoning },\n cost: {\n input: opts.cost.input,\n output: opts.cost.output,\n cache: { read: opts.cost.cacheRead, write: opts.cost.cacheWrite },\n },\n limit: { context: opts.context, output: opts.output },\n status: opts.status ?? \"active\",\n options: {},\n headers: {},\n release_date: opts.releaseDate,\n variants: opts.reasoning ? reasoningVariants : undefined,\n }\n}\n\n// Per-token costs derived from Anthropic per-million-token pricing\nconst haikuCost = { input: 1e-6, output: 5e-6, cacheRead: 1e-7, cacheWrite: 1.25e-6 }\nconst sonnetCost = { input: 3e-6, output: 15e-6, cacheRead: 3e-7, cacheWrite: 3.75e-6 }\nconst opusCost = { input: 15e-6, output: 75e-6, cacheRead: 1.5e-6, cacheWrite: 18.75e-6 }\n\n/**\n * Convert an OpenCodeModel to the flat config schema that OpenCode's\n * provider.ts config parser expects (model.temperature, model.reasoning,\n * model.cost.cache_read, model.modalities, etc.).\n */\nexport function toConfigModel(model: OpenCodeModel): Record<string, unknown> {\n const inputMods: string[] = []\n const outputMods: string[] = []\n for (const [k, v] of Object.entries(model.capabilities.input)) {\n if (v) inputMods.push(k)\n }\n for (const [k, v] of Object.entries(model.capabilities.output)) {\n if (v) outputMods.push(k)\n }\n\n return {\n id: model.api.id,\n name: model.name,\n status: model.status,\n family: model.family ?? \"\",\n release_date: model.release_date,\n\n temperature: model.capabilities.temperature,\n reasoning: model.capabilities.reasoning,\n attachment: model.capabilities.attachment,\n tool_call: model.capabilities.toolcall,\n modalities: { input: inputMods, output: outputMods },\n\n cost: {\n input: model.cost.input,\n output: model.cost.output,\n cache_read: model.cost.cache.read,\n cache_write: model.cost.cache.write,\n },\n\n limit: model.limit,\n options: model.options,\n headers: model.headers,\n variants: model.variants,\n }\n}\n\nexport const defaultModels: Record<string, OpenCodeModel> = {\n \"claude-haiku-4-5\": defineModel({\n id: \"claude-haiku-4-5\",\n name: \"Claude Haiku 4.5\",\n family: \"haiku\",\n reasoning: false,\n context: 200_000,\n output: 8_192,\n cost: haikuCost,\n releaseDate: \"2024-10-22\",\n }),\n \"claude-sonnet-4-5\": defineModel({\n id: \"claude-sonnet-4-5\",\n name: \"Claude Sonnet 4.5\",\n family: \"sonnet\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: sonnetCost,\n releaseDate: \"2025-04-14\",\n }),\n \"claude-sonnet-4-6\": defineModel({\n id: \"claude-sonnet-4-6\",\n name: \"Claude Sonnet 4.6\",\n family: \"sonnet\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: sonnetCost,\n releaseDate: \"2025-06-19\",\n }),\n \"claude-opus-4-5\": defineModel({\n id: \"claude-opus-4-5\",\n name: \"Claude Opus 4.5\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-04-14\",\n }),\n \"claude-opus-4-6\": defineModel({\n id: \"claude-opus-4-6\",\n name: \"Claude Opus 4.6\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-06-19\",\n }),\n \"claude-opus-4-7\": defineModel({\n id: \"claude-opus-4-7\",\n name: \"Claude Opus 4.7\",\n family: \"opus\",\n reasoning: true,\n context: 1_000_000,\n output: 16_384,\n cost: opusCost,\n releaseDate: \"2025-07-16\",\n }),\n}\n","import { chmod, lstat, mkdir, readlink, symlink, writeFile } from \"node:fs/promises\"\nimport path from \"node:path\"\nimport { log } from \"./logger.js\"\n\nexport const BASE_PROVIDER_ID = \"claude-code\"\nexport const DEFAULT_ACCOUNT = \"default\"\n\nconst SHARED_CAPABILITY_ITEMS = [\n \"CLAUDE.md\",\n \"settings.json\",\n \"skills\",\n \"agents\",\n \"commands\",\n \"plugins\",\n]\n\nexport function normalizeAccountName(account: string): string {\n return account\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"-\")\n .replace(/^-+|-+$/g, \"\")\n}\n\nexport function resolveAccounts(value: unknown): string[] | null {\n if (!Array.isArray(value)) return null\n\n const accounts = value\n .map((account) => normalizeAccountName(String(account)))\n .filter(Boolean)\n\n return Array.from(new Set([DEFAULT_ACCOUNT, ...accounts]))\n}\n\nexport function accountProviderId(account: string): string {\n return `${BASE_PROVIDER_ID}-${normalizeAccountName(account)}`\n}\n\nexport function accountDisplayName(account: string): string {\n return `Claude Code (${titleizeAccount(account)})`\n}\n\nexport function accountModelSuffix(account: string): string | undefined {\n const normalized = normalizeAccountName(account)\n return normalized === DEFAULT_ACCOUNT ? undefined : normalized\n}\n\nexport function accountConfigDir(account: string): string | undefined {\n const normalized = normalizeAccountName(account)\n\n if (!normalized || normalized === DEFAULT_ACCOUNT) return undefined\n\n return `~/.claude-${normalized}`\n}\n\nexport function expandHome(value: string): string {\n const home = process.env.HOME ?? process.env.USERPROFILE\n\n if (value === \"~\") return home ?? value\n\n if (value.startsWith(\"~/\") || value.startsWith(\"~\\\\\")) {\n return home ? path.join(home, value.slice(2)) : value\n }\n\n return value\n}\n\nexport async function ensureAccountRuntime(\n account: string,\n baseCliPath: string,\n): Promise<{ cliPath: string; configDir?: string }> {\n const configDir = accountConfigDir(account)\n\n if (!configDir) return { cliPath: baseCliPath }\n\n const expandedConfigDir = expandHome(configDir)\n await mkdir(expandedConfigDir, { recursive: true })\n\n try {\n await ensureSharedCapabilities(expandedConfigDir)\n } catch (err) {\n log.warn(\"failed to symlink shared capabilities; continuing anyway\", {\n account,\n configDir: expandedConfigDir,\n error: String(err),\n })\n }\n\n const cliPath = await writeAccountWrapper(\n normalizeAccountName(account),\n baseCliPath,\n expandedConfigDir,\n )\n\n return { cliPath, configDir }\n}\n\nasync function ensureSharedCapabilities(targetRoot: string): Promise<void> {\n const sourceRoot = expandHome(\"~/.claude\")\n\n for (const item of SHARED_CAPABILITY_ITEMS) {\n await ensureSharedCapabilityItem(sourceRoot, targetRoot, item)\n }\n}\n\nasync function ensureSharedCapabilityItem(\n sourceRoot: string,\n targetRoot: string,\n item: string,\n): Promise<void> {\n const source = path.join(sourceRoot, item)\n const target = path.join(targetRoot, item)\n\n let sourceStat\n try {\n sourceStat = await lstat(source)\n } catch {\n return\n }\n\n try {\n const targetStat = await lstat(target)\n\n if (targetStat.isSymbolicLink()) {\n const current = await readlink(target)\n const resolvedCurrent = path.resolve(path.dirname(target), current)\n const resolvedSource = path.resolve(source)\n\n if (resolvedCurrent === resolvedSource) return\n }\n\n log.warn(\"shared Claude capability already exists; leaving untouched\", {\n item,\n target,\n source,\n })\n\n return\n } catch {\n // Missing target is expected.\n }\n\n const type = sourceStat.isDirectory()\n ? process.platform === \"win32\"\n ? \"junction\"\n : \"dir\"\n : \"file\"\n\n await symlink(source, target, type)\n}\n\nasync function writeAccountWrapper(\n account: string,\n baseCliPath: string,\n configDir: string,\n): Promise<string> {\n const cacheRoot = path.join(\n process.env.XDG_CACHE_HOME ?? expandHome(\"~/.cache\"),\n \"opencode-claude-code-plugin\",\n )\n const wrapperPath = path.join(cacheRoot, `claude-${account}`)\n const suffix = `@${account}`\n\n await mkdir(cacheRoot, { recursive: true })\n\n const script = `#!/usr/bin/env bash\nset -euo pipefail\n\nargs=()\nwhile [[ $# -gt 0 ]]; do\n if [[ \"$1\" == \"--model\" && $# -ge 2 ]]; then\n model=\"$2\"\n if [[ \"$model\" == *${shellDoubleQuote(suffix)} ]]; then\n model=\"\\${model%${shellDoubleQuote(suffix)}}\"\n fi\n args+=(\"$1\" \"$model\")\n shift 2\n else\n args+=(\"$1\")\n shift\n fi\ndone\n\nexport CLAUDE_CONFIG_DIR=${shellSingleQuote(configDir)}\nexec ${shellSingleQuote(baseCliPath)} \"\\${args[@]}\"\n`\n\n await writeFile(wrapperPath, script, \"utf8\")\n await chmod(wrapperPath, 0o755)\n\n return wrapperPath\n}\n\nfunction shellSingleQuote(value: string): string {\n return `'${value.replace(/'/g, `'\"'\"'`)}'`\n}\n\nfunction shellDoubleQuote(value: string): string {\n return value.replace(/[$`\"\\\\]/g, \"\\\\$&\")\n}\n\nfunction titleizeAccount(account: string): string {\n return normalizeAccountName(account)\n .split(\"-\")\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \")\n}\n","// Removes a stale unscoped `opencode-claude-code-plugin` install left in\n// opencode's plugin cache by older configs. The unscoped name is a different\n// artifact than this scoped plugin and shadows it when both coexist.\n// Disable with OPENCODE_CLAUDE_CODE_PLUGIN_NO_CLEANUP=1.\n\nimport {\n existsSync,\n readFileSync,\n realpathSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\"\nimport { homedir } from \"node:os\"\nimport { join, resolve } from \"node:path\"\nimport { fileURLToPath } from \"node:url\"\nimport { log } from \"./logger.js\"\n\nconst STALE_PACKAGE_NAME = \"opencode-claude-code-plugin\"\nconst SUSPECT_DESCRIPTION_TOKEN = \"Claude Code\"\n\nlet alreadyRan = false\n\nfunction candidateCacheRoots(): string[] {\n const xdg = process.env.XDG_CACHE_HOME\n return [\n xdg ? join(xdg, \"opencode\") : null,\n join(homedir(), \".cache\", \"opencode\"),\n join(homedir(), \"Library\", \"Caches\", \"opencode\"),\n ].filter((p): p is string => Boolean(p))\n}\n\nfunction userOpencodeJsonPath(): string {\n const xdgConfig = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\")\n return join(xdgConfig, \"opencode\", \"opencode.json\")\n}\n\nfunction userIntendsToUseUnscoped(): boolean {\n const cfg = userOpencodeJsonPath()\n if (!existsSync(cfg)) return false\n try {\n const json = JSON.parse(readFileSync(cfg, \"utf8\"))\n const plugins: unknown = json.plugin\n if (!Array.isArray(plugins)) return false\n return plugins.some(\n (entry) =>\n typeof entry === \"string\" &&\n /^opencode-claude-code-plugin(@[^/]+)?$/.test(entry),\n )\n } catch {\n return false\n }\n}\n\nfunction ourLoadedDir(): string | null {\n try {\n const filePath = fileURLToPath(import.meta.url)\n return realpathSync(resolve(filePath, \"..\", \"..\"))\n } catch {\n return null\n }\n}\n\nexport function cleanupStaleUnscopedInstall(): void {\n if (alreadyRan) return\n alreadyRan = true\n\n if (process.env.OPENCODE_CLAUDE_CODE_PLUGIN_NO_CLEANUP === \"1\") return\n if (userIntendsToUseUnscoped()) return\n\n const ourDir = ourLoadedDir()\n\n for (const cacheRoot of candidateCacheRoots()) {\n try {\n cleanupOne(cacheRoot, ourDir)\n } catch (err) {\n log.warn(\"cleanup-stale: error processing cache root\", {\n cacheRoot,\n error: String(err),\n })\n }\n }\n}\n\nfunction cleanupOne(cacheRoot: string, ourDir: string | null): void {\n if (!existsSync(cacheRoot)) return\n\n const stalePath = join(cacheRoot, \"node_modules\", STALE_PACKAGE_NAME)\n if (!existsSync(stalePath)) return\n\n // Don't self-delete if we are the unscoped install.\n let realStalePath = stalePath\n try {\n realStalePath = realpathSync(stalePath)\n } catch {\n // ignore\n }\n if (ourDir && realStalePath === ourDir) return\n\n // Verify identity before removing.\n const pkgJsonPath = join(stalePath, \"package.json\")\n if (!existsSync(pkgJsonPath)) return\n let pkg: { name?: string; description?: string } = {}\n try {\n pkg = JSON.parse(readFileSync(pkgJsonPath, \"utf8\"))\n } catch {\n return\n }\n if (pkg.name !== STALE_PACKAGE_NAME) return\n if (!pkg.description?.includes(SUSPECT_DESCRIPTION_TOKEN)) return\n\n log.info(\"cleanup-stale: removing unscoped install\", { stalePath })\n try {\n rmSync(stalePath, { recursive: true, force: true })\n } catch (err) {\n log.warn(\"cleanup-stale: rmSync failed\", {\n stalePath,\n error: String(err),\n })\n return\n }\n\n // Drop the dep from the cache root's package.json so opencode's installer\n // doesn't reinstate it on its next pass. Lockfile is left alone; bun\n // reconciles against package.json on the next install.\n const cachePkgJson = join(cacheRoot, \"package.json\")\n if (!existsSync(cachePkgJson)) return\n try {\n const cfg = JSON.parse(readFileSync(cachePkgJson, \"utf8\"))\n if (cfg?.dependencies?.[STALE_PACKAGE_NAME]) {\n delete cfg.dependencies[STALE_PACKAGE_NAME]\n writeFileSync(cachePkgJson, JSON.stringify(cfg, null, 2) + \"\\n\")\n log.info(\"cleanup-stale: pruned dep from cache package.json\")\n }\n } catch (err) {\n log.warn(\"cleanup-stale: cache package.json update failed\", {\n error: String(err),\n })\n }\n}\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\"\nimport { ClaudeCodeLanguageModel } from \"./claude-code-language-model.js\"\nimport { defaultModels, toConfigModel } from \"./models.js\"\nimport type { OpenCodeModel, OpenCodePlugin, OpenCodeProvider } from \"./opencode-types.js\"\nimport type { ClaudeCodeProviderSettings } from \"./types.js\"\nimport {\n BASE_PROVIDER_ID,\n accountDisplayName,\n accountModelSuffix,\n accountProviderId,\n ensureAccountRuntime,\n resolveAccounts,\n} from \"./accounts.js\"\nimport { cleanupStaleUnscopedInstall } from \"./cleanup-stale.js\"\nimport { log } from \"./logger.js\"\nimport { setOpencodeClient } from \"./runtime-status.js\"\n\nexport interface ClaudeCodeProvider {\n specificationVersion: \"v3\"\n (modelId: string): LanguageModelV3\n languageModel(modelId: string): LanguageModelV3\n}\n\nexport function createClaudeCode(\n settings: ClaudeCodeProviderSettings = {},\n): ClaudeCodeProvider {\n const cliPath =\n settings.cliPath ?? process.env.CLAUDE_CLI_PATH ?? \"claude\"\n const providerName = settings.providerID ?? settings.name ?? \"claude-code\"\n const proxyTools = settings.proxyTools ?? [\"Bash\", \"Edit\", \"Write\", \"WebFetch\"]\n\n const createModel = (modelId: string): LanguageModelV3 => {\n return new ClaudeCodeLanguageModel(modelId, {\n provider: providerName,\n cliPath,\n cwd: settings.cwd,\n account: settings.account,\n configDir: settings.configDir,\n providerID: settings.providerID,\n skipPermissions: settings.skipPermissions ?? true,\n permissionMode: settings.permissionMode,\n mcpConfig: settings.mcpConfig,\n strictMcpConfig: settings.strictMcpConfig,\n bridgeOpencodeMcp: settings.bridgeOpencodeMcp ?? true,\n controlRequestBehavior: settings.controlRequestBehavior ?? \"allow\",\n controlRequestToolBehaviors: settings.controlRequestToolBehaviors,\n controlRequestDenyMessage: settings.controlRequestDenyMessage,\n proxyTools,\n webSearch: settings.webSearch,\n hotReloadMcp: settings.hotReloadMcp ?? true,\n })\n }\n\n const provider = function (modelId: string) {\n return createModel(modelId)\n } as ClaudeCodeProvider\n\n provider.specificationVersion = \"v3\"\n provider.languageModel = createModel\n\n return provider\n}\n\n// ---------------------------------------------------------------------------\n// OpenCode plugin interface\n// ---------------------------------------------------------------------------\n\nconst PROVIDER_ID = BASE_PROVIDER_ID\nconst PACKAGE_NPM = \"@khalilgharbaoui/opencode-claude-code-plugin\"\n\nfunction pluginEntrypoint(): string {\n return import.meta.url.startsWith(\"file:\") ? import.meta.url : PACKAGE_NPM\n}\n\nfunction cleanProviderOptions(\n options: Record<string, unknown> = {},\n): Record<string, unknown> {\n const result = { ...options }\n delete result.accounts\n return result\n}\n\nfunction mergeDefaultVariants(models: Record<string, unknown> = {}) {\n const result = { ...models } as Record<string, Record<string, unknown>>\n\n for (const [id, model] of Object.entries(defaultModels)) {\n if (!model.variants) continue\n\n const existing =\n result[id] && typeof result[id] === \"object\" ? result[id] : {}\n const variants =\n existing.variants && typeof existing.variants === \"object\"\n ? (existing.variants as Record<string, Record<string, unknown>>)\n : {}\n\n result[id] = {\n ...existing,\n variants: {\n ...model.variants,\n ...variants,\n },\n }\n }\n\n return result\n}\n\nfunction defaultModelsForProvider(\n providerModels: OpenCodeProvider[\"models\"],\n providerID = PROVIDER_ID,\n modelSuffix?: string,\n) {\n const models = Object.fromEntries(\n Object.entries(defaultModels).map(([id, model]) => {\n const modelId = modelSuffix ? `${id}@${modelSuffix}` : id\n const existing = providerModels[id] ?? providerModels[modelId]\n return [\n modelId,\n {\n ...model,\n id: modelId,\n providerID,\n api: {\n ...model.api,\n id: modelId,\n npm: existing?.api?.npm ?? model.api.npm,\n url: existing?.api?.url ?? model.api.url,\n },\n },\n ]\n }),\n )\n\n for (const [id, model] of Object.entries(providerModels)) {\n if (!(id in models)) {\n models[id] = {\n ...model,\n providerID,\n }\n }\n }\n\n return models\n}\n\n/**\n * Build models in OpenCode's config schema format (flat properties like\n * `temperature`, `reasoning`, `cost.cache_read`, `modalities`, etc.)\n * so the config-path provider loader parses them correctly.\n */\nfunction configModelsForProvider(\n providerModels: OpenCodeProvider[\"models\"],\n providerID: string,\n modelSuffix?: string,\n): Record<string, Record<string, unknown>> {\n const models: Record<string, Record<string, unknown>> = {}\n\n for (const [id, model] of Object.entries(defaultModels)) {\n const modelId = modelSuffix ? `${id}@${modelSuffix}` : id\n const existing = providerModels[id] ?? providerModels[modelId]\n const full: OpenCodeModel = {\n ...model,\n id: modelId,\n providerID,\n api: {\n ...model.api,\n id: modelId,\n npm: existing?.api?.npm ?? model.api.npm,\n url: existing?.api?.url ?? model.api.url,\n },\n }\n models[modelId] = toConfigModel(full)\n }\n\n for (const [id, model] of Object.entries(providerModels)) {\n if (!(id in models)) {\n models[id] = toConfigModel({ ...model, providerID } as OpenCodeModel)\n }\n }\n\n return models\n}\n\nasync function providerConfig(\n existing: {\n name?: string\n npm?: string\n options?: Record<string, unknown>\n models?: Record<string, unknown>\n } | undefined,\n providerID = PROVIDER_ID,\n optionDefaults: Record<string, unknown> = {},\n displayName?: string,\n) {\n const mergedOptions: Record<string, unknown> = {\n cliPath: \"claude\",\n proxyTools: [\"Bash\", \"Edit\", \"Write\", \"WebFetch\"],\n ...optionDefaults,\n ...cleanProviderOptions(existing?.options),\n providerID,\n }\n\n const cliPath = String(mergedOptions.cliPath ?? \"claude\")\n const account =\n typeof mergedOptions.account === \"string\" ? mergedOptions.account : undefined\n const runtime = account\n ? await ensureAccountRuntime(account, cliPath)\n : { cliPath }\n\n return {\n name: displayName ?? existing?.name,\n npm: existing?.npm ?? pluginEntrypoint(),\n options: {\n ...mergedOptions,\n ...runtime,\n },\n models: mergeDefaultVariants(existing?.models),\n }\n}\n\nasync function expandAccountProviders(config: {\n provider?: Record<\n string,\n {\n name?: string\n npm?: string\n options?: Record<string, unknown>\n models?: Record<string, unknown>\n }\n >\n}): Promise<boolean> {\n const seed = config.provider?.[PROVIDER_ID]\n const accounts = resolveAccounts(seed?.options?.accounts)\n\n if (!accounts) return false\n\n config.provider ??= {}\n\n const seedOptions = cleanProviderOptions(seed?.options)\n let expandedCount = 0\n\n for (const account of accounts) {\n const providerID = accountProviderId(account)\n try {\n const existing = config.provider[providerID]\n const modelSuffix = accountModelSuffix(account)\n\n config.provider[providerID] = {\n ...existing,\n ...(await providerConfig(\n existing,\n providerID,\n {\n ...seedOptions,\n account,\n },\n accountDisplayName(account),\n )),\n models: configModelsForProvider(\n (existing?.models ?? seed?.models ?? {}) as OpenCodeProvider[\"models\"],\n providerID,\n modelSuffix,\n ),\n }\n expandedCount++\n } catch (err) {\n log.error(\"failed to expand account provider\", {\n account,\n providerID,\n error: String(err),\n })\n }\n }\n\n if (expandedCount > 0) {\n delete config.provider[PROVIDER_ID]\n }\n\n return expandedCount > 0\n}\n\nconst server: OpenCodePlugin = async (input) => {\n cleanupStaleUnscopedInstall()\n\n // Capture the SDK client so the language model can query opencode's\n // in-memory MCP state per-turn for the runtime overlay. `input` is\n // `unknown` here (kept loose since opencode adds fields over time);\n // narrow defensively.\n if (input && typeof input === \"object\" && \"client\" in input) {\n setOpencodeClient((input as { client?: unknown }).client)\n }\n\n return {\n config: async (config) => {\n config.provider ??= {}\n\n const expanded = await expandAccountProviders(config)\n if (expanded) {\n const registered = Object.entries(config.provider)\n .filter(([id]) => id === PROVIDER_ID || id.startsWith(`${PROVIDER_ID}-`))\n .map(([id, p]) => ({ id, name: p?.name ?? id }))\n log.notice(\"registered claude-code providers\", { providers: registered })\n return\n }\n\n const existing = config.provider[PROVIDER_ID]\n config.provider[PROVIDER_ID] = {\n ...existing,\n ...(await providerConfig(existing)),\n }\n log.notice(\"registered claude-code provider\", {\n id: PROVIDER_ID,\n name: config.provider[PROVIDER_ID]?.name ?? PROVIDER_ID,\n })\n },\n // No `event` hook: MCP config drift is detected at turn start by the\n // hot-reload check in `claude-code-language-model.ts`, which respawns\n // claude safely between turns. Eviction on `global.disposed` would kill\n // an in-flight stream and abort the user's current turn.\n provider: {\n id: PROVIDER_ID,\n models: async (provider) => defaultModelsForProvider(provider.models),\n },\n }\n}\n\nexport default {\n id: \"@khalilgharbaoui/opencode-claude-code-plugin\",\n server,\n}\n\n// ---------------------------------------------------------------------------\n// Re-exports\n// ---------------------------------------------------------------------------\n\nexport { ClaudeCodeLanguageModel } from \"./claude-code-language-model.js\"\nexport { bridgeOpencodeMcp } from \"./mcp-bridge.js\"\nexport { defaultModels } from \"./models.js\"\nexport type {\n ClaudeCodeConfig,\n ClaudeCodeProviderSettings,\n ClaudeStreamMessage,\n} from \"./types.js\"\nexport type { OpenCodeHooks, OpenCodeModel, OpenCodePlugin } from \"./opencode-types.js\"\n"],"mappings":"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","names":["sessionKey","fs","path","os","crypto","EventEmitter","EventEmitter","server","resolve","EventEmitter","EventEmitter","sessionKey","readFileSync","writeFileSync","unlink","homedir","tmpdir","randomUUID","dirname","join","path","spawn","createInterface","resolve","stream","path","path","existsSync","readFileSync","writeFileSync","homedir","join","resolve","join","homedir","existsSync","readFileSync","resolve","writeFileSync","PROVIDER_ID"]}
|