@kenkaiiii/gg-ai 4.2.57 → 4.2.59
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.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -501,12 +501,19 @@ async function runStream(options, result) {
|
|
|
501
501
|
]
|
|
502
502
|
} : {},
|
|
503
503
|
...options.toolChoice && options.tools?.length ? { tool_choice: toAnthropicToolChoice(options.toolChoice) } : {},
|
|
504
|
-
...
|
|
504
|
+
...(() => {
|
|
505
|
+
const contextEdits = [
|
|
506
|
+
...options.compaction ? [{ type: "compact_20260112" }] : [],
|
|
507
|
+
...options.clearToolUses ? [{ type: "clear_tool_uses_20250919" }] : []
|
|
508
|
+
];
|
|
509
|
+
return contextEdits.length ? { context_management: { edits: contextEdits } } : {};
|
|
510
|
+
})(),
|
|
505
511
|
stream: true
|
|
506
512
|
};
|
|
507
513
|
const betaHeaders = [
|
|
508
514
|
...isOAuth ? ["claude-code-20250219", "oauth-2025-04-20"] : [],
|
|
509
|
-
...options.compaction ? ["compact-2026-01-12"] : []
|
|
515
|
+
...options.compaction ? ["compact-2026-01-12"] : [],
|
|
516
|
+
...options.clearToolUses ? ["context-management-2025-06-27"] : []
|
|
510
517
|
];
|
|
511
518
|
const stream2 = client.messages.stream(params, {
|
|
512
519
|
signal: options.signal ?? void 0,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/provider-registry.ts","../src/stream.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport { GGAIError, ProviderError } from \"./errors.js\";\n","export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system: rawSystem, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) => {\n if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\n },\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/provider-registry.ts","../src/stream.ts"],"sourcesContent":["// Core entry point\nexport { stream } from \"./stream.js\";\n\n// Provider registry\nexport { providerRegistry } from \"./provider-registry.js\";\nexport type { ProviderStreamFn, ProviderEntry } from \"./provider-registry.js\";\n\n// Types\nexport type {\n Provider,\n ThinkingLevel,\n CacheRetention,\n TextContent,\n ThinkingContent,\n ImageContent,\n ToolCall,\n ToolResult,\n ServerToolCall,\n ServerToolResult,\n ServerToolDefinition,\n RawContent,\n ContentPart,\n SystemMessage,\n UserMessage,\n AssistantMessage,\n ToolResultMessage,\n Message,\n Tool,\n ToolChoice,\n TextDeltaEvent,\n ThinkingDeltaEvent,\n ToolCallDeltaEvent,\n ToolCallDoneEvent,\n ServerToolCallEvent,\n ServerToolResultEvent,\n DoneEvent,\n ErrorEvent,\n StreamEvent,\n StopReason,\n StreamResponse,\n Usage,\n StreamOptions,\n} from \"./types.js\";\n\n// Classes\nexport { StreamResult, EventStream } from \"./utils/event-stream.js\";\nexport { GGAIError, ProviderError } from \"./errors.js\";\n","export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system: rawSystem, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) => {\n if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\n },\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["Anthropic","stream","runStream","toError","OpenAI","stream","runStream","toError","os"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -164,6 +164,9 @@ interface StreamOptions {
|
|
|
164
164
|
/** Enable server-side compaction (Anthropic only, beta). Automatically
|
|
165
165
|
* summarizes earlier context when approaching the context window limit. */
|
|
166
166
|
compaction?: boolean;
|
|
167
|
+
/** Enable server-side clearing of old tool use/result pairs (Anthropic only, beta).
|
|
168
|
+
* The API automatically removes older tool interactions to free context. */
|
|
169
|
+
clearToolUses?: boolean;
|
|
167
170
|
/** Custom fetch implementation. Useful in non-Node environments (e.g. Expo/React Native)
|
|
168
171
|
* where the default `globalThis.fetch` doesn't support streaming properly.
|
|
169
172
|
* Passed directly to the underlying provider SDK. */
|
package/dist/index.d.ts
CHANGED
|
@@ -164,6 +164,9 @@ interface StreamOptions {
|
|
|
164
164
|
/** Enable server-side compaction (Anthropic only, beta). Automatically
|
|
165
165
|
* summarizes earlier context when approaching the context window limit. */
|
|
166
166
|
compaction?: boolean;
|
|
167
|
+
/** Enable server-side clearing of old tool use/result pairs (Anthropic only, beta).
|
|
168
|
+
* The API automatically removes older tool interactions to free context. */
|
|
169
|
+
clearToolUses?: boolean;
|
|
167
170
|
/** Custom fetch implementation. Useful in non-Node environments (e.g. Expo/React Native)
|
|
168
171
|
* where the default `globalThis.fetch` doesn't support streaming properly.
|
|
169
172
|
* Passed directly to the underlying provider SDK. */
|
package/dist/index.js
CHANGED
|
@@ -460,12 +460,19 @@ async function runStream(options, result) {
|
|
|
460
460
|
]
|
|
461
461
|
} : {},
|
|
462
462
|
...options.toolChoice && options.tools?.length ? { tool_choice: toAnthropicToolChoice(options.toolChoice) } : {},
|
|
463
|
-
...
|
|
463
|
+
...(() => {
|
|
464
|
+
const contextEdits = [
|
|
465
|
+
...options.compaction ? [{ type: "compact_20260112" }] : [],
|
|
466
|
+
...options.clearToolUses ? [{ type: "clear_tool_uses_20250919" }] : []
|
|
467
|
+
];
|
|
468
|
+
return contextEdits.length ? { context_management: { edits: contextEdits } } : {};
|
|
469
|
+
})(),
|
|
464
470
|
stream: true
|
|
465
471
|
};
|
|
466
472
|
const betaHeaders = [
|
|
467
473
|
...isOAuth ? ["claude-code-20250219", "oauth-2025-04-20"] : [],
|
|
468
|
-
...options.compaction ? ["compact-2026-01-12"] : []
|
|
474
|
+
...options.compaction ? ["compact-2026-01-12"] : [],
|
|
475
|
+
...options.clearToolUses ? ["context-management-2025-06-27"] : []
|
|
469
476
|
];
|
|
470
477
|
const stream2 = client.messages.stream(params, {
|
|
471
478
|
signal: options.signal ?? void 0,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/provider-registry.ts","../src/stream.ts"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system: rawSystem, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(options.compaction\n ? { context_management: { edits: [{ type: \"compact_20260112\" }] } }\n : {}),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) => {\n if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\n },\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":"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","names":["stream","runStream","toError","stream","runStream","toError"]}
|
|
1
|
+
{"version":3,"sources":["../src/errors.ts","../src/utils/event-stream.ts","../src/providers/anthropic.ts","../src/utils/zod-to-json-schema.ts","../src/providers/transform.ts","../src/providers/openai.ts","../src/providers/openai-codex.ts","../src/provider-registry.ts","../src/stream.ts"],"sourcesContent":["export class GGAIError extends Error {\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = \"GGAIError\";\n }\n}\n\nexport class ProviderError extends GGAIError {\n readonly provider: string;\n readonly statusCode?: number;\n\n constructor(\n provider: string,\n message: string,\n options?: { statusCode?: number; cause?: unknown },\n ) {\n super(`[${provider}] ${message}`, { cause: options?.cause });\n this.name = \"ProviderError\";\n this.provider = provider;\n this.statusCode = options?.statusCode;\n }\n}\n","import type { StreamEvent, StreamResponse } from \"../types.js\";\n\n/**\n * Push-based async iterable. Producers push events, consumers\n * iterate with `for await`. Also supports thenable so you can\n * `await stream(...)` directly to get the final response.\n */\nexport class EventStream<T = StreamEvent> implements AsyncIterable<T> {\n private queue: T[] = [];\n private resolve: (() => void) | null = null;\n private done = false;\n private error: Error | null = null;\n\n push(event: T): void {\n // Safety valve: if queue grows beyond 10k unconsumed events, drop oldest\n // to prevent OOM when consumer is blocked/slow\n if (this.queue.length > 10_000) {\n this.queue.splice(0, this.queue.length - 5_000);\n }\n this.queue.push(event);\n this.resolve?.();\n this.resolve = null;\n }\n\n close(): void {\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n abort(error: Error): void {\n this.error = error;\n this.done = true;\n this.resolve?.();\n this.resolve = null;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n let index = 0;\n while (true) {\n while (index < this.queue.length) {\n yield this.queue[index++]!;\n }\n // Reset to avoid holding references to already-yielded events\n this.queue.splice(0, index);\n index = 0;\n if (this.error) throw this.error;\n if (this.done) return;\n await new Promise<void>((r) => {\n this.resolve = r;\n });\n }\n }\n}\n\n/**\n * Wraps EventStream and adds a `.response` promise that resolves\n * to the final StreamResponse. Also implements thenable so:\n *\n * const msg = await stream({...}) // awaits response\n * for await (const e of stream({...})) {} // iterates events\n */\nexport class StreamResult implements AsyncIterable<StreamEvent> {\n readonly events: EventStream<StreamEvent>;\n readonly response: Promise<StreamResponse>;\n private resolveResponse!: (r: StreamResponse) => void;\n private rejectResponse!: (e: Error) => void;\n private hasConsumer = false;\n\n constructor() {\n this.events = new EventStream<StreamEvent>();\n this.response = new Promise<StreamResponse>((resolve, reject) => {\n this.resolveResponse = resolve;\n this.rejectResponse = reject;\n });\n }\n\n push(event: StreamEvent): void {\n this.events.push(event);\n }\n\n complete(response: StreamResponse): void {\n this.events.close();\n this.resolveResponse(response);\n }\n\n abort(error: Error): void {\n this.events.abort(error);\n this.rejectResponse(error);\n }\n\n [Symbol.asyncIterator](): AsyncIterator<StreamEvent> {\n this.hasConsumer = true;\n return this.events[Symbol.asyncIterator]();\n }\n\n then<TResult1 = StreamResponse, TResult2 = never>(\n onfulfilled?: ((value: StreamResponse) => TResult1 | PromiseLike<TResult1>) | null,\n onrejected?: ((reason: unknown) => TResult2 | PromiseLike<TResult2>) | null,\n ): Promise<TResult1 | TResult2> {\n // Drain events so the stream completes\n this.drainEvents().catch(() => {});\n return this.response.then(onfulfilled, onrejected);\n }\n\n private async drainEvents(): Promise<void> {\n if (this.hasConsumer) return;\n this.hasConsumer = true;\n for await (const _ of this.events) {\n // consume silently\n }\n }\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n ContentPart,\n ServerToolCall,\n ServerToolResult,\n StreamOptions,\n StreamResponse,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeAnthropicStopReason,\n toAnthropicCacheControl,\n toAnthropicMessages,\n toAnthropicThinking,\n toAnthropicToolChoice,\n toAnthropicTools,\n} from \"./transform.js\";\n\nexport function streamAnthropic(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const isOAuth = options.apiKey?.startsWith(\"sk-ant-oat\");\n\n const client = new Anthropic({\n ...(isOAuth\n ? { apiKey: null as unknown as string, authToken: options.apiKey }\n : { apiKey: options.apiKey }),\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n ...(isOAuth\n ? {\n defaultHeaders: {\n \"user-agent\": \"claude-cli/2.1.75\",\n \"x-app\": \"cli\",\n },\n }\n : {}),\n });\n\n const cacheControl = toAnthropicCacheControl(options.cacheRetention, options.baseUrl);\n const { system: rawSystem, messages } = toAnthropicMessages(options.messages, cacheControl);\n\n // OAuth tokens require Claude Code identity in the system prompt\n const system = isOAuth\n ? [\n {\n type: \"text\" as const,\n text: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n },\n ...(rawSystem ?? []),\n ]\n : rawSystem;\n\n let maxTokens = options.maxTokens ?? 4096;\n let thinking: Anthropic.ThinkingConfigParam | undefined;\n let outputConfig: Record<string, unknown> | undefined;\n\n if (options.thinking) {\n const t = toAnthropicThinking(options.thinking, maxTokens, options.model);\n thinking = t.thinking;\n maxTokens = t.maxTokens;\n if (t.outputConfig) {\n outputConfig = t.outputConfig;\n }\n }\n\n const params: Anthropic.MessageCreateParams = {\n model: options.model,\n max_tokens: maxTokens,\n messages,\n ...(system ? { system: system as Anthropic.MessageCreateParams[\"system\"] } : {}),\n ...(thinking ? { thinking } : {}),\n ...(outputConfig\n ? { output_config: outputConfig as unknown as Anthropic.MessageCreateParams[\"output_config\"] }\n : {}),\n ...(options.temperature != null && !thinking ? { temperature: options.temperature } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop_sequences: options.stop } : {}),\n ...(options.tools?.length || options.serverTools?.length || options.webSearch\n ? {\n tools: [\n ...(options.tools?.length ? toAnthropicTools(options.tools) : []),\n ...(options.serverTools ?? []),\n ...(options.webSearch ? [{ type: \"web_search_20250305\", name: \"web_search\" }] : []),\n ] as Anthropic.MessageCreateParams[\"tools\"],\n }\n : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toAnthropicToolChoice(options.toolChoice) }\n : {}),\n ...(() => {\n const contextEdits = [\n ...(options.compaction ? [{ type: \"compact_20260112\" }] : []),\n ...(options.clearToolUses ? [{ type: \"clear_tool_uses_20250919\" }] : []),\n ];\n return contextEdits.length ? { context_management: { edits: contextEdits } } : {};\n })(),\n stream: true,\n } as Anthropic.MessageCreateParams;\n\n const betaHeaders = [\n ...(isOAuth ? [\"claude-code-20250219\", \"oauth-2025-04-20\"] : []),\n ...(options.compaction ? [\"compact-2026-01-12\"] : []),\n ...(options.clearToolUses ? [\"context-management-2025-06-27\"] : []),\n ];\n\n const stream = client.messages.stream(params, {\n signal: options.signal ?? undefined,\n ...(betaHeaders.length ? { headers: { \"anthropic-beta\": betaHeaders.join(\",\") } } : {}),\n });\n\n const contentParts: ContentPart[] = [];\n // Track the current tool call being streamed (by content block index)\n let currentToolId = \"\";\n let currentToolName = \"\";\n\n stream.on(\"text\", (text) => {\n result.push({ type: \"text_delta\", text });\n });\n\n stream.on(\"thinking\", (thinkingDelta) => {\n result.push({ type: \"thinking_delta\", text: thinkingDelta });\n });\n\n stream.on(\"streamEvent\", (event) => {\n if (event.type === \"content_block_start\") {\n // When a new tool_use content block starts, capture its id and name\n if (event.content_block.type === \"tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n // Track server_tool_use blocks\n if (event.content_block.type === \"server_tool_use\") {\n currentToolId = event.content_block.id;\n currentToolName = event.content_block.name;\n }\n }\n });\n\n stream.on(\"inputJson\", (delta) => {\n result.push({\n type: \"toolcall_delta\",\n id: currentToolId,\n name: currentToolName,\n argsJson: delta,\n });\n });\n\n stream.on(\"contentBlock\", (block) => {\n if (block.type === \"text\") {\n contentParts.push({ type: \"text\", text: block.text });\n } else if (block.type === \"thinking\") {\n contentParts.push({ type: \"thinking\", text: block.thinking, signature: block.signature });\n } else if (block.type === \"tool_use\") {\n const tc: ToolCall = {\n type: \"tool_call\",\n id: block.id,\n name: block.name,\n args: block.input as Record<string, unknown>,\n };\n contentParts.push(tc);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args: tc.args,\n });\n } else if (block.type === \"server_tool_use\") {\n const stc: ServerToolCall = {\n type: \"server_tool_call\",\n id: block.id,\n name: block.name,\n input: block.input,\n };\n contentParts.push(stc);\n result.push({\n type: \"server_toolcall\",\n id: stc.id,\n name: stc.name,\n input: stc.input,\n });\n } else {\n const raw = block as unknown as Record<string, unknown>;\n const blockType = raw.type as string;\n if (blockType === \"web_search_tool_result\") {\n // Server tool result blocks\n const str: ServerToolResult = {\n type: \"server_tool_result\",\n toolUseId: raw.tool_use_id as string,\n resultType: blockType,\n data: raw,\n };\n contentParts.push(str);\n result.push({\n type: \"server_toolresult\",\n toolUseId: str.toolUseId,\n resultType: str.resultType,\n data: str.data,\n });\n } else {\n // Preserve unknown blocks (e.g. compaction) for round-tripping\n contentParts.push({ type: \"raw\", data: raw });\n }\n }\n });\n\n try {\n const finalMessage = await stream.finalMessage();\n const stopReason = normalizeAnthropicStopReason(finalMessage.stop_reason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : \"\",\n },\n stopReason,\n usage: {\n inputTokens: finalMessage.usage.input_tokens,\n outputTokens: finalMessage.usage.output_tokens,\n ...((finalMessage.usage as unknown as Record<string, unknown>).cache_read_input_tokens !=\n null && {\n cacheRead: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_read_input_tokens as number,\n }),\n ...((finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens != null && {\n cacheWrite: (finalMessage.usage as unknown as Record<string, unknown>)\n .cache_creation_input_tokens as number,\n }),\n },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n } catch (err) {\n const error = toError(err);\n result.push({ type: \"error\", error });\n result.abort(error);\n }\n}\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof Anthropic.APIError) {\n return new ProviderError(\"anthropic\", err.message, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(\"anthropic\", err.message, { cause: err });\n }\n return new ProviderError(\"anthropic\", String(err));\n}\n","import { z } from \"zod\";\n\n/**\n * Converts a Zod schema to a JSON Schema object suitable for\n * provider tool parameter definitions.\n */\nexport function zodToJsonSchema(schema: z.ZodType): Record<string, unknown> {\n const jsonSchema = z.toJSONSchema(schema);\n // Remove $schema and other meta keys providers don't want\n const { $schema: _schema, ...rest } = jsonSchema as Record<string, unknown>;\n return rest;\n}\n","import type Anthropic from \"@anthropic-ai/sdk\";\nimport type OpenAI from \"openai\";\nimport type {\n CacheRetention,\n ContentPart,\n Message,\n StopReason,\n TextContent,\n ThinkingContent,\n ThinkingLevel,\n Tool,\n ToolChoice,\n} from \"../types.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\n// ── Anthropic Transforms ───────────────────────────────────\n\nexport function toAnthropicCacheControl(\n retention: CacheRetention | undefined,\n baseUrl: string | undefined,\n): { type: \"ephemeral\"; ttl?: \"1h\" } | undefined {\n const resolved = retention ?? \"short\";\n if (resolved === \"none\") return undefined;\n const ttl =\n resolved === \"long\" && (!baseUrl || baseUrl.includes(\"api.anthropic.com\")) ? \"1h\" : undefined;\n return { type: \"ephemeral\", ...(ttl && { ttl }) } as { type: \"ephemeral\"; ttl?: \"1h\" };\n}\n\nexport function toAnthropicMessages(\n messages: Message[],\n cacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): {\n system: Anthropic.TextBlockParam[] | undefined;\n messages: Anthropic.MessageParam[];\n} {\n let systemText: string | undefined;\n const out: Anthropic.MessageParam[] = [];\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n systemText = msg.content;\n continue;\n }\n if (msg.role === \"user\") {\n out.push({\n role: \"user\",\n content:\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"text\" as const, text: part.text };\n return {\n type: \"image\" as const,\n source: {\n type: \"base64\" as const,\n media_type: part.mediaType as\n | \"image/jpeg\"\n | \"image/png\"\n | \"image/gif\"\n | \"image/webp\",\n data: part.data,\n },\n };\n }),\n });\n continue;\n }\n if (msg.role === \"assistant\") {\n const content =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((part) => {\n // Strip thinking blocks without a valid signature (e.g. from GLM/OpenAI)\n // — Anthropic rejects empty signatures\n if (part.type === \"thinking\" && !part.signature) return false;\n // Strip empty text blocks — Anthropic rejects text content blocks\n // with empty strings (can happen when the model returns tool_use\n // with an empty companion text block)\n if (part.type === \"text\" && !part.text) return false;\n return true;\n })\n .map((part): Anthropic.ContentBlockParam => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"thinking\")\n return { type: \"thinking\", thinking: part.text, signature: part.signature! };\n if (part.type === \"tool_call\")\n return {\n type: \"tool_use\",\n id: part.id,\n name: part.name,\n input: part.args,\n };\n if (part.type === \"server_tool_call\")\n return {\n type: \"server_tool_use\",\n id: part.id,\n name: part.name,\n input: part.input,\n } as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"server_tool_result\")\n return part.data as unknown as Anthropic.ContentBlockParam;\n if (part.type === \"raw\") return part.data as unknown as Anthropic.ContentBlockParam;\n // Unknown content type (e.g. image in assistant message) — skip\n // by returning a marker that will be filtered out below\n return null as unknown as Anthropic.ContentBlockParam;\n })\n .filter(Boolean);\n out.push({ role: \"assistant\", content });\n continue;\n }\n if (msg.role === \"tool\") {\n out.push({\n role: \"user\",\n content: msg.content.map((result) => ({\n type: \"tool_result\" as const,\n tool_use_id: result.toolCallId,\n content: result.content,\n is_error: result.isError,\n })),\n });\n }\n }\n\n // Add cache_control to the last user message to cache conversation history\n if (cacheControl && out.length > 0) {\n for (let i = out.length - 1; i >= 0; i--) {\n if (out[i].role === \"user\") {\n const content = out[i].content;\n if (typeof content === \"string\") {\n out[i] = {\n role: \"user\",\n content: [\n {\n type: \"text\",\n text: content,\n cache_control: cacheControl,\n } as Anthropic.TextBlockParam,\n ],\n };\n } else if (Array.isArray(content) && content.length > 0) {\n const last = content[content.length - 1];\n content[content.length - 1] = {\n ...last,\n cache_control: cacheControl,\n } as (typeof content)[number];\n }\n break;\n }\n }\n }\n\n // Build system as block array (supports cache_control).\n // Split on \"<!-- uncached -->\" marker: text before is cached, text after is not.\n let system: Anthropic.TextBlockParam[] | undefined;\n if (systemText) {\n const marker = \"<!-- uncached -->\";\n const markerIdx = systemText.indexOf(marker);\n if (markerIdx !== -1 && cacheControl) {\n const cachedPart = systemText.slice(0, markerIdx).trimEnd();\n const uncachedPart = systemText.slice(markerIdx + marker.length).trimStart();\n system = [\n { type: \"text\" as const, text: cachedPart, cache_control: cacheControl },\n ...(uncachedPart ? [{ type: \"text\" as const, text: uncachedPart }] : []),\n ];\n } else {\n system = [\n {\n type: \"text\" as const,\n text: systemText,\n ...(cacheControl && { cache_control: cacheControl }),\n },\n ];\n }\n }\n\n return { system, messages: out };\n}\n\nexport function toAnthropicTools(tools: Tool[]): Anthropic.Tool[] {\n return tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: (tool.rawInputSchema ??\n zodToJsonSchema(tool.parameters)) as Anthropic.Tool[\"input_schema\"],\n }));\n}\n\nexport function toAnthropicToolChoice(choice: ToolChoice): Anthropic.ToolChoice {\n if (choice === \"auto\") return { type: \"auto\" };\n if (choice === \"none\") return { type: \"none\" };\n if (choice === \"required\") return { type: \"any\" };\n return { type: \"tool\", name: choice.name };\n}\n\nfunction supportsAdaptiveThinking(model: string): boolean {\n return /opus-4-6|sonnet-4-6/.test(model);\n}\n\nexport function toAnthropicThinking(\n level: ThinkingLevel,\n maxTokens: number,\n model: string,\n): {\n thinking: Anthropic.ThinkingConfigParam;\n maxTokens: number;\n outputConfig?: { effort: string };\n} {\n if (supportsAdaptiveThinking(model)) {\n // Adaptive thinking — model decides when/how much to think.\n // budget_tokens is deprecated on Opus 4.6 / Sonnet 4.6.\n // \"max\" effort is Opus-only; downgrade to \"high\" for Sonnet\n let effort: string = level;\n if (level === \"max\" && !model.includes(\"opus\")) {\n effort = \"high\";\n }\n return {\n thinking: { type: \"adaptive\" } as unknown as Anthropic.ThinkingConfigParam,\n maxTokens,\n outputConfig: { effort },\n };\n }\n\n // Legacy budget-based thinking for older models (\"max\" treated as \"high\")\n const effectiveLevel = level === \"max\" ? \"high\" : level;\n const budgetMap: Record<\"low\" | \"medium\" | \"high\", number> = {\n low: Math.max(1024, Math.floor(maxTokens * 0.25)),\n medium: Math.max(2048, Math.floor(maxTokens * 0.5)),\n high: Math.max(4096, maxTokens),\n };\n const budget = budgetMap[effectiveLevel];\n return {\n thinking: { type: \"enabled\", budget_tokens: budget },\n maxTokens: maxTokens + budget,\n };\n}\n\n// ── OpenAI Transforms ──────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match OpenAI's expected prefix.\n * Anthropic uses `toolu_*` IDs which OpenAI rejects — we need `call_*` prefixed IDs.\n * The mapping is consistent within a single conversion so assistant tool_call IDs\n * match their corresponding tool result references.\n */\nfunction remapToolCallId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"call_\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `call_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nexport function toOpenAIMessages(\n messages: Message[],\n options?: { provider?: string },\n): OpenAI.ChatCompletionMessageParam[] {\n const out: OpenAI.ChatCompletionMessageParam[] = [];\n const idMap = new Map<string, string>();\n // GLM drops reasoning_content when a user message follows tool results.\n // Merge user text into the last tool message to preserve thinking context.\n const mergeToolResultText = options?.provider === \"glm\";\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n out.push({ role: \"system\", content: msg.content });\n continue;\n }\n if (msg.role === \"user\") {\n // For GLM: if the previous message is a tool result, merge text into it\n // to avoid a standalone user message that causes reasoning_content to be dropped.\n if (mergeToolResultText && out.length > 0 && out[out.length - 1]!.role === \"tool\") {\n const userText =\n typeof msg.content === \"string\"\n ? msg.content\n : msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\");\n if (userText) {\n // Append text to the last tool message's content\n const lastTool = out[out.length - 1] as OpenAI.ChatCompletionToolMessageParam;\n lastTool.content = (lastTool.content ?? \"\") + \"\\n\\n\" + userText;\n continue;\n }\n }\n if (typeof msg.content === \"string\") {\n out.push({ role: \"user\", content: msg.content });\n } else {\n out.push({\n role: \"user\",\n content: msg.content.map(\n (\n part,\n ): OpenAI.ChatCompletionContentPartImage | OpenAI.ChatCompletionContentPartText => {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n return {\n type: \"image_url\",\n image_url: {\n url: `data:${part.mediaType};base64,${part.data}`,\n },\n };\n },\n ),\n });\n }\n continue;\n }\n if (msg.role === \"assistant\") {\n const parts = typeof msg.content === \"string\" ? msg.content : undefined;\n const toolCalls =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter(\n (p): p is Extract<ContentPart, { type: \"tool_call\" }> => p.type === \"tool_call\",\n )\n .map(\n (tc): OpenAI.ChatCompletionMessageToolCall => ({\n id: remapToolCallId(tc.id, idMap),\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.args) },\n }),\n )\n : undefined;\n const textParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is TextContent => p.type === \"text\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n // Roundtrip thinking content as reasoning_content (GLM, Moonshot)\n const thinkingParts =\n typeof msg.content !== \"string\"\n ? msg.content\n .filter((p): p is ThinkingContent => p.type === \"thinking\")\n .map((p) => p.text)\n .join(\"\")\n : undefined;\n\n const assistantMsg: OpenAI.ChatCompletionAssistantMessageParam = {\n role: \"assistant\",\n content: parts || textParts || null,\n ...(toolCalls?.length ? { tool_calls: toolCalls } : {}),\n };\n // Attach reasoning_content for multi-turn coherence (non-standard field).\n // Moonshot requires reasoning_content on ALL assistant messages with tool_calls\n // when thinking is enabled — even if empty.\n if (thinkingParts || toolCalls?.length) {\n (assistantMsg as unknown as Record<string, unknown>).reasoning_content =\n thinkingParts || \" \";\n }\n out.push(assistantMsg);\n continue;\n }\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n out.push({\n role: \"tool\",\n tool_call_id: remapToolCallId(result.toolCallId, idMap),\n content: result.content,\n });\n }\n }\n }\n\n return out;\n}\n\nexport function toOpenAITools(tools: Tool[]): OpenAI.ChatCompletionTool[] {\n return tools.map((tool) => ({\n type: \"function\" as const,\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n },\n }));\n}\n\nexport function toOpenAIToolChoice(choice: ToolChoice): OpenAI.ChatCompletionToolChoiceOption {\n if (choice === \"auto\") return \"auto\";\n if (choice === \"none\") return \"none\";\n if (choice === \"required\") return \"required\";\n return { type: \"function\", function: { name: choice.name } };\n}\n\nexport function toOpenAIReasoningEffort(level: ThinkingLevel): \"low\" | \"medium\" | \"high\" {\n return level === \"max\" ? \"high\" : level;\n}\n\n// ── Response Normalization ─────────────────────────────────\n\nexport function normalizeAnthropicStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"pause_turn\":\n return \"pause_turn\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"refusal\":\n return \"refusal\";\n default:\n return \"end_turn\";\n }\n}\n\nexport function normalizeOpenAIStopReason(reason: string | null): StopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n case \"stop\":\n return \"stop_sequence\";\n default:\n return \"end_turn\";\n }\n}\n","import OpenAI from \"openai\";\nimport type { ContentPart, StreamOptions, StreamResponse, ToolCall } from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport {\n normalizeOpenAIStopReason,\n toOpenAIMessages,\n toOpenAIReasoningEffort,\n toOpenAIToolChoice,\n toOpenAITools,\n} from \"./transform.js\";\n\nexport function streamOpenAI(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n const providerName = options.provider ?? \"openai\";\n runStream(options, result).catch((err) => result.abort(toError(err, providerName)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const client = new OpenAI({\n apiKey: options.apiKey,\n ...(options.baseUrl ? { baseURL: options.baseUrl } : {}),\n ...(options.fetch ? { fetch: options.fetch } : {}),\n });\n\n // GLM and Moonshot use a custom `thinking` body param instead of `reasoning_effort`\n const usesThinkingParam = options.provider === \"glm\" || options.provider === \"moonshot\";\n\n const messages = toOpenAIMessages(options.messages, { provider: options.provider });\n\n // GLM models default to 0.6 temperature when not in thinking mode\n const defaultTemp = options.provider === \"glm\" ? 0.6 : undefined;\n const effectiveTemp = options.temperature ?? defaultTemp;\n\n const params: OpenAI.ChatCompletionCreateParams = {\n model: options.model,\n messages,\n stream: true,\n ...(options.maxTokens ? { max_tokens: options.maxTokens } : {}),\n ...(effectiveTemp != null && !options.thinking ? { temperature: effectiveTemp } : {}),\n ...(options.topP != null ? { top_p: options.topP } : {}),\n ...(options.stop ? { stop: options.stop } : {}),\n ...(options.thinking && !usesThinkingParam\n ? { reasoning_effort: toOpenAIReasoningEffort(options.thinking) }\n : {}),\n ...(options.tools?.length ? { tools: toOpenAITools(options.tools) } : {}),\n ...(options.toolChoice && options.tools?.length\n ? { tool_choice: toOpenAIToolChoice(options.toolChoice) }\n : {}),\n stream_options: { include_usage: true },\n };\n\n // Inject provider-native web search tools (non-standard, bypass SDK types)\n if (options.webSearch) {\n if (options.provider === \"moonshot\") {\n const raw = params as unknown as Record<string, unknown>;\n const tools = ((raw.tools as unknown[]) ?? []).slice();\n tools.push({ type: \"builtin_function\", function: { name: \"$web_search\" } });\n raw.tools = tools;\n }\n // GLM (Z.AI): web search is provided via MCP servers, not inline tools\n // OpenAI: Chat Completions API does not support web search\n }\n\n // Inject custom thinking param for GLM/Moonshot (not part of OpenAI spec)\n if (usesThinkingParam) {\n (params as unknown as Record<string, unknown>).thinking = options.thinking\n ? { type: \"enabled\" }\n : { type: \"disabled\" };\n }\n\n const stream = await client.chat.completions.create(params, {\n signal: options.signal ?? undefined,\n });\n\n const contentParts: ContentPart[] = [];\n const toolCallAccum = new Map<number, { id: string; name: string; argsJson: string }>();\n let textAccum = \"\";\n let thinkingAccum = \"\";\n let inputTokens = 0;\n let outputTokens = 0;\n let cacheRead = 0;\n let finishReason: string | null = null;\n\n for await (const chunk of stream as AsyncIterable<OpenAI.ChatCompletionChunk>) {\n const choice = chunk.choices?.[0];\n\n if (chunk.usage) {\n inputTokens = chunk.usage.prompt_tokens;\n outputTokens = chunk.usage.completion_tokens;\n const details = chunk.usage.prompt_tokens_details;\n if (details?.cached_tokens) {\n cacheRead = details.cached_tokens;\n }\n }\n\n if (!choice) continue;\n\n if (choice.finish_reason) {\n finishReason = choice.finish_reason;\n }\n\n const delta = choice.delta;\n\n // Reasoning/thinking delta (GLM, Moonshot)\n const reasoningContent = (delta as Record<string, unknown>).reasoning_content;\n if (typeof reasoningContent === \"string\" && reasoningContent) {\n thinkingAccum += reasoningContent;\n result.push({ type: \"thinking_delta\", text: reasoningContent });\n }\n\n // Text delta\n if (delta.content) {\n textAccum += delta.content;\n result.push({ type: \"text_delta\", text: delta.content });\n }\n\n // Tool call deltas\n if (delta.tool_calls) {\n for (const tc of delta.tool_calls) {\n let accum = toolCallAccum.get(tc.index);\n if (!accum) {\n accum = {\n id: tc.id ?? \"\",\n name: tc.function?.name ?? \"\",\n argsJson: \"\",\n };\n toolCallAccum.set(tc.index, accum);\n }\n if (tc.id) accum.id = tc.id;\n if (tc.function?.name) accum.name = tc.function.name;\n if (tc.function?.arguments) {\n accum.argsJson += tc.function.arguments;\n result.push({\n type: \"toolcall_delta\",\n id: accum.id,\n name: accum.name,\n argsJson: tc.function.arguments,\n });\n }\n }\n }\n }\n\n // Finalize thinking content (GLM, Moonshot reasoning_content)\n if (thinkingAccum) {\n contentParts.push({ type: \"thinking\", text: thinkingAccum });\n }\n\n // Finalize text content\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n // Finalize tool calls\n for (const [, tc] of toolCallAccum) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n // malformed JSON — keep empty\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n\n const stopReason = normalizeOpenAIStopReason(finishReason);\n\n const response: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens, ...(cacheRead > 0 && { cacheRead }) },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(response);\n}\n\nfunction toError(err: unknown, provider: string = \"openai\"): ProviderError {\n if (err instanceof OpenAI.APIError) {\n // Include full error body for debugging — GLM/Moonshot use non-standard error shapes\n let msg = err.message;\n const body = err.error as Record<string, unknown> | undefined;\n if (body) {\n // Append raw error body so debug logs capture the exact API response\n msg += ` | body: ${JSON.stringify(body)}`;\n }\n return new ProviderError(provider, msg, {\n statusCode: err.status,\n cause: err,\n });\n }\n if (err instanceof Error) {\n return new ProviderError(provider, err.message, { cause: err });\n }\n return new ProviderError(provider, String(err));\n}\n","import os from \"node:os\";\nimport type {\n ContentPart,\n Message,\n StreamOptions,\n StreamResponse,\n Tool,\n ToolCall,\n} from \"../types.js\";\nimport { ProviderError } from \"../errors.js\";\nimport { StreamResult } from \"../utils/event-stream.js\";\nimport { zodToJsonSchema } from \"../utils/zod-to-json-schema.js\";\n\nconst DEFAULT_BASE_URL = \"https://chatgpt.com/backend-api\";\n\nexport function streamOpenAICodex(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n runStream(options, result).catch((err) => result.abort(toError(err)));\n return result;\n}\n\nasync function runStream(options: StreamOptions, result: StreamResult): Promise<void> {\n const baseUrl = (options.baseUrl || DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n const url = `${baseUrl}/codex/responses`;\n\n const { system, input } = toCodexInput(options.messages);\n\n const body: Record<string, unknown> = {\n model: options.model,\n store: false,\n stream: true,\n instructions: system,\n input,\n tool_choice: \"auto\",\n parallel_tool_calls: true,\n include: [\"reasoning.encrypted_content\"],\n };\n\n if (options.tools?.length) {\n body.tools = toCodexTools(options.tools);\n }\n if (options.temperature != null && !options.thinking) {\n body.temperature = options.temperature;\n }\n if (options.thinking) {\n body.reasoning = {\n effort: options.thinking,\n summary: \"auto\",\n };\n }\n\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n Accept: \"text/event-stream\",\n Authorization: `Bearer ${options.apiKey}`,\n \"OpenAI-Beta\": \"responses=experimental\",\n originator: \"ggcoder\",\n \"User-Agent\": `ggcoder (${os.platform()} ${os.release()}; ${os.arch()})`,\n };\n\n if (options.accountId) {\n headers[\"chatgpt-account-id\"] = options.accountId;\n }\n\n const response = await fetch(url, {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: options.signal,\n });\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let message = `Codex API error (${response.status}): ${text}`;\n\n // Add helpful context for common errors\n if (response.status === 400 && text.includes(\"not supported\")) {\n message +=\n `\\n\\nHint: Codex models require a ChatGPT Plus ($20/mo) or Pro ($200/mo) subscription. ` +\n `The \"codex-spark\" variants require ChatGPT Pro. ` +\n `Ensure your account has an active subscription at https://chatgpt.com/settings`;\n }\n\n throw new ProviderError(\"openai\", message, {\n statusCode: response.status,\n });\n }\n\n if (!response.body) {\n throw new ProviderError(\"openai\", \"No response body from Codex API\");\n }\n\n const contentParts: ContentPart[] = [];\n let textAccum = \"\";\n const toolCalls = new Map<string, { id: string; name: string; argsJson: string }>();\n let inputTokens = 0;\n let outputTokens = 0;\n\n for await (const event of parseSSE(response.body)) {\n const type = event.type as string | undefined;\n if (!type) continue;\n\n if (type === \"error\") {\n const msg = (event.message as string) || JSON.stringify(event);\n throw new ProviderError(\"openai\", `Codex error: ${msg}`);\n }\n\n if (type === \"response.failed\") {\n const msg =\n ((event.error as Record<string, unknown>)?.message as string) || \"Codex response failed\";\n throw new ProviderError(\"openai\", msg);\n }\n\n // Text delta\n if (type === \"response.output_text.delta\") {\n const delta = event.delta as string;\n textAccum += delta;\n result.push({ type: \"text_delta\", text: delta });\n }\n\n // Thinking delta\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = event.delta as string;\n result.push({ type: \"thinking_delta\", text: delta });\n }\n\n // Tool call started\n if (type === \"response.output_item.added\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const name = item.name as string;\n toolCalls.set(id, { id, name, argsJson: (item.arguments as string) || \"\" });\n }\n }\n\n // Tool call arguments delta\n if (type === \"response.function_call_arguments.delta\") {\n const delta = event.delta as string;\n const itemId = event.item_id as string;\n // Find the matching tool call\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson += delta;\n result.push({\n type: \"toolcall_delta\",\n id: tc.id,\n name: tc.name,\n argsJson: delta,\n });\n break;\n }\n }\n }\n\n // Tool call arguments done\n if (type === \"response.function_call_arguments.done\") {\n const itemId = event.item_id as string;\n const argsStr = event.arguments as string;\n for (const [key, tc] of toolCalls) {\n if (key.endsWith(`|${itemId}`)) {\n tc.argsJson = argsStr;\n break;\n }\n }\n }\n\n // Item done — finalize tool call\n if (type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown>;\n if (item?.type === \"function_call\") {\n const callId = item.call_id as string;\n const itemId = item.id as string;\n const id = `${callId}|${itemId}`;\n const tc = toolCalls.get(id);\n if (tc) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n result.push({\n type: \"toolcall_done\",\n id: tc.id,\n name: tc.name,\n args,\n });\n }\n }\n }\n\n // Response completed\n if (type === \"response.completed\" || type === \"response.done\") {\n const resp = event.response as Record<string, unknown> | undefined;\n const usage = resp?.usage as Record<string, number> | undefined;\n if (usage) {\n inputTokens = usage.input_tokens ?? 0;\n outputTokens = usage.output_tokens ?? 0;\n }\n }\n }\n\n // Finalize content parts\n if (textAccum) {\n contentParts.push({ type: \"text\", text: textAccum });\n }\n\n for (const [, tc] of toolCalls) {\n let args: Record<string, unknown> = {};\n try {\n args = JSON.parse(tc.argsJson) as Record<string, unknown>;\n } catch {\n /* malformed JSON */\n }\n const toolCall: ToolCall = {\n type: \"tool_call\",\n id: tc.id,\n name: tc.name,\n args,\n };\n contentParts.push(toolCall);\n }\n\n const hasToolCalls = contentParts.some((p) => p.type === \"tool_call\");\n const stopReason = hasToolCalls ? \"tool_use\" : \"end_turn\";\n\n const streamResponse: StreamResponse = {\n message: {\n role: \"assistant\",\n content: contentParts.length > 0 ? contentParts : textAccum || \"\",\n },\n stopReason,\n usage: { inputTokens, outputTokens },\n };\n\n result.push({ type: \"done\", stopReason });\n result.complete(streamResponse);\n}\n\n// ── SSE Parser ─────────────────────────────────────────────\n\nasync function* parseSSE(\n body: ReadableStream<Uint8Array>,\n): AsyncGenerator<Record<string, unknown>> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n\n let idx = buffer.indexOf(\"\\n\\n\");\n while (idx !== -1) {\n const chunk = buffer.slice(0, idx);\n buffer = buffer.slice(idx + 2);\n\n const dataLines = chunk\n .split(\"\\n\")\n .filter((l) => l.startsWith(\"data:\"))\n .map((l) => l.slice(5).trim());\n\n if (dataLines.length > 0) {\n const data = dataLines.join(\"\\n\").trim();\n if (data && data !== \"[DONE]\") {\n try {\n yield JSON.parse(data) as Record<string, unknown>;\n } catch {\n // skip malformed JSON\n }\n }\n }\n idx = buffer.indexOf(\"\\n\\n\");\n }\n }\n } finally {\n reader.releaseLock();\n }\n}\n\n// ── Message Conversion ─────────────────────────────────────\n\n/**\n * Remap tool call IDs that don't match Codex API's expected prefix.\n * Codex expects IDs starting with `fc_` — Anthropic uses `toolu_*` which gets rejected.\n */\nfunction remapCodexId(id: string, idMap: Map<string, string>): string {\n if (id.startsWith(\"fc_\") || id.startsWith(\"fc-\")) return id;\n const existing = idMap.get(id);\n if (existing) return existing;\n const mapped = `fc_${id.replace(/^toolu_/, \"\")}`;\n idMap.set(id, mapped);\n return mapped;\n}\n\nfunction toCodexInput(messages: Message[]): { system: string | undefined; input: unknown[] } {\n let system: string | undefined;\n const input: unknown[] = [];\n const idMap = new Map<string, string>();\n\n for (const msg of messages) {\n if (msg.role === \"system\") {\n system = msg.content;\n continue;\n }\n\n if (msg.role === \"user\") {\n const content =\n typeof msg.content === \"string\"\n ? [{ type: \"input_text\", text: msg.content }]\n : msg.content.map((part) => {\n if (part.type === \"text\") return { type: \"input_text\", text: part.text };\n return {\n type: \"input_image\",\n detail: \"auto\",\n image_url: `data:${part.mediaType};base64,${part.data}`,\n };\n });\n input.push({ role: \"user\", content });\n continue;\n }\n\n if (msg.role === \"assistant\") {\n if (typeof msg.content === \"string\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: msg.content, annotations: [] }],\n status: \"completed\",\n });\n continue;\n }\n\n for (const part of msg.content) {\n if (part.type === \"text\") {\n input.push({\n type: \"message\",\n role: \"assistant\",\n content: [{ type: \"output_text\", text: part.text, annotations: [] }],\n status: \"completed\",\n });\n } else if (part.type === \"tool_call\") {\n const [callId, itemId] = part.id.includes(\"|\")\n ? part.id.split(\"|\", 2)\n : [part.id, part.id];\n input.push({\n type: \"function_call\",\n id: remapCodexId(itemId, idMap),\n call_id: remapCodexId(callId, idMap),\n name: part.name,\n arguments: JSON.stringify(part.args),\n });\n }\n // thinking parts are skipped for codex input\n }\n continue;\n }\n\n if (msg.role === \"tool\") {\n for (const result of msg.content) {\n const [callId] = result.toolCallId.includes(\"|\")\n ? result.toolCallId.split(\"|\", 2)\n : [result.toolCallId];\n input.push({\n type: \"function_call_output\",\n call_id: remapCodexId(callId, idMap),\n output: result.content,\n });\n }\n }\n }\n\n return { system, input };\n}\n\n// ── Tool Conversion ────────────────────────────────────────\n\nfunction toCodexTools(tools: Tool[]): unknown[] {\n return tools.map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.rawInputSchema ?? zodToJsonSchema(tool.parameters),\n strict: null,\n }));\n}\n\n// ── Error Handling ─────────────────────────────────────────\n\nfunction toError(err: unknown): ProviderError {\n if (err instanceof ProviderError) return err;\n if (err instanceof Error) {\n return new ProviderError(\"openai\", err.message, { cause: err });\n }\n return new ProviderError(\"openai\", String(err));\n}\n","import type { StreamOptions } from \"./types.js\";\nimport type { StreamResult } from \"./utils/event-stream.js\";\n\n/**\n * A provider stream function. Takes StreamOptions and returns a StreamResult.\n * Each provider implements this to handle its specific API format.\n */\nexport type ProviderStreamFn = (options: StreamOptions) => StreamResult;\n\n/**\n * Registry entry for a provider. A provider can have a simple stream function\n * or a more complex setup with custom routing logic.\n */\nexport interface ProviderEntry {\n /** Main stream function for this provider */\n stream: ProviderStreamFn;\n}\n\n/**\n * Map-based provider registry. Built-in providers are registered at module load,\n * and extensions can register custom providers at runtime.\n */\nclass ProviderRegistryImpl {\n private providers = new Map<string, ProviderEntry>();\n\n /**\n * Register a provider. Overwrites any existing provider with the same name.\n *\n * ```ts\n * import { providerRegistry } from \"@kenkaiiii/gg-ai\";\n *\n * providerRegistry.register(\"deepseek\", {\n * stream: (options) => streamOpenAI({ ...options, baseUrl: \"https://api.deepseek.com/v1\" }),\n * });\n * ```\n */\n register(name: string, entry: ProviderEntry): void {\n this.providers.set(name, entry);\n }\n\n /** Remove a registered provider. */\n unregister(name: string): boolean {\n return this.providers.delete(name);\n }\n\n /** Get a provider entry by name. */\n get(name: string): ProviderEntry | undefined {\n return this.providers.get(name);\n }\n\n /** Check if a provider is registered. */\n has(name: string): boolean {\n return this.providers.has(name);\n }\n\n /** List all registered provider names. */\n list(): string[] {\n return [...this.providers.keys()];\n }\n}\n\n/** Global provider registry. Import this to register custom providers. */\nexport const providerRegistry = new ProviderRegistryImpl();\n","import type { StreamOptions } from \"./types.js\";\nimport { GGAIError } from \"./errors.js\";\nimport { StreamResult } from \"./utils/event-stream.js\";\nimport { streamAnthropic } from \"./providers/anthropic.js\";\nimport { streamOpenAI } from \"./providers/openai.js\";\nimport { streamOpenAICodex } from \"./providers/openai-codex.js\";\nimport { providerRegistry } from \"./provider-registry.js\";\n\n/** Z.AI has two API systems — some accounts work on one, some on the other. */\nconst GLM_CODING_BASE_URL = \"https://api.z.ai/api/coding/paas/v4\";\nconst GLM_REGULAR_BASE_URL = \"https://api.z.ai/api/paas/v4\";\n\n// ── Register built-in providers ────────────────────────────\n\nproviderRegistry.register(\"anthropic\", {\n stream: (options) => streamAnthropic(options),\n});\n\nproviderRegistry.register(\"openai\", {\n stream: (options) => {\n // Use codex endpoint for OAuth tokens (have accountId)\n if (options.accountId) {\n return streamOpenAICodex(options);\n }\n return streamOpenAI(options);\n },\n});\n\nproviderRegistry.register(\"glm\", {\n stream: (options) => {\n if (options.baseUrl) return streamOpenAI(options);\n return streamGLMWithFallback(options);\n },\n});\n\nproviderRegistry.register(\"moonshot\", {\n stream: (options) =>\n streamOpenAI({\n ...options,\n baseUrl: options.baseUrl ?? \"https://api.moonshot.ai/v1\",\n }),\n});\n\n// ── Public API ─────────────────────────────────────────────\n\n/**\n * Unified streaming entry point. Returns a StreamResult that is both\n * an async iterable (for streaming events) and thenable (await for\n * the final response).\n *\n * Providers are resolved via the provider registry. Built-in providers\n * (anthropic, openai, glm, moonshot) are registered at module load.\n * Extensions can register custom providers via `providerRegistry.register()`.\n *\n * ```ts\n * // Stream events\n * for await (const event of stream({ provider: \"anthropic\", model: \"claude-sonnet-4-6\", messages })) {\n * if (event.type === \"text_delta\") process.stdout.write(event.text);\n * }\n *\n * // Or just await the final message\n * const response = await stream({ provider: \"openai\", model: \"gpt-4.1\", messages });\n * ```\n */\nexport function stream(options: StreamOptions): StreamResult {\n const entry = providerRegistry.get(options.provider);\n if (!entry) {\n throw new GGAIError(\n `Unknown provider: \"${options.provider}\". Registered: ${providerRegistry.list().join(\", \")}`,\n );\n }\n return entry.stream(options);\n}\n\n// ── GLM fallback logic ────────────────────────────────────\n\n/**\n * Try the coding endpoint first; if it fails for any reason, retry with the\n * regular endpoint. Z.AI inconsistently provisions accounts — some work on\n * /api/coding/paas/v4, others on /api/paas/v4, even on the same plan.\n */\nfunction streamGLMWithFallback(options: StreamOptions): StreamResult {\n const result = new StreamResult();\n\n runGLMWithFallback(options, result).catch((err) => {\n result.abort(err instanceof Error ? err : new Error(String(err)));\n });\n\n return result;\n}\n\nasync function runGLMWithFallback(options: StreamOptions, result: StreamResult): Promise<void> {\n const codingResult = streamOpenAI({ ...options, baseUrl: GLM_CODING_BASE_URL });\n\n try {\n for await (const event of codingResult) {\n result.push(event);\n }\n result.complete(await codingResult.response);\n } catch {\n // Coding endpoint failed — try regular endpoint\n const regularResult = streamOpenAI({ ...options, baseUrl: GLM_REGULAR_BASE_URL });\n try {\n for await (const event of regularResult) {\n result.push(event);\n }\n result.complete(await regularResult.response);\n } catch (fallbackErr) {\n result.abort(fallbackErr instanceof Error ? fallbackErr : new Error(String(fallbackErr)));\n }\n }\n}\n"],"mappings":";AAAO,IAAM,YAAN,cAAwB,MAAM;AAAA,EACnC,YAAY,SAAiB,SAAwB;AACnD,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO;AAAA,EACd;AACF;AAEO,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAClC;AAAA,EACA;AAAA,EAET,YACE,UACA,SACA,SACA;AACA,UAAM,IAAI,QAAQ,KAAK,OAAO,IAAI,EAAE,OAAO,SAAS,MAAM,CAAC;AAC3D,SAAK,OAAO;AACZ,SAAK,WAAW;AAChB,SAAK,aAAa,SAAS;AAAA,EAC7B;AACF;;;ACdO,IAAM,cAAN,MAA+D;AAAA,EAC5D,QAAa,CAAC;AAAA,EACd,UAA+B;AAAA,EAC/B,OAAO;AAAA,EACP,QAAsB;AAAA,EAE9B,KAAK,OAAgB;AAGnB,QAAI,KAAK,MAAM,SAAS,KAAQ;AAC9B,WAAK,MAAM,OAAO,GAAG,KAAK,MAAM,SAAS,GAAK;AAAA,IAChD;AACA,SAAK,MAAM,KAAK,KAAK;AACrB,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,MAAM,OAAoB;AACxB,SAAK,QAAQ;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AAAA,EACjB;AAAA,EAEA,QAAQ,OAAO,aAAa,IAAsB;AAChD,QAAI,QAAQ;AACZ,WAAO,MAAM;AACX,aAAO,QAAQ,KAAK,MAAM,QAAQ;AAChC,cAAM,KAAK,MAAM,OAAO;AAAA,MAC1B;AAEA,WAAK,MAAM,OAAO,GAAG,KAAK;AAC1B,cAAQ;AACR,UAAI,KAAK,MAAO,OAAM,KAAK;AAC3B,UAAI,KAAK,KAAM;AACf,YAAM,IAAI,QAAc,CAAC,MAAM;AAC7B,aAAK,UAAU;AAAA,MACjB,CAAC;AAAA,IACH;AAAA,EACF;AACF;AASO,IAAM,eAAN,MAAyD;AAAA,EACrD;AAAA,EACA;AAAA,EACD;AAAA,EACA;AAAA,EACA,cAAc;AAAA,EAEtB,cAAc;AACZ,SAAK,SAAS,IAAI,YAAyB;AAC3C,SAAK,WAAW,IAAI,QAAwB,CAAC,SAAS,WAAW;AAC/D,WAAK,kBAAkB;AACvB,WAAK,iBAAiB;AAAA,IACxB,CAAC;AAAA,EACH;AAAA,EAEA,KAAK,OAA0B;AAC7B,SAAK,OAAO,KAAK,KAAK;AAAA,EACxB;AAAA,EAEA,SAAS,UAAgC;AACvC,SAAK,OAAO,MAAM;AAClB,SAAK,gBAAgB,QAAQ;AAAA,EAC/B;AAAA,EAEA,MAAM,OAAoB;AACxB,SAAK,OAAO,MAAM,KAAK;AACvB,SAAK,eAAe,KAAK;AAAA,EAC3B;AAAA,EAEA,CAAC,OAAO,aAAa,IAAgC;AACnD,SAAK,cAAc;AACnB,WAAO,KAAK,OAAO,OAAO,aAAa,EAAE;AAAA,EAC3C;AAAA,EAEA,KACE,aACA,YAC8B;AAE9B,SAAK,YAAY,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AACjC,WAAO,KAAK,SAAS,KAAK,aAAa,UAAU;AAAA,EACnD;AAAA,EAEA,MAAc,cAA6B;AACzC,QAAI,KAAK,YAAa;AACtB,SAAK,cAAc;AACnB,qBAAiB,KAAK,KAAK,QAAQ;AAAA,IAEnC;AAAA,EACF;AACF;;;AChHA,OAAO,eAAe;;;ACAtB,SAAS,SAAS;AAMX,SAAS,gBAAgB,QAA4C;AAC1E,QAAM,aAAa,EAAE,aAAa,MAAM;AAExC,QAAM,EAAE,SAAS,SAAS,GAAG,KAAK,IAAI;AACtC,SAAO;AACT;;;ACMO,SAAS,wBACd,WACA,SAC+C;AAC/C,QAAM,WAAW,aAAa;AAC9B,MAAI,aAAa,OAAQ,QAAO;AAChC,QAAM,MACJ,aAAa,WAAW,CAAC,WAAW,QAAQ,SAAS,mBAAmB,KAAK,OAAO;AACtF,SAAO,EAAE,MAAM,aAAa,GAAI,OAAO,EAAE,IAAI,EAAG;AAClD;AAEO,SAAS,oBACd,UACA,cAIA;AACA,MAAI;AACJ,QAAM,MAAgC,CAAC;AAEvC,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,mBAAa,IAAI;AACjB;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SACE,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QAAQ,IAAI,CAAC,SAAS;AACxB,cAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAiB,MAAM,KAAK,KAAK;AAC1E,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,QAAQ;AAAA,cACN,MAAM;AAAA,cACN,YAAY,KAAK;AAAA,cAKjB,MAAM,KAAK;AAAA,YACb;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACT,CAAC;AACD;AAAA,IACF;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,YAAM,UACJ,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QACD,OAAO,CAAC,SAAS;AAGhB,YAAI,KAAK,SAAS,cAAc,CAAC,KAAK,UAAW,QAAO;AAIxD,YAAI,KAAK,SAAS,UAAU,CAAC,KAAK,KAAM,QAAO;AAC/C,eAAO;AAAA,MACT,CAAC,EACA,IAAI,CAAC,SAAsC;AAC1C,YAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AACjE,YAAI,KAAK,SAAS;AAChB,iBAAO,EAAE,MAAM,YAAY,UAAU,KAAK,MAAM,WAAW,KAAK,UAAW;AAC7E,YAAI,KAAK,SAAS;AAChB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,UACd;AACF,YAAI,KAAK,SAAS;AAChB,iBAAO;AAAA,YACL,MAAM;AAAA,YACN,IAAI,KAAK;AAAA,YACT,MAAM,KAAK;AAAA,YACX,OAAO,KAAK;AAAA,UACd;AACF,YAAI,KAAK,SAAS;AAChB,iBAAO,KAAK;AACd,YAAI,KAAK,SAAS,MAAO,QAAO,KAAK;AAGrC,eAAO;AAAA,MACT,CAAC,EACA,OAAO,OAAO;AACvB,UAAI,KAAK,EAAE,MAAM,aAAa,QAAQ,CAAC;AACvC;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,UAAI,KAAK;AAAA,QACP,MAAM;AAAA,QACN,SAAS,IAAI,QAAQ,IAAI,CAAC,YAAY;AAAA,UACpC,MAAM;AAAA,UACN,aAAa,OAAO;AAAA,UACpB,SAAS,OAAO;AAAA,UAChB,UAAU,OAAO;AAAA,QACnB,EAAE;AAAA,MACJ,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,gBAAgB,IAAI,SAAS,GAAG;AAClC,aAAS,IAAI,IAAI,SAAS,GAAG,KAAK,GAAG,KAAK;AACxC,UAAI,IAAI,CAAC,EAAE,SAAS,QAAQ;AAC1B,cAAM,UAAU,IAAI,CAAC,EAAE;AACvB,YAAI,OAAO,YAAY,UAAU;AAC/B,cAAI,CAAC,IAAI;AAAA,YACP,MAAM;AAAA,YACN,SAAS;AAAA,cACP;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM;AAAA,gBACN,eAAe;AAAA,cACjB;AAAA,YACF;AAAA,UACF;AAAA,QACF,WAAW,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,GAAG;AACvD,gBAAM,OAAO,QAAQ,QAAQ,SAAS,CAAC;AACvC,kBAAQ,QAAQ,SAAS,CAAC,IAAI;AAAA,YAC5B,GAAG;AAAA,YACH,eAAe;AAAA,UACjB;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,MAAI;AACJ,MAAI,YAAY;AACd,UAAM,SAAS;AACf,UAAM,YAAY,WAAW,QAAQ,MAAM;AAC3C,QAAI,cAAc,MAAM,cAAc;AACpC,YAAM,aAAa,WAAW,MAAM,GAAG,SAAS,EAAE,QAAQ;AAC1D,YAAM,eAAe,WAAW,MAAM,YAAY,OAAO,MAAM,EAAE,UAAU;AAC3E,eAAS;AAAA,QACP,EAAE,MAAM,QAAiB,MAAM,YAAY,eAAe,aAAa;AAAA,QACvE,GAAI,eAAe,CAAC,EAAE,MAAM,QAAiB,MAAM,aAAa,CAAC,IAAI,CAAC;AAAA,MACxE;AAAA,IACF,OAAO;AACL,eAAS;AAAA,QACP;AAAA,UACE,MAAM;AAAA,UACN,MAAM;AAAA,UACN,GAAI,gBAAgB,EAAE,eAAe,aAAa;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,UAAU,IAAI;AACjC;AAEO,SAAS,iBAAiB,OAAiC;AAChE,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,cAAe,KAAK,kBAClB,gBAAgB,KAAK,UAAU;AAAA,EACnC,EAAE;AACJ;AAEO,SAAS,sBAAsB,QAA0C;AAC9E,MAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC7C,MAAI,WAAW,OAAQ,QAAO,EAAE,MAAM,OAAO;AAC7C,MAAI,WAAW,WAAY,QAAO,EAAE,MAAM,MAAM;AAChD,SAAO,EAAE,MAAM,QAAQ,MAAM,OAAO,KAAK;AAC3C;AAEA,SAAS,yBAAyB,OAAwB;AACxD,SAAO,sBAAsB,KAAK,KAAK;AACzC;AAEO,SAAS,oBACd,OACA,WACA,OAKA;AACA,MAAI,yBAAyB,KAAK,GAAG;AAInC,QAAI,SAAiB;AACrB,QAAI,UAAU,SAAS,CAAC,MAAM,SAAS,MAAM,GAAG;AAC9C,eAAS;AAAA,IACX;AACA,WAAO;AAAA,MACL,UAAU,EAAE,MAAM,WAAW;AAAA,MAC7B;AAAA,MACA,cAAc,EAAE,OAAO;AAAA,IACzB;AAAA,EACF;AAGA,QAAM,iBAAiB,UAAU,QAAQ,SAAS;AAClD,QAAM,YAAuD;AAAA,IAC3D,KAAK,KAAK,IAAI,MAAM,KAAK,MAAM,YAAY,IAAI,CAAC;AAAA,IAChD,QAAQ,KAAK,IAAI,MAAM,KAAK,MAAM,YAAY,GAAG,CAAC;AAAA,IAClD,MAAM,KAAK,IAAI,MAAM,SAAS;AAAA,EAChC;AACA,QAAM,SAAS,UAAU,cAAc;AACvC,SAAO;AAAA,IACL,UAAU,EAAE,MAAM,WAAW,eAAe,OAAO;AAAA,IACnD,WAAW,YAAY;AAAA,EACzB;AACF;AAUA,SAAS,gBAAgB,IAAY,OAAoC;AACvE,MAAI,GAAG,WAAW,OAAO,EAAG,QAAO;AACnC,QAAM,WAAW,MAAM,IAAI,EAAE;AAC7B,MAAI,SAAU,QAAO;AACrB,QAAM,SAAS,QAAQ,GAAG,QAAQ,WAAW,EAAE,CAAC;AAChD,QAAM,IAAI,IAAI,MAAM;AACpB,SAAO;AACT;AAEO,SAAS,iBACd,UACA,SACqC;AACrC,QAAM,MAA2C,CAAC;AAClD,QAAM,QAAQ,oBAAI,IAAoB;AAGtC,QAAM,sBAAsB,SAAS,aAAa;AAElD,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,UAAI,KAAK,EAAE,MAAM,UAAU,SAAS,IAAI,QAAQ,CAAC;AACjD;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AAGvB,UAAI,uBAAuB,IAAI,SAAS,KAAK,IAAI,IAAI,SAAS,CAAC,EAAG,SAAS,QAAQ;AACjF,cAAM,WACJ,OAAO,IAAI,YAAY,WACnB,IAAI,UACJ,IAAI,QACD,OAAO,CAAC,MAAwB,EAAE,SAAS,MAAM,EACjD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE;AAChB,YAAI,UAAU;AAEZ,gBAAM,WAAW,IAAI,IAAI,SAAS,CAAC;AACnC,mBAAS,WAAW,SAAS,WAAW,MAAM,SAAS;AACvD;AAAA,QACF;AAAA,MACF;AACA,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,YAAI,KAAK,EAAE,MAAM,QAAQ,SAAS,IAAI,QAAQ,CAAC;AAAA,MACjD,OAAO;AACL,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,SAAS,IAAI,QAAQ;AAAA,YACnB,CACE,SACiF;AACjF,kBAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,QAAQ,MAAM,KAAK,KAAK;AACjE,qBAAO;AAAA,gBACL,MAAM;AAAA,gBACN,WAAW;AAAA,kBACT,KAAK,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,gBACjD;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH;AACA;AAAA,IACF;AACA,QAAI,IAAI,SAAS,aAAa;AAC5B,YAAM,QAAQ,OAAO,IAAI,YAAY,WAAW,IAAI,UAAU;AAC9D,YAAM,YACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD;AAAA,QACC,CAAC,MAAwD,EAAE,SAAS;AAAA,MACtE,EACC;AAAA,QACC,CAAC,QAA8C;AAAA,UAC7C,IAAI,gBAAgB,GAAG,IAAI,KAAK;AAAA,UAChC,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,GAAG,MAAM,WAAW,KAAK,UAAU,GAAG,IAAI,EAAE;AAAA,QAChE;AAAA,MACF,IACF;AACN,YAAM,YACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD,OAAO,CAAC,MAAwB,EAAE,SAAS,MAAM,EACjD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE,IACV;AAEN,YAAM,gBACJ,OAAO,IAAI,YAAY,WACnB,IAAI,QACD,OAAO,CAAC,MAA4B,EAAE,SAAS,UAAU,EACzD,IAAI,CAAC,MAAM,EAAE,IAAI,EACjB,KAAK,EAAE,IACV;AAEN,YAAM,eAA2D;AAAA,QAC/D,MAAM;AAAA,QACN,SAAS,SAAS,aAAa;AAAA,QAC/B,GAAI,WAAW,SAAS,EAAE,YAAY,UAAU,IAAI,CAAC;AAAA,MACvD;AAIA,UAAI,iBAAiB,WAAW,QAAQ;AACtC,QAAC,aAAoD,oBACnD,iBAAiB;AAAA,MACrB;AACA,UAAI,KAAK,YAAY;AACrB;AAAA,IACF;AACA,QAAI,IAAI,SAAS,QAAQ;AACvB,iBAAW,UAAU,IAAI,SAAS;AAChC,YAAI,KAAK;AAAA,UACP,MAAM;AAAA,UACN,cAAc,gBAAgB,OAAO,YAAY,KAAK;AAAA,UACtD,SAAS,OAAO;AAAA,QAClB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEO,SAAS,cAAc,OAA4C;AACxE,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,UAAU;AAAA,MACR,MAAM,KAAK;AAAA,MACX,aAAa,KAAK;AAAA,MAClB,YAAY,KAAK,kBAAkB,gBAAgB,KAAK,UAAU;AAAA,IACpE;AAAA,EACF,EAAE;AACJ;AAEO,SAAS,mBAAmB,QAA2D;AAC5F,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,OAAQ,QAAO;AAC9B,MAAI,WAAW,WAAY,QAAO;AAClC,SAAO,EAAE,MAAM,YAAY,UAAU,EAAE,MAAM,OAAO,KAAK,EAAE;AAC7D;AAEO,SAAS,wBAAwB,OAAiD;AACvF,SAAO,UAAU,QAAQ,SAAS;AACpC;AAIO,SAAS,6BAA6B,QAAmC;AAC9E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;AAEO,SAAS,0BAA0B,QAAmC;AAC3E,UAAQ,QAAQ;AAAA,IACd,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;AFlZO,SAAS,gBAAgB,SAAsC;AACpE,QAAM,SAAS,IAAI,aAAa;AAChC,YAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAM,QAAQ,GAAG,CAAC,CAAC;AACpE,SAAO;AACT;AAEA,eAAe,UAAU,SAAwB,QAAqC;AACpF,QAAM,UAAU,QAAQ,QAAQ,WAAW,YAAY;AAEvD,QAAM,SAAS,IAAI,UAAU;AAAA,IAC3B,GAAI,UACA,EAAE,QAAQ,MAA2B,WAAW,QAAQ,OAAO,IAC/D,EAAE,QAAQ,QAAQ,OAAO;AAAA,IAC7B,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,IAChD,GAAI,UACA;AAAA,MACE,gBAAgB;AAAA,QACd,cAAc;AAAA,QACd,SAAS;AAAA,MACX;AAAA,IACF,IACA,CAAC;AAAA,EACP,CAAC;AAED,QAAM,eAAe,wBAAwB,QAAQ,gBAAgB,QAAQ,OAAO;AACpF,QAAM,EAAE,QAAQ,WAAW,SAAS,IAAI,oBAAoB,QAAQ,UAAU,YAAY;AAG1F,QAAM,SAAS,UACX;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,MAAM;AAAA,IACR;AAAA,IACA,GAAI,aAAa,CAAC;AAAA,EACpB,IACA;AAEJ,MAAI,YAAY,QAAQ,aAAa;AACrC,MAAI;AACJ,MAAI;AAEJ,MAAI,QAAQ,UAAU;AACpB,UAAM,IAAI,oBAAoB,QAAQ,UAAU,WAAW,QAAQ,KAAK;AACxE,eAAW,EAAE;AACb,gBAAY,EAAE;AACd,QAAI,EAAE,cAAc;AAClB,qBAAe,EAAE;AAAA,IACnB;AAAA,EACF;AAEA,QAAM,SAAwC;AAAA,IAC5C,OAAO,QAAQ;AAAA,IACf,YAAY;AAAA,IACZ;AAAA,IACA,GAAI,SAAS,EAAE,OAA0D,IAAI,CAAC;AAAA,IAC9E,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;AAAA,IAC/B,GAAI,eACA,EAAE,eAAe,aAA0E,IAC3F,CAAC;AAAA,IACL,GAAI,QAAQ,eAAe,QAAQ,CAAC,WAAW,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IACvF,GAAI,QAAQ,QAAQ,OAAO,EAAE,OAAO,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,OAAO,EAAE,gBAAgB,QAAQ,KAAK,IAAI,CAAC;AAAA,IACvD,GAAI,QAAQ,OAAO,UAAU,QAAQ,aAAa,UAAU,QAAQ,YAChE;AAAA,MACE,OAAO;AAAA,QACL,GAAI,QAAQ,OAAO,SAAS,iBAAiB,QAAQ,KAAK,IAAI,CAAC;AAAA,QAC/D,GAAI,QAAQ,eAAe,CAAC;AAAA,QAC5B,GAAI,QAAQ,YAAY,CAAC,EAAE,MAAM,uBAAuB,MAAM,aAAa,CAAC,IAAI,CAAC;AAAA,MACnF;AAAA,IACF,IACA,CAAC;AAAA,IACL,GAAI,QAAQ,cAAc,QAAQ,OAAO,SACrC,EAAE,aAAa,sBAAsB,QAAQ,UAAU,EAAE,IACzD,CAAC;AAAA,IACL,IAAI,MAAM;AACR,YAAM,eAAe;AAAA,QACnB,GAAI,QAAQ,aAAa,CAAC,EAAE,MAAM,mBAAmB,CAAC,IAAI,CAAC;AAAA,QAC3D,GAAI,QAAQ,gBAAgB,CAAC,EAAE,MAAM,2BAA2B,CAAC,IAAI,CAAC;AAAA,MACxE;AACA,aAAO,aAAa,SAAS,EAAE,oBAAoB,EAAE,OAAO,aAAa,EAAE,IAAI,CAAC;AAAA,IAClF,GAAG;AAAA,IACH,QAAQ;AAAA,EACV;AAEA,QAAM,cAAc;AAAA,IAClB,GAAI,UAAU,CAAC,wBAAwB,kBAAkB,IAAI,CAAC;AAAA,IAC9D,GAAI,QAAQ,aAAa,CAAC,oBAAoB,IAAI,CAAC;AAAA,IACnD,GAAI,QAAQ,gBAAgB,CAAC,+BAA+B,IAAI,CAAC;AAAA,EACnE;AAEA,QAAMA,UAAS,OAAO,SAAS,OAAO,QAAQ;AAAA,IAC5C,QAAQ,QAAQ,UAAU;AAAA,IAC1B,GAAI,YAAY,SAAS,EAAE,SAAS,EAAE,kBAAkB,YAAY,KAAK,GAAG,EAAE,EAAE,IAAI,CAAC;AAAA,EACvF,CAAC;AAED,QAAM,eAA8B,CAAC;AAErC,MAAI,gBAAgB;AACpB,MAAI,kBAAkB;AAEtB,EAAAA,QAAO,GAAG,QAAQ,CAAC,SAAS;AAC1B,WAAO,KAAK,EAAE,MAAM,cAAc,KAAK,CAAC;AAAA,EAC1C,CAAC;AAED,EAAAA,QAAO,GAAG,YAAY,CAAC,kBAAkB;AACvC,WAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,cAAc,CAAC;AAAA,EAC7D,CAAC;AAED,EAAAA,QAAO,GAAG,eAAe,CAAC,UAAU;AAClC,QAAI,MAAM,SAAS,uBAAuB;AAExC,UAAI,MAAM,cAAc,SAAS,YAAY;AAC3C,wBAAgB,MAAM,cAAc;AACpC,0BAAkB,MAAM,cAAc;AAAA,MACxC;AAEA,UAAI,MAAM,cAAc,SAAS,mBAAmB;AAClD,wBAAgB,MAAM,cAAc;AACpC,0BAAkB,MAAM,cAAc;AAAA,MACxC;AAAA,IACF;AAAA,EACF,CAAC;AAED,EAAAA,QAAO,GAAG,aAAa,CAAC,UAAU;AAChC,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,IACZ,CAAC;AAAA,EACH,CAAC;AAED,EAAAA,QAAO,GAAG,gBAAgB,CAAC,UAAU;AACnC,QAAI,MAAM,SAAS,QAAQ;AACzB,mBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,MAAM,KAAK,CAAC;AAAA,IACtD,WAAW,MAAM,SAAS,YAAY;AACpC,mBAAa,KAAK,EAAE,MAAM,YAAY,MAAM,MAAM,UAAU,WAAW,MAAM,UAAU,CAAC;AAAA,IAC1F,WAAW,MAAM,SAAS,YAAY;AACpC,YAAM,KAAe;AAAA,QACnB,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,MAAM,MAAM;AAAA,MACd;AACA,mBAAa,KAAK,EAAE;AACpB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,GAAG;AAAA,QACP,MAAM,GAAG;AAAA,QACT,MAAM,GAAG;AAAA,MACX,CAAC;AAAA,IACH,WAAW,MAAM,SAAS,mBAAmB;AAC3C,YAAM,MAAsB;AAAA,QAC1B,MAAM;AAAA,QACN,IAAI,MAAM;AAAA,QACV,MAAM,MAAM;AAAA,QACZ,OAAO,MAAM;AAAA,MACf;AACA,mBAAa,KAAK,GAAG;AACrB,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,IAAI,IAAI;AAAA,QACR,MAAM,IAAI;AAAA,QACV,OAAO,IAAI;AAAA,MACb,CAAC;AAAA,IACH,OAAO;AACL,YAAM,MAAM;AACZ,YAAM,YAAY,IAAI;AACtB,UAAI,cAAc,0BAA0B;AAE1C,cAAM,MAAwB;AAAA,UAC5B,MAAM;AAAA,UACN,WAAW,IAAI;AAAA,UACf,YAAY;AAAA,UACZ,MAAM;AAAA,QACR;AACA,qBAAa,KAAK,GAAG;AACrB,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,WAAW,IAAI;AAAA,UACf,YAAY,IAAI;AAAA,UAChB,MAAM,IAAI;AAAA,QACZ,CAAC;AAAA,MACH,OAAO;AAEL,qBAAa,KAAK,EAAE,MAAM,OAAO,MAAM,IAAI,CAAC;AAAA,MAC9C;AAAA,IACF;AAAA,EACF,CAAC;AAED,MAAI;AACF,UAAM,eAAe,MAAMA,QAAO,aAAa;AAC/C,UAAM,aAAa,6BAA6B,aAAa,WAAW;AAExE,UAAM,WAA2B;AAAA,MAC/B,SAAS;AAAA,QACP,MAAM;AAAA,QACN,SAAS,aAAa,SAAS,IAAI,eAAe;AAAA,MACpD;AAAA,MACA;AAAA,MACA,OAAO;AAAA,QACL,aAAa,aAAa,MAAM;AAAA,QAChC,cAAc,aAAa,MAAM;AAAA,QACjC,GAAK,aAAa,MAA6C,2BAC7D,QAAQ;AAAA,UACR,WAAY,aAAa,MACtB;AAAA,QACL;AAAA,QACA,GAAK,aAAa,MACf,+BAA+B,QAAQ;AAAA,UACxC,YAAa,aAAa,MACvB;AAAA,QACL;AAAA,MACF;AAAA,IACF;AAEA,WAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,WAAO,SAAS,QAAQ;AAAA,EAC1B,SAAS,KAAK;AACZ,UAAM,QAAQ,QAAQ,GAAG;AACzB,WAAO,KAAK,EAAE,MAAM,SAAS,MAAM,CAAC;AACpC,WAAO,MAAM,KAAK;AAAA,EACpB;AACF;AAEA,SAAS,QAAQ,KAA6B;AAC5C,MAAI,eAAe,UAAU,UAAU;AACrC,WAAO,IAAI,cAAc,aAAa,IAAI,SAAS;AAAA,MACjD,YAAY,IAAI;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,aAAa,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EACnE;AACA,SAAO,IAAI,cAAc,aAAa,OAAO,GAAG,CAAC;AACnD;;;AGlQA,OAAO,YAAY;AAYZ,SAAS,aAAa,SAAsC;AACjE,QAAM,SAAS,IAAI,aAAa;AAChC,QAAM,eAAe,QAAQ,YAAY;AACzC,EAAAC,WAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAMC,SAAQ,KAAK,YAAY,CAAC,CAAC;AAClF,SAAO;AACT;AAEA,eAAeD,WAAU,SAAwB,QAAqC;AACpF,QAAM,SAAS,IAAI,OAAO;AAAA,IACxB,QAAQ,QAAQ;AAAA,IAChB,GAAI,QAAQ,UAAU,EAAE,SAAS,QAAQ,QAAQ,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,QAAQ,EAAE,OAAO,QAAQ,MAAM,IAAI,CAAC;AAAA,EAClD,CAAC;AAGD,QAAM,oBAAoB,QAAQ,aAAa,SAAS,QAAQ,aAAa;AAE7E,QAAM,WAAW,iBAAiB,QAAQ,UAAU,EAAE,UAAU,QAAQ,SAAS,CAAC;AAGlF,QAAM,cAAc,QAAQ,aAAa,QAAQ,MAAM;AACvD,QAAM,gBAAgB,QAAQ,eAAe;AAE7C,QAAM,SAA4C;AAAA,IAChD,OAAO,QAAQ;AAAA,IACf;AAAA,IACA,QAAQ;AAAA,IACR,GAAI,QAAQ,YAAY,EAAE,YAAY,QAAQ,UAAU,IAAI,CAAC;AAAA,IAC7D,GAAI,iBAAiB,QAAQ,CAAC,QAAQ,WAAW,EAAE,aAAa,cAAc,IAAI,CAAC;AAAA,IACnF,GAAI,QAAQ,QAAQ,OAAO,EAAE,OAAO,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtD,GAAI,QAAQ,OAAO,EAAE,MAAM,QAAQ,KAAK,IAAI,CAAC;AAAA,IAC7C,GAAI,QAAQ,YAAY,CAAC,oBACrB,EAAE,kBAAkB,wBAAwB,QAAQ,QAAQ,EAAE,IAC9D,CAAC;AAAA,IACL,GAAI,QAAQ,OAAO,SAAS,EAAE,OAAO,cAAc,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACvE,GAAI,QAAQ,cAAc,QAAQ,OAAO,SACrC,EAAE,aAAa,mBAAmB,QAAQ,UAAU,EAAE,IACtD,CAAC;AAAA,IACL,gBAAgB,EAAE,eAAe,KAAK;AAAA,EACxC;AAGA,MAAI,QAAQ,WAAW;AACrB,QAAI,QAAQ,aAAa,YAAY;AACnC,YAAM,MAAM;AACZ,YAAM,SAAU,IAAI,SAAuB,CAAC,GAAG,MAAM;AACrD,YAAM,KAAK,EAAE,MAAM,oBAAoB,UAAU,EAAE,MAAM,cAAc,EAAE,CAAC;AAC1E,UAAI,QAAQ;AAAA,IACd;AAAA,EAGF;AAGA,MAAI,mBAAmB;AACrB,IAAC,OAA8C,WAAW,QAAQ,WAC9D,EAAE,MAAM,UAAU,IAClB,EAAE,MAAM,WAAW;AAAA,EACzB;AAEA,QAAME,UAAS,MAAM,OAAO,KAAK,YAAY,OAAO,QAAQ;AAAA,IAC1D,QAAQ,QAAQ,UAAU;AAAA,EAC5B,CAAC;AAED,QAAM,eAA8B,CAAC;AACrC,QAAM,gBAAgB,oBAAI,IAA4D;AACtF,MAAI,YAAY;AAChB,MAAI,gBAAgB;AACpB,MAAI,cAAc;AAClB,MAAI,eAAe;AACnB,MAAI,YAAY;AAChB,MAAI,eAA8B;AAElC,mBAAiB,SAASA,SAAqD;AAC7E,UAAM,SAAS,MAAM,UAAU,CAAC;AAEhC,QAAI,MAAM,OAAO;AACf,oBAAc,MAAM,MAAM;AAC1B,qBAAe,MAAM,MAAM;AAC3B,YAAM,UAAU,MAAM,MAAM;AAC5B,UAAI,SAAS,eAAe;AAC1B,oBAAY,QAAQ;AAAA,MACtB;AAAA,IACF;AAEA,QAAI,CAAC,OAAQ;AAEb,QAAI,OAAO,eAAe;AACxB,qBAAe,OAAO;AAAA,IACxB;AAEA,UAAM,QAAQ,OAAO;AAGrB,UAAM,mBAAoB,MAAkC;AAC5D,QAAI,OAAO,qBAAqB,YAAY,kBAAkB;AAC5D,uBAAiB;AACjB,aAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,iBAAiB,CAAC;AAAA,IAChE;AAGA,QAAI,MAAM,SAAS;AACjB,mBAAa,MAAM;AACnB,aAAO,KAAK,EAAE,MAAM,cAAc,MAAM,MAAM,QAAQ,CAAC;AAAA,IACzD;AAGA,QAAI,MAAM,YAAY;AACpB,iBAAW,MAAM,MAAM,YAAY;AACjC,YAAI,QAAQ,cAAc,IAAI,GAAG,KAAK;AACtC,YAAI,CAAC,OAAO;AACV,kBAAQ;AAAA,YACN,IAAI,GAAG,MAAM;AAAA,YACb,MAAM,GAAG,UAAU,QAAQ;AAAA,YAC3B,UAAU;AAAA,UACZ;AACA,wBAAc,IAAI,GAAG,OAAO,KAAK;AAAA,QACnC;AACA,YAAI,GAAG,GAAI,OAAM,KAAK,GAAG;AACzB,YAAI,GAAG,UAAU,KAAM,OAAM,OAAO,GAAG,SAAS;AAChD,YAAI,GAAG,UAAU,WAAW;AAC1B,gBAAM,YAAY,GAAG,SAAS;AAC9B,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,MAAM;AAAA,YACV,MAAM,MAAM;AAAA,YACZ,UAAU,GAAG,SAAS;AAAA,UACxB,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,MAAI,eAAe;AACjB,iBAAa,KAAK,EAAE,MAAM,YAAY,MAAM,cAAc,CAAC;AAAA,EAC7D;AAGA,MAAI,WAAW;AACb,iBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,EACrD;AAGA,aAAW,CAAC,EAAE,EAAE,KAAK,eAAe;AAClC,QAAI,OAAgC,CAAC;AACrC,QAAI;AACF,aAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,IAC/B,QAAQ;AAAA,IAER;AACA,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF;AACA,iBAAa,KAAK,QAAQ;AAC1B,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAEA,QAAM,aAAa,0BAA0B,YAAY;AAEzD,QAAM,WAA2B;AAAA,IAC/B,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,aAAa,SAAS,IAAI,eAAe,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO,EAAE,aAAa,cAAc,GAAI,YAAY,KAAK,EAAE,UAAU,EAAG;AAAA,EAC1E;AAEA,SAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,SAAO,SAAS,QAAQ;AAC1B;AAEA,SAASD,SAAQ,KAAc,WAAmB,UAAyB;AACzE,MAAI,eAAe,OAAO,UAAU;AAElC,QAAI,MAAM,IAAI;AACd,UAAM,OAAO,IAAI;AACjB,QAAI,MAAM;AAER,aAAO,YAAY,KAAK,UAAU,IAAI,CAAC;AAAA,IACzC;AACA,WAAO,IAAI,cAAc,UAAU,KAAK;AAAA,MACtC,YAAY,IAAI;AAAA,MAChB,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AACA,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,UAAU,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAChE;AACA,SAAO,IAAI,cAAc,UAAU,OAAO,GAAG,CAAC;AAChD;;;ACnNA,OAAO,QAAQ;AAaf,IAAM,mBAAmB;AAElB,SAAS,kBAAkB,SAAsC;AACtE,QAAM,SAAS,IAAI,aAAa;AAChC,EAAAE,WAAU,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ,OAAO,MAAMC,SAAQ,GAAG,CAAC,CAAC;AACpE,SAAO;AACT;AAEA,eAAeD,WAAU,SAAwB,QAAqC;AACpF,QAAM,WAAW,QAAQ,WAAW,kBAAkB,QAAQ,QAAQ,EAAE;AACxE,QAAM,MAAM,GAAG,OAAO;AAEtB,QAAM,EAAE,QAAQ,MAAM,IAAI,aAAa,QAAQ,QAAQ;AAEvD,QAAM,OAAgC;AAAA,IACpC,OAAO,QAAQ;AAAA,IACf,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,cAAc;AAAA,IACd;AAAA,IACA,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,SAAS,CAAC,6BAA6B;AAAA,EACzC;AAEA,MAAI,QAAQ,OAAO,QAAQ;AACzB,SAAK,QAAQ,aAAa,QAAQ,KAAK;AAAA,EACzC;AACA,MAAI,QAAQ,eAAe,QAAQ,CAAC,QAAQ,UAAU;AACpD,SAAK,cAAc,QAAQ;AAAA,EAC7B;AACA,MAAI,QAAQ,UAAU;AACpB,SAAK,YAAY;AAAA,MACf,QAAQ,QAAQ;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,EACF;AAEA,QAAM,UAAkC;AAAA,IACtC,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,eAAe,UAAU,QAAQ,MAAM;AAAA,IACvC,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,cAAc,YAAY,GAAG,SAAS,CAAC,IAAI,GAAG,QAAQ,CAAC,KAAK,GAAG,KAAK,CAAC;AAAA,EACvE;AAEA,MAAI,QAAQ,WAAW;AACrB,YAAQ,oBAAoB,IAAI,QAAQ;AAAA,EAC1C;AAEA,QAAM,WAAW,MAAM,MAAM,KAAK;AAAA,IAChC,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,KAAK,UAAU,IAAI;AAAA,IACzB,QAAQ,QAAQ;AAAA,EAClB,CAAC;AAED,MAAI,CAAC,SAAS,IAAI;AAChB,UAAM,OAAO,MAAM,SAAS,KAAK,EAAE,MAAM,MAAM,EAAE;AACjD,QAAI,UAAU,oBAAoB,SAAS,MAAM,MAAM,IAAI;AAG3D,QAAI,SAAS,WAAW,OAAO,KAAK,SAAS,eAAe,GAAG;AAC7D,iBACE;AAAA;AAAA;AAAA,IAGJ;AAEA,UAAM,IAAI,cAAc,UAAU,SAAS;AAAA,MACzC,YAAY,SAAS;AAAA,IACvB,CAAC;AAAA,EACH;AAEA,MAAI,CAAC,SAAS,MAAM;AAClB,UAAM,IAAI,cAAc,UAAU,iCAAiC;AAAA,EACrE;AAEA,QAAM,eAA8B,CAAC;AACrC,MAAI,YAAY;AAChB,QAAM,YAAY,oBAAI,IAA4D;AAClF,MAAI,cAAc;AAClB,MAAI,eAAe;AAEnB,mBAAiB,SAAS,SAAS,SAAS,IAAI,GAAG;AACjD,UAAM,OAAO,MAAM;AACnB,QAAI,CAAC,KAAM;AAEX,QAAI,SAAS,SAAS;AACpB,YAAM,MAAO,MAAM,WAAsB,KAAK,UAAU,KAAK;AAC7D,YAAM,IAAI,cAAc,UAAU,gBAAgB,GAAG,EAAE;AAAA,IACzD;AAEA,QAAI,SAAS,mBAAmB;AAC9B,YAAM,MACF,MAAM,OAAmC,WAAsB;AACnE,YAAM,IAAI,cAAc,UAAU,GAAG;AAAA,IACvC;AAGA,QAAI,SAAS,8BAA8B;AACzC,YAAM,QAAQ,MAAM;AACpB,mBAAa;AACb,aAAO,KAAK,EAAE,MAAM,cAAc,MAAM,MAAM,CAAC;AAAA,IACjD;AAGA,QAAI,SAAS,yCAAyC;AACpD,YAAM,QAAQ,MAAM;AACpB,aAAO,KAAK,EAAE,MAAM,kBAAkB,MAAM,MAAM,CAAC;AAAA,IACrD;AAGA,QAAI,SAAS,8BAA8B;AACzC,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM,SAAS,iBAAiB;AAClC,cAAM,SAAS,KAAK;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,KAAK,GAAG,MAAM,IAAI,MAAM;AAC9B,cAAM,OAAO,KAAK;AAClB,kBAAU,IAAI,IAAI,EAAE,IAAI,MAAM,UAAW,KAAK,aAAwB,GAAG,CAAC;AAAA,MAC5E;AAAA,IACF;AAGA,QAAI,SAAS,0CAA0C;AACrD,YAAM,QAAQ,MAAM;AACpB,YAAM,SAAS,MAAM;AAErB,iBAAW,CAAC,KAAK,EAAE,KAAK,WAAW;AACjC,YAAI,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9B,aAAG,YAAY;AACf,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT,UAAU;AAAA,UACZ,CAAC;AACD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,yCAAyC;AACpD,YAAM,SAAS,MAAM;AACrB,YAAM,UAAU,MAAM;AACtB,iBAAW,CAAC,KAAK,EAAE,KAAK,WAAW;AACjC,YAAI,IAAI,SAAS,IAAI,MAAM,EAAE,GAAG;AAC9B,aAAG,WAAW;AACd;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,6BAA6B;AACxC,YAAM,OAAO,MAAM;AACnB,UAAI,MAAM,SAAS,iBAAiB;AAClC,cAAM,SAAS,KAAK;AACpB,cAAM,SAAS,KAAK;AACpB,cAAM,KAAK,GAAG,MAAM,IAAI,MAAM;AAC9B,cAAM,KAAK,UAAU,IAAI,EAAE;AAC3B,YAAI,IAAI;AACN,cAAI,OAAgC,CAAC;AACrC,cAAI;AACF,mBAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,UAC/B,QAAQ;AAAA,UAER;AACA,iBAAO,KAAK;AAAA,YACV,MAAM;AAAA,YACN,IAAI,GAAG;AAAA,YACP,MAAM,GAAG;AAAA,YACT;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAGA,QAAI,SAAS,wBAAwB,SAAS,iBAAiB;AAC7D,YAAM,OAAO,MAAM;AACnB,YAAM,QAAQ,MAAM;AACpB,UAAI,OAAO;AACT,sBAAc,MAAM,gBAAgB;AACpC,uBAAe,MAAM,iBAAiB;AAAA,MACxC;AAAA,IACF;AAAA,EACF;AAGA,MAAI,WAAW;AACb,iBAAa,KAAK,EAAE,MAAM,QAAQ,MAAM,UAAU,CAAC;AAAA,EACrD;AAEA,aAAW,CAAC,EAAE,EAAE,KAAK,WAAW;AAC9B,QAAI,OAAgC,CAAC;AACrC,QAAI;AACF,aAAO,KAAK,MAAM,GAAG,QAAQ;AAAA,IAC/B,QAAQ;AAAA,IAER;AACA,UAAM,WAAqB;AAAA,MACzB,MAAM;AAAA,MACN,IAAI,GAAG;AAAA,MACP,MAAM,GAAG;AAAA,MACT;AAAA,IACF;AACA,iBAAa,KAAK,QAAQ;AAAA,EAC5B;AAEA,QAAM,eAAe,aAAa,KAAK,CAAC,MAAM,EAAE,SAAS,WAAW;AACpE,QAAM,aAAa,eAAe,aAAa;AAE/C,QAAM,iBAAiC;AAAA,IACrC,SAAS;AAAA,MACP,MAAM;AAAA,MACN,SAAS,aAAa,SAAS,IAAI,eAAe,aAAa;AAAA,IACjE;AAAA,IACA;AAAA,IACA,OAAO,EAAE,aAAa,aAAa;AAAA,EACrC;AAEA,SAAO,KAAK,EAAE,MAAM,QAAQ,WAAW,CAAC;AACxC,SAAO,SAAS,cAAc;AAChC;AAIA,gBAAgB,SACd,MACyC;AACzC,QAAM,SAAS,KAAK,UAAU;AAC9B,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI,SAAS;AAEb,MAAI;AACF,WAAO,MAAM;AACX,YAAM,EAAE,MAAM,MAAM,IAAI,MAAM,OAAO,KAAK;AAC1C,UAAI,KAAM;AACV,gBAAU,QAAQ,OAAO,OAAO,EAAE,QAAQ,KAAK,CAAC;AAEhD,UAAI,MAAM,OAAO,QAAQ,MAAM;AAC/B,aAAO,QAAQ,IAAI;AACjB,cAAM,QAAQ,OAAO,MAAM,GAAG,GAAG;AACjC,iBAAS,OAAO,MAAM,MAAM,CAAC;AAE7B,cAAM,YAAY,MACf,MAAM,IAAI,EACV,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,CAAC,EACnC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC;AAE/B,YAAI,UAAU,SAAS,GAAG;AACxB,gBAAM,OAAO,UAAU,KAAK,IAAI,EAAE,KAAK;AACvC,cAAI,QAAQ,SAAS,UAAU;AAC7B,gBAAI;AACF,oBAAM,KAAK,MAAM,IAAI;AAAA,YACvB,QAAQ;AAAA,YAER;AAAA,UACF;AAAA,QACF;AACA,cAAM,OAAO,QAAQ,MAAM;AAAA,MAC7B;AAAA,IACF;AAAA,EACF,UAAE;AACA,WAAO,YAAY;AAAA,EACrB;AACF;AAQA,SAAS,aAAa,IAAY,OAAoC;AACpE,MAAI,GAAG,WAAW,KAAK,KAAK,GAAG,WAAW,KAAK,EAAG,QAAO;AACzD,QAAM,WAAW,MAAM,IAAI,EAAE;AAC7B,MAAI,SAAU,QAAO;AACrB,QAAM,SAAS,MAAM,GAAG,QAAQ,WAAW,EAAE,CAAC;AAC9C,QAAM,IAAI,IAAI,MAAM;AACpB,SAAO;AACT;AAEA,SAAS,aAAa,UAAuE;AAC3F,MAAI;AACJ,QAAM,QAAmB,CAAC;AAC1B,QAAM,QAAQ,oBAAI,IAAoB;AAEtC,aAAW,OAAO,UAAU;AAC1B,QAAI,IAAI,SAAS,UAAU;AACzB,eAAS,IAAI;AACb;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,QAAQ;AACvB,YAAM,UACJ,OAAO,IAAI,YAAY,WACnB,CAAC,EAAE,MAAM,cAAc,MAAM,IAAI,QAAQ,CAAC,IAC1C,IAAI,QAAQ,IAAI,CAAC,SAAS;AACxB,YAAI,KAAK,SAAS,OAAQ,QAAO,EAAE,MAAM,cAAc,MAAM,KAAK,KAAK;AACvE,eAAO;AAAA,UACL,MAAM;AAAA,UACN,QAAQ;AAAA,UACR,WAAW,QAAQ,KAAK,SAAS,WAAW,KAAK,IAAI;AAAA,QACvD;AAAA,MACF,CAAC;AACP,YAAM,KAAK,EAAE,MAAM,QAAQ,QAAQ,CAAC;AACpC;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,aAAa;AAC5B,UAAI,OAAO,IAAI,YAAY,UAAU;AACnC,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,MAAM;AAAA,UACN,SAAS,CAAC,EAAE,MAAM,eAAe,MAAM,IAAI,SAAS,aAAa,CAAC,EAAE,CAAC;AAAA,UACrE,QAAQ;AAAA,QACV,CAAC;AACD;AAAA,MACF;AAEA,iBAAW,QAAQ,IAAI,SAAS;AAC9B,YAAI,KAAK,SAAS,QAAQ;AACxB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,MAAM;AAAA,YACN,SAAS,CAAC,EAAE,MAAM,eAAe,MAAM,KAAK,MAAM,aAAa,CAAC,EAAE,CAAC;AAAA,YACnE,QAAQ;AAAA,UACV,CAAC;AAAA,QACH,WAAW,KAAK,SAAS,aAAa;AACpC,gBAAM,CAAC,QAAQ,MAAM,IAAI,KAAK,GAAG,SAAS,GAAG,IACzC,KAAK,GAAG,MAAM,KAAK,CAAC,IACpB,CAAC,KAAK,IAAI,KAAK,EAAE;AACrB,gBAAM,KAAK;AAAA,YACT,MAAM;AAAA,YACN,IAAI,aAAa,QAAQ,KAAK;AAAA,YAC9B,SAAS,aAAa,QAAQ,KAAK;AAAA,YACnC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK,UAAU,KAAK,IAAI;AAAA,UACrC,CAAC;AAAA,QACH;AAAA,MAEF;AACA;AAAA,IACF;AAEA,QAAI,IAAI,SAAS,QAAQ;AACvB,iBAAW,UAAU,IAAI,SAAS;AAChC,cAAM,CAAC,MAAM,IAAI,OAAO,WAAW,SAAS,GAAG,IAC3C,OAAO,WAAW,MAAM,KAAK,CAAC,IAC9B,CAAC,OAAO,UAAU;AACtB,cAAM,KAAK;AAAA,UACT,MAAM;AAAA,UACN,SAAS,aAAa,QAAQ,KAAK;AAAA,UACnC,QAAQ,OAAO;AAAA,QACjB,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,QAAQ,MAAM;AACzB;AAIA,SAAS,aAAa,OAA0B;AAC9C,SAAO,MAAM,IAAI,CAAC,UAAU;AAAA,IAC1B,MAAM;AAAA,IACN,MAAM,KAAK;AAAA,IACX,aAAa,KAAK;AAAA,IAClB,YAAY,KAAK,kBAAkB,gBAAgB,KAAK,UAAU;AAAA,IAClE,QAAQ;AAAA,EACV,EAAE;AACJ;AAIA,SAASC,SAAQ,KAA6B;AAC5C,MAAI,eAAe,cAAe,QAAO;AACzC,MAAI,eAAe,OAAO;AACxB,WAAO,IAAI,cAAc,UAAU,IAAI,SAAS,EAAE,OAAO,IAAI,CAAC;AAAA,EAChE;AACA,SAAO,IAAI,cAAc,UAAU,OAAO,GAAG,CAAC;AAChD;;;AC1XA,IAAM,uBAAN,MAA2B;AAAA,EACjB,YAAY,oBAAI,IAA2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAanD,SAAS,MAAc,OAA4B;AACjD,SAAK,UAAU,IAAI,MAAM,KAAK;AAAA,EAChC;AAAA;AAAA,EAGA,WAAW,MAAuB;AAChC,WAAO,KAAK,UAAU,OAAO,IAAI;AAAA,EACnC;AAAA;AAAA,EAGA,IAAI,MAAyC;AAC3C,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,MAAuB;AACzB,WAAO,KAAK,UAAU,IAAI,IAAI;AAAA,EAChC;AAAA;AAAA,EAGA,OAAiB;AACf,WAAO,CAAC,GAAG,KAAK,UAAU,KAAK,CAAC;AAAA,EAClC;AACF;AAGO,IAAM,mBAAmB,IAAI,qBAAqB;;;ACrDzD,IAAM,sBAAsB;AAC5B,IAAM,uBAAuB;AAI7B,iBAAiB,SAAS,aAAa;AAAA,EACrC,QAAQ,CAAC,YAAY,gBAAgB,OAAO;AAC9C,CAAC;AAED,iBAAiB,SAAS,UAAU;AAAA,EAClC,QAAQ,CAAC,YAAY;AAEnB,QAAI,QAAQ,WAAW;AACrB,aAAO,kBAAkB,OAAO;AAAA,IAClC;AACA,WAAO,aAAa,OAAO;AAAA,EAC7B;AACF,CAAC;AAED,iBAAiB,SAAS,OAAO;AAAA,EAC/B,QAAQ,CAAC,YAAY;AACnB,QAAI,QAAQ,QAAS,QAAO,aAAa,OAAO;AAChD,WAAO,sBAAsB,OAAO;AAAA,EACtC;AACF,CAAC;AAED,iBAAiB,SAAS,YAAY;AAAA,EACpC,QAAQ,CAAC,YACP,aAAa;AAAA,IACX,GAAG;AAAA,IACH,SAAS,QAAQ,WAAW;AAAA,EAC9B,CAAC;AACL,CAAC;AAuBM,SAAS,OAAO,SAAsC;AAC3D,QAAM,QAAQ,iBAAiB,IAAI,QAAQ,QAAQ;AACnD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR,sBAAsB,QAAQ,QAAQ,kBAAkB,iBAAiB,KAAK,EAAE,KAAK,IAAI,CAAC;AAAA,IAC5F;AAAA,EACF;AACA,SAAO,MAAM,OAAO,OAAO;AAC7B;AASA,SAAS,sBAAsB,SAAsC;AACnE,QAAM,SAAS,IAAI,aAAa;AAEhC,qBAAmB,SAAS,MAAM,EAAE,MAAM,CAAC,QAAQ;AACjD,WAAO,MAAM,eAAe,QAAQ,MAAM,IAAI,MAAM,OAAO,GAAG,CAAC,CAAC;AAAA,EAClE,CAAC;AAED,SAAO;AACT;AAEA,eAAe,mBAAmB,SAAwB,QAAqC;AAC7F,QAAM,eAAe,aAAa,EAAE,GAAG,SAAS,SAAS,oBAAoB,CAAC;AAE9E,MAAI;AACF,qBAAiB,SAAS,cAAc;AACtC,aAAO,KAAK,KAAK;AAAA,IACnB;AACA,WAAO,SAAS,MAAM,aAAa,QAAQ;AAAA,EAC7C,QAAQ;AAEN,UAAM,gBAAgB,aAAa,EAAE,GAAG,SAAS,SAAS,qBAAqB,CAAC;AAChF,QAAI;AACF,uBAAiB,SAAS,eAAe;AACvC,eAAO,KAAK,KAAK;AAAA,MACnB;AACA,aAAO,SAAS,MAAM,cAAc,QAAQ;AAAA,IAC9C,SAAS,aAAa;AACpB,aAAO,MAAM,uBAAuB,QAAQ,cAAc,IAAI,MAAM,OAAO,WAAW,CAAC,CAAC;AAAA,IAC1F;AAAA,EACF;AACF;","names":["stream","runStream","toError","stream","runStream","toError"]}
|