@wrongstack/providers 0.268.0 → 0.270.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/_tool-input.ts","../src/aggregate.ts","../src/anthropic.ts","../src/object-utils.ts","../src/error-parse.ts","../src/family-capabilities.ts","../src/sse.ts","../src/stop-reason.ts","../src/tool-format/to-anthropic.ts","../src/stream-debug-state.ts","../src/wire-adapter.ts","../src/anthropic-oauth.ts","../src/openai.ts","../src/tool-format/to-openai.ts","../src/github-copilot.ts","../src/google.ts","../src/openai-codex.ts","../src/tool-format/to-responses.ts","../src/openai-compatible.ts","../src/wire-format.ts","../src/presets/mistral.ts","../src/presets/anthropic.ts","../src/presets/openai.ts","../src/presets/google.ts","../src/capabilities.ts","../src/tool-format/from-anthropic.ts","../src/tool-format/from-openai.ts","../src/index.ts"],"names":["inString","escaped","aggregateStream","ProviderError","isNodeReadable","safeParse","DEFAULT_BASE","_cache","compactToolDefinitionForWire","REFRESH_SKEW_MS","randomUUID","normalizeContent","CLIENT_ID","TOKEN_URL","DEFAULT_VERSION","stripCacheControl","messagesToGemini","toolsToGemini","sanitizeSchemaForGemini","GEMINI_ALLOWED_KEYS","expectDefined"],"mappings":"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","file":"index.js","sourcesContent":["import { safeParse } from '@wrongstack/core';\n\n/**\n * Attempt to close an incomplete JSON object string by auto-closing braces\n * and completing any unclosed double-quoted string values. This handles the\n * common streaming truncation case where the JSON stream ends mid-object\n * (e.g. `{\"old_string\": \"line1\\nline2` without the closing `\"}` and `}`).\n *\n * Returns the completed string on best-effort, or the original if nothing\n * meaningful could be salvaged.\n */\nfunction completePartialObject(s: string): string {\n let result = s;\n\n const trimmed = result.trim();\n if (!trimmed.startsWith('{')) return s;\n\n // Close unclosed braces (up to 3 passes for nested structures).\n for (let pass = 0; pass < 3; pass++) {\n let braceDepth = 0;\n let inString = false;\n let escaped = false;\n let foundClose = true;\n\n for (const ch of result) {\n if (escaped) { escaped = false; continue; }\n if (ch === '\\\\') { escaped = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === '{') { braceDepth++; foundClose = false; }\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) foundClose = true;\n }\n }\n\n if (foundClose || braceDepth <= 0) break;\n result += '}'.repeat(braceDepth);\n }\n\n // If it now parses, return the brace-closed version.\n if (safeParse(result).ok) return result;\n\n // Detect if we ended inside an unclosed string value.\n // Walk the string end looking for context.\n let inString = false;\n let escaped = false;\n for (let i = result.length - 1; i >= 0; i--) {\n const ch = result[i];\n if (escaped) { escaped = false; continue; }\n if (ch === '\\\\') { escaped = true; continue; }\n if (ch === '\"') {\n // Look at what follows this quote outside strings\n let nextNonWs: string | undefined;\n for (let j = i + 1; j < result.length; j++) {\n const nc = result[j];\n if (nc === ' ' || nc === '\\t' || nc === '\\n' || nc === '\\r') continue;\n nextNonWs = result[j];\n break;\n }\n if (nextNonWs === ':') {\n // This quote opens a key — the NEXT unescaped quote should close it\n inString = true;\n } else if (nextNonWs === ',' || nextNonWs === '}') {\n if (inString) inString = false;\n }\n }\n }\n\n // If still inside a string, close it and any unclosed braces.\n if (inString) {\n result = result.trimEnd();\n if (result.endsWith('\\\\')) result = result.slice(0, -1);\n let depth = 0;\n for (const ch of result) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n result += '\"' + '}'.repeat(Math.max(1, depth));\n }\n\n return result;\n}\n\n/**\n * Parse a tool-call arguments JSON blob into a canonical\n * `Record<string, unknown>`.\n *\n * Why this exists: providers stream tool-call arguments as raw JSON strings\n * accumulated over multiple `delta` events. Once complete, callers want a\n * dictionary. Naive `JSON.parse` plus `as Record<string, unknown>` is unsafe\n * — a buggy provider, a proxy that rewrites payloads, or a future API change\n * can yield `null`, an array, or a number, all of which would\n * type-check fine but crash downstream tool executors that index into the\n * input by key.\n *\n * Result contract:\n * - Valid JSON object → returned as-is, typed as `Record<string, unknown>`.\n * - Valid JSON array / scalar → wrapped under `{ __raw: value }` so the\n * tool still receives an object (the executor can detect the anomaly).\n * - Invalid/truncated JSON → attempt partial JSON salvage (auto-close braces\n * and strings); if that fails, return `{ __raw: rawString }` so no\n * information is lost; the tool layer can decide whether to fail or salvage.\n * - Empty/null input → returns `{}` (the \"no arguments\" case).\n */\nexport function parseToolInput(raw: string | undefined): Record<string, unknown> {\n if (!raw) return {};\n let parsed = safeParse<unknown>(raw);\n\n // Fast path: parsed cleanly into an object\n if (parsed.ok && parsed.value && typeof parsed.value === 'object' && !Array.isArray(parsed.value)) {\n return parsed.value as Record<string, unknown>;\n }\n\n // Slow path: parse failed or didn't yield an object.\n // Attempt to salvage a truncated streaming JSON blob before giving up.\n if (!parsed.ok || parsed.value == null || typeof parsed.value !== 'object' || Array.isArray(parsed.value)) {\n const completed = completePartialObject(raw);\n parsed = safeParse<unknown>(completed);\n }\n\n if (parsed.ok && parsed.value && typeof parsed.value === 'object' && !Array.isArray(parsed.value)) {\n return parsed.value as Record<string, unknown>;\n }\n\n // Second salvage: if raw couldn't be parsed but looks like a string containing\n // a serialized JSON object (double-wrapped), unwrap it.\n const trimmed = raw.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n const unescaped = safeParse<unknown>(raw);\n if (unescaped.ok && typeof unescaped.value === 'string') {\n const inner = safeParse<unknown>(unescaped.value);\n if (inner.ok && inner.value && typeof inner.value === 'object' && !Array.isArray(inner.value)) {\n return inner.value as Record<string, unknown>;\n }\n }\n }\n\n // Salvage case: parsed value is a string (scalar) but contains a serialized\n // JSON object (common when proxies/models map OpenAI arguments string directly\n // to Anthropic input).\n if (parsed.ok && typeof parsed.value === 'string') {\n const innerTrimmed = parsed.value.trim();\n if (innerTrimmed.startsWith('{') && innerTrimmed.endsWith('}')) {\n const inner = safeParse<unknown>(innerTrimmed);\n if (inner.ok && inner.value && typeof inner.value === 'object' && !Array.isArray(inner.value)) {\n return inner.value as Record<string, unknown>;\n }\n }\n }\n\n // Give up — wrap under the sentinel key so the tool still receives an object.\n // Prefer the parsed scalar/array value (so a valid `[1,2,3]` / `42` / `\"x\"`\n // is preserved structurally); fall back to the original raw string when the\n // input couldn't be parsed at all. No information is lost either way.\n const fallback = parsed.ok ? parsed.value : undefined;\n return { __raw: fallback ?? raw };\n}","import { expectDefined } from '@wrongstack/core';\nimport type { ContentBlock, Response, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\n/**\n * Consume an `AsyncIterable<StreamEvent>` and reduce it to a non-streaming\n * `Response`. Used by `Provider.complete()` default impls so that the\n * streaming code path is the single source of truth.\n *\n * Optional `onEvent` callback fires for every event as it arrives, useful\n * for the agent loop to emit text_delta to the EventBus without writing\n * its own aggregation logic.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamEvent>,\n onEvent?: ((e: StreamEvent) => void) | undefined,\n): Promise<Response> {\n let model = '';\n let stopReason: StopReason = 'end_turn';\n let usage: Usage = { input: 0, output: 0 };\n // Accumulate deltas as an array of chunks; join once at content-build time.\n // This avoids O(n²) string concatenation for responses with many small deltas.\n const textBuffers: string[][] = [];\n let currentTextIndex = -1;\n const toolBuffers = new Map<\n string,\n { name: string; partial: string; input?: unknown | undefined; providerMeta?: Record<string, unknown> }\n >();\n const thinkingBuffers: Array<{\n /** Accumulated as an array of chunks; joined into a string at content-build time. */\n chunks: string[];\n signature?: string | undefined;\n providerMeta?: Record<string, unknown>;\n }> = [];\n let currentThinkingIndex = -1;\n const blockOrder: Array<\n { kind: 'text'; idx: number } | { kind: 'tool'; id: string } | { kind: 'thinking'; idx: number }\n > = [];\n\n for await (const ev of stream) {\n if (onEvent) onEvent(ev);\n switch (ev.type) {\n case 'message_start':\n model = ev.model;\n break;\n case 'text_delta':\n if (currentTextIndex === -1) {\n currentTextIndex = textBuffers.length;\n textBuffers.push([]);\n blockOrder.push({ kind: 'text', idx: currentTextIndex });\n }\n textBuffers[currentTextIndex]!.push(ev.text);\n break;\n case 'tool_use_start':\n // A tool_use block starts — close any open text block so subsequent\n // text_delta starts a new one.\n currentTextIndex = -1;\n toolBuffers.set(ev.id, { name: ev.name, partial: '' });\n blockOrder.push({ kind: 'tool', id: ev.id });\n break;\n case 'tool_use_input_delta': {\n const b = toolBuffers.get(ev.id);\n if (b) b.partial += ev.partial;\n break;\n }\n case 'tool_use_stop': {\n const b = toolBuffers.get(ev.id);\n if (b) {\n if (ev.input === undefined) {\n // No upstream input — parse from the accumulated partial buffer.\n b.input = parseToolInput(b.partial);\n } else if (typeof ev.input === 'string') {\n // Upstream gave us a raw JSON string; route through the validator.\n b.input = parseToolInput(ev.input);\n } else if (ev.input && typeof ev.input === 'object' && !Array.isArray(ev.input)) {\n b.input = ev.input;\n } else {\n // Array / scalar — preserve via __raw so downstream sees an object.\n b.input = { __raw: ev.input };\n }\n if (ev.providerMeta) b.providerMeta = ev.providerMeta;\n }\n // Tool just stopped — next text_delta should open a new text block.\n currentTextIndex = -1;\n break;\n }\n case 'thinking_start': {\n currentTextIndex = -1;\n // If a thinking block was already started by thinking_signature before\n // this event arrived (e.g. due to out-of-order delivery), reuse it so\n // signature and content end up in the same block rather than creating\n // duplicate thinking entries in the response.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n }\n // Always set providerMeta on the target block (thinking_start may carry\n // metadata even when the prior signature event did not).\n if (ev.providerMeta && currentThinkingIndex >= 0) {\n expectDefined(thinkingBuffers[currentThinkingIndex]).providerMeta = ev.providerMeta;\n }\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n break;\n }\n case 'thinking_delta': {\n // Ensure a thinking buffer exists before appending. If thinking_signature\n // created the block (currentThinkingIndex >= 0), reuse it so the\n // signature and content end up in the same buffer.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.chunks.push(ev.text);\n break;\n }\n case 'thinking_signature': {\n // Ensure a thinking buffer exists before storing the signature. This\n // handles out-of-order delivery where thinking_signature arrives before\n // thinking_start.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.signature = ev.signature;\n break;\n }\n case 'thinking_stop': {\n currentThinkingIndex = -1;\n break;\n }\n case 'message_stop':\n stopReason = ev.stopReason;\n usage = ev.usage;\n break;\n default:\n // Unknown SSE event — silently skip\n break;\n }\n }\n\n const content: ContentBlock[] = [];\n for (const b of blockOrder) {\n if (b.kind === 'text') {\n const text = textBuffers[b.idx]?.join('') ?? '';\n if (text) content.push({ type: 'text', text });\n } else if (b.kind === 'thinking') {\n const t = thinkingBuffers[b.idx];\n const thinkingText = t?.chunks.join('') ?? '';\n // Drop completely empty thinking blocks — emitting one would make\n // Anthropic 400 on the round-trip (\"thinking: cannot be empty\").\n if (!t || (!thinkingText && !t.signature)) continue;\n const block: ContentBlock = { type: 'thinking', thinking: thinkingText };\n if (t.signature) (block as { signature?: string | undefined }).signature = t.signature;\n if (t.providerMeta && Object.keys(t.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = t.providerMeta;\n }\n content.push(block);\n } else {\n const tb = toolBuffers.get(b.id);\n if (tb) {\n const block: ContentBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input:\n tb.input && typeof tb.input === 'object' && !Array.isArray(tb.input)\n ? (tb.input as Record<string, unknown>)\n : {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n\n return { content, stopReason, usage, model };\n}\n","import type {\r\n CacheTtl,\r\n Capabilities,\r\n ContentBlock,\r\n Message,\r\n Request,\r\n StopReason,\r\n StreamEvent,\r\n Usage,\r\n} from '@wrongstack/core';\r\nimport { ProviderError, safeParse } from '@wrongstack/core';\r\nimport { parseToolInput } from './_tool-input.js';\r\nimport { parseProviderHttpError } from './error-parse.js';\r\nimport { capabilitiesForFamily } from './family-capabilities.js';\r\nimport { parseSSE } from './sse.js';\r\nimport { normalizeAnthropic } from './stop-reason.js';\r\nimport { toolsToAnthropic } from './tool-format/to-anthropic.js';\r\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\r\n\r\nexport interface AnthropicProviderOptions {\r\n apiKey: string;\r\n baseUrl?: string | undefined;\r\n apiVersion?: string | undefined;\r\n beta?: string[] | undefined;\r\n fetchImpl?: typeof fetch | undefined;\r\n /** Raw stream debugging and hang-detection options. */\r\n streamOpts?: WireAdapterStreamOptions | undefined;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://api.anthropic.com';\r\nconst DEFAULT_VERSION = '2023-06-01';\r\n\r\nfunction isAnthropicHost(baseUrl: string): boolean {\r\n try {\r\n const host = new URL(baseUrl).hostname.toLowerCase();\r\n return host === 'api.anthropic.com' || host.endsWith('.anthropic.com');\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport class AnthropicProvider extends WireAdapter {\r\n override readonly id: string = 'anthropic';\r\n override readonly capabilities: Capabilities = capabilitiesForFamily('anthropic');\r\n\r\n private readonly opts: AnthropicProviderOptions;\r\n\r\n constructor(opts: AnthropicProviderOptions) {\r\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\r\n this.opts = opts;\r\n }\r\n\r\n protected override buildUrl(_req: Request): string {\r\n const base = this.baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+\\/messages$/.test(base)) return base;\r\n if (/\\/v\\d+$/.test(base)) return `${base}/messages`;\r\n return `${base}/v1/messages`;\r\n }\r\n\r\n protected override buildHeaders(req: Request): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n ...super.buildHeaders(req),\r\n 'anthropic-version': this.opts.apiVersion ?? DEFAULT_VERSION,\r\n };\r\n if (isAnthropicHost(this.baseUrl)) {\r\n headers['x-api-key'] = this.apiKey;\r\n } else {\r\n // Third-party Anthropic-compatible proxies (kimi-for-coding,\r\n // zai-coding-plan, anyrouter, …) reject `x-api-key` and require\r\n // `Authorization: Bearer`. This mirrors Claude Code's\r\n // ANTHROPIC_AUTH_TOKEN switch — triggered automatically when the\r\n // baseUrl is not Anthropic-owned.\r\n headers['authorization'] = `Bearer ${this.apiKey}`;\r\n }\r\n if (this.opts.beta && this.opts.beta.length > 0) {\r\n headers['anthropic-beta'] = this.opts.beta.join(',');\r\n }\r\n return headers;\r\n }\r\n\r\n protected override buildBody(req: Request): Record<string, unknown> {\r\n const body: Record<string, unknown> = {\r\n model: req.model,\r\n max_tokens: req.maxTokens,\r\n messages: req.messages.map((m) => this.normalizeMessage(m)),\r\n stream: true,\r\n };\r\n if (req.system && req.system.length > 0) {\r\n const systemBlocks = req.system;\r\n body['system'] = systemBlocks.map((b, index) =>\r\n req.cache?.ttl && index === systemBlocks.length - 1\r\n ? { ...b, cache_control: { type: 'ephemeral', ttl: req.cache.ttl } }\r\n : b,\r\n );\r\n }\r\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\r\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\r\n if (req.topP !== undefined) body['top_p'] = req.topP;\r\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\r\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\r\n return body;\r\n }\r\n\r\n protected override parseStream(\r\n body: Parameters<typeof parseSSE>[0],\r\n fallbackModel: string,\r\n req: Request,\r\n ): AsyncIterable<StreamEvent> {\r\n return parseAnthropicStream(body, fallbackModel, req.cache?.ttl);\r\n }\r\n\r\n protected override translateError(status: number, text: string): ProviderError {\r\n return parseProviderHttpError(this.id, status, text);\r\n }\r\n\r\n private normalizeMessage(m: Message): Record<string, unknown> {\r\n const role = m.role === 'system' ? 'user' : m.role;\r\n if (typeof m.content === 'string') return { role, content: m.content };\r\n return { role, content: m.content.map((b) => sanitizeAnthropicBlock(b)) };\r\n }\r\n}\r\n\r\n/**\r\n * Reduce a canonical ContentBlock to exactly the fields the Anthropic Messages\r\n * API accepts. The canonical blocks carry extra fields for other wires that\r\n * Anthropic rejects with 400 \"Extra inputs are not permitted\":\r\n * - `tool_result.name` — set by ToolExecutor for Google's functionResponse\r\n * - `tool_use.providerMeta` — e.g. Gemini thought-signatures\r\n * - `thinking.providerMeta` — provider-specific metadata\r\n */\r\nfunction sanitizeAnthropicBlock(b: ContentBlock): Record<string, unknown> {\r\n switch (b.type) {\r\n case 'text':\r\n return b.cache_control\r\n ? { type: 'text', text: b.text, cache_control: b.cache_control }\r\n : { type: 'text', text: b.text };\r\n case 'tool_use':\r\n return { type: 'tool_use', id: b.id, name: b.name, input: b.input };\r\n case 'tool_result': {\r\n const out: Record<string, unknown> = {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: b.content,\r\n };\r\n if (b.is_error) out['is_error'] = true;\r\n return out;\r\n }\r\n case 'thinking':\r\n return b.signature\r\n ? { type: 'thinking', thinking: b.thinking, signature: b.signature }\r\n : { type: 'thinking', thinking: b.thinking };\r\n case 'image':\r\n return { type: 'image', source: b.source };\r\n default:\r\n return b as unknown as Record<string, unknown>;\r\n }\r\n}\r\n\r\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\r\n\r\n/**\r\n * Translate Anthropic's SSE wire format into canonical StreamEvent[].\r\n *\r\n * Block indices ↔ canonical event ids:\r\n * - text blocks emit text_delta with no id\r\n * - tool_use blocks: content_block_start carries the toolu_xxx id, and\r\n * subsequent input_json_delta chunks accumulate the JSON arg string.\r\n *\r\n * usage.input_tokens arrives in message_start; output_tokens lands in\r\n * message_delta.usage.\r\n */\r\nasync function* parseAnthropicStream(\r\n body: Response2Body,\r\n fallbackModel: string,\r\n cacheTtl: CacheTtl | undefined,\r\n): AsyncIterable<StreamEvent> {\r\n type BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\r\n const blocks = new Map<\r\n number,\r\n { kind: BlockKind; id?: string | undefined; name?: string | undefined; partial: string }\r\n >();\r\n let model = fallbackModel;\r\n let usage: Usage = { input: 0, output: 0 };\r\n let stopReason: StopReason = 'end_turn';\r\n let started = false;\r\n let stopped = false;\r\n\r\n for await (const msg of parseSSE(body)) {\r\n if (!msg.data || msg.data === '[DONE]') continue;\r\n const parsed = safeParse<Record<string, unknown>>(msg.data);\r\n if (!parsed.ok || !parsed.value) continue;\r\n const ev = parsed.value;\r\n const type = String(ev['type'] ?? msg.event);\r\n\r\n switch (type) {\r\n case 'message_start': {\r\n const message = ev['message'] as\r\n | {\r\n model?: string | undefined;\r\n usage?: {\r\n input_tokens?: number | undefined;\r\n cache_read_input_tokens?: number | undefined;\r\n cache_creation_input_tokens?: number | undefined;\r\n };\r\n }\r\n | undefined;\r\n if (message?.model) model = message.model;\r\n const cacheWrite = message?.usage?.cache_creation_input_tokens;\r\n usage = {\r\n input: message?.usage?.input_tokens ?? 0,\r\n output: 0,\r\n cacheRead: message?.usage?.cache_read_input_tokens,\r\n cacheWrite,\r\n cacheWrite5m: cacheTtl === '1h' ? undefined : cacheWrite,\r\n cacheWrite1h: cacheTtl === '1h' ? cacheWrite : undefined,\r\n };\r\n if (!started) {\r\n started = true;\r\n yield { type: 'message_start', model };\r\n }\r\n break;\r\n }\r\n case 'content_block_start': {\r\n const index = Number(ev['index'] ?? 0);\r\n const cb = ev['content_block'] as { type?: string | undefined; id?: string | undefined; name?: string | undefined } | undefined;\r\n if (cb?.type === 'tool_use') {\r\n blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\r\n if (cb.id && cb.name) {\r\n yield { type: 'tool_use_start', id: cb.id, name: cb.name };\r\n }\r\n } else if (cb?.type === 'text') {\r\n blocks.set(index, { kind: 'text', partial: '' });\r\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\r\n // Anthropic extended thinking. The model emits an opening\r\n // `content_block_start` with type `thinking` (or\r\n // `redacted_thinking` when content was hidden from us), then\r\n // streams `thinking_delta` and a single `signature_delta`.\r\n // Both the text AND the signature must round-trip to the next\r\n // request — without the signature Anthropic returns 400.\r\n blocks.set(index, { kind: 'thinking', partial: '' });\r\n yield { type: 'thinking_start' };\r\n } else {\r\n blocks.set(index, { kind: 'unknown', partial: '' });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const index = Number(ev['index'] ?? 0);\r\n const delta = ev['delta'] as\r\n | {\r\n type?: string | undefined;\r\n text?: string | undefined;\r\n partial_json?: string | undefined;\r\n thinking?: string | undefined;\r\n signature?: string | undefined;\r\n data?: string | undefined;\r\n }\r\n | undefined;\r\n const block = blocks.get(index);\r\n if (!block || !delta) break;\r\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\r\n yield { type: 'text_delta', text: delta.text };\r\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\r\n if (block.id) {\r\n block.partial += delta.partial_json;\r\n yield { type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json };\r\n }\r\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\r\n yield { type: 'thinking_delta', text: delta.thinking };\r\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\r\n yield { type: 'thinking_signature', signature: delta.signature };\r\n }\r\n break;\r\n }\r\n case 'content_block_stop': {\r\n const index = Number(ev['index'] ?? 0);\r\n const block = blocks.get(index);\r\n if (block?.kind === 'tool_use' && block.id) {\r\n const input = parseToolInput(block.partial);\r\n yield { type: 'tool_use_stop', id: block.id, input };\r\n } else if (block?.kind === 'thinking') {\r\n yield { type: 'thinking_stop' };\r\n }\r\n break;\r\n }\r\n case 'message_delta': {\r\n const delta = ev['delta'] as { stop_reason?: string | null | undefined } | undefined;\r\n const u = ev['usage'] as { output_tokens?: number | undefined } | undefined;\r\n if (delta?.stop_reason !== undefined) {\r\n stopReason = normalizeAnthropic(delta.stop_reason);\r\n }\r\n if (u?.output_tokens !== undefined) usage = { ...usage, output: u.output_tokens };\r\n break;\r\n }\r\n case 'message_stop':\r\n stopped = true;\r\n yield { type: 'message_stop', stopReason, usage };\r\n break;\r\n case 'error': {\r\n const err = ev['error'] as { message?: string | undefined; type?: string | undefined } | undefined;\r\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\r\n body: { type: err?.type, message: err?.message },\r\n });\r\n }\r\n default:\r\n // Unknown SSE event type from deserialized JSON — silently skip\r\n break;\r\n }\r\n }\r\n if (started && !stopped) {\r\n yield { type: 'message_stop', stopReason, usage };\r\n }\r\n}\r\n","export function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { ProviderError } from '@wrongstack/core';\nimport type { ProviderErrorBody } from '@wrongstack/core';\nimport { isPlainObject } from './object-utils.js';\n\n/**\n * Provider HTTP error bodies come in three or four shapes depending on\n * vendor. Rather than dump the raw JSON into the error message (which is\n * what was shipped to the user log before this module existed), we parse\n * out the fields we care about — `type`, `message`, `requestId` — and put\n * them on `ProviderError.body` for `describe()` and downstream rendering.\n *\n * The function is intentionally tolerant: anything we can't parse falls\n * back to a truncated raw string, never throws.\n */\nexport function parseProviderHttpError(\n providerId: string,\n status: number,\n rawText: string,\n): ProviderError {\n const body = parseBody(rawText);\n const retryable = isRetryable(status, body.type);\n const message = `${providerId} HTTP ${status}`;\n return new ProviderError(message, status, retryable, providerId, { body });\n}\n\nconst RAW_TRUNCATE_AT = 2000;\n\nfunction parseBody(rawText: string): ProviderErrorBody {\n const raw = rawText.slice(0, RAW_TRUNCATE_AT);\n // Surface truncation so downstream renderers (CLI error formatter, log\n // exporter) can show a \"(truncated, N more bytes)\" suffix instead of\n // silently dropping the rest of the provider's error tail.\n const body: ProviderErrorBody =\n rawText.length > RAW_TRUNCATE_AT\n ? { raw, truncated: true, rawLength: rawText.length }\n : { raw };\n if (!rawText.trim()) return body;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText);\n } catch {\n return body;\n }\n if (!isPlainObject(parsed)) return body;\n\n // Anthropic / MiniMax / Kimi: { type: \"error\", error: { type, message }, request_id }\n // OpenAI / OpenAI-compatible: { error: { message, type, code, param } }\n // Google: { error: { code, message, status } }\n const errField = parsed['error'];\n if (isPlainObject(errField)) {\n const t = stringOf(errField['type']) ?? stringOf(errField['status']);\n const m = stringOf(errField['message']);\n if (t) body.type = t;\n if (m) body.message = m;\n } else if (typeof errField === 'string') {\n body.message = errField;\n }\n // Top-level fields some providers use directly\n if (!body.type) {\n const t = stringOf(parsed['type']);\n if (t && t !== 'error') body.type = t;\n }\n if (!body.message) {\n const m = stringOf(parsed['message']);\n if (m) body.message = m;\n }\n\n // request_id (Anthropic), id (some compatible providers)\n const reqId =\n stringOf(parsed['request_id']) ?? stringOf(parsed['requestId']) ?? stringOf(parsed['id']);\n if (reqId) body.requestId = reqId;\n\n return body;\n}\n\n/**\n * Retryability is mostly driven by HTTP status, but provider-specific\n * `type` strings let us catch retryable conditions that don't have a\n * dedicated status code (e.g. Anthropic's `overloaded_error` is 529 but\n * we also retry it when wrapped in a 503).\n */\nfunction isRetryable(status: number, type?: string): boolean {\n if (status === 0) return true; // network error\n if (status === 408 || status === 429 || status === 529) return true;\n if (status >= 500 && status < 600) return true;\n if (type === 'overloaded_error' || type === 'rate_limit_error') return true;\n return false;\n}\n\nfunction stringOf(v: unknown): string | undefined {\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n","import type { Capabilities, WireFamily } from '@wrongstack/core';\n\nexport const CAPABILITIES_BY_FAMILY: Record<WireFamily, Capabilities> = {\n anthropic: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n openai: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n 'openai-compatible': {\n tools: true,\n parallelTools: true,\n vision: false,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n // Claude Pro/Max via OAuth (Sign in with Claude). Same wire as anthropic.\n 'anthropic-oauth': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n // GitHub Copilot subscription (OpenAI chat/completions-compatible wire).\n 'github-copilot': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n // ChatGPT-backend Responses API (Sign in with ChatGPT / Codex subscription).\n 'openai-codex': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: true,\n maxContext: 272_000,\n cacheControl: 'auto',\n },\n google: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 1_000_000,\n cacheControl: 'none',\n },\n unsupported: {\n tools: false,\n parallelTools: false,\n vision: false,\n streaming: false,\n promptCache: false,\n systemPrompt: false,\n jsonMode: false,\n reasoning: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n};\n\nexport function capabilitiesForFamily(\n family: WireFamily,\n overrides: Partial<Capabilities> = {},\n): Capabilities {\n return {\n ...(CAPABILITIES_BY_FAMILY[family] ?? CAPABILITIES_BY_FAMILY.unsupported),\n ...overrides,\n };\n}\n","/**\n * Minimal Server-Sent Events parser for HTTP streaming responses.\n *\n * Yields parsed events as `{ event, data }` pairs. Per spec:\n * - Each event is separated by a blank line\n * - `event: foo` sets the event name (defaults to \"message\")\n * - `data: ...` lines accumulate into the data buffer\n * - `:` lines are comments and ignored\n * - `id` / `retry` fields are accepted and ignored\n *\n * For Anthropic the wire format is canonical SSE with explicit `event:` lines.\n * For OpenAI / OpenAI-compatible the format omits `event:` and just emits\n * `data: <json>` chunks, with a final `data: [DONE]`. Both work with this\n * parser; consumers branch on event name or just on `data`.\n */\nexport interface SSEMessage {\n event: string;\n data: string;\n}\n\n/**\n * Cap on the pending-line buffer. A malicious or buggy upstream that sends\n * megabytes without a newline could otherwise pin a worker via the prior\n * O(n²) CRLF replace + unbounded `buffer +=` pattern. 256 KB comfortably\n * accommodates any sane SSE event while ensuring we fail fast on garbage.\n */\nconst MAX_BUFFER_BYTES = 256 * 1024;\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n): AsyncIterable<SSEMessage> {\n if (!body) return;\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let event = 'message';\n const dataLines: string[] = [];\n\n const flush = (): SSEMessage | undefined => {\n if (dataLines.length === 0 && event === 'message') return undefined;\n const data = dataLines.join('\\n');\n const msg: SSEMessage = { event, data };\n event = 'message';\n dataLines.length = 0;\n return msg;\n };\n\n const processLine = (line: string): SSEMessage | undefined => {\n if (line === '') return flush();\n if (line.startsWith(':')) return undefined; // comment\n const colonIdx = line.indexOf(':');\n let field: string;\n let value: string;\n if (colonIdx === -1) {\n field = line;\n value = '';\n } else {\n field = line.slice(0, colonIdx);\n value = line.slice(colonIdx + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n }\n if (field === 'event') event = value || 'message';\n else if (field === 'data') dataLines.push(value);\n // id / retry: ignored\n return undefined;\n };\n\n // Incremental CRLF normalization on each appended chunk only — previously\n // we ran `.replace(/\\r\\n/g, '\\n')` on the *entire* buffer per chunk, which\n // is O(n²) in stream length. Trailing CR (split across chunks) is left\n // in the buffer; the splitter handles it on the next round.\n const appendChunk = (chunkStr: string): void => {\n if (chunkStr.length === 0) return;\n buffer += chunkStr;\n if (buffer.length > MAX_BUFFER_BYTES) {\n throw new Error(\n `SSE: pending line exceeds ${MAX_BUFFER_BYTES} bytes — upstream is not framing events`,\n );\n }\n };\n\n // Node.js Readable stream\n if (isNodeReadable(body)) {\n for await (const chunk of body as NodeJS.ReadableStream) {\n appendChunk(\n typeof chunk === 'string' ? chunk : decoder.decode(chunk as Buffer, { stream: true }),\n );\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } else {\n // Web ReadableStream\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n appendChunk(decoder.decode(value, { stream: true }));\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n // Flush any trailing buffered line\n if (buffer.length > 0) {\n const msg = processLine(buffer.replace(/\\r$/, ''));\n if (msg) yield msg;\n }\n const final = flush();\n if (final) yield final;\n}\n\nfunction splitBuffer(buf: string): { lines: string[]; tail: string } {\n // Split on \\n directly; strip trailing \\r per-line. Avoids the O(n²)\n // pattern of running .replace(/\\r\\n/g, '\\n') on the entire buffer\n // every chunk.\n const parts = buf.split('\\n');\n const tail = parts.pop() ?? '';\n const lines = parts.map((p) => (p.endsWith('\\r') ? p.slice(0, -1) : p));\n return { lines, tail };\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown | undefined }).pipe === 'function' &&\n typeof (b as { on?: unknown | undefined }).on === 'function'\n );\n}\n","import type { StopReason } from '@wrongstack/core';\n\nexport function normalizeAnthropic(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\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 normalizeOpenAI(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'stop':\n return 'end_turn';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'length':\n return 'max_tokens';\n case 'content_filter':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Normalize Gemini-specific finish reasons. SAFETY, RECITATION, and\n * \"hallucination\" are safety blocks that should not silently become end_turn.\n */\nexport function normalizeGemini(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'SAFETY':\n case 'RECITATION':\n case 'hallucination':\n return 'refusal';\n case 'stop':\n case 'STOP':\n return 'end_turn';\n case 'max_tokens':\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'tool_use':\n case 'TOOL_USE':\n return 'tool_use';\n default:\n return 'end_turn';\n }\n}\n","import { compactToolDefinitionForWire, type Tool } from '@wrongstack/core';\n\nexport interface AnthropicToolSchema {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\n/**\n * WeakMap cache keyed by the Tool[] array reference. The tool registry\n * returns the same array reference within a session, so after the first\n * call the serialized schemas are served from cache — no re-mapping or\n * object allocation on subsequent LLM calls. When tools are added or\n * removed the registry creates a new array, the old entry is GC'd by\n * the WeakMap, and the next call recomputes.\n */\nconst _cache = new WeakMap<Tool[], AnthropicToolSchema[]>();\n\nexport function toolsToAnthropic(tools: Tool[]): AnthropicToolSchema[] {\n const hit = _cache.get(tools);\n if (hit) return hit;\n const result = tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n input_schema: compact.inputSchema,\n };\n });\n _cache.set(tools, result);\n return result;\n}\n","/**\n * Singleton gate for stream debug logging.\n *\n * WireAdapter reads this on every stream() call, so runtime toggles\n * (via /settings debug-stream on|off) take effect on the next request\n * without recreating provider instances.\n *\n * When enabled, WireAdapter accumulates per-chunk stats and pushes them\n * through a registered callback. In CLI (non-TUI) mode the default\n * callback writes a compact status line to stderr. The TUI replaces\n * the callback with one that dispatches to its reducer so the debug\n * info renders inside Ink's StatusBar line 3 instead of bypassing it.\n *\n * The CLI boot path seeds this from config.debugStream at startup.\n */\n\nexport interface DebugStreamStats {\n /** Monotonic chunk counter, resets per-stream. */\n chunkCount: number;\n /** Bytes of the most recent chunk. */\n lastChunkSize: number;\n /** Millisecond delta since the PREVIOUS chunk (reveals think gaps). */\n lastDeltaMs: number;\n /** Cumulative bytes received for this stream. */\n totalBytes: number;\n /** ISO timestamp of the most recent chunk. */\n lastChunkAt: string;\n}\n\nexport type DebugStreamCallback = (stats: DebugStreamStats) => void;\n\nlet _debugStreamEnabled = false;\nlet _debugStreamCallback: DebugStreamCallback | null = null;\n\n// ---- Throttle internals ----\nlet _throttleTimer: ReturnType<typeof setTimeout> | null = null;\nlet _pendingStats: DebugStreamStats | null = null;\nconst THROTTLE_MS = 200; // batch React dispatches at ~5 Hz\n\nfunction _flush(): void {\n if (_pendingStats && _debugStreamCallback) {\n _debugStreamCallback({ ..._pendingStats });\n _pendingStats = null;\n }\n _throttleTimer = null;\n}\n\nfunction _scheduleFlush(): void {\n if (_throttleTimer) return;\n _throttleTimer = setTimeout(_flush, THROTTLE_MS);\n if (_throttleTimer.unref) _throttleTimer.unref();\n}\n\n/** Check whether raw SSE stream debugging is currently active. */\nexport function isDebugStreamEnabled(): boolean {\n return _debugStreamEnabled;\n}\n\n/** Flip the stream debug flag at runtime. Persisted separately via ConfigStore. */\nexport function setDebugStreamEnabled(enabled: boolean): void {\n _debugStreamEnabled = enabled;\n}\n\n/**\n * Register a callback that receives THROTTLED debug-chunk stats (~5 Hz).\n * WireAdapter calls `pushDebugChunkStats()` on every raw chunk; this module\n * batches them and calls `cb` at most once per THROTTLE_MS.\n *\n * Pass `null` to restore the default stderr behaviour.\n */\nexport function setDebugStreamCallback(cb: DebugStreamCallback | null): void {\n // Flush any pending stats before swapping the callback so the old consumer\n // doesn't miss the last batch.\n if (_throttleTimer) {\n clearTimeout(_throttleTimer);\n _flush();\n }\n _debugStreamCallback = cb;\n}\n\n/**\n * Called by WireAdapter on every raw chunk. Not throttled — call it as\n * often as chunks arrive; it's cheap (a few integer assigns + a debounced\n * setTimeout). The registered callback receives aggregated stats at most\n * once per THROTTLE_MS.\n */\nexport function pushDebugChunkStats(bytes: number, deltaMs: number): void {\n if (!_debugStreamEnabled) return;\n\n _pendingStats = {\n chunkCount: (_pendingStats?.chunkCount ?? 0) + 1,\n lastChunkSize: bytes,\n lastDeltaMs: deltaMs,\n totalBytes: (_pendingStats?.totalBytes ?? 0) + bytes,\n lastChunkAt: new Date().toISOString(),\n };\n _scheduleFlush();\n}\n\n/**\n * Default callback: write a compact status line to stderr (used in CLI /\n * headless mode where Ink isn't painting the terminal).\n */\nexport function defaultDebugStreamCallback(stats: DebugStreamStats): void {\n process.stderr.write(\n `[DEBUG-STREAM] chunk #${stats.chunkCount} (${stats.lastChunkSize}B, +${stats.lastDeltaMs}ms) · ${fmtBytes(stats.totalBytes)} total · ${stats.lastChunkAt}\\n`,\n );\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1_048_576) return `${(n / 1024).toFixed(1)}KB`;\n return `${(n / 1_048_576).toFixed(1)}MB`;\n}\n","import type { Capabilities, Provider, Request, Response, StreamEvent } from '@wrongstack/core';\nimport { ProviderError, StreamHangError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { isDebugStreamEnabled, pushDebugChunkStats } from './stream-debug-state.js';\nimport { Readable } from 'node:stream';\nimport { toErrorMessage } from '@wrongstack/core/utils';\n\ntype Response2 = {\n ok: boolean;\n status: number;\n text(): Promise<string>;\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n};\n\n/** Configuration for WireAdapter stream-level debugging and hang detection. */\nexport interface WireAdapterStreamOptions {\n /**\n * When true, accumulate per-chunk stats into the shared debug-sink\n * (stream-debug-state.ts). The sink batches every 200 ms and pushes to\n * a registered callback. The CLI default callback writes to stderr; the\n * TUI replaces it with a reducer dispatch that renders in StatusBar line 3,\n * keeping all output inside Ink's layout.\n *\n * Controlled by WRONGSTACK_DEBUG_STREAM=1 env var or the runtime\n * /settings debug-stream toggle.\n */\n debugStream?: boolean | undefined;\n /**\n * Maximum time (ms) to wait for the next chunk of data before declaring\n * a stream hang. Default: 60_000 (60 seconds). Set to 0 to disable.\n * When a hang is detected, a StreamHangError is thrown so the agent\n * loop can retry the iteration.\n */\n streamHangTimeoutMs?: number | undefined;\n}\n\n/** Validate fetchImpl response has required fields; normalize missing body to null. */\nfunction validateResponse(res: unknown): asserts res is Response2 {\n const r = res as Record<string, unknown> | undefined;\n if (r === undefined || typeof r.ok !== 'boolean' || typeof r.status !== 'number') {\n throw new Error('fetchImpl returned invalid response shape — expected { ok, status, text, body }');\n }\n // If body is absent, null, or undefined on a plain object (not a native Response\n // with a read-only getter), normalize it to null so callers can safely use it.\n // Native Response objects always have a body getter — no mutation needed.\n if (!('body' in r) || r.body === undefined) {\n // Only set on plain objects — native Response.body is read-only\n const proto = Object.getPrototypeOf(r);\n if (proto === Object.prototype || proto === null) {\n r.body = null;\n }\n }\n}\n\nasync function safeText(res: Response2): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n}\n\n/**\n * Feed debug-chunk stats into the shared singleton sink. The sink batches\n * and throttles writes so the TUI can render them inside Ink's StatusBar\n * line 3 (~5 Hz) instead of raw stderr interfering with the terminal layout.\n */\nfunction logRawChunk(\n _providerId: string,\n _chunkIndex: number,\n bytes: Uint8Array,\n deltaMs: number,\n): void {\n pushDebugChunkStats(bytes.length, deltaMs);\n}\n\nconst DEFAULT_STREAM_HANG_TIMEOUT_MS = 60_000;\n\n/**\n * Shared HTTP mechanics for streaming providers.\n * Providers extend this to get:\n * - canonical error handling (ProviderError with retryable flag)\n * - SSE body parsing via parseSSE()\n * - abort signal wiring\n * - optional raw-stream debug logging\n * - optional stream hang detection\n *\n * Subclasses implement the abstract members to provide their specific wire format.\n */\nexport abstract class WireAdapter implements Provider {\n abstract readonly id: string;\n abstract readonly capabilities: Capabilities;\n\n protected readonly debugStream: boolean;\n protected readonly streamHangTimeoutMs: number;\n\n constructor(\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n public readonly fetchImpl: typeof fetch = fetch,\n streamOpts: WireAdapterStreamOptions = {},\n ) {\n if (!apiKey) throw new Error(`${this.constructor.name}: apiKey required`);\n this.debugStream = streamOpts.debugStream ?? false;\n this.streamHangTimeoutMs = streamOpts.streamHangTimeoutMs ?? DEFAULT_STREAM_HANG_TIMEOUT_MS;\n }\n\n async complete(req: Request, opts: { signal: AbortSignal }): Promise<Response> {\n const { aggregateStream } = await import('./aggregate.js');\n return aggregateStream(this.stream(req, opts));\n }\n\n async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n const url = this.buildUrl(req);\n const headers = this.buildHeaders(req);\n const body = this.buildBody(req);\n\n let httpRes: Response2;\n try {\n const raw = await this.fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n validateResponse(raw);\n httpRes = raw as Response2;\n } catch (err) {\n if (opts.signal.aborted) throw err;\n throw new ProviderError(toErrorMessage(err), 0, true, this.id, {\n cause: err,\n body: { message: toErrorMessage(err) },\n });\n }\n\n if (!httpRes.ok) {\n const text = await safeText(httpRes);\n throw this.translateError(httpRes.status, text);\n }\n\n let sseBody = httpRes.body;\n if (!sseBody) {\n // No body — emit nothing\n return;\n }\n\n // Layer 1: debug logging — wrap the stream to log raw bytes.\n // Checks both the instance-level option (set at construction) AND the\n // runtime singleton (flipped via /settings or setDebugStreamEnabled) so\n // toggles take effect on the next request without recreating providers.\n if (this.debugStream || isDebugStreamEnabled()) {\n sseBody = this.wrapDebugStream(sseBody);\n }\n\n // Layer 2: hang detection — wrap with timeout-aware reader\n if (this.streamHangTimeoutMs > 0) {\n sseBody = this.wrapWithHangDetection(sseBody, req.model);\n }\n\n yield* this.parseStream(sseBody, req.model, req);\n }\n\n /**\n * Wrap a readable stream body to log a compact status line per incoming\n * byte chunk to stderr. This is a diagnostic tool for tracking stream\n * activity — chunk count, sizes, and inter-chunk deltas — without\n * printing payload contents.\n */\n private wrapDebugStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n ): ReadableStream<Uint8Array> | NodeJS.ReadableStream {\n // Node.js Readable stream — use async iterator\n if (isNodeReadable(body)) {\n return this.wrapDebugNodeStream(body as NodeJS.ReadableStream) as NodeJS.ReadableStream;\n }\n // Web ReadableStream — wrap reader\n return this.wrapDebugWebStream(body as ReadableStream<Uint8Array>);\n }\n\n private wrapDebugNodeStream(body: NodeJS.ReadableStream): NodeJS.ReadableStream {\n let lastChunkTime = Date.now();\n let chunkIndex = 0;\n const providerId = this.id;\n\n return Readable.from(\n (async function* () {\n for await (const chunk of body) {\n const bytes: Uint8Array =\n typeof chunk === 'string'\n ? new TextEncoder().encode(chunk)\n : new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n const now = Date.now();\n logRawChunk(providerId, chunkIndex++, bytes, now - lastChunkTime);\n lastChunkTime = now;\n yield chunk;\n }\n })(),\n );\n }\n\n private wrapDebugWebStream(\n body: ReadableStream<Uint8Array>,\n ): ReadableStream<Uint8Array> {\n let lastChunkTime = Date.now();\n let chunkIndex = 0;\n const self = this;\n const reader = body.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (value) {\n const now = Date.now();\n logRawChunk(self.id, chunkIndex++, value, now - lastChunkTime);\n lastChunkTime = now;\n }\n controller.enqueue(value);\n },\n cancel(reason) {\n reader.cancel(reason);\n },\n });\n }\n\n /**\n * Wrap a readable stream to detect hangs — when no data arrives for\n * longer than `streamHangTimeoutMs`. When a hang is detected, throws\n * `StreamHangError` so the caller can retry or fall back.\n */\n private wrapWithHangDetection(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n model: string,\n ): ReadableStream<Uint8Array> | NodeJS.ReadableStream {\n if (isNodeReadable(body)) {\n return this.wrapHangNodeStream(body as NodeJS.ReadableStream, model);\n }\n return this.wrapHangWebStream(body as ReadableStream<Uint8Array>, model);\n }\n\n private wrapHangNodeStream(\n body: NodeJS.ReadableStream,\n model: string,\n ): NodeJS.ReadableStream {\n // Node Readable → Web ReadableStream, then use the race-based\n // web wrapper that properly detects hangs even when no chunks arrive.\n // The for-await approach only checks BETWEEN chunks — a stalled stream\n // that never yields another chunk would freeze indefinitely.\n const webStream = Readable.toWeb(body as Readable);\n const wrappedWeb = this.wrapHangWebStream(webStream as ReadableStream<Uint8Array>, model);\n return Readable.fromWeb(wrappedWeb as unknown as ReadableStream) as unknown as NodeJS.ReadableStream;\n }\n\n private wrapHangWebStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): ReadableStream<Uint8Array> {\n const startTime = Date.now();\n let bytesReceived = 0;\n const timeout = this.streamHangTimeoutMs;\n const providerId = this.id;\n const reader = body.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n // Race the read against a hang timeout\n const readPromise = reader.read();\n const timeoutPromise = new Promise<{ timedOut: true }>((resolve) => {\n setTimeout(() => resolve({ timedOut: true }), timeout);\n });\n\n const result = await Promise.race([readPromise, timeoutPromise]);\n\n if ('timedOut' in result && result.timedOut) {\n // The read is still pending — this is a hang.\n // Cancel the reader and throw.\n reader.cancel('stream hang detected').catch((err) => console.debug(`[wire-adapter] cancel after stream hang failed: ${err}`));\n const elapsedMs = Date.now() - startTime;\n throw new StreamHangError({\n providerId,\n model,\n hangTimeoutMs: timeout,\n bytesReceived,\n elapsedMs,\n });\n }\n\n const { done, value } = result as Awaited<ReturnType<typeof reader.read>>;\n if (done) {\n controller.close();\n return;\n }\n if (value) {\n bytesReceived += value.length;\n }\n controller.enqueue(value);\n },\n cancel(reason) {\n reader.cancel(reason);\n },\n });\n }\n\n // ─── Abstract / overridable ───────────────────────────────────────────────\n\n /** HTTP endpoint for this provider's chat completions / messages API. */\n protected abstract buildUrl(req: Request): string;\n\n /** Per-request headers. `apiKey` is already in scope — call `super.buildHeaders` first. */\n protected buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n };\n }\n\n /** Map Request fields to the wire request body. */\n protected abstract buildBody(req: Request): Record<string, unknown>;\n\n /** Translate wire SSE events into canonical StreamEvent[]. */\n protected abstract parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n req: Request,\n ): AsyncIterable<StreamEvent>;\n\n /** Build a ProviderError from an HTTP failure response. */\n protected translateError(status: number, body: string): ProviderError {\n return parseProviderHttpError(this.id, status, body);\n }\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown | undefined }).pipe === 'function' &&\n typeof (b as { on?: unknown | undefined }).on === 'function'\n );\n}\n","/**\n * `anthropic-oauth` wire family — Claude Pro/Max via \"Sign in with Claude\".\n *\n * Same wire as the API-key `anthropic` family (api.anthropic.com/v1/messages),\n * but authenticated with an OAuth access token instead of an API key. Three\n * things differ from the API-key path, all REQUIRED for the subscription\n * backend to accept the request:\n * 1. `Authorization: Bearer <access>` (no `x-api-key`).\n * 2. `anthropic-beta: claude-code-20250219,oauth-2025-04-20`.\n * 3. The first system block MUST be exactly the Claude Code identity line —\n * Anthropic rejects OAuth requests whose system prompt doesn't lead with it.\n *\n * The API-key `anthropic` family is untouched. Tokens self-refresh (near-expiry\n * + once on 401) via the refresh token; rotated tokens persist through the same\n * `setOAuthTokenPersister` hook the codex family uses.\n */\n\nimport { type Capabilities, ProviderError, type Request, type StreamEvent } from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nconst CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';\nconst TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';\nconst DEFAULT_BASE = 'https://api.anthropic.com';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst OAUTH_BETA = 'claude-code-20250219,oauth-2025-04-20';\nconst REFRESH_SKEW_MS = 60_000;\n/** Version string mimicked in the User-Agent so requests look like Claude Code. */\nconst CLAUDE_CODE_VERSION = '2.1.75';\n\n/** Required first system block for OAuth/subscription requests. */\nexport const CLAUDE_CODE_SYSTEM_PROMPT =\n \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// ── Tool-name camouflage ─────────────────────────────────────────────────────\n// The subscription backend can fingerprint a non-Claude-Code client by its tool\n// names. We present Claude Code's canonical casing on the wire (read → Read,\n// bash → Bash, …) for any tool whose name matches case-insensitively, and map\n// the streamed tool_use name back to the caller's real tool so dispatch works.\n// Tools without a Claude Code counterpart pass through unchanged.\n\nconst CLAUDE_CODE_TOOLS = [\n 'Read',\n 'Write',\n 'Edit',\n 'Bash',\n 'Grep',\n 'Glob',\n 'AskUserQuestion',\n 'EnterPlanMode',\n 'ExitPlanMode',\n 'KillShell',\n 'NotebookEdit',\n 'Skill',\n 'Task',\n 'TaskOutput',\n 'TodoWrite',\n 'WebFetch',\n 'WebSearch',\n] as const;\n\nconst CC_TOOL_BY_LOWER = new Map(CLAUDE_CODE_TOOLS.map((t) => [t.toLowerCase(), t]));\n\n/** Map a real tool name to Claude Code's canonical casing (if it matches). */\nfunction toClaudeCodeName(name: string): string {\n return CC_TOOL_BY_LOWER.get(name.toLowerCase()) ?? name;\n}\n\n/** Map a Claude-Code-cased name back to the caller's real tool name. */\nfunction fromClaudeCodeName(name: string, tools: Request['tools']): string {\n const lower = name.toLowerCase();\n const match = tools?.find((t) => t.name.toLowerCase() === lower);\n return match?.name ?? name;\n}\n\nexport interface AnthropicOAuthTokens {\n access: string;\n refresh: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Refresh an expired Claude OAuth access token. */\nexport async function refreshAnthropicOAuthToken(\n refreshToken: string,\n signal?: AbortSignal,\n): Promise<AnthropicOAuthTokens> {\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(30_000)])\n : AbortSignal.timeout(30_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Claude token refresh failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n } | null;\n if (!json?.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n throw new Error('Claude token refresh response missing fields');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n };\n}\n\nexport interface AnthropicOAuthCredentials {\n accessToken: string;\n refreshToken?: string | undefined;\n expiresAt?: number | undefined;\n}\n\nexport interface AnthropicOAuthProviderOptions {\n credentials: AnthropicOAuthCredentials;\n baseUrl?: string | undefined;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n onRefresh?:\n | ((creds: { accessToken: string; refreshToken: string; expiresAt: number }) => void)\n | undefined;\n refreshFn?:\n | ((refreshToken: string, signal?: AbortSignal) => Promise<AnthropicOAuthTokens>)\n | undefined;\n}\n\nexport class AnthropicOAuthProvider extends AnthropicProvider {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private access: string;\n private refresh: string | undefined;\n private expiresAt: number | undefined;\n private readonly onRefresh: AnthropicOAuthProviderOptions['onRefresh'];\n private readonly refreshFn: (\n refreshToken: string,\n signal?: AbortSignal,\n ) => Promise<AnthropicOAuthTokens>;\n\n constructor(opts: AnthropicOAuthProviderOptions) {\n super({\n apiKey: opts.credentials.accessToken,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE,\n fetchImpl: opts.fetchImpl,\n streamOpts: opts.streamOpts,\n });\n this.id = opts.id ?? 'anthropic-oauth';\n this.capabilities = capabilitiesForFamily('anthropic-oauth');\n this.access = opts.credentials.accessToken;\n this.refresh = opts.credentials.refreshToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshAnthropicOAuthToken;\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }) {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* this.remapToolNames(super.stream(req, opts), req.tools);\n } catch (err) {\n if (err instanceof ProviderError && err.status === 401 && this.refresh) {\n await this.doRefresh(opts.signal);\n yield* this.remapToolNames(super.stream(req, opts), req.tools);\n return;\n }\n throw err;\n }\n }\n\n /** Map Claude-Code-cased tool_use names in the stream back to real names. */\n private async *remapToolNames(\n events: AsyncIterable<StreamEvent>,\n tools: Request['tools'],\n ): AsyncIterable<StreamEvent> {\n for await (const ev of events) {\n if (\n (ev.type === 'tool_use_start' || ev.type === 'content_block_start') &&\n typeof (ev as { name?: string }).name === 'string'\n ) {\n yield { ...ev, name: fromClaudeCodeName((ev as { name: string }).name, tools) };\n } else {\n yield ev;\n }\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n if (this.expiresAt !== undefined && Date.now() < this.expiresAt - REFRESH_SKEW_MS) return;\n await this.doRefresh(signal);\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n const t = await this.refreshFn(this.refresh, signal);\n this.access = t.access;\n this.refresh = t.refresh;\n this.expiresAt = t.expires;\n this.onRefresh?.({ accessToken: t.access, refreshToken: t.refresh, expiresAt: t.expires });\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n 'anthropic-version': ANTHROPIC_VERSION,\n authorization: `Bearer ${this.access}`,\n 'anthropic-beta': OAUTH_BETA,\n // Present as the official Claude Code CLI so the subscription backend\n // accepts the request and the client isn't trivially fingerprinted.\n 'user-agent': `claude-cli/${CLAUDE_CODE_VERSION}`,\n 'x-app': 'cli',\n 'anthropic-dangerous-direct-browser-access': 'true',\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body = super.buildBody(req);\n // Prepend the required Claude Code identity block (unless already present).\n const existing = (body['system'] as { type: 'text'; text: string }[] | undefined) ?? [];\n const alreadyLed = existing[0]?.text?.startsWith(CLAUDE_CODE_SYSTEM_PROMPT) === true;\n body['system'] = alreadyLed\n ? existing\n : [{ type: 'text', text: CLAUDE_CODE_SYSTEM_PROMPT }, ...existing];\n\n // Present Claude Code's canonical tool names on the wire, consistently\n // across both the tool definitions and the tool_use blocks in history.\n const tools = body['tools'] as Array<{ name?: string }> | undefined;\n if (Array.isArray(tools)) {\n for (const t of tools) {\n if (typeof t.name === 'string') t.name = toClaudeCodeName(t.name);\n }\n }\n const messages = body['messages'] as Array<{ content?: unknown }> | undefined;\n if (Array.isArray(messages)) {\n for (const m of messages) {\n if (!Array.isArray(m.content)) continue;\n for (const block of m.content as Array<{ type?: string; name?: string }>) {\n if (block?.type === 'tool_use' && typeof block.name === 'string') {\n block.name = toClaudeCodeName(block.name);\n }\n }\n }\n }\n return body;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Capabilities, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeOpenAI } from './stop-reason.js';\nimport { type ConvertOptions, messagesToOpenAI, toolsToOpenAI } from './tool-format/to-openai.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\nexport interface OpenAIProviderOptions {\n apiKey: string;\n baseUrl?: string | undefined;\n organization?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n quirks?: ConvertOptions & {\n parallelToolsDisabled?: boolean | undefined;\n jsonArgumentsBuggy?: boolean | undefined;\n thinkingParam?: 'zai-glm' | 'kimi-toggle' | 'always-on' | undefined;\n } | undefined;\n id?: string | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nconst DEFAULT_BASE = 'https://api.openai.com/v1';\n\nexport class OpenAIProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n protected readonly opts: OpenAIProviderOptions;\n\n constructor(opts: OpenAIProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\n this.opts = opts;\n this.id = opts.id ?? 'openai';\n this.capabilities = capabilitiesForFamily('openai', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n const base = this.baseUrl.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(base)) return base;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(base)) return `${base}/chat/completions`;\n return `${base}/v1/chat/completions`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(req),\n authorization: `Bearer ${this.apiKey}`,\n };\n if (this.opts.organization) {\n headers['openai-organization'] = this.opts.organization;\n }\n return headers;\n }\n\n /**\n * The request field used to cap output length. Real OpenAI deprecated\n * `max_tokens` and the newer model families (gpt-4o, o1/o3/o4) 400 on it —\n * they require `max_completion_tokens`. OpenAI-compatible endpoints that\n * still only accept `max_tokens` override this. See issue #10.\n */\n protected tokenLimitParam(): string {\n return 'max_completion_tokens';\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(this.stripCacheControl(req), req.messages, {\n ...this.opts.quirks,\n }),\n [this.tokenLimitParam()]: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseOpenAIStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private stripCacheControl(req: Request): typeof req.system {\n if (!req.system) return undefined;\n return req.system.map((b) => {\n // Omit cache_control without mutating a copy — rest spread is cleaner.\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n }\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate an OpenAI /chat/completions SSE stream into canonical StreamEvent[].\n *\n * Wire format per chunk:\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"hi\"},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"tool_calls\":[\n * {\"index\":0,\"id\":\"call_x\",\"function\":{\"name\":\"echo\",\"arguments\":\"{\\\"text\\\":\"}}]},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{...,\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":12,...}}\n * data: [DONE]\n *\n * Tool calls stream as a sequence of partial fragments keyed by their\n * `index` in the delta array; we map index → canonical tool_use id from\n * the first chunk that carries one.\n */\nasync function* parseOpenAIStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n let textOpen = false;\n let thinkingOpen = false;\n const toolByIndex = new Map<\n number,\n { id?: string | undefined; name?: string | undefined; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >();\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (typeof obj['model'] === 'string') model = obj['model'];\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null | undefined;\n reasoning_content?: string | undefined;\n reasoning?: string | undefined;\n tool_calls?: Array<{\n index?: number | undefined;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }>;\n };\n finish_reason?: string | null | undefined;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode) stream chain-of-thought\n // as `delta.reasoning_content` at the top of the delta. The full blob\n // MUST be echoed back as message-level `reasoning_content` on the\n // next request — otherwise DeepSeek 400s with \"reasoning_content in\n // the thinking mode must be passed back to the API\".\n // OpenRouter sometimes uses `delta.reasoning` for the same field.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!thinkingOpen) {\n thinkingOpen = true;\n yield { type: 'thinking_start' };\n }\n yield { type: 'thinking_delta', text: reasoningDelta };\n }\n\n if (choice?.delta?.content) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n if (!textOpen) textOpen = true;\n yield { type: 'text_delta', text: choice.delta.content };\n }\n\n if (choice?.delta?.tool_calls) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n textOpen = false;\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n yield {\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n };\n }\n }\n }\n\n if (choice?.finish_reason) {\n stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number | undefined;\n input_tokens?: number | undefined;\n completion_tokens?: number | undefined;\n prompt_tokens_details?: { cached_tokens?: number | undefined };\n prompt_cache_hit_tokens?: number | undefined;\n prompt_cache_miss_tokens?: number | undefined;\n }\n | undefined;\n if (u) {\n // Normalize to disjoint semantics: `input` is fresh-only (priced at\n // the full rate), `cacheRead` is the cached subset (priced at the\n // cache rate). OpenAI returns `prompt_tokens_details.cached_tokens`;\n // DeepSeek returns `prompt_cache_hit_tokens`/`prompt_cache_miss_tokens`.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ?? u.input_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : usage.input + cached);\n usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (thinkingOpen) {\n yield { type: 'thinking_stop' };\n }\n for (const entry of toolByIndex.values()) {\n // A tool call with no name is unusable — there's nothing to dispatch to.\n if (!entry.name) continue;\n // Some OpenAI-compatible servers (proxies, local runtimes) omit the\n // `id` field on streamed tool calls entirely. Dropping the call here\n // would silently swallow the model's action; synthesize a stable id so\n // it still dispatches and correlates with its tool_result. Mirrors the\n // Google adapter, which always assigns an id.\n if (!entry.id) entry.id = `call_${randomUUID()}`;\n if (!entry.emittedStart) {\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n const input = parseToolInput(entry.argBuf);\n yield { type: 'tool_use_stop', id: entry.id, input };\n }\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n","import type {\n ContentBlock,\n Message,\n TextBlock,\n ThinkingBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire } from '@wrongstack/core';\n\nexport interface OpenAIToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\n/**\n * WeakMap cache keyed by the Tool[] array reference. The tool registry\n * returns the same array reference within a session, so after the first\n * call the serialized schemas are served from cache — no re-mapping or\n * object allocation on subsequent LLM calls. When tools are added or\n * removed the registry creates a new array, the old entry is GC'd by\n * the WeakMap, and the next call recomputes.\n */\nconst _cache = new WeakMap<Tool[], OpenAIToolSchema[]>();\n\nexport function toolsToOpenAI(tools: Tool[]): OpenAIToolSchema[] {\n const hit = _cache.get(tools);\n if (hit) return hit;\n const result = tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n type: 'function' as const,\n function: {\n name: compact.name,\n description: compact.description,\n parameters: compact.inputSchema,\n },\n };\n });\n _cache.set(tools, result);\n return result;\n}\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content?: string | OpenAIContent[] | null | undefined;\n tool_calls?: OpenAIToolCall[] | undefined;\n tool_call_id?: string | undefined;\n name?: string | undefined;\n /**\n * DeepSeek (and other OpenAI-compatible thinking-mode models) require the\n * previous assistant's chain-of-thought to be echoed back on the next\n * request as a top-level `reasoning_content` field on the assistant\n * message — NOT inside individual tool_calls. Without it DeepSeek\n * returns 400 \"reasoning_content in the thinking mode must be passed\n * back to the API\". Vanilla OpenAI ignores this field, so emitting it\n * unconditionally is safe.\n */\n reasoning_content?: string | undefined;\n}\n\nexport interface OpenAIContent {\n type: 'text' | 'image_url';\n text?: string | undefined;\n image_url?: { url: string | undefined };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface ConvertOptions {\n flattenContentToString?: boolean | undefined;\n stripCacheControl?: boolean | undefined;\n systemAsMessage?: boolean | undefined;\n /**\n * What to write as the assistant message's `content` field when the\n * message has tool_calls but no prose. Two values:\n *\n * - `'empty_string'` (default): writes `content: ''`. This is the\n * OpenAI 2024-2025 wire-format contract. Vanilla OpenAI, K2P7,\n * strict Mistral / OpenRouter / DeepSeek proxies all reject\n * requests where `content` is missing or `null` on a tool_call\n * assistant message.\n *\n * - `'null'`: writes `content: null` explicitly. Some older or\n * permissive proxies (e.g. certain vLLM builds, local llama.cpp\n * servers) prefer this. Set this only if a specific provider\n * rejects the empty-string form.\n *\n * The default is `'empty_string'` (NOT undefined) because omitting\n * `content` entirely (the pre-2024 behaviour) breaks too many\n * providers to be the safe default in 2025. Callers that need the\n * old behaviour can opt in with `emptyToolCallContent: 'null'`.\n */\n emptyToolCallContent?: 'null' | 'empty_string' | undefined;\n}\n\nexport function messagesToOpenAI(\n system: TextBlock[] | undefined,\n messages: Message[],\n opts: ConvertOptions = {},\n): OpenAIMessage[] {\n // Default to `'empty_string'` for the assistant content field on\n // tool-call-only messages. See ConvertOptions.emptyToolCallContent\n // for the rationale. Callers can opt back into the pre-2024\n // behaviour with `emptyToolCallContent: 'null'`.\n const emptyContentMode: 'null' | 'empty_string' = opts.emptyToolCallContent ?? 'empty_string';\n const out: OpenAIMessage[] = [];\n\n if (system && system.length > 0) {\n const sysText = system.map((b) => b.text).join('\\n\\n');\n if (opts.systemAsMessage) {\n out.push({ role: 'user', content: sysText });\n } else {\n out.push({ role: 'system', content: sysText });\n }\n }\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n const blocks = normalizeContent(msg.content);\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n const others = blocks.filter((b) => b.type !== 'tool_result');\n\n // Emit the `role:\"tool\"` responses BEFORE any `role:\"user\"` content.\n // A single canonical user turn can hold both tool_result blocks and\n // text (e.g. a `/btw` note appended onto the trailing tool-result\n // message). OpenAI — and DeepSeek strictly — require every tool\n // message to immediately follow the assistant `tool_calls`; a user\n // message wedged in between triggers a 400 \"assistant message with\n // 'tool_calls' must be followed by tool messages\".\n for (const r of toolResults) {\n const content = typeof r.content === 'string' ? r.content : JSON.stringify(r.content);\n out.push({\n role: 'tool',\n tool_call_id: r.tool_use_id,\n content,\n });\n }\n if (others.length > 0) {\n out.push({\n role: 'user',\n content: opts.flattenContentToString\n ? blocksToString(others)\n : blocksToContentArray(others),\n });\n }\n } else if (msg.role === 'assistant') {\n const blocks = normalizeContent(msg.content);\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n const thinkingBlocks = blocks.filter((b): b is ThinkingBlock => b.type === 'thinking');\n const text = textBlocks.map((b) => b.text).join('');\n const reasoning = thinkingBlocks\n .map((b) => b.thinking)\n .filter((t) => t && t.length > 0)\n .join('');\n const toolCalls: OpenAIToolCall[] = toolUses.map((u) => ({\n id: u.id,\n type: 'function',\n function: { name: u.name, arguments: JSON.stringify(u.input) },\n }));\n\n const message: OpenAIMessage = { role: 'assistant' };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n if (text) {\n message.content = text;\n } else {\n // Tool-call-only assistant message: emit the empty `content`\n // field per `emptyContentMode` (computed once at the top of the\n // function; defaults to `''`, opt out with `'null'`).\n message.content = emptyContentMode === 'null' ? null : '';\n }\n } else {\n message.content = text;\n }\n // DeepSeek thinking mode requires the prior assistant's reasoning\n // blob to round-trip on the next request. Vanilla OpenAI silently\n // accepts and ignores the field, so emitting it unconditionally is\n // safe across the OpenAI-compatible ecosystem.\n if (reasoning.length > 0) {\n message.reasoning_content = reasoning;\n }\n out.push(message);\n }\n }\n return out;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction blocksToString(blocks: ContentBlock[]): string {\n return blocks\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'image') return '[image]';\n return '';\n })\n .join('');\n}\n\nfunction blocksToContentArray(blocks: ContentBlock[]): OpenAIContent[] | string {\n const hasImage = blocks.some((b) => b.type === 'image');\n if (!hasImage) {\n return blocks\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n }\n return blocks\n .map((b): OpenAIContent | null => {\n if (b.type === 'text') return { type: 'text', text: b.text };\n if (b.type === 'image') {\n const url =\n b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n return { type: 'image_url', image_url: { url } };\n }\n return null;\n })\n .filter((c): c is OpenAIContent => c !== null);\n}\n","/**\n * `github-copilot` wire family — GitHub Copilot subscription.\n *\n * Copilot's chat API is OpenAI chat/completions-compatible, so this extends\n * OpenAIProvider and only changes auth + base URL + headers:\n * - `Authorization: Bearer <copilot-token>` plus the Copilot editor headers\n * and `X-GitHub-Api-Version`.\n * - The base URL is derived from the Copilot token's `proxy-ep=` field\n * (e.g. https://api.individual.githubcopilot.com).\n *\n * Two tokens are involved: the long-lived GitHub OAuth token (stored as the\n * refresh token — it does NOT rotate) mints short-lived Copilot tokens via\n * `api.github.com/copilot_internal/v2/token`. This adapter refreshes the\n * Copilot token transparently (near-expiry + once on 401) and re-derives the\n * base URL from each new token. The API-key `openai` family is untouched.\n */\n\nimport type { Capabilities, Request } from '@wrongstack/core';\nimport { ProviderError } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nconst COPILOT_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token';\nconst COPILOT_API_VERSION = '2026-06-01';\nconst COPILOT_HEADERS: Record<string, string> = {\n 'User-Agent': 'GitHubCopilotChat/0.35.0',\n 'Editor-Version': 'vscode/1.107.0',\n 'Editor-Plugin-Version': 'copilot-chat/0.35.0',\n 'Copilot-Integration-Id': 'vscode-chat',\n};\nconst DEFAULT_API_BASE = 'https://api.individual.githubcopilot.com';\nconst REFRESH_SKEW_MS = 60_000;\n\n/** Derive the Copilot API base URL from a Copilot token's `proxy-ep` field. */\nexport function copilotBaseUrlFromToken(token: string | undefined): string {\n if (token) {\n const m = token.match(/proxy-ep=([^;]+)/);\n if (m?.[1]) return `https://${m[1].replace(/^proxy\\./, 'api.')}`;\n }\n return DEFAULT_API_BASE;\n}\n\nexport interface CopilotTokenResult {\n /** The short-lived Copilot token (the access token used for chat). */\n token: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Mint a fresh Copilot token from the long-lived GitHub OAuth token. */\nexport async function refreshCopilotToken(\n githubToken: string,\n signal?: AbortSignal,\n): Promise<CopilotTokenResult> {\n const res = await fetch(COPILOT_TOKEN_URL, {\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${githubToken}`,\n ...COPILOT_HEADERS,\n },\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(15_000)])\n : AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Copilot token request failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as { token?: string; expires_at?: number } | null;\n if (!json?.token || typeof json.expires_at !== 'number') {\n throw new Error('Copilot token response missing fields');\n }\n return { token: json.token, expires: json.expires_at * 1000 };\n}\n\nexport interface CopilotCredentials {\n /** Current Copilot token (access). May be empty → minted on first request. */\n copilotToken: string;\n /** Long-lived GitHub OAuth token (refresh; does not rotate). */\n githubToken?: string | undefined;\n /** Copilot-token expiry, epoch ms. */\n expiresAt?: number | undefined;\n}\n\nexport interface GitHubCopilotProviderOptions {\n credentials: CopilotCredentials;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n onRefresh?:\n | ((creds: { accessToken: string; refreshToken: string; expiresAt: number }) => void)\n | undefined;\n refreshFn?:\n | ((githubToken: string, signal?: AbortSignal) => Promise<CopilotTokenResult>)\n | undefined;\n}\n\nexport class GitHubCopilotProvider extends OpenAIProvider {\n override readonly capabilities: Capabilities;\n\n private copilotToken: string;\n private readonly githubToken: string | undefined;\n private expiresAt: number | undefined;\n private apiBase: string;\n private readonly onRefresh: GitHubCopilotProviderOptions['onRefresh'];\n private readonly refreshFn: (\n githubToken: string,\n signal?: AbortSignal,\n ) => Promise<CopilotTokenResult>;\n\n constructor(opts: GitHubCopilotProviderOptions) {\n const apiBase = copilotBaseUrlFromToken(opts.credentials.copilotToken);\n super({\n // OpenAIProvider requires a non-empty apiKey; use a placeholder when the\n // Copilot token is empty (it will be minted before the first request).\n apiKey: opts.credentials.copilotToken || 'pending',\n baseUrl: apiBase,\n id: opts.id ?? 'github-copilot',\n fetchImpl: opts.fetchImpl,\n streamOpts: opts.streamOpts,\n capabilities: opts.capabilities,\n });\n this.copilotToken = opts.credentials.copilotToken;\n this.githubToken = opts.credentials.githubToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.apiBase = apiBase;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshCopilotToken;\n this.capabilities = capabilitiesForFamily('github-copilot', { ...opts.capabilities });\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }) {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* super.stream(req, opts);\n } catch (err) {\n if (err instanceof ProviderError && err.status === 401 && this.githubToken) {\n await this.doRefresh(opts.signal);\n yield* super.stream(req, opts);\n return;\n }\n throw err;\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n const stale = this.expiresAt === undefined || Date.now() >= this.expiresAt - REFRESH_SKEW_MS;\n if (!this.copilotToken || (stale && this.githubToken)) {\n await this.doRefresh(signal);\n }\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.githubToken) return;\n const t = await this.refreshFn(this.githubToken, signal);\n this.copilotToken = t.token;\n this.expiresAt = t.expires;\n this.apiBase = copilotBaseUrlFromToken(t.token);\n this.onRefresh?.({\n accessToken: t.token,\n refreshToken: this.githubToken,\n expiresAt: t.expires,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n return `${this.apiBase.replace(/\\/+$/, '')}/chat/completions`;\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n authorization: `Bearer ${this.copilotToken}`,\n 'X-GitHub-Api-Version': COPILOT_API_VERSION,\n ...COPILOT_HEADERS,\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n Capabilities,\n Message,\n Request,\n StopReason,\n StreamEvent,\n Tool,\n Usage,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire, type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeGemini } from './stop-reason.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n/**\n * Google Gemini wire format (generativelanguage.googleapis.com).\n *\n * Differences vs OpenAI:\n * - Endpoint includes the model in the path: /v1beta/models/{model}:generateContent\n * - Messages → `contents: [{ role: 'user'|'model', parts: [...] }]`\n * - System prompt → `systemInstruction: { parts: [{ text }] }`\n * - Tools → `tools: [{ functionDeclarations: [...] }]`\n * - Tool call → `parts: [{ functionCall: { name, args } }]`\n * - Tool result → `parts: [{ functionResponse: { name, response } }]`\n * - Auth via `?key=` query param or `x-goog-api-key` header\n */\n\nexport interface GoogleProviderOptions {\n apiKey: string;\n baseUrl?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n id?: string | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nconst DEFAULT_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\ninterface GeminiPart {\n text?: string | undefined;\n functionCall?: { name: string | undefined; args: Record<string, unknown> };\n functionResponse?: { name: string | undefined; response: { content?: unknown | undefined } };\n inlineData?: { mimeType: string | undefined; data: string };\n /**\n * Gemini's signed thought blob — present on functionCall parts when\n * the model is using thinking. Must be echoed back verbatim on the\n * next request, otherwise the API rejects with:\n * 400 \"Function call is missing a thought_signature in functionCall\n * parts. This is required for tools to work correctly\".\n */\n thoughtSignature?: string | undefined;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent | undefined;\n finishReason?: string | undefined;\n}\n\nexport class GoogleProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n constructor(opts: GoogleProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\n this.id = opts.id ?? 'google';\n this.capabilities = capabilitiesForFamily('google', {\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(req: Request): string {\n return `${this.baseUrl}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: this.buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseGoogleStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n }\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n parameters: sanitizeSchemaForGemini(compact.inputSchema) ?? {\n type: 'object',\n properties: {},\n },\n };\n });\n}\n\n/**\n * Gemini's function-declaration `parameters` field accepts an OpenAPI 3.0\n * Schema subset — a strict superset of \"JSON Schema minus a bunch of\n * keywords\". Sending the raw JSON Schema (which Zod/JSON-Schema converters\n * happily emit with `additionalProperties`, `$schema`, etc.) makes the API\n * fail with `Unknown name \"additionalProperties\"` and friends. Walk the\n * schema and keep only what Gemini understands.\n *\n * Spec reference (OpenAPI 3.0 Schema Object → Gemini): supported keywords\n * are type, format, description, nullable, enum, items, properties,\n * required, anyOf, minLength/maxLength, pattern, minimum/maximum,\n * minItems/maxItems, minProperties/maxProperties, propertyOrdering.\n * Anything else — additionalProperties, $schema, $ref, definitions,\n * default, examples, const, allOf, oneOf, not, dependencies, if/then/else\n * — gets dropped silently.\n */\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) {\n // Used only for `enum` / `required` / `anyOf` arrays — handled per-key\n // below. Bare arrays here would be malformed schemas, drop.\n return undefined;\n }\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n // Echo the thought_signature back on every assistant tool_use\n // part — Gemini's thinking models REQUIRE it on the next turn\n // or the API returns 400. The value is opaque; we just round-trip.\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n // Prefer tool's actual name when available (e.g. executed by ToolExecutor),\n // falling back to tool_use_id or 'unknown' for manually-constructed\n // blocks in tests.\n const fnName = b.name ?? b.tool_use_id ?? 'unknown';\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n const userParts: GeminiPart[] = [...textParts];\n // Include function responses as parts of the user turn — Gemini's API\n // accepts functionResponse blocks inline with text in a single user role.\n // This handles the case where a user message consists only of tool_result\n // blocks (no text): without this, the turn is silently dropped.\n if (functionParts.length > 0) userParts.push(...functionParts);\n if (userParts.length > 0) out.push({ role: 'user', parts: userParts });\n }\n return out;\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate Gemini's `:streamGenerateContent?alt=sse` wire format into\n * canonical StreamEvent[]. Each chunk is a full `data: <json>` line with\n * `candidates[0].content.parts` containing either text or complete\n * functionCall objects — Gemini does not stream partial JSON for tool\n * arguments, so we emit tool_use_start + tool_use_stop together.\n */\nasync function* parseGoogleStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n // Gemini does not have a `tool_use`/`tool_calls` finish reason — turns\n // that contain functionCall parts come back with `finishReason: \"STOP\"`,\n // which normalizes to `end_turn` and would otherwise make the agent\n // loop exit instead of executing the tool. Track whether we saw any\n // function call so we can force-override the stop reason at message_stop.\n let sawFunctionCall = false;\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<{\n modelVersion?: string | undefined;\n candidates?: GeminiCandidate[] | undefined;\n usageMetadata?: {\n promptTokenCount?: number | undefined;\n candidatesTokenCount?: number | undefined;\n cachedContentTokenCount?: number | undefined;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (obj.modelVersion) model = obj.modelVersion;\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'text_delta', text: part.text };\n } else if (part.functionCall) {\n const name = part.functionCall.name;\n if (typeof name !== 'string' || name.length === 0) continue;\n sawFunctionCall = true;\n const id = randomUUID();\n yield { type: 'tool_use_start', id, name };\n // Stash the opaque thought_signature so it can be echoed back on\n // the next request. Without this the Gemini API rejects with 400\n // \"Function call is missing a thought_signature in functionCall\n // parts\" on thinking models.\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n yield {\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n };\n }\n }\n\n if (candidate?.finishReason) {\n stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see openai.ts for rationale. Gemini reports\n // `promptTokenCount` as the TOTAL (including cached) and\n // `cachedContentTokenCount` as the cached subset; subtracting keeps\n // cost / hit-ratio math correct.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? usage.input + cached;\n usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (started) {\n // Force `tool_use` when we saw any functionCall part — Gemini reports\n // `finishReason: \"STOP\"` for tool-call turns, which would otherwise\n // become `end_turn` and short-circuit the agent loop.\n const finalStop: StopReason = sawFunctionCall ? 'tool_use' : stopReason;\n yield { type: 'message_stop', stopReason: finalStop, usage };\n }\n}\n","/**\n * `openai-codex` wire family — the ChatGPT-backend Responses API.\n *\n * This is the transport used by \"Sign in with ChatGPT\" (OAuth) credentials.\n * It speaks the OpenAI **Responses** wire format (NOT chat/completions) and\n * targets `https://chatgpt.com/backend-api/codex/responses`, authenticating\n * with the OAuth access token + `chatgpt-account-id` header. It deliberately\n * leaves the API-key `openai` family (api.openai.com/chat/completions)\n * untouched — the two coexist as separate providers.\n *\n * Token lifecycle: the access token is short-lived. This adapter refreshes it\n * transparently — before a request when it is near expiry, and once more on a\n * 401 — using the stored refresh token, then invokes `onRefresh` so the CLI\n * can persist the rotated tokens back to the vault.\n *\n * The refresh endpoint + client id are duplicated here (rather than imported\n * from the CLI) to respect the package layering: `providers` must not depend\n * on `cli`. They are tiny constants that match the CLI login module.\n */\n\nimport {\n type Capabilities,\n ProviderError,\n type Request,\n type StopReason,\n type StreamEvent,\n safeParse,\n type Usage,\n} from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { messagesToResponsesInput, toolsToResponses } from './tool-format/to-responses.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n// ── OAuth refresh constants (mirror packages/cli auth-menu/openai-codex-oauth) ─\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst TOKEN_URL = 'https://auth.openai.com/oauth/token';\nconst JWT_CLAIM_PATH = 'https://api.openai.com/auth';\nconst DEFAULT_CODEX_BASE = 'https://chatgpt.com/backend-api';\n/** Refresh this many ms before the token's stated expiry. */\nconst REFRESH_SKEW_MS = 60_000;\n\nexport interface CodexOAuthTokens {\n access: string;\n refresh: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Refresh an expired Codex access token using its refresh token. */\nexport async function refreshCodexAccessToken(\n refreshToken: string,\n signal?: AbortSignal,\n): Promise<CodexOAuthTokens> {\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }).toString(),\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(30_000)])\n : AbortSignal.timeout(30_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Codex token refresh failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n } | null;\n if (!json?.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n throw new Error('Codex token refresh response missing fields');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n };\n}\n\n/** Extract `chatgpt_account_id` from an access-token JWT, or null. */\nexport function extractAccountId(token: string): string | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(Buffer.from(parts[1]!, 'base64url').toString('utf8')) as Record<\n string,\n unknown\n >;\n const auth = payload[JWT_CLAIM_PATH] as { chatgpt_account_id?: string } | undefined;\n const id = auth?.chatgpt_account_id;\n return typeof id === 'string' && id.length > 0 ? id : null;\n } catch {\n return null;\n }\n}\n\n// ── Provider ────────────────────────────────────────────────────────────────\n\nexport interface CodexCredentials {\n /** The OAuth access token (a JWT). */\n accessToken: string;\n /** The refresh token, used to mint a new access token before/at expiry. */\n refreshToken?: string | undefined;\n /** Access-token expiry, epoch ms. When absent, refresh only fires on 401. */\n expiresAt?: number | undefined;\n /** Cached ChatGPT account id. Re-derived from the live token when missing. */\n accountId?: string | undefined;\n}\n\nexport interface OpenAICodexProviderOptions {\n credentials: CodexCredentials;\n baseUrl?: string | undefined;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n /**\n * Persist rotated tokens after a successful refresh. The CLI wires this to\n * write back to the encrypted config so the new access/refresh pair survive\n * the session.\n */\n onRefresh?:\n | ((creds: {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n accountId: string | undefined;\n }) => void)\n | undefined;\n /** Override the refresh call (tests). */\n refreshFn?:\n | ((refreshToken: string, signal?: AbortSignal) => Promise<CodexOAuthTokens>)\n | undefined;\n /**\n * Reasoning effort for the Codex (gpt-5.x) reasoning models. Sent as\n * `reasoning.effort` with `summary: 'auto'` so chain-of-thought streams back\n * as thinking deltas. Default 'medium'. Set 'none' to omit reasoning entirely.\n */\n reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | undefined;\n}\n\nexport class OpenAICodexProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private access: string;\n private refresh: string | undefined;\n private expiresAt: number | undefined;\n private accountId: string | undefined;\n private readonly onRefresh: OpenAICodexProviderOptions['onRefresh'];\n private readonly refreshFn: (\n refreshToken: string,\n signal?: AbortSignal,\n ) => Promise<CodexOAuthTokens>;\n private readonly reasoningEffort: 'none' | 'minimal' | 'low' | 'medium' | 'high';\n\n constructor(opts: OpenAICodexProviderOptions) {\n super(\n opts.credentials.accessToken,\n opts.baseUrl ?? DEFAULT_CODEX_BASE,\n opts.fetchImpl,\n opts.streamOpts,\n );\n this.id = opts.id ?? 'openai-codex';\n this.access = opts.credentials.accessToken;\n this.refresh = opts.credentials.refreshToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.accountId = opts.credentials.accountId ?? extractAccountId(this.access) ?? undefined;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshCodexAccessToken;\n this.reasoningEffort = opts.reasoningEffort ?? 'medium';\n this.capabilities = capabilitiesForFamily('openai-codex', { ...opts.capabilities });\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* super.stream(req, opts);\n } catch (err) {\n // A 401 means the token went stale between the pre-flight check and the\n // request (or we had no expiry to check). Refresh once and retry — the\n // error is thrown before any StreamEvent is emitted, so no output is\n // duplicated.\n if (err instanceof ProviderError && err.status === 401 && this.refresh) {\n await this.doRefresh(opts.signal);\n yield* super.stream(req, opts);\n return;\n }\n throw err;\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n if (this.expiresAt !== undefined && Date.now() < this.expiresAt - REFRESH_SKEW_MS) return;\n await this.doRefresh(signal);\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n const t = await this.refreshFn(this.refresh, signal);\n this.access = t.access;\n this.refresh = t.refresh;\n this.expiresAt = t.expires;\n this.accountId = extractAccountId(t.access) ?? this.accountId;\n this.onRefresh?.({\n accessToken: t.access,\n refreshToken: t.refresh,\n expiresAt: t.expires,\n accountId: this.accountId,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n return resolveCodexUrl(this.baseUrl);\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(_req),\n authorization: `Bearer ${this.access}`,\n originator: 'wrongstack',\n 'OpenAI-Beta': 'responses=experimental',\n };\n if (this.accountId) headers['chatgpt-account-id'] = this.accountId;\n return headers;\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const instructions =\n req.system && req.system.length > 0\n ? req.system.map((b) => b.text).join('\\n\\n')\n : 'You are a helpful assistant.';\n\n const body: Record<string, unknown> = {\n model: req.model,\n // The ChatGPT Codex backend rejects `store: true` (\"Store must be set to\n // false\"). We send the full conversation as `input` each turn.\n store: false,\n stream: true,\n instructions,\n input: messagesToResponsesInput(req.messages),\n include: ['reasoning.encrypted_content'],\n parallel_tool_calls: true,\n };\n\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToResponses(req.tools);\n body['tool_choice'] = mapToolChoice(req.toolChoice);\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (this.reasoningEffort !== 'none') {\n body['reasoning'] = { effort: this.reasoningEffort, summary: 'auto' };\n }\n return body;\n }\n\n protected override parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseCodexResponsesStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n}\n\n// ── URL + tool-choice helpers ────────────────────────────────────────────────\n\n/** Normalize a base URL to the `/codex/responses` endpoint. */\nexport function resolveCodexUrl(baseUrl: string | undefined): string {\n const raw = baseUrl && baseUrl.trim().length > 0 ? baseUrl : DEFAULT_CODEX_BASE;\n const normalized = raw.replace(/\\/+$/, '');\n if (normalized.endsWith('/codex/responses')) return normalized;\n if (normalized.endsWith('/codex')) return `${normalized}/responses`;\n return `${normalized}/codex/responses`;\n}\n\nfunction mapToolChoice(\n choice: Request['toolChoice'],\n): 'auto' | 'required' | 'none' | { type: 'function'; name: string } {\n if (choice === undefined) return 'auto';\n if (choice === 'auto' || choice === 'required' || choice === 'none') return choice;\n return { type: 'function', name: choice.name };\n}\n\n// ── Responses SSE → StreamEvent ──────────────────────────────────────────────\n\ninterface ResponsesUsage {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n}\n\nasync function* parseCodexResponsesStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let started = false;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let sawToolUse = false;\n\n // Currently-streaming function call (Responses streams one item at a time).\n let toolCallId: string | undefined;\n let toolArgBuf = '';\n\n const ensureStart = (): StreamEvent | undefined => {\n if (started) return undefined;\n started = true;\n return { type: 'message_start', model };\n };\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const evt = parsed.value;\n const type = typeof evt['type'] === 'string' ? (evt['type'] as string) : '';\n\n switch (type) {\n case 'response.created':\n case 'response.in_progress': {\n const resp = evt['response'] as { model?: string } | undefined;\n if (typeof resp?.model === 'string') model = resp.model;\n const s = ensureStart();\n if (s) yield s;\n break;\n }\n\n case 'response.output_item.added': {\n const s = ensureStart();\n if (s) yield s;\n const item = evt['item'] as\n | { type?: string; id?: string; call_id?: string; name?: string; arguments?: string }\n | undefined;\n if (!item) break;\n if (item.type === 'reasoning') {\n yield { type: 'thinking_start' };\n } else if (item.type === 'function_call') {\n toolCallId = item.call_id ?? item.id ?? `call_${Math.random().toString(36).slice(2)}`;\n toolArgBuf = item.arguments ?? '';\n sawToolUse = true;\n yield { type: 'tool_use_start', id: toolCallId, name: item.name ?? 'unknown' };\n if (toolArgBuf.length > 0) {\n yield { type: 'tool_use_input_delta', id: toolCallId, partial: toolArgBuf };\n }\n }\n // item.type === 'message' → text flows via output_text.delta\n break;\n }\n\n case 'response.output_text.delta':\n case 'response.refusal.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (delta) yield { type: 'text_delta', text: delta };\n break;\n }\n\n case 'response.reasoning_text.delta':\n case 'response.reasoning_summary_text.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (delta) yield { type: 'thinking_delta', text: delta };\n break;\n }\n\n case 'response.function_call_arguments.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (toolCallId && delta) {\n toolArgBuf += delta;\n yield { type: 'tool_use_input_delta', id: toolCallId, partial: delta };\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n // Final arguments authoritative — captured at output_item.done below.\n const args =\n typeof evt['arguments'] === 'string' ? (evt['arguments'] as string) : undefined;\n if (args !== undefined) toolArgBuf = args;\n break;\n }\n\n case 'response.output_item.done': {\n const item = evt['item'] as\n | { type?: string; id?: string; call_id?: string; name?: string; arguments?: string }\n | undefined;\n if (!item) break;\n if (item.type === 'reasoning') {\n yield { type: 'thinking_stop' };\n } else if (item.type === 'function_call') {\n const id = item.call_id ?? toolCallId ?? `call_${Math.random().toString(36).slice(2)}`;\n const raw = item.arguments && item.arguments.length > 0 ? item.arguments : toolArgBuf;\n yield { type: 'tool_use_stop', id, input: parseToolInput(raw || '{}') };\n toolCallId = undefined;\n toolArgBuf = '';\n }\n break;\n }\n\n case 'response.completed':\n case 'response.incomplete': {\n const resp = evt['response'] as { status?: string; usage?: ResponsesUsage } | undefined;\n if (resp?.usage) usage = normalizeUsage(resp.usage);\n stopReason = mapResponsesStatus(resp?.status, sawToolUse);\n break;\n }\n\n case 'error':\n case 'response.failed': {\n const message =\n (evt['message'] as string | undefined) ??\n (evt['response'] as { error?: { message?: string } } | undefined)?.error?.message ??\n 'Codex response failed';\n throw new ProviderError(message, 502, true, 'openai-codex', {\n body: { message },\n });\n }\n\n default:\n break;\n }\n }\n\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n\nfunction normalizeUsage(u: ResponsesUsage): Usage {\n const cached = u.input_tokens_details?.cached_tokens ?? 0;\n const total = u.input_tokens ?? 0;\n return {\n input: Math.max(0, total - cached),\n output: u.output_tokens ?? 0,\n cacheRead: cached || undefined,\n };\n}\n\nfunction mapResponsesStatus(status: string | undefined, sawToolUse: boolean): StopReason {\n if (status === 'incomplete') return 'max_tokens';\n // 'completed' (and anything else benign) → tool_use when a call was emitted.\n return sawToolUse ? 'tool_use' : 'end_turn';\n}\n","/**\n * Canonical WrongStack messages/tools → OpenAI **Responses** API wire shapes.\n *\n * Used by the `openai-codex` family (ChatGPT backend). The Responses API takes\n * a flat `input` array of typed items rather than chat/completions `messages`:\n * - user text/image → { role:'user', content:[{type:'input_text'|'input_image', ...}] }\n * - assistant prose → { type:'message', role:'assistant', content:[{type:'output_text', ...}] }\n * - assistant tool call → { type:'function_call', call_id, name, arguments }\n * - tool result → { type:'function_call_output', call_id, output }\n *\n * `thinking` blocks are intentionally dropped from the input: replaying them\n * would require the opaque `reasoning.encrypted_content` blob (which we don't\n * persist), and omitting them — plus omitting function-call item ids — sidesteps\n * the Responses reasoning/tool-call pairing validation entirely.\n */\n\nimport type {\n ContentBlock,\n ImageBlock,\n Message,\n TextBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire } from '@wrongstack/core';\n\nexport interface ResponsesTool {\n type: 'function';\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n strict: boolean;\n}\n\nconst _toolCache = new WeakMap<Tool[], ResponsesTool[]>();\n\nexport function toolsToResponses(tools: Tool[]): ResponsesTool[] {\n const hit = _toolCache.get(tools);\n if (hit) return hit;\n const result = tools.map((t): ResponsesTool => {\n const compact = compactToolDefinitionForWire(t);\n return {\n type: 'function',\n name: compact.name,\n description: compact.description,\n parameters: compact.inputSchema,\n strict: false,\n };\n });\n _toolCache.set(tools, result);\n return result;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction imageUrl(b: ImageBlock): string {\n return b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n}\n\nexport function messagesToResponsesInput(messages: Message[]): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n const blocks = normalizeContent(msg.content);\n\n if (msg.role === 'user') {\n // Tool results ride inside user turns in the canonical format. Emit them\n // as standalone function_call_output items first (order-independent here).\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n for (const r of toolResults) {\n out.push({\n type: 'function_call_output',\n call_id: r.tool_use_id,\n output: typeof r.content === 'string' ? r.content : JSON.stringify(r.content),\n });\n }\n\n const others = blocks.filter((b) => b.type !== 'tool_result');\n if (others.length > 0) {\n const content = others\n .map((b): Record<string, unknown> | null => {\n if (b.type === 'text') return { type: 'input_text', text: b.text };\n if (b.type === 'image') {\n return { type: 'input_image', detail: 'auto', image_url: imageUrl(b) };\n }\n return null;\n })\n .filter((c): c is Record<string, unknown> => c !== null);\n if (content.length > 0) out.push({ role: 'user', content });\n }\n } else if (msg.role === 'assistant') {\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n\n const text = textBlocks.map((b) => b.text).join('');\n if (text.length > 0) {\n out.push({\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n status: 'completed',\n });\n }\n\n for (const u of toolUses) {\n out.push({\n type: 'function_call',\n call_id: u.id,\n name: u.name,\n arguments: JSON.stringify(u.input ?? {}),\n });\n }\n }\n }\n\n return out;\n}\n","import type { Request } from '@wrongstack/core';\nimport type { Capabilities } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nexport interface CompatibilityQuirks {\n stripCacheControl?: boolean | undefined;\n systemAsMessage?: boolean | undefined;\n flattenContentToString?: boolean | undefined;\n preserveToolCallIds?: boolean | undefined;\n parallelToolsDisabled?: boolean | undefined;\n jsonArgumentsBuggy?: boolean | undefined;\n emptyToolCallContent?: 'null' | 'empty_string' | undefined;\n thinkingParam?: 'zai-glm' | 'kimi-toggle' | 'always-on' | undefined;\n}\n\nconst VALID_QUIRK_KEYS = new Set<keyof CompatibilityQuirks>([\n 'stripCacheControl',\n 'systemAsMessage',\n 'flattenContentToString',\n 'preserveToolCallIds',\n 'parallelToolsDisabled',\n 'jsonArgumentsBuggy',\n 'emptyToolCallContent',\n 'thinkingParam',\n]);\n\nexport function isCompatibilityQuirks(value: unknown): value is CompatibilityQuirks {\n if (value === undefined) return true;\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const obj = value as Record<string, unknown>;\n for (const [key, v] of Object.entries(obj)) {\n if (!VALID_QUIRK_KEYS.has(key as keyof CompatibilityQuirks)) return false;\n if (key === 'emptyToolCallContent') {\n if (v !== 'null' && v !== 'empty_string') return false;\n } else if (key === 'thinkingParam') {\n if (v !== 'zai-glm' && v !== 'kimi-toggle' && v !== 'always-on') return false;\n } else if (typeof v !== 'boolean') {\n return false;\n }\n }\n return true;\n}\n\nexport interface OpenAICompatibleOptions {\n id: string;\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string> | undefined;\n quirks?: CompatibilityQuirks | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n fetchImpl?: typeof fetch | undefined;\n /**\n * Optional override for URL construction. Receives the base URL and request,\n * returns the full URL to use. Allows custom providers with non-standard\n * URL structures (e.g. Google with model-in-path, Anthropic with /v1/messages).\n */\n urlOverride?: ((baseUrl: string, req: Request) => string) | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n private readonly extraHeaders?: Record<string, string> | undefined;\n private readonly urlOverride?: ((baseUrl: string, req: Request) => string) | undefined;\n\n constructor(opts: OpenAICompatibleOptions) {\n super({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetchImpl: opts.fetchImpl,\n id: opts.id,\n capabilities: capabilitiesForFamily('openai-compatible', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n }),\n quirks: opts.quirks,\n streamOpts: opts.streamOpts,\n });\n this.extraHeaders = opts.headers;\n this.urlOverride = opts.urlOverride;\n }\n\n protected override buildUrl(req: Request): string {\n if (this.urlOverride) {\n return this.urlOverride(this.baseUrl, req);\n }\n return super.buildUrl(req);\n }\n\n /**\n * Compatible endpoints (Groq, Together, Mistral, local servers, …) follow the\n * classic Chat Completions contract and accept `max_tokens`; many reject\n * OpenAI's newer `max_completion_tokens`. Keep the legacy field here. See #10.\n */\n protected override tokenLimitParam(): string {\n return 'max_tokens';\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body = super.buildBody(req);\n applyThinkingParams(body, req, this.opts.quirks?.thinkingParam);\n return body;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.extraHeaders,\n };\n }\n}\n\nfunction applyThinkingParams(\n body: Record<string, unknown>,\n req: Request,\n mode: CompatibilityQuirks['thinkingParam'],\n): void {\n if (!mode || !req.reasoning) return;\n if (mode === 'always-on') {\n // Models such as kimi-k2.7-code reject explicit disabled thinking.\n return;\n }\n if (req.reasoning.enabled === false) {\n body['thinking'] = { type: 'disabled' };\n return;\n }\n if (mode === 'kimi-toggle' && req.reasoning.enabled === true) {\n body['thinking'] = { type: 'enabled' };\n }\n if (mode === 'zai-glm' && req.reasoning.effort) {\n body['reasoning_effort'] = mapZaiReasoningEffort(req.reasoning.effort);\n }\n}\n\nfunction mapZaiReasoningEffort(effort: NonNullable<Request['reasoning']>['effort']): string | undefined {\n switch (effort) {\n case 'none':\n case 'minimal':\n return 'none';\n case 'low':\n case 'medium':\n return 'high';\n case 'xhigh':\n return 'max';\n default:\n return effort;\n }\n}\n","import type {\n Capabilities,\n Provider,\n ProviderFactory,\n Request,\n StreamEvent,\n WireFamily,\n} from '@wrongstack/core';\nimport type { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { type SSEMessage, parseSSE } from './sse.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n/**\n * Declarative wire-format definition. Sufficient to add a new HTTP+SSE\n * provider without subclassing `WireAdapter` — the boilerplate (HTTP errors,\n * abort wiring, SSE body parsing) is shared.\n *\n * The shape covers the variation that actually matters between providers:\n * - URL template (path, query)\n * - Auth headers (x-api-key, Authorization, etc.)\n * - Request body (field names, system-prompt placement, tool format)\n * - SSE event translation (one wire event → 0+ canonical events)\n *\n * Anything more exotic (non-SSE streams, multipart bodies, OAuth flows) still\n * needs a hand-written subclass — those cases are too varied to template.\n *\n * `S` is provider-internal state threaded across SSE events for one stream:\n * accumulating partial tool-call JSON, tracking block kinds, carrying the\n * model id forward from `message_start`, etc. Each `stream()` call gets a\n * fresh `S` via `createStreamState`.\n */\nexport interface WireFormatConfig<S = Record<string, unknown>> {\n /** Provider id (matches catalog id when the provider is in models.dev). */\n id: string;\n /** Wire family — used by the registry's factory list. */\n family: WireFamily;\n capabilities: Capabilities;\n /** Used when the user doesn't override via config.baseUrl. */\n defaultBaseUrl: string;\n /** Build the HTTPS endpoint. Receives the (possibly user-overridden) base URL. */\n buildUrl(baseUrl: string, req: Request): string;\n /** Per-request headers. Default `content-type`/`accept` are provided already. */\n buildHeaders(apiKey: string, req: Request): Record<string, string>;\n /** Map a canonical Request onto the provider's body shape. */\n buildBody(req: Request): Record<string, unknown>;\n /** Construct fresh per-stream state. Called once per `stream()` call. */\n createStreamState(fallbackModel: string): S;\n /**\n * Translate one SSE event into 0+ canonical events. Mutating `state` is\n * expected — providers carry per-stream accumulators (partial tool JSON,\n * current model id, usage) here.\n */\n parseStreamEvent(msg: SSEMessage, state: S): StreamEvent[];\n /**\n * Optional: yield any final events after the upstream stream closes\n * (e.g. emit a synthetic `message_stop` when the wire format ends with\n * `[DONE]` instead of an explicit terminator).\n */\n finalizeStream?(state: S): StreamEvent[];\n /** Optional override; defaults to the shared HTTP error parser. */\n normalizeError?(status: number, body: string): ProviderError;\n}\n\n/**\n * Concrete Provider built from a declarative config. Extends WireAdapter to\n * inherit the canonical HTTP + abort + error machinery.\n */\nexport class WireFormatProvider<S = Record<string, unknown>> extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n private readonly cfg: WireFormatConfig<S>;\n\n constructor(\n cfg: WireFormatConfig<S>,\n opts: {\n apiKey: string;\n baseUrl?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n },\n ) {\n super(opts.apiKey, opts.baseUrl ?? cfg.defaultBaseUrl, opts.fetchImpl, opts.streamOpts);\n this.id = cfg.id;\n this.capabilities = cfg.capabilities;\n this.cfg = cfg;\n }\n\n protected override buildUrl(req: Request): string {\n return this.cfg.buildUrl(this.baseUrl, req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.cfg.buildHeaders(this.apiKey, req),\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n return this.cfg.buildBody(req);\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return this.runStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, body: string): ProviderError {\n return this.cfg.normalizeError\n ? this.cfg.normalizeError(status, body)\n : parseProviderHttpError(this.id, status, body);\n }\n\n private async *runStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n const state = this.cfg.createStreamState(fallbackModel);\n for await (const msg of parseSSE(body)) {\n for (const ev of this.cfg.parseStreamEvent(msg, state)) {\n yield ev;\n }\n }\n if (this.cfg.finalizeStream) {\n for (const ev of this.cfg.finalizeStream(state)) {\n yield ev;\n }\n }\n }\n}\n\n/**\n * Identity helper that gives authors type checking on the config literal.\n * Use at module level:\n *\n * export const myProvider = defineWireFormat({\n * id: 'mistral',\n * family: 'openai-compatible',\n * capabilities: { ... },\n * ...\n * });\n */\nexport function defineWireFormat<S = Record<string, unknown>>(\n cfg: WireFormatConfig<S>,\n): WireFormatConfig<S> {\n return cfg;\n}\n\nexport interface WireFactoryOptions {\n /**\n * Optional config-time override of the API key. When omitted, the factory\n * reads `cfg.apiKey` (passed in at create time by the registry / config\n * loader). Setting this here is useful in tests.\n */\n apiKey?: string | undefined;\n /** Override the base URL at factory build time. */\n baseUrl?: string | undefined;\n}\n\n/**\n * Build a `ProviderFactory` from a declarative wire-format. Plug into\n * `ProviderRegistry.register(...)` or use in `buildProviderFactoriesFromRegistry`\n * for catalog-driven discovery.\n */\nexport function createWireFormatFactory(\n cfg: WireFormatConfig,\n opts: WireFactoryOptions = {},\n): ProviderFactory {\n return {\n type: cfg.id,\n family: cfg.family,\n create: (rawCfg: unknown): Provider => {\n const c = rawCfg as { apiKey?: string | undefined; baseUrl?: string | undefined };\n const apiKey = opts.apiKey ?? c.apiKey;\n if (!apiKey) {\n throw new Error(`Provider \"${cfg.id}\" requires an apiKey.`);\n }\n return new WireFormatProvider(cfg, {\n apiKey,\n baseUrl: opts.baseUrl ?? c.baseUrl,\n });\n },\n };\n}\n","/**\n * Mistral provider as a declarative wire-format config — a 50-line proof\n * that adding a new OpenAI-flavored provider doesn't require subclassing.\n *\n * Mistral's streaming chat completion API is OpenAI-compatible at the wire\n * level, with `delta.content` + `delta.tool_calls` + `[DONE]` terminator.\n * For exotic providers the same pattern still applies — only the\n * `parseStreamEvent` body changes.\n */\nimport type { Request, StopReason, StreamEvent } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface MistralStreamState {\n model: string;\n started: boolean;\n // OpenAI-style tool_call accumulators keyed by `index`\n toolCalls: Map<\n number,\n { id?: string | undefined; name?: string | undefined; partial: string; emittedStart: boolean; emittedArgLength: number }\n >;\n}\n\nexport const mistralWireFormat = defineWireFormat<MistralStreamState>({\n id: 'mistral',\n family: 'openai-compatible',\n capabilities: capabilitiesForFamily('openai-compatible', {\n jsonMode: true,\n maxContext: 128_000,\n }),\n defaultBaseUrl: 'https://api.mistral.ai/v1',\n buildUrl: (base) => `${base.replace(/\\/+$/, '')}/chat/completions`,\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages),\n max_tokens: req.maxTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n started: false,\n toolCalls: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n model?: string | undefined;\n choices?: {\n delta?: {\n content?: string | undefined;\n tool_calls?: {\n index: number;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }[];\n };\n finish_reason?: string | undefined;\n }[];\n usage?: { prompt_tokens?: number | undefined; completion_tokens?: number | undefined };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const out: StreamEvent[] = [];\n if (ev.model) state.model = ev.model;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n const choice = ev.choices?.[0];\n if (choice?.delta?.content) {\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n for (const tc of choice?.delta?.tool_calls ?? []) {\n let block = state.toolCalls.get(tc.index);\n if (!block) {\n block = {\n id: tc.id,\n name: tc.function?.name,\n partial: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolCalls.set(tc.index, block);\n } else {\n if (tc.id && !block.id) block.id = tc.id;\n if (tc.function?.name && !block.name) block.name = tc.function.name;\n }\n const arg = tc.function?.arguments;\n if (arg) {\n block.partial += arg;\n }\n if (!block.emittedStart && block.id && block.name) {\n block.emittedStart = true;\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n if (block.emittedStart && block.id && block.emittedArgLength < block.partial.length) {\n const partial = block.partial.slice(block.emittedArgLength);\n block.emittedArgLength = block.partial.length;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial });\n }\n }\n if (choice?.finish_reason) {\n // Close out tool calls with parsed JSON\n for (const block of state.toolCalls.values()) {\n if (block.id && block.name) {\n if (!block.emittedStart) {\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n out.push({\n type: 'tool_use_stop',\n id: block.id,\n input: parseToolInput(block.partial),\n });\n }\n }\n out.push({\n type: 'message_stop',\n stopReason: mapStopReason(choice.finish_reason),\n usage: {\n input: ev.usage?.prompt_tokens ?? 0,\n output: ev.usage?.completion_tokens ?? 0,\n },\n });\n }\n return out;\n },\n});\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'tool_calls':\n return 'tool_use';\n case 'length':\n case 'model_length':\n return 'max_tokens';\n case 'stop':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","/**\n * Anthropic provider expressed as a declarative `WireFormatConfig`.\n *\n * The existing `AnthropicProvider` class stays as the production path until\n * the rest of the registry switches over — both produce the same canonical\n * StreamEvent[]. The per-message logic here is extracted verbatim from\n * `parseAnthropicStream` in `../anthropic.ts`, just split into a stateful\n * `parseStreamEvent` call instead of an async generator loop.\n */\nimport type { Message, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeAnthropic } from '../stop-reason.js';\nimport { toolsToAnthropic } from '../tool-format/to-anthropic.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ntype BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\n\ninterface AnthropicStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n stopped: boolean;\n blocks: Map<number, { kind: BlockKind; id?: string | undefined; name?: string | undefined; partial: string }>;\n}\n\nconst DEFAULT_VERSION = '2023-06-01';\n\nexport const anthropicWireFormat = defineWireFormat<AnthropicStreamState>({\n id: 'anthropic',\n family: 'anthropic',\n capabilities: capabilitiesForFamily('anthropic'),\n defaultBaseUrl: 'https://api.anthropic.com',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/v\\d+\\/messages$/.test(b)) return b;\n if (/\\/v\\d+$/.test(b)) return `${b}/messages`;\n return `${b}/v1/messages`;\n },\n buildHeaders: (apiKey) => ({\n 'x-api-key': apiKey,\n 'anthropic-version': DEFAULT_VERSION,\n }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: req.messages.map((m: Message) => ({\n role: m.role === 'system' ? 'user' : m.role,\n content: m.content,\n })),\n stream: true,\n };\n if (req.system && req.system.length > 0) body['system'] = req.system;\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n stopped: false,\n blocks: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const type = String(ev['type'] ?? msg.event);\n const out: StreamEvent[] = [];\n\n switch (type) {\n case 'message_start': {\n const message = ev['message'] as\n | {\n model?: string | undefined;\n usage?: {\n input_tokens?: number | undefined;\n cache_read_input_tokens?: number | undefined;\n cache_creation_input_tokens?: number | undefined;\n };\n }\n | undefined;\n if (message?.model) state.model = message.model;\n state.usage = {\n input: message?.usage?.input_tokens ?? 0,\n output: 0,\n cacheRead: message?.usage?.cache_read_input_tokens,\n cacheWrite: message?.usage?.cache_creation_input_tokens,\n };\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n break;\n }\n case 'content_block_start': {\n const index = Number(ev['index'] ?? 0);\n const cb = ev['content_block'] as { type?: string | undefined; id?: string | undefined; name?: string | undefined } | undefined;\n if (cb?.type === 'tool_use') {\n state.blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\n if (cb.id && cb.name) {\n out.push({ type: 'tool_use_start', id: cb.id, name: cb.name });\n }\n } else if (cb?.type === 'text') {\n state.blocks.set(index, { kind: 'text', partial: '' });\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\n state.blocks.set(index, { kind: 'thinking', partial: '' });\n out.push({ type: 'thinking_start' });\n } else {\n state.blocks.set(index, { kind: 'unknown', partial: '' });\n }\n break;\n }\n case 'content_block_delta': {\n const index = Number(ev['index'] ?? 0);\n const delta = ev['delta'] as\n | {\n type?: string | undefined;\n text?: string | undefined;\n partial_json?: string | undefined;\n thinking?: string | undefined;\n signature?: string | undefined;\n }\n | undefined;\n const block = state.blocks.get(index);\n if (!block || !delta) break;\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\n out.push({ type: 'text_delta', text: delta.text });\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\n if (block.id) {\n block.partial += delta.partial_json;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json });\n }\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\n out.push({ type: 'thinking_delta', text: delta.thinking });\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\n out.push({ type: 'thinking_signature', signature: delta.signature });\n }\n break;\n }\n case 'content_block_stop': {\n const index = Number(ev['index'] ?? 0);\n const block = state.blocks.get(index);\n if (block?.kind === 'tool_use' && block.id) {\n const input = parseToolInput(block.partial);\n out.push({ type: 'tool_use_stop', id: block.id, input });\n } else if (block?.kind === 'thinking') {\n out.push({ type: 'thinking_stop' });\n }\n break;\n }\n case 'message_delta': {\n const delta = ev['delta'] as { stop_reason?: string | null | undefined } | undefined;\n const u = ev['usage'] as { output_tokens?: number | undefined } | undefined;\n if (delta?.stop_reason !== undefined) {\n state.stopReason = normalizeAnthropic(delta.stop_reason);\n }\n if (u?.output_tokens !== undefined) {\n state.usage = { ...state.usage, output: u.output_tokens };\n }\n break;\n }\n case 'message_stop':\n state.stopped = true;\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n break;\n case 'error': {\n const err = ev['error'] as { message?: string | undefined; type?: string | undefined } | undefined;\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\n body: { type: err?.type, message: err?.message },\n });\n }\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n // If upstream closed without an explicit `message_stop` we synthesize\n // one so the consumer's stream-end logic still fires.\n if (state.started && !state.stopped) {\n return [{ type: 'message_stop', stopReason: state.stopReason, usage: state.usage }];\n }\n return [];\n },\n});\n","/**\n * OpenAI provider as a declarative `WireFormatConfig`. Same canonical events\n * as `OpenAIProvider`; the per-message body is the loop body of\n * `parseOpenAIStream` split into a stateful step.\n */\nimport type { Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeOpenAI } from '../stop-reason.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface OpenAIStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n textOpen: boolean;\n thinkingOpen: boolean;\n toolByIndex: Map<\n number,\n { id?: string | undefined; name?: string | undefined; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >;\n finalEmitted: boolean;\n}\n\nexport const openaiWireFormat = defineWireFormat<OpenAIStreamState>({\n id: 'openai',\n family: 'openai',\n capabilities: capabilitiesForFamily('openai'),\n defaultBaseUrl: 'https://api.openai.com/v1',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(b)) return b;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(b)) return `${b}/chat/completions`;\n return `${b}/v1/chat/completions`;\n },\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages),\n // Real OpenAI requires `max_completion_tokens`; newer model families\n // (gpt-4o, o1/o3/o4) 400 on the deprecated `max_tokens`. See issue #10.\n max_completion_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n textOpen: false,\n thinkingOpen: false,\n toolByIndex: new Map(),\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (typeof obj['model'] === 'string') state.model = obj['model'] as string;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null | undefined;\n reasoning_content?: string | undefined;\n reasoning?: string | undefined;\n tool_calls?: Array<{\n index?: number | undefined;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }>;\n };\n finish_reason?: string | null | undefined;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode, OpenRouter `reasoning`)\n // streams chain-of-thought as `delta.reasoning_content` at the top of\n // the delta. The full blob MUST be echoed back as message-level\n // `reasoning_content` on the next request — otherwise DeepSeek 400s.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!state.thinkingOpen) {\n state.thinkingOpen = true;\n out.push({ type: 'thinking_start' });\n }\n out.push({ type: 'thinking_delta', text: reasoningDelta });\n }\n\n if (choice?.delta?.content) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n if (!state.textOpen) state.textOpen = true;\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n\n if (choice?.delta?.tool_calls) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = state.toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n state.textOpen = false;\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n out.push({\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number | undefined;\n completion_tokens?: number | undefined;\n prompt_tokens_details?: { cached_tokens?: number | undefined };\n prompt_cache_hit_tokens?: number | undefined;\n prompt_cache_miss_tokens?: number | undefined;\n }\n | undefined;\n if (u) {\n // Mirror openai.ts: disjoint semantics: input is fresh-only,\n // cacheRead is the cached subset. Subtracting prevents the cost\n // calc / cache-hit-ratio from double-counting cached tokens.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : state.usage.input + cached);\n state.usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted) return [];\n state.finalEmitted = true;\n const out: StreamEvent[] = [];\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const entry of state.toolByIndex.values()) {\n if (!entry.id || !entry.name) continue;\n if (!entry.emittedStart) {\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n const input = parseToolInput(entry.argBuf);\n out.push({ type: 'tool_use_stop', id: entry.id, input });\n }\n if (state.started) {\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n }\n return out;\n },\n});\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","import { randomUUID } from 'node:crypto';\n/**\n * Google Gemini provider as a declarative `WireFormatConfig`. Matches the\n * `GoogleProvider` class behavior — same canonical events, same handling\n * of `thoughtSignature` and forced `tool_use` stop reason on functionCall\n * turns.\n */\nimport type { Message, Request, StopReason, StreamEvent, Tool, Usage } from '@wrongstack/core';\nimport { compactToolDefinitionForWire, safeParse } from '@wrongstack/core';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeGemini } from '../stop-reason.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface GeminiPart {\n text?: string | undefined;\n functionCall?: { name: string | undefined; args: Record<string, unknown> };\n functionResponse?: { name: string | undefined; response: { content?: unknown | undefined } };\n inlineData?: { mimeType: string | undefined; data: string };\n thoughtSignature?: string | undefined;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent | undefined;\n finishReason?: string | undefined;\n}\n\ninterface GoogleStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n sawFunctionCall: boolean;\n finalEmitted: boolean;\n}\n\nexport const googleWireFormat = defineWireFormat<GoogleStreamState>({\n id: 'google',\n family: 'google',\n capabilities: capabilitiesForFamily('google'),\n defaultBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n buildUrl: (base, req) =>\n `${base}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`,\n buildHeaders: (apiKey) => ({ 'x-goog-api-key': apiKey }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n sawFunctionCall: false,\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n modelVersion?: string | undefined;\n candidates?: GeminiCandidate[] | undefined;\n usageMetadata?: {\n promptTokenCount?: number | undefined;\n candidatesTokenCount?: number | undefined;\n cachedContentTokenCount?: number | undefined;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (obj.modelVersion) state.model = obj.modelVersion;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n out.push({ type: 'text_delta', text: part.text });\n } else if (part.functionCall) {\n const name = part.functionCall.name;\n if (typeof name !== 'string' || name.length === 0) continue;\n state.sawFunctionCall = true;\n const id = `${name}_${randomUUID().slice(0, 8)}`;\n out.push({ type: 'tool_use_start', id, name });\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n out.push({\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n });\n }\n }\n\n if (candidate?.finishReason) {\n state.stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see google.ts for rationale.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? state.usage.input + cached;\n state.usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted || !state.started) return [];\n state.finalEmitted = true;\n const finalStop: StopReason = state.sawFunctionCall ? 'tool_use' : state.stopReason;\n return [{ type: 'message_stop', stopReason: finalStop, usage: state.usage }];\n },\n});\n\nfunction buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n parameters: sanitizeSchemaForGemini(compact.inputSchema) ?? {\n type: 'object',\n properties: {},\n },\n };\n });\n}\n\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) return undefined;\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const fnName = b.name ?? b.tool_use_id;\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n if (textParts.length > 0) out.push({ role: 'user', parts: textParts });\n if (functionParts.length > 0) out.push({ role: 'function', parts: functionParts });\n }\n return out;\n}\n","import type { Capabilities, CustomModelDefinition, ModelsRegistry } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\n\n/**\n * Resolve capabilities for a (provider, model) pair using the family default\n * as a baseline and overlaying per-model facts from the ModelsRegistry.\n *\n * Priority chain (highest first):\n * 1. customModels[modelId].capabilities — user-defined per-model overrides\n * 2. model facts from registry — sub-fields AND-ed with base\n * 3. family default — e.g. 32K for openai-compatible\n */\nexport async function capabilitiesFor(\n registry: ModelsRegistry,\n providerId: string,\n modelId: string,\n customModels?: Record<string, CustomModelDefinition>,\n): Promise<Capabilities> {\n const provider = await registry.getProvider(providerId);\n const base = capabilitiesForFamily(provider?.family ?? 'unsupported');\n\n // User-defined custom model overrides take top priority when present.\n const customDef = customModels?.[modelId];\n const customCaps = customDef?.capabilities;\n\n const model = await registry.getModel(providerId, modelId);\n\n // Without any model info at all, return base (possibly with custom overrides).\n if (!model && !customCaps) return { ...base };\n\n // maxContext resolution:\n // 1. customCaps.maxContext — user explicitly overrides\n // 2. model.capabilities.maxContext — registry getModel()\n // 3. raw model limit.context — direct provider.models fallback\n // 4. base.maxContext — family default\n const rawModel = provider?.models.find((m) => m.id === modelId);\n const catalogMaxContext =\n model?.capabilities.maxContext ||\n rawModel?.limit?.context ||\n rawModel?.limit?.output ||\n base.maxContext;\n\n // Per-field priority: customCaps (if set) → model facts AND-ed with base → base.\n // AND-ing with base is conservative: a model can't have a capability the\n // wire family doesn't support. Custom overrides skip this guard because\n // the user explicitly opted in.\n const modelTools = model?.capabilities.tools ?? false;\n const modelVision = model?.capabilities.vision ?? false;\n const modelReasoning = model?.capabilities.reasoning ?? false;\n\n return {\n ...base,\n // Capability booleans: AND model facts with base unless custom overrides\n tools: customCaps?.tools ?? (modelTools && base.tools),\n parallelTools: customCaps?.parallelTools ?? (modelTools && base.parallelTools),\n vision: customCaps?.vision ?? (modelVision && base.vision),\n reasoning: customCaps?.reasoning ?? modelReasoning,\n // Scalar fields: custom override wins, then catalog, then base\n maxContext: customCaps?.maxContext ?? catalogMaxContext,\n streaming: customCaps?.streaming ?? base.streaming,\n promptCache: customCaps?.promptCache ?? base.promptCache,\n systemPrompt: customCaps?.systemPrompt ?? base.systemPrompt,\n jsonMode: customCaps?.jsonMode ?? base.jsonMode,\n cacheControl: customCaps?.cacheControl ?? base.cacheControl,\n };\n}\n","import type { ContentBlock } from '@wrongstack/core';\nimport { isPlainObject } from '../object-utils.js';\n\ninterface AnthropicBlock {\n type: string;\n text?: string | undefined;\n id?: string | undefined;\n name?: string | undefined;\n input?: unknown | undefined;\n content?: unknown | undefined;\n tool_use_id?: string | undefined;\n is_error?: boolean | undefined;\n thinking?: string | undefined;\n signature?: string | undefined;\n source?: {\n type?: 'base64' | 'url' | undefined;\n media_type?: string | undefined;\n data?: string | undefined;\n url?: string | undefined;\n };\n}\n\nexport interface FromAnthropicOptions {\n /**\n * Called once for each block whose `type` the converter doesn't recognize.\n * The block is still dropped — this hook only exists so callers can wire\n * it into observability (event bus, logger) instead of silently losing\n * data. Anthropic ships new block types over time (`thinking`,\n * `server_tool_use`, etc.) and we want a way to find out without\n * inflating the conversion logic itself.\n */\n onUnsupported?: (type: string, block: AnthropicBlock) => void;\n}\n\nexport function contentFromAnthropic(\n blocks: AnthropicBlock[],\n opts: FromAnthropicOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && typeof b.text === 'string') {\n out.push({ type: 'text', text: b.text });\n } else if (b.type === 'tool_use' && b.id && b.name) {\n const input = isPlainObject(b.input) ? b.input : {};\n out.push({ type: 'tool_use', id: b.id, name: b.name, input });\n } else if (b.type === 'tool_result' && b.tool_use_id) {\n out.push({\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: normalizeToolResultContent(b.content, opts),\n is_error: b.is_error,\n });\n } else if (b.type === 'thinking' && typeof b.thinking === 'string') {\n // Anthropic extended-thinking block. Must round-trip on the next\n // request — without it Anthropic returns 400 \"content[].thinking\n // in the thinking mode must be passed back to the API\".\n out.push({\n type: 'thinking',\n thinking: b.thinking,\n ...(b.signature ? { signature: b.signature } : {}),\n });\n } else if (b.type === 'image' && b.source) {\n const src = b.source;\n const kind = src.type === 'url' ? 'url' : 'base64';\n out.push({\n type: 'image',\n source: {\n type: kind,\n ...(src.media_type ? { media_type: src.media_type } : {}),\n ...(src.data ? { data: src.data } : {}),\n ...(src.url ? { url: src.url } : {}),\n },\n });\n } else if (b.type) {\n opts.onUnsupported?.(b.type, b);\n }\n }\n return out;\n}\n\n/**\n * Convert Anthropic's tool_result content to our canonical string format.\n * Anthropic ships tool_result.content as either a plain string or an array\n * of `{ type: 'text', text }` / `{ type: 'image', source }` sub-blocks.\n * We flatten sub-block arrays to a string so the canonical type stays `string`.\n * If the caller needs the raw array structure (e.g. for image preservation),\n * they should call `contentFromAnthropic` directly on the raw Anthropic block\n * instead of going through a ToolResultBlock.\n */\nfunction normalizeToolResultContent(raw: unknown, opts: FromAnthropicOptions): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) {\n // Flatten sub-block structure to a text representation.\n // Callers who need the full structure should use contentFromAnthropic\n // directly on the raw Anthropic block before constructing a ToolResultBlock.\n const blocks = contentFromAnthropic(raw as AnthropicBlock[], opts);\n return blocks.map((b) => (b.type === 'text' ? b.text : `[${b.type}]`)).join('');\n }\n if (raw === undefined || raw === null) return '';\n return JSON.stringify(raw);\n}\n\n","import { randomUUID } from 'node:crypto';\nimport type { ContentBlock, ToolUseBlock } from '@wrongstack/core';\nimport { sanitizeJsonString } from '@wrongstack/core';\nimport type { OpenAIToolCall } from './to-openai.js';\n\nexport interface OpenAIChoice {\n message: {\n role: string;\n content: string | null;\n tool_calls?: OpenAIToolCall[] | undefined;\n };\n finish_reason: string | null;\n}\n\nexport interface FromOpenAIOptions {\n /**\n * Deprecated: the sanitizer fallback is now always attempted. Kept for\n * backward compatibility; the value is ignored.\n * TODO(breaking): remove in next major release.\n */\n jsonArgumentsBuggy?: boolean | undefined;\n /**\n * Called when a tool call's `arguments` field can't be parsed even after\n * the sanitizer pass. Callers can use this to emit a structured event,\n * log it, or surface it in a UI. The block is still appended with\n * `{ __raw_arguments }` so the tool gets *something* to fail on, but\n * silently producing garbage input is the kind of bug that wastes\n * debugging hours — this is the hook to find out.\n */\n onParseFailure?: (info: { toolName: string; toolCallId: string; raw: string }) => void;\n}\n\nexport function contentFromOpenAI(\n choice: OpenAIChoice,\n opts: FromOpenAIOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n const text = choice.message.content;\n // Preserve any non-empty text, including whitespace-only — model output\n // sometimes legitimately starts with a newline or padding spaces. Only\n // skip the truly empty case to avoid duplicate empty blocks.\n if (typeof text === 'string' && text.length > 0) {\n out.push({ type: 'text', text });\n }\n for (const tc of choice.message.tool_calls ?? []) {\n const raw = tc.function.arguments ?? '{}';\n // Some OpenAI-compatible servers omit `id` on tool calls. An empty id\n // breaks tool_result correlation downstream, so synthesize a stable one\n // — matching the streaming path and the Google adapter.\n const id = tc.id || `call_${randomUUID()}`;\n const input = parseToolArguments(raw, tc.function.name, id, opts);\n const block: ToolUseBlock = {\n type: 'tool_use',\n id,\n name: tc.function.name,\n input,\n };\n out.push(block);\n }\n if (out.length === 0) {\n out.push({ type: 'text', text: '' });\n }\n return out;\n}\n\nfunction parseToolArguments(\n raw: string,\n toolName: string,\n toolCallId: string,\n opts: FromOpenAIOptions,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n // Salvage case: parsed value is a string (scalar) but contains a serialized JSON object.\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n // JSON parsed but is a scalar/array — wrap so the tool gets a stable\n // object shape, but flag it as a parse anomaly so callers can detect.\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n } catch {\n // First-pass failed — try the sanitizer (handles trailing commas,\n // JS-style comments, smart quotes the model sometimes emits).\n const sanitized = sanitizeJsonString(raw);\n if (sanitized !== null) {\n try {\n const parsed = JSON.parse(sanitized) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n } catch {\n // fall through\n }\n }\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n }\n}\n","import { expectDefined } from '@wrongstack/core';\nimport type {\n Logger,\n ModelsRegistry,\n Provider,\n ProviderApiKey,\n ProviderConfig,\n ProviderFactory,\n ResolvedProvider,\n WireFamily,\n} from '@wrongstack/core';\nimport { ERROR_CODES, WrongStackError } from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { AnthropicOAuthProvider } from './anthropic-oauth.js';\nimport { GitHubCopilotProvider } from './github-copilot.js';\nimport { GoogleProvider } from './google.js';\nimport { OpenAICodexProvider } from './openai-codex.js';\nimport {\n type CompatibilityQuirks,\n isCompatibilityQuirks,\n OpenAICompatibleProvider,\n} from './openai-compatible.js';\nimport { OpenAIProvider } from './openai.js';\nexport { AnthropicProvider, type AnthropicProviderOptions } from './anthropic.js';\nexport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\nexport {\n OpenAICompatibleProvider,\n type OpenAICompatibleOptions,\n type CompatibilityQuirks,\n} from './openai-compatible.js';\nexport { GoogleProvider, type GoogleProviderOptions } from './google.js';\nexport {\n OpenAICodexProvider,\n type OpenAICodexProviderOptions,\n type CodexCredentials,\n type CodexOAuthTokens,\n refreshCodexAccessToken,\n extractAccountId,\n resolveCodexUrl,\n} from './openai-codex.js';\nexport {\n AnthropicOAuthProvider,\n type AnthropicOAuthProviderOptions,\n type AnthropicOAuthCredentials,\n type AnthropicOAuthTokens,\n refreshAnthropicOAuthToken,\n CLAUDE_CODE_SYSTEM_PROMPT,\n} from './anthropic-oauth.js';\nexport {\n GitHubCopilotProvider,\n type GitHubCopilotProviderOptions,\n type CopilotCredentials,\n type CopilotTokenResult,\n refreshCopilotToken,\n copilotBaseUrlFromToken,\n} from './github-copilot.js';\nexport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\nexport {\n isDebugStreamEnabled,\n setDebugStreamEnabled,\n setDebugStreamCallback,\n pushDebugChunkStats,\n defaultDebugStreamCallback,\n type DebugStreamStats,\n type DebugStreamCallback,\n} from './stream-debug-state.js';\nexport {\n WireFormatProvider,\n defineWireFormat,\n createWireFormatFactory,\n type WireFormatConfig,\n type WireFactoryOptions,\n} from './wire-format.js';\nexport { mistralWireFormat } from './presets/mistral.js';\nexport { anthropicWireFormat } from './presets/anthropic.js';\nexport { openaiWireFormat } from './presets/openai.js';\nexport { googleWireFormat } from './presets/google.js';\nexport { capabilitiesFor } from './capabilities.js';\nexport { capabilitiesForFamily, CAPABILITIES_BY_FAMILY } from './family-capabilities.js';\nexport { parseProviderHttpError } from './error-parse.js';\nexport { normalizeAnthropic, normalizeOpenAI } from './stop-reason.js';\nexport { toolsToAnthropic } from './tool-format/to-anthropic.js';\nexport { contentFromAnthropic } from './tool-format/from-anthropic.js';\nexport {\n toolsToOpenAI,\n messagesToOpenAI,\n type OpenAIMessage,\n type OpenAIToolCall,\n type ConvertOptions,\n} from './tool-format/to-openai.js';\nexport { contentFromOpenAI, type OpenAIChoice } from './tool-format/from-openai.js';\n\nexport interface BuildFactoriesOptions {\n registry: ModelsRegistry;\n /** Used to log unsupported families during boot. */\n log?: Logger | undefined;\n}\n\n/** Rotated-token payload handed to the OAuth persister after a refresh. */\nexport interface OAuthRefreshedTokens {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n /** ChatGPT account id (codex only); undefined for other OAuth families. */\n accountId?: string | undefined;\n}\n\n/** @deprecated use OAuthRefreshedTokens */\nexport type CodexRefreshedTokens = OAuthRefreshedTokens;\n\n/**\n * Module-level hook so refreshed OAuth tokens (openai-codex, anthropic-oauth, …)\n * can be persisted back to the encrypted config WITHOUT threading a\n * vault/configPath through every provider-construction site. The CLI installs\n * this once at boot. When unset (tests, headless tools), refresh still works\n * in-memory for the session — only cross-session persistence is skipped.\n */\nlet _oauthPersist: ((providerId: string, creds: OAuthRefreshedTokens) => void) | undefined;\n\nexport function setOAuthTokenPersister(\n fn: ((providerId: string, creds: OAuthRefreshedTokens) => void) | undefined,\n): void {\n _oauthPersist = fn;\n}\n\n/** @deprecated use setOAuthTokenPersister */\nexport const setCodexTokenPersister = setOAuthTokenPersister;\n\n/**\n * Build one ProviderFactory per provider known to models.dev. The factory's\n * `create(cfg)` resolves the wire-family at construction time and returns the\n * matching transport. Unsupported families return a stub that throws when\n * complete() is called, so the system can still boot.\n */\nexport async function buildProviderFactoriesFromRegistry(\n opts: BuildFactoriesOptions,\n): Promise<ProviderFactory[]> {\n const providers = await opts.registry.listProviders();\n const factories: ProviderFactory[] = [];\n const unsupported: ResolvedProvider[] = [];\n\n for (const p of providers) {\n if (p.family === 'unsupported') {\n unsupported.push(p);\n continue;\n }\n factories.push({\n type: p.id,\n family: p.family,\n create: (cfg: ProviderConfig) => makeProvider(p, cfg),\n });\n }\n\n // Generic factories so users can hand-roll a provider not in models.dev.\n factories.push({\n type: 'openai-compatible',\n family: 'openai-compatible',\n create: (cfg) =>\n new OpenAICompatibleProvider({\n id: 'openai-compatible',\n apiKey: requireKey(cfg),\n baseUrl: cfg.baseUrl ?? '',\n headers: cfg.headers,\n quirks: validateQuirks('openai-compatible', cfg.quirks),\n }),\n });\n\n if (unsupported.length > 0 && opts.log) {\n // Debug-only: the user already knows their plan; only surface when\n // troubleshooting why a specific provider isn't selectable.\n opts.log.info(\n `${unsupported.length} provider(s) need a plugin (unsupported wire family): ` +\n unsupported.map((p) => p.id).join(', '),\n );\n }\n\n return factories;\n}\n\n/**\n * Resolve the active API key from a ProviderConfig. Prefers `apiKeys[]`\n * (using `activeKey` to select), falls back to the legacy `apiKey` field.\n * This avoids reading `cfg.apiKey` directly, which may be absent after\n * `writeKeysBack` clears it to prevent serialization leaks.\n */\nfunction resolveActiveKey(cfg: ProviderConfig): string | undefined {\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\n const active = cfg.activeKey\n ? cfg.apiKeys.find((k) => k.label === cfg.activeKey)\n : undefined;\n return (active ?? cfg.apiKeys[0])?.apiKey;\n }\n return cfg.apiKey && cfg.apiKey.length > 0 ? cfg.apiKey : undefined;\n}\n\n/** Resolve the full active key ENTRY (not just the string) — needed by OAuth\n * families that carry refresh tokens / expiry / account id alongside the key. */\nfunction resolveActiveKeyEntry(cfg: ProviderConfig): ProviderApiKey | undefined {\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\n const active = cfg.activeKey\n ? cfg.apiKeys.find((k) => k.label === cfg.activeKey)\n : undefined;\n return active ?? cfg.apiKeys[0];\n }\n return undefined;\n}\n\nfunction makeProvider(p: ResolvedProvider, cfg: ProviderConfig): Provider {\n // Config overrides the catalog. This is the path that lets users wire\n // up internal proxies / self-hosted endpoints without needing models.dev.\n const family: WireFamily = cfg.family ?? p.family;\n const envVars = cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars;\n const apiKey = resolveActiveKey(cfg) ?? readFromEnv(envVars);\n if (!apiKey && family !== 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" requires an API key. Set ${\n envVars.join(' or ') || 'apiKey in config'\n } or run \\`wstack auth ${p.id}\\`.`,\n );\n }\n const baseUrl = cfg.baseUrl ?? p.apiBase;\n\n if (!family || family === 'unsupported') {\n if (family === 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" uses an unsupported wire family (${p.npm ?? 'unknown'}). ` +\n `Register a custom factory via a plugin to enable it.`,\n );\n }\n throw new Error(\n `Provider \"${p.id}\" has no wire family configured. ` +\n `Set an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") in config or the models.dev catalog.`,\n );\n }\n\n switch (family) {\n case 'anthropic':\n return new AnthropicProvider({ apiKey: expectDefined(apiKey), baseUrl });\n case 'openai':\n return new OpenAIProvider({\n apiKey: expectDefined(apiKey),\n baseUrl,\n id: p.id,\n quirks: validateQuirks(p.id, cfg.quirks),\n });\n case 'openai-compatible':\n return new OpenAICompatibleProvider({\n id: p.id,\n apiKey: expectDefined(apiKey),\n baseUrl: baseUrl ?? '',\n headers: cfg.headers,\n quirks: validateQuirks(p.id, cfg.quirks),\n });\n case 'openai-codex': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new OpenAICodexProvider({\n id: p.id,\n baseUrl,\n credentials: {\n accessToken: expectDefined(apiKey),\n refreshToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n accountId: entry?.accountId,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'anthropic-oauth': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new AnthropicOAuthProvider({\n id: p.id,\n baseUrl,\n credentials: {\n accessToken: expectDefined(apiKey),\n refreshToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'github-copilot': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new GitHubCopilotProvider({\n id: p.id,\n credentials: {\n copilotToken: resolveActiveKey(cfg) ?? '',\n githubToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'google':\n return new GoogleProvider({ id: p.id, apiKey: expectDefined(apiKey), baseUrl });\n default:\n throw new Error(`Unknown provider family: ${String(family)}`);\n }\n}\n\n/**\n * Build a Provider purely from config — no models.dev lookup at all.\n * Used for user-defined providers and offline operation.\n */\nexport function makeProviderFromConfig(id: string, cfg: ProviderConfig): Provider {\n if (!cfg.family) {\n throw new Error(\n `Provider \"${id}\" needs an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") when not in the models.dev catalog.`,\n );\n }\n const synthetic: ResolvedProvider = {\n id,\n name: id,\n family: cfg.family,\n apiBase: cfg.baseUrl,\n envVars: cfg.envVars ?? [],\n models: (cfg.models ?? []).map((m) => ({ id: m, name: m })),\n npm: undefined,\n };\n return makeProvider(synthetic, cfg);\n}\n\nfunction readFromEnv(vars: string[]): string | undefined {\n for (const v of vars) {\n const val = process.env[v];\n if (val) return val;\n }\n return undefined;\n}\n\nfunction requireKey(cfg: ProviderConfig): string {\n const key = resolveActiveKey(cfg);\n if (key) return key;\n throw new Error('Provider config requires apiKey (or set the corresponding env var).');\n}\n\nfunction validateQuirks(providerId: string, quirks: unknown): CompatibilityQuirks | undefined {\n if (quirks === undefined) return undefined;\n if (isCompatibilityQuirks(quirks)) return quirks;\n throw new WrongStackError({\n message: `Invalid quirks for provider \"${providerId}\". Expected CompatibilityQuirks.`,\n code: ERROR_CODES.CONFIG_INVALID,\n subsystem: 'provider',\n });\n}\n"]}
1
+ {"version":3,"sources":["../src/_tool-input.ts","../src/aggregate.ts","../src/anthropic.ts","../src/object-utils.ts","../src/error-parse.ts","../src/family-capabilities.ts","../src/sse.ts","../src/stop-reason.ts","../src/tool-format/to-anthropic.ts","../src/stream-debug-state.ts","../src/wire-adapter.ts","../src/anthropic-oauth.ts","../src/openai.ts","../src/tool-format/to-openai.ts","../src/github-copilot.ts","../src/google.ts","../src/openai-codex.ts","../src/tool-format/to-responses.ts","../src/openai-compatible.ts","../src/wire-format.ts","../src/presets/mistral.ts","../src/presets/anthropic.ts","../src/presets/openai.ts","../src/presets/google.ts","../src/capabilities.ts","../src/tool-format/from-anthropic.ts","../src/tool-format/from-openai.ts","../src/index.ts"],"names":["inString","escaped","aggregateStream","ProviderError","isNodeReadable","safeParse","DEFAULT_BASE","_cache","compactToolDefinitionForWire","REFRESH_SKEW_MS","randomUUID","normalizeContent","CLIENT_ID","TOKEN_URL","DEFAULT_VERSION","stripCacheControl","messagesToGemini","toolsToGemini","sanitizeSchemaForGemini","GEMINI_ALLOWED_KEYS","expectDefined"],"mappings":"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","file":"index.js","sourcesContent":["import { safeParse } from '@wrongstack/core';\n\n/**\n * Attempt to close an incomplete JSON object string by auto-closing braces\n * and completing any unclosed double-quoted string values. This handles the\n * common streaming truncation case where the JSON stream ends mid-object\n * (e.g. `{\"old_string\": \"line1\\nline2` without the closing `\"}` and `}`).\n *\n * Returns the completed string on best-effort, or the original if nothing\n * meaningful could be salvaged.\n */\nfunction completePartialObject(s: string): string {\n let result = s;\n\n const trimmed = result.trim();\n if (!trimmed.startsWith('{')) return s;\n\n // Close unclosed braces (up to 3 passes for nested structures).\n for (let pass = 0; pass < 3; pass++) {\n let braceDepth = 0;\n let inString = false;\n let escaped = false;\n let foundClose = true;\n\n for (const ch of result) {\n if (escaped) { escaped = false; continue; }\n if (ch === '\\\\') { escaped = true; continue; }\n if (ch === '\"') { inString = !inString; continue; }\n if (inString) continue;\n if (ch === '{') { braceDepth++; foundClose = false; }\n else if (ch === '}') {\n braceDepth--;\n if (braceDepth === 0) foundClose = true;\n }\n }\n\n if (foundClose || braceDepth <= 0) break;\n result += '}'.repeat(braceDepth);\n }\n\n // If it now parses, return the brace-closed version.\n if (safeParse(result).ok) return result;\n\n // Detect if we ended inside an unclosed string value.\n // Walk the string end looking for context.\n let inString = false;\n let escaped = false;\n for (let i = result.length - 1; i >= 0; i--) {\n const ch = result[i];\n if (escaped) { escaped = false; continue; }\n if (ch === '\\\\') { escaped = true; continue; }\n if (ch === '\"') {\n // Look at what follows this quote outside strings\n let nextNonWs: string | undefined;\n for (let j = i + 1; j < result.length; j++) {\n const nc = result[j];\n if (nc === ' ' || nc === '\\t' || nc === '\\n' || nc === '\\r') continue;\n nextNonWs = result[j];\n break;\n }\n if (nextNonWs === ':') {\n // This quote opens a key — the NEXT unescaped quote should close it\n inString = true;\n } else if (nextNonWs === ',' || nextNonWs === '}') {\n if (inString) inString = false;\n }\n }\n }\n\n // If still inside a string, close it and any unclosed braces.\n if (inString) {\n result = result.trimEnd();\n if (result.endsWith('\\\\')) result = result.slice(0, -1);\n let depth = 0;\n for (const ch of result) {\n if (ch === '{') depth++;\n else if (ch === '}') depth = Math.max(0, depth - 1);\n }\n result += '\"' + '}'.repeat(Math.max(1, depth));\n }\n\n return result;\n}\n\n/**\n * Parse a tool-call arguments JSON blob into a canonical\n * `Record<string, unknown>`.\n *\n * Why this exists: providers stream tool-call arguments as raw JSON strings\n * accumulated over multiple `delta` events. Once complete, callers want a\n * dictionary. Naive `JSON.parse` plus `as Record<string, unknown>` is unsafe\n * — a buggy provider, a proxy that rewrites payloads, or a future API change\n * can yield `null`, an array, or a number, all of which would\n * type-check fine but crash downstream tool executors that index into the\n * input by key.\n *\n * Result contract:\n * - Valid JSON object → returned as-is, typed as `Record<string, unknown>`.\n * - Valid JSON array / scalar → wrapped under `{ __raw: value }` so the\n * tool still receives an object (the executor can detect the anomaly).\n * - Invalid/truncated JSON → attempt partial JSON salvage (auto-close braces\n * and strings); if that fails, return `{ __raw: rawString }` so no\n * information is lost; the tool layer can decide whether to fail or salvage.\n * - Empty/null input → returns `{}` (the \"no arguments\" case).\n */\nexport function parseToolInput(raw: string | undefined): Record<string, unknown> {\n if (!raw) return {};\n let parsed = safeParse<unknown>(raw);\n\n // Fast path: parsed cleanly into an object\n if (parsed.ok && parsed.value && typeof parsed.value === 'object' && !Array.isArray(parsed.value)) {\n return parsed.value as Record<string, unknown>;\n }\n\n // Slow path: parse failed or didn't yield an object.\n // Attempt to salvage a truncated streaming JSON blob before giving up.\n if (!parsed.ok || parsed.value == null || typeof parsed.value !== 'object' || Array.isArray(parsed.value)) {\n const completed = completePartialObject(raw);\n parsed = safeParse<unknown>(completed);\n }\n\n if (parsed.ok && parsed.value && typeof parsed.value === 'object' && !Array.isArray(parsed.value)) {\n return parsed.value as Record<string, unknown>;\n }\n\n // Second salvage: if raw couldn't be parsed but looks like a string containing\n // a serialized JSON object (double-wrapped), unwrap it.\n const trimmed = raw.trim();\n if (trimmed.startsWith('\"') && trimmed.endsWith('\"')) {\n const unescaped = safeParse<unknown>(raw);\n if (unescaped.ok && typeof unescaped.value === 'string') {\n const inner = safeParse<unknown>(unescaped.value);\n if (inner.ok && inner.value && typeof inner.value === 'object' && !Array.isArray(inner.value)) {\n return inner.value as Record<string, unknown>;\n }\n }\n }\n\n // Salvage case: parsed value is a string (scalar) but contains a serialized\n // JSON object (common when proxies/models map OpenAI arguments string directly\n // to Anthropic input).\n if (parsed.ok && typeof parsed.value === 'string') {\n const innerTrimmed = parsed.value.trim();\n if (innerTrimmed.startsWith('{') && innerTrimmed.endsWith('}')) {\n const inner = safeParse<unknown>(innerTrimmed);\n if (inner.ok && inner.value && typeof inner.value === 'object' && !Array.isArray(inner.value)) {\n return inner.value as Record<string, unknown>;\n }\n }\n }\n\n // Give up — wrap under the sentinel key so the tool still receives an object.\n // Prefer the parsed scalar/array value (so a valid `[1,2,3]` / `42` / `\"x\"`\n // is preserved structurally); fall back to the original raw string when the\n // input couldn't be parsed at all. No information is lost either way.\n const fallback = parsed.ok ? parsed.value : undefined;\n return { __raw: fallback ?? raw };\n}","import { expectDefined } from '@wrongstack/core';\nimport type { ContentBlock, Response, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\n/**\n * Consume an `AsyncIterable<StreamEvent>` and reduce it to a non-streaming\n * `Response`. Used by `Provider.complete()` default impls so that the\n * streaming code path is the single source of truth.\n *\n * Optional `onEvent` callback fires for every event as it arrives, useful\n * for the agent loop to emit text_delta to the EventBus without writing\n * its own aggregation logic.\n */\nexport async function aggregateStream(\n stream: AsyncIterable<StreamEvent>,\n onEvent?: ((e: StreamEvent) => void) | undefined,\n): Promise<Response> {\n let model = '';\n let stopReason: StopReason = 'end_turn';\n let usage: Usage = { input: 0, output: 0 };\n // Accumulate deltas as an array of chunks; join once at content-build time.\n // This avoids O(n²) string concatenation for responses with many small deltas.\n const textBuffers: string[][] = [];\n let currentTextIndex = -1;\n const toolBuffers = new Map<\n string,\n { name: string; partial: string; input?: unknown | undefined; providerMeta?: Record<string, unknown> }\n >();\n const thinkingBuffers: Array<{\n /** Accumulated as an array of chunks; joined into a string at content-build time. */\n chunks: string[];\n signature?: string | undefined;\n providerMeta?: Record<string, unknown>;\n }> = [];\n let currentThinkingIndex = -1;\n const blockOrder: Array<\n { kind: 'text'; idx: number } | { kind: 'tool'; id: string } | { kind: 'thinking'; idx: number }\n > = [];\n\n for await (const ev of stream) {\n if (onEvent) onEvent(ev);\n switch (ev.type) {\n case 'message_start':\n model = ev.model;\n break;\n case 'text_delta':\n if (currentTextIndex === -1) {\n currentTextIndex = textBuffers.length;\n textBuffers.push([]);\n blockOrder.push({ kind: 'text', idx: currentTextIndex });\n }\n textBuffers[currentTextIndex]!.push(ev.text);\n break;\n case 'tool_use_start':\n // A tool_use block starts — close any open text block so subsequent\n // text_delta starts a new one.\n currentTextIndex = -1;\n toolBuffers.set(ev.id, { name: ev.name, partial: '' });\n blockOrder.push({ kind: 'tool', id: ev.id });\n break;\n case 'tool_use_input_delta': {\n const b = toolBuffers.get(ev.id);\n if (b) b.partial += ev.partial;\n break;\n }\n case 'tool_use_stop': {\n const b = toolBuffers.get(ev.id);\n if (b) {\n if (ev.input === undefined) {\n // No upstream input — parse from the accumulated partial buffer.\n b.input = parseToolInput(b.partial);\n } else if (typeof ev.input === 'string') {\n // Upstream gave us a raw JSON string; route through the validator.\n b.input = parseToolInput(ev.input);\n } else if (ev.input && typeof ev.input === 'object' && !Array.isArray(ev.input)) {\n b.input = ev.input;\n } else {\n // Array / scalar — preserve via __raw so downstream sees an object.\n b.input = { __raw: ev.input };\n }\n if (ev.providerMeta) b.providerMeta = ev.providerMeta;\n }\n // Tool just stopped — next text_delta should open a new text block.\n currentTextIndex = -1;\n break;\n }\n case 'thinking_start': {\n currentTextIndex = -1;\n // If a thinking block was already started by thinking_signature before\n // this event arrived (e.g. due to out-of-order delivery), reuse it so\n // signature and content end up in the same block rather than creating\n // duplicate thinking entries in the response.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n }\n // Always set providerMeta on the target block (thinking_start may carry\n // metadata even when the prior signature event did not).\n if (ev.providerMeta && currentThinkingIndex >= 0) {\n expectDefined(thinkingBuffers[currentThinkingIndex]).providerMeta = ev.providerMeta;\n }\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n break;\n }\n case 'thinking_delta': {\n // Ensure a thinking buffer exists before appending. If thinking_signature\n // created the block (currentThinkingIndex >= 0), reuse it so the\n // signature and content end up in the same buffer.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.chunks.push(ev.text);\n break;\n }\n case 'thinking_signature': {\n // Ensure a thinking buffer exists before storing the signature. This\n // handles out-of-order delivery where thinking_signature arrives before\n // thinking_start.\n if (currentThinkingIndex === -1 || !thinkingBuffers[currentThinkingIndex]) {\n currentThinkingIndex = thinkingBuffers.length;\n thinkingBuffers.push({ chunks: [] });\n blockOrder.push({ kind: 'thinking', idx: currentThinkingIndex });\n }\n const t = thinkingBuffers[currentThinkingIndex];\n if (t) t.signature = ev.signature;\n break;\n }\n case 'thinking_stop': {\n currentThinkingIndex = -1;\n break;\n }\n case 'message_stop':\n stopReason = ev.stopReason;\n usage = ev.usage;\n break;\n default:\n // Unknown SSE event — silently skip\n break;\n }\n }\n\n const content: ContentBlock[] = [];\n for (const b of blockOrder) {\n if (b.kind === 'text') {\n const text = textBuffers[b.idx]?.join('') ?? '';\n if (text) content.push({ type: 'text', text });\n } else if (b.kind === 'thinking') {\n const t = thinkingBuffers[b.idx];\n const thinkingText = t?.chunks.join('') ?? '';\n // Drop completely empty thinking blocks — emitting one would make\n // Anthropic 400 on the round-trip (\"thinking: cannot be empty\").\n if (!t || (!thinkingText && !t.signature)) continue;\n const block: ContentBlock = { type: 'thinking', thinking: thinkingText };\n if (t.signature) (block as { signature?: string | undefined }).signature = t.signature;\n if (t.providerMeta && Object.keys(t.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = t.providerMeta;\n }\n content.push(block);\n } else {\n const tb = toolBuffers.get(b.id);\n if (tb) {\n const block: ContentBlock = {\n type: 'tool_use',\n id: b.id,\n name: tb.name,\n input:\n tb.input && typeof tb.input === 'object' && !Array.isArray(tb.input)\n ? (tb.input as Record<string, unknown>)\n : {},\n };\n if (tb.providerMeta && Object.keys(tb.providerMeta).length > 0) {\n (block as { providerMeta?: Record<string, unknown> }).providerMeta = tb.providerMeta;\n }\n content.push(block);\n }\n }\n }\n if (content.length === 0) content.push({ type: 'text', text: '' });\n\n return { content, stopReason, usage, model };\n}\n","import type {\r\n CacheTtl,\r\n Capabilities,\r\n ContentBlock,\r\n Message,\r\n Request,\r\n StopReason,\r\n StreamEvent,\r\n Usage,\r\n} from '@wrongstack/core';\r\nimport { ProviderError, safeParse } from '@wrongstack/core';\r\nimport { parseToolInput } from './_tool-input.js';\r\nimport { parseProviderHttpError } from './error-parse.js';\r\nimport { capabilitiesForFamily } from './family-capabilities.js';\r\nimport { parseSSE } from './sse.js';\r\nimport { normalizeAnthropic } from './stop-reason.js';\r\nimport { toolsToAnthropic } from './tool-format/to-anthropic.js';\r\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\r\n\r\nexport interface AnthropicProviderOptions {\r\n apiKey: string;\r\n baseUrl?: string | undefined;\r\n apiVersion?: string | undefined;\r\n beta?: string[] | undefined;\r\n fetchImpl?: typeof fetch | undefined;\r\n /** Raw stream debugging and hang-detection options. */\r\n streamOpts?: WireAdapterStreamOptions | undefined;\r\n}\r\n\r\nconst DEFAULT_BASE = 'https://api.anthropic.com';\r\nconst DEFAULT_VERSION = '2023-06-01';\r\n\r\nfunction isAnthropicHost(baseUrl: string): boolean {\r\n try {\r\n const host = new URL(baseUrl).hostname.toLowerCase();\r\n return host === 'api.anthropic.com' || host.endsWith('.anthropic.com');\r\n } catch {\r\n return false;\r\n }\r\n}\r\n\r\nexport class AnthropicProvider extends WireAdapter {\r\n override readonly id: string = 'anthropic';\r\n override readonly capabilities: Capabilities = capabilitiesForFamily('anthropic');\r\n\r\n private readonly opts: AnthropicProviderOptions;\r\n\r\n constructor(opts: AnthropicProviderOptions) {\r\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\r\n this.opts = opts;\r\n }\r\n\r\n protected override buildUrl(_req: Request): string {\r\n const base = this.baseUrl.replace(/\\/+$/, '');\r\n if (/\\/v\\d+\\/messages$/.test(base)) return base;\r\n if (/\\/v\\d+$/.test(base)) return `${base}/messages`;\r\n return `${base}/v1/messages`;\r\n }\r\n\r\n protected override buildHeaders(req: Request): Record<string, string> {\r\n const headers: Record<string, string> = {\r\n ...super.buildHeaders(req),\r\n 'anthropic-version': this.opts.apiVersion ?? DEFAULT_VERSION,\r\n };\r\n if (isAnthropicHost(this.baseUrl)) {\r\n headers['x-api-key'] = this.apiKey;\r\n } else {\r\n // Third-party Anthropic-compatible proxies (kimi-for-coding,\r\n // zai-coding-plan, anyrouter, …) reject `x-api-key` and require\r\n // `Authorization: Bearer`. This mirrors Claude Code's\r\n // ANTHROPIC_AUTH_TOKEN switch — triggered automatically when the\r\n // baseUrl is not Anthropic-owned.\r\n headers['authorization'] = `Bearer ${this.apiKey}`;\r\n }\r\n if (this.opts.beta && this.opts.beta.length > 0) {\r\n headers['anthropic-beta'] = this.opts.beta.join(',');\r\n }\r\n return headers;\r\n }\r\n\r\n protected override buildBody(req: Request): Record<string, unknown> {\r\n const body: Record<string, unknown> = {\r\n model: req.model,\r\n max_tokens: req.maxTokens,\r\n messages: req.messages.map((m) => this.normalizeMessage(m)),\r\n stream: true,\r\n };\r\n if (req.system && req.system.length > 0) {\r\n const systemBlocks = req.system;\r\n body['system'] = systemBlocks.map((b, index) =>\r\n req.cache?.ttl && index === systemBlocks.length - 1\r\n ? { ...b, cache_control: { type: 'ephemeral', ttl: req.cache.ttl } }\r\n : b,\r\n );\r\n }\r\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\r\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\r\n if (req.topP !== undefined) body['top_p'] = req.topP;\r\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\r\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\r\n return body;\r\n }\r\n\r\n protected override parseStream(\r\n body: Parameters<typeof parseSSE>[0],\r\n fallbackModel: string,\r\n req: Request,\r\n ): AsyncIterable<StreamEvent> {\r\n return parseAnthropicStream(body, fallbackModel, req.cache?.ttl);\r\n }\r\n\r\n protected override translateError(status: number, text: string): ProviderError {\r\n return parseProviderHttpError(this.id, status, text);\r\n }\r\n\r\n private normalizeMessage(m: Message): Record<string, unknown> {\r\n const role = m.role === 'system' ? 'user' : m.role;\r\n if (typeof m.content === 'string') return { role, content: m.content };\r\n return { role, content: m.content.map((b) => sanitizeAnthropicBlock(b)) };\r\n }\r\n}\r\n\r\n/**\r\n * Reduce a canonical ContentBlock to exactly the fields the Anthropic Messages\r\n * API accepts. The canonical blocks carry extra fields for other wires that\r\n * Anthropic rejects with 400 \"Extra inputs are not permitted\":\r\n * - `tool_result.name` — set by ToolExecutor for Google's functionResponse\r\n * - `tool_use.providerMeta` — e.g. Gemini thought-signatures\r\n * - `thinking.providerMeta` — provider-specific metadata\r\n */\r\nfunction sanitizeAnthropicBlock(b: ContentBlock): Record<string, unknown> {\r\n switch (b.type) {\r\n case 'text':\r\n return b.cache_control\r\n ? { type: 'text', text: b.text, cache_control: b.cache_control }\r\n : { type: 'text', text: b.text };\r\n case 'tool_use':\r\n return { type: 'tool_use', id: b.id, name: b.name, input: b.input };\r\n case 'tool_result': {\r\n const out: Record<string, unknown> = {\r\n type: 'tool_result',\r\n tool_use_id: b.tool_use_id,\r\n content: b.content,\r\n };\r\n if (b.is_error) out['is_error'] = true;\r\n return out;\r\n }\r\n case 'thinking':\r\n return b.signature\r\n ? { type: 'thinking', thinking: b.thinking, signature: b.signature }\r\n : { type: 'thinking', thinking: b.thinking };\r\n case 'image':\r\n return { type: 'image', source: b.source };\r\n default:\r\n return b as never as Record<string, unknown>;\r\n }\r\n}\r\n\r\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\r\n\r\n/**\r\n * Translate Anthropic's SSE wire format into canonical StreamEvent[].\r\n *\r\n * Block indices ↔ canonical event ids:\r\n * - text blocks emit text_delta with no id\r\n * - tool_use blocks: content_block_start carries the toolu_xxx id, and\r\n * subsequent input_json_delta chunks accumulate the JSON arg string.\r\n *\r\n * usage.input_tokens arrives in message_start; output_tokens lands in\r\n * message_delta.usage.\r\n */\r\nasync function* parseAnthropicStream(\r\n body: Response2Body,\r\n fallbackModel: string,\r\n cacheTtl: CacheTtl | undefined,\r\n): AsyncIterable<StreamEvent> {\r\n type BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\r\n const blocks = new Map<\r\n number,\r\n { kind: BlockKind; id?: string | undefined; name?: string | undefined; partial: string }\r\n >();\r\n let model = fallbackModel;\r\n let usage: Usage = { input: 0, output: 0 };\r\n let stopReason: StopReason = 'end_turn';\r\n let started = false;\r\n let stopped = false;\r\n\r\n for await (const msg of parseSSE(body)) {\r\n if (!msg.data || msg.data === '[DONE]') continue;\r\n const parsed = safeParse<Record<string, unknown>>(msg.data);\r\n if (!parsed.ok || !parsed.value) continue;\r\n const ev = parsed.value;\r\n const type = String(ev['type'] ?? msg.event);\r\n\r\n switch (type) {\r\n case 'message_start': {\r\n const message = ev['message'] as\r\n | {\r\n model?: string | undefined;\r\n usage?: {\r\n input_tokens?: number | undefined;\r\n cache_read_input_tokens?: number | undefined;\r\n cache_creation_input_tokens?: number | undefined;\r\n };\r\n }\r\n | undefined;\r\n if (message?.model) model = message.model;\r\n const cacheWrite = message?.usage?.cache_creation_input_tokens;\r\n usage = {\r\n input: message?.usage?.input_tokens ?? 0,\r\n output: 0,\r\n cacheRead: message?.usage?.cache_read_input_tokens,\r\n cacheWrite,\r\n cacheWrite5m: cacheTtl === '1h' ? undefined : cacheWrite,\r\n cacheWrite1h: cacheTtl === '1h' ? cacheWrite : undefined,\r\n };\r\n if (!started) {\r\n started = true;\r\n yield { type: 'message_start', model };\r\n }\r\n break;\r\n }\r\n case 'content_block_start': {\r\n const index = Number(ev['index'] ?? 0);\r\n const cb = ev['content_block'] as { type?: string | undefined; id?: string | undefined; name?: string | undefined } | undefined;\r\n if (cb?.type === 'tool_use') {\r\n blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\r\n if (cb.id && cb.name) {\r\n yield { type: 'tool_use_start', id: cb.id, name: cb.name };\r\n }\r\n } else if (cb?.type === 'text') {\r\n blocks.set(index, { kind: 'text', partial: '' });\r\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\r\n // Anthropic extended thinking. The model emits an opening\r\n // `content_block_start` with type `thinking` (or\r\n // `redacted_thinking` when content was hidden from us), then\r\n // streams `thinking_delta` and a single `signature_delta`.\r\n // Both the text AND the signature must round-trip to the next\r\n // request — without the signature Anthropic returns 400.\r\n blocks.set(index, { kind: 'thinking', partial: '' });\r\n yield { type: 'thinking_start' };\r\n } else {\r\n blocks.set(index, { kind: 'unknown', partial: '' });\r\n }\r\n break;\r\n }\r\n case 'content_block_delta': {\r\n const index = Number(ev['index'] ?? 0);\r\n const delta = ev['delta'] as\r\n | {\r\n type?: string | undefined;\r\n text?: string | undefined;\r\n partial_json?: string | undefined;\r\n thinking?: string | undefined;\r\n signature?: string | undefined;\r\n data?: string | undefined;\r\n }\r\n | undefined;\r\n const block = blocks.get(index);\r\n if (!block || !delta) break;\r\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\r\n yield { type: 'text_delta', text: delta.text };\r\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\r\n if (block.id) {\r\n block.partial += delta.partial_json;\r\n yield { type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json };\r\n }\r\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\r\n yield { type: 'thinking_delta', text: delta.thinking };\r\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\r\n yield { type: 'thinking_signature', signature: delta.signature };\r\n }\r\n break;\r\n }\r\n case 'content_block_stop': {\r\n const index = Number(ev['index'] ?? 0);\r\n const block = blocks.get(index);\r\n if (block?.kind === 'tool_use' && block.id) {\r\n const input = parseToolInput(block.partial);\r\n yield { type: 'tool_use_stop', id: block.id, input };\r\n } else if (block?.kind === 'thinking') {\r\n yield { type: 'thinking_stop' };\r\n }\r\n break;\r\n }\r\n case 'message_delta': {\r\n const delta = ev['delta'] as { stop_reason?: string | null | undefined } | undefined;\r\n const u = ev['usage'] as { output_tokens?: number | undefined } | undefined;\r\n if (delta?.stop_reason !== undefined) {\r\n stopReason = normalizeAnthropic(delta.stop_reason);\r\n }\r\n if (u?.output_tokens !== undefined) usage = { ...usage, output: u.output_tokens };\r\n break;\r\n }\r\n case 'message_stop':\r\n stopped = true;\r\n yield { type: 'message_stop', stopReason, usage };\r\n break;\r\n case 'error': {\r\n const err = ev['error'] as { message?: string | undefined; type?: string | undefined } | undefined;\r\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\r\n body: { type: err?.type, message: err?.message },\r\n });\r\n }\r\n default:\r\n // Unknown SSE event type from deserialized JSON — silently skip\r\n break;\r\n }\r\n }\r\n if (started && !stopped) {\r\n yield { type: 'message_stop', stopReason, usage };\r\n }\r\n}\r\n","export function isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n","import { ProviderError } from '@wrongstack/core';\nimport type { ProviderErrorBody } from '@wrongstack/core';\nimport { isPlainObject } from './object-utils.js';\n\n/**\n * Provider HTTP error bodies come in three or four shapes depending on\n * vendor. Rather than dump the raw JSON into the error message (which is\n * what was shipped to the user log before this module existed), we parse\n * out the fields we care about — `type`, `message`, `requestId` — and put\n * them on `ProviderError.body` for `describe()` and downstream rendering.\n *\n * The function is intentionally tolerant: anything we can't parse falls\n * back to a truncated raw string, never throws.\n */\nexport function parseProviderHttpError(\n providerId: string,\n status: number,\n rawText: string,\n): ProviderError {\n const body = parseBody(rawText);\n const retryable = isRetryable(status, body.type);\n const message = `${providerId} HTTP ${status}`;\n return new ProviderError(message, status, retryable, providerId, { body });\n}\n\nconst RAW_TRUNCATE_AT = 2000;\n\nfunction parseBody(rawText: string): ProviderErrorBody {\n const raw = rawText.slice(0, RAW_TRUNCATE_AT);\n // Surface truncation so downstream renderers (CLI error formatter, log\n // exporter) can show a \"(truncated, N more bytes)\" suffix instead of\n // silently dropping the rest of the provider's error tail.\n const body: ProviderErrorBody =\n rawText.length > RAW_TRUNCATE_AT\n ? { raw, truncated: true, rawLength: rawText.length }\n : { raw };\n if (!rawText.trim()) return body;\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(rawText);\n } catch {\n return body;\n }\n if (!isPlainObject(parsed)) return body;\n\n // Anthropic / MiniMax / Kimi: { type: \"error\", error: { type, message }, request_id }\n // OpenAI / OpenAI-compatible: { error: { message, type, code, param } }\n // Google: { error: { code, message, status } }\n const errField = parsed['error'];\n if (isPlainObject(errField)) {\n const t = stringOf(errField['type']) ?? stringOf(errField['status']);\n const m = stringOf(errField['message']);\n if (t) body.type = t;\n if (m) body.message = m;\n } else if (typeof errField === 'string') {\n body.message = errField;\n }\n // Top-level fields some providers use directly\n if (!body.type) {\n const t = stringOf(parsed['type']);\n if (t && t !== 'error') body.type = t;\n }\n if (!body.message) {\n const m = stringOf(parsed['message']);\n if (m) body.message = m;\n }\n\n // request_id (Anthropic), id (some compatible providers)\n const reqId =\n stringOf(parsed['request_id']) ?? stringOf(parsed['requestId']) ?? stringOf(parsed['id']);\n if (reqId) body.requestId = reqId;\n\n return body;\n}\n\n/**\n * Retryability is mostly driven by HTTP status, but provider-specific\n * `type` strings let us catch retryable conditions that don't have a\n * dedicated status code (e.g. Anthropic's `overloaded_error` is 529 but\n * we also retry it when wrapped in a 503).\n */\nfunction isRetryable(status: number, type?: string): boolean {\n if (status === 0) return true; // network error\n if (status === 408 || status === 429 || status === 529) return true;\n if (status >= 500 && status < 600) return true;\n if (type === 'overloaded_error' || type === 'rate_limit_error') return true;\n return false;\n}\n\nfunction stringOf(v: unknown): string | undefined {\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n}\n","import type { Capabilities, WireFamily } from '@wrongstack/core';\n\nexport const CAPABILITIES_BY_FAMILY: Record<WireFamily, Capabilities> = {\n anthropic: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n openai: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n 'openai-compatible': {\n tools: true,\n parallelTools: true,\n vision: false,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n // Claude Pro/Max via OAuth (Sign in with Claude). Same wire as anthropic.\n 'anthropic-oauth': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: false,\n maxContext: 200_000,\n cacheControl: 'native',\n },\n // GitHub Copilot subscription (OpenAI chat/completions-compatible wire).\n 'github-copilot': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 128_000,\n cacheControl: 'auto',\n },\n // ChatGPT-backend Responses API (Sign in with ChatGPT / Codex subscription).\n 'openai-codex': {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: true,\n systemPrompt: true,\n jsonMode: false,\n reasoning: true,\n maxContext: 272_000,\n cacheControl: 'auto',\n },\n google: {\n tools: true,\n parallelTools: true,\n vision: true,\n streaming: true,\n promptCache: false,\n systemPrompt: true,\n jsonMode: true,\n reasoning: false,\n maxContext: 1_000_000,\n cacheControl: 'none',\n },\n unsupported: {\n tools: false,\n parallelTools: false,\n vision: false,\n streaming: false,\n promptCache: false,\n systemPrompt: false,\n jsonMode: false,\n reasoning: false,\n maxContext: 0,\n cacheControl: 'none',\n },\n};\n\nexport function capabilitiesForFamily(\n family: WireFamily,\n overrides: Partial<Capabilities> = {},\n): Capabilities {\n return {\n ...(CAPABILITIES_BY_FAMILY[family] ?? CAPABILITIES_BY_FAMILY.unsupported),\n ...overrides,\n };\n}\n","/**\n * Minimal Server-Sent Events parser for HTTP streaming responses.\n *\n * Yields parsed events as `{ event, data }` pairs. Per spec:\n * - Each event is separated by a blank line\n * - `event: foo` sets the event name (defaults to \"message\")\n * - `data: ...` lines accumulate into the data buffer\n * - `:` lines are comments and ignored\n * - `id` / `retry` fields are accepted and ignored\n *\n * For Anthropic the wire format is canonical SSE with explicit `event:` lines.\n * For OpenAI / OpenAI-compatible the format omits `event:` and just emits\n * `data: <json>` chunks, with a final `data: [DONE]`. Both work with this\n * parser; consumers branch on event name or just on `data`.\n */\nexport interface SSEMessage {\n event: string;\n data: string;\n}\n\n/**\n * Cap on the pending-line buffer. A malicious or buggy upstream that sends\n * megabytes without a newline could otherwise pin a worker via the prior\n * O(n²) CRLF replace + unbounded `buffer +=` pattern. 256 KB comfortably\n * accommodates any sane SSE event while ensuring we fail fast on garbage.\n */\nconst MAX_BUFFER_BYTES = 256 * 1024;\n\nexport async function* parseSSE(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n): AsyncIterable<SSEMessage> {\n if (!body) return;\n const decoder = new TextDecoder('utf-8');\n let buffer = '';\n let event = 'message';\n const dataLines: string[] = [];\n\n const flush = (): SSEMessage | undefined => {\n if (dataLines.length === 0 && event === 'message') return undefined;\n const data = dataLines.join('\\n');\n const msg: SSEMessage = { event, data };\n event = 'message';\n dataLines.length = 0;\n return msg;\n };\n\n const processLine = (line: string): SSEMessage | undefined => {\n if (line === '') return flush();\n if (line.startsWith(':')) return undefined; // comment\n const colonIdx = line.indexOf(':');\n let field: string;\n let value: string;\n if (colonIdx === -1) {\n field = line;\n value = '';\n } else {\n field = line.slice(0, colonIdx);\n value = line.slice(colonIdx + 1);\n if (value.startsWith(' ')) value = value.slice(1);\n }\n if (field === 'event') event = value || 'message';\n else if (field === 'data') dataLines.push(value);\n // id / retry: ignored\n return undefined;\n };\n\n // Incremental CRLF normalization on each appended chunk only — previously\n // we ran `.replace(/\\r\\n/g, '\\n')` on the *entire* buffer per chunk, which\n // is O(n²) in stream length. Trailing CR (split across chunks) is left\n // in the buffer; the splitter handles it on the next round.\n const appendChunk = (chunkStr: string): void => {\n if (chunkStr.length === 0) return;\n buffer += chunkStr;\n if (buffer.length > MAX_BUFFER_BYTES) {\n throw new Error(\n `SSE: pending line exceeds ${MAX_BUFFER_BYTES} bytes — upstream is not framing events`,\n );\n }\n };\n\n // Node.js Readable stream\n if (isNodeReadable(body)) {\n for await (const chunk of body as NodeJS.ReadableStream) {\n appendChunk(\n typeof chunk === 'string' ? chunk : decoder.decode(chunk as Buffer, { stream: true }),\n );\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } else {\n // Web ReadableStream\n const reader = (body as ReadableStream<Uint8Array>).getReader();\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n appendChunk(decoder.decode(value, { stream: true }));\n const split = splitBuffer(buffer);\n buffer = split.tail;\n for (const line of split.lines) {\n const msg = processLine(line);\n if (msg) yield msg;\n }\n }\n } finally {\n reader.releaseLock();\n }\n }\n // Flush any trailing buffered line\n if (buffer.length > 0) {\n const msg = processLine(buffer.replace(/\\r$/, ''));\n if (msg) yield msg;\n }\n const final = flush();\n if (final) yield final;\n}\n\nfunction splitBuffer(buf: string): { lines: string[]; tail: string } {\n // Split on \\n directly; strip trailing \\r per-line. Avoids the O(n²)\n // pattern of running .replace(/\\r\\n/g, '\\n') on the entire buffer\n // every chunk.\n const parts = buf.split('\\n');\n const tail = parts.pop() ?? '';\n const lines = parts.map((p) => (p.endsWith('\\r') ? p.slice(0, -1) : p));\n return { lines, tail };\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown | undefined }).pipe === 'function' &&\n typeof (b as { on?: unknown | undefined }).on === 'function'\n );\n}\n","import type { StopReason } from '@wrongstack/core';\n\nexport function normalizeAnthropic(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'end_turn':\n return 'end_turn';\n case 'tool_use':\n return 'tool_use';\n case 'max_tokens':\n return 'max_tokens';\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 normalizeOpenAI(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'stop':\n return 'end_turn';\n case 'tool_calls':\n case 'function_call':\n return 'tool_use';\n case 'length':\n return 'max_tokens';\n case 'content_filter':\n return 'refusal';\n default:\n return 'end_turn';\n }\n}\n\n/**\n * Normalize Gemini-specific finish reasons. SAFETY, RECITATION, and\n * \"hallucination\" are safety blocks that should not silently become end_turn.\n */\nexport function normalizeGemini(stop: string | null | undefined): StopReason {\n switch (stop) {\n case 'SAFETY':\n case 'RECITATION':\n case 'hallucination':\n return 'refusal';\n case 'stop':\n case 'STOP':\n return 'end_turn';\n case 'max_tokens':\n case 'MAX_TOKENS':\n return 'max_tokens';\n case 'tool_use':\n case 'TOOL_USE':\n return 'tool_use';\n default:\n return 'end_turn';\n }\n}\n","import { compactToolDefinitionForWire, type Tool } from '@wrongstack/core';\n\nexport interface AnthropicToolSchema {\n name: string;\n description: string;\n input_schema: Record<string, unknown>;\n}\n\n/**\n * WeakMap cache keyed by the Tool[] array reference. The tool registry\n * returns the same array reference within a session, so after the first\n * call the serialized schemas are served from cache — no re-mapping or\n * object allocation on subsequent LLM calls. When tools are added or\n * removed the registry creates a new array, the old entry is GC'd by\n * the WeakMap, and the next call recomputes.\n */\nconst _cache = new WeakMap<Tool[], AnthropicToolSchema[]>();\n\nexport function toolsToAnthropic(tools: Tool[]): AnthropicToolSchema[] {\n const hit = _cache.get(tools);\n if (hit) return hit;\n const result = tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n input_schema: compact.inputSchema,\n };\n });\n _cache.set(tools, result);\n return result;\n}\n","/**\n * Singleton gate for stream debug logging.\n *\n * WireAdapter reads this on every stream() call, so runtime toggles\n * (via /settings debug-stream on|off) take effect on the next request\n * without recreating provider instances.\n *\n * When enabled, WireAdapter accumulates per-chunk stats and pushes them\n * through a registered callback. In CLI (non-TUI) mode the default\n * callback writes a compact status line to stderr. The TUI replaces\n * the callback with one that dispatches to its reducer so the debug\n * info renders inside Ink's StatusBar line 3 instead of bypassing it.\n *\n * The CLI boot path seeds this from config.debugStream at startup.\n */\n\nexport interface DebugStreamStats {\n /** Monotonic chunk counter, resets per-stream. */\n chunkCount: number;\n /** Bytes of the most recent chunk. */\n lastChunkSize: number;\n /** Millisecond delta since the PREVIOUS chunk (reveals think gaps). */\n lastDeltaMs: number;\n /** Cumulative bytes received for this stream. */\n totalBytes: number;\n /** ISO timestamp of the most recent chunk. */\n lastChunkAt: string;\n}\n\nexport type DebugStreamCallback = (stats: DebugStreamStats) => void;\n\nlet _debugStreamEnabled = false;\nlet _debugStreamCallback: DebugStreamCallback | null = null;\n\n// ---- Throttle internals ----\nlet _throttleTimer: ReturnType<typeof setTimeout> | null = null;\nlet _pendingStats: DebugStreamStats | null = null;\nconst THROTTLE_MS = 200; // batch React dispatches at ~5 Hz\n\nfunction _flush(): void {\n if (_pendingStats && _debugStreamCallback) {\n _debugStreamCallback({ ..._pendingStats });\n _pendingStats = null;\n }\n _throttleTimer = null;\n}\n\nfunction _scheduleFlush(): void {\n if (_throttleTimer) return;\n _throttleTimer = setTimeout(_flush, THROTTLE_MS);\n if (_throttleTimer.unref) _throttleTimer.unref();\n}\n\n/** Check whether raw SSE stream debugging is currently active. */\nexport function isDebugStreamEnabled(): boolean {\n return _debugStreamEnabled;\n}\n\n/** Flip the stream debug flag at runtime. Persisted separately via ConfigStore. */\nexport function setDebugStreamEnabled(enabled: boolean): void {\n _debugStreamEnabled = enabled;\n}\n\n/**\n * Register a callback that receives THROTTLED debug-chunk stats (~5 Hz).\n * WireAdapter calls `pushDebugChunkStats()` on every raw chunk; this module\n * batches them and calls `cb` at most once per THROTTLE_MS.\n *\n * Pass `null` to restore the default stderr behaviour.\n */\nexport function setDebugStreamCallback(cb: DebugStreamCallback | null): void {\n // Flush any pending stats before swapping the callback so the old consumer\n // doesn't miss the last batch.\n if (_throttleTimer) {\n clearTimeout(_throttleTimer);\n _flush();\n }\n _debugStreamCallback = cb;\n}\n\n/**\n * Called by WireAdapter on every raw chunk. Not throttled — call it as\n * often as chunks arrive; it's cheap (a few integer assigns + a debounced\n * setTimeout). The registered callback receives aggregated stats at most\n * once per THROTTLE_MS.\n */\nexport function pushDebugChunkStats(bytes: number, deltaMs: number): void {\n if (!_debugStreamEnabled) return;\n\n _pendingStats = {\n chunkCount: (_pendingStats?.chunkCount ?? 0) + 1,\n lastChunkSize: bytes,\n lastDeltaMs: deltaMs,\n totalBytes: (_pendingStats?.totalBytes ?? 0) + bytes,\n lastChunkAt: new Date().toISOString(),\n };\n _scheduleFlush();\n}\n\n/**\n * Default callback: write a compact status line to stderr (used in CLI /\n * headless mode where Ink isn't painting the terminal).\n */\nexport function defaultDebugStreamCallback(stats: DebugStreamStats): void {\n process.stderr.write(\n `[DEBUG-STREAM] chunk #${stats.chunkCount} (${stats.lastChunkSize}B, +${stats.lastDeltaMs}ms) · ${fmtBytes(stats.totalBytes)} total · ${stats.lastChunkAt}\\n`,\n );\n}\n\nfunction fmtBytes(n: number): string {\n if (n < 1024) return `${n}B`;\n if (n < 1_048_576) return `${(n / 1024).toFixed(1)}KB`;\n return `${(n / 1_048_576).toFixed(1)}MB`;\n}\n","import type { Capabilities, Provider, Request, Response, StreamEvent } from '@wrongstack/core';\nimport { ProviderError, StreamHangError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { isDebugStreamEnabled, pushDebugChunkStats } from './stream-debug-state.js';\nimport { Readable } from 'node:stream';\nimport { toErrorMessage } from '@wrongstack/core/utils';\n\ntype Response2 = {\n ok: boolean;\n status: number;\n text(): Promise<string>;\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n};\n\n/** Configuration for WireAdapter stream-level debugging and hang detection. */\nexport interface WireAdapterStreamOptions {\n /**\n * When true, accumulate per-chunk stats into the shared debug-sink\n * (stream-debug-state.ts). The sink batches every 200 ms and pushes to\n * a registered callback. The CLI default callback writes to stderr; the\n * TUI replaces it with a reducer dispatch that renders in StatusBar line 3,\n * keeping all output inside Ink's layout.\n *\n * Controlled by WRONGSTACK_DEBUG_STREAM=1 env var or the runtime\n * /settings debug-stream toggle.\n */\n debugStream?: boolean | undefined;\n /**\n * Maximum time (ms) to wait for the next chunk of data before declaring\n * a stream hang. Default: 60_000 (60 seconds). Set to 0 to disable.\n * When a hang is detected, a StreamHangError is thrown so the agent\n * loop can retry the iteration.\n */\n streamHangTimeoutMs?: number | undefined;\n}\n\n/** Validate fetchImpl response has required fields; normalize missing body to null. */\nfunction validateResponse(res: unknown): asserts res is Response2 {\n const r = res as Record<string, unknown> | undefined;\n if (r === undefined || typeof r.ok !== 'boolean' || typeof r.status !== 'number') {\n throw new Error('fetchImpl returned invalid response shape — expected { ok, status, text, body }');\n }\n // If body is absent, null, or undefined on a plain object (not a native Response\n // with a read-only getter), normalize it to null so callers can safely use it.\n // Native Response objects always have a body getter — no mutation needed.\n if (!('body' in r) || r.body === undefined) {\n // Only set on plain objects — native Response.body is read-only\n const proto = Object.getPrototypeOf(r);\n if (proto === Object.prototype || proto === null) {\n r.body = null;\n }\n }\n}\n\nasync function safeText(res: Response2): Promise<string> {\n try {\n return await res.text();\n } catch {\n return '';\n }\n}\n\n/**\n * Feed debug-chunk stats into the shared singleton sink. The sink batches\n * and throttles writes so the TUI can render them inside Ink's StatusBar\n * line 3 (~5 Hz) instead of raw stderr interfering with the terminal layout.\n */\nfunction logRawChunk(\n _providerId: string,\n _chunkIndex: number,\n bytes: Uint8Array,\n deltaMs: number,\n): void {\n pushDebugChunkStats(bytes.length, deltaMs);\n}\n\nconst DEFAULT_STREAM_HANG_TIMEOUT_MS = 60_000;\n\n/**\n * Shared HTTP mechanics for streaming providers.\n * Providers extend this to get:\n * - canonical error handling (ProviderError with retryable flag)\n * - SSE body parsing via parseSSE()\n * - abort signal wiring\n * - optional raw-stream debug logging\n * - optional stream hang detection\n *\n * Subclasses implement the abstract members to provide their specific wire format.\n */\nexport abstract class WireAdapter implements Provider {\n abstract readonly id: string;\n abstract readonly capabilities: Capabilities;\n\n protected readonly debugStream: boolean;\n protected readonly streamHangTimeoutMs: number;\n\n constructor(\n protected readonly apiKey: string,\n protected readonly baseUrl: string,\n public readonly fetchImpl: typeof fetch = fetch,\n streamOpts: WireAdapterStreamOptions = {},\n ) {\n if (!apiKey) throw new Error(`${this.constructor.name}: apiKey required`);\n this.debugStream = streamOpts.debugStream ?? false;\n this.streamHangTimeoutMs = streamOpts.streamHangTimeoutMs ?? DEFAULT_STREAM_HANG_TIMEOUT_MS;\n }\n\n async complete(req: Request, opts: { signal: AbortSignal }): Promise<Response> {\n const { aggregateStream } = await import('./aggregate.js');\n return aggregateStream(this.stream(req, opts));\n }\n\n async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n const url = this.buildUrl(req);\n const headers = this.buildHeaders(req);\n const body = this.buildBody(req);\n\n let httpRes: Response2;\n try {\n const raw = await this.fetchImpl(url, {\n method: 'POST',\n headers,\n body: JSON.stringify(body),\n signal: opts.signal,\n });\n validateResponse(raw);\n httpRes = raw as Response2;\n } catch (err) {\n if (opts.signal.aborted) throw err;\n throw new ProviderError(toErrorMessage(err), 0, true, this.id, {\n cause: err,\n body: { message: toErrorMessage(err) },\n });\n }\n\n if (!httpRes.ok) {\n const text = await safeText(httpRes);\n throw this.translateError(httpRes.status, text);\n }\n\n let sseBody = httpRes.body;\n if (!sseBody) {\n // No body — emit nothing\n return;\n }\n\n // Layer 1: debug logging — wrap the stream to log raw bytes.\n // Checks both the instance-level option (set at construction) AND the\n // runtime singleton (flipped via /settings or setDebugStreamEnabled) so\n // toggles take effect on the next request without recreating providers.\n if (this.debugStream || isDebugStreamEnabled()) {\n sseBody = this.wrapDebugStream(sseBody);\n }\n\n // Layer 2: hang detection — wrap with timeout-aware reader\n if (this.streamHangTimeoutMs > 0) {\n sseBody = this.wrapWithHangDetection(sseBody, req.model);\n }\n\n yield* this.parseStream(sseBody, req.model, req);\n }\n\n /**\n * Wrap a readable stream body to log a compact status line per incoming\n * byte chunk to stderr. This is a diagnostic tool for tracking stream\n * activity — chunk count, sizes, and inter-chunk deltas — without\n * printing payload contents.\n */\n private wrapDebugStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n ): ReadableStream<Uint8Array> | NodeJS.ReadableStream {\n // Node.js Readable stream — use async iterator\n if (isNodeReadable(body)) {\n return this.wrapDebugNodeStream(body as NodeJS.ReadableStream) as NodeJS.ReadableStream;\n }\n // Web ReadableStream — wrap reader\n return this.wrapDebugWebStream(body as ReadableStream<Uint8Array>);\n }\n\n private wrapDebugNodeStream(body: NodeJS.ReadableStream): NodeJS.ReadableStream {\n let lastChunkTime = Date.now();\n let chunkIndex = 0;\n const providerId = this.id;\n\n return Readable.from(\n (async function* () {\n for await (const chunk of body) {\n const bytes: Uint8Array =\n typeof chunk === 'string'\n ? new TextEncoder().encode(chunk)\n : new Uint8Array(chunk.buffer, chunk.byteOffset, chunk.byteLength);\n const now = Date.now();\n logRawChunk(providerId, chunkIndex++, bytes, now - lastChunkTime);\n lastChunkTime = now;\n yield chunk;\n }\n })(),\n );\n }\n\n private wrapDebugWebStream(\n body: ReadableStream<Uint8Array>,\n ): ReadableStream<Uint8Array> {\n let lastChunkTime = Date.now();\n let chunkIndex = 0;\n const self = this;\n const reader = body.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n const { done, value } = await reader.read();\n if (done) {\n controller.close();\n return;\n }\n if (value) {\n const now = Date.now();\n logRawChunk(self.id, chunkIndex++, value, now - lastChunkTime);\n lastChunkTime = now;\n }\n controller.enqueue(value);\n },\n cancel(reason) {\n reader.cancel(reason);\n },\n });\n }\n\n /**\n * Wrap a readable stream to detect hangs — when no data arrives for\n * longer than `streamHangTimeoutMs`. When a hang is detected, throws\n * `StreamHangError` so the caller can retry or fall back.\n */\n private wrapWithHangDetection(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream,\n model: string,\n ): ReadableStream<Uint8Array> | NodeJS.ReadableStream {\n if (isNodeReadable(body)) {\n return this.wrapHangNodeStream(body as NodeJS.ReadableStream, model);\n }\n return this.wrapHangWebStream(body as ReadableStream<Uint8Array>, model);\n }\n\n private wrapHangNodeStream(\n body: NodeJS.ReadableStream,\n model: string,\n ): NodeJS.ReadableStream {\n // Node Readable → Web ReadableStream, then use the race-based\n // web wrapper that properly detects hangs even when no chunks arrive.\n // The for-await approach only checks BETWEEN chunks — a stalled stream\n // that never yields another chunk would freeze indefinitely.\n const webStream = Readable.toWeb(body as Readable);\n const wrappedWeb = this.wrapHangWebStream(webStream as ReadableStream<Uint8Array>, model);\n return Readable.fromWeb(wrappedWeb as never as ReadableStream) as never as NodeJS.ReadableStream;\n }\n\n private wrapHangWebStream(\n body: ReadableStream<Uint8Array>,\n model: string,\n ): ReadableStream<Uint8Array> {\n const startTime = Date.now();\n let bytesReceived = 0;\n const timeout = this.streamHangTimeoutMs;\n const providerId = this.id;\n const reader = body.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n // Race the read against a hang timeout\n const readPromise = reader.read();\n const timeoutPromise = new Promise<{ timedOut: true }>((resolve) => {\n setTimeout(() => resolve({ timedOut: true }), timeout);\n });\n\n const result = await Promise.race([readPromise, timeoutPromise]);\n\n if ('timedOut' in result && result.timedOut) {\n // The read is still pending — this is a hang.\n // Cancel the reader and throw.\n reader.cancel('stream hang detected').catch((err) => console.debug(`[wire-adapter] cancel after stream hang failed: ${err}`));\n const elapsedMs = Date.now() - startTime;\n throw new StreamHangError({\n providerId,\n model,\n hangTimeoutMs: timeout,\n bytesReceived,\n elapsedMs,\n });\n }\n\n const { done, value } = result as Awaited<ReturnType<typeof reader.read>>;\n if (done) {\n controller.close();\n return;\n }\n if (value) {\n bytesReceived += value.length;\n }\n controller.enqueue(value);\n },\n cancel(reason) {\n reader.cancel(reason);\n },\n });\n }\n\n // ─── Abstract / overridable ───────────────────────────────────────────────\n\n /** HTTP endpoint for this provider's chat completions / messages API. */\n protected abstract buildUrl(req: Request): string;\n\n /** Per-request headers. `apiKey` is already in scope — call `super.buildHeaders` first. */\n protected buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n };\n }\n\n /** Map Request fields to the wire request body. */\n protected abstract buildBody(req: Request): Record<string, unknown>;\n\n /** Translate wire SSE events into canonical StreamEvent[]. */\n protected abstract parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n req: Request,\n ): AsyncIterable<StreamEvent>;\n\n /** Build a ProviderError from an HTTP failure response. */\n protected translateError(status: number, body: string): ProviderError {\n return parseProviderHttpError(this.id, status, body);\n }\n}\n\nfunction isNodeReadable(b: unknown): boolean {\n return (\n !!b &&\n typeof b === 'object' &&\n typeof (b as { pipe?: unknown | undefined }).pipe === 'function' &&\n typeof (b as { on?: unknown | undefined }).on === 'function'\n );\n}\n","/**\n * `anthropic-oauth` wire family — Claude Pro/Max via \"Sign in with Claude\".\n *\n * Same wire as the API-key `anthropic` family (api.anthropic.com/v1/messages),\n * but authenticated with an OAuth access token instead of an API key. Three\n * things differ from the API-key path, all REQUIRED for the subscription\n * backend to accept the request:\n * 1. `Authorization: Bearer <access>` (no `x-api-key`).\n * 2. `anthropic-beta: claude-code-20250219,oauth-2025-04-20`.\n * 3. The first system block MUST be exactly the Claude Code identity line —\n * Anthropic rejects OAuth requests whose system prompt doesn't lead with it.\n *\n * The API-key `anthropic` family is untouched. Tokens self-refresh (near-expiry\n * + once on 401) via the refresh token; rotated tokens persist through the same\n * `setOAuthTokenPersister` hook the codex family uses.\n */\n\nimport { type Capabilities, ProviderError, type Request, type StreamEvent } from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nconst CLIENT_ID = '9d1c250a-e61b-44d9-88ed-5944d1962f5e';\nconst TOKEN_URL = 'https://platform.claude.com/v1/oauth/token';\nconst DEFAULT_BASE = 'https://api.anthropic.com';\nconst ANTHROPIC_VERSION = '2023-06-01';\nconst OAUTH_BETA = 'claude-code-20250219,oauth-2025-04-20';\nconst REFRESH_SKEW_MS = 60_000;\n/** Version string mimicked in the User-Agent so requests look like Claude Code. */\nconst CLAUDE_CODE_VERSION = '2.1.75';\n\n/** Required first system block for OAuth/subscription requests. */\nexport const CLAUDE_CODE_SYSTEM_PROMPT =\n \"You are Claude Code, Anthropic's official CLI for Claude.\";\n\n// ── Tool-name camouflage ─────────────────────────────────────────────────────\n// The subscription backend can fingerprint a non-Claude-Code client by its tool\n// names. We present Claude Code's canonical casing on the wire (read → Read,\n// bash → Bash, …) for any tool whose name matches case-insensitively, and map\n// the streamed tool_use name back to the caller's real tool so dispatch works.\n// Tools without a Claude Code counterpart pass through unchanged.\n\nconst CLAUDE_CODE_TOOLS = [\n 'Read',\n 'Write',\n 'Edit',\n 'Bash',\n 'Grep',\n 'Glob',\n 'AskUserQuestion',\n 'EnterPlanMode',\n 'ExitPlanMode',\n 'KillShell',\n 'NotebookEdit',\n 'Skill',\n 'Task',\n 'TaskOutput',\n 'TodoWrite',\n 'WebFetch',\n 'WebSearch',\n] as const;\n\nconst CC_TOOL_BY_LOWER = new Map(CLAUDE_CODE_TOOLS.map((t) => [t.toLowerCase(), t]));\n\n/** Map a real tool name to Claude Code's canonical casing (if it matches). */\nfunction toClaudeCodeName(name: string): string {\n return CC_TOOL_BY_LOWER.get(name.toLowerCase()) ?? name;\n}\n\n/** Map a Claude-Code-cased name back to the caller's real tool name. */\nfunction fromClaudeCodeName(name: string, tools: Request['tools']): string {\n const lower = name.toLowerCase();\n const match = tools?.find((t) => t.name.toLowerCase() === lower);\n return match?.name ?? name;\n}\n\nexport interface AnthropicOAuthTokens {\n access: string;\n refresh: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Refresh an expired Claude OAuth access token. */\nexport async function refreshAnthropicOAuthToken(\n refreshToken: string,\n signal?: AbortSignal,\n): Promise<AnthropicOAuthTokens> {\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json', accept: 'application/json' },\n body: JSON.stringify({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }),\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(30_000)])\n : AbortSignal.timeout(30_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Claude token refresh failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n } | null;\n if (!json?.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n throw new Error('Claude token refresh response missing fields');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n };\n}\n\nexport interface AnthropicOAuthCredentials {\n accessToken: string;\n refreshToken?: string | undefined;\n expiresAt?: number | undefined;\n}\n\nexport interface AnthropicOAuthProviderOptions {\n credentials: AnthropicOAuthCredentials;\n baseUrl?: string | undefined;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n onRefresh?:\n | ((creds: { accessToken: string; refreshToken: string; expiresAt: number }) => void)\n | undefined;\n refreshFn?:\n | ((refreshToken: string, signal?: AbortSignal) => Promise<AnthropicOAuthTokens>)\n | undefined;\n}\n\nexport class AnthropicOAuthProvider extends AnthropicProvider {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private access: string;\n private refresh: string | undefined;\n private expiresAt: number | undefined;\n private readonly onRefresh: AnthropicOAuthProviderOptions['onRefresh'];\n private readonly refreshFn: (\n refreshToken: string,\n signal?: AbortSignal,\n ) => Promise<AnthropicOAuthTokens>;\n\n constructor(opts: AnthropicOAuthProviderOptions) {\n super({\n apiKey: opts.credentials.accessToken,\n baseUrl: opts.baseUrl ?? DEFAULT_BASE,\n fetchImpl: opts.fetchImpl,\n streamOpts: opts.streamOpts,\n });\n this.id = opts.id ?? 'anthropic-oauth';\n this.capabilities = capabilitiesForFamily('anthropic-oauth');\n this.access = opts.credentials.accessToken;\n this.refresh = opts.credentials.refreshToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshAnthropicOAuthToken;\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }) {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* this.remapToolNames(super.stream(req, opts), req.tools);\n } catch (err) {\n if (err instanceof ProviderError && err.status === 401 && this.refresh) {\n await this.doRefresh(opts.signal);\n yield* this.remapToolNames(super.stream(req, opts), req.tools);\n return;\n }\n throw err;\n }\n }\n\n /** Map Claude-Code-cased tool_use names in the stream back to real names. */\n private async *remapToolNames(\n events: AsyncIterable<StreamEvent>,\n tools: Request['tools'],\n ): AsyncIterable<StreamEvent> {\n for await (const ev of events) {\n if (\n (ev.type === 'tool_use_start' || ev.type === 'content_block_start') &&\n typeof (ev as { name?: string }).name === 'string'\n ) {\n yield { ...ev, name: fromClaudeCodeName((ev as { name: string }).name, tools) };\n } else {\n yield ev;\n }\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n if (this.expiresAt !== undefined && Date.now() < this.expiresAt - REFRESH_SKEW_MS) return;\n await this.doRefresh(signal);\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n const t = await this.refreshFn(this.refresh, signal);\n this.access = t.access;\n this.refresh = t.refresh;\n this.expiresAt = t.expires;\n this.onRefresh?.({ accessToken: t.access, refreshToken: t.refresh, expiresAt: t.expires });\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n 'anthropic-version': ANTHROPIC_VERSION,\n authorization: `Bearer ${this.access}`,\n 'anthropic-beta': OAUTH_BETA,\n // Present as the official Claude Code CLI so the subscription backend\n // accepts the request and the client isn't trivially fingerprinted.\n 'user-agent': `claude-cli/${CLAUDE_CODE_VERSION}`,\n 'x-app': 'cli',\n 'anthropic-dangerous-direct-browser-access': 'true',\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body = super.buildBody(req);\n // Prepend the required Claude Code identity block (unless already present).\n const existing = (body['system'] as { type: 'text'; text: string }[] | undefined) ?? [];\n const alreadyLed = existing[0]?.text?.startsWith(CLAUDE_CODE_SYSTEM_PROMPT) === true;\n body['system'] = alreadyLed\n ? existing\n : [{ type: 'text', text: CLAUDE_CODE_SYSTEM_PROMPT }, ...existing];\n\n // Present Claude Code's canonical tool names on the wire, consistently\n // across both the tool definitions and the tool_use blocks in history.\n const tools = body['tools'] as Array<{ name?: string }> | undefined;\n if (Array.isArray(tools)) {\n for (const t of tools) {\n if (typeof t.name === 'string') t.name = toClaudeCodeName(t.name);\n }\n }\n const messages = body['messages'] as Array<{ content?: unknown }> | undefined;\n if (Array.isArray(messages)) {\n for (const m of messages) {\n if (!Array.isArray(m.content)) continue;\n for (const block of m.content as Array<{ type?: string; name?: string }>) {\n if (block?.type === 'tool_use' && typeof block.name === 'string') {\n block.name = toClaudeCodeName(block.name);\n }\n }\n }\n }\n return body;\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type { Capabilities, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeOpenAI } from './stop-reason.js';\nimport { type ConvertOptions, messagesToOpenAI, toolsToOpenAI } from './tool-format/to-openai.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\nexport interface OpenAIProviderOptions {\n apiKey: string;\n baseUrl?: string | undefined;\n organization?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n quirks?: ConvertOptions & {\n parallelToolsDisabled?: boolean | undefined;\n jsonArgumentsBuggy?: boolean | undefined;\n thinkingParam?: 'zai-glm' | 'kimi-toggle' | 'always-on' | undefined;\n } | undefined;\n id?: string | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nconst DEFAULT_BASE = 'https://api.openai.com/v1';\n\nexport class OpenAIProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n protected readonly opts: OpenAIProviderOptions;\n\n constructor(opts: OpenAIProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\n this.opts = opts;\n this.id = opts.id ?? 'openai';\n this.capabilities = capabilitiesForFamily('openai', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n const base = this.baseUrl.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(base)) return base;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(base)) return `${base}/chat/completions`;\n return `${base}/v1/chat/completions`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(req),\n authorization: `Bearer ${this.apiKey}`,\n };\n if (this.opts.organization) {\n headers['openai-organization'] = this.opts.organization;\n }\n return headers;\n }\n\n /**\n * The request field used to cap output length. Real OpenAI deprecated\n * `max_tokens` and the newer model families (gpt-4o, o1/o3/o4) 400 on it —\n * they require `max_completion_tokens`. OpenAI-compatible endpoints that\n * still only accept `max_tokens` override this. See issue #10.\n */\n protected tokenLimitParam(): string {\n return 'max_completion_tokens';\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(this.stripCacheControl(req), req.messages, {\n ...this.opts.quirks,\n }),\n [this.tokenLimitParam()]: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseOpenAIStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private stripCacheControl(req: Request): typeof req.system {\n if (!req.system) return undefined;\n return req.system.map((b) => {\n // Omit cache_control without mutating a copy — rest spread is cleaner.\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n }\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate an OpenAI /chat/completions SSE stream into canonical StreamEvent[].\n *\n * Wire format per chunk:\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"content\":\"hi\"},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{\"index\":0,\"delta\":{\"tool_calls\":[\n * {\"index\":0,\"id\":\"call_x\",\"function\":{\"name\":\"echo\",\"arguments\":\"{\\\"text\\\":\"}}]},\"finish_reason\":null}]}\n * data: {\"id\":\"...\",\"choices\":[{...,\"finish_reason\":\"stop\"}],\"usage\":{\"prompt_tokens\":12,...}}\n * data: [DONE]\n *\n * Tool calls stream as a sequence of partial fragments keyed by their\n * `index` in the delta array; we map index → canonical tool_use id from\n * the first chunk that carries one.\n */\nasync function* parseOpenAIStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n let textOpen = false;\n let thinkingOpen = false;\n const toolByIndex = new Map<\n number,\n { id?: string | undefined; name?: string | undefined; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >();\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (typeof obj['model'] === 'string') model = obj['model'];\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null | undefined;\n reasoning_content?: string | undefined;\n reasoning?: string | undefined;\n tool_calls?: Array<{\n index?: number | undefined;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }>;\n };\n finish_reason?: string | null | undefined;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode) stream chain-of-thought\n // as `delta.reasoning_content` at the top of the delta. The full blob\n // MUST be echoed back as message-level `reasoning_content` on the\n // next request — otherwise DeepSeek 400s with \"reasoning_content in\n // the thinking mode must be passed back to the API\".\n // OpenRouter sometimes uses `delta.reasoning` for the same field.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!thinkingOpen) {\n thinkingOpen = true;\n yield { type: 'thinking_start' };\n }\n yield { type: 'thinking_delta', text: reasoningDelta };\n }\n\n if (choice?.delta?.content) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n if (!textOpen) textOpen = true;\n yield { type: 'text_delta', text: choice.delta.content };\n }\n\n if (choice?.delta?.tool_calls) {\n if (thinkingOpen) {\n thinkingOpen = false;\n yield { type: 'thinking_stop' };\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n textOpen = false;\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n yield {\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n };\n }\n }\n }\n\n if (choice?.finish_reason) {\n stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number | undefined;\n input_tokens?: number | undefined;\n completion_tokens?: number | undefined;\n prompt_tokens_details?: { cached_tokens?: number | undefined };\n prompt_cache_hit_tokens?: number | undefined;\n prompt_cache_miss_tokens?: number | undefined;\n }\n | undefined;\n if (u) {\n // Normalize to disjoint semantics: `input` is fresh-only (priced at\n // the full rate), `cacheRead` is the cached subset (priced at the\n // cache rate). OpenAI returns `prompt_tokens_details.cached_tokens`;\n // DeepSeek returns `prompt_cache_hit_tokens`/`prompt_cache_miss_tokens`.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ?? u.input_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : usage.input + cached);\n usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (thinkingOpen) {\n yield { type: 'thinking_stop' };\n }\n for (const entry of toolByIndex.values()) {\n // A tool call with no name is unusable — there's nothing to dispatch to.\n if (!entry.name) continue;\n // Some OpenAI-compatible servers (proxies, local runtimes) omit the\n // `id` field on streamed tool calls entirely. Dropping the call here\n // would silently swallow the model's action; synthesize a stable id so\n // it still dispatches and correlates with its tool_result. Mirrors the\n // Google adapter, which always assigns an id.\n if (!entry.id) entry.id = `call_${randomUUID()}`;\n if (!entry.emittedStart) {\n yield { type: 'tool_use_start', id: entry.id, name: entry.name };\n }\n const input = parseToolInput(entry.argBuf);\n yield { type: 'tool_use_stop', id: entry.id, input };\n }\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n","import type {\n ContentBlock,\n Message,\n TextBlock,\n ThinkingBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire } from '@wrongstack/core';\n\nexport interface OpenAIToolSchema {\n type: 'function';\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\n/**\n * WeakMap cache keyed by the Tool[] array reference. The tool registry\n * returns the same array reference within a session, so after the first\n * call the serialized schemas are served from cache — no re-mapping or\n * object allocation on subsequent LLM calls. When tools are added or\n * removed the registry creates a new array, the old entry is GC'd by\n * the WeakMap, and the next call recomputes.\n */\nconst _cache = new WeakMap<Tool[], OpenAIToolSchema[]>();\n\nexport function toolsToOpenAI(tools: Tool[]): OpenAIToolSchema[] {\n const hit = _cache.get(tools);\n if (hit) return hit;\n const result = tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n type: 'function' as const,\n function: {\n name: compact.name,\n description: compact.description,\n parameters: compact.inputSchema,\n },\n };\n });\n _cache.set(tools, result);\n return result;\n}\n\nexport interface OpenAIMessage {\n role: 'system' | 'user' | 'assistant' | 'tool';\n content?: string | OpenAIContent[] | null | undefined;\n tool_calls?: OpenAIToolCall[] | undefined;\n tool_call_id?: string | undefined;\n name?: string | undefined;\n /**\n * DeepSeek (and other OpenAI-compatible thinking-mode models) require the\n * previous assistant's chain-of-thought to be echoed back on the next\n * request as a top-level `reasoning_content` field on the assistant\n * message — NOT inside individual tool_calls. Without it DeepSeek\n * returns 400 \"reasoning_content in the thinking mode must be passed\n * back to the API\". Vanilla OpenAI ignores this field, so emitting it\n * unconditionally is safe.\n */\n reasoning_content?: string | undefined;\n}\n\nexport interface OpenAIContent {\n type: 'text' | 'image_url';\n text?: string | undefined;\n image_url?: { url: string | undefined };\n}\n\nexport interface OpenAIToolCall {\n id: string;\n type: 'function';\n function: { name: string; arguments: string };\n}\n\nexport interface ConvertOptions {\n flattenContentToString?: boolean | undefined;\n stripCacheControl?: boolean | undefined;\n systemAsMessage?: boolean | undefined;\n /**\n * What to write as the assistant message's `content` field when the\n * message has tool_calls but no prose. Two values:\n *\n * - `'empty_string'` (default): writes `content: ''`. This is the\n * OpenAI 2024-2025 wire-format contract. Vanilla OpenAI, K2P7,\n * strict Mistral / OpenRouter / DeepSeek proxies all reject\n * requests where `content` is missing or `null` on a tool_call\n * assistant message.\n *\n * - `'null'`: writes `content: null` explicitly. Some older or\n * permissive proxies (e.g. certain vLLM builds, local llama.cpp\n * servers) prefer this. Set this only if a specific provider\n * rejects the empty-string form.\n *\n * The default is `'empty_string'` (NOT undefined) because omitting\n * `content` entirely (the pre-2024 behaviour) breaks too many\n * providers to be the safe default in 2025. Callers that need the\n * old behaviour can opt in with `emptyToolCallContent: 'null'`.\n */\n emptyToolCallContent?: 'null' | 'empty_string' | undefined;\n}\n\nexport function messagesToOpenAI(\n system: TextBlock[] | undefined,\n messages: Message[],\n opts: ConvertOptions = {},\n): OpenAIMessage[] {\n // Default to `'empty_string'` for the assistant content field on\n // tool-call-only messages. See ConvertOptions.emptyToolCallContent\n // for the rationale. Callers can opt back into the pre-2024\n // behaviour with `emptyToolCallContent: 'null'`.\n const emptyContentMode: 'null' | 'empty_string' = opts.emptyToolCallContent ?? 'empty_string';\n const out: OpenAIMessage[] = [];\n\n if (system && system.length > 0) {\n const sysText = system.map((b) => b.text).join('\\n\\n');\n if (opts.systemAsMessage) {\n out.push({ role: 'user', content: sysText });\n } else {\n out.push({ role: 'system', content: sysText });\n }\n }\n\n for (const msg of messages) {\n if (msg.role === 'user') {\n const blocks = normalizeContent(msg.content);\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n const others = blocks.filter((b) => b.type !== 'tool_result');\n\n // Emit the `role:\"tool\"` responses BEFORE any `role:\"user\"` content.\n // A single canonical user turn can hold both tool_result blocks and\n // text (e.g. a `/btw` note appended onto the trailing tool-result\n // message). OpenAI — and DeepSeek strictly — require every tool\n // message to immediately follow the assistant `tool_calls`; a user\n // message wedged in between triggers a 400 \"assistant message with\n // 'tool_calls' must be followed by tool messages\".\n for (const r of toolResults) {\n const content = typeof r.content === 'string' ? r.content : JSON.stringify(r.content);\n out.push({\n role: 'tool',\n tool_call_id: r.tool_use_id,\n content,\n });\n }\n if (others.length > 0) {\n out.push({\n role: 'user',\n content: opts.flattenContentToString\n ? blocksToString(others)\n : blocksToContentArray(others),\n });\n }\n } else if (msg.role === 'assistant') {\n const blocks = normalizeContent(msg.content);\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n const thinkingBlocks = blocks.filter((b): b is ThinkingBlock => b.type === 'thinking');\n const text = textBlocks.map((b) => b.text).join('');\n const reasoning = thinkingBlocks\n .map((b) => b.thinking)\n .filter((t) => t && t.length > 0)\n .join('');\n const toolCalls: OpenAIToolCall[] = toolUses.map((u) => ({\n id: u.id,\n type: 'function',\n function: { name: u.name, arguments: JSON.stringify(u.input) },\n }));\n\n const message: OpenAIMessage = { role: 'assistant' };\n if (toolCalls.length > 0) {\n message.tool_calls = toolCalls;\n if (text) {\n message.content = text;\n } else {\n // Tool-call-only assistant message: emit the empty `content`\n // field per `emptyContentMode` (computed once at the top of the\n // function; defaults to `''`, opt out with `'null'`).\n message.content = emptyContentMode === 'null' ? null : '';\n }\n } else {\n message.content = text;\n }\n // DeepSeek thinking mode requires the prior assistant's reasoning\n // blob to round-trip on the next request. Vanilla OpenAI silently\n // accepts and ignores the field, so emitting it unconditionally is\n // safe across the OpenAI-compatible ecosystem.\n if (reasoning.length > 0) {\n message.reasoning_content = reasoning;\n }\n out.push(message);\n }\n }\n return out;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction blocksToString(blocks: ContentBlock[]): string {\n return blocks\n .map((b) => {\n if (b.type === 'text') return b.text;\n if (b.type === 'image') return '[image]';\n return '';\n })\n .join('');\n}\n\nfunction blocksToContentArray(blocks: ContentBlock[]): OpenAIContent[] | string {\n const hasImage = blocks.some((b) => b.type === 'image');\n if (!hasImage) {\n return blocks\n .filter((b): b is TextBlock => b.type === 'text')\n .map((b) => b.text)\n .join('');\n }\n return blocks\n .map((b): OpenAIContent | null => {\n if (b.type === 'text') return { type: 'text', text: b.text };\n if (b.type === 'image') {\n const url =\n b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n return { type: 'image_url', image_url: { url } };\n }\n return null;\n })\n .filter((c): c is OpenAIContent => c !== null);\n}\n","/**\n * `github-copilot` wire family — GitHub Copilot subscription.\n *\n * Copilot's chat API is OpenAI chat/completions-compatible, so this extends\n * OpenAIProvider and only changes auth + base URL + headers:\n * - `Authorization: Bearer <copilot-token>` plus the Copilot editor headers\n * and `X-GitHub-Api-Version`.\n * - The base URL is derived from the Copilot token's `proxy-ep=` field\n * (e.g. https://api.individual.githubcopilot.com).\n *\n * Two tokens are involved: the long-lived GitHub OAuth token (stored as the\n * refresh token — it does NOT rotate) mints short-lived Copilot tokens via\n * `api.github.com/copilot_internal/v2/token`. This adapter refreshes the\n * Copilot token transparently (near-expiry + once on 401) and re-derives the\n * base URL from each new token. The API-key `openai` family is untouched.\n */\n\nimport type { Capabilities, Request } from '@wrongstack/core';\nimport { ProviderError } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nconst COPILOT_TOKEN_URL = 'https://api.github.com/copilot_internal/v2/token';\nconst COPILOT_API_VERSION = '2026-06-01';\nconst COPILOT_HEADERS: Record<string, string> = {\n 'User-Agent': 'GitHubCopilotChat/0.35.0',\n 'Editor-Version': 'vscode/1.107.0',\n 'Editor-Plugin-Version': 'copilot-chat/0.35.0',\n 'Copilot-Integration-Id': 'vscode-chat',\n};\nconst DEFAULT_API_BASE = 'https://api.individual.githubcopilot.com';\nconst REFRESH_SKEW_MS = 60_000;\n\n/** Derive the Copilot API base URL from a Copilot token's `proxy-ep` field. */\nexport function copilotBaseUrlFromToken(token: string | undefined): string {\n if (token) {\n const m = token.match(/proxy-ep=([^;]+)/);\n if (m?.[1]) return `https://${m[1].replace(/^proxy\\./, 'api.')}`;\n }\n return DEFAULT_API_BASE;\n}\n\nexport interface CopilotTokenResult {\n /** The short-lived Copilot token (the access token used for chat). */\n token: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Mint a fresh Copilot token from the long-lived GitHub OAuth token. */\nexport async function refreshCopilotToken(\n githubToken: string,\n signal?: AbortSignal,\n): Promise<CopilotTokenResult> {\n const res = await fetch(COPILOT_TOKEN_URL, {\n headers: {\n accept: 'application/json',\n authorization: `Bearer ${githubToken}`,\n ...COPILOT_HEADERS,\n },\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(15_000)])\n : AbortSignal.timeout(15_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Copilot token request failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as { token?: string; expires_at?: number } | null;\n if (!json?.token || typeof json.expires_at !== 'number') {\n throw new Error('Copilot token response missing fields');\n }\n return { token: json.token, expires: json.expires_at * 1000 };\n}\n\nexport interface CopilotCredentials {\n /** Current Copilot token (access). May be empty → minted on first request. */\n copilotToken: string;\n /** Long-lived GitHub OAuth token (refresh; does not rotate). */\n githubToken?: string | undefined;\n /** Copilot-token expiry, epoch ms. */\n expiresAt?: number | undefined;\n}\n\nexport interface GitHubCopilotProviderOptions {\n credentials: CopilotCredentials;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n onRefresh?:\n | ((creds: { accessToken: string; refreshToken: string; expiresAt: number }) => void)\n | undefined;\n refreshFn?:\n | ((githubToken: string, signal?: AbortSignal) => Promise<CopilotTokenResult>)\n | undefined;\n}\n\nexport class GitHubCopilotProvider extends OpenAIProvider {\n override readonly capabilities: Capabilities;\n\n private copilotToken: string;\n private readonly githubToken: string | undefined;\n private expiresAt: number | undefined;\n private apiBase: string;\n private readonly onRefresh: GitHubCopilotProviderOptions['onRefresh'];\n private readonly refreshFn: (\n githubToken: string,\n signal?: AbortSignal,\n ) => Promise<CopilotTokenResult>;\n\n constructor(opts: GitHubCopilotProviderOptions) {\n const apiBase = copilotBaseUrlFromToken(opts.credentials.copilotToken);\n super({\n // OpenAIProvider requires a non-empty apiKey; use a placeholder when the\n // Copilot token is empty (it will be minted before the first request).\n apiKey: opts.credentials.copilotToken || 'pending',\n baseUrl: apiBase,\n id: opts.id ?? 'github-copilot',\n fetchImpl: opts.fetchImpl,\n streamOpts: opts.streamOpts,\n capabilities: opts.capabilities,\n });\n this.copilotToken = opts.credentials.copilotToken;\n this.githubToken = opts.credentials.githubToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.apiBase = apiBase;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshCopilotToken;\n this.capabilities = capabilitiesForFamily('github-copilot', { ...opts.capabilities });\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }) {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* super.stream(req, opts);\n } catch (err) {\n if (err instanceof ProviderError && err.status === 401 && this.githubToken) {\n await this.doRefresh(opts.signal);\n yield* super.stream(req, opts);\n return;\n }\n throw err;\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n const stale = this.expiresAt === undefined || Date.now() >= this.expiresAt - REFRESH_SKEW_MS;\n if (!this.copilotToken || (stale && this.githubToken)) {\n await this.doRefresh(signal);\n }\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.githubToken) return;\n const t = await this.refreshFn(this.githubToken, signal);\n this.copilotToken = t.token;\n this.expiresAt = t.expires;\n this.apiBase = copilotBaseUrlFromToken(t.token);\n this.onRefresh?.({\n accessToken: t.token,\n refreshToken: this.githubToken,\n expiresAt: t.expires,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n return `${this.apiBase.replace(/\\/+$/, '')}/chat/completions`;\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n return {\n 'content-type': 'application/json',\n accept: 'text/event-stream',\n authorization: `Bearer ${this.copilotToken}`,\n 'X-GitHub-Api-Version': COPILOT_API_VERSION,\n ...COPILOT_HEADERS,\n };\n }\n}\n","import { randomUUID } from 'node:crypto';\nimport type {\n Capabilities,\n Message,\n Request,\n StopReason,\n StreamEvent,\n Tool,\n Usage,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire, type ProviderError, safeParse } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { normalizeGemini } from './stop-reason.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n/**\n * Google Gemini wire format (generativelanguage.googleapis.com).\n *\n * Differences vs OpenAI:\n * - Endpoint includes the model in the path: /v1beta/models/{model}:generateContent\n * - Messages → `contents: [{ role: 'user'|'model', parts: [...] }]`\n * - System prompt → `systemInstruction: { parts: [{ text }] }`\n * - Tools → `tools: [{ functionDeclarations: [...] }]`\n * - Tool call → `parts: [{ functionCall: { name, args } }]`\n * - Tool result → `parts: [{ functionResponse: { name, response } }]`\n * - Auth via `?key=` query param or `x-goog-api-key` header\n */\n\nexport interface GoogleProviderOptions {\n apiKey: string;\n baseUrl?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n id?: string | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nconst DEFAULT_BASE = 'https://generativelanguage.googleapis.com/v1beta';\n\ninterface GeminiPart {\n text?: string | undefined;\n functionCall?: { name: string | undefined; args: Record<string, unknown> };\n functionResponse?: { name: string | undefined; response: { content?: unknown | undefined } };\n inlineData?: { mimeType: string | undefined; data: string };\n /**\n * Gemini's signed thought blob — present on functionCall parts when\n * the model is using thinking. Must be echoed back verbatim on the\n * next request, otherwise the API rejects with:\n * 400 \"Function call is missing a thought_signature in functionCall\n * parts. This is required for tools to work correctly\".\n */\n thoughtSignature?: string | undefined;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent | undefined;\n finishReason?: string | undefined;\n}\n\nexport class GoogleProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n constructor(opts: GoogleProviderOptions) {\n super(opts.apiKey, opts.baseUrl ?? DEFAULT_BASE, opts.fetchImpl, opts.streamOpts);\n this.id = opts.id ?? 'google';\n this.capabilities = capabilitiesForFamily('google', {\n ...opts.capabilities,\n });\n }\n\n protected override buildUrl(req: Request): string {\n return `${this.baseUrl}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n 'x-goog-api-key': this.apiKey,\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: this.buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseGoogleStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n\n private buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n }\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n parameters: sanitizeSchemaForGemini(compact.inputSchema) ?? {\n type: 'object',\n properties: {},\n },\n };\n });\n}\n\n/**\n * Gemini's function-declaration `parameters` field accepts an OpenAPI 3.0\n * Schema subset — a strict superset of \"JSON Schema minus a bunch of\n * keywords\". Sending the raw JSON Schema (which Zod/JSON-Schema converters\n * happily emit with `additionalProperties`, `$schema`, etc.) makes the API\n * fail with `Unknown name \"additionalProperties\"` and friends. Walk the\n * schema and keep only what Gemini understands.\n *\n * Spec reference (OpenAPI 3.0 Schema Object → Gemini): supported keywords\n * are type, format, description, nullable, enum, items, properties,\n * required, anyOf, minLength/maxLength, pattern, minimum/maximum,\n * minItems/maxItems, minProperties/maxProperties, propertyOrdering.\n * Anything else — additionalProperties, $schema, $ref, definitions,\n * default, examples, const, allOf, oneOf, not, dependencies, if/then/else\n * — gets dropped silently.\n */\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) {\n // Used only for `enum` / `required` / `anyOf` arrays — handled per-key\n // below. Bare arrays here would be malformed schemas, drop.\n return undefined;\n }\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n // Echo the thought_signature back on every assistant tool_use\n // part — Gemini's thinking models REQUIRE it on the next turn\n // or the API returns 400. The value is opaque; we just round-trip.\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n // Prefer tool's actual name when available (e.g. executed by ToolExecutor),\n // falling back to tool_use_id or 'unknown' for manually-constructed\n // blocks in tests.\n const fnName = b.name ?? b.tool_use_id ?? 'unknown';\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n const userParts: GeminiPart[] = [...textParts];\n // Include function responses as parts of the user turn — Gemini's API\n // accepts functionResponse blocks inline with text in a single user role.\n // This handles the case where a user message consists only of tool_result\n // blocks (no text): without this, the turn is silently dropped.\n if (functionParts.length > 0) userParts.push(...functionParts);\n if (userParts.length > 0) out.push({ role: 'user', parts: userParts });\n }\n return out;\n}\n\ntype Response2Body = ReadableStream<Uint8Array> | NodeJS.ReadableStream | null;\n\n/**\n * Translate Gemini's `:streamGenerateContent?alt=sse` wire format into\n * canonical StreamEvent[]. Each chunk is a full `data: <json>` line with\n * `candidates[0].content.parts` containing either text or complete\n * functionCall objects — Gemini does not stream partial JSON for tool\n * arguments, so we emit tool_use_start + tool_use_stop together.\n */\nasync function* parseGoogleStream(\n body: Response2Body,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let started = false;\n // Gemini does not have a `tool_use`/`tool_calls` finish reason — turns\n // that contain functionCall parts come back with `finishReason: \"STOP\"`,\n // which normalizes to `end_turn` and would otherwise make the agent\n // loop exit instead of executing the tool. Track whether we saw any\n // function call so we can force-override the stop reason at message_stop.\n let sawFunctionCall = false;\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<{\n modelVersion?: string | undefined;\n candidates?: GeminiCandidate[] | undefined;\n usageMetadata?: {\n promptTokenCount?: number | undefined;\n candidatesTokenCount?: number | undefined;\n cachedContentTokenCount?: number | undefined;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const obj = parsed.value;\n\n if (obj.modelVersion) model = obj.modelVersion;\n if (!started) {\n started = true;\n yield { type: 'message_start', model };\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n yield { type: 'text_delta', text: part.text };\n } else if (part.functionCall) {\n const name = part.functionCall.name;\n if (typeof name !== 'string' || name.length === 0) continue;\n sawFunctionCall = true;\n const id = randomUUID();\n yield { type: 'tool_use_start', id, name };\n // Stash the opaque thought_signature so it can be echoed back on\n // the next request. Without this the Gemini API rejects with 400\n // \"Function call is missing a thought_signature in functionCall\n // parts\" on thinking models.\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n yield {\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n };\n }\n }\n\n if (candidate?.finishReason) {\n stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see openai.ts for rationale. Gemini reports\n // `promptTokenCount` as the TOTAL (including cached) and\n // `cachedContentTokenCount` as the cached subset; subtracting keeps\n // cost / hit-ratio math correct.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? usage.input + cached;\n usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? usage.output,\n cacheRead: cached || usage.cacheRead,\n };\n }\n }\n\n if (started) {\n // Force `tool_use` when we saw any functionCall part — Gemini reports\n // `finishReason: \"STOP\"` for tool-call turns, which would otherwise\n // become `end_turn` and short-circuit the agent loop.\n const finalStop: StopReason = sawFunctionCall ? 'tool_use' : stopReason;\n yield { type: 'message_stop', stopReason: finalStop, usage };\n }\n}\n","/**\n * `openai-codex` wire family — the ChatGPT-backend Responses API.\n *\n * This is the transport used by \"Sign in with ChatGPT\" (OAuth) credentials.\n * It speaks the OpenAI **Responses** wire format (NOT chat/completions) and\n * targets `https://chatgpt.com/backend-api/codex/responses`, authenticating\n * with the OAuth access token + `chatgpt-account-id` header. It deliberately\n * leaves the API-key `openai` family (api.openai.com/chat/completions)\n * untouched — the two coexist as separate providers.\n *\n * Token lifecycle: the access token is short-lived. This adapter refreshes it\n * transparently — before a request when it is near expiry, and once more on a\n * 401 — using the stored refresh token, then invokes `onRefresh` so the CLI\n * can persist the rotated tokens back to the vault.\n *\n * The refresh endpoint + client id are duplicated here (rather than imported\n * from the CLI) to respect the package layering: `providers` must not depend\n * on `cli`. They are tiny constants that match the CLI login module.\n */\n\nimport {\n type Capabilities,\n ProviderError,\n type Request,\n type StopReason,\n type StreamEvent,\n safeParse,\n type Usage,\n} from '@wrongstack/core';\nimport { parseToolInput } from './_tool-input.js';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { parseSSE } from './sse.js';\nimport { messagesToResponsesInput, toolsToResponses } from './tool-format/to-responses.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n// ── OAuth refresh constants (mirror packages/cli auth-menu/openai-codex-oauth) ─\n\nconst CLIENT_ID = 'app_EMoamEEZ73f0CkXaXp7hrann';\nconst TOKEN_URL = 'https://auth.openai.com/oauth/token';\nconst JWT_CLAIM_PATH = 'https://api.openai.com/auth';\nconst DEFAULT_CODEX_BASE = 'https://chatgpt.com/backend-api';\n/** Refresh this many ms before the token's stated expiry. */\nconst REFRESH_SKEW_MS = 60_000;\n\nexport interface CodexOAuthTokens {\n access: string;\n refresh: string;\n /** Absolute expiry in epoch milliseconds. */\n expires: number;\n}\n\n/** Refresh an expired Codex access token using its refresh token. */\nexport async function refreshCodexAccessToken(\n refreshToken: string,\n signal?: AbortSignal,\n): Promise<CodexOAuthTokens> {\n const res = await fetch(TOKEN_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams({\n grant_type: 'refresh_token',\n client_id: CLIENT_ID,\n refresh_token: refreshToken,\n }).toString(),\n signal: signal\n ? AbortSignal.any([signal, AbortSignal.timeout(30_000)])\n : AbortSignal.timeout(30_000),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => '');\n throw new Error(`Codex token refresh failed (${res.status}): ${text || res.statusText}`);\n }\n const json = (await res.json()) as {\n access_token?: string;\n refresh_token?: string;\n expires_in?: number;\n } | null;\n if (!json?.access_token || !json.refresh_token || typeof json.expires_in !== 'number') {\n throw new Error('Codex token refresh response missing fields');\n }\n return {\n access: json.access_token,\n refresh: json.refresh_token,\n expires: Date.now() + json.expires_in * 1000,\n };\n}\n\n/** Extract `chatgpt_account_id` from an access-token JWT, or null. */\nexport function extractAccountId(token: string): string | null {\n try {\n const parts = token.split('.');\n if (parts.length !== 3) return null;\n const payload = JSON.parse(Buffer.from(parts[1]!, 'base64url').toString('utf8')) as Record<\n string,\n unknown\n >;\n const auth = payload[JWT_CLAIM_PATH] as { chatgpt_account_id?: string } | undefined;\n const id = auth?.chatgpt_account_id;\n return typeof id === 'string' && id.length > 0 ? id : null;\n } catch {\n return null;\n }\n}\n\n// ── Provider ────────────────────────────────────────────────────────────────\n\nexport interface CodexCredentials {\n /** The OAuth access token (a JWT). */\n accessToken: string;\n /** The refresh token, used to mint a new access token before/at expiry. */\n refreshToken?: string | undefined;\n /** Access-token expiry, epoch ms. When absent, refresh only fires on 401. */\n expiresAt?: number | undefined;\n /** Cached ChatGPT account id. Re-derived from the live token when missing. */\n accountId?: string | undefined;\n}\n\nexport interface OpenAICodexProviderOptions {\n credentials: CodexCredentials;\n baseUrl?: string | undefined;\n id?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n /**\n * Persist rotated tokens after a successful refresh. The CLI wires this to\n * write back to the encrypted config so the new access/refresh pair survive\n * the session.\n */\n onRefresh?:\n | ((creds: {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n accountId: string | undefined;\n }) => void)\n | undefined;\n /** Override the refresh call (tests). */\n refreshFn?:\n | ((refreshToken: string, signal?: AbortSignal) => Promise<CodexOAuthTokens>)\n | undefined;\n /**\n * Reasoning effort for the Codex (gpt-5.x) reasoning models. Sent as\n * `reasoning.effort` with `summary: 'auto'` so chain-of-thought streams back\n * as thinking deltas. Default 'medium'. Set 'none' to omit reasoning entirely.\n */\n reasoningEffort?: 'none' | 'minimal' | 'low' | 'medium' | 'high' | undefined;\n}\n\nexport class OpenAICodexProvider extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n\n private access: string;\n private refresh: string | undefined;\n private expiresAt: number | undefined;\n private accountId: string | undefined;\n private readonly onRefresh: OpenAICodexProviderOptions['onRefresh'];\n private readonly refreshFn: (\n refreshToken: string,\n signal?: AbortSignal,\n ) => Promise<CodexOAuthTokens>;\n private readonly reasoningEffort: 'none' | 'minimal' | 'low' | 'medium' | 'high';\n\n constructor(opts: OpenAICodexProviderOptions) {\n super(\n opts.credentials.accessToken,\n opts.baseUrl ?? DEFAULT_CODEX_BASE,\n opts.fetchImpl,\n opts.streamOpts,\n );\n this.id = opts.id ?? 'openai-codex';\n this.access = opts.credentials.accessToken;\n this.refresh = opts.credentials.refreshToken;\n this.expiresAt = opts.credentials.expiresAt;\n this.accountId = opts.credentials.accountId ?? extractAccountId(this.access) ?? undefined;\n this.onRefresh = opts.onRefresh;\n this.refreshFn = opts.refreshFn ?? refreshCodexAccessToken;\n this.reasoningEffort = opts.reasoningEffort ?? 'medium';\n this.capabilities = capabilitiesForFamily('openai-codex', { ...opts.capabilities });\n }\n\n override async *stream(req: Request, opts: { signal: AbortSignal }): AsyncIterable<StreamEvent> {\n await this.ensureFreshToken(opts.signal);\n try {\n yield* super.stream(req, opts);\n } catch (err) {\n // A 401 means the token went stale between the pre-flight check and the\n // request (or we had no expiry to check). Refresh once and retry — the\n // error is thrown before any StreamEvent is emitted, so no output is\n // duplicated.\n if (err instanceof ProviderError && err.status === 401 && this.refresh) {\n await this.doRefresh(opts.signal);\n yield* super.stream(req, opts);\n return;\n }\n throw err;\n }\n }\n\n private async ensureFreshToken(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n if (this.expiresAt !== undefined && Date.now() < this.expiresAt - REFRESH_SKEW_MS) return;\n await this.doRefresh(signal);\n }\n\n private async doRefresh(signal: AbortSignal): Promise<void> {\n if (!this.refresh) return;\n const t = await this.refreshFn(this.refresh, signal);\n this.access = t.access;\n this.refresh = t.refresh;\n this.expiresAt = t.expires;\n this.accountId = extractAccountId(t.access) ?? this.accountId;\n this.onRefresh?.({\n accessToken: t.access,\n refreshToken: t.refresh,\n expiresAt: t.expires,\n accountId: this.accountId,\n });\n }\n\n protected override buildUrl(_req: Request): string {\n return resolveCodexUrl(this.baseUrl);\n }\n\n protected override buildHeaders(_req: Request): Record<string, string> {\n const headers: Record<string, string> = {\n ...super.buildHeaders(_req),\n authorization: `Bearer ${this.access}`,\n originator: 'wrongstack',\n 'OpenAI-Beta': 'responses=experimental',\n };\n if (this.accountId) headers['chatgpt-account-id'] = this.accountId;\n return headers;\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const instructions =\n req.system && req.system.length > 0\n ? req.system.map((b) => b.text).join('\\n\\n')\n : 'You are a helpful assistant.';\n\n const body: Record<string, unknown> = {\n model: req.model,\n // The ChatGPT Codex backend rejects `store: true` (\"Store must be set to\n // false\"). We send the full conversation as `input` each turn.\n store: false,\n stream: true,\n instructions,\n input: messagesToResponsesInput(req.messages),\n include: ['reasoning.encrypted_content'],\n parallel_tool_calls: true,\n };\n\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToResponses(req.tools);\n body['tool_choice'] = mapToolChoice(req.toolChoice);\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (this.reasoningEffort !== 'none') {\n body['reasoning'] = { effort: this.reasoningEffort, summary: 'auto' };\n }\n return body;\n }\n\n protected override parseStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return parseCodexResponsesStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, text: string): ProviderError {\n return parseProviderHttpError(this.id, status, text);\n }\n}\n\n// ── URL + tool-choice helpers ────────────────────────────────────────────────\n\n/** Normalize a base URL to the `/codex/responses` endpoint. */\nexport function resolveCodexUrl(baseUrl: string | undefined): string {\n const raw = baseUrl && baseUrl.trim().length > 0 ? baseUrl : DEFAULT_CODEX_BASE;\n const normalized = raw.replace(/\\/+$/, '');\n if (normalized.endsWith('/codex/responses')) return normalized;\n if (normalized.endsWith('/codex')) return `${normalized}/responses`;\n return `${normalized}/codex/responses`;\n}\n\nfunction mapToolChoice(\n choice: Request['toolChoice'],\n): 'auto' | 'required' | 'none' | { type: 'function'; name: string } {\n if (choice === undefined) return 'auto';\n if (choice === 'auto' || choice === 'required' || choice === 'none') return choice;\n return { type: 'function', name: choice.name };\n}\n\n// ── Responses SSE → StreamEvent ──────────────────────────────────────────────\n\ninterface ResponsesUsage {\n input_tokens?: number;\n output_tokens?: number;\n total_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n}\n\nasync function* parseCodexResponsesStream(\n body: ReadableStream<Uint8Array> | NodeJS.ReadableStream | null,\n fallbackModel: string,\n): AsyncIterable<StreamEvent> {\n let model = fallbackModel;\n let started = false;\n let usage: Usage = { input: 0, output: 0 };\n let stopReason: StopReason = 'end_turn';\n let sawToolUse = false;\n\n // Currently-streaming function call (Responses streams one item at a time).\n let toolCallId: string | undefined;\n let toolArgBuf = '';\n\n const ensureStart = (): StreamEvent | undefined => {\n if (started) return undefined;\n started = true;\n return { type: 'message_start', model };\n };\n\n for await (const msg of parseSSE(body)) {\n if (!msg.data || msg.data === '[DONE]') continue;\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) continue;\n const evt = parsed.value;\n const type = typeof evt['type'] === 'string' ? (evt['type'] as string) : '';\n\n switch (type) {\n case 'response.created':\n case 'response.in_progress': {\n const resp = evt['response'] as { model?: string } | undefined;\n if (typeof resp?.model === 'string') model = resp.model;\n const s = ensureStart();\n if (s) yield s;\n break;\n }\n\n case 'response.output_item.added': {\n const s = ensureStart();\n if (s) yield s;\n const item = evt['item'] as\n | { type?: string; id?: string; call_id?: string; name?: string; arguments?: string }\n | undefined;\n if (!item) break;\n if (item.type === 'reasoning') {\n yield { type: 'thinking_start' };\n } else if (item.type === 'function_call') {\n toolCallId = item.call_id ?? item.id ?? `call_${Math.random().toString(36).slice(2)}`;\n toolArgBuf = item.arguments ?? '';\n sawToolUse = true;\n yield { type: 'tool_use_start', id: toolCallId, name: item.name ?? 'unknown' };\n if (toolArgBuf.length > 0) {\n yield { type: 'tool_use_input_delta', id: toolCallId, partial: toolArgBuf };\n }\n }\n // item.type === 'message' → text flows via output_text.delta\n break;\n }\n\n case 'response.output_text.delta':\n case 'response.refusal.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (delta) yield { type: 'text_delta', text: delta };\n break;\n }\n\n case 'response.reasoning_text.delta':\n case 'response.reasoning_summary_text.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (delta) yield { type: 'thinking_delta', text: delta };\n break;\n }\n\n case 'response.function_call_arguments.delta': {\n const delta = typeof evt['delta'] === 'string' ? (evt['delta'] as string) : '';\n if (toolCallId && delta) {\n toolArgBuf += delta;\n yield { type: 'tool_use_input_delta', id: toolCallId, partial: delta };\n }\n break;\n }\n\n case 'response.function_call_arguments.done': {\n // Final arguments authoritative — captured at output_item.done below.\n const args =\n typeof evt['arguments'] === 'string' ? (evt['arguments'] as string) : undefined;\n if (args !== undefined) toolArgBuf = args;\n break;\n }\n\n case 'response.output_item.done': {\n const item = evt['item'] as\n | { type?: string; id?: string; call_id?: string; name?: string; arguments?: string }\n | undefined;\n if (!item) break;\n if (item.type === 'reasoning') {\n yield { type: 'thinking_stop' };\n } else if (item.type === 'function_call') {\n const id = item.call_id ?? toolCallId ?? `call_${Math.random().toString(36).slice(2)}`;\n const raw = item.arguments && item.arguments.length > 0 ? item.arguments : toolArgBuf;\n yield { type: 'tool_use_stop', id, input: parseToolInput(raw || '{}') };\n toolCallId = undefined;\n toolArgBuf = '';\n }\n break;\n }\n\n case 'response.completed':\n case 'response.incomplete': {\n const resp = evt['response'] as { status?: string; usage?: ResponsesUsage } | undefined;\n if (resp?.usage) usage = normalizeUsage(resp.usage);\n stopReason = mapResponsesStatus(resp?.status, sawToolUse);\n break;\n }\n\n case 'error':\n case 'response.failed': {\n const message =\n (evt['message'] as string | undefined) ??\n (evt['response'] as { error?: { message?: string } } | undefined)?.error?.message ??\n 'Codex response failed';\n throw new ProviderError(message, 502, true, 'openai-codex', {\n body: { message },\n });\n }\n\n default:\n break;\n }\n }\n\n if (started) {\n yield { type: 'message_stop', stopReason, usage };\n }\n}\n\nfunction normalizeUsage(u: ResponsesUsage): Usage {\n const cached = u.input_tokens_details?.cached_tokens ?? 0;\n const total = u.input_tokens ?? 0;\n return {\n input: Math.max(0, total - cached),\n output: u.output_tokens ?? 0,\n cacheRead: cached || undefined,\n };\n}\n\nfunction mapResponsesStatus(status: string | undefined, sawToolUse: boolean): StopReason {\n if (status === 'incomplete') return 'max_tokens';\n // 'completed' (and anything else benign) → tool_use when a call was emitted.\n return sawToolUse ? 'tool_use' : 'end_turn';\n}\n","/**\n * Canonical WrongStack messages/tools → OpenAI **Responses** API wire shapes.\n *\n * Used by the `openai-codex` family (ChatGPT backend). The Responses API takes\n * a flat `input` array of typed items rather than chat/completions `messages`:\n * - user text/image → { role:'user', content:[{type:'input_text'|'input_image', ...}] }\n * - assistant prose → { type:'message', role:'assistant', content:[{type:'output_text', ...}] }\n * - assistant tool call → { type:'function_call', call_id, name, arguments }\n * - tool result → { type:'function_call_output', call_id, output }\n *\n * `thinking` blocks are intentionally dropped from the input: replaying them\n * would require the opaque `reasoning.encrypted_content` blob (which we don't\n * persist), and omitting them — plus omitting function-call item ids — sidesteps\n * the Responses reasoning/tool-call pairing validation entirely.\n */\n\nimport type {\n ContentBlock,\n ImageBlock,\n Message,\n TextBlock,\n Tool,\n ToolResultBlock,\n ToolUseBlock,\n} from '@wrongstack/core';\nimport { compactToolDefinitionForWire } from '@wrongstack/core';\n\nexport interface ResponsesTool {\n type: 'function';\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n strict: boolean;\n}\n\nconst _toolCache = new WeakMap<Tool[], ResponsesTool[]>();\n\nexport function toolsToResponses(tools: Tool[]): ResponsesTool[] {\n const hit = _toolCache.get(tools);\n if (hit) return hit;\n const result = tools.map((t): ResponsesTool => {\n const compact = compactToolDefinitionForWire(t);\n return {\n type: 'function',\n name: compact.name,\n description: compact.description,\n parameters: compact.inputSchema,\n strict: false,\n };\n });\n _toolCache.set(tools, result);\n return result;\n}\n\nfunction normalizeContent(content: string | ContentBlock[]): ContentBlock[] {\n return typeof content === 'string' ? [{ type: 'text', text: content }] : content;\n}\n\nfunction imageUrl(b: ImageBlock): string {\n return b.source.type === 'url'\n ? (b.source.url ?? '')\n : `data:${b.source.media_type ?? 'image/png'};base64,${b.source.data ?? ''}`;\n}\n\nexport function messagesToResponsesInput(messages: Message[]): Record<string, unknown>[] {\n const out: Record<string, unknown>[] = [];\n\n for (const msg of messages) {\n const blocks = normalizeContent(msg.content);\n\n if (msg.role === 'user') {\n // Tool results ride inside user turns in the canonical format. Emit them\n // as standalone function_call_output items first (order-independent here).\n const toolResults = blocks.filter((b): b is ToolResultBlock => b.type === 'tool_result');\n for (const r of toolResults) {\n out.push({\n type: 'function_call_output',\n call_id: r.tool_use_id,\n output: typeof r.content === 'string' ? r.content : JSON.stringify(r.content),\n });\n }\n\n const others = blocks.filter((b) => b.type !== 'tool_result');\n if (others.length > 0) {\n const content = others\n .map((b): Record<string, unknown> | null => {\n if (b.type === 'text') return { type: 'input_text', text: b.text };\n if (b.type === 'image') {\n return { type: 'input_image', detail: 'auto', image_url: imageUrl(b) };\n }\n return null;\n })\n .filter((c): c is Record<string, unknown> => c !== null);\n if (content.length > 0) out.push({ role: 'user', content });\n }\n } else if (msg.role === 'assistant') {\n const textBlocks = blocks.filter((b): b is TextBlock => b.type === 'text');\n const toolUses = blocks.filter((b): b is ToolUseBlock => b.type === 'tool_use');\n\n const text = textBlocks.map((b) => b.text).join('');\n if (text.length > 0) {\n out.push({\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n status: 'completed',\n });\n }\n\n for (const u of toolUses) {\n out.push({\n type: 'function_call',\n call_id: u.id,\n name: u.name,\n arguments: JSON.stringify(u.input ?? {}),\n });\n }\n }\n }\n\n return out;\n}\n","import type { Request } from '@wrongstack/core';\nimport type { Capabilities } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\nimport { OpenAIProvider } from './openai.js';\nimport type { WireAdapterStreamOptions } from './wire-adapter.js';\n\nexport interface CompatibilityQuirks {\n stripCacheControl?: boolean | undefined;\n systemAsMessage?: boolean | undefined;\n flattenContentToString?: boolean | undefined;\n preserveToolCallIds?: boolean | undefined;\n parallelToolsDisabled?: boolean | undefined;\n jsonArgumentsBuggy?: boolean | undefined;\n emptyToolCallContent?: 'null' | 'empty_string' | undefined;\n thinkingParam?: 'zai-glm' | 'kimi-toggle' | 'always-on' | undefined;\n}\n\nconst VALID_QUIRK_KEYS = new Set<keyof CompatibilityQuirks>([\n 'stripCacheControl',\n 'systemAsMessage',\n 'flattenContentToString',\n 'preserveToolCallIds',\n 'parallelToolsDisabled',\n 'jsonArgumentsBuggy',\n 'emptyToolCallContent',\n 'thinkingParam',\n]);\n\nexport function isCompatibilityQuirks(value: unknown): value is CompatibilityQuirks {\n if (value === undefined) return true;\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return false;\n\n const obj = value as Record<string, unknown>;\n for (const [key, v] of Object.entries(obj)) {\n if (!VALID_QUIRK_KEYS.has(key as keyof CompatibilityQuirks)) return false;\n if (key === 'emptyToolCallContent') {\n if (v !== 'null' && v !== 'empty_string') return false;\n } else if (key === 'thinkingParam') {\n if (v !== 'zai-glm' && v !== 'kimi-toggle' && v !== 'always-on') return false;\n } else if (typeof v !== 'boolean') {\n return false;\n }\n }\n return true;\n}\n\nexport interface OpenAICompatibleOptions {\n id: string;\n apiKey: string;\n baseUrl: string;\n headers?: Record<string, string> | undefined;\n quirks?: CompatibilityQuirks | undefined;\n capabilities?: Partial<Capabilities> | undefined;\n fetchImpl?: typeof fetch | undefined;\n /**\n * Optional override for URL construction. Receives the base URL and request,\n * returns the full URL to use. Allows custom providers with non-standard\n * URL structures (e.g. Google with model-in-path, Anthropic with /v1/messages).\n */\n urlOverride?: ((baseUrl: string, req: Request) => string) | undefined;\n /** Raw stream debugging and hang-detection options. */\n streamOpts?: WireAdapterStreamOptions | undefined;\n}\n\nexport class OpenAICompatibleProvider extends OpenAIProvider {\n private readonly extraHeaders?: Record<string, string> | undefined;\n private readonly urlOverride?: ((baseUrl: string, req: Request) => string) | undefined;\n\n constructor(opts: OpenAICompatibleOptions) {\n super({\n apiKey: opts.apiKey,\n baseUrl: opts.baseUrl,\n fetchImpl: opts.fetchImpl,\n id: opts.id,\n capabilities: capabilitiesForFamily('openai-compatible', {\n parallelTools: !opts.quirks?.parallelToolsDisabled,\n systemPrompt: !opts.quirks?.systemAsMessage,\n ...opts.capabilities,\n }),\n quirks: opts.quirks,\n streamOpts: opts.streamOpts,\n });\n this.extraHeaders = opts.headers;\n this.urlOverride = opts.urlOverride;\n }\n\n protected override buildUrl(req: Request): string {\n if (this.urlOverride) {\n return this.urlOverride(this.baseUrl, req);\n }\n return super.buildUrl(req);\n }\n\n /**\n * Compatible endpoints (Groq, Together, Mistral, local servers, …) follow the\n * classic Chat Completions contract and accept `max_tokens`; many reject\n * OpenAI's newer `max_completion_tokens`. Keep the legacy field here. See #10.\n */\n protected override tokenLimitParam(): string {\n return 'max_tokens';\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n const body = super.buildBody(req);\n applyThinkingParams(body, req, this.opts.quirks?.thinkingParam);\n return body;\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.extraHeaders,\n };\n }\n}\n\nfunction applyThinkingParams(\n body: Record<string, unknown>,\n req: Request,\n mode: CompatibilityQuirks['thinkingParam'],\n): void {\n if (!mode || !req.reasoning) return;\n if (mode === 'always-on') {\n // Models such as kimi-k2.7-code reject explicit disabled thinking.\n return;\n }\n if (req.reasoning.enabled === false) {\n body['thinking'] = { type: 'disabled' };\n return;\n }\n if (mode === 'kimi-toggle' && req.reasoning.enabled === true) {\n body['thinking'] = { type: 'enabled' };\n }\n if (mode === 'zai-glm' && req.reasoning.effort) {\n body['reasoning_effort'] = mapZaiReasoningEffort(req.reasoning.effort);\n }\n}\n\nfunction mapZaiReasoningEffort(effort: NonNullable<Request['reasoning']>['effort']): string | undefined {\n switch (effort) {\n case 'none':\n case 'minimal':\n return 'none';\n case 'low':\n case 'medium':\n return 'high';\n case 'xhigh':\n return 'max';\n default:\n return effort;\n }\n}\n","import type {\n Capabilities,\n Provider,\n ProviderFactory,\n Request,\n StreamEvent,\n WireFamily,\n} from '@wrongstack/core';\nimport type { ProviderError } from '@wrongstack/core';\nimport { parseProviderHttpError } from './error-parse.js';\nimport { type SSEMessage, parseSSE } from './sse.js';\nimport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\n\n/**\n * Declarative wire-format definition. Sufficient to add a new HTTP+SSE\n * provider without subclassing `WireAdapter` — the boilerplate (HTTP errors,\n * abort wiring, SSE body parsing) is shared.\n *\n * The shape covers the variation that actually matters between providers:\n * - URL template (path, query)\n * - Auth headers (x-api-key, Authorization, etc.)\n * - Request body (field names, system-prompt placement, tool format)\n * - SSE event translation (one wire event → 0+ canonical events)\n *\n * Anything more exotic (non-SSE streams, multipart bodies, OAuth flows) still\n * needs a hand-written subclass — those cases are too varied to template.\n *\n * `S` is provider-internal state threaded across SSE events for one stream:\n * accumulating partial tool-call JSON, tracking block kinds, carrying the\n * model id forward from `message_start`, etc. Each `stream()` call gets a\n * fresh `S` via `createStreamState`.\n */\nexport interface WireFormatConfig<S = Record<string, unknown>> {\n /** Provider id (matches catalog id when the provider is in models.dev). */\n id: string;\n /** Wire family — used by the registry's factory list. */\n family: WireFamily;\n capabilities: Capabilities;\n /** Used when the user doesn't override via config.baseUrl. */\n defaultBaseUrl: string;\n /** Build the HTTPS endpoint. Receives the (possibly user-overridden) base URL. */\n buildUrl(baseUrl: string, req: Request): string;\n /** Per-request headers. Default `content-type`/`accept` are provided already. */\n buildHeaders(apiKey: string, req: Request): Record<string, string>;\n /** Map a canonical Request onto the provider's body shape. */\n buildBody(req: Request): Record<string, unknown>;\n /** Construct fresh per-stream state. Called once per `stream()` call. */\n createStreamState(fallbackModel: string): S;\n /**\n * Translate one SSE event into 0+ canonical events. Mutating `state` is\n * expected — providers carry per-stream accumulators (partial tool JSON,\n * current model id, usage) here.\n */\n parseStreamEvent(msg: SSEMessage, state: S): StreamEvent[];\n /**\n * Optional: yield any final events after the upstream stream closes\n * (e.g. emit a synthetic `message_stop` when the wire format ends with\n * `[DONE]` instead of an explicit terminator).\n */\n finalizeStream?(state: S): StreamEvent[];\n /** Optional override; defaults to the shared HTTP error parser. */\n normalizeError?(status: number, body: string): ProviderError;\n}\n\n/**\n * Concrete Provider built from a declarative config. Extends WireAdapter to\n * inherit the canonical HTTP + abort + error machinery.\n */\nexport class WireFormatProvider<S = Record<string, unknown>> extends WireAdapter {\n override readonly id: string;\n override readonly capabilities: Capabilities;\n private readonly cfg: WireFormatConfig<S>;\n\n constructor(\n cfg: WireFormatConfig<S>,\n opts: {\n apiKey: string;\n baseUrl?: string | undefined;\n fetchImpl?: typeof fetch | undefined;\n streamOpts?: WireAdapterStreamOptions | undefined;\n },\n ) {\n super(opts.apiKey, opts.baseUrl ?? cfg.defaultBaseUrl, opts.fetchImpl, opts.streamOpts);\n this.id = cfg.id;\n this.capabilities = cfg.capabilities;\n this.cfg = cfg;\n }\n\n protected override buildUrl(req: Request): string {\n return this.cfg.buildUrl(this.baseUrl, req);\n }\n\n protected override buildHeaders(req: Request): Record<string, string> {\n return {\n ...super.buildHeaders(req),\n ...this.cfg.buildHeaders(this.apiKey, req),\n };\n }\n\n protected override buildBody(req: Request): Record<string, unknown> {\n return this.cfg.buildBody(req);\n }\n\n protected override parseStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n return this.runStream(body, fallbackModel);\n }\n\n protected override translateError(status: number, body: string): ProviderError {\n return this.cfg.normalizeError\n ? this.cfg.normalizeError(status, body)\n : parseProviderHttpError(this.id, status, body);\n }\n\n private async *runStream(\n body: Parameters<typeof parseSSE>[0],\n fallbackModel: string,\n ): AsyncIterable<StreamEvent> {\n const state = this.cfg.createStreamState(fallbackModel);\n for await (const msg of parseSSE(body)) {\n for (const ev of this.cfg.parseStreamEvent(msg, state)) {\n yield ev;\n }\n }\n if (this.cfg.finalizeStream) {\n for (const ev of this.cfg.finalizeStream(state)) {\n yield ev;\n }\n }\n }\n}\n\n/**\n * Identity helper that gives authors type checking on the config literal.\n * Use at module level:\n *\n * export const myProvider = defineWireFormat({\n * id: 'mistral',\n * family: 'openai-compatible',\n * capabilities: { ... },\n * ...\n * });\n */\nexport function defineWireFormat<S = Record<string, unknown>>(\n cfg: WireFormatConfig<S>,\n): WireFormatConfig<S> {\n return cfg;\n}\n\nexport interface WireFactoryOptions {\n /**\n * Optional config-time override of the API key. When omitted, the factory\n * reads `cfg.apiKey` (passed in at create time by the registry / config\n * loader). Setting this here is useful in tests.\n */\n apiKey?: string | undefined;\n /** Override the base URL at factory build time. */\n baseUrl?: string | undefined;\n}\n\n/**\n * Build a `ProviderFactory` from a declarative wire-format. Plug into\n * `ProviderRegistry.register(...)` or use in `buildProviderFactoriesFromRegistry`\n * for catalog-driven discovery.\n */\nexport function createWireFormatFactory(\n cfg: WireFormatConfig,\n opts: WireFactoryOptions = {},\n): ProviderFactory {\n return {\n type: cfg.id,\n family: cfg.family,\n create: (rawCfg: unknown): Provider => {\n const c = rawCfg as { apiKey?: string | undefined; baseUrl?: string | undefined };\n const apiKey = opts.apiKey ?? c.apiKey;\n if (!apiKey) {\n throw new Error(`Provider \"${cfg.id}\" requires an apiKey.`);\n }\n return new WireFormatProvider(cfg, {\n apiKey,\n baseUrl: opts.baseUrl ?? c.baseUrl,\n });\n },\n };\n}\n","/**\n * Mistral provider as a declarative wire-format config — a 50-line proof\n * that adding a new OpenAI-flavored provider doesn't require subclassing.\n *\n * Mistral's streaming chat completion API is OpenAI-compatible at the wire\n * level, with `delta.content` + `delta.tool_calls` + `[DONE]` terminator.\n * For exotic providers the same pattern still applies — only the\n * `parseStreamEvent` body changes.\n */\nimport type { Request, StopReason, StreamEvent } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface MistralStreamState {\n model: string;\n started: boolean;\n // OpenAI-style tool_call accumulators keyed by `index`\n toolCalls: Map<\n number,\n { id?: string | undefined; name?: string | undefined; partial: string; emittedStart: boolean; emittedArgLength: number }\n >;\n}\n\nexport const mistralWireFormat = defineWireFormat<MistralStreamState>({\n id: 'mistral',\n family: 'openai-compatible',\n capabilities: capabilitiesForFamily('openai-compatible', {\n jsonMode: true,\n maxContext: 128_000,\n }),\n defaultBaseUrl: 'https://api.mistral.ai/v1',\n buildUrl: (base) => `${base.replace(/\\/+$/, '')}/chat/completions`,\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages),\n max_tokens: req.maxTokens,\n stream: true,\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n started: false,\n toolCalls: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n model?: string | undefined;\n choices?: {\n delta?: {\n content?: string | undefined;\n tool_calls?: {\n index: number;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }[];\n };\n finish_reason?: string | undefined;\n }[];\n usage?: { prompt_tokens?: number | undefined; completion_tokens?: number | undefined };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const out: StreamEvent[] = [];\n if (ev.model) state.model = ev.model;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n const choice = ev.choices?.[0];\n if (choice?.delta?.content) {\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n for (const tc of choice?.delta?.tool_calls ?? []) {\n let block = state.toolCalls.get(tc.index);\n if (!block) {\n block = {\n id: tc.id,\n name: tc.function?.name,\n partial: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolCalls.set(tc.index, block);\n } else {\n if (tc.id && !block.id) block.id = tc.id;\n if (tc.function?.name && !block.name) block.name = tc.function.name;\n }\n const arg = tc.function?.arguments;\n if (arg) {\n block.partial += arg;\n }\n if (!block.emittedStart && block.id && block.name) {\n block.emittedStart = true;\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n if (block.emittedStart && block.id && block.emittedArgLength < block.partial.length) {\n const partial = block.partial.slice(block.emittedArgLength);\n block.emittedArgLength = block.partial.length;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial });\n }\n }\n if (choice?.finish_reason) {\n // Close out tool calls with parsed JSON\n for (const block of state.toolCalls.values()) {\n if (block.id && block.name) {\n if (!block.emittedStart) {\n out.push({ type: 'tool_use_start', id: block.id, name: block.name });\n }\n out.push({\n type: 'tool_use_stop',\n id: block.id,\n input: parseToolInput(block.partial),\n });\n }\n }\n out.push({\n type: 'message_stop',\n stopReason: mapStopReason(choice.finish_reason),\n usage: {\n input: ev.usage?.prompt_tokens ?? 0,\n output: ev.usage?.completion_tokens ?? 0,\n },\n });\n }\n return out;\n },\n});\n\nfunction mapStopReason(reason: string): StopReason {\n switch (reason) {\n case 'tool_calls':\n return 'tool_use';\n case 'length':\n case 'model_length':\n return 'max_tokens';\n case 'stop':\n return 'end_turn';\n default:\n return 'end_turn';\n }\n}\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","/**\n * Anthropic provider expressed as a declarative `WireFormatConfig`.\n *\n * The existing `AnthropicProvider` class stays as the production path until\n * the rest of the registry switches over — both produce the same canonical\n * StreamEvent[]. The per-message logic here is extracted verbatim from\n * `parseAnthropicStream` in `../anthropic.ts`, just split into a stateful\n * `parseStreamEvent` call instead of an async generator loop.\n */\nimport type { Message, Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { ProviderError, safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeAnthropic } from '../stop-reason.js';\nimport { toolsToAnthropic } from '../tool-format/to-anthropic.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ntype BlockKind = 'text' | 'tool_use' | 'thinking' | 'unknown';\n\ninterface AnthropicStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n stopped: boolean;\n blocks: Map<number, { kind: BlockKind; id?: string | undefined; name?: string | undefined; partial: string }>;\n}\n\nconst DEFAULT_VERSION = '2023-06-01';\n\nexport const anthropicWireFormat = defineWireFormat<AnthropicStreamState>({\n id: 'anthropic',\n family: 'anthropic',\n capabilities: capabilitiesForFamily('anthropic'),\n defaultBaseUrl: 'https://api.anthropic.com',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/v\\d+\\/messages$/.test(b)) return b;\n if (/\\/v\\d+$/.test(b)) return `${b}/messages`;\n return `${b}/v1/messages`;\n },\n buildHeaders: (apiKey) => ({\n 'x-api-key': apiKey,\n 'anthropic-version': DEFAULT_VERSION,\n }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n max_tokens: req.maxTokens,\n messages: req.messages.map((m: Message) => ({\n role: m.role === 'system' ? 'user' : m.role,\n content: m.content,\n })),\n stream: true,\n };\n if (req.system && req.system.length > 0) body['system'] = req.system;\n if (req.tools && req.tools.length > 0) body['tools'] = toolsToAnthropic(req.tools);\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop_sequences'] = req.stopSequences;\n if (req.toolChoice) body['tool_choice'] = req.toolChoice;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n stopped: false,\n blocks: new Map(),\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const ev = parsed.value;\n const type = String(ev['type'] ?? msg.event);\n const out: StreamEvent[] = [];\n\n switch (type) {\n case 'message_start': {\n const message = ev['message'] as\n | {\n model?: string | undefined;\n usage?: {\n input_tokens?: number | undefined;\n cache_read_input_tokens?: number | undefined;\n cache_creation_input_tokens?: number | undefined;\n };\n }\n | undefined;\n if (message?.model) state.model = message.model;\n state.usage = {\n input: message?.usage?.input_tokens ?? 0,\n output: 0,\n cacheRead: message?.usage?.cache_read_input_tokens,\n cacheWrite: message?.usage?.cache_creation_input_tokens,\n };\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n break;\n }\n case 'content_block_start': {\n const index = Number(ev['index'] ?? 0);\n const cb = ev['content_block'] as { type?: string | undefined; id?: string | undefined; name?: string | undefined } | undefined;\n if (cb?.type === 'tool_use') {\n state.blocks.set(index, { kind: 'tool_use', id: cb.id, name: cb.name, partial: '' });\n if (cb.id && cb.name) {\n out.push({ type: 'tool_use_start', id: cb.id, name: cb.name });\n }\n } else if (cb?.type === 'text') {\n state.blocks.set(index, { kind: 'text', partial: '' });\n } else if (cb?.type === 'thinking' || cb?.type === 'redacted_thinking') {\n state.blocks.set(index, { kind: 'thinking', partial: '' });\n out.push({ type: 'thinking_start' });\n } else {\n state.blocks.set(index, { kind: 'unknown', partial: '' });\n }\n break;\n }\n case 'content_block_delta': {\n const index = Number(ev['index'] ?? 0);\n const delta = ev['delta'] as\n | {\n type?: string | undefined;\n text?: string | undefined;\n partial_json?: string | undefined;\n thinking?: string | undefined;\n signature?: string | undefined;\n }\n | undefined;\n const block = state.blocks.get(index);\n if (!block || !delta) break;\n if (delta.type === 'text_delta' && typeof delta.text === 'string') {\n out.push({ type: 'text_delta', text: delta.text });\n } else if (delta.type === 'input_json_delta' && typeof delta.partial_json === 'string') {\n if (block.id) {\n block.partial += delta.partial_json;\n out.push({ type: 'tool_use_input_delta', id: block.id, partial: delta.partial_json });\n }\n } else if (delta.type === 'thinking_delta' && typeof delta.thinking === 'string') {\n out.push({ type: 'thinking_delta', text: delta.thinking });\n } else if (delta.type === 'signature_delta' && typeof delta.signature === 'string') {\n out.push({ type: 'thinking_signature', signature: delta.signature });\n }\n break;\n }\n case 'content_block_stop': {\n const index = Number(ev['index'] ?? 0);\n const block = state.blocks.get(index);\n if (block?.kind === 'tool_use' && block.id) {\n const input = parseToolInput(block.partial);\n out.push({ type: 'tool_use_stop', id: block.id, input });\n } else if (block?.kind === 'thinking') {\n out.push({ type: 'thinking_stop' });\n }\n break;\n }\n case 'message_delta': {\n const delta = ev['delta'] as { stop_reason?: string | null | undefined } | undefined;\n const u = ev['usage'] as { output_tokens?: number | undefined } | undefined;\n if (delta?.stop_reason !== undefined) {\n state.stopReason = normalizeAnthropic(delta.stop_reason);\n }\n if (u?.output_tokens !== undefined) {\n state.usage = { ...state.usage, output: u.output_tokens };\n }\n break;\n }\n case 'message_stop':\n state.stopped = true;\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n break;\n case 'error': {\n const err = ev['error'] as { message?: string | undefined; type?: string | undefined } | undefined;\n throw new ProviderError(err?.message ?? 'Anthropic stream error', 0, false, 'anthropic', {\n body: { type: err?.type, message: err?.message },\n });\n }\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n // If upstream closed without an explicit `message_stop` we synthesize\n // one so the consumer's stream-end logic still fires.\n if (state.started && !state.stopped) {\n return [{ type: 'message_stop', stopReason: state.stopReason, usage: state.usage }];\n }\n return [];\n },\n});\n","/**\n * OpenAI provider as a declarative `WireFormatConfig`. Same canonical events\n * as `OpenAIProvider`; the per-message body is the loop body of\n * `parseOpenAIStream` split into a stateful step.\n */\nimport type { Request, StopReason, StreamEvent, Usage } from '@wrongstack/core';\nimport { safeParse } from '@wrongstack/core';\nimport { parseToolInput } from '../_tool-input.js';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeOpenAI } from '../stop-reason.js';\nimport { messagesToOpenAI, toolsToOpenAI } from '../tool-format/to-openai.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface OpenAIStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n textOpen: boolean;\n thinkingOpen: boolean;\n toolByIndex: Map<\n number,\n { id?: string | undefined; name?: string | undefined; argBuf: string; emittedStart: boolean; emittedArgLength: number }\n >;\n finalEmitted: boolean;\n}\n\nexport const openaiWireFormat = defineWireFormat<OpenAIStreamState>({\n id: 'openai',\n family: 'openai',\n capabilities: capabilitiesForFamily('openai'),\n defaultBaseUrl: 'https://api.openai.com/v1',\n buildUrl: (base) => {\n const b = base.replace(/\\/+$/, '');\n if (/\\/chat\\/completions$/.test(b)) return b;\n if (/\\/v\\d+(\\/[a-z0-9_-]+)*$/i.test(b)) return `${b}/chat/completions`;\n return `${b}/v1/chat/completions`;\n },\n buildHeaders: (apiKey) => ({ authorization: `Bearer ${apiKey}` }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n model: req.model,\n messages: messagesToOpenAI(stripCacheControl(req.system), req.messages),\n // Real OpenAI requires `max_completion_tokens`; newer model families\n // (gpt-4o, o1/o3/o4) 400 on the deprecated `max_tokens`. See issue #10.\n max_completion_tokens: req.maxTokens,\n stream: true,\n stream_options: { include_usage: true },\n };\n if (req.tools && req.tools.length > 0) {\n body['tools'] = toolsToOpenAI(req.tools);\n if (req.toolChoice) {\n if (typeof req.toolChoice === 'string') {\n body['tool_choice'] = req.toolChoice === 'required' ? 'required' : req.toolChoice;\n } else {\n body['tool_choice'] = {\n type: 'function',\n function: { name: req.toolChoice.name },\n };\n }\n }\n }\n if (req.temperature !== undefined) body['temperature'] = req.temperature;\n if (req.topP !== undefined) body['top_p'] = req.topP;\n if (req.stopSequences) body['stop'] = req.stopSequences;\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n textOpen: false,\n thinkingOpen: false,\n toolByIndex: new Map(),\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<Record<string, unknown>>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (typeof obj['model'] === 'string') state.model = obj['model'] as string;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const choices = obj['choices'] as\n | Array<{\n delta?: {\n content?: string | null | undefined;\n reasoning_content?: string | undefined;\n reasoning?: string | undefined;\n tool_calls?: Array<{\n index?: number | undefined;\n id?: string | undefined;\n function?: { name?: string | undefined; arguments?: string | undefined };\n }>;\n };\n finish_reason?: string | null | undefined;\n }>\n | undefined;\n const choice = choices?.[0];\n\n // DeepSeek (and Moonshot/Kimi thinking mode, OpenRouter `reasoning`)\n // streams chain-of-thought as `delta.reasoning_content` at the top of\n // the delta. The full blob MUST be echoed back as message-level\n // `reasoning_content` on the next request — otherwise DeepSeek 400s.\n const reasoningDelta =\n typeof choice?.delta?.reasoning_content === 'string'\n ? choice.delta.reasoning_content\n : typeof choice?.delta?.reasoning === 'string'\n ? choice.delta.reasoning\n : undefined;\n if (reasoningDelta && reasoningDelta.length > 0) {\n if (!state.thinkingOpen) {\n state.thinkingOpen = true;\n out.push({ type: 'thinking_start' });\n }\n out.push({ type: 'thinking_delta', text: reasoningDelta });\n }\n\n if (choice?.delta?.content) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n if (!state.textOpen) state.textOpen = true;\n out.push({ type: 'text_delta', text: choice.delta.content });\n }\n\n if (choice?.delta?.tool_calls) {\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const tc of choice.delta.tool_calls) {\n const idx = tc.index ?? 0;\n let entry = state.toolByIndex.get(idx);\n if (!entry) {\n entry = {\n id: tc.id,\n name: tc.function?.name,\n argBuf: '',\n emittedStart: false,\n emittedArgLength: 0,\n };\n state.toolByIndex.set(idx, entry);\n } else {\n if (tc.id && !entry.id) entry.id = tc.id;\n if (tc.function?.name && !entry.name) entry.name = tc.function.name;\n }\n if (tc.function?.arguments) {\n entry.argBuf += tc.function.arguments;\n }\n if (!entry.emittedStart && entry.id && entry.name) {\n entry.emittedStart = true;\n state.textOpen = false;\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n if (entry.emittedStart && entry.id && entry.emittedArgLength < entry.argBuf.length) {\n const partial = entry.argBuf.slice(entry.emittedArgLength);\n entry.emittedArgLength = entry.argBuf.length;\n out.push({\n type: 'tool_use_input_delta',\n id: entry.id,\n partial,\n });\n }\n }\n }\n\n if (choice?.finish_reason) {\n state.stopReason = normalizeOpenAI(choice.finish_reason);\n }\n\n const u = obj['usage'] as\n | {\n prompt_tokens?: number | undefined;\n completion_tokens?: number | undefined;\n prompt_tokens_details?: { cached_tokens?: number | undefined };\n prompt_cache_hit_tokens?: number | undefined;\n prompt_cache_miss_tokens?: number | undefined;\n }\n | undefined;\n if (u) {\n // Mirror openai.ts: disjoint semantics: input is fresh-only,\n // cacheRead is the cached subset. Subtracting prevents the cost\n // calc / cache-hit-ratio from double-counting cached tokens.\n const hasDeepSeekCacheFields =\n u.prompt_cache_hit_tokens !== undefined || u.prompt_cache_miss_tokens !== undefined;\n const cached = u.prompt_tokens_details?.cached_tokens ?? u.prompt_cache_hit_tokens ?? 0;\n const promptTotal =\n u.prompt_tokens ??\n (hasDeepSeekCacheFields\n ? (u.prompt_cache_hit_tokens ?? 0) + (u.prompt_cache_miss_tokens ?? 0)\n : state.usage.input + cached);\n state.usage = {\n input: u.prompt_cache_miss_tokens ?? Math.max(0, promptTotal - cached),\n output: u.completion_tokens ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted) return [];\n state.finalEmitted = true;\n const out: StreamEvent[] = [];\n if (state.thinkingOpen) {\n state.thinkingOpen = false;\n out.push({ type: 'thinking_stop' });\n }\n for (const entry of state.toolByIndex.values()) {\n if (!entry.id || !entry.name) continue;\n if (!entry.emittedStart) {\n out.push({ type: 'tool_use_start', id: entry.id, name: entry.name });\n }\n const input = parseToolInput(entry.argBuf);\n out.push({ type: 'tool_use_stop', id: entry.id, input });\n }\n if (state.started) {\n out.push({ type: 'message_stop', stopReason: state.stopReason, usage: state.usage });\n }\n return out;\n },\n});\n\nfunction stripCacheControl(system: Request['system']): Request['system'] {\n if (!system) return undefined;\n return system.map((b) => {\n const { cache_control: _cc, ...rest } = b;\n return rest;\n });\n}\n","import { randomUUID } from 'node:crypto';\n/**\n * Google Gemini provider as a declarative `WireFormatConfig`. Matches the\n * `GoogleProvider` class behavior — same canonical events, same handling\n * of `thoughtSignature` and forced `tool_use` stop reason on functionCall\n * turns.\n */\nimport type { Message, Request, StopReason, StreamEvent, Tool, Usage } from '@wrongstack/core';\nimport { compactToolDefinitionForWire, safeParse } from '@wrongstack/core';\nimport { capabilitiesForFamily } from '../family-capabilities.js';\nimport { normalizeGemini } from '../stop-reason.js';\nimport { defineWireFormat } from '../wire-format.js';\n\ninterface GeminiPart {\n text?: string | undefined;\n functionCall?: { name: string | undefined; args: Record<string, unknown> };\n functionResponse?: { name: string | undefined; response: { content?: unknown | undefined } };\n inlineData?: { mimeType: string | undefined; data: string };\n thoughtSignature?: string | undefined;\n}\n\ninterface GeminiContent {\n role: 'user' | 'model' | 'function';\n parts: GeminiPart[];\n}\n\ninterface GeminiCandidate {\n content?: GeminiContent | undefined;\n finishReason?: string | undefined;\n}\n\ninterface GoogleStreamState {\n model: string;\n usage: Usage;\n stopReason: StopReason;\n started: boolean;\n sawFunctionCall: boolean;\n finalEmitted: boolean;\n}\n\nexport const googleWireFormat = defineWireFormat<GoogleStreamState>({\n id: 'google',\n family: 'google',\n capabilities: capabilitiesForFamily('google'),\n defaultBaseUrl: 'https://generativelanguage.googleapis.com/v1beta',\n buildUrl: (base, req) =>\n `${base}/models/${encodeURIComponent(req.model)}:streamGenerateContent?alt=sse`,\n buildHeaders: (apiKey) => ({ 'x-goog-api-key': apiKey }),\n buildBody: (req: Request) => {\n const body: Record<string, unknown> = {\n contents: messagesToGemini(req.messages),\n generationConfig: buildGenConfig(req),\n };\n if (req.system && req.system.length > 0) {\n body['systemInstruction'] = {\n parts: req.system.map((b) => ({ text: b.text })),\n };\n }\n if (req.tools && req.tools.length > 0) {\n body['tools'] = [{ functionDeclarations: toolsToGemini(req.tools) }];\n }\n return body;\n },\n createStreamState: (fallbackModel) => ({\n model: fallbackModel,\n usage: { input: 0, output: 0 },\n stopReason: 'end_turn',\n started: false,\n sawFunctionCall: false,\n finalEmitted: false,\n }),\n parseStreamEvent: (msg, state): StreamEvent[] => {\n if (!msg.data || msg.data === '[DONE]') return [];\n const parsed = safeParse<{\n modelVersion?: string | undefined;\n candidates?: GeminiCandidate[] | undefined;\n usageMetadata?: {\n promptTokenCount?: number | undefined;\n candidatesTokenCount?: number | undefined;\n cachedContentTokenCount?: number | undefined;\n };\n }>(msg.data);\n if (!parsed.ok || !parsed.value) return [];\n const obj = parsed.value;\n const out: StreamEvent[] = [];\n\n if (obj.modelVersion) state.model = obj.modelVersion;\n if (!state.started) {\n state.started = true;\n out.push({ type: 'message_start', model: state.model });\n }\n\n const candidate = obj.candidates?.[0];\n for (const part of candidate?.content?.parts ?? []) {\n if (typeof part.text === 'string' && part.text.length > 0) {\n out.push({ type: 'text_delta', text: part.text });\n } else if (part.functionCall) {\n const name = part.functionCall.name;\n if (typeof name !== 'string' || name.length === 0) continue;\n state.sawFunctionCall = true;\n const id = `${name}_${randomUUID().slice(0, 8)}`;\n out.push({ type: 'tool_use_start', id, name });\n const providerMeta =\n typeof part.thoughtSignature === 'string'\n ? { 'google.thoughtSignature': part.thoughtSignature }\n : undefined;\n out.push({\n type: 'tool_use_stop',\n id,\n input: part.functionCall.args ?? {},\n ...(providerMeta ? { providerMeta } : {}),\n });\n }\n }\n\n if (candidate?.finishReason) {\n state.stopReason = normalizeGemini(candidate.finishReason);\n }\n\n const u = obj.usageMetadata;\n if (u) {\n // Disjoint semantics — see google.ts for rationale.\n const cached = u.cachedContentTokenCount ?? 0;\n const promptTotal = u.promptTokenCount ?? state.usage.input + cached;\n state.usage = {\n input: Math.max(0, promptTotal - cached),\n output: u.candidatesTokenCount ?? state.usage.output,\n cacheRead: cached || state.usage.cacheRead,\n };\n }\n return out;\n },\n finalizeStream: (state): StreamEvent[] => {\n if (state.finalEmitted || !state.started) return [];\n state.finalEmitted = true;\n const finalStop: StopReason = state.sawFunctionCall ? 'tool_use' : state.stopReason;\n return [{ type: 'message_stop', stopReason: finalStop, usage: state.usage }];\n },\n});\n\nfunction buildGenConfig(req: Request): Record<string, unknown> {\n const cfg: Record<string, unknown> = { maxOutputTokens: req.maxTokens };\n if (req.temperature !== undefined) cfg['temperature'] = req.temperature;\n if (req.topP !== undefined) cfg['topP'] = req.topP;\n if (req.stopSequences) cfg['stopSequences'] = req.stopSequences;\n return cfg;\n}\n\nfunction toolsToGemini(tools: Tool[]): Array<Record<string, unknown>> {\n return tools.map((t) => {\n const compact = compactToolDefinitionForWire(t);\n return {\n name: compact.name,\n description: compact.description,\n parameters: sanitizeSchemaForGemini(compact.inputSchema) ?? {\n type: 'object',\n properties: {},\n },\n };\n });\n}\n\nconst GEMINI_ALLOWED_KEYS = new Set([\n 'type',\n 'format',\n 'description',\n 'nullable',\n 'enum',\n 'items',\n 'properties',\n 'required',\n 'anyOf',\n 'minLength',\n 'maxLength',\n 'pattern',\n 'minimum',\n 'maximum',\n 'minItems',\n 'maxItems',\n 'minProperties',\n 'maxProperties',\n 'propertyOrdering',\n 'title',\n]);\n\nfunction sanitizeSchemaForGemini(node: unknown): Record<string, unknown> | undefined {\n if (node === null || node === undefined) return undefined;\n if (Array.isArray(node)) return undefined;\n if (typeof node !== 'object') return undefined;\n const src = node as Record<string, unknown>;\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(src)) {\n if (!GEMINI_ALLOWED_KEYS.has(k)) continue;\n if (k === 'properties' && v && typeof v === 'object') {\n const props: Record<string, unknown> = {};\n for (const [pname, pschema] of Object.entries(v as Record<string, unknown>)) {\n const cleaned = sanitizeSchemaForGemini(pschema);\n if (cleaned) props[pname] = cleaned;\n }\n out['properties'] = props;\n } else if (k === 'items') {\n const cleaned = sanitizeSchemaForGemini(v);\n if (cleaned) out['items'] = cleaned;\n } else if (k === 'anyOf' && Array.isArray(v)) {\n const cleaned = v\n .map((s) => sanitizeSchemaForGemini(s))\n .filter((s): s is Record<string, unknown> => s !== undefined);\n if (cleaned.length > 0) out['anyOf'] = cleaned;\n } else if (k === 'required' && Array.isArray(v)) {\n out['required'] = v.filter((s) => typeof s === 'string');\n } else if (k === 'enum' && Array.isArray(v)) {\n out['enum'] = v;\n } else {\n out[k] = v;\n }\n }\n return out;\n}\n\nfunction messagesToGemini(messages: Message[]): GeminiContent[] {\n const out: GeminiContent[] = [];\n for (const m of messages) {\n if (m.role === 'system') continue;\n const blocks =\n typeof m.content === 'string' ? [{ type: 'text' as const, text: m.content }] : m.content;\n if (m.role === 'assistant') {\n const parts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) parts.push({ text: b.text });\n else if (b.type === 'tool_use') {\n const part: GeminiPart = {\n functionCall: { name: b.name, args: b.input },\n };\n const sig = b.providerMeta?.['google.thoughtSignature'];\n if (typeof sig === 'string' && sig.length > 0) {\n part.thoughtSignature = sig;\n }\n parts.push(part);\n }\n }\n if (parts.length > 0) out.push({ role: 'model', parts });\n continue;\n }\n const textParts: GeminiPart[] = [];\n const functionParts: GeminiPart[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && b.text) textParts.push({ text: b.text });\n else if (b.type === 'tool_result') {\n const responseText = typeof b.content === 'string' ? b.content : JSON.stringify(b.content);\n const fnName = b.name ?? b.tool_use_id;\n functionParts.push({\n functionResponse: {\n name: fnName,\n response: { content: responseText },\n },\n });\n } else if (b.type === 'image' && b.source.type === 'base64') {\n textParts.push({\n inlineData: {\n mimeType: b.source.media_type ?? 'image/png',\n data: b.source.data ?? '',\n },\n });\n }\n }\n if (textParts.length > 0) out.push({ role: 'user', parts: textParts });\n if (functionParts.length > 0) out.push({ role: 'function', parts: functionParts });\n }\n return out;\n}\n","import type { Capabilities, CustomModelDefinition, ModelsRegistry } from '@wrongstack/core';\nimport { capabilitiesForFamily } from './family-capabilities.js';\n\n/**\n * Resolve capabilities for a (provider, model) pair using the family default\n * as a baseline and overlaying per-model facts from the ModelsRegistry.\n *\n * Priority chain (highest first):\n * 1. customModels[modelId].capabilities — user-defined per-model overrides\n * 2. model facts from registry — sub-fields AND-ed with base\n * 3. family default — e.g. 32K for openai-compatible\n */\nexport async function capabilitiesFor(\n registry: ModelsRegistry,\n providerId: string,\n modelId: string,\n customModels?: Record<string, CustomModelDefinition>,\n): Promise<Capabilities> {\n const provider = await registry.getProvider(providerId);\n const base = capabilitiesForFamily(provider?.family ?? 'unsupported');\n\n // User-defined custom model overrides take top priority when present.\n const customDef = customModels?.[modelId];\n const customCaps = customDef?.capabilities;\n\n const model = await registry.getModel(providerId, modelId);\n\n // Without any model info at all, return base (possibly with custom overrides).\n if (!model && !customCaps) return { ...base };\n\n // maxContext resolution:\n // 1. customCaps.maxContext — user explicitly overrides\n // 2. model.capabilities.maxContext — registry getModel()\n // 3. raw model limit.context — direct provider.models fallback\n // 4. base.maxContext — family default\n const rawModel = provider?.models.find((m) => m.id === modelId);\n const catalogMaxContext =\n model?.capabilities.maxContext ||\n rawModel?.limit?.context ||\n rawModel?.limit?.output ||\n base.maxContext;\n\n // Per-field priority: customCaps (if set) → model facts AND-ed with base → base.\n // AND-ing with base is conservative: a model can't have a capability the\n // wire family doesn't support. Custom overrides skip this guard because\n // the user explicitly opted in.\n const modelTools = model?.capabilities.tools ?? false;\n const modelVision = model?.capabilities.vision ?? false;\n const modelReasoning = model?.capabilities.reasoning ?? false;\n\n return {\n ...base,\n // Capability booleans: AND model facts with base unless custom overrides\n tools: customCaps?.tools ?? (modelTools && base.tools),\n parallelTools: customCaps?.parallelTools ?? (modelTools && base.parallelTools),\n vision: customCaps?.vision ?? (modelVision && base.vision),\n reasoning: customCaps?.reasoning ?? modelReasoning,\n // Scalar fields: custom override wins, then catalog, then base\n maxContext: customCaps?.maxContext ?? catalogMaxContext,\n streaming: customCaps?.streaming ?? base.streaming,\n promptCache: customCaps?.promptCache ?? base.promptCache,\n systemPrompt: customCaps?.systemPrompt ?? base.systemPrompt,\n jsonMode: customCaps?.jsonMode ?? base.jsonMode,\n cacheControl: customCaps?.cacheControl ?? base.cacheControl,\n };\n}\n","import type { ContentBlock } from '@wrongstack/core';\nimport { isPlainObject } from '../object-utils.js';\n\ninterface AnthropicBlock {\n type: string;\n text?: string | undefined;\n id?: string | undefined;\n name?: string | undefined;\n input?: unknown | undefined;\n content?: unknown | undefined;\n tool_use_id?: string | undefined;\n is_error?: boolean | undefined;\n thinking?: string | undefined;\n signature?: string | undefined;\n source?: {\n type?: 'base64' | 'url' | undefined;\n media_type?: string | undefined;\n data?: string | undefined;\n url?: string | undefined;\n };\n}\n\nexport interface FromAnthropicOptions {\n /**\n * Called once for each block whose `type` the converter doesn't recognize.\n * The block is still dropped — this hook only exists so callers can wire\n * it into observability (event bus, logger) instead of silently losing\n * data. Anthropic ships new block types over time (`thinking`,\n * `server_tool_use`, etc.) and we want a way to find out without\n * inflating the conversion logic itself.\n */\n onUnsupported?: (type: string, block: AnthropicBlock) => void;\n}\n\nexport function contentFromAnthropic(\n blocks: AnthropicBlock[],\n opts: FromAnthropicOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n for (const b of blocks) {\n if (b.type === 'text' && typeof b.text === 'string') {\n out.push({ type: 'text', text: b.text });\n } else if (b.type === 'tool_use' && b.id && b.name) {\n const input = isPlainObject(b.input) ? b.input : {};\n out.push({ type: 'tool_use', id: b.id, name: b.name, input });\n } else if (b.type === 'tool_result' && b.tool_use_id) {\n out.push({\n type: 'tool_result',\n tool_use_id: b.tool_use_id,\n content: normalizeToolResultContent(b.content, opts),\n is_error: b.is_error,\n });\n } else if (b.type === 'thinking' && typeof b.thinking === 'string') {\n // Anthropic extended-thinking block. Must round-trip on the next\n // request — without it Anthropic returns 400 \"content[].thinking\n // in the thinking mode must be passed back to the API\".\n out.push({\n type: 'thinking',\n thinking: b.thinking,\n ...(b.signature ? { signature: b.signature } : {}),\n });\n } else if (b.type === 'image' && b.source) {\n const src = b.source;\n const kind = src.type === 'url' ? 'url' : 'base64';\n out.push({\n type: 'image',\n source: {\n type: kind,\n ...(src.media_type ? { media_type: src.media_type } : {}),\n ...(src.data ? { data: src.data } : {}),\n ...(src.url ? { url: src.url } : {}),\n },\n });\n } else if (b.type) {\n opts.onUnsupported?.(b.type, b);\n }\n }\n return out;\n}\n\n/**\n * Convert Anthropic's tool_result content to our canonical string format.\n * Anthropic ships tool_result.content as either a plain string or an array\n * of `{ type: 'text', text }` / `{ type: 'image', source }` sub-blocks.\n * We flatten sub-block arrays to a string so the canonical type stays `string`.\n * If the caller needs the raw array structure (e.g. for image preservation),\n * they should call `contentFromAnthropic` directly on the raw Anthropic block\n * instead of going through a ToolResultBlock.\n */\nfunction normalizeToolResultContent(raw: unknown, opts: FromAnthropicOptions): string {\n if (typeof raw === 'string') return raw;\n if (Array.isArray(raw)) {\n // Flatten sub-block structure to a text representation.\n // Callers who need the full structure should use contentFromAnthropic\n // directly on the raw Anthropic block before constructing a ToolResultBlock.\n const blocks = contentFromAnthropic(raw as AnthropicBlock[], opts);\n return blocks.map((b) => (b.type === 'text' ? b.text : `[${b.type}]`)).join('');\n }\n if (raw === undefined || raw === null) return '';\n return JSON.stringify(raw);\n}\n\n","import { randomUUID } from 'node:crypto';\nimport type { ContentBlock, ToolUseBlock } from '@wrongstack/core';\nimport { sanitizeJsonString } from '@wrongstack/core';\nimport type { OpenAIToolCall } from './to-openai.js';\n\nexport interface OpenAIChoice {\n message: {\n role: string;\n content: string | null;\n tool_calls?: OpenAIToolCall[] | undefined;\n };\n finish_reason: string | null;\n}\n\nexport interface FromOpenAIOptions {\n /**\n * Deprecated: the sanitizer fallback is now always attempted. Kept for\n * backward compatibility; the value is ignored.\n * TODO(breaking): remove in next major release.\n */\n jsonArgumentsBuggy?: boolean | undefined;\n /**\n * Called when a tool call's `arguments` field can't be parsed even after\n * the sanitizer pass. Callers can use this to emit a structured event,\n * log it, or surface it in a UI. The block is still appended with\n * `{ __raw_arguments }` so the tool gets *something* to fail on, but\n * silently producing garbage input is the kind of bug that wastes\n * debugging hours — this is the hook to find out.\n */\n onParseFailure?: (info: { toolName: string; toolCallId: string; raw: string }) => void;\n}\n\nexport function contentFromOpenAI(\n choice: OpenAIChoice,\n opts: FromOpenAIOptions = {},\n): ContentBlock[] {\n const out: ContentBlock[] = [];\n const text = choice.message.content;\n // Preserve any non-empty text, including whitespace-only — model output\n // sometimes legitimately starts with a newline or padding spaces. Only\n // skip the truly empty case to avoid duplicate empty blocks.\n if (typeof text === 'string' && text.length > 0) {\n out.push({ type: 'text', text });\n }\n for (const tc of choice.message.tool_calls ?? []) {\n const raw = tc.function.arguments ?? '{}';\n // Some OpenAI-compatible servers omit `id` on tool calls. An empty id\n // breaks tool_result correlation downstream, so synthesize a stable one\n // — matching the streaming path and the Google adapter.\n const id = tc.id || `call_${randomUUID()}`;\n const input = parseToolArguments(raw, tc.function.name, id, opts);\n const block: ToolUseBlock = {\n type: 'tool_use',\n id,\n name: tc.function.name,\n input,\n };\n out.push(block);\n }\n if (out.length === 0) {\n out.push({ type: 'text', text: '' });\n }\n return out;\n}\n\nfunction parseToolArguments(\n raw: string,\n toolName: string,\n toolCallId: string,\n opts: FromOpenAIOptions,\n): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n // Salvage case: parsed value is a string (scalar) but contains a serialized JSON object.\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n // JSON parsed but is a scalar/array — wrap so the tool gets a stable\n // object shape, but flag it as a parse anomaly so callers can detect.\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n } catch {\n // First-pass failed — try the sanitizer (handles trailing commas,\n // JS-style comments, smart quotes the model sometimes emits).\n const sanitized = sanitizeJsonString(raw);\n if (sanitized !== null) {\n try {\n const parsed = JSON.parse(sanitized) as unknown;\n if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {\n return parsed as Record<string, unknown>;\n }\n if (typeof parsed === 'string') {\n const trimmed = parsed.trim();\n if (trimmed.startsWith('{') && trimmed.endsWith('}')) {\n const parsed2 = JSON.parse(trimmed) as unknown;\n if (parsed2 && typeof parsed2 === 'object' && !Array.isArray(parsed2)) {\n return parsed2 as Record<string, unknown>;\n }\n }\n }\n } catch {\n // fall through\n }\n }\n opts.onParseFailure?.({ toolName, toolCallId, raw });\n return { __raw_arguments: raw };\n }\n}\n","import { expectDefined } from '@wrongstack/core';\nimport type {\n Logger,\n ModelsRegistry,\n Provider,\n ProviderApiKey,\n ProviderConfig,\n ProviderFactory,\n ResolvedProvider,\n WireFamily,\n} from '@wrongstack/core';\nimport { ERROR_CODES, WrongStackError } from '@wrongstack/core';\nimport { AnthropicProvider } from './anthropic.js';\nimport { AnthropicOAuthProvider } from './anthropic-oauth.js';\nimport { GitHubCopilotProvider } from './github-copilot.js';\nimport { GoogleProvider } from './google.js';\nimport { OpenAICodexProvider } from './openai-codex.js';\nimport {\n type CompatibilityQuirks,\n isCompatibilityQuirks,\n OpenAICompatibleProvider,\n} from './openai-compatible.js';\nimport { OpenAIProvider } from './openai.js';\nexport { AnthropicProvider, type AnthropicProviderOptions } from './anthropic.js';\nexport { OpenAIProvider, type OpenAIProviderOptions } from './openai.js';\nexport {\n OpenAICompatibleProvider,\n type OpenAICompatibleOptions,\n type CompatibilityQuirks,\n} from './openai-compatible.js';\nexport { GoogleProvider, type GoogleProviderOptions } from './google.js';\nexport {\n OpenAICodexProvider,\n type OpenAICodexProviderOptions,\n type CodexCredentials,\n type CodexOAuthTokens,\n refreshCodexAccessToken,\n extractAccountId,\n resolveCodexUrl,\n} from './openai-codex.js';\nexport {\n AnthropicOAuthProvider,\n type AnthropicOAuthProviderOptions,\n type AnthropicOAuthCredentials,\n type AnthropicOAuthTokens,\n refreshAnthropicOAuthToken,\n CLAUDE_CODE_SYSTEM_PROMPT,\n} from './anthropic-oauth.js';\nexport {\n GitHubCopilotProvider,\n type GitHubCopilotProviderOptions,\n type CopilotCredentials,\n type CopilotTokenResult,\n refreshCopilotToken,\n copilotBaseUrlFromToken,\n} from './github-copilot.js';\nexport { WireAdapter, type WireAdapterStreamOptions } from './wire-adapter.js';\nexport {\n isDebugStreamEnabled,\n setDebugStreamEnabled,\n setDebugStreamCallback,\n pushDebugChunkStats,\n defaultDebugStreamCallback,\n type DebugStreamStats,\n type DebugStreamCallback,\n} from './stream-debug-state.js';\nexport {\n WireFormatProvider,\n defineWireFormat,\n createWireFormatFactory,\n type WireFormatConfig,\n type WireFactoryOptions,\n} from './wire-format.js';\nexport { mistralWireFormat } from './presets/mistral.js';\nexport { anthropicWireFormat } from './presets/anthropic.js';\nexport { openaiWireFormat } from './presets/openai.js';\nexport { googleWireFormat } from './presets/google.js';\nexport { capabilitiesFor } from './capabilities.js';\nexport { capabilitiesForFamily, CAPABILITIES_BY_FAMILY } from './family-capabilities.js';\nexport { parseProviderHttpError } from './error-parse.js';\nexport { normalizeAnthropic, normalizeOpenAI } from './stop-reason.js';\nexport { toolsToAnthropic } from './tool-format/to-anthropic.js';\nexport { contentFromAnthropic } from './tool-format/from-anthropic.js';\nexport {\n toolsToOpenAI,\n messagesToOpenAI,\n type OpenAIMessage,\n type OpenAIToolCall,\n type ConvertOptions,\n} from './tool-format/to-openai.js';\nexport { contentFromOpenAI, type OpenAIChoice } from './tool-format/from-openai.js';\n\nexport interface BuildFactoriesOptions {\n registry: ModelsRegistry;\n /** Used to log unsupported families during boot. */\n log?: Logger | undefined;\n}\n\n/** Rotated-token payload handed to the OAuth persister after a refresh. */\nexport interface OAuthRefreshedTokens {\n accessToken: string;\n refreshToken: string;\n expiresAt: number;\n /** ChatGPT account id (codex only); undefined for other OAuth families. */\n accountId?: string | undefined;\n}\n\n/** @deprecated use OAuthRefreshedTokens */\nexport type CodexRefreshedTokens = OAuthRefreshedTokens;\n\n/**\n * Module-level hook so refreshed OAuth tokens (openai-codex, anthropic-oauth, …)\n * can be persisted back to the encrypted config WITHOUT threading a\n * vault/configPath through every provider-construction site. The CLI installs\n * this once at boot. When unset (tests, headless tools), refresh still works\n * in-memory for the session — only cross-session persistence is skipped.\n */\nlet _oauthPersist: ((providerId: string, creds: OAuthRefreshedTokens) => void) | undefined;\n\nexport function setOAuthTokenPersister(\n fn: ((providerId: string, creds: OAuthRefreshedTokens) => void) | undefined,\n): void {\n _oauthPersist = fn;\n}\n\n/** @deprecated use setOAuthTokenPersister */\nexport const setCodexTokenPersister = setOAuthTokenPersister;\n\n/**\n * Build one ProviderFactory per provider known to models.dev. The factory's\n * `create(cfg)` resolves the wire-family at construction time and returns the\n * matching transport. Unsupported families return a stub that throws when\n * complete() is called, so the system can still boot.\n */\nexport async function buildProviderFactoriesFromRegistry(\n opts: BuildFactoriesOptions,\n): Promise<ProviderFactory[]> {\n const providers = await opts.registry.listProviders();\n const factories: ProviderFactory[] = [];\n const unsupported: ResolvedProvider[] = [];\n\n for (const p of providers) {\n if (p.family === 'unsupported') {\n unsupported.push(p);\n continue;\n }\n factories.push({\n type: p.id,\n family: p.family,\n create: (cfg: ProviderConfig) => makeProvider(p, cfg),\n });\n }\n\n // Generic factories so users can hand-roll a provider not in models.dev.\n factories.push({\n type: 'openai-compatible',\n family: 'openai-compatible',\n create: (cfg) =>\n new OpenAICompatibleProvider({\n id: 'openai-compatible',\n apiKey: requireKey(cfg),\n baseUrl: cfg.baseUrl ?? '',\n headers: cfg.headers,\n quirks: validateQuirks('openai-compatible', cfg.quirks),\n }),\n });\n\n if (unsupported.length > 0 && opts.log) {\n // Debug-only: the user already knows their plan; only surface when\n // troubleshooting why a specific provider isn't selectable.\n opts.log.info(\n `${unsupported.length} provider(s) need a plugin (unsupported wire family): ` +\n unsupported.map((p) => p.id).join(', '),\n );\n }\n\n return factories;\n}\n\n/**\n * Resolve the active API key from a ProviderConfig. Prefers `apiKeys[]`\n * (using `activeKey` to select), falls back to the legacy `apiKey` field.\n * This avoids reading `cfg.apiKey` directly, which may be absent after\n * `writeKeysBack` clears it to prevent serialization leaks.\n */\nfunction resolveActiveKey(cfg: ProviderConfig): string | undefined {\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\n const active = cfg.activeKey\n ? cfg.apiKeys.find((k) => k.label === cfg.activeKey)\n : undefined;\n return (active ?? cfg.apiKeys[0])?.apiKey;\n }\n return cfg.apiKey && cfg.apiKey.length > 0 ? cfg.apiKey : undefined;\n}\n\n/** Resolve the full active key ENTRY (not just the string) — needed by OAuth\n * families that carry refresh tokens / expiry / account id alongside the key. */\nfunction resolveActiveKeyEntry(cfg: ProviderConfig): ProviderApiKey | undefined {\n if (Array.isArray(cfg.apiKeys) && cfg.apiKeys.length > 0) {\n const active = cfg.activeKey\n ? cfg.apiKeys.find((k) => k.label === cfg.activeKey)\n : undefined;\n return active ?? cfg.apiKeys[0];\n }\n return undefined;\n}\n\nfunction makeProvider(p: ResolvedProvider, cfg: ProviderConfig): Provider {\n // Config overrides the catalog. This is the path that lets users wire\n // up internal proxies / self-hosted endpoints without needing models.dev.\n const family: WireFamily = cfg.family ?? p.family;\n const envVars = cfg.envVars && cfg.envVars.length > 0 ? cfg.envVars : p.envVars;\n const apiKey = resolveActiveKey(cfg) ?? readFromEnv(envVars);\n if (!apiKey && family !== 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" requires an API key. Set ${\n envVars.join(' or ') || 'apiKey in config'\n } or run \\`wstack auth ${p.id}\\`.`,\n );\n }\n const baseUrl = cfg.baseUrl ?? p.apiBase;\n\n if (!family || family === 'unsupported') {\n if (family === 'unsupported') {\n throw new Error(\n `Provider \"${p.id}\" uses an unsupported wire family (${p.npm ?? 'unknown'}). ` +\n `Register a custom factory via a plugin to enable it.`,\n );\n }\n throw new Error(\n `Provider \"${p.id}\" has no wire family configured. ` +\n `Set an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") in config or the models.dev catalog.`,\n );\n }\n\n switch (family) {\n case 'anthropic':\n return new AnthropicProvider({ apiKey: expectDefined(apiKey), baseUrl });\n case 'openai':\n return new OpenAIProvider({\n apiKey: expectDefined(apiKey),\n baseUrl,\n id: p.id,\n quirks: validateQuirks(p.id, cfg.quirks),\n });\n case 'openai-compatible':\n return new OpenAICompatibleProvider({\n id: p.id,\n apiKey: expectDefined(apiKey),\n baseUrl: baseUrl ?? '',\n headers: cfg.headers,\n quirks: validateQuirks(p.id, cfg.quirks),\n });\n case 'openai-codex': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new OpenAICodexProvider({\n id: p.id,\n baseUrl,\n credentials: {\n accessToken: expectDefined(apiKey),\n refreshToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n accountId: entry?.accountId,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'anthropic-oauth': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new AnthropicOAuthProvider({\n id: p.id,\n baseUrl,\n credentials: {\n accessToken: expectDefined(apiKey),\n refreshToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'github-copilot': {\n const entry = resolveActiveKeyEntry(cfg);\n const parsedExpiry = entry?.expiresAt ? Date.parse(entry.expiresAt) : Number.NaN;\n return new GitHubCopilotProvider({\n id: p.id,\n credentials: {\n copilotToken: resolveActiveKey(cfg) ?? '',\n githubToken: entry?.refreshToken,\n expiresAt: Number.isFinite(parsedExpiry) ? parsedExpiry : undefined,\n },\n onRefresh: (creds) => _oauthPersist?.(p.id, creds),\n });\n }\n case 'google':\n return new GoogleProvider({ id: p.id, apiKey: expectDefined(apiKey), baseUrl });\n default:\n throw new Error(`Unknown provider family: ${String(family)}`);\n }\n}\n\n/**\n * Build a Provider purely from config — no models.dev lookup at all.\n * Used for user-defined providers and offline operation.\n */\nexport function makeProviderFromConfig(id: string, cfg: ProviderConfig): Provider {\n if (!cfg.family) {\n throw new Error(\n `Provider \"${id}\" needs an explicit family (\"anthropic\" | \"openai\" | \"openai-compatible\" | \"google\") when not in the models.dev catalog.`,\n );\n }\n const synthetic: ResolvedProvider = {\n id,\n name: id,\n family: cfg.family,\n apiBase: cfg.baseUrl,\n envVars: cfg.envVars ?? [],\n models: (cfg.models ?? []).map((m) => ({ id: m, name: m })),\n npm: undefined,\n };\n return makeProvider(synthetic, cfg);\n}\n\nfunction readFromEnv(vars: string[]): string | undefined {\n for (const v of vars) {\n const val = process.env[v];\n if (val) return val;\n }\n return undefined;\n}\n\nfunction requireKey(cfg: ProviderConfig): string {\n const key = resolveActiveKey(cfg);\n if (key) return key;\n throw new Error('Provider config requires apiKey (or set the corresponding env var).');\n}\n\nfunction validateQuirks(providerId: string, quirks: unknown): CompatibilityQuirks | undefined {\n if (quirks === undefined) return undefined;\n if (isCompatibilityQuirks(quirks)) return quirks;\n throw new WrongStackError({\n message: `Invalid quirks for provider \"${providerId}\". Expected CompatibilityQuirks.`,\n code: ERROR_CODES.CONFIG_INVALID,\n subsystem: 'provider',\n });\n}\n"]}