@ljoukov/llm 3.0.2 → 3.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +131 -15
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -7
- package/dist/index.d.ts +32 -7
- package/dist/index.js +116 -15
- package/dist/index.js.map +1 -1
- package/package.json +5 -2
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/llm.ts","../src/utils/asyncQueue.ts","../src/fireworks/pricing.ts","../src/google/pricing.ts","../src/openai/pricing.ts","../src/utils/cost.ts","../src/openai/chatgpt-codex.ts","../src/openai/chatgpt-auth.ts","../src/utils/env.ts","../src/openai/responses-websocket.ts","../src/utils/scheduler.ts","../src/fireworks/client.ts","../src/fireworks/calls.ts","../src/fireworks/models.ts","../src/google/client.ts","../src/google/auth.ts","../src/google/calls.ts","../src/openai/client.ts","../src/openai/calls.ts","../src/tools/filesystemTools.ts","../src/tools/applyPatch.ts","../src/tools/filesystem.ts","../src/agent.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomBytes } from \"node:crypto\";\n\nimport {\n FinishReason,\n FunctionCallingConfigMode,\n type Content as GeminiContent,\n type GenerateContentConfig,\n type GroundingMetadata,\n type Part as GeminiPart,\n type Tool as GeminiTool,\n} from \"@google/genai\";\nimport { zodToJsonSchema } from \"@alcyone-labs/zod-to-json-schema\";\nimport { z } from \"zod\";\nimport type { ResponseTextConfig } from \"openai/resources/responses/responses\";\n\nimport { createAsyncQueue, type AsyncQueue } from \"./utils/asyncQueue.js\";\nimport { estimateCallCostUsd, type LlmUsageTokens } from \"./utils/cost.js\";\nimport { collectChatGptCodexResponse, type ChatGptInputItem } from \"./openai/chatgpt-codex.js\";\nimport { runFireworksCall } from \"./fireworks/calls.js\";\nimport { resolveFireworksModelId } from \"./fireworks/models.js\";\nimport { runGeminiCall } from \"./google/calls.js\";\nimport {\n runOpenAiCall,\n type OpenAiReasoningEffort,\n DEFAULT_OPENAI_REASONING_EFFORT,\n} from \"./openai/calls.js\";\n\nexport type { LlmUsageTokens } from \"./utils/cost.js\";\nexport { estimateCallCostUsd } from \"./utils/cost.js\";\n\ntype CollectChatGptCodexResponseOptions = Parameters<typeof collectChatGptCodexResponse>[0];\ntype CollectChatGptCodexResponseResult = Awaited<ReturnType<typeof collectChatGptCodexResponse>>;\n\nexport type LlmToolCallContext = {\n readonly toolName: string;\n readonly toolId: string;\n readonly turn: number;\n readonly toolIndex: number;\n};\n\nconst toolCallContextStorage = new AsyncLocalStorage<LlmToolCallContext>();\n\nexport function getCurrentToolCallContext(): LlmToolCallContext | null {\n return toolCallContextStorage.getStore() ?? null;\n}\n\nexport type JsonSchema = Record<string, unknown>;\n\nexport type LlmRole = \"user\" | \"assistant\" | \"system\" | \"developer\" | \"tool\";\n\ntype LlmInlineDataPart = {\n type: \"inlineData\";\n data: string;\n mimeType?: string;\n};\n\nexport type LlmContentPart = { type: \"text\"; text: string; thought?: boolean } | LlmInlineDataPart;\n\nexport type LlmContent = {\n readonly role: LlmRole;\n readonly parts: readonly LlmContentPart[];\n};\n\nexport type LlmImageSize = \"1K\" | \"2K\" | \"4K\";\n\nexport type LlmWebSearchMode = \"cached\" | \"live\";\n\nexport type LlmToolConfig =\n | { readonly type: \"web-search\"; readonly mode?: LlmWebSearchMode }\n | { readonly type: \"code-execution\" };\n\nexport type LlmTextDeltaEvent =\n | { readonly type: \"delta\"; readonly channel: \"response\"; readonly text: string }\n | { readonly type: \"delta\"; readonly channel: \"thought\"; readonly text: string };\n\nexport type LlmUsageEvent = {\n readonly type: \"usage\";\n readonly usage: LlmUsageTokens;\n readonly costUsd: number;\n readonly modelVersion: string;\n};\n\nexport type LlmModelEvent = {\n readonly type: \"model\";\n readonly modelVersion: string;\n};\n\nexport type LlmBlockedEvent = {\n readonly type: \"blocked\";\n};\n\nexport type LlmStreamEvent = LlmTextDeltaEvent | LlmUsageEvent | LlmModelEvent | LlmBlockedEvent;\n\nexport type LlmProvider = \"openai\" | \"chatgpt\" | \"gemini\" | \"fireworks\";\n\nexport type LlmTextResult = {\n readonly provider: LlmProvider;\n readonly model: string;\n readonly modelVersion: string;\n readonly content?: LlmContent;\n readonly text: string;\n readonly thoughts: string;\n readonly blocked: boolean;\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n readonly grounding?: GroundingMetadata;\n};\n\nexport type LlmTextStream = {\n readonly events: AsyncIterable<LlmStreamEvent>;\n readonly result: Promise<LlmTextResult>;\n readonly abort: () => void;\n};\n\nexport type DeepPartial<T> =\n T extends ReadonlyArray<infer Item>\n ? ReadonlyArray<DeepPartial<Item>>\n : T extends Array<infer Item>\n ? Array<DeepPartial<Item>>\n : T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T;\n\nexport type LlmJsonPartialEvent<T> = {\n readonly type: \"json\";\n readonly stage: \"partial\";\n readonly value: DeepPartial<T>;\n};\n\nexport type LlmJsonFinalEvent<T> = {\n readonly type: \"json\";\n readonly stage: \"final\";\n readonly value: T;\n};\n\nexport type LlmJsonStreamEvent<T> = LlmStreamEvent | LlmJsonPartialEvent<T> | LlmJsonFinalEvent<T>;\n\nexport type LlmJsonStream<T> = {\n readonly events: AsyncIterable<LlmJsonStreamEvent<T>>;\n readonly result: Promise<{\n readonly value: T;\n readonly rawText: string;\n readonly result: LlmTextResult;\n }>;\n readonly abort: () => void;\n};\n\nexport type LlmInputMessage = {\n readonly role: \"user\" | \"assistant\" | \"system\" | \"developer\";\n readonly content: string | readonly LlmContentPart[];\n};\n\nexport type LlmInput = {\n /**\n * OpenAI-style input:\n * - a plain string becomes one user message\n * - message arrays allow multi-turn + role-specific content\n */\n readonly input: string | readonly LlmInputMessage[];\n /**\n * OpenAI-style top-level instructions.\n * Applied as a system message before input.\n */\n readonly instructions?: string;\n};\n\nexport type LlmBaseRequest = {\n readonly model: string;\n readonly tools?: readonly LlmToolConfig[];\n readonly responseMimeType?: string;\n readonly responseJsonSchema?: JsonSchema;\n readonly responseModalities?: readonly string[];\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly openAiTextFormat?: ResponseTextConfig[\"format\"];\n readonly signal?: AbortSignal;\n};\n\nexport type LlmTextRequest = LlmInput & LlmBaseRequest;\n\nexport type LlmJsonRequest<T> = LlmInput &\n LlmBaseRequest & {\n readonly schema: z.ZodType<T>;\n readonly openAiSchemaName?: string;\n readonly maxAttempts?: number;\n readonly normalizeJson?: (value: unknown) => unknown;\n /**\n * Optional streaming callback. Useful to surface thought deltas while still\n * returning a single validated JSON result.\n */\n readonly onEvent?: (event: LlmStreamEvent) => void;\n };\n\nexport type LlmJsonStreamRequest<T> = LlmJsonRequest<T> & {\n /**\n * - \"partial\" (default): emit best-effort partial JSON snapshots while streaming.\n * - \"final\": stream thought deltas but only emit the final validated JSON value.\n */\n readonly streamMode?: \"partial\" | \"final\";\n};\n\nexport class LlmJsonCallError extends Error {\n constructor(\n message: string,\n readonly attempts: ReadonlyArray<{\n readonly attempt: number;\n readonly rawText: string;\n readonly error: unknown;\n }>,\n ) {\n super(message);\n this.name = \"LlmJsonCallError\";\n }\n}\n\nexport type LlmImageData = {\n readonly mimeType?: string;\n readonly data: Buffer;\n};\n\nexport type LlmGenerateImagesRequest = {\n readonly model: string; // e.g. \"gemini-3-pro-image-preview\"\n readonly stylePrompt: string;\n readonly styleImages?: readonly LlmImageData[];\n readonly imagePrompts: readonly string[];\n readonly imageGradingPrompt: string;\n readonly maxAttempts?: number;\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly signal?: AbortSignal;\n};\n\nexport type LlmFunctionTool<Schema extends z.ZodType, Output> = {\n readonly type?: \"function\";\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n};\n\nexport type LlmCustomToolInputFormat =\n | { readonly type: \"text\" }\n | {\n readonly type: \"grammar\";\n readonly syntax: \"lark\" | \"regex\";\n readonly definition: string;\n };\n\nexport type LlmCustomTool<Output> = {\n readonly type: \"custom\";\n readonly description?: string;\n readonly format?: LlmCustomToolInputFormat;\n readonly execute: (input: string) => Promise<Output> | Output;\n};\n\nexport type LlmExecutableTool<Schema extends z.ZodType, Output> =\n | LlmFunctionTool<Schema, Output>\n | LlmCustomTool<Output>;\n\nexport type LlmToolSet = Record<string, LlmExecutableTool<z.ZodType, unknown>>;\n\nexport function tool<Schema extends z.ZodType, Output>(options: {\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n}): LlmFunctionTool<Schema, Output> {\n return {\n type: \"function\",\n ...options,\n };\n}\n\nexport function customTool<Output>(options: {\n readonly description?: string;\n readonly format?: LlmCustomToolInputFormat;\n readonly execute: (input: string) => Promise<Output> | Output;\n}): LlmCustomTool<Output> {\n return {\n type: \"custom\",\n ...options,\n };\n}\n\nexport type LlmToolCallResult = {\n readonly toolName: string;\n readonly input: unknown;\n readonly output: unknown;\n readonly error?: string;\n readonly callId?: string;\n};\n\nexport type LlmToolLoopStep = {\n readonly step: number;\n readonly modelVersion: string;\n readonly text?: string;\n readonly thoughts?: string;\n readonly toolCalls: readonly LlmToolCallResult[];\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n};\n\nexport type LlmToolLoopResult = {\n readonly text: string;\n readonly thoughts: string;\n readonly steps: readonly LlmToolLoopStep[];\n readonly totalCostUsd: number;\n};\n\nexport type LlmToolLoopRequest = LlmInput & {\n readonly model: string;\n readonly tools: LlmToolSet;\n readonly modelTools?: readonly LlmToolConfig[];\n readonly maxSteps?: number;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly onEvent?: (event: LlmStreamEvent) => void;\n readonly signal?: AbortSignal;\n};\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction applyNullableJsonSchema(schema: Record<string, unknown>): void {\n const anyOf = schema.anyOf;\n if (Array.isArray(anyOf)) {\n if (!anyOf.some((entry) => isPlainRecord(entry) && entry.type === \"null\")) {\n anyOf.push({ type: \"null\" });\n }\n return;\n }\n const type = schema.type;\n if (typeof type === \"string\") {\n schema.type = type === \"null\" ? \"null\" : [type, \"null\"];\n return;\n }\n if (Array.isArray(type)) {\n const normalized = type.filter((entry): entry is string => typeof entry === \"string\");\n if (!normalized.includes(\"null\")) {\n schema.type = [...normalized, \"null\"];\n } else {\n schema.type = normalized;\n }\n return;\n }\n schema.type = [\"null\"];\n}\n\nfunction orderedJsonSchemaKeys(\n properties: Record<string, unknown>,\n ordering: readonly string[] | undefined,\n): string[] {\n const keys = Object.keys(properties);\n if (!ordering || ordering.length === 0) {\n return keys;\n }\n const ordered: string[] = [];\n const seen = new Set<string>();\n for (const key of ordering) {\n if (Object.hasOwn(properties, key)) {\n ordered.push(key);\n seen.add(key);\n }\n }\n for (const key of keys) {\n if (!seen.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n\nfunction addGeminiPropertyOrdering(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"items\") {\n output.items = isPlainRecord(value) ? addGeminiPropertyOrdering(value as JsonSchema) : value;\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n output[key] = Array.isArray(value)\n ? value.map((entry) => addGeminiPropertyOrdering(entry as JsonSchema))\n : value;\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = addGeminiPropertyOrdering(defValue as JsonSchema);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(propertiesRaw)) {\n properties[key] = isPlainRecord(value)\n ? addGeminiPropertyOrdering(value as JsonSchema)\n : value;\n }\n output.properties = properties;\n output.propertyOrdering = Object.keys(properties);\n }\n if ((schema as { nullable?: unknown }).nullable) {\n applyNullableJsonSchema(output);\n }\n return output;\n}\n\nfunction normalizeOpenAiSchema(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"required\") {\n continue;\n }\n if (key === \"additionalProperties\") {\n continue;\n }\n if (key === \"propertyOrdering\") {\n continue;\n }\n if (key === \"items\") {\n if (isPlainRecord(value)) {\n output.items = normalizeOpenAiSchema(value);\n }\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n if (Array.isArray(value)) {\n output.anyOf = value.map((entry) => normalizeOpenAiSchema(entry as JsonSchema));\n }\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = normalizeOpenAiSchema(defValue);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const ordering = Array.isArray((schema as { propertyOrdering?: unknown }).propertyOrdering)\n ? ((schema as { propertyOrdering?: unknown }).propertyOrdering as string[])\n : undefined;\n const orderedKeys = orderedJsonSchemaKeys(propertiesRaw, ordering);\n const properties: Record<string, unknown> = {};\n for (const key of orderedKeys) {\n const value = propertiesRaw[key];\n if (!isPlainRecord(value)) {\n properties[key] = value;\n continue;\n }\n properties[key] = normalizeOpenAiSchema(value as JsonSchema);\n }\n output.properties = properties;\n output.required = orderedKeys;\n output.additionalProperties = false;\n }\n\n const schemaType = (schema as { type?: unknown }).type;\n if (\n output.additionalProperties === undefined &&\n (schemaType === \"object\" || (Array.isArray(schemaType) && schemaType.includes(\"object\")))\n ) {\n output.additionalProperties = false;\n if (!Array.isArray(output.required)) {\n output.required = [];\n }\n }\n\n const normalizeExclusiveBound = (options: {\n exclusiveKey: \"exclusiveMinimum\" | \"exclusiveMaximum\";\n inclusiveKey: \"minimum\" | \"maximum\";\n }): void => {\n const exclusiveValue = output[options.exclusiveKey];\n if (exclusiveValue === false) {\n delete output[options.exclusiveKey];\n return;\n }\n const inclusiveValue = output[options.inclusiveKey];\n if (exclusiveValue === true) {\n if (typeof inclusiveValue === \"number\" && Number.isFinite(inclusiveValue)) {\n output[options.exclusiveKey] = inclusiveValue;\n delete output[options.inclusiveKey];\n } else {\n delete output[options.exclusiveKey];\n }\n return;\n }\n if (typeof exclusiveValue === \"number\" && Number.isFinite(exclusiveValue)) {\n delete output[options.inclusiveKey];\n }\n };\n\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMinimum\",\n inclusiveKey: \"minimum\",\n });\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMaximum\",\n inclusiveKey: \"maximum\",\n });\n\n return output;\n}\n\nfunction resolveOpenAiSchemaRoot(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref !== \"string\") {\n return schema;\n }\n const refMatch = /^#\\/(definitions|[$]defs)\\/(.+)$/u.exec(schema.$ref);\n if (!refMatch) {\n return schema;\n }\n const section = refMatch[1];\n const key = refMatch[2];\n if (!section || !key) {\n return schema;\n }\n const defsSource =\n section === \"definitions\"\n ? (schema as { definitions?: unknown }).definitions\n : (schema as { $defs?: unknown }).$defs;\n if (!isPlainRecord(defsSource)) {\n return schema;\n }\n const resolved = defsSource[key];\n if (!isPlainRecord(resolved)) {\n return schema;\n }\n return { ...resolved };\n}\n\nexport function toGeminiJsonSchema(schema: z.ZodType, options?: { name?: string }): JsonSchema {\n const jsonSchema = zodToJsonSchema(schema, {\n name: options?.name,\n target: \"jsonSchema7\",\n }) as JsonSchema;\n return addGeminiPropertyOrdering(resolveOpenAiSchemaRoot(jsonSchema));\n}\n\nfunction isJsonSchemaObject(schema: JsonSchema | undefined): boolean {\n if (!schema || !isPlainRecord(schema)) {\n return false;\n }\n const type = (schema as { type?: unknown }).type;\n if (type === \"object\") {\n return true;\n }\n if (Array.isArray(type) && type.includes(\"object\")) {\n return true;\n }\n if (isPlainRecord((schema as { properties?: unknown }).properties)) {\n return true;\n }\n return false;\n}\n\nexport function sanitisePartForLogging(part: LlmContentPart): unknown {\n switch (part.type) {\n case \"text\":\n return {\n type: \"text\",\n thought: part.thought === true ? true : undefined,\n preview: part.text.slice(0, 200),\n };\n case \"inlineData\": {\n let omittedBytes: number;\n try {\n omittedBytes = Buffer.from(part.data, \"base64\").byteLength;\n } catch {\n omittedBytes = Buffer.byteLength(part.data, \"utf8\");\n }\n return {\n type: \"inlineData\",\n mimeType: part.mimeType,\n data: `[omitted:${omittedBytes}b]`,\n };\n }\n default:\n return \"[unknown part]\";\n }\n}\n\nexport function convertGooglePartsToLlmParts(parts: readonly GeminiPart[]): LlmContentPart[] {\n const result: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.text !== undefined) {\n result.push({\n type: \"text\",\n text: part.text,\n thought: part.thought ? true : undefined,\n });\n continue;\n }\n const inline = part.inlineData;\n if (inline?.data) {\n result.push({\n type: \"inlineData\",\n data: inline.data,\n mimeType: inline.mimeType,\n });\n continue;\n }\n if (part.fileData?.fileUri) {\n throw new Error(\"fileData parts are not supported\");\n }\n }\n return result;\n}\n\nfunction assertLlmRole(value: string | undefined): LlmRole {\n switch (value) {\n case \"user\":\n case \"assistant\":\n case \"system\":\n case \"developer\":\n case \"tool\":\n return value;\n case \"model\":\n return \"assistant\";\n default:\n throw new Error(`Unsupported LLM role: ${String(value)}`);\n }\n}\n\nfunction convertGeminiContentToLlmContent(content: GeminiContent): LlmContent {\n return {\n role: assertLlmRole(content.role),\n parts: convertGooglePartsToLlmParts(content.parts ?? []),\n };\n}\n\nfunction toGeminiPart(part: LlmContentPart): GeminiPart {\n switch (part.type) {\n case \"text\":\n return {\n text: part.text,\n thought: part.thought === true ? true : undefined,\n };\n case \"inlineData\":\n return {\n inlineData: {\n data: part.data,\n mimeType: part.mimeType,\n },\n };\n default:\n throw new Error(\"Unsupported LLM content part\");\n }\n}\n\nfunction convertLlmContentToGeminiContent(content: LlmContent): GeminiContent {\n const role = content.role === \"assistant\" ? \"model\" : \"user\";\n return {\n role,\n parts: content.parts.map(toGeminiPart),\n };\n}\n\nfunction resolveProvider(model: string): { provider: LlmProvider; model: string } {\n if (model.startsWith(\"chatgpt-\")) {\n return { provider: \"chatgpt\", model: model.slice(\"chatgpt-\".length) };\n }\n if (model.startsWith(\"gemini-\")) {\n return { provider: \"gemini\", model };\n }\n\n const fireworksModel = resolveFireworksModelId(model);\n if (fireworksModel) {\n return { provider: \"fireworks\", model: fireworksModel };\n }\n\n return { provider: \"openai\", model };\n}\n\nfunction isOpenAiCodexModel(modelId: string): boolean {\n return modelId.includes(\"codex\");\n}\n\nfunction resolveOpenAiReasoningEffort(\n modelId: string,\n override?: OpenAiReasoningEffort,\n): OpenAiReasoningEffort {\n if (override) {\n return override;\n }\n if (isOpenAiCodexModel(modelId)) {\n return \"medium\";\n }\n return DEFAULT_OPENAI_REASONING_EFFORT;\n}\n\ntype OpenAiReasoningEffortParam = \"minimal\" | \"low\" | \"medium\" | \"high\";\n\nfunction toOpenAiReasoningEffort(effort: OpenAiReasoningEffort): OpenAiReasoningEffortParam {\n switch (effort) {\n case \"low\":\n return \"low\";\n case \"medium\":\n return \"medium\";\n case \"high\":\n return \"high\";\n case \"xhigh\":\n return \"high\";\n }\n}\n\nfunction resolveOpenAiVerbosity(modelId: string): \"low\" | \"medium\" | \"high\" {\n return isOpenAiCodexModel(modelId) ? \"medium\" : \"high\";\n}\n\nfunction isRetryableChatGptTransportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message === \"terminated\" ||\n message.includes(\"socket hang up\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"network\")\n );\n}\n\nasync function collectChatGptCodexResponseWithRetry(\n options: CollectChatGptCodexResponseOptions,\n maxAttempts = 2,\n): Promise<CollectChatGptCodexResponseResult> {\n let attempt = 1;\n while (true) {\n try {\n return await collectChatGptCodexResponse(options);\n } catch (error) {\n if (attempt >= maxAttempts || !isRetryableChatGptTransportError(error)) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250 * attempt));\n attempt += 1;\n }\n }\n}\n\nfunction isInlineImageMime(mimeType: string | undefined): boolean {\n if (!mimeType) {\n return false;\n }\n return mimeType.startsWith(\"image/\");\n}\n\nfunction guessInlineDataFilename(mimeType: string | undefined): string {\n switch (mimeType) {\n case \"application/pdf\":\n return \"document.pdf\";\n case \"application/json\":\n return \"data.json\";\n case \"text/markdown\":\n return \"document.md\";\n case \"text/plain\":\n return \"document.txt\";\n default:\n return \"attachment.bin\";\n }\n}\n\nfunction mergeConsecutiveTextParts(parts: readonly LlmContentPart[]): LlmContentPart[] {\n if (parts.length === 0) {\n return [];\n }\n const merged: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.type !== \"text\") {\n merged.push({ type: \"inlineData\", data: part.data, mimeType: part.mimeType });\n continue;\n }\n const isThought = part.thought === true;\n const last = merged[merged.length - 1];\n if (last && last.type === \"text\" && (last.thought === true) === isThought) {\n last.text += part.text;\n last.thought = isThought ? true : undefined;\n } else {\n merged.push({\n type: \"text\",\n text: part.text,\n thought: isThought ? true : undefined,\n });\n }\n }\n return merged;\n}\n\nfunction extractTextByChannel(content: LlmContent | undefined): { text: string; thoughts: string } {\n if (!content) {\n return { text: \"\", thoughts: \"\" };\n }\n let text = \"\";\n let thoughts = \"\";\n for (const part of content.parts) {\n if (part.type !== \"text\") {\n continue;\n }\n if (part.thought === true) {\n thoughts += part.text;\n } else {\n text += part.text;\n }\n }\n return { text: text.trim(), thoughts: thoughts.trim() };\n}\n\nfunction normalizeJsonText(rawText: string): string {\n let text = rawText.trim();\n\n if (text.startsWith(\"```\")) {\n text = text.replace(/^```[a-zA-Z0-9_-]*\\s*\\n?/, \"\");\n text = text.replace(/```(?:\\s*)?$/, \"\").trim();\n }\n\n const fenced = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i.exec(text);\n if (fenced?.[1]) {\n return fenced[1].trim();\n }\n\n if (!text.startsWith(\"{\") && !text.startsWith(\"[\")) {\n const firstBrace = text.indexOf(\"{\");\n if (firstBrace !== -1) {\n const lastBrace = text.lastIndexOf(\"}\");\n if (lastBrace !== -1 && lastBrace > firstBrace) {\n text = text.slice(firstBrace, lastBrace + 1).trim();\n }\n }\n }\n\n return text;\n}\n\nfunction escapeNewlinesInStrings(jsonText: string): string {\n let output = \"\";\n let inString = false;\n let escaped = false;\n for (let i = 0; i < jsonText.length; i += 1) {\n const char = jsonText[i] ?? \"\";\n if (inString) {\n if (escaped) {\n output += char;\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n output += char;\n escaped = true;\n continue;\n }\n if (char === '\"') {\n output += char;\n inString = false;\n continue;\n }\n if (char === \"\\n\") {\n output += \"\\\\n\";\n continue;\n }\n if (char === \"\\r\") {\n output += \"\\\\r\";\n continue;\n }\n output += char;\n continue;\n }\n if (char === '\"') {\n inString = true;\n output += char;\n continue;\n }\n output += char;\n }\n return output;\n}\n\nexport function parseJsonFromLlmText(rawText: string): unknown {\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n return JSON.parse(repairedText);\n}\n\nfunction parsePartialJsonFromLlmText(rawText: string): unknown | null {\n const jsonStart = extractJsonStartText(rawText);\n if (!jsonStart) {\n return null;\n }\n try {\n return parsePartialJson(jsonStart);\n } catch {\n return null;\n }\n}\n\nfunction extractJsonStartText(rawText: string): string | null {\n let text = rawText.trimStart();\n if (text.startsWith(\"```\")) {\n text = text.replace(/^```[a-zA-Z0-9_-]*\\s*\\n?/, \"\");\n }\n const objIndex = text.indexOf(\"{\");\n const arrIndex = text.indexOf(\"[\");\n let start = -1;\n if (objIndex !== -1 && arrIndex !== -1) {\n start = Math.min(objIndex, arrIndex);\n } else {\n start = objIndex !== -1 ? objIndex : arrIndex;\n }\n if (start === -1) {\n return null;\n }\n return text.slice(start);\n}\n\ntype PartialJsonObjectContext = {\n type: \"object\";\n value: Record<string, unknown>;\n state: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n};\n\ntype PartialJsonArrayContext = {\n type: \"array\";\n value: unknown[];\n state: \"valueOrEnd\" | \"commaOrEnd\";\n};\n\ntype PartialJsonContext = PartialJsonObjectContext | PartialJsonArrayContext;\n\nfunction parsePartialJson(text: string): unknown | null {\n let i = 0;\n const len = text.length;\n\n const isWhitespace = (char: string): boolean =>\n char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\n const skipWhitespace = (): void => {\n while (i < len && isWhitespace(text[i] ?? \"\")) {\n i += 1;\n }\n };\n\n const parseString = (): { value: string; complete: boolean } | null => {\n if (text[i] !== '\"') {\n return null;\n }\n i += 1;\n let value = \"\";\n while (i < len) {\n const ch = text[i] ?? \"\";\n if (ch === '\"') {\n i += 1;\n return { value, complete: true };\n }\n if (ch === \"\\\\\") {\n if (i + 1 >= len) {\n return { value, complete: false };\n }\n const esc = text[i + 1] ?? \"\";\n switch (esc) {\n case '\"':\n case \"\\\\\":\n case \"/\":\n value += esc;\n i += 2;\n continue;\n case \"b\":\n value += \"\\b\";\n i += 2;\n continue;\n case \"f\":\n value += \"\\f\";\n i += 2;\n continue;\n case \"n\":\n value += \"\\n\";\n i += 2;\n continue;\n case \"r\":\n value += \"\\r\";\n i += 2;\n continue;\n case \"t\":\n value += \"\\t\";\n i += 2;\n continue;\n case \"u\": {\n // \\uXXXX\n if (i + 5 >= len) {\n return { value, complete: false };\n }\n const hex = text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/u.test(hex)) {\n value += \"u\";\n i += 2;\n continue;\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 6;\n continue;\n }\n default:\n value += esc;\n i += 2;\n continue;\n }\n }\n value += ch;\n i += 1;\n }\n return { value, complete: false };\n };\n\n const parseNumber = (): { value: number; complete: boolean } | null => {\n const start = i;\n while (i < len) {\n const ch = text[i] ?? \"\";\n if (isWhitespace(ch) || ch === \",\" || ch === \"}\" || ch === \"]\") {\n break;\n }\n i += 1;\n }\n const raw = text.slice(start, i);\n if (!/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/u.test(raw)) {\n i = start;\n return null;\n }\n return { value: Number(raw), complete: true };\n };\n\n const parseLiteral = (): { value: unknown; complete: boolean } | null => {\n if (text.startsWith(\"true\", i)) {\n i += 4;\n return { value: true, complete: true };\n }\n if (text.startsWith(\"false\", i)) {\n i += 5;\n return { value: false, complete: true };\n }\n if (text.startsWith(\"null\", i)) {\n i += 4;\n return { value: null, complete: true };\n }\n return null;\n };\n\n skipWhitespace();\n const first = text[i];\n if (first !== \"{\" && first !== \"[\") {\n return null;\n }\n\n const root: unknown = first === \"{\" ? {} : [];\n const stack: PartialJsonContext[] =\n first === \"{\"\n ? [{ type: \"object\", value: root as Record<string, unknown>, state: \"keyOrEnd\" }]\n : [{ type: \"array\", value: root as unknown[], state: \"valueOrEnd\" }];\n i += 1;\n\n while (stack.length > 0) {\n skipWhitespace();\n if (i >= len) {\n break;\n }\n\n const ctx = stack[stack.length - 1];\n if (!ctx) {\n break;\n }\n\n const ch = text[i] ?? \"\";\n\n if (ctx.type === \"object\") {\n if (ctx.state === \"keyOrEnd\") {\n if (ch === \"}\") {\n i += 1;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n continue;\n }\n if (ch !== '\"') {\n break;\n }\n const key = parseString();\n if (!key) {\n break;\n }\n if (!key.complete) {\n break;\n }\n ctx.key = key.value;\n ctx.state = \"colon\";\n continue;\n }\n\n if (ctx.state === \"colon\") {\n if (ch === \":\") {\n i += 1;\n ctx.state = \"value\";\n continue;\n }\n break;\n }\n\n if (ctx.state === \"value\") {\n if (ch === \"}\") {\n i += 1;\n ctx.key = undefined;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n ctx.key = undefined;\n ctx.state = \"keyOrEnd\";\n continue;\n }\n\n const key = ctx.key;\n if (!key) {\n break;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n const container: unknown = ch === \"{\" ? {} : [];\n ctx.value[key] = container;\n ctx.key = undefined;\n ctx.state = \"commaOrEnd\";\n stack.push(\n ch === \"{\"\n ? { type: \"object\", value: container as Record<string, unknown>, state: \"keyOrEnd\" }\n : { type: \"array\", value: container as unknown[], state: \"valueOrEnd\" },\n );\n i += 1;\n continue;\n }\n\n let primitive: { value: unknown; complete: boolean } | null = null;\n if (ch === '\"') {\n primitive = parseString();\n } else if (ch === \"-\" || (ch >= \"0\" && ch <= \"9\")) {\n primitive = parseNumber();\n } else {\n primitive = parseLiteral();\n }\n if (!primitive) {\n break;\n }\n ctx.value[key] = primitive.value;\n ctx.key = undefined;\n ctx.state = \"commaOrEnd\";\n if (!primitive.complete) {\n break;\n }\n continue;\n }\n\n if (ctx.state === \"commaOrEnd\") {\n if (ch === \",\") {\n i += 1;\n ctx.state = \"keyOrEnd\";\n continue;\n }\n if (ch === \"}\") {\n i += 1;\n stack.pop();\n continue;\n }\n break;\n }\n } else {\n if (ctx.state === \"valueOrEnd\") {\n if (ch === \"]\") {\n i += 1;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n const container: unknown = ch === \"{\" ? {} : [];\n ctx.value.push(container);\n ctx.state = \"commaOrEnd\";\n stack.push(\n ch === \"{\"\n ? { type: \"object\", value: container as Record<string, unknown>, state: \"keyOrEnd\" }\n : { type: \"array\", value: container as unknown[], state: \"valueOrEnd\" },\n );\n i += 1;\n continue;\n }\n\n let primitive: { value: unknown; complete: boolean } | null = null;\n if (ch === '\"') {\n primitive = parseString();\n } else if (ch === \"-\" || (ch >= \"0\" && ch <= \"9\")) {\n primitive = parseNumber();\n } else {\n primitive = parseLiteral();\n }\n if (!primitive) {\n break;\n }\n ctx.value.push(primitive.value);\n ctx.state = \"commaOrEnd\";\n if (!primitive.complete) {\n break;\n }\n continue;\n }\n\n if (ctx.state === \"commaOrEnd\") {\n if (ch === \",\") {\n i += 1;\n ctx.state = \"valueOrEnd\";\n continue;\n }\n if (ch === \"]\") {\n i += 1;\n stack.pop();\n continue;\n }\n break;\n }\n }\n }\n\n return root;\n}\n\nfunction resolveTextContents(input: LlmInput): readonly LlmContent[] {\n const contents: LlmContent[] = [];\n\n if (input.instructions) {\n const instructions = input.instructions.trim();\n if (instructions.length > 0) {\n contents.push({\n role: \"system\",\n parts: [{ type: \"text\", text: instructions }],\n });\n }\n }\n\n if (typeof input.input === \"string\") {\n contents.push({\n role: \"user\",\n parts: [{ type: \"text\", text: input.input }],\n });\n return contents;\n }\n\n for (const message of input.input) {\n const parts =\n typeof message.content === \"string\"\n ? ([{ type: \"text\", text: message.content }] as const)\n : message.content;\n contents.push({\n role: message.role,\n parts: parts.map((part) =>\n part.type === \"text\"\n ? {\n type: \"text\",\n text: part.text,\n thought: \"thought\" in part && part.thought === true ? true : undefined,\n }\n : { type: \"inlineData\", data: part.data, mimeType: part.mimeType },\n ),\n });\n }\n\n return contents;\n}\n\nfunction toOpenAiInput(contents: readonly LlmContent[]): unknown[] {\n // Keep the shape compatible with OpenAI Responses API input.\n const OPENAI_ROLE_FROM_LLM: Record<LlmRole, string> = {\n user: \"user\",\n assistant: \"assistant\",\n system: \"system\",\n developer: \"developer\",\n tool: \"assistant\",\n };\n\n return contents.map((content) => {\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({ type: \"input_text\", text: part.text });\n continue;\n }\n const mimeType = part.mimeType;\n if (isInlineImageMime(mimeType)) {\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n parts.push({ type: \"input_image\", image_url: dataUrl, detail: \"auto\" });\n continue;\n }\n const fileData = decodeInlineDataBuffer(part.data).toString(\"base64\");\n parts.push({\n type: \"input_file\",\n filename: guessInlineDataFilename(mimeType),\n file_data: fileData,\n });\n }\n if (\n parts.length === 1 &&\n parts[0]?.type === \"input_text\" &&\n typeof parts[0].text === \"string\"\n ) {\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts[0].text,\n };\n }\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts,\n };\n });\n}\n\nfunction toChatGptInput(contents: readonly LlmContent[]): {\n instructions?: string;\n input: ChatGptInputItem[];\n} {\n const instructionsParts: string[] = [];\n const input: ChatGptInputItem[] = [];\n for (const content of contents) {\n if (content.role === \"system\" || content.role === \"developer\") {\n for (const part of content.parts) {\n if (part.type === \"text\") {\n instructionsParts.push(part.text);\n }\n }\n continue;\n }\n const isAssistant = content.role === \"assistant\" || content.role === \"tool\";\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: part.text,\n });\n continue;\n }\n if (isAssistant) {\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n parts.push({\n type: \"output_text\",\n text: isInlineImageMime(part.mimeType) ? `[image:${mimeType}]` : `[file:${mimeType}]`,\n });\n } else {\n if (isInlineImageMime(part.mimeType)) {\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n parts.push({\n type: \"input_image\",\n image_url: dataUrl,\n detail: \"auto\",\n });\n } else {\n const fileData = decodeInlineDataBuffer(part.data).toString(\"base64\");\n parts.push({\n type: \"input_file\",\n filename: guessInlineDataFilename(part.mimeType),\n file_data: fileData,\n });\n }\n }\n }\n if (parts.length === 0) {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: \"(empty content)\",\n });\n }\n if (isAssistant) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: parts,\n } as ChatGptInputItem);\n } else {\n input.push({\n role: \"user\",\n content: parts,\n } as ChatGptInputItem);\n }\n }\n const instructions = instructionsParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(\"\\\\n\\\\n\");\n return {\n instructions: instructions.length > 0 ? instructions : undefined,\n input,\n };\n}\n\nfunction toFireworksMessages(\n contents: readonly LlmContent[],\n options?: { readonly responseMimeType?: string; readonly responseJsonSchema?: JsonSchema },\n): Array<Record<string, unknown>> {\n const systemMessages: string[] = [];\n const messages: Array<Record<string, unknown>> = [];\n\n if (options?.responseMimeType === \"application/json\") {\n systemMessages.push(\"Return valid JSON only. Do not include markdown or prose outside JSON.\");\n }\n if (options?.responseJsonSchema) {\n systemMessages.push(`Target JSON schema:\n${JSON.stringify(options.responseJsonSchema)}`);\n }\n\n for (const content of contents) {\n const text = content.parts\n .map((part) => {\n if (part.type === \"text\") {\n return part.text;\n }\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n if (isInlineImageMime(mimeType)) {\n return `[image:${mimeType}]`;\n }\n return `[file:${mimeType}]`;\n })\n .join(\"\\n\")\n .trim();\n\n if (content.role === \"system\" || content.role === \"developer\") {\n if (text.length > 0) {\n systemMessages.push(text);\n }\n continue;\n }\n\n if (content.role === \"tool\" || content.role === \"assistant\") {\n messages.push({\n role: \"assistant\",\n content: text.length > 0 ? text : \"(empty content)\",\n });\n continue;\n }\n\n messages.push({\n role: \"user\",\n content: text.length > 0 ? text : \"(empty content)\",\n });\n }\n\n if (systemMessages.length > 0) {\n messages.unshift({\n role: \"system\",\n content: systemMessages.join(\"\\n\\n\"),\n });\n }\n\n return messages;\n}\n\nfunction toGeminiTools(tools: readonly LlmToolConfig[] | undefined): GeminiTool[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\":\n return { googleSearch: {} };\n case \"code-execution\":\n return { codeExecution: {} };\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction toOpenAiTools(tools: readonly LlmToolConfig[] | undefined): unknown[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\": {\n const external_web_access = tool.mode !== \"cached\";\n return { type: \"web_search\", external_web_access };\n }\n case \"code-execution\": {\n return { type: \"code_interpreter\", container: { type: \"auto\" } };\n }\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction mergeTokenUpdates(\n current: LlmUsageTokens | undefined,\n next: LlmUsageTokens | undefined,\n): LlmUsageTokens | undefined {\n if (!next) {\n return current;\n }\n if (!current) {\n return next;\n }\n return {\n promptTokens: next.promptTokens ?? current.promptTokens,\n cachedTokens: next.cachedTokens ?? current.cachedTokens,\n responseTokens: next.responseTokens ?? current.responseTokens,\n responseImageTokens: next.responseImageTokens ?? current.responseImageTokens,\n thinkingTokens: next.thinkingTokens ?? current.thinkingTokens,\n totalTokens: next.totalTokens ?? current.totalTokens,\n toolUsePromptTokens: next.toolUsePromptTokens ?? current.toolUsePromptTokens,\n };\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction sumModalityTokenCounts(details: unknown, modality: string): number {\n if (!Array.isArray(details)) {\n return 0;\n }\n let total = 0;\n for (const entry of details) {\n const entryModality = (entry as { modality?: unknown }).modality;\n if (typeof entryModality !== \"string\") {\n continue;\n }\n if (entryModality.toUpperCase() !== modality.toUpperCase()) {\n continue;\n }\n const tokenCount = toMaybeNumber((entry as { tokenCount?: unknown }).tokenCount);\n if (tokenCount !== undefined && tokenCount > 0) {\n total += tokenCount;\n }\n }\n return total;\n}\n\nfunction extractGeminiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { promptTokenCount?: unknown }).promptTokenCount);\n const cachedTokens = toMaybeNumber(\n (usage as { cachedContentTokenCount?: unknown }).cachedContentTokenCount,\n );\n const responseTokens = toMaybeNumber(\n (usage as { candidatesTokenCount?: unknown }).candidatesTokenCount ??\n (usage as { responseTokenCount?: unknown }).responseTokenCount,\n );\n const thinkingTokens = toMaybeNumber(\n (usage as { thoughtsTokenCount?: unknown }).thoughtsTokenCount,\n );\n const totalTokens = toMaybeNumber((usage as { totalTokenCount?: unknown }).totalTokenCount);\n const toolUsePromptTokens = toMaybeNumber(\n (usage as { toolUsePromptTokenCount?: unknown }).toolUsePromptTokenCount,\n );\n const responseDetails =\n (usage as { candidatesTokensDetails?: unknown }).candidatesTokensDetails ??\n (usage as { responseTokensDetails?: unknown }).responseTokensDetails;\n const responseImageTokens = sumModalityTokenCounts(responseDetails, \"IMAGE\");\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n responseImageTokens === 0 &&\n thinkingTokens === undefined &&\n totalTokens === undefined &&\n toolUsePromptTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n responseImageTokens: responseImageTokens > 0 ? responseImageTokens : undefined,\n thinkingTokens,\n totalTokens,\n toolUsePromptTokens,\n };\n}\n\nfunction extractOpenAiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nfunction extractChatGptUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nfunction extractFireworksUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber(\n (usage as { prompt_tokens?: unknown }).prompt_tokens ??\n (usage as { input_tokens?: unknown }).input_tokens,\n );\n const cachedTokens = toMaybeNumber(\n (usage as { prompt_tokens_details?: { cached_tokens?: unknown } }).prompt_tokens_details\n ?.cached_tokens ??\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber(\n (usage as { completion_tokens?: unknown }).completion_tokens ??\n (usage as { output_tokens?: unknown }).output_tokens,\n );\n const reasoningTokens = toMaybeNumber(\n (usage as { completion_tokens_details?: { reasoning_tokens?: unknown } })\n .completion_tokens_details?.reasoning_tokens ??\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber(\n (usage as { total_tokens?: unknown }).total_tokens ??\n (usage as { totalTokenCount?: unknown }).totalTokenCount,\n );\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nconst MODERATION_FINISH_REASONS = new Set<FinishReason>([\n FinishReason.SAFETY,\n FinishReason.BLOCKLIST,\n FinishReason.PROHIBITED_CONTENT,\n FinishReason.SPII,\n]);\n\nfunction isModerationFinish(reason: FinishReason | undefined): boolean {\n if (!reason) {\n return false;\n }\n return MODERATION_FINISH_REASONS.has(reason);\n}\n\nfunction mergeToolOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: \"Failed to serialize tool output\", detail: message });\n }\n}\n\nfunction parseOpenAiToolArguments(raw: string): { value: unknown; error?: string } {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return { value: {} };\n }\n try {\n return { value: JSON.parse(trimmed) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { value: raw, error: message };\n }\n}\n\nfunction formatZodIssues(issues: readonly z.core.$ZodIssue[]): string {\n const messages: string[] = [];\n for (const issue of issues) {\n const path = issue.path.length > 0 ? issue.path.map(String).join(\".\") : \"input\";\n messages.push(`${path}: ${issue.message}`);\n }\n return messages.join(\"; \");\n}\n\nfunction buildToolErrorOutput(\n message: string,\n issues?: readonly z.core.$ZodIssue[],\n): Record<string, unknown> {\n const output: Record<string, unknown> = { error: message };\n if (issues && issues.length > 0) {\n output.issues = issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n code: issue.code,\n }));\n }\n return output;\n}\n\nasync function executeToolCall(params: {\n callKind: \"function\" | \"custom\";\n toolName: string;\n tool: LlmExecutableTool<z.ZodType, unknown> | undefined;\n rawInput: unknown;\n parseError?: string;\n}): Promise<{ result: LlmToolCallResult; outputPayload: unknown }> {\n const { callKind, toolName, tool, rawInput, parseError } = params;\n if (!tool) {\n const message = `Unknown tool: ${toolName}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n if (callKind === \"custom\") {\n if (!isCustomTool(tool)) {\n const message = `Tool ${toolName} was called as custom_tool_call but is declared as function.`;\n const outputPayload = buildToolErrorOutput(message);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n const input = typeof rawInput === \"string\" ? rawInput : String(rawInput ?? \"\");\n try {\n const output = await tool.execute(input);\n return {\n result: { toolName, input, output },\n outputPayload: output,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const outputPayload = buildToolErrorOutput(`Tool ${toolName} failed: ${message}`);\n return {\n result: { toolName, input, output: outputPayload, error: message },\n outputPayload,\n };\n }\n }\n if (isCustomTool(tool)) {\n const message = `Tool ${toolName} was called as function_call but is declared as custom.`;\n const outputPayload = buildToolErrorOutput(message);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n if (parseError) {\n const message = `Invalid JSON for tool ${toolName}: ${parseError}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n const parsed = tool.inputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const message = `Invalid tool arguments for ${toolName}: ${formatZodIssues(parsed.error.issues)}`;\n const outputPayload = buildToolErrorOutput(message, parsed.error.issues);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n try {\n const output = await tool.execute(parsed.data);\n return {\n result: { toolName, input: parsed.data, output },\n outputPayload: output,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const outputPayload = buildToolErrorOutput(`Tool ${toolName} failed: ${message}`);\n return {\n result: { toolName, input: parsed.data, output: outputPayload, error: message },\n outputPayload,\n };\n }\n}\n\nfunction buildToolLogId(turn: number, toolIndex: number): string {\n return `turn${turn.toString()}/tool${toolIndex.toString()}`;\n}\n\nfunction sanitizeChatGptToolId(value: string): string {\n const cleaned = value.replace(/[^A-Za-z0-9_-]/gu, \"\");\n if (cleaned.length === 0) {\n return randomBytes(8).toString(\"hex\");\n }\n return cleaned.slice(0, 64);\n}\n\nfunction normalizeChatGptToolIds(params: {\n callKind: \"function\" | \"custom\";\n callId?: string;\n itemId?: string;\n}): {\n callId: string;\n itemId: string;\n} {\n let rawCallId = params.callId ?? \"\";\n let rawItemId = params.itemId ?? \"\";\n if (rawCallId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawCallId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n if (nextItemId) {\n rawItemId = nextItemId;\n }\n } else if (rawItemId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawItemId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n rawItemId = nextItemId ?? rawItemId;\n }\n const callValue = sanitizeChatGptToolId(rawCallId || rawItemId || randomBytes(8).toString(\"hex\"));\n let itemValue = sanitizeChatGptToolId(rawItemId || callValue);\n if (params.callKind === \"custom\") {\n if (!itemValue.startsWith(\"ctc\")) {\n itemValue = `ctc_${itemValue}`;\n }\n } else if (!itemValue.startsWith(\"fc\")) {\n itemValue = `fc-${itemValue}`;\n }\n return { callId: callValue, itemId: itemValue };\n}\n\nfunction extractOpenAiResponseParts(response: { output?: unknown; output_text?: unknown }): {\n parts: LlmContentPart[];\n blocked: boolean;\n} {\n const parts: LlmContentPart[] = [];\n let blocked = false;\n const output = response.output;\n if (Array.isArray(output)) {\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemType = (item as { type?: unknown }).type;\n if (itemType === \"message\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"output_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"text\", text });\n }\n } else if (entryType === \"refusal\") {\n blocked = true;\n }\n }\n }\n } else if (itemType === \"reasoning\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\" || entryType === \"reasoning_summary\") {\n const entryText =\n typeof (entry as { text?: unknown }).text === \"string\"\n ? (entry as { text?: unknown }).text\n : typeof (entry as { summary?: unknown }).summary === \"string\"\n ? (entry as { summary?: unknown }).summary\n : undefined;\n if (typeof entryText === \"string\" && entryText.length > 0) {\n parts.push({ type: \"text\", text: entryText, thought: true });\n }\n }\n }\n }\n } else if (\n itemType === \"function_call\" ||\n itemType === \"tool_call\" ||\n itemType === \"custom_tool_call\"\n ) {\n const serialized = JSON.stringify(item, null, 2);\n if (serialized.length > 0) {\n parts.push({ type: \"text\", text: `[tool-call]\\\\n${serialized}\\\\n` });\n }\n }\n }\n }\n if (parts.length === 0) {\n const outputText = response.output_text;\n if (typeof outputText === \"string\" && outputText.length > 0) {\n parts.push({ type: \"text\", text: outputText });\n }\n }\n return { parts, blocked };\n}\n\ntype OpenAiToolCall =\n | { kind: \"function\"; name: string; arguments: string; call_id: string; id?: string }\n | { kind: \"custom\"; name: string; input: string; call_id: string; id?: string };\n\nfunction extractOpenAiToolCalls(output: unknown): OpenAiToolCall[] {\n const calls: OpenAiToolCall[] = [];\n if (!Array.isArray(output)) {\n return calls;\n }\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemType = (item as { type?: unknown }).type;\n if (itemType === \"function_call\") {\n const name =\n typeof (item as { name?: unknown }).name === \"string\"\n ? ((item as { name?: unknown }).name as string)\n : \"\";\n const args =\n typeof (item as { arguments?: unknown }).arguments === \"string\"\n ? ((item as { arguments?: unknown }).arguments as string)\n : \"\";\n const call_id =\n typeof (item as { call_id?: unknown }).call_id === \"string\"\n ? ((item as { call_id?: unknown }).call_id as string)\n : \"\";\n const id =\n typeof (item as { id?: unknown }).id === \"string\"\n ? ((item as { id?: unknown }).id as string)\n : undefined;\n if (name && call_id) {\n calls.push({ kind: \"function\", name, arguments: args, call_id, id });\n }\n continue;\n }\n if (itemType === \"custom_tool_call\") {\n const name =\n typeof (item as { name?: unknown }).name === \"string\"\n ? ((item as { name?: unknown }).name as string)\n : \"\";\n const input =\n typeof (item as { input?: unknown }).input === \"string\"\n ? ((item as { input?: unknown }).input as string)\n : \"\";\n const call_id =\n typeof (item as { call_id?: unknown }).call_id === \"string\"\n ? ((item as { call_id?: unknown }).call_id as string)\n : \"\";\n const id =\n typeof (item as { id?: unknown }).id === \"string\"\n ? ((item as { id?: unknown }).id as string)\n : undefined;\n if (name && call_id) {\n calls.push({ kind: \"custom\", name, input, call_id, id });\n }\n }\n }\n return calls;\n}\n\ntype FireworksFunctionToolCall = {\n readonly id: string;\n readonly name: string;\n readonly arguments: string;\n};\n\nfunction extractFireworksMessageText(message: unknown): string {\n if (!message || typeof message !== \"object\") {\n return \"\";\n }\n const content = (message as { content?: unknown }).content;\n if (typeof content === \"string\") {\n return content;\n }\n if (!Array.isArray(content)) {\n return \"\";\n }\n let text = \"\";\n for (const part of content) {\n const textPart = (part as { text?: unknown }).text;\n if (typeof textPart === \"string\") {\n text += textPart;\n }\n }\n return text;\n}\n\nfunction extractFireworksToolCalls(message: unknown): FireworksFunctionToolCall[] {\n if (!message || typeof message !== \"object\") {\n return [];\n }\n const toolCalls = (message as { tool_calls?: unknown }).tool_calls;\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n const calls: FireworksFunctionToolCall[] = [];\n for (const call of toolCalls) {\n if (!call || typeof call !== \"object\") {\n continue;\n }\n const id =\n typeof (call as { id?: unknown }).id === \"string\" ? (call as { id?: string }).id : \"\";\n const fn = (call as { function?: unknown }).function;\n const name =\n fn && typeof fn === \"object\" && typeof (fn as { name?: unknown }).name === \"string\"\n ? ((fn as { name?: string }).name ?? \"\")\n : \"\";\n const args =\n fn && typeof fn === \"object\" && typeof (fn as { arguments?: unknown }).arguments === \"string\"\n ? ((fn as { arguments?: string }).arguments ?? \"\")\n : \"\";\n if (id && name) {\n calls.push({ id, name, arguments: args });\n }\n }\n return calls;\n}\nfunction resolveGeminiThinkingConfig(modelId: string): GenerateContentConfig[\"thinkingConfig\"] {\n switch (modelId) {\n case \"gemini-3-pro-preview\":\n case \"gemini-3.1-pro-preview\":\n return { includeThoughts: true } as const;\n case \"gemini-3-flash-preview\":\n return { includeThoughts: true, thinkingBudget: 16_384 } as const;\n case \"gemini-2.5-pro\":\n return { includeThoughts: true, thinkingBudget: 32_768 } as const;\n case \"gemini-flash-latest\":\n case \"gemini-flash-lite-latest\":\n return { includeThoughts: true, thinkingBudget: 24_576 } as const;\n default:\n return { includeThoughts: true } as const;\n }\n}\n\nfunction decodeInlineDataBuffer(base64: string): Buffer {\n try {\n return Buffer.from(base64, \"base64\");\n } catch {\n return Buffer.from(base64, \"base64url\");\n }\n}\n\nfunction extractImages(content: LlmContent | undefined): LlmImageData[] {\n if (!content) {\n return [];\n }\n const images: LlmImageData[] = [];\n for (const part of content.parts) {\n if (part.type !== \"inlineData\") {\n continue;\n }\n const buffer = decodeInlineDataBuffer(part.data);\n images.push({ mimeType: part.mimeType, data: buffer });\n }\n return images;\n}\n\nasync function runTextCall(params: {\n request: LlmTextRequest;\n queue: AsyncQueue<LlmStreamEvent>;\n abortController: AbortController;\n}): Promise<LlmTextResult> {\n const { request, queue, abortController } = params;\n const providerInfo = resolveProvider(request.model);\n const provider = providerInfo.provider;\n const modelForProvider = providerInfo.model;\n const contents = resolveTextContents(request);\n if (contents.length === 0) {\n throw new Error(\"LLM call received an empty prompt.\");\n }\n\n let modelVersion = request.model;\n let blocked = false;\n let grounding: GroundingMetadata | undefined;\n const responseParts: LlmContentPart[] = [];\n let responseRole: LlmRole | undefined;\n let latestUsage: LlmUsageTokens | undefined;\n let responseImages = 0;\n\n const pushDelta = (channel: \"response\" | \"thought\", text: string): void => {\n if (!text) {\n return;\n }\n responseParts.push({ type: \"text\", text, ...(channel === \"thought\" ? { thought: true } : {}) });\n queue.push({ type: \"delta\", channel, text });\n };\n\n const pushInline = (data: string, mimeType: string | undefined): void => {\n if (!data) {\n return;\n }\n responseParts.push({ type: \"inlineData\", data, mimeType });\n if (isInlineImageMime(mimeType)) {\n responseImages += 1;\n }\n };\n\n const resolveAbortSignal = (): AbortSignal => {\n if (!request.signal) {\n return abortController.signal;\n }\n // Fan-in cancellation: abort if either signal aborts.\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n return abortController.signal;\n };\n\n const signal = resolveAbortSignal();\n\n if (provider === \"openai\") {\n const openAiInput = toOpenAiInput(contents);\n const openAiTools = toOpenAiTools(request.tools);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n modelForProvider,\n request.openAiReasoningEffort,\n );\n const openAiTextConfig = {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(modelForProvider),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: modelForProvider,\n input: openAiInput as any,\n reasoning,\n text: openAiTextConfig as any,\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n include: [\"code_interpreter_call.outputs\", \"reasoning.encrypted_content\"] as any,\n },\n { signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"response\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.reasoning_summary_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"thought\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.refusal.delta\": {\n blocked = true;\n queue.push({ type: \"blocked\" });\n break;\n }\n default:\n break;\n }\n }\n\n const finalResponse = await (stream as any).finalResponse();\n modelVersion = typeof finalResponse.model === \"string\" ? finalResponse.model : request.model;\n queue.push({ type: \"model\", modelVersion });\n if (finalResponse.error) {\n const message =\n typeof finalResponse.error.message === \"string\"\n ? finalResponse.error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n if (\n finalResponse.status &&\n finalResponse.status !== \"completed\" &&\n finalResponse.status !== \"in_progress\"\n ) {\n const detail = finalResponse.incomplete_details?.reason;\n throw new Error(\n `OpenAI response status ${finalResponse.status}${detail ? ` (${detail})` : \"\"}`,\n );\n }\n latestUsage = extractOpenAiUsageTokens(finalResponse.usage);\n\n // Fallback: if the stream did not deliver deltas (rare), extract from final output.\n if (responseParts.length === 0) {\n const fallback = extractOpenAiResponseParts(finalResponse);\n blocked = blocked || fallback.blocked;\n for (const part of fallback.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n });\n } else if (provider === \"chatgpt\") {\n const chatGptInput = toChatGptInput(contents);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const openAiTools = toOpenAiTools(request.tools);\n const requestPayload = {\n model: modelForProvider,\n store: false,\n stream: true,\n instructions: chatGptInput.instructions ?? \"You are a helpful assistant.\",\n input: chatGptInput.input,\n include: [\"reasoning.encrypted_content\"],\n reasoning: { effort: toOpenAiReasoningEffort(reasoningEffort), summary: \"detailed\" as const },\n text: {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(request.model),\n },\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n };\n\n let sawResponseDelta = false;\n let sawThoughtDelta = false;\n const result = await collectChatGptCodexResponseWithRetry({\n request: requestPayload as any,\n signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n sawThoughtDelta = true;\n pushDelta(\"thought\", delta.thoughtDelta);\n }\n if (delta.textDelta) {\n sawResponseDelta = true;\n pushDelta(\"response\", delta.textDelta);\n }\n },\n });\n\n blocked = blocked || result.blocked;\n if (blocked) {\n queue.push({ type: \"blocked\" });\n }\n if (result.model) {\n modelVersion = `chatgpt-${result.model}`;\n queue.push({ type: \"model\", modelVersion });\n }\n latestUsage = extractChatGptUsageTokens(result.usage);\n\n // Fallback for rare cases where the SSE stream does not emit deltas.\n const fallbackText = typeof result.text === \"string\" ? result.text : \"\";\n const fallbackThoughts =\n typeof result.reasoningSummaryText === \"string\" && result.reasoningSummaryText.length > 0\n ? result.reasoningSummaryText\n : typeof result.reasoningText === \"string\"\n ? result.reasoningText\n : \"\";\n if (!sawThoughtDelta && fallbackThoughts.length > 0) {\n pushDelta(\"thought\", fallbackThoughts);\n }\n if (!sawResponseDelta && fallbackText.length > 0) {\n pushDelta(\"response\", fallbackText);\n }\n } else if (provider === \"fireworks\") {\n if (request.tools && request.tools.length > 0) {\n throw new Error(\n \"Fireworks provider does not support provider-native tools in generateText; use runToolLoop for function tools.\",\n );\n }\n\n const fireworksMessages = toFireworksMessages(contents, {\n responseMimeType: request.responseMimeType,\n responseJsonSchema: request.responseJsonSchema,\n });\n\n await runFireworksCall(async (client) => {\n const responseFormat = request.responseJsonSchema\n ? {\n type: \"json_schema\" as const,\n json_schema: {\n name: \"llm-response\",\n schema: request.responseJsonSchema,\n },\n }\n : request.responseMimeType === \"application/json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const response = await client.chat.completions.create(\n {\n model: modelForProvider,\n messages: fireworksMessages as any,\n ...(responseFormat ? { response_format: responseFormat } : {}),\n } as any,\n { signal } as any,\n );\n\n modelVersion = typeof response.model === \"string\" ? response.model : request.model;\n queue.push({ type: \"model\", modelVersion });\n\n const choice = Array.isArray(response.choices) ? response.choices[0] : undefined;\n if (choice?.finish_reason === \"content_filter\") {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n\n const textOutput = extractFireworksMessageText(\n (choice as { message?: unknown } | undefined)?.message,\n );\n if (textOutput.length > 0) {\n pushDelta(\"response\", textOutput);\n }\n\n latestUsage = extractFireworksUsageTokens(response.usage);\n });\n } else {\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n thinkingConfig: resolveGeminiThinkingConfig(modelForProvider),\n ...(request.responseMimeType ? { responseMimeType: request.responseMimeType } : {}),\n ...(request.responseJsonSchema ? { responseJsonSchema: request.responseJsonSchema } : {}),\n ...(request.responseModalities\n ? { responseModalities: Array.from(request.responseModalities) }\n : {}),\n ...(request.imageAspectRatio || request.imageSize\n ? {\n imageConfig: {\n ...(request.imageAspectRatio ? { aspectRatio: request.imageAspectRatio } : {}),\n ...(request.imageSize ? { imageSize: request.imageSize } : {}),\n },\n }\n : {}),\n };\n const geminiTools = toGeminiTools(request.tools);\n if (geminiTools) {\n config.tools = geminiTools;\n }\n\n await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: modelForProvider,\n contents: geminiContents,\n config,\n });\n let latestGrounding: GroundingMetadata | undefined;\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n modelVersion = chunk.modelVersion;\n queue.push({ type: \"model\", modelVersion });\n }\n if (chunk.promptFeedback?.blockReason) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n latestUsage = mergeTokenUpdates(latestUsage, extractGeminiUsageTokens(chunk.usageMetadata));\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n if (primary && isModerationFinish(primary.finishReason)) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n for (const candidate of candidates) {\n const candidateContent = candidate.content;\n if (!candidateContent) {\n continue;\n }\n if (candidate.groundingMetadata) {\n latestGrounding = candidate.groundingMetadata;\n }\n const content = convertGeminiContentToLlmContent(candidateContent);\n if (!responseRole) {\n responseRole = content.role;\n }\n for (const part of content.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n }\n grounding = latestGrounding;\n });\n }\n\n const mergedParts = mergeConsecutiveTextParts(responseParts);\n const content =\n mergedParts.length > 0 ? { role: responseRole ?? \"assistant\", parts: mergedParts } : undefined;\n const { text, thoughts } = extractTextByChannel(content);\n\n const costUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: latestUsage,\n responseImages,\n imageSize: request.imageSize,\n });\n\n if (latestUsage) {\n queue.push({ type: \"usage\", usage: latestUsage, costUsd, modelVersion });\n }\n\n return {\n provider,\n model: request.model,\n modelVersion,\n content,\n text,\n thoughts,\n blocked,\n usage: latestUsage,\n costUsd,\n grounding,\n };\n}\n\nexport function streamText(request: LlmTextRequest): LlmTextStream {\n const queue = createAsyncQueue<LlmStreamEvent>();\n const abortController = new AbortController();\n\n const result = (async () => {\n try {\n const output = await runTextCall({ request, queue, abortController });\n queue.close();\n return output;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n queue.fail(err);\n throw err;\n }\n })();\n\n return {\n events: queue.iterable,\n result,\n abort: () => abortController.abort(),\n };\n}\n\nexport async function generateText(request: LlmTextRequest): Promise<LlmTextResult> {\n const call = streamText(request);\n // Drain events so the call runs even if the caller doesn't.\n for await (const _event of call.events) {\n // no-op\n }\n return await call.result;\n}\n\nfunction buildJsonSchemaConfig<T>(request: LlmJsonRequest<T>): {\n providerInfo: { provider: LlmProvider; model: string };\n responseJsonSchema: JsonSchema;\n openAiTextFormat?: ResponseTextConfig[\"format\"];\n} {\n const schemaName = (request.openAiSchemaName ?? \"llm-response\").trim() || \"llm-response\";\n const providerInfo = resolveProvider(request.model);\n const isOpenAiVariant = providerInfo.provider === \"openai\" || providerInfo.provider === \"chatgpt\";\n const isGeminiVariant = providerInfo.provider === \"gemini\";\n const baseJsonSchema = zodToJsonSchema(request.schema, {\n name: schemaName,\n target: isOpenAiVariant ? \"openAi\" : \"jsonSchema7\",\n }) as JsonSchema;\n\n const responseJsonSchema = isOpenAiVariant\n ? resolveOpenAiSchemaRoot(baseJsonSchema)\n : isGeminiVariant\n ? addGeminiPropertyOrdering(baseJsonSchema)\n : resolveOpenAiSchemaRoot(baseJsonSchema);\n\n if (isOpenAiVariant && !isJsonSchemaObject(responseJsonSchema)) {\n throw new Error(\"OpenAI structured outputs require a JSON object schema at the root.\");\n }\n\n const openAiTextFormat = isOpenAiVariant\n ? {\n type: \"json_schema\" as const,\n name: schemaName,\n strict: true,\n schema: normalizeOpenAiSchema(responseJsonSchema),\n }\n : undefined;\n\n return { providerInfo, responseJsonSchema, openAiTextFormat };\n}\n\nexport function streamJson<T>(request: LlmJsonStreamRequest<T>): LlmJsonStream<T> {\n const queue = createAsyncQueue<LlmJsonStreamEvent<T>>();\n const abortController = new AbortController();\n\n const resolveAbortSignal = (): AbortSignal => {\n if (!request.signal) {\n return abortController.signal;\n }\n // Fan-in cancellation: abort if either signal aborts.\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n {\n once: true,\n },\n );\n }\n return abortController.signal;\n };\n\n const result = (async () => {\n const signal = resolveAbortSignal();\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 2));\n const { providerInfo, responseJsonSchema, openAiTextFormat } = buildJsonSchemaConfig(request);\n const streamMode = request.streamMode ?? \"partial\";\n\n const failures: Array<{ attempt: number; rawText: string; error: unknown }> = [];\n let openAiTextFormatForAttempt: ResponseTextConfig[\"format\"] | undefined = openAiTextFormat;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let rawText = \"\";\n let lastPartial = \"\";\n try {\n const call = streamText({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n responseMimeType: request.responseMimeType ?? \"application/json\",\n responseJsonSchema,\n openAiReasoningEffort: request.openAiReasoningEffort,\n ...(openAiTextFormatForAttempt ? { openAiTextFormat: openAiTextFormatForAttempt } : {}),\n signal,\n });\n\n try {\n for await (const event of call.events) {\n queue.push(event);\n if (event.type === \"delta\" && event.channel === \"response\") {\n rawText += event.text;\n if (streamMode === \"partial\") {\n const partial = parsePartialJsonFromLlmText(rawText);\n if (partial !== null) {\n const serialized = JSON.stringify(partial);\n if (serialized !== lastPartial) {\n lastPartial = serialized;\n queue.push({\n type: \"json\",\n stage: \"partial\",\n value: partial as DeepPartial<T>,\n });\n }\n }\n }\n }\n }\n } catch (streamError) {\n // Ensure the rejected result promise is observed before we retry.\n await call.result.catch(() => undefined);\n throw streamError;\n }\n const result = await call.result;\n rawText = rawText || result.text;\n\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n const payload: unknown = JSON.parse(repairedText);\n const normalized =\n typeof request.normalizeJson === \"function\" ? request.normalizeJson(payload) : payload;\n const parsed = request.schema.parse(normalized);\n queue.push({ type: \"json\", stage: \"final\", value: parsed });\n queue.close();\n return { value: parsed, rawText, result };\n } catch (error) {\n const handled = error instanceof Error ? error : new Error(String(error));\n failures.push({ attempt, rawText, error: handled });\n if (providerInfo.provider === \"chatgpt\" && openAiTextFormatForAttempt) {\n // Best-effort fallback: some ChatGPT accounts/models may not support json_schema.\n openAiTextFormatForAttempt = undefined;\n }\n if (attempt >= maxAttempts) {\n throw new LlmJsonCallError(`LLM JSON call failed after ${attempt} attempt(s)`, failures);\n }\n }\n }\n\n throw new LlmJsonCallError(\"LLM JSON call failed\", failures);\n })().catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n queue.fail(err);\n throw err;\n });\n\n return {\n events: queue.iterable,\n result,\n abort: () => abortController.abort(),\n };\n}\n\nexport async function generateJson<T>(request: LlmJsonRequest<T>): Promise<{\n readonly value: T;\n readonly rawText: string;\n readonly result: LlmTextResult;\n}> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 2));\n const { providerInfo, responseJsonSchema, openAiTextFormat } = buildJsonSchemaConfig(request);\n let openAiTextFormatForAttempt: ResponseTextConfig[\"format\"] | undefined = openAiTextFormat;\n\n const failures: Array<{ attempt: number; rawText: string; error: unknown }> = [];\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let rawText = \"\";\n try {\n const call = streamText({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n responseMimeType: request.responseMimeType ?? \"application/json\",\n responseJsonSchema,\n openAiReasoningEffort: request.openAiReasoningEffort,\n ...(openAiTextFormatForAttempt ? { openAiTextFormat: openAiTextFormatForAttempt } : {}),\n signal: request.signal,\n });\n\n // Collect the raw text output (response channel only).\n try {\n for await (const event of call.events) {\n request.onEvent?.(event);\n if (event.type === \"delta\" && event.channel === \"response\") {\n rawText += event.text;\n }\n }\n } catch (streamError) {\n // Ensure the rejected result promise is observed before we retry.\n await call.result.catch(() => undefined);\n throw streamError;\n }\n const result = await call.result;\n rawText = rawText || result.text;\n\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n const payload: unknown = JSON.parse(repairedText);\n const normalized =\n typeof request.normalizeJson === \"function\" ? request.normalizeJson(payload) : payload;\n const parsed = request.schema.parse(normalized);\n return { value: parsed, rawText, result };\n } catch (error) {\n const handled = error instanceof Error ? error : new Error(String(error));\n failures.push({ attempt, rawText, error: handled });\n if (providerInfo.provider === \"chatgpt\" && openAiTextFormatForAttempt) {\n // Best-effort fallback: some ChatGPT accounts/models may not support json_schema.\n openAiTextFormatForAttempt = undefined;\n }\n if (attempt >= maxAttempts) {\n throw new LlmJsonCallError(`LLM JSON call failed after ${attempt} attempt(s)`, failures);\n }\n }\n }\n\n throw new LlmJsonCallError(\"LLM JSON call failed\", failures);\n}\n\n// --- Tool Loop ---\n\nconst DEFAULT_TOOL_LOOP_MAX_STEPS = 8;\n\nfunction resolveToolLoopContents(input: LlmInput): readonly LlmContent[] {\n return resolveTextContents(input);\n}\n\nfunction isCustomTool(\n toolDef: LlmExecutableTool<z.ZodType, unknown>,\n): toolDef is LlmCustomTool<unknown> {\n return (toolDef as { type?: unknown }).type === \"custom\";\n}\n\nfunction buildOpenAiToolsFromToolSet(tools: LlmToolSet): unknown[] {\n const toolEntries = Object.entries(tools);\n return toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n return {\n type: \"custom\",\n name,\n description: toolDef.description ?? undefined,\n ...(toolDef.format ? { format: toolDef.format } : {}),\n };\n }\n return {\n type: \"function\",\n name,\n description: toolDef.description ?? undefined,\n parameters: buildOpenAiToolSchema(toolDef.inputSchema, name),\n strict: true,\n };\n });\n}\n\nfunction buildFireworksToolsFromToolSet(tools: LlmToolSet): unknown[] {\n const toolEntries = Object.entries(tools);\n return toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n throw new Error(\n `Fireworks provider does not support custom/freeform tools (${name}). Use JSON function tools instead.`,\n );\n }\n return {\n type: \"function\",\n function: {\n name,\n description: toolDef.description ?? undefined,\n parameters: buildOpenAiToolSchema(toolDef.inputSchema, name),\n },\n };\n });\n}\nfunction buildOpenAiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const rawSchema = zodToJsonSchema(schema, { name, target: \"openAi\" }) as JsonSchema;\n const normalized = normalizeOpenAiSchema(resolveOpenAiSchemaRoot(rawSchema));\n if (!isJsonSchemaObject(normalized)) {\n throw new Error(`OpenAI tool schema for ${name} must be a JSON object at the root.`);\n }\n return normalized;\n}\n\nfunction buildGeminiFunctionDeclarations(tools: LlmToolSet): GeminiTool[] {\n const toolEntries = Object.entries(tools);\n const functionDeclarations = toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n throw new Error(\n `Gemini provider does not support custom/freeform tools (${name}). Use JSON function tools instead.`,\n );\n }\n return {\n name,\n description: toolDef.description ?? \"\",\n parametersJsonSchema: buildGeminiToolSchema(toolDef.inputSchema, name),\n };\n });\n return [{ functionDeclarations }];\n}\n\nfunction buildGeminiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const jsonSchema = toGeminiJsonSchema(schema, { name });\n if (!isJsonSchemaObject(jsonSchema)) {\n throw new Error(`Gemini tool schema for ${name} must be a JSON object at the root.`);\n }\n return jsonSchema;\n}\n\nfunction extractOpenAiReasoningSummary(response: unknown): string {\n if (!response || typeof response !== \"object\") {\n return \"\";\n }\n const output = (response as { output?: unknown }).output;\n if (!Array.isArray(output)) {\n return \"\";\n }\n let summary = \"\";\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n if ((item as { type?: unknown }).type !== \"reasoning\") {\n continue;\n }\n const content = (item as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n continue;\n }\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\") {\n summary += text;\n }\n }\n }\n }\n return summary;\n}\n\nexport async function runToolLoop(request: LlmToolLoopRequest): Promise<LlmToolLoopResult> {\n const toolEntries = Object.entries(request.tools);\n if (toolEntries.length === 0) {\n throw new Error(\"Tool loop requires at least one tool definition.\");\n }\n\n const contents = resolveToolLoopContents(request);\n if (contents.length === 0) {\n throw new Error(\"Tool loop prompt must not be empty.\");\n }\n\n const maxSteps = Math.max(1, Math.floor(request.maxSteps ?? DEFAULT_TOOL_LOOP_MAX_STEPS));\n const providerInfo = resolveProvider(request.model);\n\n const steps: LlmToolLoopStep[] = [];\n let totalCostUsd = 0;\n let finalText = \"\";\n let finalThoughts = \"\";\n\n if (providerInfo.provider === \"openai\") {\n const openAiAgentTools = buildOpenAiToolsFromToolSet(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiAgentTools]\n : [...openAiAgentTools];\n const reasoningEffort = resolveOpenAiReasoningEffort(\n providerInfo.model,\n request.openAiReasoningEffort,\n );\n const textConfig = {\n format: { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(providerInfo.model),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n let previousResponseId: string | undefined;\n let input: any = toOpenAiInput(contents);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const abortController = new AbortController();\n if (request.signal) {\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n }\n\n const onEvent = request.onEvent;\n let modelVersion = request.model;\n let usageTokens: LlmUsageTokens | undefined;\n\n const emitEvent = (ev: LlmStreamEvent) => {\n onEvent?.(ev);\n };\n\n const finalResponse = await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: providerInfo.model,\n input,\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(openAiTools.length > 0 ? { tools: openAiTools as any } : {}),\n ...(openAiTools.length > 0 ? { parallel_tool_calls: true } : {}),\n reasoning,\n text: textConfig as any,\n include: [\"reasoning.encrypted_content\"] as any,\n },\n { signal: abortController.signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"response\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.reasoning_summary_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"thought\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.refusal.delta\":\n emitEvent({ type: \"blocked\" });\n break;\n default:\n break;\n }\n }\n return await (stream as any).finalResponse();\n });\n\n modelVersion =\n typeof (finalResponse as any).model === \"string\"\n ? (finalResponse as any).model\n : request.model;\n emitEvent({ type: \"model\", modelVersion });\n if ((finalResponse as any).error) {\n const message =\n typeof (finalResponse as any).error.message === \"string\"\n ? (finalResponse as any).error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n usageTokens = extractOpenAiUsageTokens((finalResponse as any).usage);\n\n const responseText = extractOpenAiResponseParts(finalResponse)\n .parts.filter((p) => p.type === \"text\" && p.thought !== true)\n .map((p) => (p as any).text as string)\n .join(\"\")\n .trim();\n const reasoningSummary = extractOpenAiReasoningSummary(finalResponse).trim();\n\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (usageTokens) {\n emitEvent({ type: \"usage\", usage: usageTokens, costUsd: stepCostUsd, modelVersion });\n }\n\n const responseToolCalls = extractOpenAiToolCalls((finalResponse as any).output);\n\n const stepToolCalls: LlmToolCallResult[] = [];\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummary;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n if (call.kind === \"custom\") {\n return {\n call,\n toolName,\n value: call.input,\n parseError: undefined,\n toolId,\n turn,\n toolIndex,\n };\n }\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n return { call, toolName, value, parseError, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: entry.call.kind,\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n const toolOutputs: any[] = [];\n for (const { entry, result, outputPayload } of callResults) {\n stepToolCalls.push({ ...result, callId: entry.call.call_id });\n if (entry.call.kind === \"custom\") {\n toolOutputs.push({\n type: \"custom_tool_call_output\",\n call_id: entry.call.call_id,\n output: mergeToolOutput(outputPayload),\n });\n } else {\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.call.call_id,\n output: mergeToolOutput(outputPayload),\n });\n }\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: stepToolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n previousResponseId = (finalResponse as any).id;\n input = toolOutputs;\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n if (providerInfo.provider === \"chatgpt\") {\n const openAiAgentTools = buildOpenAiToolsFromToolSet(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiAgentTools]\n : [...openAiAgentTools];\n\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const toolLoopInput = toChatGptInput(contents);\n // ChatGPT Codex prompt caching is keyed by both prompt_cache_key and session_id.\n const conversationId = `tool-loop-${randomBytes(8).toString(\"hex\")}`;\n const promptCacheKey = conversationId;\n let input: ChatGptInputItem[] = [...toolLoopInput.input];\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const response = await collectChatGptCodexResponseWithRetry({\n sessionId: conversationId,\n request: {\n model: providerInfo.model,\n store: false,\n stream: true,\n instructions: toolLoopInput.instructions ?? \"You are a helpful assistant.\",\n input,\n prompt_cache_key: promptCacheKey,\n include: [\"reasoning.encrypted_content\"],\n tools: openAiTools,\n tool_choice: \"auto\" as const,\n parallel_tool_calls: true,\n reasoning: {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n },\n text: { verbosity: resolveOpenAiVerbosity(request.model) },\n } as any,\n signal: request.signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"thought\", text: delta.thoughtDelta });\n }\n if (delta.textDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"response\", text: delta.textDelta });\n }\n },\n });\n\n const modelVersion = response.model ? `chatgpt-${response.model}` : request.model;\n const usageTokens = extractChatGptUsageTokens(response.usage);\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n const responseText = (response.text ?? \"\").trim();\n const reasoningSummaryText = (response.reasoningSummaryText ?? \"\").trim();\n\n const responseToolCalls = response.toolCalls ?? [];\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummaryText;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n const toolOutputs: ChatGptInputItem[] = [];\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n const { value, error: parseError } =\n call.kind === \"custom\"\n ? { value: call.input, error: undefined }\n : parseOpenAiToolArguments(call.arguments);\n const ids = normalizeChatGptToolIds({\n callKind: call.kind,\n callId: call.callId,\n itemId: call.id,\n });\n return { call, toolName, value, parseError, ids, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: entry.call.kind,\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.ids.callId });\n if (entry.call.kind === \"custom\") {\n toolOutputs.push({\n type: \"custom_tool_call\",\n id: entry.ids.itemId,\n call_id: entry.ids.callId,\n name: entry.toolName,\n input: entry.call.input,\n status: \"completed\",\n } as ChatGptInputItem);\n toolOutputs.push({\n type: \"custom_tool_call_output\",\n call_id: entry.ids.callId,\n output: mergeToolOutput(outputPayload),\n } as ChatGptInputItem);\n } else {\n toolOutputs.push({\n type: \"function_call\",\n id: entry.ids.itemId,\n call_id: entry.ids.callId,\n name: entry.toolName,\n arguments: entry.call.arguments,\n status: \"completed\",\n } as ChatGptInputItem);\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.ids.callId,\n output: mergeToolOutput(outputPayload),\n } as ChatGptInputItem);\n }\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n input = input.concat(toolOutputs);\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n if (providerInfo.provider === \"fireworks\") {\n if (request.modelTools && request.modelTools.length > 0) {\n throw new Error(\n \"Fireworks provider does not support provider-native modelTools in runToolLoop.\",\n );\n }\n\n const fireworksTools = buildFireworksToolsFromToolSet(request.tools);\n const messages: Array<Record<string, unknown>> = toFireworksMessages(contents);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const response = await runFireworksCall(async (client) => {\n return await client.chat.completions.create(\n {\n model: providerInfo.model,\n messages: messages as any,\n tools: fireworksTools as any,\n tool_choice: \"auto\" as const,\n parallel_tool_calls: true,\n } as any,\n { signal: request.signal } as any,\n );\n });\n\n const modelVersion = typeof response.model === \"string\" ? response.model : request.model;\n request.onEvent?.({ type: \"model\", modelVersion });\n\n const choice = Array.isArray(response.choices) ? response.choices[0] : undefined;\n if (choice?.finish_reason === \"content_filter\") {\n request.onEvent?.({ type: \"blocked\" });\n }\n const message = (choice as { message?: unknown } | undefined)?.message;\n const responseText = extractFireworksMessageText(message).trim();\n if (responseText.length > 0) {\n request.onEvent?.({ type: \"delta\", channel: \"response\", text: responseText });\n }\n\n const usageTokens = extractFireworksUsageTokens(response.usage);\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (usageTokens) {\n request.onEvent?.({\n type: \"usage\",\n usage: usageTokens,\n costUsd: stepCostUsd,\n modelVersion,\n });\n }\n\n const responseToolCalls = extractFireworksToolCalls(message);\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = \"\";\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const stepToolCalls: LlmToolCallResult[] = [];\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n return { call, toolName: call.name, value, parseError, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: \"function\",\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n const assistantToolCalls: Array<Record<string, unknown>> = [];\n const toolMessages: Array<Record<string, unknown>> = [];\n for (const { entry, result, outputPayload } of callResults) {\n stepToolCalls.push({ ...result, callId: entry.call.id });\n assistantToolCalls.push({\n id: entry.call.id,\n type: \"function\",\n function: {\n name: entry.toolName,\n arguments: entry.call.arguments,\n },\n });\n toolMessages.push({\n role: \"tool\",\n tool_call_id: entry.call.id,\n content: mergeToolOutput(outputPayload),\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: undefined,\n toolCalls: stepToolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n messages.push({\n role: \"assistant\",\n ...(responseText.length > 0 ? { content: responseText } : {}),\n tool_calls: assistantToolCalls,\n });\n messages.push(...toolMessages);\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n // Gemini provider\n const geminiFunctionTools = buildGeminiFunctionDeclarations(request.tools);\n const geminiNativeTools = toGeminiTools(request.modelTools);\n const geminiTools = geminiNativeTools\n ? geminiNativeTools.concat(geminiFunctionTools)\n : geminiFunctionTools;\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n tools: geminiTools,\n toolConfig: {\n functionCallingConfig: {\n mode: FunctionCallingConfigMode.VALIDATED,\n },\n },\n thinkingConfig: resolveGeminiThinkingConfig(request.model),\n };\n\n const onEvent = request.onEvent;\n\n type GeminiToolLoopResponse = {\n readonly responseText: string;\n readonly thoughtsText: string;\n readonly functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>>;\n readonly modelParts: GeminiPart[];\n readonly usageMetadata?: unknown;\n readonly modelVersion?: string;\n };\n\n const response: GeminiToolLoopResponse = await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: request.model,\n contents: geminiContents,\n config,\n });\n let responseText = \"\";\n let thoughtsText = \"\";\n const modelParts: GeminiPart[] = [];\n const functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>> = [];\n const seenFunctionCallIds = new Set<string>();\n const seenFunctionCallKeys = new Set<string>();\n let latestUsageMetadata: unknown;\n let resolvedModelVersion: string | undefined;\n\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n resolvedModelVersion = chunk.modelVersion;\n onEvent?.({ type: \"model\", modelVersion: chunk.modelVersion });\n }\n if (chunk.usageMetadata) {\n latestUsageMetadata = chunk.usageMetadata;\n }\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n const parts = primary?.content?.parts;\n if (!parts || parts.length === 0) {\n continue;\n }\n\n for (const part of parts) {\n modelParts.push(part);\n const call = part.functionCall;\n if (call) {\n const id = typeof call.id === \"string\" ? call.id : \"\";\n const shouldAdd = (() => {\n if (id.length > 0) {\n if (seenFunctionCallIds.has(id)) {\n return false;\n }\n seenFunctionCallIds.add(id);\n return true;\n }\n const key = JSON.stringify({ name: call.name ?? \"\", args: call.args ?? null });\n if (seenFunctionCallKeys.has(key)) {\n return false;\n }\n seenFunctionCallKeys.add(key);\n return true;\n })();\n if (shouldAdd) {\n functionCalls.push(call);\n }\n }\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought) {\n thoughtsText += part.text;\n onEvent?.({ type: \"delta\", channel: \"thought\", text: part.text });\n } else {\n responseText += part.text;\n onEvent?.({ type: \"delta\", channel: \"response\", text: part.text });\n }\n }\n }\n }\n\n return {\n responseText,\n thoughtsText,\n functionCalls,\n modelParts,\n usageMetadata: latestUsageMetadata,\n modelVersion: resolvedModelVersion ?? request.model,\n };\n });\n\n const usageTokens = extractGeminiUsageTokens(response.usageMetadata);\n const modelVersion = response.modelVersion ?? request.model;\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (response.functionCalls.length === 0) {\n finalText = response.responseText.trim();\n finalThoughts = response.thoughtsText.trim();\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: finalText || undefined,\n thoughts: finalThoughts || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n\n const modelPartsForHistory = response.modelParts.filter(\n (part) => !(typeof part.text === \"string\" && part.thought === true),\n );\n if (modelPartsForHistory.length > 0) {\n geminiContents.push({ role: \"model\", parts: modelPartsForHistory });\n } else {\n const parts: GeminiPart[] = [];\n if (response.responseText) {\n parts.push({ text: response.responseText });\n }\n for (const call of response.functionCalls) {\n parts.push({ functionCall: call });\n }\n geminiContents.push({ role: \"model\", parts });\n }\n\n const responseParts: GeminiPart[] = [];\n const callInputs = response.functionCalls.map((call, index) => {\n const turn = stepIndex + 1;\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name ?? \"unknown\";\n const rawInput = call.args ?? {};\n return { call, toolName, rawInput, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: \"function\",\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.rawInput,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.call.id });\n const responsePayload = isPlainRecord(outputPayload)\n ? outputPayload\n : { output: outputPayload };\n responseParts.push({\n functionResponse: {\n name: entry.toolName,\n response: responsePayload,\n ...(entry.call.id ? { id: entry.call.id } : {}),\n },\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: response.responseText.trim() || undefined,\n thoughts: response.thoughtsText.trim() || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n geminiContents.push({ role: \"user\", parts: responseParts });\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n}\n\n// --- Images (Gemini image-preview) ---\n\nconst IMAGE_GRADE_SCHEMA = z.enum([\"pass\", \"fail\"]);\n\nasync function gradeGeneratedImage(params: {\n gradingPrompt: string;\n imagePrompt: string;\n image: LlmImageData;\n model: string;\n}): Promise<z.infer<typeof IMAGE_GRADE_SCHEMA>> {\n const parts: LlmContentPart[] = [\n {\n type: \"text\",\n text: [\n params.gradingPrompt,\n \"\",\n \"Image prompt to grade:\",\n params.imagePrompt,\n \"\",\n 'Respond with the JSON string \"pass\" or \"fail\".',\n ].join(\"\\\\n\"),\n },\n {\n type: \"inlineData\",\n data: params.image.data.toString(\"base64\"),\n mimeType: params.image.mimeType ?? \"image/png\",\n },\n ];\n const { value } = await generateJson({\n model: params.model,\n input: [{ role: \"user\", content: parts }],\n schema: IMAGE_GRADE_SCHEMA,\n });\n return value;\n}\n\nexport async function generateImages(request: LlmGenerateImagesRequest): Promise<LlmImageData[]> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 4));\n const promptList = Array.from(request.imagePrompts);\n if (promptList.length === 0) {\n return [];\n }\n const numImages = promptList.length;\n\n type PromptEntry = { index: number; prompt: string };\n const promptEntries: PromptEntry[] = promptList.map((rawPrompt, arrayIndex) => {\n const trimmedPrompt = rawPrompt.trim();\n if (!trimmedPrompt) {\n throw new Error(`imagePrompts[${arrayIndex}] must be a non-empty string`);\n }\n return { index: arrayIndex + 1, prompt: trimmedPrompt };\n });\n\n const gradingPrompt = request.imageGradingPrompt.trim();\n if (!gradingPrompt) {\n throw new Error(\"imageGradingPrompt must be a non-empty string\");\n }\n\n const addText = (parts: LlmContentPart[], text: string) => {\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined && lastPart.type === \"text\") {\n (lastPart as any).text = `${(lastPart as any).text}\\\\n${text}`;\n } else {\n parts.push({ type: \"text\", text });\n }\n };\n\n const buildInitialPromptParts = (): LlmContentPart[] => {\n const parts: LlmContentPart[] = [];\n addText(\n parts,\n [\n `Please make all ${numImages} requested images:`,\n \"\",\n \"Follow the style:\",\n request.stylePrompt,\n ].join(\"\\\\n\"),\n );\n if (request.styleImages && request.styleImages.length > 0) {\n addText(\n parts,\n \"\\\\nFollow the visual style, composition and the characters from these images:\",\n );\n for (const styleImage of request.styleImages) {\n parts.push({\n type: \"inlineData\",\n data: styleImage.data.toString(\"base64\"),\n mimeType: styleImage.mimeType,\n });\n }\n }\n const lines: string[] = [\"\", \"Image descriptions:\"];\n for (const entry of promptEntries) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(\"\");\n lines.push(`Please make all ${numImages} images.`);\n addText(parts, lines.join(\"\\\\n\"));\n return parts;\n };\n\n const buildContinuationPromptParts = (pending: PromptEntry[]): LlmContentPart[] => {\n const pendingIds = pending.map((entry) => entry.index).join(\", \");\n const lines: string[] = [\n `Please continue generating the remaining images: ${pendingIds}.`,\n \"\",\n \"Image descriptions:\",\n ];\n for (const entry of pending) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(`\\\\nPlease make all ${pending.length} remaining images.`);\n return [{ type: \"text\", text: lines.join(\"\\\\n\") }];\n };\n\n const inputMessages: LlmInputMessage[] = [{ role: \"user\", content: buildInitialPromptParts() }];\n\n const orderedEntries = [...promptEntries];\n const resolvedImages = new Map<number, LlmImageData>();\n\n const removeResolvedEntries = (resolved: ReadonlySet<number>) => {\n if (resolved.size === 0) {\n return;\n }\n for (let i = promptEntries.length - 1; i >= 0; i -= 1) {\n const entry = promptEntries[i];\n if (!entry) {\n continue;\n }\n if (resolved.has(entry.index)) {\n promptEntries.splice(i, 1);\n }\n }\n };\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const result = await generateText({\n model: request.model,\n input: inputMessages,\n responseModalities: [\"IMAGE\", \"TEXT\"],\n imageAspectRatio: request.imageAspectRatio,\n imageSize: request.imageSize ?? \"2K\",\n });\n if (result.blocked || !result.content) {\n continue;\n }\n const images = extractImages(result.content);\n if (images.length > 0 && promptEntries.length > 0) {\n const assignedCount = Math.min(images.length, promptEntries.length);\n const pendingAssignments = promptEntries.slice(0, assignedCount);\n const assignedImages = images.slice(0, assignedCount);\n const gradeResults = await Promise.all(\n pendingAssignments.map((entry, index) =>\n gradeGeneratedImage({\n gradingPrompt,\n imagePrompt: entry.prompt,\n image: (() => {\n const image = assignedImages[index];\n if (!image) {\n throw new Error(\"Image generation returned fewer images than expected.\");\n }\n return image as LlmImageData;\n })(),\n model: \"gpt-5.2\",\n }),\n ),\n );\n const passedEntries = new Set<number>();\n for (let i = 0; i < gradeResults.length; i += 1) {\n const grade = gradeResults[i];\n const entry = pendingAssignments[i];\n const image = assignedImages[i];\n if (!grade || !entry || !image) {\n continue;\n }\n if (grade === \"pass\") {\n resolvedImages.set(entry.index, image as LlmImageData);\n passedEntries.add(entry.index);\n }\n }\n removeResolvedEntries(passedEntries);\n }\n if (promptEntries.length === 0) {\n break;\n }\n inputMessages.push({\n role: \"assistant\",\n content: result.content.parts,\n });\n inputMessages.push({ role: \"user\", content: buildContinuationPromptParts(promptEntries) });\n }\n\n const orderedImages: LlmImageData[] = [];\n for (const entry of orderedEntries) {\n const image = resolvedImages.get(entry.index);\n if (image) {\n orderedImages.push(image);\n }\n }\n\n return orderedImages.slice(0, numImages);\n}\n\nexport async function generateImageInBatches(\n request: LlmGenerateImagesRequest & { batchSize: number; overlapSize: number },\n): Promise<LlmImageData[]> {\n const {\n batchSize,\n overlapSize,\n imagePrompts,\n styleImages: baseStyleImagesInput,\n ...rest\n } = request;\n if (batchSize <= 0) {\n throw new Error(\"batchSize must be greater than 0\");\n }\n if (imagePrompts.length === 0) {\n return [];\n }\n\n const baseStyleImages = baseStyleImagesInput ? [...baseStyleImagesInput] : [];\n const generatedImages: LlmImageData[] = [];\n const totalPrompts = imagePrompts.length;\n\n for (let startIndex = 0; startIndex < totalPrompts; startIndex += batchSize) {\n const endIndex = Math.min(startIndex + batchSize, totalPrompts);\n const batchPrompts = imagePrompts.slice(startIndex, endIndex);\n\n let styleImagesForBatch: readonly LlmImageData[] = baseStyleImages;\n if (overlapSize > 0 && generatedImages.length > 0) {\n const overlapImages = generatedImages.slice(\n Math.max(0, generatedImages.length - overlapSize),\n );\n if (overlapImages.length > 0) {\n styleImagesForBatch = [...baseStyleImages, ...overlapImages];\n }\n }\n\n const batchImages = await generateImages({\n ...rest,\n imagePrompts: batchPrompts,\n styleImages: styleImagesForBatch,\n });\n\n generatedImages.push(...batchImages);\n }\n\n return generatedImages;\n}\n\nexport function stripCodexCitationMarkers(value: string): {\n text: string;\n stripped: boolean;\n} {\n // Codex-style citation markers are private-use unicode characters:\n // cite... (U+E200/U+E202/U+E201)\n const citationBlockPattern = /\\uE200cite\\uE202[^\\uE201]*\\uE201/gu;\n const leftoverMarkersPattern = /[\\uE200\\uE201\\uE202]/gu;\n\n const withoutBlocks = value.replace(citationBlockPattern, \"\");\n const withoutMarkers = withoutBlocks.replace(leftoverMarkersPattern, \"\");\n const stripped = withoutMarkers !== value;\n return { text: withoutMarkers, stripped };\n}\n\nfunction hasMarkdownSourcesSection(value: string): boolean {\n return /^##\\s+Sources\\s*$/gmu.test(value);\n}\n\nexport function appendMarkdownSourcesSection(value: string, sources: readonly string[]): string {\n const trimmed = value.trimEnd();\n if (sources.length === 0) {\n return trimmed;\n }\n if (hasMarkdownSourcesSection(trimmed)) {\n return trimmed;\n }\n const lines = sources.map((url) => `- <${url}>`).join(\"\\n\");\n return `${trimmed}\\n\\n## Sources\\n${lines}`;\n}\n","export type AsyncQueue<T> = {\n push: (value: T) => void;\n close: () => void;\n fail: (error: Error) => void;\n iterable: AsyncIterable<T>;\n};\n\nexport function createAsyncQueue<T>(): AsyncQueue<T> {\n let closed = false;\n let error: Error | null = null;\n const values: T[] = [];\n let pending: {\n resolve: (value: IteratorResult<T>) => void;\n reject: (err: Error) => void;\n } | null = null;\n\n const push = (value: T) => {\n if (closed || error) {\n return;\n }\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value, done: false });\n return;\n }\n values.push(value);\n };\n\n const close = () => {\n if (closed || error) {\n return;\n }\n closed = true;\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value: undefined as never, done: true });\n }\n };\n\n const fail = (err: Error) => {\n if (closed || error) {\n return;\n }\n error = err;\n if (pending) {\n const { reject } = pending;\n pending = null;\n reject(err);\n }\n };\n\n async function* iterator(): AsyncIterable<T> {\n while (true) {\n if (error) {\n throw error;\n }\n if (values.length > 0) {\n yield values.shift() as T;\n continue;\n }\n if (closed) {\n return;\n }\n const next = await new Promise<IteratorResult<T>>((resolve, reject) => {\n pending = { resolve, reject };\n });\n if (next.done) {\n return;\n }\n yield next.value;\n }\n }\n\n return { push, close, fail, iterable: iterator() };\n}\n","export type FireworksPricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputRate: number;\n};\n\nconst FIREWORKS_KIMI_K25_PRICING: FireworksPricing = {\n inputRate: 0.6 / 1_000_000,\n cachedRate: 0.1 / 1_000_000,\n outputRate: 3.0 / 1_000_000,\n};\n\nconst FIREWORKS_GLM_5_PRICING: FireworksPricing = {\n inputRate: 1.0 / 1_000_000,\n cachedRate: 0.2 / 1_000_000,\n outputRate: 3.2 / 1_000_000,\n};\n\nconst FIREWORKS_MINIMAX_M21_PRICING: FireworksPricing = {\n inputRate: 0.3 / 1_000_000,\n cachedRate: 0.15 / 1_000_000,\n outputRate: 1.2 / 1_000_000,\n};\n\nexport function getFireworksPricing(modelId: string): FireworksPricing | undefined {\n if (modelId.includes(\"kimi-k2.5\") || modelId.includes(\"kimi-k2p5\")) {\n return FIREWORKS_KIMI_K25_PRICING;\n }\n if (modelId.includes(\"glm-5\")) {\n return FIREWORKS_GLM_5_PRICING;\n }\n if (modelId.includes(\"minimax-m2.1\") || modelId.includes(\"minimax-m2p1\")) {\n return FIREWORKS_MINIMAX_M21_PRICING;\n }\n return undefined;\n}\n","export type GeminiProPricing = {\n readonly threshold: number;\n readonly inputRateLow: number;\n readonly inputRateHigh: number;\n readonly cachedRateLow: number;\n readonly cachedRateHigh: number;\n readonly outputRateLow: number;\n readonly outputRateHigh: number;\n};\n\nexport type GeminiImagePricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputTextRate: number;\n readonly outputImageRate: number;\n readonly imagePrices: Record<string, number>;\n};\n\n// Gemini pricing snapshot (best-effort). For current official pricing, see:\n// https://cloud.google.com/vertex-ai/generative-ai/pricing\nconst GEMINI_3_PRO_PREVIEW_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 2 / 1_000_000,\n inputRateHigh: 4 / 1_000_000,\n cachedRateLow: 0.2 / 1_000_000,\n cachedRateHigh: 0.4 / 1_000_000,\n outputRateLow: 12 / 1_000_000,\n outputRateHigh: 18 / 1_000_000,\n};\n\n// Pricing from Gemini 2.5 Pro public rates (per 1M tokens, USD):\n// - Input: $1.25 (<=200k prompt tokens), $2.50 (>200k)\n// - Output (including thinking): $10.00 (<=200k), $15.00 (>200k)\n// - Context caching: $0.125 (<=200k), $0.25 (>200k)\nconst GEMINI_2_5_PRO_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 1.25 / 1_000_000,\n inputRateHigh: 2.5 / 1_000_000,\n cachedRateLow: 0.125 / 1_000_000,\n cachedRateHigh: 0.25 / 1_000_000,\n outputRateLow: 10 / 1_000_000,\n outputRateHigh: 15 / 1_000_000,\n};\n\nconst GEMINI_IMAGE_PREVIEW_PRICING: GeminiImagePricing = {\n inputRate: 2 / 1_000_000,\n cachedRate: 0.2 / 1_000_000,\n outputTextRate: 12 / 1_000_000,\n outputImageRate: 120 / 1_000_000,\n imagePrices: {\n \"1K\": 0.134,\n \"2K\": 0.134,\n \"4K\": 0.24,\n },\n};\n\nexport function getGeminiProPricing(modelId: string): GeminiProPricing | undefined {\n if (modelId.includes(\"gemini-2.5-pro\")) {\n return GEMINI_2_5_PRO_PRICING;\n }\n if (modelId.includes(\"gemini-3-pro\") || modelId.includes(\"gemini-3.1-pro\")) {\n return GEMINI_3_PRO_PREVIEW_PRICING;\n }\n return undefined;\n}\n\nexport function getGeminiImagePricing(modelId: string): GeminiImagePricing | undefined {\n if (modelId.includes(\"image-preview\")) {\n return GEMINI_IMAGE_PREVIEW_PRICING;\n }\n return undefined;\n}\n","export type OpenAiPricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputRate: number;\n};\n\n// Pricing snapshot (best-effort). For current official pricing, see:\n// https://platform.openai.com/docs/pricing\n// Keep this conservative: unknown models -> cost 0.\nconst OPENAI_GPT_52_PRICING: OpenAiPricing = {\n inputRate: 1.75 / 1_000_000,\n cachedRate: 0.175 / 1_000_000,\n outputRate: 14 / 1_000_000,\n};\n\n// https://platform.openai.com/docs/models/gpt-5-codex\n// gpt-5.3-codex-spark is priced as the GPT-5 mini tier in this library.\nconst OPENAI_GPT_53_CODEX_PRICING: OpenAiPricing = {\n inputRate: 1.25 / 1_000_000,\n cachedRate: 0.125 / 1_000_000,\n outputRate: 10 / 1_000_000,\n};\n\nconst OPENAI_GPT_5_MINI_PRICING: OpenAiPricing = {\n inputRate: 0.25 / 1_000_000,\n cachedRate: 0.025 / 1_000_000,\n outputRate: 2.0 / 1_000_000,\n};\n\nexport function getOpenAiPricing(modelId: string): OpenAiPricing | undefined {\n if (modelId.includes(\"gpt-5.3-codex-spark\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n if (modelId.includes(\"gpt-5.3-codex\")) {\n return OPENAI_GPT_53_CODEX_PRICING;\n }\n if (modelId.includes(\"gpt-5-codex\")) {\n return OPENAI_GPT_53_CODEX_PRICING;\n }\n if (modelId.includes(\"gpt-5.2\")) {\n return OPENAI_GPT_52_PRICING;\n }\n if (modelId.includes(\"gpt-5-mini\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n if (modelId.includes(\"gpt-5.1-codex-mini\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n return undefined;\n}\n","import { getFireworksPricing } from \"../fireworks/pricing.js\";\nimport { getGeminiImagePricing, getGeminiProPricing } from \"../google/pricing.js\";\nimport { getOpenAiPricing } from \"../openai/pricing.js\";\n\nexport type LlmUsageTokens = {\n readonly promptTokens?: number;\n readonly cachedTokens?: number;\n readonly responseTokens?: number;\n readonly responseImageTokens?: number;\n readonly thinkingTokens?: number;\n readonly totalTokens?: number;\n readonly toolUsePromptTokens?: number;\n};\n\nfunction resolveUsageNumber(value: number | undefined): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, value);\n }\n return 0;\n}\n\nexport function estimateCallCostUsd({\n modelId,\n tokens,\n responseImages,\n imageSize,\n}: {\n modelId: string;\n tokens: LlmUsageTokens | undefined;\n responseImages: number;\n imageSize?: string;\n}): number {\n if (!tokens) {\n return 0;\n }\n const promptTokens = resolveUsageNumber(tokens.promptTokens);\n const cachedTokens = resolveUsageNumber(tokens.cachedTokens);\n const responseTokens = resolveUsageNumber(tokens.responseTokens);\n const responseImageTokens = resolveUsageNumber(tokens.responseImageTokens);\n const thinkingTokens = resolveUsageNumber(tokens.thinkingTokens);\n const toolUsePromptTokens = resolveUsageNumber(tokens.toolUsePromptTokens);\n const promptTokenTotal = promptTokens + toolUsePromptTokens;\n const nonCachedPrompt = Math.max(0, promptTokenTotal - cachedTokens);\n\n const imagePreviewPricing = getGeminiImagePricing(modelId);\n if (imagePreviewPricing) {\n const resolvedImageSize =\n imageSize && imagePreviewPricing.imagePrices[imageSize] ? imageSize : \"2K\";\n const imageRate = imagePreviewPricing.imagePrices[resolvedImageSize] ?? 0;\n const tokensPerImage =\n imagePreviewPricing.outputImageRate > 0 ? imageRate / imagePreviewPricing.outputImageRate : 0;\n let responseTextForPricing = Math.max(0, responseTokens - responseImageTokens);\n let imageTokensForPricing = responseImageTokens;\n if (imageTokensForPricing <= 0 && responseImages > 0 && tokensPerImage > 0) {\n const estimatedImageTokens = responseImages * tokensPerImage;\n imageTokensForPricing = estimatedImageTokens;\n if (responseTextForPricing >= estimatedImageTokens) {\n responseTextForPricing -= estimatedImageTokens;\n }\n }\n const textOutputCost =\n (responseTextForPricing + thinkingTokens) * imagePreviewPricing.outputTextRate;\n const inputCost = nonCachedPrompt * imagePreviewPricing.inputRate;\n const cachedCost = cachedTokens * imagePreviewPricing.cachedRate;\n const imageOutputCost = imageTokensForPricing * imagePreviewPricing.outputImageRate;\n return inputCost + cachedCost + textOutputCost + imageOutputCost;\n }\n\n const geminiPricing = getGeminiProPricing(modelId);\n if (geminiPricing) {\n const useHighTier = promptTokenTotal > geminiPricing.threshold;\n const inputRate = useHighTier ? geminiPricing.inputRateHigh : geminiPricing.inputRateLow;\n const cachedRate = useHighTier ? geminiPricing.cachedRateHigh : geminiPricing.cachedRateLow;\n const outputRate = useHighTier ? geminiPricing.outputRateHigh : geminiPricing.outputRateLow;\n const inputCost = nonCachedPrompt * inputRate;\n const cachedCost = cachedTokens * cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n const fireworksPricing = getFireworksPricing(modelId);\n if (fireworksPricing) {\n const inputCost = nonCachedPrompt * fireworksPricing.inputRate;\n const cachedCost = cachedTokens * fireworksPricing.cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * fireworksPricing.outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n const openAiPricing = getOpenAiPricing(modelId);\n if (openAiPricing) {\n const inputCost = nonCachedPrompt * openAiPricing.inputRate;\n const cachedCost = cachedTokens * openAiPricing.cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * openAiPricing.outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n return 0;\n}\n","import os from \"node:os\";\nimport { TextDecoder } from \"node:util\";\n\nimport { getChatGptAuthProfile } from \"./chatgpt-auth.js\";\nimport {\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n createAdaptiveResponsesStream,\n createResponsesWebSocketStream,\n mergeOpenAiBetaHeader,\n resolveResponsesWebSocketMode,\n toWebSocketUrl,\n type ResponsesStreamWithFinal,\n type ResponsesWebSocketMode,\n} from \"./responses-websocket.js\";\n\nconst CHATGPT_CODEX_ENDPOINT = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CHATGPT_RESPONSES_EXPERIMENTAL_HEADER = \"responses=experimental\";\n\nlet cachedResponsesWebSocketMode: ResponsesWebSocketMode | null = null;\nlet chatGptResponsesWebSocketDisabled = false;\n\nexport type ChatGptInputTextPart = {\n type: \"input_text\";\n text: string;\n};\n\nexport type ChatGptOutputTextPart = {\n type: \"output_text\";\n text: string;\n};\n\nexport type ChatGptInputImagePart = {\n type: \"input_image\";\n image_url: string | { url: string };\n detail?: \"auto\";\n};\n\nexport type ChatGptInputFilePart = {\n type: \"input_file\";\n file_data?: string | null;\n file_id?: string | null;\n file_url?: string | null;\n filename?: string | null;\n};\n\nexport type ChatGptInputMessagePart =\n | ChatGptInputTextPart\n | ChatGptOutputTextPart\n | ChatGptInputImagePart\n | ChatGptInputFilePart;\n\nexport type ChatGptInputMessage = {\n role: \"user\" | \"assistant\";\n content: string | ChatGptInputMessagePart[];\n type?: \"message\";\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCall = {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status?: \"completed\";\n};\n\nexport type ChatGptCustomToolCall = {\n type: \"custom_tool_call\";\n id: string;\n call_id: string;\n name: string;\n input: string;\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCallOutput = {\n type: \"function_call_output\";\n call_id: string;\n output: string;\n};\n\nexport type ChatGptCustomToolCallOutput = {\n type: \"custom_tool_call_output\";\n call_id: string;\n output: string;\n};\n\nexport type ChatGptInputItem =\n | ChatGptInputMessage\n | ChatGptFunctionCall\n | ChatGptCustomToolCall\n | ChatGptFunctionCallOutput\n | ChatGptCustomToolCallOutput;\n\nexport type ChatGptCodexRequest = {\n model: string;\n store: boolean;\n stream: boolean;\n instructions?: string;\n input: ChatGptInputItem[];\n text?: { verbosity?: string; format?: unknown };\n include?: string[];\n prompt_cache_key?: string;\n tool_choice?: \"auto\" | \"required\" | \"none\";\n parallel_tool_calls?: boolean;\n temperature?: number;\n tools?: unknown[];\n reasoning?: { effort: string; summary?: string };\n};\n\nexport type ChatGptCodexStreamEvent = {\n type?: string;\n [key: string]: unknown;\n};\n\nexport type ChatGptCodexUsage = {\n input_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n output_tokens?: number;\n output_tokens_details?: { reasoning_tokens?: number };\n total_tokens?: number;\n};\n\nexport type ChatGptCodexToolCall =\n | {\n kind: \"function\";\n id: string;\n callId: string;\n name: string;\n arguments: string;\n }\n | {\n kind: \"custom\";\n id: string;\n callId: string;\n name: string;\n input: string;\n };\n\nexport type ChatGptCodexWebSearchAction = {\n type: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n sources?: Array<{ url: string }>;\n};\n\nexport type ChatGptCodexWebSearchCall = {\n id: string;\n status?: string;\n action?: ChatGptCodexWebSearchAction;\n};\n\nexport type ChatGptCodexCollectedResponse = {\n text: string;\n reasoningText: string;\n reasoningSummaryText: string;\n toolCalls: ChatGptCodexToolCall[];\n webSearchCalls: ChatGptCodexWebSearchCall[];\n usage?: ChatGptCodexUsage;\n id?: string;\n model?: string;\n status?: string;\n blocked: boolean;\n};\n\nexport type ChatGptCodexDelta = {\n textDelta?: string;\n thoughtDelta?: string;\n};\n\nexport async function streamChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n}): Promise<AsyncIterable<ChatGptCodexStreamEvent>> {\n const { access, accountId } = await getChatGptAuthProfile();\n const mode = resolveChatGptResponsesWebSocketMode();\n\n const fallbackStreamFactory = (): ResponsesStreamWithFinal<\n ChatGptCodexStreamEvent,\n Record<string, unknown>\n > => {\n const streamPromise = streamChatGptCodexResponseSse({\n request: options.request,\n access,\n accountId,\n sessionId: options.sessionId,\n signal: options.signal,\n });\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<ChatGptCodexStreamEvent> {\n const stream = await streamPromise;\n for await (const event of stream) {\n yield event;\n }\n },\n async finalResponse(): Promise<Record<string, unknown>> {\n return {};\n },\n close(): void {\n // SSE stream lifecycle is managed by fetch/AbortSignal.\n },\n };\n };\n\n if (mode === \"off\" || chatGptResponsesWebSocketDisabled) {\n return fallbackStreamFactory();\n }\n\n const websocketHeaders = buildChatGptCodexHeaders({\n access,\n accountId,\n sessionId: options.sessionId,\n useWebSocket: true,\n });\n return createAdaptiveResponsesStream({\n mode,\n createWebSocketStream: async () =>\n await createResponsesWebSocketStream({\n url: toWebSocketUrl(CHATGPT_CODEX_ENDPOINT),\n headers: websocketHeaders,\n request: options.request,\n signal: options.signal,\n }),\n createFallbackStream: fallbackStreamFactory,\n onWebSocketFallback: () => {\n chatGptResponsesWebSocketDisabled = true;\n },\n });\n}\n\nasync function streamChatGptCodexResponseSse(options: {\n request: ChatGptCodexRequest;\n access: string;\n accountId: string;\n sessionId?: string;\n signal?: AbortSignal;\n}): Promise<AsyncIterable<ChatGptCodexStreamEvent>> {\n const headers = buildChatGptCodexHeaders({\n access: options.access,\n accountId: options.accountId,\n sessionId: options.sessionId,\n useWebSocket: false,\n });\n headers.Accept = \"text/event-stream\";\n headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(CHATGPT_CODEX_ENDPOINT, {\n method: \"POST\",\n headers,\n body: JSON.stringify(options.request),\n signal: options.signal,\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT Codex request failed (${response.status}): ${body}`);\n }\n const body = response.body;\n if (!body) {\n throw new Error(\"ChatGPT Codex response body was empty.\");\n }\n return parseEventStream(body);\n}\n\nfunction resolveChatGptResponsesWebSocketMode(): ResponsesWebSocketMode {\n if (cachedResponsesWebSocketMode) {\n return cachedResponsesWebSocketMode;\n }\n cachedResponsesWebSocketMode = resolveResponsesWebSocketMode(\n process.env.CHATGPT_RESPONSES_WEBSOCKET_MODE ?? process.env.OPENAI_RESPONSES_WEBSOCKET_MODE,\n \"auto\",\n );\n return cachedResponsesWebSocketMode;\n}\n\nfunction buildChatGptCodexHeaders(options: {\n access: string;\n accountId: string;\n sessionId?: string;\n useWebSocket: boolean;\n}): Record<string, string> {\n const openAiBeta = options.useWebSocket\n ? mergeOpenAiBetaHeader(\n CHATGPT_RESPONSES_EXPERIMENTAL_HEADER,\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n )\n : CHATGPT_RESPONSES_EXPERIMENTAL_HEADER;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${options.access}`,\n \"chatgpt-account-id\": options.accountId,\n \"OpenAI-Beta\": openAiBeta,\n originator: \"llm\",\n \"User-Agent\": buildUserAgent(),\n };\n if (options.sessionId) {\n headers.session_id = options.sessionId;\n }\n return headers;\n}\n\nexport async function collectChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n onDelta?: (delta: ChatGptCodexDelta) => void;\n}): Promise<ChatGptCodexCollectedResponse> {\n let requestForAttempt = options.request;\n let retriedWithoutReasoningSummary = false;\n let retriedViaSseFallback = false;\n\n while (true) {\n let sawAnyDelta = false;\n try {\n const stream = await streamChatGptCodexResponse({\n ...options,\n request: requestForAttempt,\n });\n return await collectChatGptCodexStream({\n stream,\n onDelta: (delta) => {\n sawAnyDelta = true;\n options.onDelta?.(delta);\n },\n });\n } catch (error) {\n if (\n !sawAnyDelta &&\n !retriedViaSseFallback &&\n shouldRetryViaSseFallback(error) &&\n !chatGptResponsesWebSocketDisabled\n ) {\n chatGptResponsesWebSocketDisabled = true;\n retriedViaSseFallback = true;\n continue;\n }\n if (\n !retriedWithoutReasoningSummary &&\n shouldRetryWithoutReasoningSummary(requestForAttempt, error)\n ) {\n requestForAttempt = removeReasoningSummary(requestForAttempt);\n retriedWithoutReasoningSummary = true;\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function collectChatGptCodexStream(options: {\n stream: AsyncIterable<ChatGptCodexStreamEvent>;\n onDelta?: (delta: ChatGptCodexDelta) => void;\n}): Promise<ChatGptCodexCollectedResponse> {\n const toolCalls = new Map<string, ChatGptCodexToolCall>();\n const toolCallOrder: string[] = [];\n const webSearchCalls = new Map<string, ChatGptCodexWebSearchCall>();\n const webSearchCallOrder: string[] = [];\n let text = \"\";\n const reasoningText = \"\";\n let reasoningSummaryText = \"\";\n let usage: ChatGptCodexUsage | undefined;\n let responseId: string | undefined;\n let model: string | undefined;\n let status: string | undefined;\n let blocked = false;\n for await (const event of options.stream) {\n const type = typeof event.type === \"string\" ? event.type : undefined;\n if (type === \"response.output_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n text += delta;\n options.onDelta?.({ textDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n reasoningSummaryText += delta;\n options.onDelta?.({ thoughtDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_text.delta\") {\n // Avoid collecting chain-of-thought; summaries are handled separately above.\n continue;\n }\n if (type === \"response.refusal.delta\") {\n blocked = true;\n continue;\n }\n if (type === \"response.output_item.added\" || type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown> | undefined;\n if (item) {\n if (item.type === \"function_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n const callId = typeof item.call_id === \"string\" ? item.call_id : id;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const args = typeof item.arguments === \"string\" ? item.arguments : \"\";\n if (callId) {\n if (!toolCalls.has(callId)) {\n toolCallOrder.push(callId);\n }\n toolCalls.set(callId, { kind: \"function\", id, callId, name, arguments: args });\n }\n } else if (item.type === \"custom_tool_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n const callId = typeof item.call_id === \"string\" ? item.call_id : id;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const input = typeof item.input === \"string\" ? item.input : \"\";\n if (callId) {\n if (!toolCalls.has(callId)) {\n toolCallOrder.push(callId);\n }\n toolCalls.set(callId, { kind: \"custom\", id, callId, name, input });\n }\n } else if (item.type === \"web_search_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n if (id) {\n if (!webSearchCalls.has(id)) {\n webSearchCallOrder.push(id);\n }\n webSearchCalls.set(id, {\n id,\n status: typeof item.status === \"string\" ? item.status : undefined,\n action:\n item.action && typeof item.action === \"object\"\n ? (item.action as ChatGptCodexWebSearchAction)\n : undefined,\n });\n }\n }\n }\n continue;\n }\n if (type === \"response.completed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.failed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.in_progress\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n }\n }\n\n // Fallback: if we never received the summary delta, preserve reasoningText.\n if (!reasoningSummaryText && reasoningText) {\n reasoningSummaryText = reasoningText;\n }\n\n const orderedToolCalls = toolCallOrder\n .map((id) => toolCalls.get(id))\n .filter((call): call is ChatGptCodexToolCall => call !== undefined);\n const orderedWebSearchCalls = webSearchCallOrder\n .map((id) => webSearchCalls.get(id))\n .filter((call): call is ChatGptCodexWebSearchCall => call !== undefined);\n\n return {\n text,\n reasoningText,\n reasoningSummaryText,\n toolCalls: orderedToolCalls,\n webSearchCalls: orderedWebSearchCalls,\n usage,\n id: responseId,\n model,\n status,\n blocked,\n };\n}\n\nfunction shouldRetryWithoutReasoningSummary(request: ChatGptCodexRequest, error: unknown): boolean {\n if (!request.reasoning?.summary) {\n return false;\n }\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return message.includes(\"unsupported parameter\") && message.includes(\"reasoning.summary\");\n}\n\nfunction shouldRetryViaSseFallback(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n if (error.name === \"AbortError\") {\n return false;\n }\n const message = error.message.toLowerCase();\n return message.includes(\"responses websocket\");\n}\n\nfunction removeReasoningSummary(request: ChatGptCodexRequest): ChatGptCodexRequest {\n const reasoning = request.reasoning;\n if (!reasoning?.summary) {\n return request;\n }\n return {\n ...request,\n reasoning: {\n effort: reasoning.effort,\n },\n };\n}\n\nfunction buildUserAgent(): string {\n const node = process.version;\n const platform = os.platform();\n const release = os.release();\n return `@ljoukov/llm (node ${node}; ${platform} ${release})`;\n}\n\nasync function* parseEventStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<ChatGptCodexStreamEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let sepIndex = buffer.indexOf(\"\\n\\n\");\n while (sepIndex !== -1) {\n const raw = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const event = parseEventBlock(raw);\n if (event) {\n yield event;\n }\n sepIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim().length > 0) {\n const event = parseEventBlock(buffer);\n if (event) {\n yield event;\n }\n }\n}\n\nfunction parseEventBlock(raw: string): ChatGptCodexStreamEvent | null {\n const lines = raw\n .split(/\\r?\\n/u)\n .map((line) => line.trimEnd())\n .filter(Boolean);\n const dataLines = lines\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(\"data:\".length).trimStart());\n if (dataLines.length === 0) {\n return null;\n }\n const payload = dataLines.join(\"\\n\");\n if (payload === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(payload) as ChatGptCodexStreamEvent;\n } catch {\n return null;\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\n// Optional: fetch access tokens from a centralized token provider over HTTPS (for example a Cloudflare Worker).\nconst CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_URL\";\nconst CHATGPT_AUTH_TOKEN_PROVIDER_STORE_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_STORE\";\n\n// Used both for local storage and as the shared secret for `CHATGPT_AUTH_TOKEN_PROVIDER_URL`.\nconst CHATGPT_AUTH_API_KEY_ENV = \"CHATGPT_AUTH_API_KEY\";\nconst CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY\";\n\nconst CHATGPT_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nconst CHATGPT_OAUTH_TOKEN_URL = \"https://auth.openai.com/oauth/token\";\nconst CHATGPT_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/callback\";\n\nconst TOKEN_EXPIRY_BUFFER_MS = 30_000;\n\nexport type ChatGptAuthProfile = {\n readonly access: string;\n readonly refresh: string;\n readonly expires: number;\n readonly accountId: string;\n readonly idToken?: string;\n};\n\nconst CodexAuthFileSchema = z\n .object({\n OPENAI_API_KEY: z.string().nullable().optional(),\n last_refresh: z.string().optional(),\n tokens: z\n .object({\n access_token: z.string().min(1).optional(),\n refresh_token: z.string().min(1).optional(),\n id_token: z.string().min(1).optional(),\n account_id: z.string().min(1).optional(),\n // Allow a bit of flexibility if the file format changes.\n accessToken: z.string().min(1).optional(),\n refreshToken: z.string().min(1).optional(),\n idToken: z.string().min(1).optional(),\n accountId: z.string().min(1).optional(),\n })\n .optional(),\n })\n .loose();\n\nconst RefreshResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n});\n\nconst ExchangeResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n id_token: z.string().optional(),\n});\n\nlet cachedProfile: ChatGptAuthProfile | null = null;\nlet refreshPromise: Promise<ChatGptAuthProfile> | null = null;\n\nasync function fetchChatGptAuthProfileFromTokenProvider(options: {\n baseUrl: string;\n apiKey: string;\n store?: string;\n}): Promise<ChatGptAuthProfile> {\n const base = options.baseUrl.replace(/\\/+$/u, \"\");\n const store = options.store?.trim() ? options.store.trim() : \"kv\";\n const url = new URL(`${base}/v1/token`);\n url.searchParams.set(\"store\", store);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"x-chatgpt-auth\": options.apiKey,\n Accept: \"application/json\",\n },\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT token provider request failed (${response.status}): ${body}`);\n }\n\n const payload = (await response.json()) as unknown;\n if (!payload || typeof payload !== \"object\") {\n throw new Error(\"ChatGPT token provider returned invalid JSON.\");\n }\n const accessToken =\n (payload as { accessToken?: unknown; access_token?: unknown }).accessToken ??\n (payload as { accessToken?: unknown; access_token?: unknown }).access_token;\n const accountId =\n (payload as { accountId?: unknown; account_id?: unknown }).accountId ??\n (payload as { accountId?: unknown; account_id?: unknown }).account_id;\n const expiresAt =\n (payload as { expiresAt?: unknown; expires_at?: unknown }).expiresAt ??\n (payload as { expiresAt?: unknown; expires_at?: unknown }).expires_at;\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"ChatGPT token provider response missing accessToken.\");\n }\n if (typeof accountId !== \"string\" || accountId.trim().length === 0) {\n throw new Error(\"ChatGPT token provider response missing accountId.\");\n }\n const expires = normalizeEpochMillis(expiresAt) ?? Date.now() + 5 * 60_000;\n\n // In token-provider mode we do not refresh locally (the provider owns token rotation).\n return {\n access: accessToken,\n refresh: \"token_provider\",\n expires,\n accountId,\n };\n}\n\nexport function encodeChatGptAuthJson(profile: ChatGptAuthProfile): string {\n const payload = {\n access: profile.access,\n refresh: profile.refresh,\n expires: profile.expires,\n accountId: profile.accountId,\n ...(profile.idToken ? { id_token: profile.idToken } : {}),\n };\n return JSON.stringify(payload);\n}\n\nexport function encodeChatGptAuthJsonB64(profile: ChatGptAuthProfile): string {\n return Buffer.from(encodeChatGptAuthJson(profile)).toString(\"base64url\");\n}\n\nexport async function exchangeChatGptOauthCode({\n code,\n verifier,\n redirectUri = CHATGPT_OAUTH_REDIRECT_URI,\n}: {\n code: string;\n verifier: string;\n redirectUri?: string;\n}): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"authorization_code\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"code\", code);\n params.set(\"code_verifier\", verifier);\n params.set(\"redirect_uri\", redirectUri);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth token exchange failed (${response.status}): ${body}`);\n }\n const payload = ExchangeResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload);\n}\n\nexport async function refreshChatGptOauthToken(\n refreshToken: string,\n fallback?: { accountId?: string; idToken?: string },\n): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"refresh_token\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"refresh_token\", refreshToken);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth refresh failed (${response.status}): ${body}`);\n }\n const payload = RefreshResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload, fallback);\n}\n\nexport async function getChatGptAuthProfile(): Promise<ChatGptAuthProfile> {\n loadLocalEnv();\n\n const tokenProviderUrl = process.env[CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV];\n const tokenProviderKey =\n process.env[CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY_ENV] ?? process.env[CHATGPT_AUTH_API_KEY_ENV];\n if (\n tokenProviderUrl &&\n tokenProviderUrl.trim().length > 0 &&\n tokenProviderKey &&\n tokenProviderKey.trim().length > 0\n ) {\n if (cachedProfile && !isExpired(cachedProfile)) {\n return cachedProfile;\n }\n if (refreshPromise) {\n return refreshPromise;\n }\n refreshPromise = (async () => {\n try {\n const store = process.env[CHATGPT_AUTH_TOKEN_PROVIDER_STORE_ENV];\n const profile = await fetchChatGptAuthProfileFromTokenProvider({\n baseUrl: tokenProviderUrl,\n apiKey: tokenProviderKey,\n store: store ?? undefined,\n });\n cachedProfile = profile;\n return profile;\n } finally {\n refreshPromise = null;\n }\n })();\n return refreshPromise;\n }\n\n if (cachedProfile && !isExpired(cachedProfile)) {\n return cachedProfile;\n }\n if (refreshPromise) {\n return refreshPromise;\n }\n refreshPromise = (async () => {\n try {\n const baseProfile = cachedProfile ?? loadAuthProfileFromCodexStore();\n const profile = isExpired(baseProfile)\n ? await refreshAndPersistCodexProfile(baseProfile)\n : baseProfile;\n cachedProfile = profile;\n return profile;\n } finally {\n refreshPromise = null;\n }\n })();\n return refreshPromise;\n}\n\nfunction resolveCodexHome(): string {\n const codexHome = process.env.CODEX_HOME;\n if (codexHome && codexHome.trim().length > 0) {\n return codexHome.trim();\n }\n return path.join(os.homedir(), \".codex\");\n}\n\nfunction resolveCodexAuthJsonPath(): string {\n return path.join(resolveCodexHome(), \"auth.json\");\n}\n\nfunction loadAuthProfileFromCodexStore(): ChatGptAuthProfile {\n const authPath = resolveCodexAuthJsonPath();\n let raw: string;\n try {\n raw = fs.readFileSync(authPath, \"utf8\");\n } catch {\n throw new Error(\n `ChatGPT auth not configured. Set ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}+${CHATGPT_AUTH_API_KEY_ENV} or login via Codex to create ${authPath}.`,\n );\n }\n\n let parsed: z.infer<typeof CodexAuthFileSchema>;\n try {\n parsed = CodexAuthFileSchema.parse(JSON.parse(raw));\n } catch (e) {\n throw new Error(\n `Failed to parse Codex auth store at ${authPath}. (${(e as Error)?.message ?? e})`,\n );\n }\n\n const tokens = parsed.tokens;\n if (!tokens) {\n throw new Error(\n `Codex auth store at ${authPath} is missing tokens. Re-login via Codex, or configure ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}.`,\n );\n }\n\n const access = tokens.access_token ?? tokens.accessToken ?? undefined;\n const refresh = tokens.refresh_token ?? tokens.refreshToken ?? undefined;\n const idToken = tokens.id_token ?? tokens.idToken ?? undefined;\n if (!access || !refresh) {\n throw new Error(\n `Codex auth store at ${authPath} is missing access_token/refresh_token. Re-login via Codex, or configure ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}.`,\n );\n }\n\n const expires =\n extractJwtExpiry(access) ?? extractJwtExpiry(idToken ?? \"\") ?? Date.now() + 5 * 60_000;\n const accountId =\n tokens.account_id ??\n tokens.accountId ??\n extractChatGptAccountId(idToken ?? \"\") ??\n extractChatGptAccountId(access);\n if (!accountId) {\n throw new Error(`Codex auth store at ${authPath} is missing chatgpt_account_id/account_id.`);\n }\n\n return {\n access,\n refresh,\n expires,\n accountId,\n idToken: idToken ?? undefined,\n };\n}\n\nasync function refreshAndPersistCodexProfile(\n baseProfile: ChatGptAuthProfile,\n): Promise<ChatGptAuthProfile> {\n const refreshed = await refreshChatGptOauthToken(baseProfile.refresh, {\n accountId: baseProfile.accountId,\n idToken: baseProfile.idToken,\n });\n\n persistCodexTokens(refreshed);\n return refreshed;\n}\n\nfunction persistCodexTokens(profile: ChatGptAuthProfile): void {\n const authPath = resolveCodexAuthJsonPath();\n const codexHome = path.dirname(authPath);\n\n let doc: any = {};\n try {\n doc = JSON.parse(fs.readFileSync(authPath, \"utf8\"));\n } catch {\n doc = {};\n }\n if (!doc || typeof doc !== \"object\") {\n doc = {};\n }\n if (!doc.tokens || typeof doc.tokens !== \"object\") {\n doc.tokens = {};\n }\n\n doc.tokens.access_token = profile.access;\n doc.tokens.refresh_token = profile.refresh;\n doc.tokens.account_id = profile.accountId;\n if (profile.idToken) {\n doc.tokens.id_token = profile.idToken;\n }\n doc.last_refresh = new Date().toISOString();\n\n fs.mkdirSync(codexHome, { recursive: true, mode: 0o700 });\n const tmpPath = `${authPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;\n fs.writeFileSync(tmpPath, `${JSON.stringify(doc, null, 2)}\\n`, { mode: 0o600 });\n fs.renameSync(tmpPath, authPath);\n}\n\nfunction profileFromTokenResponse(\n payload: {\n access_token: string;\n refresh_token: string;\n expires_in: number | string;\n id_token?: string;\n },\n fallback?: { accountId?: string; idToken?: string },\n): ChatGptAuthProfile {\n const expires = Date.now() + normalizeNumber(payload.expires_in) * 1000;\n const fallbackAccountId = fallback?.accountId;\n const fallbackIdToken = fallback?.idToken;\n const accountId =\n extractChatGptAccountId(payload.id_token ?? \"\") ??\n extractChatGptAccountId(payload.access_token) ??\n fallbackAccountId;\n if (!accountId) {\n throw new Error(\"Failed to extract chatgpt_account_id from access token.\");\n }\n return {\n access: payload.access_token,\n refresh: payload.refresh_token,\n expires,\n accountId,\n idToken: payload.id_token ?? fallbackIdToken,\n };\n}\n\nfunction normalizeEpochMillis(value: unknown): number | undefined {\n const numeric = normalizeNumber(value);\n if (!Number.isFinite(numeric)) {\n return undefined;\n }\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric;\n}\n\nfunction normalizeNumber(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return Number.NaN;\n}\n\nfunction isExpired(profile: ChatGptAuthProfile): boolean {\n const expires = profile.expires;\n if (!Number.isFinite(expires)) {\n return true;\n }\n return Date.now() + TOKEN_EXPIRY_BUFFER_MS >= expires;\n}\n\nfunction decodeJwtPayload(token: string): unknown {\n const segments = token.split(\".\");\n if (segments.length < 2) {\n return null;\n }\n const payloadB64 = segments[1] ?? \"\";\n try {\n const decoded = Buffer.from(payloadB64, \"base64url\").toString(\"utf8\");\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nfunction extractJwtExpiry(token: string): number | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const exp = (payload as { exp?: unknown }).exp;\n const parsed = normalizeNumber(exp);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n return parsed < 1_000_000_000_000 ? parsed * 1000 : parsed;\n}\n\nfunction extractChatGptAccountId(token: string): string | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const direct = (payload as { chatgpt_account_id?: unknown }).chatgpt_account_id;\n if (typeof direct === \"string\" && direct.length > 0) {\n return direct;\n }\n\n // Codex/ChatGPT tokens often nest it under this namespaced claim.\n const namespaced = (\n payload as { \"https://api.openai.com/auth\"?: { chatgpt_account_id?: unknown } }\n )[\"https://api.openai.com/auth\"]?.chatgpt_account_id;\n return typeof namespaced === \"string\" && namespaced.length > 0 ? namespaced : undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nlet envLoaded = false;\n\n/**\n * Loads `.env.local` from `process.cwd()` once.\n *\n * - Does not override already-set `process.env` values.\n * - Missing file is silently ignored.\n */\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n const envPath = path.join(process.cwd(), \".env.local\");\n loadEnvFromFile(envPath, { override: false });\n envLoaded = true;\n}\n\nexport function loadEnvFromFile(\n filePath: string,\n { override = false }: { override?: boolean } = {},\n): void {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n for (const line of content.split(/\\r?\\n/u)) {\n const entry = parseEnvLine(line);\n if (!entry) {\n continue;\n }\n const [key, value] = entry;\n if (override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\nfunction parseEnvLine(line: string): [string, string] | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_\\-.]*)\\s*=\\s*(.*)$/u);\n if (!match) {\n return null;\n }\n\n const key = match[1];\n if (!key) {\n return null;\n }\n let value = match[2] ?? \"\";\n\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1);\n } else if (value.startsWith(\"'\") && value.endsWith(\"'\") && value.length >= 2) {\n value = value.slice(1, -1);\n } else {\n const commentIndex = value.indexOf(\" #\");\n if (commentIndex >= 0) {\n value = value.slice(0, commentIndex);\n }\n value = value.trim();\n }\n\n return [key, value];\n}\n","import WebSocket, { type RawData } from \"ws\";\n\nimport { createAsyncQueue } from \"../utils/asyncQueue.js\";\n\nexport const OPENAI_BETA_RESPONSES_WEBSOCKETS_V1 = \"responses_websockets=2026-02-04\";\nexport const OPENAI_BETA_RESPONSES_WEBSOCKETS_V2 = \"responses_websockets=2026-02-06\";\n\nexport type ResponsesWebSocketMode = \"auto\" | \"off\" | \"only\";\n\nexport type ResponsesStreamEvent = {\n type?: string;\n [key: string]: unknown;\n};\n\nexport type ResponsesStreamWithFinal<\n TEvent = ResponsesStreamEvent,\n TFinal = unknown,\n> = AsyncIterable<TEvent> & {\n finalResponse: () => Promise<TFinal>;\n close: () => void;\n};\n\nexport class ResponsesWebSocketHttpError extends Error {\n readonly status: number;\n readonly body?: string;\n readonly headers?: Record<string, string>;\n\n constructor(options: {\n status: number;\n message: string;\n body?: string;\n headers?: Record<string, string>;\n }) {\n super(options.message);\n this.name = \"ResponsesWebSocketHttpError\";\n this.status = options.status;\n this.body = options.body;\n this.headers = options.headers;\n }\n}\n\nexport function resolveResponsesWebSocketMode(\n raw: string | undefined,\n fallback: ResponsesWebSocketMode = \"auto\",\n): ResponsesWebSocketMode {\n const value = raw?.trim().toLowerCase();\n if (value === \"auto\" || value === \"off\" || value === \"only\") {\n return value;\n }\n return fallback;\n}\n\nexport function mergeOpenAiBetaHeader(existing: string | undefined, required: string): string {\n const parts = new Set<string>();\n for (const part of (existing ?? \"\").split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.length > 0) {\n parts.add(trimmed);\n }\n }\n const normalizedRequired = required.trim();\n if (normalizedRequired.length > 0) {\n parts.add(normalizedRequired);\n }\n return Array.from(parts).join(\", \");\n}\n\nexport function toWebSocketUrl(httpOrHttpsUrl: string): string {\n const parsed = new URL(httpOrHttpsUrl);\n if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n } else if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(`Unsupported websocket URL protocol: ${parsed.protocol}`);\n }\n return parsed.toString();\n}\n\nexport function isResponsesWebSocketUnsupportedError(error: unknown): boolean {\n if (error instanceof ResponsesWebSocketHttpError) {\n return [400, 404, 405, 406, 426, 501].includes(error.status);\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n return message.includes(\"unexpected server response: 426\");\n}\n\nexport function createAdaptiveResponsesStream<\n TEvent = ResponsesStreamEvent,\n TFinal = unknown,\n>(options: {\n mode: ResponsesWebSocketMode;\n createWebSocketStream: () => Promise<ResponsesStreamWithFinal<TEvent, TFinal>>;\n createFallbackStream: () => ResponsesStreamWithFinal<TEvent, TFinal>;\n onWebSocketFallback?: (error: unknown) => void;\n}): ResponsesStreamWithFinal<TEvent, TFinal> {\n let resolved: Promise<ResponsesStreamWithFinal<TEvent, TFinal>> | null = null;\n let websocketSelected = false;\n let fallbackSelected = false;\n\n const activateFallback = (error: unknown): ResponsesStreamWithFinal<TEvent, TFinal> => {\n options.onWebSocketFallback?.(error);\n fallbackSelected = true;\n websocketSelected = false;\n const fallback = options.createFallbackStream();\n resolved = Promise.resolve(fallback);\n return fallback;\n };\n\n const getStream = async (): Promise<ResponsesStreamWithFinal<TEvent, TFinal>> => {\n if (resolved) {\n return await resolved;\n }\n resolved = (async () => {\n if (options.mode === \"off\") {\n fallbackSelected = true;\n return options.createFallbackStream();\n }\n try {\n const stream = await options.createWebSocketStream();\n websocketSelected = true;\n return stream;\n } catch (error) {\n if (options.mode === \"only\") {\n throw error;\n }\n return activateFallback(error);\n }\n })();\n return await resolved;\n };\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<TEvent> {\n const stream = await getStream();\n let yielded = 0;\n try {\n for await (const event of stream) {\n yielded += 1;\n yield event;\n }\n } catch (error) {\n if (options.mode !== \"only\" && websocketSelected && !fallbackSelected && yielded === 0) {\n const fallback = activateFallback(error);\n for await (const event of fallback) {\n yield event;\n }\n return;\n }\n throw error;\n }\n },\n async finalResponse(): Promise<TFinal> {\n const stream = await getStream();\n try {\n return await stream.finalResponse();\n } catch (error) {\n if (options.mode === \"only\" || !websocketSelected || fallbackSelected) {\n throw error;\n }\n const fallback = activateFallback(error);\n return await fallback.finalResponse();\n }\n },\n close(): void {\n void getStream()\n .then((stream) => stream.close())\n .catch(() => {});\n },\n };\n}\n\ntype ConnectWebSocketResult = {\n socket: WebSocket;\n responseHeaders: Record<string, string>;\n};\n\ntype CreateResponsesWebSocketStreamOptions = {\n url: string;\n headers: Record<string, string>;\n request: unknown;\n signal?: AbortSignal;\n idleTimeoutMs?: number;\n completionEventTypes?: string[];\n};\n\nexport async function createResponsesWebSocketStream(\n options: CreateResponsesWebSocketStreamOptions,\n): Promise<ResponsesStreamWithFinal<ResponsesStreamEvent, Record<string, unknown>>> {\n const completionTypes = new Set(\n options.completionEventTypes ?? [\"response.completed\", \"response.failed\", \"response.done\"],\n );\n const { socket, responseHeaders } = await connectWebSocket({\n url: options.url,\n headers: options.headers,\n signal: options.signal,\n });\n const queue = createAsyncQueue<ResponsesStreamEvent>();\n\n let settled = false;\n let finalResponse: Record<string, unknown> | null = null;\n let latestResponse: Record<string, unknown> | null = null;\n let idleTimer: NodeJS.Timeout | null = null;\n let resolveFinal: ((response: Record<string, unknown>) => void) | null = null;\n let rejectFinal: ((error: Error) => void) | null = null;\n\n const finalPromise = new Promise<Record<string, unknown>>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n void finalPromise.catch(() => {});\n\n const clearIdleTimer = () => {\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n };\n\n const closeSocket = () => {\n try {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close();\n }\n } catch {\n // Ignore close failures.\n }\n };\n\n const complete = (response: Record<string, unknown>) => {\n if (settled) {\n return;\n }\n settled = true;\n clearIdleTimer();\n finalResponse = response;\n resolveFinal?.(response);\n queue.close();\n closeSocket();\n };\n\n const fail = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearIdleTimer();\n rejectFinal?.(error);\n queue.fail(error);\n closeSocket();\n };\n\n const restartIdleTimer = () => {\n clearIdleTimer();\n const idleTimeoutMs = options.idleTimeoutMs;\n if (!idleTimeoutMs || idleTimeoutMs <= 0 || settled) {\n return;\n }\n idleTimer = setTimeout(() => {\n fail(new Error(`Responses WebSocket idle timeout after ${idleTimeoutMs}ms.`));\n }, idleTimeoutMs);\n };\n\n const onAbort = () => {\n const error = createAbortError(options.signal?.reason);\n fail(error);\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n socket.close();\n throw createAbortError(options.signal.reason);\n }\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const cleanup = () => {\n clearIdleTimer();\n socket.removeAllListeners();\n if (options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n socket.on(\"message\", (raw: RawData) => {\n restartIdleTimer();\n const parsed = parseWebSocketPayload(raw);\n if (!parsed) {\n return;\n }\n const error = mapWebSocketErrorEvent(parsed);\n if (error) {\n fail(error);\n return;\n }\n\n const event = parsed as ResponsesStreamEvent;\n if (isObjectWithResponse(event)) {\n latestResponse = event.response;\n }\n\n queue.push(event);\n\n const type = typeof event.type === \"string\" ? event.type : \"\";\n if (completionTypes.has(type)) {\n const completedResponse = normalizeFinalResponse(\n type,\n event.response,\n latestResponse,\n responseHeaders,\n );\n complete(completedResponse);\n }\n });\n\n socket.on(\"error\", (error: Error) => {\n fail(new Error(`Responses WebSocket error: ${error.message}`));\n });\n\n socket.on(\"close\", (_code: number, _reason: Buffer) => {\n if (settled) {\n cleanup();\n return;\n }\n fail(new Error(\"Responses WebSocket closed before completion.\"));\n cleanup();\n });\n\n restartIdleTimer();\n\n const payload = serializeRequestPayload(options.request);\n await new Promise<void>((resolve, reject) => {\n socket.send(payload, (error?: Error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n }).catch((error: unknown) => {\n fail(new Error(`Failed to send Responses WebSocket request: ${errorToMessage(error)}`));\n throw error instanceof Error ? error : new Error(errorToMessage(error));\n });\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<ResponsesStreamEvent> {\n try {\n for await (const event of queue.iterable) {\n yield event;\n }\n } finally {\n if (!settled) {\n closeSocket();\n }\n }\n },\n async finalResponse(): Promise<Record<string, unknown>> {\n return await finalPromise;\n },\n close(): void {\n if (settled) {\n return;\n }\n const response = finalResponse ?? latestResponse ?? { status: \"cancelled\" };\n complete(response);\n cleanup();\n },\n };\n}\n\nasync function connectWebSocket(options: {\n url: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}): Promise<ConnectWebSocketResult> {\n return await new Promise<ConnectWebSocketResult>((resolve, reject) => {\n const socket = new WebSocket(options.url, {\n headers: options.headers,\n handshakeTimeout: 30_000,\n });\n\n let settled = false;\n let responseBody = \"\";\n\n const rejectOnce = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n try {\n socket.terminate();\n } catch {\n // Ignore terminate failures.\n }\n reject(error);\n };\n\n const resolveOnce = (result: ConnectWebSocketResult) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup(false);\n resolve(result);\n };\n\n const onAbort = () => {\n rejectOnce(createAbortError(options.signal?.reason));\n };\n\n const cleanup = (removeAbortListener = true) => {\n socket.removeListener(\"open\", onOpen);\n socket.removeListener(\"error\", onError);\n socket.removeListener(\"unexpected-response\", onUnexpectedResponse);\n if (removeAbortListener && options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n const onOpen = () => {\n const headers = normalizeUpgradeHeaders(socket);\n resolveOnce({ socket, responseHeaders: headers });\n };\n\n const onError = (error: Error) => {\n rejectOnce(new Error(`Responses WebSocket connection failed: ${error.message}`));\n };\n\n const onUnexpectedResponse = (\n _request: unknown,\n response: NodeJS.ReadableStream & {\n statusCode?: number;\n headers?: Record<string, string | string[] | undefined>;\n setEncoding?: (encoding: BufferEncoding) => void;\n },\n ) => {\n if (typeof response.setEncoding === \"function\") {\n response.setEncoding(\"utf8\");\n }\n response.on(\"data\", (chunk) => {\n responseBody += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n });\n response.on(\"end\", () => {\n const status = Number(response.statusCode ?? 0);\n const headers: Record<string, string> = {};\n const rawHeaders = response.headers ?? {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (typeof value === \"string\") {\n headers[key] = value;\n } else if (Array.isArray(value)) {\n headers[key] = value.join(\", \");\n }\n }\n rejectOnce(\n new ResponsesWebSocketHttpError({\n status: Number.isFinite(status) && status > 0 ? status : 500,\n message: `Responses WebSocket upgrade failed${status ? ` (${status})` : \"\"}.`,\n body: responseBody || undefined,\n headers,\n }),\n );\n });\n response.on(\"error\", (error: Error) => {\n rejectOnce(\n new ResponsesWebSocketHttpError({\n status: Number(response.statusCode ?? 500),\n message: `Responses WebSocket upgrade failed: ${error.message}`,\n body: responseBody || undefined,\n }),\n );\n });\n };\n\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n socket.once(\"unexpected-response\", onUnexpectedResponse);\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n return;\n }\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n\nfunction normalizeUpgradeHeaders(socket: WebSocket): Record<string, string> {\n const maybeUpgradeResponse = (\n socket as WebSocket & {\n _socket?: unknown;\n _req?: { res?: { headers?: Record<string, string | string[] | undefined> } };\n }\n )._req?.res;\n const raw = maybeUpgradeResponse?.headers ?? {};\n const normalized: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value === \"string\") {\n normalized[key.toLowerCase()] = value;\n } else if (Array.isArray(value)) {\n normalized[key.toLowerCase()] = value.join(\", \");\n }\n }\n return normalized;\n}\n\nfunction parseWebSocketPayload(raw: RawData): Record<string, unknown> | null {\n const text = toUtf8(raw);\n if (!text) {\n return null;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction toUtf8(raw: RawData): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n if (raw instanceof ArrayBuffer) {\n return Buffer.from(raw).toString(\"utf8\");\n }\n if (Array.isArray(raw)) {\n const chunks = raw.map((chunk) => {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk, \"utf8\");\n }\n return Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n });\n return Buffer.concat(chunks).toString(\"utf8\");\n }\n return Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : Buffer.from(raw).toString(\"utf8\");\n}\n\nfunction mapWebSocketErrorEvent(payload: Record<string, unknown>): Error | null {\n if (payload.type !== \"error\") {\n return null;\n }\n\n const status = resolveNumericStatus(payload.status) ?? resolveNumericStatus(payload.status_code);\n if (!status || status < 400) {\n const message = errorToMessage(payload.error) || \"Responses WebSocket returned an error event.\";\n return new Error(message);\n }\n\n const headers = mapErrorHeaders(payload.headers);\n const body =\n payload.error && typeof payload.error === \"object\"\n ? JSON.stringify({ error: payload.error }, null, 2)\n : undefined;\n\n return new ResponsesWebSocketHttpError({\n status,\n message: `Responses WebSocket returned status ${status}.`,\n body,\n headers,\n });\n}\n\nfunction mapErrorHeaders(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const headers: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\") {\n headers[key.toLowerCase()] = String(entry);\n }\n }\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveNumericStatus(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.floor(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return Math.floor(parsed);\n }\n }\n return null;\n}\n\nfunction normalizeFinalResponse(\n eventType: string,\n eventResponse: unknown,\n latestResponse: Record<string, unknown> | null,\n responseHeaders: Record<string, string>,\n): Record<string, unknown> {\n const response =\n eventResponse && typeof eventResponse === \"object\"\n ? ({ ...(eventResponse as Record<string, unknown>) } as Record<string, unknown>)\n : latestResponse\n ? { ...latestResponse }\n : {};\n\n if (typeof response.status !== \"string\") {\n if (eventType === \"response.failed\") {\n response.status = \"failed\";\n } else if (eventType === \"response.done\") {\n response.status = \"completed\";\n } else if (eventType === \"response.completed\") {\n response.status = \"completed\";\n }\n }\n\n const upgradeModel = responseHeaders[\"openai-model\"];\n if (typeof response.model !== \"string\" && upgradeModel) {\n response.model = upgradeModel;\n }\n\n return response;\n}\n\nfunction serializeRequestPayload(request: unknown): string {\n if (!request || typeof request !== \"object\" || Array.isArray(request)) {\n throw new Error(\"Responses WebSocket request must be a JSON object.\");\n }\n const body = request as Record<string, unknown>;\n const payload = typeof body.type === \"string\" ? body : { type: \"response.create\", ...body };\n return JSON.stringify(payload);\n}\n\nfunction isObjectWithResponse(event: ResponsesStreamEvent): event is ResponsesStreamEvent & {\n response: Record<string, unknown>;\n} {\n return Boolean(event.response && typeof event.response === \"object\");\n}\n\nfunction errorToMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction createAbortError(reason: unknown): Error {\n const error = new Error(\n reason instanceof Error\n ? reason.message\n : typeof reason === \"string\"\n ? reason\n : \"Request aborted.\",\n );\n error.name = \"AbortError\";\n return error;\n}\n","export type CallSchedulerRetryPolicy = {\n readonly maxAttempts: number;\n /**\n * Return `null` to stop retrying and surface the original error.\n * `attempt` is 1-based and indicates the attempt that just failed.\n */\n readonly getDelayMs: (attempt: number, error: unknown) => number | null;\n};\n\nexport type CallSchedulerOptions = {\n readonly maxParallelRequests?: number;\n readonly minIntervalBetweenStartMs?: number;\n readonly startJitterMs?: number;\n readonly retry?: CallSchedulerRetryPolicy;\n};\n\nexport type CallScheduler = {\n run: <T>(fn: () => Promise<T>) => Promise<T>;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n if (typeof value === \"string\") {\n return new Error(value);\n }\n return new Error(\"Unknown error\");\n}\n\nexport function createCallScheduler(options: CallSchedulerOptions = {}): CallScheduler {\n const maxParallelRequests = Math.max(1, Math.floor(options.maxParallelRequests ?? 3));\n const minIntervalBetweenStartMs = Math.max(0, Math.floor(options.minIntervalBetweenStartMs ?? 0));\n const startJitterMs = Math.max(0, Math.floor(options.startJitterMs ?? 0));\n const retryPolicy = options.retry;\n\n let activeCount = 0;\n let lastStartTime = 0;\n\n // Serializes start-spacing to avoid concurrent jobs racing on lastStartTime.\n let startSpacingChain: Promise<void> = Promise.resolve();\n\n type QueueJob = () => Promise<void>;\n const queue: QueueJob[] = [];\n\n async function applyStartSpacing(): Promise<void> {\n const previous = startSpacingChain;\n let release: (() => void) | undefined;\n startSpacingChain = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n if (lastStartTime > 0 && minIntervalBetweenStartMs > 0) {\n const earliestNext = lastStartTime + minIntervalBetweenStartMs;\n const wait = Math.max(0, earliestNext - Date.now());\n if (wait > 0) {\n await sleep(wait);\n }\n }\n if (startJitterMs > 0) {\n await sleep(Math.floor(Math.random() * (startJitterMs + 1)));\n }\n lastStartTime = Date.now();\n } finally {\n release?.();\n }\n }\n\n async function attemptWithRetries<T>(fn: () => Promise<T>, attempt: number): Promise<T> {\n try {\n await applyStartSpacing();\n return await fn();\n } catch (error: unknown) {\n const err = toError(error);\n if (!retryPolicy || attempt >= retryPolicy.maxAttempts) {\n throw err;\n }\n let delay = retryPolicy.getDelayMs(attempt, error);\n if (delay === null) {\n throw err;\n }\n if (!Number.isFinite(delay)) {\n delay = 0;\n }\n const normalizedDelay = Math.max(0, delay);\n if (normalizedDelay > 0) {\n await sleep(normalizedDelay);\n }\n return attemptWithRetries(fn, attempt + 1);\n }\n }\n\n function drainQueue(): void {\n while (activeCount < maxParallelRequests && queue.length > 0) {\n const task = queue.shift();\n if (!task) {\n continue;\n }\n activeCount += 1;\n void task();\n }\n }\n\n function run<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const job: QueueJob = async () => {\n try {\n const result = await attemptWithRetries(fn, 1);\n resolve(result);\n } catch (error: unknown) {\n reject(toError(error));\n } finally {\n activeCount -= 1;\n queueMicrotask(drainQueue);\n }\n };\n queue.push(job);\n drainQueue();\n });\n }\n\n return { run };\n}\n","import OpenAI from \"openai\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nconst DEFAULT_FIREWORKS_BASE_URL = \"https://api.fireworks.ai/inference/v1\";\nconst DEFAULT_FIREWORKS_TIMEOUT_MS = 15 * 60_000;\n\nlet cachedClient: OpenAI | null = null;\nlet cachedFetch: typeof fetch | null = null;\nlet cachedBaseUrl: string | null = null;\nlet cachedApiKey: string | null = null;\nlet cachedTimeoutMs: number | null = null;\n\nfunction resolveTimeoutMs(): number {\n if (cachedTimeoutMs !== null) {\n return cachedTimeoutMs;\n }\n\n const raw = process.env.FIREWORKS_TIMEOUT_MS;\n const parsed = raw ? Number(raw) : Number.NaN;\n cachedTimeoutMs = Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_FIREWORKS_TIMEOUT_MS;\n return cachedTimeoutMs;\n}\n\nfunction resolveBaseUrl(): string {\n if (cachedBaseUrl !== null) {\n return cachedBaseUrl;\n }\n\n loadLocalEnv();\n const raw = process.env.FIREWORKS_BASE_URL?.trim();\n cachedBaseUrl = raw && raw.length > 0 ? raw : DEFAULT_FIREWORKS_BASE_URL;\n return cachedBaseUrl;\n}\n\nfunction resolveApiKey(): string {\n if (cachedApiKey !== null) {\n return cachedApiKey;\n }\n\n loadLocalEnv();\n const raw = process.env.FIREWORKS_TOKEN ?? process.env.FIREWORKS_API_KEY;\n const token = raw?.trim();\n if (!token) {\n throw new Error(\n \"FIREWORKS_TOKEN (or FIREWORKS_API_KEY) must be provided to access Fireworks APIs.\",\n );\n }\n\n cachedApiKey = token;\n return cachedApiKey;\n}\n\nfunction getFireworksFetch(): typeof fetch {\n if (cachedFetch) {\n return cachedFetch;\n }\n\n const timeoutMs = resolveTimeoutMs();\n const dispatcher = new Agent({\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n });\n cachedFetch = ((input: any, init?: any) => {\n return undiciFetch(input, {\n ...(init ?? {}),\n dispatcher,\n });\n }) as typeof fetch;\n\n return cachedFetch;\n}\n\nexport function getFireworksClient(): OpenAI {\n if (cachedClient) {\n return cachedClient;\n }\n\n cachedClient = new OpenAI({\n apiKey: resolveApiKey(),\n baseURL: resolveBaseUrl(),\n timeout: resolveTimeoutMs(),\n fetch: getFireworksFetch(),\n });\n return cachedClient;\n}\n","import type OpenAI from \"openai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getFireworksClient } from \"./client.js\";\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n});\n\nexport async function runFireworksCall<T>(fn: (client: OpenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(getFireworksClient()));\n}\n","export const FIREWORKS_MODEL_IDS = [\"kimi-k2.5\", \"glm-5\", \"minimax-m2.1\", \"gpt-oss-120b\"] as const;\n\nexport type FireworksModelId = (typeof FIREWORKS_MODEL_IDS)[number];\n\nexport const FIREWORKS_DEFAULT_KIMI_MODEL: FireworksModelId = \"kimi-k2.5\";\nexport const FIREWORKS_DEFAULT_GLM_MODEL: FireworksModelId = \"glm-5\";\nexport const FIREWORKS_DEFAULT_MINIMAX_MODEL: FireworksModelId = \"minimax-m2.1\";\nexport const FIREWORKS_DEFAULT_GPT_OSS_120B_MODEL: FireworksModelId = \"gpt-oss-120b\";\n\nconst FIREWORKS_CANONICAL_MODEL_IDS: Record<FireworksModelId, string> = {\n \"kimi-k2.5\": \"accounts/fireworks/models/kimi-k2p5\",\n \"glm-5\": \"accounts/fireworks/models/glm-5\",\n \"minimax-m2.1\": \"accounts/fireworks/models/minimax-m2p1\",\n \"gpt-oss-120b\": \"accounts/fireworks/models/gpt-oss-120b\",\n};\n\nexport function isFireworksModelId(value: string): value is FireworksModelId {\n return (FIREWORKS_MODEL_IDS as readonly string[]).includes(value.trim());\n}\n\nexport function resolveFireworksModelId(model: string): string | undefined {\n const trimmed = model.trim();\n if (!isFireworksModelId(trimmed)) {\n return undefined;\n }\n return FIREWORKS_CANONICAL_MODEL_IDS[trimmed];\n}\n","import { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\n\nimport { getGoogleAuthOptions, getGoogleServiceAccount } from \"./auth.js\";\n\nexport const GEMINI_MODEL_IDS = [\n \"gemini-3-pro-preview\",\n \"gemini-3.1-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-flash-latest\",\n \"gemini-flash-lite-latest\",\n] as const;\n\nexport type GeminiModelId = (typeof GEMINI_MODEL_IDS)[number];\n\nexport function isGeminiModelId(value: string): value is GeminiModelId {\n return (GEMINI_MODEL_IDS as readonly string[]).includes(value);\n}\n\nconst CLOUD_PLATFORM_SCOPE = \"https://www.googleapis.com/auth/cloud-platform\";\nconst DEFAULT_VERTEX_LOCATION = \"global\";\n\nexport type GeminiConfiguration = {\n readonly projectId?: string;\n readonly location?: string;\n};\n\nlet geminiConfiguration: GeminiConfiguration = {};\nlet clientPromise: Promise<GoogleGenAI> | undefined;\n\nfunction normaliseConfigValue(value?: string | null): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function configureGemini(options: GeminiConfiguration = {}): void {\n const nextProjectId = normaliseConfigValue(options.projectId);\n const nextLocation = normaliseConfigValue(options.location);\n geminiConfiguration = {\n projectId: nextProjectId !== undefined ? nextProjectId : geminiConfiguration.projectId,\n location: nextLocation !== undefined ? nextLocation : geminiConfiguration.location,\n };\n clientPromise = undefined;\n}\n\nfunction resolveProjectId(): string {\n const override = geminiConfiguration.projectId;\n if (override) {\n return override;\n }\n const serviceAccount = getGoogleServiceAccount();\n return serviceAccount.projectId;\n}\n\nfunction resolveLocation(): string {\n const override = geminiConfiguration.location;\n if (override) {\n return override;\n }\n return DEFAULT_VERTEX_LOCATION;\n}\n\nexport async function getGeminiClient(): Promise<GoogleGenAI> {\n if (!clientPromise) {\n clientPromise = Promise.resolve().then(() => {\n const projectId = resolveProjectId();\n const location = resolveLocation();\n const googleAuthOptions = getGoogleAuthOptions(CLOUD_PLATFORM_SCOPE);\n return new GoogleGenAI({\n vertexai: true,\n project: projectId,\n location,\n googleAuthOptions: googleAuthOptions as GoogleGenAIOptions[\"googleAuthOptions\"],\n });\n });\n }\n return clientPromise;\n}\n","import { GoogleAuth, type AnyAuthClient, type GoogleAuthOptions } from \"google-auth-library\";\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nexport type GoogleServiceAccount = {\n projectId: string;\n clientEmail: string;\n privateKey: string;\n tokenUri?: string;\n};\n\nconst ServiceAccountSchema = z\n .object({\n project_id: z.string().min(1),\n client_email: z.email(),\n private_key: z.string().min(1),\n token_uri: z.string().optional(),\n })\n .transform(({ project_id, client_email, private_key, token_uri }) => ({\n projectId: project_id,\n clientEmail: client_email,\n privateKey: private_key.replace(/\\\\n/g, \"\\n\"),\n tokenUri: token_uri,\n }));\n\nlet cachedServiceAccount: GoogleServiceAccount | null = null;\nconst authClientCache = new Map<string, GoogleAuth<AnyAuthClient>>();\n\nexport function parseGoogleServiceAccount(input: string): GoogleServiceAccount {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid Google service account JSON: ${(error as Error).message}`);\n }\n return ServiceAccountSchema.parse(parsed);\n}\n\nexport function getGoogleServiceAccount(): GoogleServiceAccount {\n if (cachedServiceAccount) {\n return cachedServiceAccount;\n }\n\n loadLocalEnv();\n\n const raw = process.env.GOOGLE_SERVICE_ACCOUNT_JSON;\n if (!raw || raw.trim().length === 0) {\n throw new Error(\"GOOGLE_SERVICE_ACCOUNT_JSON must be provided for Google APIs access.\");\n }\n\n cachedServiceAccount = parseGoogleServiceAccount(raw);\n return cachedServiceAccount;\n}\n\nfunction normaliseScopes(scopes?: string | readonly string[]): string[] | undefined {\n if (!scopes) {\n return undefined;\n }\n if (typeof scopes === \"string\") {\n return [scopes];\n }\n if (scopes.length === 0) {\n return undefined;\n }\n return Array.from(new Set(scopes)).sort();\n}\n\nexport function getGoogleAuthOptions(\n scopes?: string | readonly string[],\n): GoogleAuthOptions<AnyAuthClient> {\n const serviceAccount = getGoogleServiceAccount();\n const normalisedScopes = normaliseScopes(scopes);\n const options: GoogleAuthOptions<AnyAuthClient> = {\n credentials: {\n client_email: serviceAccount.clientEmail,\n private_key: serviceAccount.privateKey,\n },\n projectId: serviceAccount.projectId,\n scopes: normalisedScopes,\n };\n return options;\n}\n\nexport function getGoogleAuth(scopes?: string | readonly string[]): GoogleAuth<AnyAuthClient> {\n const normalised = normaliseScopes(scopes);\n const key = (normalised ?? []).join(\" \");\n const cached = authClientCache.get(key);\n if (cached) {\n return cached;\n }\n const auth = new GoogleAuth(getGoogleAuthOptions(normalised));\n authClientCache.set(key, auth);\n return auth;\n}\n\nexport async function getGoogleAccessToken(scopes?: string | readonly string[]): Promise<string> {\n const auth = getGoogleAuth(scopes);\n const token = await auth.getAccessToken();\n if (!token) {\n throw new Error(\"GoogleAuth returned an empty access token.\");\n }\n return token;\n}\n","import type { GoogleGenAI } from \"@google/genai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getGeminiClient } from \"./client.js\";\n\nconst RETRYABLE_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst RETRYABLE_ERROR_CODES = new Set([\"ECONNRESET\", \"ETIMEDOUT\", \"EAI_AGAIN\"]);\nconst RATE_LIMIT_REASONS = new Set([\"RATE_LIMIT_EXCEEDED\", \"RESOURCE_EXHAUSTED\", \"QUOTA_EXCEEDED\"]);\n\nfunction getStatus(error: unknown): number | undefined {\n const maybe = error as {\n status?: unknown;\n statusCode?: unknown;\n code?: unknown;\n response?: { status?: unknown };\n };\n const candidates = [maybe?.status, maybe?.statusCode, maybe?.response?.status];\n for (const value of candidates) {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n }\n if (typeof maybe?.code === \"number\") {\n return maybe.code;\n }\n return undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const maybe = error as { code?: unknown; cause?: unknown };\n if (typeof maybe.code === \"string\") {\n return maybe.code;\n }\n if (maybe.cause && typeof maybe.cause === \"object\") {\n const causeCode = (maybe.cause as { code?: unknown }).code;\n if (typeof causeCode === \"string\") {\n return causeCode;\n }\n }\n return undefined;\n}\n\nfunction getErrorReason(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const details = (error as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(details) && details.length > 0) {\n const reason = (details[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nestedDetails = (cause as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(nestedDetails) && nestedDetails.length > 0) {\n const reason = (nestedDetails[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"\";\n}\n\nfunction parseRetryInfo(details: unknown): number | undefined {\n if (Array.isArray(details)) {\n for (const entry of details) {\n const ms = parseRetryInfo(entry);\n if (ms !== undefined) {\n return ms;\n }\n }\n return undefined;\n }\n if (!details || typeof details !== \"object\") {\n return undefined;\n }\n const retryDelay = (details as { retryDelay?: unknown }).retryDelay as\n | { seconds?: unknown; nanos?: unknown }\n | undefined;\n if (retryDelay) {\n const secondsRaw = retryDelay.seconds;\n const nanosRaw = retryDelay.nanos;\n const seconds =\n typeof secondsRaw === \"number\"\n ? secondsRaw\n : typeof secondsRaw === \"string\"\n ? Number.parseFloat(secondsRaw)\n : 0;\n const nanos =\n typeof nanosRaw === \"number\"\n ? nanosRaw\n : typeof nanosRaw === \"string\"\n ? Number.parseInt(nanosRaw, 10)\n : 0;\n if (Number.isFinite(seconds) || Number.isFinite(nanos)) {\n const totalMs = seconds * 1000 + nanos / 1_000_000;\n if (totalMs > 0) {\n return totalMs;\n }\n }\n }\n const nestedDetails = (details as { details?: unknown }).details;\n if (nestedDetails) {\n const nested = parseRetryInfo(nestedDetails);\n if (nested !== undefined) {\n return nested;\n }\n }\n return undefined;\n}\n\nfunction parseRetryAfterFromMessage(message: string): number | undefined {\n const trimmed = message.trim();\n if (!trimmed) {\n return undefined;\n }\n const regex = /retry in\\\\s+([0-9]+(?:\\\\.[0-9]+)?)\\\\s*(s|sec|secs|seconds?)/iu;\n const match = regex.exec(trimmed);\n if (match?.[1]) {\n const value = Number.parseFloat(match[1]);\n if (Number.isFinite(value) && value > 0) {\n return value * 1000;\n }\n }\n return undefined;\n}\n\nfunction getRetryAfterMs(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n\n const infoFromDetails = parseRetryInfo((error as { errorDetails?: unknown }).errorDetails);\n if (infoFromDetails !== undefined) {\n return infoFromDetails;\n }\n\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nested = getRetryAfterMs(cause);\n if (nested !== undefined) {\n return nested;\n }\n }\n\n const message = getErrorMessage(error);\n if (message) {\n const fromMessage = parseRetryAfterFromMessage(message.toLowerCase());\n if (fromMessage !== undefined) {\n return fromMessage;\n }\n }\n\n return undefined;\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const status = getStatus(error);\n if (status && RETRYABLE_STATUSES.has(status)) {\n return true;\n }\n\n const reason = getErrorReason(error);\n if (reason && RATE_LIMIT_REASONS.has(reason)) {\n return true;\n }\n\n const code = getErrorCode(error);\n if (code && RETRYABLE_ERROR_CODES.has(code)) {\n return true;\n }\n\n const message = getErrorMessage(error).toLowerCase();\n if (message.includes(\"rate limit\") || message.includes(\"temporarily unavailable\")) {\n return true;\n }\n if (message.includes(\"fetch failed\") || message.includes(\"socket hang up\")) {\n return true;\n }\n if (message.includes(\"quota\") || message.includes(\"insufficient\")) {\n return false;\n }\n if (message.includes(\"timeout\") || message.includes(\"network\")) {\n return true;\n }\n return false;\n}\n\nfunction retryDelayMs(attempt: number): number {\n const baseRetryDelayMs = 500;\n const maxRetryDelayMs = 4000;\n const base = Math.min(maxRetryDelayMs, baseRetryDelayMs * 2 ** (attempt - 1));\n const jitter = Math.floor(Math.random() * 200);\n return base + jitter;\n}\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n retry: {\n maxAttempts: 3,\n getDelayMs: (attempt, error) => {\n if (!shouldRetry(error)) {\n return null;\n }\n const hintedDelay = getRetryAfterMs(error);\n return hintedDelay ?? retryDelayMs(attempt);\n },\n },\n});\n\nexport async function runGeminiCall<T>(fn: (client: GoogleGenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(await getGeminiClient()));\n}\n","import OpenAI from \"openai\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nimport {\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n createAdaptiveResponsesStream,\n createResponsesWebSocketStream,\n isResponsesWebSocketUnsupportedError,\n mergeOpenAiBetaHeader,\n resolveResponsesWebSocketMode,\n toWebSocketUrl,\n type ResponsesStreamWithFinal,\n} from \"./responses-websocket.js\";\n\nlet cachedApiKey: string | null = null;\nlet cachedClient: OpenAI | null = null;\nlet cachedFetch: typeof fetch | null = null;\nlet cachedTimeoutMs: number | null = null;\nlet openAiResponsesWebSocketMode: \"auto\" | \"off\" | \"only\" | null = null;\nlet openAiResponsesWebSocketDisabled = false;\n\nconst DEFAULT_OPENAI_TIMEOUT_MS = 15 * 60_000;\n\nfunction resolveOpenAiTimeoutMs(): number {\n if (cachedTimeoutMs !== null) {\n return cachedTimeoutMs;\n }\n\n const raw = process.env.OPENAI_STREAM_TIMEOUT_MS ?? process.env.OPENAI_TIMEOUT_MS;\n const parsed = raw ? Number(raw) : Number.NaN;\n cachedTimeoutMs = Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_OPENAI_TIMEOUT_MS;\n return cachedTimeoutMs;\n}\n\nfunction getOpenAiFetch(): typeof fetch {\n if (cachedFetch) {\n return cachedFetch;\n }\n\n const timeoutMs = resolveOpenAiTimeoutMs();\n const dispatcher = new Agent({\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n });\n cachedFetch = ((input: any, init?: any) => {\n return undiciFetch(input, {\n ...(init ?? {}),\n dispatcher,\n });\n }) as typeof fetch;\n\n return cachedFetch;\n}\n\nfunction resolveOpenAiBaseUrl(): string {\n loadLocalEnv();\n return process.env.OPENAI_BASE_URL?.trim() || \"https://api.openai.com/v1\";\n}\n\nfunction resolveOpenAiResponsesWebSocketMode(): \"auto\" | \"off\" | \"only\" {\n if (openAiResponsesWebSocketMode) {\n return openAiResponsesWebSocketMode;\n }\n loadLocalEnv();\n openAiResponsesWebSocketMode = resolveResponsesWebSocketMode(\n process.env.OPENAI_RESPONSES_WEBSOCKET_MODE,\n \"auto\",\n );\n return openAiResponsesWebSocketMode;\n}\n\nfunction wrapFallbackStream<TEvent = unknown, TFinal = unknown>(\n stream: AsyncIterable<TEvent> & { finalResponse: () => Promise<TFinal> },\n): ResponsesStreamWithFinal<TEvent, TFinal> {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<TEvent> {\n for await (const event of stream) {\n yield event;\n }\n },\n async finalResponse(): Promise<TFinal> {\n return await stream.finalResponse();\n },\n close(): void {\n const maybeClose = stream as { close?: () => void };\n if (typeof maybeClose.close === \"function\") {\n maybeClose.close();\n }\n },\n };\n}\n\nfunction buildOpenAiResponsesEndpointUrl(): string {\n const base = resolveOpenAiBaseUrl();\n const normalized = base.endsWith(\"/\") ? base : `${base}/`;\n return new URL(\"responses\", normalized).toString();\n}\n\nfunction buildOpenAiResponsesWebSocketHeaders(apiKey: string): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n \"OpenAI-Beta\": mergeOpenAiBetaHeader(\n process.env.OPENAI_BETA,\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n ),\n };\n const organization = process.env.OPENAI_ORGANIZATION?.trim();\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n const project = process.env.OPENAI_PROJECT?.trim();\n if (project) {\n headers[\"OpenAI-Project\"] = project;\n }\n return headers;\n}\n\nfunction installResponsesWebSocketTransport(client: OpenAI, apiKey: string): void {\n const responsesApi = client.responses as {\n stream?: (\n request: unknown,\n options?: unknown,\n ) => AsyncIterable<unknown> & {\n finalResponse: () => Promise<unknown>;\n };\n };\n const streamMethod = responsesApi?.stream;\n if (typeof streamMethod !== \"function\") {\n return;\n }\n\n const originalStream = streamMethod.bind(client.responses);\n responsesApi.stream = (request: unknown, options?: unknown) => {\n const mode = resolveOpenAiResponsesWebSocketMode();\n const fallbackStreamFactory = (): ResponsesStreamWithFinal =>\n wrapFallbackStream(originalStream(request, options) as any);\n\n if (mode === \"off\" || openAiResponsesWebSocketDisabled) {\n return fallbackStreamFactory() as any;\n }\n\n const signal =\n options && typeof options === \"object\"\n ? ((options as { signal?: AbortSignal }).signal ?? undefined)\n : undefined;\n const websocketUrl = toWebSocketUrl(buildOpenAiResponsesEndpointUrl());\n const headers = buildOpenAiResponsesWebSocketHeaders(apiKey);\n const timeoutMs = resolveOpenAiTimeoutMs();\n\n return createAdaptiveResponsesStream({\n mode,\n createWebSocketStream: async () =>\n await createResponsesWebSocketStream({\n url: websocketUrl,\n headers,\n request,\n signal,\n idleTimeoutMs: timeoutMs,\n }),\n createFallbackStream: fallbackStreamFactory,\n onWebSocketFallback: (error) => {\n if (isResponsesWebSocketUnsupportedError(error)) {\n openAiResponsesWebSocketDisabled = true;\n }\n },\n }) as any;\n };\n}\n\nfunction getOpenAiApiKey(): string {\n if (cachedApiKey !== null) {\n return cachedApiKey;\n }\n\n loadLocalEnv();\n\n const raw = process.env.OPENAI_API_KEY;\n const value = raw?.trim();\n if (!value) {\n throw new Error(\"OPENAI_API_KEY must be provided to access OpenAI APIs.\");\n }\n\n cachedApiKey = value;\n return cachedApiKey;\n}\n\nexport function getOpenAiClient(): OpenAI {\n if (cachedClient) {\n return cachedClient;\n }\n\n loadLocalEnv();\n const apiKey = getOpenAiApiKey();\n const timeoutMs = resolveOpenAiTimeoutMs();\n cachedClient = new OpenAI({\n apiKey,\n fetch: getOpenAiFetch(),\n timeout: timeoutMs,\n });\n installResponsesWebSocketTransport(cachedClient, apiKey);\n return cachedClient;\n}\n","import type OpenAI from \"openai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getOpenAiClient } from \"./client.js\";\n\nexport type OpenAiReasoningEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\";\nexport const DEFAULT_OPENAI_REASONING_EFFORT: OpenAiReasoningEffort = \"medium\";\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n});\n\nexport async function runOpenAiCall<T>(fn: (client: OpenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(getOpenAiClient()));\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n customTool,\n type LlmCustomTool,\n type LlmFunctionTool,\n type LlmToolSet,\n tool,\n} from \"../llm.js\";\nimport {\n applyPatch,\n CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION,\n CODEX_APPLY_PATCH_LARK_GRAMMAR,\n CODEX_APPLY_PATCH_INPUT_DESCRIPTION,\n} from \"./applyPatch.js\";\nimport {\n createNodeAgentFilesystem,\n type AgentDirectoryEntry,\n type AgentFilesystem,\n} from \"./filesystem.js\";\n\nconst DEFAULT_READ_FILE_LINE_LIMIT = 2000;\nconst DEFAULT_READ_FILES_LINE_LIMIT = 200;\nconst DEFAULT_READ_FILES_CHAR_LIMIT = 4000;\nconst DEFAULT_LIST_DIR_LIMIT = 25;\nconst DEFAULT_LIST_DIR_DEPTH = 2;\nconst DEFAULT_GREP_LIMIT = 100;\nconst MAX_GREP_LIMIT = 2000;\nconst DEFAULT_MAX_LINE_LENGTH = 500;\nconst DEFAULT_GREP_MAX_SCANNED_FILES = 20_000;\nconst DEFAULT_TAB_WIDTH = 4;\n\ntype CodexReadMode = \"slice\" | \"indentation\";\n\ntype ReadLineRecord = {\n readonly number: number;\n readonly raw: string;\n readonly display: string;\n readonly indent: number;\n};\n\ntype ListEntryRecord = {\n readonly name: string;\n readonly displayName: string;\n readonly depth: number;\n readonly kind: AgentDirectoryEntry[\"kind\"];\n};\n\ntype GrepMatchRecord = {\n readonly filePath: string;\n readonly mtimeMs: number;\n readonly lineNumber?: number;\n readonly line?: string;\n};\n\nexport type AgentFilesystemToolProfile = \"auto\" | \"model-agnostic\" | \"codex\" | \"gemini\";\n\nexport type AgentFilesystemToolName =\n | \"apply_patch\"\n | \"read_file\"\n | \"read_files\"\n | \"write_file\"\n | \"replace\"\n | \"list_dir\"\n | \"list_directory\"\n | \"grep_files\"\n | \"rg_search\"\n | \"grep_search\"\n | \"glob\";\n\nexport type AgentFilesystemToolAction = \"read\" | \"write\" | \"delete\" | \"move\" | \"list\" | \"search\";\n\nexport type AgentFilesystemToolAccessContext = {\n readonly cwd: string;\n readonly tool: AgentFilesystemToolName;\n readonly action: AgentFilesystemToolAction;\n readonly path: string;\n readonly fromPath?: string;\n readonly toPath?: string;\n readonly pattern?: string;\n readonly include?: string;\n};\n\nexport type AgentFilesystemToolAccessHook = (\n context: AgentFilesystemToolAccessContext,\n) => Promise<void> | void;\n\nexport type AgentFilesystemToolsOptions = {\n readonly cwd?: string;\n readonly fs?: AgentFilesystem;\n readonly allowOutsideCwd?: boolean;\n readonly checkAccess?: AgentFilesystemToolAccessHook;\n readonly maxLineLength?: number;\n readonly grepMaxScannedFiles?: number;\n readonly applyPatch?: {\n readonly maxPatchBytes?: number;\n };\n};\n\nconst codexReadFileInputSchema = z.object({\n file_path: z.string().min(1).describe(\"Absolute path to the file\"),\n offset: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The line number to start reading from. Must be 1 or greater.\"),\n limit: z.number().int().min(1).optional().describe(\"The maximum number of lines to return.\"),\n mode: z\n .enum([\"slice\", \"indentation\"])\n .optional()\n .describe('Optional mode selector: \"slice\" (default) or \"indentation\".'),\n indentation: z\n .object({\n anchor_line: z.number().int().min(1).optional(),\n max_levels: z.number().int().min(0).optional(),\n include_siblings: z.boolean().optional(),\n include_header: z.boolean().optional(),\n max_lines: z.number().int().min(1).optional(),\n })\n .optional(),\n});\n\nconst codexListDirInputSchema = z.object({\n dir_path: z.string().min(1).describe(\"Absolute path to the directory to list.\"),\n offset: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The entry number to start listing from. Must be 1 or greater.\"),\n limit: z.number().int().min(1).optional().describe(\"The maximum number of entries to return.\"),\n depth: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The maximum directory depth to traverse. Must be 1 or greater.\"),\n});\n\nconst codexGrepFilesInputSchema = z.object({\n pattern: z.string().min(1).describe(\"Regular expression pattern to search for.\"),\n include: z\n .string()\n .optional()\n .describe('Optional glob limiting searched files (for example \"*.rs\").'),\n path: z.string().optional().describe(\"Directory or file path to search. Defaults to cwd.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"Maximum number of file paths to return (defaults to 100).\"),\n});\n\nconst applyPatchInputSchema = z.object({\n input: z.string().min(1).describe(CODEX_APPLY_PATCH_INPUT_DESCRIPTION),\n});\n\nconst geminiReadFileInputSchema = z.object({\n file_path: z.string().min(1),\n offset: z.number().int().min(0).nullish(),\n limit: z.number().int().min(1).nullish(),\n});\n\nconst geminiReadFilesInputSchema = z\n .object({\n paths: z.array(z.string().min(1)).min(1),\n line_offset: z.number().int().min(0).nullish(),\n line_limit: z.number().int().min(1).nullish(),\n char_offset: z.number().int().min(0).nullish(),\n char_limit: z.number().int().min(1).nullish(),\n include_line_numbers: z.boolean().nullish(),\n })\n .superRefine((value, context) => {\n const hasLineWindow = value.line_offset !== undefined || value.line_limit !== undefined;\n const hasCharWindow = value.char_offset !== undefined || value.char_limit !== undefined;\n if (hasLineWindow && hasCharWindow) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Use either line_* or char_* window arguments, not both.\",\n });\n }\n });\n\nconst geminiWriteFileInputSchema = z.object({\n file_path: z.string().min(1),\n content: z.string(),\n});\n\nconst geminiReplaceInputSchema = z.object({\n file_path: z.string().min(1),\n instruction: z.string().min(1),\n old_string: z.string(),\n new_string: z.string(),\n expected_replacements: z.number().int().min(1).nullish(),\n});\n\nconst geminiListDirectoryInputSchema = z.object({\n dir_path: z.string().min(1),\n ignore: z.array(z.string()).nullish(),\n file_filtering_options: z\n .object({\n respect_git_ignore: z.boolean().nullish(),\n respect_gemini_ignore: z.boolean().nullish(),\n })\n .nullish(),\n});\n\nconst geminiRgSearchInputSchema = z.object({\n pattern: z.string().min(1),\n path: z.string().nullish(),\n glob: z.string().nullish(),\n case_sensitive: z.boolean().nullish(),\n exclude_pattern: z.string().nullish(),\n names_only: z.boolean().nullish(),\n max_matches_per_file: z.number().int().min(1).nullish(),\n max_results: z.number().int().min(1).nullish(),\n});\n\nconst geminiGrepSearchInputSchema = z.object({\n pattern: z.string().min(1),\n dir_path: z.string().nullish(),\n include: z.string().nullish(),\n exclude_pattern: z.string().nullish(),\n names_only: z.boolean().nullish(),\n max_matches_per_file: z.number().int().min(1).nullish(),\n total_max_matches: z.number().int().min(1).nullish(),\n});\n\nconst geminiGlobInputSchema = z.object({\n pattern: z.string().min(1),\n dir_path: z.string().nullish(),\n case_sensitive: z.boolean().nullish(),\n respect_git_ignore: z.boolean().nullish(),\n respect_gemini_ignore: z.boolean().nullish(),\n});\n\nexport type CodexReadFileToolInput = z.output<typeof codexReadFileInputSchema>;\nexport type CodexListDirToolInput = z.output<typeof codexListDirInputSchema>;\nexport type CodexGrepFilesToolInput = z.output<typeof codexGrepFilesInputSchema>;\nexport type CodexApplyPatchToolInput = z.output<typeof applyPatchInputSchema>;\nexport type GeminiReadFileToolInput = z.output<typeof geminiReadFileInputSchema>;\nexport type GeminiReadFilesToolInput = z.output<typeof geminiReadFilesInputSchema>;\nexport type GeminiWriteFileToolInput = z.output<typeof geminiWriteFileInputSchema>;\nexport type GeminiReplaceToolInput = z.output<typeof geminiReplaceInputSchema>;\nexport type GeminiListDirectoryToolInput = z.output<typeof geminiListDirectoryInputSchema>;\nexport type GeminiGrepSearchToolInput = z.output<typeof geminiGrepSearchInputSchema>;\nexport type GeminiRgSearchToolInput = z.output<typeof geminiRgSearchInputSchema>;\nexport type GeminiGlobToolInput = z.output<typeof geminiGlobInputSchema>;\n\nexport function resolveFilesystemToolProfile(\n model: string,\n profile: AgentFilesystemToolProfile = \"auto\",\n): Exclude<AgentFilesystemToolProfile, \"auto\"> {\n if (profile !== \"auto\") {\n return profile;\n }\n if (isCodexModel(model)) {\n return \"codex\";\n }\n if (isGeminiModel(model)) {\n return \"gemini\";\n }\n return \"model-agnostic\";\n}\n\nexport function createFilesystemToolSetForModel(\n model: string,\n profileOrOptions: AgentFilesystemToolProfile | AgentFilesystemToolsOptions = \"auto\",\n maybeOptions?: AgentFilesystemToolsOptions,\n): LlmToolSet {\n if (typeof profileOrOptions === \"string\") {\n const resolvedProfile = resolveFilesystemToolProfile(model, profileOrOptions);\n if (resolvedProfile === \"codex\") {\n return createCodexFilesystemToolSet(maybeOptions);\n }\n if (resolvedProfile === \"gemini\") {\n return createGeminiFilesystemToolSet(maybeOptions);\n }\n return createModelAgnosticFilesystemToolSet(maybeOptions);\n }\n\n const resolvedProfile = resolveFilesystemToolProfile(model, \"auto\");\n if (resolvedProfile === \"codex\") {\n return createCodexFilesystemToolSet(profileOrOptions);\n }\n if (resolvedProfile === \"gemini\") {\n return createGeminiFilesystemToolSet(profileOrOptions);\n }\n return createModelAgnosticFilesystemToolSet(profileOrOptions);\n}\n\nexport function createCodexFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return {\n apply_patch: createCodexApplyPatchTool(options),\n read_file: createCodexReadFileTool(options),\n list_dir: createListDirTool(options),\n grep_files: createGrepFilesTool(options),\n };\n}\n\nexport function createGeminiFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return {\n read_file: createGeminiReadFileTool(options),\n write_file: createWriteFileTool(options),\n replace: createReplaceTool(options),\n list_directory: createListDirectoryTool(options),\n grep_search: createGrepSearchTool(options),\n glob: createGlobTool(options),\n };\n}\n\nexport function createModelAgnosticFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return createGeminiFilesystemToolSet(options);\n}\n\nexport function createCodexApplyPatchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmCustomTool<string> {\n return customTool({\n description: CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION,\n format: {\n type: \"grammar\",\n syntax: \"lark\",\n definition: CODEX_APPLY_PATCH_LARK_GRAMMAR,\n },\n execute: async (input) => {\n const runtime = resolveRuntime(options);\n const result = await applyPatch({\n patch: input,\n cwd: runtime.cwd,\n fs: runtime.filesystem,\n allowOutsideCwd: runtime.allowOutsideCwd,\n checkAccess: runtime.checkAccess\n ? async (context) => {\n await runtime.checkAccess?.({\n cwd: runtime.cwd,\n tool: \"apply_patch\",\n action: mapApplyPatchAction(context.kind),\n path: context.path,\n fromPath: context.fromPath,\n toPath: context.toPath,\n });\n }\n : undefined,\n maxPatchBytes: options.applyPatch?.maxPatchBytes,\n });\n return result.summary;\n },\n });\n}\n\nexport function createCodexReadFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexReadFileInputSchema, string> {\n return tool({\n description:\n \"Reads a local file with 1-indexed line numbers, supporting slice and indentation-aware block modes.\",\n inputSchema: codexReadFileInputSchema,\n execute: async (input) => readFileCodex(input, options),\n });\n}\n\nexport function createListDirTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexListDirInputSchema, string> {\n return tool({\n description:\n \"Lists entries in a local directory with 1-indexed entry numbers and simple type labels.\",\n inputSchema: codexListDirInputSchema,\n execute: async (input) => listDirectoryCodex(input, options),\n });\n}\n\nexport function createGrepFilesTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexGrepFilesInputSchema, string> {\n return tool({\n description:\n \"Finds files whose contents match the pattern and lists them by modification time.\",\n inputSchema: codexGrepFilesInputSchema,\n execute: async (input) => grepFilesCodex(input, options),\n });\n}\n\nexport function createGeminiReadFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReadFileInputSchema, string> {\n return tool({\n description:\n \"Reads and returns the content of a specified file. Supports optional 0-based line offset and line limit.\",\n inputSchema: geminiReadFileInputSchema,\n execute: async (input) => readFileGemini(input, options),\n });\n}\n\nexport function createReadFilesTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReadFilesInputSchema, string> {\n return tool({\n description:\n \"Reads one or more files with optional line-based or character-based slicing, similar to a controlled head/tail view.\",\n inputSchema: geminiReadFilesInputSchema,\n execute: async (input) => readFilesGemini(input, options),\n });\n}\n\nexport function createWriteFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiWriteFileInputSchema, string> {\n return tool({\n description: \"Writes content to a specified file in the local filesystem.\",\n inputSchema: geminiWriteFileInputSchema,\n execute: async (input) => writeFileGemini(input, options),\n });\n}\n\nexport function createReplaceTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReplaceInputSchema, string> {\n return tool({\n description: \"Replaces exact literal text within a file.\",\n inputSchema: geminiReplaceInputSchema,\n execute: async (input) => replaceFileContentGemini(input, options),\n });\n}\n\nexport function createListDirectoryTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiListDirectoryInputSchema, string> {\n return tool({\n description: \"Lists files and subdirectories directly within a specified directory path.\",\n inputSchema: geminiListDirectoryInputSchema,\n execute: async (input) => listDirectoryGemini(input, options),\n });\n}\n\nexport function createGrepSearchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiGrepSearchInputSchema, string> {\n return tool({\n description: \"Searches for a regex pattern within file contents.\",\n inputSchema: geminiGrepSearchInputSchema,\n execute: async (input) => grepSearchGemini(input, options),\n });\n}\n\nexport function createRgSearchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiRgSearchInputSchema, string> {\n return tool({\n description: \"Searches for a regex pattern within file contents.\",\n inputSchema: geminiRgSearchInputSchema,\n execute: async (input) => rgSearchGemini(input, options),\n });\n}\n\nexport function createGlobTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiGlobInputSchema, string> {\n return tool({\n description: \"Finds files matching glob patterns, sorted by modification time (newest first).\",\n inputSchema: geminiGlobInputSchema,\n execute: async (input) => globFilesGemini(input, options),\n });\n}\n\nasync function readFileCodex(\n input: CodexReadFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n if (!path.isAbsolute(input.file_path)) {\n throw new Error(\"file_path must be an absolute path\");\n }\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_file\",\n action: \"read\",\n path: filePath,\n });\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n const offset = input.offset ?? 1;\n const limit = input.limit ?? DEFAULT_READ_FILE_LINE_LIMIT;\n const mode: CodexReadMode = input.mode ?? \"slice\";\n if (offset > lines.length) {\n throw new Error(\"offset exceeds file length\");\n }\n\n if (mode === \"slice\") {\n const output: string[] = [];\n const lastLine = Math.min(lines.length, offset + limit - 1);\n for (let lineNumber = offset; lineNumber <= lastLine; lineNumber += 1) {\n const line = lines[lineNumber - 1] ?? \"\";\n output.push(`L${lineNumber}: ${truncateAtCodePointBoundary(line, runtime.maxLineLength)}`);\n }\n return output.join(\"\\n\");\n }\n\n const indentation = input.indentation ?? {};\n const anchorLine = indentation.anchor_line ?? offset;\n if (anchorLine < 1 || anchorLine > lines.length) {\n throw new Error(\"anchor_line exceeds file length\");\n }\n const records = lines.map((line, index) => ({\n number: index + 1,\n raw: line,\n display: truncateAtCodePointBoundary(line, runtime.maxLineLength),\n indent: measureIndent(line, DEFAULT_TAB_WIDTH),\n }));\n\n const selected = readWithIndentationMode({\n records,\n anchorLine,\n limit,\n maxLevels: indentation.max_levels ?? 0,\n includeSiblings: indentation.include_siblings ?? false,\n includeHeader: indentation.include_header ?? true,\n maxLines: indentation.max_lines,\n });\n\n return selected.map((record) => `L${record.number}: ${record.display}`).join(\"\\n\");\n}\n\nasync function listDirectoryCodex(\n input: CodexListDirToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n if (!path.isAbsolute(input.dir_path)) {\n throw new Error(\"dir_path must be an absolute path\");\n }\n const dirPath = resolvePathWithPolicy(input.dir_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"list_dir\",\n action: \"list\",\n path: dirPath,\n });\n\n const stats = await runtime.filesystem.stat(dirPath);\n if (stats.kind !== \"directory\") {\n throw new Error(`failed to read directory: \"${dirPath}\" is not a directory`);\n }\n\n const offset = input.offset ?? 1;\n const limit = input.limit ?? DEFAULT_LIST_DIR_LIMIT;\n const depth = input.depth ?? DEFAULT_LIST_DIR_DEPTH;\n const entries = await collectDirectoryEntries(\n runtime.filesystem,\n dirPath,\n depth,\n runtime.maxLineLength,\n );\n if (offset > entries.length) {\n throw new Error(\"offset exceeds directory entry count\");\n }\n\n const startIndex = offset - 1;\n const remaining = entries.length - startIndex;\n const cappedLimit = Math.min(limit, remaining);\n const selected = entries.slice(startIndex, startIndex + cappedLimit);\n\n const output: string[] = [`Absolute path: ${dirPath}`];\n for (const entry of selected) {\n output.push(formatListEntry(entry));\n }\n if (startIndex + cappedLimit < entries.length) {\n output.push(`More than ${cappedLimit} entries found`);\n }\n\n return output.join(\"\\n\");\n}\n\nasync function grepFilesCodex(\n input: CodexGrepFilesToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const pattern = input.pattern.trim();\n if (pattern.length === 0) {\n throw new Error(\"pattern must not be empty\");\n }\n const regex = compileRegex(pattern);\n const searchPath = resolvePathWithPolicy(\n input.path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"grep_files\",\n action: \"search\",\n path: searchPath,\n pattern,\n include: input.include?.trim(),\n });\n\n const searchPathInfo = await runtime.filesystem.stat(searchPath);\n const filesToScan = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath,\n rootKind: searchPathInfo.kind,\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const includeMatcher = input.include ? createGlobMatcher(input.include) : null;\n const matches: GrepMatchRecord[] = [];\n for (const filePath of filesToScan) {\n const relativePath = toDisplayPath(filePath, runtime.cwd);\n if (includeMatcher && !includeMatcher(relativePath)) {\n continue;\n }\n const fileContent = await runtime.filesystem.readTextFile(filePath);\n if (!regex.test(fileContent)) {\n continue;\n }\n const stats = await runtime.filesystem.stat(filePath);\n matches.push({ filePath: normalizeSlashes(relativePath), mtimeMs: stats.mtimeMs });\n }\n\n if (matches.length === 0) {\n return \"No matches found.\";\n }\n\n matches.sort((left, right) => right.mtimeMs - left.mtimeMs);\n const limit = Math.min(input.limit ?? DEFAULT_GREP_LIMIT, MAX_GREP_LIMIT);\n return matches\n .slice(0, limit)\n .map((match) => match.filePath)\n .join(\"\\n\");\n}\n\nasync function readFileGemini(\n input: GeminiReadFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_file\",\n action: \"read\",\n path: filePath,\n });\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n const offset = Math.max(0, input.offset ?? 0);\n const limit = input.limit ?? DEFAULT_READ_FILE_LINE_LIMIT;\n if (offset >= lines.length) {\n return \"\";\n }\n\n const end = Math.min(lines.length, offset + limit);\n return lines\n .slice(offset, end)\n .map(\n (line, index) =>\n `L${offset + index + 1}: ${truncateAtCodePointBoundary(line ?? \"\", runtime.maxLineLength)}`,\n )\n .join(\"\\n\");\n}\n\nasync function readFilesGemini(\n input: GeminiReadFilesToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const useCharWindow = input.char_offset !== undefined || input.char_limit !== undefined;\n const lineOffset = Math.max(0, input.line_offset ?? 0);\n const lineLimit = input.line_limit ?? DEFAULT_READ_FILES_LINE_LIMIT;\n const charOffset = Math.max(0, input.char_offset ?? 0);\n const charLimit = input.char_limit ?? DEFAULT_READ_FILES_CHAR_LIMIT;\n const includeLineNumbers = input.include_line_numbers !== false;\n\n const sections: string[] = [];\n for (const rawPath of input.paths) {\n const filePath = resolvePathWithPolicy(rawPath, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_files\",\n action: \"read\",\n path: filePath,\n });\n const content = await runtime.filesystem.readTextFile(filePath);\n const displayPath = normalizeSlashes(toDisplayPath(filePath, runtime.cwd));\n sections.push(`==> ${displayPath} <==`);\n\n if (useCharWindow) {\n if (charOffset >= content.length) {\n sections.push(\"\");\n continue;\n }\n const end = Math.min(content.length, charOffset + charLimit);\n sections.push(content.slice(charOffset, end));\n continue;\n }\n\n const lines = splitLines(content);\n if (lineOffset >= lines.length) {\n sections.push(\"\");\n continue;\n }\n const end = Math.min(lines.length, lineOffset + lineLimit);\n const selected = lines.slice(lineOffset, end);\n if (includeLineNumbers) {\n for (let index = 0; index < selected.length; index += 1) {\n const lineNumber = lineOffset + index + 1;\n const line = selected[index] ?? \"\";\n sections.push(\n `L${lineNumber}: ${truncateAtCodePointBoundary(line, runtime.maxLineLength)}`,\n );\n }\n continue;\n }\n sections.push(selected.join(\"\\n\"));\n }\n\n return sections.join(\"\\n\");\n}\n\nasync function writeFileGemini(\n input: GeminiWriteFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"write_file\",\n action: \"write\",\n path: filePath,\n });\n await runtime.filesystem.ensureDir(path.dirname(filePath));\n await runtime.filesystem.writeTextFile(filePath, input.content);\n return `Successfully wrote file: ${toDisplayPath(filePath, runtime.cwd)}`;\n}\n\nasync function replaceFileContentGemini(\n input: GeminiReplaceToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"replace\",\n action: \"write\",\n path: filePath,\n });\n\n const expectedReplacements = input.expected_replacements ?? 1;\n const oldValue = input.old_string;\n const newValue = input.new_string;\n\n let originalContent = \"\";\n try {\n originalContent = await runtime.filesystem.readTextFile(filePath);\n } catch (error) {\n if (isNoEntError(error) && oldValue.length === 0) {\n await runtime.filesystem.ensureDir(path.dirname(filePath));\n await runtime.filesystem.writeTextFile(filePath, newValue);\n return `Successfully wrote new file: ${toDisplayPath(filePath, runtime.cwd)}`;\n }\n throw error;\n }\n\n if (oldValue === newValue) {\n throw new Error(\"No changes to apply. old_string and new_string are identical.\");\n }\n\n const occurrences = countOccurrences(originalContent, oldValue);\n if (occurrences === 0) {\n throw new Error(\"Failed to edit, could not find old_string in file.\");\n }\n if (occurrences !== expectedReplacements) {\n throw new Error(\n `Failed to edit, expected ${expectedReplacements} occurrence(s) but found ${occurrences}.`,\n );\n }\n const updatedContent = safeReplaceAll(originalContent, oldValue, newValue);\n await runtime.filesystem.writeTextFile(filePath, updatedContent);\n return `Successfully replaced ${occurrences} occurrence(s) in ${toDisplayPath(filePath, runtime.cwd)}.`;\n}\n\nasync function listDirectoryGemini(\n input: GeminiListDirectoryToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const dirPath = resolvePathWithPolicy(input.dir_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"list_directory\",\n action: \"list\",\n path: dirPath,\n });\n\n const stats = await runtime.filesystem.stat(dirPath);\n if (stats.kind !== \"directory\") {\n throw new Error(`Path is not a directory: ${dirPath}`);\n }\n\n const entries = await runtime.filesystem.readDir(dirPath);\n const ignoreMatchers = (input.ignore ?? []).map((pattern) => createGlobMatcher(pattern));\n const filtered = entries\n .filter((entry) => {\n if (ignoreMatchers.length === 0) {\n return true;\n }\n return !ignoreMatchers.some((matches) => matches(entry.name));\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n\n if (filtered.length === 0) {\n return `Directory ${toDisplayPath(dirPath, runtime.cwd)} is empty.`;\n }\n\n return filtered\n .map((entry) => {\n const label = entry.kind === \"directory\" ? `${entry.name}/` : entry.name;\n return label;\n })\n .join(\"\\n\");\n}\n\nasync function rgSearchGemini(\n input: GeminiRgSearchToolInput,\n options: AgentFilesystemToolsOptions,\n toolName: \"rg_search\" | \"grep_search\" = \"rg_search\",\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const pattern = input.pattern.trim();\n if (pattern.length === 0) {\n throw new Error(\"pattern must not be empty\");\n }\n\n const glob = input.glob?.trim();\n const searchPath = resolvePathWithPolicy(\n input.path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: toolName,\n action: \"search\",\n path: searchPath,\n pattern,\n include: glob,\n });\n\n const searchPathInfo = await runtime.filesystem.stat(searchPath);\n const filesToScan = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath,\n rootKind: searchPathInfo.kind,\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const matcher = glob ? createGlobMatcher(glob) : null;\n const patternRegex = compileRegex(pattern, input.case_sensitive === true ? \"m\" : \"im\");\n const excludeRegex = input.exclude_pattern ? compileRegex(input.exclude_pattern) : null;\n const totalMaxMatches = input.max_results ?? DEFAULT_GREP_LIMIT;\n const perFileMaxMatches = input.max_matches_per_file ?? Number.POSITIVE_INFINITY;\n\n const matches: GrepMatchRecord[] = [];\n const fileMatches = new Set<string>();\n for (const filePath of filesToScan) {\n const relativePath = normalizeSlashes(toDisplayPath(filePath, runtime.cwd));\n if (matcher && !matcher(relativePath)) {\n continue;\n }\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n let fileMatchCount = 0;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? \"\";\n if (!patternRegex.test(line)) {\n continue;\n }\n if (excludeRegex?.test(line)) {\n continue;\n }\n if (fileMatches.has(relativePath) === false) {\n fileMatches.add(relativePath);\n }\n if (input.names_only) {\n continue;\n }\n matches.push({\n filePath: relativePath,\n mtimeMs: 0,\n lineNumber: index + 1,\n line: line,\n });\n fileMatchCount += 1;\n if (fileMatchCount >= perFileMaxMatches || matches.length >= totalMaxMatches) {\n break;\n }\n }\n\n if (input.names_only && fileMatches.size >= totalMaxMatches) {\n break;\n }\n if (!input.names_only && matches.length >= totalMaxMatches) {\n break;\n }\n }\n\n if (input.names_only) {\n if (fileMatches.size === 0) {\n return \"No matches found.\";\n }\n return [...fileMatches].slice(0, totalMaxMatches).join(\"\\n\");\n }\n\n if (matches.length === 0) {\n return \"No matches found.\";\n }\n\n return matches\n .slice(0, totalMaxMatches)\n .map((match) => `${match.filePath}:${match.lineNumber}:${match.line ?? \"\"}`)\n .join(\"\\n\");\n}\n\nasync function grepSearchGemini(\n input: GeminiGrepSearchToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n return rgSearchGemini(\n {\n pattern: input.pattern,\n path: input.dir_path,\n glob: input.include,\n exclude_pattern: input.exclude_pattern,\n names_only: input.names_only,\n max_matches_per_file: input.max_matches_per_file,\n max_results: input.total_max_matches,\n },\n options,\n \"grep_search\",\n );\n}\n\nasync function globFilesGemini(\n input: GeminiGlobToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const dirPath = resolvePathWithPolicy(\n input.dir_path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"glob\",\n action: \"search\",\n path: dirPath,\n pattern: input.pattern,\n });\n\n const dirStats = await runtime.filesystem.stat(dirPath);\n if (dirStats.kind !== \"directory\") {\n throw new Error(`Path is not a directory: ${dirPath}`);\n }\n\n const matcher = createGlobMatcher(input.pattern, input.case_sensitive === true);\n const files = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath: dirPath,\n rootKind: \"directory\",\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const matched: GrepMatchRecord[] = [];\n for (const filePath of files) {\n const relativePath = normalizeSlashes(path.relative(dirPath, filePath));\n if (!matcher(relativePath)) {\n continue;\n }\n const fileStats = await runtime.filesystem.stat(filePath);\n matched.push({\n filePath,\n mtimeMs: fileStats.mtimeMs,\n });\n }\n\n if (matched.length === 0) {\n return \"No files found.\";\n }\n\n matched.sort((left, right) => right.mtimeMs - left.mtimeMs);\n return matched\n .map((entry) => normalizeSlashes(toDisplayPath(entry.filePath, runtime.cwd)))\n .join(\"\\n\");\n}\n\ntype RuntimeContext = {\n readonly cwd: string;\n readonly filesystem: AgentFilesystem;\n readonly allowOutsideCwd: boolean;\n readonly checkAccess?: AgentFilesystemToolAccessHook;\n readonly maxLineLength: number;\n readonly grepMaxScannedFiles: number;\n};\n\nfunction resolveRuntime(options: AgentFilesystemToolsOptions): RuntimeContext {\n return {\n cwd: path.resolve(options.cwd ?? process.cwd()),\n filesystem: options.fs ?? createNodeAgentFilesystem(),\n allowOutsideCwd: options.allowOutsideCwd === true,\n checkAccess: options.checkAccess,\n maxLineLength: options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n grepMaxScannedFiles: options.grepMaxScannedFiles ?? DEFAULT_GREP_MAX_SCANNED_FILES,\n };\n}\n\nasync function runAccessHook(\n runtime: RuntimeContext,\n context: AgentFilesystemToolAccessContext,\n): Promise<void> {\n if (!runtime.checkAccess) {\n return;\n }\n await runtime.checkAccess(context);\n}\n\nfunction isCodexModel(model: string): boolean {\n const normalized = model.startsWith(\"chatgpt-\") ? model.slice(\"chatgpt-\".length) : model;\n return normalized.includes(\"codex\");\n}\n\nfunction isGeminiModel(model: string): boolean {\n return model.startsWith(\"gemini-\");\n}\n\nfunction mapApplyPatchAction(\n action: \"add\" | \"delete\" | \"update\" | \"move\",\n): AgentFilesystemToolAction {\n if (action === \"add\" || action === \"update\") {\n return \"write\";\n }\n if (action === \"delete\") {\n return \"delete\";\n }\n return \"move\";\n}\n\nfunction resolvePathWithPolicy(inputPath: string, cwd: string, allowOutsideCwd: boolean): string {\n const absolutePath = path.isAbsolute(inputPath)\n ? path.resolve(inputPath)\n : path.resolve(cwd, inputPath);\n if (!allowOutsideCwd && !isPathInsideCwd(absolutePath, cwd)) {\n throw new Error(`path \"${inputPath}\" resolves outside cwd \"${cwd}\"`);\n }\n return absolutePath;\n}\n\nfunction isPathInsideCwd(candidatePath: string, cwd: string): boolean {\n const relative = path.relative(cwd, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction toDisplayPath(absolutePath: string, cwd: string): string {\n const relative = path.relative(cwd, absolutePath);\n if (relative === \"\") {\n return \".\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return relative;\n }\n return absolutePath;\n}\n\nfunction splitLines(content: string): string[] {\n const normalized = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction truncateAtCodePointBoundary(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return Array.from(value).slice(0, maxLength).join(\"\");\n}\n\nfunction measureIndent(line: string, tabWidth: number): number {\n let count = 0;\n for (const char of line) {\n if (char === \" \") {\n count += 1;\n continue;\n }\n if (char === \"\\t\") {\n count += tabWidth;\n continue;\n }\n break;\n }\n return count;\n}\n\nfunction computeEffectiveIndents(records: readonly ReadLineRecord[]): number[] {\n const effective: number[] = [];\n let previous = 0;\n for (const record of records) {\n if (record.raw.trim().length === 0) {\n effective.push(previous);\n } else {\n previous = record.indent;\n effective.push(previous);\n }\n }\n return effective;\n}\n\nfunction trimBoundaryBlankLines(records: ReadLineRecord[]): void {\n while (records.length > 0 && records[0]?.raw.trim().length === 0) {\n records.shift();\n }\n while (records.length > 0 && records[records.length - 1]?.raw.trim().length === 0) {\n records.pop();\n }\n}\n\nfunction isCommentLine(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\") || trimmed.startsWith(\"--\");\n}\n\nfunction readWithIndentationMode(params: {\n records: readonly ReadLineRecord[];\n anchorLine: number;\n limit: number;\n maxLevels: number;\n includeSiblings: boolean;\n includeHeader: boolean;\n maxLines?: number;\n}): ReadLineRecord[] {\n const { records, anchorLine, limit, maxLevels, includeSiblings, includeHeader, maxLines } =\n params;\n const anchorIndex = anchorLine - 1;\n const effectiveIndents = computeEffectiveIndents(records);\n const anchorIndent = effectiveIndents[anchorIndex] ?? 0;\n const minIndent = maxLevels === 0 ? 0 : Math.max(anchorIndent - maxLevels * DEFAULT_TAB_WIDTH, 0);\n const guardLimit = maxLines ?? limit;\n const finalLimit = Math.min(limit, guardLimit, records.length);\n if (finalLimit <= 1) {\n return [records[anchorIndex]].filter((entry): entry is ReadLineRecord => Boolean(entry));\n }\n\n let upper = anchorIndex - 1;\n let lower = anchorIndex + 1;\n let upperMinIndentHits = 0;\n let lowerMinIndentHits = 0;\n const output: ReadLineRecord[] = [records[anchorIndex]].filter((entry): entry is ReadLineRecord =>\n Boolean(entry),\n );\n\n while (output.length < finalLimit) {\n let progressed = 0;\n\n if (upper >= 0) {\n const candidate = records[upper];\n const candidateIndent = effectiveIndents[upper] ?? 0;\n if (candidate && candidateIndent >= minIndent) {\n output.unshift(candidate);\n progressed += 1;\n upper -= 1;\n if (candidateIndent === minIndent && !includeSiblings) {\n const allowHeaderComment = includeHeader && isCommentLine(candidate.raw);\n const canTakeLine = allowHeaderComment || upperMinIndentHits === 0;\n if (canTakeLine) {\n upperMinIndentHits += 1;\n } else {\n output.shift();\n progressed -= 1;\n upper = -1;\n }\n }\n if (output.length >= finalLimit) {\n break;\n }\n } else {\n upper = -1;\n }\n }\n\n if (lower < records.length) {\n const candidate = records[lower];\n const candidateIndent = effectiveIndents[lower] ?? 0;\n if (candidate && candidateIndent >= minIndent) {\n output.push(candidate);\n progressed += 1;\n lower += 1;\n if (candidateIndent === minIndent && !includeSiblings) {\n if (lowerMinIndentHits > 0) {\n output.pop();\n progressed -= 1;\n lower = records.length;\n }\n lowerMinIndentHits += 1;\n }\n } else {\n lower = records.length;\n }\n }\n\n if (progressed === 0) {\n break;\n }\n }\n\n trimBoundaryBlankLines(output);\n return output;\n}\n\nasync function collectDirectoryEntries(\n filesystem: AgentFilesystem,\n rootPath: string,\n depth: number,\n maxLineLength: number,\n): Promise<ListEntryRecord[]> {\n const queue: Array<{ path: string; relativePrefix: string; remainingDepth: number }> = [\n { path: rootPath, relativePrefix: \"\", remainingDepth: depth },\n ];\n const records: ListEntryRecord[] = [];\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) {\n break;\n }\n const entries = await filesystem.readDir(next.path);\n const nextEntries = [...entries]\n .map((entry) => {\n const relativePath = next.relativePrefix\n ? `${next.relativePrefix}/${entry.name}`\n : entry.name;\n return {\n entry,\n relativePath,\n depth: next.relativePrefix.length === 0 ? 0 : next.relativePrefix.split(\"/\").length,\n sortName: normalizeSlashes(relativePath),\n };\n })\n .sort((left, right) => left.sortName.localeCompare(right.sortName));\n\n for (const item of nextEntries) {\n if (item.entry.kind === \"directory\" && next.remainingDepth > 1) {\n queue.push({\n path: item.entry.path,\n relativePrefix: item.relativePath,\n remainingDepth: next.remainingDepth - 1,\n });\n }\n records.push({\n name: item.sortName,\n displayName: truncateAtCodePointBoundary(item.entry.name, maxLineLength),\n depth: item.depth,\n kind: item.entry.kind,\n });\n }\n }\n\n records.sort((left, right) => left.name.localeCompare(right.name));\n return records;\n}\n\nfunction formatListEntry(entry: ListEntryRecord): string {\n const indent = \" \".repeat(entry.depth * 2);\n let name = entry.displayName;\n if (entry.kind === \"directory\") {\n name += \"/\";\n } else if (entry.kind === \"symlink\") {\n name += \"@\";\n } else if (entry.kind === \"other\") {\n name += \"?\";\n }\n return `${indent}${name}`;\n}\n\nasync function collectSearchFiles(params: {\n filesystem: AgentFilesystem;\n searchPath: string;\n rootKind: AgentDirectoryEntry[\"kind\"];\n maxScannedFiles: number;\n}): Promise<string[]> {\n const { filesystem, searchPath, rootKind, maxScannedFiles } = params;\n if (rootKind === \"file\") {\n return [searchPath];\n }\n\n const queue: string[] = [searchPath];\n const files: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n const entries = await filesystem.readDir(current);\n for (const entry of entries) {\n if (entry.kind === \"directory\") {\n queue.push(entry.path);\n continue;\n }\n if (entry.kind !== \"file\") {\n continue;\n }\n files.push(entry.path);\n if (files.length >= maxScannedFiles) {\n return files;\n }\n }\n }\n return files;\n}\n\nfunction compileRegex(pattern: string, flags = \"m\"): RegExp {\n try {\n return new RegExp(pattern, flags);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`invalid regex pattern: ${message}`);\n }\n}\n\nfunction createGlobMatcher(\n pattern: string,\n caseSensitive = false,\n): (candidatePath: string) => boolean {\n const expanded = expandBracePatterns(normalizeSlashes(pattern.trim()));\n const flags = caseSensitive ? \"\" : \"i\";\n const compiled = expanded.map((entry) => ({\n regex: globToRegex(entry, flags),\n applyToBasename: !entry.includes(\"/\"),\n }));\n\n return (candidatePath: string) => {\n const normalizedPath = normalizeSlashes(candidatePath);\n const basename = path.posix.basename(normalizedPath);\n return compiled.some((entry) =>\n entry.regex.test(entry.applyToBasename ? basename : normalizedPath),\n );\n };\n}\n\nfunction globToRegex(globPattern: string, flags: string): RegExp {\n let source = \"^\";\n for (let index = 0; index < globPattern.length; index += 1) {\n const char = globPattern[index];\n const nextChar = globPattern[index + 1];\n\n if (char === undefined) {\n continue;\n }\n if (char === \"*\" && nextChar === \"*\") {\n source += \".*\";\n index += 1;\n continue;\n }\n if (char === \"*\") {\n source += \"[^/]*\";\n continue;\n }\n if (char === \"?\") {\n source += \"[^/]\";\n continue;\n }\n source += escapeRegexCharacter(char);\n }\n source += \"$\";\n return new RegExp(source, flags);\n}\n\nfunction expandBracePatterns(pattern: string): string[] {\n const start = pattern.indexOf(\"{\");\n if (start === -1) {\n return [pattern];\n }\n\n let depth = 0;\n let end = -1;\n for (let index = start; index < pattern.length; index += 1) {\n const char = pattern[index];\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n if (char === \"}\") {\n depth -= 1;\n if (depth === 0) {\n end = index;\n break;\n }\n }\n }\n\n if (end === -1) {\n return [pattern];\n }\n\n const prefix = pattern.slice(0, start);\n const suffix = pattern.slice(end + 1);\n const body = pattern.slice(start + 1, end);\n const variants = splitTopLevel(body, \",\");\n const expanded: string[] = [];\n for (const variant of variants) {\n expanded.push(...expandBracePatterns(`${prefix}${variant}${suffix}`));\n }\n return expanded;\n}\n\nfunction splitTopLevel(value: string, separator: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = \"\";\n for (const char of value) {\n if (char === \"{\") {\n depth += 1;\n current += char;\n continue;\n }\n if (char === \"}\") {\n depth = Math.max(0, depth - 1);\n current += char;\n continue;\n }\n if (char === separator && depth === 0) {\n parts.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n parts.push(current);\n return parts;\n}\n\nfunction escapeRegexCharacter(char: string): string {\n return /[.*+?^${}()|[\\]\\\\]/u.test(char) ? `\\\\${char}` : char;\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction countOccurrences(text: string, search: string): number {\n if (search.length === 0) {\n return 0;\n }\n return text.split(search).length - 1;\n}\n\nfunction safeReplaceAll(text: string, search: string, replacement: string): string {\n if (search.length === 0) {\n return text;\n }\n return text.split(search).join(replacement);\n}\n\nfunction isNoEntError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { type LlmFunctionTool, tool } from \"../llm.js\";\nimport { createNodeAgentFilesystem, type AgentFilesystem } from \"./filesystem.js\";\n\nconst BEGIN_PATCH_LINE = \"*** Begin Patch\";\nconst END_PATCH_LINE = \"*** End Patch\";\nconst ADD_FILE_PREFIX = \"*** Add File: \";\nconst DELETE_FILE_PREFIX = \"*** Delete File: \";\nconst UPDATE_FILE_PREFIX = \"*** Update File: \";\nconst MOVE_TO_PREFIX = \"*** Move to: \";\nconst END_OF_FILE_LINE = \"*** End of File\";\nconst DEFAULT_MAX_PATCH_BYTES = 1024 * 1024;\n\nexport const CODEX_APPLY_PATCH_INPUT_DESCRIPTION = \"The entire contents of the apply_patch command\";\nexport const CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION =\n \"Use the `apply_patch` tool to edit files. This is a FREEFORM tool, so do not wrap the patch in JSON.\";\nexport const CODEX_APPLY_PATCH_LARK_GRAMMAR = [\n \"start: begin_patch hunk+ end_patch\",\n 'begin_patch: \"*** Begin Patch\" LF',\n 'end_patch: \"*** End Patch\" LF?',\n \"\",\n \"hunk: add_hunk | delete_hunk | update_hunk\",\n 'add_hunk: \"*** Add File: \" filename LF add_line+',\n 'delete_hunk: \"*** Delete File: \" filename LF',\n 'update_hunk: \"*** Update File: \" filename LF change_move? change?',\n \"\",\n \"filename: /(.+)/\",\n 'add_line: \"+\" /(.*)/ LF -> line',\n \"\",\n 'change_move: \"*** Move to: \" filename LF',\n \"change: (change_context | change_line)+ eof_line?\",\n 'change_context: (\"@@\" | \"@@ \" /(.+)/) LF',\n 'change_line: (\"+\" | \"-\" | \" \") /(.*)/ LF',\n 'eof_line: \"*** End of File\" LF',\n \"\",\n \"%import common.LF\",\n].join(\"\\n\");\n\nexport const CODEX_APPLY_PATCH_JSON_TOOL_DESCRIPTION = [\n \"Use the `apply_patch` tool to edit files.\",\n \"Your patch language is a stripped‑down, file‑oriented diff format designed to be easy to parse and safe to apply. You can think of it as a high‑level envelope:\",\n \"\",\n \"*** Begin Patch\",\n \"[ one or more file sections ]\",\n \"*** End Patch\",\n \"\",\n \"Within that envelope, you get a sequence of file operations.\",\n \"You MUST include a header to specify the action you are taking.\",\n \"Each operation starts with one of three headers:\",\n \"\",\n \"*** Add File: <path> - create a new file. Every following line is a + line (the initial contents).\",\n \"*** Delete File: <path> - remove an existing file. Nothing follows.\",\n \"*** Update File: <path> - patch an existing file in place (optionally with a rename).\",\n \"\",\n \"May be immediately followed by *** Move to: <new path> if you want to rename the file.\",\n \"Then one or more “hunks”, each introduced by @@ (optionally followed by a hunk header).\",\n \"Within a hunk each line starts with:\",\n \"\",\n \"For instructions on [context_before] and [context_after]:\",\n \"- By default, show 3 lines of code immediately above and 3 lines immediately below each change. If a change is within 3 lines of a previous change, do NOT duplicate the first change’s [context_after] lines in the second change’s [context_before] lines.\",\n \"- If 3 lines of context is insufficient to uniquely identify the snippet of code within the file, use the @@ operator to indicate the class or function to which the snippet belongs. For instance, we might have:\",\n \"@@ class BaseClass\",\n \"[3 lines of pre-context]\",\n \"- [old_code]\",\n \"+ [new_code]\",\n \"[3 lines of post-context]\",\n \"\",\n \"- If a code block is repeated so many times in a class or function such that even a single `@@` statement and 3 lines of context cannot uniquely identify the snippet of code, you can use multiple `@@` statements to jump to the right context. For instance:\",\n \"\",\n \"@@ class BaseClass\",\n \"@@ \\t def method():\",\n \"[3 lines of pre-context]\",\n \"- [old_code]\",\n \"+ [new_code]\",\n \"[3 lines of post-context]\",\n \"\",\n \"The full grammar definition is below:\",\n \"Patch := Begin { FileOp } End\",\n 'Begin := \"*** Begin Patch\" NEWLINE',\n 'End := \"*** End Patch\" NEWLINE',\n \"FileOp := AddFile | DeleteFile | UpdateFile\",\n 'AddFile := \"*** Add File: \" path NEWLINE { \"+\" line NEWLINE }',\n 'DeleteFile := \"*** Delete File: \" path NEWLINE',\n 'UpdateFile := \"*** Update File: \" path NEWLINE [ MoveTo ] { Hunk }',\n 'MoveTo := \"*** Move to: \" newPath NEWLINE',\n 'Hunk := \"@@\" [ header ] NEWLINE { HunkLine } [ \"*** End of File\" NEWLINE ]',\n 'HunkLine := (\" \" | \"-\" | \"+\") text NEWLINE',\n \"\",\n \"A full patch can combine several operations:\",\n \"\",\n \"*** Begin Patch\",\n \"*** Add File: hello.txt\",\n \"+Hello world\",\n \"*** Update File: src/app.py\",\n \"*** Move to: src/main.py\",\n \"@@ def greet():\",\n '-print(\"Hi\")',\n '+print(\"Hello, world!\")',\n \"*** Delete File: obsolete.txt\",\n \"*** End Patch\",\n \"\",\n \"It is important to remember:\",\n \"\",\n \"- You must include a header with your intended action (Add/Delete/Update)\",\n \"- You must prefix new lines with `+` even when creating a new file\",\n \"- File references can only be relative, NEVER ABSOLUTE.\",\n].join(\"\\n\");\n\ntype ParsedPatch = {\n readonly operations: readonly ParsedPatchOperation[];\n};\n\ntype ParsedPatchOperation =\n | {\n readonly type: \"add\";\n readonly path: string;\n readonly content: string;\n }\n | {\n readonly type: \"delete\";\n readonly path: string;\n }\n | {\n readonly type: \"update\";\n readonly path: string;\n readonly movePath?: string;\n readonly chunks: readonly ParsedUpdateChunk[];\n };\n\ntype ParsedUpdateChunk = {\n readonly contextSelector?: string;\n readonly oldLines: readonly string[];\n readonly newLines: readonly string[];\n readonly isEndOfFile: boolean;\n};\n\ntype Replacement = {\n readonly startIndex: number;\n readonly oldLength: number;\n readonly newLines: readonly string[];\n};\n\nexport type ApplyPatchAccessContext = {\n readonly cwd: string;\n readonly kind: \"add\" | \"delete\" | \"update\" | \"move\";\n readonly path: string;\n readonly fromPath?: string;\n readonly toPath?: string;\n};\n\nexport type ApplyPatchAccessHook = (context: ApplyPatchAccessContext) => Promise<void> | void;\n\nexport type ApplyPatchRequest = {\n readonly patch: string;\n readonly cwd?: string;\n readonly fs?: AgentFilesystem;\n readonly allowOutsideCwd?: boolean;\n readonly checkAccess?: ApplyPatchAccessHook;\n readonly maxPatchBytes?: number;\n};\n\nexport type ApplyPatchResult = {\n readonly success: true;\n readonly summary: string;\n readonly added: readonly string[];\n readonly modified: readonly string[];\n readonly deleted: readonly string[];\n};\n\nexport type CreateApplyPatchToolOptions = Omit<ApplyPatchRequest, \"patch\"> & {\n readonly description?: string;\n};\n\nconst applyPatchToolInputSchema = z.object({\n input: z.string().min(1).describe(CODEX_APPLY_PATCH_INPUT_DESCRIPTION),\n});\n\nexport type ApplyPatchToolInput = z.output<typeof applyPatchToolInputSchema>;\n\nexport function createApplyPatchTool(\n options: CreateApplyPatchToolOptions = {},\n): LlmFunctionTool<typeof applyPatchToolInputSchema, ApplyPatchResult> {\n return tool({\n description: options.description ?? CODEX_APPLY_PATCH_JSON_TOOL_DESCRIPTION,\n inputSchema: applyPatchToolInputSchema,\n execute: async ({ input }) =>\n applyPatch({\n patch: input,\n cwd: options.cwd,\n fs: options.fs,\n allowOutsideCwd: options.allowOutsideCwd,\n checkAccess: options.checkAccess,\n maxPatchBytes: options.maxPatchBytes,\n }),\n });\n}\n\nexport async function applyPatch(request: ApplyPatchRequest): Promise<ApplyPatchResult> {\n const cwd = path.resolve(request.cwd ?? process.cwd());\n const adapter = request.fs ?? createNodeAgentFilesystem();\n const allowOutsideCwd = request.allowOutsideCwd === true;\n const patchBytes = Buffer.byteLength(request.patch, \"utf8\");\n const maxPatchBytes = request.maxPatchBytes ?? DEFAULT_MAX_PATCH_BYTES;\n if (patchBytes > maxPatchBytes) {\n throw new Error(\n `apply_patch failed: patch too large (${patchBytes} bytes > ${maxPatchBytes} bytes)`,\n );\n }\n\n const parsed = parsePatchDocument(normalizePatchText(request.patch));\n\n const added: string[] = [];\n const modified: string[] = [];\n const deleted: string[] = [];\n\n for (const operation of parsed.operations) {\n if (operation.type === \"add\") {\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"add\",\n path: absolutePath,\n });\n await adapter.ensureDir(path.dirname(absolutePath));\n await adapter.writeTextFile(absolutePath, operation.content);\n added.push(toDisplayPath(absolutePath, cwd));\n continue;\n }\n\n if (operation.type === \"delete\") {\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"delete\",\n path: absolutePath,\n });\n await adapter.readTextFile(absolutePath);\n await adapter.deleteFile(absolutePath);\n deleted.push(toDisplayPath(absolutePath, cwd));\n continue;\n }\n\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"update\",\n path: absolutePath,\n });\n const current = await adapter.readTextFile(absolutePath);\n const next = deriveUpdatedContent(current, operation.chunks, toDisplayPath(absolutePath, cwd));\n\n if (operation.movePath) {\n const destinationPath = resolvePatchPath(operation.movePath, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"move\",\n path: destinationPath,\n fromPath: absolutePath,\n toPath: destinationPath,\n });\n await adapter.ensureDir(path.dirname(destinationPath));\n await adapter.writeTextFile(destinationPath, next);\n await adapter.deleteFile(absolutePath);\n modified.push(toDisplayPath(destinationPath, cwd));\n continue;\n }\n\n await adapter.writeTextFile(absolutePath, next);\n modified.push(toDisplayPath(absolutePath, cwd));\n }\n\n return {\n success: true,\n summary: formatSummary(added, modified, deleted),\n added,\n modified,\n deleted,\n };\n}\n\nasync function runAccessHook(\n hook: ApplyPatchAccessHook | undefined,\n context: ApplyPatchAccessContext,\n): Promise<void> {\n if (!hook) {\n return;\n }\n await hook(context);\n}\n\nfunction normalizePatchText(raw: string): string {\n return raw.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction resolvePatchPath(rawPath: string, cwd: string, allowOutsideCwd: boolean): string {\n const trimmed = rawPath.trim();\n if (trimmed.length === 0) {\n throw new Error(\"apply_patch failed: empty file path\");\n }\n const absolutePath = path.isAbsolute(trimmed)\n ? path.resolve(trimmed)\n : path.resolve(cwd, trimmed);\n if (!allowOutsideCwd && !isPathInsideCwd(absolutePath, cwd)) {\n throw new Error(`apply_patch failed: path \"${trimmed}\" resolves outside cwd \"${cwd}\"`);\n }\n return absolutePath;\n}\n\nfunction isPathInsideCwd(candidatePath: string, cwd: string): boolean {\n const relative = path.relative(cwd, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction toDisplayPath(absolutePath: string, cwd: string): string {\n const relative = path.relative(cwd, absolutePath);\n if (relative === \"\") {\n return \".\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return relative;\n }\n return absolutePath;\n}\n\nfunction parsePatchDocument(patch: string): ParsedPatch {\n const lines = patch.split(\"\\n\");\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n if (lines.length < 2) {\n throw new Error(\"apply_patch failed: patch must contain Begin/End markers\");\n }\n if (lines[0] !== BEGIN_PATCH_LINE) {\n throw new Error(`apply_patch failed: missing \"${BEGIN_PATCH_LINE}\" header`);\n }\n if (lines[lines.length - 1] !== END_PATCH_LINE) {\n throw new Error(`apply_patch failed: missing \"${END_PATCH_LINE}\" footer`);\n }\n\n const body = lines.slice(1, -1);\n if (body.length === 0) {\n throw new Error(\"apply_patch failed: patch body is empty\");\n }\n\n const operations: ParsedPatchOperation[] = [];\n let index = 0;\n while (index < body.length) {\n const line = body[index];\n if (!line) {\n throw new Error(\"apply_patch failed: unexpected empty line between file sections\");\n }\n\n if (line.startsWith(ADD_FILE_PREFIX)) {\n const filePath = extractPatchPath(line, ADD_FILE_PREFIX);\n index += 1;\n const contentLines: string[] = [];\n while (index < body.length) {\n const contentLine = body[index];\n if (contentLine === undefined || isPatchSectionHeader(contentLine)) {\n break;\n }\n if (!contentLine.startsWith(\"+\")) {\n throw new Error(`apply_patch failed: invalid add-file line \"${contentLine}\"`);\n }\n contentLines.push(contentLine.slice(1));\n index += 1;\n }\n if (contentLines.length === 0) {\n throw new Error(`apply_patch failed: add-file section for \"${filePath}\" is empty`);\n }\n operations.push({\n type: \"add\",\n path: filePath,\n content: `${contentLines.join(\"\\n\")}\\n`,\n });\n continue;\n }\n\n if (line.startsWith(DELETE_FILE_PREFIX)) {\n operations.push({\n type: \"delete\",\n path: extractPatchPath(line, DELETE_FILE_PREFIX),\n });\n index += 1;\n continue;\n }\n\n if (line.startsWith(UPDATE_FILE_PREFIX)) {\n const filePath = extractPatchPath(line, UPDATE_FILE_PREFIX);\n index += 1;\n\n let movePath: string | undefined;\n const moveHeader = body[index];\n if (moveHeader?.startsWith(MOVE_TO_PREFIX)) {\n movePath = extractPatchPath(moveHeader, MOVE_TO_PREFIX);\n index += 1;\n }\n\n const chunks: ParsedUpdateChunk[] = [];\n while (index < body.length) {\n const hunkHeader = body[index];\n if (hunkHeader === undefined || isPatchSectionHeader(hunkHeader)) {\n break;\n }\n if (!(hunkHeader === \"@@\" || hunkHeader.startsWith(\"@@ \"))) {\n throw new Error(\n `apply_patch failed: expected hunk marker in \"${filePath}\", got \"${hunkHeader}\"`,\n );\n }\n const contextSelector = hunkHeader.length > 2 ? hunkHeader.slice(3) : undefined;\n index += 1;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n let sawBodyLine = false;\n let sawChangeLine = false;\n let isEndOfFile = false;\n\n while (index < body.length) {\n const chunkLine = body[index];\n if (chunkLine === undefined) {\n break;\n }\n if (\n chunkLine === \"@@\" ||\n chunkLine.startsWith(\"@@ \") ||\n isPatchSectionHeader(chunkLine)\n ) {\n break;\n }\n if (chunkLine === END_OF_FILE_LINE) {\n isEndOfFile = true;\n index += 1;\n break;\n }\n if (chunkLine.length === 0) {\n throw new Error(`apply_patch failed: invalid empty hunk line in \"${filePath}\"`);\n }\n\n const prefix = chunkLine[0];\n const content = chunkLine.slice(1);\n if (prefix === \" \") {\n oldLines.push(content);\n newLines.push(content);\n } else if (prefix === \"-\") {\n oldLines.push(content);\n sawChangeLine = true;\n } else if (prefix === \"+\") {\n newLines.push(content);\n sawChangeLine = true;\n } else {\n throw new Error(\n `apply_patch failed: unsupported hunk prefix \"${prefix}\" in \"${chunkLine}\"`,\n );\n }\n\n sawBodyLine = true;\n index += 1;\n }\n\n if (!sawBodyLine) {\n throw new Error(`apply_patch failed: empty hunk body in \"${filePath}\"`);\n }\n if (!sawChangeLine) {\n throw new Error(\n `apply_patch failed: hunk in \"${filePath}\" must include '+' or '-' lines`,\n );\n }\n\n chunks.push({\n contextSelector,\n oldLines,\n newLines,\n isEndOfFile,\n });\n }\n\n if (chunks.length === 0) {\n throw new Error(`apply_patch failed: update section for \"${filePath}\" has no hunks`);\n }\n\n operations.push({\n type: \"update\",\n path: filePath,\n movePath,\n chunks,\n });\n continue;\n }\n\n throw new Error(`apply_patch failed: unrecognized section header \"${line}\"`);\n }\n\n return { operations };\n}\n\nfunction extractPatchPath(line: string, prefix: string): string {\n const value = line.slice(prefix.length).trim();\n if (value.length === 0) {\n throw new Error(`apply_patch failed: missing file path in \"${line}\"`);\n }\n return value;\n}\n\nfunction isPatchSectionHeader(line: string): boolean {\n return (\n line.startsWith(ADD_FILE_PREFIX) ||\n line.startsWith(DELETE_FILE_PREFIX) ||\n line.startsWith(UPDATE_FILE_PREFIX)\n );\n}\n\nfunction deriveUpdatedContent(\n originalContent: string,\n chunks: readonly ParsedUpdateChunk[],\n displayPath: string,\n): string {\n const originalLines = splitFileContentIntoLines(originalContent);\n const replacements: Replacement[] = [];\n let lineIndex = 0;\n\n for (const chunk of chunks) {\n if (chunk.contextSelector !== undefined) {\n const contextIndex = seekSequence(originalLines, [chunk.contextSelector], lineIndex, false);\n if (contextIndex === null) {\n throw new Error(\n `apply_patch failed: unable to locate context \"${chunk.contextSelector}\" in ${displayPath}`,\n );\n }\n lineIndex = contextIndex + 1;\n }\n\n if (chunk.oldLines.length === 0) {\n replacements.push({\n startIndex: originalLines.length,\n oldLength: 0,\n newLines: [...chunk.newLines],\n });\n continue;\n }\n\n let oldLines = [...chunk.oldLines];\n let newLines = [...chunk.newLines];\n let startIndex = seekSequence(originalLines, oldLines, lineIndex, chunk.isEndOfFile);\n\n if (startIndex === null && oldLines.at(-1) === \"\") {\n oldLines = oldLines.slice(0, -1);\n if (newLines.at(-1) === \"\") {\n newLines = newLines.slice(0, -1);\n }\n startIndex = seekSequence(originalLines, oldLines, lineIndex, chunk.isEndOfFile);\n }\n\n if (startIndex === null) {\n throw new Error(\n `apply_patch failed: failed to match hunk in ${displayPath}:\\n${chunk.oldLines.join(\"\\n\")}`,\n );\n }\n\n replacements.push({\n startIndex,\n oldLength: oldLines.length,\n newLines,\n });\n lineIndex = startIndex + oldLines.length;\n }\n\n replacements.sort((left, right) => left.startIndex - right.startIndex);\n const nextLines = applyReplacements(originalLines, replacements);\n if (nextLines.length > 0 && nextLines[nextLines.length - 1] !== \"\") {\n nextLines.push(\"\");\n }\n return nextLines.join(\"\\n\");\n}\n\nfunction splitFileContentIntoLines(content: string): string[] {\n const lines = content.split(\"\\n\");\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction seekSequence(\n sourceLines: readonly string[],\n targetLines: readonly string[],\n startIndex: number,\n isEndOfFile: boolean,\n): number | null {\n if (targetLines.length === 0) {\n return Math.min(Math.max(startIndex, 0), sourceLines.length);\n }\n const from = Math.max(startIndex, 0);\n const maxStart = sourceLines.length - targetLines.length;\n if (maxStart < from) {\n return null;\n }\n\n const matchesAt = (candidateIndex: number): boolean => {\n for (let offset = 0; offset < targetLines.length; offset += 1) {\n if (sourceLines[candidateIndex + offset] !== targetLines[offset]) {\n return false;\n }\n }\n return true;\n };\n\n if (isEndOfFile) {\n return matchesAt(maxStart) ? maxStart : null;\n }\n\n for (let candidate = from; candidate <= maxStart; candidate += 1) {\n if (matchesAt(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction applyReplacements(\n lines: readonly string[],\n replacements: readonly Replacement[],\n): string[] {\n const result = [...lines];\n for (let index = replacements.length - 1; index >= 0; index -= 1) {\n const replacement = replacements[index];\n if (replacement === undefined) {\n continue;\n }\n result.splice(replacement.startIndex, replacement.oldLength, ...replacement.newLines);\n }\n return result;\n}\n\nfunction formatSummary(\n added: readonly string[],\n modified: readonly string[],\n deleted: readonly string[],\n): string {\n const lines = [\"Success. Updated the following files:\"];\n for (const filePath of added) {\n lines.push(`A ${filePath}`);\n }\n for (const filePath of modified) {\n lines.push(`M ${filePath}`);\n }\n for (const filePath of deleted) {\n lines.push(`D ${filePath}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nexport type AgentPathKind = \"file\" | \"directory\" | \"symlink\" | \"other\";\n\nexport type AgentPathInfo = {\n readonly kind: AgentPathKind;\n readonly mtimeMs: number;\n};\n\nexport type AgentDirectoryEntry = {\n readonly name: string;\n readonly path: string;\n readonly kind: AgentPathKind;\n readonly mtimeMs: number;\n};\n\nexport interface AgentFilesystem {\n readTextFile(filePath: string): Promise<string>;\n writeTextFile(filePath: string, content: string): Promise<void>;\n deleteFile(filePath: string): Promise<void>;\n ensureDir(directoryPath: string): Promise<void>;\n readDir(directoryPath: string): Promise<readonly AgentDirectoryEntry[]>;\n stat(entryPath: string): Promise<AgentPathInfo>;\n}\n\ntype InMemoryFileRecord = {\n content: string;\n mtimeMs: number;\n};\n\ntype InMemoryDirRecord = {\n mtimeMs: number;\n};\n\nexport class InMemoryAgentFilesystem implements AgentFilesystem {\n readonly #files = new Map<string, InMemoryFileRecord>();\n readonly #dirs = new Map<string, InMemoryDirRecord>();\n #clock = 0;\n\n constructor(initialFiles: Record<string, string> = {}) {\n const root = path.resolve(\"/\");\n this.#dirs.set(root, { mtimeMs: this.#nextMtime() });\n for (const [filePath, content] of Object.entries(initialFiles)) {\n const absolutePath = path.resolve(filePath);\n this.#ensureDirSync(path.dirname(absolutePath));\n this.#files.set(absolutePath, {\n content,\n mtimeMs: this.#nextMtime(),\n });\n }\n }\n\n async readTextFile(filePath: string): Promise<string> {\n const absolutePath = path.resolve(filePath);\n const file = this.#files.get(absolutePath);\n if (!file) {\n throw createNoSuchFileError(\"open\", absolutePath);\n }\n return file.content;\n }\n\n async writeTextFile(filePath: string, content: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const parentPath = path.dirname(absolutePath);\n if (!this.#dirs.has(parentPath)) {\n throw createNoSuchFileError(\"open\", parentPath);\n }\n this.#files.set(absolutePath, { content, mtimeMs: this.#nextMtime() });\n }\n\n async deleteFile(filePath: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n if (!this.#files.delete(absolutePath)) {\n throw createNoSuchFileError(\"unlink\", absolutePath);\n }\n }\n\n async ensureDir(directoryPath: string): Promise<void> {\n this.#ensureDirSync(path.resolve(directoryPath));\n }\n\n async readDir(directoryPath: string): Promise<readonly AgentDirectoryEntry[]> {\n const absolutePath = path.resolve(directoryPath);\n const directory = this.#dirs.get(absolutePath);\n if (!directory) {\n throw createNoSuchFileError(\"scandir\", absolutePath);\n }\n\n const entries: AgentDirectoryEntry[] = [];\n const seenNames = new Set<string>();\n\n for (const [dirPath, dirRecord] of this.#dirs.entries()) {\n if (dirPath === absolutePath) {\n continue;\n }\n if (path.dirname(dirPath) !== absolutePath) {\n continue;\n }\n const name = path.basename(dirPath);\n if (seenNames.has(name)) {\n continue;\n }\n seenNames.add(name);\n entries.push({\n name,\n path: dirPath,\n kind: \"directory\",\n mtimeMs: dirRecord.mtimeMs,\n });\n }\n\n for (const [filePath, fileRecord] of this.#files.entries()) {\n if (path.dirname(filePath) !== absolutePath) {\n continue;\n }\n const name = path.basename(filePath);\n if (seenNames.has(name)) {\n continue;\n }\n seenNames.add(name);\n entries.push({\n name,\n path: filePath,\n kind: \"file\",\n mtimeMs: fileRecord.mtimeMs,\n });\n }\n\n entries.sort((left, right) => left.name.localeCompare(right.name));\n return entries;\n }\n\n async stat(entryPath: string): Promise<AgentPathInfo> {\n const absolutePath = path.resolve(entryPath);\n const file = this.#files.get(absolutePath);\n if (file) {\n return { kind: \"file\", mtimeMs: file.mtimeMs };\n }\n const directory = this.#dirs.get(absolutePath);\n if (directory) {\n return { kind: \"directory\", mtimeMs: directory.mtimeMs };\n }\n throw createNoSuchFileError(\"stat\", absolutePath);\n }\n\n snapshot(): Record<string, string> {\n const entries = [...this.#files.entries()].sort(([left], [right]) => left.localeCompare(right));\n return Object.fromEntries(entries.map(([filePath, record]) => [filePath, record.content]));\n }\n\n #ensureDirSync(directoryPath: string): void {\n const absolutePath = path.resolve(directoryPath);\n const parts: string[] = [];\n let cursor = absolutePath;\n for (;;) {\n if (this.#dirs.has(cursor)) {\n break;\n }\n parts.push(cursor);\n const parent = path.dirname(cursor);\n if (parent === cursor) {\n break;\n }\n cursor = parent;\n }\n for (let index = parts.length - 1; index >= 0; index -= 1) {\n const nextDir = parts[index];\n if (nextDir === undefined) {\n continue;\n }\n if (!this.#dirs.has(nextDir)) {\n this.#dirs.set(nextDir, { mtimeMs: this.#nextMtime() });\n }\n }\n }\n\n #nextMtime(): number {\n this.#clock += 1;\n return this.#clock;\n }\n}\n\nexport function createNodeAgentFilesystem(): AgentFilesystem {\n return {\n readTextFile: async (filePath: string) => fs.readFile(filePath, \"utf8\"),\n writeTextFile: async (filePath: string, content: string) =>\n fs.writeFile(filePath, content, \"utf8\"),\n deleteFile: async (filePath: string) => fs.unlink(filePath),\n ensureDir: async (directoryPath: string) => {\n await fs.mkdir(directoryPath, { recursive: true });\n },\n readDir: async (directoryPath: string) => {\n const entries = await fs.readdir(directoryPath, { withFileTypes: true });\n const result: AgentDirectoryEntry[] = [];\n for (const entry of entries) {\n const entryPath = path.resolve(directoryPath, entry.name);\n const stats = await fs.lstat(entryPath);\n result.push({\n name: entry.name,\n path: entryPath,\n kind: statsToKind(stats),\n mtimeMs: stats.mtimeMs,\n });\n }\n return result;\n },\n stat: async (entryPath: string) => {\n const stats = await fs.lstat(entryPath);\n return {\n kind: statsToKind(stats),\n mtimeMs: stats.mtimeMs,\n };\n },\n };\n}\n\nexport function createInMemoryAgentFilesystem(\n initialFiles: Record<string, string> = {},\n): InMemoryAgentFilesystem {\n return new InMemoryAgentFilesystem(initialFiles);\n}\n\nfunction statsToKind(stats: {\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n}): AgentPathKind {\n if (stats.isSymbolicLink()) {\n return \"symlink\";\n }\n if (stats.isDirectory()) {\n return \"directory\";\n }\n if (stats.isFile()) {\n return \"file\";\n }\n return \"other\";\n}\n\nfunction createNoSuchFileError(syscall: string, filePath: string): NodeJS.ErrnoException {\n const error = new Error(\n `ENOENT: no such file or directory, ${syscall} '${filePath}'`,\n ) as NodeJS.ErrnoException;\n error.code = \"ENOENT\";\n error.syscall = syscall;\n error.path = filePath;\n return error;\n}\n","import {\n runToolLoop,\n type LlmToolLoopRequest,\n type LlmToolLoopResult,\n type LlmToolSet,\n} from \"./llm.js\";\nimport {\n createFilesystemToolSetForModel,\n type AgentFilesystemToolProfile,\n type AgentFilesystemToolsOptions,\n} from \"./tools/filesystemTools.js\";\n\nexport type AgentFilesystemToolConfig = {\n readonly enabled?: boolean;\n readonly profile?: AgentFilesystemToolProfile;\n readonly options?: AgentFilesystemToolsOptions;\n};\n\nexport type AgentFilesystemToolSelection =\n | boolean\n | AgentFilesystemToolProfile\n | AgentFilesystemToolConfig;\n\nexport type RunAgentLoopRequest = Omit<LlmToolLoopRequest, \"tools\"> & {\n readonly tools?: LlmToolSet;\n readonly filesystemTool?: AgentFilesystemToolSelection;\n readonly filesystem_tool?: AgentFilesystemToolSelection;\n};\n\nexport async function runAgentLoop(request: RunAgentLoopRequest): Promise<LlmToolLoopResult> {\n const { tools: customTools, filesystemTool, filesystem_tool, ...toolLoopRequest } = request;\n\n const filesystemSelection = filesystemTool ?? filesystem_tool;\n const filesystemTools = resolveFilesystemTools(request.model, filesystemSelection);\n const mergedTools = mergeToolSets(filesystemTools, customTools ?? {});\n\n if (Object.keys(mergedTools).length === 0) {\n throw new Error(\n \"runAgentLoop requires at least one tool. Provide `tools` or enable `filesystemTool`.\",\n );\n }\n\n return runToolLoop({\n ...toolLoopRequest,\n tools: mergedTools,\n });\n}\n\nfunction resolveFilesystemTools(\n model: string,\n selection: AgentFilesystemToolSelection | undefined,\n): LlmToolSet {\n if (selection === undefined || selection === false) {\n return {};\n }\n if (selection === true) {\n return createFilesystemToolSetForModel(model, \"auto\");\n }\n if (typeof selection === \"string\") {\n return createFilesystemToolSetForModel(model, selection);\n }\n if (selection.enabled === false) {\n return {};\n }\n if (selection.options && selection.profile !== undefined) {\n return createFilesystemToolSetForModel(model, selection.profile, selection.options);\n }\n if (selection.options) {\n return createFilesystemToolSetForModel(model, selection.options);\n }\n return createFilesystemToolSetForModel(model, selection.profile ?? \"auto\");\n}\n\nfunction mergeToolSets(base: LlmToolSet, extra: LlmToolSet): LlmToolSet {\n const merged: LlmToolSet = { ...base };\n for (const [toolName, toolSpec] of Object.entries(extra)) {\n if (Object.hasOwn(merged, toolName)) {\n throw new Error(\n `Duplicate tool name \"${toolName}\" in runAgentLoop. Rename the custom tool or disable that filesystem tool.`,\n );\n }\n merged[toolName] = toolSpec;\n }\n return merged;\n}\n"],"mappings":"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","names":["Buffer","z","os","Buffer","fs","path","Buffer","path","fs","body","os","z","z","scheduler","OpenAI","Agent","undiciFetch","cachedApiKey","cachedClient","cachedFetch","cachedTimeoutMs","Agent","undiciFetch","OpenAI","scheduler","Buffer","tool","path","text","content","result","z","path","z","path","z","fs","path","z","path","absolutePath","z","resolvedProfile","path","runAccessHook","toDisplayPath","end","isPathInsideCwd"]}
|
|
1
|
+
{"version":3,"sources":["../src/llm.ts","../src/utils/asyncQueue.ts","../src/fireworks/pricing.ts","../src/google/pricing.ts","../src/openai/pricing.ts","../src/utils/cost.ts","../src/openai/chatgpt-codex.ts","../src/openai/chatgpt-auth.ts","../src/utils/env.ts","../src/openai/responses-websocket.ts","../src/utils/scheduler.ts","../src/fireworks/client.ts","../src/fireworks/calls.ts","../src/fireworks/models.ts","../src/google/client.ts","../src/google/auth.ts","../src/google/calls.ts","../src/openai/client.ts","../src/openai/calls.ts","../src/openai/models.ts","../src/tools/filesystemTools.ts","../src/tools/applyPatch.ts","../src/tools/filesystem.ts","../src/agent.ts"],"sourcesContent":["import { Buffer } from \"node:buffer\";\nimport { AsyncLocalStorage } from \"node:async_hooks\";\nimport { randomBytes } from \"node:crypto\";\n\nimport {\n FinishReason,\n FunctionCallingConfigMode,\n type Content as GeminiContent,\n type GenerateContentConfig,\n type GroundingMetadata,\n type Part as GeminiPart,\n type Tool as GeminiTool,\n} from \"@google/genai\";\nimport { zodToJsonSchema } from \"@alcyone-labs/zod-to-json-schema\";\nimport { z } from \"zod\";\nimport type { ResponseTextConfig } from \"openai/resources/responses/responses\";\n\nimport { createAsyncQueue, type AsyncQueue } from \"./utils/asyncQueue.js\";\nimport { estimateCallCostUsd, type LlmUsageTokens } from \"./utils/cost.js\";\nimport { collectChatGptCodexResponse, type ChatGptInputItem } from \"./openai/chatgpt-codex.js\";\nimport { runFireworksCall } from \"./fireworks/calls.js\";\nimport {\n FIREWORKS_MODEL_IDS,\n isFireworksModelId,\n resolveFireworksModelId,\n} from \"./fireworks/models.js\";\nimport { runGeminiCall } from \"./google/calls.js\";\nimport {\n GEMINI_IMAGE_MODEL_IDS,\n GEMINI_TEXT_MODEL_IDS,\n isGeminiImageModelId,\n isGeminiTextModelId,\n} from \"./google/client.js\";\nimport {\n runOpenAiCall,\n type OpenAiReasoningEffort,\n DEFAULT_OPENAI_REASONING_EFFORT,\n} from \"./openai/calls.js\";\nimport {\n CHATGPT_MODEL_IDS,\n OPENAI_MODEL_IDS,\n stripChatGptPrefix,\n isChatGptModelId,\n isOpenAiModelId,\n} from \"./openai/models.js\";\n\nexport type { LlmUsageTokens } from \"./utils/cost.js\";\nexport { estimateCallCostUsd } from \"./utils/cost.js\";\n\ntype CollectChatGptCodexResponseOptions = Parameters<typeof collectChatGptCodexResponse>[0];\ntype CollectChatGptCodexResponseResult = Awaited<ReturnType<typeof collectChatGptCodexResponse>>;\n\nexport type LlmToolCallContext = {\n readonly toolName: string;\n readonly toolId: string;\n readonly turn: number;\n readonly toolIndex: number;\n};\n\nconst toolCallContextStorage = new AsyncLocalStorage<LlmToolCallContext>();\n\nexport function getCurrentToolCallContext(): LlmToolCallContext | null {\n return toolCallContextStorage.getStore() ?? null;\n}\n\nexport type JsonSchema = Record<string, unknown>;\n\nexport type LlmRole = \"user\" | \"assistant\" | \"system\" | \"developer\" | \"tool\";\n\ntype LlmInlineDataPart = {\n type: \"inlineData\";\n data: string;\n mimeType?: string;\n};\n\nexport type LlmContentPart = { type: \"text\"; text: string; thought?: boolean } | LlmInlineDataPart;\n\nexport type LlmContent = {\n readonly role: LlmRole;\n readonly parts: readonly LlmContentPart[];\n};\n\nexport type LlmImageSize = \"1K\" | \"2K\" | \"4K\";\n\nexport type LlmWebSearchMode = \"cached\" | \"live\";\n\nexport type LlmToolConfig =\n | { readonly type: \"web-search\"; readonly mode?: LlmWebSearchMode }\n | { readonly type: \"code-execution\" };\n\nexport type LlmTextDeltaEvent =\n | { readonly type: \"delta\"; readonly channel: \"response\"; readonly text: string }\n | { readonly type: \"delta\"; readonly channel: \"thought\"; readonly text: string };\n\nexport type LlmUsageEvent = {\n readonly type: \"usage\";\n readonly usage: LlmUsageTokens;\n readonly costUsd: number;\n readonly modelVersion: string;\n};\n\nexport type LlmModelEvent = {\n readonly type: \"model\";\n readonly modelVersion: string;\n};\n\nexport type LlmBlockedEvent = {\n readonly type: \"blocked\";\n};\n\nexport type LlmStreamEvent = LlmTextDeltaEvent | LlmUsageEvent | LlmModelEvent | LlmBlockedEvent;\n\nexport type LlmProvider = \"openai\" | \"chatgpt\" | \"gemini\" | \"fireworks\";\nexport const LLM_TEXT_MODEL_IDS = [\n ...OPENAI_MODEL_IDS,\n ...CHATGPT_MODEL_IDS,\n ...FIREWORKS_MODEL_IDS,\n ...GEMINI_TEXT_MODEL_IDS,\n] as const;\nexport type LlmTextModelId = (typeof LLM_TEXT_MODEL_IDS)[number];\n\nexport const LLM_IMAGE_MODEL_IDS = [...GEMINI_IMAGE_MODEL_IDS] as const;\nexport type LlmImageModelId = (typeof LLM_IMAGE_MODEL_IDS)[number];\n\nexport const LLM_MODEL_IDS = [...LLM_TEXT_MODEL_IDS, ...LLM_IMAGE_MODEL_IDS] as const;\nexport type LlmModelId = (typeof LLM_MODEL_IDS)[number];\n\nexport function isLlmTextModelId(value: string): value is LlmTextModelId {\n return (\n isOpenAiModelId(value) ||\n isChatGptModelId(value) ||\n isFireworksModelId(value) ||\n isGeminiTextModelId(value)\n );\n}\n\nexport function isLlmImageModelId(value: string): value is LlmImageModelId {\n return isGeminiImageModelId(value);\n}\n\nexport function isLlmModelId(value: string): value is LlmModelId {\n return isLlmTextModelId(value) || isLlmImageModelId(value);\n}\n\nexport type LlmTextResult = {\n readonly provider: LlmProvider;\n readonly model: LlmModelId;\n readonly modelVersion: string;\n readonly content?: LlmContent;\n readonly text: string;\n readonly thoughts: string;\n readonly blocked: boolean;\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n readonly grounding?: GroundingMetadata;\n};\n\nexport type LlmTextStream = {\n readonly events: AsyncIterable<LlmStreamEvent>;\n readonly result: Promise<LlmTextResult>;\n readonly abort: () => void;\n};\n\nexport type DeepPartial<T> =\n T extends ReadonlyArray<infer Item>\n ? ReadonlyArray<DeepPartial<Item>>\n : T extends Array<infer Item>\n ? Array<DeepPartial<Item>>\n : T extends object\n ? { [K in keyof T]?: DeepPartial<T[K]> }\n : T;\n\nexport type LlmJsonPartialEvent<T> = {\n readonly type: \"json\";\n readonly stage: \"partial\";\n readonly value: DeepPartial<T>;\n};\n\nexport type LlmJsonFinalEvent<T> = {\n readonly type: \"json\";\n readonly stage: \"final\";\n readonly value: T;\n};\n\nexport type LlmJsonStreamEvent<T> = LlmStreamEvent | LlmJsonPartialEvent<T> | LlmJsonFinalEvent<T>;\n\nexport type LlmJsonStream<T> = {\n readonly events: AsyncIterable<LlmJsonStreamEvent<T>>;\n readonly result: Promise<{\n readonly value: T;\n readonly rawText: string;\n readonly result: LlmTextResult;\n }>;\n readonly abort: () => void;\n};\n\nexport type LlmInputMessage = {\n readonly role: \"user\" | \"assistant\" | \"system\" | \"developer\";\n readonly content: string | readonly LlmContentPart[];\n};\n\nexport type LlmInput = {\n /**\n * OpenAI-style input:\n * - a plain string becomes one user message\n * - message arrays allow multi-turn + role-specific content\n */\n readonly input: string | readonly LlmInputMessage[];\n /**\n * OpenAI-style top-level instructions.\n * Applied as a system message before input.\n */\n readonly instructions?: string;\n};\n\nexport type LlmBaseRequest = {\n readonly model: LlmModelId;\n readonly tools?: readonly LlmToolConfig[];\n readonly responseMimeType?: string;\n readonly responseJsonSchema?: JsonSchema;\n readonly responseModalities?: readonly string[];\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly openAiTextFormat?: ResponseTextConfig[\"format\"];\n readonly signal?: AbortSignal;\n};\n\nexport type LlmTextRequest = LlmInput & LlmBaseRequest;\n\ntype LlmStructuredRequestBase = Omit<LlmBaseRequest, \"model\"> & {\n readonly model: LlmTextModelId;\n};\n\nexport type LlmJsonRequest<T> = LlmInput &\n LlmStructuredRequestBase & {\n readonly schema: z.ZodType<T>;\n readonly openAiSchemaName?: string;\n readonly maxAttempts?: number;\n readonly normalizeJson?: (value: unknown) => unknown;\n /**\n * Optional streaming callback. Useful to surface thought deltas while still\n * returning a single validated JSON result.\n */\n readonly onEvent?: (event: LlmStreamEvent) => void;\n };\n\nexport type LlmJsonStreamRequest<T> = LlmJsonRequest<T> & {\n /**\n * - \"partial\" (default): emit best-effort partial JSON snapshots while streaming.\n * - \"final\": stream thought deltas but only emit the final validated JSON value.\n */\n readonly streamMode?: \"partial\" | \"final\";\n};\n\nexport class LlmJsonCallError extends Error {\n constructor(\n message: string,\n readonly attempts: ReadonlyArray<{\n readonly attempt: number;\n readonly rawText: string;\n readonly error: unknown;\n }>,\n ) {\n super(message);\n this.name = \"LlmJsonCallError\";\n }\n}\n\nexport type LlmImageData = {\n readonly mimeType?: string;\n readonly data: Buffer;\n};\n\nexport type LlmGenerateImagesRequest = {\n readonly model: LlmImageModelId; // e.g. \"gemini-3-pro-image-preview\"\n readonly stylePrompt: string;\n readonly styleImages?: readonly LlmImageData[];\n readonly imagePrompts: readonly string[];\n readonly imageGradingPrompt: string;\n readonly maxAttempts?: number;\n readonly imageAspectRatio?: string;\n readonly imageSize?: LlmImageSize;\n readonly signal?: AbortSignal;\n};\n\nexport type LlmFunctionTool<Schema extends z.ZodType, Output> = {\n readonly type?: \"function\";\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n};\n\nexport type LlmCustomToolInputFormat =\n | { readonly type: \"text\" }\n | {\n readonly type: \"grammar\";\n readonly syntax: \"lark\" | \"regex\";\n readonly definition: string;\n };\n\nexport type LlmCustomTool<Output> = {\n readonly type: \"custom\";\n readonly description?: string;\n readonly format?: LlmCustomToolInputFormat;\n readonly execute: (input: string) => Promise<Output> | Output;\n};\n\nexport type LlmExecutableTool<Schema extends z.ZodType, Output> =\n | LlmFunctionTool<Schema, Output>\n | LlmCustomTool<Output>;\n\nexport type LlmToolSet = Record<string, LlmExecutableTool<z.ZodType, unknown>>;\n\nexport function tool<Schema extends z.ZodType, Output>(options: {\n readonly description?: string;\n readonly inputSchema: Schema;\n readonly execute: (input: z.output<Schema>) => Promise<Output> | Output;\n}): LlmFunctionTool<Schema, Output> {\n return {\n type: \"function\",\n ...options,\n };\n}\n\nexport function customTool<Output>(options: {\n readonly description?: string;\n readonly format?: LlmCustomToolInputFormat;\n readonly execute: (input: string) => Promise<Output> | Output;\n}): LlmCustomTool<Output> {\n return {\n type: \"custom\",\n ...options,\n };\n}\n\nexport type LlmToolCallResult = {\n readonly toolName: string;\n readonly input: unknown;\n readonly output: unknown;\n readonly error?: string;\n readonly callId?: string;\n};\n\nexport type LlmToolLoopStep = {\n readonly step: number;\n readonly modelVersion: string;\n readonly text?: string;\n readonly thoughts?: string;\n readonly toolCalls: readonly LlmToolCallResult[];\n readonly usage?: LlmUsageTokens;\n readonly costUsd: number;\n};\n\nexport type LlmToolLoopResult = {\n readonly text: string;\n readonly thoughts: string;\n readonly steps: readonly LlmToolLoopStep[];\n readonly totalCostUsd: number;\n};\n\nexport type LlmToolLoopRequest = LlmInput & {\n readonly model: LlmTextModelId;\n readonly tools: LlmToolSet;\n readonly modelTools?: readonly LlmToolConfig[];\n readonly maxSteps?: number;\n readonly openAiReasoningEffort?: OpenAiReasoningEffort;\n readonly onEvent?: (event: LlmStreamEvent) => void;\n readonly signal?: AbortSignal;\n};\n\nfunction isPlainRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction applyNullableJsonSchema(schema: Record<string, unknown>): void {\n const anyOf = schema.anyOf;\n if (Array.isArray(anyOf)) {\n if (!anyOf.some((entry) => isPlainRecord(entry) && entry.type === \"null\")) {\n anyOf.push({ type: \"null\" });\n }\n return;\n }\n const type = schema.type;\n if (typeof type === \"string\") {\n schema.type = type === \"null\" ? \"null\" : [type, \"null\"];\n return;\n }\n if (Array.isArray(type)) {\n const normalized = type.filter((entry): entry is string => typeof entry === \"string\");\n if (!normalized.includes(\"null\")) {\n schema.type = [...normalized, \"null\"];\n } else {\n schema.type = normalized;\n }\n return;\n }\n schema.type = [\"null\"];\n}\n\nfunction orderedJsonSchemaKeys(\n properties: Record<string, unknown>,\n ordering: readonly string[] | undefined,\n): string[] {\n const keys = Object.keys(properties);\n if (!ordering || ordering.length === 0) {\n return keys;\n }\n const ordered: string[] = [];\n const seen = new Set<string>();\n for (const key of ordering) {\n if (Object.hasOwn(properties, key)) {\n ordered.push(key);\n seen.add(key);\n }\n }\n for (const key of keys) {\n if (!seen.has(key)) {\n ordered.push(key);\n }\n }\n return ordered;\n}\n\nfunction addGeminiPropertyOrdering(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"items\") {\n output.items = isPlainRecord(value) ? addGeminiPropertyOrdering(value as JsonSchema) : value;\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n output[key] = Array.isArray(value)\n ? value.map((entry) => addGeminiPropertyOrdering(entry as JsonSchema))\n : value;\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = addGeminiPropertyOrdering(defValue as JsonSchema);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const properties: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(propertiesRaw)) {\n properties[key] = isPlainRecord(value)\n ? addGeminiPropertyOrdering(value as JsonSchema)\n : value;\n }\n output.properties = properties;\n output.propertyOrdering = Object.keys(properties);\n }\n if ((schema as { nullable?: unknown }).nullable) {\n applyNullableJsonSchema(output);\n }\n return output;\n}\n\nfunction normalizeOpenAiSchema(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref === \"string\") {\n return { $ref: schema.$ref };\n }\n const output: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(schema)) {\n if (key === \"properties\") {\n continue;\n }\n if (key === \"required\") {\n continue;\n }\n if (key === \"additionalProperties\") {\n continue;\n }\n if (key === \"propertyOrdering\") {\n continue;\n }\n if (key === \"items\") {\n if (isPlainRecord(value)) {\n output.items = normalizeOpenAiSchema(value);\n }\n continue;\n }\n if (key === \"anyOf\" || key === \"oneOf\") {\n if (Array.isArray(value)) {\n output.anyOf = value.map((entry) => normalizeOpenAiSchema(entry as JsonSchema));\n }\n continue;\n }\n if (key === \"$defs\" && isPlainRecord(value)) {\n const defs: Record<string, unknown> = {};\n for (const [defKey, defValue] of Object.entries(value)) {\n if (isPlainRecord(defValue)) {\n defs[defKey] = normalizeOpenAiSchema(defValue);\n }\n }\n output.$defs = defs;\n continue;\n }\n output[key] = value;\n }\n\n const propertiesRaw = schema.properties;\n if (isPlainRecord(propertiesRaw)) {\n const ordering = Array.isArray((schema as { propertyOrdering?: unknown }).propertyOrdering)\n ? ((schema as { propertyOrdering?: unknown }).propertyOrdering as string[])\n : undefined;\n const orderedKeys = orderedJsonSchemaKeys(propertiesRaw, ordering);\n const properties: Record<string, unknown> = {};\n for (const key of orderedKeys) {\n const value = propertiesRaw[key];\n if (!isPlainRecord(value)) {\n properties[key] = value;\n continue;\n }\n properties[key] = normalizeOpenAiSchema(value as JsonSchema);\n }\n output.properties = properties;\n output.required = orderedKeys;\n output.additionalProperties = false;\n }\n\n const schemaType = (schema as { type?: unknown }).type;\n if (\n output.additionalProperties === undefined &&\n (schemaType === \"object\" || (Array.isArray(schemaType) && schemaType.includes(\"object\")))\n ) {\n output.additionalProperties = false;\n if (!Array.isArray(output.required)) {\n output.required = [];\n }\n }\n\n const normalizeExclusiveBound = (options: {\n exclusiveKey: \"exclusiveMinimum\" | \"exclusiveMaximum\";\n inclusiveKey: \"minimum\" | \"maximum\";\n }): void => {\n const exclusiveValue = output[options.exclusiveKey];\n if (exclusiveValue === false) {\n delete output[options.exclusiveKey];\n return;\n }\n const inclusiveValue = output[options.inclusiveKey];\n if (exclusiveValue === true) {\n if (typeof inclusiveValue === \"number\" && Number.isFinite(inclusiveValue)) {\n output[options.exclusiveKey] = inclusiveValue;\n delete output[options.inclusiveKey];\n } else {\n delete output[options.exclusiveKey];\n }\n return;\n }\n if (typeof exclusiveValue === \"number\" && Number.isFinite(exclusiveValue)) {\n delete output[options.inclusiveKey];\n }\n };\n\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMinimum\",\n inclusiveKey: \"minimum\",\n });\n normalizeExclusiveBound({\n exclusiveKey: \"exclusiveMaximum\",\n inclusiveKey: \"maximum\",\n });\n\n return output;\n}\n\nfunction resolveOpenAiSchemaRoot(schema: JsonSchema): JsonSchema {\n if (!isPlainRecord(schema)) {\n return schema;\n }\n if (typeof schema.$ref !== \"string\") {\n return schema;\n }\n const refMatch = /^#\\/(definitions|[$]defs)\\/(.+)$/u.exec(schema.$ref);\n if (!refMatch) {\n return schema;\n }\n const section = refMatch[1];\n const key = refMatch[2];\n if (!section || !key) {\n return schema;\n }\n const defsSource =\n section === \"definitions\"\n ? (schema as { definitions?: unknown }).definitions\n : (schema as { $defs?: unknown }).$defs;\n if (!isPlainRecord(defsSource)) {\n return schema;\n }\n const resolved = defsSource[key];\n if (!isPlainRecord(resolved)) {\n return schema;\n }\n return { ...resolved };\n}\n\nexport function toGeminiJsonSchema(schema: z.ZodType, options?: { name?: string }): JsonSchema {\n const jsonSchema = zodToJsonSchema(schema, {\n name: options?.name,\n target: \"jsonSchema7\",\n }) as JsonSchema;\n return addGeminiPropertyOrdering(resolveOpenAiSchemaRoot(jsonSchema));\n}\n\nfunction isJsonSchemaObject(schema: JsonSchema | undefined): boolean {\n if (!schema || !isPlainRecord(schema)) {\n return false;\n }\n const type = (schema as { type?: unknown }).type;\n if (type === \"object\") {\n return true;\n }\n if (Array.isArray(type) && type.includes(\"object\")) {\n return true;\n }\n if (isPlainRecord((schema as { properties?: unknown }).properties)) {\n return true;\n }\n return false;\n}\n\nexport function sanitisePartForLogging(part: LlmContentPart): unknown {\n switch (part.type) {\n case \"text\":\n return {\n type: \"text\",\n thought: part.thought === true ? true : undefined,\n preview: part.text.slice(0, 200),\n };\n case \"inlineData\": {\n let omittedBytes: number;\n try {\n omittedBytes = Buffer.from(part.data, \"base64\").byteLength;\n } catch {\n omittedBytes = Buffer.byteLength(part.data, \"utf8\");\n }\n return {\n type: \"inlineData\",\n mimeType: part.mimeType,\n data: `[omitted:${omittedBytes}b]`,\n };\n }\n default:\n return \"[unknown part]\";\n }\n}\n\nexport function convertGooglePartsToLlmParts(parts: readonly GeminiPart[]): LlmContentPart[] {\n const result: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.text !== undefined) {\n result.push({\n type: \"text\",\n text: part.text,\n thought: part.thought ? true : undefined,\n });\n continue;\n }\n const inline = part.inlineData;\n if (inline?.data) {\n result.push({\n type: \"inlineData\",\n data: inline.data,\n mimeType: inline.mimeType,\n });\n continue;\n }\n if (part.fileData?.fileUri) {\n throw new Error(\"fileData parts are not supported\");\n }\n }\n return result;\n}\n\nfunction assertLlmRole(value: string | undefined): LlmRole {\n switch (value) {\n case \"user\":\n case \"assistant\":\n case \"system\":\n case \"developer\":\n case \"tool\":\n return value;\n case \"model\":\n return \"assistant\";\n default:\n throw new Error(`Unsupported LLM role: ${String(value)}`);\n }\n}\n\nfunction convertGeminiContentToLlmContent(content: GeminiContent): LlmContent {\n return {\n role: assertLlmRole(content.role),\n parts: convertGooglePartsToLlmParts(content.parts ?? []),\n };\n}\n\nfunction toGeminiPart(part: LlmContentPart): GeminiPart {\n switch (part.type) {\n case \"text\":\n return {\n text: part.text,\n thought: part.thought === true ? true : undefined,\n };\n case \"inlineData\":\n return {\n inlineData: {\n data: part.data,\n mimeType: part.mimeType,\n },\n };\n default:\n throw new Error(\"Unsupported LLM content part\");\n }\n}\n\nfunction convertLlmContentToGeminiContent(content: LlmContent): GeminiContent {\n const role = content.role === \"assistant\" ? \"model\" : \"user\";\n return {\n role,\n parts: content.parts.map(toGeminiPart),\n };\n}\n\nfunction resolveProvider(model: LlmModelId): { provider: LlmProvider; model: string } {\n if (isChatGptModelId(model)) {\n return { provider: \"chatgpt\", model: stripChatGptPrefix(model) };\n }\n if (isGeminiTextModelId(model) || isGeminiImageModelId(model)) {\n return { provider: \"gemini\", model };\n }\n if (isFireworksModelId(model)) {\n const fireworksModel = resolveFireworksModelId(model);\n if (fireworksModel) {\n return { provider: \"fireworks\", model: fireworksModel };\n }\n }\n if (isOpenAiModelId(model)) {\n return { provider: \"openai\", model };\n }\n throw new Error(`Unsupported text model: ${model}`);\n}\n\nfunction isOpenAiCodexModel(modelId: string): boolean {\n return modelId.includes(\"codex\");\n}\n\nfunction resolveOpenAiReasoningEffort(\n modelId: string,\n override?: OpenAiReasoningEffort,\n): OpenAiReasoningEffort {\n if (override) {\n return override;\n }\n if (isOpenAiCodexModel(modelId)) {\n return \"medium\";\n }\n return DEFAULT_OPENAI_REASONING_EFFORT;\n}\n\ntype OpenAiReasoningEffortParam = \"minimal\" | \"low\" | \"medium\" | \"high\";\n\nfunction toOpenAiReasoningEffort(effort: OpenAiReasoningEffort): OpenAiReasoningEffortParam {\n switch (effort) {\n case \"low\":\n return \"low\";\n case \"medium\":\n return \"medium\";\n case \"high\":\n return \"high\";\n case \"xhigh\":\n return \"high\";\n }\n}\n\nfunction resolveOpenAiVerbosity(modelId: string): \"low\" | \"medium\" | \"high\" {\n return isOpenAiCodexModel(modelId) ? \"medium\" : \"high\";\n}\n\nfunction isRetryableChatGptTransportError(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return (\n message === \"terminated\" ||\n message.includes(\"socket hang up\") ||\n message.includes(\"fetch failed\") ||\n message.includes(\"network\")\n );\n}\n\nasync function collectChatGptCodexResponseWithRetry(\n options: CollectChatGptCodexResponseOptions,\n maxAttempts = 2,\n): Promise<CollectChatGptCodexResponseResult> {\n let attempt = 1;\n while (true) {\n try {\n return await collectChatGptCodexResponse(options);\n } catch (error) {\n if (attempt >= maxAttempts || !isRetryableChatGptTransportError(error)) {\n throw error;\n }\n await new Promise((resolve) => setTimeout(resolve, 250 * attempt));\n attempt += 1;\n }\n }\n}\n\nfunction isInlineImageMime(mimeType: string | undefined): boolean {\n if (!mimeType) {\n return false;\n }\n return mimeType.startsWith(\"image/\");\n}\n\nfunction guessInlineDataFilename(mimeType: string | undefined): string {\n switch (mimeType) {\n case \"application/pdf\":\n return \"document.pdf\";\n case \"application/json\":\n return \"data.json\";\n case \"text/markdown\":\n return \"document.md\";\n case \"text/plain\":\n return \"document.txt\";\n default:\n return \"attachment.bin\";\n }\n}\n\nfunction mergeConsecutiveTextParts(parts: readonly LlmContentPart[]): LlmContentPart[] {\n if (parts.length === 0) {\n return [];\n }\n const merged: LlmContentPart[] = [];\n for (const part of parts) {\n if (part.type !== \"text\") {\n merged.push({ type: \"inlineData\", data: part.data, mimeType: part.mimeType });\n continue;\n }\n const isThought = part.thought === true;\n const last = merged[merged.length - 1];\n if (last && last.type === \"text\" && (last.thought === true) === isThought) {\n last.text += part.text;\n last.thought = isThought ? true : undefined;\n } else {\n merged.push({\n type: \"text\",\n text: part.text,\n thought: isThought ? true : undefined,\n });\n }\n }\n return merged;\n}\n\nfunction extractTextByChannel(content: LlmContent | undefined): { text: string; thoughts: string } {\n if (!content) {\n return { text: \"\", thoughts: \"\" };\n }\n let text = \"\";\n let thoughts = \"\";\n for (const part of content.parts) {\n if (part.type !== \"text\") {\n continue;\n }\n if (part.thought === true) {\n thoughts += part.text;\n } else {\n text += part.text;\n }\n }\n return { text: text.trim(), thoughts: thoughts.trim() };\n}\n\nfunction normalizeJsonText(rawText: string): string {\n let text = rawText.trim();\n\n if (text.startsWith(\"```\")) {\n text = text.replace(/^```[a-zA-Z0-9_-]*\\s*\\n?/, \"\");\n text = text.replace(/```(?:\\s*)?$/, \"\").trim();\n }\n\n const fenced = /^```(?:json)?\\s*([\\s\\S]*?)\\s*```$/i.exec(text);\n if (fenced?.[1]) {\n return fenced[1].trim();\n }\n\n if (!text.startsWith(\"{\") && !text.startsWith(\"[\")) {\n const firstBrace = text.indexOf(\"{\");\n if (firstBrace !== -1) {\n const lastBrace = text.lastIndexOf(\"}\");\n if (lastBrace !== -1 && lastBrace > firstBrace) {\n text = text.slice(firstBrace, lastBrace + 1).trim();\n }\n }\n }\n\n return text;\n}\n\nfunction escapeNewlinesInStrings(jsonText: string): string {\n let output = \"\";\n let inString = false;\n let escaped = false;\n for (let i = 0; i < jsonText.length; i += 1) {\n const char = jsonText[i] ?? \"\";\n if (inString) {\n if (escaped) {\n output += char;\n escaped = false;\n continue;\n }\n if (char === \"\\\\\") {\n output += char;\n escaped = true;\n continue;\n }\n if (char === '\"') {\n output += char;\n inString = false;\n continue;\n }\n if (char === \"\\n\") {\n output += \"\\\\n\";\n continue;\n }\n if (char === \"\\r\") {\n output += \"\\\\r\";\n continue;\n }\n output += char;\n continue;\n }\n if (char === '\"') {\n inString = true;\n output += char;\n continue;\n }\n output += char;\n }\n return output;\n}\n\nexport function parseJsonFromLlmText(rawText: string): unknown {\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n return JSON.parse(repairedText);\n}\n\nfunction parsePartialJsonFromLlmText(rawText: string): unknown | null {\n const jsonStart = extractJsonStartText(rawText);\n if (!jsonStart) {\n return null;\n }\n try {\n return parsePartialJson(jsonStart);\n } catch {\n return null;\n }\n}\n\nfunction extractJsonStartText(rawText: string): string | null {\n let text = rawText.trimStart();\n if (text.startsWith(\"```\")) {\n text = text.replace(/^```[a-zA-Z0-9_-]*\\s*\\n?/, \"\");\n }\n const objIndex = text.indexOf(\"{\");\n const arrIndex = text.indexOf(\"[\");\n let start = -1;\n if (objIndex !== -1 && arrIndex !== -1) {\n start = Math.min(objIndex, arrIndex);\n } else {\n start = objIndex !== -1 ? objIndex : arrIndex;\n }\n if (start === -1) {\n return null;\n }\n return text.slice(start);\n}\n\ntype PartialJsonObjectContext = {\n type: \"object\";\n value: Record<string, unknown>;\n state: \"keyOrEnd\" | \"colon\" | \"value\" | \"commaOrEnd\";\n key?: string;\n};\n\ntype PartialJsonArrayContext = {\n type: \"array\";\n value: unknown[];\n state: \"valueOrEnd\" | \"commaOrEnd\";\n};\n\ntype PartialJsonContext = PartialJsonObjectContext | PartialJsonArrayContext;\n\nfunction parsePartialJson(text: string): unknown | null {\n let i = 0;\n const len = text.length;\n\n const isWhitespace = (char: string): boolean =>\n char === \" \" || char === \"\\n\" || char === \"\\r\" || char === \"\\t\";\n const skipWhitespace = (): void => {\n while (i < len && isWhitespace(text[i] ?? \"\")) {\n i += 1;\n }\n };\n\n const parseString = (): { value: string; complete: boolean } | null => {\n if (text[i] !== '\"') {\n return null;\n }\n i += 1;\n let value = \"\";\n while (i < len) {\n const ch = text[i] ?? \"\";\n if (ch === '\"') {\n i += 1;\n return { value, complete: true };\n }\n if (ch === \"\\\\\") {\n if (i + 1 >= len) {\n return { value, complete: false };\n }\n const esc = text[i + 1] ?? \"\";\n switch (esc) {\n case '\"':\n case \"\\\\\":\n case \"/\":\n value += esc;\n i += 2;\n continue;\n case \"b\":\n value += \"\\b\";\n i += 2;\n continue;\n case \"f\":\n value += \"\\f\";\n i += 2;\n continue;\n case \"n\":\n value += \"\\n\";\n i += 2;\n continue;\n case \"r\":\n value += \"\\r\";\n i += 2;\n continue;\n case \"t\":\n value += \"\\t\";\n i += 2;\n continue;\n case \"u\": {\n // \\uXXXX\n if (i + 5 >= len) {\n return { value, complete: false };\n }\n const hex = text.slice(i + 2, i + 6);\n if (!/^[0-9a-fA-F]{4}$/u.test(hex)) {\n value += \"u\";\n i += 2;\n continue;\n }\n value += String.fromCharCode(Number.parseInt(hex, 16));\n i += 6;\n continue;\n }\n default:\n value += esc;\n i += 2;\n continue;\n }\n }\n value += ch;\n i += 1;\n }\n return { value, complete: false };\n };\n\n const parseNumber = (): { value: number; complete: boolean } | null => {\n const start = i;\n while (i < len) {\n const ch = text[i] ?? \"\";\n if (isWhitespace(ch) || ch === \",\" || ch === \"}\" || ch === \"]\") {\n break;\n }\n i += 1;\n }\n const raw = text.slice(start, i);\n if (!/^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/u.test(raw)) {\n i = start;\n return null;\n }\n return { value: Number(raw), complete: true };\n };\n\n const parseLiteral = (): { value: unknown; complete: boolean } | null => {\n if (text.startsWith(\"true\", i)) {\n i += 4;\n return { value: true, complete: true };\n }\n if (text.startsWith(\"false\", i)) {\n i += 5;\n return { value: false, complete: true };\n }\n if (text.startsWith(\"null\", i)) {\n i += 4;\n return { value: null, complete: true };\n }\n return null;\n };\n\n skipWhitespace();\n const first = text[i];\n if (first !== \"{\" && first !== \"[\") {\n return null;\n }\n\n const root: unknown = first === \"{\" ? {} : [];\n const stack: PartialJsonContext[] =\n first === \"{\"\n ? [{ type: \"object\", value: root as Record<string, unknown>, state: \"keyOrEnd\" }]\n : [{ type: \"array\", value: root as unknown[], state: \"valueOrEnd\" }];\n i += 1;\n\n while (stack.length > 0) {\n skipWhitespace();\n if (i >= len) {\n break;\n }\n\n const ctx = stack[stack.length - 1];\n if (!ctx) {\n break;\n }\n\n const ch = text[i] ?? \"\";\n\n if (ctx.type === \"object\") {\n if (ctx.state === \"keyOrEnd\") {\n if (ch === \"}\") {\n i += 1;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n continue;\n }\n if (ch !== '\"') {\n break;\n }\n const key = parseString();\n if (!key) {\n break;\n }\n if (!key.complete) {\n break;\n }\n ctx.key = key.value;\n ctx.state = \"colon\";\n continue;\n }\n\n if (ctx.state === \"colon\") {\n if (ch === \":\") {\n i += 1;\n ctx.state = \"value\";\n continue;\n }\n break;\n }\n\n if (ctx.state === \"value\") {\n if (ch === \"}\") {\n i += 1;\n ctx.key = undefined;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n ctx.key = undefined;\n ctx.state = \"keyOrEnd\";\n continue;\n }\n\n const key = ctx.key;\n if (!key) {\n break;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n const container: unknown = ch === \"{\" ? {} : [];\n ctx.value[key] = container;\n ctx.key = undefined;\n ctx.state = \"commaOrEnd\";\n stack.push(\n ch === \"{\"\n ? { type: \"object\", value: container as Record<string, unknown>, state: \"keyOrEnd\" }\n : { type: \"array\", value: container as unknown[], state: \"valueOrEnd\" },\n );\n i += 1;\n continue;\n }\n\n let primitive: { value: unknown; complete: boolean } | null = null;\n if (ch === '\"') {\n primitive = parseString();\n } else if (ch === \"-\" || (ch >= \"0\" && ch <= \"9\")) {\n primitive = parseNumber();\n } else {\n primitive = parseLiteral();\n }\n if (!primitive) {\n break;\n }\n ctx.value[key] = primitive.value;\n ctx.key = undefined;\n ctx.state = \"commaOrEnd\";\n if (!primitive.complete) {\n break;\n }\n continue;\n }\n\n if (ctx.state === \"commaOrEnd\") {\n if (ch === \",\") {\n i += 1;\n ctx.state = \"keyOrEnd\";\n continue;\n }\n if (ch === \"}\") {\n i += 1;\n stack.pop();\n continue;\n }\n break;\n }\n } else {\n if (ctx.state === \"valueOrEnd\") {\n if (ch === \"]\") {\n i += 1;\n stack.pop();\n continue;\n }\n if (ch === \",\") {\n i += 1;\n continue;\n }\n\n if (ch === \"{\" || ch === \"[\") {\n const container: unknown = ch === \"{\" ? {} : [];\n ctx.value.push(container);\n ctx.state = \"commaOrEnd\";\n stack.push(\n ch === \"{\"\n ? { type: \"object\", value: container as Record<string, unknown>, state: \"keyOrEnd\" }\n : { type: \"array\", value: container as unknown[], state: \"valueOrEnd\" },\n );\n i += 1;\n continue;\n }\n\n let primitive: { value: unknown; complete: boolean } | null = null;\n if (ch === '\"') {\n primitive = parseString();\n } else if (ch === \"-\" || (ch >= \"0\" && ch <= \"9\")) {\n primitive = parseNumber();\n } else {\n primitive = parseLiteral();\n }\n if (!primitive) {\n break;\n }\n ctx.value.push(primitive.value);\n ctx.state = \"commaOrEnd\";\n if (!primitive.complete) {\n break;\n }\n continue;\n }\n\n if (ctx.state === \"commaOrEnd\") {\n if (ch === \",\") {\n i += 1;\n ctx.state = \"valueOrEnd\";\n continue;\n }\n if (ch === \"]\") {\n i += 1;\n stack.pop();\n continue;\n }\n break;\n }\n }\n }\n\n return root;\n}\n\nfunction resolveTextContents(input: LlmInput): readonly LlmContent[] {\n const contents: LlmContent[] = [];\n\n if (input.instructions) {\n const instructions = input.instructions.trim();\n if (instructions.length > 0) {\n contents.push({\n role: \"system\",\n parts: [{ type: \"text\", text: instructions }],\n });\n }\n }\n\n if (typeof input.input === \"string\") {\n contents.push({\n role: \"user\",\n parts: [{ type: \"text\", text: input.input }],\n });\n return contents;\n }\n\n for (const message of input.input) {\n const parts =\n typeof message.content === \"string\"\n ? ([{ type: \"text\", text: message.content }] as const)\n : message.content;\n contents.push({\n role: message.role,\n parts: parts.map((part) =>\n part.type === \"text\"\n ? {\n type: \"text\",\n text: part.text,\n thought: \"thought\" in part && part.thought === true ? true : undefined,\n }\n : { type: \"inlineData\", data: part.data, mimeType: part.mimeType },\n ),\n });\n }\n\n return contents;\n}\n\nfunction toOpenAiInput(contents: readonly LlmContent[]): unknown[] {\n // Keep the shape compatible with OpenAI Responses API input.\n const OPENAI_ROLE_FROM_LLM: Record<LlmRole, string> = {\n user: \"user\",\n assistant: \"assistant\",\n system: \"system\",\n developer: \"developer\",\n tool: \"assistant\",\n };\n\n return contents.map((content) => {\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({ type: \"input_text\", text: part.text });\n continue;\n }\n const mimeType = part.mimeType;\n if (isInlineImageMime(mimeType)) {\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n parts.push({ type: \"input_image\", image_url: dataUrl, detail: \"auto\" });\n continue;\n }\n const fileData = decodeInlineDataBuffer(part.data).toString(\"base64\");\n parts.push({\n type: \"input_file\",\n filename: guessInlineDataFilename(mimeType),\n file_data: fileData,\n });\n }\n if (\n parts.length === 1 &&\n parts[0]?.type === \"input_text\" &&\n typeof parts[0].text === \"string\"\n ) {\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts[0].text,\n };\n }\n return {\n role: OPENAI_ROLE_FROM_LLM[content.role],\n content: parts,\n };\n });\n}\n\nfunction toChatGptInput(contents: readonly LlmContent[]): {\n instructions?: string;\n input: ChatGptInputItem[];\n} {\n const instructionsParts: string[] = [];\n const input: ChatGptInputItem[] = [];\n for (const content of contents) {\n if (content.role === \"system\" || content.role === \"developer\") {\n for (const part of content.parts) {\n if (part.type === \"text\") {\n instructionsParts.push(part.text);\n }\n }\n continue;\n }\n const isAssistant = content.role === \"assistant\" || content.role === \"tool\";\n const parts: Array<Record<string, unknown>> = [];\n for (const part of content.parts) {\n if (part.type === \"text\") {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: part.text,\n });\n continue;\n }\n if (isAssistant) {\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n parts.push({\n type: \"output_text\",\n text: isInlineImageMime(part.mimeType) ? `[image:${mimeType}]` : `[file:${mimeType}]`,\n });\n } else {\n if (isInlineImageMime(part.mimeType)) {\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n const dataUrl = `data:${mimeType};base64,${part.data}`;\n parts.push({\n type: \"input_image\",\n image_url: dataUrl,\n detail: \"auto\",\n });\n } else {\n const fileData = decodeInlineDataBuffer(part.data).toString(\"base64\");\n parts.push({\n type: \"input_file\",\n filename: guessInlineDataFilename(part.mimeType),\n file_data: fileData,\n });\n }\n }\n }\n if (parts.length === 0) {\n parts.push({\n type: isAssistant ? \"output_text\" : \"input_text\",\n text: \"(empty content)\",\n });\n }\n if (isAssistant) {\n input.push({\n type: \"message\",\n role: \"assistant\",\n status: \"completed\",\n content: parts,\n } as ChatGptInputItem);\n } else {\n input.push({\n role: \"user\",\n content: parts,\n } as ChatGptInputItem);\n }\n }\n const instructions = instructionsParts\n .map((part) => part.trim())\n .filter((part) => part.length > 0)\n .join(\"\\\\n\\\\n\");\n return {\n instructions: instructions.length > 0 ? instructions : undefined,\n input,\n };\n}\n\nfunction toFireworksMessages(\n contents: readonly LlmContent[],\n options?: { readonly responseMimeType?: string; readonly responseJsonSchema?: JsonSchema },\n): Array<Record<string, unknown>> {\n const systemMessages: string[] = [];\n const messages: Array<Record<string, unknown>> = [];\n\n if (options?.responseMimeType === \"application/json\") {\n systemMessages.push(\"Return valid JSON only. Do not include markdown or prose outside JSON.\");\n }\n if (options?.responseJsonSchema) {\n systemMessages.push(`Target JSON schema:\n${JSON.stringify(options.responseJsonSchema)}`);\n }\n\n for (const content of contents) {\n const text = content.parts\n .map((part) => {\n if (part.type === \"text\") {\n return part.text;\n }\n const mimeType = part.mimeType ?? \"application/octet-stream\";\n if (isInlineImageMime(mimeType)) {\n return `[image:${mimeType}]`;\n }\n return `[file:${mimeType}]`;\n })\n .join(\"\\n\")\n .trim();\n\n if (content.role === \"system\" || content.role === \"developer\") {\n if (text.length > 0) {\n systemMessages.push(text);\n }\n continue;\n }\n\n if (content.role === \"tool\" || content.role === \"assistant\") {\n messages.push({\n role: \"assistant\",\n content: text.length > 0 ? text : \"(empty content)\",\n });\n continue;\n }\n\n messages.push({\n role: \"user\",\n content: text.length > 0 ? text : \"(empty content)\",\n });\n }\n\n if (systemMessages.length > 0) {\n messages.unshift({\n role: \"system\",\n content: systemMessages.join(\"\\n\\n\"),\n });\n }\n\n return messages;\n}\n\nfunction toGeminiTools(tools: readonly LlmToolConfig[] | undefined): GeminiTool[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\":\n return { googleSearch: {} };\n case \"code-execution\":\n return { codeExecution: {} };\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction toOpenAiTools(tools: readonly LlmToolConfig[] | undefined): unknown[] | undefined {\n if (!tools || tools.length === 0) {\n return undefined;\n }\n return tools.map((tool) => {\n switch (tool.type) {\n case \"web-search\": {\n const external_web_access = tool.mode !== \"cached\";\n return { type: \"web_search\", external_web_access };\n }\n case \"code-execution\": {\n return { type: \"code_interpreter\", container: { type: \"auto\" } };\n }\n default:\n throw new Error(\"Unsupported tool configuration\");\n }\n });\n}\n\nfunction mergeTokenUpdates(\n current: LlmUsageTokens | undefined,\n next: LlmUsageTokens | undefined,\n): LlmUsageTokens | undefined {\n if (!next) {\n return current;\n }\n if (!current) {\n return next;\n }\n return {\n promptTokens: next.promptTokens ?? current.promptTokens,\n cachedTokens: next.cachedTokens ?? current.cachedTokens,\n responseTokens: next.responseTokens ?? current.responseTokens,\n responseImageTokens: next.responseImageTokens ?? current.responseImageTokens,\n thinkingTokens: next.thinkingTokens ?? current.thinkingTokens,\n totalTokens: next.totalTokens ?? current.totalTokens,\n toolUsePromptTokens: next.toolUsePromptTokens ?? current.toolUsePromptTokens,\n };\n}\n\nfunction toMaybeNumber(value: unknown): number | undefined {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return undefined;\n}\n\nfunction sumModalityTokenCounts(details: unknown, modality: string): number {\n if (!Array.isArray(details)) {\n return 0;\n }\n let total = 0;\n for (const entry of details) {\n const entryModality = (entry as { modality?: unknown }).modality;\n if (typeof entryModality !== \"string\") {\n continue;\n }\n if (entryModality.toUpperCase() !== modality.toUpperCase()) {\n continue;\n }\n const tokenCount = toMaybeNumber((entry as { tokenCount?: unknown }).tokenCount);\n if (tokenCount !== undefined && tokenCount > 0) {\n total += tokenCount;\n }\n }\n return total;\n}\n\nfunction extractGeminiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { promptTokenCount?: unknown }).promptTokenCount);\n const cachedTokens = toMaybeNumber(\n (usage as { cachedContentTokenCount?: unknown }).cachedContentTokenCount,\n );\n const responseTokens = toMaybeNumber(\n (usage as { candidatesTokenCount?: unknown }).candidatesTokenCount ??\n (usage as { responseTokenCount?: unknown }).responseTokenCount,\n );\n const thinkingTokens = toMaybeNumber(\n (usage as { thoughtsTokenCount?: unknown }).thoughtsTokenCount,\n );\n const totalTokens = toMaybeNumber((usage as { totalTokenCount?: unknown }).totalTokenCount);\n const toolUsePromptTokens = toMaybeNumber(\n (usage as { toolUsePromptTokenCount?: unknown }).toolUsePromptTokenCount,\n );\n const responseDetails =\n (usage as { candidatesTokensDetails?: unknown }).candidatesTokensDetails ??\n (usage as { responseTokensDetails?: unknown }).responseTokensDetails;\n const responseImageTokens = sumModalityTokenCounts(responseDetails, \"IMAGE\");\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n responseImageTokens === 0 &&\n thinkingTokens === undefined &&\n totalTokens === undefined &&\n toolUsePromptTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n responseImageTokens: responseImageTokens > 0 ? responseImageTokens : undefined,\n thinkingTokens,\n totalTokens,\n toolUsePromptTokens,\n };\n}\n\nfunction extractOpenAiUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nfunction extractChatGptUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber((usage as { input_tokens?: unknown }).input_tokens);\n const cachedTokens = toMaybeNumber(\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber((usage as { output_tokens?: unknown }).output_tokens);\n const reasoningTokens = toMaybeNumber(\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber((usage as { total_tokens?: unknown }).total_tokens);\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nfunction extractFireworksUsageTokens(usage: unknown): LlmUsageTokens | undefined {\n if (!usage || typeof usage !== \"object\") {\n return undefined;\n }\n const promptTokens = toMaybeNumber(\n (usage as { prompt_tokens?: unknown }).prompt_tokens ??\n (usage as { input_tokens?: unknown }).input_tokens,\n );\n const cachedTokens = toMaybeNumber(\n (usage as { prompt_tokens_details?: { cached_tokens?: unknown } }).prompt_tokens_details\n ?.cached_tokens ??\n (usage as { input_tokens_details?: { cached_tokens?: unknown } }).input_tokens_details\n ?.cached_tokens,\n );\n const outputTokensRaw = toMaybeNumber(\n (usage as { completion_tokens?: unknown }).completion_tokens ??\n (usage as { output_tokens?: unknown }).output_tokens,\n );\n const reasoningTokens = toMaybeNumber(\n (usage as { completion_tokens_details?: { reasoning_tokens?: unknown } })\n .completion_tokens_details?.reasoning_tokens ??\n (usage as { output_tokens_details?: { reasoning_tokens?: unknown } }).output_tokens_details\n ?.reasoning_tokens,\n );\n const totalTokens = toMaybeNumber(\n (usage as { total_tokens?: unknown }).total_tokens ??\n (usage as { totalTokenCount?: unknown }).totalTokenCount,\n );\n let responseTokens: number | undefined;\n if (outputTokensRaw !== undefined) {\n const adjusted = outputTokensRaw - (reasoningTokens ?? 0);\n responseTokens = adjusted >= 0 ? adjusted : 0;\n }\n if (\n promptTokens === undefined &&\n cachedTokens === undefined &&\n responseTokens === undefined &&\n reasoningTokens === undefined &&\n totalTokens === undefined\n ) {\n return undefined;\n }\n return {\n promptTokens,\n cachedTokens,\n responseTokens,\n thinkingTokens: reasoningTokens,\n totalTokens,\n };\n}\n\nconst MODERATION_FINISH_REASONS = new Set<FinishReason>([\n FinishReason.SAFETY,\n FinishReason.BLOCKLIST,\n FinishReason.PROHIBITED_CONTENT,\n FinishReason.SPII,\n]);\n\nfunction isModerationFinish(reason: FinishReason | undefined): boolean {\n if (!reason) {\n return false;\n }\n return MODERATION_FINISH_REASONS.has(reason);\n}\n\nfunction mergeToolOutput(value: unknown): string {\n if (typeof value === \"string\") {\n return value;\n }\n try {\n return JSON.stringify(value);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return JSON.stringify({ error: \"Failed to serialize tool output\", detail: message });\n }\n}\n\nfunction parseOpenAiToolArguments(raw: string): { value: unknown; error?: string } {\n const trimmed = raw.trim();\n if (trimmed.length === 0) {\n return { value: {} };\n }\n try {\n return { value: JSON.parse(trimmed) };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { value: raw, error: message };\n }\n}\n\nfunction formatZodIssues(issues: readonly z.core.$ZodIssue[]): string {\n const messages: string[] = [];\n for (const issue of issues) {\n const path = issue.path.length > 0 ? issue.path.map(String).join(\".\") : \"input\";\n messages.push(`${path}: ${issue.message}`);\n }\n return messages.join(\"; \");\n}\n\nfunction buildToolErrorOutput(\n message: string,\n issues?: readonly z.core.$ZodIssue[],\n): Record<string, unknown> {\n const output: Record<string, unknown> = { error: message };\n if (issues && issues.length > 0) {\n output.issues = issues.map((issue) => ({\n path: issue.path.map(String),\n message: issue.message,\n code: issue.code,\n }));\n }\n return output;\n}\n\nasync function executeToolCall(params: {\n callKind: \"function\" | \"custom\";\n toolName: string;\n tool: LlmExecutableTool<z.ZodType, unknown> | undefined;\n rawInput: unknown;\n parseError?: string;\n}): Promise<{ result: LlmToolCallResult; outputPayload: unknown }> {\n const { callKind, toolName, tool, rawInput, parseError } = params;\n if (!tool) {\n const message = `Unknown tool: ${toolName}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n if (callKind === \"custom\") {\n if (!isCustomTool(tool)) {\n const message = `Tool ${toolName} was called as custom_tool_call but is declared as function.`;\n const outputPayload = buildToolErrorOutput(message);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n const input = typeof rawInput === \"string\" ? rawInput : String(rawInput ?? \"\");\n try {\n const output = await tool.execute(input);\n return {\n result: { toolName, input, output },\n outputPayload: output,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const outputPayload = buildToolErrorOutput(`Tool ${toolName} failed: ${message}`);\n return {\n result: { toolName, input, output: outputPayload, error: message },\n outputPayload,\n };\n }\n }\n if (isCustomTool(tool)) {\n const message = `Tool ${toolName} was called as function_call but is declared as custom.`;\n const outputPayload = buildToolErrorOutput(message);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n if (parseError) {\n const message = `Invalid JSON for tool ${toolName}: ${parseError}`;\n return {\n result: { toolName, input: rawInput, output: { error: message }, error: message },\n outputPayload: buildToolErrorOutput(message),\n };\n }\n const parsed = tool.inputSchema.safeParse(rawInput);\n if (!parsed.success) {\n const message = `Invalid tool arguments for ${toolName}: ${formatZodIssues(parsed.error.issues)}`;\n const outputPayload = buildToolErrorOutput(message, parsed.error.issues);\n return {\n result: { toolName, input: rawInput, output: outputPayload, error: message },\n outputPayload,\n };\n }\n try {\n const output = await tool.execute(parsed.data);\n return {\n result: { toolName, input: parsed.data, output },\n outputPayload: output,\n };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n const outputPayload = buildToolErrorOutput(`Tool ${toolName} failed: ${message}`);\n return {\n result: { toolName, input: parsed.data, output: outputPayload, error: message },\n outputPayload,\n };\n }\n}\n\nfunction buildToolLogId(turn: number, toolIndex: number): string {\n return `turn${turn.toString()}/tool${toolIndex.toString()}`;\n}\n\nfunction sanitizeChatGptToolId(value: string): string {\n const cleaned = value.replace(/[^A-Za-z0-9_-]/gu, \"\");\n if (cleaned.length === 0) {\n return randomBytes(8).toString(\"hex\");\n }\n return cleaned.slice(0, 64);\n}\n\nfunction normalizeChatGptToolIds(params: {\n callKind: \"function\" | \"custom\";\n callId?: string;\n itemId?: string;\n}): {\n callId: string;\n itemId: string;\n} {\n let rawCallId = params.callId ?? \"\";\n let rawItemId = params.itemId ?? \"\";\n if (rawCallId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawCallId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n if (nextItemId) {\n rawItemId = nextItemId;\n }\n } else if (rawItemId.includes(\"|\")) {\n const [nextCallId, nextItemId] = rawItemId.split(\"|\");\n rawCallId = nextCallId ?? rawCallId;\n rawItemId = nextItemId ?? rawItemId;\n }\n const callValue = sanitizeChatGptToolId(rawCallId || rawItemId || randomBytes(8).toString(\"hex\"));\n let itemValue = sanitizeChatGptToolId(rawItemId || callValue);\n if (params.callKind === \"custom\") {\n if (!itemValue.startsWith(\"ctc\")) {\n itemValue = `ctc_${itemValue}`;\n }\n } else if (!itemValue.startsWith(\"fc\")) {\n itemValue = `fc-${itemValue}`;\n }\n return { callId: callValue, itemId: itemValue };\n}\n\nfunction extractOpenAiResponseParts(response: { output?: unknown; output_text?: unknown }): {\n parts: LlmContentPart[];\n blocked: boolean;\n} {\n const parts: LlmContentPart[] = [];\n let blocked = false;\n const output = response.output;\n if (Array.isArray(output)) {\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemType = (item as { type?: unknown }).type;\n if (itemType === \"message\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"output_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\" && text.length > 0) {\n parts.push({ type: \"text\", text });\n }\n } else if (entryType === \"refusal\") {\n blocked = true;\n }\n }\n }\n } else if (itemType === \"reasoning\") {\n const content = (item as { content?: unknown }).content;\n if (Array.isArray(content)) {\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\" || entryType === \"reasoning_summary\") {\n const entryText =\n typeof (entry as { text?: unknown }).text === \"string\"\n ? (entry as { text?: unknown }).text\n : typeof (entry as { summary?: unknown }).summary === \"string\"\n ? (entry as { summary?: unknown }).summary\n : undefined;\n if (typeof entryText === \"string\" && entryText.length > 0) {\n parts.push({ type: \"text\", text: entryText, thought: true });\n }\n }\n }\n }\n } else if (\n itemType === \"function_call\" ||\n itemType === \"tool_call\" ||\n itemType === \"custom_tool_call\"\n ) {\n const serialized = JSON.stringify(item, null, 2);\n if (serialized.length > 0) {\n parts.push({ type: \"text\", text: `[tool-call]\\\\n${serialized}\\\\n` });\n }\n }\n }\n }\n if (parts.length === 0) {\n const outputText = response.output_text;\n if (typeof outputText === \"string\" && outputText.length > 0) {\n parts.push({ type: \"text\", text: outputText });\n }\n }\n return { parts, blocked };\n}\n\ntype OpenAiToolCall =\n | { kind: \"function\"; name: string; arguments: string; call_id: string; id?: string }\n | { kind: \"custom\"; name: string; input: string; call_id: string; id?: string };\n\nfunction extractOpenAiToolCalls(output: unknown): OpenAiToolCall[] {\n const calls: OpenAiToolCall[] = [];\n if (!Array.isArray(output)) {\n return calls;\n }\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n const itemType = (item as { type?: unknown }).type;\n if (itemType === \"function_call\") {\n const name =\n typeof (item as { name?: unknown }).name === \"string\"\n ? ((item as { name?: unknown }).name as string)\n : \"\";\n const args =\n typeof (item as { arguments?: unknown }).arguments === \"string\"\n ? ((item as { arguments?: unknown }).arguments as string)\n : \"\";\n const call_id =\n typeof (item as { call_id?: unknown }).call_id === \"string\"\n ? ((item as { call_id?: unknown }).call_id as string)\n : \"\";\n const id =\n typeof (item as { id?: unknown }).id === \"string\"\n ? ((item as { id?: unknown }).id as string)\n : undefined;\n if (name && call_id) {\n calls.push({ kind: \"function\", name, arguments: args, call_id, id });\n }\n continue;\n }\n if (itemType === \"custom_tool_call\") {\n const name =\n typeof (item as { name?: unknown }).name === \"string\"\n ? ((item as { name?: unknown }).name as string)\n : \"\";\n const input =\n typeof (item as { input?: unknown }).input === \"string\"\n ? ((item as { input?: unknown }).input as string)\n : \"\";\n const call_id =\n typeof (item as { call_id?: unknown }).call_id === \"string\"\n ? ((item as { call_id?: unknown }).call_id as string)\n : \"\";\n const id =\n typeof (item as { id?: unknown }).id === \"string\"\n ? ((item as { id?: unknown }).id as string)\n : undefined;\n if (name && call_id) {\n calls.push({ kind: \"custom\", name, input, call_id, id });\n }\n }\n }\n return calls;\n}\n\ntype FireworksFunctionToolCall = {\n readonly id: string;\n readonly name: string;\n readonly arguments: string;\n};\n\nfunction extractFireworksMessageText(message: unknown): string {\n if (!message || typeof message !== \"object\") {\n return \"\";\n }\n const content = (message as { content?: unknown }).content;\n if (typeof content === \"string\") {\n return content;\n }\n if (!Array.isArray(content)) {\n return \"\";\n }\n let text = \"\";\n for (const part of content) {\n const textPart = (part as { text?: unknown }).text;\n if (typeof textPart === \"string\") {\n text += textPart;\n }\n }\n return text;\n}\n\nfunction extractFireworksToolCalls(message: unknown): FireworksFunctionToolCall[] {\n if (!message || typeof message !== \"object\") {\n return [];\n }\n const toolCalls = (message as { tool_calls?: unknown }).tool_calls;\n if (!Array.isArray(toolCalls)) {\n return [];\n }\n const calls: FireworksFunctionToolCall[] = [];\n for (const call of toolCalls) {\n if (!call || typeof call !== \"object\") {\n continue;\n }\n const id =\n typeof (call as { id?: unknown }).id === \"string\" ? (call as { id?: string }).id : \"\";\n const fn = (call as { function?: unknown }).function;\n const name =\n fn && typeof fn === \"object\" && typeof (fn as { name?: unknown }).name === \"string\"\n ? ((fn as { name?: string }).name ?? \"\")\n : \"\";\n const args =\n fn && typeof fn === \"object\" && typeof (fn as { arguments?: unknown }).arguments === \"string\"\n ? ((fn as { arguments?: string }).arguments ?? \"\")\n : \"\";\n if (id && name) {\n calls.push({ id, name, arguments: args });\n }\n }\n return calls;\n}\nfunction resolveGeminiThinkingConfig(modelId: string): GenerateContentConfig[\"thinkingConfig\"] {\n switch (modelId) {\n case \"gemini-3-pro-preview\":\n case \"gemini-3.1-pro-preview\":\n return { includeThoughts: true } as const;\n case \"gemini-3-flash-preview\":\n return { includeThoughts: true, thinkingBudget: 16_384 } as const;\n case \"gemini-2.5-pro\":\n return { includeThoughts: true, thinkingBudget: 32_768 } as const;\n case \"gemini-flash-latest\":\n case \"gemini-flash-lite-latest\":\n return { includeThoughts: true, thinkingBudget: 24_576 } as const;\n default:\n return { includeThoughts: true } as const;\n }\n}\n\nfunction decodeInlineDataBuffer(base64: string): Buffer {\n try {\n return Buffer.from(base64, \"base64\");\n } catch {\n return Buffer.from(base64, \"base64url\");\n }\n}\n\nfunction extractImages(content: LlmContent | undefined): LlmImageData[] {\n if (!content) {\n return [];\n }\n const images: LlmImageData[] = [];\n for (const part of content.parts) {\n if (part.type !== \"inlineData\") {\n continue;\n }\n const buffer = decodeInlineDataBuffer(part.data);\n images.push({ mimeType: part.mimeType, data: buffer });\n }\n return images;\n}\n\nasync function runTextCall(params: {\n request: LlmTextRequest;\n queue: AsyncQueue<LlmStreamEvent>;\n abortController: AbortController;\n}): Promise<LlmTextResult> {\n const { request, queue, abortController } = params;\n const providerInfo = resolveProvider(request.model);\n const provider = providerInfo.provider;\n const modelForProvider = providerInfo.model;\n const contents = resolveTextContents(request);\n if (contents.length === 0) {\n throw new Error(\"LLM call received an empty prompt.\");\n }\n\n let modelVersion: string = request.model;\n let blocked = false;\n let grounding: GroundingMetadata | undefined;\n const responseParts: LlmContentPart[] = [];\n let responseRole: LlmRole | undefined;\n let latestUsage: LlmUsageTokens | undefined;\n let responseImages = 0;\n\n const pushDelta = (channel: \"response\" | \"thought\", text: string): void => {\n if (!text) {\n return;\n }\n responseParts.push({ type: \"text\", text, ...(channel === \"thought\" ? { thought: true } : {}) });\n queue.push({ type: \"delta\", channel, text });\n };\n\n const pushInline = (data: string, mimeType: string | undefined): void => {\n if (!data) {\n return;\n }\n responseParts.push({ type: \"inlineData\", data, mimeType });\n if (isInlineImageMime(mimeType)) {\n responseImages += 1;\n }\n };\n\n const resolveAbortSignal = (): AbortSignal => {\n if (!request.signal) {\n return abortController.signal;\n }\n // Fan-in cancellation: abort if either signal aborts.\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n return abortController.signal;\n };\n\n const signal = resolveAbortSignal();\n\n if (provider === \"openai\") {\n const openAiInput = toOpenAiInput(contents);\n const openAiTools = toOpenAiTools(request.tools);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n modelForProvider,\n request.openAiReasoningEffort,\n );\n const openAiTextConfig = {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(modelForProvider),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: modelForProvider,\n input: openAiInput as any,\n reasoning,\n text: openAiTextConfig as any,\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n include: [\"code_interpreter_call.outputs\", \"reasoning.encrypted_content\"] as any,\n },\n { signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"response\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.reasoning_summary_text.delta\": {\n const delta = event.delta ?? \"\";\n pushDelta(\"thought\", typeof delta === \"string\" ? delta : \"\");\n break;\n }\n case \"response.refusal.delta\": {\n blocked = true;\n queue.push({ type: \"blocked\" });\n break;\n }\n default:\n break;\n }\n }\n\n const finalResponse = await (stream as any).finalResponse();\n modelVersion = typeof finalResponse.model === \"string\" ? finalResponse.model : request.model;\n queue.push({ type: \"model\", modelVersion });\n if (finalResponse.error) {\n const message =\n typeof finalResponse.error.message === \"string\"\n ? finalResponse.error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n if (\n finalResponse.status &&\n finalResponse.status !== \"completed\" &&\n finalResponse.status !== \"in_progress\"\n ) {\n const detail = finalResponse.incomplete_details?.reason;\n throw new Error(\n `OpenAI response status ${finalResponse.status}${detail ? ` (${detail})` : \"\"}`,\n );\n }\n latestUsage = extractOpenAiUsageTokens(finalResponse.usage);\n\n // Fallback: if the stream did not deliver deltas (rare), extract from final output.\n if (responseParts.length === 0) {\n const fallback = extractOpenAiResponseParts(finalResponse);\n blocked = blocked || fallback.blocked;\n for (const part of fallback.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n });\n } else if (provider === \"chatgpt\") {\n const chatGptInput = toChatGptInput(contents);\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const openAiTools = toOpenAiTools(request.tools);\n const requestPayload = {\n model: modelForProvider,\n store: false,\n stream: true,\n instructions: chatGptInput.instructions ?? \"You are a helpful assistant.\",\n input: chatGptInput.input,\n include: [\"reasoning.encrypted_content\"],\n reasoning: { effort: toOpenAiReasoningEffort(reasoningEffort), summary: \"detailed\" as const },\n text: {\n format: request.openAiTextFormat ?? { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(request.model),\n },\n ...(openAiTools ? { tools: openAiTools as any } : {}),\n };\n\n let sawResponseDelta = false;\n let sawThoughtDelta = false;\n const result = await collectChatGptCodexResponseWithRetry({\n request: requestPayload as any,\n signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n sawThoughtDelta = true;\n pushDelta(\"thought\", delta.thoughtDelta);\n }\n if (delta.textDelta) {\n sawResponseDelta = true;\n pushDelta(\"response\", delta.textDelta);\n }\n },\n });\n\n blocked = blocked || result.blocked;\n if (blocked) {\n queue.push({ type: \"blocked\" });\n }\n if (result.model) {\n modelVersion = `chatgpt-${result.model}`;\n queue.push({ type: \"model\", modelVersion });\n }\n latestUsage = extractChatGptUsageTokens(result.usage);\n\n // Fallback for rare cases where the SSE stream does not emit deltas.\n const fallbackText = typeof result.text === \"string\" ? result.text : \"\";\n const fallbackThoughts =\n typeof result.reasoningSummaryText === \"string\" && result.reasoningSummaryText.length > 0\n ? result.reasoningSummaryText\n : typeof result.reasoningText === \"string\"\n ? result.reasoningText\n : \"\";\n if (!sawThoughtDelta && fallbackThoughts.length > 0) {\n pushDelta(\"thought\", fallbackThoughts);\n }\n if (!sawResponseDelta && fallbackText.length > 0) {\n pushDelta(\"response\", fallbackText);\n }\n } else if (provider === \"fireworks\") {\n if (request.tools && request.tools.length > 0) {\n throw new Error(\n \"Fireworks provider does not support provider-native tools in generateText; use runToolLoop for function tools.\",\n );\n }\n\n const fireworksMessages = toFireworksMessages(contents, {\n responseMimeType: request.responseMimeType,\n responseJsonSchema: request.responseJsonSchema,\n });\n\n await runFireworksCall(async (client) => {\n const responseFormat = request.responseJsonSchema\n ? {\n type: \"json_schema\" as const,\n json_schema: {\n name: \"llm-response\",\n schema: request.responseJsonSchema,\n },\n }\n : request.responseMimeType === \"application/json\"\n ? { type: \"json_object\" as const }\n : undefined;\n\n const response = await client.chat.completions.create(\n {\n model: modelForProvider,\n messages: fireworksMessages as any,\n ...(responseFormat ? { response_format: responseFormat } : {}),\n } as any,\n { signal } as any,\n );\n\n modelVersion = typeof response.model === \"string\" ? response.model : request.model;\n queue.push({ type: \"model\", modelVersion });\n\n const choice = Array.isArray(response.choices) ? response.choices[0] : undefined;\n if (choice?.finish_reason === \"content_filter\") {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n\n const textOutput = extractFireworksMessageText(\n (choice as { message?: unknown } | undefined)?.message,\n );\n if (textOutput.length > 0) {\n pushDelta(\"response\", textOutput);\n }\n\n latestUsage = extractFireworksUsageTokens(response.usage);\n });\n } else {\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n thinkingConfig: resolveGeminiThinkingConfig(modelForProvider),\n ...(request.responseMimeType ? { responseMimeType: request.responseMimeType } : {}),\n ...(request.responseJsonSchema ? { responseJsonSchema: request.responseJsonSchema } : {}),\n ...(request.responseModalities\n ? { responseModalities: Array.from(request.responseModalities) }\n : {}),\n ...(request.imageAspectRatio || request.imageSize\n ? {\n imageConfig: {\n ...(request.imageAspectRatio ? { aspectRatio: request.imageAspectRatio } : {}),\n ...(request.imageSize ? { imageSize: request.imageSize } : {}),\n },\n }\n : {}),\n };\n const geminiTools = toGeminiTools(request.tools);\n if (geminiTools) {\n config.tools = geminiTools;\n }\n\n await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: modelForProvider,\n contents: geminiContents,\n config,\n });\n let latestGrounding: GroundingMetadata | undefined;\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n modelVersion = chunk.modelVersion;\n queue.push({ type: \"model\", modelVersion });\n }\n if (chunk.promptFeedback?.blockReason) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n latestUsage = mergeTokenUpdates(latestUsage, extractGeminiUsageTokens(chunk.usageMetadata));\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n if (primary && isModerationFinish(primary.finishReason)) {\n blocked = true;\n queue.push({ type: \"blocked\" });\n }\n for (const candidate of candidates) {\n const candidateContent = candidate.content;\n if (!candidateContent) {\n continue;\n }\n if (candidate.groundingMetadata) {\n latestGrounding = candidate.groundingMetadata;\n }\n const content = convertGeminiContentToLlmContent(candidateContent);\n if (!responseRole) {\n responseRole = content.role;\n }\n for (const part of content.parts) {\n if (part.type === \"text\") {\n pushDelta(part.thought === true ? \"thought\" : \"response\", part.text);\n } else {\n pushInline(part.data, part.mimeType);\n }\n }\n }\n }\n grounding = latestGrounding;\n });\n }\n\n const mergedParts = mergeConsecutiveTextParts(responseParts);\n const content =\n mergedParts.length > 0 ? { role: responseRole ?? \"assistant\", parts: mergedParts } : undefined;\n const { text, thoughts } = extractTextByChannel(content);\n\n const costUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: latestUsage,\n responseImages,\n imageSize: request.imageSize,\n });\n\n if (latestUsage) {\n queue.push({ type: \"usage\", usage: latestUsage, costUsd, modelVersion });\n }\n\n return {\n provider,\n model: request.model,\n modelVersion,\n content,\n text,\n thoughts,\n blocked,\n usage: latestUsage,\n costUsd,\n grounding,\n };\n}\n\nexport function streamText(request: LlmTextRequest): LlmTextStream {\n const queue = createAsyncQueue<LlmStreamEvent>();\n const abortController = new AbortController();\n\n const result = (async () => {\n try {\n const output = await runTextCall({ request, queue, abortController });\n queue.close();\n return output;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n queue.fail(err);\n throw err;\n }\n })();\n\n return {\n events: queue.iterable,\n result,\n abort: () => abortController.abort(),\n };\n}\n\nexport async function generateText(request: LlmTextRequest): Promise<LlmTextResult> {\n const call = streamText(request);\n // Drain events so the call runs even if the caller doesn't.\n for await (const _event of call.events) {\n // no-op\n }\n return await call.result;\n}\n\nfunction buildJsonSchemaConfig<T>(request: LlmJsonRequest<T>): {\n providerInfo: { provider: LlmProvider; model: string };\n responseJsonSchema: JsonSchema;\n openAiTextFormat?: ResponseTextConfig[\"format\"];\n} {\n const schemaName = (request.openAiSchemaName ?? \"llm-response\").trim() || \"llm-response\";\n const providerInfo = resolveProvider(request.model);\n const isOpenAiVariant = providerInfo.provider === \"openai\" || providerInfo.provider === \"chatgpt\";\n const isGeminiVariant = providerInfo.provider === \"gemini\";\n const baseJsonSchema = zodToJsonSchema(request.schema, {\n name: schemaName,\n target: isOpenAiVariant ? \"openAi\" : \"jsonSchema7\",\n }) as JsonSchema;\n\n const responseJsonSchema = isOpenAiVariant\n ? resolveOpenAiSchemaRoot(baseJsonSchema)\n : isGeminiVariant\n ? addGeminiPropertyOrdering(baseJsonSchema)\n : resolveOpenAiSchemaRoot(baseJsonSchema);\n\n if (isOpenAiVariant && !isJsonSchemaObject(responseJsonSchema)) {\n throw new Error(\"OpenAI structured outputs require a JSON object schema at the root.\");\n }\n\n const openAiTextFormat = isOpenAiVariant\n ? {\n type: \"json_schema\" as const,\n name: schemaName,\n strict: true,\n schema: normalizeOpenAiSchema(responseJsonSchema),\n }\n : undefined;\n\n return { providerInfo, responseJsonSchema, openAiTextFormat };\n}\n\nexport function streamJson<T>(request: LlmJsonStreamRequest<T>): LlmJsonStream<T> {\n const queue = createAsyncQueue<LlmJsonStreamEvent<T>>();\n const abortController = new AbortController();\n\n const resolveAbortSignal = (): AbortSignal => {\n if (!request.signal) {\n return abortController.signal;\n }\n // Fan-in cancellation: abort if either signal aborts.\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n {\n once: true,\n },\n );\n }\n return abortController.signal;\n };\n\n const result = (async () => {\n const signal = resolveAbortSignal();\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 2));\n const { providerInfo, responseJsonSchema, openAiTextFormat } = buildJsonSchemaConfig(request);\n const streamMode = request.streamMode ?? \"partial\";\n\n const failures: Array<{ attempt: number; rawText: string; error: unknown }> = [];\n let openAiTextFormatForAttempt: ResponseTextConfig[\"format\"] | undefined = openAiTextFormat;\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let rawText = \"\";\n let lastPartial = \"\";\n try {\n const call = streamText({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n responseMimeType: request.responseMimeType ?? \"application/json\",\n responseJsonSchema,\n openAiReasoningEffort: request.openAiReasoningEffort,\n ...(openAiTextFormatForAttempt ? { openAiTextFormat: openAiTextFormatForAttempt } : {}),\n signal,\n });\n\n try {\n for await (const event of call.events) {\n queue.push(event);\n if (event.type === \"delta\" && event.channel === \"response\") {\n rawText += event.text;\n if (streamMode === \"partial\") {\n const partial = parsePartialJsonFromLlmText(rawText);\n if (partial !== null) {\n const serialized = JSON.stringify(partial);\n if (serialized !== lastPartial) {\n lastPartial = serialized;\n queue.push({\n type: \"json\",\n stage: \"partial\",\n value: partial as DeepPartial<T>,\n });\n }\n }\n }\n }\n }\n } catch (streamError) {\n // Ensure the rejected result promise is observed before we retry.\n await call.result.catch(() => undefined);\n throw streamError;\n }\n const result = await call.result;\n rawText = rawText || result.text;\n\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n const payload: unknown = JSON.parse(repairedText);\n const normalized =\n typeof request.normalizeJson === \"function\" ? request.normalizeJson(payload) : payload;\n const parsed = request.schema.parse(normalized);\n queue.push({ type: \"json\", stage: \"final\", value: parsed });\n queue.close();\n return { value: parsed, rawText, result };\n } catch (error) {\n const handled = error instanceof Error ? error : new Error(String(error));\n failures.push({ attempt, rawText, error: handled });\n if (providerInfo.provider === \"chatgpt\" && openAiTextFormatForAttempt) {\n // Best-effort fallback: some ChatGPT accounts/models may not support json_schema.\n openAiTextFormatForAttempt = undefined;\n }\n if (attempt >= maxAttempts) {\n throw new LlmJsonCallError(`LLM JSON call failed after ${attempt} attempt(s)`, failures);\n }\n }\n }\n\n throw new LlmJsonCallError(\"LLM JSON call failed\", failures);\n })().catch((error) => {\n const err = error instanceof Error ? error : new Error(String(error));\n queue.fail(err);\n throw err;\n });\n\n return {\n events: queue.iterable,\n result,\n abort: () => abortController.abort(),\n };\n}\n\nexport async function generateJson<T>(request: LlmJsonRequest<T>): Promise<{\n readonly value: T;\n readonly rawText: string;\n readonly result: LlmTextResult;\n}> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 2));\n const { providerInfo, responseJsonSchema, openAiTextFormat } = buildJsonSchemaConfig(request);\n let openAiTextFormatForAttempt: ResponseTextConfig[\"format\"] | undefined = openAiTextFormat;\n\n const failures: Array<{ attempt: number; rawText: string; error: unknown }> = [];\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n let rawText = \"\";\n try {\n const call = streamText({\n model: request.model,\n input: request.input,\n instructions: request.instructions,\n tools: request.tools,\n responseMimeType: request.responseMimeType ?? \"application/json\",\n responseJsonSchema,\n openAiReasoningEffort: request.openAiReasoningEffort,\n ...(openAiTextFormatForAttempt ? { openAiTextFormat: openAiTextFormatForAttempt } : {}),\n signal: request.signal,\n });\n\n // Collect the raw text output (response channel only).\n try {\n for await (const event of call.events) {\n request.onEvent?.(event);\n if (event.type === \"delta\" && event.channel === \"response\") {\n rawText += event.text;\n }\n }\n } catch (streamError) {\n // Ensure the rejected result promise is observed before we retry.\n await call.result.catch(() => undefined);\n throw streamError;\n }\n const result = await call.result;\n rawText = rawText || result.text;\n\n const cleanedText = normalizeJsonText(rawText);\n const repairedText = escapeNewlinesInStrings(cleanedText);\n const payload: unknown = JSON.parse(repairedText);\n const normalized =\n typeof request.normalizeJson === \"function\" ? request.normalizeJson(payload) : payload;\n const parsed = request.schema.parse(normalized);\n return { value: parsed, rawText, result };\n } catch (error) {\n const handled = error instanceof Error ? error : new Error(String(error));\n failures.push({ attempt, rawText, error: handled });\n if (providerInfo.provider === \"chatgpt\" && openAiTextFormatForAttempt) {\n // Best-effort fallback: some ChatGPT accounts/models may not support json_schema.\n openAiTextFormatForAttempt = undefined;\n }\n if (attempt >= maxAttempts) {\n throw new LlmJsonCallError(`LLM JSON call failed after ${attempt} attempt(s)`, failures);\n }\n }\n }\n\n throw new LlmJsonCallError(\"LLM JSON call failed\", failures);\n}\n\n// --- Tool Loop ---\n\nconst DEFAULT_TOOL_LOOP_MAX_STEPS = 8;\n\nfunction resolveToolLoopContents(input: LlmInput): readonly LlmContent[] {\n return resolveTextContents(input);\n}\n\nfunction isCustomTool(\n toolDef: LlmExecutableTool<z.ZodType, unknown>,\n): toolDef is LlmCustomTool<unknown> {\n return (toolDef as { type?: unknown }).type === \"custom\";\n}\n\nfunction buildOpenAiToolsFromToolSet(tools: LlmToolSet): unknown[] {\n const toolEntries = Object.entries(tools);\n return toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n return {\n type: \"custom\",\n name,\n description: toolDef.description ?? undefined,\n ...(toolDef.format ? { format: toolDef.format } : {}),\n };\n }\n return {\n type: \"function\",\n name,\n description: toolDef.description ?? undefined,\n parameters: buildOpenAiToolSchema(toolDef.inputSchema, name),\n strict: true,\n };\n });\n}\n\nfunction buildFireworksToolsFromToolSet(tools: LlmToolSet): unknown[] {\n const toolEntries = Object.entries(tools);\n return toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n throw new Error(\n `Fireworks provider does not support custom/freeform tools (${name}). Use JSON function tools instead.`,\n );\n }\n return {\n type: \"function\",\n function: {\n name,\n description: toolDef.description ?? undefined,\n parameters: buildOpenAiToolSchema(toolDef.inputSchema, name),\n },\n };\n });\n}\nfunction buildOpenAiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const rawSchema = zodToJsonSchema(schema, { name, target: \"openAi\" }) as JsonSchema;\n const normalized = normalizeOpenAiSchema(resolveOpenAiSchemaRoot(rawSchema));\n if (!isJsonSchemaObject(normalized)) {\n throw new Error(`OpenAI tool schema for ${name} must be a JSON object at the root.`);\n }\n return normalized;\n}\n\nfunction buildGeminiFunctionDeclarations(tools: LlmToolSet): GeminiTool[] {\n const toolEntries = Object.entries(tools);\n const functionDeclarations = toolEntries.map(([name, toolDef]) => {\n if (isCustomTool(toolDef)) {\n throw new Error(\n `Gemini provider does not support custom/freeform tools (${name}). Use JSON function tools instead.`,\n );\n }\n return {\n name,\n description: toolDef.description ?? \"\",\n parametersJsonSchema: buildGeminiToolSchema(toolDef.inputSchema, name),\n };\n });\n return [{ functionDeclarations }];\n}\n\nfunction buildGeminiToolSchema(schema: z.ZodType, name: string): JsonSchema {\n const jsonSchema = toGeminiJsonSchema(schema, { name });\n if (!isJsonSchemaObject(jsonSchema)) {\n throw new Error(`Gemini tool schema for ${name} must be a JSON object at the root.`);\n }\n return jsonSchema;\n}\n\nfunction extractOpenAiReasoningSummary(response: unknown): string {\n if (!response || typeof response !== \"object\") {\n return \"\";\n }\n const output = (response as { output?: unknown }).output;\n if (!Array.isArray(output)) {\n return \"\";\n }\n let summary = \"\";\n for (const item of output) {\n if (!item || typeof item !== \"object\") {\n continue;\n }\n if ((item as { type?: unknown }).type !== \"reasoning\") {\n continue;\n }\n const content = (item as { content?: unknown }).content;\n if (!Array.isArray(content)) {\n continue;\n }\n for (const entry of content) {\n if (!entry || typeof entry !== \"object\") {\n continue;\n }\n const entryType = (entry as { type?: unknown }).type;\n if (entryType === \"reasoning_summary_text\") {\n const text = (entry as { text?: unknown }).text;\n if (typeof text === \"string\") {\n summary += text;\n }\n }\n }\n }\n return summary;\n}\n\nexport async function runToolLoop(request: LlmToolLoopRequest): Promise<LlmToolLoopResult> {\n const toolEntries = Object.entries(request.tools);\n if (toolEntries.length === 0) {\n throw new Error(\"Tool loop requires at least one tool definition.\");\n }\n\n const contents = resolveToolLoopContents(request);\n if (contents.length === 0) {\n throw new Error(\"Tool loop prompt must not be empty.\");\n }\n\n const maxSteps = Math.max(1, Math.floor(request.maxSteps ?? DEFAULT_TOOL_LOOP_MAX_STEPS));\n const providerInfo = resolveProvider(request.model);\n\n const steps: LlmToolLoopStep[] = [];\n let totalCostUsd = 0;\n let finalText = \"\";\n let finalThoughts = \"\";\n\n if (providerInfo.provider === \"openai\") {\n const openAiAgentTools = buildOpenAiToolsFromToolSet(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiAgentTools]\n : [...openAiAgentTools];\n const reasoningEffort = resolveOpenAiReasoningEffort(\n providerInfo.model,\n request.openAiReasoningEffort,\n );\n const textConfig = {\n format: { type: \"text\" },\n verbosity: resolveOpenAiVerbosity(providerInfo.model),\n };\n const reasoning = {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n };\n\n let previousResponseId: string | undefined;\n let input: any = toOpenAiInput(contents);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const abortController = new AbortController();\n if (request.signal) {\n if (request.signal.aborted) {\n abortController.abort(request.signal.reason);\n } else {\n request.signal.addEventListener(\n \"abort\",\n () => abortController.abort(request.signal?.reason),\n { once: true },\n );\n }\n }\n\n const onEvent = request.onEvent;\n let modelVersion: string = request.model;\n let usageTokens: LlmUsageTokens | undefined;\n\n const emitEvent = (ev: LlmStreamEvent) => {\n onEvent?.(ev);\n };\n\n const finalResponse = await runOpenAiCall(async (client) => {\n const stream = client.responses.stream(\n {\n model: providerInfo.model,\n input,\n ...(previousResponseId ? { previous_response_id: previousResponseId } : {}),\n ...(openAiTools.length > 0 ? { tools: openAiTools as any } : {}),\n ...(openAiTools.length > 0 ? { parallel_tool_calls: true } : {}),\n reasoning,\n text: textConfig as any,\n include: [\"reasoning.encrypted_content\"] as any,\n },\n { signal: abortController.signal } as any,\n );\n\n for await (const event of stream as any) {\n switch (event.type) {\n case \"response.output_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"response\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.reasoning_summary_text.delta\":\n emitEvent({\n type: \"delta\",\n channel: \"thought\",\n text: typeof event.delta === \"string\" ? event.delta : \"\",\n });\n break;\n case \"response.refusal.delta\":\n emitEvent({ type: \"blocked\" });\n break;\n default:\n break;\n }\n }\n return await (stream as any).finalResponse();\n });\n\n modelVersion =\n typeof (finalResponse as any).model === \"string\"\n ? (finalResponse as any).model\n : request.model;\n emitEvent({ type: \"model\", modelVersion });\n if ((finalResponse as any).error) {\n const message =\n typeof (finalResponse as any).error.message === \"string\"\n ? (finalResponse as any).error.message\n : \"OpenAI response failed\";\n throw new Error(message);\n }\n usageTokens = extractOpenAiUsageTokens((finalResponse as any).usage);\n\n const responseText = extractOpenAiResponseParts(finalResponse)\n .parts.filter((p) => p.type === \"text\" && p.thought !== true)\n .map((p) => (p as any).text as string)\n .join(\"\")\n .trim();\n const reasoningSummary = extractOpenAiReasoningSummary(finalResponse).trim();\n\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (usageTokens) {\n emitEvent({ type: \"usage\", usage: usageTokens, costUsd: stepCostUsd, modelVersion });\n }\n\n const responseToolCalls = extractOpenAiToolCalls((finalResponse as any).output);\n\n const stepToolCalls: LlmToolCallResult[] = [];\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummary;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n if (call.kind === \"custom\") {\n return {\n call,\n toolName,\n value: call.input,\n parseError: undefined,\n toolId,\n turn,\n toolIndex,\n };\n }\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n return { call, toolName, value, parseError, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: entry.call.kind,\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n const toolOutputs: any[] = [];\n for (const { entry, result, outputPayload } of callResults) {\n stepToolCalls.push({ ...result, callId: entry.call.call_id });\n if (entry.call.kind === \"custom\") {\n toolOutputs.push({\n type: \"custom_tool_call_output\",\n call_id: entry.call.call_id,\n output: mergeToolOutput(outputPayload),\n });\n } else {\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.call.call_id,\n output: mergeToolOutput(outputPayload),\n });\n }\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummary || undefined,\n toolCalls: stepToolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n previousResponseId = (finalResponse as any).id;\n input = toolOutputs;\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n if (providerInfo.provider === \"chatgpt\") {\n const openAiAgentTools = buildOpenAiToolsFromToolSet(request.tools);\n const openAiNativeTools = toOpenAiTools(request.modelTools);\n const openAiTools = openAiNativeTools\n ? [...openAiNativeTools, ...openAiAgentTools]\n : [...openAiAgentTools];\n\n const reasoningEffort = resolveOpenAiReasoningEffort(\n request.model,\n request.openAiReasoningEffort,\n );\n const toolLoopInput = toChatGptInput(contents);\n // ChatGPT Codex prompt caching is keyed by both prompt_cache_key and session_id.\n const conversationId = `tool-loop-${randomBytes(8).toString(\"hex\")}`;\n const promptCacheKey = conversationId;\n let input: ChatGptInputItem[] = [...toolLoopInput.input];\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const response = await collectChatGptCodexResponseWithRetry({\n sessionId: conversationId,\n request: {\n model: providerInfo.model,\n store: false,\n stream: true,\n instructions: toolLoopInput.instructions ?? \"You are a helpful assistant.\",\n input,\n prompt_cache_key: promptCacheKey,\n include: [\"reasoning.encrypted_content\"],\n tools: openAiTools,\n tool_choice: \"auto\" as const,\n parallel_tool_calls: true,\n reasoning: {\n effort: toOpenAiReasoningEffort(reasoningEffort),\n summary: \"detailed\" as const,\n },\n text: { verbosity: resolveOpenAiVerbosity(request.model) },\n } as any,\n signal: request.signal,\n onDelta: (delta) => {\n if (delta.thoughtDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"thought\", text: delta.thoughtDelta });\n }\n if (delta.textDelta) {\n request.onEvent?.({ type: \"delta\", channel: \"response\", text: delta.textDelta });\n }\n },\n });\n\n const modelVersion = response.model ? `chatgpt-${response.model}` : request.model;\n const usageTokens = extractChatGptUsageTokens(response.usage);\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n const responseText = (response.text ?? \"\").trim();\n const reasoningSummaryText = (response.reasoningSummaryText ?? \"\").trim();\n\n const responseToolCalls = response.toolCalls ?? [];\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = reasoningSummaryText;\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n const toolOutputs: ChatGptInputItem[] = [];\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name;\n const { value, error: parseError } =\n call.kind === \"custom\"\n ? { value: call.input, error: undefined }\n : parseOpenAiToolArguments(call.arguments);\n const ids = normalizeChatGptToolIds({\n callKind: call.kind,\n callId: call.callId,\n itemId: call.id,\n });\n return { call, toolName, value, parseError, ids, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: entry.call.kind,\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.ids.callId });\n if (entry.call.kind === \"custom\") {\n toolOutputs.push({\n type: \"custom_tool_call\",\n id: entry.ids.itemId,\n call_id: entry.ids.callId,\n name: entry.toolName,\n input: entry.call.input,\n status: \"completed\",\n } as ChatGptInputItem);\n toolOutputs.push({\n type: \"custom_tool_call_output\",\n call_id: entry.ids.callId,\n output: mergeToolOutput(outputPayload),\n } as ChatGptInputItem);\n } else {\n toolOutputs.push({\n type: \"function_call\",\n id: entry.ids.itemId,\n call_id: entry.ids.callId,\n name: entry.toolName,\n arguments: entry.call.arguments,\n status: \"completed\",\n } as ChatGptInputItem);\n toolOutputs.push({\n type: \"function_call_output\",\n call_id: entry.ids.callId,\n output: mergeToolOutput(outputPayload),\n } as ChatGptInputItem);\n }\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: reasoningSummaryText || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n input = input.concat(toolOutputs);\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n if (providerInfo.provider === \"fireworks\") {\n if (request.modelTools && request.modelTools.length > 0) {\n throw new Error(\n \"Fireworks provider does not support provider-native modelTools in runToolLoop.\",\n );\n }\n\n const fireworksTools = buildFireworksToolsFromToolSet(request.tools);\n const messages: Array<Record<string, unknown>> = toFireworksMessages(contents);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const turn = stepIndex + 1;\n const response = await runFireworksCall(async (client) => {\n return await client.chat.completions.create(\n {\n model: providerInfo.model,\n messages: messages as any,\n tools: fireworksTools as any,\n tool_choice: \"auto\" as const,\n parallel_tool_calls: true,\n } as any,\n { signal: request.signal } as any,\n );\n });\n\n const modelVersion = typeof response.model === \"string\" ? response.model : request.model;\n request.onEvent?.({ type: \"model\", modelVersion });\n\n const choice = Array.isArray(response.choices) ? response.choices[0] : undefined;\n if (choice?.finish_reason === \"content_filter\") {\n request.onEvent?.({ type: \"blocked\" });\n }\n const message = (choice as { message?: unknown } | undefined)?.message;\n const responseText = extractFireworksMessageText(message).trim();\n if (responseText.length > 0) {\n request.onEvent?.({ type: \"delta\", channel: \"response\", text: responseText });\n }\n\n const usageTokens = extractFireworksUsageTokens(response.usage);\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (usageTokens) {\n request.onEvent?.({\n type: \"usage\",\n usage: usageTokens,\n costUsd: stepCostUsd,\n modelVersion,\n });\n }\n\n const responseToolCalls = extractFireworksToolCalls(message);\n if (responseToolCalls.length === 0) {\n finalText = responseText;\n finalThoughts = \"\";\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const stepToolCalls: LlmToolCallResult[] = [];\n const callInputs = responseToolCalls.map((call, index) => {\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const { value, error: parseError } = parseOpenAiToolArguments(call.arguments);\n return { call, toolName: call.name, value, parseError, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: \"function\",\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.value,\n parseError: entry.parseError,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n const assistantToolCalls: Array<Record<string, unknown>> = [];\n const toolMessages: Array<Record<string, unknown>> = [];\n for (const { entry, result, outputPayload } of callResults) {\n stepToolCalls.push({ ...result, callId: entry.call.id });\n assistantToolCalls.push({\n id: entry.call.id,\n type: \"function\",\n function: {\n name: entry.toolName,\n arguments: entry.call.arguments,\n },\n });\n toolMessages.push({\n role: \"tool\",\n tool_call_id: entry.call.id,\n content: mergeToolOutput(outputPayload),\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: responseText || undefined,\n thoughts: undefined,\n toolCalls: stepToolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n messages.push({\n role: \"assistant\",\n ...(responseText.length > 0 ? { content: responseText } : {}),\n tool_calls: assistantToolCalls,\n });\n messages.push(...toolMessages);\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n }\n\n // Gemini provider\n const geminiFunctionTools = buildGeminiFunctionDeclarations(request.tools);\n const geminiNativeTools = toGeminiTools(request.modelTools);\n const geminiTools = geminiNativeTools\n ? geminiNativeTools.concat(geminiFunctionTools)\n : geminiFunctionTools;\n const geminiContents = contents.map(convertLlmContentToGeminiContent);\n\n for (let stepIndex = 0; stepIndex < maxSteps; stepIndex += 1) {\n const config: GenerateContentConfig = {\n maxOutputTokens: 32_000,\n tools: geminiTools,\n toolConfig: {\n functionCallingConfig: {\n mode: FunctionCallingConfigMode.VALIDATED,\n },\n },\n thinkingConfig: resolveGeminiThinkingConfig(request.model),\n };\n\n const onEvent = request.onEvent;\n\n type GeminiToolLoopResponse = {\n readonly responseText: string;\n readonly thoughtsText: string;\n readonly functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>>;\n readonly modelParts: GeminiPart[];\n readonly usageMetadata?: unknown;\n readonly modelVersion?: string;\n };\n\n const response: GeminiToolLoopResponse = await runGeminiCall(async (client) => {\n const stream = await client.models.generateContentStream({\n model: request.model,\n contents: geminiContents,\n config,\n });\n let responseText = \"\";\n let thoughtsText = \"\";\n const modelParts: GeminiPart[] = [];\n const functionCalls: Array<NonNullable<GeminiPart[\"functionCall\"]>> = [];\n const seenFunctionCallIds = new Set<string>();\n const seenFunctionCallKeys = new Set<string>();\n let latestUsageMetadata: unknown;\n let resolvedModelVersion: string | undefined;\n\n for await (const chunk of stream) {\n if (chunk.modelVersion) {\n resolvedModelVersion = chunk.modelVersion;\n onEvent?.({ type: \"model\", modelVersion: chunk.modelVersion });\n }\n if (chunk.usageMetadata) {\n latestUsageMetadata = chunk.usageMetadata;\n }\n const candidates = chunk.candidates;\n if (!candidates || candidates.length === 0) {\n continue;\n }\n const primary = candidates[0];\n const parts = primary?.content?.parts;\n if (!parts || parts.length === 0) {\n continue;\n }\n\n for (const part of parts) {\n modelParts.push(part);\n const call = part.functionCall;\n if (call) {\n const id = typeof call.id === \"string\" ? call.id : \"\";\n const shouldAdd = (() => {\n if (id.length > 0) {\n if (seenFunctionCallIds.has(id)) {\n return false;\n }\n seenFunctionCallIds.add(id);\n return true;\n }\n const key = JSON.stringify({ name: call.name ?? \"\", args: call.args ?? null });\n if (seenFunctionCallKeys.has(key)) {\n return false;\n }\n seenFunctionCallKeys.add(key);\n return true;\n })();\n if (shouldAdd) {\n functionCalls.push(call);\n }\n }\n if (typeof part.text === \"string\" && part.text.length > 0) {\n if (part.thought) {\n thoughtsText += part.text;\n onEvent?.({ type: \"delta\", channel: \"thought\", text: part.text });\n } else {\n responseText += part.text;\n onEvent?.({ type: \"delta\", channel: \"response\", text: part.text });\n }\n }\n }\n }\n\n return {\n responseText,\n thoughtsText,\n functionCalls,\n modelParts,\n usageMetadata: latestUsageMetadata,\n modelVersion: resolvedModelVersion ?? request.model,\n };\n });\n\n const usageTokens = extractGeminiUsageTokens(response.usageMetadata);\n const modelVersion = response.modelVersion ?? request.model;\n const stepCostUsd = estimateCallCostUsd({\n modelId: modelVersion,\n tokens: usageTokens,\n responseImages: 0,\n });\n totalCostUsd += stepCostUsd;\n\n if (response.functionCalls.length === 0) {\n finalText = response.responseText.trim();\n finalThoughts = response.thoughtsText.trim();\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: finalText || undefined,\n thoughts: finalThoughts || undefined,\n toolCalls: [],\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n return { text: finalText, thoughts: finalThoughts, steps, totalCostUsd };\n }\n\n const toolCalls: LlmToolCallResult[] = [];\n\n const modelPartsForHistory = response.modelParts.filter(\n (part) => !(typeof part.text === \"string\" && part.thought === true),\n );\n if (modelPartsForHistory.length > 0) {\n geminiContents.push({ role: \"model\", parts: modelPartsForHistory });\n } else {\n const parts: GeminiPart[] = [];\n if (response.responseText) {\n parts.push({ text: response.responseText });\n }\n for (const call of response.functionCalls) {\n parts.push({ functionCall: call });\n }\n geminiContents.push({ role: \"model\", parts });\n }\n\n const responseParts: GeminiPart[] = [];\n const callInputs = response.functionCalls.map((call, index) => {\n const turn = stepIndex + 1;\n const toolIndex = index + 1;\n const toolId = buildToolLogId(turn, toolIndex);\n const toolName = call.name ?? \"unknown\";\n const rawInput = call.args ?? {};\n return { call, toolName, rawInput, toolId, turn, toolIndex };\n });\n\n const callResults = await Promise.all(\n callInputs.map(async (entry) => {\n return await toolCallContextStorage.run(\n {\n toolName: entry.toolName,\n toolId: entry.toolId,\n turn: entry.turn,\n toolIndex: entry.toolIndex,\n },\n async () => {\n const { result, outputPayload } = await executeToolCall({\n callKind: \"function\",\n toolName: entry.toolName,\n tool: request.tools[entry.toolName],\n rawInput: entry.rawInput,\n });\n return { entry, result, outputPayload };\n },\n );\n }),\n );\n\n for (const { entry, result, outputPayload } of callResults) {\n toolCalls.push({ ...result, callId: entry.call.id });\n const responsePayload = isPlainRecord(outputPayload)\n ? outputPayload\n : { output: outputPayload };\n responseParts.push({\n functionResponse: {\n name: entry.toolName,\n response: responsePayload,\n ...(entry.call.id ? { id: entry.call.id } : {}),\n },\n });\n }\n\n steps.push({\n step: steps.length + 1,\n modelVersion,\n text: response.responseText.trim() || undefined,\n thoughts: response.thoughtsText.trim() || undefined,\n toolCalls,\n usage: usageTokens,\n costUsd: stepCostUsd,\n });\n\n geminiContents.push({ role: \"user\", parts: responseParts });\n }\n\n throw new Error(`Tool loop exceeded max steps (${maxSteps}) without final response.`);\n}\n\n// --- Images (Gemini image-preview) ---\n\nconst IMAGE_GRADE_SCHEMA = z.enum([\"pass\", \"fail\"]);\n\nasync function gradeGeneratedImage(params: {\n gradingPrompt: string;\n imagePrompt: string;\n image: LlmImageData;\n model: LlmTextModelId;\n}): Promise<z.infer<typeof IMAGE_GRADE_SCHEMA>> {\n const parts: LlmContentPart[] = [\n {\n type: \"text\",\n text: [\n params.gradingPrompt,\n \"\",\n \"Image prompt to grade:\",\n params.imagePrompt,\n \"\",\n 'Respond with the JSON string \"pass\" or \"fail\".',\n ].join(\"\\\\n\"),\n },\n {\n type: \"inlineData\",\n data: params.image.data.toString(\"base64\"),\n mimeType: params.image.mimeType ?? \"image/png\",\n },\n ];\n const { value } = await generateJson({\n model: params.model,\n input: [{ role: \"user\", content: parts }],\n schema: IMAGE_GRADE_SCHEMA,\n });\n return value;\n}\n\nexport async function generateImages(request: LlmGenerateImagesRequest): Promise<LlmImageData[]> {\n const maxAttempts = Math.max(1, Math.floor(request.maxAttempts ?? 4));\n const promptList = Array.from(request.imagePrompts);\n if (promptList.length === 0) {\n return [];\n }\n const numImages = promptList.length;\n\n type PromptEntry = { index: number; prompt: string };\n const promptEntries: PromptEntry[] = promptList.map((rawPrompt, arrayIndex) => {\n const trimmedPrompt = rawPrompt.trim();\n if (!trimmedPrompt) {\n throw new Error(`imagePrompts[${arrayIndex}] must be a non-empty string`);\n }\n return { index: arrayIndex + 1, prompt: trimmedPrompt };\n });\n\n const gradingPrompt = request.imageGradingPrompt.trim();\n if (!gradingPrompt) {\n throw new Error(\"imageGradingPrompt must be a non-empty string\");\n }\n\n const addText = (parts: LlmContentPart[], text: string) => {\n const lastPart = parts[parts.length - 1];\n if (lastPart !== undefined && lastPart.type === \"text\") {\n (lastPart as any).text = `${(lastPart as any).text}\\\\n${text}`;\n } else {\n parts.push({ type: \"text\", text });\n }\n };\n\n const buildInitialPromptParts = (): LlmContentPart[] => {\n const parts: LlmContentPart[] = [];\n addText(\n parts,\n [\n `Please make all ${numImages} requested images:`,\n \"\",\n \"Follow the style:\",\n request.stylePrompt,\n ].join(\"\\\\n\"),\n );\n if (request.styleImages && request.styleImages.length > 0) {\n addText(\n parts,\n \"\\\\nFollow the visual style, composition and the characters from these images:\",\n );\n for (const styleImage of request.styleImages) {\n parts.push({\n type: \"inlineData\",\n data: styleImage.data.toString(\"base64\"),\n mimeType: styleImage.mimeType,\n });\n }\n }\n const lines: string[] = [\"\", \"Image descriptions:\"];\n for (const entry of promptEntries) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(\"\");\n lines.push(`Please make all ${numImages} images.`);\n addText(parts, lines.join(\"\\\\n\"));\n return parts;\n };\n\n const buildContinuationPromptParts = (pending: PromptEntry[]): LlmContentPart[] => {\n const pendingIds = pending.map((entry) => entry.index).join(\", \");\n const lines: string[] = [\n `Please continue generating the remaining images: ${pendingIds}.`,\n \"\",\n \"Image descriptions:\",\n ];\n for (const entry of pending) {\n lines.push(`\\\\nImage ${entry.index}: ${entry.prompt}`);\n }\n lines.push(`\\\\nPlease make all ${pending.length} remaining images.`);\n return [{ type: \"text\", text: lines.join(\"\\\\n\") }];\n };\n\n const inputMessages: LlmInputMessage[] = [{ role: \"user\", content: buildInitialPromptParts() }];\n\n const orderedEntries = [...promptEntries];\n const resolvedImages = new Map<number, LlmImageData>();\n\n const removeResolvedEntries = (resolved: ReadonlySet<number>) => {\n if (resolved.size === 0) {\n return;\n }\n for (let i = promptEntries.length - 1; i >= 0; i -= 1) {\n const entry = promptEntries[i];\n if (!entry) {\n continue;\n }\n if (resolved.has(entry.index)) {\n promptEntries.splice(i, 1);\n }\n }\n };\n\n for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {\n const result = await generateText({\n model: request.model,\n input: inputMessages,\n responseModalities: [\"IMAGE\", \"TEXT\"],\n imageAspectRatio: request.imageAspectRatio,\n imageSize: request.imageSize ?? \"2K\",\n });\n if (result.blocked || !result.content) {\n continue;\n }\n const images = extractImages(result.content);\n if (images.length > 0 && promptEntries.length > 0) {\n const assignedCount = Math.min(images.length, promptEntries.length);\n const pendingAssignments = promptEntries.slice(0, assignedCount);\n const assignedImages = images.slice(0, assignedCount);\n const gradeResults = await Promise.all(\n pendingAssignments.map((entry, index) =>\n gradeGeneratedImage({\n gradingPrompt,\n imagePrompt: entry.prompt,\n image: (() => {\n const image = assignedImages[index];\n if (!image) {\n throw new Error(\"Image generation returned fewer images than expected.\");\n }\n return image as LlmImageData;\n })(),\n model: \"gpt-5.2\",\n }),\n ),\n );\n const passedEntries = new Set<number>();\n for (let i = 0; i < gradeResults.length; i += 1) {\n const grade = gradeResults[i];\n const entry = pendingAssignments[i];\n const image = assignedImages[i];\n if (!grade || !entry || !image) {\n continue;\n }\n if (grade === \"pass\") {\n resolvedImages.set(entry.index, image as LlmImageData);\n passedEntries.add(entry.index);\n }\n }\n removeResolvedEntries(passedEntries);\n }\n if (promptEntries.length === 0) {\n break;\n }\n inputMessages.push({\n role: \"assistant\",\n content: result.content.parts,\n });\n inputMessages.push({ role: \"user\", content: buildContinuationPromptParts(promptEntries) });\n }\n\n const orderedImages: LlmImageData[] = [];\n for (const entry of orderedEntries) {\n const image = resolvedImages.get(entry.index);\n if (image) {\n orderedImages.push(image);\n }\n }\n\n return orderedImages.slice(0, numImages);\n}\n\nexport async function generateImageInBatches(\n request: LlmGenerateImagesRequest & { batchSize: number; overlapSize: number },\n): Promise<LlmImageData[]> {\n const {\n batchSize,\n overlapSize,\n imagePrompts,\n styleImages: baseStyleImagesInput,\n ...rest\n } = request;\n if (batchSize <= 0) {\n throw new Error(\"batchSize must be greater than 0\");\n }\n if (imagePrompts.length === 0) {\n return [];\n }\n\n const baseStyleImages = baseStyleImagesInput ? [...baseStyleImagesInput] : [];\n const generatedImages: LlmImageData[] = [];\n const totalPrompts = imagePrompts.length;\n\n for (let startIndex = 0; startIndex < totalPrompts; startIndex += batchSize) {\n const endIndex = Math.min(startIndex + batchSize, totalPrompts);\n const batchPrompts = imagePrompts.slice(startIndex, endIndex);\n\n let styleImagesForBatch: readonly LlmImageData[] = baseStyleImages;\n if (overlapSize > 0 && generatedImages.length > 0) {\n const overlapImages = generatedImages.slice(\n Math.max(0, generatedImages.length - overlapSize),\n );\n if (overlapImages.length > 0) {\n styleImagesForBatch = [...baseStyleImages, ...overlapImages];\n }\n }\n\n const batchImages = await generateImages({\n ...rest,\n imagePrompts: batchPrompts,\n styleImages: styleImagesForBatch,\n });\n\n generatedImages.push(...batchImages);\n }\n\n return generatedImages;\n}\n\nexport function stripCodexCitationMarkers(value: string): {\n text: string;\n stripped: boolean;\n} {\n // Codex-style citation markers are private-use unicode characters:\n // cite... (U+E200/U+E202/U+E201)\n const citationBlockPattern = /\\uE200cite\\uE202[^\\uE201]*\\uE201/gu;\n const leftoverMarkersPattern = /[\\uE200\\uE201\\uE202]/gu;\n\n const withoutBlocks = value.replace(citationBlockPattern, \"\");\n const withoutMarkers = withoutBlocks.replace(leftoverMarkersPattern, \"\");\n const stripped = withoutMarkers !== value;\n return { text: withoutMarkers, stripped };\n}\n\nfunction hasMarkdownSourcesSection(value: string): boolean {\n return /^##\\s+Sources\\s*$/gmu.test(value);\n}\n\nexport function appendMarkdownSourcesSection(value: string, sources: readonly string[]): string {\n const trimmed = value.trimEnd();\n if (sources.length === 0) {\n return trimmed;\n }\n if (hasMarkdownSourcesSection(trimmed)) {\n return trimmed;\n }\n const lines = sources.map((url) => `- <${url}>`).join(\"\\n\");\n return `${trimmed}\\n\\n## Sources\\n${lines}`;\n}\n","export type AsyncQueue<T> = {\n push: (value: T) => void;\n close: () => void;\n fail: (error: Error) => void;\n iterable: AsyncIterable<T>;\n};\n\nexport function createAsyncQueue<T>(): AsyncQueue<T> {\n let closed = false;\n let error: Error | null = null;\n const values: T[] = [];\n let pending: {\n resolve: (value: IteratorResult<T>) => void;\n reject: (err: Error) => void;\n } | null = null;\n\n const push = (value: T) => {\n if (closed || error) {\n return;\n }\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value, done: false });\n return;\n }\n values.push(value);\n };\n\n const close = () => {\n if (closed || error) {\n return;\n }\n closed = true;\n if (pending) {\n const { resolve } = pending;\n pending = null;\n resolve({ value: undefined as never, done: true });\n }\n };\n\n const fail = (err: Error) => {\n if (closed || error) {\n return;\n }\n error = err;\n if (pending) {\n const { reject } = pending;\n pending = null;\n reject(err);\n }\n };\n\n async function* iterator(): AsyncIterable<T> {\n while (true) {\n if (error) {\n throw error;\n }\n if (values.length > 0) {\n yield values.shift() as T;\n continue;\n }\n if (closed) {\n return;\n }\n const next = await new Promise<IteratorResult<T>>((resolve, reject) => {\n pending = { resolve, reject };\n });\n if (next.done) {\n return;\n }\n yield next.value;\n }\n }\n\n return { push, close, fail, iterable: iterator() };\n}\n","export type FireworksPricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputRate: number;\n};\n\nconst FIREWORKS_KIMI_K25_PRICING: FireworksPricing = {\n inputRate: 0.6 / 1_000_000,\n cachedRate: 0.1 / 1_000_000,\n outputRate: 3.0 / 1_000_000,\n};\n\nconst FIREWORKS_GLM_5_PRICING: FireworksPricing = {\n inputRate: 1.0 / 1_000_000,\n cachedRate: 0.2 / 1_000_000,\n outputRate: 3.2 / 1_000_000,\n};\n\nconst FIREWORKS_MINIMAX_M21_PRICING: FireworksPricing = {\n inputRate: 0.3 / 1_000_000,\n cachedRate: 0.15 / 1_000_000,\n outputRate: 1.2 / 1_000_000,\n};\n\nexport function getFireworksPricing(modelId: string): FireworksPricing | undefined {\n if (modelId.includes(\"kimi-k2.5\") || modelId.includes(\"kimi-k2p5\")) {\n return FIREWORKS_KIMI_K25_PRICING;\n }\n if (modelId.includes(\"glm-5\")) {\n return FIREWORKS_GLM_5_PRICING;\n }\n if (modelId.includes(\"minimax-m2.1\") || modelId.includes(\"minimax-m2p1\")) {\n return FIREWORKS_MINIMAX_M21_PRICING;\n }\n return undefined;\n}\n","export type GeminiProPricing = {\n readonly threshold: number;\n readonly inputRateLow: number;\n readonly inputRateHigh: number;\n readonly cachedRateLow: number;\n readonly cachedRateHigh: number;\n readonly outputRateLow: number;\n readonly outputRateHigh: number;\n};\n\nexport type GeminiImagePricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputTextRate: number;\n readonly outputImageRate: number;\n readonly imagePrices: Record<string, number>;\n};\n\n// Gemini pricing snapshot (best-effort). For current official pricing, see:\n// https://cloud.google.com/vertex-ai/generative-ai/pricing\nconst GEMINI_3_PRO_PREVIEW_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 2 / 1_000_000,\n inputRateHigh: 4 / 1_000_000,\n cachedRateLow: 0.2 / 1_000_000,\n cachedRateHigh: 0.4 / 1_000_000,\n outputRateLow: 12 / 1_000_000,\n outputRateHigh: 18 / 1_000_000,\n};\n\n// Pricing from Gemini 2.5 Pro public rates (per 1M tokens, USD):\n// - Input: $1.25 (<=200k prompt tokens), $2.50 (>200k)\n// - Output (including thinking): $10.00 (<=200k), $15.00 (>200k)\n// - Context caching: $0.125 (<=200k), $0.25 (>200k)\nconst GEMINI_2_5_PRO_PRICING: GeminiProPricing = {\n threshold: 200_000,\n inputRateLow: 1.25 / 1_000_000,\n inputRateHigh: 2.5 / 1_000_000,\n cachedRateLow: 0.125 / 1_000_000,\n cachedRateHigh: 0.25 / 1_000_000,\n outputRateLow: 10 / 1_000_000,\n outputRateHigh: 15 / 1_000_000,\n};\n\nconst GEMINI_IMAGE_PREVIEW_PRICING: GeminiImagePricing = {\n inputRate: 2 / 1_000_000,\n cachedRate: 0.2 / 1_000_000,\n outputTextRate: 12 / 1_000_000,\n outputImageRate: 120 / 1_000_000,\n imagePrices: {\n \"1K\": 0.134,\n \"2K\": 0.134,\n \"4K\": 0.24,\n },\n};\n\nexport function getGeminiProPricing(modelId: string): GeminiProPricing | undefined {\n if (modelId.includes(\"gemini-2.5-pro\")) {\n return GEMINI_2_5_PRO_PRICING;\n }\n if (modelId.includes(\"gemini-3-pro\") || modelId.includes(\"gemini-3.1-pro\")) {\n return GEMINI_3_PRO_PREVIEW_PRICING;\n }\n return undefined;\n}\n\nexport function getGeminiImagePricing(modelId: string): GeminiImagePricing | undefined {\n if (modelId.includes(\"image-preview\")) {\n return GEMINI_IMAGE_PREVIEW_PRICING;\n }\n return undefined;\n}\n","export type OpenAiPricing = {\n readonly inputRate: number;\n readonly cachedRate: number;\n readonly outputRate: number;\n};\n\n// Pricing snapshot (best-effort). For current official pricing, see:\n// https://platform.openai.com/docs/pricing\n// Keep this conservative: unknown models -> cost 0.\nconst OPENAI_GPT_52_PRICING: OpenAiPricing = {\n inputRate: 1.75 / 1_000_000,\n cachedRate: 0.175 / 1_000_000,\n outputRate: 14 / 1_000_000,\n};\n\n// gpt-5.3-codex-spark is priced as the GPT-5 mini tier in this library.\nconst OPENAI_GPT_53_CODEX_PRICING: OpenAiPricing = {\n inputRate: 1.25 / 1_000_000,\n cachedRate: 0.125 / 1_000_000,\n outputRate: 10 / 1_000_000,\n};\n\nconst OPENAI_GPT_5_MINI_PRICING: OpenAiPricing = {\n inputRate: 0.25 / 1_000_000,\n cachedRate: 0.025 / 1_000_000,\n outputRate: 2.0 / 1_000_000,\n};\n\nexport function getOpenAiPricing(modelId: string): OpenAiPricing | undefined {\n if (modelId.includes(\"gpt-5.3-codex-spark\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n if (modelId.includes(\"gpt-5.3-codex\")) {\n return OPENAI_GPT_53_CODEX_PRICING;\n }\n if (modelId.includes(\"gpt-5.2\")) {\n return OPENAI_GPT_52_PRICING;\n }\n if (modelId.includes(\"gpt-5-mini\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n if (modelId.includes(\"gpt-5.1-codex-mini\")) {\n return OPENAI_GPT_5_MINI_PRICING;\n }\n return undefined;\n}\n","import { getFireworksPricing } from \"../fireworks/pricing.js\";\nimport { getGeminiImagePricing, getGeminiProPricing } from \"../google/pricing.js\";\nimport { getOpenAiPricing } from \"../openai/pricing.js\";\n\nexport type LlmUsageTokens = {\n readonly promptTokens?: number;\n readonly cachedTokens?: number;\n readonly responseTokens?: number;\n readonly responseImageTokens?: number;\n readonly thinkingTokens?: number;\n readonly totalTokens?: number;\n readonly toolUsePromptTokens?: number;\n};\n\nfunction resolveUsageNumber(value: number | undefined): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.max(0, value);\n }\n return 0;\n}\n\nexport function estimateCallCostUsd({\n modelId,\n tokens,\n responseImages,\n imageSize,\n}: {\n modelId: string;\n tokens: LlmUsageTokens | undefined;\n responseImages: number;\n imageSize?: string;\n}): number {\n if (!tokens) {\n return 0;\n }\n const promptTokens = resolveUsageNumber(tokens.promptTokens);\n const cachedTokens = resolveUsageNumber(tokens.cachedTokens);\n const responseTokens = resolveUsageNumber(tokens.responseTokens);\n const responseImageTokens = resolveUsageNumber(tokens.responseImageTokens);\n const thinkingTokens = resolveUsageNumber(tokens.thinkingTokens);\n const toolUsePromptTokens = resolveUsageNumber(tokens.toolUsePromptTokens);\n const promptTokenTotal = promptTokens + toolUsePromptTokens;\n const nonCachedPrompt = Math.max(0, promptTokenTotal - cachedTokens);\n\n const imagePreviewPricing = getGeminiImagePricing(modelId);\n if (imagePreviewPricing) {\n const resolvedImageSize =\n imageSize && imagePreviewPricing.imagePrices[imageSize] ? imageSize : \"2K\";\n const imageRate = imagePreviewPricing.imagePrices[resolvedImageSize] ?? 0;\n const tokensPerImage =\n imagePreviewPricing.outputImageRate > 0 ? imageRate / imagePreviewPricing.outputImageRate : 0;\n let responseTextForPricing = Math.max(0, responseTokens - responseImageTokens);\n let imageTokensForPricing = responseImageTokens;\n if (imageTokensForPricing <= 0 && responseImages > 0 && tokensPerImage > 0) {\n const estimatedImageTokens = responseImages * tokensPerImage;\n imageTokensForPricing = estimatedImageTokens;\n if (responseTextForPricing >= estimatedImageTokens) {\n responseTextForPricing -= estimatedImageTokens;\n }\n }\n const textOutputCost =\n (responseTextForPricing + thinkingTokens) * imagePreviewPricing.outputTextRate;\n const inputCost = nonCachedPrompt * imagePreviewPricing.inputRate;\n const cachedCost = cachedTokens * imagePreviewPricing.cachedRate;\n const imageOutputCost = imageTokensForPricing * imagePreviewPricing.outputImageRate;\n return inputCost + cachedCost + textOutputCost + imageOutputCost;\n }\n\n const geminiPricing = getGeminiProPricing(modelId);\n if (geminiPricing) {\n const useHighTier = promptTokenTotal > geminiPricing.threshold;\n const inputRate = useHighTier ? geminiPricing.inputRateHigh : geminiPricing.inputRateLow;\n const cachedRate = useHighTier ? geminiPricing.cachedRateHigh : geminiPricing.cachedRateLow;\n const outputRate = useHighTier ? geminiPricing.outputRateHigh : geminiPricing.outputRateLow;\n const inputCost = nonCachedPrompt * inputRate;\n const cachedCost = cachedTokens * cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n const fireworksPricing = getFireworksPricing(modelId);\n if (fireworksPricing) {\n const inputCost = nonCachedPrompt * fireworksPricing.inputRate;\n const cachedCost = cachedTokens * fireworksPricing.cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * fireworksPricing.outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n const openAiPricing = getOpenAiPricing(modelId);\n if (openAiPricing) {\n const inputCost = nonCachedPrompt * openAiPricing.inputRate;\n const cachedCost = cachedTokens * openAiPricing.cachedRate;\n const outputTokens = responseTokens + thinkingTokens;\n const outputCost = outputTokens * openAiPricing.outputRate;\n return inputCost + cachedCost + outputCost;\n }\n\n return 0;\n}\n","import os from \"node:os\";\nimport { TextDecoder } from \"node:util\";\n\nimport { getChatGptAuthProfile } from \"./chatgpt-auth.js\";\nimport {\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n createAdaptiveResponsesStream,\n createResponsesWebSocketStream,\n mergeOpenAiBetaHeader,\n resolveResponsesWebSocketMode,\n toWebSocketUrl,\n type ResponsesStreamWithFinal,\n type ResponsesWebSocketMode,\n} from \"./responses-websocket.js\";\n\nconst CHATGPT_CODEX_ENDPOINT = \"https://chatgpt.com/backend-api/codex/responses\";\nconst CHATGPT_RESPONSES_EXPERIMENTAL_HEADER = \"responses=experimental\";\n\nlet cachedResponsesWebSocketMode: ResponsesWebSocketMode | null = null;\nlet chatGptResponsesWebSocketDisabled = false;\n\nexport type ChatGptInputTextPart = {\n type: \"input_text\";\n text: string;\n};\n\nexport type ChatGptOutputTextPart = {\n type: \"output_text\";\n text: string;\n};\n\nexport type ChatGptInputImagePart = {\n type: \"input_image\";\n image_url: string | { url: string };\n detail?: \"auto\";\n};\n\nexport type ChatGptInputFilePart = {\n type: \"input_file\";\n file_data?: string | null;\n file_id?: string | null;\n file_url?: string | null;\n filename?: string | null;\n};\n\nexport type ChatGptInputMessagePart =\n | ChatGptInputTextPart\n | ChatGptOutputTextPart\n | ChatGptInputImagePart\n | ChatGptInputFilePart;\n\nexport type ChatGptInputMessage = {\n role: \"user\" | \"assistant\";\n content: string | ChatGptInputMessagePart[];\n type?: \"message\";\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCall = {\n type: \"function_call\";\n id: string;\n call_id: string;\n name: string;\n arguments: string;\n status?: \"completed\";\n};\n\nexport type ChatGptCustomToolCall = {\n type: \"custom_tool_call\";\n id: string;\n call_id: string;\n name: string;\n input: string;\n status?: \"completed\";\n};\n\nexport type ChatGptFunctionCallOutput = {\n type: \"function_call_output\";\n call_id: string;\n output: string;\n};\n\nexport type ChatGptCustomToolCallOutput = {\n type: \"custom_tool_call_output\";\n call_id: string;\n output: string;\n};\n\nexport type ChatGptInputItem =\n | ChatGptInputMessage\n | ChatGptFunctionCall\n | ChatGptCustomToolCall\n | ChatGptFunctionCallOutput\n | ChatGptCustomToolCallOutput;\n\nexport type ChatGptCodexRequest = {\n model: string;\n store: boolean;\n stream: boolean;\n instructions?: string;\n input: ChatGptInputItem[];\n text?: { verbosity?: string; format?: unknown };\n include?: string[];\n prompt_cache_key?: string;\n tool_choice?: \"auto\" | \"required\" | \"none\";\n parallel_tool_calls?: boolean;\n temperature?: number;\n tools?: unknown[];\n reasoning?: { effort: string; summary?: string };\n};\n\nexport type ChatGptCodexStreamEvent = {\n type?: string;\n [key: string]: unknown;\n};\n\nexport type ChatGptCodexUsage = {\n input_tokens?: number;\n input_tokens_details?: { cached_tokens?: number };\n output_tokens?: number;\n output_tokens_details?: { reasoning_tokens?: number };\n total_tokens?: number;\n};\n\nexport type ChatGptCodexToolCall =\n | {\n kind: \"function\";\n id: string;\n callId: string;\n name: string;\n arguments: string;\n }\n | {\n kind: \"custom\";\n id: string;\n callId: string;\n name: string;\n input: string;\n };\n\nexport type ChatGptCodexWebSearchAction = {\n type: string;\n query?: string;\n queries?: string[];\n url?: string;\n pattern?: string;\n sources?: Array<{ url: string }>;\n};\n\nexport type ChatGptCodexWebSearchCall = {\n id: string;\n status?: string;\n action?: ChatGptCodexWebSearchAction;\n};\n\nexport type ChatGptCodexCollectedResponse = {\n text: string;\n reasoningText: string;\n reasoningSummaryText: string;\n toolCalls: ChatGptCodexToolCall[];\n webSearchCalls: ChatGptCodexWebSearchCall[];\n usage?: ChatGptCodexUsage;\n id?: string;\n model?: string;\n status?: string;\n blocked: boolean;\n};\n\nexport type ChatGptCodexDelta = {\n textDelta?: string;\n thoughtDelta?: string;\n};\n\nexport async function streamChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n}): Promise<AsyncIterable<ChatGptCodexStreamEvent>> {\n const { access, accountId } = await getChatGptAuthProfile();\n const mode = resolveChatGptResponsesWebSocketMode();\n\n const fallbackStreamFactory = (): ResponsesStreamWithFinal<\n ChatGptCodexStreamEvent,\n Record<string, unknown>\n > => {\n const streamPromise = streamChatGptCodexResponseSse({\n request: options.request,\n access,\n accountId,\n sessionId: options.sessionId,\n signal: options.signal,\n });\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<ChatGptCodexStreamEvent> {\n const stream = await streamPromise;\n for await (const event of stream) {\n yield event;\n }\n },\n async finalResponse(): Promise<Record<string, unknown>> {\n return {};\n },\n close(): void {\n // SSE stream lifecycle is managed by fetch/AbortSignal.\n },\n };\n };\n\n if (mode === \"off\" || chatGptResponsesWebSocketDisabled) {\n return fallbackStreamFactory();\n }\n\n const websocketHeaders = buildChatGptCodexHeaders({\n access,\n accountId,\n sessionId: options.sessionId,\n useWebSocket: true,\n });\n return createAdaptiveResponsesStream({\n mode,\n createWebSocketStream: async () =>\n await createResponsesWebSocketStream({\n url: toWebSocketUrl(CHATGPT_CODEX_ENDPOINT),\n headers: websocketHeaders,\n request: options.request,\n signal: options.signal,\n }),\n createFallbackStream: fallbackStreamFactory,\n onWebSocketFallback: () => {\n chatGptResponsesWebSocketDisabled = true;\n },\n });\n}\n\nasync function streamChatGptCodexResponseSse(options: {\n request: ChatGptCodexRequest;\n access: string;\n accountId: string;\n sessionId?: string;\n signal?: AbortSignal;\n}): Promise<AsyncIterable<ChatGptCodexStreamEvent>> {\n const headers = buildChatGptCodexHeaders({\n access: options.access,\n accountId: options.accountId,\n sessionId: options.sessionId,\n useWebSocket: false,\n });\n headers.Accept = \"text/event-stream\";\n headers[\"Content-Type\"] = \"application/json\";\n\n const response = await fetch(CHATGPT_CODEX_ENDPOINT, {\n method: \"POST\",\n headers,\n body: JSON.stringify(options.request),\n signal: options.signal,\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT Codex request failed (${response.status}): ${body}`);\n }\n const body = response.body;\n if (!body) {\n throw new Error(\"ChatGPT Codex response body was empty.\");\n }\n return parseEventStream(body);\n}\n\nfunction resolveChatGptResponsesWebSocketMode(): ResponsesWebSocketMode {\n if (cachedResponsesWebSocketMode) {\n return cachedResponsesWebSocketMode;\n }\n cachedResponsesWebSocketMode = resolveResponsesWebSocketMode(\n process.env.CHATGPT_RESPONSES_WEBSOCKET_MODE ?? process.env.OPENAI_RESPONSES_WEBSOCKET_MODE,\n \"auto\",\n );\n return cachedResponsesWebSocketMode;\n}\n\nfunction buildChatGptCodexHeaders(options: {\n access: string;\n accountId: string;\n sessionId?: string;\n useWebSocket: boolean;\n}): Record<string, string> {\n const openAiBeta = options.useWebSocket\n ? mergeOpenAiBetaHeader(\n CHATGPT_RESPONSES_EXPERIMENTAL_HEADER,\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n )\n : CHATGPT_RESPONSES_EXPERIMENTAL_HEADER;\n const headers: Record<string, string> = {\n Authorization: `Bearer ${options.access}`,\n \"chatgpt-account-id\": options.accountId,\n \"OpenAI-Beta\": openAiBeta,\n originator: \"llm\",\n \"User-Agent\": buildUserAgent(),\n };\n if (options.sessionId) {\n headers.session_id = options.sessionId;\n }\n return headers;\n}\n\nexport async function collectChatGptCodexResponse(options: {\n request: ChatGptCodexRequest;\n sessionId?: string;\n signal?: AbortSignal;\n onDelta?: (delta: ChatGptCodexDelta) => void;\n}): Promise<ChatGptCodexCollectedResponse> {\n let requestForAttempt = options.request;\n let retriedWithoutReasoningSummary = false;\n let retriedViaSseFallback = false;\n\n while (true) {\n let sawAnyDelta = false;\n try {\n const stream = await streamChatGptCodexResponse({\n ...options,\n request: requestForAttempt,\n });\n return await collectChatGptCodexStream({\n stream,\n onDelta: (delta) => {\n sawAnyDelta = true;\n options.onDelta?.(delta);\n },\n });\n } catch (error) {\n if (\n !sawAnyDelta &&\n !retriedViaSseFallback &&\n shouldRetryViaSseFallback(error) &&\n !chatGptResponsesWebSocketDisabled\n ) {\n chatGptResponsesWebSocketDisabled = true;\n retriedViaSseFallback = true;\n continue;\n }\n if (\n !retriedWithoutReasoningSummary &&\n shouldRetryWithoutReasoningSummary(requestForAttempt, error)\n ) {\n requestForAttempt = removeReasoningSummary(requestForAttempt);\n retriedWithoutReasoningSummary = true;\n continue;\n }\n throw error;\n }\n }\n}\n\nasync function collectChatGptCodexStream(options: {\n stream: AsyncIterable<ChatGptCodexStreamEvent>;\n onDelta?: (delta: ChatGptCodexDelta) => void;\n}): Promise<ChatGptCodexCollectedResponse> {\n const toolCalls = new Map<string, ChatGptCodexToolCall>();\n const toolCallOrder: string[] = [];\n const webSearchCalls = new Map<string, ChatGptCodexWebSearchCall>();\n const webSearchCallOrder: string[] = [];\n let text = \"\";\n const reasoningText = \"\";\n let reasoningSummaryText = \"\";\n let usage: ChatGptCodexUsage | undefined;\n let responseId: string | undefined;\n let model: string | undefined;\n let status: string | undefined;\n let blocked = false;\n for await (const event of options.stream) {\n const type = typeof event.type === \"string\" ? event.type : undefined;\n if (type === \"response.output_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n text += delta;\n options.onDelta?.({ textDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_summary_text.delta\") {\n const delta = typeof event.delta === \"string\" ? event.delta : \"\";\n if (delta.length > 0) {\n reasoningSummaryText += delta;\n options.onDelta?.({ thoughtDelta: delta });\n }\n continue;\n }\n if (type === \"response.reasoning_text.delta\") {\n // Avoid collecting chain-of-thought; summaries are handled separately above.\n continue;\n }\n if (type === \"response.refusal.delta\") {\n blocked = true;\n continue;\n }\n if (type === \"response.output_item.added\" || type === \"response.output_item.done\") {\n const item = event.item as Record<string, unknown> | undefined;\n if (item) {\n if (item.type === \"function_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n const callId = typeof item.call_id === \"string\" ? item.call_id : id;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const args = typeof item.arguments === \"string\" ? item.arguments : \"\";\n if (callId) {\n if (!toolCalls.has(callId)) {\n toolCallOrder.push(callId);\n }\n toolCalls.set(callId, { kind: \"function\", id, callId, name, arguments: args });\n }\n } else if (item.type === \"custom_tool_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n const callId = typeof item.call_id === \"string\" ? item.call_id : id;\n const name = typeof item.name === \"string\" ? item.name : \"\";\n const input = typeof item.input === \"string\" ? item.input : \"\";\n if (callId) {\n if (!toolCalls.has(callId)) {\n toolCallOrder.push(callId);\n }\n toolCalls.set(callId, { kind: \"custom\", id, callId, name, input });\n }\n } else if (item.type === \"web_search_call\") {\n const id = typeof item.id === \"string\" ? item.id : \"\";\n if (id) {\n if (!webSearchCalls.has(id)) {\n webSearchCallOrder.push(id);\n }\n webSearchCalls.set(id, {\n id,\n status: typeof item.status === \"string\" ? item.status : undefined,\n action:\n item.action && typeof item.action === \"object\"\n ? (item.action as ChatGptCodexWebSearchAction)\n : undefined,\n });\n }\n }\n }\n continue;\n }\n if (type === \"response.completed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.failed\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n continue;\n }\n if (type === \"response.in_progress\") {\n const response = event.response as Record<string, unknown> | undefined;\n if (response) {\n usage = response.usage as ChatGptCodexUsage | undefined;\n responseId = typeof response.id === \"string\" ? response.id : responseId;\n model = typeof response.model === \"string\" ? response.model : undefined;\n status = typeof response.status === \"string\" ? response.status : undefined;\n }\n }\n }\n\n // Fallback: if we never received the summary delta, preserve reasoningText.\n if (!reasoningSummaryText && reasoningText) {\n reasoningSummaryText = reasoningText;\n }\n\n const orderedToolCalls = toolCallOrder\n .map((id) => toolCalls.get(id))\n .filter((call): call is ChatGptCodexToolCall => call !== undefined);\n const orderedWebSearchCalls = webSearchCallOrder\n .map((id) => webSearchCalls.get(id))\n .filter((call): call is ChatGptCodexWebSearchCall => call !== undefined);\n\n return {\n text,\n reasoningText,\n reasoningSummaryText,\n toolCalls: orderedToolCalls,\n webSearchCalls: orderedWebSearchCalls,\n usage,\n id: responseId,\n model,\n status,\n blocked,\n };\n}\n\nfunction shouldRetryWithoutReasoningSummary(request: ChatGptCodexRequest, error: unknown): boolean {\n if (!request.reasoning?.summary) {\n return false;\n }\n if (!(error instanceof Error)) {\n return false;\n }\n const message = error.message.toLowerCase();\n return message.includes(\"unsupported parameter\") && message.includes(\"reasoning.summary\");\n}\n\nfunction shouldRetryViaSseFallback(error: unknown): boolean {\n if (!(error instanceof Error)) {\n return false;\n }\n if (error.name === \"AbortError\") {\n return false;\n }\n const message = error.message.toLowerCase();\n return message.includes(\"responses websocket\");\n}\n\nfunction removeReasoningSummary(request: ChatGptCodexRequest): ChatGptCodexRequest {\n const reasoning = request.reasoning;\n if (!reasoning?.summary) {\n return request;\n }\n return {\n ...request,\n reasoning: {\n effort: reasoning.effort,\n },\n };\n}\n\nfunction buildUserAgent(): string {\n const node = process.version;\n const platform = os.platform();\n const release = os.release();\n return `@ljoukov/llm (node ${node}; ${platform} ${release})`;\n}\n\nasync function* parseEventStream(\n stream: ReadableStream<Uint8Array>,\n): AsyncIterable<ChatGptCodexStreamEvent> {\n const reader = stream.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n buffer += decoder.decode(value, { stream: true });\n let sepIndex = buffer.indexOf(\"\\n\\n\");\n while (sepIndex !== -1) {\n const raw = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const event = parseEventBlock(raw);\n if (event) {\n yield event;\n }\n sepIndex = buffer.indexOf(\"\\n\\n\");\n }\n }\n if (buffer.trim().length > 0) {\n const event = parseEventBlock(buffer);\n if (event) {\n yield event;\n }\n }\n}\n\nfunction parseEventBlock(raw: string): ChatGptCodexStreamEvent | null {\n const lines = raw\n .split(/\\r?\\n/u)\n .map((line) => line.trimEnd())\n .filter(Boolean);\n const dataLines = lines\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(\"data:\".length).trimStart());\n if (dataLines.length === 0) {\n return null;\n }\n const payload = dataLines.join(\"\\n\");\n if (payload === \"[DONE]\") {\n return null;\n }\n try {\n return JSON.parse(payload) as ChatGptCodexStreamEvent;\n } catch {\n return null;\n }\n}\n","import { Buffer } from \"node:buffer\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\n// Optional: fetch access tokens from a centralized token provider over HTTPS (for example a Cloudflare Worker).\nconst CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_URL\";\nconst CHATGPT_AUTH_TOKEN_PROVIDER_STORE_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_STORE\";\n\n// Used both for local storage and as the shared secret for `CHATGPT_AUTH_TOKEN_PROVIDER_URL`.\nconst CHATGPT_AUTH_API_KEY_ENV = \"CHATGPT_AUTH_API_KEY\";\nconst CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY_ENV = \"CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY\";\n\nconst CHATGPT_OAUTH_CLIENT_ID = \"app_EMoamEEZ73f0CkXaXp7hrann\";\nconst CHATGPT_OAUTH_TOKEN_URL = \"https://auth.openai.com/oauth/token\";\nconst CHATGPT_OAUTH_REDIRECT_URI = \"http://localhost:1455/auth/callback\";\n\nconst TOKEN_EXPIRY_BUFFER_MS = 30_000;\n\nexport type ChatGptAuthProfile = {\n readonly access: string;\n readonly refresh: string;\n readonly expires: number;\n readonly accountId: string;\n readonly idToken?: string;\n};\n\nconst CodexAuthFileSchema = z\n .object({\n OPENAI_API_KEY: z.string().nullable().optional(),\n last_refresh: z.string().optional(),\n tokens: z\n .object({\n access_token: z.string().min(1).optional(),\n refresh_token: z.string().min(1).optional(),\n id_token: z.string().min(1).optional(),\n account_id: z.string().min(1).optional(),\n // Allow a bit of flexibility if the file format changes.\n accessToken: z.string().min(1).optional(),\n refreshToken: z.string().min(1).optional(),\n idToken: z.string().min(1).optional(),\n accountId: z.string().min(1).optional(),\n })\n .optional(),\n })\n .loose();\n\nconst RefreshResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n});\n\nconst ExchangeResponseSchema = z.object({\n access_token: z.string().min(1),\n refresh_token: z.string().min(1),\n expires_in: z.union([z.number(), z.string()]),\n id_token: z.string().optional(),\n});\n\nlet cachedProfile: ChatGptAuthProfile | null = null;\nlet refreshPromise: Promise<ChatGptAuthProfile> | null = null;\n\nasync function fetchChatGptAuthProfileFromTokenProvider(options: {\n baseUrl: string;\n apiKey: string;\n store?: string;\n}): Promise<ChatGptAuthProfile> {\n const base = options.baseUrl.replace(/\\/+$/u, \"\");\n const store = options.store?.trim() ? options.store.trim() : \"kv\";\n const url = new URL(`${base}/v1/token`);\n url.searchParams.set(\"store\", store);\n\n const response = await fetch(url.toString(), {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${options.apiKey}`,\n \"x-chatgpt-auth\": options.apiKey,\n Accept: \"application/json\",\n },\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT token provider request failed (${response.status}): ${body}`);\n }\n\n const payload = (await response.json()) as unknown;\n if (!payload || typeof payload !== \"object\") {\n throw new Error(\"ChatGPT token provider returned invalid JSON.\");\n }\n const accessToken =\n (payload as { accessToken?: unknown; access_token?: unknown }).accessToken ??\n (payload as { accessToken?: unknown; access_token?: unknown }).access_token;\n const accountId =\n (payload as { accountId?: unknown; account_id?: unknown }).accountId ??\n (payload as { accountId?: unknown; account_id?: unknown }).account_id;\n const expiresAt =\n (payload as { expiresAt?: unknown; expires_at?: unknown }).expiresAt ??\n (payload as { expiresAt?: unknown; expires_at?: unknown }).expires_at;\n\n if (typeof accessToken !== \"string\" || accessToken.trim().length === 0) {\n throw new Error(\"ChatGPT token provider response missing accessToken.\");\n }\n if (typeof accountId !== \"string\" || accountId.trim().length === 0) {\n throw new Error(\"ChatGPT token provider response missing accountId.\");\n }\n const expires = normalizeEpochMillis(expiresAt) ?? Date.now() + 5 * 60_000;\n\n // In token-provider mode we do not refresh locally (the provider owns token rotation).\n return {\n access: accessToken,\n refresh: \"token_provider\",\n expires,\n accountId,\n };\n}\n\nexport function encodeChatGptAuthJson(profile: ChatGptAuthProfile): string {\n const payload = {\n access: profile.access,\n refresh: profile.refresh,\n expires: profile.expires,\n accountId: profile.accountId,\n ...(profile.idToken ? { id_token: profile.idToken } : {}),\n };\n return JSON.stringify(payload);\n}\n\nexport function encodeChatGptAuthJsonB64(profile: ChatGptAuthProfile): string {\n return Buffer.from(encodeChatGptAuthJson(profile)).toString(\"base64url\");\n}\n\nexport async function exchangeChatGptOauthCode({\n code,\n verifier,\n redirectUri = CHATGPT_OAUTH_REDIRECT_URI,\n}: {\n code: string;\n verifier: string;\n redirectUri?: string;\n}): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"authorization_code\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"code\", code);\n params.set(\"code_verifier\", verifier);\n params.set(\"redirect_uri\", redirectUri);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth token exchange failed (${response.status}): ${body}`);\n }\n const payload = ExchangeResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload);\n}\n\nexport async function refreshChatGptOauthToken(\n refreshToken: string,\n fallback?: { accountId?: string; idToken?: string },\n): Promise<ChatGptAuthProfile> {\n const params = new URLSearchParams();\n params.set(\"grant_type\", \"refresh_token\");\n params.set(\"client_id\", CHATGPT_OAUTH_CLIENT_ID);\n params.set(\"refresh_token\", refreshToken);\n const response = await fetch(CHATGPT_OAUTH_TOKEN_URL, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/x-www-form-urlencoded\",\n },\n body: params.toString(),\n });\n if (!response.ok) {\n const body = await response.text();\n throw new Error(`ChatGPT OAuth refresh failed (${response.status}): ${body}`);\n }\n const payload = RefreshResponseSchema.parse(await response.json());\n return profileFromTokenResponse(payload, fallback);\n}\n\nexport async function getChatGptAuthProfile(): Promise<ChatGptAuthProfile> {\n loadLocalEnv();\n\n const tokenProviderUrl = process.env[CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV];\n const tokenProviderKey =\n process.env[CHATGPT_AUTH_TOKEN_PROVIDER_API_KEY_ENV] ?? process.env[CHATGPT_AUTH_API_KEY_ENV];\n if (\n tokenProviderUrl &&\n tokenProviderUrl.trim().length > 0 &&\n tokenProviderKey &&\n tokenProviderKey.trim().length > 0\n ) {\n if (cachedProfile && !isExpired(cachedProfile)) {\n return cachedProfile;\n }\n if (refreshPromise) {\n return refreshPromise;\n }\n refreshPromise = (async () => {\n try {\n const store = process.env[CHATGPT_AUTH_TOKEN_PROVIDER_STORE_ENV];\n const profile = await fetchChatGptAuthProfileFromTokenProvider({\n baseUrl: tokenProviderUrl,\n apiKey: tokenProviderKey,\n store: store ?? undefined,\n });\n cachedProfile = profile;\n return profile;\n } finally {\n refreshPromise = null;\n }\n })();\n return refreshPromise;\n }\n\n if (cachedProfile && !isExpired(cachedProfile)) {\n return cachedProfile;\n }\n if (refreshPromise) {\n return refreshPromise;\n }\n refreshPromise = (async () => {\n try {\n const baseProfile = cachedProfile ?? loadAuthProfileFromCodexStore();\n const profile = isExpired(baseProfile)\n ? await refreshAndPersistCodexProfile(baseProfile)\n : baseProfile;\n cachedProfile = profile;\n return profile;\n } finally {\n refreshPromise = null;\n }\n })();\n return refreshPromise;\n}\n\nfunction resolveCodexHome(): string {\n const codexHome = process.env.CODEX_HOME;\n if (codexHome && codexHome.trim().length > 0) {\n return codexHome.trim();\n }\n return path.join(os.homedir(), \".codex\");\n}\n\nfunction resolveCodexAuthJsonPath(): string {\n return path.join(resolveCodexHome(), \"auth.json\");\n}\n\nfunction loadAuthProfileFromCodexStore(): ChatGptAuthProfile {\n const authPath = resolveCodexAuthJsonPath();\n let raw: string;\n try {\n raw = fs.readFileSync(authPath, \"utf8\");\n } catch {\n throw new Error(\n `ChatGPT auth not configured. Set ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}+${CHATGPT_AUTH_API_KEY_ENV} or login via Codex to create ${authPath}.`,\n );\n }\n\n let parsed: z.infer<typeof CodexAuthFileSchema>;\n try {\n parsed = CodexAuthFileSchema.parse(JSON.parse(raw));\n } catch (e) {\n throw new Error(\n `Failed to parse Codex auth store at ${authPath}. (${(e as Error)?.message ?? e})`,\n );\n }\n\n const tokens = parsed.tokens;\n if (!tokens) {\n throw new Error(\n `Codex auth store at ${authPath} is missing tokens. Re-login via Codex, or configure ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}.`,\n );\n }\n\n const access = tokens.access_token ?? tokens.accessToken ?? undefined;\n const refresh = tokens.refresh_token ?? tokens.refreshToken ?? undefined;\n const idToken = tokens.id_token ?? tokens.idToken ?? undefined;\n if (!access || !refresh) {\n throw new Error(\n `Codex auth store at ${authPath} is missing access_token/refresh_token. Re-login via Codex, or configure ${CHATGPT_AUTH_TOKEN_PROVIDER_URL_ENV}.`,\n );\n }\n\n const expires =\n extractJwtExpiry(access) ?? extractJwtExpiry(idToken ?? \"\") ?? Date.now() + 5 * 60_000;\n const accountId =\n tokens.account_id ??\n tokens.accountId ??\n extractChatGptAccountId(idToken ?? \"\") ??\n extractChatGptAccountId(access);\n if (!accountId) {\n throw new Error(`Codex auth store at ${authPath} is missing chatgpt_account_id/account_id.`);\n }\n\n return {\n access,\n refresh,\n expires,\n accountId,\n idToken: idToken ?? undefined,\n };\n}\n\nasync function refreshAndPersistCodexProfile(\n baseProfile: ChatGptAuthProfile,\n): Promise<ChatGptAuthProfile> {\n const refreshed = await refreshChatGptOauthToken(baseProfile.refresh, {\n accountId: baseProfile.accountId,\n idToken: baseProfile.idToken,\n });\n\n persistCodexTokens(refreshed);\n return refreshed;\n}\n\nfunction persistCodexTokens(profile: ChatGptAuthProfile): void {\n const authPath = resolveCodexAuthJsonPath();\n const codexHome = path.dirname(authPath);\n\n let doc: any = {};\n try {\n doc = JSON.parse(fs.readFileSync(authPath, \"utf8\"));\n } catch {\n doc = {};\n }\n if (!doc || typeof doc !== \"object\") {\n doc = {};\n }\n if (!doc.tokens || typeof doc.tokens !== \"object\") {\n doc.tokens = {};\n }\n\n doc.tokens.access_token = profile.access;\n doc.tokens.refresh_token = profile.refresh;\n doc.tokens.account_id = profile.accountId;\n if (profile.idToken) {\n doc.tokens.id_token = profile.idToken;\n }\n doc.last_refresh = new Date().toISOString();\n\n fs.mkdirSync(codexHome, { recursive: true, mode: 0o700 });\n const tmpPath = `${authPath}.tmp.${process.pid}.${Math.random().toString(16).slice(2)}`;\n fs.writeFileSync(tmpPath, `${JSON.stringify(doc, null, 2)}\\n`, { mode: 0o600 });\n fs.renameSync(tmpPath, authPath);\n}\n\nfunction profileFromTokenResponse(\n payload: {\n access_token: string;\n refresh_token: string;\n expires_in: number | string;\n id_token?: string;\n },\n fallback?: { accountId?: string; idToken?: string },\n): ChatGptAuthProfile {\n const expires = Date.now() + normalizeNumber(payload.expires_in) * 1000;\n const fallbackAccountId = fallback?.accountId;\n const fallbackIdToken = fallback?.idToken;\n const accountId =\n extractChatGptAccountId(payload.id_token ?? \"\") ??\n extractChatGptAccountId(payload.access_token) ??\n fallbackAccountId;\n if (!accountId) {\n throw new Error(\"Failed to extract chatgpt_account_id from access token.\");\n }\n return {\n access: payload.access_token,\n refresh: payload.refresh_token,\n expires,\n accountId,\n idToken: payload.id_token ?? fallbackIdToken,\n };\n}\n\nfunction normalizeEpochMillis(value: unknown): number | undefined {\n const numeric = normalizeNumber(value);\n if (!Number.isFinite(numeric)) {\n return undefined;\n }\n return numeric < 1_000_000_000_000 ? numeric * 1000 : numeric;\n}\n\nfunction normalizeNumber(value: unknown): number {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (Number.isFinite(parsed)) {\n return parsed;\n }\n }\n return Number.NaN;\n}\n\nfunction isExpired(profile: ChatGptAuthProfile): boolean {\n const expires = profile.expires;\n if (!Number.isFinite(expires)) {\n return true;\n }\n return Date.now() + TOKEN_EXPIRY_BUFFER_MS >= expires;\n}\n\nfunction decodeJwtPayload(token: string): unknown {\n const segments = token.split(\".\");\n if (segments.length < 2) {\n return null;\n }\n const payloadB64 = segments[1] ?? \"\";\n try {\n const decoded = Buffer.from(payloadB64, \"base64url\").toString(\"utf8\");\n return JSON.parse(decoded);\n } catch {\n return null;\n }\n}\n\nfunction extractJwtExpiry(token: string): number | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const exp = (payload as { exp?: unknown }).exp;\n const parsed = normalizeNumber(exp);\n if (!Number.isFinite(parsed) || parsed <= 0) {\n return undefined;\n }\n return parsed < 1_000_000_000_000 ? parsed * 1000 : parsed;\n}\n\nfunction extractChatGptAccountId(token: string): string | undefined {\n const payload = decodeJwtPayload(token);\n if (!payload || typeof payload !== \"object\") {\n return undefined;\n }\n const direct = (payload as { chatgpt_account_id?: unknown }).chatgpt_account_id;\n if (typeof direct === \"string\" && direct.length > 0) {\n return direct;\n }\n\n // Codex/ChatGPT tokens often nest it under this namespaced claim.\n const namespaced = (\n payload as { \"https://api.openai.com/auth\"?: { chatgpt_account_id?: unknown } }\n )[\"https://api.openai.com/auth\"]?.chatgpt_account_id;\n return typeof namespaced === \"string\" && namespaced.length > 0 ? namespaced : undefined;\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\n\nlet envLoaded = false;\n\n/**\n * Loads `.env.local` from `process.cwd()` once.\n *\n * - Does not override already-set `process.env` values.\n * - Missing file is silently ignored.\n */\nexport function loadLocalEnv(): void {\n if (envLoaded) {\n return;\n }\n const envPath = path.join(process.cwd(), \".env.local\");\n loadEnvFromFile(envPath, { override: false });\n envLoaded = true;\n}\n\nexport function loadEnvFromFile(\n filePath: string,\n { override = false }: { override?: boolean } = {},\n): void {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException)?.code === \"ENOENT\") {\n return;\n }\n throw error;\n }\n\n for (const line of content.split(/\\r?\\n/u)) {\n const entry = parseEnvLine(line);\n if (!entry) {\n continue;\n }\n const [key, value] = entry;\n if (override || process.env[key] === undefined) {\n process.env[key] = value;\n }\n }\n}\n\nfunction parseEnvLine(line: string): [string, string] | null {\n const trimmed = line.trim();\n if (!trimmed || trimmed.startsWith(\"#\")) {\n return null;\n }\n\n const match = trimmed.match(/^(?:export\\s+)?([A-Za-z_][A-Za-z0-9_\\-.]*)\\s*=\\s*(.*)$/u);\n if (!match) {\n return null;\n }\n\n const key = match[1];\n if (!key) {\n return null;\n }\n let value = match[2] ?? \"\";\n\n if (value.startsWith('\"') && value.endsWith('\"') && value.length >= 2) {\n value = value.slice(1, -1);\n } else if (value.startsWith(\"'\") && value.endsWith(\"'\") && value.length >= 2) {\n value = value.slice(1, -1);\n } else {\n const commentIndex = value.indexOf(\" #\");\n if (commentIndex >= 0) {\n value = value.slice(0, commentIndex);\n }\n value = value.trim();\n }\n\n return [key, value];\n}\n","import WebSocket, { type RawData } from \"ws\";\n\nimport { createAsyncQueue } from \"../utils/asyncQueue.js\";\n\nexport const OPENAI_BETA_RESPONSES_WEBSOCKETS_V1 = \"responses_websockets=2026-02-04\";\nexport const OPENAI_BETA_RESPONSES_WEBSOCKETS_V2 = \"responses_websockets=2026-02-06\";\n\nexport type ResponsesWebSocketMode = \"auto\" | \"off\" | \"only\";\n\nexport type ResponsesStreamEvent = {\n type?: string;\n [key: string]: unknown;\n};\n\nexport type ResponsesStreamWithFinal<\n TEvent = ResponsesStreamEvent,\n TFinal = unknown,\n> = AsyncIterable<TEvent> & {\n finalResponse: () => Promise<TFinal>;\n close: () => void;\n};\n\nexport class ResponsesWebSocketHttpError extends Error {\n readonly status: number;\n readonly body?: string;\n readonly headers?: Record<string, string>;\n\n constructor(options: {\n status: number;\n message: string;\n body?: string;\n headers?: Record<string, string>;\n }) {\n super(options.message);\n this.name = \"ResponsesWebSocketHttpError\";\n this.status = options.status;\n this.body = options.body;\n this.headers = options.headers;\n }\n}\n\nconst UNSUPPORTED_WEBSOCKET_STATUS_CODES = new Set([400, 404, 405, 406, 426, 501]);\nconst WEBSOCKET_CONNECT_TIMEOUT_MS = 30_000;\n\nfunction parseUnexpectedServerResponseStatus(message: string): number | null {\n const match = /unexpected server response:\\s*(\\d+)/i.exec(message);\n if (!match) {\n return null;\n }\n const status = Number(match[1]);\n if (!Number.isFinite(status) || status <= 0) {\n return null;\n }\n return status;\n}\n\nfunction supportsUnexpectedResponseEvent(): boolean {\n return !(\"bun\" in process.versions);\n}\n\nexport function resolveResponsesWebSocketMode(\n raw: string | undefined,\n fallback: ResponsesWebSocketMode = \"auto\",\n): ResponsesWebSocketMode {\n const value = raw?.trim().toLowerCase();\n if (value === \"auto\" || value === \"off\" || value === \"only\") {\n return value;\n }\n return fallback;\n}\n\nexport function mergeOpenAiBetaHeader(existing: string | undefined, required: string): string {\n const parts = new Set<string>();\n for (const part of (existing ?? \"\").split(\",\")) {\n const trimmed = part.trim();\n if (trimmed.length > 0) {\n parts.add(trimmed);\n }\n }\n const normalizedRequired = required.trim();\n if (normalizedRequired.length > 0) {\n parts.add(normalizedRequired);\n }\n return Array.from(parts).join(\", \");\n}\n\nexport function toWebSocketUrl(httpOrHttpsUrl: string): string {\n const parsed = new URL(httpOrHttpsUrl);\n if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n } else if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(`Unsupported websocket URL protocol: ${parsed.protocol}`);\n }\n return parsed.toString();\n}\n\nexport function isResponsesWebSocketUnsupportedError(error: unknown): boolean {\n if (error instanceof ResponsesWebSocketHttpError) {\n return UNSUPPORTED_WEBSOCKET_STATUS_CODES.has(error.status);\n }\n const message = error instanceof Error ? error.message.toLowerCase() : \"\";\n const status = parseUnexpectedServerResponseStatus(message);\n if (status !== null) {\n return UNSUPPORTED_WEBSOCKET_STATUS_CODES.has(status);\n }\n return message.includes(\"unexpected server response: 426\");\n}\n\nexport function createAdaptiveResponsesStream<\n TEvent = ResponsesStreamEvent,\n TFinal = unknown,\n>(options: {\n mode: ResponsesWebSocketMode;\n createWebSocketStream: () => Promise<ResponsesStreamWithFinal<TEvent, TFinal>>;\n createFallbackStream: () => ResponsesStreamWithFinal<TEvent, TFinal>;\n onWebSocketFallback?: (error: unknown) => void;\n}): ResponsesStreamWithFinal<TEvent, TFinal> {\n let resolved: Promise<ResponsesStreamWithFinal<TEvent, TFinal>> | null = null;\n let websocketSelected = false;\n let fallbackSelected = false;\n\n const activateFallback = (error: unknown): ResponsesStreamWithFinal<TEvent, TFinal> => {\n options.onWebSocketFallback?.(error);\n fallbackSelected = true;\n websocketSelected = false;\n const fallback = options.createFallbackStream();\n resolved = Promise.resolve(fallback);\n return fallback;\n };\n\n const getStream = async (): Promise<ResponsesStreamWithFinal<TEvent, TFinal>> => {\n if (resolved) {\n return await resolved;\n }\n resolved = (async () => {\n if (options.mode === \"off\") {\n fallbackSelected = true;\n return options.createFallbackStream();\n }\n try {\n const stream = await options.createWebSocketStream();\n websocketSelected = true;\n return stream;\n } catch (error) {\n if (options.mode === \"only\") {\n throw error;\n }\n return activateFallback(error);\n }\n })();\n return await resolved;\n };\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<TEvent> {\n const stream = await getStream();\n let yielded = 0;\n try {\n for await (const event of stream) {\n yielded += 1;\n yield event;\n }\n } catch (error) {\n if (options.mode !== \"only\" && websocketSelected && !fallbackSelected && yielded === 0) {\n const fallback = activateFallback(error);\n for await (const event of fallback) {\n yield event;\n }\n return;\n }\n throw error;\n }\n },\n async finalResponse(): Promise<TFinal> {\n const stream = await getStream();\n try {\n return await stream.finalResponse();\n } catch (error) {\n if (options.mode === \"only\" || !websocketSelected || fallbackSelected) {\n throw error;\n }\n const fallback = activateFallback(error);\n return await fallback.finalResponse();\n }\n },\n close(): void {\n void getStream()\n .then((stream) => stream.close())\n .catch(() => {});\n },\n };\n}\n\ntype ConnectWebSocketResult = {\n socket: WebSocket;\n responseHeaders: Record<string, string>;\n};\n\ntype CreateResponsesWebSocketStreamOptions = {\n url: string;\n headers: Record<string, string>;\n request: unknown;\n signal?: AbortSignal;\n idleTimeoutMs?: number;\n completionEventTypes?: string[];\n};\n\nexport async function createResponsesWebSocketStream(\n options: CreateResponsesWebSocketStreamOptions,\n): Promise<ResponsesStreamWithFinal<ResponsesStreamEvent, Record<string, unknown>>> {\n const completionTypes = new Set(\n options.completionEventTypes ?? [\"response.completed\", \"response.failed\", \"response.done\"],\n );\n const { socket, responseHeaders } = await connectWebSocket({\n url: options.url,\n headers: options.headers,\n signal: options.signal,\n });\n const queue = createAsyncQueue<ResponsesStreamEvent>();\n\n let settled = false;\n let finalResponse: Record<string, unknown> | null = null;\n let latestResponse: Record<string, unknown> | null = null;\n let idleTimer: NodeJS.Timeout | null = null;\n let resolveFinal: ((response: Record<string, unknown>) => void) | null = null;\n let rejectFinal: ((error: Error) => void) | null = null;\n\n const finalPromise = new Promise<Record<string, unknown>>((resolve, reject) => {\n resolveFinal = resolve;\n rejectFinal = reject;\n });\n void finalPromise.catch(() => {});\n\n const clearIdleTimer = () => {\n if (idleTimer) {\n clearTimeout(idleTimer);\n idleTimer = null;\n }\n };\n\n const closeSocket = () => {\n try {\n if (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) {\n socket.close();\n }\n } catch {\n // Ignore close failures.\n }\n };\n\n const complete = (response: Record<string, unknown>) => {\n if (settled) {\n return;\n }\n settled = true;\n clearIdleTimer();\n finalResponse = response;\n resolveFinal?.(response);\n queue.close();\n closeSocket();\n };\n\n const fail = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n clearIdleTimer();\n rejectFinal?.(error);\n queue.fail(error);\n closeSocket();\n };\n\n const restartIdleTimer = () => {\n clearIdleTimer();\n const idleTimeoutMs = options.idleTimeoutMs;\n if (!idleTimeoutMs || idleTimeoutMs <= 0 || settled) {\n return;\n }\n idleTimer = setTimeout(() => {\n fail(new Error(`Responses WebSocket idle timeout after ${idleTimeoutMs}ms.`));\n }, idleTimeoutMs);\n };\n\n const onAbort = () => {\n const error = createAbortError(options.signal?.reason);\n fail(error);\n };\n\n if (options.signal) {\n if (options.signal.aborted) {\n socket.close();\n throw createAbortError(options.signal.reason);\n }\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n const cleanup = () => {\n clearIdleTimer();\n socket.removeAllListeners();\n if (options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n socket.on(\"message\", (raw: RawData) => {\n restartIdleTimer();\n const parsed = parseWebSocketPayload(raw);\n if (!parsed) {\n return;\n }\n const error = mapWebSocketErrorEvent(parsed);\n if (error) {\n fail(error);\n return;\n }\n\n const event = parsed as ResponsesStreamEvent;\n if (isObjectWithResponse(event)) {\n latestResponse = event.response;\n }\n\n queue.push(event);\n\n const type = typeof event.type === \"string\" ? event.type : \"\";\n if (completionTypes.has(type)) {\n const completedResponse = normalizeFinalResponse(\n type,\n event.response,\n latestResponse,\n responseHeaders,\n );\n complete(completedResponse);\n }\n });\n\n socket.on(\"error\", (error: Error) => {\n fail(new Error(`Responses WebSocket error: ${error.message}`));\n });\n\n socket.on(\"close\", (_code: number, _reason: Buffer) => {\n if (settled) {\n cleanup();\n return;\n }\n fail(new Error(\"Responses WebSocket closed before completion.\"));\n cleanup();\n });\n\n restartIdleTimer();\n\n const payload = serializeRequestPayload(options.request);\n await new Promise<void>((resolve, reject) => {\n socket.send(payload, (error?: Error) => {\n if (error) {\n reject(error);\n } else {\n resolve();\n }\n });\n }).catch((error: unknown) => {\n fail(new Error(`Failed to send Responses WebSocket request: ${errorToMessage(error)}`));\n throw error instanceof Error ? error : new Error(errorToMessage(error));\n });\n\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<ResponsesStreamEvent> {\n try {\n for await (const event of queue.iterable) {\n yield event;\n }\n } finally {\n if (!settled) {\n closeSocket();\n }\n }\n },\n async finalResponse(): Promise<Record<string, unknown>> {\n return await finalPromise;\n },\n close(): void {\n if (settled) {\n return;\n }\n const response = finalResponse ?? latestResponse ?? { status: \"cancelled\" };\n complete(response);\n cleanup();\n },\n };\n}\n\nasync function connectWebSocket(options: {\n url: string;\n headers: Record<string, string>;\n signal?: AbortSignal;\n}): Promise<ConnectWebSocketResult> {\n return await new Promise<ConnectWebSocketResult>((resolve, reject) => {\n const shouldListenForUnexpectedResponse = supportsUnexpectedResponseEvent();\n const socket = new WebSocket(options.url, {\n headers: options.headers,\n handshakeTimeout: WEBSOCKET_CONNECT_TIMEOUT_MS,\n });\n\n let settled = false;\n let responseBody = \"\";\n let connectTimeout: NodeJS.Timeout | null = setTimeout(() => {\n rejectOnce(\n new Error(\n `Responses WebSocket connection timed out after ${WEBSOCKET_CONNECT_TIMEOUT_MS}ms.`,\n ),\n );\n }, WEBSOCKET_CONNECT_TIMEOUT_MS);\n\n const rejectOnce = (error: Error) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup();\n try {\n socket.terminate();\n } catch {\n // Ignore terminate failures.\n }\n reject(error);\n };\n\n const resolveOnce = (result: ConnectWebSocketResult) => {\n if (settled) {\n return;\n }\n settled = true;\n cleanup(false);\n resolve(result);\n };\n\n const onAbort = () => {\n rejectOnce(createAbortError(options.signal?.reason));\n };\n\n const cleanup = (removeAbortListener = true) => {\n if (connectTimeout) {\n clearTimeout(connectTimeout);\n connectTimeout = null;\n }\n socket.removeListener(\"open\", onOpen);\n socket.removeListener(\"error\", onError);\n if (shouldListenForUnexpectedResponse) {\n socket.removeListener(\"unexpected-response\", onUnexpectedResponse);\n }\n if (removeAbortListener && options.signal) {\n options.signal.removeEventListener(\"abort\", onAbort);\n }\n };\n\n const onOpen = () => {\n const headers = normalizeUpgradeHeaders(socket);\n resolveOnce({ socket, responseHeaders: headers });\n };\n\n const onError = (error: Error) => {\n rejectOnce(new Error(`Responses WebSocket connection failed: ${error.message}`));\n };\n\n const onUnexpectedResponse = (\n _request: unknown,\n response: NodeJS.ReadableStream & {\n statusCode?: number;\n headers?: Record<string, string | string[] | undefined>;\n setEncoding?: (encoding: BufferEncoding) => void;\n },\n ) => {\n if (typeof response.setEncoding === \"function\") {\n response.setEncoding(\"utf8\");\n }\n response.on(\"data\", (chunk) => {\n responseBody += typeof chunk === \"string\" ? chunk : chunk.toString(\"utf8\");\n });\n response.on(\"end\", () => {\n const status = Number(response.statusCode ?? 0);\n const headers: Record<string, string> = {};\n const rawHeaders = response.headers ?? {};\n for (const [key, value] of Object.entries(rawHeaders)) {\n if (typeof value === \"string\") {\n headers[key] = value;\n } else if (Array.isArray(value)) {\n headers[key] = value.join(\", \");\n }\n }\n rejectOnce(\n new ResponsesWebSocketHttpError({\n status: Number.isFinite(status) && status > 0 ? status : 500,\n message: `Responses WebSocket upgrade failed${status ? ` (${status})` : \"\"}.`,\n body: responseBody || undefined,\n headers,\n }),\n );\n });\n response.on(\"error\", (error: Error) => {\n rejectOnce(\n new ResponsesWebSocketHttpError({\n status: Number(response.statusCode ?? 500),\n message: `Responses WebSocket upgrade failed: ${error.message}`,\n body: responseBody || undefined,\n }),\n );\n });\n };\n\n socket.once(\"open\", onOpen);\n socket.once(\"error\", onError);\n if (shouldListenForUnexpectedResponse) {\n socket.once(\"unexpected-response\", onUnexpectedResponse);\n }\n if (options.signal) {\n if (options.signal.aborted) {\n onAbort();\n return;\n }\n options.signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n });\n}\n\nfunction normalizeUpgradeHeaders(socket: WebSocket): Record<string, string> {\n const maybeUpgradeResponse = (\n socket as WebSocket & {\n _socket?: unknown;\n _req?: { res?: { headers?: Record<string, string | string[] | undefined> } };\n }\n )._req?.res;\n const raw = maybeUpgradeResponse?.headers ?? {};\n const normalized: Record<string, string> = {};\n for (const [key, value] of Object.entries(raw)) {\n if (typeof value === \"string\") {\n normalized[key.toLowerCase()] = value;\n } else if (Array.isArray(value)) {\n normalized[key.toLowerCase()] = value.join(\", \");\n }\n }\n return normalized;\n}\n\nfunction parseWebSocketPayload(raw: RawData): Record<string, unknown> | null {\n const text = toUtf8(raw);\n if (!text) {\n return null;\n }\n try {\n const parsed = JSON.parse(text);\n if (parsed && typeof parsed === \"object\") {\n return parsed as Record<string, unknown>;\n }\n } catch {\n return null;\n }\n return null;\n}\n\nfunction toUtf8(raw: RawData): string {\n if (typeof raw === \"string\") {\n return raw;\n }\n if (raw instanceof ArrayBuffer) {\n return Buffer.from(raw).toString(\"utf8\");\n }\n if (Array.isArray(raw)) {\n const chunks = raw.map((chunk) => {\n if (typeof chunk === \"string\") {\n return Buffer.from(chunk, \"utf8\");\n }\n return Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);\n });\n return Buffer.concat(chunks).toString(\"utf8\");\n }\n return Buffer.isBuffer(raw) ? raw.toString(\"utf8\") : Buffer.from(raw).toString(\"utf8\");\n}\n\nfunction mapWebSocketErrorEvent(payload: Record<string, unknown>): Error | null {\n if (payload.type !== \"error\") {\n return null;\n }\n\n const status = resolveNumericStatus(payload.status) ?? resolveNumericStatus(payload.status_code);\n if (!status || status < 400) {\n const message = errorToMessage(payload.error) || \"Responses WebSocket returned an error event.\";\n return new Error(message);\n }\n\n const headers = mapErrorHeaders(payload.headers);\n const body =\n payload.error && typeof payload.error === \"object\"\n ? JSON.stringify({ error: payload.error }, null, 2)\n : undefined;\n\n return new ResponsesWebSocketHttpError({\n status,\n message: `Responses WebSocket returned status ${status}.`,\n body,\n headers,\n });\n}\n\nfunction mapErrorHeaders(value: unknown): Record<string, string> | undefined {\n if (!value || typeof value !== \"object\") {\n return undefined;\n }\n const headers: Record<string, string> = {};\n for (const [key, entry] of Object.entries(value as Record<string, unknown>)) {\n if (typeof entry === \"string\" || typeof entry === \"number\" || typeof entry === \"boolean\") {\n headers[key.toLowerCase()] = String(entry);\n }\n }\n return Object.keys(headers).length > 0 ? headers : undefined;\n}\n\nfunction resolveNumericStatus(value: unknown): number | null {\n if (typeof value === \"number\" && Number.isFinite(value)) {\n return Math.floor(value);\n }\n if (typeof value === \"string\" && value.trim().length > 0) {\n const parsed = Number(value);\n if (Number.isFinite(parsed)) {\n return Math.floor(parsed);\n }\n }\n return null;\n}\n\nfunction normalizeFinalResponse(\n eventType: string,\n eventResponse: unknown,\n latestResponse: Record<string, unknown> | null,\n responseHeaders: Record<string, string>,\n): Record<string, unknown> {\n const response =\n eventResponse && typeof eventResponse === \"object\"\n ? ({ ...(eventResponse as Record<string, unknown>) } as Record<string, unknown>)\n : latestResponse\n ? { ...latestResponse }\n : {};\n\n if (typeof response.status !== \"string\") {\n if (eventType === \"response.failed\") {\n response.status = \"failed\";\n } else if (eventType === \"response.done\") {\n response.status = \"completed\";\n } else if (eventType === \"response.completed\") {\n response.status = \"completed\";\n }\n }\n\n const upgradeModel = responseHeaders[\"openai-model\"];\n if (typeof response.model !== \"string\" && upgradeModel) {\n response.model = upgradeModel;\n }\n\n return response;\n}\n\nfunction serializeRequestPayload(request: unknown): string {\n if (!request || typeof request !== \"object\" || Array.isArray(request)) {\n throw new Error(\"Responses WebSocket request must be a JSON object.\");\n }\n const body = request as Record<string, unknown>;\n const payload = typeof body.type === \"string\" ? body : { type: \"response.create\", ...body };\n return JSON.stringify(payload);\n}\n\nfunction isObjectWithResponse(event: ResponsesStreamEvent): event is ResponsesStreamEvent & {\n response: Record<string, unknown>;\n} {\n return Boolean(event.response && typeof event.response === \"object\");\n}\n\nfunction errorToMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n try {\n return JSON.stringify(error);\n } catch {\n return String(error);\n }\n}\n\nfunction createAbortError(reason: unknown): Error {\n const error = new Error(\n reason instanceof Error\n ? reason.message\n : typeof reason === \"string\"\n ? reason\n : \"Request aborted.\",\n );\n error.name = \"AbortError\";\n return error;\n}\n","export type CallSchedulerRetryPolicy = {\n readonly maxAttempts: number;\n /**\n * Return `null` to stop retrying and surface the original error.\n * `attempt` is 1-based and indicates the attempt that just failed.\n */\n readonly getDelayMs: (attempt: number, error: unknown) => number | null;\n};\n\nexport type CallSchedulerOptions = {\n readonly maxParallelRequests?: number;\n readonly minIntervalBetweenStartMs?: number;\n readonly startJitterMs?: number;\n readonly retry?: CallSchedulerRetryPolicy;\n};\n\nexport type CallScheduler = {\n run: <T>(fn: () => Promise<T>) => Promise<T>;\n};\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n setTimeout(resolve, ms);\n });\n}\n\nfunction toError(value: unknown): Error {\n if (value instanceof Error) {\n return value;\n }\n if (typeof value === \"string\") {\n return new Error(value);\n }\n return new Error(\"Unknown error\");\n}\n\nexport function createCallScheduler(options: CallSchedulerOptions = {}): CallScheduler {\n const maxParallelRequests = Math.max(1, Math.floor(options.maxParallelRequests ?? 3));\n const minIntervalBetweenStartMs = Math.max(0, Math.floor(options.minIntervalBetweenStartMs ?? 0));\n const startJitterMs = Math.max(0, Math.floor(options.startJitterMs ?? 0));\n const retryPolicy = options.retry;\n\n let activeCount = 0;\n let lastStartTime = 0;\n\n // Serializes start-spacing to avoid concurrent jobs racing on lastStartTime.\n let startSpacingChain: Promise<void> = Promise.resolve();\n\n type QueueJob = () => Promise<void>;\n const queue: QueueJob[] = [];\n\n async function applyStartSpacing(): Promise<void> {\n const previous = startSpacingChain;\n let release: (() => void) | undefined;\n startSpacingChain = new Promise<void>((resolve) => {\n release = resolve;\n });\n await previous;\n try {\n if (lastStartTime > 0 && minIntervalBetweenStartMs > 0) {\n const earliestNext = lastStartTime + minIntervalBetweenStartMs;\n const wait = Math.max(0, earliestNext - Date.now());\n if (wait > 0) {\n await sleep(wait);\n }\n }\n if (startJitterMs > 0) {\n await sleep(Math.floor(Math.random() * (startJitterMs + 1)));\n }\n lastStartTime = Date.now();\n } finally {\n release?.();\n }\n }\n\n async function attemptWithRetries<T>(fn: () => Promise<T>, attempt: number): Promise<T> {\n try {\n await applyStartSpacing();\n return await fn();\n } catch (error: unknown) {\n const err = toError(error);\n if (!retryPolicy || attempt >= retryPolicy.maxAttempts) {\n throw err;\n }\n let delay = retryPolicy.getDelayMs(attempt, error);\n if (delay === null) {\n throw err;\n }\n if (!Number.isFinite(delay)) {\n delay = 0;\n }\n const normalizedDelay = Math.max(0, delay);\n if (normalizedDelay > 0) {\n await sleep(normalizedDelay);\n }\n return attemptWithRetries(fn, attempt + 1);\n }\n }\n\n function drainQueue(): void {\n while (activeCount < maxParallelRequests && queue.length > 0) {\n const task = queue.shift();\n if (!task) {\n continue;\n }\n activeCount += 1;\n void task();\n }\n }\n\n function run<T>(fn: () => Promise<T>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const job: QueueJob = async () => {\n try {\n const result = await attemptWithRetries(fn, 1);\n resolve(result);\n } catch (error: unknown) {\n reject(toError(error));\n } finally {\n activeCount -= 1;\n queueMicrotask(drainQueue);\n }\n };\n queue.push(job);\n drainQueue();\n });\n }\n\n return { run };\n}\n","import OpenAI from \"openai\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nconst DEFAULT_FIREWORKS_BASE_URL = \"https://api.fireworks.ai/inference/v1\";\nconst DEFAULT_FIREWORKS_TIMEOUT_MS = 15 * 60_000;\n\nlet cachedClient: OpenAI | null = null;\nlet cachedFetch: typeof fetch | null = null;\nlet cachedBaseUrl: string | null = null;\nlet cachedApiKey: string | null = null;\nlet cachedTimeoutMs: number | null = null;\n\nfunction resolveTimeoutMs(): number {\n if (cachedTimeoutMs !== null) {\n return cachedTimeoutMs;\n }\n\n const raw = process.env.FIREWORKS_TIMEOUT_MS;\n const parsed = raw ? Number(raw) : Number.NaN;\n cachedTimeoutMs = Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_FIREWORKS_TIMEOUT_MS;\n return cachedTimeoutMs;\n}\n\nfunction resolveBaseUrl(): string {\n if (cachedBaseUrl !== null) {\n return cachedBaseUrl;\n }\n\n loadLocalEnv();\n const raw = process.env.FIREWORKS_BASE_URL?.trim();\n cachedBaseUrl = raw && raw.length > 0 ? raw : DEFAULT_FIREWORKS_BASE_URL;\n return cachedBaseUrl;\n}\n\nfunction resolveApiKey(): string {\n if (cachedApiKey !== null) {\n return cachedApiKey;\n }\n\n loadLocalEnv();\n const raw = process.env.FIREWORKS_TOKEN ?? process.env.FIREWORKS_API_KEY;\n const token = raw?.trim();\n if (!token) {\n throw new Error(\n \"FIREWORKS_TOKEN (or FIREWORKS_API_KEY) must be provided to access Fireworks APIs.\",\n );\n }\n\n cachedApiKey = token;\n return cachedApiKey;\n}\n\nfunction getFireworksFetch(): typeof fetch {\n if (cachedFetch) {\n return cachedFetch;\n }\n\n const timeoutMs = resolveTimeoutMs();\n const dispatcher = new Agent({\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n });\n cachedFetch = ((input: any, init?: any) => {\n return undiciFetch(input, {\n ...(init ?? {}),\n dispatcher,\n });\n }) as typeof fetch;\n\n return cachedFetch;\n}\n\nexport function getFireworksClient(): OpenAI {\n if (cachedClient) {\n return cachedClient;\n }\n\n cachedClient = new OpenAI({\n apiKey: resolveApiKey(),\n baseURL: resolveBaseUrl(),\n timeout: resolveTimeoutMs(),\n fetch: getFireworksFetch(),\n });\n return cachedClient;\n}\n","import type OpenAI from \"openai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getFireworksClient } from \"./client.js\";\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n});\n\nexport async function runFireworksCall<T>(fn: (client: OpenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(getFireworksClient()));\n}\n","export const FIREWORKS_MODEL_IDS = [\"kimi-k2.5\", \"glm-5\", \"minimax-m2.1\", \"gpt-oss-120b\"] as const;\n\nexport type FireworksModelId = (typeof FIREWORKS_MODEL_IDS)[number];\n\nexport const FIREWORKS_DEFAULT_KIMI_MODEL: FireworksModelId = \"kimi-k2.5\";\nexport const FIREWORKS_DEFAULT_GLM_MODEL: FireworksModelId = \"glm-5\";\nexport const FIREWORKS_DEFAULT_MINIMAX_MODEL: FireworksModelId = \"minimax-m2.1\";\nexport const FIREWORKS_DEFAULT_GPT_OSS_120B_MODEL: FireworksModelId = \"gpt-oss-120b\";\n\nconst FIREWORKS_CANONICAL_MODEL_IDS: Record<FireworksModelId, string> = {\n \"kimi-k2.5\": \"accounts/fireworks/models/kimi-k2p5\",\n \"glm-5\": \"accounts/fireworks/models/glm-5\",\n \"minimax-m2.1\": \"accounts/fireworks/models/minimax-m2p1\",\n \"gpt-oss-120b\": \"accounts/fireworks/models/gpt-oss-120b\",\n};\n\nexport function isFireworksModelId(value: string): value is FireworksModelId {\n return (FIREWORKS_MODEL_IDS as readonly string[]).includes(value.trim());\n}\n\nexport function resolveFireworksModelId(model: string): string | undefined {\n const trimmed = model.trim();\n if (!isFireworksModelId(trimmed)) {\n return undefined;\n }\n return FIREWORKS_CANONICAL_MODEL_IDS[trimmed];\n}\n","import { GoogleGenAI, type GoogleGenAIOptions } from \"@google/genai\";\n\nimport { getGoogleAuthOptions, getGoogleServiceAccount } from \"./auth.js\";\n\nexport const GEMINI_TEXT_MODEL_IDS = [\n \"gemini-3-pro-preview\",\n \"gemini-3.1-pro-preview\",\n \"gemini-3-flash-preview\",\n \"gemini-2.5-pro\",\n \"gemini-flash-latest\",\n \"gemini-flash-lite-latest\",\n] as const;\n\nexport const GEMINI_IMAGE_MODEL_IDS = [\"gemini-3-pro-image-preview\"] as const;\n\nexport const GEMINI_MODEL_IDS = [...GEMINI_TEXT_MODEL_IDS, ...GEMINI_IMAGE_MODEL_IDS] as const;\n\nexport type GeminiModelId = (typeof GEMINI_MODEL_IDS)[number];\nexport type GeminiTextModelId = (typeof GEMINI_TEXT_MODEL_IDS)[number];\nexport type GeminiImageModelId = (typeof GEMINI_IMAGE_MODEL_IDS)[number];\n\nexport function isGeminiModelId(value: string): value is GeminiModelId {\n return (GEMINI_MODEL_IDS as readonly string[]).includes(value);\n}\n\nexport function isGeminiTextModelId(value: string): value is GeminiTextModelId {\n return (GEMINI_TEXT_MODEL_IDS as readonly string[]).includes(value);\n}\n\nexport function isGeminiImageModelId(value: string): value is GeminiImageModelId {\n return (GEMINI_IMAGE_MODEL_IDS as readonly string[]).includes(value);\n}\n\nconst CLOUD_PLATFORM_SCOPE = \"https://www.googleapis.com/auth/cloud-platform\";\nconst DEFAULT_VERTEX_LOCATION = \"global\";\n\nexport type GeminiConfiguration = {\n readonly projectId?: string;\n readonly location?: string;\n};\n\nlet geminiConfiguration: GeminiConfiguration = {};\nlet clientPromise: Promise<GoogleGenAI> | undefined;\n\nfunction normaliseConfigValue(value?: string | null): string | undefined {\n if (value === undefined || value === null) {\n return undefined;\n }\n const trimmed = value.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n}\n\nexport function configureGemini(options: GeminiConfiguration = {}): void {\n const nextProjectId = normaliseConfigValue(options.projectId);\n const nextLocation = normaliseConfigValue(options.location);\n geminiConfiguration = {\n projectId: nextProjectId !== undefined ? nextProjectId : geminiConfiguration.projectId,\n location: nextLocation !== undefined ? nextLocation : geminiConfiguration.location,\n };\n clientPromise = undefined;\n}\n\nfunction resolveProjectId(): string {\n const override = geminiConfiguration.projectId;\n if (override) {\n return override;\n }\n const serviceAccount = getGoogleServiceAccount();\n return serviceAccount.projectId;\n}\n\nfunction resolveLocation(): string {\n const override = geminiConfiguration.location;\n if (override) {\n return override;\n }\n return DEFAULT_VERTEX_LOCATION;\n}\n\nexport async function getGeminiClient(): Promise<GoogleGenAI> {\n if (!clientPromise) {\n clientPromise = Promise.resolve().then(() => {\n const projectId = resolveProjectId();\n const location = resolveLocation();\n const googleAuthOptions = getGoogleAuthOptions(CLOUD_PLATFORM_SCOPE);\n return new GoogleGenAI({\n vertexai: true,\n project: projectId,\n location,\n googleAuthOptions: googleAuthOptions as GoogleGenAIOptions[\"googleAuthOptions\"],\n });\n });\n }\n return clientPromise;\n}\n","import { GoogleAuth, type AnyAuthClient, type GoogleAuthOptions } from \"google-auth-library\";\nimport { z } from \"zod\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nexport type GoogleServiceAccount = {\n projectId: string;\n clientEmail: string;\n privateKey: string;\n tokenUri?: string;\n};\n\nconst ServiceAccountSchema = z\n .object({\n project_id: z.string().min(1),\n client_email: z.email(),\n private_key: z.string().min(1),\n token_uri: z.string().optional(),\n })\n .transform(({ project_id, client_email, private_key, token_uri }) => ({\n projectId: project_id,\n clientEmail: client_email,\n privateKey: private_key.replace(/\\\\n/g, \"\\n\"),\n tokenUri: token_uri,\n }));\n\nlet cachedServiceAccount: GoogleServiceAccount | null = null;\nconst authClientCache = new Map<string, GoogleAuth<AnyAuthClient>>();\n\nexport function parseGoogleServiceAccount(input: string): GoogleServiceAccount {\n let parsed: unknown;\n try {\n parsed = JSON.parse(input);\n } catch (error) {\n throw new Error(`Invalid Google service account JSON: ${(error as Error).message}`);\n }\n return ServiceAccountSchema.parse(parsed);\n}\n\nexport function getGoogleServiceAccount(): GoogleServiceAccount {\n if (cachedServiceAccount) {\n return cachedServiceAccount;\n }\n\n loadLocalEnv();\n\n const raw = process.env.GOOGLE_SERVICE_ACCOUNT_JSON;\n if (!raw || raw.trim().length === 0) {\n throw new Error(\"GOOGLE_SERVICE_ACCOUNT_JSON must be provided for Google APIs access.\");\n }\n\n cachedServiceAccount = parseGoogleServiceAccount(raw);\n return cachedServiceAccount;\n}\n\nfunction normaliseScopes(scopes?: string | readonly string[]): string[] | undefined {\n if (!scopes) {\n return undefined;\n }\n if (typeof scopes === \"string\") {\n return [scopes];\n }\n if (scopes.length === 0) {\n return undefined;\n }\n return Array.from(new Set(scopes)).sort();\n}\n\nexport function getGoogleAuthOptions(\n scopes?: string | readonly string[],\n): GoogleAuthOptions<AnyAuthClient> {\n const serviceAccount = getGoogleServiceAccount();\n const normalisedScopes = normaliseScopes(scopes);\n const options: GoogleAuthOptions<AnyAuthClient> = {\n credentials: {\n client_email: serviceAccount.clientEmail,\n private_key: serviceAccount.privateKey,\n },\n projectId: serviceAccount.projectId,\n scopes: normalisedScopes,\n };\n return options;\n}\n\nexport function getGoogleAuth(scopes?: string | readonly string[]): GoogleAuth<AnyAuthClient> {\n const normalised = normaliseScopes(scopes);\n const key = (normalised ?? []).join(\" \");\n const cached = authClientCache.get(key);\n if (cached) {\n return cached;\n }\n const auth = new GoogleAuth(getGoogleAuthOptions(normalised));\n authClientCache.set(key, auth);\n return auth;\n}\n\nexport async function getGoogleAccessToken(scopes?: string | readonly string[]): Promise<string> {\n const auth = getGoogleAuth(scopes);\n const token = await auth.getAccessToken();\n if (!token) {\n throw new Error(\"GoogleAuth returned an empty access token.\");\n }\n return token;\n}\n","import type { GoogleGenAI } from \"@google/genai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getGeminiClient } from \"./client.js\";\n\nconst RETRYABLE_STATUSES = new Set([408, 425, 429, 500, 502, 503, 504]);\nconst RETRYABLE_ERROR_CODES = new Set([\"ECONNRESET\", \"ETIMEDOUT\", \"EAI_AGAIN\"]);\nconst RATE_LIMIT_REASONS = new Set([\"RATE_LIMIT_EXCEEDED\", \"RESOURCE_EXHAUSTED\", \"QUOTA_EXCEEDED\"]);\n\nfunction getStatus(error: unknown): number | undefined {\n const maybe = error as {\n status?: unknown;\n statusCode?: unknown;\n code?: unknown;\n response?: { status?: unknown };\n };\n const candidates = [maybe?.status, maybe?.statusCode, maybe?.response?.status];\n for (const value of candidates) {\n if (typeof value === \"number\") {\n return value;\n }\n if (typeof value === \"string\") {\n const parsed = Number(value);\n if (!Number.isNaN(parsed)) {\n return parsed;\n }\n }\n }\n if (typeof maybe?.code === \"number\") {\n return maybe.code;\n }\n return undefined;\n}\n\nfunction getErrorCode(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const maybe = error as { code?: unknown; cause?: unknown };\n if (typeof maybe.code === \"string\") {\n return maybe.code;\n }\n if (maybe.cause && typeof maybe.cause === \"object\") {\n const causeCode = (maybe.cause as { code?: unknown }).code;\n if (typeof causeCode === \"string\") {\n return causeCode;\n }\n }\n return undefined;\n}\n\nfunction getErrorReason(error: unknown): string | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n const details = (error as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(details) && details.length > 0) {\n const reason = (details[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nestedDetails = (cause as { errorDetails?: unknown }).errorDetails;\n if (Array.isArray(nestedDetails) && nestedDetails.length > 0) {\n const reason = (nestedDetails[0] as { reason?: unknown }).reason;\n if (typeof reason === \"string\") {\n return reason;\n }\n }\n }\n return undefined;\n}\n\nfunction getErrorMessage(error: unknown): string {\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === \"string\") {\n return error;\n }\n return \"\";\n}\n\nfunction parseRetryInfo(details: unknown): number | undefined {\n if (Array.isArray(details)) {\n for (const entry of details) {\n const ms = parseRetryInfo(entry);\n if (ms !== undefined) {\n return ms;\n }\n }\n return undefined;\n }\n if (!details || typeof details !== \"object\") {\n return undefined;\n }\n const retryDelay = (details as { retryDelay?: unknown }).retryDelay as\n | { seconds?: unknown; nanos?: unknown }\n | undefined;\n if (retryDelay) {\n const secondsRaw = retryDelay.seconds;\n const nanosRaw = retryDelay.nanos;\n const seconds =\n typeof secondsRaw === \"number\"\n ? secondsRaw\n : typeof secondsRaw === \"string\"\n ? Number.parseFloat(secondsRaw)\n : 0;\n const nanos =\n typeof nanosRaw === \"number\"\n ? nanosRaw\n : typeof nanosRaw === \"string\"\n ? Number.parseInt(nanosRaw, 10)\n : 0;\n if (Number.isFinite(seconds) || Number.isFinite(nanos)) {\n const totalMs = seconds * 1000 + nanos / 1_000_000;\n if (totalMs > 0) {\n return totalMs;\n }\n }\n }\n const nestedDetails = (details as { details?: unknown }).details;\n if (nestedDetails) {\n const nested = parseRetryInfo(nestedDetails);\n if (nested !== undefined) {\n return nested;\n }\n }\n return undefined;\n}\n\nfunction parseRetryAfterFromMessage(message: string): number | undefined {\n const trimmed = message.trim();\n if (!trimmed) {\n return undefined;\n }\n const regex = /retry in\\\\s+([0-9]+(?:\\\\.[0-9]+)?)\\\\s*(s|sec|secs|seconds?)/iu;\n const match = regex.exec(trimmed);\n if (match?.[1]) {\n const value = Number.parseFloat(match[1]);\n if (Number.isFinite(value) && value > 0) {\n return value * 1000;\n }\n }\n return undefined;\n}\n\nfunction getRetryAfterMs(error: unknown): number | undefined {\n if (!error || typeof error !== \"object\") {\n return undefined;\n }\n\n const infoFromDetails = parseRetryInfo((error as { errorDetails?: unknown }).errorDetails);\n if (infoFromDetails !== undefined) {\n return infoFromDetails;\n }\n\n const cause = (error as { cause?: unknown }).cause;\n if (cause && typeof cause === \"object\") {\n const nested = getRetryAfterMs(cause);\n if (nested !== undefined) {\n return nested;\n }\n }\n\n const message = getErrorMessage(error);\n if (message) {\n const fromMessage = parseRetryAfterFromMessage(message.toLowerCase());\n if (fromMessage !== undefined) {\n return fromMessage;\n }\n }\n\n return undefined;\n}\n\nfunction shouldRetry(error: unknown): boolean {\n const status = getStatus(error);\n if (status && RETRYABLE_STATUSES.has(status)) {\n return true;\n }\n\n const reason = getErrorReason(error);\n if (reason && RATE_LIMIT_REASONS.has(reason)) {\n return true;\n }\n\n const code = getErrorCode(error);\n if (code && RETRYABLE_ERROR_CODES.has(code)) {\n return true;\n }\n\n const message = getErrorMessage(error).toLowerCase();\n if (message.includes(\"rate limit\") || message.includes(\"temporarily unavailable\")) {\n return true;\n }\n if (message.includes(\"fetch failed\") || message.includes(\"socket hang up\")) {\n return true;\n }\n if (message.includes(\"quota\") || message.includes(\"insufficient\")) {\n return false;\n }\n if (message.includes(\"timeout\") || message.includes(\"network\")) {\n return true;\n }\n return false;\n}\n\nfunction retryDelayMs(attempt: number): number {\n const baseRetryDelayMs = 500;\n const maxRetryDelayMs = 4000;\n const base = Math.min(maxRetryDelayMs, baseRetryDelayMs * 2 ** (attempt - 1));\n const jitter = Math.floor(Math.random() * 200);\n return base + jitter;\n}\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n retry: {\n maxAttempts: 3,\n getDelayMs: (attempt, error) => {\n if (!shouldRetry(error)) {\n return null;\n }\n const hintedDelay = getRetryAfterMs(error);\n return hintedDelay ?? retryDelayMs(attempt);\n },\n },\n});\n\nexport async function runGeminiCall<T>(fn: (client: GoogleGenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(await getGeminiClient()));\n}\n","import OpenAI from \"openai\";\nimport { Agent, fetch as undiciFetch } from \"undici\";\n\nimport { loadLocalEnv } from \"../utils/env.js\";\n\nimport {\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n createAdaptiveResponsesStream,\n createResponsesWebSocketStream,\n isResponsesWebSocketUnsupportedError,\n mergeOpenAiBetaHeader,\n resolveResponsesWebSocketMode,\n toWebSocketUrl,\n type ResponsesStreamWithFinal,\n} from \"./responses-websocket.js\";\n\nlet cachedApiKey: string | null = null;\nlet cachedClient: OpenAI | null = null;\nlet cachedFetch: typeof fetch | null = null;\nlet cachedTimeoutMs: number | null = null;\nlet openAiResponsesWebSocketMode: \"auto\" | \"off\" | \"only\" | null = null;\nlet openAiResponsesWebSocketDisabled = false;\n\nconst DEFAULT_OPENAI_TIMEOUT_MS = 15 * 60_000;\n\nfunction resolveOpenAiTimeoutMs(): number {\n if (cachedTimeoutMs !== null) {\n return cachedTimeoutMs;\n }\n\n const raw = process.env.OPENAI_STREAM_TIMEOUT_MS ?? process.env.OPENAI_TIMEOUT_MS;\n const parsed = raw ? Number(raw) : Number.NaN;\n cachedTimeoutMs = Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_OPENAI_TIMEOUT_MS;\n return cachedTimeoutMs;\n}\n\nfunction getOpenAiFetch(): typeof fetch {\n if (cachedFetch) {\n return cachedFetch;\n }\n\n const timeoutMs = resolveOpenAiTimeoutMs();\n const dispatcher = new Agent({\n bodyTimeout: timeoutMs,\n headersTimeout: timeoutMs,\n });\n cachedFetch = ((input: any, init?: any) => {\n return undiciFetch(input, {\n ...(init ?? {}),\n dispatcher,\n });\n }) as typeof fetch;\n\n return cachedFetch;\n}\n\nfunction resolveOpenAiBaseUrl(): string {\n loadLocalEnv();\n return process.env.OPENAI_BASE_URL?.trim() || \"https://api.openai.com/v1\";\n}\n\nfunction resolveOpenAiResponsesWebSocketMode(): \"auto\" | \"off\" | \"only\" {\n if (openAiResponsesWebSocketMode) {\n return openAiResponsesWebSocketMode;\n }\n loadLocalEnv();\n openAiResponsesWebSocketMode = resolveResponsesWebSocketMode(\n process.env.OPENAI_RESPONSES_WEBSOCKET_MODE,\n \"auto\",\n );\n return openAiResponsesWebSocketMode;\n}\n\nfunction wrapFallbackStream<TEvent = unknown, TFinal = unknown>(\n stream: AsyncIterable<TEvent> & { finalResponse: () => Promise<TFinal> },\n): ResponsesStreamWithFinal<TEvent, TFinal> {\n return {\n async *[Symbol.asyncIterator](): AsyncIterator<TEvent> {\n for await (const event of stream) {\n yield event;\n }\n },\n async finalResponse(): Promise<TFinal> {\n return await stream.finalResponse();\n },\n close(): void {\n const maybeClose = stream as { close?: () => void };\n if (typeof maybeClose.close === \"function\") {\n maybeClose.close();\n }\n },\n };\n}\n\nfunction buildOpenAiResponsesEndpointUrl(): string {\n const base = resolveOpenAiBaseUrl();\n const normalized = base.endsWith(\"/\") ? base : `${base}/`;\n return new URL(\"responses\", normalized).toString();\n}\n\nfunction buildOpenAiResponsesWebSocketHeaders(apiKey: string): Record<string, string> {\n const headers: Record<string, string> = {\n Authorization: `Bearer ${apiKey}`,\n \"OpenAI-Beta\": mergeOpenAiBetaHeader(\n process.env.OPENAI_BETA,\n OPENAI_BETA_RESPONSES_WEBSOCKETS_V2,\n ),\n };\n const organization = process.env.OPENAI_ORGANIZATION?.trim();\n if (organization) {\n headers[\"OpenAI-Organization\"] = organization;\n }\n const project = process.env.OPENAI_PROJECT?.trim();\n if (project) {\n headers[\"OpenAI-Project\"] = project;\n }\n return headers;\n}\n\nfunction installResponsesWebSocketTransport(client: OpenAI, apiKey: string): void {\n const responsesApi = client.responses as {\n stream?: (\n request: unknown,\n options?: unknown,\n ) => AsyncIterable<unknown> & {\n finalResponse: () => Promise<unknown>;\n };\n };\n const streamMethod = responsesApi?.stream;\n if (typeof streamMethod !== \"function\") {\n return;\n }\n\n const originalStream = streamMethod.bind(client.responses);\n responsesApi.stream = (request: unknown, options?: unknown) => {\n const mode = resolveOpenAiResponsesWebSocketMode();\n const fallbackStreamFactory = (): ResponsesStreamWithFinal =>\n wrapFallbackStream(originalStream(request, options) as any);\n\n if (mode === \"off\" || openAiResponsesWebSocketDisabled) {\n return fallbackStreamFactory() as any;\n }\n\n const signal =\n options && typeof options === \"object\"\n ? ((options as { signal?: AbortSignal }).signal ?? undefined)\n : undefined;\n const websocketUrl = toWebSocketUrl(buildOpenAiResponsesEndpointUrl());\n const headers = buildOpenAiResponsesWebSocketHeaders(apiKey);\n const timeoutMs = resolveOpenAiTimeoutMs();\n\n return createAdaptiveResponsesStream({\n mode,\n createWebSocketStream: async () =>\n await createResponsesWebSocketStream({\n url: websocketUrl,\n headers,\n request,\n signal,\n idleTimeoutMs: timeoutMs,\n }),\n createFallbackStream: fallbackStreamFactory,\n onWebSocketFallback: (error) => {\n if (isResponsesWebSocketUnsupportedError(error)) {\n openAiResponsesWebSocketDisabled = true;\n }\n },\n }) as any;\n };\n}\n\nfunction getOpenAiApiKey(): string {\n if (cachedApiKey !== null) {\n return cachedApiKey;\n }\n\n loadLocalEnv();\n\n const raw = process.env.OPENAI_API_KEY;\n const value = raw?.trim();\n if (!value) {\n throw new Error(\"OPENAI_API_KEY must be provided to access OpenAI APIs.\");\n }\n\n cachedApiKey = value;\n return cachedApiKey;\n}\n\nexport function getOpenAiClient(): OpenAI {\n if (cachedClient) {\n return cachedClient;\n }\n\n loadLocalEnv();\n const apiKey = getOpenAiApiKey();\n const timeoutMs = resolveOpenAiTimeoutMs();\n cachedClient = new OpenAI({\n apiKey,\n fetch: getOpenAiFetch(),\n timeout: timeoutMs,\n });\n installResponsesWebSocketTransport(cachedClient, apiKey);\n return cachedClient;\n}\n","import type OpenAI from \"openai\";\n\nimport { createCallScheduler } from \"../utils/scheduler.js\";\n\nimport { getOpenAiClient } from \"./client.js\";\n\nexport type OpenAiReasoningEffort = \"low\" | \"medium\" | \"high\" | \"xhigh\";\nexport const DEFAULT_OPENAI_REASONING_EFFORT: OpenAiReasoningEffort = \"medium\";\n\nconst scheduler = createCallScheduler({\n maxParallelRequests: 3,\n minIntervalBetweenStartMs: 200,\n startJitterMs: 200,\n});\n\nexport async function runOpenAiCall<T>(fn: (client: OpenAI) => Promise<T>): Promise<T> {\n return scheduler.run(async () => fn(getOpenAiClient()));\n}\n","export const OPENAI_MODEL_IDS = [\n \"gpt-5.3-codex\",\n \"gpt-5.3-codex-spark\",\n \"gpt-5.2\",\n \"gpt-5.1-codex-mini\",\n] as const;\n\nexport type OpenAiModelId = (typeof OPENAI_MODEL_IDS)[number];\n\nexport function isOpenAiModelId(value: string): value is OpenAiModelId {\n return (OPENAI_MODEL_IDS as readonly string[]).includes(value);\n}\n\nexport const CHATGPT_MODEL_IDS = [\n \"chatgpt-gpt-5.3-codex\",\n \"chatgpt-gpt-5.3-codex-spark\",\n \"chatgpt-gpt-5.2\",\n \"chatgpt-gpt-5.1-codex-mini\",\n] as const;\n\nexport type ChatGptModelId = (typeof CHATGPT_MODEL_IDS)[number];\n\nexport function isChatGptModelId(value: string): value is ChatGptModelId {\n return (CHATGPT_MODEL_IDS as readonly string[]).includes(value);\n}\n\nexport function stripChatGptPrefix(model: ChatGptModelId): OpenAiModelId {\n return model.slice(\"chatgpt-\".length) as OpenAiModelId;\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport {\n customTool,\n type LlmCustomTool,\n type LlmFunctionTool,\n type LlmToolSet,\n tool,\n} from \"../llm.js\";\nimport {\n applyPatch,\n CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION,\n CODEX_APPLY_PATCH_LARK_GRAMMAR,\n CODEX_APPLY_PATCH_INPUT_DESCRIPTION,\n} from \"./applyPatch.js\";\nimport {\n createNodeAgentFilesystem,\n type AgentDirectoryEntry,\n type AgentFilesystem,\n} from \"./filesystem.js\";\n\nconst DEFAULT_READ_FILE_LINE_LIMIT = 2000;\nconst DEFAULT_READ_FILES_LINE_LIMIT = 200;\nconst DEFAULT_READ_FILES_CHAR_LIMIT = 4000;\nconst DEFAULT_LIST_DIR_LIMIT = 25;\nconst DEFAULT_LIST_DIR_DEPTH = 2;\nconst DEFAULT_GREP_LIMIT = 100;\nconst MAX_GREP_LIMIT = 2000;\nconst DEFAULT_MAX_LINE_LENGTH = 500;\nconst DEFAULT_GREP_MAX_SCANNED_FILES = 20_000;\nconst DEFAULT_TAB_WIDTH = 4;\n\ntype CodexReadMode = \"slice\" | \"indentation\";\n\ntype ReadLineRecord = {\n readonly number: number;\n readonly raw: string;\n readonly display: string;\n readonly indent: number;\n};\n\ntype ListEntryRecord = {\n readonly name: string;\n readonly displayName: string;\n readonly depth: number;\n readonly kind: AgentDirectoryEntry[\"kind\"];\n};\n\ntype GrepMatchRecord = {\n readonly filePath: string;\n readonly mtimeMs: number;\n readonly lineNumber?: number;\n readonly line?: string;\n};\n\nexport type AgentFilesystemToolProfile = \"auto\" | \"model-agnostic\" | \"codex\" | \"gemini\";\n\nexport type AgentFilesystemToolName =\n | \"apply_patch\"\n | \"read_file\"\n | \"read_files\"\n | \"write_file\"\n | \"replace\"\n | \"list_dir\"\n | \"list_directory\"\n | \"grep_files\"\n | \"rg_search\"\n | \"grep_search\"\n | \"glob\";\n\nexport type AgentFilesystemToolAction = \"read\" | \"write\" | \"delete\" | \"move\" | \"list\" | \"search\";\n\nexport type AgentFilesystemToolAccessContext = {\n readonly cwd: string;\n readonly tool: AgentFilesystemToolName;\n readonly action: AgentFilesystemToolAction;\n readonly path: string;\n readonly fromPath?: string;\n readonly toPath?: string;\n readonly pattern?: string;\n readonly include?: string;\n};\n\nexport type AgentFilesystemToolAccessHook = (\n context: AgentFilesystemToolAccessContext,\n) => Promise<void> | void;\n\nexport type AgentFilesystemToolsOptions = {\n readonly cwd?: string;\n readonly fs?: AgentFilesystem;\n readonly allowOutsideCwd?: boolean;\n readonly checkAccess?: AgentFilesystemToolAccessHook;\n readonly maxLineLength?: number;\n readonly grepMaxScannedFiles?: number;\n readonly applyPatch?: {\n readonly maxPatchBytes?: number;\n };\n};\n\nconst codexReadFileInputSchema = z.object({\n file_path: z.string().min(1).describe(\"Absolute path to the file\"),\n offset: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The line number to start reading from. Must be 1 or greater.\"),\n limit: z.number().int().min(1).optional().describe(\"The maximum number of lines to return.\"),\n mode: z\n .enum([\"slice\", \"indentation\"])\n .optional()\n .describe('Optional mode selector: \"slice\" (default) or \"indentation\".'),\n indentation: z\n .object({\n anchor_line: z.number().int().min(1).optional(),\n max_levels: z.number().int().min(0).optional(),\n include_siblings: z.boolean().optional(),\n include_header: z.boolean().optional(),\n max_lines: z.number().int().min(1).optional(),\n })\n .optional(),\n});\n\nconst codexListDirInputSchema = z.object({\n dir_path: z.string().min(1).describe(\"Absolute path to the directory to list.\"),\n offset: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The entry number to start listing from. Must be 1 or greater.\"),\n limit: z.number().int().min(1).optional().describe(\"The maximum number of entries to return.\"),\n depth: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"The maximum directory depth to traverse. Must be 1 or greater.\"),\n});\n\nconst codexGrepFilesInputSchema = z.object({\n pattern: z.string().min(1).describe(\"Regular expression pattern to search for.\"),\n include: z\n .string()\n .optional()\n .describe('Optional glob limiting searched files (for example \"*.rs\").'),\n path: z.string().optional().describe(\"Directory or file path to search. Defaults to cwd.\"),\n limit: z\n .number()\n .int()\n .min(1)\n .optional()\n .describe(\"Maximum number of file paths to return (defaults to 100).\"),\n});\n\nconst applyPatchInputSchema = z.object({\n input: z.string().min(1).describe(CODEX_APPLY_PATCH_INPUT_DESCRIPTION),\n});\n\nconst geminiReadFileInputSchema = z.object({\n file_path: z.string().min(1),\n offset: z.number().int().min(0).nullish(),\n limit: z.number().int().min(1).nullish(),\n});\n\nconst geminiReadFilesInputSchema = z\n .object({\n paths: z.array(z.string().min(1)).min(1),\n line_offset: z.number().int().min(0).nullish(),\n line_limit: z.number().int().min(1).nullish(),\n char_offset: z.number().int().min(0).nullish(),\n char_limit: z.number().int().min(1).nullish(),\n include_line_numbers: z.boolean().nullish(),\n })\n .superRefine((value, context) => {\n const hasLineWindow = value.line_offset !== undefined || value.line_limit !== undefined;\n const hasCharWindow = value.char_offset !== undefined || value.char_limit !== undefined;\n if (hasLineWindow && hasCharWindow) {\n context.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Use either line_* or char_* window arguments, not both.\",\n });\n }\n });\n\nconst geminiWriteFileInputSchema = z.object({\n file_path: z.string().min(1),\n content: z.string(),\n});\n\nconst geminiReplaceInputSchema = z.object({\n file_path: z.string().min(1),\n instruction: z.string().min(1),\n old_string: z.string(),\n new_string: z.string(),\n expected_replacements: z.number().int().min(1).nullish(),\n});\n\nconst geminiListDirectoryInputSchema = z.object({\n dir_path: z.string().min(1),\n ignore: z.array(z.string()).nullish(),\n file_filtering_options: z\n .object({\n respect_git_ignore: z.boolean().nullish(),\n respect_gemini_ignore: z.boolean().nullish(),\n })\n .nullish(),\n});\n\nconst geminiRgSearchInputSchema = z.object({\n pattern: z.string().min(1),\n path: z.string().nullish(),\n glob: z.string().nullish(),\n case_sensitive: z.boolean().nullish(),\n exclude_pattern: z.string().nullish(),\n names_only: z.boolean().nullish(),\n max_matches_per_file: z.number().int().min(1).nullish(),\n max_results: z.number().int().min(1).nullish(),\n});\n\nconst geminiGrepSearchInputSchema = z.object({\n pattern: z.string().min(1),\n dir_path: z.string().nullish(),\n include: z.string().nullish(),\n exclude_pattern: z.string().nullish(),\n names_only: z.boolean().nullish(),\n max_matches_per_file: z.number().int().min(1).nullish(),\n total_max_matches: z.number().int().min(1).nullish(),\n});\n\nconst geminiGlobInputSchema = z.object({\n pattern: z.string().min(1),\n dir_path: z.string().nullish(),\n case_sensitive: z.boolean().nullish(),\n respect_git_ignore: z.boolean().nullish(),\n respect_gemini_ignore: z.boolean().nullish(),\n});\n\nexport type CodexReadFileToolInput = z.output<typeof codexReadFileInputSchema>;\nexport type CodexListDirToolInput = z.output<typeof codexListDirInputSchema>;\nexport type CodexGrepFilesToolInput = z.output<typeof codexGrepFilesInputSchema>;\nexport type CodexApplyPatchToolInput = z.output<typeof applyPatchInputSchema>;\nexport type GeminiReadFileToolInput = z.output<typeof geminiReadFileInputSchema>;\nexport type GeminiReadFilesToolInput = z.output<typeof geminiReadFilesInputSchema>;\nexport type GeminiWriteFileToolInput = z.output<typeof geminiWriteFileInputSchema>;\nexport type GeminiReplaceToolInput = z.output<typeof geminiReplaceInputSchema>;\nexport type GeminiListDirectoryToolInput = z.output<typeof geminiListDirectoryInputSchema>;\nexport type GeminiGrepSearchToolInput = z.output<typeof geminiGrepSearchInputSchema>;\nexport type GeminiRgSearchToolInput = z.output<typeof geminiRgSearchInputSchema>;\nexport type GeminiGlobToolInput = z.output<typeof geminiGlobInputSchema>;\n\nexport function resolveFilesystemToolProfile(\n model: string,\n profile: AgentFilesystemToolProfile = \"auto\",\n): Exclude<AgentFilesystemToolProfile, \"auto\"> {\n if (profile !== \"auto\") {\n return profile;\n }\n if (isCodexModel(model)) {\n return \"codex\";\n }\n if (isGeminiModel(model)) {\n return \"gemini\";\n }\n return \"model-agnostic\";\n}\n\nexport function createFilesystemToolSetForModel(\n model: string,\n profileOrOptions: AgentFilesystemToolProfile | AgentFilesystemToolsOptions = \"auto\",\n maybeOptions?: AgentFilesystemToolsOptions,\n): LlmToolSet {\n if (typeof profileOrOptions === \"string\") {\n const resolvedProfile = resolveFilesystemToolProfile(model, profileOrOptions);\n if (resolvedProfile === \"codex\") {\n return createCodexFilesystemToolSet(maybeOptions);\n }\n if (resolvedProfile === \"gemini\") {\n return createGeminiFilesystemToolSet(maybeOptions);\n }\n return createModelAgnosticFilesystemToolSet(maybeOptions);\n }\n\n const resolvedProfile = resolveFilesystemToolProfile(model, \"auto\");\n if (resolvedProfile === \"codex\") {\n return createCodexFilesystemToolSet(profileOrOptions);\n }\n if (resolvedProfile === \"gemini\") {\n return createGeminiFilesystemToolSet(profileOrOptions);\n }\n return createModelAgnosticFilesystemToolSet(profileOrOptions);\n}\n\nexport function createCodexFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return {\n apply_patch: createCodexApplyPatchTool(options),\n read_file: createCodexReadFileTool(options),\n list_dir: createListDirTool(options),\n grep_files: createGrepFilesTool(options),\n };\n}\n\nexport function createGeminiFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return {\n read_file: createGeminiReadFileTool(options),\n write_file: createWriteFileTool(options),\n replace: createReplaceTool(options),\n list_directory: createListDirectoryTool(options),\n grep_search: createGrepSearchTool(options),\n glob: createGlobTool(options),\n };\n}\n\nexport function createModelAgnosticFilesystemToolSet(\n options: AgentFilesystemToolsOptions = {},\n): LlmToolSet {\n return createGeminiFilesystemToolSet(options);\n}\n\nexport function createCodexApplyPatchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmCustomTool<string> {\n return customTool({\n description: CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION,\n format: {\n type: \"grammar\",\n syntax: \"lark\",\n definition: CODEX_APPLY_PATCH_LARK_GRAMMAR,\n },\n execute: async (input) => {\n const runtime = resolveRuntime(options);\n const result = await applyPatch({\n patch: input,\n cwd: runtime.cwd,\n fs: runtime.filesystem,\n allowOutsideCwd: runtime.allowOutsideCwd,\n checkAccess: runtime.checkAccess\n ? async (context) => {\n await runtime.checkAccess?.({\n cwd: runtime.cwd,\n tool: \"apply_patch\",\n action: mapApplyPatchAction(context.kind),\n path: context.path,\n fromPath: context.fromPath,\n toPath: context.toPath,\n });\n }\n : undefined,\n maxPatchBytes: options.applyPatch?.maxPatchBytes,\n });\n return result.summary;\n },\n });\n}\n\nexport function createCodexReadFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexReadFileInputSchema, string> {\n return tool({\n description:\n \"Reads a local file with 1-indexed line numbers, supporting slice and indentation-aware block modes.\",\n inputSchema: codexReadFileInputSchema,\n execute: async (input) => readFileCodex(input, options),\n });\n}\n\nexport function createListDirTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexListDirInputSchema, string> {\n return tool({\n description:\n \"Lists entries in a local directory with 1-indexed entry numbers and simple type labels.\",\n inputSchema: codexListDirInputSchema,\n execute: async (input) => listDirectoryCodex(input, options),\n });\n}\n\nexport function createGrepFilesTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof codexGrepFilesInputSchema, string> {\n return tool({\n description:\n \"Finds files whose contents match the pattern and lists them by modification time.\",\n inputSchema: codexGrepFilesInputSchema,\n execute: async (input) => grepFilesCodex(input, options),\n });\n}\n\nexport function createGeminiReadFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReadFileInputSchema, string> {\n return tool({\n description:\n \"Reads and returns the content of a specified file. Supports optional 0-based line offset and line limit.\",\n inputSchema: geminiReadFileInputSchema,\n execute: async (input) => readFileGemini(input, options),\n });\n}\n\nexport function createReadFilesTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReadFilesInputSchema, string> {\n return tool({\n description:\n \"Reads one or more files with optional line-based or character-based slicing, similar to a controlled head/tail view.\",\n inputSchema: geminiReadFilesInputSchema,\n execute: async (input) => readFilesGemini(input, options),\n });\n}\n\nexport function createWriteFileTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiWriteFileInputSchema, string> {\n return tool({\n description: \"Writes content to a specified file in the local filesystem.\",\n inputSchema: geminiWriteFileInputSchema,\n execute: async (input) => writeFileGemini(input, options),\n });\n}\n\nexport function createReplaceTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiReplaceInputSchema, string> {\n return tool({\n description: \"Replaces exact literal text within a file.\",\n inputSchema: geminiReplaceInputSchema,\n execute: async (input) => replaceFileContentGemini(input, options),\n });\n}\n\nexport function createListDirectoryTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiListDirectoryInputSchema, string> {\n return tool({\n description: \"Lists files and subdirectories directly within a specified directory path.\",\n inputSchema: geminiListDirectoryInputSchema,\n execute: async (input) => listDirectoryGemini(input, options),\n });\n}\n\nexport function createGrepSearchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiGrepSearchInputSchema, string> {\n return tool({\n description: \"Searches for a regex pattern within file contents.\",\n inputSchema: geminiGrepSearchInputSchema,\n execute: async (input) => grepSearchGemini(input, options),\n });\n}\n\nexport function createRgSearchTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiRgSearchInputSchema, string> {\n return tool({\n description: \"Searches for a regex pattern within file contents.\",\n inputSchema: geminiRgSearchInputSchema,\n execute: async (input) => rgSearchGemini(input, options),\n });\n}\n\nexport function createGlobTool(\n options: AgentFilesystemToolsOptions = {},\n): LlmFunctionTool<typeof geminiGlobInputSchema, string> {\n return tool({\n description: \"Finds files matching glob patterns, sorted by modification time (newest first).\",\n inputSchema: geminiGlobInputSchema,\n execute: async (input) => globFilesGemini(input, options),\n });\n}\n\nasync function readFileCodex(\n input: CodexReadFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n if (!path.isAbsolute(input.file_path)) {\n throw new Error(\"file_path must be an absolute path\");\n }\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_file\",\n action: \"read\",\n path: filePath,\n });\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n const offset = input.offset ?? 1;\n const limit = input.limit ?? DEFAULT_READ_FILE_LINE_LIMIT;\n const mode: CodexReadMode = input.mode ?? \"slice\";\n if (offset > lines.length) {\n throw new Error(\"offset exceeds file length\");\n }\n\n if (mode === \"slice\") {\n const output: string[] = [];\n const lastLine = Math.min(lines.length, offset + limit - 1);\n for (let lineNumber = offset; lineNumber <= lastLine; lineNumber += 1) {\n const line = lines[lineNumber - 1] ?? \"\";\n output.push(`L${lineNumber}: ${truncateAtCodePointBoundary(line, runtime.maxLineLength)}`);\n }\n return output.join(\"\\n\");\n }\n\n const indentation = input.indentation ?? {};\n const anchorLine = indentation.anchor_line ?? offset;\n if (anchorLine < 1 || anchorLine > lines.length) {\n throw new Error(\"anchor_line exceeds file length\");\n }\n const records = lines.map((line, index) => ({\n number: index + 1,\n raw: line,\n display: truncateAtCodePointBoundary(line, runtime.maxLineLength),\n indent: measureIndent(line, DEFAULT_TAB_WIDTH),\n }));\n\n const selected = readWithIndentationMode({\n records,\n anchorLine,\n limit,\n maxLevels: indentation.max_levels ?? 0,\n includeSiblings: indentation.include_siblings ?? false,\n includeHeader: indentation.include_header ?? true,\n maxLines: indentation.max_lines,\n });\n\n return selected.map((record) => `L${record.number}: ${record.display}`).join(\"\\n\");\n}\n\nasync function listDirectoryCodex(\n input: CodexListDirToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n if (!path.isAbsolute(input.dir_path)) {\n throw new Error(\"dir_path must be an absolute path\");\n }\n const dirPath = resolvePathWithPolicy(input.dir_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"list_dir\",\n action: \"list\",\n path: dirPath,\n });\n\n const stats = await runtime.filesystem.stat(dirPath);\n if (stats.kind !== \"directory\") {\n throw new Error(`failed to read directory: \"${dirPath}\" is not a directory`);\n }\n\n const offset = input.offset ?? 1;\n const limit = input.limit ?? DEFAULT_LIST_DIR_LIMIT;\n const depth = input.depth ?? DEFAULT_LIST_DIR_DEPTH;\n const entries = await collectDirectoryEntries(\n runtime.filesystem,\n dirPath,\n depth,\n runtime.maxLineLength,\n );\n if (offset > entries.length) {\n throw new Error(\"offset exceeds directory entry count\");\n }\n\n const startIndex = offset - 1;\n const remaining = entries.length - startIndex;\n const cappedLimit = Math.min(limit, remaining);\n const selected = entries.slice(startIndex, startIndex + cappedLimit);\n\n const output: string[] = [`Absolute path: ${dirPath}`];\n for (const entry of selected) {\n output.push(formatListEntry(entry));\n }\n if (startIndex + cappedLimit < entries.length) {\n output.push(`More than ${cappedLimit} entries found`);\n }\n\n return output.join(\"\\n\");\n}\n\nasync function grepFilesCodex(\n input: CodexGrepFilesToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const pattern = input.pattern.trim();\n if (pattern.length === 0) {\n throw new Error(\"pattern must not be empty\");\n }\n const regex = compileRegex(pattern);\n const searchPath = resolvePathWithPolicy(\n input.path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"grep_files\",\n action: \"search\",\n path: searchPath,\n pattern,\n include: input.include?.trim(),\n });\n\n const searchPathInfo = await runtime.filesystem.stat(searchPath);\n const filesToScan = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath,\n rootKind: searchPathInfo.kind,\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const includeMatcher = input.include ? createGlobMatcher(input.include) : null;\n const matches: GrepMatchRecord[] = [];\n for (const filePath of filesToScan) {\n const relativePath = toDisplayPath(filePath, runtime.cwd);\n if (includeMatcher && !includeMatcher(relativePath)) {\n continue;\n }\n const fileContent = await runtime.filesystem.readTextFile(filePath);\n if (!regex.test(fileContent)) {\n continue;\n }\n const stats = await runtime.filesystem.stat(filePath);\n matches.push({ filePath: normalizeSlashes(relativePath), mtimeMs: stats.mtimeMs });\n }\n\n if (matches.length === 0) {\n return \"No matches found.\";\n }\n\n matches.sort((left, right) => right.mtimeMs - left.mtimeMs);\n const limit = Math.min(input.limit ?? DEFAULT_GREP_LIMIT, MAX_GREP_LIMIT);\n return matches\n .slice(0, limit)\n .map((match) => match.filePath)\n .join(\"\\n\");\n}\n\nasync function readFileGemini(\n input: GeminiReadFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_file\",\n action: \"read\",\n path: filePath,\n });\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n const offset = Math.max(0, input.offset ?? 0);\n const limit = input.limit ?? DEFAULT_READ_FILE_LINE_LIMIT;\n if (offset >= lines.length) {\n return \"\";\n }\n\n const end = Math.min(lines.length, offset + limit);\n return lines\n .slice(offset, end)\n .map(\n (line, index) =>\n `L${offset + index + 1}: ${truncateAtCodePointBoundary(line ?? \"\", runtime.maxLineLength)}`,\n )\n .join(\"\\n\");\n}\n\nasync function readFilesGemini(\n input: GeminiReadFilesToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const useCharWindow = input.char_offset !== undefined || input.char_limit !== undefined;\n const lineOffset = Math.max(0, input.line_offset ?? 0);\n const lineLimit = input.line_limit ?? DEFAULT_READ_FILES_LINE_LIMIT;\n const charOffset = Math.max(0, input.char_offset ?? 0);\n const charLimit = input.char_limit ?? DEFAULT_READ_FILES_CHAR_LIMIT;\n const includeLineNumbers = input.include_line_numbers !== false;\n\n const sections: string[] = [];\n for (const rawPath of input.paths) {\n const filePath = resolvePathWithPolicy(rawPath, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"read_files\",\n action: \"read\",\n path: filePath,\n });\n const content = await runtime.filesystem.readTextFile(filePath);\n const displayPath = normalizeSlashes(toDisplayPath(filePath, runtime.cwd));\n sections.push(`==> ${displayPath} <==`);\n\n if (useCharWindow) {\n if (charOffset >= content.length) {\n sections.push(\"\");\n continue;\n }\n const end = Math.min(content.length, charOffset + charLimit);\n sections.push(content.slice(charOffset, end));\n continue;\n }\n\n const lines = splitLines(content);\n if (lineOffset >= lines.length) {\n sections.push(\"\");\n continue;\n }\n const end = Math.min(lines.length, lineOffset + lineLimit);\n const selected = lines.slice(lineOffset, end);\n if (includeLineNumbers) {\n for (let index = 0; index < selected.length; index += 1) {\n const lineNumber = lineOffset + index + 1;\n const line = selected[index] ?? \"\";\n sections.push(\n `L${lineNumber}: ${truncateAtCodePointBoundary(line, runtime.maxLineLength)}`,\n );\n }\n continue;\n }\n sections.push(selected.join(\"\\n\"));\n }\n\n return sections.join(\"\\n\");\n}\n\nasync function writeFileGemini(\n input: GeminiWriteFileToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"write_file\",\n action: \"write\",\n path: filePath,\n });\n await runtime.filesystem.ensureDir(path.dirname(filePath));\n await runtime.filesystem.writeTextFile(filePath, input.content);\n return `Successfully wrote file: ${toDisplayPath(filePath, runtime.cwd)}`;\n}\n\nasync function replaceFileContentGemini(\n input: GeminiReplaceToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const filePath = resolvePathWithPolicy(input.file_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"replace\",\n action: \"write\",\n path: filePath,\n });\n\n const expectedReplacements = input.expected_replacements ?? 1;\n const oldValue = input.old_string;\n const newValue = input.new_string;\n\n let originalContent = \"\";\n try {\n originalContent = await runtime.filesystem.readTextFile(filePath);\n } catch (error) {\n if (isNoEntError(error) && oldValue.length === 0) {\n await runtime.filesystem.ensureDir(path.dirname(filePath));\n await runtime.filesystem.writeTextFile(filePath, newValue);\n return `Successfully wrote new file: ${toDisplayPath(filePath, runtime.cwd)}`;\n }\n throw error;\n }\n\n if (oldValue === newValue) {\n throw new Error(\"No changes to apply. old_string and new_string are identical.\");\n }\n\n const occurrences = countOccurrences(originalContent, oldValue);\n if (occurrences === 0) {\n throw new Error(\"Failed to edit, could not find old_string in file.\");\n }\n if (occurrences !== expectedReplacements) {\n throw new Error(\n `Failed to edit, expected ${expectedReplacements} occurrence(s) but found ${occurrences}.`,\n );\n }\n const updatedContent = safeReplaceAll(originalContent, oldValue, newValue);\n await runtime.filesystem.writeTextFile(filePath, updatedContent);\n return `Successfully replaced ${occurrences} occurrence(s) in ${toDisplayPath(filePath, runtime.cwd)}.`;\n}\n\nasync function listDirectoryGemini(\n input: GeminiListDirectoryToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const dirPath = resolvePathWithPolicy(input.dir_path, runtime.cwd, runtime.allowOutsideCwd);\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"list_directory\",\n action: \"list\",\n path: dirPath,\n });\n\n const stats = await runtime.filesystem.stat(dirPath);\n if (stats.kind !== \"directory\") {\n throw new Error(`Path is not a directory: ${dirPath}`);\n }\n\n const entries = await runtime.filesystem.readDir(dirPath);\n const ignoreMatchers = (input.ignore ?? []).map((pattern) => createGlobMatcher(pattern));\n const filtered = entries\n .filter((entry) => {\n if (ignoreMatchers.length === 0) {\n return true;\n }\n return !ignoreMatchers.some((matches) => matches(entry.name));\n })\n .sort((left, right) => left.name.localeCompare(right.name));\n\n if (filtered.length === 0) {\n return `Directory ${toDisplayPath(dirPath, runtime.cwd)} is empty.`;\n }\n\n return filtered\n .map((entry) => {\n const label = entry.kind === \"directory\" ? `${entry.name}/` : entry.name;\n return label;\n })\n .join(\"\\n\");\n}\n\nasync function rgSearchGemini(\n input: GeminiRgSearchToolInput,\n options: AgentFilesystemToolsOptions,\n toolName: \"rg_search\" | \"grep_search\" = \"rg_search\",\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const pattern = input.pattern.trim();\n if (pattern.length === 0) {\n throw new Error(\"pattern must not be empty\");\n }\n\n const glob = input.glob?.trim();\n const searchPath = resolvePathWithPolicy(\n input.path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: toolName,\n action: \"search\",\n path: searchPath,\n pattern,\n include: glob,\n });\n\n const searchPathInfo = await runtime.filesystem.stat(searchPath);\n const filesToScan = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath,\n rootKind: searchPathInfo.kind,\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const matcher = glob ? createGlobMatcher(glob) : null;\n const patternRegex = compileRegex(pattern, input.case_sensitive === true ? \"m\" : \"im\");\n const excludeRegex = input.exclude_pattern ? compileRegex(input.exclude_pattern) : null;\n const totalMaxMatches = input.max_results ?? DEFAULT_GREP_LIMIT;\n const perFileMaxMatches = input.max_matches_per_file ?? Number.POSITIVE_INFINITY;\n\n const matches: GrepMatchRecord[] = [];\n const fileMatches = new Set<string>();\n for (const filePath of filesToScan) {\n const relativePath = normalizeSlashes(toDisplayPath(filePath, runtime.cwd));\n if (matcher && !matcher(relativePath)) {\n continue;\n }\n\n const content = await runtime.filesystem.readTextFile(filePath);\n const lines = splitLines(content);\n let fileMatchCount = 0;\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index] ?? \"\";\n if (!patternRegex.test(line)) {\n continue;\n }\n if (excludeRegex?.test(line)) {\n continue;\n }\n if (fileMatches.has(relativePath) === false) {\n fileMatches.add(relativePath);\n }\n if (input.names_only) {\n continue;\n }\n matches.push({\n filePath: relativePath,\n mtimeMs: 0,\n lineNumber: index + 1,\n line: line,\n });\n fileMatchCount += 1;\n if (fileMatchCount >= perFileMaxMatches || matches.length >= totalMaxMatches) {\n break;\n }\n }\n\n if (input.names_only && fileMatches.size >= totalMaxMatches) {\n break;\n }\n if (!input.names_only && matches.length >= totalMaxMatches) {\n break;\n }\n }\n\n if (input.names_only) {\n if (fileMatches.size === 0) {\n return \"No matches found.\";\n }\n return [...fileMatches].slice(0, totalMaxMatches).join(\"\\n\");\n }\n\n if (matches.length === 0) {\n return \"No matches found.\";\n }\n\n return matches\n .slice(0, totalMaxMatches)\n .map((match) => `${match.filePath}:${match.lineNumber}:${match.line ?? \"\"}`)\n .join(\"\\n\");\n}\n\nasync function grepSearchGemini(\n input: GeminiGrepSearchToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n return rgSearchGemini(\n {\n pattern: input.pattern,\n path: input.dir_path,\n glob: input.include,\n exclude_pattern: input.exclude_pattern,\n names_only: input.names_only,\n max_matches_per_file: input.max_matches_per_file,\n max_results: input.total_max_matches,\n },\n options,\n \"grep_search\",\n );\n}\n\nasync function globFilesGemini(\n input: GeminiGlobToolInput,\n options: AgentFilesystemToolsOptions,\n): Promise<string> {\n const runtime = resolveRuntime(options);\n const dirPath = resolvePathWithPolicy(\n input.dir_path ?? runtime.cwd,\n runtime.cwd,\n runtime.allowOutsideCwd,\n );\n await runAccessHook(runtime, {\n cwd: runtime.cwd,\n tool: \"glob\",\n action: \"search\",\n path: dirPath,\n pattern: input.pattern,\n });\n\n const dirStats = await runtime.filesystem.stat(dirPath);\n if (dirStats.kind !== \"directory\") {\n throw new Error(`Path is not a directory: ${dirPath}`);\n }\n\n const matcher = createGlobMatcher(input.pattern, input.case_sensitive === true);\n const files = await collectSearchFiles({\n filesystem: runtime.filesystem,\n searchPath: dirPath,\n rootKind: \"directory\",\n maxScannedFiles: runtime.grepMaxScannedFiles,\n });\n\n const matched: GrepMatchRecord[] = [];\n for (const filePath of files) {\n const relativePath = normalizeSlashes(path.relative(dirPath, filePath));\n if (!matcher(relativePath)) {\n continue;\n }\n const fileStats = await runtime.filesystem.stat(filePath);\n matched.push({\n filePath,\n mtimeMs: fileStats.mtimeMs,\n });\n }\n\n if (matched.length === 0) {\n return \"No files found.\";\n }\n\n matched.sort((left, right) => right.mtimeMs - left.mtimeMs);\n return matched\n .map((entry) => normalizeSlashes(toDisplayPath(entry.filePath, runtime.cwd)))\n .join(\"\\n\");\n}\n\ntype RuntimeContext = {\n readonly cwd: string;\n readonly filesystem: AgentFilesystem;\n readonly allowOutsideCwd: boolean;\n readonly checkAccess?: AgentFilesystemToolAccessHook;\n readonly maxLineLength: number;\n readonly grepMaxScannedFiles: number;\n};\n\nfunction resolveRuntime(options: AgentFilesystemToolsOptions): RuntimeContext {\n return {\n cwd: path.resolve(options.cwd ?? process.cwd()),\n filesystem: options.fs ?? createNodeAgentFilesystem(),\n allowOutsideCwd: options.allowOutsideCwd === true,\n checkAccess: options.checkAccess,\n maxLineLength: options.maxLineLength ?? DEFAULT_MAX_LINE_LENGTH,\n grepMaxScannedFiles: options.grepMaxScannedFiles ?? DEFAULT_GREP_MAX_SCANNED_FILES,\n };\n}\n\nasync function runAccessHook(\n runtime: RuntimeContext,\n context: AgentFilesystemToolAccessContext,\n): Promise<void> {\n if (!runtime.checkAccess) {\n return;\n }\n await runtime.checkAccess(context);\n}\n\nfunction isCodexModel(model: string): boolean {\n const normalized = model.startsWith(\"chatgpt-\") ? model.slice(\"chatgpt-\".length) : model;\n return normalized.includes(\"codex\");\n}\n\nfunction isGeminiModel(model: string): boolean {\n return model.startsWith(\"gemini-\");\n}\n\nfunction mapApplyPatchAction(\n action: \"add\" | \"delete\" | \"update\" | \"move\",\n): AgentFilesystemToolAction {\n if (action === \"add\" || action === \"update\") {\n return \"write\";\n }\n if (action === \"delete\") {\n return \"delete\";\n }\n return \"move\";\n}\n\nfunction resolvePathWithPolicy(inputPath: string, cwd: string, allowOutsideCwd: boolean): string {\n const absolutePath = path.isAbsolute(inputPath)\n ? path.resolve(inputPath)\n : path.resolve(cwd, inputPath);\n if (!allowOutsideCwd && !isPathInsideCwd(absolutePath, cwd)) {\n throw new Error(`path \"${inputPath}\" resolves outside cwd \"${cwd}\"`);\n }\n return absolutePath;\n}\n\nfunction isPathInsideCwd(candidatePath: string, cwd: string): boolean {\n const relative = path.relative(cwd, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction toDisplayPath(absolutePath: string, cwd: string): string {\n const relative = path.relative(cwd, absolutePath);\n if (relative === \"\") {\n return \".\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return relative;\n }\n return absolutePath;\n}\n\nfunction splitLines(content: string): string[] {\n const normalized = content.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n const lines = normalized.split(\"\\n\");\n if (lines.length > 0 && lines[lines.length - 1] === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction truncateAtCodePointBoundary(value: string, maxLength: number): string {\n if (value.length <= maxLength) {\n return value;\n }\n return Array.from(value).slice(0, maxLength).join(\"\");\n}\n\nfunction measureIndent(line: string, tabWidth: number): number {\n let count = 0;\n for (const char of line) {\n if (char === \" \") {\n count += 1;\n continue;\n }\n if (char === \"\\t\") {\n count += tabWidth;\n continue;\n }\n break;\n }\n return count;\n}\n\nfunction computeEffectiveIndents(records: readonly ReadLineRecord[]): number[] {\n const effective: number[] = [];\n let previous = 0;\n for (const record of records) {\n if (record.raw.trim().length === 0) {\n effective.push(previous);\n } else {\n previous = record.indent;\n effective.push(previous);\n }\n }\n return effective;\n}\n\nfunction trimBoundaryBlankLines(records: ReadLineRecord[]): void {\n while (records.length > 0 && records[0]?.raw.trim().length === 0) {\n records.shift();\n }\n while (records.length > 0 && records[records.length - 1]?.raw.trim().length === 0) {\n records.pop();\n }\n}\n\nfunction isCommentLine(line: string): boolean {\n const trimmed = line.trim();\n return trimmed.startsWith(\"#\") || trimmed.startsWith(\"//\") || trimmed.startsWith(\"--\");\n}\n\nfunction readWithIndentationMode(params: {\n records: readonly ReadLineRecord[];\n anchorLine: number;\n limit: number;\n maxLevels: number;\n includeSiblings: boolean;\n includeHeader: boolean;\n maxLines?: number;\n}): ReadLineRecord[] {\n const { records, anchorLine, limit, maxLevels, includeSiblings, includeHeader, maxLines } =\n params;\n const anchorIndex = anchorLine - 1;\n const effectiveIndents = computeEffectiveIndents(records);\n const anchorIndent = effectiveIndents[anchorIndex] ?? 0;\n const minIndent = maxLevels === 0 ? 0 : Math.max(anchorIndent - maxLevels * DEFAULT_TAB_WIDTH, 0);\n const guardLimit = maxLines ?? limit;\n const finalLimit = Math.min(limit, guardLimit, records.length);\n if (finalLimit <= 1) {\n return [records[anchorIndex]].filter((entry): entry is ReadLineRecord => Boolean(entry));\n }\n\n let upper = anchorIndex - 1;\n let lower = anchorIndex + 1;\n let upperMinIndentHits = 0;\n let lowerMinIndentHits = 0;\n const output: ReadLineRecord[] = [records[anchorIndex]].filter((entry): entry is ReadLineRecord =>\n Boolean(entry),\n );\n\n while (output.length < finalLimit) {\n let progressed = 0;\n\n if (upper >= 0) {\n const candidate = records[upper];\n const candidateIndent = effectiveIndents[upper] ?? 0;\n if (candidate && candidateIndent >= minIndent) {\n output.unshift(candidate);\n progressed += 1;\n upper -= 1;\n if (candidateIndent === minIndent && !includeSiblings) {\n const allowHeaderComment = includeHeader && isCommentLine(candidate.raw);\n const canTakeLine = allowHeaderComment || upperMinIndentHits === 0;\n if (canTakeLine) {\n upperMinIndentHits += 1;\n } else {\n output.shift();\n progressed -= 1;\n upper = -1;\n }\n }\n if (output.length >= finalLimit) {\n break;\n }\n } else {\n upper = -1;\n }\n }\n\n if (lower < records.length) {\n const candidate = records[lower];\n const candidateIndent = effectiveIndents[lower] ?? 0;\n if (candidate && candidateIndent >= minIndent) {\n output.push(candidate);\n progressed += 1;\n lower += 1;\n if (candidateIndent === minIndent && !includeSiblings) {\n if (lowerMinIndentHits > 0) {\n output.pop();\n progressed -= 1;\n lower = records.length;\n }\n lowerMinIndentHits += 1;\n }\n } else {\n lower = records.length;\n }\n }\n\n if (progressed === 0) {\n break;\n }\n }\n\n trimBoundaryBlankLines(output);\n return output;\n}\n\nasync function collectDirectoryEntries(\n filesystem: AgentFilesystem,\n rootPath: string,\n depth: number,\n maxLineLength: number,\n): Promise<ListEntryRecord[]> {\n const queue: Array<{ path: string; relativePrefix: string; remainingDepth: number }> = [\n { path: rootPath, relativePrefix: \"\", remainingDepth: depth },\n ];\n const records: ListEntryRecord[] = [];\n\n while (queue.length > 0) {\n const next = queue.shift();\n if (!next) {\n break;\n }\n const entries = await filesystem.readDir(next.path);\n const nextEntries = [...entries]\n .map((entry) => {\n const relativePath = next.relativePrefix\n ? `${next.relativePrefix}/${entry.name}`\n : entry.name;\n return {\n entry,\n relativePath,\n depth: next.relativePrefix.length === 0 ? 0 : next.relativePrefix.split(\"/\").length,\n sortName: normalizeSlashes(relativePath),\n };\n })\n .sort((left, right) => left.sortName.localeCompare(right.sortName));\n\n for (const item of nextEntries) {\n if (item.entry.kind === \"directory\" && next.remainingDepth > 1) {\n queue.push({\n path: item.entry.path,\n relativePrefix: item.relativePath,\n remainingDepth: next.remainingDepth - 1,\n });\n }\n records.push({\n name: item.sortName,\n displayName: truncateAtCodePointBoundary(item.entry.name, maxLineLength),\n depth: item.depth,\n kind: item.entry.kind,\n });\n }\n }\n\n records.sort((left, right) => left.name.localeCompare(right.name));\n return records;\n}\n\nfunction formatListEntry(entry: ListEntryRecord): string {\n const indent = \" \".repeat(entry.depth * 2);\n let name = entry.displayName;\n if (entry.kind === \"directory\") {\n name += \"/\";\n } else if (entry.kind === \"symlink\") {\n name += \"@\";\n } else if (entry.kind === \"other\") {\n name += \"?\";\n }\n return `${indent}${name}`;\n}\n\nasync function collectSearchFiles(params: {\n filesystem: AgentFilesystem;\n searchPath: string;\n rootKind: AgentDirectoryEntry[\"kind\"];\n maxScannedFiles: number;\n}): Promise<string[]> {\n const { filesystem, searchPath, rootKind, maxScannedFiles } = params;\n if (rootKind === \"file\") {\n return [searchPath];\n }\n\n const queue: string[] = [searchPath];\n const files: string[] = [];\n while (queue.length > 0) {\n const current = queue.shift();\n if (!current) {\n break;\n }\n const entries = await filesystem.readDir(current);\n for (const entry of entries) {\n if (entry.kind === \"directory\") {\n queue.push(entry.path);\n continue;\n }\n if (entry.kind !== \"file\") {\n continue;\n }\n files.push(entry.path);\n if (files.length >= maxScannedFiles) {\n return files;\n }\n }\n }\n return files;\n}\n\nfunction compileRegex(pattern: string, flags = \"m\"): RegExp {\n try {\n return new RegExp(pattern, flags);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`invalid regex pattern: ${message}`);\n }\n}\n\nfunction createGlobMatcher(\n pattern: string,\n caseSensitive = false,\n): (candidatePath: string) => boolean {\n const expanded = expandBracePatterns(normalizeSlashes(pattern.trim()));\n const flags = caseSensitive ? \"\" : \"i\";\n const compiled = expanded.map((entry) => ({\n regex: globToRegex(entry, flags),\n applyToBasename: !entry.includes(\"/\"),\n }));\n\n return (candidatePath: string) => {\n const normalizedPath = normalizeSlashes(candidatePath);\n const basename = path.posix.basename(normalizedPath);\n return compiled.some((entry) =>\n entry.regex.test(entry.applyToBasename ? basename : normalizedPath),\n );\n };\n}\n\nfunction globToRegex(globPattern: string, flags: string): RegExp {\n let source = \"^\";\n for (let index = 0; index < globPattern.length; index += 1) {\n const char = globPattern[index];\n const nextChar = globPattern[index + 1];\n\n if (char === undefined) {\n continue;\n }\n if (char === \"*\" && nextChar === \"*\") {\n source += \".*\";\n index += 1;\n continue;\n }\n if (char === \"*\") {\n source += \"[^/]*\";\n continue;\n }\n if (char === \"?\") {\n source += \"[^/]\";\n continue;\n }\n source += escapeRegexCharacter(char);\n }\n source += \"$\";\n return new RegExp(source, flags);\n}\n\nfunction expandBracePatterns(pattern: string): string[] {\n const start = pattern.indexOf(\"{\");\n if (start === -1) {\n return [pattern];\n }\n\n let depth = 0;\n let end = -1;\n for (let index = start; index < pattern.length; index += 1) {\n const char = pattern[index];\n if (char === \"{\") {\n depth += 1;\n continue;\n }\n if (char === \"}\") {\n depth -= 1;\n if (depth === 0) {\n end = index;\n break;\n }\n }\n }\n\n if (end === -1) {\n return [pattern];\n }\n\n const prefix = pattern.slice(0, start);\n const suffix = pattern.slice(end + 1);\n const body = pattern.slice(start + 1, end);\n const variants = splitTopLevel(body, \",\");\n const expanded: string[] = [];\n for (const variant of variants) {\n expanded.push(...expandBracePatterns(`${prefix}${variant}${suffix}`));\n }\n return expanded;\n}\n\nfunction splitTopLevel(value: string, separator: string): string[] {\n const parts: string[] = [];\n let depth = 0;\n let current = \"\";\n for (const char of value) {\n if (char === \"{\") {\n depth += 1;\n current += char;\n continue;\n }\n if (char === \"}\") {\n depth = Math.max(0, depth - 1);\n current += char;\n continue;\n }\n if (char === separator && depth === 0) {\n parts.push(current);\n current = \"\";\n continue;\n }\n current += char;\n }\n parts.push(current);\n return parts;\n}\n\nfunction escapeRegexCharacter(char: string): string {\n return /[.*+?^${}()|[\\]\\\\]/u.test(char) ? `\\\\${char}` : char;\n}\n\nfunction normalizeSlashes(value: string): string {\n return value.replaceAll(\"\\\\\", \"/\");\n}\n\nfunction countOccurrences(text: string, search: string): number {\n if (search.length === 0) {\n return 0;\n }\n return text.split(search).length - 1;\n}\n\nfunction safeReplaceAll(text: string, search: string, replacement: string): string {\n if (search.length === 0) {\n return text;\n }\n return text.split(search).join(replacement);\n}\n\nfunction isNoEntError(error: unknown): boolean {\n return (\n typeof error === \"object\" &&\n error !== null &&\n \"code\" in error &&\n (error as { code?: unknown }).code === \"ENOENT\"\n );\n}\n","import path from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { type LlmFunctionTool, tool } from \"../llm.js\";\nimport { createNodeAgentFilesystem, type AgentFilesystem } from \"./filesystem.js\";\n\nconst BEGIN_PATCH_LINE = \"*** Begin Patch\";\nconst END_PATCH_LINE = \"*** End Patch\";\nconst ADD_FILE_PREFIX = \"*** Add File: \";\nconst DELETE_FILE_PREFIX = \"*** Delete File: \";\nconst UPDATE_FILE_PREFIX = \"*** Update File: \";\nconst MOVE_TO_PREFIX = \"*** Move to: \";\nconst END_OF_FILE_LINE = \"*** End of File\";\nconst DEFAULT_MAX_PATCH_BYTES = 1024 * 1024;\n\nexport const CODEX_APPLY_PATCH_INPUT_DESCRIPTION = \"The entire contents of the apply_patch command\";\nexport const CODEX_APPLY_PATCH_FREEFORM_TOOL_DESCRIPTION =\n \"Use the `apply_patch` tool to edit files. This is a FREEFORM tool, so do not wrap the patch in JSON.\";\nexport const CODEX_APPLY_PATCH_LARK_GRAMMAR = [\n \"start: begin_patch hunk+ end_patch\",\n 'begin_patch: \"*** Begin Patch\" LF',\n 'end_patch: \"*** End Patch\" LF?',\n \"\",\n \"hunk: add_hunk | delete_hunk | update_hunk\",\n 'add_hunk: \"*** Add File: \" filename LF add_line+',\n 'delete_hunk: \"*** Delete File: \" filename LF',\n 'update_hunk: \"*** Update File: \" filename LF change_move? change?',\n \"\",\n \"filename: /(.+)/\",\n 'add_line: \"+\" /(.*)/ LF -> line',\n \"\",\n 'change_move: \"*** Move to: \" filename LF',\n \"change: (change_context | change_line)+ eof_line?\",\n 'change_context: (\"@@\" | \"@@ \" /(.+)/) LF',\n 'change_line: (\"+\" | \"-\" | \" \") /(.*)/ LF',\n 'eof_line: \"*** End of File\" LF',\n \"\",\n \"%import common.LF\",\n].join(\"\\n\");\n\nexport const CODEX_APPLY_PATCH_JSON_TOOL_DESCRIPTION = [\n \"Use the `apply_patch` tool to edit files.\",\n \"Your patch language is a stripped‑down, file‑oriented diff format designed to be easy to parse and safe to apply. You can think of it as a high‑level envelope:\",\n \"\",\n \"*** Begin Patch\",\n \"[ one or more file sections ]\",\n \"*** End Patch\",\n \"\",\n \"Within that envelope, you get a sequence of file operations.\",\n \"You MUST include a header to specify the action you are taking.\",\n \"Each operation starts with one of three headers:\",\n \"\",\n \"*** Add File: <path> - create a new file. Every following line is a + line (the initial contents).\",\n \"*** Delete File: <path> - remove an existing file. Nothing follows.\",\n \"*** Update File: <path> - patch an existing file in place (optionally with a rename).\",\n \"\",\n \"May be immediately followed by *** Move to: <new path> if you want to rename the file.\",\n \"Then one or more “hunks”, each introduced by @@ (optionally followed by a hunk header).\",\n \"Within a hunk each line starts with:\",\n \"\",\n \"For instructions on [context_before] and [context_after]:\",\n \"- By default, show 3 lines of code immediately above and 3 lines immediately below each change. If a change is within 3 lines of a previous change, do NOT duplicate the first change’s [context_after] lines in the second change’s [context_before] lines.\",\n \"- If 3 lines of context is insufficient to uniquely identify the snippet of code within the file, use the @@ operator to indicate the class or function to which the snippet belongs. For instance, we might have:\",\n \"@@ class BaseClass\",\n \"[3 lines of pre-context]\",\n \"- [old_code]\",\n \"+ [new_code]\",\n \"[3 lines of post-context]\",\n \"\",\n \"- If a code block is repeated so many times in a class or function such that even a single `@@` statement and 3 lines of context cannot uniquely identify the snippet of code, you can use multiple `@@` statements to jump to the right context. For instance:\",\n \"\",\n \"@@ class BaseClass\",\n \"@@ \\t def method():\",\n \"[3 lines of pre-context]\",\n \"- [old_code]\",\n \"+ [new_code]\",\n \"[3 lines of post-context]\",\n \"\",\n \"The full grammar definition is below:\",\n \"Patch := Begin { FileOp } End\",\n 'Begin := \"*** Begin Patch\" NEWLINE',\n 'End := \"*** End Patch\" NEWLINE',\n \"FileOp := AddFile | DeleteFile | UpdateFile\",\n 'AddFile := \"*** Add File: \" path NEWLINE { \"+\" line NEWLINE }',\n 'DeleteFile := \"*** Delete File: \" path NEWLINE',\n 'UpdateFile := \"*** Update File: \" path NEWLINE [ MoveTo ] { Hunk }',\n 'MoveTo := \"*** Move to: \" newPath NEWLINE',\n 'Hunk := \"@@\" [ header ] NEWLINE { HunkLine } [ \"*** End of File\" NEWLINE ]',\n 'HunkLine := (\" \" | \"-\" | \"+\") text NEWLINE',\n \"\",\n \"A full patch can combine several operations:\",\n \"\",\n \"*** Begin Patch\",\n \"*** Add File: hello.txt\",\n \"+Hello world\",\n \"*** Update File: src/app.py\",\n \"*** Move to: src/main.py\",\n \"@@ def greet():\",\n '-print(\"Hi\")',\n '+print(\"Hello, world!\")',\n \"*** Delete File: obsolete.txt\",\n \"*** End Patch\",\n \"\",\n \"It is important to remember:\",\n \"\",\n \"- You must include a header with your intended action (Add/Delete/Update)\",\n \"- You must prefix new lines with `+` even when creating a new file\",\n \"- File references can only be relative, NEVER ABSOLUTE.\",\n].join(\"\\n\");\n\ntype ParsedPatch = {\n readonly operations: readonly ParsedPatchOperation[];\n};\n\ntype ParsedPatchOperation =\n | {\n readonly type: \"add\";\n readonly path: string;\n readonly content: string;\n }\n | {\n readonly type: \"delete\";\n readonly path: string;\n }\n | {\n readonly type: \"update\";\n readonly path: string;\n readonly movePath?: string;\n readonly chunks: readonly ParsedUpdateChunk[];\n };\n\ntype ParsedUpdateChunk = {\n readonly contextSelector?: string;\n readonly oldLines: readonly string[];\n readonly newLines: readonly string[];\n readonly isEndOfFile: boolean;\n};\n\ntype Replacement = {\n readonly startIndex: number;\n readonly oldLength: number;\n readonly newLines: readonly string[];\n};\n\nexport type ApplyPatchAccessContext = {\n readonly cwd: string;\n readonly kind: \"add\" | \"delete\" | \"update\" | \"move\";\n readonly path: string;\n readonly fromPath?: string;\n readonly toPath?: string;\n};\n\nexport type ApplyPatchAccessHook = (context: ApplyPatchAccessContext) => Promise<void> | void;\n\nexport type ApplyPatchRequest = {\n readonly patch: string;\n readonly cwd?: string;\n readonly fs?: AgentFilesystem;\n readonly allowOutsideCwd?: boolean;\n readonly checkAccess?: ApplyPatchAccessHook;\n readonly maxPatchBytes?: number;\n};\n\nexport type ApplyPatchResult = {\n readonly success: true;\n readonly summary: string;\n readonly added: readonly string[];\n readonly modified: readonly string[];\n readonly deleted: readonly string[];\n};\n\nexport type CreateApplyPatchToolOptions = Omit<ApplyPatchRequest, \"patch\"> & {\n readonly description?: string;\n};\n\nconst applyPatchToolInputSchema = z.object({\n input: z.string().min(1).describe(CODEX_APPLY_PATCH_INPUT_DESCRIPTION),\n});\n\nexport type ApplyPatchToolInput = z.output<typeof applyPatchToolInputSchema>;\n\nexport function createApplyPatchTool(\n options: CreateApplyPatchToolOptions = {},\n): LlmFunctionTool<typeof applyPatchToolInputSchema, ApplyPatchResult> {\n return tool({\n description: options.description ?? CODEX_APPLY_PATCH_JSON_TOOL_DESCRIPTION,\n inputSchema: applyPatchToolInputSchema,\n execute: async ({ input }) =>\n applyPatch({\n patch: input,\n cwd: options.cwd,\n fs: options.fs,\n allowOutsideCwd: options.allowOutsideCwd,\n checkAccess: options.checkAccess,\n maxPatchBytes: options.maxPatchBytes,\n }),\n });\n}\n\nexport async function applyPatch(request: ApplyPatchRequest): Promise<ApplyPatchResult> {\n const cwd = path.resolve(request.cwd ?? process.cwd());\n const adapter = request.fs ?? createNodeAgentFilesystem();\n const allowOutsideCwd = request.allowOutsideCwd === true;\n const patchBytes = Buffer.byteLength(request.patch, \"utf8\");\n const maxPatchBytes = request.maxPatchBytes ?? DEFAULT_MAX_PATCH_BYTES;\n if (patchBytes > maxPatchBytes) {\n throw new Error(\n `apply_patch failed: patch too large (${patchBytes} bytes > ${maxPatchBytes} bytes)`,\n );\n }\n\n const parsed = parsePatchDocument(normalizePatchText(request.patch));\n\n const added: string[] = [];\n const modified: string[] = [];\n const deleted: string[] = [];\n\n for (const operation of parsed.operations) {\n if (operation.type === \"add\") {\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"add\",\n path: absolutePath,\n });\n await adapter.ensureDir(path.dirname(absolutePath));\n await adapter.writeTextFile(absolutePath, operation.content);\n added.push(toDisplayPath(absolutePath, cwd));\n continue;\n }\n\n if (operation.type === \"delete\") {\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"delete\",\n path: absolutePath,\n });\n await adapter.readTextFile(absolutePath);\n await adapter.deleteFile(absolutePath);\n deleted.push(toDisplayPath(absolutePath, cwd));\n continue;\n }\n\n const absolutePath = resolvePatchPath(operation.path, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"update\",\n path: absolutePath,\n });\n const current = await adapter.readTextFile(absolutePath);\n const next = deriveUpdatedContent(current, operation.chunks, toDisplayPath(absolutePath, cwd));\n\n if (operation.movePath) {\n const destinationPath = resolvePatchPath(operation.movePath, cwd, allowOutsideCwd);\n await runAccessHook(request.checkAccess, {\n cwd,\n kind: \"move\",\n path: destinationPath,\n fromPath: absolutePath,\n toPath: destinationPath,\n });\n await adapter.ensureDir(path.dirname(destinationPath));\n await adapter.writeTextFile(destinationPath, next);\n await adapter.deleteFile(absolutePath);\n modified.push(toDisplayPath(destinationPath, cwd));\n continue;\n }\n\n await adapter.writeTextFile(absolutePath, next);\n modified.push(toDisplayPath(absolutePath, cwd));\n }\n\n return {\n success: true,\n summary: formatSummary(added, modified, deleted),\n added,\n modified,\n deleted,\n };\n}\n\nasync function runAccessHook(\n hook: ApplyPatchAccessHook | undefined,\n context: ApplyPatchAccessContext,\n): Promise<void> {\n if (!hook) {\n return;\n }\n await hook(context);\n}\n\nfunction normalizePatchText(raw: string): string {\n return raw.replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\");\n}\n\nfunction resolvePatchPath(rawPath: string, cwd: string, allowOutsideCwd: boolean): string {\n const trimmed = rawPath.trim();\n if (trimmed.length === 0) {\n throw new Error(\"apply_patch failed: empty file path\");\n }\n const absolutePath = path.isAbsolute(trimmed)\n ? path.resolve(trimmed)\n : path.resolve(cwd, trimmed);\n if (!allowOutsideCwd && !isPathInsideCwd(absolutePath, cwd)) {\n throw new Error(`apply_patch failed: path \"${trimmed}\" resolves outside cwd \"${cwd}\"`);\n }\n return absolutePath;\n}\n\nfunction isPathInsideCwd(candidatePath: string, cwd: string): boolean {\n const relative = path.relative(cwd, candidatePath);\n return relative === \"\" || (!relative.startsWith(\"..\") && !path.isAbsolute(relative));\n}\n\nfunction toDisplayPath(absolutePath: string, cwd: string): string {\n const relative = path.relative(cwd, absolutePath);\n if (relative === \"\") {\n return \".\";\n }\n if (!relative.startsWith(\"..\") && !path.isAbsolute(relative)) {\n return relative;\n }\n return absolutePath;\n}\n\nfunction parsePatchDocument(patch: string): ParsedPatch {\n const lines = patch.split(\"\\n\");\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n if (lines.length < 2) {\n throw new Error(\"apply_patch failed: patch must contain Begin/End markers\");\n }\n if (lines[0] !== BEGIN_PATCH_LINE) {\n throw new Error(`apply_patch failed: missing \"${BEGIN_PATCH_LINE}\" header`);\n }\n if (lines[lines.length - 1] !== END_PATCH_LINE) {\n throw new Error(`apply_patch failed: missing \"${END_PATCH_LINE}\" footer`);\n }\n\n const body = lines.slice(1, -1);\n if (body.length === 0) {\n throw new Error(\"apply_patch failed: patch body is empty\");\n }\n\n const operations: ParsedPatchOperation[] = [];\n let index = 0;\n while (index < body.length) {\n const line = body[index];\n if (!line) {\n throw new Error(\"apply_patch failed: unexpected empty line between file sections\");\n }\n\n if (line.startsWith(ADD_FILE_PREFIX)) {\n const filePath = extractPatchPath(line, ADD_FILE_PREFIX);\n index += 1;\n const contentLines: string[] = [];\n while (index < body.length) {\n const contentLine = body[index];\n if (contentLine === undefined || isPatchSectionHeader(contentLine)) {\n break;\n }\n if (!contentLine.startsWith(\"+\")) {\n throw new Error(`apply_patch failed: invalid add-file line \"${contentLine}\"`);\n }\n contentLines.push(contentLine.slice(1));\n index += 1;\n }\n if (contentLines.length === 0) {\n throw new Error(`apply_patch failed: add-file section for \"${filePath}\" is empty`);\n }\n operations.push({\n type: \"add\",\n path: filePath,\n content: `${contentLines.join(\"\\n\")}\\n`,\n });\n continue;\n }\n\n if (line.startsWith(DELETE_FILE_PREFIX)) {\n operations.push({\n type: \"delete\",\n path: extractPatchPath(line, DELETE_FILE_PREFIX),\n });\n index += 1;\n continue;\n }\n\n if (line.startsWith(UPDATE_FILE_PREFIX)) {\n const filePath = extractPatchPath(line, UPDATE_FILE_PREFIX);\n index += 1;\n\n let movePath: string | undefined;\n const moveHeader = body[index];\n if (moveHeader?.startsWith(MOVE_TO_PREFIX)) {\n movePath = extractPatchPath(moveHeader, MOVE_TO_PREFIX);\n index += 1;\n }\n\n const chunks: ParsedUpdateChunk[] = [];\n while (index < body.length) {\n const hunkHeader = body[index];\n if (hunkHeader === undefined || isPatchSectionHeader(hunkHeader)) {\n break;\n }\n if (!(hunkHeader === \"@@\" || hunkHeader.startsWith(\"@@ \"))) {\n throw new Error(\n `apply_patch failed: expected hunk marker in \"${filePath}\", got \"${hunkHeader}\"`,\n );\n }\n const contextSelector = hunkHeader.length > 2 ? hunkHeader.slice(3) : undefined;\n index += 1;\n\n const oldLines: string[] = [];\n const newLines: string[] = [];\n let sawBodyLine = false;\n let sawChangeLine = false;\n let isEndOfFile = false;\n\n while (index < body.length) {\n const chunkLine = body[index];\n if (chunkLine === undefined) {\n break;\n }\n if (\n chunkLine === \"@@\" ||\n chunkLine.startsWith(\"@@ \") ||\n isPatchSectionHeader(chunkLine)\n ) {\n break;\n }\n if (chunkLine === END_OF_FILE_LINE) {\n isEndOfFile = true;\n index += 1;\n break;\n }\n if (chunkLine.length === 0) {\n throw new Error(`apply_patch failed: invalid empty hunk line in \"${filePath}\"`);\n }\n\n const prefix = chunkLine[0];\n const content = chunkLine.slice(1);\n if (prefix === \" \") {\n oldLines.push(content);\n newLines.push(content);\n } else if (prefix === \"-\") {\n oldLines.push(content);\n sawChangeLine = true;\n } else if (prefix === \"+\") {\n newLines.push(content);\n sawChangeLine = true;\n } else {\n throw new Error(\n `apply_patch failed: unsupported hunk prefix \"${prefix}\" in \"${chunkLine}\"`,\n );\n }\n\n sawBodyLine = true;\n index += 1;\n }\n\n if (!sawBodyLine) {\n throw new Error(`apply_patch failed: empty hunk body in \"${filePath}\"`);\n }\n if (!sawChangeLine) {\n throw new Error(\n `apply_patch failed: hunk in \"${filePath}\" must include '+' or '-' lines`,\n );\n }\n\n chunks.push({\n contextSelector,\n oldLines,\n newLines,\n isEndOfFile,\n });\n }\n\n if (chunks.length === 0) {\n throw new Error(`apply_patch failed: update section for \"${filePath}\" has no hunks`);\n }\n\n operations.push({\n type: \"update\",\n path: filePath,\n movePath,\n chunks,\n });\n continue;\n }\n\n throw new Error(`apply_patch failed: unrecognized section header \"${line}\"`);\n }\n\n return { operations };\n}\n\nfunction extractPatchPath(line: string, prefix: string): string {\n const value = line.slice(prefix.length).trim();\n if (value.length === 0) {\n throw new Error(`apply_patch failed: missing file path in \"${line}\"`);\n }\n return value;\n}\n\nfunction isPatchSectionHeader(line: string): boolean {\n return (\n line.startsWith(ADD_FILE_PREFIX) ||\n line.startsWith(DELETE_FILE_PREFIX) ||\n line.startsWith(UPDATE_FILE_PREFIX)\n );\n}\n\nfunction deriveUpdatedContent(\n originalContent: string,\n chunks: readonly ParsedUpdateChunk[],\n displayPath: string,\n): string {\n const originalLines = splitFileContentIntoLines(originalContent);\n const replacements: Replacement[] = [];\n let lineIndex = 0;\n\n for (const chunk of chunks) {\n if (chunk.contextSelector !== undefined) {\n const contextIndex = seekSequence(originalLines, [chunk.contextSelector], lineIndex, false);\n if (contextIndex === null) {\n throw new Error(\n `apply_patch failed: unable to locate context \"${chunk.contextSelector}\" in ${displayPath}`,\n );\n }\n lineIndex = contextIndex + 1;\n }\n\n if (chunk.oldLines.length === 0) {\n replacements.push({\n startIndex: originalLines.length,\n oldLength: 0,\n newLines: [...chunk.newLines],\n });\n continue;\n }\n\n let oldLines = [...chunk.oldLines];\n let newLines = [...chunk.newLines];\n let startIndex = seekSequence(originalLines, oldLines, lineIndex, chunk.isEndOfFile);\n\n if (startIndex === null && oldLines.at(-1) === \"\") {\n oldLines = oldLines.slice(0, -1);\n if (newLines.at(-1) === \"\") {\n newLines = newLines.slice(0, -1);\n }\n startIndex = seekSequence(originalLines, oldLines, lineIndex, chunk.isEndOfFile);\n }\n\n if (startIndex === null) {\n throw new Error(\n `apply_patch failed: failed to match hunk in ${displayPath}:\\n${chunk.oldLines.join(\"\\n\")}`,\n );\n }\n\n replacements.push({\n startIndex,\n oldLength: oldLines.length,\n newLines,\n });\n lineIndex = startIndex + oldLines.length;\n }\n\n replacements.sort((left, right) => left.startIndex - right.startIndex);\n const nextLines = applyReplacements(originalLines, replacements);\n if (nextLines.length > 0 && nextLines[nextLines.length - 1] !== \"\") {\n nextLines.push(\"\");\n }\n return nextLines.join(\"\\n\");\n}\n\nfunction splitFileContentIntoLines(content: string): string[] {\n const lines = content.split(\"\\n\");\n if (lines.at(-1) === \"\") {\n lines.pop();\n }\n return lines;\n}\n\nfunction seekSequence(\n sourceLines: readonly string[],\n targetLines: readonly string[],\n startIndex: number,\n isEndOfFile: boolean,\n): number | null {\n if (targetLines.length === 0) {\n return Math.min(Math.max(startIndex, 0), sourceLines.length);\n }\n const from = Math.max(startIndex, 0);\n const maxStart = sourceLines.length - targetLines.length;\n if (maxStart < from) {\n return null;\n }\n\n const matchesAt = (candidateIndex: number): boolean => {\n for (let offset = 0; offset < targetLines.length; offset += 1) {\n if (sourceLines[candidateIndex + offset] !== targetLines[offset]) {\n return false;\n }\n }\n return true;\n };\n\n if (isEndOfFile) {\n return matchesAt(maxStart) ? maxStart : null;\n }\n\n for (let candidate = from; candidate <= maxStart; candidate += 1) {\n if (matchesAt(candidate)) {\n return candidate;\n }\n }\n return null;\n}\n\nfunction applyReplacements(\n lines: readonly string[],\n replacements: readonly Replacement[],\n): string[] {\n const result = [...lines];\n for (let index = replacements.length - 1; index >= 0; index -= 1) {\n const replacement = replacements[index];\n if (replacement === undefined) {\n continue;\n }\n result.splice(replacement.startIndex, replacement.oldLength, ...replacement.newLines);\n }\n return result;\n}\n\nfunction formatSummary(\n added: readonly string[],\n modified: readonly string[],\n deleted: readonly string[],\n): string {\n const lines = [\"Success. Updated the following files:\"];\n for (const filePath of added) {\n lines.push(`A ${filePath}`);\n }\n for (const filePath of modified) {\n lines.push(`M ${filePath}`);\n }\n for (const filePath of deleted) {\n lines.push(`D ${filePath}`);\n }\n return `${lines.join(\"\\n\")}\\n`;\n}\n","import { promises as fs } from \"node:fs\";\nimport path from \"node:path\";\n\nexport type AgentPathKind = \"file\" | \"directory\" | \"symlink\" | \"other\";\n\nexport type AgentPathInfo = {\n readonly kind: AgentPathKind;\n readonly mtimeMs: number;\n};\n\nexport type AgentDirectoryEntry = {\n readonly name: string;\n readonly path: string;\n readonly kind: AgentPathKind;\n readonly mtimeMs: number;\n};\n\nexport interface AgentFilesystem {\n readTextFile(filePath: string): Promise<string>;\n writeTextFile(filePath: string, content: string): Promise<void>;\n deleteFile(filePath: string): Promise<void>;\n ensureDir(directoryPath: string): Promise<void>;\n readDir(directoryPath: string): Promise<readonly AgentDirectoryEntry[]>;\n stat(entryPath: string): Promise<AgentPathInfo>;\n}\n\ntype InMemoryFileRecord = {\n content: string;\n mtimeMs: number;\n};\n\ntype InMemoryDirRecord = {\n mtimeMs: number;\n};\n\nexport class InMemoryAgentFilesystem implements AgentFilesystem {\n readonly #files = new Map<string, InMemoryFileRecord>();\n readonly #dirs = new Map<string, InMemoryDirRecord>();\n #clock = 0;\n\n constructor(initialFiles: Record<string, string> = {}) {\n const root = path.resolve(\"/\");\n this.#dirs.set(root, { mtimeMs: this.#nextMtime() });\n for (const [filePath, content] of Object.entries(initialFiles)) {\n const absolutePath = path.resolve(filePath);\n this.#ensureDirSync(path.dirname(absolutePath));\n this.#files.set(absolutePath, {\n content,\n mtimeMs: this.#nextMtime(),\n });\n }\n }\n\n async readTextFile(filePath: string): Promise<string> {\n const absolutePath = path.resolve(filePath);\n const file = this.#files.get(absolutePath);\n if (!file) {\n throw createNoSuchFileError(\"open\", absolutePath);\n }\n return file.content;\n }\n\n async writeTextFile(filePath: string, content: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n const parentPath = path.dirname(absolutePath);\n if (!this.#dirs.has(parentPath)) {\n throw createNoSuchFileError(\"open\", parentPath);\n }\n this.#files.set(absolutePath, { content, mtimeMs: this.#nextMtime() });\n }\n\n async deleteFile(filePath: string): Promise<void> {\n const absolutePath = path.resolve(filePath);\n if (!this.#files.delete(absolutePath)) {\n throw createNoSuchFileError(\"unlink\", absolutePath);\n }\n }\n\n async ensureDir(directoryPath: string): Promise<void> {\n this.#ensureDirSync(path.resolve(directoryPath));\n }\n\n async readDir(directoryPath: string): Promise<readonly AgentDirectoryEntry[]> {\n const absolutePath = path.resolve(directoryPath);\n const directory = this.#dirs.get(absolutePath);\n if (!directory) {\n throw createNoSuchFileError(\"scandir\", absolutePath);\n }\n\n const entries: AgentDirectoryEntry[] = [];\n const seenNames = new Set<string>();\n\n for (const [dirPath, dirRecord] of this.#dirs.entries()) {\n if (dirPath === absolutePath) {\n continue;\n }\n if (path.dirname(dirPath) !== absolutePath) {\n continue;\n }\n const name = path.basename(dirPath);\n if (seenNames.has(name)) {\n continue;\n }\n seenNames.add(name);\n entries.push({\n name,\n path: dirPath,\n kind: \"directory\",\n mtimeMs: dirRecord.mtimeMs,\n });\n }\n\n for (const [filePath, fileRecord] of this.#files.entries()) {\n if (path.dirname(filePath) !== absolutePath) {\n continue;\n }\n const name = path.basename(filePath);\n if (seenNames.has(name)) {\n continue;\n }\n seenNames.add(name);\n entries.push({\n name,\n path: filePath,\n kind: \"file\",\n mtimeMs: fileRecord.mtimeMs,\n });\n }\n\n entries.sort((left, right) => left.name.localeCompare(right.name));\n return entries;\n }\n\n async stat(entryPath: string): Promise<AgentPathInfo> {\n const absolutePath = path.resolve(entryPath);\n const file = this.#files.get(absolutePath);\n if (file) {\n return { kind: \"file\", mtimeMs: file.mtimeMs };\n }\n const directory = this.#dirs.get(absolutePath);\n if (directory) {\n return { kind: \"directory\", mtimeMs: directory.mtimeMs };\n }\n throw createNoSuchFileError(\"stat\", absolutePath);\n }\n\n snapshot(): Record<string, string> {\n const entries = [...this.#files.entries()].sort(([left], [right]) => left.localeCompare(right));\n return Object.fromEntries(entries.map(([filePath, record]) => [filePath, record.content]));\n }\n\n #ensureDirSync(directoryPath: string): void {\n const absolutePath = path.resolve(directoryPath);\n const parts: string[] = [];\n let cursor = absolutePath;\n for (;;) {\n if (this.#dirs.has(cursor)) {\n break;\n }\n parts.push(cursor);\n const parent = path.dirname(cursor);\n if (parent === cursor) {\n break;\n }\n cursor = parent;\n }\n for (let index = parts.length - 1; index >= 0; index -= 1) {\n const nextDir = parts[index];\n if (nextDir === undefined) {\n continue;\n }\n if (!this.#dirs.has(nextDir)) {\n this.#dirs.set(nextDir, { mtimeMs: this.#nextMtime() });\n }\n }\n }\n\n #nextMtime(): number {\n this.#clock += 1;\n return this.#clock;\n }\n}\n\nexport function createNodeAgentFilesystem(): AgentFilesystem {\n return {\n readTextFile: async (filePath: string) => fs.readFile(filePath, \"utf8\"),\n writeTextFile: async (filePath: string, content: string) =>\n fs.writeFile(filePath, content, \"utf8\"),\n deleteFile: async (filePath: string) => fs.unlink(filePath),\n ensureDir: async (directoryPath: string) => {\n await fs.mkdir(directoryPath, { recursive: true });\n },\n readDir: async (directoryPath: string) => {\n const entries = await fs.readdir(directoryPath, { withFileTypes: true });\n const result: AgentDirectoryEntry[] = [];\n for (const entry of entries) {\n const entryPath = path.resolve(directoryPath, entry.name);\n const stats = await fs.lstat(entryPath);\n result.push({\n name: entry.name,\n path: entryPath,\n kind: statsToKind(stats),\n mtimeMs: stats.mtimeMs,\n });\n }\n return result;\n },\n stat: async (entryPath: string) => {\n const stats = await fs.lstat(entryPath);\n return {\n kind: statsToKind(stats),\n mtimeMs: stats.mtimeMs,\n };\n },\n };\n}\n\nexport function createInMemoryAgentFilesystem(\n initialFiles: Record<string, string> = {},\n): InMemoryAgentFilesystem {\n return new InMemoryAgentFilesystem(initialFiles);\n}\n\nfunction statsToKind(stats: {\n isFile(): boolean;\n isDirectory(): boolean;\n isSymbolicLink(): boolean;\n}): AgentPathKind {\n if (stats.isSymbolicLink()) {\n return \"symlink\";\n }\n if (stats.isDirectory()) {\n return \"directory\";\n }\n if (stats.isFile()) {\n return \"file\";\n }\n return \"other\";\n}\n\nfunction createNoSuchFileError(syscall: string, filePath: string): NodeJS.ErrnoException {\n const error = new Error(\n `ENOENT: no such file or directory, ${syscall} '${filePath}'`,\n ) as NodeJS.ErrnoException;\n error.code = \"ENOENT\";\n error.syscall = syscall;\n error.path = filePath;\n return error;\n}\n","import {\n runToolLoop,\n type LlmToolLoopRequest,\n type LlmToolLoopResult,\n type LlmToolSet,\n} from \"./llm.js\";\nimport {\n createFilesystemToolSetForModel,\n type AgentFilesystemToolProfile,\n type AgentFilesystemToolsOptions,\n} from \"./tools/filesystemTools.js\";\n\nexport type AgentFilesystemToolConfig = {\n readonly enabled?: boolean;\n readonly profile?: AgentFilesystemToolProfile;\n readonly options?: AgentFilesystemToolsOptions;\n};\n\nexport type AgentFilesystemToolSelection =\n | boolean\n | AgentFilesystemToolProfile\n | AgentFilesystemToolConfig;\n\nexport type RunAgentLoopRequest = Omit<LlmToolLoopRequest, \"tools\"> & {\n readonly tools?: LlmToolSet;\n readonly filesystemTool?: AgentFilesystemToolSelection;\n readonly filesystem_tool?: AgentFilesystemToolSelection;\n};\n\nexport async function runAgentLoop(request: RunAgentLoopRequest): Promise<LlmToolLoopResult> {\n const { tools: customTools, filesystemTool, filesystem_tool, ...toolLoopRequest } = request;\n\n const filesystemSelection = filesystemTool ?? filesystem_tool;\n const filesystemTools = resolveFilesystemTools(request.model, filesystemSelection);\n const mergedTools = mergeToolSets(filesystemTools, customTools ?? {});\n\n if (Object.keys(mergedTools).length === 0) {\n throw new Error(\n \"runAgentLoop requires at least one tool. Provide `tools` or enable `filesystemTool`.\",\n );\n }\n\n return runToolLoop({\n ...toolLoopRequest,\n tools: mergedTools,\n });\n}\n\nfunction resolveFilesystemTools(\n model: string,\n selection: AgentFilesystemToolSelection | undefined,\n): LlmToolSet {\n if (selection === undefined || selection === false) {\n return {};\n }\n if (selection === true) {\n return createFilesystemToolSetForModel(model, \"auto\");\n }\n if (typeof selection === \"string\") {\n return createFilesystemToolSetForModel(model, selection);\n }\n if (selection.enabled === false) {\n return {};\n }\n if (selection.options && selection.profile !== undefined) {\n return createFilesystemToolSetForModel(model, selection.profile, selection.options);\n }\n if (selection.options) {\n return createFilesystemToolSetForModel(model, selection.options);\n }\n return createFilesystemToolSetForModel(model, selection.profile ?? \"auto\");\n}\n\nfunction mergeToolSets(base: LlmToolSet, extra: LlmToolSet): LlmToolSet {\n const merged: LlmToolSet = { ...base };\n for (const [toolName, toolSpec] of Object.entries(extra)) {\n if (Object.hasOwn(merged, toolName)) {\n throw new Error(\n `Duplicate tool name \"${toolName}\" in runAgentLoop. Rename the custom tool or disable that filesystem tool.`,\n );\n }\n merged[toolName] = toolSpec;\n }\n return merged;\n}\n"],"mappings":"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","names":["Buffer","z","os","Buffer","fs","path","Buffer","path","fs","body","os","z","z","scheduler","OpenAI","Agent","undiciFetch","cachedApiKey","cachedClient","cachedFetch","cachedTimeoutMs","Agent","undiciFetch","OpenAI","scheduler","Buffer","tool","path","text","content","result","z","path","z","path","z","fs","path","z","path","absolutePath","z","resolvedProfile","path","runAccessHook","toDisplayPath","end","isPathInsideCwd"]}
|