@kenkaiiii/gg-ai 4.3.227 → 4.3.229

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/prompt-cache-key.ts","../src/providers/openai-codex.ts","../src/utils/diag.ts","../src/providers/gemini.ts","../src/provider-registry.ts","../src/stream.ts","../src/providers/palsu.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ToolResultContent,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport { GGAIError, ProviderError, formatError, formatErrorForDisplay } from \"./errors.js\";\nexport type { ErrorSource, FormattedError } from \"./errors.js\";\n\n// Provider-level diagnostics (raw SSE event types, etc.)\nexport { setProviderDiagnostic } from \"./utils/diag.js\";\nexport type { ProviderDiagnosticFn } from \"./utils/diag.js\";\n\n// Palsu provider (testing)\nexport {\n registerPalsuProvider,\n palsuText,\n palsuThinking,\n palsuToolCall,\n palsuAssistantMessage,\n} from \"./providers/palsu.js\";\nexport type {\n PalsuProviderHandle,\n PalsuProviderConfig,\n PalsuProviderState,\n PalsuResponse,\n PalsuResponseFactory,\n PalsuModelConfig,\n PalsuModelHandle,\n} from \"./providers/palsu.js\";\n","/**\n * Error model for gg-ai and downstream consumers.\n *\n * Every error users see should answer one question: \"is this me or them?\"\n * That answer drives whether they retry, switch model, log in, or report a\n * ggcoder bug. The `FormattedError` shape captures it in plain English:\n *\n * ✗ OpenAI returned an error.\n * An error occurred while processing your request...\n * → This is an OpenAI issue, not ggcoder. Retry — if it persists, check status.openai.com.\n *\n * ✗ ggcoder hit an unexpected error.\n * Cannot read property 'foo' of undefined\n * → This is a ggcoder bug — please report it.\n */\n\nexport type ErrorSource = \"provider\" | \"ggcoder\" | \"network\" | \"auth\";\n\nexport interface FormattedError {\n /** Plain-English headline, e.g. \"OpenAI returned an error.\" */\n headline: string;\n /** Machine-readable classification. */\n source: ErrorSource;\n /** Detailed message body from the underlying error (no JSON, no tag prefix). */\n message: string;\n /** Action line — tells the user whether to retry, switch model, log in, or report a bug. */\n guidance: string;\n /** Provider name when source === \"provider\". */\n provider?: string;\n /** HTTP status code if known. */\n statusCode?: number;\n /** Provider request ID, kept for telemetry / debug — not shown by default. */\n requestId?: string;\n}\n\nexport class GGAIError extends Error {\n readonly source: ErrorSource;\n readonly requestId?: string;\n readonly hint?: string;\n\n constructor(\n message: string,\n options?: {\n source?: ErrorSource;\n requestId?: string;\n hint?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = \"GGAIError\";\n this.source = options?.source ?? \"ggcoder\";\n this.requestId = options?.requestId;\n this.hint = options?.hint;\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: {\n statusCode?: number;\n requestId?: string;\n hint?: string;\n cause?: unknown;\n },\n ) {\n super(message, {\n source: \"provider\",\n requestId: options?.requestId,\n hint: options?.hint,\n cause: options?.cause,\n });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n\n/**\n * Display names for every provider we support. Used in headlines so users\n * see \"OpenAI returned an error.\" rather than the slug \"openai\".\n */\nconst PROVIDER_DISPLAY: Record<string, string> = {\n openai: \"OpenAI\",\n anthropic: \"Anthropic\",\n gemini: \"Gemini\",\n glm: \"Z.AI (GLM)\",\n moonshot: \"Moonshot\",\n deepseek: \"DeepSeek\",\n openrouter: \"OpenRouter\",\n xiaomi: \"Xiaomi (MiMo)\",\n minimax: \"MiniMax\",\n};\n\n/** Status pages for providers that publish one. */\nconst PROVIDER_STATUS_URL: Record<string, string> = {\n openai: \"status.openai.com\",\n anthropic: \"status.anthropic.com\",\n};\n\nfunction providerDisplayName(provider: string): string {\n return PROVIDER_DISPLAY[provider] ?? provider;\n}\n\n/**\n * Normalise any thrown value into a structured display object. Always returns\n * a non-empty `headline` and `guidance` so the UI never has to second-guess\n * what to show the user.\n */\nexport function formatError(err: unknown): FormattedError {\n if (err instanceof ProviderError) {\n const name = providerDisplayName(err.provider);\n const cleanMessage = cleanProviderMessage(err.message);\n return {\n headline: `${name} returned an error.`,\n source: \"provider\",\n message: cleanMessage,\n provider: err.provider,\n statusCode: err.statusCode,\n requestId: err.requestId,\n guidance: err.hint ?? providerGuidance(err.provider, cleanMessage, err.statusCode),\n };\n }\n\n if (err instanceof GGAIError) {\n return finaliseBySource(err.source, err.message, err.requestId, err.hint);\n }\n\n if (err instanceof Error) {\n const source = inferSource(err);\n return finaliseBySource(source, err.message, undefined, undefined);\n }\n\n return finaliseBySource(\"ggcoder\", String(err), undefined, undefined);\n}\n\nfunction finaliseBySource(\n source: ErrorSource,\n message: string,\n requestId: string | undefined,\n hint: string | undefined,\n): FormattedError {\n switch (source) {\n case \"network\":\n return {\n headline: \"Network error — couldn't reach the provider.\",\n source,\n message,\n guidance: hint ?? \"Check your internet connection. Not a ggcoder issue — retry shortly.\",\n ...(requestId ? { requestId } : {}),\n };\n case \"auth\":\n return {\n headline: \"Authentication issue.\",\n source,\n message,\n guidance: hint ?? \"Run `ggcoder login` to refresh your credentials.\",\n ...(requestId ? { requestId } : {}),\n };\n case \"provider\":\n // Provider source with no ProviderError instance — best effort.\n return {\n headline: \"Provider returned an error.\",\n source,\n message,\n guidance: hint ?? providerGuidance(undefined, message, undefined),\n ...(requestId ? { requestId } : {}),\n };\n case \"ggcoder\":\n return {\n headline: \"ggcoder hit an unexpected error.\",\n source,\n message,\n guidance:\n hint ?? \"This looks like a ggcoder bug — please report it to the developer (see /help).\",\n ...(requestId ? { requestId } : {}),\n };\n }\n}\n\n/**\n * Render a FormattedError as a multi-line string for terminal display.\n *\n * Format:\n * <headline>\n * <message>\n * → <guidance>\n */\nexport function formatErrorForDisplay(err: unknown): string {\n const f = formatError(err);\n const lines = [f.headline];\n if (f.message && f.message !== f.headline) lines.push(` ${f.message}`);\n lines.push(` → ${f.guidance}`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Strip legacy `[provider]` / `[provider:name]` prefix from a message body,\n * so older ProviderError messages render cleanly under the new headline\n * system without doubling up.\n */\nfunction cleanProviderMessage(message: string): string {\n return message.replace(/^\\[[^\\]]+\\]\\s*/, \"\").trim();\n}\n\nfunction inferSource(err: Error): ErrorSource {\n const msg = err.message.toLowerCase();\n const code = (err as { code?: string }).code ?? \"\";\n if (\n code === \"ECONNREFUSED\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ENOTFOUND\" ||\n code === \"ECONNRESET\" ||\n msg.includes(\"fetch failed\") ||\n msg.includes(\"network request failed\")\n ) {\n return \"network\";\n }\n if (\n msg.includes(\"not logged in\") ||\n msg.includes(\"token exchange failed\") ||\n msg.includes(\"token refresh failed\") ||\n msg.includes(\"invalid_grant\")\n ) {\n return \"auth\";\n }\n return \"ggcoder\";\n}\n\n/**\n * Build the action line for a provider error: tells the user whether to\n * retry, switch model, check billing, or whether it's serious enough to\n * report. Always frames the source plainly (\"This is an OpenAI issue\") so\n * the user knows to NOT report it to the ggcoder dev.\n */\nfunction providerGuidance(\n provider: string | undefined,\n message: string,\n statusCode: number | undefined,\n): string {\n const name = provider ? providerDisplayName(provider) : \"the provider\";\n const status = provider ? PROVIDER_STATUS_URL[provider] : undefined;\n const lower = message.toLowerCase();\n\n if (statusCode === 401 || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\n return `Authentication failed with ${name}. Run \\`ggcoder login\\` to refresh your credentials.`;\n }\n if (lower.includes(\"overloaded\") || lower.includes(\"engine_overloaded\")) {\n return `${name}'s servers are overloaded right now. Retry in a moment — not a ggcoder issue.`;\n }\n if (\n lower.includes(\"insufficient balance\") ||\n lower.includes(\"quota exceeded\") ||\n lower.includes(\"recharge\") ||\n lower.includes(\"no resource package\")\n ) {\n return `Your ${name} account has a billing or quota issue — check your balance. Not a ggcoder issue.`;\n }\n if (statusCode === 429 || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\n return `${name} rate limit hit. Wait a moment then retry — not a ggcoder issue.`;\n }\n if (statusCode === 502 || lower.includes(\"bad gateway\")) {\n return `${name} returned a bad gateway. Retry — this is on their side, not ggcoder.`;\n }\n if (statusCode === 503 || lower.includes(\"service unavailable\")) {\n return `${name} is temporarily unavailable. Retry shortly — not a ggcoder issue.`;\n }\n if (\n statusCode === 500 ||\n lower.includes(\"server_error\") ||\n (lower.includes(\"500\") && lower.includes(\"internal server error\"))\n ) {\n return status\n ? `This is an error from ${name}, not ggcoder. Retry — if it keeps happening, check ${status}.`\n : `This is an error from ${name}, not ggcoder. Retry — if it keeps happening, try a different model with /model.`;\n }\n if (lower.includes(\"timeout\") || lower.includes(\"timed out\")) {\n return `Request to ${name} timed out. Their servers may be slow — retry. Not a ggcoder issue.`;\n }\n if (\n lower.includes(\"does not recognize the requested model\") ||\n (lower.includes(\"model\") &&\n (lower.includes(\"not exist\") || lower.includes(\"not found\") || lower.includes(\"no access\")))\n ) {\n return `${name} doesn't recognise this model on your account. Use /model to switch, or check your subscription tier.`;\n }\n if (lower.includes(\"context_length_exceeded\") || lower.includes(\"prompt is too long\")) {\n return `Context window for this ${name} model is full. Run /compact to shrink history, or start a new session.`;\n }\n return status\n ? `This is an error from ${name}, not ggcoder. Retry — if it persists, check ${status}.`\n : `This is an error from ${name}, not ggcoder. Retry — if it persists, try a different model with /model.`;\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction createClient(options: StreamOptions): Anthropic {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n return new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n // Allow SDK retries for connection-level failures (socket hang up, 500s,\n // connection refused). Our stall detection handles abort-initiated retries\n // separately — SDK retries only fire on genuine transport errors.\n maxRetries: 2,\n ...(isOAuth\n ? {\n defaultHeaders: {\n // Anthropic's OAuth edge validates the claude-cli version. Callers\n // (ggcoder) resolve the live version at runtime; the literal here\n // is the offline fallback for direct gg-ai consumers.\n \"user-agent\": options.userAgent ?? \"claude-cli/2.1.75 (external, cli)\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n}\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const client = createClient(options);\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n const useStreaming = options.streaming !== false;\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const supportsFirstPartyToolExtras =\n !options.baseUrl || options.baseUrl.includes(\"api.anthropic.com\");\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system: rawSystem, messages } = toAnthropicMessages(downgradedMessages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? (() => {\n // Build the tools array with server-side tools taking precedence over\n // client tools that share their name. Anthropic rejects duplicate tool\n // names with a 400, so when both a client `web_search` (from a non-\n // anthropic provider's tool list left over after a /model switch) and\n // the native server-side web_search are present, drop the client one.\n const reservedServerNames = new Set<string>();\n if (options.webSearch) reservedServerNames.add(\"web_search\");\n for (const t of options.serverTools ?? []) {\n const name = (t as { name?: string }).name;\n if (name) reservedServerNames.add(name);\n }\n const clientTools = options.tools?.length\n ? toAnthropicTools(\n options.tools.filter((t) => !reservedServerNames.has(t.name)),\n {\n ...(supportsFirstPartyToolExtras && cacheControl ? { cacheControl } : {}),\n ...(supportsFirstPartyToolExtras ? { enableFineGrainedToolStreaming: true } : {}),\n },\n )\n : [];\n return {\n tools: [\n ...clientTools,\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n };\n })()\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: useStreaming,\n } as Anthropic.MessageCreateParams;\n\n // Adaptive thinking models (Opus 4.8, Opus 4.7, Opus 4.6, Sonnet 4.6) don't need the\n // interleaved-thinking beta — they have it built in.\n const hasAdaptiveThinking =\n options.model.includes(\"opus-4-8\") ||\n options.model.includes(\"opus-4.8\") ||\n options.model.includes(\"opus-4-7\") ||\n options.model.includes(\"opus-4.7\") ||\n options.model.includes(\"opus-4-6\") ||\n options.model.includes(\"opus-4.6\") ||\n options.model.includes(\"sonnet-4-6\") ||\n options.model.includes(\"sonnet-4.6\");\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n \"fine-grained-tool-streaming-2025-05-14\",\n ...(!hasAdaptiveThinking ? [\"interleaved-thinking-2025-05-14\"] : []),\n ];\n\n const requestOptions = {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n };\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final Message. Used by the agent loop after the\n // SSE stream has stalled repeatedly -- broken streaming connections often\n // recover when the request is replayed over a plain HTTP response.\n if (!useStreaming) {\n try {\n const message = (await client.messages.create(\n { ...params, stream: false } as Anthropic.MessageCreateParamsNonStreaming,\n requestOptions,\n )) as Anthropic.Message;\n yield* synthesizeEventsFromMessage(message);\n return messageToResponse(message);\n } catch (err) {\n throw toError(err);\n }\n }\n\n const stream = client.messages.stream(params, requestOptions);\n\n // ── Accumulation state ──────────────────────────────────\n const contentParts: ContentPart[] = [];\n\n // Per-block accumulators indexed by content_block_start index\n const blocks = new Map<\n number,\n {\n type: string;\n text: string;\n thinking: string;\n signature: string;\n toolId: string;\n toolName: string;\n argsJson: string;\n input: unknown;\n raw: Record<string, unknown> | null;\n }\n >();\n\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead: number | undefined;\n let cacheWrite: number | undefined;\n let stopReason: string | null = null;\n\n const keepalive = { type: \"keepalive\" as const };\n\n try {\n for await (const event of stream as AsyncIterable<Anthropic.MessageStreamEvent>) {\n switch (event.type) {\n case \"message_start\": {\n const usage = event.message.usage;\n inputTokens = usage.input_tokens;\n const usageAny = usage as unknown as Record<string, unknown>;\n if (usageAny.cache_read_input_tokens != null) {\n cacheRead = usageAny.cache_read_input_tokens as number;\n }\n if (usageAny.cache_creation_input_tokens != null) {\n cacheWrite = usageAny.cache_creation_input_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n case \"content_block_start\": {\n const block = event.content_block;\n const idx = event.index;\n const accum = {\n type: block.type,\n text: \"\",\n thinking: \"\",\n signature: \"\",\n toolId: \"\",\n toolName: \"\",\n argsJson: \"\",\n input: undefined as unknown,\n raw: null as Record<string, unknown> | null,\n };\n\n if (block.type === \"tool_use\") {\n accum.toolId = block.id;\n accum.toolName = block.name;\n accum.input = (block as unknown as { input?: unknown }).input;\n } else if (block.type === \"server_tool_use\") {\n accum.toolId = (block as unknown as { id: string }).id;\n accum.toolName = (block as unknown as { name: string }).name;\n accum.input = (block as unknown as { input: unknown }).input;\n } else if (block.type === \"redacted_thinking\") {\n // Encrypted thinking block — capture the raw data for round-tripping.\n // The API requires these to be sent back verbatim in multi-turn conversations.\n accum.raw = block as unknown as Record<string, unknown>;\n }\n\n blocks.set(idx, accum);\n // Surface \"reasoning started\" as an empty thinking_delta the moment\n // a thinking content block opens, so the UI flips to the thinking\n // phase before the first delta with real content arrives.\n if (block.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: \"\" };\n } else {\n yield keepalive;\n }\n break;\n }\n\n case \"content_block_delta\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n const delta = event.delta as unknown as Record<string, unknown>;\n const deltaType = delta.type as string;\n\n if (deltaType === \"text_delta\") {\n const text = delta.text as string;\n accum.text += text;\n yield { type: \"text_delta\", text };\n } else if (deltaType === \"thinking_delta\") {\n const text = delta.thinking as string;\n accum.thinking += text;\n yield { type: \"thinking_delta\", text };\n } else if (deltaType === \"input_json_delta\") {\n const partialJson = delta.partial_json as string;\n accum.argsJson += partialJson;\n yield {\n type: \"toolcall_delta\",\n id: accum.toolId,\n name: accum.toolName,\n argsJson: partialJson,\n };\n } else if (deltaType === \"signature_delta\") {\n accum.signature = delta.signature as string;\n }\n break;\n }\n\n case \"content_block_stop\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n if (accum.type === \"text\") {\n contentParts.push({ type: \"text\", text: accum.text });\n } else if (accum.type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: accum.thinking,\n signature: accum.signature,\n });\n yield keepalive;\n } else if (accum.type === \"tool_use\") {\n let args: Record<string, unknown> = isJsonObject(accum.input) ? accum.input : {};\n if (accum.argsJson) {\n try {\n const parsed = JSON.parse(accum.argsJson) as unknown;\n args = isJsonObject(parsed) ? parsed : {};\n } catch {\n // malformed JSON — keep start-block input fallback when available\n }\n }\n const tc: ToolCall = {\n type: \"tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n args,\n };\n contentParts.push(tc);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n };\n } else if (accum.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n input: accum.input,\n };\n contentParts.push(stc);\n yield {\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n };\n } else if (accum.type === \"redacted_thinking\" && accum.raw) {\n contentParts.push({ type: \"raw\", data: accum.raw });\n yield keepalive;\n } else {\n // Retrieve the full block from the SDK's accumulated message\n // for block types we don't explicitly accumulate (e.g. web_search_tool_result)\n const msg = stream.currentMessage;\n const rawBlock = msg?.content[event.index] as unknown as\n | Record<string, unknown>\n | undefined;\n if (rawBlock) {\n const blockType = rawBlock.type as string;\n if (blockType === \"web_search_tool_result\") {\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: rawBlock.tool_use_id as string,\n resultType: blockType,\n data: rawBlock,\n };\n contentParts.push(str);\n yield {\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n };\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: rawBlock });\n }\n }\n }\n\n blocks.delete(event.index);\n break;\n }\n\n case \"message_delta\": {\n const delta = event.delta as unknown as Record<string, unknown>;\n if (delta.stop_reason) {\n stopReason = delta.stop_reason as string;\n }\n const usage = event.usage as unknown as Record<string, unknown> | undefined;\n if (usage?.output_tokens != null) {\n outputTokens = usage.output_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n // message_stop — loop exits naturally\n\n default:\n // Unhandled event types (e.g. \"ping\" heartbeats) — yield keepalive\n // so the idle timer in the agent loop resets on any API activity.\n yield keepalive;\n break;\n }\n }\n } catch (err) {\n throw toError(err);\n }\n\n const normalizedStop = normalizeAnthropicStopReason(stopReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizedStop,\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n\n yield { type: \"done\", stopReason: normalizedStop };\n return response;\n}\n\n/**\n * Walk a non-streaming Anthropic Message and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per block\n * rather than token-by-token -- the agent loop consumer doesn't care about\n * granularity, only completeness.\n */\nfunction* synthesizeEventsFromMessage(message: Anthropic.Message): Generator<StreamEvent, void> {\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n const text = blk.text as string;\n if (text) yield { type: \"text_delta\", text };\n } else if (type === \"thinking\") {\n const text = blk.thinking as string;\n if (text) yield { type: \"thinking_delta\", text };\n } else if (type === \"tool_use\") {\n const argsJson = JSON.stringify(blk.input ?? {});\n yield {\n type: \"toolcall_delta\",\n id: blk.id as string,\n name: blk.name as string,\n argsJson,\n };\n yield {\n type: \"toolcall_done\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n };\n } else if (type === \"server_tool_use\") {\n yield {\n type: \"server_toolcall\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n };\n } else if (type === \"web_search_tool_result\") {\n yield {\n type: \"server_toolresult\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n };\n }\n // Other block types (redacted_thinking, compaction blocks) are preserved\n // in the response via messageToResponse but don't emit events.\n }\n yield { type: \"done\", stopReason: normalizeAnthropicStopReason(message.stop_reason) };\n}\n\n/** Convert a non-streaming Anthropic Message into our StreamResponse shape. */\nfunction messageToResponse(message: Anthropic.Message): StreamResponse {\n const contentParts: ContentPart[] = [];\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n contentParts.push({ type: \"text\", text: blk.text as string });\n } else if (type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: blk.thinking as string,\n signature: (blk.signature as string) ?? \"\",\n });\n } else if (type === \"tool_use\") {\n contentParts.push({\n type: \"tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n });\n } else if (type === \"server_tool_use\") {\n contentParts.push({\n type: \"server_tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n });\n } else if (type === \"web_search_tool_result\") {\n contentParts.push({\n type: \"server_tool_result\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n });\n } else {\n // Preserve unknown blocks (redacted_thinking, compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: blk });\n }\n }\n\n const usage = message.usage as unknown as Record<string, unknown>;\n const inputTokens = (usage.input_tokens as number) ?? 0;\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const cacheRead = usage.cache_read_input_tokens as number | undefined;\n const cacheWrite = usage.cache_creation_input_tokens as number | undefined;\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizeAnthropicStopReason(message.stop_reason),\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n // Anthropic exposes request IDs as `requestID` in current SDKs, `request_id`\n // in older/compat shapes, and sometimes inside the streamed error body.\n const errorBody = err.error as Record<string, unknown> | undefined;\n const nestedError = errorBody?.error as Record<string, unknown> | undefined;\n const requestId =\n (err as unknown as { requestID?: string | null }).requestID ??\n (err as unknown as { request_id?: string | null }).request_id ??\n (typeof errorBody?.request_id === \"string\" ? errorBody.request_id : undefined) ??\n (typeof nestedError?.request_id === \"string\" ? nestedError.request_id : undefined) ??\n undefined;\n const bodyMessage =\n typeof nestedError?.message === \"string\"\n ? nestedError.message\n : typeof errorBody?.message === \"string\"\n ? errorBody.message\n : undefined;\n const bodyType =\n typeof nestedError?.type === \"string\"\n ? nestedError.type\n : typeof errorBody?.type === \"string\"\n ? errorBody.type\n : typeof (err as unknown as { type?: unknown }).type === \"string\"\n ? ((err as unknown as { type: string }).type as string)\n : undefined;\n const message =\n bodyType && bodyMessage ? `${bodyType}: ${bodyMessage}` : (bodyMessage ?? err.message);\n\n return new ProviderError(\"anthropic\", message, {\n statusCode: err.status,\n ...(requestId ? { requestId } : {}),\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Pull-based stream result. Wraps an async generator that yields\n * StreamEvents and returns a StreamResponse. Also thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n *\n * The generator is pumped eagerly — events flow into an internal\n * buffer regardless of whether a consumer is iterating. This avoids\n * the push-based EventStream's stall bugs (lost wakeups, single\n * resolve field, iterator starvation).\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly response: Promise<StreamResponse>;\n private buffer: StreamEvent[] = [];\n private done = false;\n private error: Error | null = null;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private resolveWait: (() => void) | null = null;\n\n constructor(generator: AsyncGenerator<StreamEvent, StreamResponse>) {\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n this.pump(generator);\n }\n\n private async pump(generator: AsyncGenerator<StreamEvent, StreamResponse>): Promise<void> {\n try {\n let next = await generator.next();\n while (!next.done) {\n this.buffer.push(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n next = await generator.next();\n }\n this.done = true;\n this.resolveResponse(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error = error;\n this.done = true;\n this.rejectResponse(error);\n this.resolveWait?.();\n this.resolveWait = null;\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n let index = 0;\n while (true) {\n while (index < this.buffer.length) {\n yield this.buffer[index++]!;\n }\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolveWait = r;\n // Guard against race: pump may have advanced between the while-check\n // and this promise registration. Re-check and resolve immediately.\n if (this.buffer.length > index || this.done || this.error) {\n this.resolveWait = null;\n r();\n }\n });\n }\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.response.then(onfulfilled, onrejected);\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for provider tool\n * parameter definitions.\n *\n * Anthropic's `input_schema` validator is strict in two ways:\n *\n * 1. The root must be `type: \"object\"`. Returns 400 with\n * `tools.N.custom.input_schema.type: Field required` otherwise.\n *\n * 2. The root must NOT contain `oneOf`, `anyOf`, or `allOf`. Returns 400 with\n * `input_schema does not support oneOf, allOf, or anyOf at the top level`.\n *\n * Both rules trip whenever a tool's parameters are defined via\n * `z.discriminatedUnion(...)` or `z.union(...)` — Zod 4's\n * `z.toJSONSchema` emits `{oneOf: [...]}` at the root with no `type`.\n *\n * The fix is to collapse the union into a single flat object schema:\n *\n * - properties = union of all branch properties (later branches win on\n * conflict; that's fine because the model only uses these for hints —\n * Zod's actual `tool.parameters.parse(args)` is the real validator)\n * - required = intersection of branch `required` arrays (a field is only\n * required if EVERY branch requires it)\n * - if the union has a discriminator field (every branch has the same\n * property as a `const`), we replace the discriminator's per-branch\n * `const` with an `enum` listing every literal — the model gets a clear\n * hint of the valid action values without needing oneOf\n *\n * The flattening is lossy for *schema-level* constraints (e.g. \"if action=X,\n * then field Y is required\") — Zod still enforces those at parse time. For\n * the model's purposes this is identical to a single object with optional\n * fields and a discriminator enum, which is exactly how Anthropic-supported\n * tools are typically authored anyway.\n */\n\ntype JsonSchema = Record<string, unknown>;\n\nexport function zodToJsonSchema(schema: z.ZodType): JsonSchema {\n const jsonSchema = z.toJSONSchema(schema) as JsonSchema;\n const { $schema: _schema, ...rest } = jsonSchema;\n return normalizeRootForAnthropic(rest);\n}\n\n/**\n * Recursively flatten a root discriminated/plain union into a single object\n * schema. Only operates at the ROOT — nested unions inside properties are\n * left intact (Anthropic accepts those just fine; only the top-level\n * input_schema is restricted).\n */\nfunction normalizeRootForAnthropic(schema: JsonSchema): JsonSchema {\n const branches = (schema.oneOf ?? schema.anyOf) as JsonSchema[] | undefined;\n if (!branches || branches.length === 0) {\n // Already an object root or a primitive — Anthropic only sees object\n // params, so primitive roots will fail elsewhere; that's not our bug.\n return schema;\n }\n\n // All branches must be object schemas to flatten. If any isn't, fall\n // back to wrapping with type:\"object\" — better than failing outright.\n const allObjects = branches.every((b) => b.type === \"object\");\n if (!allObjects) {\n return { type: \"object\", ...schema };\n }\n\n const mergedProps: Record<string, JsonSchema> = {};\n const requiredCounts: Record<string, number> = {};\n const enumCandidate: Record<string, Set<string | number | boolean>> = {};\n const everyBranchHas: Record<string, number> = {};\n\n for (const branch of branches) {\n const props = (branch.properties ?? {}) as Record<string, JsonSchema>;\n const required = (branch.required ?? []) as string[];\n\n for (const [key, prop] of Object.entries(props)) {\n everyBranchHas[key] = (everyBranchHas[key] ?? 0) + 1;\n // Last-wins merge — fine, since these are model hints only.\n mergedProps[key] = { ...mergedProps[key], ...prop };\n\n // Track const candidates for discriminator collapse.\n if (prop && typeof prop === \"object\" && \"const\" in prop) {\n const v = prop.const as string | number | boolean;\n enumCandidate[key] = enumCandidate[key] ?? new Set();\n enumCandidate[key].add(v);\n }\n }\n for (const r of required) {\n requiredCounts[r] = (requiredCounts[r] ?? 0) + 1;\n }\n }\n\n // For any property where every branch had a `const` of the same primitive\n // type, replace that property's `const` with an `enum` listing all\n // observed literals. This is the discriminator collapse.\n for (const [key, values] of Object.entries(enumCandidate)) {\n if (everyBranchHas[key] === branches.length && values.size > 1) {\n const list = [...values];\n // Drop `const` (mutually exclusive with enum), keep type from one branch.\n const { const: _const, ...rest } = mergedProps[key];\n mergedProps[key] = { ...rest, enum: list };\n }\n }\n\n // A field is required only if EVERY branch lists it as required.\n const required = Object.entries(requiredCounts)\n .filter(([, count]) => count === branches.length)\n .map(([key]) => key);\n\n // Pull through any non-conflicting metadata from the union root\n // (description, title, etc.) — drop oneOf/anyOf/allOf themselves.\n const {\n oneOf: _o,\n anyOf: _a,\n allOf: _all,\n type: _t,\n properties: _p,\n required: _r,\n ...meta\n } = schema;\n\n const out: JsonSchema = {\n ...meta,\n type: \"object\",\n properties: mergedProps,\n };\n if (required.length > 0) out.required = required;\n return out;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n ImageContent,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n ToolResultContent,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Shared helpers ─────────────────────────────────────────\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\n\n/** Replace image blocks with a text placeholder (deduping consecutive placeholders). */\nfunction stripImages(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n const out: TextContent[] = [];\n let lastWasPlaceholder = false;\n for (const block of content) {\n if (block.type === \"image\") {\n if (!lastWasPlaceholder) out.push({ type: \"text\", text: placeholder });\n lastWasPlaceholder = true;\n continue;\n }\n out.push(block);\n lastWasPlaceholder = block.text === placeholder;\n }\n return out;\n}\n\n/**\n * Pre-transform pass: when the target model doesn't support images, replace\n * image blocks in user messages and tool_result messages with a text placeholder.\n * Called before provider-specific transforms.\n */\nexport function downgradeUnsupportedImages(\n messages: Message[],\n supportsImages: boolean | undefined,\n): Message[] {\n if (supportsImages !== false) return messages;\n return messages.map((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n return { ...msg, content: stripImages(msg.content, NON_VISION_USER_IMAGE_PLACEHOLDER) };\n }\n if (msg.role === \"tool\") {\n return {\n ...msg,\n content: msg.content.map((tr) =>\n Array.isArray(tr.content)\n ? {\n ...tr,\n content: stripImages(tr.content, NON_VISION_TOOL_IMAGE_PLACEHOLDER),\n }\n : tr,\n ),\n };\n }\n return msg;\n });\n}\n\n/** Extract concatenated text from tool_result content (array or string). */\nfunction toolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\n/** Extract image blocks from tool_result content. Returns empty array for string content. */\nfunction toolResultImages(content: ToolResultContent): ImageContent[] {\n if (typeof content === \"string\") return [];\n return content.filter((b): b is ImageContent => b.type === \"image\");\n}\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\ntype AnthropicImageSource = {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string;\n};\n\n/**\n * Convert tool_result content to Anthropic's wire format. Strings pass through;\n * arrays are mapped to Anthropic's (text | image) block format, which\n * tool_result.content accepts natively.\n */\nfunction toAnthropicToolResultContent(\n content: ToolResultContent,\n):\n | string\n | Array<{ type: \"text\"; text: string } | { type: \"image\"; source: AnthropicImageSource }> {\n if (typeof content === \"string\") return content;\n return content.map((block) => {\n if (block.type === \"text\") return { type: \"text\" as const, text: block.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: block.mediaType as AnthropicImageSource[\"media_type\"],\n data: block.data,\n },\n };\n });\n}\n\n/**\n * Anthropic requires tool_use IDs to match `^[a-zA-Z0-9_-]+$`. Codex tool IDs\n * are composite (`callId|itemId`) and other providers may include dots/colons.\n * Replace any disallowed characters with `_` and memoize so the assistant's\n * tool_use ID matches the corresponding tool_result.tool_use_id.\n */\nfunction remapAnthropicToolCallId(id: string, idMap: Map<string, string>): string {\n if (/^[a-zA-Z0-9_-]+$/.test(id)) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: remapAnthropicToolCallId(part.id, idMap),\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n // Skip assistant messages with no content blocks (can happen when all\n // blocks are filtered — e.g. thinking-only responses from non-Anthropic\n // providers where signature is missing and text is empty)\n if (Array.isArray(content) && content.length === 0) continue;\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: remapAnthropicToolCallId(result.toolCallId, idMap),\n content: toAnthropicToolResultContent(result.content),\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Anthropic supports block-level cache_control. GG Coder keeps reusable prompt\n // content before the \"<!-- uncached -->\" marker and volatile text (currently\n // the date) after it, so only the reusable prefix receives cache_control.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(\n tools: Tool[],\n options?: {\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" };\n enableFineGrainedToolStreaming?: boolean;\n },\n): Anthropic.Tool[] {\n return tools.map((tool, index) => {\n const anthropicTool: Anthropic.Tool & {\n cache_control?: { type: \"ephemeral\"; ttl?: \"1h\" };\n eager_input_streaming?: boolean;\n } = {\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n ...(options?.enableFineGrainedToolStreaming ? { eager_input_streaming: true } : {}),\n };\n if (options?.cacheControl && index === tools.length - 1) {\n anthropicTool.cache_control = options.cacheControl;\n }\n return anthropicTool;\n });\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-8|opus-4-7|opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.8 / Opus 4.7 / Opus 4.6 / Sonnet 4.6.\n // Anthropic's output_config.effort accepts low, medium, high, xhigh, and max.\n // xhigh is Opus 4.8/4.7-only; max is supported by Opus 4.8/4.7/4.6 and Sonnet 4.6.\n let effort: string = level;\n if (effort === \"xhigh\" && !/opus-4-8|opus-4-7/.test(model)) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"xhigh\"/\"max\" treated as \"high\")\n const effectiveLevel = level === \"xhigh\" || level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap Anthropic `toolu_*` tool call IDs to `call_*` so OpenAI accepts them.\n * Only Anthropic IDs need remapping — IDs from OpenAI-compatible providers\n * (Moonshot, GLM, Xiaomi, MiniMax) are passed through unchanged to avoid\n * breaking the provider's own ID validation.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (!id.startsWith(\"toolu_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.slice(5)}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string; thinking?: boolean; supportsImages?: boolean },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // OpenAI-style APIs receive the system prompt literally. They may do\n // provider-side prefix/key caching, but there is no Anthropic-style\n // uncached block split here; the marker remains ordinary text.\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const contentValue = parts || textParts || null;\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n // Skip assistant messages with no content and no tool_calls (can happen\n // with thinking-only responses) — providers like Xiaomi reject these.\n if (!contentValue && !hasToolCalls) continue;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: contentValue,\n ...(hasToolCalls ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn thinking coherence (non-standard field).\n // When thinking content exists, always include it for round-tripping.\n // When thinking is enabled but no content exists (e.g. after compaction),\n // Moonshot/Kimi requires reasoning_content on assistant tool_call messages —\n // default to empty string. GLM silently hangs on empty values, so skip it there.\n if (thinkingParts) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = thinkingParts;\n } else if (options?.thinking && hasToolCalls && options.provider !== \"glm\") {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n // OpenAI's `tool` role only accepts text. Emit the tool message with the\n // text content, then (if any tool results carried images and the model\n // supports vision) a follow-up `user` message carrying image_url blocks.\n const imageBlocks: OpenAI.ChatCompletionContentPartImage[] = [];\n for (const result of msg.content) {\n const text = toolResultText(result.content);\n const images = toolResultImages(result.content);\n const hasText = text.length > 0;\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: hasText ? text : \"(see attached image)\",\n });\n if (images.length > 0 && options?.supportsImages !== false) {\n for (const img of images) {\n imageBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${img.mediaType};base64,${img.data}` },\n });\n }\n }\n }\n if (imageBlocks.length > 0) {\n out.push({\n role: \"user\",\n content: [{ type: \"text\", text: \"Attached image(s) from tool result:\" }, ...imageBlocks],\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(\n level: ThinkingLevel,\n _model: string,\n): \"low\" | \"medium\" | \"high\" | \"xhigh\" {\n return level === \"max\" ? \"xhigh\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type {\n ContentPart,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\nimport { normalizePromptCacheKey } from \"./prompt-cache-key.js\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseToolArguments(argsJson: string): Record<string, unknown> {\n if (!argsJson) return {};\n try {\n const parsed = JSON.parse(argsJson) as unknown;\n const unwrapped = typeof parsed === \"string\" ? (JSON.parse(parsed) as unknown) : parsed;\n return isJsonObject(unwrapped) ? unwrapped : {};\n } catch {\n return {};\n }\n}\n\nfunction createClient(options: StreamOptions): OpenAI {\n return new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n}\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const providerName = options.provider ?? \"openai\";\n const useStreaming = options.streaming !== false;\n\n const client = createClient(options);\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam =\n options.provider === \"glm\" || options.provider === \"moonshot\" || options.provider === \"xiaomi\";\n\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const messages = toOpenAIMessages(downgradedMessages, {\n provider: options.provider,\n thinking: !!options.thinking,\n supportsImages: options.supportsImages,\n });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: useStreaming,\n ...(options.maxTokens ? { max_completion_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking, options.model) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n ...(useStreaming ? { stream_options: { include_usage: true } } : {}),\n };\n\n // Native web search is disabled for OpenAI-compatible providers — ggcoder\n // provides its own web_search/web_fetch tools which handle results properly.\n // Moonshot's $web_search was previously injected here but it returns opaque\n // results and triggers reasoning_content validation errors with thinking mode.\n\n // prompt_cache_key helps bucket similar requests for better cache hit rates.\n // Only send to providers known to support it (OpenAI, Moonshot/Kimi) — unknown\n // params may cause errors on other OpenAI-compatible providers like GLM or Xiaomi.\n if (options.provider === \"openai\" || options.provider === \"moonshot\") {\n const paramsAny = params as unknown as Record<string, unknown>;\n paramsAny.prompt_cache_key = normalizePromptCacheKey(options.promptCacheKey ?? \"ggcoder\");\n\n // Map cacheRetention to OpenAI's prompt_cache_retention param.\n // \"long\" → \"24h\" keeps cached prefixes active up to 24 hours (OpenAI feature).\n const retention = options.cacheRetention ?? \"short\";\n if (retention === \"long\") {\n paramsAny.prompt_cache_retention = \"24h\";\n }\n }\n\n if (options.provider === \"openai\" && options.serviceTier) {\n (params as unknown as Record<string, unknown>).service_tier = options.serviceTier;\n }\n\n // Inject custom thinking param for GLM/Moonshot/Xiaomi (not part of OpenAI spec)\n if (usesThinkingParam) {\n if (options.thinking) {\n (params as unknown as Record<string, unknown>).thinking = { type: \"enabled\" };\n } else {\n // All providers (GLM, Moonshot, Xiaomi MiMo) support explicit disabled.\n // MiMo is an always-on reasoning model — without { type: \"disabled\" } it\n // returns reasoning_content and may produce thinking-only responses with\n // no actionable output, causing the agent loop to silently end.\n (params as unknown as Record<string, unknown>).thinking = { type: \"disabled\" };\n }\n }\n\n // Dump request body for stall diagnosis when GGAI_DUMP_REQUEST is set\n if (\n (globalThis as Record<string, unknown>).process &&\n ((globalThis as Record<string, unknown>).process as Record<string, Record<string, string>>).env\n ?.GGAI_DUMP_REQUEST\n ) {\n const fs = await import(\"fs\");\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dumpPath = `/tmp/ggai-request-${ts}.json`;\n fs.writeFileSync(dumpPath, JSON.stringify(params, null, 2));\n fs.appendFileSync(\n \"/tmp/ggai-requests.log\",\n `[${ts}] ${dumpPath} messages=${params.messages.length}\\n`,\n );\n }\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final ChatCompletion. Used by the agent loop after\n // the streaming transport has stalled repeatedly -- flipping to a plain\n // request/response often recovers from broken SSE connections.\n if (!useStreaming) {\n try {\n const completion = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as OpenAI.ChatCompletion;\n yield* synthesizeEventsFromCompletion(completion, !!options.thinking);\n return completionToResponse(completion);\n } catch (err) {\n throw toError(err, providerName);\n }\n }\n\n let stream: AsyncIterable<OpenAI.ChatCompletionChunk>;\n try {\n stream = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as AsyncIterable<OpenAI.ChatCompletionChunk>;\n } catch (err) {\n throw toError(err, providerName);\n }\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n // Vendor-specific cache reporting fields:\n // - Kimi K2/K2.5 / StepFun: top-level `cached_tokens`\n // - DeepSeek / SiliconFlow: `prompt_cache_hit_tokens`\n // OpenAI / Zhipu (GLM) / MiniMax / Qwen / Mistral / xAI all use the\n // standard `prompt_tokens_details.cached_tokens` handled above.\n const usageAny = chunk.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n if (\n !cacheRead &&\n typeof usageAny.prompt_cache_hit_tokens === \"number\" &&\n usageAny.prompt_cache_hit_tokens > 0\n ) {\n cacheRead = usageAny.prompt_cache_hit_tokens as number;\n }\n // OpenAI's prompt_tokens includes cached tokens; subtract to match\n // Anthropic's convention where inputTokens excludes cache hits.\n inputTokens = chunk.usage.prompt_tokens - cacheRead;\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot, Xiaomi MiMo, DeepSeek)\n // Always accumulate reasoning_content for round-tripping in multi-turn\n // conversations (models like DeepSeek Reasoner require it on assistant\n // messages). Only yield thinking_delta to the UI when thinking is enabled\n // — reasoning models like MiMo always return reasoning_content even when\n // thinking is \"off\", which would cause a permanent \"Thinking\" indicator.\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n if (options.thinking) {\n yield { type: \"thinking_delta\", text: reasoningContent };\n }\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n yield { type: \"text_delta\", text: delta.content };\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n yield {\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n };\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot, Xiaomi reasoning_content)\n // Always include in response for multi-turn round-tripping, even when\n // thinking display is off — toOpenAIMessages sends it as reasoning_content.\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n const args = parseToolArguments(tc.argsJson);\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n };\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n yield { type: \"done\", stopReason };\n return response;\n}\n\n/**\n * Walk a non-streaming OpenAI ChatCompletion and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per field so\n * the agent loop consumer observes identical behaviour to streaming mode.\n */\nfunction* synthesizeEventsFromCompletion(\n completion: OpenAI.ChatCompletion,\n thinkingEnabled: boolean,\n): Generator<StreamEvent, void> {\n const choice = completion.choices?.[0];\n if (!choice) {\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(null) };\n return;\n }\n\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning / thinking content (GLM, Moonshot, DeepSeek)\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning && thinkingEnabled) {\n yield { type: \"thinking_delta\", text: reasoning };\n }\n\n // Text content\n if (typeof msg.content === \"string\" && msg.content) {\n yield { type: \"text_delta\", text: msg.content };\n }\n\n // Tool calls\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const argsJson = tc.function?.arguments ?? \"\";\n if (argsJson) {\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n argsJson,\n };\n }\n const args = parseToolArguments(argsJson);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n }\n }\n\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(choice.finish_reason ?? null) };\n}\n\n/** Convert a non-streaming OpenAI ChatCompletion into our StreamResponse shape. */\nfunction completionToResponse(completion: OpenAI.ChatCompletion): StreamResponse {\n const choice = completion.choices?.[0];\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n\n if (choice) {\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning content -- always included for multi-turn round-tripping\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning) {\n contentParts.push({ type: \"thinking\", text: reasoning });\n }\n\n if (typeof msg.content === \"string\" && msg.content) {\n textAccum = msg.content;\n contentParts.push({ type: \"text\", text: msg.content });\n }\n\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const args = parseToolArguments(tc.function?.arguments ?? \"\");\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n contentParts.push(toolCall);\n }\n }\n }\n\n // Usage -- match streaming path accounting (inputTokens excludes cache hits).\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n if (completion.usage) {\n outputTokens = completion.usage.completion_tokens;\n const details = completion.usage.prompt_tokens_details;\n if (details?.cached_tokens) cacheRead = details.cached_tokens;\n const usageAny = completion.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n if (\n !cacheRead &&\n typeof usageAny.prompt_cache_hit_tokens === \"number\" &&\n usageAny.prompt_cache_hit_tokens > 0\n ) {\n cacheRead = usageAny.prompt_cache_hit_tokens as number;\n }\n inputTokens = completion.usage.prompt_tokens - cacheRead;\n }\n\n const stopReason = normalizeOpenAIStopReason(choice?.finish_reason ?? null);\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum,\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n const body = err.error as Record<string, unknown> | undefined;\n const bodyMessage =\n typeof body?.message === \"string\" && body.message.trim() ? body.message.trim() : undefined;\n const modelName = typeof body?.model === \"string\" ? body.model : \"\";\n const cleanMessage = bodyMessage ?? err.message;\n\n let hint: string | undefined;\n if (modelName === \"codex-mini-latest\" || cleanMessage.includes(\"codex-mini-latest\")) {\n hint =\n \"codex-mini-latest requires an OpenAI Pro or Max subscription. \" +\n \"Your account currently has access to GPT-5.4 and GPT-5.4 Mini.\";\n }\n\n const requestId =\n (err as unknown as { request_id?: string }).request_id ??\n (typeof body?.request_id === \"string\" ? body.request_id : undefined);\n\n return new ProviderError(provider, cleanMessage, {\n statusCode: err.status,\n ...(requestId ? { requestId } : {}),\n ...(hint ? { hint } : {}),\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","const MAX_PROMPT_CACHE_KEY_LENGTH = 64;\n\nexport function normalizePromptCacheKey(key: string): string {\n if (key.length <= MAX_PROMPT_CACHE_KEY_LENGTH) return key;\n const hash = fnv1aHash(key);\n const prefixLength = MAX_PROMPT_CACHE_KEY_LENGTH - hash.length - 1;\n return `${key.slice(0, prefixLength)}:${hash}`;\n}\n\nfunction fnv1aHash(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index++) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n ImageContent,\n Message,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n TextContent,\n Tool,\n ToolCall,\n ToolResultContent,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerDiag } from \"../utils/diag.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\nimport { normalizePromptCacheKey } from \"./prompt-cache-key.js\";\nimport { downgradeUnsupportedImages } from \"./transform.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseToolArguments(argsJson: string): Record<string, unknown> {\n if (!argsJson) return {};\n try {\n const parsed = JSON.parse(argsJson) as unknown;\n const unwrapped = typeof parsed === \"string\" ? (JSON.parse(parsed) as unknown) : parsed;\n return isJsonObject(unwrapped) ? unwrapped : {};\n } catch {\n return {};\n }\n}\n\nfunction outputTextKey(itemId: string | undefined, contentIndex: number | undefined): string {\n return `${itemId ?? \"\"}:${contentIndex ?? 0}`;\n}\n\nfunction isVisibleOutputItem(itemType: string | undefined): boolean {\n return itemType === \"message\";\n}\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const downgraded = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system, input } = toCodexInput(downgraded, { supportsImages: options.supportsImages });\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n // Always set a prompt_cache_key. OpenAI uses this key to route requests\n // with the same prefix to the same cache shard — without it, the codex\n // backend hashes only the request body, so cache hits for shared\n // system+tool prefixes across separate sub-agent processes are accidental\n // rather than guaranteed.\n body.prompt_cache_key = normalizePromptCacheKey(options.promptCacheKey ?? \"ggcoder\");\n // Map cacheRetention to OpenAI's prompt_cache_retention. \"long\" pins the\n // cached prefix for up to 24h (vs the default 5–10 min in-memory window).\n if (options.cacheRetention === \"long\") {\n body.prompt_cache_retention = \"24h\";\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n body.reasoning = {\n effort: options.thinking ?? \"none\",\n summary: \"auto\",\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n // The chatgpt.com codex backend routes prompt cache lookups by header, not\n // body — `prompt_cache_key` in the body alone never produces a cache hit\n // here (verified against gpt-5.5 with a 22k-token shared prefix). Pinning\n // both `session_id` and `x-client-request-id` to the cache scope is what\n // makes consecutive requests hit the same cache shard.\n const cacheScopeId = body.prompt_cache_key as string | undefined;\n if (cacheScopeId) {\n headers[\"session_id\"] = cacheScopeId;\n headers[\"x-client-request-id\"] = cacheScopeId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n const parsed = parseCodexErrorBody(text);\n const message = parsed.message ?? `Codex API returned HTTP ${response.status}.`;\n const requestId =\n parsed.requestId ??\n response.headers.get(\"x-request-id\") ??\n response.headers.get(\"openai-request-id\") ??\n response.headers.get(\"x-oai-request-id\") ??\n undefined;\n\n let hint: string | undefined;\n if (response.status === 400 && text.includes(\"not supported\")) {\n if (options.model === \"gpt-5.5-pro\") {\n hint = \"Use gpt-5.5 instead. OpenAI's Codex model catalog does not list gpt-5.5-pro.\";\n } else {\n hint =\n \"This model is not available through Codex for the authenticated account. \" +\n \"Run /model and choose a model listed for OpenAI Codex, or check your Codex model picker/usage limits.\";\n }\n } else if (response.status === 404 && text.includes(\"does not exist\")) {\n hint =\n \"This model is not in the current OpenAI Codex catalog for this account. \" +\n \"Try gpt-5.5, gpt-5.4, gpt-5.4-mini, or gpt-5.3-codex.\";\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n ...(requestId ? { requestId } : {}),\n ...(hint ? { hint } : {}),\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n const outputItemTypes = new Map<string, string>();\n const outputTextByPart = new Map<string, string>();\n const pendingOutputTextByPart = new Map<\n string,\n { itemId: string; contentIndex: number; text: string }\n >();\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n\n // ── Diagnostic: log the first occurrence of each raw SSE event type with\n // timing, so we can see what Codex sends during the pre-reasoning window\n // and decide whether earlier signals are available to drive the UI.\n const diagStart = Date.now();\n const diagSeen = new Set<string>();\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (!diagSeen.has(type)) {\n diagSeen.add(type);\n providerDiag(\"codex_event_first\", { type, sinceStartMs: Date.now() - diagStart });\n }\n\n if (type === \"error\") {\n // Codex Responses streams two error shapes:\n // { type:\"error\", error:{ type, code, message, param }, sequence_number }\n // { type:\"error\", code, message, param, sequence_number }\n // Pick the first message field we find; fall back to the chunk code/type\n // rather than dumping the raw JSON at the user.\n const nested = (event.error as Record<string, unknown> | undefined) ?? undefined;\n const message =\n (nested?.message as string | undefined) ??\n (event.message as string | undefined) ??\n \"Codex stream emitted an error chunk without a message.\";\n const code =\n (nested?.code as string | undefined) ??\n (nested?.type as string | undefined) ??\n (event.code as string | undefined) ??\n \"server_error\";\n // OpenAI sometimes embeds the request ID inside the human-readable\n // message (\"…request ID abc123 in your message\"); fish it out so the\n // FormattedError can surface it on its own line.\n const requestId = extractCodexRequestId(message) ?? (event.request_id as string | undefined);\n throw new ProviderError(\"openai\", message, {\n ...(requestId != null ? { requestId } : {}),\n ...(code === \"server_error\" ? { statusCode: 500 } : {}),\n });\n }\n\n if (type === \"response.failed\") {\n const nested = event.error as Record<string, unknown> | undefined;\n const message = (nested?.message as string | undefined) ?? \"Codex response failed.\";\n const requestId = extractCodexRequestId(message) ?? (event.request_id as string | undefined);\n throw new ProviderError(\"openai\", message, {\n ...(requestId != null ? { requestId } : {}),\n });\n }\n\n // Text delta. OpenAI documents response.output_text.* as output content\n // text, while reasoning has separate response.reasoning*_text.delta events.\n // The ChatGPT Codex transport can occasionally attach output_text chunks to\n // reasoning or send text before item metadata. Never expose output_text unless\n // the item is positively identified as a visible assistant message.\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string | undefined;\n const contentIndex = event.content_index as number | undefined;\n const key = outputTextKey(itemId, contentIndex);\n outputTextByPart.set(key, `${outputTextByPart.get(key) ?? \"\"}${delta}`);\n const itemType = itemId ? outputItemTypes.get(itemId) : undefined;\n if (itemId && isVisibleOutputItem(itemType)) {\n textAccum += delta;\n yield { type: \"text_delta\", text: delta };\n } else if (itemId && itemType == null) {\n const pending = pendingOutputTextByPart.get(key);\n pendingOutputTextByPart.set(key, {\n itemId,\n contentIndex: contentIndex ?? 0,\n text: `${pending?.text ?? \"\"}${delta}`,\n });\n }\n }\n\n // Text done. The final event can contain text not seen in deltas; emit only\n // the missing suffix so consumers don't see duplicate visible output, and\n // only after item metadata proves the part belongs to a message.\n if (type === \"response.output_text.done\") {\n const fullText = event.text as string | undefined;\n if (fullText) {\n const itemId = event.item_id as string | undefined;\n const contentIndex = event.content_index as number | undefined;\n const key = outputTextKey(itemId, contentIndex);\n const streamedText = outputTextByPart.get(key) ?? \"\";\n const missingText = streamedText ? fullText.slice(streamedText.length) : fullText;\n outputTextByPart.set(key, fullText);\n if (missingText && fullText.startsWith(streamedText)) {\n const itemType = itemId ? outputItemTypes.get(itemId) : undefined;\n if (itemId && isVisibleOutputItem(itemType)) {\n textAccum += missingText;\n yield { type: \"text_delta\", text: missingText };\n } else if (itemId && itemType == null) {\n const pending = pendingOutputTextByPart.get(key);\n pendingOutputTextByPart.set(key, {\n itemId,\n contentIndex: contentIndex ?? 0,\n text: `${pending?.text ?? \"\"}${missingText}`,\n });\n }\n }\n }\n }\n\n // Thinking delta\n if (\n type === \"response.reasoning_summary_text.delta\" ||\n type === \"response.reasoning_summary.delta\" ||\n type === \"response.reasoning_text.delta\" ||\n type === \"response.reasoning.delta\"\n ) {\n const delta = event.delta as string;\n if (options.thinking) yield { type: \"thinking_delta\", text: delta };\n }\n\n // Reasoning item started — the model has begun reasoning on the server.\n // Surface this as an empty thinking_delta so the UI can flip to the\n // \"thinking\" phase ~3s before the summary text actually starts streaming.\n // (Codex emits this at ~1s vs reasoning_summary_text.delta at ~4–10s.)\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n const itemId = item?.id as string | undefined;\n const itemType = item?.type as string | undefined;\n if (itemId && itemType) {\n outputItemTypes.set(itemId, itemType);\n }\n if (itemType === \"reasoning\" && options.thinking) {\n yield { type: \"thinking_delta\", text: \"\" };\n }\n if (itemId && itemType) {\n const pending = [...pendingOutputTextByPart.entries()]\n .filter(([, pendingPart]) => pendingPart.itemId === itemId)\n .sort(([, a], [, b]) => a.contentIndex - b.contentIndex);\n for (const [key, pendingPart] of pending) {\n pendingOutputTextByPart.delete(key);\n if (!pendingPart.text) continue;\n if (isVisibleOutputItem(itemType)) {\n textAccum += pendingPart.text;\n yield { type: \"text_delta\", text: pendingPart.text };\n }\n }\n }\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n };\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n const args = parseToolArguments(tc.argsJson);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n };\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as\n | (Record<string, number> & {\n input_tokens_details?: { cached_tokens?: number };\n })\n | undefined;\n if (usage) {\n cacheRead = usage.input_tokens_details?.cached_tokens ?? 0;\n inputTokens = (usage.input_tokens ?? 0) - cacheRead;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n const args = parseToolArguments(tc.argsJson);\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n yield { type: \"done\", stopReason };\n return streamResponse;\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction codexToolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\nfunction toCodexInput(\n messages: Message[],\n options?: { supportsImages?: boolean },\n): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n const toolImages: ImageContent[] = [];\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n const text = codexToolResultText(result.content);\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: text.length > 0 ? text : \"(see attached image)\",\n });\n if (options?.supportsImages !== false && Array.isArray(result.content)) {\n for (const block of result.content) {\n if (block.type === \"image\") toolImages.push(block);\n }\n }\n }\n if (toolImages.length > 0) {\n input.push({\n type: \"message\",\n role: \"user\",\n content: [\n { type: \"input_text\", text: \"Attached image(s) from tool result:\" },\n ...toolImages.map((img) => ({\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${img.mediaType};base64,${img.data}`,\n })),\n ],\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// OpenAI's server_error messages embed the request ID inline (\"…request ID\n// abc123 in your message\"). Pull it out so we can surface it as a structured\n// field rather than leaving it buried in the message.\nfunction extractCodexRequestId(message: string): string | undefined {\n const match = message.match(/request ID ([a-z0-9-]{8,})/i);\n return match?.[1];\n}\n\n// HTTP error bodies come back as JSON or plain text. Try to extract a clean\n// message string + request_id so we never spill the raw JSON into the UI.\nfunction parseCodexErrorBody(text: string): { message?: string; requestId?: string } {\n if (!text) return {};\n try {\n const parsed = JSON.parse(text) as Record<string, unknown>;\n const error = parsed.error as Record<string, unknown> | undefined;\n const detail = parsed.detail as unknown;\n const message =\n (error?.message as string | undefined) ??\n (parsed.message as string | undefined) ??\n (typeof detail === \"string\" ? detail : undefined);\n const requestId =\n (parsed.request_id as string | undefined) ??\n (error?.request_id as string | undefined) ??\n (message ? extractCodexRequestId(message) : undefined);\n return { ...(message ? { message } : {}), ...(requestId ? { requestId } : {}) };\n } catch {\n // Non-JSON body — return the trimmed text directly, capped so we never\n // splat a huge HTML error page.\n const trimmed = text.trim().slice(0, 240);\n return trimmed ? { message: trimmed } : {};\n }\n}\n","/**\n * Provider-level diagnostic hook. Mirrors the pattern used by gg-agent's\n * setStreamDiagnostic — the host app wires a callback (typically writing to\n * a debug log) and providers call `providerDiag(...)` to record interesting\n * lifecycle events (e.g. raw SSE event types and timings).\n */\nexport type ProviderDiagnosticFn = (phase: string, data?: Record<string, unknown>) => void;\n\nlet _diagFn: ProviderDiagnosticFn | null = null;\n\n/** Register a diagnostic callback for provider-level tracing. */\nexport function setProviderDiagnostic(fn: ProviderDiagnosticFn | null): void {\n _diagFn = fn;\n}\n\nexport function providerDiag(phase: string, data?: Record<string, unknown>): void {\n _diagFn?.(phase, data);\n}\n","import type {\n ContentPart,\n Message,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n ToolChoice,\n ToolResultContent,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { downgradeUnsupportedImages } from \"./transform.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_CODE_ASSIST_BASE_URL = \"https://cloudcode-pa.googleapis.com\";\nconst CODE_ASSIST_API_VERSION = \"v1internal\";\nconst GEMINI_CLI_USER_AGENT = \"google-gemini-cli\";\nconst GEMINI_CLI_API_CLIENT = \"gemini-cli/0.0.0\";\nconst CODE_ASSIST_NON_STREAMING_RETRIES = 3;\nconst CODE_ASSIST_NON_STREAMING_RETRY_DELAY_MS = 1_000;\nconst SYNTHETIC_THOUGHT_SIGNATURE = \"skip_thought_signature_validator\";\nconst CODE_ASSIST_SUPPORTED_MODELS = new Set([\n \"gemini-3-pro-preview\",\n \"gemini-3.1-pro-preview\",\n \"gemini-3.1-pro-preview-customtools\",\n \"gemini-3-flash-preview\",\n \"gemini-3.1-flash-lite-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n \"gemma-4-31b-it\",\n \"gemma-4-26b-a4b-it\",\n]);\n\ninterface GeminiTextPart {\n text: string;\n thought?: boolean;\n thoughtSignature?: string;\n}\n\ninterface GeminiInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\ninterface GeminiFunctionCallPart {\n functionCall: {\n id?: string;\n name: string;\n args?: Record<string, unknown>;\n };\n thoughtSignature?: string;\n}\n\ninterface GeminiFunctionResponsePart {\n functionResponse: {\n id?: string;\n name: string;\n response: Record<string, unknown>;\n };\n}\n\ntype GeminiPart =\n | GeminiTextPart\n | GeminiInlineDataPart\n | GeminiFunctionCallPart\n | GeminiFunctionResponsePart;\n\ninterface GeminiContent {\n role?: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n }>;\n}\n\ninterface GeminiGenerationConfig {\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n thinkingConfig?: {\n includeThoughts?: boolean;\n thinkingBudget?: number;\n thinkingLevel?: \"LOW\" | \"MEDIUM\" | \"HIGH\";\n };\n}\n\ninterface GeminiGenerateContentRequest {\n contents: GeminiContent[];\n systemInstruction?: GeminiContent;\n tools?: GeminiTool[];\n toolConfig?: {\n functionCallingConfig: {\n mode: \"AUTO\" | \"NONE\" | \"ANY\";\n allowedFunctionNames?: string[];\n };\n };\n generationConfig?: GeminiGenerationConfig;\n session_id?: string;\n}\n\ninterface GeminiCodeAssistRequest {\n model: string;\n project?: string;\n user_prompt_id: string;\n request: GeminiGenerateContentRequest;\n}\n\ninterface GeminiRequestPlan {\n url: URL;\n headers: Record<string, string>;\n body: GeminiCodeAssistRequest;\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface GeminiGenerateResponse {\n traceId?: string;\n response?: {\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n };\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n}\n\ninterface ParsedSseEvent {\n event?: string;\n data: string;\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getEnvironment(): Record<string, string | undefined> | undefined {\n return (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n}\n\nfunction getGoogleProject(options: StreamOptions): string | undefined {\n const env = getEnvironment();\n return options.projectId ?? env?.GOOGLE_CLOUD_PROJECT ?? env?.GOOGLE_CLOUD_PROJECT_ID;\n}\n\nfunction getCodeAssistEndpoint(method: string): URL {\n const env = getEnvironment();\n const endpoint = env?.CODE_ASSIST_ENDPOINT ?? DEFAULT_CODE_ASSIST_BASE_URL;\n const version = env?.CODE_ASSIST_API_VERSION || CODE_ASSIST_API_VERSION;\n return new URL(`${endpoint}/${version}:${method}`);\n}\n\nfunction formatUnsupportedModelMessage(model: string): string {\n return `Gemini OAuth is configured to use the Gemini Code Assist subscription endpoint only. That endpoint does not currently expose model \"${model}\".`;\n}\n\nfunction formatErrorMessage(status: number, body: string, model: string): string {\n if (status === 404 && !CODE_ASSIST_SUPPORTED_MODELS.has(model)) {\n return `Gemini API error (404): ${body}\\n\\n${formatUnsupportedModelMessage(model)}`;\n }\n return `Gemini API error (${status}): ${body}`;\n}\n\nfunction toSystemAndContents(messages: Message[]): {\n systemInstruction?: GeminiContent;\n contents: GeminiContent[];\n} {\n let systemText = \"\";\n const contents: GeminiContent[] = [];\n const toolNamesById = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = systemText ? `${systemText}\\n\\n${msg.content}` : msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts:\n typeof msg.content === \"string\"\n ? [{ text: msg.content }]\n : msg.content.map((part): GeminiPart => {\n if (part.type === \"text\") return { text: part.text };\n return { inlineData: { mimeType: part.mediaType, data: part.data } };\n }),\n });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n const source = msg.content;\n if (typeof source === \"string\") {\n if (source) parts.push({ text: source });\n } else {\n for (const part of source) {\n if (part.type === \"text\" && part.text) {\n parts.push({ text: part.text });\n } else if (part.type === \"thinking\" && part.text) {\n parts.push({ text: part.text });\n } else if (part.type === \"tool_call\") {\n toolNamesById.set(part.id, part.name);\n parts.push({\n functionCall: { id: part.id, name: part.name, args: part.args },\n thoughtSignature: SYNTHETIC_THOUGHT_SIGNATURE,\n });\n }\n }\n }\n if (parts.length > 0) contents.push({ role: \"model\", parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n const parts: GeminiPart[] = [];\n for (const result of msg.content) {\n const name = toolNamesById.get(result.toolCallId) ?? result.toolCallId;\n const content =\n typeof result.content === \"string\"\n ? result.content\n : stringifyToolContent(result.content);\n parts.push({\n functionResponse: {\n id: result.toolCallId,\n name,\n response: {\n content,\n ...(result.isError ? { isError: true } : {}),\n },\n },\n });\n }\n if (parts.length > 0) contents.push({ role: \"user\", parts });\n }\n }\n\n return {\n ...(systemText ? { systemInstruction: { parts: [{ text: systemText }] } } : {}),\n contents,\n };\n}\n\nfunction stringifyToolContent(content: Exclude<ToolResultContent, string>): string {\n return content\n .map((part) => (part.type === \"text\" ? part.text : `[image ${part.mediaType}]`))\n .join(\"\\n\");\n}\n\nfunction toGeminiTools(tools: Tool[] | undefined): GeminiTool[] | undefined {\n if (!tools?.length) return undefined;\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: sanitizeSchema(tool.rawInputSchema ?? zodToJsonSchema(tool.parameters)),\n })),\n },\n ];\n}\n\nfunction sanitizeSchema(schema: Record<string, unknown>): Record<string, unknown> {\n const clone = JSON.parse(JSON.stringify(schema)) as Record<string, unknown>;\n stripUnsupportedSchemaFields(clone);\n return clone;\n}\n\nfunction stripUnsupportedSchemaFields(value: unknown): void {\n if (!isJsonObject(value)) {\n if (Array.isArray(value)) {\n for (const item of value) stripUnsupportedSchemaFields(item);\n }\n return;\n }\n\n delete value.$schema;\n delete value.additionalProperties;\n\n for (const item of Object.values(value)) {\n if (isJsonObject(item) || Array.isArray(item)) {\n stripUnsupportedSchemaFields(item);\n }\n }\n}\n\nfunction toGeminiToolConfig(\n choice: ToolChoice | undefined,\n tools: Tool[] | undefined,\n): GeminiGenerateContentRequest[\"toolConfig\"] | undefined {\n if (!choice || !tools?.length) return undefined;\n if (choice === \"auto\") return { functionCallingConfig: { mode: \"AUTO\" } };\n if (choice === \"none\") return { functionCallingConfig: { mode: \"NONE\" } };\n if (choice === \"required\") return { functionCallingConfig: { mode: \"ANY\" } };\n return { functionCallingConfig: { mode: \"ANY\", allowedFunctionNames: [choice.name] } };\n}\n\nfunction isGemini3Model(model: string): boolean {\n return /^gemini-3(?:\\.|-|$)/.test(model);\n}\n\nfunction toGemini3ThinkingLevel(\n level: NonNullable<StreamOptions[\"thinking\"]>,\n): \"LOW\" | \"MEDIUM\" | \"HIGH\" {\n switch (level) {\n case \"low\":\n return \"LOW\";\n case \"medium\":\n return \"MEDIUM\";\n case \"high\":\n case \"xhigh\":\n case \"max\":\n return \"HIGH\";\n }\n}\n\nfunction toThinkingBudget(level: NonNullable<StreamOptions[\"thinking\"]>): number {\n switch (level) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 8_192;\n case \"high\":\n case \"xhigh\":\n case \"max\":\n return 8_192;\n }\n}\n\nfunction toThinkingConfig(\n model: string,\n level: StreamOptions[\"thinking\"],\n): GeminiGenerationConfig[\"thinkingConfig\"] | undefined {\n if (!level) return undefined;\n if (isGemini3Model(model)) {\n return {\n includeThoughts: true,\n thinkingLevel: toGemini3ThinkingLevel(level),\n };\n }\n return {\n includeThoughts: true,\n thinkingBudget: toThinkingBudget(level),\n };\n}\n\nfunction buildGenerateRequest(options: StreamOptions): GeminiGenerateContentRequest {\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { systemInstruction, contents } = toSystemAndContents(downgradedMessages);\n const tools = toGeminiTools(options.tools);\n const toolConfig = toGeminiToolConfig(options.toolChoice, options.tools);\n const thinkingConfig = toThinkingConfig(options.model, options.thinking);\n const generationConfig: GeminiGenerationConfig = {\n ...(options.maxTokens ? { maxOutputTokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { topP: options.topP } : {}),\n ...(options.stop ? { stopSequences: options.stop } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n\n return {\n contents,\n ...(systemInstruction ? { systemInstruction } : {}),\n ...(tools ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n ...(Object.keys(generationConfig).length > 0 ? { generationConfig } : {}),\n ...(options.promptCacheKey ? { session_id: options.promptCacheKey } : {}),\n };\n}\n\nfunction buildCodeAssistRequest(\n options: StreamOptions,\n request: GeminiGenerateContentRequest,\n projectId?: string,\n): GeminiCodeAssistRequest {\n return {\n model: options.model,\n ...(projectId ? { project: projectId } : {}),\n user_prompt_id: crypto.randomUUID(),\n request,\n };\n}\n\nfunction buildRequestPlan(options: StreamOptions, method: string): GeminiRequestPlan {\n if (!CODE_ASSIST_SUPPORTED_MODELS.has(options.model)) {\n throw new ProviderError(\"gemini\", formatUnsupportedModelMessage(options.model));\n }\n\n const projectId = getGoogleProject(options);\n const request = buildGenerateRequest(options);\n\n return {\n url: getCodeAssistEndpoint(method),\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": GEMINI_CLI_USER_AGENT,\n \"X-Goog-Api-Client\": GEMINI_CLI_API_CLIENT,\n },\n body: buildCodeAssistRequest(options, request, projectId),\n };\n}\n\nfunction normalizeGeminiStopReason(reason: string | undefined): StreamResponse[\"stopReason\"] {\n switch (reason) {\n case \"MAX_TOKENS\":\n return \"max_tokens\";\n case \"STOP\":\n return \"stop_sequence\";\n case \"SAFETY\":\n case \"RECITATION\":\n case \"BLOCKLIST\":\n case \"PROHIBITED_CONTENT\":\n case \"SPII\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nfunction parseSseEvents(buffer: string): { events: ParsedSseEvent[]; remaining: string } {\n const events: ParsedSseEvent[] = [];\n let cursor = 0;\n\n while (true) {\n const next = buffer.indexOf(\"\\n\\n\", cursor);\n if (next === -1) break;\n const raw = buffer.slice(cursor, next);\n cursor = next + 2;\n\n let eventName: string | undefined;\n const dataLines: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(\"event:\".length).trim();\n } else if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n\n if (dataLines.length > 0) {\n events.push({ event: eventName, data: dataLines.join(\"\\n\") });\n }\n }\n\n return { events, remaining: buffer.slice(cursor) };\n}\n\nasync function* streamSse(response: Response): AsyncGenerator<GeminiGenerateResponse> {\n if (!response.body) return;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n const parsed = parseSseEvents(buffer);\n buffer = parsed.remaining;\n for (const event of parsed.events) {\n if (event.data === \"[DONE]\") continue;\n yield JSON.parse(event.data) as GeminiGenerateResponse;\n }\n }\n buffer += decoder.decode().replace(/\\r\\n/g, \"\\n\");\n const parsed = parseSseEvents(buffer + \"\\n\\n\");\n for (const event of parsed.events) {\n if (event.data === \"[DONE]\") continue;\n yield JSON.parse(event.data) as GeminiGenerateResponse;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction candidatesFromResponse(response: GeminiGenerateResponse): GeminiCandidate[] | undefined {\n return response.response?.candidates ?? response.candidates;\n}\n\nfunction usageFromResponse(response: GeminiGenerateResponse): GeminiUsageMetadata | undefined {\n return response.response?.usageMetadata ?? response.usageMetadata;\n}\n\nfunction partsFromResponse(response: GeminiGenerateResponse): GeminiPart[] {\n return candidatesFromResponse(response)?.[0]?.content?.parts ?? [];\n}\n\nfunction finishReasonFromResponse(response: GeminiGenerateResponse): string | undefined {\n return candidatesFromResponse(response)?.[0]?.finishReason;\n}\n\nfunction readTextPart(part: GeminiPart): { text: string; thought: boolean } | undefined {\n return \"text\" in part ? { text: part.text, thought: part.thought === true } : undefined;\n}\n\nfunction readFunctionCallPart(\n part: GeminiPart,\n): { id?: string; name: string; args: Record<string, unknown> } | undefined {\n if (!(\"functionCall\" in part)) return undefined;\n return {\n ...(part.functionCall.id ? { id: part.functionCall.id } : {}),\n name: part.functionCall.name,\n args: isJsonObject(part.functionCall.args) ? part.functionCall.args : {},\n };\n}\n\nfunction makeToolCallId(index: number, providerId?: string): string {\n return providerId ?? `gemini_call_${index}_${crypto.randomUUID().replace(/-/g, \"\")}`;\n}\n\nfunction shouldRetryCodeAssistStatus(status: number): boolean {\n return status === 429 || status === 499 || (status >= 500 && status <= 599);\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof Error && err.name === \"AbortError\";\n}\n\nasync function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => signal?.removeEventListener(\"abort\", onAbort);\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n cleanup();\n reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (signal?.aborted) onAbort();\n });\n}\n\nasync function fetchCodeAssist(plan: GeminiRequestPlan, options: StreamOptions): Promise<Response> {\n try {\n const response = await fetch(plan.url, {\n method: \"POST\",\n headers: plan.headers,\n body: JSON.stringify(plan.body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new ProviderError(\"gemini\", formatErrorMessage(response.status, text, options.model), {\n statusCode: response.status,\n });\n }\n\n return response;\n } catch (err) {\n throw toError(err);\n }\n}\n\nasync function fetchCodeAssistWithRetry(\n plan: GeminiRequestPlan,\n options: StreamOptions,\n): Promise<Response> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= CODE_ASSIST_NON_STREAMING_RETRIES; attempt++) {\n try {\n return await fetchCodeAssist(plan, options);\n } catch (err) {\n const error = toError(err);\n const statusCode = error instanceof ProviderError ? error.statusCode : undefined;\n if (\n options.signal?.aborted ||\n isAbortError(error) ||\n attempt === CODE_ASSIST_NON_STREAMING_RETRIES ||\n (statusCode != null && !shouldRetryCodeAssistStatus(statusCode))\n ) {\n throw error;\n }\n lastError = error;\n }\n\n try {\n await sleep(CODE_ASSIST_NON_STREAMING_RETRY_DELAY_MS, options.signal);\n } catch (err) {\n throw toError(err);\n }\n }\n\n throw lastError ?? new ProviderError(\"gemini\", \"Gemini Code Assist request failed.\");\n}\n\nexport function streamGemini(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const useStreaming = options.streaming !== false;\n const method = useStreaming ? \"streamGenerateContent\" : \"generateContent\";\n const plan = buildRequestPlan(options, method);\n if (useStreaming) plan.url.searchParams.set(\"alt\", \"sse\");\n\n const response = useStreaming\n ? await fetchCodeAssist(plan, options)\n : await fetchCodeAssistWithRetry(plan, options);\n\n const contentParts: ContentPart[] = [];\n const pendingToolCalls: ToolCall[] = [];\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let stopReason: StreamResponse[\"stopReason\"] = \"end_turn\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let toolIndex = 0;\n\n const handleResponse = function* (chunk: GeminiGenerateResponse): Generator<StreamEvent> {\n const usage = usageFromResponse(chunk);\n if (usage) {\n inputTokens = usage.promptTokenCount ?? inputTokens;\n outputTokens = usage.candidatesTokenCount ?? outputTokens;\n cacheRead = usage.cachedContentTokenCount ?? cacheRead;\n }\n\n const reason = finishReasonFromResponse(chunk);\n if (reason) stopReason = normalizeGeminiStopReason(reason);\n\n for (const part of partsFromResponse(chunk)) {\n const textPart = readTextPart(part);\n if (textPart) {\n if (textPart.thought) {\n thinkingAccum += textPart.text;\n yield { type: \"thinking_delta\", text: textPart.text };\n } else {\n textAccum += textPart.text;\n yield { type: \"text_delta\", text: textPart.text };\n }\n continue;\n }\n\n const functionCall = readFunctionCallPart(part);\n if (functionCall) {\n const id = makeToolCallId(toolIndex++, functionCall.id);\n const argsJson = JSON.stringify(functionCall.args);\n pendingToolCalls.push({\n type: \"tool_call\",\n id,\n name: functionCall.name,\n args: functionCall.args,\n });\n yield { type: \"toolcall_delta\", id, name: functionCall.name, argsJson };\n }\n }\n };\n\n try {\n if (useStreaming) {\n for await (const chunk of streamSse(response)) {\n yield* handleResponse(chunk);\n }\n } else {\n const chunk = (await response.json()) as GeminiGenerateResponse;\n yield* handleResponse(chunk);\n }\n } catch (err) {\n throw toError(err);\n }\n\n if (thinkingAccum) contentParts.push({ type: \"thinking\", text: thinkingAccum });\n if (textAccum) contentParts.push({ type: \"text\", text: textAccum });\n\n for (const toolCall of pendingToolCalls) {\n contentParts.push(toolCall);\n yield {\n type: \"toolcall_done\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n };\n }\n\n if (pendingToolCalls.length > 0) stopReason = \"tool_use\";\n\n const adjustedInputTokens = Math.max(0, inputTokens - cacheRead);\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum,\n },\n stopReason,\n usage: {\n inputTokens: adjustedInputTokens,\n outputTokens,\n ...(cacheRead > 0 ? { cacheRead } : {}),\n },\n };\n\n yield { type: \"done\", stopReason };\n return streamResponse;\n}\n\nfunction toError(err: unknown): Error {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) return new ProviderError(\"gemini\", err.message, { cause: err });\n return new ProviderError(\"gemini\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { streamGemini } from \"./providers/gemini.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI coding API endpoint — the primary endpoint for all GLM models. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"xiaomi\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://token-plan-sgp.xiaomimimo.com/v1\",\n webSearch: false,\n }),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"gemini\", {\n stream: (options) => streamGemini(options),\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? GLM_CODING_BASE_URL,\n }),\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\nproviderRegistry.register(\"deepseek\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.deepseek.com/v1\",\n }),\n});\n\nproviderRegistry.register(\"openrouter\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://openrouter.ai/api/v1\",\n }),\n});\n\nproviderRegistry.register(\"minimax\", {\n stream: (options) =>\n streamAnthropic({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.minimax.io/anthropic\",\n // MiniMax's Anthropic-compatible API does not support Anthropic-specific\n // server tools (web_search), context_management, or server-side tools.\n webSearch: false,\n compaction: false,\n clearToolUses: false,\n serverTools: undefined,\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n","import type {\n AssistantMessage,\n ContentPart,\n Message,\n StopReason,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Usage,\n} from \"../types.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerRegistry } from \"../provider-registry.js\";\n\n// ── Response Types ────────────────────────────────────────\n\nexport interface PalsuProviderState {\n callCount: number;\n}\n\nexport type PalsuResponseFactory = (\n messages: Message[],\n options: StreamOptions,\n state: PalsuProviderState,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type PalsuResponse = AssistantMessage | PalsuResponseFactory;\n\n// ── Helper Constructors ──────────────��────────────────────\n\n/** Create an assistant message with a single text block. */\nexport function palsuText(text: string): AssistantMessage {\n return { role: \"assistant\", content: text ? [{ type: \"text\", text }] : [] };\n}\n\n/** Create an assistant message with a thinking block and optional text reply. */\nexport function palsuThinking(thinking: string, text?: string): AssistantMessage {\n const content: ContentPart[] = [{ type: \"thinking\", text: thinking }];\n if (text) content.push({ type: \"text\", text });\n return { role: \"assistant\", content };\n}\n\n/** Create an assistant message with a single tool call. */\nexport function palsuToolCall(\n name: string,\n args: Record<string, unknown>,\n id?: string,\n): AssistantMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"tool_call\", id: id ?? `palsu_${name}_${Date.now()}`, name, args }],\n };\n}\n\n/** Create an assistant message from content parts with optional stop reason. */\nexport function palsuAssistantMessage(\n content: ContentPart[],\n options?: { stopReason?: StopReason },\n): AssistantMessage & { _stopReason?: StopReason } {\n return { role: \"assistant\", content, _stopReason: options?.stopReason };\n}\n\n// ── Streaming Simulation ────────────���─────────────────────\n\nconst DEFAULT_CHUNK_SIZE = 20;\n\nfunction chunkText(text: string, size: number): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += size) {\n chunks.push(text.slice(i, i + size));\n }\n return chunks.length > 0 ? chunks : [\"\"];\n}\n\ninterface CacheUsage {\n cacheRead: number;\n cacheWrite: number;\n}\n\nasync function* simulateStream(\n message: AssistantMessage,\n stopReason: StopReason,\n signal?: AbortSignal,\n cacheUsage?: CacheUsage,\n): AsyncGenerator<StreamEvent, StreamResponse> {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n ? [{ type: \"text\" as const, text: message.content }]\n : []\n : message.content;\n\n let outputChars = 0;\n\n for (const part of content) {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n if (part.type === \"text\") {\n const chunks = chunkText(part.text, DEFAULT_CHUNK_SIZE);\n for (const chunk of chunks) {\n yield { type: \"text_delta\", text: chunk };\n outputChars += chunk.length;\n }\n } else if (part.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: part.text };\n outputChars += part.text.length;\n } else if (part.type === \"tool_call\") {\n const argsJson = JSON.stringify(part.args);\n yield { type: \"toolcall_delta\", id: part.id, name: part.name, argsJson };\n yield { type: \"toolcall_done\", id: part.id, name: part.name, args: part.args };\n outputChars += argsJson.length;\n }\n }\n\n // Rough token estimate: ~4 chars per token\n const outputTokens = Math.max(1, Math.ceil(outputChars / 4));\n const usage: Usage = {\n inputTokens: 100,\n outputTokens,\n ...(cacheUsage?.cacheRead ? { cacheRead: cacheUsage.cacheRead } : {}),\n ...(cacheUsage?.cacheWrite ? { cacheWrite: cacheUsage.cacheWrite } : {}),\n };\n\n yield { type: \"done\", stopReason };\n return { message, stopReason, usage };\n}\n\n// ── Prompt Cache Simulation ���─────────────────────────────\n\nfunction computeCacheUsage(current: string, previous: string | null): CacheUsage {\n if (!previous) {\n // First call — everything is a cache write\n return { cacheRead: 0, cacheWrite: Math.ceil(current.length / 4) };\n }\n // Find common prefix length\n const maxLen = Math.min(current.length, previous.length);\n let commonLen = 0;\n for (let i = 0; i < maxLen; i++) {\n if (current[i] !== previous[i]) break;\n commonLen++;\n }\n return {\n cacheRead: Math.ceil(commonLen / 4),\n cacheWrite: Math.ceil((current.length - commonLen) / 4),\n };\n}\n\n// ── Model Config ─────────────────────────────────────────\n\nexport interface PalsuModelConfig {\n /** Default response for this model when its queue is empty. */\n defaultResponse?: PalsuResponse;\n}\n\ninterface ModelState {\n responses: PalsuResponse[];\n defaultResponse?: PalsuResponse;\n}\n\n// ── Registration Handle ───────────────────────────────────\n\nexport interface PalsuModelHandle {\n /** Replace this model's response queue. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to this model's queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in this model's queue. */\n getPendingResponseCount(): number;\n}\n\nexport interface PalsuProviderHandle {\n /** Replace the shared response queue entirely. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to the shared queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in the shared queue. */\n getPendingResponseCount(): number;\n /** Mutable state — tracks call count. */\n state: PalsuProviderState;\n /** Get a handle for a model-specific response queue. */\n getModel(name: string): PalsuModelHandle;\n /** Remove this provider from the registry. */\n unregister(): void;\n}\n\nexport interface PalsuProviderConfig {\n /** Provider name to register under. Default: \"palsu\". */\n name?: string;\n /** Response returned when all queues are empty. Default: empty text message. */\n defaultResponse?: PalsuResponse;\n /** Enable prompt cache simulation. Tracks common message prefixes across calls. */\n promptCache?: boolean;\n /** Model-specific configurations with per-model response queues. */\n models?: Record<string, PalsuModelConfig>;\n}\n\n// ── Main Registration Function ────────────────────────────\n\n/**\n * Register a palsu (mock) LLM provider for testing.\n * Returns a handle to control responses and inspect state.\n *\n * ```ts\n * const palsu = registerPalsuProvider();\n * palsu.appendResponses(palsuText(\"Hello!\"));\n *\n * const result = await stream({ provider: \"palsu\", model: \"test\", messages });\n * console.log(result.message); // { role: \"assistant\", content: [{ type: \"text\", text: \"Hello!\" }] }\n *\n * palsu.unregister(); // cleanup\n * ```\n */\nexport function registerPalsuProvider(config?: PalsuProviderConfig): PalsuProviderHandle {\n const name = config?.name ?? \"palsu\";\n const responses: PalsuResponse[] = [];\n const state: PalsuProviderState = { callCount: 0 };\n const defaultResponse = config?.defaultResponse ?? palsuText(\"\");\n const enableCache = config?.promptCache ?? false;\n let lastMessagesSerialized: string | null = null;\n\n // Initialize model-specific state\n const modelStates = new Map<string, ModelState>();\n if (config?.models) {\n for (const [modelName, modelConfig] of Object.entries(config.models)) {\n modelStates.set(modelName, {\n responses: [],\n defaultResponse: modelConfig.defaultResponse,\n });\n }\n }\n\n const handle: PalsuProviderHandle = {\n setResponses(r) {\n responses.length = 0;\n responses.push(...r);\n },\n appendResponses(...r) {\n responses.push(...r);\n },\n getPendingResponseCount() {\n return responses.length;\n },\n state,\n getModel(modelName: string): PalsuModelHandle {\n if (!modelStates.has(modelName)) {\n modelStates.set(modelName, { responses: [] });\n }\n const ms = modelStates.get(modelName)!;\n return {\n setResponses(r) {\n ms.responses.length = 0;\n ms.responses.push(...r);\n },\n appendResponses(...r) {\n ms.responses.push(...r);\n },\n getPendingResponseCount() {\n return ms.responses.length;\n },\n };\n },\n unregister() {\n providerRegistry.unregister(name);\n },\n };\n\n providerRegistry.register(name, {\n stream(options: StreamOptions): StreamResult {\n state.callCount++;\n\n // Resolve response: model-specific queue → shared queue → model default → shared default\n const ms = modelStates.get(options.model);\n const responseDef =\n (ms && ms.responses.length > 0 ? ms.responses.shift() : undefined) ??\n (responses.length > 0 ? responses.shift() : undefined) ??\n ms?.defaultResponse ??\n defaultResponse;\n\n // Compute cache usage before streaming (needs messages serialized)\n let cacheUsage: CacheUsage | undefined;\n if (enableCache) {\n const serialized = JSON.stringify(options.messages);\n cacheUsage = computeCacheUsage(serialized, lastMessagesSerialized);\n lastMessagesSerialized = serialized;\n }\n\n const gen = (async function* (): AsyncGenerator<StreamEvent, StreamResponse> {\n // Resolve factory (sync or async) then stream\n const rawMessage =\n typeof responseDef === \"function\"\n ? responseDef(options.messages, options, state)\n : responseDef;\n const message = await Promise.resolve(rawMessage);\n\n const hasToolCalls =\n Array.isArray(message.content) && message.content.some((p) => p.type === \"tool_call\");\n const explicitStop = (message as { _stopReason?: StopReason })._stopReason;\n const stopReason = explicitStop ?? (hasToolCalls ? \"tool_use\" : \"end_turn\");\n\n return yield* simulateStream(message, stopReason, options.signal, cacheUsage);\n })();\n\n return new StreamResult(gen);\n },\n });\n\n return handle;\n}\n"],"mappings":"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","names":["required","Anthropic","stream","isJsonObject","createClient","OpenAI","runStream","toError","stream","isJsonObject","parseToolArguments","runStream","os","isJsonObject","parsed","toError","runStream"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/providers/anthropic.ts","../src/utils/event-stream.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/prompt-cache-key.ts","../src/providers/openai-codex.ts","../src/utils/diag.ts","../src/providers/gemini.ts","../src/provider-registry.ts","../src/stream.ts","../src/providers/palsu.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ToolResultContent,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport {\n GGAIError,\n ProviderError,\n formatError,\n formatErrorForDisplay,\n isUsageLimitError,\n} from \"./errors.js\";\nexport type { ErrorSource, FormattedError } from \"./errors.js\";\n\n// Provider-level diagnostics (raw SSE event types, etc.)\nexport { setProviderDiagnostic } from \"./utils/diag.js\";\nexport type { ProviderDiagnosticFn } from \"./utils/diag.js\";\n\n// Palsu provider (testing)\nexport {\n registerPalsuProvider,\n palsuText,\n palsuThinking,\n palsuToolCall,\n palsuAssistantMessage,\n} from \"./providers/palsu.js\";\nexport type {\n PalsuProviderHandle,\n PalsuProviderConfig,\n PalsuProviderState,\n PalsuResponse,\n PalsuResponseFactory,\n PalsuModelConfig,\n PalsuModelHandle,\n} from \"./providers/palsu.js\";\n","/**\n * Error model for gg-ai and downstream consumers.\n *\n * Every error users see should answer one question: \"is this me or them?\"\n * That answer drives whether they retry, switch model, log in, or report a\n * ggcoder bug. The `FormattedError` shape captures it in plain English:\n *\n * ✗ OpenAI returned an error.\n * An error occurred while processing your request...\n * → This is an OpenAI issue, not ggcoder. Retry — if it persists, check status.openai.com.\n *\n * ✗ ggcoder hit an unexpected error.\n * Cannot read property 'foo' of undefined\n * → This is a ggcoder bug — please report it.\n */\n\nexport type ErrorSource = \"provider\" | \"ggcoder\" | \"network\" | \"auth\";\n\nexport interface FormattedError {\n /** Plain-English headline, e.g. \"OpenAI returned an error.\" */\n headline: string;\n /** Machine-readable classification. */\n source: ErrorSource;\n /** Detailed message body from the underlying error (no JSON, no tag prefix). */\n message: string;\n /** Action line — tells the user whether to retry, switch model, log in, or report a bug. */\n guidance: string;\n /** Provider name when source === \"provider\". */\n provider?: string;\n /** HTTP status code if known. */\n statusCode?: number;\n /** Provider request ID, kept for telemetry / debug — not shown by default. */\n requestId?: string;\n /** Unix seconds when a usage/rate limit resets, when the provider reports it. */\n resetsAt?: number;\n}\n\nexport class GGAIError extends Error {\n readonly source: ErrorSource;\n readonly requestId?: string;\n readonly hint?: string;\n\n constructor(\n message: string,\n options?: {\n source?: ErrorSource;\n requestId?: string;\n hint?: string;\n cause?: unknown;\n },\n ) {\n super(message, { cause: options?.cause });\n this.name = \"GGAIError\";\n this.source = options?.source ?? \"ggcoder\";\n this.requestId = options?.requestId;\n this.hint = options?.hint;\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n /** Unix seconds when a usage/rate limit resets, when the provider reports it. */\n readonly resetsAt?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: {\n statusCode?: number;\n requestId?: string;\n hint?: string;\n cause?: unknown;\n resetsAt?: number;\n },\n ) {\n super(message, {\n source: \"provider\",\n requestId: options?.requestId,\n hint: options?.hint,\n cause: options?.cause,\n });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n this.resetsAt = options?.resetsAt;\n }\n}\n\n/**\n * Display names for every provider we support. Used in headlines so users\n * see \"OpenAI returned an error.\" rather than the slug \"openai\".\n */\nconst PROVIDER_DISPLAY: Record<string, string> = {\n openai: \"OpenAI\",\n anthropic: \"Anthropic\",\n gemini: \"Gemini\",\n glm: \"Z.AI (GLM)\",\n moonshot: \"Moonshot\",\n deepseek: \"DeepSeek\",\n openrouter: \"OpenRouter\",\n xiaomi: \"Xiaomi (MiMo)\",\n minimax: \"MiniMax\",\n};\n\n/** Status pages for providers that publish one. */\nconst PROVIDER_STATUS_URL: Record<string, string> = {\n openai: \"status.openai.com\",\n anthropic: \"status.anthropic.com\",\n};\n\nfunction providerDisplayName(provider: string): string {\n return PROVIDER_DISPLAY[provider] ?? provider;\n}\n\n/**\n * Normalise any thrown value into a structured display object. Always returns\n * a non-empty `headline` and `guidance` so the UI never has to second-guess\n * what to show the user.\n */\n/**\n * Is this a subscription/plan usage-window exhaustion error (as opposed to a\n * transient per-minute throttle)? These don't clear with a quick retry — the\n * user has to wait for the window to reset — so callers must surface them as a\n * hard stop, not silently retry for minutes. Detected from the canonical\n * \"usage limit reached\" message gg-ai stamps onto the ProviderError.\n */\nexport function isUsageLimitError(err: unknown): boolean {\n if (!(err instanceof Error)) return false;\n return /usage limit reached/i.test(err.message);\n}\n\n/** Format a unix-seconds reset timestamp for display, e.g. \"3:45 PM\". */\nfunction formatResetTime(resetsAt: number): string {\n const when = new Date(resetsAt * 1000);\n const sameDay = when.toDateString() === new Date().toDateString();\n return sameDay\n ? when.toLocaleTimeString(undefined, { hour: \"numeric\", minute: \"2-digit\" })\n : when.toLocaleString(undefined, {\n weekday: \"short\",\n hour: \"numeric\",\n minute: \"2-digit\",\n });\n}\n\nexport function formatError(err: unknown): FormattedError {\n if (err instanceof ProviderError) {\n const name = providerDisplayName(err.provider);\n const cleanMessage = cleanProviderMessage(err.message);\n if (isUsageLimitError(err)) {\n const resetClause = err.resetsAt ? ` It resets at ${formatResetTime(err.resetsAt)}.` : \"\";\n return {\n headline: `${name} usage limit reached.`,\n source: \"provider\",\n message: `Your ${name} usage is finished.${resetClause}`,\n provider: err.provider,\n statusCode: err.statusCode,\n ...(err.requestId ? { requestId: err.requestId } : {}),\n ...(err.resetsAt ? { resetsAt: err.resetsAt } : {}),\n guidance: \"Try again once it's back. Your conversation is preserved.\",\n };\n }\n return {\n headline: `${name} returned an error.`,\n source: \"provider\",\n message: cleanMessage,\n provider: err.provider,\n statusCode: err.statusCode,\n requestId: err.requestId,\n guidance: err.hint ?? providerGuidance(err.provider, cleanMessage, err.statusCode),\n };\n }\n\n if (err instanceof GGAIError) {\n return finaliseBySource(err.source, err.message, err.requestId, err.hint);\n }\n\n if (err instanceof Error) {\n const source = inferSource(err);\n return finaliseBySource(source, err.message, undefined, undefined);\n }\n\n return finaliseBySource(\"ggcoder\", String(err), undefined, undefined);\n}\n\nfunction finaliseBySource(\n source: ErrorSource,\n message: string,\n requestId: string | undefined,\n hint: string | undefined,\n): FormattedError {\n switch (source) {\n case \"network\":\n return {\n headline: \"Network error — couldn't reach the provider.\",\n source,\n message,\n guidance: hint ?? \"Check your internet connection. Not a ggcoder issue — retry shortly.\",\n ...(requestId ? { requestId } : {}),\n };\n case \"auth\":\n return {\n headline: \"Authentication issue.\",\n source,\n message,\n guidance: hint ?? \"Run `ggcoder login` to refresh your credentials.\",\n ...(requestId ? { requestId } : {}),\n };\n case \"provider\":\n // Provider source with no ProviderError instance — best effort.\n return {\n headline: \"Provider returned an error.\",\n source,\n message,\n guidance: hint ?? providerGuidance(undefined, message, undefined),\n ...(requestId ? { requestId } : {}),\n };\n case \"ggcoder\":\n return {\n headline: \"ggcoder hit an unexpected error.\",\n source,\n message,\n guidance:\n hint ?? \"This looks like a ggcoder bug — please report it to the developer (see /help).\",\n ...(requestId ? { requestId } : {}),\n };\n }\n}\n\n/**\n * Render a FormattedError as a multi-line string for terminal display.\n *\n * Format:\n * <headline>\n * <message>\n * → <guidance>\n */\nexport function formatErrorForDisplay(err: unknown): string {\n const f = formatError(err);\n const lines = [f.headline];\n if (f.message && f.message !== f.headline) lines.push(` ${f.message}`);\n lines.push(` → ${f.guidance}`);\n return lines.join(\"\\n\");\n}\n\n/**\n * Strip legacy `[provider]` / `[provider:name]` prefix from a message body,\n * so older ProviderError messages render cleanly under the new headline\n * system without doubling up.\n */\nfunction cleanProviderMessage(message: string): string {\n return message.replace(/^\\[[^\\]]+\\]\\s*/, \"\").trim();\n}\n\nfunction inferSource(err: Error): ErrorSource {\n const msg = err.message.toLowerCase();\n const code = (err as { code?: string }).code ?? \"\";\n if (\n code === \"ECONNREFUSED\" ||\n code === \"ETIMEDOUT\" ||\n code === \"ENOTFOUND\" ||\n code === \"ECONNRESET\" ||\n msg.includes(\"fetch failed\") ||\n msg.includes(\"network request failed\")\n ) {\n return \"network\";\n }\n if (\n msg.includes(\"not logged in\") ||\n msg.includes(\"token exchange failed\") ||\n msg.includes(\"token refresh failed\") ||\n msg.includes(\"invalid_grant\")\n ) {\n return \"auth\";\n }\n return \"ggcoder\";\n}\n\n/**\n * Build the action line for a provider error: tells the user whether to\n * retry, switch model, check billing, or whether it's serious enough to\n * report. Always frames the source plainly (\"This is an OpenAI issue\") so\n * the user knows to NOT report it to the ggcoder dev.\n */\nfunction providerGuidance(\n provider: string | undefined,\n message: string,\n statusCode: number | undefined,\n): string {\n const name = provider ? providerDisplayName(provider) : \"the provider\";\n const status = provider ? PROVIDER_STATUS_URL[provider] : undefined;\n const lower = message.toLowerCase();\n\n if (statusCode === 401 || lower.includes(\"unauthorized\") || lower.includes(\"invalid api key\")) {\n return `Authentication failed with ${name}. Run \\`ggcoder login\\` to refresh your credentials.`;\n }\n if (lower.includes(\"overloaded\") || lower.includes(\"engine_overloaded\")) {\n return `${name}'s servers are overloaded right now. Retry in a moment — not a ggcoder issue.`;\n }\n if (\n lower.includes(\"insufficient balance\") ||\n lower.includes(\"quota exceeded\") ||\n lower.includes(\"recharge\") ||\n lower.includes(\"no resource package\")\n ) {\n return `Your ${name} account has a billing or quota issue — check your balance. Not a ggcoder issue.`;\n }\n if (statusCode === 429 || lower.includes(\"rate limit\") || lower.includes(\"too many requests\")) {\n return `${name} rate limit hit. Wait a moment then retry — not a ggcoder issue.`;\n }\n if (statusCode === 502 || lower.includes(\"bad gateway\")) {\n return `${name} returned a bad gateway. Retry — this is on their side, not ggcoder.`;\n }\n if (statusCode === 503 || lower.includes(\"service unavailable\")) {\n return `${name} is temporarily unavailable. Retry shortly — not a ggcoder issue.`;\n }\n if (\n statusCode === 500 ||\n lower.includes(\"server_error\") ||\n (lower.includes(\"500\") && lower.includes(\"internal server error\"))\n ) {\n return status\n ? `This is an error from ${name}, not ggcoder. Retry — if it keeps happening, check ${status}.`\n : `This is an error from ${name}, not ggcoder. Retry — if it keeps happening, try a different model with /model.`;\n }\n if (lower.includes(\"timeout\") || lower.includes(\"timed out\")) {\n return `Request to ${name} timed out. Their servers may be slow — retry. Not a ggcoder issue.`;\n }\n if (\n lower.includes(\"does not recognize the requested model\") ||\n (lower.includes(\"model\") &&\n (lower.includes(\"not exist\") || lower.includes(\"not found\") || lower.includes(\"no access\")))\n ) {\n return `${name} doesn't recognise this model on your account. Use /model to switch, or check your subscription tier.`;\n }\n if (lower.includes(\"context_length_exceeded\") || lower.includes(\"prompt is too long\")) {\n return `Context window for this ${name} model is full. Run /compact to shrink history, or start a new session.`;\n }\n return status\n ? `This is an error from ${name}, not ggcoder. Retry — if it persists, check ${status}.`\n : `This is an error from ${name}, not ggcoder. Retry — if it persists, try a different model with /model.`;\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction createClient(options: StreamOptions): Anthropic {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n return new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n // Allow SDK retries for connection-level failures (socket hang up, 500s,\n // connection refused). Our stall detection handles abort-initiated retries\n // separately — SDK retries only fire on genuine transport errors.\n maxRetries: 2,\n ...(isOAuth\n ? {\n defaultHeaders: {\n // Anthropic's OAuth edge validates the claude-cli version. Callers\n // (ggcoder) resolve the live version at runtime; the literal here\n // is the offline fallback for direct gg-ai consumers.\n \"user-agent\": options.userAgent ?? \"claude-cli/2.1.75 (external, cli)\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n}\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const client = createClient(options);\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n const useStreaming = options.streaming !== false;\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const supportsFirstPartyToolExtras =\n !options.baseUrl || options.baseUrl.includes(\"api.anthropic.com\");\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system: rawSystem, messages } = toAnthropicMessages(downgradedMessages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? (() => {\n // Build the tools array with server-side tools taking precedence over\n // client tools that share their name. Anthropic rejects duplicate tool\n // names with a 400, so when both a client `web_search` (from a non-\n // anthropic provider's tool list left over after a /model switch) and\n // the native server-side web_search are present, drop the client one.\n const reservedServerNames = new Set<string>();\n if (options.webSearch) reservedServerNames.add(\"web_search\");\n for (const t of options.serverTools ?? []) {\n const name = (t as { name?: string }).name;\n if (name) reservedServerNames.add(name);\n }\n const clientTools = options.tools?.length\n ? toAnthropicTools(\n options.tools.filter((t) => !reservedServerNames.has(t.name)),\n {\n ...(supportsFirstPartyToolExtras && cacheControl ? { cacheControl } : {}),\n ...(supportsFirstPartyToolExtras ? { enableFineGrainedToolStreaming: true } : {}),\n },\n )\n : [];\n return {\n tools: [\n ...clientTools,\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n };\n })()\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: useStreaming,\n } as Anthropic.MessageCreateParams;\n\n // Adaptive thinking models (Opus 4.8, Opus 4.7, Opus 4.6, Sonnet 4.6) don't need the\n // interleaved-thinking beta — they have it built in.\n const hasAdaptiveThinking =\n options.model.includes(\"opus-4-8\") ||\n options.model.includes(\"opus-4.8\") ||\n options.model.includes(\"opus-4-7\") ||\n options.model.includes(\"opus-4.7\") ||\n options.model.includes(\"opus-4-6\") ||\n options.model.includes(\"opus-4.6\") ||\n options.model.includes(\"sonnet-4-6\") ||\n options.model.includes(\"sonnet-4.6\");\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n \"fine-grained-tool-streaming-2025-05-14\",\n ...(!hasAdaptiveThinking ? [\"interleaved-thinking-2025-05-14\"] : []),\n ];\n\n const requestOptions = {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n };\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final Message. Used by the agent loop after the\n // SSE stream has stalled repeatedly -- broken streaming connections often\n // recover when the request is replayed over a plain HTTP response.\n if (!useStreaming) {\n try {\n const message = (await client.messages.create(\n { ...params, stream: false } as Anthropic.MessageCreateParamsNonStreaming,\n requestOptions,\n )) as Anthropic.Message;\n yield* synthesizeEventsFromMessage(message);\n return messageToResponse(message);\n } catch (err) {\n throw toError(err);\n }\n }\n\n const stream = client.messages.stream(params, requestOptions);\n\n // ── Accumulation state ──────────────────────────────────\n const contentParts: ContentPart[] = [];\n\n // Per-block accumulators indexed by content_block_start index\n const blocks = new Map<\n number,\n {\n type: string;\n text: string;\n thinking: string;\n signature: string;\n toolId: string;\n toolName: string;\n argsJson: string;\n input: unknown;\n raw: Record<string, unknown> | null;\n }\n >();\n\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead: number | undefined;\n let cacheWrite: number | undefined;\n let stopReason: string | null = null;\n\n const keepalive = { type: \"keepalive\" as const };\n\n try {\n for await (const event of stream as AsyncIterable<Anthropic.MessageStreamEvent>) {\n switch (event.type) {\n case \"message_start\": {\n const usage = event.message.usage;\n inputTokens = usage.input_tokens;\n const usageAny = usage as unknown as Record<string, unknown>;\n if (usageAny.cache_read_input_tokens != null) {\n cacheRead = usageAny.cache_read_input_tokens as number;\n }\n if (usageAny.cache_creation_input_tokens != null) {\n cacheWrite = usageAny.cache_creation_input_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n case \"content_block_start\": {\n const block = event.content_block;\n const idx = event.index;\n const accum = {\n type: block.type,\n text: \"\",\n thinking: \"\",\n signature: \"\",\n toolId: \"\",\n toolName: \"\",\n argsJson: \"\",\n input: undefined as unknown,\n raw: null as Record<string, unknown> | null,\n };\n\n if (block.type === \"tool_use\") {\n accum.toolId = block.id;\n accum.toolName = block.name;\n accum.input = (block as unknown as { input?: unknown }).input;\n } else if (block.type === \"server_tool_use\") {\n accum.toolId = (block as unknown as { id: string }).id;\n accum.toolName = (block as unknown as { name: string }).name;\n accum.input = (block as unknown as { input: unknown }).input;\n } else if (block.type === \"redacted_thinking\") {\n // Encrypted thinking block — capture the raw data for round-tripping.\n // The API requires these to be sent back verbatim in multi-turn conversations.\n accum.raw = block as unknown as Record<string, unknown>;\n }\n\n blocks.set(idx, accum);\n // Surface \"reasoning started\" as an empty thinking_delta the moment\n // a thinking content block opens, so the UI flips to the thinking\n // phase before the first delta with real content arrives.\n if (block.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: \"\" };\n } else {\n yield keepalive;\n }\n break;\n }\n\n case \"content_block_delta\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n const delta = event.delta as unknown as Record<string, unknown>;\n const deltaType = delta.type as string;\n\n if (deltaType === \"text_delta\") {\n const text = delta.text as string;\n accum.text += text;\n yield { type: \"text_delta\", text };\n } else if (deltaType === \"thinking_delta\") {\n const text = delta.thinking as string;\n accum.thinking += text;\n yield { type: \"thinking_delta\", text };\n } else if (deltaType === \"input_json_delta\") {\n const partialJson = delta.partial_json as string;\n accum.argsJson += partialJson;\n yield {\n type: \"toolcall_delta\",\n id: accum.toolId,\n name: accum.toolName,\n argsJson: partialJson,\n };\n } else if (deltaType === \"signature_delta\") {\n accum.signature = delta.signature as string;\n }\n break;\n }\n\n case \"content_block_stop\": {\n const accum = blocks.get(event.index);\n if (!accum) break;\n\n if (accum.type === \"text\") {\n contentParts.push({ type: \"text\", text: accum.text });\n } else if (accum.type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: accum.thinking,\n signature: accum.signature,\n });\n yield keepalive;\n } else if (accum.type === \"tool_use\") {\n let args: Record<string, unknown> = isJsonObject(accum.input) ? accum.input : {};\n if (accum.argsJson) {\n try {\n const parsed = JSON.parse(accum.argsJson) as unknown;\n args = isJsonObject(parsed) ? parsed : {};\n } catch {\n // malformed JSON — keep start-block input fallback when available\n }\n }\n const tc: ToolCall = {\n type: \"tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n args,\n };\n contentParts.push(tc);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n };\n } else if (accum.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: accum.toolId,\n name: accum.toolName,\n input: accum.input,\n };\n contentParts.push(stc);\n yield {\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n };\n } else if (accum.type === \"redacted_thinking\" && accum.raw) {\n contentParts.push({ type: \"raw\", data: accum.raw });\n yield keepalive;\n } else {\n // Retrieve the full block from the SDK's accumulated message\n // for block types we don't explicitly accumulate (e.g. web_search_tool_result)\n const msg = stream.currentMessage;\n const rawBlock = msg?.content[event.index] as unknown as\n | Record<string, unknown>\n | undefined;\n if (rawBlock) {\n const blockType = rawBlock.type as string;\n if (blockType === \"web_search_tool_result\") {\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: rawBlock.tool_use_id as string,\n resultType: blockType,\n data: rawBlock,\n };\n contentParts.push(str);\n yield {\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n };\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: rawBlock });\n }\n }\n }\n\n blocks.delete(event.index);\n break;\n }\n\n case \"message_delta\": {\n const delta = event.delta as unknown as Record<string, unknown>;\n if (delta.stop_reason) {\n stopReason = delta.stop_reason as string;\n }\n const usage = event.usage as unknown as Record<string, unknown> | undefined;\n if (usage?.output_tokens != null) {\n outputTokens = usage.output_tokens as number;\n }\n yield keepalive;\n break;\n }\n\n // message_stop — loop exits naturally\n\n default:\n // Unhandled event types (e.g. \"ping\" heartbeats) — yield keepalive\n // so the idle timer in the agent loop resets on any API activity.\n yield keepalive;\n break;\n }\n }\n } catch (err) {\n throw toError(err);\n }\n\n const normalizedStop = normalizeAnthropicStopReason(stopReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizedStop,\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n\n yield { type: \"done\", stopReason: normalizedStop };\n return response;\n}\n\n/**\n * Walk a non-streaming Anthropic Message and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per block\n * rather than token-by-token -- the agent loop consumer doesn't care about\n * granularity, only completeness.\n */\nfunction* synthesizeEventsFromMessage(message: Anthropic.Message): Generator<StreamEvent, void> {\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n const text = blk.text as string;\n if (text) yield { type: \"text_delta\", text };\n } else if (type === \"thinking\") {\n const text = blk.thinking as string;\n if (text) yield { type: \"thinking_delta\", text };\n } else if (type === \"tool_use\") {\n const argsJson = JSON.stringify(blk.input ?? {});\n yield {\n type: \"toolcall_delta\",\n id: blk.id as string,\n name: blk.name as string,\n argsJson,\n };\n yield {\n type: \"toolcall_done\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n };\n } else if (type === \"server_tool_use\") {\n yield {\n type: \"server_toolcall\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n };\n } else if (type === \"web_search_tool_result\") {\n yield {\n type: \"server_toolresult\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n };\n }\n // Other block types (redacted_thinking, compaction blocks) are preserved\n // in the response via messageToResponse but don't emit events.\n }\n yield { type: \"done\", stopReason: normalizeAnthropicStopReason(message.stop_reason) };\n}\n\n/** Convert a non-streaming Anthropic Message into our StreamResponse shape. */\nfunction messageToResponse(message: Anthropic.Message): StreamResponse {\n const contentParts: ContentPart[] = [];\n for (const block of message.content) {\n const blk = block as unknown as Record<string, unknown>;\n const type = blk.type as string;\n\n if (type === \"text\") {\n contentParts.push({ type: \"text\", text: blk.text as string });\n } else if (type === \"thinking\") {\n contentParts.push({\n type: \"thinking\",\n text: blk.thinking as string,\n signature: (blk.signature as string) ?? \"\",\n });\n } else if (type === \"tool_use\") {\n contentParts.push({\n type: \"tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n args: (blk.input as Record<string, unknown> | undefined) ?? {},\n });\n } else if (type === \"server_tool_use\") {\n contentParts.push({\n type: \"server_tool_call\",\n id: blk.id as string,\n name: blk.name as string,\n input: blk.input,\n });\n } else if (type === \"web_search_tool_result\") {\n contentParts.push({\n type: \"server_tool_result\",\n toolUseId: blk.tool_use_id as string,\n resultType: type,\n data: blk,\n });\n } else {\n // Preserve unknown blocks (redacted_thinking, compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: blk });\n }\n }\n\n const usage = message.usage as unknown as Record<string, unknown>;\n const inputTokens = (usage.input_tokens as number) ?? 0;\n const outputTokens = (usage.output_tokens as number) ?? 0;\n const cacheRead = usage.cache_read_input_tokens as number | undefined;\n const cacheWrite = usage.cache_creation_input_tokens as number | undefined;\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason: normalizeAnthropicStopReason(message.stop_reason),\n usage: {\n inputTokens,\n outputTokens,\n ...(cacheRead != null && { cacheRead }),\n ...(cacheWrite != null && { cacheWrite }),\n },\n };\n}\n\n/**\n * Read Anthropic's unified rate-limit headers — the subscription (OAuth) quota\n * signal. `anthropic-ratelimit-unified-status: rejected` means the usage window\n * is spent (not a transient per-minute throttle); `-reset` is the unix-seconds\n * reset time. Works against a web `Headers` object or a plain header record.\n */\nfunction readUnifiedRateLimit(headers: unknown): { rejected: boolean; resetsAt?: number } {\n const get = (name: string): string | null => {\n if (headers && typeof (headers as { get?: unknown }).get === \"function\") {\n return (headers as Headers).get(name);\n }\n if (headers && typeof headers === \"object\") {\n const rec = headers as Record<string, unknown>;\n const value = rec[name] ?? rec[name.toLowerCase()];\n return typeof value === \"string\" ? value : null;\n }\n return null;\n };\n const status = get(\"anthropic-ratelimit-unified-status\");\n const resetRaw =\n get(\"anthropic-ratelimit-unified-reset\") ??\n get(\"anthropic-ratelimit-unified-5h-reset\") ??\n get(\"anthropic-ratelimit-unified-7d-reset\");\n const resetNum = resetRaw != null ? Number(resetRaw) : Number.NaN;\n const resetsAt = Number.isFinite(resetNum) && resetNum > 0 ? resetNum : undefined;\n return { rejected: status === \"rejected\", ...(resetsAt ? { resetsAt } : {}) };\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n // Anthropic exposes request IDs as `requestID` in current SDKs, `request_id`\n // in older/compat shapes, and sometimes inside the streamed error body.\n const errorBody = err.error as Record<string, unknown> | undefined;\n const nestedError = errorBody?.error as Record<string, unknown> | undefined;\n const requestId =\n (err as unknown as { requestID?: string | null }).requestID ??\n (err as unknown as { request_id?: string | null }).request_id ??\n (typeof errorBody?.request_id === \"string\" ? errorBody.request_id : undefined) ??\n (typeof nestedError?.request_id === \"string\" ? nestedError.request_id : undefined) ??\n undefined;\n const bodyMessage =\n typeof nestedError?.message === \"string\"\n ? nestedError.message\n : typeof errorBody?.message === \"string\"\n ? errorBody.message\n : undefined;\n const bodyType =\n typeof nestedError?.type === \"string\"\n ? nestedError.type\n : typeof errorBody?.type === \"string\"\n ? errorBody.type\n : typeof (err as unknown as { type?: unknown }).type === \"string\"\n ? ((err as unknown as { type: string }).type as string)\n : undefined;\n const message =\n bodyType && bodyMessage ? `${bodyType}: ${bodyMessage}` : (bodyMessage ?? err.message);\n\n // Subscription (OAuth) usage-window exhaustion. Anthropic returns 429 with\n // the unified rate-limit headers; a \"rejected\" status — or a reset stamp\n // meaningfully in the future — means the plan's usage is spent, not a\n // transient per-minute throttle. Stamp a canonical message so downstream\n // retry logic stops instead of burning minutes retrying.\n if (err.status === 429) {\n const limit = readUnifiedRateLimit(err.headers);\n const farOff = limit.resetsAt != null && limit.resetsAt * 1000 - Date.now() > 60_000;\n if (limit.rejected || farOff) {\n return new ProviderError(\"anthropic\", \"Claude usage limit reached\", {\n statusCode: 429,\n ...(requestId ? { requestId } : {}),\n ...(limit.resetsAt ? { resetsAt: limit.resetsAt } : {}),\n cause: err,\n });\n }\n }\n\n return new ProviderError(\"anthropic\", message, {\n statusCode: err.status,\n ...(requestId ? { requestId } : {}),\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Pull-based stream result. Wraps an async generator that yields\n * StreamEvents and returns a StreamResponse. Also thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n *\n * The generator is pumped eagerly — events flow into an internal\n * buffer regardless of whether a consumer is iterating. This avoids\n * the push-based EventStream's stall bugs (lost wakeups, single\n * resolve field, iterator starvation).\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly response: Promise<StreamResponse>;\n private buffer: StreamEvent[] = [];\n private done = false;\n private error: Error | null = null;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private resolveWait: (() => void) | null = null;\n\n constructor(generator: AsyncGenerator<StreamEvent, StreamResponse>) {\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n this.pump(generator);\n }\n\n private async pump(generator: AsyncGenerator<StreamEvent, StreamResponse>): Promise<void> {\n try {\n let next = await generator.next();\n while (!next.done) {\n this.buffer.push(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n next = await generator.next();\n }\n this.done = true;\n this.resolveResponse(next.value);\n this.resolveWait?.();\n this.resolveWait = null;\n } catch (err) {\n const error = err instanceof Error ? err : new Error(String(err));\n this.error = error;\n this.done = true;\n this.rejectResponse(error);\n this.resolveWait?.();\n this.resolveWait = null;\n }\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n let index = 0;\n while (true) {\n while (index < this.buffer.length) {\n yield this.buffer[index++]!;\n }\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolveWait = r;\n // Guard against race: pump may have advanced between the while-check\n // and this promise registration. Re-check and resolve immediately.\n if (this.buffer.length > index || this.done || this.error) {\n this.resolveWait = null;\n r();\n }\n });\n }\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n return this.response.then(onfulfilled, onrejected);\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for provider tool\n * parameter definitions.\n *\n * Anthropic's `input_schema` validator is strict in two ways:\n *\n * 1. The root must be `type: \"object\"`. Returns 400 with\n * `tools.N.custom.input_schema.type: Field required` otherwise.\n *\n * 2. The root must NOT contain `oneOf`, `anyOf`, or `allOf`. Returns 400 with\n * `input_schema does not support oneOf, allOf, or anyOf at the top level`.\n *\n * Both rules trip whenever a tool's parameters are defined via\n * `z.discriminatedUnion(...)` or `z.union(...)` — Zod 4's\n * `z.toJSONSchema` emits `{oneOf: [...]}` at the root with no `type`.\n *\n * The fix is to collapse the union into a single flat object schema:\n *\n * - properties = union of all branch properties (later branches win on\n * conflict; that's fine because the model only uses these for hints —\n * Zod's actual `tool.parameters.parse(args)` is the real validator)\n * - required = intersection of branch `required` arrays (a field is only\n * required if EVERY branch requires it)\n * - if the union has a discriminator field (every branch has the same\n * property as a `const`), we replace the discriminator's per-branch\n * `const` with an `enum` listing every literal — the model gets a clear\n * hint of the valid action values without needing oneOf\n *\n * The flattening is lossy for *schema-level* constraints (e.g. \"if action=X,\n * then field Y is required\") — Zod still enforces those at parse time. For\n * the model's purposes this is identical to a single object with optional\n * fields and a discriminator enum, which is exactly how Anthropic-supported\n * tools are typically authored anyway.\n */\n\ntype JsonSchema = Record<string, unknown>;\n\nexport function zodToJsonSchema(schema: z.ZodType): JsonSchema {\n const jsonSchema = z.toJSONSchema(schema) as JsonSchema;\n const { $schema: _schema, ...rest } = jsonSchema;\n return normalizeRootForAnthropic(rest);\n}\n\n/**\n * Recursively flatten a root discriminated/plain union into a single object\n * schema. Only operates at the ROOT — nested unions inside properties are\n * left intact (Anthropic accepts those just fine; only the top-level\n * input_schema is restricted).\n */\nfunction normalizeRootForAnthropic(schema: JsonSchema): JsonSchema {\n const branches = (schema.oneOf ?? schema.anyOf) as JsonSchema[] | undefined;\n if (!branches || branches.length === 0) {\n // Already an object root or a primitive — Anthropic only sees object\n // params, so primitive roots will fail elsewhere; that's not our bug.\n return schema;\n }\n\n // All branches must be object schemas to flatten. If any isn't, fall\n // back to wrapping with type:\"object\" — better than failing outright.\n const allObjects = branches.every((b) => b.type === \"object\");\n if (!allObjects) {\n return { type: \"object\", ...schema };\n }\n\n const mergedProps: Record<string, JsonSchema> = {};\n const requiredCounts: Record<string, number> = {};\n const enumCandidate: Record<string, Set<string | number | boolean>> = {};\n const everyBranchHas: Record<string, number> = {};\n\n for (const branch of branches) {\n const props = (branch.properties ?? {}) as Record<string, JsonSchema>;\n const required = (branch.required ?? []) as string[];\n\n for (const [key, prop] of Object.entries(props)) {\n everyBranchHas[key] = (everyBranchHas[key] ?? 0) + 1;\n // Last-wins merge — fine, since these are model hints only.\n mergedProps[key] = { ...mergedProps[key], ...prop };\n\n // Track const candidates for discriminator collapse.\n if (prop && typeof prop === \"object\" && \"const\" in prop) {\n const v = prop.const as string | number | boolean;\n enumCandidate[key] = enumCandidate[key] ?? new Set();\n enumCandidate[key].add(v);\n }\n }\n for (const r of required) {\n requiredCounts[r] = (requiredCounts[r] ?? 0) + 1;\n }\n }\n\n // For any property where every branch had a `const` of the same primitive\n // type, replace that property's `const` with an `enum` listing all\n // observed literals. This is the discriminator collapse.\n for (const [key, values] of Object.entries(enumCandidate)) {\n if (everyBranchHas[key] === branches.length && values.size > 1) {\n const list = [...values];\n // Drop `const` (mutually exclusive with enum), keep type from one branch.\n const { const: _const, ...rest } = mergedProps[key];\n mergedProps[key] = { ...rest, enum: list };\n }\n }\n\n // A field is required only if EVERY branch lists it as required.\n const required = Object.entries(requiredCounts)\n .filter(([, count]) => count === branches.length)\n .map(([key]) => key);\n\n // Pull through any non-conflicting metadata from the union root\n // (description, title, etc.) — drop oneOf/anyOf/allOf themselves.\n const {\n oneOf: _o,\n anyOf: _a,\n allOf: _all,\n type: _t,\n properties: _p,\n required: _r,\n ...meta\n } = schema;\n\n const out: JsonSchema = {\n ...meta,\n type: \"object\",\n properties: mergedProps,\n };\n if (required.length > 0) out.required = required;\n return out;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n ImageContent,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n ToolResultContent,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Shared helpers ─────────────────────────────────────────\n\n/**\n * True for content parts that Anthropic treats as position-sensitive reasoning\n * blocks in the latest assistant message: SIGNED `thinking` blocks and\n * `redacted_thinking` blocks (round-tripped as opaque `raw`). Unsigned thinking\n * (e.g. from GLM/OpenAI or an aborted stream) is excluded — it is converted to a\n * text block on the way out, so it carries no signature for Anthropic to validate\n * and imposes no positional constraint.\n */\nfunction isPositionSensitiveThinking(part: ContentPart): boolean {\n if (part.type === \"thinking\") return !!part.signature;\n if (part.type === \"raw\") {\n const t = part.data.type;\n return t === \"thinking\" || t === \"redacted_thinking\";\n }\n return false;\n}\n\nconst NON_VISION_USER_IMAGE_PLACEHOLDER = \"(image omitted: model does not support images)\";\nconst NON_VISION_TOOL_IMAGE_PLACEHOLDER = \"(tool image omitted: model does not support images)\";\n\n/** Replace image blocks with a text placeholder (deduping consecutive placeholders). */\nfunction stripImages(content: (TextContent | ImageContent)[], placeholder: string): TextContent[] {\n const out: TextContent[] = [];\n let lastWasPlaceholder = false;\n for (const block of content) {\n if (block.type === \"image\") {\n if (!lastWasPlaceholder) out.push({ type: \"text\", text: placeholder });\n lastWasPlaceholder = true;\n continue;\n }\n out.push(block);\n lastWasPlaceholder = block.text === placeholder;\n }\n return out;\n}\n\n/**\n * Pre-transform pass: when the target model doesn't support images, replace\n * image blocks in user messages and tool_result messages with a text placeholder.\n * Called before provider-specific transforms.\n */\nexport function downgradeUnsupportedImages(\n messages: Message[],\n supportsImages: boolean | undefined,\n): Message[] {\n if (supportsImages !== false) return messages;\n return messages.map((msg) => {\n if (msg.role === \"user\" && Array.isArray(msg.content)) {\n return { ...msg, content: stripImages(msg.content, NON_VISION_USER_IMAGE_PLACEHOLDER) };\n }\n if (msg.role === \"tool\") {\n return {\n ...msg,\n content: msg.content.map((tr) =>\n Array.isArray(tr.content)\n ? {\n ...tr,\n content: stripImages(tr.content, NON_VISION_TOOL_IMAGE_PLACEHOLDER),\n }\n : tr,\n ),\n };\n }\n return msg;\n });\n}\n\n/** Extract concatenated text from tool_result content (array or string). */\nfunction toolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\n/** Extract image blocks from tool_result content. Returns empty array for string content. */\nfunction toolResultImages(content: ToolResultContent): ImageContent[] {\n if (typeof content === \"string\") return [];\n return content.filter((b): b is ImageContent => b.type === \"image\");\n}\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\ntype AnthropicImageSource = {\n type: \"base64\";\n media_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n data: string;\n};\n\n/**\n * Convert tool_result content to Anthropic's wire format. Strings pass through;\n * arrays are mapped to Anthropic's (text | image) block format, which\n * tool_result.content accepts natively.\n */\nfunction toAnthropicToolResultContent(\n content: ToolResultContent,\n):\n | string\n | Array<{ type: \"text\"; text: string } | { type: \"image\"; source: AnthropicImageSource }> {\n if (typeof content === \"string\") return content;\n return content.map((block) => {\n if (block.type === \"text\") return { type: \"text\" as const, text: block.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: block.mediaType as AnthropicImageSource[\"media_type\"],\n data: block.data,\n },\n };\n });\n}\n\n/**\n * Anthropic requires tool_use IDs to match `^[a-zA-Z0-9_-]+$`. Codex tool IDs\n * are composite (`callId|itemId`) and other providers may include dots/colons.\n * Replace any disallowed characters with `_` and memoize so the assistant's\n * tool_use ID matches the corresponding tool_result.tool_use_id.\n */\nfunction remapAnthropicToolCallId(id: string, idMap: Map<string, string>): string {\n if (/^[a-zA-Z0-9_-]+$/.test(id)) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = id.replace(/[^a-zA-Z0-9_-]/g, \"_\");\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n // Anthropic validates that thinking/redacted_thinking blocks in the latest\n // assistant message are byte-identical AND at their original content\n // positions (interleaved-thinking-2025-05-14). Dropping a block that\n // precedes a thinking block shifts that thinking block's index, which the\n // API rejects with \"`thinking` or `redacted_thinking` blocks in the latest\n // assistant message cannot be modified.\" So we must NOT strip empty text\n // blocks that sit before a thinking block. Empty text blocks after the\n // last thinking block can still be dropped safely.\n const lastThinkingIdx =\n typeof msg.content === \"string\"\n ? -1\n : msg.content.reduce(\n (last, part, idx) => (isPositionSensitiveThinking(part) ? idx : last),\n -1 as number,\n );\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part, idx) => {\n // Drop unsigned thinking blocks ONLY when they carry no text — an\n // empty, signature-less thinking block has nothing to preserve.\n // Signed and non-empty unsigned thinking are handled in the map\n // below (kept verbatim / converted to text respectively).\n if (part.type === \"thinking\" && !part.signature && !part.text) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block). Keep them when a signed\n // thinking/redacted_thinking block follows, since removal would\n // reposition it (see above).\n if (part.type === \"text\" && !part.text && idx > lastThinkingIdx) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\") {\n // Signed thinking round-trips verbatim. Unsigned thinking (GLM/\n // OpenAI, or an aborted Anthropic stream) has no signature for\n // Anthropic to validate and would be rejected as a thinking\n // block, so preserve its reasoning as a text block instead of\n // discarding it — this also keeps block positions stable.\n return part.signature\n ? { type: \"thinking\", thinking: part.text, signature: part.signature }\n : { type: \"text\", text: part.text };\n }\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: remapAnthropicToolCallId(part.id, idMap),\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n // Skip assistant messages with no content blocks (can happen when all\n // blocks are filtered — e.g. thinking-only responses from non-Anthropic\n // providers where signature is missing and text is empty)\n if (Array.isArray(content) && content.length === 0) continue;\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: remapAnthropicToolCallId(result.toolCallId, idMap),\n content: toAnthropicToolResultContent(result.content),\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Anthropic supports block-level cache_control. GG Coder keeps reusable prompt\n // content before the \"<!-- uncached -->\" marker and volatile text (currently\n // the date) after it, so only the reusable prefix receives cache_control.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(\n tools: Tool[],\n options?: {\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" };\n enableFineGrainedToolStreaming?: boolean;\n },\n): Anthropic.Tool[] {\n return tools.map((tool, index) => {\n const anthropicTool: Anthropic.Tool & {\n cache_control?: { type: \"ephemeral\"; ttl?: \"1h\" };\n eager_input_streaming?: boolean;\n } = {\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n ...(options?.enableFineGrainedToolStreaming ? { eager_input_streaming: true } : {}),\n };\n if (options?.cacheControl && index === tools.length - 1) {\n anthropicTool.cache_control = options.cacheControl;\n }\n return anthropicTool;\n });\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-8|opus-4-7|opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.8 / Opus 4.7 / Opus 4.6 / Sonnet 4.6.\n // Anthropic's output_config.effort accepts low, medium, high, xhigh, and max.\n // xhigh is Opus 4.8/4.7-only; max is supported by Opus 4.8/4.7/4.6 and Sonnet 4.6.\n let effort: string = level;\n if (effort === \"xhigh\" && !/opus-4-8|opus-4-7/.test(model)) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"xhigh\"/\"max\" treated as \"high\")\n const effectiveLevel = level === \"xhigh\" || level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap Anthropic `toolu_*` tool call IDs to `call_*` so OpenAI accepts them.\n * Only Anthropic IDs need remapping — IDs from OpenAI-compatible providers\n * (Moonshot, GLM, Xiaomi, MiniMax) are passed through unchanged to avoid\n * breaking the provider's own ID validation.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (!id.startsWith(\"toolu_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.slice(5)}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string; thinking?: boolean; supportsImages?: boolean },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n // OpenAI-style APIs receive the system prompt literally. They may do\n // provider-side prefix/key caching, but there is no Anthropic-style\n // uncached block split here; the marker remains ordinary text.\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const contentValue = parts || textParts || null;\n const hasToolCalls = toolCalls && toolCalls.length > 0;\n // Skip assistant messages with no content and no tool_calls (can happen\n // with thinking-only responses) — providers like Xiaomi reject these.\n if (!contentValue && !hasToolCalls) continue;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: contentValue,\n ...(hasToolCalls ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn thinking coherence (non-standard field).\n // When thinking content exists, always include it for round-tripping.\n // When thinking is enabled but no content exists (e.g. after compaction),\n // Moonshot/Kimi requires reasoning_content on assistant tool_call messages —\n // default to empty string. GLM silently hangs on empty values, so skip it there.\n if (thinkingParts) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = thinkingParts;\n } else if (options?.thinking && hasToolCalls && options.provider !== \"glm\") {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content = \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n // OpenAI's `tool` role only accepts text. Emit the tool message with the\n // text content, then (if any tool results carried images and the model\n // supports vision) a follow-up `user` message carrying image_url blocks.\n const imageBlocks: OpenAI.ChatCompletionContentPartImage[] = [];\n for (const result of msg.content) {\n const text = toolResultText(result.content);\n const images = toolResultImages(result.content);\n const hasText = text.length > 0;\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: hasText ? text : \"(see attached image)\",\n });\n if (images.length > 0 && options?.supportsImages !== false) {\n for (const img of images) {\n imageBlocks.push({\n type: \"image_url\",\n image_url: { url: `data:${img.mediaType};base64,${img.data}` },\n });\n }\n }\n }\n if (imageBlocks.length > 0) {\n out.push({\n role: \"user\",\n content: [{ type: \"text\", text: \"Attached image(s) from tool result:\" }, ...imageBlocks],\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(\n level: ThinkingLevel,\n _model: string,\n): \"low\" | \"medium\" | \"high\" | \"xhigh\" {\n return level === \"max\" ? \"xhigh\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type {\n ContentPart,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n downgradeUnsupportedImages,\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\nimport { normalizePromptCacheKey } from \"./prompt-cache-key.js\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseToolArguments(argsJson: string): Record<string, unknown> {\n if (!argsJson) return {};\n try {\n const parsed = JSON.parse(argsJson) as unknown;\n const unwrapped = typeof parsed === \"string\" ? (JSON.parse(parsed) as unknown) : parsed;\n return isJsonObject(unwrapped) ? unwrapped : {};\n } catch {\n return {};\n }\n}\n\nfunction createClient(options: StreamOptions): OpenAI {\n return new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n}\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const providerName = options.provider ?? \"openai\";\n const useStreaming = options.streaming !== false;\n\n const client = createClient(options);\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam =\n options.provider === \"glm\" || options.provider === \"moonshot\" || options.provider === \"xiaomi\";\n\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const messages = toOpenAIMessages(downgradedMessages, {\n provider: options.provider,\n thinking: !!options.thinking,\n supportsImages: options.supportsImages,\n });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: useStreaming,\n ...(options.maxTokens ? { max_completion_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking, options.model) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n ...(useStreaming ? { stream_options: { include_usage: true } } : {}),\n };\n\n // Native web search is disabled for OpenAI-compatible providers — ggcoder\n // provides its own web_search/web_fetch tools which handle results properly.\n // Moonshot's $web_search was previously injected here but it returns opaque\n // results and triggers reasoning_content validation errors with thinking mode.\n\n // prompt_cache_key helps bucket similar requests for better cache hit rates.\n // Only send to providers known to support it (OpenAI, Moonshot/Kimi) — unknown\n // params may cause errors on other OpenAI-compatible providers like GLM or Xiaomi.\n if (options.provider === \"openai\" || options.provider === \"moonshot\") {\n const paramsAny = params as unknown as Record<string, unknown>;\n paramsAny.prompt_cache_key = normalizePromptCacheKey(options.promptCacheKey ?? \"ggcoder\");\n\n // Map cacheRetention to OpenAI's prompt_cache_retention param.\n // \"long\" → \"24h\" keeps cached prefixes active up to 24 hours (OpenAI feature).\n const retention = options.cacheRetention ?? \"short\";\n if (retention === \"long\") {\n paramsAny.prompt_cache_retention = \"24h\";\n }\n }\n\n if (options.provider === \"openai\" && options.serviceTier) {\n (params as unknown as Record<string, unknown>).service_tier = options.serviceTier;\n }\n\n // Inject custom thinking param for GLM/Moonshot/Xiaomi (not part of OpenAI spec)\n if (usesThinkingParam) {\n if (options.thinking) {\n (params as unknown as Record<string, unknown>).thinking = { type: \"enabled\" };\n } else {\n // All providers (GLM, Moonshot, Xiaomi MiMo) support explicit disabled.\n // MiMo is an always-on reasoning model — without { type: \"disabled\" } it\n // returns reasoning_content and may produce thinking-only responses with\n // no actionable output, causing the agent loop to silently end.\n (params as unknown as Record<string, unknown>).thinking = { type: \"disabled\" };\n }\n }\n\n // Dump request body for stall diagnosis when GGAI_DUMP_REQUEST is set\n if (\n (globalThis as Record<string, unknown>).process &&\n ((globalThis as Record<string, unknown>).process as Record<string, Record<string, string>>).env\n ?.GGAI_DUMP_REQUEST\n ) {\n const fs = await import(\"fs\");\n const ts = new Date().toISOString().replace(/[:.]/g, \"-\");\n const dumpPath = `/tmp/ggai-request-${ts}.json`;\n fs.writeFileSync(dumpPath, JSON.stringify(params, null, 2));\n fs.appendFileSync(\n \"/tmp/ggai-requests.log\",\n `[${ts}] ${dumpPath} messages=${params.messages.length}\\n`,\n );\n }\n\n // Non-streaming fallback: issue a single request/response and synthesize\n // stream events from the final ChatCompletion. Used by the agent loop after\n // the streaming transport has stalled repeatedly -- flipping to a plain\n // request/response often recovers from broken SSE connections.\n if (!useStreaming) {\n try {\n const completion = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as OpenAI.ChatCompletion;\n yield* synthesizeEventsFromCompletion(completion, !!options.thinking);\n return completionToResponse(completion);\n } catch (err) {\n throw toError(err, providerName);\n }\n }\n\n let stream: AsyncIterable<OpenAI.ChatCompletionChunk>;\n try {\n stream = (await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n })) as AsyncIterable<OpenAI.ChatCompletionChunk>;\n } catch (err) {\n throw toError(err, providerName);\n }\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n // Vendor-specific cache reporting fields:\n // - Kimi K2/K2.5 / StepFun: top-level `cached_tokens`\n // - DeepSeek / SiliconFlow: `prompt_cache_hit_tokens`\n // OpenAI / Zhipu (GLM) / MiniMax / Qwen / Mistral / xAI all use the\n // standard `prompt_tokens_details.cached_tokens` handled above.\n const usageAny = chunk.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n if (\n !cacheRead &&\n typeof usageAny.prompt_cache_hit_tokens === \"number\" &&\n usageAny.prompt_cache_hit_tokens > 0\n ) {\n cacheRead = usageAny.prompt_cache_hit_tokens as number;\n }\n // OpenAI's prompt_tokens includes cached tokens; subtract to match\n // Anthropic's convention where inputTokens excludes cache hits.\n inputTokens = chunk.usage.prompt_tokens - cacheRead;\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot, Xiaomi MiMo, DeepSeek)\n // Always accumulate reasoning_content for round-tripping in multi-turn\n // conversations (models like DeepSeek Reasoner require it on assistant\n // messages). Only yield thinking_delta to the UI when thinking is enabled\n // — reasoning models like MiMo always return reasoning_content even when\n // thinking is \"off\", which would cause a permanent \"Thinking\" indicator.\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n if (options.thinking) {\n yield { type: \"thinking_delta\", text: reasoningContent };\n }\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n yield { type: \"text_delta\", text: delta.content };\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n yield {\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n };\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot, Xiaomi reasoning_content)\n // Always include in response for multi-turn round-tripping, even when\n // thinking display is off — toOpenAIMessages sends it as reasoning_content.\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n const args = parseToolArguments(tc.argsJson);\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n };\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n yield { type: \"done\", stopReason };\n return response;\n}\n\n/**\n * Walk a non-streaming OpenAI ChatCompletion and yield the same StreamEvents\n * that the streaming path would produce. Emits one large delta per field so\n * the agent loop consumer observes identical behaviour to streaming mode.\n */\nfunction* synthesizeEventsFromCompletion(\n completion: OpenAI.ChatCompletion,\n thinkingEnabled: boolean,\n): Generator<StreamEvent, void> {\n const choice = completion.choices?.[0];\n if (!choice) {\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(null) };\n return;\n }\n\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning / thinking content (GLM, Moonshot, DeepSeek)\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning && thinkingEnabled) {\n yield { type: \"thinking_delta\", text: reasoning };\n }\n\n // Text content\n if (typeof msg.content === \"string\" && msg.content) {\n yield { type: \"text_delta\", text: msg.content };\n }\n\n // Tool calls\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const argsJson = tc.function?.arguments ?? \"\";\n if (argsJson) {\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n argsJson,\n };\n }\n const args = parseToolArguments(argsJson);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n }\n }\n\n yield { type: \"done\", stopReason: normalizeOpenAIStopReason(choice.finish_reason ?? null) };\n}\n\n/** Convert a non-streaming OpenAI ChatCompletion into our StreamResponse shape. */\nfunction completionToResponse(completion: OpenAI.ChatCompletion): StreamResponse {\n const choice = completion.choices?.[0];\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n\n if (choice) {\n const msg = choice.message as unknown as Record<string, unknown>;\n\n // Reasoning content -- always included for multi-turn round-tripping\n const reasoning = msg.reasoning_content;\n if (typeof reasoning === \"string\" && reasoning) {\n contentParts.push({ type: \"thinking\", text: reasoning });\n }\n\n if (typeof msg.content === \"string\" && msg.content) {\n textAccum = msg.content;\n contentParts.push({ type: \"text\", text: msg.content });\n }\n\n const toolCalls = msg.tool_calls as\n | Array<{ id: string; function: { name: string; arguments: string } }>\n | undefined;\n if (toolCalls) {\n for (const tc of toolCalls) {\n const args = parseToolArguments(tc.function?.arguments ?? \"\");\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.function?.name ?? \"\",\n args,\n };\n contentParts.push(toolCall);\n }\n }\n }\n\n // Usage -- match streaming path accounting (inputTokens excludes cache hits).\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n if (completion.usage) {\n outputTokens = completion.usage.completion_tokens;\n const details = completion.usage.prompt_tokens_details;\n if (details?.cached_tokens) cacheRead = details.cached_tokens;\n const usageAny = completion.usage as unknown as Record<string, unknown>;\n if (!cacheRead && typeof usageAny.cached_tokens === \"number\" && usageAny.cached_tokens > 0) {\n cacheRead = usageAny.cached_tokens as number;\n }\n if (\n !cacheRead &&\n typeof usageAny.prompt_cache_hit_tokens === \"number\" &&\n usageAny.prompt_cache_hit_tokens > 0\n ) {\n cacheRead = usageAny.prompt_cache_hit_tokens as number;\n }\n inputTokens = completion.usage.prompt_tokens - cacheRead;\n }\n\n const stopReason = normalizeOpenAIStopReason(choice?.finish_reason ?? null);\n\n return {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum,\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n const body = err.error as Record<string, unknown> | undefined;\n const bodyMessage =\n typeof body?.message === \"string\" && body.message.trim() ? body.message.trim() : undefined;\n const modelName = typeof body?.model === \"string\" ? body.model : \"\";\n const cleanMessage = bodyMessage ?? err.message;\n\n let hint: string | undefined;\n if (modelName === \"codex-mini-latest\" || cleanMessage.includes(\"codex-mini-latest\")) {\n hint =\n \"codex-mini-latest requires an OpenAI Pro or Max subscription. \" +\n \"Your account currently has access to GPT-5.4 and GPT-5.4 Mini.\";\n }\n\n const requestId =\n (err as unknown as { request_id?: string }).request_id ??\n (typeof body?.request_id === \"string\" ? body.request_id : undefined);\n\n return new ProviderError(provider, cleanMessage, {\n statusCode: err.status,\n ...(requestId ? { requestId } : {}),\n ...(hint ? { hint } : {}),\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","const MAX_PROMPT_CACHE_KEY_LENGTH = 64;\n\nexport function normalizePromptCacheKey(key: string): string {\n if (key.length <= MAX_PROMPT_CACHE_KEY_LENGTH) return key;\n const hash = fnv1aHash(key);\n const prefixLength = MAX_PROMPT_CACHE_KEY_LENGTH - hash.length - 1;\n return `${key.slice(0, prefixLength)}:${hash}`;\n}\n\nfunction fnv1aHash(value: string): string {\n let hash = 0x811c9dc5;\n for (let index = 0; index < value.length; index++) {\n hash ^= value.charCodeAt(index);\n hash = Math.imul(hash, 0x01000193);\n }\n return (hash >>> 0).toString(16).padStart(8, \"0\");\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n ImageContent,\n Message,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n TextContent,\n Tool,\n ToolCall,\n ToolResultContent,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerDiag } from \"../utils/diag.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\nimport { normalizePromptCacheKey } from \"./prompt-cache-key.js\";\nimport { downgradeUnsupportedImages } from \"./transform.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction parseToolArguments(argsJson: string): Record<string, unknown> {\n if (!argsJson) return {};\n try {\n const parsed = JSON.parse(argsJson) as unknown;\n const unwrapped = typeof parsed === \"string\" ? (JSON.parse(parsed) as unknown) : parsed;\n return isJsonObject(unwrapped) ? unwrapped : {};\n } catch {\n return {};\n }\n}\n\nfunction outputTextKey(itemId: string | undefined, contentIndex: number | undefined): string {\n return `${itemId ?? \"\"}:${contentIndex ?? 0}`;\n}\n\nfunction isVisibleOutputItem(itemType: string | undefined): boolean {\n return itemType === \"message\";\n}\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const downgraded = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { system, input } = toCodexInput(downgraded, { supportsImages: options.supportsImages });\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n // Always set a prompt_cache_key. OpenAI uses this key to route requests\n // with the same prefix to the same cache shard — without it, the codex\n // backend hashes only the request body, so cache hits for shared\n // system+tool prefixes across separate sub-agent processes are accidental\n // rather than guaranteed.\n body.prompt_cache_key = normalizePromptCacheKey(options.promptCacheKey ?? \"ggcoder\");\n // Map cacheRetention to OpenAI's prompt_cache_retention. \"long\" pins the\n // cached prefix for up to 24h (vs the default 5–10 min in-memory window).\n if (options.cacheRetention === \"long\") {\n body.prompt_cache_retention = \"24h\";\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n body.reasoning = {\n effort: options.thinking ?? \"none\",\n summary: \"auto\",\n };\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n // The chatgpt.com codex backend routes prompt cache lookups by header, not\n // body — `prompt_cache_key` in the body alone never produces a cache hit\n // here (verified against gpt-5.5 with a 22k-token shared prefix). Pinning\n // both `session_id` and `x-client-request-id` to the cache scope is what\n // makes consecutive requests hit the same cache shard.\n const cacheScopeId = body.prompt_cache_key as string | undefined;\n if (cacheScopeId) {\n headers[\"session_id\"] = cacheScopeId;\n headers[\"x-client-request-id\"] = cacheScopeId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n const parsed = parseCodexErrorBody(text);\n const message = parsed.message ?? `Codex API returned HTTP ${response.status}.`;\n const requestId =\n parsed.requestId ??\n response.headers.get(\"x-request-id\") ??\n response.headers.get(\"openai-request-id\") ??\n response.headers.get(\"x-oai-request-id\") ??\n undefined;\n\n // ChatGPT-subscription usage-window exhaustion. The codex backend returns\n // HTTP 429 with a usage_limit_reached / usage_not_included / rate_limit_exceeded\n // code and a reset timestamp. Stop immediately with a clear message instead\n // of letting the agent loop retry a 429 it can't recover from.\n const usageLimit = codexUsageLimitError(parsed.errorObj, response.status, requestId);\n if (usageLimit) throw usageLimit;\n\n let hint: string | undefined;\n if (response.status === 400 && text.includes(\"not supported\")) {\n if (options.model === \"gpt-5.5-pro\") {\n hint = \"Use gpt-5.5 instead. OpenAI's Codex model catalog does not list gpt-5.5-pro.\";\n } else {\n hint =\n \"This model is not available through Codex for the authenticated account. \" +\n \"Run /model and choose a model listed for OpenAI Codex, or check your Codex model picker/usage limits.\";\n }\n } else if (response.status === 404 && text.includes(\"does not exist\")) {\n hint =\n \"This model is not in the current OpenAI Codex catalog for this account. \" +\n \"Try gpt-5.5, gpt-5.4, gpt-5.4-mini, or gpt-5.3-codex.\";\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n ...(requestId ? { requestId } : {}),\n ...(hint ? { hint } : {}),\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n const outputItemTypes = new Map<string, string>();\n const outputTextByPart = new Map<string, string>();\n const pendingOutputTextByPart = new Map<\n string,\n { itemId: string; contentIndex: number; text: string }\n >();\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n\n // ── Diagnostic: log the first occurrence of each raw SSE event type with\n // timing, so we can see what Codex sends during the pre-reasoning window\n // and decide whether earlier signals are available to drive the UI.\n const diagStart = Date.now();\n const diagSeen = new Set<string>();\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (!diagSeen.has(type)) {\n diagSeen.add(type);\n providerDiag(\"codex_event_first\", { type, sinceStartMs: Date.now() - diagStart });\n }\n\n if (type === \"error\") {\n // Codex Responses streams two error shapes:\n // { type:\"error\", error:{ type, code, message, param }, sequence_number }\n // { type:\"error\", code, message, param, sequence_number }\n // Pick the first message field we find; fall back to the chunk code/type\n // rather than dumping the raw JSON at the user.\n const nested = (event.error as Record<string, unknown> | undefined) ?? undefined;\n const message =\n (nested?.message as string | undefined) ??\n (event.message as string | undefined) ??\n \"Codex stream emitted an error chunk without a message.\";\n const code =\n (nested?.code as string | undefined) ??\n (nested?.type as string | undefined) ??\n (event.code as string | undefined) ??\n \"server_error\";\n // OpenAI sometimes embeds the request ID inside the human-readable\n // message (\"…request ID abc123 in your message\"); fish it out so the\n // FormattedError can surface it on its own line.\n const requestId = extractCodexRequestId(message) ?? (event.request_id as string | undefined);\n // ChatGPT-subscription usage-window exhaustion can arrive mid-stream as an\n // error chunk. Surface it as a hard usage-limit stop, not a retriable error.\n const usageLimit = codexUsageLimitError(\n nested ?? (event as Record<string, unknown>),\n undefined,\n requestId,\n );\n if (usageLimit) throw usageLimit;\n throw new ProviderError(\"openai\", message, {\n ...(requestId != null ? { requestId } : {}),\n ...(code === \"server_error\" ? { statusCode: 500 } : {}),\n });\n }\n\n if (type === \"response.failed\") {\n const nested = event.error as Record<string, unknown> | undefined;\n const message = (nested?.message as string | undefined) ?? \"Codex response failed.\";\n const requestId = extractCodexRequestId(message) ?? (event.request_id as string | undefined);\n throw new ProviderError(\"openai\", message, {\n ...(requestId != null ? { requestId } : {}),\n });\n }\n\n // Text delta. OpenAI documents response.output_text.* as output content\n // text, while reasoning has separate response.reasoning*_text.delta events.\n // The ChatGPT Codex transport can occasionally attach output_text chunks to\n // reasoning or send text before item metadata. Never expose output_text unless\n // the item is positively identified as a visible assistant message.\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string | undefined;\n const contentIndex = event.content_index as number | undefined;\n const key = outputTextKey(itemId, contentIndex);\n outputTextByPart.set(key, `${outputTextByPart.get(key) ?? \"\"}${delta}`);\n const itemType = itemId ? outputItemTypes.get(itemId) : undefined;\n if (itemId && isVisibleOutputItem(itemType)) {\n textAccum += delta;\n yield { type: \"text_delta\", text: delta };\n } else if (itemId && itemType == null) {\n const pending = pendingOutputTextByPart.get(key);\n pendingOutputTextByPart.set(key, {\n itemId,\n contentIndex: contentIndex ?? 0,\n text: `${pending?.text ?? \"\"}${delta}`,\n });\n }\n }\n\n // Text done. The final event can contain text not seen in deltas; emit only\n // the missing suffix so consumers don't see duplicate visible output, and\n // only after item metadata proves the part belongs to a message.\n if (type === \"response.output_text.done\") {\n const fullText = event.text as string | undefined;\n if (fullText) {\n const itemId = event.item_id as string | undefined;\n const contentIndex = event.content_index as number | undefined;\n const key = outputTextKey(itemId, contentIndex);\n const streamedText = outputTextByPart.get(key) ?? \"\";\n const missingText = streamedText ? fullText.slice(streamedText.length) : fullText;\n outputTextByPart.set(key, fullText);\n if (missingText && fullText.startsWith(streamedText)) {\n const itemType = itemId ? outputItemTypes.get(itemId) : undefined;\n if (itemId && isVisibleOutputItem(itemType)) {\n textAccum += missingText;\n yield { type: \"text_delta\", text: missingText };\n } else if (itemId && itemType == null) {\n const pending = pendingOutputTextByPart.get(key);\n pendingOutputTextByPart.set(key, {\n itemId,\n contentIndex: contentIndex ?? 0,\n text: `${pending?.text ?? \"\"}${missingText}`,\n });\n }\n }\n }\n }\n\n // Thinking delta\n if (\n type === \"response.reasoning_summary_text.delta\" ||\n type === \"response.reasoning_summary.delta\" ||\n type === \"response.reasoning_text.delta\" ||\n type === \"response.reasoning.delta\"\n ) {\n const delta = event.delta as string;\n if (options.thinking) yield { type: \"thinking_delta\", text: delta };\n }\n\n // Reasoning item started — the model has begun reasoning on the server.\n // Surface this as an empty thinking_delta so the UI can flip to the\n // \"thinking\" phase ~3s before the summary text actually starts streaming.\n // (Codex emits this at ~1s vs reasoning_summary_text.delta at ~4–10s.)\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n const itemId = item?.id as string | undefined;\n const itemType = item?.type as string | undefined;\n if (itemId && itemType) {\n outputItemTypes.set(itemId, itemType);\n }\n if (itemType === \"reasoning\" && options.thinking) {\n yield { type: \"thinking_delta\", text: \"\" };\n }\n if (itemId && itemType) {\n const pending = [...pendingOutputTextByPart.entries()]\n .filter(([, pendingPart]) => pendingPart.itemId === itemId)\n .sort(([, a], [, b]) => a.contentIndex - b.contentIndex);\n for (const [key, pendingPart] of pending) {\n pendingOutputTextByPart.delete(key);\n if (!pendingPart.text) continue;\n if (isVisibleOutputItem(itemType)) {\n textAccum += pendingPart.text;\n yield { type: \"text_delta\", text: pendingPart.text };\n }\n }\n }\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n yield {\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n };\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n const args = parseToolArguments(tc.argsJson);\n yield {\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n };\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as\n | (Record<string, number> & {\n input_tokens_details?: { cached_tokens?: number };\n })\n | undefined;\n if (usage) {\n cacheRead = usage.input_tokens_details?.cached_tokens ?? 0;\n inputTokens = (usage.input_tokens ?? 0) - cacheRead;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n const args = parseToolArguments(tc.argsJson);\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n yield { type: \"done\", stopReason };\n return streamResponse;\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction codexToolResultText(content: ToolResultContent): string {\n if (typeof content === \"string\") return content;\n return content\n .filter((b): b is TextContent => b.type === \"text\")\n .map((b) => b.text)\n .join(\"\\n\");\n}\n\nfunction toCodexInput(\n messages: Message[],\n options?: { supportsImages?: boolean },\n): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n const toolImages: ImageContent[] = [];\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n const text = codexToolResultText(result.content);\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: text.length > 0 ? text : \"(see attached image)\",\n });\n if (options?.supportsImages !== false && Array.isArray(result.content)) {\n for (const block of result.content) {\n if (block.type === \"image\") toolImages.push(block);\n }\n }\n }\n if (toolImages.length > 0) {\n input.push({\n type: \"message\",\n role: \"user\",\n content: [\n { type: \"input_text\", text: \"Attached image(s) from tool result:\" },\n ...toolImages.map((img) => ({\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${img.mediaType};base64,${img.data}`,\n })),\n ],\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// OpenAI's server_error messages embed the request ID inline (\"…request ID\n// abc123 in your message\"). Pull it out so we can surface it as a structured\n// field rather than leaving it buried in the message.\nfunction extractCodexRequestId(message: string): string | undefined {\n const match = message.match(/request ID ([a-z0-9-]{8,})/i);\n return match?.[1];\n}\n\n// HTTP error bodies come back as JSON or plain text. Try to extract a clean\n// message string + request_id (and the raw error object) so we never spill the\n// raw JSON into the UI.\nfunction parseCodexErrorBody(text: string): {\n message?: string;\n requestId?: string;\n errorObj?: Record<string, unknown>;\n} {\n if (!text) return {};\n try {\n const parsed = JSON.parse(text) as Record<string, unknown>;\n const error = parsed.error as Record<string, unknown> | undefined;\n const detail = parsed.detail as unknown;\n const message =\n (error?.message as string | undefined) ??\n (parsed.message as string | undefined) ??\n (typeof detail === \"string\" ? detail : undefined);\n const requestId =\n (parsed.request_id as string | undefined) ??\n (error?.request_id as string | undefined) ??\n (message ? extractCodexRequestId(message) : undefined);\n // Some codex error payloads put the usage-limit fields at the top level\n // rather than under `error` — prefer the nested object but fall back to the\n // whole payload so resets_at / code are still visible.\n const errorObj = error ?? parsed;\n return {\n ...(message ? { message } : {}),\n ...(requestId ? { requestId } : {}),\n ...(errorObj ? { errorObj } : {}),\n };\n } catch {\n // Non-JSON body — return the trimmed text directly, capped so we never\n // splat a huge HTML error page.\n const trimmed = text.trim().slice(0, 240);\n return trimmed ? { message: trimmed } : {};\n }\n}\n\nconst CODEX_USAGE_LIMIT_CODE = /usage_limit_reached|usage_not_included/i;\nconst CODEX_RATE_LIMIT_CODE = /rate_limit_exceeded/i;\n\n/**\n * Detect a ChatGPT-subscription usage-window exhaustion from a Codex error\n * payload and build a canonical usage-limit ProviderError. The codex backend\n * returns HTTP 429 with an error `code`/`type` of usage_limit_reached /\n * usage_not_included (hard plan-window stop) or rate_limit_exceeded, plus a\n * `resets_at` (unix seconds) directly or nested under `rate_limits.primary` /\n * `.secondary` (or a `resets_in_seconds` countdown).\n *\n * Returns null for anything that isn't clearly a usage-window stop — a bare\n * transient 429 with no reset info still flows through the normal retry path.\n */\nfunction codexUsageLimitError(\n errorObj: Record<string, unknown> | undefined,\n statusCode: number | undefined,\n requestId: string | undefined,\n): ProviderError | null {\n const code = String(errorObj?.code ?? errorObj?.type ?? \"\");\n const rateLimits = errorObj?.rate_limits as\n | { primary?: { resets_at?: number }; secondary?: { resets_at?: number } }\n | undefined;\n const resetsAtRaw =\n (typeof errorObj?.resets_at === \"number\" ? (errorObj.resets_at as number) : undefined) ??\n rateLimits?.primary?.resets_at ??\n rateLimits?.secondary?.resets_at;\n const resetsInSeconds =\n typeof errorObj?.resets_in_seconds === \"number\"\n ? (errorObj.resets_in_seconds as number)\n : undefined;\n const resetsAt =\n typeof resetsAtRaw === \"number\" && resetsAtRaw > 0\n ? resetsAtRaw\n : resetsInSeconds != null && resetsInSeconds > 0\n ? Math.floor(Date.now() / 1000) + resetsInSeconds\n : undefined;\n\n const isHardUsage = CODEX_USAGE_LIMIT_CODE.test(code);\n const isRateOr429 = CODEX_RATE_LIMIT_CODE.test(code) || statusCode === 429;\n if (!isHardUsage && !(isRateOr429 && resetsAt != null)) return null;\n\n return new ProviderError(\"openai\", \"ChatGPT usage limit reached\", {\n statusCode: statusCode ?? 429,\n ...(requestId ? { requestId } : {}),\n ...(resetsAt ? { resetsAt } : {}),\n });\n}\n","/**\n * Provider-level diagnostic hook. Mirrors the pattern used by gg-agent's\n * setStreamDiagnostic — the host app wires a callback (typically writing to\n * a debug log) and providers call `providerDiag(...)` to record interesting\n * lifecycle events (e.g. raw SSE event types and timings).\n */\nexport type ProviderDiagnosticFn = (phase: string, data?: Record<string, unknown>) => void;\n\nlet _diagFn: ProviderDiagnosticFn | null = null;\n\n/** Register a diagnostic callback for provider-level tracing. */\nexport function setProviderDiagnostic(fn: ProviderDiagnosticFn | null): void {\n _diagFn = fn;\n}\n\nexport function providerDiag(phase: string, data?: Record<string, unknown>): void {\n _diagFn?.(phase, data);\n}\n","import type {\n ContentPart,\n Message,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n ToolChoice,\n ToolResultContent,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { downgradeUnsupportedImages } from \"./transform.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_CODE_ASSIST_BASE_URL = \"https://cloudcode-pa.googleapis.com\";\nconst CODE_ASSIST_API_VERSION = \"v1internal\";\nconst GEMINI_CLI_USER_AGENT = \"google-gemini-cli\";\nconst GEMINI_CLI_API_CLIENT = \"gemini-cli/0.0.0\";\nconst CODE_ASSIST_NON_STREAMING_RETRIES = 3;\nconst CODE_ASSIST_NON_STREAMING_RETRY_DELAY_MS = 1_000;\nconst SYNTHETIC_THOUGHT_SIGNATURE = \"skip_thought_signature_validator\";\nconst CODE_ASSIST_SUPPORTED_MODELS = new Set([\n \"gemini-3-pro-preview\",\n \"gemini-3.1-pro-preview\",\n \"gemini-3.1-pro-preview-customtools\",\n \"gemini-3-flash-preview\",\n \"gemini-3.1-flash-lite-preview\",\n \"gemini-2.5-pro\",\n \"gemini-2.5-flash\",\n \"gemini-2.5-flash-lite\",\n \"gemma-4-31b-it\",\n \"gemma-4-26b-a4b-it\",\n]);\n\ninterface GeminiTextPart {\n text: string;\n thought?: boolean;\n thoughtSignature?: string;\n}\n\ninterface GeminiInlineDataPart {\n inlineData: {\n mimeType: string;\n data: string;\n };\n}\n\ninterface GeminiFunctionCallPart {\n functionCall: {\n id?: string;\n name: string;\n args?: Record<string, unknown>;\n };\n thoughtSignature?: string;\n}\n\ninterface GeminiFunctionResponsePart {\n functionResponse: {\n id?: string;\n name: string;\n response: Record<string, unknown>;\n };\n}\n\ntype GeminiPart =\n | GeminiTextPart\n | GeminiInlineDataPart\n | GeminiFunctionCallPart\n | GeminiFunctionResponsePart;\n\ninterface GeminiContent {\n role?: \"user\" | \"model\";\n parts: GeminiPart[];\n}\n\ninterface GeminiTool {\n functionDeclarations: Array<{\n name: string;\n description?: string;\n parameters?: Record<string, unknown>;\n }>;\n}\n\ninterface GeminiGenerationConfig {\n maxOutputTokens?: number;\n temperature?: number;\n topP?: number;\n stopSequences?: string[];\n thinkingConfig?: {\n includeThoughts?: boolean;\n thinkingBudget?: number;\n thinkingLevel?: \"LOW\" | \"MEDIUM\" | \"HIGH\";\n };\n}\n\ninterface GeminiGenerateContentRequest {\n contents: GeminiContent[];\n systemInstruction?: GeminiContent;\n tools?: GeminiTool[];\n toolConfig?: {\n functionCallingConfig: {\n mode: \"AUTO\" | \"NONE\" | \"ANY\";\n allowedFunctionNames?: string[];\n };\n };\n generationConfig?: GeminiGenerationConfig;\n session_id?: string;\n}\n\ninterface GeminiCodeAssistRequest {\n model: string;\n project?: string;\n user_prompt_id: string;\n request: GeminiGenerateContentRequest;\n}\n\ninterface GeminiRequestPlan {\n url: URL;\n headers: Record<string, string>;\n body: GeminiCodeAssistRequest;\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent;\n finishReason?: string;\n}\n\ninterface GeminiUsageMetadata {\n promptTokenCount?: number;\n candidatesTokenCount?: number;\n totalTokenCount?: number;\n cachedContentTokenCount?: number;\n thoughtsTokenCount?: number;\n}\n\ninterface GeminiGenerateResponse {\n traceId?: string;\n response?: {\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n };\n candidates?: GeminiCandidate[];\n usageMetadata?: GeminiUsageMetadata;\n}\n\ninterface ParsedSseEvent {\n event?: string;\n data: string;\n}\n\nfunction isJsonObject(value: unknown): value is Record<string, unknown> {\n return value != null && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction getEnvironment(): Record<string, string | undefined> | undefined {\n return (globalThis as { process?: { env?: Record<string, string | undefined> } }).process?.env;\n}\n\nfunction getGoogleProject(options: StreamOptions): string | undefined {\n const env = getEnvironment();\n return options.projectId ?? env?.GOOGLE_CLOUD_PROJECT ?? env?.GOOGLE_CLOUD_PROJECT_ID;\n}\n\nfunction getCodeAssistEndpoint(method: string): URL {\n const env = getEnvironment();\n const endpoint = env?.CODE_ASSIST_ENDPOINT ?? DEFAULT_CODE_ASSIST_BASE_URL;\n const version = env?.CODE_ASSIST_API_VERSION || CODE_ASSIST_API_VERSION;\n return new URL(`${endpoint}/${version}:${method}`);\n}\n\nfunction formatUnsupportedModelMessage(model: string): string {\n return `Gemini OAuth is configured to use the Gemini Code Assist subscription endpoint only. That endpoint does not currently expose model \"${model}\".`;\n}\n\nfunction formatErrorMessage(status: number, body: string, model: string): string {\n if (status === 404 && !CODE_ASSIST_SUPPORTED_MODELS.has(model)) {\n return `Gemini API error (404): ${body}\\n\\n${formatUnsupportedModelMessage(model)}`;\n }\n return `Gemini API error (${status}): ${body}`;\n}\n\nfunction toSystemAndContents(messages: Message[]): {\n systemInstruction?: GeminiContent;\n contents: GeminiContent[];\n} {\n let systemText = \"\";\n const contents: GeminiContent[] = [];\n const toolNamesById = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = systemText ? `${systemText}\\n\\n${msg.content}` : msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n contents.push({\n role: \"user\",\n parts:\n typeof msg.content === \"string\"\n ? [{ text: msg.content }]\n : msg.content.map((part): GeminiPart => {\n if (part.type === \"text\") return { text: part.text };\n return { inlineData: { mimeType: part.mediaType, data: part.data } };\n }),\n });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n const parts: GeminiPart[] = [];\n const source = msg.content;\n if (typeof source === \"string\") {\n if (source) parts.push({ text: source });\n } else {\n for (const part of source) {\n if (part.type === \"text\" && part.text) {\n parts.push({ text: part.text });\n } else if (part.type === \"thinking\" && part.text) {\n parts.push({ text: part.text });\n } else if (part.type === \"tool_call\") {\n toolNamesById.set(part.id, part.name);\n parts.push({\n functionCall: { id: part.id, name: part.name, args: part.args },\n thoughtSignature: SYNTHETIC_THOUGHT_SIGNATURE,\n });\n }\n }\n }\n if (parts.length > 0) contents.push({ role: \"model\", parts });\n continue;\n }\n\n if (msg.role === \"tool\") {\n const parts: GeminiPart[] = [];\n for (const result of msg.content) {\n const name = toolNamesById.get(result.toolCallId) ?? result.toolCallId;\n const content =\n typeof result.content === \"string\"\n ? result.content\n : stringifyToolContent(result.content);\n parts.push({\n functionResponse: {\n id: result.toolCallId,\n name,\n response: {\n content,\n ...(result.isError ? { isError: true } : {}),\n },\n },\n });\n }\n if (parts.length > 0) contents.push({ role: \"user\", parts });\n }\n }\n\n return {\n ...(systemText ? { systemInstruction: { parts: [{ text: systemText }] } } : {}),\n contents,\n };\n}\n\nfunction stringifyToolContent(content: Exclude<ToolResultContent, string>): string {\n return content\n .map((part) => (part.type === \"text\" ? part.text : `[image ${part.mediaType}]`))\n .join(\"\\n\");\n}\n\nfunction toGeminiTools(tools: Tool[] | undefined): GeminiTool[] | undefined {\n if (!tools?.length) return undefined;\n return [\n {\n functionDeclarations: tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n parameters: sanitizeSchema(tool.rawInputSchema ?? zodToJsonSchema(tool.parameters)),\n })),\n },\n ];\n}\n\nfunction sanitizeSchema(schema: Record<string, unknown>): Record<string, unknown> {\n const clone = JSON.parse(JSON.stringify(schema)) as Record<string, unknown>;\n stripUnsupportedSchemaFields(clone);\n return clone;\n}\n\nfunction stripUnsupportedSchemaFields(value: unknown): void {\n if (!isJsonObject(value)) {\n if (Array.isArray(value)) {\n for (const item of value) stripUnsupportedSchemaFields(item);\n }\n return;\n }\n\n delete value.$schema;\n delete value.additionalProperties;\n\n for (const item of Object.values(value)) {\n if (isJsonObject(item) || Array.isArray(item)) {\n stripUnsupportedSchemaFields(item);\n }\n }\n}\n\nfunction toGeminiToolConfig(\n choice: ToolChoice | undefined,\n tools: Tool[] | undefined,\n): GeminiGenerateContentRequest[\"toolConfig\"] | undefined {\n if (!choice || !tools?.length) return undefined;\n if (choice === \"auto\") return { functionCallingConfig: { mode: \"AUTO\" } };\n if (choice === \"none\") return { functionCallingConfig: { mode: \"NONE\" } };\n if (choice === \"required\") return { functionCallingConfig: { mode: \"ANY\" } };\n return { functionCallingConfig: { mode: \"ANY\", allowedFunctionNames: [choice.name] } };\n}\n\nfunction isGemini3Model(model: string): boolean {\n return /^gemini-3(?:\\.|-|$)/.test(model);\n}\n\nfunction toGemini3ThinkingLevel(\n level: NonNullable<StreamOptions[\"thinking\"]>,\n): \"LOW\" | \"MEDIUM\" | \"HIGH\" {\n switch (level) {\n case \"low\":\n return \"LOW\";\n case \"medium\":\n return \"MEDIUM\";\n case \"high\":\n case \"xhigh\":\n case \"max\":\n return \"HIGH\";\n }\n}\n\nfunction toThinkingBudget(level: NonNullable<StreamOptions[\"thinking\"]>): number {\n switch (level) {\n case \"low\":\n return 1_024;\n case \"medium\":\n return 8_192;\n case \"high\":\n case \"xhigh\":\n case \"max\":\n return 8_192;\n }\n}\n\nfunction toThinkingConfig(\n model: string,\n level: StreamOptions[\"thinking\"],\n): GeminiGenerationConfig[\"thinkingConfig\"] | undefined {\n if (!level) return undefined;\n if (isGemini3Model(model)) {\n return {\n includeThoughts: true,\n thinkingLevel: toGemini3ThinkingLevel(level),\n };\n }\n return {\n includeThoughts: true,\n thinkingBudget: toThinkingBudget(level),\n };\n}\n\nfunction buildGenerateRequest(options: StreamOptions): GeminiGenerateContentRequest {\n const downgradedMessages = downgradeUnsupportedImages(options.messages, options.supportsImages);\n const { systemInstruction, contents } = toSystemAndContents(downgradedMessages);\n const tools = toGeminiTools(options.tools);\n const toolConfig = toGeminiToolConfig(options.toolChoice, options.tools);\n const thinkingConfig = toThinkingConfig(options.model, options.thinking);\n const generationConfig: GeminiGenerationConfig = {\n ...(options.maxTokens ? { maxOutputTokens: options.maxTokens } : {}),\n ...(options.temperature != null && !options.thinking\n ? { temperature: options.temperature }\n : {}),\n ...(options.topP != null ? { topP: options.topP } : {}),\n ...(options.stop ? { stopSequences: options.stop } : {}),\n ...(thinkingConfig ? { thinkingConfig } : {}),\n };\n\n return {\n contents,\n ...(systemInstruction ? { systemInstruction } : {}),\n ...(tools ? { tools } : {}),\n ...(toolConfig ? { toolConfig } : {}),\n ...(Object.keys(generationConfig).length > 0 ? { generationConfig } : {}),\n ...(options.promptCacheKey ? { session_id: options.promptCacheKey } : {}),\n };\n}\n\nfunction buildCodeAssistRequest(\n options: StreamOptions,\n request: GeminiGenerateContentRequest,\n projectId?: string,\n): GeminiCodeAssistRequest {\n return {\n model: options.model,\n ...(projectId ? { project: projectId } : {}),\n user_prompt_id: crypto.randomUUID(),\n request,\n };\n}\n\nfunction buildRequestPlan(options: StreamOptions, method: string): GeminiRequestPlan {\n if (!CODE_ASSIST_SUPPORTED_MODELS.has(options.model)) {\n throw new ProviderError(\"gemini\", formatUnsupportedModelMessage(options.model));\n }\n\n const projectId = getGoogleProject(options);\n const request = buildGenerateRequest(options);\n\n return {\n url: getCodeAssistEndpoint(method),\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"Content-Type\": \"application/json\",\n \"User-Agent\": GEMINI_CLI_USER_AGENT,\n \"X-Goog-Api-Client\": GEMINI_CLI_API_CLIENT,\n },\n body: buildCodeAssistRequest(options, request, projectId),\n };\n}\n\nfunction normalizeGeminiStopReason(reason: string | undefined): StreamResponse[\"stopReason\"] {\n switch (reason) {\n case \"MAX_TOKENS\":\n return \"max_tokens\";\n case \"STOP\":\n return \"stop_sequence\";\n case \"SAFETY\":\n case \"RECITATION\":\n case \"BLOCKLIST\":\n case \"PROHIBITED_CONTENT\":\n case \"SPII\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nfunction parseSseEvents(buffer: string): { events: ParsedSseEvent[]; remaining: string } {\n const events: ParsedSseEvent[] = [];\n let cursor = 0;\n\n while (true) {\n const next = buffer.indexOf(\"\\n\\n\", cursor);\n if (next === -1) break;\n const raw = buffer.slice(cursor, next);\n cursor = next + 2;\n\n let eventName: string | undefined;\n const dataLines: string[] = [];\n for (const line of raw.split(\"\\n\")) {\n if (line.startsWith(\"event:\")) {\n eventName = line.slice(\"event:\".length).trim();\n } else if (line.startsWith(\"data:\")) {\n dataLines.push(line.slice(\"data:\".length).trimStart());\n }\n }\n\n if (dataLines.length > 0) {\n events.push({ event: eventName, data: dataLines.join(\"\\n\") });\n }\n }\n\n return { events, remaining: buffer.slice(cursor) };\n}\n\nasync function* streamSse(response: Response): AsyncGenerator<GeminiGenerateResponse> {\n if (!response.body) return;\n\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true }).replace(/\\r\\n/g, \"\\n\");\n const parsed = parseSseEvents(buffer);\n buffer = parsed.remaining;\n for (const event of parsed.events) {\n if (event.data === \"[DONE]\") continue;\n yield JSON.parse(event.data) as GeminiGenerateResponse;\n }\n }\n buffer += decoder.decode().replace(/\\r\\n/g, \"\\n\");\n const parsed = parseSseEvents(buffer + \"\\n\\n\");\n for (const event of parsed.events) {\n if (event.data === \"[DONE]\") continue;\n yield JSON.parse(event.data) as GeminiGenerateResponse;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nfunction candidatesFromResponse(response: GeminiGenerateResponse): GeminiCandidate[] | undefined {\n return response.response?.candidates ?? response.candidates;\n}\n\nfunction usageFromResponse(response: GeminiGenerateResponse): GeminiUsageMetadata | undefined {\n return response.response?.usageMetadata ?? response.usageMetadata;\n}\n\nfunction partsFromResponse(response: GeminiGenerateResponse): GeminiPart[] {\n return candidatesFromResponse(response)?.[0]?.content?.parts ?? [];\n}\n\nfunction finishReasonFromResponse(response: GeminiGenerateResponse): string | undefined {\n return candidatesFromResponse(response)?.[0]?.finishReason;\n}\n\nfunction readTextPart(part: GeminiPart): { text: string; thought: boolean } | undefined {\n return \"text\" in part ? { text: part.text, thought: part.thought === true } : undefined;\n}\n\nfunction readFunctionCallPart(\n part: GeminiPart,\n): { id?: string; name: string; args: Record<string, unknown> } | undefined {\n if (!(\"functionCall\" in part)) return undefined;\n return {\n ...(part.functionCall.id ? { id: part.functionCall.id } : {}),\n name: part.functionCall.name,\n args: isJsonObject(part.functionCall.args) ? part.functionCall.args : {},\n };\n}\n\nfunction makeToolCallId(index: number, providerId?: string): string {\n return providerId ?? `gemini_call_${index}_${crypto.randomUUID().replace(/-/g, \"\")}`;\n}\n\nfunction shouldRetryCodeAssistStatus(status: number): boolean {\n return status === 429 || status === 499 || (status >= 500 && status <= 599);\n}\n\nfunction isAbortError(err: unknown): boolean {\n return err instanceof Error && err.name === \"AbortError\";\n}\n\nasync function sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) return;\n await new Promise<void>((resolve, reject) => {\n const cleanup = (): void => signal?.removeEventListener(\"abort\", onAbort);\n const timer = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n const onAbort = (): void => {\n clearTimeout(timer);\n cleanup();\n reject(new DOMException(\"The operation was aborted.\", \"AbortError\"));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (signal?.aborted) onAbort();\n });\n}\n\nasync function fetchCodeAssist(plan: GeminiRequestPlan, options: StreamOptions): Promise<Response> {\n try {\n const response = await fetch(plan.url, {\n method: \"POST\",\n headers: plan.headers,\n body: JSON.stringify(plan.body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n throw new ProviderError(\"gemini\", formatErrorMessage(response.status, text, options.model), {\n statusCode: response.status,\n });\n }\n\n return response;\n } catch (err) {\n throw toError(err);\n }\n}\n\nasync function fetchCodeAssistWithRetry(\n plan: GeminiRequestPlan,\n options: StreamOptions,\n): Promise<Response> {\n let lastError: Error | undefined;\n\n for (let attempt = 0; attempt <= CODE_ASSIST_NON_STREAMING_RETRIES; attempt++) {\n try {\n return await fetchCodeAssist(plan, options);\n } catch (err) {\n const error = toError(err);\n const statusCode = error instanceof ProviderError ? error.statusCode : undefined;\n if (\n options.signal?.aborted ||\n isAbortError(error) ||\n attempt === CODE_ASSIST_NON_STREAMING_RETRIES ||\n (statusCode != null && !shouldRetryCodeAssistStatus(statusCode))\n ) {\n throw error;\n }\n lastError = error;\n }\n\n try {\n await sleep(CODE_ASSIST_NON_STREAMING_RETRY_DELAY_MS, options.signal);\n } catch (err) {\n throw toError(err);\n }\n }\n\n throw lastError ?? new ProviderError(\"gemini\", \"Gemini Code Assist request failed.\");\n}\n\nexport function streamGemini(options: StreamOptions): StreamResult {\n return new StreamResult(runStream(options));\n}\n\nasync function* runStream(options: StreamOptions): AsyncGenerator<StreamEvent, StreamResponse> {\n const useStreaming = options.streaming !== false;\n const method = useStreaming ? \"streamGenerateContent\" : \"generateContent\";\n const plan = buildRequestPlan(options, method);\n if (useStreaming) plan.url.searchParams.set(\"alt\", \"sse\");\n\n const response = useStreaming\n ? await fetchCodeAssist(plan, options)\n : await fetchCodeAssistWithRetry(plan, options);\n\n const contentParts: ContentPart[] = [];\n const pendingToolCalls: ToolCall[] = [];\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let stopReason: StreamResponse[\"stopReason\"] = \"end_turn\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let toolIndex = 0;\n\n const handleResponse = function* (chunk: GeminiGenerateResponse): Generator<StreamEvent> {\n const usage = usageFromResponse(chunk);\n if (usage) {\n inputTokens = usage.promptTokenCount ?? inputTokens;\n outputTokens = usage.candidatesTokenCount ?? outputTokens;\n cacheRead = usage.cachedContentTokenCount ?? cacheRead;\n }\n\n const reason = finishReasonFromResponse(chunk);\n if (reason) stopReason = normalizeGeminiStopReason(reason);\n\n for (const part of partsFromResponse(chunk)) {\n const textPart = readTextPart(part);\n if (textPart) {\n if (textPart.thought) {\n thinkingAccum += textPart.text;\n yield { type: \"thinking_delta\", text: textPart.text };\n } else {\n textAccum += textPart.text;\n yield { type: \"text_delta\", text: textPart.text };\n }\n continue;\n }\n\n const functionCall = readFunctionCallPart(part);\n if (functionCall) {\n const id = makeToolCallId(toolIndex++, functionCall.id);\n const argsJson = JSON.stringify(functionCall.args);\n pendingToolCalls.push({\n type: \"tool_call\",\n id,\n name: functionCall.name,\n args: functionCall.args,\n });\n yield { type: \"toolcall_delta\", id, name: functionCall.name, argsJson };\n }\n }\n };\n\n try {\n if (useStreaming) {\n for await (const chunk of streamSse(response)) {\n yield* handleResponse(chunk);\n }\n } else {\n const chunk = (await response.json()) as GeminiGenerateResponse;\n yield* handleResponse(chunk);\n }\n } catch (err) {\n throw toError(err);\n }\n\n if (thinkingAccum) contentParts.push({ type: \"thinking\", text: thinkingAccum });\n if (textAccum) contentParts.push({ type: \"text\", text: textAccum });\n\n for (const toolCall of pendingToolCalls) {\n contentParts.push(toolCall);\n yield {\n type: \"toolcall_done\",\n id: toolCall.id,\n name: toolCall.name,\n args: toolCall.args,\n };\n }\n\n if (pendingToolCalls.length > 0) stopReason = \"tool_use\";\n\n const adjustedInputTokens = Math.max(0, inputTokens - cacheRead);\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum,\n },\n stopReason,\n usage: {\n inputTokens: adjustedInputTokens,\n outputTokens,\n ...(cacheRead > 0 ? { cacheRead } : {}),\n },\n };\n\n yield { type: \"done\", stopReason };\n return streamResponse;\n}\n\nfunction toError(err: unknown): Error {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) return new ProviderError(\"gemini\", err.message, { cause: err });\n return new ProviderError(\"gemini\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { streamGemini } from \"./providers/gemini.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI coding API endpoint — the primary endpoint for all GLM models. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"xiaomi\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://token-plan-sgp.xiaomimimo.com/v1\",\n webSearch: false,\n }),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"gemini\", {\n stream: (options) => streamGemini(options),\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? GLM_CODING_BASE_URL,\n }),\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\nproviderRegistry.register(\"deepseek\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.deepseek.com/v1\",\n }),\n});\n\nproviderRegistry.register(\"openrouter\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://openrouter.ai/api/v1\",\n }),\n});\n\nproviderRegistry.register(\"minimax\", {\n stream: (options) =>\n streamAnthropic({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.minimax.io/anthropic\",\n // MiniMax's Anthropic-compatible API does not support Anthropic-specific\n // server tools (web_search), context_management, or server-side tools.\n webSearch: false,\n compaction: false,\n clearToolUses: false,\n serverTools: undefined,\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n","import type {\n AssistantMessage,\n ContentPart,\n Message,\n StopReason,\n StreamEvent,\n StreamOptions,\n StreamResponse,\n Usage,\n} from \"../types.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { providerRegistry } from \"../provider-registry.js\";\n\n// ── Response Types ────────────────────────────────────────\n\nexport interface PalsuProviderState {\n callCount: number;\n}\n\nexport type PalsuResponseFactory = (\n messages: Message[],\n options: StreamOptions,\n state: PalsuProviderState,\n) => AssistantMessage | Promise<AssistantMessage>;\n\nexport type PalsuResponse = AssistantMessage | PalsuResponseFactory;\n\n// ── Helper Constructors ──────────────��────────────────────\n\n/** Create an assistant message with a single text block. */\nexport function palsuText(text: string): AssistantMessage {\n return { role: \"assistant\", content: text ? [{ type: \"text\", text }] : [] };\n}\n\n/** Create an assistant message with a thinking block and optional text reply. */\nexport function palsuThinking(thinking: string, text?: string): AssistantMessage {\n const content: ContentPart[] = [{ type: \"thinking\", text: thinking }];\n if (text) content.push({ type: \"text\", text });\n return { role: \"assistant\", content };\n}\n\n/** Create an assistant message with a single tool call. */\nexport function palsuToolCall(\n name: string,\n args: Record<string, unknown>,\n id?: string,\n): AssistantMessage {\n return {\n role: \"assistant\",\n content: [{ type: \"tool_call\", id: id ?? `palsu_${name}_${Date.now()}`, name, args }],\n };\n}\n\n/** Create an assistant message from content parts with optional stop reason. */\nexport function palsuAssistantMessage(\n content: ContentPart[],\n options?: { stopReason?: StopReason },\n): AssistantMessage & { _stopReason?: StopReason } {\n return { role: \"assistant\", content, _stopReason: options?.stopReason };\n}\n\n// ── Streaming Simulation ────────────���─────────────────────\n\nconst DEFAULT_CHUNK_SIZE = 20;\n\nfunction chunkText(text: string, size: number): string[] {\n const chunks: string[] = [];\n for (let i = 0; i < text.length; i += size) {\n chunks.push(text.slice(i, i + size));\n }\n return chunks.length > 0 ? chunks : [\"\"];\n}\n\ninterface CacheUsage {\n cacheRead: number;\n cacheWrite: number;\n}\n\nasync function* simulateStream(\n message: AssistantMessage,\n stopReason: StopReason,\n signal?: AbortSignal,\n cacheUsage?: CacheUsage,\n): AsyncGenerator<StreamEvent, StreamResponse> {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n const content =\n typeof message.content === \"string\"\n ? message.content\n ? [{ type: \"text\" as const, text: message.content }]\n : []\n : message.content;\n\n let outputChars = 0;\n\n for (const part of content) {\n if (signal?.aborted) {\n throw new Error(\"aborted\");\n }\n\n if (part.type === \"text\") {\n const chunks = chunkText(part.text, DEFAULT_CHUNK_SIZE);\n for (const chunk of chunks) {\n yield { type: \"text_delta\", text: chunk };\n outputChars += chunk.length;\n }\n } else if (part.type === \"thinking\") {\n yield { type: \"thinking_delta\", text: part.text };\n outputChars += part.text.length;\n } else if (part.type === \"tool_call\") {\n const argsJson = JSON.stringify(part.args);\n yield { type: \"toolcall_delta\", id: part.id, name: part.name, argsJson };\n yield { type: \"toolcall_done\", id: part.id, name: part.name, args: part.args };\n outputChars += argsJson.length;\n }\n }\n\n // Rough token estimate: ~4 chars per token\n const outputTokens = Math.max(1, Math.ceil(outputChars / 4));\n const usage: Usage = {\n inputTokens: 100,\n outputTokens,\n ...(cacheUsage?.cacheRead ? { cacheRead: cacheUsage.cacheRead } : {}),\n ...(cacheUsage?.cacheWrite ? { cacheWrite: cacheUsage.cacheWrite } : {}),\n };\n\n yield { type: \"done\", stopReason };\n return { message, stopReason, usage };\n}\n\n// ── Prompt Cache Simulation ���─────────────────────────────\n\nfunction computeCacheUsage(current: string, previous: string | null): CacheUsage {\n if (!previous) {\n // First call — everything is a cache write\n return { cacheRead: 0, cacheWrite: Math.ceil(current.length / 4) };\n }\n // Find common prefix length\n const maxLen = Math.min(current.length, previous.length);\n let commonLen = 0;\n for (let i = 0; i < maxLen; i++) {\n if (current[i] !== previous[i]) break;\n commonLen++;\n }\n return {\n cacheRead: Math.ceil(commonLen / 4),\n cacheWrite: Math.ceil((current.length - commonLen) / 4),\n };\n}\n\n// ── Model Config ─────────────────────────────────────────\n\nexport interface PalsuModelConfig {\n /** Default response for this model when its queue is empty. */\n defaultResponse?: PalsuResponse;\n}\n\ninterface ModelState {\n responses: PalsuResponse[];\n defaultResponse?: PalsuResponse;\n}\n\n// ── Registration Handle ───────────────────────────────────\n\nexport interface PalsuModelHandle {\n /** Replace this model's response queue. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to this model's queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in this model's queue. */\n getPendingResponseCount(): number;\n}\n\nexport interface PalsuProviderHandle {\n /** Replace the shared response queue entirely. */\n setResponses(responses: PalsuResponse[]): void;\n /** Append responses to the shared queue. */\n appendResponses(...responses: PalsuResponse[]): void;\n /** Number of unconsumed responses in the shared queue. */\n getPendingResponseCount(): number;\n /** Mutable state — tracks call count. */\n state: PalsuProviderState;\n /** Get a handle for a model-specific response queue. */\n getModel(name: string): PalsuModelHandle;\n /** Remove this provider from the registry. */\n unregister(): void;\n}\n\nexport interface PalsuProviderConfig {\n /** Provider name to register under. Default: \"palsu\". */\n name?: string;\n /** Response returned when all queues are empty. Default: empty text message. */\n defaultResponse?: PalsuResponse;\n /** Enable prompt cache simulation. Tracks common message prefixes across calls. */\n promptCache?: boolean;\n /** Model-specific configurations with per-model response queues. */\n models?: Record<string, PalsuModelConfig>;\n}\n\n// ── Main Registration Function ────────────────────────────\n\n/**\n * Register a palsu (mock) LLM provider for testing.\n * Returns a handle to control responses and inspect state.\n *\n * ```ts\n * const palsu = registerPalsuProvider();\n * palsu.appendResponses(palsuText(\"Hello!\"));\n *\n * const result = await stream({ provider: \"palsu\", model: \"test\", messages });\n * console.log(result.message); // { role: \"assistant\", content: [{ type: \"text\", text: \"Hello!\" }] }\n *\n * palsu.unregister(); // cleanup\n * ```\n */\nexport function registerPalsuProvider(config?: PalsuProviderConfig): PalsuProviderHandle {\n const name = config?.name ?? \"palsu\";\n const responses: PalsuResponse[] = [];\n const state: PalsuProviderState = { callCount: 0 };\n const defaultResponse = config?.defaultResponse ?? palsuText(\"\");\n const enableCache = config?.promptCache ?? false;\n let lastMessagesSerialized: string | null = null;\n\n // Initialize model-specific state\n const modelStates = new Map<string, ModelState>();\n if (config?.models) {\n for (const [modelName, modelConfig] of Object.entries(config.models)) {\n modelStates.set(modelName, {\n responses: [],\n defaultResponse: modelConfig.defaultResponse,\n });\n }\n }\n\n const handle: PalsuProviderHandle = {\n setResponses(r) {\n responses.length = 0;\n responses.push(...r);\n },\n appendResponses(...r) {\n responses.push(...r);\n },\n getPendingResponseCount() {\n return responses.length;\n },\n state,\n getModel(modelName: string): PalsuModelHandle {\n if (!modelStates.has(modelName)) {\n modelStates.set(modelName, { responses: [] });\n }\n const ms = modelStates.get(modelName)!;\n return {\n setResponses(r) {\n ms.responses.length = 0;\n ms.responses.push(...r);\n },\n appendResponses(...r) {\n ms.responses.push(...r);\n },\n getPendingResponseCount() {\n return ms.responses.length;\n },\n };\n },\n unregister() {\n providerRegistry.unregister(name);\n },\n };\n\n providerRegistry.register(name, {\n stream(options: StreamOptions): StreamResult {\n state.callCount++;\n\n // Resolve response: model-specific queue → shared queue → model default → shared default\n const ms = modelStates.get(options.model);\n const responseDef =\n (ms && ms.responses.length > 0 ? ms.responses.shift() : undefined) ??\n (responses.length > 0 ? responses.shift() : undefined) ??\n ms?.defaultResponse ??\n defaultResponse;\n\n // Compute cache usage before streaming (needs messages serialized)\n let cacheUsage: CacheUsage | undefined;\n if (enableCache) {\n const serialized = JSON.stringify(options.messages);\n cacheUsage = computeCacheUsage(serialized, lastMessagesSerialized);\n lastMessagesSerialized = serialized;\n }\n\n const gen = (async function* (): AsyncGenerator<StreamEvent, StreamResponse> {\n // Resolve factory (sync or async) then stream\n const rawMessage =\n typeof responseDef === \"function\"\n ? responseDef(options.messages, options, state)\n : responseDef;\n const message = await Promise.resolve(rawMessage);\n\n const hasToolCalls =\n Array.isArray(message.content) && message.content.some((p) => p.type === \"tool_call\");\n const explicitStop = (message as { _stopReason?: StopReason })._stopReason;\n const stopReason = explicitStop ?? (hasToolCalls ? \"tool_use\" : \"end_turn\");\n\n return yield* simulateStream(message, stopReason, options.signal, cacheUsage);\n })();\n\n return new StreamResult(gen);\n },\n });\n\n return handle;\n}\n"],"mappings":"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","names":["required","Anthropic","stream","isJsonObject","createClient","OpenAI","runStream","toError","stream","isJsonObject","parseToolArguments","runStream","os","isJsonObject","parsed","toError","runStream"]}