@codeworksh/aikit 0.3.0 → 0.3.1

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/index.mjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":["partialParse","anthropicProvider"],"sources":["../../src/provider/provider.ts","../../src/model/catalog.ts","../../src/model/model.ts","../../src/provider/stream.ts","../../src/utils/eventstream.ts","../../src/utils/validation.ts","../../src/agent/loop.ts","../../src/agent.ts","../../src/message/message.ts","../../src/utils/jsonparse.ts","../../src/utils/sanitize.ts","../../src/provider/providers/anthropic/index.ts","../../src/provider/register.ts","../../src/agent/agent.ts","../../src/agent/codemode/codemode.ts","../../src/llm.ts","../../src/stream.ts"],"sourcesContent":["import { type Static, Type } from \"@sinclair/typebox\";\n\nexport namespace Provider {\n\texport const KnownProviderEnum = {\n\t\tanthropic: \"anthropic\",\n\t\topenai: \"openai\",\n\t} as const;\n\texport const KnownProviderSchema = Type.Union([\n\t\tType.Literal(KnownProviderEnum.anthropic),\n\t\tType.Literal(KnownProviderEnum.openai),\n\t]);\n\texport type KnownProvider = Static<typeof KnownProviderSchema>;\n\n\texport const Info = Type.Object({\n\t\tid: KnownProviderSchema,\n\t\tname: Type.String(),\n\t\tenv: Type.Array(Type.String()),\n\t\tkey: Type.Optional(Type.String()),\n\t\toptions: Type.Optional(Type.Record(Type.String(), Type.Any())),\n\t});\n\texport type Info = Static<typeof Info>;\n\n\texport const ReasoningEffortMapSchema = Type.Object({\n\t\tminimal: Type.Optional(Type.String()),\n\t\tlow: Type.Optional(Type.String()),\n\t\tmedium: Type.Optional(Type.String()),\n\t\thigh: Type.Optional(Type.String()),\n\t\txhigh: Type.Optional(Type.String()),\n\t});\n\texport type ReasoningEffortMap = Static<typeof ReasoningEffortMapSchema>;\n\n\texport const OpenRouterRoutingSchema = Type.Object({\n\t\tonly: Type.Optional(Type.Array(Type.String())),\n\t\torder: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type OpenRouterRouting = Static<typeof OpenRouterRoutingSchema>;\n\n\texport const VercelGatewayRoutingSchema = Type.Object({\n\t\tonly: Type.Optional(Type.Array(Type.String())),\n\t\torder: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type VercelGatewayRouting = Static<typeof VercelGatewayRoutingSchema>;\n}\n","import { Filesystem, lazy } from \"@codeworksh/utils\";\n\nexport namespace ModelCatalog {\n\t// Doesn't represent the full spec from models.dev.\n\t// Represents the provider entry on a best-effort basis.\n\texport interface ModelsDevModel {\n\t\tid: string;\n\t\tname: string;\n\t\tfamily: string;\n\t\tattachment: boolean;\n\t\treasoning?: boolean;\n\t\ttool_call?: boolean;\n\t\ttemperature?: boolean;\n\t\tknowledge?: string | boolean;\n\t\trelease_date: string;\n\t\tlast_updated: string;\n\t\tmodalities: {\n\t\t\tinput?: string[];\n\t\t\toutput: string[];\n\t\t};\n\t\topen_weights: boolean;\n\t\tbaseUrl?: string;\n\t\theaders?: Record<string, string>;\n\t\tcost?: {\n\t\t\tinput?: number;\n\t\t\toutput?: number;\n\t\t\tcache_read?: number;\n\t\t\tcache_write?: number;\n\t\t};\n\t\tlimit?: {\n\t\t\tcontext?: number;\n\t\t\toutput?: number;\n\t\t};\n\t}\n\n\texport interface ModelsDevProvider {\n\t\tid: string;\n\t\tenv: string[];\n\t\tnpm?: string;\n\t\tapi: string;\n\t\tbaseUrl?: string;\n\t\tname: string;\n\t\tdoc?: string;\n\t\tkey?: string;\n\t\theaders?: Record<string, string>;\n\t\tmodels: Record<string, ModelsDevModel>;\n\t}\n\texport type ModelsDevCatalog = Record<string, ModelsDevProvider>;\n\ttype LazyModelsDevCatalog = ReturnType<typeof lazy<Promise<ModelsDevCatalog>>>;\n\n\tfunction modelsDevURL(): string {\n\t\treturn process.env.OPENCODE_MODELS_URL || \"https://models.dev\";\n\t}\n\n\tfunction modelsDevPath(): string | undefined {\n\t\treturn process.env.CODEWORK_AIKIT_MODELS_PATH;\n\t}\n\n\texport const modelsDevData: LazyModelsDevCatalog = lazy(async () => {\n\t\tconst path = modelsDevPath();\n\t\tif (path) {\n\t\t\tconst result = await Filesystem.readJson<ModelsDevCatalog>(path).catch(() => undefined);\n\t\t\tif (result) return result;\n\t\t}\n\n\t\tconst json = await fetch(`${modelsDevURL()}/api.json`).then((x) => x.text());\n\t\treturn JSON.parse(json) as ModelsDevCatalog;\n\t});\n\n\texport async function get(): Promise<ModelsDevCatalog> {\n\t\treturn modelsDevData();\n\t}\n\n\texport async function refresh(): Promise<void> {\n\t\tconst result = await fetch(`${modelsDevURL()}/api.json`, {\n\t\t\tsignal: AbortSignal.timeout(10 * 1000),\n\t\t}).catch(() => undefined);\n\t\tif (!result?.ok) return;\n\n\t\tconst json = await result.text();\n\t\tconst path = modelsDevPath();\n\t\tif (path) {\n\t\t\tawait Filesystem.write(path, json);\n\t\t}\n\t\tmodelsDevData.reset();\n\t}\n\n\tvoid ModelCatalog.refresh();\n\tsetInterval(\n\t\tasync () => {\n\t\t\tawait ModelCatalog.refresh();\n\t\t},\n\t\t60 * 1000 * 60,\n\t).unref();\n}\n","import { lazy } from \"@codeworksh/utils\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { keys, mapValues, pick, pipe } from \"remeda\";\nimport { Provider } from \"../provider/provider\";\nimport { ModelCatalog } from \"./catalog\";\n\nexport namespace Model {\n\texport const KnownProtocolEnum = {\n\t\tanthropicMessages: \"anthropic-messages\",\n\t\topenaiCompletions: \"openai-completions\",\n\t\topenaiResponses: \"openai-responses\",\n\t} as const;\n\texport const KnownProtocolSchema = Type.Union([\n\t\tType.Literal(KnownProtocolEnum.anthropicMessages),\n\t\tType.Literal(KnownProtocolEnum.openaiCompletions),\n\t\tType.Literal(KnownProtocolEnum.openaiResponses),\n\t]);\n\texport type KnownProtocol = Static<typeof KnownProtocolSchema>;\n\n\tconst InputSchema = Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]));\n\tconst CostSchema = Type.Object({\n\t\tinput: Type.Number(),\n\t\toutput: Type.Number(),\n\t\tcacheRead: Type.Number(),\n\t\tcacheWrite: Type.Number(),\n\t});\n\tconst HeadersSchema = Type.Optional(Type.Record(Type.String(), Type.String()));\n\texport const BaseSchema = Type.Object({\n\t\tid: Type.String(),\n\t\tname: Type.String(),\n\t\tprovider: Provider.Info,\n\t\tbaseUrl: Type.String(),\n\t\treasoning: Type.Boolean(),\n\t\tinput: InputSchema,\n\t\tcost: CostSchema,\n\t\tcontextWindow: Type.Number(),\n\t\tmaxTokens: Type.Number(),\n\t\theaders: HeadersSchema,\n\t});\n\n\texport const OpenAICompletionsCompatSchema = Type.Object({\n\t\tsupportsStore: Type.Optional(Type.Boolean()),\n\t\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\t\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\t\treasoningEffortMap: Type.Optional(Provider.ReasoningEffortMapSchema),\n\t\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\t\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\t\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\t\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\t\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\t\tthinkingFormat: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Literal(\"openai\"),\n\t\t\t\tType.Literal(\"openrouter\"),\n\t\t\t\tType.Literal(\"zai\"),\n\t\t\t\tType.Literal(\"qwen\"),\n\t\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\t]),\n\t\t),\n\t\topenRouterRouting: Type.Optional(Provider.OpenRouterRoutingSchema),\n\t\tvercelGatewayRouting: Type.Optional(Provider.VercelGatewayRoutingSchema),\n\t\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\t});\n\texport type OpenAICompletionsCompat = Static<typeof OpenAICompletionsCompatSchema>;\n\n\texport const OpenAIResponsesCompatSchema = Type.Object({});\n\texport type OpenAIResponsesCompat = Static<typeof OpenAIResponsesCompatSchema>;\n\n\texport const OpenAICompatSchema = Type.Union([OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema]);\n\n\texport const AnthropicSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.anthropicMessages),\n\t\t}),\n\t]);\n\n\texport const OpenAICompletionsSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.openaiCompletions),\n\t\t\tcompat: Type.Optional(OpenAICompletionsCompatSchema),\n\t\t}),\n\t]);\n\texport const OpenAIResponsesSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.openaiResponses),\n\t\t\tcompat: Type.Optional(OpenAIResponsesCompatSchema),\n\t\t}),\n\t]);\n\n\texport const Schema = Type.Union([AnthropicSchema, OpenAICompletionsSchema, OpenAIResponsesSchema]);\n\texport type Value = Static<typeof Schema>;\n\texport type TModel<TProtocol extends KnownProtocol> = Extract<Value, { protocol: TProtocol }>;\n\tconst BUILTINS = keys(Provider.KnownProviderEnum) as Provider.KnownProvider[];\n\n\texport function calculateCost(\n\t\tmodel: Value,\n\t\tusage: {\n\t\t\tinput: number;\n\t\t\toutput: number;\n\t\t\tcacheRead: number;\n\t\t\tcacheWrite: number;\n\t\t\tcost: {\n\t\t\t\tinput: number;\n\t\t\t\toutput: number;\n\t\t\t\tcacheRead: number;\n\t\t\t\tcacheWrite: number;\n\t\t\t\ttotal: number;\n\t\t\t};\n\t\t},\n\t): void {\n\t\tusage.cost.input = (usage.input / 1_000_000) * model.cost.input;\n\t\tusage.cost.output = (usage.output / 1_000_000) * model.cost.output;\n\t\tusage.cost.cacheRead = (usage.cacheRead / 1_000_000) * model.cost.cacheRead;\n\t\tusage.cost.cacheWrite = (usage.cacheWrite / 1_000_000) * model.cost.cacheWrite;\n\t\tusage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n\t}\n\n\texport type BuiltInModels = Partial<Record<Provider.KnownProvider, Record<string, Value>>>;\n\n\tfunction resolveProtocol(providerId: Provider.KnownProvider): KnownProtocol {\n\t\tswitch (providerId) {\n\t\t\tcase Provider.KnownProviderEnum.anthropic:\n\t\t\t\treturn KnownProtocolEnum.anthropicMessages;\n\t\t\tcase Provider.KnownProviderEnum.openai:\n\t\t\t\treturn KnownProtocolEnum.openaiResponses;\n\t\t}\n\t}\n\n\tfunction normalizeInput(input?: string[]): Array<\"text\" | \"image\"> {\n\t\tconst normalized = new Set<\"text\" | \"image\">();\n\t\tfor (const modality of input ?? [\"text\"]) {\n\t\t\tif (modality === \"text\" || modality === \"image\") {\n\t\t\t\tnormalized.add(modality);\n\t\t\t}\n\t\t}\n\t\tif (normalized.size === 0) normalized.add(\"text\");\n\t\treturn [...normalized];\n\t}\n\n\tfunction toProviderInfo(\n\t\tproviderId: Provider.KnownProvider,\n\t\tprovider: ModelCatalog.ModelsDevProvider,\n\t): Provider.Info {\n\t\treturn {\n\t\t\tid: providerId,\n\t\t\tname: provider.name,\n\t\t\tenv: provider.env,\n\t\t\tkey: provider.key,\n\t\t\toptions: provider.headers,\n\t\t};\n\t}\n\n\tfunction toModelValue(\n\t\tproviderId: Provider.KnownProvider,\n\t\tprovider: ModelCatalog.ModelsDevProvider,\n\t\tmodel: ModelCatalog.ModelsDevModel,\n\t): Value {\n\t\tconst baseUrl = model.baseUrl ?? provider.baseUrl ?? provider.api;\n\t\tconst normalized: Value = {\n\t\t\tid: model.id,\n\t\t\tname: model.name,\n\t\t\tprovider: toProviderInfo(providerId, provider),\n\t\t\tbaseUrl,\n\t\t\treasoning: Boolean(model.reasoning),\n\t\t\tinput: normalizeInput(model.modalities.input),\n\t\t\tcost: {\n\t\t\t\tinput: model.cost?.input ?? 0,\n\t\t\t\toutput: model.cost?.output ?? 0,\n\t\t\t\tcacheRead: model.cost?.cache_read ?? 0,\n\t\t\t\tcacheWrite: model.cost?.cache_write ?? 0,\n\t\t\t},\n\t\t\tcontextWindow: model.limit?.context ?? 0,\n\t\t\tmaxTokens: model.limit?.output ?? 0,\n\t\t\theaders: model.headers ?? provider.headers,\n\t\t\tprotocol: resolveProtocol(providerId),\n\t\t};\n\t\treturn normalized;\n\t}\n\n\texport async function getBuiltInModels(): Promise<BuiltInModels> {\n\t\tconst catalog = await ModelCatalog.get();\n\t\treturn pipe(\n\t\t\tcatalog,\n\t\t\tpick(BUILTINS),\n\t\t\tmapValues((provider, providerId) =>\n\t\t\t\tmapValues(provider.models, (model) => toModelValue(providerId as Provider.KnownProvider, provider, model)),\n\t\t\t),\n\t\t) as BuiltInModels;\n\t}\n\n\texport const registry = lazy(async () => {\n\t\tconst registry: Map<Provider.KnownProvider, Map<string, Value>> = new Map();\n\t\tconst models = await getBuiltInModels();\n\t\tfor (const [provider, value] of Object.entries(models) as Array<\n\t\t\t[Provider.KnownProvider, Record<string, Value>]\n\t\t>) {\n\t\t\tconst providerModels = new Map<string, Value>();\n\t\t\tfor (const [id, model] of Object.entries(value)) {\n\t\t\t\tproviderModels.set(id, model);\n\t\t\t}\n\t\t\tregistry.set(provider, providerModels);\n\t\t}\n\t\treturn registry;\n\t});\n\n\texport async function getModel<TProvider extends Provider.KnownProvider, TModel extends Value[\"id\"]>(\n\t\tprovider: TProvider,\n\t\tmodel: TModel,\n\t) {\n\t\tconst data = await registry();\n\t\tconst providerModels = data.get(provider);\n\t\treturn providerModels?.get(model);\n\t}\n\n\texport async function getProviders(): Promise<Provider.KnownProvider[]> {\n\t\tconst data = await registry();\n\t\treturn Array.from(data.keys());\n\t}\n\n\texport async function getModels<TProvider extends Provider.KnownProvider>(provider: TProvider): Promise<Value[]> {\n\t\tconst data = await registry();\n\t\tconst models = data.get(provider);\n\t\treturn models ? Array.from(models.values()) : [];\n\t}\n\n\tfunction isGpt5OrLater(modelID: string): boolean {\n\t\tconst match = /^gpt-(\\d+)/.exec(modelID);\n\t\tif (!match) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Number(match[1]) >= 5;\n\t}\n\n\t/**\n\t * Check if a model supports xhigh thinking level.\n\t * Currently only certain OpenAI Codex models support this.\n\t */\n\texport function supportsXhigh(model: Value): boolean {\n\t\treturn isGpt5OrLater(model.id);\n\t}\n\n\t/**\n\t * Check if two models are equal by comparing both their id and provider id.\n\t * Returns false if either model is null or undefined.\n\t */\n\texport function modelsAreEqual(a: Value | null | undefined, b: Value | null | undefined): boolean {\n\t\tif (!a || !b) return false;\n\t\treturn a.id === b.id && a.provider.id === b.provider.id;\n\t}\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport type { Message } from \"../message/message\";\nimport { Model } from \"../model/model\";\nimport type { AssistantMessageEventStream } from \"../utils/eventstream\";\n\nexport namespace Stream {\n\texport const ProtocolProviderNotFoundError = NamedError.create(\n\t\t\"ProtocolProviderNotFoundError\",\n\t\tType.Object({\n\t\t\tprotocol: Model.KnownProtocolSchema,\n\t\t}),\n\t);\n\texport type ProtocolProviderNotFoundError = InstanceType<typeof ProtocolProviderNotFoundError>;\n\n\texport const ProtocolMismatchError = NamedError.create(\n\t\t\"ProtocolMismatchError\",\n\t\tType.Object({\n\t\t\tactual: Model.KnownProtocolSchema,\n\t\t\texpected: Model.KnownProtocolSchema,\n\t\t}),\n\t);\n\texport type ProtocolMismatchError = InstanceType<typeof ProtocolMismatchError>;\n\n\texport const ThinkingLevelEnum = {\n\t\toff: \"off\",\n\t\tminimal: \"minimal\",\n\t\tlow: \"low\",\n\t\tmedium: \"medium\",\n\t\thigh: \"high\",\n\t\txhigh: \"xhigh\",\n\t} as const;\n\texport const ThinkingLevelSchema = Type.Union([\n\t\tType.Literal(ThinkingLevelEnum.off),\n\t\tType.Literal(ThinkingLevelEnum.minimal),\n\t\tType.Literal(ThinkingLevelEnum.low),\n\t\tType.Literal(ThinkingLevelEnum.medium),\n\t\tType.Literal(ThinkingLevelEnum.high),\n\t\tType.Literal(ThinkingLevelEnum.xhigh),\n\t]);\n\texport type ThinkingLevel = Static<typeof ThinkingLevelSchema>;\n\n\texport const ThinkingBudgetsSchema = Type.Object({\n\t\toff: Type.Optional(Type.Number()),\n\t\tminimal: Type.Optional(Type.Number()),\n\t\tlow: Type.Optional(Type.Number()),\n\t\tmedium: Type.Optional(Type.Number()),\n\t\thigh: Type.Optional(Type.Number()),\n\t});\n\texport type ThinkingBudgets = Static<typeof ThinkingBudgetsSchema>;\n\n\texport const CacheRetentionSchema = Type.Union([Type.Literal(\"none\"), Type.Literal(\"short\"), Type.Literal(\"long\")]);\n\texport type CacheRetention = Static<typeof CacheRetentionSchema>;\n\n\texport const TransportSchema = Type.Union([Type.Literal(\"sse\"), Type.Literal(\"websocket\"), Type.Literal(\"auto\")]);\n\texport type Transport = Static<typeof TransportSchema>;\n\n\texport const OptionsSchema = Type.Object({\n\t\ttemperature: Type.Optional(Type.Number()),\n\t\tmaxTokens: Type.Optional(Type.Number()),\n\t\tsignal: Type.Optional(Type.Unsafe<AbortSignal>()),\n\t\tapiKey: Type.Optional(Type.String()),\n\t\ttransport: Type.Optional(TransportSchema),\n\t\tcacheRetention: Type.Optional(CacheRetentionSchema),\n\t\tsessionId: Type.Optional(Type.String()),\n\t\tonPayload: Type.Optional(Type.Unsafe<(payload: unknown, model: Model.TModel<Model.KnownProtocol>) => unknown>()),\n\t\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tmaxRetryDelayMs: Type.Optional(Type.Number()),\n\t\tmetadata: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\t});\n\texport type Options = Static<typeof OptionsSchema>;\n\texport type ProviderOptions = Options & Record<string, unknown>;\n\n\texport const SimpleOptionsSchema = Type.Composite([\n\t\tOptionsSchema,\n\t\tType.Object({\n\t\t\treasoning: Type.Optional(ThinkingLevelSchema),\n\t\t\tthinkingBudgets: Type.Optional(ThinkingBudgetsSchema),\n\t\t}),\n\t]);\n\texport type SimpleOptions = Static<typeof SimpleOptionsSchema>;\n\n\t// Contract:\n\t// - Must return an AssistantMessageEventStream.\n\t// - Once invoked, request/model/runtime failures should be encoded in the\n\t// returned stream, not thrown.\n\t// - Error termination must produce an AssistantMessage with stopReason\n\t// \"error\" or \"aborted\" and errorMessage, emitted via the stream protocol.\n\texport type StreamFunction<\n\t\tTProtocol extends Model.KnownProtocol = Model.KnownProtocol,\n\t\tTOptions extends Options = Options,\n\t> = (model: Model.TModel<TProtocol>, context: Message.Context, options?: TOptions) => AssistantMessageEventStream;\n\n\texport function buildBaseOptions(model: Model.Value, options?: SimpleOptions, apiKey?: string): Options {\n\t\treturn {\n\t\t\ttemperature: options?.temperature,\n\t\t\tmaxTokens: options?.maxTokens || Math.min(model.maxTokens, 32000),\n\t\t\tsignal: options?.signal,\n\t\t\tapiKey: apiKey || options?.apiKey,\n\t\t\ttransport: options?.transport,\n\t\t\tcacheRetention: options?.cacheRetention,\n\t\t\tsessionId: options?.sessionId,\n\t\t\theaders: options?.headers,\n\t\t\tonPayload: options?.onPayload,\n\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\tmetadata: options?.metadata,\n\t\t};\n\t}\n\n\texport function clampReasoning(effort: ThinkingLevel | undefined): Exclude<ThinkingLevel, \"xhigh\"> | undefined {\n\t\treturn effort === ThinkingLevelEnum.xhigh ? ThinkingLevelEnum.high : effort;\n\t}\n\n\texport function adjustMaxTokensForThinking(\n\t\tbaseMaxTokens: number,\n\t\tmodelMaxTokens: number,\n\t\treasoningLevel: ThinkingLevel,\n\t\tcustomBudgets?: ThinkingBudgets,\n\t): { maxTokens: number; thinkingBudget: number } {\n\t\tconst defaultBudgets: ThinkingBudgets = {\n\t\t\tminimal: 1024,\n\t\t\tlow: 2048,\n\t\t\tmedium: 8192,\n\t\t\thigh: 16384,\n\t\t};\n\t\tconst budgets = { ...defaultBudgets, ...customBudgets };\n\t\tconst minOutputTokens = 1024;\n\t\tconst level = clampReasoning(reasoningLevel)!;\n\t\tlet thinkingBudget = budgets[level]!;\n\t\tconst maxTokens = Math.min(baseMaxTokens + thinkingBudget, modelMaxTokens);\n\n\t\tif (maxTokens <= thinkingBudget) {\n\t\t\tthinkingBudget = Math.max(0, maxTokens - minOutputTokens);\n\t\t}\n\n\t\treturn { maxTokens, thinkingBudget };\n\t}\n\n\texport type ProtocolStreamFunction = (\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: Options,\n\t) => AssistantMessageEventStream;\n\n\texport type ProtocolStreamSimpleFunction = (\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t) => AssistantMessageEventStream;\n\n\texport interface ProtocolProvider<\n\t\tTProtocol extends Model.KnownProtocol = Model.KnownProtocol,\n\t\tTOptions extends Options = Options,\n\t> {\n\t\tprotocol: TProtocol;\n\t\tstream: StreamFunction<TProtocol, TOptions>;\n\t\tstreamSimple: StreamFunction<TProtocol, SimpleOptions>;\n\t}\n\n\ttype RegisteredProtocolProvider = {\n\t\tprovider: ProtocolProvider<Model.KnownProtocol, Options>;\n\t\tsourceId?: string;\n\t};\n\n\tconst protocolProviderRegistry = new Map<Model.KnownProtocol, RegisteredProtocolProvider>();\n\n\tfunction wrapStream<TProtocol extends Model.KnownProtocol, TOptions extends Options>(\n\t\tprotocol: TProtocol,\n\t\tstream: StreamFunction<TProtocol, TOptions>,\n\t): ProtocolStreamFunction {\n\t\treturn (model, context, options) => {\n\t\t\tif (model.protocol !== protocol) {\n\t\t\t\tthrow new ProtocolMismatchError({\n\t\t\t\t\tactual: model.protocol,\n\t\t\t\t\texpected: protocol,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn stream(model as Model.TModel<TProtocol>, context, options as TOptions);\n\t\t};\n\t}\n\n\tfunction wrapStreamSimple<TProtocol extends Model.KnownProtocol>(\n\t\tprotocol: TProtocol,\n\t\tstreamSimple: StreamFunction<TProtocol, SimpleOptions>,\n\t): ProtocolStreamSimpleFunction {\n\t\treturn (model, context, options) => {\n\t\t\tif (model.protocol !== protocol) {\n\t\t\t\tthrow new ProtocolMismatchError({\n\t\t\t\t\tactual: model.protocol,\n\t\t\t\t\texpected: protocol,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn streamSimple(model as Model.TModel<TProtocol>, context, options);\n\t\t};\n\t}\n\n\texport function registerProtocolProvider<TProtocol extends Model.KnownProtocol, TOptions extends Options>(\n\t\tprovider: ProtocolProvider<TProtocol, TOptions>,\n\t\tsourceId?: string,\n\t): void {\n\t\tprotocolProviderRegistry.set(provider.protocol, {\n\t\t\tprovider: {\n\t\t\t\tprotocol: provider.protocol,\n\t\t\t\tstream: wrapStream(provider.protocol, provider.stream),\n\t\t\t\tstreamSimple: wrapStreamSimple(provider.protocol, provider.streamSimple),\n\t\t\t},\n\t\t\tsourceId,\n\t\t});\n\t}\n\n\texport function getProtocolProvider(\n\t\tprotocol: Model.KnownProtocol,\n\t): ProtocolProvider<Model.KnownProtocol, Options> | undefined {\n\t\treturn protocolProviderRegistry.get(protocol)?.provider;\n\t}\n\n\texport function resolveProtocolProvider(model: Model.Value): ProtocolProvider<Model.KnownProtocol, Options> {\n\t\tconst provider = getProtocolProvider(model.protocol);\n\t\tif (!provider) {\n\t\t\tthrow new ProtocolProviderNotFoundError({\n\t\t\t\tprotocol: model.protocol,\n\t\t\t});\n\t\t}\n\t\treturn provider;\n\t}\n\n\texport function stream(\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: Options,\n\t): AssistantMessageEventStream {\n\t\tconst provider = resolveProtocolProvider(model);\n\t\treturn provider.stream(model, context, options);\n\t}\n\n\texport async function complete(\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: Options,\n\t): Promise<Message.AssistantMessage> {\n\t\tconst s = stream(model, context, options);\n\t\treturn s.result();\n\t}\n\n\texport function streamSimple(\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t): AssistantMessageEventStream {\n\t\tconst provider = resolveProtocolProvider(model);\n\t\treturn provider.streamSimple(model, context, options);\n\t}\n\n\texport async function completeSimple(\n\t\tmodel: Model.Value,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t): Promise<Message.AssistantMessage> {\n\t\tconst s = streamSimple(model, context, options);\n\t\treturn s.result();\n\t}\n\n\texport function getApiProviders(): ProtocolProvider<Model.KnownProtocol, Options>[] {\n\t\treturn Array.from(protocolProviderRegistry.values(), (entry) => entry.provider);\n\t}\n\n\texport function unregisterProtocolProviders(sourceId: string): void {\n\t\tfor (const [api, entry] of protocolProviderRegistry.entries()) {\n\t\t\tif (entry.sourceId === sourceId) {\n\t\t\t\tprotocolProviderRegistry.delete(api);\n\t\t\t}\n\t\t}\n\t}\n\n\texport function clearProtocolProviders(): void {\n\t\tprotocolProviderRegistry.clear();\n\t}\n}\n","/**\n * @description Defines the Generic event stream class for async iteration.\n */\n\nimport type { Event } from \"../event/event\";\nimport type { Message } from \"../message/message\";\n\n// Implements the async iterator pattern\n// LLM output are streams of events for consuming\n// This class helps with that by acting like buffer data structure to manage the streams\n// for producer and consumer\nexport class EventStream<T, R = T> implements AsyncIterable<T> {\n\tprivate queue: T[] = [];\n\tprivate waiting: ((value: IteratorResult<T>) => void)[] = [];\n\tprivate done = false;\n\tprivate readonly finalResultPromise: Promise<R>;\n\tprivate resolveFinalResult!: (result: R) => void;\n\n\tconstructor(\n\t\tprivate isComplete: (event: T) => boolean,\n\t\tprivate extractResult: (event: T) => R,\n\t) {\n\t\tthis.finalResultPromise = new Promise((resolve) => {\n\t\t\tthis.resolveFinalResult = resolve;\n\t\t});\n\t}\n\n\tpush(event: T): void {\n\t\tif (this.done) return;\n\n\t\tif (this.isComplete(event)) {\n\t\t\tthis.done = true;\n\t\t\tthis.resolveFinalResult(this.extractResult(event));\n\t\t}\n\n\t\t// Deliver to waiting consumer or queue it\n\t\tconst waiter = this.waiting.shift();\n\t\tif (waiter) {\n\t\t\twaiter({ value: event, done: false });\n\t\t} else {\n\t\t\tthis.queue.push(event);\n\t\t}\n\t}\n\n\tend(result?: R): void {\n\t\tthis.done = true;\n\t\tif (result !== undefined) {\n\t\t\tthis.resolveFinalResult(result);\n\t\t}\n\t\t// Notify all waiting consumers that we're done\n\t\twhile (this.waiting.length > 0) {\n\t\t\tconst waiter = this.waiting.shift()!;\n\t\t\twaiter({ value: undefined as any, done: true });\n\t\t}\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\twhile (true) {\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tyield this.queue.shift()!;\n\t\t\t} else if (this.done) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst result = await new Promise<IteratorResult<T>>((resolve) => this.waiting.push(resolve));\n\t\t\t\tif (result.done) return;\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tresult(): Promise<R> {\n\t\treturn this.finalResultPromise;\n\t}\n}\n\nexport class AssistantMessageEventStream extends EventStream<Event.LLMMessageEvent, Message.AssistantMessage> {\n\tconstructor() {\n\t\tsuper(\n\t\t\t(event) => event.type === \"done\" || event.type === \"error\",\n\t\t\t(event) => {\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\treturn event.message;\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Unexpected event type for final result\");\n\t\t\t},\n\t\t);\n\t}\n}\n\n/** Factory function for AssistantMessageEventStream (for use in extensions) */\nexport function createAssistantMessageEventStream(): AssistantMessageEventStream {\n\treturn new AssistantMessageEventStream();\n}\n","/**\n * @description Validation powered by ajv, TypeBox natively doesn't provide data validation.\n */\n\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport type { Agent } from \"../agent/agent\";\nimport type { Message } from \"../message/message\";\n\n// Create singleton AJV instance with formats\nconst ajv = new Ajv({\n\tallErrors: true,\n\tstrict: false,\n\tcoerceTypes: true,\n});\naddFormats(ajv);\n\n/**\n * Validates an arbitrary value against a TypeBox schema and returns the coerced value.\n */\nexport function validateSchema<T extends TSchema>(schema: T, value: unknown, label: string): Static<T> {\n\tconst validate = ajv.compile(schema);\n\tconst input = structuredClone(value);\n\n\tif (validate(input)) {\n\t\treturn input as Static<T>;\n\t}\n\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params?.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown Validation Error\";\n\n\tthrow new Error(\n\t\t[`Validation Failed For ${label}`, `${errors}\\n`, \"Received Value:\", `${JSON.stringify(value, null, 2)}\\n`].join(\n\t\t\t\"\\n\",\n\t\t),\n\t);\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n */\nexport function validateToolCall<T extends Message.Tool>(\n\ttools: T[],\n\ttoolExecution: Agent.ToolCallInFlight,\n): Message.ToolArguments<T> {\n\tconst tool = tools.find((t) => t.name === toolExecution.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolExecution.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolExecution);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n */\nexport function validateToolArguments<T extends Message.Tool>(\n\ttool: T,\n\ttoolExecution: Agent.ToolCallInFlight,\n): Message.ToolArguments<T> {\n\treturn validateSchema(\n\t\ttool.parameters,\n\t\ttoolExecution.rawArgs,\n\t\t`Tool \"${toolExecution.name}\"`,\n\t) as Message.ToolArguments<T>;\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type TSchema, Type } from \"@sinclair/typebox\";\nimport type { Event } from \"../event/event\";\nimport type { Message } from \"../message/message\";\nimport type { Model } from \"../model/model\";\nimport type { Provider } from \"../provider/provider\";\nimport { Stream } from \"../provider/stream\";\nimport { EventStream } from \"../utils/eventstream\";\nimport { validateToolArguments } from \"../utils/validation\";\nimport type { Agent } from \"./agent\";\n\nexport namespace Loop {\n\t/** Stream function used by the core agent loop\n\t *\n\t * Contract:\n\t * - Must not throw or return a rejected promise for request/model/runtime (LLM) failures.\n\t * - Must return an AssistantMessageEventStream see: packages/aikit/src/utils/eventstream.ts\n\t * - Failures must be encoded in the returned stream via protocol events and a\n\t * final Message.AssistantMessage with stopReason \"error\" or \"aborted\" and errorMessage.\n\t */\n\texport type StreamFn = (\n\t\t...args: Parameters<typeof Stream.streamSimple>\n\t) => ReturnType<typeof Stream.streamSimple> | Promise<ReturnType<typeof Stream.streamSimple>>;\n\n\t/**\n\t * Configuration for how tool calls from a single assistant message are executed.\n\t *\n\t * - \"sequential\": each tool call is prepared, executed, and finalized before the next one starts.\n\t * - \"parallel\": tool calls are prepared sequentially, then allowed tools execute concurrently.\n\t * Final tool results are still emitted in assistant source order.\n\t */\n\texport type ToolExecutionMode = \"sequential\" | \"parallel\";\n\n\t/** Context passed to `beforeToolExecution`. */\n\texport interface BeforeToolExecutionContext {\n\t\t/** The current context at the time the tool call is prepared */\n\t\tcontext: Agent.AgentContext;\n\t\t/** The assistant message that requested the tool call. */\n\t\tassistantMessage: Message.AssistantMessage;\n\t\t/** The validated in-flight tool call with validated arguments */\n\t\ttoolCall: Agent.ToolCallInFlight;\n\t}\n\n\t/** Context passed to `afterToolExecution`. */\n\texport interface AfterToolExecutionContext {\n\t\t/** Current agent context at the time the tool call is finalized. */\n\t\tcontext: Agent.AgentContext;\n\t\t/** The assistant message that requested the tool call. */\n\t\tassistantMessage: Message.AssistantMessage;\n\t\t/** The validated in-flight tool call with validated arguments */\n\t\ttoolCall: Agent.ToolCallInFlight;\n\t\t/** The executed tool result before any `afterToolExecution` overrides are applied. */\n\t\tresult: Agent.ToolTerminalResult<unknown>;\n\t}\n\n\t/**\n\t * Result returned from `beforeToolExecution`.\n\t *\n\t * Returning `{ block: true }` prevents the tool from executing. The loop emits an error tool result instead.\n\t * `reason` becomes the text shown in that error result. If omitted, a default blocked message is used.\n\t */\n\texport interface BeforeToolCallResult {\n\t\tblock?: boolean;\n\t\treason?: string;\n\t\tdetails?: unknown;\n\t}\n\n\t/** Configuration for the agent loop. */\n\texport interface Config extends Stream.SimpleOptions {\n\t\tmodel: Model.Value;\n\t\tconvertToLlm: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\t/**\n\t\t * Optional transform applied to the context before `convertToLlm`.\n\t\t *\n\t\t * Use this for operations that work at the AgentMessage level:\n\t\t * - Context window management (pruning old messages)\n\t\t * - Injecting context from external sources\n\t\t *\n\t\t * @example\n\t\t * ```typescript\n\t\t * transformContext: async (messages) => {\n\t\t * if (estimateTokens(messages) > MAX_TOKENS) {\n\t\t * return pruneOldMessages(messages);\n\t\t * }\n\t\t * return messages;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttransformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\t\t/**\n\t\t * Resolves an API key dynamically for each LLM call.\n\t\t *\n\t\t * Useful for short-lived OAuth tokens (e.g., GitHub Copilot) that may expire\n\t\t * during long-running tool execution phases.\n\t\t */\n\t\tgetApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\t\t/**\n\t\t * Returns steering messages to inject into the conversation mid-run.\n\t\t *\n\t\t * Called after each tool execution to check for user interruptions.\n\t\t * If messages are returned, remaining tool calls are skipped and\n\t\t * these messages are added to the context before the next LLM call.\n\t\t *\n\t\t * Use this for \"steering\" the agent while it's working.\n\t\t */\n\t\tgetSteeringMessages?: () => Promise<Message.UserMessage[]>;\n\t\t/**\n\t\t * Returns follow-up messages to process after the agent would otherwise stop.\n\t\t *\n\t\t * Called when the agent has no more tool calls and no steering messages.\n\t\t * If messages are returned, they're added to the context and the agent\n\t\t * continues with another turn.\n\t\t *\n\t\t * Use this for follow-up messages that should wait until the agent finishes.\n\t\t */\n\t\tgetFollowUpMessages?: () => Promise<Message.UserMessage[]>;\n\n\t\t/**\n\t\t * Tool execution mode.\n\t\t * - \"sequential\": execute tool calls one by one\n\t\t * - \"parallel\": preflight tool calls sequentially, then execute allowed tools concurrently\n\t\t *\n\t\t * Default: \"parallel\"\n\t\t */\n\t\ttoolExecution?: ToolExecutionMode;\n\n\t\t/**\n\t\t * Called before a tool is executed, after arguments have been validated.\n\t\t *\n\t\t * Return `{ block: true }` to prevent execution. The loop emits an error tool result instead.\n\t\t * The hook receives the agent abort signal and is responsible for honoring it.\n\t\t */\n\t\tbeforeToolExecution?: (\n\t\t\tcontext: BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<BeforeToolCallResult | undefined>;\n\n\t\t/**\n\t\t * Called after a tool finishes executing, before final tool events are emitted.\n\t\t *\n\t\t * Any omitted fields keep their original values. No deep merge is performed.\n\t\t * The hook receives the agent abort signal and is responsible for honoring it.\n\t\t */\n\t\tafterToolExecution?: (\n\t\t\tcontext: AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\t}\n\n\tfunction createAgentStream(): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\treturn new EventStream<Event.AgentEvent, Message.Message[]>(\n\t\t\t(event: Event.AgentEvent) => event.type === \"agent.end\",\n\t\t\t(event: Event.AgentEvent) => (event.type === \"agent.end\" ? event.messages : []),\n\t\t);\n\t}\n\n\ttype AgentEventSink = (event: Event.AgentEvent) => Promise<void> | void;\n\n\ttype AssistantPart = Message.AssistantMessage[\"parts\"][number];\n\n\ttype ToolCallPart = Message.ToolCallPendingPart & { partIndex: number }; // runtime toolcall pending part\n\n\ttype RuntimeAgentTool = {\n\t\tname: string;\n\t\tparameters: TSchema;\n\t\texecute: (\n\t\t\tcallID: string,\n\t\t\tparams: unknown,\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?: Agent.ToolUpdateCallback<unknown>,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown>>;\n\t};\n\n\ttype ToolCallPrepared =\n\t\t| {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\" | \"blocked\";\n\t\t\t\t\tmessage: string;\n\t\t\t\t\tdetails?: unknown;\n\t\t\t\t};\n\t\t\t\trunnable: Agent.ToolCallInFlight;\n\t\t }\n\t\t| {\n\t\t\t\terror?: never;\n\t\t\t\trunnable: Agent.ToolCallInFlight;\n\t\t\t\ttool: RuntimeAgentTool;\n\t\t };\n\n\ttype ToolCallRunnable = {\n\t\ttoolCall: ToolCallPart;\n\t\trunnable: Agent.ToolCallInFlight;\n\t\ttool: RuntimeAgentTool;\n\t};\n\n\ttype ToolCallExecutionResult =\n\t\t| { result: Agent.ToolTerminalResult<unknown>; error?: never }\n\t\t| { result?: never; error: { message: string; details?: unknown } };\n\n\texport const AgentContextError = NamedError.create(\n\t\t\"AgentContextError\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\texport type AgentContextError = InstanceType<typeof AgentContextError>;\n\n\tfunction snapshotAssistantMessage(message: Message.AssistantMessage): Message.AssistantMessage {\n\t\treturn structuredClone(message);\n\t}\n\n\tfunction snapshotAssistantPartEvent(\n\t\tmessage: Message.AssistantMessage,\n\t\tpartIndex: number,\n\t): { message: Message.AssistantMessage; part: AssistantPart } {\n\t\tconst snapshot = snapshotAssistantMessage(message);\n\t\tconst part = snapshot.parts[partIndex];\n\t\tif (!part) {\n\t\t\tthrow new Error(`Assistant message part at index ${partIndex} was not found`);\n\t\t}\n\t\treturn { message: snapshot, part };\n\t}\n\n\tasync function emitEvent(emit: AgentEventSink, event: Event.AgentEvent): Promise<void> {\n\t\tawait emit(event);\n\t}\n\n\tasync function streamAssistantResponse(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): Promise<Message.AssistantMessage> {\n\t\t// FIXME @sanchitrk:\n\t\t// Have something like a pipeline with Message.Message[] transformation\n\t\t// caller will inject transfomers[](async functions) that is then invoked in order\n\n\t\t// Apply context transform if configured (Message.Message[] → Message.Message[])\n\t\tlet messages = context.messages;\n\t\tif (config.transformContext) {\n\t\t\tmessages = await config.transformContext(messages, signal);\n\t\t}\n\n\t\t// Convert to LLM-compatible messages (Message.Message[] → Message.Message[])\n\t\tconst llmMessages = await config.convertToLlm(messages);\n\n\t\t// Build LLM context, subset of Agent.AgentContext\n\t\tconst llmContext: Agent.AgentContext = {\n\t\t\tsystemPrompt: context.systemPrompt,\n\t\t\tmessages: llmMessages,\n\t\t\ttools: context.tools,\n\t\t};\n\t\tconst streamFunction = streamFn || Stream.streamSimple;\n\t\t// Resolve API key (important for expiring tokens)\n\t\t// TODO @sanchitrk:\n\t\t// improve passing of credentials (key/oauth), provider also has resolve api key,\n\t\t// for now its dummy implementation.\n\t\tconst resolvedApiKey =\n\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\t\tconst events = await streamFunction(config.model, llmContext, {\n\t\t\t...config,\n\t\t\tapiKey: resolvedApiKey,\n\t\t\tsignal,\n\t\t});\n\n\t\tlet partialMessage: Message.AssistantMessage | null = null;\n\t\tlet started = false;\n\n\t\tconst ensureMessageStarted = async (message: Message.AssistantMessage): Promise<void> => {\n\t\t\tif (started) return;\n\t\t\tstarted = true;\n\t\t\tawait emitEvent(emit, { type: \"message.start\", message: snapshotAssistantMessage(message) });\n\t\t};\n\n\t\tconst emitMessageUpdate = async (message: Message.AssistantMessage): Promise<void> => {\n\t\t\tawait emitEvent(emit, { type: \"message.update\", message: snapshotAssistantMessage(message) });\n\t\t};\n\n\t\tconst emitPartStart = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.start\", partIndex, ...snapshot });\n\t\t};\n\n\t\tconst emitPartUpdate = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.update\", partIndex, ...snapshot, source: \"llm\" });\n\t\t};\n\n\t\tconst emitPartEnd = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.end\", partIndex, ...snapshot });\n\t\t};\n\n\t\t// NOTE: Do not mutate context directly\n\t\t// once all the events are done return message\n\t\t// mutate partialMessage and corresponding parts as required\n\t\t// return the final built message from llm events\n\t\tfor await (const event of events) {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"start\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.start\":\n\t\t\t\tcase \"thinking.start\":\n\t\t\t\tcase \"toolcall.start\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartStart(partialMessage, event.partIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.delta\":\n\t\t\t\tcase \"thinking.delta\":\n\t\t\t\tcase \"toolcall.delta\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartUpdate(partialMessage, event.partIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.end\":\n\t\t\t\tcase \"thinking.end\":\n\t\t\t\tcase \"toolcall.end\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartEnd(partialMessage, event.partIndex);\n\t\t\t\t\tawait emitMessageUpdate(partialMessage);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"done\": {\n\t\t\t\t\tawait ensureMessageStarted(event.message);\n\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(event.message) });\n\t\t\t\t\treturn event.message;\n\t\t\t\t}\n\t\t\t\tcase \"error\": {\n\t\t\t\t\tawait ensureMessageStarted(event.error);\n\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(event.error) });\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst finalMessage = await events.result();\n\t\tawait ensureMessageStarted(finalMessage);\n\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(finalMessage) });\n\t\treturn finalMessage;\n\t}\n\n\tasync function executeToolCalls(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tif (config.toolExecution === \"sequential\")\n\t\t\treturn executeToolCallsSequential(config, currentContext, message, toolCalls, emit, signal);\n\t\treturn executeToolCallsParallel(config, currentContext, message, toolCalls, emit, signal);\n\t}\n\n\tasync function executeToolCallsSequential(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tconst toolCallInFlight: Agent.ToolCallInFlight = {\n\t\t\t\tcallID: toolCall.callID,\n\t\t\t\tname: toolCall.name,\n\t\t\t\trawArgs: toolCall.arguments,\n\t\t\t};\n\t\t\tawait emitEvent(emit, {\n\t\t\t\ttype: \"tool.execution.start\",\n\t\t\t\t...toolCallInFlight,\n\t\t\t});\n\t\t\t//\n\t\t\t// Prepares the tool call for execution.\n\t\t\t// Invokes a pre-execution callback with the current context, allowing\n\t\t\t// the callback to either continue or block (short-circuiting the execution).\n\t\t\t// Mutates `message.parts` in-place to update the pending tool call with its result.\n\t\t\tconst prepared = await prepareToolCall(config, currentContext, message, toolCallInFlight, signal);\n\t\t\tif (prepared.error) {\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: prepared.error.message }],\n\t\t\t\t\t\tdetails: prepared.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, prepared.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\tconst runnable: ToolCallRunnable = {\n\t\t\t\t\ttoolCall,\n\t\t\t\t\trunnable: prepared.runnable,\n\t\t\t\t\ttool: prepared.tool,\n\t\t\t\t};\n\t\t\t\tconst executed = await executeRunnableToolCall(runnable, message, emit, signal);\n\t\t\t\tif (executed.error) {\n\t\t\t\t\t// tool call invocation failed with error\n\t\t\t\t\t// create tool error result\n\t\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: executed.error.message }],\n\t\t\t\t\t\t\tdetails: executed.error.details,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tawait emitToolCallTerminalResult(runnable.toolCall, runnable.runnable, message, emit, error);\n\t\t\t\t} else {\n\t\t\t\t\t// finalize results from tool invocation\n\t\t\t\t\t// invokes after tool exection callback\n\t\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcurrentContext,\n\t\t\t\t\t\trunnable.toolCall,\n\t\t\t\t\t\trunnable.runnable,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\temit,\n\t\t\t\t\t\texecuted.result,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function executeToolCallsParallel(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tconst runnables: ToolCallRunnable[] = [];\n\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tconst toolCallInFlight: Agent.ToolCallInFlight = {\n\t\t\t\tcallID: toolCall.callID,\n\t\t\t\tname: toolCall.name,\n\t\t\t\trawArgs: toolCall.arguments,\n\t\t\t};\n\t\t\tawait emitEvent(emit, {\n\t\t\t\ttype: \"tool.execution.start\",\n\t\t\t\t...toolCallInFlight,\n\t\t\t});\n\t\t\t//\n\t\t\t// Prepares the tool call for execution.\n\t\t\t// Invokes a pre-execution callback with the current context, allowing\n\t\t\t// the callback to either continue or block (short-circuiting the execution).\n\t\t\t// Mutates `message.parts` in-place to update the pending tool call with its result.\n\t\t\tconst prepared = await prepareToolCall(config, currentContext, message, toolCallInFlight, signal);\n\t\t\tif (prepared.error) {\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: prepared.error.message }],\n\t\t\t\t\t\tdetails: prepared.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, prepared.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\trunnables.push({\n\t\t\t\t\ttoolCall,\n\t\t\t\t\trunnable: prepared.runnable,\n\t\t\t\t\ttool: prepared.tool,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst runningExecutions = runnables.map((runnable) => ({\n\t\t\trunnable,\n\t\t\texecution: executeRunnableToolCall(runnable, message, emit, signal),\n\t\t}));\n\n\t\tfor (const running of runningExecutions) {\n\t\t\tconst executed = await running.execution;\n\t\t\tconst { runnable } = running;\n\t\t\tif (executed.error) {\n\t\t\t\t// tool call invocation failed with error\n\t\t\t\t// create tool error result\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: executed.error.message }],\n\t\t\t\t\t\tdetails: executed.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(runnable.toolCall, runnable.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\t// finalize results from tool invocation\n\t\t\t\t// invokes after tool exection callback\n\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\trunnable.toolCall,\n\t\t\t\t\trunnable.runnable,\n\t\t\t\t\tmessage,\n\t\t\t\t\temit,\n\t\t\t\t\texecuted.result,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function prepareToolCall(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tassistantMessage: Message.AssistantMessage,\n\t\ttoolCallInFlight: Agent.ToolCallInFlight,\n\t\tsignal?: AbortSignal,\n\t): Promise<ToolCallPrepared> {\n\t\tconst tool = currentContext.tools?.find((t) => t.name === toolCallInFlight.name);\n\t\tif (!tool) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\",\n\t\t\t\t\tmessage: `Tool ${toolCallInFlight.name} Not Found`,\n\t\t\t\t},\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\t//\n\t\t\t// first validate toolcall args, before invoking callback\n\t\t\t// appends validated args\n\t\t\ttoolCallInFlight.args = validateToolArguments(tool, toolCallInFlight);\n\t\t\tif (config.beforeToolExecution) {\n\t\t\t\tconst beforeResult = await config.beforeToolExecution(\n\t\t\t\t\t{\n\t\t\t\t\t\tcontext: currentContext,\n\t\t\t\t\t\tassistantMessage,\n\t\t\t\t\t\ttoolCall: toolCallInFlight,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tif (beforeResult?.block) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tkind: \"blocked\",\n\t\t\t\t\t\t\tmessage: beforeResult?.reason || \"Tool Execution was Blocked\",\n\t\t\t\t\t\t\tdetails: beforeResult?.details,\n\t\t\t\t\t\t},\n\t\t\t\t\t\trunnable: toolCallInFlight,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t\ttool: tool as RuntimeAgentTool,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t},\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function executeRunnableToolCall(\n\t\ttoolCallRunnable: ToolCallRunnable,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<ToolCallExecutionResult> {\n\t\tconst { toolCall, runnable, tool } = toolCallRunnable;\n\t\tconst { partIndex, ...pendingPart } = toolCall;\n\t\ttry {\n\t\t\tconst result = await tool.execute(runnable.callID, runnable.args, signal, async (result) => {\n\t\t\t\tconst runningResult: Agent.ToolRunningResult<unknown> = {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tpartial: result.partial,\n\t\t\t\t};\n\t\t\t\tconst toolExecutionUpdate: Event.ToolExecutionUpdate = {\n\t\t\t\t\ttype: \"tool.execution.update\",\n\t\t\t\t\t...runnable,\n\t\t\t\t\t...runningResult,\n\t\t\t\t};\n\t\t\t\tawait emitEvent(emit, { ...toolExecutionUpdate });\n\n\t\t\t\tconst runningPart: Message.ToolCallRunningPart = {\n\t\t\t\t\t...pendingPart,\n\t\t\t\t\t...runningResult,\n\t\t\t\t};\n\n\t\t\t\tmessage.parts[partIndex] = runningPart; // in-place mutate; add error part\n\n\t\t\t\tawait emitEvent(emit, {\n\t\t\t\t\ttype: \"message.part.update\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tpartIndex,\n\t\t\t\t\tpart: runningPart,\n\t\t\t\t\tsource: \"tool\",\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tresult,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function emitToolCallTerminalResult(\n\t\ttoolCall: ToolCallPart,\n\t\trunnable: Agent.ToolCallInFlight,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tresult: Agent.ToolTerminalResult<unknown>,\n\t): Promise<void> {\n\t\tconst { partIndex, ...pendingPart } = toolCall;\n\t\tconst { time } = pendingPart;\n\t\tconst toolExecutionEnd: Event.ToolExecutionEnd = {\n\t\t\ttype: \"tool.execution.end\",\n\t\t\t...runnable,\n\t\t\t...result,\n\t\t};\n\t\tawait emitEvent(emit, { ...toolExecutionEnd });\n\n\t\tconst part: Message.ToolCallErrorPart | Message.ToolCallCompletedPart = {\n\t\t\t...pendingPart,\n\t\t\t...result,\n\t\t\ttime: {\n\t\t\t\tstart: time.start,\n\t\t\t\tend: Date.now(),\n\t\t\t},\n\t\t};\n\n\t\tmessage.parts[partIndex] = part; // in-place mutate; add error part\n\n\t\tawait emitEvent(emit, { type: \"message.part.start\", message: message, partIndex: partIndex, part: part });\n\t\tawait emitEvent(emit, { type: \"message.part.end\", message: message, partIndex: partIndex, part: part });\n\t\tawait emitEvent(emit, { type: \"message.update\", message: message });\n\t}\n\n\tasync function finalizeExecutedToolCall(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\ttoolCall: ToolCallPart,\n\t\trunnable: Agent.ToolCallInFlight,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tresult: Agent.ToolTerminalResult<unknown>,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tif (config.afterToolExecution) {\n\t\t\tconst afterResult = await config.afterToolExecution(\n\t\t\t\t{\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t\tassistantMessage: message,\n\t\t\t\t\ttoolCall: runnable,\n\t\t\t\t\tresult,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (afterResult) {\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, runnable, message, emit, afterResult);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tawait emitToolCallTerminalResult(toolCall, runnable, message, emit, result);\n\t}\n\n\t/**\n\t * Main core loop shared by run and runContinue.\n\t */\n\tasync function runLoop(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tnewMessages: Message.Message[],\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\t// initial `turn.start` is already emitted\n\t\t// avoiding duplicate `turn.start` emits\n\t\tlet firstTurn = true;\n\t\t// Check for steering messages at start (user may have submitted while waiting)\n\t\tlet pendingMessages: Message.UserMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\t\twhile (true) {\n\t\t\tlet hasMoreToolCalls = true;\n\n\t\t\t// Inner loop: process tool calls and steering messages\n\t\t\t// Note: turn.start for full tool calls / pending messages.\n\t\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\t\t// flip firstTurn, so next iterations starts emitting `turn.start` event\n\t\t\t\tif (!firstTurn) {\n\t\t\t\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\t\t\t\t} else {\n\t\t\t\t\tfirstTurn = false;\n\t\t\t\t}\n\n\t\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.start\", message: message });\n\t\t\t\t\t\tfor (const [partIndex, part] of message.parts.entries()) {\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.part.start\", message: message, partIndex, part });\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.part.end\", message: message, partIndex, part });\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.update\", message: message });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: message });\n\t\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t\t}\n\t\t\t\t\tpendingMessages = [];\n\t\t\t\t}\n\n\t\t\t\t// Run llm and emit assistant response\n\t\t\t\tconst message: Message.AssistantMessage = await streamAssistantResponse(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\temit,\n\t\t\t\t\tstreamFn,\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\n\t\t\t\t// terminal state\n\t\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\t\tcurrentContext.messages.push(message); // append the terminal message into the context\n\t\t\t\t\tnewMessages.push(message); // append the terminal message\n\n\t\t\t\t\tawait emitEvent(emit, { type: \"turn.end\", message });\n\t\t\t\t\tawait emitEvent(emit, { type: \"agent.end\", messages: newMessages });\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// check for pending tool calls\n\t\t\t\t// use partIndex for in-place mutation for tool call result parts in message.parts\n\t\t\t\tconst toolCalls: ToolCallPart[] = message.parts\n\t\t\t\t\t.map((part, index) => ({ ...part, partIndex: index }))\n\t\t\t\t\t.filter((part) => part.type === \"toolCall\" && part.status === \"pending\");\n\n\t\t\t\thasMoreToolCalls = toolCalls.length > 0;\n\t\t\t\tif (hasMoreToolCalls) {\n\t\t\t\t\tawait executeToolCalls(config, currentContext, message, toolCalls, emit, signal);\n\t\t\t\t}\n\n\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\tnewMessages.push(message);\n\n\t\t\t\tawait emitEvent(emit, { type: \"turn.end\", message });\n\n\t\t\t\t//\n\t\t\t\t// check for steering messages while turn loop was working.\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\n\t\t\t// Agent would stop here. Check for follow-up messages.\n\t\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\tif (followUpMessages.length > 0) {\n\t\t\t\t// Set as pending so inner loop processes them\n\t\t\t\tpendingMessages = followUpMessages;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// No more messages, exit\n\t\t\tbreak;\n\t\t}\n\n\t\tawait emitEvent(emit, { type: \"agent.end\", messages: newMessages });\n\t}\n\n\texport async function runAgentLoop(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tprompts: Message.UserMessage[],\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t) {\n\t\t/**\n\t\t * maintain 2 arrays to represent state, `context` the actual full state sent to the LLM,\n\t\t * `newMessages` for intermediate current loop state.\n\t\t * think of newMessages as subset of context.messages for the running current loop.\n\t\t * they do move at the same speed staring with initial user prompts.\n\t\t * */\n\t\tconst newMessages: Message.Message[] = [...prompts];\n\t\tconst currentContext: Agent.AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\n\t\tawait emitEvent(emit, { type: \"agent.start\" });\n\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\tawait emitEvent(emit, { type: \"message.start\", message: prompt });\n\t\t\tfor (const [partIndex, part] of prompt.parts.entries()) {\n\t\t\t\tawait emitEvent(emit, { type: \"message.part.start\", message: prompt, partIndex, part });\n\t\t\t\tawait emitEvent(emit, { type: \"message.part.end\", message: prompt, partIndex, part });\n\t\t\t}\n\t\t\tawait emitEvent(emit, { type: \"message.end\", message: prompt });\n\t\t}\n\n\t\tawait runLoop(config, currentContext, newMessages, emit, streamFn, signal);\n\t\treturn newMessages;\n\t}\n\n\t/**\n\t * **Important:** The last message in context must not be `assistant` message, convert\n\t * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n\t * This cannot be validated here since `convertToLlm` is only called once per turn.\n\t */\n\texport async function runAgentLoopContinue(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t) {\n\t\tif (context.messages.length === 0) {\n\t\t\tthrow new AgentContextError({ message: \"connot continue: no messages in context\" });\n\t\t}\n\t\tif (context.messages[context.messages.length - 1]?.role === \"assistant\") {\n\t\t\tthrow new AgentContextError({ message: \"cannot continue from message role: assistant\" });\n\t\t}\n\n\t\tconst newMessages: Message.Message[] = [];\n\t\tconst currentContext: Agent.AgentContext = { ...context };\n\n\t\tawait emitEvent(emit, { type: \"agent.start\" });\n\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\n\t\tawait runLoop(config, currentContext, newMessages, emit, streamFn, signal);\n\t\treturn newMessages;\n\t}\n\n\t/**\n\t * Start an agent loop with a new prompt message.\n\t * The prompt is added to the context and events are emitted for it.\n\t */\n\texport function run(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tprompts: Message.UserMessage[],\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\tconst stream = createAgentStream();\n\n\t\tvoid runAgentLoop(\n\t\t\tconfig,\n\t\t\tcontext,\n\t\t\tprompts,\n\t\t\tasync (event) => {\n\t\t\t\tstream.push(event);\n\t\t\t},\n\t\t\tstreamFn,\n\t\t\tsignal,\n\t\t).then((messages) => {\n\t\t\tstream.end(messages);\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t/**\n\t * Continue an agent loop from the current context without adding a new message.\n\t * Used for retries - context already has user message or tool results.\n\t */\n\texport function runContinue(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\tconst stream = createAgentStream();\n\n\t\tvoid runAgentLoopContinue(\n\t\t\tconfig,\n\t\t\tcontext,\n\t\t\tasync (event) => {\n\t\t\t\tstream.push(event);\n\t\t\t},\n\t\t\tstreamFn,\n\t\t\tsignal,\n\t\t).then((messages) => {\n\t\t\tstream.end(messages);\n\t\t});\n\n\t\treturn stream;\n\t}\n}\n","import { Loop } from \"./agent/loop\";\n\ntype AgentFacade = {\n\tloop: typeof Loop.run;\n\tloopContinue: typeof Loop.runContinue;\n};\n\nexport const agent = {\n\tloop: Loop.run,\n\tloopContinue: Loop.runContinue,\n} as AgentFacade;\n","import { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport { uuidv7 } from \"uuidv7\";\nimport { Model } from \"../model/model\";\nimport { Provider } from \"../provider/provider\";\n\nexport namespace Message {\n\texport const TextContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"text\"),\n\t\ttext: Type.String(),\n\t\ttextSignature: Type.Optional(Type.String()), // e.g., for OpenAI responses, the message ID\n\t});\n\texport type TextContent = Static<typeof TextContentSchema>;\n\n\texport const ImageContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"image\"),\n\t\tdata: Type.String(), // base64 encoded image data\n\t\tmimeType: Type.String(), // e.g., \"image/jpeg\", \"image/png\"\n\t});\n\texport type ImageContent = Static<typeof ImageContentSchema>;\n\n\texport const ThinkingContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"thinking\"),\n\t\tthinking: Type.String(),\n\t\tthinkingSignature: Type.Optional(Type.String()), // e.g., for OpenAI responses, the reasoning item ID\n\t\t/** When true, the thinking content was redacted by safety filters. The opaque\n\t\t * encrypted payload is stored in `thinkingSignature` so it can be passed back\n\t\t * to the API for multi-turn continuity. */\n\t\tredacted: Type.Optional(Type.Boolean()),\n\t});\n\texport type ThinkingContent = Static<typeof ThinkingContentSchema>;\n\n\texport const ToolCallBaseSchema = Type.Object({\n\t\ttype: Type.Literal(\"toolCall\"),\n\t\tcallID: Type.String(),\n\t\tname: Type.String(),\n\t\targuments: Type.Record(Type.String(), Type.Any()),\n\t\tthoughtSignature: Type.Optional(Type.String()), // Google-specific: opaque signature for reusing thought context\n\t\ttime: Type.Object({\n\t\t\tstart: Type.Number(), // Unix timestamp in milliseconds\n\t\t\tend: Type.Number(), // Unix timestamp in milliseconds, last known lifecycle update\n\t\t}),\n\t});\n\n\texport const ToolSuccessResult = Type.Object({\n\t\tcontent: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t\tdetails: Type.Optional(Type.Any()),\n\t\tisError: Type.Literal(false),\n\t});\n\texport const ToolErrorResult = Type.Object({\n\t\tcontent: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t\tdetails: Type.Optional(Type.Any()),\n\t\tisError: Type.Literal(true),\n\t});\n\texport const ToolRunningPartial = Type.Object({\n\t\tcontent: Type.Optional(Type.Array(Type.Union([TextContentSchema, ImageContentSchema]))),\n\t\tdetails: Type.Optional(Type.Any()),\n\t});\n\n\texport const ToolStatusEnum = {\n\t\tpending: \"pending\",\n\t\trunning: \"running\",\n\t\tcompleted: \"completed\",\n\t\terror: \"error\",\n\t\tskipped: \"skipped\",\n\t\taborted: \"aborted\",\n\t} as const;\n\n\texport const ToolRunningSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.running),\n\t\tpartial: Type.Optional(ToolRunningPartial),\n\t});\n\texport const ToolCompletedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.completed),\n\t\tresult: ToolSuccessResult,\n\t});\n\texport const ToolErrorSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.error),\n\t\tresult: ToolErrorResult,\n\t});\n\texport const ToolSkippedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.skipped),\n\t\tresult: ToolErrorResult,\n\t});\n\texport const ToolAbortedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.aborted),\n\t\tresult: ToolErrorResult,\n\t});\n\n\tconst ToolCallPendingPart = Type.Intersect([\n\t\tToolCallBaseSchema,\n\t\tType.Object({\n\t\t\tstatus: Type.Literal(ToolStatusEnum.pending),\n\t\t}),\n\t]);\n\tconst ToolCallRunningPart = Type.Composite([ToolCallBaseSchema, ToolRunningSchema]);\n\tconst ToolCallCompletedPart = Type.Composite([ToolCallBaseSchema, ToolCompletedSchema]);\n\tconst ToolCallErrorPart = Type.Composite([ToolCallBaseSchema, ToolErrorSchema]);\n\tconst ToolCallSkippedPart = Type.Composite([ToolCallBaseSchema, ToolSkippedSchema]);\n\tconst ToolCallAbortedPart = Type.Composite([ToolCallBaseSchema, ToolAbortedSchema]);\n\n\texport const ToolCallSchema = Type.Union([\n\t\tToolCallPendingPart,\n\t\tToolCallRunningPart,\n\t\tToolCallCompletedPart,\n\t\tToolCallErrorPart,\n\t\tToolCallSkippedPart,\n\t\tToolCallAbortedPart,\n\t]);\n\n\texport type ToolCall = Static<typeof ToolCallSchema>;\n\texport type ToolCallPendingPart = Static<typeof ToolCallPendingPart>;\n\texport type ToolCallRunningPart = Static<typeof ToolCallRunningPart>;\n\texport type ToolCallCompletedPart = Static<typeof ToolCallCompletedPart>;\n\texport type ToolCallErrorPart = Static<typeof ToolCallErrorPart>;\n\n\texport const UsageSchema = Type.Object({\n\t\tinput: Type.Number(),\n\t\toutput: Type.Number(),\n\t\tcacheRead: Type.Number(),\n\t\tcacheWrite: Type.Number(),\n\t\ttotalTokens: Type.Number(),\n\t\tcost: Type.Object({\n\t\t\tinput: Type.Number(),\n\t\t\toutput: Type.Number(),\n\t\t\tcacheRead: Type.Number(),\n\t\t\tcacheWrite: Type.Number(),\n\t\t\ttotal: Type.Number(),\n\t\t}),\n\t});\n\texport type Usage = Static<typeof UsageSchema>;\n\n\texport const StopReasonSchema = Type.Union([\n\t\tType.Literal(\"stop\"),\n\t\tType.Literal(\"length\"),\n\t\tType.Literal(\"toolUse\"),\n\t\tType.Literal(\"error\"),\n\t\tType.Literal(\"aborted\"),\n\t]);\n\texport type StopReason = Static<typeof StopReasonSchema>;\n\n\texport const UserMessageSchema = Type.Object({\n\t\tmessageId: Type.String(),\n\t\trole: Type.Literal(\"user\"),\n\t\ttime: Type.Object({\n\t\t\tcreated: Type.Number(),\n\t\t}),\n\t\tparts: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t});\n\texport type UserMessage = Static<typeof UserMessageSchema>;\n\n\texport const AssistantMessageSchema = Type.Object({\n\t\trole: Type.Literal(\"assistant\"),\n\t\tprotocol: Model.KnownProtocolSchema,\n\t\tprovider: Provider.Info,\n\t\tmodel: Type.String(),\n\t\tusage: UsageSchema,\n\t\tstopReason: StopReasonSchema,\n\t\terrorMessage: Type.Optional(Type.String()),\n\t\ttime: Type.Object({\n\t\t\tcreated: Type.Number(),\n\t\t\tcompleted: Type.Number(),\n\t\t}),\n\t\tparts: Type.Array(Type.Union([TextContentSchema, ImageContentSchema, ThinkingContentSchema, ToolCallSchema])),\n\t\tresponseId: Type.Optional(Type.String()), // Provider-specific response/message identifier when the upstream API exposes one\n\t\tmessageId: Type.String(),\n\t});\n\texport type AssistantMessage = Static<typeof AssistantMessageSchema>;\n\n\texport const MessageSchema = Type.Union([UserMessageSchema, AssistantMessageSchema]);\n\texport type Message = Static<typeof MessageSchema>;\n\n\ttype UserMessageInit = Omit<UserMessage, \"messageId\"> & {\n\t\tmessageId?: string;\n\t};\n\n\ttype AssistantMessageInit = Omit<AssistantMessage, \"messageId\"> & {\n\t\tmessageId?: string;\n\t};\n\n\texport function createMessageId(): string {\n\t\treturn uuidv7();\n\t}\n\n\texport function createUserMessage(message: UserMessageInit): UserMessage {\n\t\tconst { messageId = createMessageId(), ...rest } = message;\n\t\treturn {\n\t\t\tmessageId,\n\t\t\t...rest,\n\t\t};\n\t}\n\n\texport function createAssistantMessage(message: AssistantMessageInit): AssistantMessage {\n\t\tconst { messageId = createMessageId(), ...rest } = message;\n\t\treturn {\n\t\t\tmessageId,\n\t\t\t...rest,\n\t\t};\n\t}\n\n\t/**\n\t * Generic tool definition with typed parameter schema.\n\t * Usage:\n\t *\n\t * const search = Message.defineTool({\n\t * name: \"search\",\n\t * description: \"Search documents\",\n\t * parameters: Type.Object({\n\t * query: Type.String(),\n\t * limit: Type.Optional(Type.Number()),\n\t * }),\n\t * });\n\t *\n\t * type SearchParams = Static<typeof search.parameters>;\n\t */\n\texport const ToolSchema = Type.Object({\n\t\tname: Type.String(),\n\t\tdescription: Type.String(),\n\t\tparameters: Type.Unsafe<TSchema>(),\n\t});\n\texport interface Tool<TParameters extends TSchema = TSchema> {\n\t\tname: string;\n\t\tdescription: string;\n\t\tparameters: TParameters;\n\t}\n\texport type ToolArguments<T extends Tool> = Static<T[\"parameters\"]>;\n\n\texport function defineTool<TParameters extends TSchema>(tool: Tool<TParameters>): Tool<TParameters> {\n\t\treturn tool;\n\t}\n\n\texport const ContextSchema = Type.Object({\n\t\tsystemPrompt: Type.Optional(Type.String()),\n\t\tmessages: Type.Array(MessageSchema),\n\t\ttools: Type.Optional(Type.Array(ToolSchema)),\n\t});\n\texport type Context = Static<typeof ContextSchema>;\n\n\texport function transformMessages<TProtocol extends Model.KnownProtocol>(\n\t\tmessages: Message[],\n\t\tmodel: Model.TModel<TProtocol>,\n\t\tnormalizeToolCallId?: (id: string, model: Model.TModel<TProtocol>, source: AssistantMessage) => string,\n\t): Message[] {\n\t\tconst toolCallIDMap = new Map<string, string>();\n\n\t\tconst transformed: Message[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\ttransformed.push(msg);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tconst isSameModel =\n\t\t\t\tassistantMsg.provider.id === model.provider.id &&\n\t\t\t\tassistantMsg.protocol === model.protocol &&\n\t\t\t\tassistantMsg.model === model.id;\n\n\t\t\tconst parts = assistantMsg.parts.flatMap((block) => {\n\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\tif (isSameModel && block.thinkingSignature) return block;\n\t\t\t\t\tif (!block.thinking || block.thinking.trim() === \"\") return [];\n\t\t\t\t\tif (isSameModel) return block;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.thinking,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tif (isSameModel) return block;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.text,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst toolCall = block as ToolCall;\n\t\t\t\t\tlet normalizedToolCall: ToolCall = toolCall;\n\n\t\t\t\t\tif (!isSameModel && toolCall.thoughtSignature) {\n\t\t\t\t\t\tnormalizedToolCall = { ...toolCall };\n\t\t\t\t\t\tdelete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst normalizedID = toolCallIDMap.get(block.callID);\n\t\t\t\t\tif (normalizedID && normalizedID !== block.callID) {\n\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, callID: normalizedID };\n\t\t\t\t\t} else if (!isSameModel && normalizeToolCallId) {\n\t\t\t\t\t\tconst nextID = normalizeToolCallId(toolCall.callID, model, assistantMsg);\n\t\t\t\t\t\tif (nextID !== toolCall.callID) {\n\t\t\t\t\t\t\ttoolCallIDMap.set(toolCall.callID, nextID);\n\t\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, callID: nextID };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn normalizedToolCall;\n\t\t\t\t}\n\n\t\t\t\treturn block;\n\t\t\t});\n\n\t\t\ttransformed.push({\n\t\t\t\t...assistantMsg,\n\t\t\t\tparts,\n\t\t\t});\n\t\t}\n\n\t\treturn transformed;\n\t}\n}\n","/**\n * @description Helper function to parse partial jsons during LLM streaming.\n */\n\nimport { parse as partialParse } from \"partial-json\";\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = any>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\t// Try standard parsing first (fastest for complete JSON)\n\ttry {\n\t\treturn JSON.parse(partialJson) as T;\n\t} catch {\n\t\t// Try partial-json for incomplete JSON\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\t// If all parsing fails, return empty object\n\t\t\treturn {} as T;\n\t\t}\n\t}\n}\n","/**\n * Removes unpaired Unicode surrogate characters from a string.\n *\n * Unpaired surrogates (high surrogates 0xD800-0xDBFF without matching low surrogates 0xDC00-0xDFFF,\n * or vice versa) cause JSON serialization errors in many API providers.\n *\n * Valid emoji and other characters outside the Basic Multilingual Plane use properly paired\n * surrogates and will NOT be affected by this function.\n *\n * @param text - The text to sanitize\n * @returns The sanitized text with unpaired surrogates removed\n *\n * @example\n * // Valid emoji (properly paired surrogates) are preserved\n * sanitizeSurrogates(\"Hello 🙈 World\") // => \"Hello 🙈 World\"\n *\n * // Unpaired high surrogate is removed\n * const unpaired = String.fromCharCode(0xD83D); // high surrogate without low\n * sanitizeSurrogates(`Text ${unpaired} here`) // => \"Text here\"\n */\nexport function sanitizeSurrogates(text: string): string {\n\t// Replace unpaired high surrogates (0xD800-0xDBFF not followed by low surrogate)\n\t// Replace unpaired low surrogates (0xDC00-0xDFFF not preceded by high surrogate)\n\treturn text.replace(/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g, \"\");\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n\tContentBlockParam,\n\tMessageCreateParamsStreaming,\n\tMessageParam,\n} from \"@anthropic-ai/sdk/resources/messages.js\";\nimport { Message } from \"../../../message/message\";\nimport { Model } from \"../../../model/model\";\nimport { AssistantMessageEventStream } from \"../../../utils/eventstream\";\nimport { parseStreamingJson } from \"../../../utils/jsonparse\";\nimport { sanitizeSurrogates } from \"../../../utils/sanitize\";\nimport type { Provider } from \"../../provider\";\nimport { Stream } from \"../../stream\";\n\nexport interface AnthropicOptions extends Stream.Options {\n\tthinkingEnabled?: boolean;\n\tthinkingBudgetTokens?: number;\n\tinterleavedThinking?: boolean;\n\ttoolChoice?: \"auto\" | \"any\" | \"none\" | { type: \"tool\"; name: string };\n\tclient?: Anthropic;\n}\n\nfunction getEnvApiKey(_provider: Provider.Info): string | undefined {\n\treturn undefined;\n}\n\nfunction resolveCacheRetention(cacheRetention?: Stream.CacheRetention): Stream.CacheRetention {\n\tif (cacheRetention) {\n\t\treturn cacheRetention;\n\t}\n\tif (typeof process !== \"undefined\" && process.env.CODEWORK_CACHE_RETENTION === \"long\") {\n\t\treturn \"long\";\n\t}\n\treturn \"short\";\n}\n\nfunction getCacheControl(\n\tbaseUrl: string,\n\tcacheRetention?: Stream.CacheRetention,\n): {\n\tretention: Stream.CacheRetention;\n\tcacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" };\n} {\n\tconst retention = resolveCacheRetention(cacheRetention);\n\tif (retention === \"none\") {\n\t\treturn { retention };\n\t}\n\tconst ttl = retention === \"long\" && baseUrl.includes(\"api.anthropic.com\") ? \"1h\" : undefined;\n\treturn {\n\t\tretention,\n\t\tcacheControl: { type: \"ephemeral\", ...(ttl && { ttl }) },\n\t};\n}\n\nconst claudeCodeVersion = \"2.1.2\";\nconst claudeCodeTools = [\n\t\"Read\",\n\t\"Write\",\n\t\"Edit\",\n\t\"Bash\",\n\t\"Grep\",\n\t\"Glob\",\n\t\"AskUserQuestion\",\n\t\"EnterPlanMode\",\n\t\"ExitPlanMode\",\n\t\"KillShell\",\n\t\"NotebookEdit\",\n\t\"Skill\",\n\t\"Task\",\n\t\"TaskOutput\",\n\t\"TodoWrite\",\n\t\"WebFetch\",\n\t\"WebSearch\",\n];\nconst ccToolLookup = new Map(claudeCodeTools.map((t) => [t.toLowerCase(), t]));\n\nconst toClaudeCodeName = (name: string) => ccToolLookup.get(name.toLowerCase()) ?? name;\nconst fromClaudeCodeName = (name: string, tools?: Message.Tool[]) => {\n\tif (tools && tools.length > 0) {\n\t\tconst lowerName = name.toLowerCase();\n\t\tconst matchedTool = tools.find((tool) => tool.name.toLowerCase() === lowerName);\n\t\tif (matchedTool) return matchedTool.name;\n\t}\n\treturn name;\n};\n\nfunction convertContentBlocks(content: (Message.TextContent | Message.ImageContent)[]):\n\t| string\n\t| Array<\n\t\t\t| { type: \"text\"; text: string }\n\t\t\t| {\n\t\t\t\t\ttype: \"image\";\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"base64\";\n\t\t\t\t\t\tmedia_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\t\t\t\t\t\tdata: string;\n\t\t\t\t\t};\n\t\t\t }\n\t > {\n\tconst hasImages = content.some((c) => c.type === \"image\");\n\tif (!hasImages) {\n\t\treturn sanitizeSurrogates(content.map((c) => (c as Message.TextContent).text).join(\"\\n\"));\n\t}\n\n\tconst blocks = content.map((block) => {\n\t\tif (block.type === \"text\") {\n\t\t\treturn {\n\t\t\t\ttype: \"text\" as const,\n\t\t\t\ttext: sanitizeSurrogates(block.text),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\ttype: \"image\" as const,\n\t\t\tsource: {\n\t\t\t\ttype: \"base64\" as const,\n\t\t\t\tmedia_type: block.mimeType as \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\",\n\t\t\t\tdata: block.data,\n\t\t\t},\n\t\t};\n\t});\n\n\tif (!blocks.some((b) => b.type === \"text\")) {\n\t\tblocks.unshift({\n\t\t\ttype: \"text\" as const,\n\t\t\ttext: \"(see attached image)\",\n\t\t});\n\t}\n\n\treturn blocks;\n}\n\nfunction mergeHeaders(...headerSources: (Record<string, string> | undefined)[]): Record<string, string> {\n\tconst merged: Record<string, string> = {};\n\tfor (const headers of headerSources) {\n\t\tif (headers) {\n\t\t\tObject.assign(merged, headers);\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction isOAuthToken(apiKey: string): boolean {\n\treturn apiKey.includes(\"sk-ant-oat\");\n}\n\nfunction createClient(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tapiKey: string,\n\tinterleavedThinking: boolean,\n\toptionsHeaders?: Record<string, string>,\n): { client: Anthropic; isOAuthToken: boolean } {\n\tconst betaFeatures = [\"fine-grained-tool-streaming-2025-05-14\"];\n\tif (interleavedThinking) {\n\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t}\n\n\tconst oauthToken = isOAuthToken(apiKey);\n\tif (oauthToken) {\n\t\tconst defaultHeaders = mergeHeaders(\n\t\t\t{\n\t\t\t\taccept: \"application/json\",\n\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t\"anthropic-beta\": `claude-code-20250219,oauth-2025-04-20,${betaFeatures.join(\",\")}`,\n\t\t\t\t\"user-agent\": `claude-cli/${claudeCodeVersion} (external, cli)`,\n\t\t\t\t\"x-app\": \"cli\",\n\t\t\t},\n\t\t\tmodel.headers,\n\t\t\toptionsHeaders,\n\t\t);\n\n\t\treturn {\n\t\t\tclient: new Anthropic({\n\t\t\t\tapiKey: null,\n\t\t\t\tauthToken: apiKey,\n\t\t\t\tbaseURL: model.baseUrl,\n\t\t\t\tdefaultHeaders,\n\t\t\t\tdangerouslyAllowBrowser: true,\n\t\t\t}),\n\t\t\tisOAuthToken: true,\n\t\t};\n\t}\n\n\tconst defaultHeaders = mergeHeaders(\n\t\t{\n\t\t\taccept: \"application/json\",\n\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\"anthropic-beta\": betaFeatures.join(\",\"),\n\t\t},\n\t\tmodel.headers,\n\t\toptionsHeaders,\n\t);\n\n\treturn {\n\t\tclient: new Anthropic({\n\t\t\tapiKey,\n\t\t\tbaseURL: model.baseUrl,\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tdefaultHeaders,\n\t\t}),\n\t\tisOAuthToken: false,\n\t};\n}\n\nfunction normalizeToolCallId(id: string): string {\n\treturn id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n}\n\nfunction assertReplayableAssistant(message: Message.AssistantMessage): void {\n\tlet sawToolCall = false;\n\tlet sawNonTerminalToolCall = false;\n\tlet sawTerminalToolCall = false;\n\n\tfor (const part of message.parts) {\n\t\tif (part.type === \"image\") {\n\t\t\tthrow new Error(\"Anthropic replay does not support assistant image parts\");\n\t\t}\n\n\t\tif (part.type === \"toolCall\") {\n\t\t\tsawToolCall = true;\n\t\t\tif (part.status === \"pending\" || part.status === \"running\") {\n\t\t\t\tsawNonTerminalToolCall = true;\n\t\t\t} else {\n\t\t\t\tsawTerminalToolCall = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (sawToolCall) {\n\t\t\tthrow new Error(\"Assistant parts after a toolCall are not replayable for Anthropic\");\n\t\t}\n\t}\n\n\tif (sawToolCall && message.stopReason !== \"toolUse\") {\n\t\tthrow new Error(\"Assistant message with tool calls must have stopReason 'toolUse'\");\n\t}\n\n\tif (!sawToolCall && message.stopReason === \"toolUse\") {\n\t\tthrow new Error(\"Assistant message with stopReason 'toolUse' must contain at least one toolCall\");\n\t}\n\n\tif (sawTerminalToolCall && sawNonTerminalToolCall) {\n\t\tthrow new Error(\"Assistant message cannot mix terminal and non-terminal toolCall states\");\n\t}\n}\n\nfunction buildSyntheticToolResult(\n\tblock: Extract<Message.ToolCall, { status: \"pending\" | \"running\" }>,\n): ContentBlockParam {\n\treturn {\n\t\ttype: \"tool_result\",\n\t\ttool_use_id: block.callID,\n\t\tcontent: convertContentBlocks([\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: [\"<result>\", \"No Result Provided\", \"</result>\"].join(\"\\n\"),\n\t\t\t},\n\t\t]),\n\t\tis_error: true,\n\t};\n}\n\nfunction convertMessages(\n\tmessages: Message.Message[],\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tisOAuthToken: boolean,\n\tcacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): MessageParam[] {\n\tconst params: MessageParam[] = [];\n\tconst transformedMessages = Message.transformMessages(messages, model, normalizeToolCallId);\n\n\tfor (const msg of transformedMessages) {\n\t\tif (msg.role === \"user\") {\n\t\t\tconst blocks: ContentBlockParam[] = msg.parts.map((item) => {\n\t\t\t\tif (item.type === \"text\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: sanitizeSurrogates(item.text),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"base64\",\n\t\t\t\t\t\tmedia_type: item.mimeType as \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\",\n\t\t\t\t\t\tdata: item.data,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t\tlet filteredBlocks = !model.input.includes(\"image\") ? blocks.filter((b) => b.type !== \"image\") : blocks;\n\t\t\tfilteredBlocks = filteredBlocks.filter((b) => (b.type === \"text\" ? b.text.trim().length > 0 : true));\n\t\t\tif (filteredBlocks.length === 0) continue;\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: filteredBlocks,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (msg.stopReason === \"error\" || msg.stopReason === \"aborted\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tassertReplayableAssistant(msg);\n\n\t\tconst assistantBlocks: ContentBlockParam[] = [];\n\t\tconst toolResults: ContentBlockParam[] = [];\n\n\t\tfor (const block of msg.parts) {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tif (block.text.trim().length === 0) continue;\n\t\t\t\tassistantBlocks.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: sanitizeSurrogates(block.text),\n\t\t\t\t});\n\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\tif (block.thinking.trim().length === 0) continue;\n\t\t\t\tif (!block.thinkingSignature || block.thinkingSignature.trim().length === 0) {\n\t\t\t\t\tassistantBlocks.push({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: sanitizeSurrogates(block.thinking),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tassistantBlocks.push({\n\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\tthinking: sanitizeSurrogates(block.thinking),\n\t\t\t\t\t\tsignature: block.thinkingSignature,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\tassistantBlocks.push({\n\t\t\t\t\ttype: \"tool_use\",\n\t\t\t\t\tid: block.callID,\n\t\t\t\t\tname: isOAuthToken ? toClaudeCodeName(block.name) : block.name,\n\t\t\t\t\tinput: block.arguments ?? {},\n\t\t\t\t});\n\n\t\t\t\tif (block.status === \"pending\" || block.status === \"running\") {\n\t\t\t\t\ttoolResults.push(buildSyntheticToolResult(block));\n\t\t\t\t} else {\n\t\t\t\t\ttoolResults.push({\n\t\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\t\ttool_use_id: block.callID,\n\t\t\t\t\t\tcontent: convertContentBlocks(block.result.content),\n\t\t\t\t\t\tis_error: block.result.isError,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (assistantBlocks.length > 0) {\n\t\t\tparams.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: assistantBlocks,\n\t\t\t});\n\t\t}\n\n\t\tif (toolResults.length > 0) {\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (cacheControl && params.length > 0) {\n\t\tconst lastMessage = params[params.length - 1]!;\n\t\tif (lastMessage.role === \"user\") {\n\t\t\tif (Array.isArray(lastMessage.content)) {\n\t\t\t\tconst lastBlock = lastMessage.content[lastMessage.content.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastBlock &&\n\t\t\t\t\t(lastBlock.type === \"text\" || lastBlock.type === \"image\" || lastBlock.type === \"tool_result\")\n\t\t\t\t) {\n\t\t\t\t\t(lastBlock as { cache_control?: { type: \"ephemeral\"; ttl?: \"1h\" } }).cache_control = cacheControl;\n\t\t\t\t}\n\t\t\t} else if (typeof lastMessage.content === \"string\") {\n\t\t\t\tlastMessage.content = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: lastMessage.content,\n\t\t\t\t\t\tcache_control: cacheControl,\n\t\t\t\t\t},\n\t\t\t\t] as any;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn params;\n}\n\nfunction convertTools(tools: Message.Tool[], isOAuthToken: boolean): Anthropic.Messages.Tool[] {\n\tif (!tools) return [];\n\n\treturn tools.map((tool) => {\n\t\tconst jsonSchema = tool.parameters as any; // TypeBox already generates JSON Schema\n\n\t\treturn {\n\t\t\tname: isOAuthToken ? toClaudeCodeName(tool.name) : tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: {\n\t\t\t\ttype: \"object\" as const,\n\t\t\t\tproperties: jsonSchema.properties || {},\n\t\t\t\trequired: jsonSchema.required || [],\n\t\t\t},\n\t\t};\n\t});\n}\n\ntype AnthropicStopReason = Anthropic.Messages.StopReason | \"sensitive\";\n\nfunction mapStopReason(reason: AnthropicStopReason): Message.StopReason {\n\tswitch (reason) {\n\t\tcase \"end_turn\":\n\t\t\treturn \"stop\";\n\t\tcase \"max_tokens\":\n\t\t\treturn \"length\";\n\t\tcase \"tool_use\":\n\t\t\treturn \"toolUse\";\n\t\tcase \"pause_turn\":\n\t\tcase \"stop_sequence\":\n\t\t\treturn \"stop\";\n\t\tcase \"refusal\":\n\t\tcase \"sensitive\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(\"Unhandled Anthropic stop reason\");\n\t}\n}\n\nfunction buildParams(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\tisOAuthToken: boolean,\n\toptions?: AnthropicOptions,\n): MessageCreateParamsStreaming {\n\tconst { cacheControl } = getCacheControl(model.baseUrl, options?.cacheRetention);\n\tconst params: MessageCreateParamsStreaming = {\n\t\tmodel: model.id,\n\t\tmessages: convertMessages(context.messages, model, isOAuthToken, cacheControl),\n\t\tmax_tokens: options?.maxTokens || (model.maxTokens / 3) | 0,\n\t\tstream: true,\n\t};\n\n\tif (isOAuthToken) {\n\t\tparams.system = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t},\n\t\t];\n\t\tif (context.systemPrompt) {\n\t\t\tparams.system.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: sanitizeSurrogates(context.systemPrompt),\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t});\n\t\t}\n\t} else if (context.systemPrompt) {\n\t\tparams.system = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: sanitizeSurrogates(context.systemPrompt),\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t},\n\t\t];\n\t}\n\n\tif (options?.temperature !== undefined && !options?.thinkingEnabled) {\n\t\tparams.temperature = options.temperature;\n\t}\n\n\tif (context.tools) {\n\t\tparams.tools = convertTools(context.tools, isOAuthToken);\n\t}\n\n\tif (options?.thinkingEnabled && model.reasoning) {\n\t\tparams.thinking = {\n\t\t\ttype: \"enabled\",\n\t\t\tbudget_tokens: options.thinkingBudgetTokens || 1024,\n\t\t};\n\t}\n\n\tif (options?.metadata) {\n\t\tconst userId = options.metadata.user_id;\n\t\tif (typeof userId === \"string\") {\n\t\t\tparams.metadata = { user_id: userId };\n\t\t}\n\t}\n\n\tif (options?.toolChoice) {\n\t\tparams.tool_choice = typeof options.toolChoice === \"string\" ? { type: options.toolChoice } : options.toolChoice;\n\t}\n\n\treturn params;\n}\n\ntype Block = (Message.ThinkingContent | Message.TextContent | (Message.ToolCall & { partialJson: string })) & {\n\tindex: number;\n};\n\nexport const streamAnthropic: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tAnthropicOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\toptions?: AnthropicOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output = Message.createAssistantMessage({\n\t\t\trole: \"assistant\",\n\t\t\tparts: [],\n\t\t\tprotocol: model.protocol,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttime: {\n\t\t\t\tcreated: Date.now(),\n\t\t\t\tcompleted: Date.now(),\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tlet client: Anthropic;\n\t\t\tlet isOAuthToken: boolean;\n\n\t\t\tif (options?.client) {\n\t\t\t\tclient = options.client;\n\t\t\t\tisOAuthToken = false;\n\t\t\t} else {\n\t\t\t\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider);\n\t\t\t\tif (!apiKey) {\n\t\t\t\t\tthrow new Error(`No API key for provider: ${model.provider.id}`);\n\t\t\t\t}\n\n\t\t\t\tconst created = createClient(model, apiKey, options?.interleavedThinking ?? true, options?.headers);\n\t\t\t\tclient = created.client;\n\t\t\t\tisOAuthToken = created.isOAuthToken;\n\t\t\t}\n\n\t\t\tlet params = buildParams(model, context, isOAuthToken, options);\n\t\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\t\tif (nextParams !== undefined) {\n\t\t\t\tparams = nextParams as MessageCreateParamsStreaming;\n\t\t\t}\n\t\t\tconst anthropicStream = client.messages.stream({ ...params, stream: true }, { signal: options?.signal });\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tconst blocks = output.parts as Block[];\n\n\t\t\tfor await (const event of anthropicStream) {\n\t\t\t\tif (event.type === \"message_start\") {\n\t\t\t\t\toutput.responseId = event.message.id;\n\t\t\t\t\t// Capture initial token usage from message_start event\n\t\t\t\t\t// This ensures we have input token counts even if the stream is aborted early\n\t\t\t\t\toutput.usage.input = event.message.usage.input_tokens || 0;\n\t\t\t\t\toutput.usage.output = event.message.usage.output_tokens || 0;\n\t\t\t\t\toutput.usage.cacheRead = event.message.usage.cache_read_input_tokens || 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.message.usage.cache_creation_input_tokens || 0;\n\t\t\t\t\t// Anthropic doesn't provide total_tokens, compute from components\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t\tModel.calculateCost(model, output.usage);\n\t\t\t\t} else if (event.type === \"content_block_start\") {\n\t\t\t\t\tif (event.content_block.type === \"text\") {\n\t\t\t\t\t\tconst block: Block = { type: \"text\", text: \"\", index: event.index };\n\t\t\t\t\t\toutput.parts.push(block); // push the block to parts\n\t\t\t\t\t\t// `contentIndex` points to the index of the block within parts\n\t\t\t\t\t\t// Useful for replaying message and corresponding parts based on stream.\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"thinking\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\t\tthinking: \"\",\n\t\t\t\t\t\t\tthinkingSignature: \"\",\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"redacted_thinking\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\t\tthinking: \"[Reasoning redacted]\",\n\t\t\t\t\t\t\tthinkingSignature: event.content_block.data,\n\t\t\t\t\t\t\tredacted: true,\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"tool_use\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\tcallID: event.content_block.id,\n\t\t\t\t\t\t\tname: isOAuthToken\n\t\t\t\t\t\t\t\t? fromClaudeCodeName(event.content_block.name, context.tools)\n\t\t\t\t\t\t\t\t: event.content_block.name,\n\t\t\t\t\t\t\targuments: (event.content_block.input as Record<string, any>) ?? {},\n\t\t\t\t\t\t\tpartialJson: \"\",\n\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t\ttime: {\n\t\t\t\t\t\t\t\tstart: Date.now(),\n\t\t\t\t\t\t\t\tend: Date.now(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"content_block_delta\") {\n\t\t\t\t\t// *_delta updates existing block part\n\t\t\t\t\t// filtered based on event identifier `event.index` (not to confuse with array indices)\n\t\t\t\t\t// index persisted on block(part) with `index`\n\t\t\t\t\tconst partIndex = blocks.findIndex((b) => b.index === event.index);\n\t\t\t\t\tconst block = blocks[partIndex];\n\t\t\t\t\tif (!block) continue; // block doesn't exist for delta, move on\n\n\t\t\t\t\tif (event.delta.type === \"text_delta\" && block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.delta.text; // mutates block, implicitly mutating block in output.parts\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.text,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"thinking_delta\" && block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.delta.thinking;\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.thinking,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"input_json_delta\" && block.type === \"toolCall\") {\n\t\t\t\t\t\tblock.partialJson += event.delta.partial_json;\n\t\t\t\t\t\tblock.arguments = parseStreamingJson(block.partialJson);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.partial_json,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"signature_delta\" && block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinkingSignature = block.thinkingSignature || \"\";\n\t\t\t\t\t\tblock.thinkingSignature += event.delta.signature;\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"content_block_stop\") {\n\t\t\t\t\tconst partIndex = blocks.findIndex((b) => b.index === event.index);\n\t\t\t\t\tconst block = blocks[partIndex];\n\t\t\t\t\tif (block) {\n\t\t\t\t\t\tdelete (block as any).index; // clear block index; used for internal loop state\n\t\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"text.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\tcontent: block.text,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"thinking.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\tcontent: block.thinking,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\t\t\tblock.arguments = parseStreamingJson(block.partialJson);\n\t\t\t\t\t\t\tdelete (block as any).partialJson; // clear partialJson; used for internal loop state\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"toolcall.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"message_delta\") {\n\t\t\t\t\tif (event.delta.stop_reason) {\n\t\t\t\t\t\toutput.stopReason = mapStopReason(event.delta.stop_reason);\n\t\t\t\t\t}\n\t\t\t\t\t// Only update usage fields if present (not null).\n\t\t\t\t\t// Preserves input_tokens from message_start when proxies omit it in message_delta.\n\t\t\t\t\tif (event.usage.input_tokens != null) {\n\t\t\t\t\t\toutput.usage.input = event.usage.input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.output_tokens != null) {\n\t\t\t\t\t\toutput.usage.output = event.usage.output_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.cache_read_input_tokens != null) {\n\t\t\t\t\t\toutput.usage.cacheRead = event.usage.cache_read_input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.cache_creation_input_tokens != null) {\n\t\t\t\t\t\toutput.usage.cacheWrite = event.usage.cache_creation_input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\t// Anthropic doesn't provide total_tokens, compute from components\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t\tModel.calculateCost(model, output.usage);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options?.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n\t\t\t\tthrow new Error(\"An unknown error occurred\");\n\t\t\t}\n\n\t\t\toutput.time.completed = Date.now();\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason, message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\tfor (const block of output.parts) delete (block as { index?: number }).index;\n\t\t\toutput.time.completed = Date.now();\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimpleAnthropic: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tStream.SimpleOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\toptions?: Stream.SimpleOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider.id}`);\n\t}\n\n\tconst base = Stream.buildBaseOptions(model, options, apiKey);\n\tif (!options?.reasoning) {\n\t\treturn streamAnthropic(model, context, {\n\t\t\t...base,\n\t\t\tthinkingEnabled: false,\n\t\t} satisfies AnthropicOptions);\n\t}\n\n\tconst adjusted = Stream.adjustMaxTokensForThinking(\n\t\tbase.maxTokens || 0,\n\t\tmodel.maxTokens,\n\t\toptions.reasoning,\n\t\toptions.thinkingBudgets,\n\t);\n\n\treturn streamAnthropic(model, context, {\n\t\t...base,\n\t\tmaxTokens: adjusted.maxTokens,\n\t\tthinkingEnabled: true,\n\t\tthinkingBudgetTokens: adjusted.thinkingBudget,\n\t} satisfies AnthropicOptions);\n};\n\nconst anthropicProtocolProvider: Stream.ProtocolProvider<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tAnthropicOptions\n> = {\n\tprotocol: Model.KnownProtocolEnum.anthropicMessages,\n\tstream: streamAnthropic,\n\tstreamSimple: streamSimpleAnthropic,\n};\n\nexport default anthropicProtocolProvider;\n","import anthropicProvider from \"./providers/anthropic/index\";\nimport { Stream } from \"./stream\";\n\nconst providerModules = [[\"providers/anthropic/index.ts\", anthropicProvider]] as const;\n\nfor (const [path, provider] of providerModules) {\n\tStream.registerProtocolProvider(provider, path);\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport type { Event } from \"../event/event\";\nimport { Message } from \"../message/message\";\nimport { Model } from \"../model/model\";\nimport type { Provider } from \"../provider/provider\";\nimport \"../provider/register\";\nimport { Stream } from \"../provider/stream\";\nimport { Loop } from \"./loop\";\n\nexport namespace Agent {\n\texport const ToolTerminalResultSchema = Type.Union([Message.ToolCompletedSchema, Message.ToolErrorSchema]);\n\texport const ToolResultSchema = Type.Union([\n\t\tMessage.ToolRunningSchema,\n\t\tMessage.ToolCompletedSchema,\n\t\tMessage.ToolErrorSchema,\n\t]);\n\n\texport type ToolRunningResult<T> = Omit<Static<typeof Message.ToolRunningSchema>, \"partial\"> & {\n\t\tpartial?: Omit<Static<typeof Message.ToolRunningPartial>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolCompletedResult<T> = Omit<Static<typeof Message.ToolCompletedSchema>, \"result\"> & {\n\t\tresult: Omit<Static<typeof Message.ToolSuccessResult>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolErrorResult<T> = Omit<Static<typeof Message.ToolErrorSchema>, \"result\"> & {\n\t\tresult: Omit<Static<typeof Message.ToolErrorResult>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolTerminalResult<TCompleted = unknown, TError = unknown> =\n\t\t| ToolCompletedResult<TCompleted>\n\t\t| ToolErrorResult<TError>;\n\ttype InferSchema<T extends TSchema | undefined> = T extends TSchema ? Static<T> : unknown;\n\n\t// callback for tool execution updates.\n\t// consumers can narrow on status if needed\n\t// type inference:\n\t// U - update\n\texport type ToolUpdateCallback<U = unknown> = (result: ToolRunningResult<U>) => Promise<void> | void;\n\n\texport interface AgentTool<\n\t\tTParameters extends TSchema = TSchema,\n\t\tTOutput extends TSchema | undefined = undefined,\n\t\tTUpdate = unknown,\n\t\tTError extends TSchema | undefined = undefined,\n\t> extends Message.Tool<TParameters> {\n\t\t// A human-readable label for the tool for display\n\t\tlabel: string;\n\t\toutputSchema?: TOutput;\n\t\terrorSchema?: TError;\n\t\texecute: (\n\t\t\tcallID: string,\n\t\t\tparams: Static<TParameters>,\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?: ToolUpdateCallback<TUpdate>,\n\t\t) => Promise<ToolTerminalResult<InferSchema<TOutput>, InferSchema<TError>>>;\n\t}\n\n\texport function defineTool<\n\t\tTParameters extends TSchema,\n\t\tTOutput extends TSchema | undefined = undefined,\n\t\tTUpdate = unknown,\n\t\tTError extends TSchema | undefined = undefined,\n\t>(tool: AgentTool<TParameters, TOutput, TUpdate, TError>): AgentTool<TParameters, TOutput, TUpdate, TError> {\n\t\treturn tool;\n\t}\n\n\texport type AnyAgentTool = AgentTool<any, any, any, any>;\n\n\texport interface State {\n\t\tname: string;\n\t\tsystemPrompt: string;\n\t\tmodel: Model.Value;\n\t\tthinkingLevel: Stream.ThinkingLevel;\n\t\ttools: AnyAgentTool[];\n\t\tmessages: Message.Message[];\n\t\tisStreaming: boolean;\n\t\tstreamMessage: Message.Message | null;\n\t\tpendingToolCalls: Set<string>;\n\t\terror?: string;\n\t}\n\n\t// AgentContext is like Message.Context but uses AgentTool\n\t// TODO: @sanchitrk: rename this to Context; Agent.Context\n\texport interface AgentContext {\n\t\tsystemPrompt: string;\n\t\tmessages: Message.Message[];\n\t\ttools?: AnyAgentTool[];\n\t}\n\n\texport const ToolCallInFlightSchema = Type.Object({\n\t\tcallID: Type.String(),\n\t\tname: Type.String(),\n\t\trawArgs: Type.Record(Type.String(), Type.Unknown()),\n\t\targs: Type.Optional(Type.Unknown()), // post validation\n\t});\n\texport type ToolCallInFlight = Static<typeof ToolCallInFlightSchema>;\n\n\texport const ModelNotFoundErr = NamedError.create(\n\t\t\"ModelNotFoundErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t\tprovider: Type.String(),\n\t\t\tmodel: Type.String(),\n\t\t}),\n\t);\n\n\texport const ModelNotConfiguredErr = NamedError.create(\n\t\t\"ModelNotConfiguredErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\n\texport interface AgentOptions {\n\t\tinitialState?: Partial<State>;\n\t\tconvertToLlm?: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\t/**\n\t\t * Optional transform applied to the context before `convertToLlm`.\n\t\t *\n\t\t * Use this for operations that work at the AgentMessage level:\n\t\t * - Context window management (pruning old messages)\n\t\t * - Injecting context from external sources\n\t\t *\n\t\t * @example\n\t\t * ```typescript\n\t\t * transformContext: async (messages) => {\n\t\t * if (estimateTokens(messages) > MAX_TOKENS) {\n\t\t * return pruneOldMessages(messages);\n\t\t * }\n\t\t * return messages;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttransformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\t\t/**\n\t\t * Steering mode: \"all\" = send all steering messages at once, \"one-at-a-time\" = one per turn\n\t\t */\n\t\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\n\t\t/**\n\t\t * Follow-up mode: \"all\" = send all follow-up messages at once, \"one-at-a-time\" = one per turn\n\t\t */\n\t\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\t\t/**\n\t\t * Custom stream function (for proxy backends, etc.). Default uses streamSimple.\n\t\t */\n\t\tstreamFn?: Loop.StreamFn;\n\t\t/**\n\t\t * Optional session identifier forwarded to LLM providers.\n\t\t * Used by providers that support session-based caching (e.g., OpenAI Codex).\n\t\t */\n\t\tsessionId?: string;\n\t\t/**\n\t\t * Resolves an API key dynamically for each LLM call.\n\t\t * Useful for expiring tokens (e.g., GitHub Copilot OAuth).\n\t\t */\n\t\tgetApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\t\t/**\n\t\t * Inspect or replace provider payloads before they are sent.\n\t\t */\n\t\tonPayload?: Stream.SimpleOptions[\"onPayload\"];\n\t\t/**\n\t\t * Custom token budgets for thinking levels (token-based providers only).\n\t\t */\n\t\tthinkingBudgets?: Stream.ThinkingBudgets;\n\t\t/**\n\t\t * Preferred transport for providers that support multiple transports.\n\t\t */\n\t\ttransport?: Stream.Transport;\n\t\t/**\n\t\t * Maximum delay in milliseconds to wait for a retry when the server requests a long wait.\n\t\t * If the server's requested delay exceeds this value, the request fails immediately,\n\t\t * allowing higher-level retry logic to handle it with user visibility.\n\t\t * Default: 60000 (60 seconds). Set to 0 to disable the cap.\n\t\t */\n\t\tmaxRetryDelayMs?: number;\n\t\t/** Tool execution mode. Default: \"parallel\" */\n\t\ttoolExecution?: Loop.ToolExecutionMode;\n\t\t/** Called before a tool is executed, after arguments have been validated. */\n\t\tbeforeToolExecution?: (\n\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Loop.BeforeToolCallResult | undefined>;\n\t\t/** Called after a tool finishes executing, before final tool events are emitted. */\n\t\tafterToolExecution?: (\n\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\t}\n\n\texport const AgentInStreamingErr = NamedError.create(\n\t\t\"AgentInStreamingErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t\tname: Type.String(),\n\t\t}),\n\t);\n\n\texport class Instance {\n\t\tprivate _state: State;\n\n\t\tprivate listeners = new Set<(e: Event.AgentEvent) => void>();\n\t\tprivate abortController?: AbortController;\n\n\t\tprivate convertToLlm: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\tprivate transformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\n\t\tprivate steeringQueue: Message.UserMessage[] = [];\n\t\tprivate followUpQueue: Message.UserMessage[] = [];\n\t\tprivate steeringMode: \"all\" | \"one-at-a-time\";\n\t\tprivate followUpMode: \"all\" | \"one-at-a-time\";\n\n\t\tpublic streamFn: Loop.StreamFn;\n\n\t\tprivate _sessionId?: string;\n\t\tpublic getApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\n\t\tprivate _onPayload?: Stream.SimpleOptions[\"onPayload\"];\n\n\t\tprivate runningPrompt?: Promise<void>;\n\t\tprivate resolveRunningPrompt?: () => void;\n\t\tprivate _thinkingBudgets?: Stream.ThinkingBudgets;\n\t\tprivate _transport: Stream.Transport;\n\t\tprivate _maxRetryDelayMs?: number;\n\t\tprivate _toolExecution: Loop.ToolExecutionMode;\n\n\t\tprivate _beforeToolExecution?: (\n\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Loop.BeforeToolCallResult | undefined>;\n\t\tprivate _afterToolExecution?: (\n\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\n\t\tconstructor(name: string, model: Model.Value, opts: AgentOptions = {}) {\n\t\t\tthis._state = {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\ttools: [],\n\t\t\t\tmessages: [],\n\t\t\t\tisStreaming: false,\n\t\t\t\tstreamMessage: null,\n\t\t\t\tpendingToolCalls: new Set<string>(),\n\t\t\t\terror: undefined,\n\t\t\t\t...opts.initialState,\n\t\t\t\tname,\n\t\t\t\tmodel,\n\t\t\t};\n\t\t\t/**\n\t\t\t * Transformation logic to prepare messages for the LLM.\n\t\t\t * * @remarks\n\t\t\t * Currently just forwards messages as-is. Modify this logic when\n\t\t\t * specific formatting or filtering is required.\n\t\t\t * A good example is using user message parts with custom content\n\t\t\t * * @default\n\t\t\t * forwards messages as is.\n\t\t\t */\n\t\t\tthis.convertToLlm = opts.convertToLlm || ((messages: Message.Message[]) => messages);\n\t\t\tthis.transformContext = opts.transformContext;\n\n\t\t\tthis.steeringMode = opts.steeringMode || \"one-at-a-time\";\n\t\t\tthis.followUpMode = opts.followUpMode || \"one-at-a-time\";\n\n\t\t\tthis.streamFn = opts.streamFn || Stream.streamSimple;\n\t\t\tthis._sessionId = opts.sessionId;\n\n\t\t\tthis.getApiKey = opts.getApiKey;\n\t\t\tthis._onPayload = opts.onPayload;\n\n\t\t\tthis._thinkingBudgets = opts.thinkingBudgets;\n\t\t\tthis._transport = opts.transport ?? \"sse\";\n\t\t\tthis._maxRetryDelayMs = opts.maxRetryDelayMs;\n\n\t\t\tthis._toolExecution = opts.toolExecution ?? \"parallel\";\n\t\t\tthis._beforeToolExecution = opts.beforeToolExecution;\n\t\t\tthis._afterToolExecution = opts.afterToolExecution;\n\t\t}\n\n\t\t/**\n\t\t * Get the current session ID used for provider caching.\n\t\t */\n\t\tget sessionId(): string | undefined {\n\t\t\treturn this._sessionId;\n\t\t}\n\n\t\t/**\n\t\t * Set the session ID for provider caching.\n\t\t * Call this when switching sessions (new session, branch, resume, etc).\n\t\t */\n\t\tset sessionId(value: string | undefined) {\n\t\t\tthis._sessionId = value;\n\t\t}\n\t\t/**\n\t\t * Get the current thinking budgets.\n\t\t */\n\t\tget thinkingBudgets(): Stream.ThinkingBudgets | undefined {\n\t\t\treturn this._thinkingBudgets;\n\t\t}\n\t\t/**\n\t\t * Set custom thinking budgets for token-based providers.\n\t\t */\n\t\tset thinkingBudgets(value: Stream.ThinkingBudgets | undefined) {\n\t\t\tthis._thinkingBudgets = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the current preferred transport.\n\t\t */\n\t\tget transport(): Stream.Transport {\n\t\t\treturn this._transport;\n\t\t}\n\t\t/**\n\t\t * Set the preferred transport.\n\t\t */\n\t\tsetTransport(value: Stream.Transport) {\n\t\t\tthis._transport = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the current max retry delay in milliseconds.\n\t\t */\n\t\tget maxRetryDelayMs(): number | undefined {\n\t\t\treturn this._maxRetryDelayMs;\n\t\t}\n\n\t\t/**\n\t\t * Set the maximum delay to wait for server-requested retries.\n\t\t * Set to 0 to disable the cap.\n\t\t */\n\t\tset maxRetryDelayMs(value: number | undefined) {\n\t\t\tthis._maxRetryDelayMs = value;\n\t\t}\n\n\t\tget toolExecution(): Loop.ToolExecutionMode {\n\t\t\treturn this._toolExecution;\n\t\t}\n\n\t\tsetToolExecution(value: Loop.ToolExecutionMode) {\n\t\t\tthis._toolExecution = value;\n\t\t}\n\n\t\tsetBeforeToolExecution(\n\t\t\tvalue:\n\t\t\t\t| ((\n\t\t\t\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\t\t\t\tsignal?: AbortSignal,\n\t\t\t\t ) => Promise<Loop.BeforeToolCallResult | undefined>)\n\t\t\t\t| undefined,\n\t\t) {\n\t\t\tthis._beforeToolExecution = value;\n\t\t}\n\n\t\tsetAfterToolExecution(\n\t\t\tvalue:\n\t\t\t\t| ((\n\t\t\t\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\t\t\t\tsignal?: AbortSignal,\n\t\t\t\t ) => Promise<Agent.ToolTerminalResult<unknown> | undefined>)\n\t\t\t\t| undefined,\n\t\t) {\n\t\t\tthis._afterToolExecution = value;\n\t\t}\n\n\t\tget state(): State {\n\t\t\treturn this._state;\n\t\t}\n\n\t\tsubscribe(fn: (e: Event.AgentEvent) => void): () => void {\n\t\t\tthis.listeners.add(fn);\n\t\t\treturn () => this.listeners.delete(fn);\n\t\t}\n\n\t\t// State mutators\n\t\tsetSystemPrompt(v: string) {\n\t\t\tthis._state.systemPrompt = v;\n\t\t}\n\t\tsetModel(m: Model.Value) {\n\t\t\tthis._state.model = m;\n\t\t}\n\t\tsetThinkingLevel(l: Stream.ThinkingLevel) {\n\t\t\tthis._state.thinkingLevel = l;\n\t\t}\n\t\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\") {\n\t\t\tthis.steeringMode = mode;\n\t\t}\n\n\t\tgetSteeringMode(): \"all\" | \"one-at-a-time\" {\n\t\t\treturn this.steeringMode;\n\t\t}\n\n\t\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\") {\n\t\t\tthis.followUpMode = mode;\n\t\t}\n\n\t\tgetFollowUpMode(): \"all\" | \"one-at-a-time\" {\n\t\t\treturn this.followUpMode;\n\t\t}\n\n\t\tsetTools(t: AgentTool<any>[]) {\n\t\t\tthis._state.tools = t;\n\t\t}\n\n\t\treplaceMessages(ms: Message.Message[]) {\n\t\t\tthis._state.messages = ms.slice();\n\t\t}\n\n\t\tappendMessage(m: Message.Message) {\n\t\t\tthis._state.messages = [...this._state.messages, m];\n\t\t}\n\n\t\tprivate findMessageIndexById(messageId: string): number {\n\t\t\treturn this._state.messages.findIndex((message) => message.messageId === messageId);\n\t\t}\n\n\t\tprivate replaceMessageById(message: Message.Message): boolean {\n\t\t\tconst messageIndex = this.findMessageIndexById(message.messageId);\n\t\t\tif (messageIndex === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst messages = this._state.messages.slice();\n\t\t\tmessages[messageIndex] = message;\n\t\t\tthis._state.messages = messages;\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate upsertMessage(message: Message.Message): void {\n\t\t\tif (this.replaceMessageById(message)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.appendMessage(message);\n\t\t}\n\n\t\tprivate patchStoredAssistantPart(\n\t\t\tmessageId: string,\n\t\t\tpartIndex: number,\n\t\t\tpart: Message.AssistantMessage[\"parts\"][number],\n\t\t): boolean {\n\t\t\tconst messageIndex = this.findMessageIndexById(messageId);\n\t\t\tif (messageIndex === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst messages = this._state.messages.slice();\n\t\t\tconst existing = messages[messageIndex];\n\t\t\tif (!existing || existing.role !== \"assistant\") {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst nextParts = existing.parts.slice();\n\t\t\tnextParts[partIndex] = part;\n\t\t\tmessages[messageIndex] = {\n\t\t\t\t...existing,\n\t\t\t\tparts: nextParts,\n\t\t\t};\n\t\t\tthis._state.messages = messages;\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Queue a steering message while the agent is running.\n\t\t * Delivered after the current assistant turn finishes executing its tool calls,\n\t\t * before the next LLM call.\n\t\t */\n\t\tsteer(m: Message.UserMessage) {\n\t\t\tthis.steeringQueue.push(m);\n\t\t}\n\n\t\t/**\n\t\t * Queue a follow-up message to be processed after the agent finishes.\n\t\t * Delivered only when agent has no more tool calls or steering messages.\n\t\t */\n\t\tfollowUp(m: Message.UserMessage) {\n\t\t\tthis.followUpQueue.push(m);\n\t\t}\n\n\t\tclearSteeringQueue() {\n\t\t\tthis.steeringQueue = [];\n\t\t}\n\n\t\tclearFollowUpQueue() {\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\tclearAllQueues() {\n\t\t\tthis.steeringQueue = [];\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\thasQueuedMessages(): boolean {\n\t\t\treturn this.steeringQueue.length > 0 || this.followUpQueue.length > 0;\n\t\t}\n\n\t\tprivate dequeueSteeringMessages(): Message.UserMessage[] {\n\t\t\tif (this.steeringMode === \"one-at-a-time\") {\n\t\t\t\tif (this.steeringQueue.length > 0) {\n\t\t\t\t\tconst first = this.steeringQueue[0]!;\n\t\t\t\t\tthis.steeringQueue = this.steeringQueue.slice(1);\n\t\t\t\t\treturn [first];\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst steering = this.steeringQueue.slice();\n\t\t\tthis.steeringQueue = [];\n\t\t\treturn steering;\n\t\t}\n\n\t\tprivate dequeueFollowUpMessages(): Message.UserMessage[] {\n\t\t\tif (this.followUpMode === \"one-at-a-time\") {\n\t\t\t\tif (this.followUpQueue.length > 0) {\n\t\t\t\t\tconst first = this.followUpQueue[0]!;\n\t\t\t\t\tthis.followUpQueue = this.followUpQueue.slice(1);\n\t\t\t\t\treturn [first];\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst followUp = this.followUpQueue.slice();\n\t\t\tthis.followUpQueue = [];\n\t\t\treturn followUp;\n\t\t}\n\n\t\tclearMessages() {\n\t\t\tthis._state.messages = [];\n\t\t}\n\n\t\tabort() {\n\t\t\tthis.abortController?.abort();\n\t\t}\n\n\t\twaitForIdle(): Promise<void> {\n\t\t\treturn this.runningPrompt ?? Promise.resolve();\n\t\t}\n\n\t\treset() {\n\t\t\tthis._state.messages = [];\n\t\t\tthis._state.isStreaming = false;\n\t\t\tthis._state.streamMessage = null;\n\t\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\t\tthis._state.error = undefined;\n\t\t\tthis.steeringQueue = [];\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\tgetName(): string {\n\t\t\treturn this._state.name;\n\t\t}\n\n\t\tprivate ensureIdle() {\n\t\t\tif (this._state.isStreaming) {\n\t\t\t\tthrow new AgentInStreamingErr({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"agent is already processing a prompt. Use steer() or followup() to queue messages, or wait for completion.\",\n\t\t\t\t\tname: this._state.name,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tprivate async _runLoop(messages?: Message.UserMessage[], opts?: { skipInitialSteeringPoll?: boolean }) {\n\t\t\tconst model = this._state.model;\n\t\t\tif (!model)\n\t\t\t\tthrow new ModelNotConfiguredErr({\n\t\t\t\t\tmessage: \"no model configured yet\",\n\t\t\t\t});\n\n\t\t\tthis.runningPrompt = new Promise<void>((resolve) => {\n\t\t\t\tthis.resolveRunningPrompt = resolve;\n\t\t\t});\n\n\t\t\tthis.abortController = new AbortController();\n\t\t\tthis._state.isStreaming = true;\n\t\t\tthis._state.streamMessage = null;\n\t\t\tthis._state.error = undefined;\n\n\t\t\tconst reasoning = this.state.thinkingLevel === \"off\" ? undefined : this._state.thinkingLevel;\n\n\t\t\tconst context: Agent.AgentContext = {\n\t\t\t\tsystemPrompt: this._state.systemPrompt,\n\t\t\t\tmessages: this._state.messages.slice(),\n\t\t\t\ttools: this._state.tools,\n\t\t\t};\n\n\t\t\tlet skipInitialSteeringPoll = opts?.skipInitialSteeringPoll === true;\n\n\t\t\tconst config: Loop.Config = {\n\t\t\t\tmodel,\n\t\t\t\treasoning,\n\t\t\t\tsessionId: this._sessionId,\n\t\t\t\tonPayload: this._onPayload,\n\t\t\t\ttransport: this._transport,\n\t\t\t\tthinkingBudgets: this._thinkingBudgets,\n\t\t\t\tmaxRetryDelayMs: this._maxRetryDelayMs,\n\t\t\t\ttoolExecution: this._toolExecution,\n\t\t\t\tbeforeToolExecution: this._beforeToolExecution,\n\t\t\t\tafterToolExecution: this._afterToolExecution,\n\t\t\t\tconvertToLlm: this.convertToLlm,\n\t\t\t\ttransformContext: this.transformContext,\n\t\t\t\tgetApiKey: this.getApiKey,\n\t\t\t\tgetSteeringMessages: async () => {\n\t\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dequeueSteeringMessages();\n\t\t\t\t},\n\t\t\t\tgetFollowUpMessages: async () => this.dequeueFollowUpMessages(),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tif (messages) {\n\t\t\t\t\tawait Loop.runAgentLoop(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmessages,\n\t\t\t\t\t\tasync (e) => this._processLoopEvent(e),\n\t\t\t\t\t\tthis.streamFn,\n\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait Loop.runAgentLoopContinue(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tasync (e) => this._processLoopEvent(e),\n\t\t\t\t\t\tthis.streamFn,\n\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tconst message = Message.createAssistantMessage({\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tprotocol: model.protocol,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: this.abortController.signal.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: err?.message || String(err),\n\t\t\t\t\ttime: {\n\t\t\t\t\t\tcreated: Date.now(),\n\t\t\t\t\t\tcompleted: Date.now(),\n\t\t\t\t\t},\n\t\t\t\t\tparts: [],\n\t\t\t\t});\n\n\t\t\t\tthis.appendMessage(message);\n\t\t\t\tthis._state.error = err?.message || String(err);\n\t\t\t\tthis.emit({ type: \"agent.end\", messages: [message] });\n\t\t\t} finally {\n\t\t\t\tthis._state.isStreaming = false;\n\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\t\t\tthis.abortController = undefined;\n\t\t\t\tthis.resolveRunningPrompt?.();\n\t\t\t\tthis.runningPrompt = undefined;\n\t\t\t\tthis.resolveRunningPrompt = undefined;\n\t\t\t}\n\t\t}\n\n\t\tasync loop(messages: Message.UserMessage[]): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tawait this._runLoop(messages);\n\t\t}\n\n\t\tasync loopContinue(): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tawait this._runLoop();\n\t\t}\n\n\t\tasync prompt(messages: Message.TextContent[], images?: Message.ImageContent[]): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tconst model = this._state.model;\n\t\t\tif (!model)\n\t\t\t\tthrow new ModelNotConfiguredErr({\n\t\t\t\t\tmessage: \"no model configured yet.\",\n\t\t\t\t});\n\n\t\t\tconst message = Message.createUserMessage({\n\t\t\t\trole: \"user\",\n\t\t\t\ttime: {\n\t\t\t\t\tcreated: Date.now(),\n\t\t\t\t},\n\t\t\t\tparts: [...messages, ...(images ?? [])],\n\t\t\t});\n\n\t\t\tawait this.loop([message]);\n\t\t}\n\n\t\tprivate _processLoopEvent(event: Event.AgentEvent): void {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"message.start\": {\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"message.part.start\":\n\t\t\t\tcase \"message.part.update\":\n\t\t\t\tcase \"message.part.end\": {\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tif (event.message.role === \"assistant\") {\n\t\t\t\t\t\tthis.patchStoredAssistantPart(event.message.messageId, event.partIndex, event.part);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"message.update\":\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tthis.replaceMessageById(event.message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"message.end\":\n\t\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\t\tthis.upsertMessage(event.message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tool.execution.start\": {\n\t\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\t\tpendingToolCalls.add(event.callID);\n\t\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"tool.execution.end\": {\n\t\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\t\tpendingToolCalls.delete(event.callID);\n\t\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"turn.end\":\n\t\t\t\t\tif (event.message.role === \"assistant\" && event.message.parts.length > 0) {\n\t\t\t\t\t\tthis._state.error = event.message.errorMessage;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"agent.end\":\n\t\t\t\t\tthis._state.isStreaming = false;\n\t\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.emit(event);\n\t\t}\n\n\t\tprivate emit(e: Event.AgentEvent) {\n\t\t\tfor (const listener of this.listeners) {\n\t\t\t\tlistener(e);\n\t\t\t}\n\t\t}\n\t}\n\n\texport async function create<TProvider extends Provider.KnownProvider, TModel extends Model.Value[\"id\"]>(\n\t\toptions: AgentOptions & {\n\t\t\tprovider: TProvider;\n\t\t\tmodel: TModel;\n\t\t\tname?: string;\n\t\t},\n\t): Promise<Instance>;\n\texport async function create(options: AgentOptions & { model: Model.Value; name?: string }): Promise<Instance>;\n\texport async function create(\n\t\toptions:\n\t\t\t| (AgentOptions & { model: Model.Value; name?: string })\n\t\t\t| (AgentOptions & {\n\t\t\t\t\tprovider: Provider.KnownProvider;\n\t\t\t\t\tmodel: Model.Value[\"id\"];\n\t\t\t\t\tname?: string;\n\t\t\t }),\n\t): Promise<Instance> {\n\t\tlet resolvedModel: Model.Value;\n\t\tif (\"provider\" in options) {\n\t\t\tconst result = await Model.getModel(options.provider, options.model);\n\t\t\tif (!result) {\n\t\t\t\tthrow new ModelNotFoundErr({\n\t\t\t\t\tmessage: \"model not found or not configured yet\",\n\t\t\t\t\tprovider: options.provider,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t});\n\t\t\t}\n\t\t\tresolvedModel = result;\n\t\t} else {\n\t\t\tresolvedModel = options.model;\n\t\t}\n\n\t\treturn new Instance(options.name ?? \"main\", resolvedModel, options);\n\t}\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, type TSchema, Type, TypeGuard } from \"@sinclair/typebox\";\nimport { transform } from \"esbuild\";\nimport { capitalize } from \"remeda\";\nimport { validateSchema } from \"../../utils/validation\";\nimport { Agent } from \"../agent\";\n\nexport namespace CodeMode {\n\texport const ToolDefinitionErr = NamedError.create(\n\t\t\"ToolDefinitionErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\n\tconst toolFnPrefix = process.env.CODEWORK_CODEMODE_FN_PREFIX ?? \"external_\";\n\n\texport const SandboxExecutionInputSchema = Type.Object({\n\t\ttypescriptCode: Type.String({\n\t\t\tdescription: \"TypeScript code to execute in the sandbox.\",\n\t\t}),\n\t});\n\texport type SandboxExecutionInput = Static<typeof SandboxExecutionInputSchema>;\n\n\texport const SandboxExecutionOutputSchema = Type.Object({\n\t\tresult: Type.Optional(Type.Unknown()),\n\t\tlogs: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type SandboxExecutionOutput = Static<typeof SandboxExecutionOutputSchema>;\n\n\texport const SandboxExecutionErrorSchema = Type.Object({\n\t\tmessage: Type.String(),\n\t\tname: Type.Optional(Type.String()),\n\t\tstack: Type.Optional(Type.String()),\n\t\tline: Type.Optional(Type.Number()),\n\t\tlogs: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type SandboxExecutionError = Static<typeof SandboxExecutionErrorSchema>;\n\n\texport interface NormalizedError {\n\t\tmessage: string;\n\t\tname?: string;\n\t\tstack?: string;\n\t\tline?: number;\n\t}\n\n\texport interface ExecutionResult<T = unknown> {\n\t\tsuccess: boolean;\n\t\tvalue?: T;\n\t\tlogs?: string[];\n\t\terror?: NormalizedError;\n\t}\n\n\texport interface Context {\n\t\texecute: <T = unknown>(code: string) => Promise<ExecutionResult<T>>;\n\t\tdispose: () => Promise<void>;\n\t}\n\n\texport interface DriverContextConfig {\n\t\tbindings: Record<string, ToolBinding>;\n\t\ttimeout?: number;\n\t\tmemoryLimit?: number;\n\t\tsignal?: AbortSignal;\n\t}\n\n\texport interface Driver {\n\t\tcreateContext: (config: DriverContextConfig) => Promise<Context>;\n\t}\n\n\texport interface ToolConfig {\n\t\t/**\n\t\t * Driver for sandbox code execution\n\t\t */\n\t\tdriver: Driver;\n\t\t/**\n\t\t * Tools to expose for functions in sandbox\n\t\t */\n\t\ttools: Agent.AnyAgentTool[];\n\t\t/**\n\t\t * Execution timeout in milliseconds (default: 30000)\n\t\t */\n\t\ttimeout?: number;\n\t\t/**\n\t\t * Memory limit in MB for sandbox (default: 128)\n\t\t */\n\t\tmemoryLimit?: number;\n\t\t/**\n\t\t * Tool function prefix.\n\t\t * @default env.CODEWORK_CODEMODE_FN_PREFIX ?? \"external_\"\n\t\t */\n\t\tfnPrefix?: string;\n\t}\n\n\texport interface ToolBinding {\n\t\tname: string;\n\t\tdescription: string;\n\t\tinputSchema: TSchema;\n\t\toutputSchema?: TSchema;\n\t\terrorSchema?: TSchema;\n\t\texecute: (callID: string, params: unknown, signal?: AbortSignal) => Promise<unknown>;\n\t}\n\n\t/**\n\t * Options for type stub generation\n\t */\n\texport interface TypeGeneratorOptions {\n\t\t/**\n\t\t * Include JSDoc comments with descriptions\n\t\t * @default true\n\t\t */\n\t\tincludeDescriptions?: boolean;\n\t}\n\n\tfunction withMessageInStack(message: string, stack: string | undefined): string | undefined {\n\t\tif (!stack) return undefined;\n\t\treturn stack.includes(message) ? stack : `${message}\\n${stack}`;\n\t}\n\n\tfunction normalizeExecutionError(error: unknown): NormalizedError {\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\tname: error.name,\n\t\t\t\tmessage: error.message,\n\t\t\t\tstack: withMessageInStack(error.message, error.stack),\n\t\t\t\tline: parseErrorLine(error.stack),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\tconst candidate = error as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tname: typeof candidate.name === \"string\" ? candidate.name : undefined,\n\t\t\t\tmessage:\n\t\t\t\t\ttypeof candidate.message === \"string\"\n\t\t\t\t\t\t? candidate.message\n\t\t\t\t\t\t: JSON.stringify(candidate) || \"Unknown execution error\",\n\t\t\t\tstack:\n\t\t\t\t\ttypeof candidate.stack === \"string\"\n\t\t\t\t\t\t? withMessageInStack(\n\t\t\t\t\t\t\t\ttypeof candidate.message === \"string\"\n\t\t\t\t\t\t\t\t\t? candidate.message\n\t\t\t\t\t\t\t\t\t: JSON.stringify(candidate) || \"Unknown execution error\",\n\t\t\t\t\t\t\t\tcandidate.stack,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tline: typeof candidate.line === \"number\" ? candidate.line : parseErrorLine(candidate.stack),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tname: \"Error\",\n\t\t\tmessage: String(error),\n\t\t};\n\t}\n\n\tfunction parseErrorLine(stack: unknown): number | undefined {\n\t\tif (typeof stack !== \"string\") return undefined;\n\t\tconst lineMatch = stack.match(/:(\\d+)(?::\\d+)?\\)?$/m);\n\t\treturn lineMatch ? Number(lineMatch[1]) : undefined;\n\t}\n\n\tfunction serializeForContent(value: unknown): string {\n\t\treturn JSON.stringify(\n\t\t\tvalue,\n\t\t\t(_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n\t\t\t2,\n\t\t);\n\t}\n\n\tfunction toolContentToText(result: { content: Array<{ type: string; text?: string }> }): string {\n\t\tconst parts = result.content\n\t\t\t.filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text);\n\t\treturn parts.join(\"\\n\").trim();\n\t}\n\n\tfunction unwrapToolResult(tool: Agent.AnyAgentTool, result: Agent.ToolTerminalResult<unknown, unknown>): unknown {\n\t\tif (result.status === \"completed\") {\n\t\t\tif (tool.outputSchema) {\n\t\t\t\treturn validateSchema(tool.outputSchema, result.result.details, `Tool \"${tool.name}\" output`);\n\t\t\t}\n\t\t\treturn result.result.details;\n\t\t}\n\n\t\tif (tool.errorSchema && result.result.details !== undefined) {\n\t\t\tvalidateSchema(tool.errorSchema, result.result.details, `Tool \"${tool.name}\" error`);\n\t\t}\n\n\t\tconst message = toolContentToText(result.result) || `Tool \"${tool.name}\" failed`;\n\t\tconst error = new Error(message);\n\t\tif (result.result.details !== undefined) {\n\t\t\t(error as Error & { cause?: unknown }).cause = result.result.details;\n\t\t}\n\t\tthrow error;\n\t}\n\n\tfunction toolToBinding(tool: Agent.AnyAgentTool, prefix: string = \"\"): ToolBinding {\n\t\tconst inputSchema = TypeGuard.IsSchema(tool.parameters) ? tool.parameters : Type.Object({});\n\t\tconst outputSchema = TypeGuard.IsSchema(tool.outputSchema) ? tool.outputSchema : undefined;\n\t\tconst errorSchema = TypeGuard.IsSchema(tool.errorSchema) ? tool.errorSchema : undefined;\n\n\t\tif (!(\"execute\" in tool) || typeof tool.execute !== \"function\") {\n\t\t\tthrow new ToolDefinitionErr({\n\t\t\t\tmessage: `tool \"${tool.name}\" does not have an execute function. code mode requires tools with implementation`,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tname: `${prefix}${tool.name}`,\n\t\t\tdescription: tool.description,\n\t\t\tinputSchema,\n\t\t\toutputSchema,\n\t\t\terrorSchema,\n\t\t\texecute: async (callID: string, params: unknown, signal?: AbortSignal) => {\n\t\t\t\tconst validatedParams = validateSchema(inputSchema, params, `Tool \"${tool.name}\" input`);\n\t\t\t\tconst terminalResult = await tool.execute(callID, validatedParams, signal);\n\t\t\t\treturn unwrapToolResult(tool, terminalResult);\n\t\t\t},\n\t\t};\n\t}\n\n\tfunction toolsForBinding(tools: Agent.AnyAgentTool[], prefix: string): Record<string, ToolBinding> {\n\t\tconst bindings: Record<string, ToolBinding> = {};\n\n\t\tfor (const tool of tools) {\n\t\t\tconst name = `${prefix}${tool.name}`;\n\t\t\tbindings[name] = toolToBinding(tool, prefix);\n\t\t}\n\n\t\treturn bindings;\n\t}\n\n\tfunction indent(value: string, depth: number = 1): string {\n\t\tconst prefix = \"\\t\".repeat(depth);\n\t\treturn value\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t.join(\"\\n\");\n\t}\n\n\tfunction toPropertyKey(name: string): string {\n\t\treturn /^[$A-Z_a-z][$\\w]*$/i.test(name) ? name : JSON.stringify(name);\n\t}\n\n\tfunction schemaToTypeScript(schema: TSchema): string {\n\t\tif (TypeGuard.IsAny(schema)) return \"any\";\n\t\tif (TypeGuard.IsUnknown(schema)) return \"unknown\";\n\t\tif (TypeGuard.IsString(schema)) return \"string\";\n\t\tif (TypeGuard.IsNumber(schema) || TypeGuard.IsInteger(schema)) return \"number\";\n\t\tif (TypeGuard.IsBoolean(schema)) return \"boolean\";\n\t\tif (TypeGuard.IsNull(schema)) return \"null\";\n\t\tif (TypeGuard.IsUndefined(schema) || TypeGuard.IsVoid(schema)) return \"undefined\";\n\t\tif (TypeGuard.IsLiteral(schema)) return JSON.stringify(schema.const);\n\n\t\tif (TypeGuard.IsArray(schema)) {\n\t\t\treturn `Array<${schemaToTypeScript(schema.items)}>`;\n\t\t}\n\n\t\tif (TypeGuard.IsTuple(schema)) {\n\t\t\tconst items = schema.items ?? [];\n\t\t\treturn `[${items.map((item) => schemaToTypeScript(item)).join(\", \")}]`;\n\t\t}\n\n\t\tif (TypeGuard.IsUnion(schema)) {\n\t\t\treturn schema.anyOf.map((item) => schemaToTypeScript(item)).join(\" | \");\n\t\t}\n\n\t\tif (TypeGuard.IsIntersect(schema)) {\n\t\t\treturn schema.allOf.map((item) => schemaToTypeScript(item)).join(\" & \");\n\t\t}\n\n\t\tif (TypeGuard.IsRecord(schema)) {\n\t\t\tconst valueSchema =\n\t\t\t\tObject.values(schema.patternProperties ?? {}).find(TypeGuard.IsSchema) ??\n\t\t\t\t(schema.additionalProperties && TypeGuard.IsSchema(schema.additionalProperties)\n\t\t\t\t\t? schema.additionalProperties\n\t\t\t\t\t: Type.Unknown());\n\t\t\treturn `Record<string, ${schemaToTypeScript(valueSchema)}>`;\n\t\t}\n\n\t\tif (TypeGuard.IsObject(schema)) {\n\t\t\tconst required = new Set(schema.required ?? []);\n\t\t\tconst properties = Object.entries(schema.properties ?? {}).map(([key, value]) => {\n\t\t\t\tconst optional = required.has(key) ? \"\" : \"?\";\n\t\t\t\treturn `${toPropertyKey(key)}${optional}: ${schemaToTypeScript(value)};`;\n\t\t\t});\n\n\t\t\tif (schema.additionalProperties === true) {\n\t\t\t\tproperties.push(\"[key: string]: unknown;\");\n\t\t\t} else if (schema.additionalProperties && TypeGuard.IsSchema(schema.additionalProperties)) {\n\t\t\t\tproperties.push(`[key: string]: ${schemaToTypeScript(schema.additionalProperties)};`);\n\t\t\t}\n\n\t\t\tif (properties.length === 0) return \"{}\";\n\n\t\t\treturn `{\\n${indent(properties.join(\"\\n\"))}\\n}`;\n\t\t}\n\n\t\treturn \"unknown\";\n\t}\n\n\t/**\n\t * Generate TypeScript type stubs for all tool bindings.\n\t *\n\t * These stubs are included in the LLM system prompt so it knows the exact\n\t * type signatures of available tools.\n\t */\n\texport function generateTypeStubs(\n\t\tbindings: Record<string, ToolBinding>,\n\t\toptions: TypeGeneratorOptions = {},\n\t): string {\n\t\tconst { includeDescriptions = true } = options;\n\t\tconst declarations: string[] = [];\n\n\t\tfor (const [name, binding] of Object.entries(bindings)) {\n\t\t\tconst inputTypeName = `${capitalize(name)}Input`;\n\t\t\tconst outputTypeName = `${capitalize(name)}Output`;\n\n\t\t\tdeclarations.push(`type ${inputTypeName} = ${schemaToTypeScript(binding.inputSchema)};`);\n\n\t\t\tlet outputTypeRef = \"unknown\";\n\t\t\tif (binding.outputSchema !== undefined) {\n\t\t\t\tdeclarations.push(`type ${outputTypeName} = ${schemaToTypeScript(binding.outputSchema)};`);\n\t\t\t\toutputTypeRef = outputTypeName;\n\t\t\t}\n\n\t\t\tconst description = includeDescriptions && binding.description ? `/** ${binding.description} */\\n` : \"\";\n\t\t\tdeclarations.push(\n\t\t\t\t`${description}declare function ${name}(input: ${inputTypeName}): Promise<${outputTypeRef}>;`,\n\t\t\t);\n\t\t}\n\n\t\treturn declarations.join(\"\\n\\n\");\n\t}\n\n\tfunction buildExampleSnippet(): string[] {\n\t\treturn [\n\t\t\t\"```typescript\",\n\t\t\t\"const numbers = [12, 24, 36];\",\n\t\t\t\"const total = numbers.reduce((sum, value) => sum + value, 0);\",\n\t\t\t\"\",\n\t\t\t\"return {\",\n\t\t\t\" count: numbers.length,\",\n\t\t\t\" average: total / numbers.length,\",\n\t\t\t\"};\",\n\t\t\t\"```\",\n\t\t];\n\t}\n\n\texport function generateSystemPrompt(config: ToolConfig): string {\n\t\tconst fnPrefix = config.fnPrefix ?? toolFnPrefix;\n\t\tconst bindings = toolsForBinding(config.tools, fnPrefix);\n\t\tconst typeStubs = generateTypeStubs(bindings);\n\t\tconst functionDocs =\n\t\t\tObject.entries(bindings)\n\t\t\t\t.map(([name, binding]) => `- \\`${name}(input)\\`: ${binding.description}`)\n\t\t\t\t.join(\"\\n\") || \"- No external APIs available for this run.\";\n\n\t\treturn [\n\t\t\t\"## Code Execution Tool\",\n\t\t\t\"\",\n\t\t\t\"You have access to `sandbox_execute_typescript` which runs TypeScript code in a sandboxed environment.\",\n\t\t\t\"\",\n\t\t\t\"### When to Use\",\n\t\t\t\"\",\n\t\t\t\"Use `sandbox_execute_typescript` when you need to:\",\n\t\t\t\"- Process data with loops, conditionals, or complex logic\",\n\t\t\t\"- Make multiple tool calls in parallel with `Promise.all(...)`\",\n\t\t\t\"- Transform, filter, or aggregate data\",\n\t\t\t\"- Perform calculations or data analysis\",\n\t\t\t\"\",\n\t\t\t\"For simple operations, prefer calling tools directly.\",\n\t\t\t\"\",\n\t\t\t\"### Available External APIs\",\n\t\t\t\"\",\n\t\t\t\"Inside your TypeScript code, you can call these async functions:\",\n\t\t\t\"\",\n\t\t\tfunctionDocs,\n\t\t\t\"\",\n\t\t\t\"### Type Definitions\",\n\t\t\t\"\",\n\t\t\t\"```typescript\",\n\t\t\ttypeStubs,\n\t\t\t\"```\",\n\t\t\t\"\",\n\t\t\t\"### Example\",\n\t\t\t\"\",\n\t\t\t...buildExampleSnippet(),\n\t\t\t\"\",\n\t\t\t\"### Important Notes\",\n\t\t\t\"\",\n\t\t\t\"- All\" + `\\`${fnPrefix}\\`*` + \"calls are async, so always use `await`\",\n\t\t\t\"- Return a value to pass results back to you\",\n\t\t\t\"- Use `console.log()` for debugging (logs are captured)\",\n\t\t\t\"- The sandbox is isolated - no network access or file system\",\n\t\t\t\"- Each execution is isolated and does not share state with previous runs\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t}\n\n\tasync function transpileTypeScript(typescriptCode: string): Promise<string> {\n\t\tconst wrappedSource = [\n\t\t\t\"(async () => {\",\n\t\t\t\"\\tconst __codemodeNormalizeError = (error: unknown) => {\",\n\t\t\t\"\\t\\tif (error instanceof Error) return { name: error.name, message: error.message, stack: error.stack };\",\n\t\t\t\"\\t\\tif (typeof error === 'object' && error !== null) {\",\n\t\t\t\"\\t\\t\\tconst candidate = error as { name?: unknown; message?: unknown; stack?: unknown };\",\n\t\t\t\"\\t\\t\\treturn {\",\n\t\t\t\"\\t\\t\\t\\tname: typeof candidate.name === 'string' ? candidate.name : 'Error',\",\n\t\t\t\"\\t\\t\\t\\tmessage:\",\n\t\t\t\"\\t\\t\\t\\t\\ttypeof candidate.message === 'string'\",\n\t\t\t\"\\t\\t\\t\\t\\t\\t? candidate.message\",\n\t\t\t\"\\t\\t\\t\\t\\t\\t: JSON.stringify(candidate) || 'Unknown execution error',\",\n\t\t\t\"\\t\\t\\t\\tstack: typeof candidate.stack === 'string' ? candidate.stack : undefined,\",\n\t\t\t\"\\t\\t\\t};\",\n\t\t\t\"\\t\\t}\",\n\t\t\t\"\\t\\treturn { name: 'Error', message: String(error) };\",\n\t\t\t\"\\t};\",\n\t\t\t\"\\ttry {\",\n\t\t\ttypescriptCode,\n\t\t\t\"\\t} catch (error) {\",\n\t\t\t\"\\t\\tthrow __codemodeNormalizeError(error);\",\n\t\t\t\"\\t}\",\n\t\t\t\"})()\",\n\t\t].join(\"\\n\");\n\t\tconst transformed = await transform(wrappedSource, {\n\t\t\tloader: \"ts\",\n\t\t\ttarget: \"es2022\",\n\t\t\tsourcefile: \"script.ts\",\n\t\t\tminify: false,\n\t\t\tkeepNames: false,\n\t\t});\n\t\treturn transformed.code;\n\t}\n\n\tfunction buildToolDescription(tools: Agent.AnyAgentTool[], fnPrefix = toolFnPrefix): string {\n\t\tconst externalFunctions = tools.map((tool) => `${fnPrefix}${tool.name}`).join(\"\\n\");\n\n\t\treturn [\n\t\t\t\"Execute TypeScript code in a secure sandbox environment. \",\n\t\t\t\"The code can use these external API functions:\",\n\t\t\t\"<functions>\",\n\t\t\t` ${externalFunctions}`,\n\t\t\t\"</functions>\",\n\t\t\t`All ${fnPrefix}* calls are async and must be awaited. `,\n\t\t\t\"Return a value to pass results back. Use console.log() for debugging.\",\n\t\t].join(\"\\n\");\n\t}\n\n\texport function createCodeModeTool(\n\t\tconfig: ToolConfig,\n\t): Agent.AgentTool<\n\t\ttypeof SandboxExecutionInputSchema,\n\t\ttypeof SandboxExecutionOutputSchema,\n\t\tunknown,\n\t\ttypeof SandboxExecutionErrorSchema\n\t> {\n\t\tif (config.tools.length === 0) {\n\t\t\tthrow new ToolDefinitionErr({ message: \"at least one tool must be provided to `createCodeModeTool`\" });\n\t\t}\n\n\t\tconst tool = Agent.defineTool({\n\t\t\tname: \"sandbox_execute_typescript\",\n\t\t\tlabel: \"Sandbox TypeScript\",\n\t\t\tdescription: buildToolDescription(config.tools, config.fnPrefix),\n\t\t\tparameters: SandboxExecutionInputSchema,\n\t\t\toutputSchema: SandboxExecutionOutputSchema,\n\t\t\terrorSchema: SandboxExecutionErrorSchema,\n\t\t\tasync execute(_callID, params, signal, onUpdate) {\n\t\t\t\tconst bindings = toolsForBinding(config.tools, config.fnPrefix ?? toolFnPrefix);\n\t\t\t\tlet context: Context | undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait onUpdate?.({\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t\tpartial: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Transpiling TypeScript for sandbox execution\" }],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst javascriptCode = await transpileTypeScript(params.typescriptCode);\n\n\t\t\t\t\tawait onUpdate?.({\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t\tpartial: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Executing code in sandbox runtime\" }],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tcontext = await config.driver.createContext({\n\t\t\t\t\t\tbindings,\n\t\t\t\t\t\ttimeout: config.timeout,\n\t\t\t\t\t\tmemoryLimit: config.memoryLimit,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst executionResult = await context.execute(javascriptCode);\n\t\t\t\t\tif (executionResult.success) {\n\t\t\t\t\t\tconst details: SandboxExecutionOutput = {\n\t\t\t\t\t\t\tresult: executionResult.value,\n\t\t\t\t\t\t\t...(executionResult.logs && executionResult.logs.length > 0 ? { logs: executionResult.logs } : {}),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst details: SandboxExecutionError = {\n\t\t\t\t\t\tmessage: executionResult.error?.message || \"sandbox execution failed\",\n\t\t\t\t\t\t...(executionResult.error?.name ? { name: executionResult.error.name } : {}),\n\t\t\t\t\t\t...(executionResult.error?.stack ? { stack: executionResult.error.stack } : {}),\n\t\t\t\t\t\t...(executionResult.error?.line != null ? { line: executionResult.error.line } : {}),\n\t\t\t\t\t\t...(executionResult.logs && executionResult.logs.length > 0 ? { logs: executionResult.logs } : {}),\n\t\t\t\t\t};\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst normalizedError = normalizeExecutionError(error);\n\t\t\t\t\tconst details: SandboxExecutionError = {\n\t\t\t\t\t\tmessage: normalizedError.message,\n\t\t\t\t\t\t...(normalizedError.name ? { name: normalizedError.name } : {}),\n\t\t\t\t\t\t...(normalizedError.stack ? { stack: normalizedError.stack } : {}),\n\t\t\t\t\t\t...(normalizedError.line != null ? { line: normalizedError.line } : {}),\n\t\t\t\t\t};\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\tawait context?.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\treturn tool;\n\t}\n\n\texport async function create(config: ToolConfig) {\n\t\treturn {\n\t\t\ttool: createCodeModeTool(config),\n\t\t\tsystemPrompt: generateSystemPrompt(config),\n\t\t};\n\t}\n}\n","import { Model } from \"./model/model\";\nimport type { Provider } from \"./provider/provider\";\n\ntype LLM = {\n\t<TProvider extends Provider.KnownProvider, TModel extends Model.Value[\"id\"]>(\n\t\tprovider: TProvider,\n\t\tmodel: TModel,\n\t): Promise<Model.Value | undefined>;\n\tmodel: typeof Model.getModel;\n\tmodels: typeof Model.getModels;\n\tproviders: typeof Model.getProviders;\n\tregistry: typeof Model.registry;\n\tsupportsXhigh: typeof Model.supportsXhigh;\n\tmodelsAreEqual: typeof Model.modelsAreEqual;\n};\n\nconst llmImpl = async <TProvider extends Provider.KnownProvider, TModel extends Model.Value[\"id\"]>(\n\tprovider: TProvider,\n\tmodel: TModel,\n): Promise<Model.Value | undefined> => Model.getModel(provider, model);\n\nexport const llm = Object.assign(llmImpl, {\n\tmodel: Model.getModel,\n\tmodels: Model.getModels,\n\tproviders: Model.getProviders,\n\tregistry: Model.registry,\n\tsupportsXhigh: Model.supportsXhigh,\n\tmodelsAreEqual: Model.modelsAreEqual,\n}) as LLM;\n","import \"./provider/register\";\n\nimport type { Message } from \"./message/message\";\nimport type { Model } from \"./model/model\";\nimport { Stream } from \"./provider/stream\";\nimport type { AssistantMessageEventStream } from \"./utils/eventstream\";\n\n/**\n * Stream assistant responses for a model and context.\n *\n * Example:\n *\n * ```ts\n * const s = stream(model, context, {\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * });\n *\n * for await (const event of s) {\n * if (event.type === \"text.delta\") {\n * process.stdout.write(event.delta);\n * }\n * }\n *\n * const message = await s.result();\n * ```\n *\n * This export also includes convenience helpers:\n *\n * ```ts\n * const message = await stream.complete(model, context, options);\n * const simple = stream.simple(model, context, options);\n * const simpleMessage = await stream.completeSimple(model, context, options);\n * ```\n */\ntype StreamCallable = {\n\t(model: Model.Value, context: Message.Context, options?: Stream.Options): AssistantMessageEventStream;\n\tcomplete: typeof Stream.complete;\n\tsimple: typeof Stream.streamSimple;\n\tcompleteSimple: typeof Stream.completeSimple;\n\tresolveProtocolProvider: typeof Stream.resolveProtocolProvider;\n};\n\nconst streamImpl = (\n\tmodel: Model.Value,\n\tcontext: Message.Context,\n\toptions?: Stream.Options,\n): AssistantMessageEventStream => Stream.stream(model, context, options);\n\n/**\n * Start a streaming assistant response for a model/context pair.\n *\n * This is the main streaming entrypoint.\n * Attached helpers:\n *\n * - `stream.complete(...)` resolves the final assistant message without manually iterating events.\n * - `stream.simple(...)` uses `Stream.SimpleOptions` for higher-level reasoning controls.\n * - `stream.completeSimple(...)` is the non-streaming counterpart to `stream.simple(...)`.\n * - `stream.resolveProtocolProvider(...)` exposes protocol resolution for advanced integrations.\n */\nexport const stream = Object.assign(streamImpl, {\n\tcomplete: Stream.complete,\n\tsimple: Stream.streamSimple,\n\tcompleteSimple: Stream.completeSimple,\n\tresolveProtocolProvider: Stream.resolveProtocolProvider,\n}) as StreamCallable;\n\n/** Resolve a streamed response directly to the final assistant message. */\nexport const complete = Stream.complete;\n/** Start a stream using the simplified options surface. */\nexport const streamSimple = Stream.streamSimple;\n/** Resolve a simplified stream request directly to the final assistant message. */\nexport const completeSimple = Stream.completeSimple;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["partialParse","createClient","buildSyntheticToolResult","convertMessages","convertTools","mapStopReason","buildParams","anthropicProvider","openAICompletionsProvider"],"sources":["../../src/provider/provider.ts","../../src/model/catalog.ts","../../src/model/transform.ts","../../src/model/model.ts","../../src/provider/stream.ts","../../src/utils/eventstream.ts","../../src/utils/validation.ts","../../src/agent/loop.ts","../../src/agent.ts","../../src/message/message.ts","../../src/utils/jsonparse.ts","../../src/utils/sanitize.ts","../../src/provider/providers/utils.ts","../../src/provider/providers/anthropic/index.ts","../../src/provider/providers/github/github.ts","../../src/provider/providers/openai/completions.ts","../../src/provider/register.ts","../../src/agent/agent.ts","../../src/agent/codemode/codemode.ts","../../src/llm.ts","../../src/stream.ts"],"sourcesContent":["import { type Static, Type } from \"@sinclair/typebox\";\n\nexport namespace Provider {\n\texport const KnownProviderEnum = {\n\t\tanthropic: \"anthropic\",\n\t\topenai: \"openai\",\n\t\tgithubCopilot: \"github-copilot\",\n\t\topenrouter: \"openrouter\",\n\t\tgroq: \"groq\",\n\t\txai: \"xai\",\n\t\tcerebras: \"cerebras\",\n\t\tzai: \"zai\",\n\t\topencode: \"opencode\",\n\t} as const;\n\texport const KnownProviderSchema = Type.Union([\n\t\tType.Literal(KnownProviderEnum.anthropic),\n\t\tType.Literal(KnownProviderEnum.openai),\n\t\tType.Literal(KnownProviderEnum.githubCopilot),\n\t\tType.Literal(KnownProviderEnum.openrouter),\n\t\tType.Literal(KnownProviderEnum.groq),\n\t\tType.Literal(KnownProviderEnum.xai),\n\t\tType.Literal(KnownProviderEnum.cerebras),\n\t\tType.Literal(KnownProviderEnum.zai),\n\t\tType.Literal(KnownProviderEnum.opencode),\n\t]);\n\texport type KnownProvider = Static<typeof KnownProviderSchema>;\n\n\texport const Info = Type.Object({\n\t\tid: KnownProviderSchema,\n\t\tname: Type.String(),\n\t\tenv: Type.Array(Type.String()),\n\t\tkey: Type.Optional(Type.String()),\n\t\toptions: Type.Optional(Type.Record(Type.String(), Type.Any())),\n\t});\n\texport type Info = Static<typeof Info>;\n\n\texport const ReasoningEffortMapSchema = Type.Object({\n\t\tminimal: Type.Optional(Type.String()),\n\t\tlow: Type.Optional(Type.String()),\n\t\tmedium: Type.Optional(Type.String()),\n\t\thigh: Type.Optional(Type.String()),\n\t\txhigh: Type.Optional(Type.String()),\n\t});\n\texport type ReasoningEffortMap = Static<typeof ReasoningEffortMapSchema>;\n\texport type StrictReasoningEffortMap = {\n\t\t[K in keyof ReasoningEffortMap]-?: NonNullable<ReasoningEffortMap[K]>;\n\t};\n\n\texport const OpenRouterRoutingSchema = Type.Object({\n\t\tonly: Type.Optional(Type.Array(Type.String())),\n\t\torder: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type OpenRouterRouting = Static<typeof OpenRouterRoutingSchema>;\n\n\texport const VercelGatewayRoutingSchema = Type.Object({\n\t\tonly: Type.Optional(Type.Array(Type.String())),\n\t\torder: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type VercelGatewayRouting = Static<typeof VercelGatewayRoutingSchema>;\n}\n","import { Filesystem, lazy } from \"@codeworksh/utils\";\n\nexport namespace ModelCatalog {\n\texport interface ModelsDevModel {\n\t\tid: string;\n\t\tname: string;\n\t\tfamily: string;\n\t\tattachment: boolean;\n\t\treasoning?: boolean;\n\t\ttool_call?: boolean;\n\t\ttemperature?: boolean;\n\t\tknowledge?: string | boolean;\n\t\trelease_date: string;\n\t\tlast_updated: string;\n\t\tmodalities: {\n\t\t\tinput?: string[];\n\t\t\toutput: string[];\n\t\t};\n\t\topen_weights: boolean;\n\t\tbaseUrl?: string;\n\t\theaders?: Record<string, string>;\n\t\tcost?: {\n\t\t\tinput?: number;\n\t\t\toutput?: number;\n\t\t\tcache_read?: number;\n\t\t\tcache_write?: number;\n\t\t};\n\t\tlimit?: {\n\t\t\tcontext?: number;\n\t\t\toutput?: number;\n\t\t};\n\t}\n\texport interface ModelsDevProvider {\n\t\tid: string;\n\t\tenv: string[];\n\t\tnpm?: string;\n\t\tapi: string;\n\t\tbaseUrl?: string;\n\t\tname: string;\n\t\tdoc?: string;\n\t\tkey?: string;\n\t\theaders?: Record<string, string>;\n\t\tmodels: Record<string, ModelsDevModel>;\n\t}\n\t// Doesn't represent the full spec from models.dev.\n\t// Represents the provider entries on a best-effort basis.\n\texport type ModelsDevCatalog = Record<string, ModelsDevProvider>;\n\ttype LazyModelsDevCatalog = ReturnType<typeof lazy<Promise<ModelsDevCatalog>>>;\n\n\tfunction modelsDevURL(): string {\n\t\treturn process.env.OPENCODE_MODELS_URL || \"https://models.dev\";\n\t}\n\n\tfunction modelsDevPath(): string | undefined {\n\t\treturn process.env.CODEWORK_AIKIT_MODELS_PATH;\n\t}\n\n\texport const modelsDevData: LazyModelsDevCatalog = lazy(async () => {\n\t\tconst path = modelsDevPath();\n\t\tif (path) {\n\t\t\tconst result = await Filesystem.readJson<ModelsDevCatalog>(path).catch(() => undefined);\n\t\t\tif (result) return result;\n\t\t}\n\n\t\tconst json = await fetch(`${modelsDevURL()}/api.json`).then((x) => x.text());\n\t\treturn JSON.parse(json) as ModelsDevCatalog;\n\t});\n\n\texport async function get(): Promise<ModelsDevCatalog> {\n\t\treturn modelsDevData();\n\t}\n\n\texport async function refresh(): Promise<void> {\n\t\tconst result = await fetch(`${modelsDevURL()}/api.json`, {\n\t\t\tsignal: AbortSignal.timeout(10 * 1000),\n\t\t}).catch(() => undefined);\n\t\tif (!result?.ok) return;\n\n\t\tconst json = await result.text();\n\t\tconst path = modelsDevPath();\n\t\tif (path) {\n\t\t\tawait Filesystem.write(path, json);\n\t\t}\n\t\tmodelsDevData.reset();\n\t}\n\n\tvoid ModelCatalog.refresh();\n\tsetInterval(\n\t\tasync () => {\n\t\t\tawait ModelCatalog.refresh();\n\t\t},\n\t\t60 * 1000 * 60,\n\t).unref();\n}\n","import { Provider } from \"../provider/provider\";\nimport type { ModelCatalog } from \"./catalog\";\nimport { Model } from \"./model\";\n\nfunction defaultBaseUrl(providerId: Provider.KnownProvider): string | undefined {\n\tswitch (providerId) {\n\t\tcase Provider.KnownProviderEnum.openai:\n\t\t\treturn \"https://api.openai.com/v1\";\n\t\tdefault:\n\t\t\treturn undefined;\n\t}\n}\n\nfunction resolveDefaultProtocol(providerId: Provider.KnownProvider): Model.KnownProtocol {\n\tswitch (providerId) {\n\t\tcase Provider.KnownProviderEnum.anthropic:\n\t\t\treturn Model.KnownProtocolEnum.anthropicMessages;\n\t\tcase Provider.KnownProviderEnum.openai:\n\t\t\treturn Model.KnownProtocolEnum.openaiResponses;\n\t\tdefault:\n\t\t\treturn Model.KnownProtocolEnum.openaiCompletions;\n\t}\n}\n\nexport function applyModification(\n\tproviderId: Provider.KnownProvider,\n\tprovider: ModelCatalog.ModelsDevProvider,\n\tmodel: ModelCatalog.ModelsDevModel,\n): Model.Info {\n\tconst baseUrl = model.baseUrl ?? provider.baseUrl ?? provider.api ?? defaultBaseUrl(providerId);\n\tconst normalized: Model.Info = {\n\t\tid: model.id,\n\t\tname: model.name,\n\t\tprovider: Model.toProviderInfo(providerId, provider),\n\t\tbaseUrl,\n\t\treasoning: Boolean(model.reasoning),\n\t\tinput: Model.normalizeInput(model.modalities.input),\n\t\tcost: {\n\t\t\tinput: model.cost?.input ?? 0,\n\t\t\toutput: model.cost?.output ?? 0,\n\t\t\tcacheRead: model.cost?.cache_read ?? 0,\n\t\t\tcacheWrite: model.cost?.cache_write ?? 0,\n\t\t},\n\t\tcontextWindow: model.limit?.context ?? 0,\n\t\tmaxTokens: model.limit?.output ?? 0,\n\t\theaders: model.headers ?? provider.headers,\n\t\tprotocol: resolveDefaultProtocol(providerId),\n\t};\n\t//\n\t// add support for multiple known protocols\n\tif (providerId === Provider.KnownProviderEnum.openai) {\n\t\tnormalized.supportedProtocols = {\n\t\t\topenaiCompletions: Model.KnownProtocolEnum.openaiCompletions,\n\t\t};\n\t\treturn normalized;\n\t} else {\n\t\treturn normalized;\n\t}\n}\n","import { lazy } from \"@codeworksh/utils\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport { keys, mapValues, pick, pipe } from \"remeda\";\nimport { Provider } from \"../provider/provider\";\nimport { ModelCatalog } from \"./catalog\";\nimport { applyModification } from \"./transform\";\n\nexport namespace Model {\n\texport const KnownProtocolEnum = {\n\t\tanthropicMessages: \"anthropic-messages\",\n\t\topenaiCompletions: \"openai-completions\",\n\t\topenaiResponses: \"openai-responses\",\n\t} as const;\n\texport const KnownProtocolSchema = Type.Union([\n\t\tType.Literal(KnownProtocolEnum.anthropicMessages),\n\t\tType.Literal(KnownProtocolEnum.openaiCompletions),\n\t\tType.Literal(KnownProtocolEnum.openaiResponses),\n\t]);\n\texport type KnownProtocol = Static<typeof KnownProtocolSchema>;\n\n\tconst InputSchema = Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]));\n\tconst CostSchema = Type.Object({\n\t\tinput: Type.Number(),\n\t\toutput: Type.Number(),\n\t\tcacheRead: Type.Number(),\n\t\tcacheWrite: Type.Number(),\n\t});\n\tconst HeadersSchema = Type.Optional(Type.Record(Type.String(), Type.String()));\n\n\texport const SupportedProtocolsSchema = Type.Object({\n\t\tanthropicMessages: Type.Optional(Type.Literal(KnownProtocolEnum.anthropicMessages)),\n\t\topenaiCompletions: Type.Optional(Type.Literal(KnownProtocolEnum.openaiCompletions)),\n\t\topenaiResponses: Type.Optional(Type.Literal(KnownProtocolEnum.openaiResponses)),\n\t});\n\t//\n\t// reprsents common base schema for a model\n\texport const BaseSchema = Type.Object({\n\t\tid: Type.String(),\n\t\tname: Type.String(),\n\t\tprovider: Provider.Info,\n\t\tbaseUrl: Type.String(),\n\t\treasoning: Type.Boolean(),\n\t\tinput: InputSchema,\n\t\tcost: CostSchema,\n\t\tcontextWindow: Type.Number(),\n\t\tmaxTokens: Type.Number(),\n\t\theaders: HeadersSchema,\n\t\tsupportedProtocols: Type.Optional(Type.Partial(SupportedProtocolsSchema)), // optionally supported protocols\n\t});\n\n\t/**\n\t * Compatibility settings for OpenAI-compatible completions APIs.\n\t * Use this to override URL-based auto-detection for custom providers.\n\t */\n\texport const OpenAICompletionsCompatSchema = Type.Object({\n\t\tsupportsStore: Type.Optional(Type.Boolean()),\n\t\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\t\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\t\treasoningEffortMap: Type.Optional(Provider.ReasoningEffortMapSchema),\n\t\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\t\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\t\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\t\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\t\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\t\tthinkingFormat: Type.Optional(\n\t\t\tType.Union([\n\t\t\t\tType.Literal(\"openai\"),\n\t\t\t\tType.Literal(\"openrouter\"),\n\t\t\t\tType.Literal(\"zai\"),\n\t\t\t\tType.Literal(\"qwen\"),\n\t\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\t]),\n\t\t),\n\t\topenRouterRouting: Type.Optional(Provider.OpenRouterRoutingSchema),\n\t\tvercelGatewayRouting: Type.Optional(Provider.VercelGatewayRoutingSchema),\n\t\tzaiToolStream: Type.Optional(Type.Boolean()),\n\t\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\t});\n\texport type OpenAICompletionsCompat = Static<typeof OpenAICompletionsCompatSchema>;\n\n\t/** Compatibility settings for OpenAI Responses APIs. */\n\texport const OpenAIResponsesCompatSchema = Type.Object({});\n\texport type OpenAIResponsesCompat = Static<typeof OpenAIResponsesCompatSchema>;\n\n\texport const OpenAICompatSchema = Type.Union([OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema]);\n\n\texport const AnthropicSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.anthropicMessages),\n\t\t}),\n\t]);\n\n\texport const OpenAICompletionsSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.openaiCompletions),\n\t\t\tcompat: Type.Optional(OpenAICompletionsCompatSchema),\n\t\t}),\n\t]);\n\texport const OpenAIResponsesSchema = Type.Composite([\n\t\tBaseSchema,\n\t\tType.Object({\n\t\t\tprotocol: Type.Literal(KnownProtocolEnum.openaiResponses),\n\t\t\tcompat: Type.Optional(OpenAIResponsesCompatSchema),\n\t\t}),\n\t]);\n\n\texport const Info = Type.Union([AnthropicSchema, OpenAICompletionsSchema, OpenAIResponsesSchema]);\n\texport type Info = Static<typeof Info>;\n\texport type TModel<TProtocol extends KnownProtocol> = Extract<Info, { protocol: TProtocol }>;\n\tconst BUILTINS = keys(Provider.KnownProviderEnum) as Provider.KnownProvider[];\n\n\texport function calculateCost(\n\t\tmodel: Info,\n\t\tusage: {\n\t\t\tinput: number;\n\t\t\toutput: number;\n\t\t\tcacheRead: number;\n\t\t\tcacheWrite: number;\n\t\t\tcost: {\n\t\t\t\tinput: number;\n\t\t\t\toutput: number;\n\t\t\t\tcacheRead: number;\n\t\t\t\tcacheWrite: number;\n\t\t\t\ttotal: number;\n\t\t\t};\n\t\t},\n\t): void {\n\t\tusage.cost.input = (usage.input / 1_000_000) * model.cost.input;\n\t\tusage.cost.output = (usage.output / 1_000_000) * model.cost.output;\n\t\tusage.cost.cacheRead = (usage.cacheRead / 1_000_000) * model.cost.cacheRead;\n\t\tusage.cost.cacheWrite = (usage.cacheWrite / 1_000_000) * model.cost.cacheWrite;\n\t\tusage.cost.total = usage.cost.input + usage.cost.output + usage.cost.cacheRead + usage.cost.cacheWrite;\n\t}\n\n\texport type BuiltInModels = Partial<Record<Provider.KnownProvider, Record<string, Info>>>;\n\n\texport function normalizeInput(input?: string[]): Array<\"text\" | \"image\"> {\n\t\tconst normalized = new Set<\"text\" | \"image\">();\n\t\tfor (const modality of input ?? [\"text\"]) {\n\t\t\tif (modality === \"text\" || modality === \"image\") {\n\t\t\t\tnormalized.add(modality);\n\t\t\t}\n\t\t}\n\t\tif (normalized.size === 0) normalized.add(\"text\");\n\t\treturn [...normalized];\n\t}\n\n\texport function toProviderInfo(\n\t\tproviderId: Provider.KnownProvider,\n\t\tprovider: ModelCatalog.ModelsDevProvider,\n\t): Provider.Info {\n\t\treturn {\n\t\t\tid: providerId,\n\t\t\tname: provider.name,\n\t\t\tenv: provider.env,\n\t\t\tkey: provider.key,\n\t\t\toptions: provider.headers,\n\t\t};\n\t}\n\n\tfunction toModelValue(\n\t\tproviderId: Provider.KnownProvider,\n\t\tprovider: ModelCatalog.ModelsDevProvider,\n\t\tmodel: ModelCatalog.ModelsDevModel,\n\t): Info {\n\t\treturn applyModification(providerId, provider, model);\n\t}\n\n\texport async function getBuiltInModels(): Promise<BuiltInModels> {\n\t\tconst catalog = await ModelCatalog.get();\n\t\treturn pipe(\n\t\t\tcatalog,\n\t\t\tpick(BUILTINS),\n\t\t\tmapValues((provider, providerId) =>\n\t\t\t\tmapValues(provider.models, (model) => toModelValue(providerId as Provider.KnownProvider, provider, model)),\n\t\t\t),\n\t\t) as BuiltInModels;\n\t}\n\n\texport const registry = lazy(async () => {\n\t\tconst registry: Map<Provider.KnownProvider, Map<string, Info>> = new Map();\n\t\tconst models = await getBuiltInModels();\n\t\tfor (const [provider, value] of Object.entries(models) as Array<[Provider.KnownProvider, Record<string, Info>]>) {\n\t\t\tconst providerModels = new Map<string, Info>();\n\t\t\tfor (const [id, model] of Object.entries(value)) {\n\t\t\t\tproviderModels.set(id, model);\n\t\t\t}\n\t\t\tregistry.set(provider, providerModels);\n\t\t}\n\t\treturn registry;\n\t});\n\n\texport async function getModel<TProvider extends Provider.KnownProvider, TModel extends Info[\"id\"]>(\n\t\tprovider: TProvider,\n\t\tmodel: TModel,\n\t\toverrides?: Partial<Info>,\n\t) {\n\t\tconst data = await registry();\n\t\tconst providerModels = data.get(provider);\n\t\tconst result = providerModels?.get(model);\n\t\tif (result && overrides) {\n\t\t\treturn { ...result, ...overrides };\n\t\t}\n\t\treturn result;\n\t}\n\n\texport async function getProviders(): Promise<Provider.KnownProvider[]> {\n\t\tconst data = await registry();\n\t\treturn Array.from(data.keys());\n\t}\n\n\texport async function getModels<TProvider extends Provider.KnownProvider>(provider: TProvider): Promise<Info[]> {\n\t\tconst data = await registry();\n\t\tconst models = data.get(provider);\n\t\treturn models ? Array.from(models.values()) : [];\n\t}\n\n\tfunction isGpt5OrLater(modelID: string): boolean {\n\t\tconst match = /^gpt-(\\d+)/.exec(modelID);\n\t\tif (!match) {\n\t\t\treturn false;\n\t\t}\n\t\treturn Number(match[1]) >= 5;\n\t}\n\n\t/**\n\t * Check if a model supports xhigh thinking level.\n\t * Currently only certain OpenAI Codex models support this.\n\t */\n\texport function supportsXhigh(model: Info): boolean {\n\t\treturn isGpt5OrLater(model.id);\n\t}\n\n\t/**\n\t * Check if two models are equal by comparing both their id and provider id.\n\t * Returns false if either model is null or undefined.\n\t */\n\texport function modelsAreEqual(a: Info | null | undefined, b: Info | null | undefined): boolean {\n\t\tif (!a || !b) return false;\n\t\treturn a.id === b.id && a.provider.id === b.provider.id;\n\t}\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, Type } from \"@sinclair/typebox\";\nimport type { Message } from \"../message/message\";\nimport { Model } from \"../model/model\";\nimport type { AssistantMessageEventStream } from \"../utils/eventstream\";\n\nexport namespace Stream {\n\texport const ProtocolProviderNotFoundError = NamedError.create(\n\t\t\"ProtocolProviderNotFoundError\",\n\t\tType.Object({\n\t\t\tprotocol: Model.KnownProtocolSchema,\n\t\t}),\n\t);\n\texport type ProtocolProviderNotFoundError = InstanceType<typeof ProtocolProviderNotFoundError>;\n\n\texport const ProtocolMismatchError = NamedError.create(\n\t\t\"ProtocolMismatchError\",\n\t\tType.Object({\n\t\t\tactual: Model.KnownProtocolSchema,\n\t\t\texpected: Model.KnownProtocolSchema,\n\t\t}),\n\t);\n\texport type ProtocolMismatchError = InstanceType<typeof ProtocolMismatchError>;\n\n\texport const ThinkingLevelEnum = {\n\t\toff: \"off\",\n\t\tminimal: \"minimal\",\n\t\tlow: \"low\",\n\t\tmedium: \"medium\",\n\t\thigh: \"high\",\n\t\txhigh: \"xhigh\",\n\t} as const;\n\texport const ThinkingLevelSchema = Type.Union([\n\t\tType.Literal(ThinkingLevelEnum.off),\n\t\tType.Literal(ThinkingLevelEnum.minimal),\n\t\tType.Literal(ThinkingLevelEnum.low),\n\t\tType.Literal(ThinkingLevelEnum.medium),\n\t\tType.Literal(ThinkingLevelEnum.high),\n\t\tType.Literal(ThinkingLevelEnum.xhigh),\n\t]);\n\texport type ThinkingLevel = Static<typeof ThinkingLevelSchema>;\n\n\texport const ThinkingBudgetsSchema = Type.Object({\n\t\toff: Type.Optional(Type.Number()),\n\t\tminimal: Type.Optional(Type.Number()),\n\t\tlow: Type.Optional(Type.Number()),\n\t\tmedium: Type.Optional(Type.Number()),\n\t\thigh: Type.Optional(Type.Number()),\n\t});\n\texport type ThinkingBudgets = Static<typeof ThinkingBudgetsSchema>;\n\n\texport const CacheRetentionSchema = Type.Union([Type.Literal(\"none\"), Type.Literal(\"short\"), Type.Literal(\"long\")]);\n\texport type CacheRetention = Static<typeof CacheRetentionSchema>;\n\n\texport const TransportSchema = Type.Union([Type.Literal(\"sse\"), Type.Literal(\"websocket\"), Type.Literal(\"auto\")]);\n\texport type Transport = Static<typeof TransportSchema>;\n\n\texport const OptionsSchema = Type.Object({\n\t\ttemperature: Type.Optional(Type.Number()),\n\t\tmaxTokens: Type.Optional(Type.Number()),\n\t\tsignal: Type.Optional(Type.Unsafe<AbortSignal>()),\n\t\tapiKey: Type.Optional(Type.String()),\n\t\ttransport: Type.Optional(TransportSchema),\n\t\tcacheRetention: Type.Optional(CacheRetentionSchema),\n\t\tsessionId: Type.Optional(Type.String()),\n\t\tonPayload: Type.Optional(Type.Unsafe<(payload: unknown, model: Model.TModel<Model.KnownProtocol>) => unknown>()),\n\t\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\t\tmaxRetryDelayMs: Type.Optional(Type.Number()),\n\t\tmetadata: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\t});\n\texport type Options = Static<typeof OptionsSchema>;\n\texport type ProviderOptions = Options & Record<string, unknown>;\n\n\texport const SimpleOptionsSchema = Type.Composite([\n\t\tOptionsSchema,\n\t\tType.Object({\n\t\t\treasoning: Type.Optional(ThinkingLevelSchema),\n\t\t\tthinkingBudgets: Type.Optional(ThinkingBudgetsSchema),\n\t\t}),\n\t]);\n\texport type SimpleOptions = Static<typeof SimpleOptionsSchema>;\n\n\t// Contract:\n\t// - Must return an AssistantMessageEventStream.\n\t// - Once invoked, request/model/runtime failures should be encoded in the\n\t// returned stream, not thrown.\n\t// - Error termination must produce an AssistantMessage with stopReason\n\t// \"error\" or \"aborted\" and errorMessage, emitted via the stream protocol.\n\texport type StreamFunction<\n\t\tTProtocol extends Model.KnownProtocol = Model.KnownProtocol,\n\t\tTOptions extends Options = Options,\n\t> = (model: Model.TModel<TProtocol>, context: Message.Context, options?: TOptions) => AssistantMessageEventStream;\n\n\texport function buildBaseOptions(model: Model.Info, options?: SimpleOptions, apiKey?: string): Options {\n\t\treturn {\n\t\t\ttemperature: options?.temperature,\n\t\t\tmaxTokens: options?.maxTokens || Math.min(model.maxTokens, 32000),\n\t\t\tsignal: options?.signal,\n\t\t\tapiKey: apiKey || options?.apiKey,\n\t\t\ttransport: options?.transport,\n\t\t\tcacheRetention: options?.cacheRetention,\n\t\t\tsessionId: options?.sessionId,\n\t\t\theaders: options?.headers,\n\t\t\tonPayload: options?.onPayload,\n\t\t\tmaxRetryDelayMs: options?.maxRetryDelayMs,\n\t\t\tmetadata: options?.metadata,\n\t\t};\n\t}\n\n\texport function clampReasoning(effort: ThinkingLevel | undefined): Exclude<ThinkingLevel, \"xhigh\"> | undefined {\n\t\treturn effort === ThinkingLevelEnum.xhigh ? ThinkingLevelEnum.high : effort;\n\t}\n\n\texport function adjustMaxTokensForThinking(\n\t\tbaseMaxTokens: number,\n\t\tmodelMaxTokens: number,\n\t\treasoningLevel: ThinkingLevel,\n\t\tcustomBudgets?: ThinkingBudgets,\n\t): { maxTokens: number; thinkingBudget: number } {\n\t\tconst defaultBudgets: ThinkingBudgets = {\n\t\t\tminimal: 1024,\n\t\t\tlow: 2048,\n\t\t\tmedium: 8192,\n\t\t\thigh: 16384,\n\t\t};\n\t\tconst budgets = { ...defaultBudgets, ...customBudgets };\n\t\tconst minOutputTokens = 1024;\n\t\tconst level = clampReasoning(reasoningLevel)!;\n\t\tlet thinkingBudget = budgets[level]!;\n\t\tconst maxTokens = Math.min(baseMaxTokens + thinkingBudget, modelMaxTokens);\n\n\t\tif (maxTokens <= thinkingBudget) {\n\t\t\tthinkingBudget = Math.max(0, maxTokens - minOutputTokens);\n\t\t}\n\n\t\treturn { maxTokens, thinkingBudget };\n\t}\n\n\texport type ProtocolStreamFunction = (\n\t\tmodel: Model.Info,\n\t\tcontext: Message.Context,\n\t\toptions?: Options,\n\t) => AssistantMessageEventStream;\n\n\texport type ProtocolStreamSimpleFunction = (\n\t\tmodel: Model.Info,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t) => AssistantMessageEventStream;\n\n\texport interface ProtocolProvider<\n\t\tTProtocol extends Model.KnownProtocol = Model.KnownProtocol,\n\t\tTOptions extends Options = Options,\n\t> {\n\t\tprotocol: TProtocol;\n\t\tstream: StreamFunction<TProtocol, TOptions>;\n\t\tstreamSimple: StreamFunction<TProtocol, SimpleOptions>;\n\t}\n\n\ttype RegisteredProtocolProvider = {\n\t\tprovider: ProtocolProvider<Model.KnownProtocol, Options>;\n\t\tsourceId?: string;\n\t};\n\n\tconst protocolProviderRegistry = new Map<Model.KnownProtocol, RegisteredProtocolProvider>();\n\n\tfunction wrapStream<TProtocol extends Model.KnownProtocol, TOptions extends Options>(\n\t\tprotocol: TProtocol,\n\t\tstream: StreamFunction<TProtocol, TOptions>,\n\t): ProtocolStreamFunction {\n\t\treturn (model, context, options) => {\n\t\t\tif (model.protocol !== protocol) {\n\t\t\t\tthrow new ProtocolMismatchError({\n\t\t\t\t\tactual: model.protocol,\n\t\t\t\t\texpected: protocol,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn stream(model as Model.TModel<TProtocol>, context, options as TOptions);\n\t\t};\n\t}\n\n\tfunction wrapStreamSimple<TProtocol extends Model.KnownProtocol>(\n\t\tprotocol: TProtocol,\n\t\tstreamSimple: StreamFunction<TProtocol, SimpleOptions>,\n\t): ProtocolStreamSimpleFunction {\n\t\treturn (model, context, options) => {\n\t\t\tif (model.protocol !== protocol) {\n\t\t\t\tthrow new ProtocolMismatchError({\n\t\t\t\t\tactual: model.protocol,\n\t\t\t\t\texpected: protocol,\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn streamSimple(model as Model.TModel<TProtocol>, context, options);\n\t\t};\n\t}\n\n\texport function registerProtocolProvider<TProtocol extends Model.KnownProtocol, TOptions extends Options>(\n\t\tprovider: ProtocolProvider<TProtocol, TOptions>,\n\t\tsourceId?: string,\n\t): void {\n\t\tprotocolProviderRegistry.set(provider.protocol, {\n\t\t\tprovider: {\n\t\t\t\tprotocol: provider.protocol,\n\t\t\t\tstream: wrapStream(provider.protocol, provider.stream),\n\t\t\t\tstreamSimple: wrapStreamSimple(provider.protocol, provider.streamSimple),\n\t\t\t},\n\t\t\tsourceId,\n\t\t});\n\t}\n\n\texport function getProtocolProvider(\n\t\tprotocol: Model.KnownProtocol,\n\t): ProtocolProvider<Model.KnownProtocol, Options> | undefined {\n\t\treturn protocolProviderRegistry.get(protocol)?.provider;\n\t}\n\n\texport function resolveProtocolProvider(model: Model.Info): ProtocolProvider<Model.KnownProtocol, Options> {\n\t\tconst provider = getProtocolProvider(model.protocol);\n\t\tif (!provider) {\n\t\t\tthrow new ProtocolProviderNotFoundError({\n\t\t\t\tprotocol: model.protocol,\n\t\t\t});\n\t\t}\n\t\treturn provider;\n\t}\n\n\texport function stream(model: Model.Info, context: Message.Context, options?: Options): AssistantMessageEventStream {\n\t\tconst provider = resolveProtocolProvider(model);\n\t\treturn provider.stream(model, context, options);\n\t}\n\n\texport async function complete(\n\t\tmodel: Model.Info,\n\t\tcontext: Message.Context,\n\t\toptions?: Options,\n\t): Promise<Message.AssistantMessage> {\n\t\tconst s = stream(model, context, options);\n\t\treturn s.result();\n\t}\n\n\texport function streamSimple(\n\t\tmodel: Model.Info,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t): AssistantMessageEventStream {\n\t\tconst provider = resolveProtocolProvider(model);\n\t\treturn provider.streamSimple(model, context, options);\n\t}\n\n\texport async function completeSimple(\n\t\tmodel: Model.Info,\n\t\tcontext: Message.Context,\n\t\toptions?: SimpleOptions,\n\t): Promise<Message.AssistantMessage> {\n\t\tconst s = streamSimple(model, context, options);\n\t\treturn s.result();\n\t}\n\n\texport function getApiProviders(): ProtocolProvider<Model.KnownProtocol, Options>[] {\n\t\treturn Array.from(protocolProviderRegistry.values(), (entry) => entry.provider);\n\t}\n\n\texport function unregisterProtocolProviders(sourceId: string): void {\n\t\tfor (const [api, entry] of protocolProviderRegistry.entries()) {\n\t\t\tif (entry.sourceId === sourceId) {\n\t\t\t\tprotocolProviderRegistry.delete(api);\n\t\t\t}\n\t\t}\n\t}\n\n\texport function clearProtocolProviders(): void {\n\t\tprotocolProviderRegistry.clear();\n\t}\n}\n","/**\n * @description Defines the Generic event stream class for async iteration.\n */\n\nimport type { Event } from \"../event/event\";\nimport type { Message } from \"../message/message\";\n\n// Implements the async iterator pattern\n// LLM output are streams of events for consuming\n// This class helps with that by acting like buffer data structure to manage the streams\n// for producer and consumer\nexport class EventStream<T, R = T> implements AsyncIterable<T> {\n\tprivate queue: T[] = [];\n\tprivate waiting: ((value: IteratorResult<T>) => void)[] = [];\n\tprivate done = false;\n\tprivate readonly finalResultPromise: Promise<R>;\n\tprivate resolveFinalResult!: (result: R) => void;\n\n\tconstructor(\n\t\tprivate isComplete: (event: T) => boolean,\n\t\tprivate extractResult: (event: T) => R,\n\t) {\n\t\tthis.finalResultPromise = new Promise((resolve) => {\n\t\t\tthis.resolveFinalResult = resolve;\n\t\t});\n\t}\n\n\tpush(event: T): void {\n\t\tif (this.done) return;\n\n\t\tif (this.isComplete(event)) {\n\t\t\tthis.done = true;\n\t\t\tthis.resolveFinalResult(this.extractResult(event));\n\t\t}\n\n\t\t// Deliver to waiting consumer or queue it\n\t\tconst waiter = this.waiting.shift();\n\t\tif (waiter) {\n\t\t\twaiter({ value: event, done: false });\n\t\t} else {\n\t\t\tthis.queue.push(event);\n\t\t}\n\t}\n\n\tend(result?: R): void {\n\t\tthis.done = true;\n\t\tif (result !== undefined) {\n\t\t\tthis.resolveFinalResult(result);\n\t\t}\n\t\t// Notify all waiting consumers that we're done\n\t\twhile (this.waiting.length > 0) {\n\t\t\tconst waiter = this.waiting.shift()!;\n\t\t\twaiter({ value: undefined as any, done: true });\n\t\t}\n\t}\n\n\tasync *[Symbol.asyncIterator](): AsyncIterator<T> {\n\t\twhile (true) {\n\t\t\tif (this.queue.length > 0) {\n\t\t\t\tyield this.queue.shift()!;\n\t\t\t} else if (this.done) {\n\t\t\t\treturn;\n\t\t\t} else {\n\t\t\t\tconst result = await new Promise<IteratorResult<T>>((resolve) => this.waiting.push(resolve));\n\t\t\t\tif (result.done) return;\n\t\t\t\tyield result.value;\n\t\t\t}\n\t\t}\n\t}\n\n\tresult(): Promise<R> {\n\t\treturn this.finalResultPromise;\n\t}\n}\n\nexport class AssistantMessageEventStream extends EventStream<Event.LLMMessageEvent, Message.AssistantMessage> {\n\tconstructor() {\n\t\tsuper(\n\t\t\t(event) => event.type === \"done\" || event.type === \"error\",\n\t\t\t(event) => {\n\t\t\t\tif (event.type === \"done\") {\n\t\t\t\t\treturn event.message;\n\t\t\t\t} else if (event.type === \"error\") {\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t\tthrow new Error(\"Unexpected event type for final result\");\n\t\t\t},\n\t\t);\n\t}\n}\n\n/** Factory function for AssistantMessageEventStream (for use in extensions) */\nexport function createAssistantMessageEventStream(): AssistantMessageEventStream {\n\treturn new AssistantMessageEventStream();\n}\n","/**\n * @description Validation powered by ajv, TypeBox natively doesn't provide data validation.\n */\n\nimport type { Static, TSchema } from \"@sinclair/typebox\";\nimport Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\n\nimport type { Agent } from \"../agent/agent\";\nimport type { Message } from \"../message/message\";\n\n// Create singleton AJV instance with formats\nconst ajv = new Ajv({\n\tallErrors: true,\n\tstrict: false,\n\tcoerceTypes: true,\n});\naddFormats(ajv);\n\n/**\n * Validates an arbitrary value against a TypeBox schema and returns the coerced value.\n */\nexport function validateSchema<T extends TSchema>(schema: T, value: unknown, label: string): Static<T> {\n\tconst validate = ajv.compile(schema);\n\tconst input = structuredClone(value);\n\n\tif (validate(input)) {\n\t\treturn input as Static<T>;\n\t}\n\n\tconst errors =\n\t\tvalidate.errors\n\t\t\t?.map((err) => {\n\t\t\t\tconst path = err.instancePath ? err.instancePath.substring(1) : err.params?.missingProperty || \"root\";\n\t\t\t\treturn ` - ${path}: ${err.message}`;\n\t\t\t})\n\t\t\t.join(\"\\n\") || \"Unknown Validation Error\";\n\n\tthrow new Error(\n\t\t[`Validation Failed For ${label}`, `${errors}\\n`, \"Received Value:\", `${JSON.stringify(value, null, 2)}\\n`].join(\n\t\t\t\"\\n\",\n\t\t),\n\t);\n}\n\n/**\n * Finds a tool by name and validates the tool call arguments against its TypeBox schema\n */\nexport function validateToolCall<T extends Message.Tool>(\n\ttools: T[],\n\ttoolExecution: Agent.ToolCallInFlight,\n): Message.ToolArguments<T> {\n\tconst tool = tools.find((t) => t.name === toolExecution.name);\n\tif (!tool) {\n\t\tthrow new Error(`Tool \"${toolExecution.name}\" not found`);\n\t}\n\treturn validateToolArguments(tool, toolExecution);\n}\n\n/**\n * Validates tool call arguments against the tool's TypeBox schema\n */\nexport function validateToolArguments<T extends Message.Tool>(\n\ttool: T,\n\ttoolExecution: Agent.ToolCallInFlight,\n): Message.ToolArguments<T> {\n\treturn validateSchema(\n\t\ttool.parameters,\n\t\ttoolExecution.rawArgs,\n\t\t`Tool \"${toolExecution.name}\"`,\n\t) as Message.ToolArguments<T>;\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type TSchema, Type } from \"@sinclair/typebox\";\nimport type { Event } from \"../event/event\";\nimport type { Message } from \"../message/message\";\nimport type { Model } from \"../model/model\";\nimport type { Provider } from \"../provider/provider\";\nimport { Stream } from \"../provider/stream\";\nimport { EventStream } from \"../utils/eventstream\";\nimport { validateToolArguments } from \"../utils/validation\";\nimport type { Agent } from \"./agent\";\n\nexport namespace Loop {\n\t/** Stream function used by the core agent loop\n\t *\n\t * Contract:\n\t * - Must not throw or return a rejected promise for request/model/runtime (LLM) failures.\n\t * - Must return an AssistantMessageEventStream see: packages/aikit/src/utils/eventstream.ts\n\t * - Failures must be encoded in the returned stream via protocol events and a\n\t * final Message.AssistantMessage with stopReason \"error\" or \"aborted\" and errorMessage.\n\t */\n\texport type StreamFn = (\n\t\t...args: Parameters<typeof Stream.streamSimple>\n\t) => ReturnType<typeof Stream.streamSimple> | Promise<ReturnType<typeof Stream.streamSimple>>;\n\n\t/**\n\t * Configuration for how tool calls from a single assistant message are executed.\n\t *\n\t * - \"sequential\": each tool call is prepared, executed, and finalized before the next one starts.\n\t * - \"parallel\": tool calls are prepared sequentially, then allowed tools execute concurrently.\n\t * Final tool results are still emitted in assistant source order.\n\t */\n\texport type ToolExecutionMode = \"sequential\" | \"parallel\";\n\n\t/** Context passed to `beforeToolExecution`. */\n\texport interface BeforeToolExecutionContext {\n\t\t/** The current context at the time the tool call is prepared */\n\t\tcontext: Agent.AgentContext;\n\t\t/** The assistant message that requested the tool call. */\n\t\tassistantMessage: Message.AssistantMessage;\n\t\t/** The validated in-flight tool call with validated arguments */\n\t\ttoolCall: Agent.ToolCallInFlight;\n\t}\n\n\t/** Context passed to `afterToolExecution`. */\n\texport interface AfterToolExecutionContext {\n\t\t/** Current agent context at the time the tool call is finalized. */\n\t\tcontext: Agent.AgentContext;\n\t\t/** The assistant message that requested the tool call. */\n\t\tassistantMessage: Message.AssistantMessage;\n\t\t/** The validated in-flight tool call with validated arguments */\n\t\ttoolCall: Agent.ToolCallInFlight;\n\t\t/** The executed tool result before any `afterToolExecution` overrides are applied. */\n\t\tresult: Agent.ToolTerminalResult<unknown>;\n\t}\n\n\t/**\n\t * Result returned from `beforeToolExecution`.\n\t *\n\t * Returning `{ block: true }` prevents the tool from executing. The loop emits an error tool result instead.\n\t * `reason` becomes the text shown in that error result. If omitted, a default blocked message is used.\n\t */\n\texport interface BeforeToolCallResult {\n\t\tblock?: boolean;\n\t\treason?: string;\n\t\tdetails?: unknown;\n\t}\n\n\t/** Configuration for the agent loop. */\n\texport interface Config extends Stream.SimpleOptions {\n\t\tmodel: Model.Info;\n\t\tconvertToLlm: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\t/**\n\t\t * Optional transform applied to the context before `convertToLlm`.\n\t\t *\n\t\t * Use this for operations that work at the AgentMessage level:\n\t\t * - Context window management (pruning old messages)\n\t\t * - Injecting context from external sources\n\t\t *\n\t\t * @example\n\t\t * ```typescript\n\t\t * transformContext: async (messages) => {\n\t\t * if (estimateTokens(messages) > MAX_TOKENS) {\n\t\t * return pruneOldMessages(messages);\n\t\t * }\n\t\t * return messages;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttransformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\t\t/**\n\t\t * Resolves an API key dynamically for each LLM call.\n\t\t *\n\t\t * Useful for short-lived OAuth tokens (e.g., GitHub Copilot) that may expire\n\t\t * during long-running tool execution phases.\n\t\t */\n\t\tgetApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\t\t/**\n\t\t * Returns steering messages to inject into the conversation mid-run.\n\t\t *\n\t\t * Called after each tool execution to check for user interruptions.\n\t\t * If messages are returned, remaining tool calls are skipped and\n\t\t * these messages are added to the context before the next LLM call.\n\t\t *\n\t\t * Use this for \"steering\" the agent while it's working.\n\t\t */\n\t\tgetSteeringMessages?: () => Promise<Message.UserMessage[]>;\n\t\t/**\n\t\t * Returns follow-up messages to process after the agent would otherwise stop.\n\t\t *\n\t\t * Called when the agent has no more tool calls and no steering messages.\n\t\t * If messages are returned, they're added to the context and the agent\n\t\t * continues with another turn.\n\t\t *\n\t\t * Use this for follow-up messages that should wait until the agent finishes.\n\t\t */\n\t\tgetFollowUpMessages?: () => Promise<Message.UserMessage[]>;\n\n\t\t/**\n\t\t * Tool execution mode.\n\t\t * - \"sequential\": execute tool calls one by one\n\t\t * - \"parallel\": preflight tool calls sequentially, then execute allowed tools concurrently\n\t\t *\n\t\t * Default: \"parallel\"\n\t\t */\n\t\ttoolExecution?: ToolExecutionMode;\n\n\t\t/**\n\t\t * Called before a tool is executed, after arguments have been validated.\n\t\t *\n\t\t * Return `{ block: true }` to prevent execution. The loop emits an error tool result instead.\n\t\t * The hook receives the agent abort signal and is responsible for honoring it.\n\t\t */\n\t\tbeforeToolExecution?: (\n\t\t\tcontext: BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<BeforeToolCallResult | undefined>;\n\n\t\t/**\n\t\t * Called after a tool finishes executing, before final tool events are emitted.\n\t\t *\n\t\t * Any omitted fields keep their original values. No deep merge is performed.\n\t\t * The hook receives the agent abort signal and is responsible for honoring it.\n\t\t */\n\t\tafterToolExecution?: (\n\t\t\tcontext: AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\t}\n\n\tfunction createAgentStream(): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\treturn new EventStream<Event.AgentEvent, Message.Message[]>(\n\t\t\t(event: Event.AgentEvent) => event.type === \"agent.end\",\n\t\t\t(event: Event.AgentEvent) => (event.type === \"agent.end\" ? event.messages : []),\n\t\t);\n\t}\n\n\ttype AgentEventSink = (event: Event.AgentEvent) => Promise<void> | void;\n\n\ttype AssistantPart = Message.AssistantMessage[\"parts\"][number];\n\n\ttype ToolCallPart = Message.ToolCallPendingPart & { partIndex: number }; // runtime toolcall pending part\n\n\ttype RuntimeAgentTool = {\n\t\tname: string;\n\t\tparameters: TSchema;\n\t\texecute: (\n\t\t\tcallID: string,\n\t\t\tparams: unknown,\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?: Agent.ToolUpdateCallback<unknown>,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown>>;\n\t};\n\n\ttype ToolCallPrepared =\n\t\t| {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\" | \"blocked\";\n\t\t\t\t\tmessage: string;\n\t\t\t\t\tdetails?: unknown;\n\t\t\t\t};\n\t\t\t\trunnable: Agent.ToolCallInFlight;\n\t\t }\n\t\t| {\n\t\t\t\terror?: never;\n\t\t\t\trunnable: Agent.ToolCallInFlight;\n\t\t\t\ttool: RuntimeAgentTool;\n\t\t };\n\n\ttype ToolCallRunnable = {\n\t\ttoolCall: ToolCallPart;\n\t\trunnable: Agent.ToolCallInFlight;\n\t\ttool: RuntimeAgentTool;\n\t};\n\n\ttype ToolCallExecutionResult =\n\t\t| { result: Agent.ToolTerminalResult<unknown>; error?: never }\n\t\t| { result?: never; error: { message: string; details?: unknown } };\n\n\texport const AgentContextError = NamedError.create(\n\t\t\"AgentContextError\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\texport type AgentContextError = InstanceType<typeof AgentContextError>;\n\n\tfunction snapshotAssistantMessage(message: Message.AssistantMessage): Message.AssistantMessage {\n\t\treturn structuredClone(message);\n\t}\n\n\tfunction snapshotAssistantPartEvent(\n\t\tmessage: Message.AssistantMessage,\n\t\tpartIndex: number,\n\t): { message: Message.AssistantMessage; part: AssistantPart } {\n\t\tconst snapshot = snapshotAssistantMessage(message);\n\t\tconst part = snapshot.parts[partIndex];\n\t\tif (!part) {\n\t\t\tthrow new Error(`Assistant message part at index ${partIndex} was not found`);\n\t\t}\n\t\treturn { message: snapshot, part };\n\t}\n\n\tasync function emitEvent(emit: AgentEventSink, event: Event.AgentEvent): Promise<void> {\n\t\tawait emit(event);\n\t}\n\n\tasync function streamAssistantResponse(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): Promise<Message.AssistantMessage> {\n\t\t// FIXME @sanchitrk:\n\t\t// Have something like a pipeline with Message.Message[] transformation\n\t\t// caller will inject transfomers[](async functions) that is then invoked in order\n\n\t\t// Apply context transform if configured (Message.Message[] → Message.Message[])\n\t\tlet messages = context.messages;\n\t\tif (config.transformContext) {\n\t\t\tmessages = await config.transformContext(messages, signal);\n\t\t}\n\n\t\t// Convert to LLM-compatible messages (Message.Message[] → Message.Message[])\n\t\tconst llmMessages = await config.convertToLlm(messages);\n\n\t\t// Build LLM context, subset of Agent.AgentContext\n\t\tconst llmContext: Agent.AgentContext = {\n\t\t\tsystemPrompt: context.systemPrompt,\n\t\t\tmessages: llmMessages,\n\t\t\ttools: context.tools,\n\t\t};\n\t\tconst streamFunction = streamFn || Stream.streamSimple;\n\t\t// Resolve API key (important for expiring tokens)\n\t\t// TODO @sanchitrk:\n\t\t// improve passing of credentials (key/oauth), provider also has resolve api key,\n\t\t// for now its dummy implementation.\n\t\tconst resolvedApiKey =\n\t\t\t(config.getApiKey ? await config.getApiKey(config.model.provider) : undefined) || config.apiKey;\n\n\t\tconst events = await streamFunction(config.model, llmContext, {\n\t\t\t...config,\n\t\t\tapiKey: resolvedApiKey,\n\t\t\tsignal,\n\t\t});\n\n\t\tlet partialMessage: Message.AssistantMessage | null = null;\n\t\tlet started = false;\n\n\t\tconst ensureMessageStarted = async (message: Message.AssistantMessage): Promise<void> => {\n\t\t\tif (started) return;\n\t\t\tstarted = true;\n\t\t\tawait emitEvent(emit, { type: \"message.start\", message: snapshotAssistantMessage(message) });\n\t\t};\n\n\t\tconst emitMessageUpdate = async (message: Message.AssistantMessage): Promise<void> => {\n\t\t\tawait emitEvent(emit, { type: \"message.update\", message: snapshotAssistantMessage(message) });\n\t\t};\n\n\t\tconst emitPartStart = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.start\", partIndex, ...snapshot });\n\t\t};\n\n\t\tconst emitPartUpdate = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.update\", partIndex, ...snapshot, source: \"llm\" });\n\t\t};\n\n\t\tconst emitPartEnd = async (message: Message.AssistantMessage, partIndex: number): Promise<void> => {\n\t\t\tconst snapshot = snapshotAssistantPartEvent(message, partIndex);\n\t\t\tawait emitEvent(emit, { type: \"message.part.end\", partIndex, ...snapshot });\n\t\t};\n\n\t\t// NOTE: Do not mutate context directly\n\t\t// once all the events are done return message\n\t\t// mutate partialMessage and corresponding parts as required\n\t\t// return the final built message from llm events\n\t\tfor await (const event of events) {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"start\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.start\":\n\t\t\t\tcase \"thinking.start\":\n\t\t\t\tcase \"toolcall.start\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartStart(partialMessage, event.partIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.delta\":\n\t\t\t\tcase \"thinking.delta\":\n\t\t\t\tcase \"toolcall.delta\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartUpdate(partialMessage, event.partIndex);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"text.end\":\n\t\t\t\tcase \"thinking.end\":\n\t\t\t\tcase \"toolcall.end\": {\n\t\t\t\t\tpartialMessage = event.partial;\n\t\t\t\t\tawait ensureMessageStarted(partialMessage);\n\t\t\t\t\tawait emitPartEnd(partialMessage, event.partIndex);\n\t\t\t\t\tawait emitMessageUpdate(partialMessage);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"done\": {\n\t\t\t\t\tawait ensureMessageStarted(event.message);\n\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(event.message) });\n\t\t\t\t\treturn event.message;\n\t\t\t\t}\n\t\t\t\tcase \"error\": {\n\t\t\t\t\tawait ensureMessageStarted(event.error);\n\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(event.error) });\n\t\t\t\t\treturn event.error;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tconst finalMessage = await events.result();\n\t\tawait ensureMessageStarted(finalMessage);\n\t\tawait emitEvent(emit, { type: \"message.end\", message: snapshotAssistantMessage(finalMessage) });\n\t\treturn finalMessage;\n\t}\n\n\tasync function executeToolCalls(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tif (config.toolExecution === \"sequential\")\n\t\t\treturn executeToolCallsSequential(config, currentContext, message, toolCalls, emit, signal);\n\t\treturn executeToolCallsParallel(config, currentContext, message, toolCalls, emit, signal);\n\t}\n\n\tasync function executeToolCallsSequential(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tconst toolCallInFlight: Agent.ToolCallInFlight = {\n\t\t\t\tcallID: toolCall.callID,\n\t\t\t\tname: toolCall.name,\n\t\t\t\trawArgs: toolCall.arguments,\n\t\t\t};\n\t\t\tawait emitEvent(emit, {\n\t\t\t\ttype: \"tool.execution.start\",\n\t\t\t\t...toolCallInFlight,\n\t\t\t});\n\t\t\t//\n\t\t\t// Prepares the tool call for execution.\n\t\t\t// Invokes a pre-execution callback with the current context, allowing\n\t\t\t// the callback to either continue or block (short-circuiting the execution).\n\t\t\t// Mutates `message.parts` in-place to update the pending tool call with its result.\n\t\t\tconst prepared = await prepareToolCall(config, currentContext, message, toolCallInFlight, signal);\n\t\t\tif (prepared.error) {\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: prepared.error.message }],\n\t\t\t\t\t\tdetails: prepared.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, prepared.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\tconst runnable: ToolCallRunnable = {\n\t\t\t\t\ttoolCall,\n\t\t\t\t\trunnable: prepared.runnable,\n\t\t\t\t\ttool: prepared.tool,\n\t\t\t\t};\n\t\t\t\tconst executed = await executeRunnableToolCall(runnable, message, emit, signal);\n\t\t\t\tif (executed.error) {\n\t\t\t\t\t// tool call invocation failed with error\n\t\t\t\t\t// create tool error result\n\t\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: executed.error.message }],\n\t\t\t\t\t\t\tdetails: executed.error.details,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t\tawait emitToolCallTerminalResult(runnable.toolCall, runnable.runnable, message, emit, error);\n\t\t\t\t} else {\n\t\t\t\t\t// finalize results from tool invocation\n\t\t\t\t\t// invokes after tool exection callback\n\t\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcurrentContext,\n\t\t\t\t\t\trunnable.toolCall,\n\t\t\t\t\t\trunnable.runnable,\n\t\t\t\t\t\tmessage,\n\t\t\t\t\t\temit,\n\t\t\t\t\t\texecuted.result,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function executeToolCallsParallel(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tmessage: Message.AssistantMessage,\n\t\ttoolCalls: ToolCallPart[],\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tconst runnables: ToolCallRunnable[] = [];\n\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tconst toolCallInFlight: Agent.ToolCallInFlight = {\n\t\t\t\tcallID: toolCall.callID,\n\t\t\t\tname: toolCall.name,\n\t\t\t\trawArgs: toolCall.arguments,\n\t\t\t};\n\t\t\tawait emitEvent(emit, {\n\t\t\t\ttype: \"tool.execution.start\",\n\t\t\t\t...toolCallInFlight,\n\t\t\t});\n\t\t\t//\n\t\t\t// Prepares the tool call for execution.\n\t\t\t// Invokes a pre-execution callback with the current context, allowing\n\t\t\t// the callback to either continue or block (short-circuiting the execution).\n\t\t\t// Mutates `message.parts` in-place to update the pending tool call with its result.\n\t\t\tconst prepared = await prepareToolCall(config, currentContext, message, toolCallInFlight, signal);\n\t\t\tif (prepared.error) {\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: prepared.error.message }],\n\t\t\t\t\t\tdetails: prepared.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, prepared.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\trunnables.push({\n\t\t\t\t\ttoolCall,\n\t\t\t\t\trunnable: prepared.runnable,\n\t\t\t\t\ttool: prepared.tool,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tconst runningExecutions = runnables.map((runnable) => ({\n\t\t\trunnable,\n\t\t\texecution: executeRunnableToolCall(runnable, message, emit, signal),\n\t\t}));\n\n\t\tfor (const running of runningExecutions) {\n\t\t\tconst executed = await running.execution;\n\t\t\tconst { runnable } = running;\n\t\t\tif (executed.error) {\n\t\t\t\t// tool call invocation failed with error\n\t\t\t\t// create tool error result\n\t\t\t\tconst error: Agent.ToolErrorResult<unknown> = {\n\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\tresult: {\n\t\t\t\t\t\tcontent: [{ type: \"text\", text: executed.error.message }],\n\t\t\t\t\t\tdetails: executed.error.details,\n\t\t\t\t\t\tisError: true,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t\tawait emitToolCallTerminalResult(runnable.toolCall, runnable.runnable, message, emit, error);\n\t\t\t} else {\n\t\t\t\t// finalize results from tool invocation\n\t\t\t\t// invokes after tool exection callback\n\t\t\t\tawait finalizeExecutedToolCall(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\trunnable.toolCall,\n\t\t\t\t\trunnable.runnable,\n\t\t\t\t\tmessage,\n\t\t\t\t\temit,\n\t\t\t\t\texecuted.result,\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t}\n\n\tasync function prepareToolCall(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tassistantMessage: Message.AssistantMessage,\n\t\ttoolCallInFlight: Agent.ToolCallInFlight,\n\t\tsignal?: AbortSignal,\n\t): Promise<ToolCallPrepared> {\n\t\tconst tool = currentContext.tools?.find((t) => t.name === toolCallInFlight.name);\n\t\tif (!tool) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\",\n\t\t\t\t\tmessage: `Tool ${toolCallInFlight.name} Not Found`,\n\t\t\t\t},\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t};\n\t\t}\n\n\t\ttry {\n\t\t\t//\n\t\t\t// first validate toolcall args, before invoking callback\n\t\t\t// appends validated args\n\t\t\ttoolCallInFlight.args = validateToolArguments(tool, toolCallInFlight);\n\t\t\tif (config.beforeToolExecution) {\n\t\t\t\tconst beforeResult = await config.beforeToolExecution(\n\t\t\t\t\t{\n\t\t\t\t\t\tcontext: currentContext,\n\t\t\t\t\t\tassistantMessage,\n\t\t\t\t\t\ttoolCall: toolCallInFlight,\n\t\t\t\t\t},\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\t\t\t\tif (beforeResult?.block) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\terror: {\n\t\t\t\t\t\t\tkind: \"blocked\",\n\t\t\t\t\t\t\tmessage: beforeResult?.reason || \"Tool Execution was Blocked\",\n\t\t\t\t\t\t\tdetails: beforeResult?.details,\n\t\t\t\t\t\t},\n\t\t\t\t\t\trunnable: toolCallInFlight,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn {\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t\ttool: tool as RuntimeAgentTool,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tkind: \"error\",\n\t\t\t\t\tmessage: err instanceof Error ? err.message : String(err),\n\t\t\t\t},\n\t\t\t\trunnable: toolCallInFlight,\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function executeRunnableToolCall(\n\t\ttoolCallRunnable: ToolCallRunnable,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tsignal?: AbortSignal,\n\t): Promise<ToolCallExecutionResult> {\n\t\tconst { toolCall, runnable, tool } = toolCallRunnable;\n\t\tconst { partIndex, ...pendingPart } = toolCall;\n\t\ttry {\n\t\t\tconst result = await tool.execute(runnable.callID, runnable.args, signal, async (result) => {\n\t\t\t\tconst runningResult: Agent.ToolRunningResult<unknown> = {\n\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\tpartial: result.partial,\n\t\t\t\t};\n\t\t\t\tconst toolExecutionUpdate: Event.ToolExecutionUpdate = {\n\t\t\t\t\ttype: \"tool.execution.update\",\n\t\t\t\t\t...runnable,\n\t\t\t\t\t...runningResult,\n\t\t\t\t};\n\t\t\t\tawait emitEvent(emit, { ...toolExecutionUpdate });\n\n\t\t\t\tconst runningPart: Message.ToolCallRunningPart = {\n\t\t\t\t\t...pendingPart,\n\t\t\t\t\t...runningResult,\n\t\t\t\t};\n\n\t\t\t\tmessage.parts[partIndex] = runningPart; // in-place mutate; add error part\n\n\t\t\t\tawait emitEvent(emit, {\n\t\t\t\t\ttype: \"message.part.update\",\n\t\t\t\t\tmessage,\n\t\t\t\t\tpartIndex,\n\t\t\t\t\tpart: runningPart,\n\t\t\t\t\tsource: \"tool\",\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn {\n\t\t\t\tresult,\n\t\t\t};\n\t\t} catch (err) {\n\t\t\tconst message = err instanceof Error ? err.message : String(err);\n\t\t\treturn {\n\t\t\t\terror: {\n\t\t\t\t\tmessage,\n\t\t\t\t},\n\t\t\t};\n\t\t}\n\t}\n\n\tasync function emitToolCallTerminalResult(\n\t\ttoolCall: ToolCallPart,\n\t\trunnable: Agent.ToolCallInFlight,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tresult: Agent.ToolTerminalResult<unknown>,\n\t): Promise<void> {\n\t\tconst { partIndex, ...pendingPart } = toolCall;\n\t\tconst { time } = pendingPart;\n\t\tconst toolExecutionEnd: Event.ToolExecutionEnd = {\n\t\t\ttype: \"tool.execution.end\",\n\t\t\t...runnable,\n\t\t\t...result,\n\t\t};\n\t\tawait emitEvent(emit, { ...toolExecutionEnd });\n\n\t\tconst part: Message.ToolCallErrorPart | Message.ToolCallCompletedPart = {\n\t\t\t...pendingPart,\n\t\t\t...result,\n\t\t\ttime: {\n\t\t\t\tstart: time.start,\n\t\t\t\tend: Date.now(),\n\t\t\t},\n\t\t};\n\n\t\tmessage.parts[partIndex] = part; // in-place mutate; add error part\n\n\t\tawait emitEvent(emit, { type: \"message.part.start\", message: message, partIndex: partIndex, part: part });\n\t\tawait emitEvent(emit, { type: \"message.part.end\", message: message, partIndex: partIndex, part: part });\n\t\tawait emitEvent(emit, { type: \"message.update\", message: message });\n\t}\n\n\tasync function finalizeExecutedToolCall(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\ttoolCall: ToolCallPart,\n\t\trunnable: Agent.ToolCallInFlight,\n\t\tmessage: Message.AssistantMessage,\n\t\temit: AgentEventSink,\n\t\tresult: Agent.ToolTerminalResult<unknown>,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\tif (config.afterToolExecution) {\n\t\t\tconst afterResult = await config.afterToolExecution(\n\t\t\t\t{\n\t\t\t\t\tcontext: currentContext,\n\t\t\t\t\tassistantMessage: message,\n\t\t\t\t\ttoolCall: runnable,\n\t\t\t\t\tresult,\n\t\t\t\t},\n\t\t\t\tsignal,\n\t\t\t);\n\t\t\tif (afterResult) {\n\t\t\t\tawait emitToolCallTerminalResult(toolCall, runnable, message, emit, afterResult);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tawait emitToolCallTerminalResult(toolCall, runnable, message, emit, result);\n\t}\n\n\t/**\n\t * Main core loop shared by run and runContinue.\n\t */\n\tasync function runLoop(\n\t\tconfig: Config,\n\t\tcurrentContext: Agent.AgentContext,\n\t\tnewMessages: Message.Message[],\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): Promise<void> {\n\t\t// initial `turn.start` is already emitted\n\t\t// avoiding duplicate `turn.start` emits\n\t\tlet firstTurn = true;\n\t\t// Check for steering messages at start (user may have submitted while waiting)\n\t\tlet pendingMessages: Message.UserMessage[] = (await config.getSteeringMessages?.()) || [];\n\n\t\t// Outer loop: continues when queued follow-up messages arrive after agent would stop\n\t\twhile (true) {\n\t\t\tlet hasMoreToolCalls = true;\n\n\t\t\t// Inner loop: process tool calls and steering messages\n\t\t\t// Note: turn.start for full tool calls / pending messages.\n\t\t\twhile (hasMoreToolCalls || pendingMessages.length > 0) {\n\t\t\t\t// flip firstTurn, so next iterations starts emitting `turn.start` event\n\t\t\t\tif (!firstTurn) {\n\t\t\t\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\t\t\t\t} else {\n\t\t\t\t\tfirstTurn = false;\n\t\t\t\t}\n\n\t\t\t\t// Process pending messages (inject before next assistant response)\n\t\t\t\tif (pendingMessages.length > 0) {\n\t\t\t\t\tfor (const message of pendingMessages) {\n\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.start\", message: message });\n\t\t\t\t\t\tfor (const [partIndex, part] of message.parts.entries()) {\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.part.start\", message: message, partIndex, part });\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.part.end\", message: message, partIndex, part });\n\t\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.update\", message: message });\n\t\t\t\t\t\t}\n\t\t\t\t\t\tawait emitEvent(emit, { type: \"message.end\", message: message });\n\t\t\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\t\t\tnewMessages.push(message);\n\t\t\t\t\t}\n\t\t\t\t\tpendingMessages = [];\n\t\t\t\t}\n\n\t\t\t\t// Run llm and emit assistant response\n\t\t\t\tconst message: Message.AssistantMessage = await streamAssistantResponse(\n\t\t\t\t\tconfig,\n\t\t\t\t\tcurrentContext,\n\t\t\t\t\temit,\n\t\t\t\t\tstreamFn,\n\t\t\t\t\tsignal,\n\t\t\t\t);\n\n\t\t\t\t// terminal state\n\t\t\t\tif (message.stopReason === \"error\" || message.stopReason === \"aborted\") {\n\t\t\t\t\tcurrentContext.messages.push(message); // append the terminal message into the context\n\t\t\t\t\tnewMessages.push(message); // append the terminal message\n\n\t\t\t\t\tawait emitEvent(emit, { type: \"turn.end\", message });\n\t\t\t\t\tawait emitEvent(emit, { type: \"agent.end\", messages: newMessages });\n\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// check for pending tool calls\n\t\t\t\t// use partIndex for in-place mutation for tool call result parts in message.parts\n\t\t\t\tconst toolCalls: ToolCallPart[] = message.parts\n\t\t\t\t\t.map((part, index) => ({ ...part, partIndex: index }))\n\t\t\t\t\t.filter((part) => part.type === \"toolCall\" && part.status === \"pending\");\n\n\t\t\t\thasMoreToolCalls = toolCalls.length > 0;\n\t\t\t\tif (hasMoreToolCalls) {\n\t\t\t\t\tawait executeToolCalls(config, currentContext, message, toolCalls, emit, signal);\n\t\t\t\t}\n\n\t\t\t\tcurrentContext.messages.push(message);\n\t\t\t\tnewMessages.push(message);\n\n\t\t\t\tawait emitEvent(emit, { type: \"turn.end\", message });\n\n\t\t\t\t//\n\t\t\t\t// check for steering messages while turn loop was working.\n\t\t\t\tpendingMessages = (await config.getSteeringMessages?.()) || [];\n\t\t\t}\n\n\t\t\t// Agent would stop here. Check for follow-up messages.\n\t\t\tconst followUpMessages = (await config.getFollowUpMessages?.()) || [];\n\t\t\tif (followUpMessages.length > 0) {\n\t\t\t\t// Set as pending so inner loop processes them\n\t\t\t\tpendingMessages = followUpMessages;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// No more messages, exit\n\t\t\tbreak;\n\t\t}\n\n\t\tawait emitEvent(emit, { type: \"agent.end\", messages: newMessages });\n\t}\n\n\texport async function runAgentLoop(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tprompts: Message.UserMessage[],\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t) {\n\t\t/**\n\t\t * maintain 2 arrays to represent state, `context` the actual full state sent to the LLM,\n\t\t * `newMessages` for intermediate current loop state.\n\t\t * think of newMessages as subset of context.messages for the running current loop.\n\t\t * they do move at the same speed staring with initial user prompts.\n\t\t * */\n\t\tconst newMessages: Message.Message[] = [...prompts];\n\t\tconst currentContext: Agent.AgentContext = {\n\t\t\t...context,\n\t\t\tmessages: [...context.messages, ...prompts],\n\t\t};\n\n\t\tawait emitEvent(emit, { type: \"agent.start\" });\n\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\t\tfor (const prompt of prompts) {\n\t\t\tawait emitEvent(emit, { type: \"message.start\", message: prompt });\n\t\t\tfor (const [partIndex, part] of prompt.parts.entries()) {\n\t\t\t\tawait emitEvent(emit, { type: \"message.part.start\", message: prompt, partIndex, part });\n\t\t\t\tawait emitEvent(emit, { type: \"message.part.end\", message: prompt, partIndex, part });\n\t\t\t}\n\t\t\tawait emitEvent(emit, { type: \"message.end\", message: prompt });\n\t\t}\n\n\t\tawait runLoop(config, currentContext, newMessages, emit, streamFn, signal);\n\t\treturn newMessages;\n\t}\n\n\t/**\n\t * **Important:** The last message in context must not be `assistant` message, convert\n\t * via `convertToLlm`. If it doesn't, the LLM provider will reject the request.\n\t * This cannot be validated here since `convertToLlm` is only called once per turn.\n\t */\n\texport async function runAgentLoopContinue(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\temit: AgentEventSink,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t) {\n\t\tif (context.messages.length === 0) {\n\t\t\tthrow new AgentContextError({ message: \"connot continue: no messages in context\" });\n\t\t}\n\t\tif (context.messages[context.messages.length - 1]?.role === \"assistant\") {\n\t\t\tthrow new AgentContextError({ message: \"cannot continue from message role: assistant\" });\n\t\t}\n\n\t\tconst newMessages: Message.Message[] = [];\n\t\tconst currentContext: Agent.AgentContext = { ...context };\n\n\t\tawait emitEvent(emit, { type: \"agent.start\" });\n\t\tawait emitEvent(emit, { type: \"turn.start\" });\n\n\t\tawait runLoop(config, currentContext, newMessages, emit, streamFn, signal);\n\t\treturn newMessages;\n\t}\n\n\t/**\n\t * Start an agent loop with a new prompt message.\n\t * The prompt is added to the context and events are emitted for it.\n\t */\n\texport function run(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tprompts: Message.UserMessage[],\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\tconst stream = createAgentStream();\n\n\t\tvoid runAgentLoop(\n\t\t\tconfig,\n\t\t\tcontext,\n\t\t\tprompts,\n\t\t\tasync (event) => {\n\t\t\t\tstream.push(event);\n\t\t\t},\n\t\t\tstreamFn,\n\t\t\tsignal,\n\t\t).then((messages) => {\n\t\t\tstream.end(messages);\n\t\t});\n\n\t\treturn stream;\n\t}\n\n\t/**\n\t * Continue an agent loop from the current context without adding a new message.\n\t * Used for retries - context already has user message or tool results.\n\t */\n\texport function runContinue(\n\t\tconfig: Config,\n\t\tcontext: Agent.AgentContext,\n\t\tstreamFn?: StreamFn,\n\t\tsignal?: AbortSignal,\n\t): EventStream<Event.AgentEvent, Message.Message[]> {\n\t\tconst stream = createAgentStream();\n\n\t\tvoid runAgentLoopContinue(\n\t\t\tconfig,\n\t\t\tcontext,\n\t\t\tasync (event) => {\n\t\t\t\tstream.push(event);\n\t\t\t},\n\t\t\tstreamFn,\n\t\t\tsignal,\n\t\t).then((messages) => {\n\t\t\tstream.end(messages);\n\t\t});\n\n\t\treturn stream;\n\t}\n}\n","import { Loop } from \"./agent/loop\";\n\ntype AgentFacade = {\n\tloop: typeof Loop.run;\n\tloopContinue: typeof Loop.runContinue;\n};\n\nexport const agent = {\n\tloop: Loop.run,\n\tloopContinue: Loop.runContinue,\n} as AgentFacade;\n","import { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport { uuidv7 } from \"uuidv7\";\nimport { Model } from \"../model/model\";\nimport { Provider } from \"../provider/provider\";\n\nexport namespace Message {\n\texport const TextContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"text\"),\n\t\ttext: Type.String(),\n\t\ttextSignature: Type.Optional(Type.String()), // e.g., for OpenAI responses, the message ID\n\t});\n\texport type TextContent = Static<typeof TextContentSchema>;\n\n\texport const ImageContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"image\"),\n\t\tdata: Type.String(), // base64 encoded image data\n\t\tmimeType: Type.String(), // e.g., \"image/jpeg\", \"image/png\"\n\t});\n\texport type ImageContent = Static<typeof ImageContentSchema>;\n\n\texport const ThinkingContentSchema = Type.Object({\n\t\ttype: Type.Literal(\"thinking\"),\n\t\tthinking: Type.String(),\n\t\tthinkingSignature: Type.Optional(Type.String()), // e.g., for OpenAI responses, the reasoning item ID\n\t\t/** When true, the thinking content was redacted by safety filters. The opaque\n\t\t * encrypted payload is stored in `thinkingSignature` so it can be passed back\n\t\t * to the API for multi-turn continuity. */\n\t\tredacted: Type.Optional(Type.Boolean()),\n\t});\n\texport type ThinkingContent = Static<typeof ThinkingContentSchema>;\n\n\texport const ToolCallBaseSchema = Type.Object({\n\t\ttype: Type.Literal(\"toolCall\"),\n\t\tcallID: Type.String(),\n\t\tname: Type.String(),\n\t\targuments: Type.Record(Type.String(), Type.Any()),\n\t\tthoughtSignature: Type.Optional(Type.String()), // Google-specific: opaque signature for reusing thought context\n\t\ttime: Type.Object({\n\t\t\tstart: Type.Number(), // Unix timestamp in milliseconds\n\t\t\tend: Type.Number(), // Unix timestamp in milliseconds, last known lifecycle update\n\t\t}),\n\t});\n\n\texport const ToolSuccessResult = Type.Object({\n\t\tcontent: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t\tdetails: Type.Optional(Type.Any()),\n\t\tisError: Type.Literal(false),\n\t});\n\texport const ToolErrorResult = Type.Object({\n\t\tcontent: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t\tdetails: Type.Optional(Type.Any()),\n\t\tisError: Type.Literal(true),\n\t});\n\texport const ToolRunningPartial = Type.Object({\n\t\tcontent: Type.Optional(Type.Array(Type.Union([TextContentSchema, ImageContentSchema]))),\n\t\tdetails: Type.Optional(Type.Any()),\n\t});\n\n\texport const ToolStatusEnum = {\n\t\tpending: \"pending\",\n\t\trunning: \"running\",\n\t\tcompleted: \"completed\",\n\t\terror: \"error\",\n\t\tskipped: \"skipped\",\n\t\taborted: \"aborted\",\n\t} as const;\n\n\texport const ToolRunningSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.running),\n\t\tpartial: Type.Optional(ToolRunningPartial),\n\t});\n\texport const ToolCompletedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.completed),\n\t\tresult: ToolSuccessResult,\n\t});\n\texport const ToolErrorSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.error),\n\t\tresult: ToolErrorResult,\n\t});\n\texport const ToolSkippedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.skipped),\n\t\tresult: ToolErrorResult,\n\t});\n\texport const ToolAbortedSchema = Type.Object({\n\t\tstatus: Type.Literal(ToolStatusEnum.aborted),\n\t\tresult: ToolErrorResult,\n\t});\n\n\tconst ToolCallPendingPart = Type.Intersect([\n\t\tToolCallBaseSchema,\n\t\tType.Object({\n\t\t\tstatus: Type.Literal(ToolStatusEnum.pending),\n\t\t}),\n\t]);\n\tconst ToolCallRunningPart = Type.Composite([ToolCallBaseSchema, ToolRunningSchema]);\n\tconst ToolCallCompletedPart = Type.Composite([ToolCallBaseSchema, ToolCompletedSchema]);\n\tconst ToolCallErrorPart = Type.Composite([ToolCallBaseSchema, ToolErrorSchema]);\n\tconst ToolCallSkippedPart = Type.Composite([ToolCallBaseSchema, ToolSkippedSchema]);\n\tconst ToolCallAbortedPart = Type.Composite([ToolCallBaseSchema, ToolAbortedSchema]);\n\n\texport const ToolCallSchema = Type.Union([\n\t\tToolCallPendingPart,\n\t\tToolCallRunningPart,\n\t\tToolCallCompletedPart,\n\t\tToolCallErrorPart,\n\t\tToolCallSkippedPart,\n\t\tToolCallAbortedPart,\n\t]);\n\n\texport type ToolCall = Static<typeof ToolCallSchema>;\n\texport type ToolCallPendingPart = Static<typeof ToolCallPendingPart>;\n\texport type ToolCallRunningPart = Static<typeof ToolCallRunningPart>;\n\texport type ToolCallCompletedPart = Static<typeof ToolCallCompletedPart>;\n\texport type ToolCallErrorPart = Static<typeof ToolCallErrorPart>;\n\n\texport const UsageSchema = Type.Object({\n\t\tinput: Type.Number(),\n\t\toutput: Type.Number(),\n\t\tcacheRead: Type.Number(),\n\t\tcacheWrite: Type.Number(),\n\t\ttotalTokens: Type.Number(),\n\t\tcost: Type.Object({\n\t\t\tinput: Type.Number(),\n\t\t\toutput: Type.Number(),\n\t\t\tcacheRead: Type.Number(),\n\t\t\tcacheWrite: Type.Number(),\n\t\t\ttotal: Type.Number(),\n\t\t}),\n\t});\n\texport type Usage = Static<typeof UsageSchema>;\n\n\texport const StopReasonSchema = Type.Union([\n\t\tType.Literal(\"stop\"),\n\t\tType.Literal(\"length\"),\n\t\tType.Literal(\"toolUse\"),\n\t\tType.Literal(\"error\"),\n\t\tType.Literal(\"aborted\"),\n\t]);\n\texport type StopReason = Static<typeof StopReasonSchema>;\n\n\texport const UserMessageSchema = Type.Object({\n\t\tmessageId: Type.String(),\n\t\trole: Type.Literal(\"user\"),\n\t\ttime: Type.Object({\n\t\t\tcreated: Type.Number(),\n\t\t}),\n\t\tparts: Type.Array(Type.Union([TextContentSchema, ImageContentSchema])),\n\t});\n\texport type UserMessage = Static<typeof UserMessageSchema>;\n\n\texport const AssistantMessageSchema = Type.Object({\n\t\trole: Type.Literal(\"assistant\"),\n\t\tprotocol: Model.KnownProtocolSchema,\n\t\tprovider: Provider.Info,\n\t\tmodel: Type.String(),\n\t\tusage: UsageSchema,\n\t\tstopReason: StopReasonSchema,\n\t\terrorMessage: Type.Optional(Type.String()),\n\t\ttime: Type.Object({\n\t\t\tcreated: Type.Number(),\n\t\t\tcompleted: Type.Number(),\n\t\t}),\n\t\tparts: Type.Array(Type.Union([TextContentSchema, ImageContentSchema, ThinkingContentSchema, ToolCallSchema])),\n\t\tresponseId: Type.Optional(Type.String()), // Provider-specific response/message identifier when the upstream API exposes one\n\t\tmessageId: Type.String(),\n\t});\n\texport type AssistantMessage = Static<typeof AssistantMessageSchema>;\n\n\texport const MessageSchema = Type.Union([UserMessageSchema, AssistantMessageSchema]);\n\texport type Message = Static<typeof MessageSchema>;\n\n\ttype UserMessageInit = Omit<UserMessage, \"messageId\"> & {\n\t\tmessageId?: string;\n\t};\n\n\ttype AssistantMessageInit = Omit<AssistantMessage, \"messageId\"> & {\n\t\tmessageId?: string;\n\t};\n\n\texport function createMessageId(): string {\n\t\treturn uuidv7();\n\t}\n\n\texport function createUserMessage(message: UserMessageInit): UserMessage {\n\t\tconst { messageId = createMessageId(), ...rest } = message;\n\t\treturn {\n\t\t\tmessageId,\n\t\t\t...rest,\n\t\t};\n\t}\n\n\texport function createAssistantMessage(message: AssistantMessageInit): AssistantMessage {\n\t\tconst { messageId = createMessageId(), ...rest } = message;\n\t\treturn {\n\t\t\tmessageId,\n\t\t\t...rest,\n\t\t};\n\t}\n\n\t/**\n\t * Generic tool definition with typed parameter schema.\n\t * Usage:\n\t *\n\t * const search = Message.defineTool({\n\t * name: \"search\",\n\t * description: \"Search documents\",\n\t * parameters: Type.Object({\n\t * query: Type.String(),\n\t * limit: Type.Optional(Type.Number()),\n\t * }),\n\t * });\n\t *\n\t * type SearchParams = Static<typeof search.parameters>;\n\t */\n\texport const ToolSchema = Type.Object({\n\t\tname: Type.String(),\n\t\tdescription: Type.String(),\n\t\tparameters: Type.Unsafe<TSchema>(),\n\t});\n\texport interface Tool<TParameters extends TSchema = TSchema> {\n\t\tname: string;\n\t\tdescription: string;\n\t\tparameters: TParameters;\n\t}\n\texport type ToolArguments<T extends Tool> = Static<T[\"parameters\"]>;\n\n\texport function defineTool<TParameters extends TSchema>(tool: Tool<TParameters>): Tool<TParameters> {\n\t\treturn tool;\n\t}\n\n\texport const ContextSchema = Type.Object({\n\t\tsystemPrompt: Type.Optional(Type.String()),\n\t\tmessages: Type.Array(MessageSchema),\n\t\ttools: Type.Optional(Type.Array(ToolSchema)),\n\t});\n\texport type Context = Static<typeof ContextSchema>;\n\n\texport function transformMessages<TProtocol extends Model.KnownProtocol>(\n\t\tmessages: Message[],\n\t\tmodel: Model.TModel<TProtocol>,\n\t\tnormalizeToolCallId?: (id: string, model: Model.TModel<TProtocol>, source: AssistantMessage) => string,\n\t): Message[] {\n\t\tconst toolCallIDMap = new Map<string, string>();\n\n\t\tconst transformed: Message[] = [];\n\t\tfor (const msg of messages) {\n\t\t\tif (msg.role === \"user\") {\n\t\t\t\ttransformed.push(msg);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst assistantMsg = msg as AssistantMessage;\n\t\t\tconst isSameModel =\n\t\t\t\tassistantMsg.provider.id === model.provider.id &&\n\t\t\t\tassistantMsg.protocol === model.protocol &&\n\t\t\t\tassistantMsg.model === model.id;\n\n\t\t\tconst parts = assistantMsg.parts.flatMap((block) => {\n\t\t\t\tif (block.type === \"thinking\") {\n\t\t\t\t\tif (isSameModel && block.thinkingSignature) return block;\n\t\t\t\t\tif (!block.thinking || block.thinking.trim() === \"\") return [];\n\t\t\t\t\tif (isSameModel) return block;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.thinking,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\tif (isSameModel) return block;\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\" as const,\n\t\t\t\t\t\ttext: block.text,\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (block.type === \"toolCall\") {\n\t\t\t\t\tconst toolCall = block as ToolCall;\n\t\t\t\t\tlet normalizedToolCall: ToolCall = toolCall;\n\n\t\t\t\t\tif (!isSameModel && toolCall.thoughtSignature) {\n\t\t\t\t\t\tnormalizedToolCall = { ...toolCall };\n\t\t\t\t\t\tdelete (normalizedToolCall as { thoughtSignature?: string }).thoughtSignature;\n\t\t\t\t\t}\n\n\t\t\t\t\tconst normalizedID = toolCallIDMap.get(block.callID);\n\t\t\t\t\tif (normalizedID && normalizedID !== block.callID) {\n\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, callID: normalizedID };\n\t\t\t\t\t} else if (!isSameModel && normalizeToolCallId) {\n\t\t\t\t\t\tconst nextID = normalizeToolCallId(toolCall.callID, model, assistantMsg);\n\t\t\t\t\t\tif (nextID !== toolCall.callID) {\n\t\t\t\t\t\t\ttoolCallIDMap.set(toolCall.callID, nextID);\n\t\t\t\t\t\t\tnormalizedToolCall = { ...normalizedToolCall, callID: nextID };\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\treturn normalizedToolCall;\n\t\t\t\t}\n\n\t\t\t\treturn block;\n\t\t\t});\n\n\t\t\ttransformed.push({\n\t\t\t\t...assistantMsg,\n\t\t\t\tparts,\n\t\t\t});\n\t\t}\n\n\t\treturn transformed;\n\t}\n}\n","/**\n * @description Helper function to parse partial jsons during LLM streaming.\n */\n\nimport { parse as partialParse } from \"partial-json\";\n\n/**\n * Attempts to parse potentially incomplete JSON during streaming.\n * Always returns a valid object, even if the JSON is incomplete.\n *\n * @param partialJson The partial JSON string from streaming\n * @returns Parsed object or empty object if parsing fails\n */\nexport function parseStreamingJson<T = any>(partialJson: string | undefined): T {\n\tif (!partialJson || partialJson.trim() === \"\") {\n\t\treturn {} as T;\n\t}\n\n\t// Try standard parsing first (fastest for complete JSON)\n\ttry {\n\t\treturn JSON.parse(partialJson) as T;\n\t} catch {\n\t\t// Try partial-json for incomplete JSON\n\t\ttry {\n\t\t\tconst result = partialParse(partialJson);\n\t\t\treturn (result ?? {}) as T;\n\t\t} catch {\n\t\t\t// If all parsing fails, return empty object\n\t\t\treturn {} as T;\n\t\t}\n\t}\n}\n","/**\n * Removes unpaired Unicode surrogate characters from a string.\n *\n * Unpaired surrogates (high surrogates 0xD800-0xDBFF without matching low surrogates 0xDC00-0xDFFF,\n * or vice versa) cause JSON serialization errors in many API providers.\n *\n * Valid emoji and other characters outside the Basic Multilingual Plane use properly paired\n * surrogates and will NOT be affected by this function.\n *\n * @param text - The text to sanitize\n * @returns The sanitized text with unpaired surrogates removed\n *\n * @example\n * // Valid emoji (properly paired surrogates) are preserved\n * sanitizeSurrogates(\"Hello 🙈 World\") // => \"Hello 🙈 World\"\n *\n * // Unpaired high surrogate is removed\n * const unpaired = String.fromCharCode(0xD83D); // high surrogate without low\n * sanitizeSurrogates(`Text ${unpaired} here`) // => \"Text here\"\n */\nexport function sanitizeSurrogates(text: string): string {\n\t// Replace unpaired high surrogates (0xD800-0xDBFF not followed by low surrogate)\n\t// Replace unpaired low surrogates (0xDC00-0xDFFF not preceded by high surrogate)\n\treturn text.replace(/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/g, \"\");\n}\n","import { Provider } from \"../provider\";\n\n// TODO @sanchitrk:\n// implement based for multiple providers\nexport function getEnvApiKey(_provider: Provider.Info): string | undefined {\n\treturn undefined;\n}\n","import Anthropic from \"@anthropic-ai/sdk\";\nimport type {\n\tContentBlockParam,\n\tMessageCreateParamsStreaming,\n\tMessageParam,\n} from \"@anthropic-ai/sdk/resources/messages.js\";\nimport { Message } from \"../../../message/message\";\nimport { Model } from \"../../../model/model\";\nimport { AssistantMessageEventStream } from \"../../../utils/eventstream\";\nimport { parseStreamingJson } from \"../../../utils/jsonparse\";\nimport { sanitizeSurrogates } from \"../../../utils/sanitize\";\nimport { Stream } from \"../../stream\";\nimport { getEnvApiKey } from \"../utils\";\n\nexport interface AnthropicOptions extends Stream.Options {\n\tthinkingEnabled?: boolean;\n\tthinkingBudgetTokens?: number;\n\tinterleavedThinking?: boolean;\n\ttoolChoice?: \"auto\" | \"any\" | \"none\" | { type: \"tool\"; name: string };\n\tclient?: Anthropic;\n}\n\nfunction resolveCacheRetention(cacheRetention?: Stream.CacheRetention): Stream.CacheRetention {\n\tif (cacheRetention) {\n\t\treturn cacheRetention;\n\t}\n\tif (typeof process !== \"undefined\" && process.env.CODEWORK_CACHE_RETENTION === \"long\") {\n\t\treturn \"long\";\n\t}\n\treturn \"short\";\n}\n\nfunction getCacheControl(\n\tbaseUrl: string,\n\tcacheRetention?: Stream.CacheRetention,\n): {\n\tretention: Stream.CacheRetention;\n\tcacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" };\n} {\n\tconst retention = resolveCacheRetention(cacheRetention);\n\tif (retention === \"none\") {\n\t\treturn { retention };\n\t}\n\tconst ttl = retention === \"long\" && baseUrl.includes(\"api.anthropic.com\") ? \"1h\" : undefined;\n\treturn {\n\t\tretention,\n\t\tcacheControl: { type: \"ephemeral\", ...(ttl && { ttl }) },\n\t};\n}\n\nconst claudeCodeVersion = \"2.1.2\";\nconst claudeCodeTools = [\n\t\"Read\",\n\t\"Write\",\n\t\"Edit\",\n\t\"Bash\",\n\t\"Grep\",\n\t\"Glob\",\n\t\"AskUserQuestion\",\n\t\"EnterPlanMode\",\n\t\"ExitPlanMode\",\n\t\"KillShell\",\n\t\"NotebookEdit\",\n\t\"Skill\",\n\t\"Task\",\n\t\"TaskOutput\",\n\t\"TodoWrite\",\n\t\"WebFetch\",\n\t\"WebSearch\",\n];\nconst ccToolLookup = new Map(claudeCodeTools.map((t) => [t.toLowerCase(), t]));\n\nconst toClaudeCodeName = (name: string) => ccToolLookup.get(name.toLowerCase()) ?? name;\nconst fromClaudeCodeName = (name: string, tools?: Message.Tool[]) => {\n\tif (tools && tools.length > 0) {\n\t\tconst lowerName = name.toLowerCase();\n\t\tconst matchedTool = tools.find((tool) => tool.name.toLowerCase() === lowerName);\n\t\tif (matchedTool) return matchedTool.name;\n\t}\n\treturn name;\n};\n\nfunction convertContentBlocks(content: (Message.TextContent | Message.ImageContent)[]):\n\t| string\n\t| Array<\n\t\t\t| { type: \"text\"; text: string }\n\t\t\t| {\n\t\t\t\t\ttype: \"image\";\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"base64\";\n\t\t\t\t\t\tmedia_type: \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\";\n\t\t\t\t\t\tdata: string;\n\t\t\t\t\t};\n\t\t\t }\n\t > {\n\tconst hasImages = content.some((c) => c.type === \"image\");\n\tif (!hasImages) {\n\t\treturn sanitizeSurrogates(content.map((c) => (c as Message.TextContent).text).join(\"\\n\"));\n\t}\n\n\tconst blocks = content.map((block) => {\n\t\tif (block.type === \"text\") {\n\t\t\treturn {\n\t\t\t\ttype: \"text\" as const,\n\t\t\t\ttext: sanitizeSurrogates(block.text),\n\t\t\t};\n\t\t}\n\t\treturn {\n\t\t\ttype: \"image\" as const,\n\t\t\tsource: {\n\t\t\t\ttype: \"base64\" as const,\n\t\t\t\tmedia_type: block.mimeType as \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\",\n\t\t\t\tdata: block.data,\n\t\t\t},\n\t\t};\n\t});\n\n\tif (!blocks.some((b) => b.type === \"text\")) {\n\t\tblocks.unshift({\n\t\t\ttype: \"text\" as const,\n\t\t\ttext: \"(see attached image)\",\n\t\t});\n\t}\n\n\treturn blocks;\n}\n\nfunction mergeHeaders(...headerSources: (Record<string, string> | undefined)[]): Record<string, string> {\n\tconst merged: Record<string, string> = {};\n\tfor (const headers of headerSources) {\n\t\tif (headers) {\n\t\t\tObject.assign(merged, headers);\n\t\t}\n\t}\n\treturn merged;\n}\n\nfunction isOAuthToken(apiKey: string): boolean {\n\treturn apiKey.includes(\"sk-ant-oat\");\n}\n\nfunction createClient(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tapiKey: string,\n\tinterleavedThinking: boolean,\n\toptionsHeaders?: Record<string, string>,\n): { client: Anthropic; isOAuthToken: boolean } {\n\tconst betaFeatures = [\"fine-grained-tool-streaming-2025-05-14\"];\n\tif (interleavedThinking) {\n\t\tbetaFeatures.push(\"interleaved-thinking-2025-05-14\");\n\t}\n\n\tconst oauthToken = isOAuthToken(apiKey);\n\tif (oauthToken) {\n\t\tconst defaultHeaders = mergeHeaders(\n\t\t\t{\n\t\t\t\taccept: \"application/json\",\n\t\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\t\"anthropic-beta\": `claude-code-20250219,oauth-2025-04-20,${betaFeatures.join(\",\")}`,\n\t\t\t\t\"user-agent\": `claude-cli/${claudeCodeVersion} (external, cli)`,\n\t\t\t\t\"x-app\": \"cli\",\n\t\t\t},\n\t\t\tmodel.headers,\n\t\t\toptionsHeaders,\n\t\t);\n\n\t\treturn {\n\t\t\tclient: new Anthropic({\n\t\t\t\tapiKey: null,\n\t\t\t\tauthToken: apiKey,\n\t\t\t\tbaseURL: model.baseUrl,\n\t\t\t\tdefaultHeaders,\n\t\t\t\tdangerouslyAllowBrowser: true,\n\t\t\t}),\n\t\t\tisOAuthToken: true,\n\t\t};\n\t}\n\n\tconst defaultHeaders = mergeHeaders(\n\t\t{\n\t\t\taccept: \"application/json\",\n\t\t\t\"anthropic-dangerous-direct-browser-access\": \"true\",\n\t\t\t\"anthropic-beta\": betaFeatures.join(\",\"),\n\t\t},\n\t\tmodel.headers,\n\t\toptionsHeaders,\n\t);\n\n\treturn {\n\t\tclient: new Anthropic({\n\t\t\tapiKey,\n\t\t\tbaseURL: model.baseUrl,\n\t\t\tdangerouslyAllowBrowser: true,\n\t\t\tdefaultHeaders,\n\t\t}),\n\t\tisOAuthToken: false,\n\t};\n}\n\nfunction normalizeToolCallId(id: string): string {\n\treturn id.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 64);\n}\n\nfunction assertReplayableAssistant(message: Message.AssistantMessage): void {\n\tlet sawToolCall = false;\n\tlet sawNonTerminalToolCall = false;\n\tlet sawTerminalToolCall = false;\n\n\tfor (const part of message.parts) {\n\t\tif (part.type === \"image\") {\n\t\t\tthrow new Error(\"Anthropic replay does not support assistant image parts\");\n\t\t}\n\n\t\tif (part.type === \"toolCall\") {\n\t\t\tsawToolCall = true;\n\t\t\tif (part.status === \"pending\" || part.status === \"running\") {\n\t\t\t\tsawNonTerminalToolCall = true;\n\t\t\t} else {\n\t\t\t\tsawTerminalToolCall = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (sawToolCall) {\n\t\t\tthrow new Error(\"Assistant parts after a toolCall are not replayable for Anthropic\");\n\t\t}\n\t}\n\n\tif (sawToolCall && message.stopReason !== \"toolUse\") {\n\t\tthrow new Error(\"Assistant message with tool calls must have stopReason 'toolUse'\");\n\t}\n\n\tif (!sawToolCall && message.stopReason === \"toolUse\") {\n\t\tthrow new Error(\"Assistant message with stopReason 'toolUse' must contain at least one toolCall\");\n\t}\n\n\tif (sawTerminalToolCall && sawNonTerminalToolCall) {\n\t\tthrow new Error(\"Assistant message cannot mix terminal and non-terminal toolCall states\");\n\t}\n}\n\nfunction buildSyntheticToolResult(\n\tblock: Extract<Message.ToolCall, { status: \"pending\" | \"running\" }>,\n): ContentBlockParam {\n\treturn {\n\t\ttype: \"tool_result\",\n\t\ttool_use_id: block.callID,\n\t\tcontent: convertContentBlocks([\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: [\"<result>\", \"No Result Provided\", \"</result>\"].join(\"\\n\"),\n\t\t\t},\n\t\t]),\n\t\tis_error: true,\n\t};\n}\n\nfunction convertMessages(\n\tmessages: Message.Message[],\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tisOAuthToken: boolean,\n\tcacheControl?: { type: \"ephemeral\"; ttl?: \"1h\" },\n): MessageParam[] {\n\tconst params: MessageParam[] = [];\n\tconst transformedMessages = Message.transformMessages(messages, model, normalizeToolCallId);\n\n\tfor (const msg of transformedMessages) {\n\t\tif (msg.role === \"user\") {\n\t\t\tconst blocks: ContentBlockParam[] = msg.parts.map((item) => {\n\t\t\t\tif (item.type === \"text\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: sanitizeSurrogates(item.text),\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"image\",\n\t\t\t\t\tsource: {\n\t\t\t\t\t\ttype: \"base64\",\n\t\t\t\t\t\tmedia_type: item.mimeType as \"image/jpeg\" | \"image/png\" | \"image/gif\" | \"image/webp\",\n\t\t\t\t\t\tdata: item.data,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t\t});\n\t\t\tlet filteredBlocks = !model.input.includes(\"image\") ? blocks.filter((b) => b.type !== \"image\") : blocks;\n\t\t\tfilteredBlocks = filteredBlocks.filter((b) => (b.type === \"text\" ? b.text.trim().length > 0 : true));\n\t\t\tif (filteredBlocks.length === 0) continue;\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: filteredBlocks,\n\t\t\t});\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (msg.stopReason === \"error\" || msg.stopReason === \"aborted\") {\n\t\t\tcontinue;\n\t\t}\n\n\t\tassertReplayableAssistant(msg);\n\n\t\tconst assistantBlocks: ContentBlockParam[] = [];\n\t\tconst toolResults: ContentBlockParam[] = [];\n\n\t\tfor (const block of msg.parts) {\n\t\t\tif (block.type === \"text\") {\n\t\t\t\tif (block.text.trim().length === 0) continue;\n\t\t\t\tassistantBlocks.push({\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\ttext: sanitizeSurrogates(block.text),\n\t\t\t\t});\n\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\tif (block.thinking.trim().length === 0) continue;\n\t\t\t\tif (!block.thinkingSignature || block.thinkingSignature.trim().length === 0) {\n\t\t\t\t\tassistantBlocks.push({\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: sanitizeSurrogates(block.thinking),\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tassistantBlocks.push({\n\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\tthinking: sanitizeSurrogates(block.thinking),\n\t\t\t\t\t\tsignature: block.thinkingSignature,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\tassistantBlocks.push({\n\t\t\t\t\ttype: \"tool_use\",\n\t\t\t\t\tid: block.callID,\n\t\t\t\t\tname: isOAuthToken ? toClaudeCodeName(block.name) : block.name,\n\t\t\t\t\tinput: block.arguments ?? {},\n\t\t\t\t});\n\n\t\t\t\tif (block.status === \"pending\" || block.status === \"running\") {\n\t\t\t\t\ttoolResults.push(buildSyntheticToolResult(block));\n\t\t\t\t} else {\n\t\t\t\t\ttoolResults.push({\n\t\t\t\t\t\ttype: \"tool_result\",\n\t\t\t\t\t\ttool_use_id: block.callID,\n\t\t\t\t\t\tcontent: convertContentBlocks(block.result.content),\n\t\t\t\t\t\tis_error: block.result.isError,\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (assistantBlocks.length > 0) {\n\t\t\tparams.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: assistantBlocks,\n\t\t\t});\n\t\t}\n\n\t\tif (toolResults.length > 0) {\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: toolResults,\n\t\t\t});\n\t\t}\n\t}\n\n\tif (cacheControl && params.length > 0) {\n\t\tconst lastMessage = params[params.length - 1]!;\n\t\tif (lastMessage.role === \"user\") {\n\t\t\tif (Array.isArray(lastMessage.content)) {\n\t\t\t\tconst lastBlock = lastMessage.content[lastMessage.content.length - 1];\n\t\t\t\tif (\n\t\t\t\t\tlastBlock &&\n\t\t\t\t\t(lastBlock.type === \"text\" || lastBlock.type === \"image\" || lastBlock.type === \"tool_result\")\n\t\t\t\t) {\n\t\t\t\t\t(lastBlock as { cache_control?: { type: \"ephemeral\"; ttl?: \"1h\" } }).cache_control = cacheControl;\n\t\t\t\t}\n\t\t\t} else if (typeof lastMessage.content === \"string\") {\n\t\t\t\tlastMessage.content = [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: lastMessage.content,\n\t\t\t\t\t\tcache_control: cacheControl,\n\t\t\t\t\t},\n\t\t\t\t] as any;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn params;\n}\n\nfunction convertTools(tools: Message.Tool[], isOAuthToken: boolean): Anthropic.Messages.Tool[] {\n\tif (!tools) return [];\n\n\treturn tools.map((tool) => {\n\t\tconst jsonSchema = tool.parameters as any; // TypeBox already generates JSON Schema\n\n\t\treturn {\n\t\t\tname: isOAuthToken ? toClaudeCodeName(tool.name) : tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tinput_schema: {\n\t\t\t\ttype: \"object\" as const,\n\t\t\t\tproperties: jsonSchema.properties || {},\n\t\t\t\trequired: jsonSchema.required || [],\n\t\t\t},\n\t\t};\n\t});\n}\n\ntype AnthropicStopReason = Anthropic.Messages.StopReason | \"sensitive\";\n\nfunction mapStopReason(reason: AnthropicStopReason): Message.StopReason {\n\tswitch (reason) {\n\t\tcase \"end_turn\":\n\t\t\treturn \"stop\";\n\t\tcase \"max_tokens\":\n\t\t\treturn \"length\";\n\t\tcase \"tool_use\":\n\t\t\treturn \"toolUse\";\n\t\tcase \"pause_turn\":\n\t\tcase \"stop_sequence\":\n\t\t\treturn \"stop\";\n\t\tcase \"refusal\":\n\t\tcase \"sensitive\":\n\t\t\treturn \"error\";\n\t\tdefault:\n\t\t\tthrow new Error(\"Unhandled Anthropic stop reason\");\n\t}\n}\n\nfunction buildParams(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\tisOAuthToken: boolean,\n\toptions?: AnthropicOptions,\n): MessageCreateParamsStreaming {\n\tconst { cacheControl } = getCacheControl(model.baseUrl, options?.cacheRetention);\n\tconst params: MessageCreateParamsStreaming = {\n\t\tmodel: model.id,\n\t\tmessages: convertMessages(context.messages, model, isOAuthToken, cacheControl),\n\t\tmax_tokens: options?.maxTokens || (model.maxTokens / 3) | 0,\n\t\tstream: true,\n\t};\n\n\tif (isOAuthToken) {\n\t\tparams.system = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: \"You are Claude Code, Anthropic's official CLI for Claude.\",\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t},\n\t\t];\n\t\tif (context.systemPrompt) {\n\t\t\tparams.system.push({\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: sanitizeSurrogates(context.systemPrompt),\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t});\n\t\t}\n\t} else if (context.systemPrompt) {\n\t\tparams.system = [\n\t\t\t{\n\t\t\t\ttype: \"text\",\n\t\t\t\ttext: sanitizeSurrogates(context.systemPrompt),\n\t\t\t\t...(cacheControl ? { cache_control: cacheControl } : {}),\n\t\t\t},\n\t\t];\n\t}\n\n\tif (options?.temperature !== undefined && !options?.thinkingEnabled) {\n\t\tparams.temperature = options.temperature;\n\t}\n\n\tif (context.tools) {\n\t\tparams.tools = convertTools(context.tools, isOAuthToken);\n\t}\n\n\tif (options?.thinkingEnabled && model.reasoning) {\n\t\tparams.thinking = {\n\t\t\ttype: \"enabled\",\n\t\t\tbudget_tokens: options.thinkingBudgetTokens || 1024,\n\t\t};\n\t}\n\n\tif (options?.metadata) {\n\t\tconst userId = options.metadata.user_id;\n\t\tif (typeof userId === \"string\") {\n\t\t\tparams.metadata = { user_id: userId };\n\t\t}\n\t}\n\n\tif (options?.toolChoice) {\n\t\tparams.tool_choice = typeof options.toolChoice === \"string\" ? { type: options.toolChoice } : options.toolChoice;\n\t}\n\n\treturn params;\n}\n\ntype Block = (Message.ThinkingContent | Message.TextContent | (Message.ToolCall & { partialJson: string })) & {\n\tindex: number;\n};\n\nexport const streamAnthropic: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tAnthropicOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\toptions?: AnthropicOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output = Message.createAssistantMessage({\n\t\t\trole: \"assistant\",\n\t\t\tparts: [],\n\t\t\tprotocol: model.protocol,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttime: {\n\t\t\t\tcreated: Date.now(),\n\t\t\t\tcompleted: Date.now(),\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tlet client: Anthropic;\n\t\t\tlet isOAuthToken: boolean;\n\n\t\t\tif (options?.client) {\n\t\t\t\tclient = options.client;\n\t\t\t\tisOAuthToken = false;\n\t\t\t} else {\n\t\t\t\tconst apiKey = options?.apiKey ?? getEnvApiKey(model.provider);\n\t\t\t\tif (!apiKey) {\n\t\t\t\t\tthrow new Error(`No API key for provider: ${model.provider.id}`);\n\t\t\t\t}\n\n\t\t\t\tconst created = createClient(model, apiKey, options?.interleavedThinking ?? true, options?.headers);\n\t\t\t\tclient = created.client;\n\t\t\t\tisOAuthToken = created.isOAuthToken;\n\t\t\t}\n\n\t\t\tlet params = buildParams(model, context, isOAuthToken, options);\n\t\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\t\tif (nextParams !== undefined) {\n\t\t\t\tparams = nextParams as MessageCreateParamsStreaming;\n\t\t\t}\n\t\t\tconst anthropicStream = client.messages.stream({ ...params, stream: true }, { signal: options?.signal });\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tconst blocks = output.parts as Block[];\n\n\t\t\tfor await (const event of anthropicStream) {\n\t\t\t\tif (event.type === \"message_start\") {\n\t\t\t\t\toutput.responseId = event.message.id;\n\t\t\t\t\t// Capture initial token usage from message_start event\n\t\t\t\t\t// This ensures we have input token counts even if the stream is aborted early\n\t\t\t\t\toutput.usage.input = event.message.usage.input_tokens || 0;\n\t\t\t\t\toutput.usage.output = event.message.usage.output_tokens || 0;\n\t\t\t\t\toutput.usage.cacheRead = event.message.usage.cache_read_input_tokens || 0;\n\t\t\t\t\toutput.usage.cacheWrite = event.message.usage.cache_creation_input_tokens || 0;\n\t\t\t\t\t// Anthropic doesn't provide total_tokens, compute from components\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t\tModel.calculateCost(model, output.usage);\n\t\t\t\t} else if (event.type === \"content_block_start\") {\n\t\t\t\t\tif (event.content_block.type === \"text\") {\n\t\t\t\t\t\tconst block: Block = { type: \"text\", text: \"\", index: event.index };\n\t\t\t\t\t\toutput.parts.push(block); // push the block to parts\n\t\t\t\t\t\t// `contentIndex` points to the index of the block within parts\n\t\t\t\t\t\t// Useful for replaying message and corresponding parts based on stream.\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"thinking\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\t\tthinking: \"\",\n\t\t\t\t\t\t\tthinkingSignature: \"\",\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"redacted_thinking\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\t\tthinking: \"[Reasoning redacted]\",\n\t\t\t\t\t\t\tthinkingSignature: event.content_block.data,\n\t\t\t\t\t\t\tredacted: true,\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.content_block.type === \"tool_use\") {\n\t\t\t\t\t\tconst block: Block = {\n\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\tcallID: event.content_block.id,\n\t\t\t\t\t\t\tname: isOAuthToken\n\t\t\t\t\t\t\t\t? fromClaudeCodeName(event.content_block.name, context.tools)\n\t\t\t\t\t\t\t\t: event.content_block.name,\n\t\t\t\t\t\t\targuments: (event.content_block.input as Record<string, any>) ?? {},\n\t\t\t\t\t\t\tpartialJson: \"\",\n\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t\ttime: {\n\t\t\t\t\t\t\t\tstart: Date.now(),\n\t\t\t\t\t\t\t\tend: Date.now(),\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tindex: event.index,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(block);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.start\",\n\t\t\t\t\t\t\tpartIndex: output.parts.length - 1,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"content_block_delta\") {\n\t\t\t\t\t// *_delta updates existing block part\n\t\t\t\t\t// filtered based on event identifier `event.index` (not to confuse with array indices)\n\t\t\t\t\t// index persisted on block(part) with `index`\n\t\t\t\t\tconst partIndex = blocks.findIndex((b) => b.index === event.index);\n\t\t\t\t\tconst block = blocks[partIndex];\n\t\t\t\t\tif (!block) continue; // block doesn't exist for delta, move on\n\n\t\t\t\t\tif (event.delta.type === \"text_delta\" && block.type === \"text\") {\n\t\t\t\t\t\tblock.text += event.delta.text; // mutates block, implicitly mutating block in output.parts\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.text,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"thinking_delta\" && block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinking += event.delta.thinking;\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.thinking,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"input_json_delta\" && block.type === \"toolCall\") {\n\t\t\t\t\t\tblock.partialJson += event.delta.partial_json;\n\t\t\t\t\t\tblock.arguments = parseStreamingJson(block.partialJson);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.delta\",\n\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\tdelta: event.delta.partial_json,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (event.delta.type === \"signature_delta\" && block.type === \"thinking\") {\n\t\t\t\t\t\tblock.thinkingSignature = block.thinkingSignature || \"\";\n\t\t\t\t\t\tblock.thinkingSignature += event.delta.signature;\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"content_block_stop\") {\n\t\t\t\t\tconst partIndex = blocks.findIndex((b) => b.index === event.index);\n\t\t\t\t\tconst block = blocks[partIndex];\n\t\t\t\t\tif (block) {\n\t\t\t\t\t\tdelete (block as any).index; // clear block index; used for internal loop state\n\t\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"text.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\tcontent: block.text,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"thinking.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\tcontent: block.thinking,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\t\t\tblock.arguments = parseStreamingJson(block.partialJson);\n\t\t\t\t\t\t\tdelete (block as any).partialJson; // clear partialJson; used for internal loop state\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"toolcall.end\",\n\t\t\t\t\t\t\t\tpartIndex: partIndex,\n\t\t\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (event.type === \"message_delta\") {\n\t\t\t\t\tif (event.delta.stop_reason) {\n\t\t\t\t\t\toutput.stopReason = mapStopReason(event.delta.stop_reason);\n\t\t\t\t\t}\n\t\t\t\t\t// Only update usage fields if present (not null).\n\t\t\t\t\t// Preserves input_tokens from message_start when proxies omit it in message_delta.\n\t\t\t\t\tif (event.usage.input_tokens != null) {\n\t\t\t\t\t\toutput.usage.input = event.usage.input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.output_tokens != null) {\n\t\t\t\t\t\toutput.usage.output = event.usage.output_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.cache_read_input_tokens != null) {\n\t\t\t\t\t\toutput.usage.cacheRead = event.usage.cache_read_input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\tif (event.usage.cache_creation_input_tokens != null) {\n\t\t\t\t\t\toutput.usage.cacheWrite = event.usage.cache_creation_input_tokens;\n\t\t\t\t\t}\n\t\t\t\t\t// Anthropic doesn't provide total_tokens, compute from components\n\t\t\t\t\toutput.usage.totalTokens =\n\t\t\t\t\t\toutput.usage.input + output.usage.output + output.usage.cacheRead + output.usage.cacheWrite;\n\t\t\t\t\tModel.calculateCost(model, output.usage);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options?.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"aborted\" || output.stopReason === \"error\") {\n\t\t\t\tthrow new Error(\"An unknown error occurred\");\n\t\t\t}\n\n\t\t\toutput.time.completed = Date.now();\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason, message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\tfor (const block of output.parts) delete (block as { index?: number }).index;\n\t\t\toutput.time.completed = Date.now();\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimpleAnthropic: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tStream.SimpleOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.anthropicMessages>,\n\tcontext: Message.Context,\n\toptions?: Stream.SimpleOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider.id}`);\n\t}\n\n\tconst base = Stream.buildBaseOptions(model, options, apiKey);\n\tif (!options?.reasoning) {\n\t\treturn streamAnthropic(model, context, {\n\t\t\t...base,\n\t\t\tthinkingEnabled: false,\n\t\t} satisfies AnthropicOptions);\n\t}\n\n\tconst adjusted = Stream.adjustMaxTokensForThinking(\n\t\tbase.maxTokens || 0,\n\t\tmodel.maxTokens,\n\t\toptions.reasoning,\n\t\toptions.thinkingBudgets,\n\t);\n\n\treturn streamAnthropic(model, context, {\n\t\t...base,\n\t\tmaxTokens: adjusted.maxTokens,\n\t\tthinkingEnabled: true,\n\t\tthinkingBudgetTokens: adjusted.thinkingBudget,\n\t} satisfies AnthropicOptions);\n};\n\nconst anthropicProtocolProvider: Stream.ProtocolProvider<\n\ttypeof Model.KnownProtocolEnum.anthropicMessages,\n\tAnthropicOptions\n> = {\n\tprotocol: Model.KnownProtocolEnum.anthropicMessages,\n\tstream: streamAnthropic,\n\tstreamSimple: streamSimpleAnthropic,\n};\n\nexport default anthropicProtocolProvider;\n","import type { Message } from \"../../../message/message\";\n\n// Copilot expects X-Initiator to indicate whether the request is user-initiated\n// or agent-initiated (e.g. follow-up after assistant/tool messages).\nexport function inferCopilotInitiator(messages: Message.Message[]): \"user\" | \"agent\" {\n\tconst last = messages[messages.length - 1];\n\treturn last && last.role !== \"user\" ? \"agent\" : \"user\";\n}\n\n// Copilot requires Copilot-Vision-Request header when sending images\nexport function hasCopilotVisionInput(messages: Message.Message[]): boolean {\n\treturn messages.some((msg) => {\n\t\tif (msg.role === \"user\") {\n\t\t\treturn msg.parts.some((c) => c.type === \"image\");\n\t\t}\n\t\treturn false;\n\t});\n}\n\nexport function buildCopilotDynamicHeaders(params: {\n\tmessages: Message.Message[];\n\thasImages: boolean;\n}): Record<string, string> {\n\tconst headers: Record<string, string> = {\n\t\t\"X-Initiator\": inferCopilotInitiator(params.messages),\n\t\t\"Openai-Intent\": \"conversation-edits\",\n\t};\n\n\tif (params.hasImages) {\n\t\theaders[\"Copilot-Vision-Request\"] = \"true\";\n\t}\n\n\treturn headers;\n}\n","import OpenAI from \"openai\";\nimport type {\n\tChatCompletionAssistantMessageParam,\n\tChatCompletionContentPart,\n\tChatCompletionContentPartImage,\n\tChatCompletionContentPartText,\n\tChatCompletionMessageParam,\n\tChatCompletionToolMessageParam,\n} from \"openai/resources/chat/completions.js\";\nimport { Message } from \"../../../message/message\";\nimport { Model } from \"../../../model/model\";\nimport { AssistantMessageEventStream } from \"../../../utils/eventstream\";\nimport { parseStreamingJson } from \"../../../utils/jsonparse\";\nimport { sanitizeSurrogates } from \"../../../utils/sanitize\";\nimport { Provider } from \"../../provider\";\nimport { Stream } from \"../../stream\";\nimport { buildCopilotDynamicHeaders, hasCopilotVisionInput } from \"../github/github\";\nimport { getEnvApiKey } from \"../utils\";\n\ntype OpenAIReasoningEffort = keyof Provider.StrictReasoningEffortMap;\n\ntype StreamingToolCallBlock = Message.ToolCall & {\n\tindex?: number;\n\tpartialArgs?: string;\n\tstreamIndex?: number;\n};\n\ntype StreamingBlock =\n\t| (Message.TextContent & { index?: number })\n\t| (Message.ThinkingContent & { index?: number })\n\t| StreamingToolCallBlock;\n\nfunction hasToolHistory(messages: Message.Message[]): boolean {\n\tfor (const msg of messages) {\n\t\tif (msg.role !== \"assistant\") continue;\n\t\tif (msg.parts.some((block) => block.type === \"toolCall\")) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction buildSyntheticToolResult(\n\tblock: Extract<Message.ToolCall, { status: \"pending\" | \"running\" }>,\n\tcompat: Required<Model.OpenAICompletionsCompat>,\n): ChatCompletionToolMessageParam {\n\tconst message: ChatCompletionToolMessageParam = {\n\t\trole: \"tool\",\n\t\tcontent: [\"<result>\", \"No Result Provided\", \"</result>\"].join(\"\\n\"),\n\t\ttool_call_id: block.callID,\n\t};\n\tif (compat.requiresToolResultName) {\n\t\t(message as ChatCompletionToolMessageParam & { name?: string }).name = block.name;\n\t}\n\treturn message;\n}\n\nexport interface OpenAICompletionsOptions extends Stream.Options {\n\ttoolChoice?: \"auto\" | \"none\" | \"required\" | { type: \"function\"; function: { name: string } };\n\treasoningEffort?: OpenAIReasoningEffort;\n}\n\nfunction resolveBaseUrl(model: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>): string {\n\treturn model.baseUrl || (model.provider.id === Provider.KnownProviderEnum.openai ? \"https://api.openai.com/v1\" : \"\");\n}\n\nexport const streamOpenAICompletions: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.openaiCompletions,\n\tOpenAICompletionsOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tcontext: Message.Context,\n\toptions?: OpenAICompletionsOptions,\n): AssistantMessageEventStream => {\n\tconst stream = new AssistantMessageEventStream();\n\n\tvoid (async () => {\n\t\tconst output = Message.createAssistantMessage({\n\t\t\trole: \"assistant\",\n\t\t\tparts: [],\n\t\t\tprotocol: model.protocol,\n\t\t\tprovider: model.provider,\n\t\t\tmodel: model.id,\n\t\t\tusage: {\n\t\t\t\tinput: 0,\n\t\t\t\toutput: 0,\n\t\t\t\tcacheRead: 0,\n\t\t\t\tcacheWrite: 0,\n\t\t\t\ttotalTokens: 0,\n\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t},\n\t\t\tstopReason: \"stop\",\n\t\t\ttime: {\n\t\t\t\tcreated: Date.now(),\n\t\t\t\tcompleted: Date.now(),\n\t\t\t},\n\t\t});\n\n\t\ttry {\n\t\t\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider) || \"\";\n\t\t\tconst client = createClient(model, context, apiKey, options?.headers);\n\t\t\tlet params = buildParams(model, context, options);\n\t\t\tconst nextParams = await options?.onPayload?.(params, model);\n\t\t\tif (nextParams !== undefined) {\n\t\t\t\tparams = nextParams as OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming;\n\t\t\t}\n\n\t\t\tconst openaiStream = await client.chat.completions.create(params, { signal: options?.signal });\n\t\t\tstream.push({ type: \"start\", partial: output });\n\n\t\t\tlet currentBlock: Exclude<StreamingBlock, StreamingToolCallBlock> | null = null;\n\t\t\tconst blocks = output.parts as StreamingBlock[];\n\t\t\tconst activeToolCalls = new Map<number, StreamingToolCallBlock>();\n\t\t\tconst finishCurrentBlock = (block?: StreamingBlock | null) => {\n\t\t\t\tif (block) {\n\t\t\t\t\tconst partIndex = block.index ?? blocks.indexOf(block);\n\t\t\t\t\tdelete block.index;\n\n\t\t\t\t\tif (block.type === \"text\") {\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.end\",\n\t\t\t\t\t\t\tpartIndex,\n\t\t\t\t\t\t\tcontent: block.text,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (block.type === \"thinking\") {\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.end\",\n\t\t\t\t\t\t\tpartIndex,\n\t\t\t\t\t\t\tcontent: block.thinking,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t} else if (block.type === \"toolCall\") {\n\t\t\t\t\t\tif (block.streamIndex !== undefined) {\n\t\t\t\t\t\t\tactiveToolCalls.delete(block.streamIndex);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tblock.arguments = parseStreamingJson<Record<string, unknown>>(block.partialArgs);\n\t\t\t\t\t\tdelete block.partialArgs;\n\t\t\t\t\t\tdelete block.streamIndex;\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.end\",\n\t\t\t\t\t\t\tpartIndex,\n\t\t\t\t\t\t\ttoolCall: block,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t};\n\t\t\tconst flushActiveToolCalls = () => {\n\t\t\t\tfor (const toolBlock of [...activeToolCalls.values()].sort((a, b) => (a.index ?? 0) - (b.index ?? 0))) {\n\t\t\t\t\tfinishCurrentBlock(toolBlock);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tfor await (const chunk of openaiStream) {\n\t\t\t\tif (!chunk || typeof chunk !== \"object\") continue;\n\n\t\t\t\t// OpenAI documents ChatCompletionChunk.id as the unique chat completion identifier,\n\t\t\t\t// and each chunk in a streamed completion carries the same id.\n\t\t\t\toutput.responseId ||= chunk.id;\n\t\t\t\tif (chunk.usage) {\n\t\t\t\t\toutput.usage = parseChunkUsage(chunk.usage, model);\n\t\t\t\t}\n\n\t\t\t\tconst choice = Array.isArray(chunk.choices) ? chunk.choices[0] : undefined;\n\t\t\t\tif (!choice) continue;\n\n\t\t\t\t// fallback: some providers (e.g., Moonshot) return usage\n\t\t\t\t// in choice.usage instead of the standard chunk.usage\n\t\t\t\tconst choiceWithUsage = choice as unknown as {\n\t\t\t\t\tusage?: Parameters<typeof parseChunkUsage>[0];\n\t\t\t\t};\n\t\t\t\tif (!chunk.usage && choiceWithUsage.usage) {\n\t\t\t\t\toutput.usage = parseChunkUsage(choiceWithUsage.usage, model);\n\t\t\t\t}\n\n\t\t\t\tif (choice.finish_reason) {\n\t\t\t\t\tconst finishReasonResult = mapStopReason(choice.finish_reason);\n\t\t\t\t\toutput.stopReason = finishReasonResult.stopReason;\n\t\t\t\t\tif (finishReasonResult.errorMessage) {\n\t\t\t\t\t\toutput.errorMessage = finishReasonResult.errorMessage;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!choice.delta) continue;\n\n\t\t\t\tif (\n\t\t\t\t\tchoice.delta.content !== null &&\n\t\t\t\t\tchoice.delta.content !== undefined &&\n\t\t\t\t\tchoice.delta.content.length > 0\n\t\t\t\t) {\n\t\t\t\t\tif (activeToolCalls.size > 0) {\n\t\t\t\t\t\tflushActiveToolCalls();\n\t\t\t\t\t}\n\t\t\t\t\tif (!currentBlock || currentBlock.type !== \"text\") {\n\t\t\t\t\t\tfinishCurrentBlock(currentBlock);\n\t\t\t\t\t\tcurrentBlock = { type: \"text\", text: \"\", index: output.parts.length };\n\t\t\t\t\t\toutput.parts.push(currentBlock);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.start\",\n\t\t\t\t\t\t\tpartIndex: currentBlock.index!,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (currentBlock.type === \"text\") {\n\t\t\t\t\t\tcurrentBlock.text += choice.delta.content;\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"text.delta\",\n\t\t\t\t\t\t\tpartIndex: currentBlock.index!,\n\t\t\t\t\t\t\tdelta: choice.delta.content,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// some endpoints return reasoning in reasoning_content (llama.cpp),\n\t\t\t\t// or reasoning (other openai compatible endpoints)\n\t\t\t\t// Use the first non-empty reasoning field to avoid duplication\n\t\t\t\t// (e.g., chutes.ai returns both reasoning_content and reasoning with same content)\n\t\t\t\tconst reasoningFields = [\"reasoning_content\", \"reasoning\", \"reasoning_text\"] as const;\n\t\t\t\tlet foundReasoningField: (typeof reasoningFields)[number] | null = null;\n\t\t\t\tfor (const field of reasoningFields) {\n\t\t\t\t\tconst value = (choice.delta as Record<string, unknown>)[field];\n\t\t\t\t\tif (typeof value === \"string\" && value.length > 0) {\n\t\t\t\t\t\tfoundReasoningField = field;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (foundReasoningField) {\n\t\t\t\t\tif (activeToolCalls.size > 0) {\n\t\t\t\t\t\tflushActiveToolCalls();\n\t\t\t\t\t}\n\t\t\t\t\tif (!currentBlock || currentBlock.type !== \"thinking\") {\n\t\t\t\t\t\tfinishCurrentBlock(currentBlock);\n\t\t\t\t\t\tcurrentBlock = {\n\t\t\t\t\t\t\ttype: \"thinking\",\n\t\t\t\t\t\t\tthinking: \"\",\n\t\t\t\t\t\t\tthinkingSignature: foundReasoningField,\n\t\t\t\t\t\t\tindex: output.parts.length,\n\t\t\t\t\t\t};\n\t\t\t\t\t\toutput.parts.push(currentBlock);\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"thinking.start\",\n\t\t\t\t\t\t\tpartIndex: currentBlock.index!,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\n\t\t\t\t\tif (currentBlock.type === \"thinking\") {\n\t\t\t\t\t\tconst delta = (choice.delta as Record<string, unknown>)[foundReasoningField];\n\t\t\t\t\t\tif (typeof delta === \"string\") {\n\t\t\t\t\t\t\tcurrentBlock.thinking += delta;\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"thinking.delta\",\n\t\t\t\t\t\t\t\tpartIndex: currentBlock.index!,\n\t\t\t\t\t\t\t\tdelta,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (choice.delta.tool_calls) {\n\t\t\t\t\tif (currentBlock) {\n\t\t\t\t\t\tfinishCurrentBlock(currentBlock);\n\t\t\t\t\t\tcurrentBlock = null;\n\t\t\t\t\t}\n\n\t\t\t\t\tfor (const toolCall of choice.delta.tool_calls) {\n\t\t\t\t\t\tconst streamIndex = toolCall.index ?? activeToolCalls.size;\n\t\t\t\t\t\tlet toolBlock = activeToolCalls.get(streamIndex);\n\t\t\t\t\t\tif (!toolBlock) {\n\t\t\t\t\t\t\ttoolBlock = {\n\t\t\t\t\t\t\t\ttype: \"toolCall\",\n\t\t\t\t\t\t\t\tcallID: toolCall.id || \"\",\n\t\t\t\t\t\t\t\tname: toolCall.function?.name || \"\",\n\t\t\t\t\t\t\t\targuments: {},\n\t\t\t\t\t\t\t\tpartialArgs: \"\",\n\t\t\t\t\t\t\t\tindex: output.parts.length,\n\t\t\t\t\t\t\t\tstreamIndex,\n\t\t\t\t\t\t\t\tstatus: \"pending\",\n\t\t\t\t\t\t\t\ttime: {\n\t\t\t\t\t\t\t\t\tstart: Date.now(),\n\t\t\t\t\t\t\t\t\tend: Date.now(),\n\t\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\tactiveToolCalls.set(streamIndex, toolBlock);\n\t\t\t\t\t\t\toutput.parts.push(toolBlock);\n\t\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\t\ttype: \"toolcall.start\",\n\t\t\t\t\t\t\t\tpartIndex: toolBlock.index!,\n\t\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (toolCall.id) toolBlock.callID = toolCall.id;\n\t\t\t\t\t\tif (toolCall.function?.name) toolBlock.name = toolCall.function.name;\n\n\t\t\t\t\t\tlet delta = \"\";\n\t\t\t\t\t\tif (toolCall.function?.arguments) {\n\t\t\t\t\t\t\tdelta = toolCall.function.arguments;\n\t\t\t\t\t\t\ttoolBlock.partialArgs = (toolBlock.partialArgs || \"\") + delta;\n\t\t\t\t\t\t\ttoolBlock.arguments = parseStreamingJson<Record<string, unknown>>(toolBlock.partialArgs);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\ttoolBlock.time.end = Date.now();\n\t\t\t\t\t\tstream.push({\n\t\t\t\t\t\t\ttype: \"toolcall.delta\",\n\t\t\t\t\t\t\tpartIndex: toolBlock.index!,\n\t\t\t\t\t\t\tdelta,\n\t\t\t\t\t\t\tpartial: output,\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tconst reasoningDetails = (choice.delta as { reasoning_details?: Array<Record<string, unknown>> })\n\t\t\t\t\t.reasoning_details;\n\t\t\t\tif (reasoningDetails && Array.isArray(reasoningDetails)) {\n\t\t\t\t\tfor (const detail of reasoningDetails) {\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tdetail.type === \"reasoning.encrypted\" &&\n\t\t\t\t\t\t\ttypeof detail.id === \"string\" &&\n\t\t\t\t\t\t\tdetail.data !== undefined\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\tconst matchingToolCall = output.parts.find(\n\t\t\t\t\t\t\t\t(block) => block.type === \"toolCall\" && block.callID === detail.id,\n\t\t\t\t\t\t\t) as Message.ToolCall | undefined;\n\t\t\t\t\t\t\tif (matchingToolCall) {\n\t\t\t\t\t\t\t\tmatchingToolCall.thoughtSignature = JSON.stringify(detail);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tfinishCurrentBlock(currentBlock);\n\t\t\tflushActiveToolCalls();\n\t\t\tif (options?.signal?.aborted) {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"aborted\") {\n\t\t\t\tthrow new Error(\"Request was aborted\");\n\t\t\t}\n\t\t\tif (output.stopReason === \"error\") {\n\t\t\t\tthrow new Error(output.errorMessage || \"Provider returned an error stop reason\");\n\t\t\t}\n\n\t\t\toutput.time.completed = Date.now();\n\t\t\tstream.push({ type: \"done\", reason: output.stopReason, message: output });\n\t\t\tstream.end();\n\t\t} catch (error) {\n\t\t\tfor (const block of output.parts) {\n\t\t\t\tdelete (block as StreamingBlock).index;\n\t\t\t\tdelete (block as StreamingToolCallBlock).partialArgs;\n\t\t\t\tdelete (block as StreamingToolCallBlock).streamIndex;\n\t\t\t}\n\t\t\toutput.time.completed = Date.now();\n\t\t\toutput.stopReason = options?.signal?.aborted ? \"aborted\" : \"error\";\n\t\t\toutput.errorMessage = error instanceof Error ? error.message : JSON.stringify(error);\n\t\t\tconst rawMetadata = (error as { error?: { metadata?: { raw?: string } } })?.error?.metadata?.raw;\n\t\t\tif (rawMetadata) output.errorMessage += `\\n${rawMetadata}`;\n\t\t\tstream.push({ type: \"error\", reason: output.stopReason, error: output });\n\t\t\tstream.end();\n\t\t}\n\t})();\n\n\treturn stream;\n};\n\nexport const streamSimpleOpenAICompletions: Stream.StreamFunction<\n\ttypeof Model.KnownProtocolEnum.openaiCompletions,\n\tStream.SimpleOptions\n> = (\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tcontext: Message.Context,\n\toptions?: Stream.SimpleOptions,\n): AssistantMessageEventStream => {\n\tconst apiKey = options?.apiKey || getEnvApiKey(model.provider);\n\tif (!apiKey) {\n\t\tthrow new Error(`No API key for provider: ${model.provider.id}`);\n\t}\n\n\tconst base = Stream.buildBaseOptions(model, options, apiKey);\n\tconst simpleReasoning = Model.supportsXhigh(model) ? options?.reasoning : Stream.clampReasoning(options?.reasoning);\n\tconst reasoningEffort: OpenAIReasoningEffort | undefined =\n\t\tsimpleReasoning && simpleReasoning !== Stream.ThinkingLevelEnum.off ? simpleReasoning : undefined;\n\tconst toolChoice = (options as OpenAICompletionsOptions | undefined)?.toolChoice;\n\n\treturn streamOpenAICompletions(model, context, {\n\t\t...base,\n\t\treasoningEffort,\n\t\ttoolChoice,\n\t} satisfies OpenAICompletionsOptions);\n};\n\nfunction buildParams(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tcontext: Message.Context,\n\toptions?: OpenAICompletionsOptions,\n) {\n\tconst compat = getCompat(model);\n\tconst messages = convertMessages(model, context, compat);\n\tmaybeAddOpenRouterAnthropicCacheControl(model, messages);\n\t//\n\t// resolve URL\n\t// ideally this is last resort\n\tconst baseUrl = resolveBaseUrl(model);\n\n\tconst params: OpenAI.Chat.Completions.ChatCompletionCreateParamsStreaming = {\n\t\tmodel: model.id,\n\t\tmessages,\n\t\tstream: true,\n\t};\n\n\tif (compat.supportsUsageInStreaming !== false) {\n\t\t(params as typeof params & { stream_options?: { include_usage: boolean } }).stream_options = {\n\t\t\tinclude_usage: true,\n\t\t};\n\t}\n\n\tif (compat.supportsStore) {\n\t\tparams.store = false;\n\t}\n\n\tif (options?.maxTokens) {\n\t\tif (compat.maxTokensField === \"max_tokens\") {\n\t\t\t(params as typeof params & { max_tokens?: number }).max_tokens = options.maxTokens;\n\t\t} else {\n\t\t\tparams.max_completion_tokens = options.maxTokens;\n\t\t}\n\t}\n\n\tif (options?.temperature !== undefined) {\n\t\tparams.temperature = options.temperature;\n\t}\n\n\tif (context.tools) {\n\t\tparams.tools = convertTools(context.tools, compat);\n\t\tif (compat.zaiToolStream) {\n\t\t\t(params as typeof params & { tool_stream?: boolean }).tool_stream = true;\n\t\t}\n\t} else if (hasToolHistory(context.messages)) {\n\t\tparams.tools = [];\n\t}\n\n\tif (options?.toolChoice) {\n\t\tparams.tool_choice = options.toolChoice;\n\t}\n\n\tif ((compat.thinkingFormat === \"zai\" || compat.thinkingFormat === \"qwen\") && model.reasoning) {\n\t\t(params as typeof params & { enable_thinking?: boolean }).enable_thinking = !!options?.reasoningEffort;\n\t} else if (compat.thinkingFormat === \"qwen-chat-template\" && model.reasoning) {\n\t\t(params as typeof params & { chat_template_kwargs?: { enable_thinking: boolean } }).chat_template_kwargs = {\n\t\t\tenable_thinking: !!options?.reasoningEffort,\n\t\t};\n\t} else if (compat.thinkingFormat === \"openrouter\" && model.reasoning) {\n\t\tconst openRouterParams = params as typeof params & { reasoning?: { effort?: string } };\n\t\tif (options?.reasoningEffort) {\n\t\t\topenRouterParams.reasoning = {\n\t\t\t\teffort: mapReasoningEffort(options.reasoningEffort, compat.reasoningEffortMap),\n\t\t\t};\n\t\t} else {\n\t\t\topenRouterParams.reasoning = { effort: \"none\" };\n\t\t}\n\t} else if (options?.reasoningEffort && model.reasoning && compat.supportsReasoningEffort) {\n\t\t(params as { reasoning_effort?: string }).reasoning_effort = mapReasoningEffort(\n\t\t\toptions.reasoningEffort,\n\t\t\tcompat.reasoningEffortMap,\n\t\t);\n\t}\n\n\tif (baseUrl.includes(\"openrouter.ai\") && model.compat?.openRouterRouting) {\n\t\t(params as typeof params & { provider?: Provider.OpenRouterRouting }).provider = model.compat.openRouterRouting;\n\t}\n\n\tif (baseUrl.includes(\"ai-gateway.vercel.sh\") && model.compat?.vercelGatewayRouting) {\n\t\tconst routing = model.compat.vercelGatewayRouting;\n\t\tif (routing.only || routing.order) {\n\t\t\tconst gatewayOptions: Record<string, string[]> = {};\n\t\t\tif (routing.only) gatewayOptions.only = routing.only;\n\t\t\tif (routing.order) gatewayOptions.order = routing.order;\n\t\t\t(\n\t\t\t\tparams as typeof params & {\n\t\t\t\t\tproviderOptions?: { gateway: Record<string, string[]> };\n\t\t\t\t}\n\t\t\t).providerOptions = { gateway: gatewayOptions };\n\t\t}\n\t}\n\n\treturn params;\n}\n\nfunction createClient(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tcontext: Message.Context,\n\tapiKey?: string,\n\toptsHeaders?: Record<string, string>,\n) {\n\tconst baseUrl = resolveBaseUrl(model);\n\tif (!apiKey) {\n\t\tif (!process.env.OPENAI_API_KEY) {\n\t\t\tthrow new Error(\n\t\t\t\t\"OpenAI API key is required. set OPENAI_API_KEY environment variable or pass it as an argument\",\n\t\t\t);\n\t\t}\n\t\tapiKey = process.env.OPENAI_API_KEY;\n\t}\n\n\tconst headers = { ...model.headers };\n\tif (model.provider.id === Provider.KnownProviderEnum.githubCopilot) {\n\t\tconst hasImages = hasCopilotVisionInput(context.messages);\n\t\tconst copilotHeaders = buildCopilotDynamicHeaders({\n\t\t\tmessages: context.messages,\n\t\t\thasImages,\n\t\t});\n\t\tObject.assign(headers, copilotHeaders);\n\t}\n\n\tif (optsHeaders) {\n\t\tObject.assign(headers, optsHeaders);\n\t}\n\n\treturn new OpenAI({\n\t\tapiKey,\n\t\tbaseURL: baseUrl,\n\t\tdangerouslyAllowBrowser: true,\n\t\tdefaultHeaders: headers,\n\t});\n}\n\nfunction mapReasoningEffort(\n\teffort: NonNullable<OpenAICompletionsOptions[\"reasoningEffort\"]>,\n\treasoningEffortMap: Partial<Record<OpenAIReasoningEffort, string>>,\n): string {\n\treturn reasoningEffortMap[effort] ?? effort;\n}\n\nfunction maybeAddOpenRouterAnthropicCacheControl(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tmessages: ChatCompletionMessageParam[],\n): void {\n\tif (model.provider.id !== Provider.KnownProviderEnum.openrouter || !model.id.startsWith(\"anthropic/\")) return;\n\n\t// Anthropic-style caching requires cache_control on a text part. Add a breakpoint\n\t// on the last user/assistant message (walking backwards until we find text content).\n\tfor (let i = messages.length - 1; i >= 0; i--) {\n\t\tconst msg = messages[i];\n\t\tif (!msg) continue;\n\t\tif (msg.role !== \"user\" && msg.role !== \"assistant\") continue;\n\n\t\tconst content = msg.content;\n\t\tif (typeof content === \"string\") {\n\t\t\tmsg.content = [\n\t\t\t\tObject.assign({ type: \"text\" as const, text: content }, { cache_control: { type: \"ephemeral\" } }),\n\t\t\t];\n\t\t\treturn;\n\t\t}\n\n\t\tif (!Array.isArray(content)) continue;\n\n\t\tfor (let j = content.length - 1; j >= 0; j--) {\n\t\t\tconst part = content[j];\n\t\t\tif (part?.type === \"text\") {\n\t\t\t\tObject.assign(part, { cache_control: { type: \"ephemeral\" } });\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport function convertMessages(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n\tcontext: Message.Context,\n\tcompat: Required<Model.OpenAICompletionsCompat>,\n): ChatCompletionMessageParam[] {\n\tconst params: ChatCompletionMessageParam[] = [];\n\n\tconst normalizeToolCallId = (id: string): string => {\n\t\t// handle pipe-separated IDs from OpenAI Responses API\n\t\t// format: {call_id}|{id} where {id} can be 400+ chars with special chars (+, /, =)\n\t\t// these come from providers like github-copilot, openai-codex, opencode\n\t\t// extract just the call_id part and normalize it\n\t\tif (id.includes(\"|\")) {\n\t\t\tconst callID = id.split(\"|\")[0] ?? id;\n\t\t\t// sanitize to allowed chars and truncate to 40 chars (OpenAI limit)\n\t\t\treturn callID.replace(/[^a-zA-Z0-9_-]/g, \"_\").slice(0, 40);\n\t\t}\n\n\t\tif (model.provider.id === Provider.KnownProviderEnum.openai) {\n\t\t\treturn id.length > 40 ? id.slice(0, 40) : id;\n\t\t}\n\t\treturn id;\n\t};\n\n\tconst transformedMessages = Message.transformMessages(context.messages, model, normalizeToolCallId);\n\n\tif (context.systemPrompt) {\n\t\tconst useDeveloperRole = model.reasoning && compat.supportsDeveloperRole;\n\t\tconst role = useDeveloperRole ? \"developer\" : \"system\";\n\t\tparams.push({\n\t\t\trole,\n\t\t\tcontent: sanitizeSurrogates(context.systemPrompt),\n\t\t});\n\t}\n\n\tlet lastRole: \"user\" | \"assistant\" | \"tool\" | null = null;\n\n\tfor (const msg of transformedMessages) {\n\t\t// some providers don't allow user messages directly after tool results\n\t\t// insert a synthetic assistant message to bridge the gap\n\t\tif (compat.requiresAssistantAfterToolResult && lastRole === \"tool\" && msg.role === \"user\") {\n\t\t\tparams.push({\n\t\t\t\trole: \"assistant\",\n\t\t\t\tcontent: \"I have processed the tool results.\",\n\t\t\t});\n\t\t\tlastRole = \"assistant\";\n\t\t}\n\n\t\tif (msg.role === \"user\") {\n\t\t\tconst content: ChatCompletionContentPart[] = msg.parts.flatMap((item): ChatCompletionContentPart[] => {\n\t\t\t\tif (item.type === \"text\") {\n\t\t\t\t\tconst text = sanitizeSurrogates(item.text);\n\t\t\t\t\tif (text.trim().length === 0) return [];\n\t\t\t\t\treturn [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\ttext,\n\t\t\t\t\t\t} satisfies ChatCompletionContentPartText,\n\t\t\t\t\t];\n\t\t\t\t}\n\n\t\t\t\tif (!model.input.includes(\"image\")) return [];\n\t\t\t\treturn [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"image_url\",\n\t\t\t\t\t\timage_url: {\n\t\t\t\t\t\t\turl: `data:${item.mimeType};base64,${item.data}`,\n\t\t\t\t\t\t},\n\t\t\t\t\t} satisfies ChatCompletionContentPartImage,\n\t\t\t\t];\n\t\t\t});\n\n\t\t\tif (content.length === 0) continue;\n\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent,\n\t\t\t});\n\t\t\tlastRole = \"user\";\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst assistantMsg: ChatCompletionAssistantMessageParam = {\n\t\t\trole: \"assistant\",\n\t\t\tcontent: compat.requiresAssistantAfterToolResult ? \"\" : null,\n\t\t};\n\n\t\tconst textBlocks = msg.parts.filter((block) => block.type === \"text\") as Message.TextContent[];\n\t\tconst textSegments = textBlocks\n\t\t\t.map((block) => sanitizeSurrogates(block.text))\n\t\t\t.filter((text) => text.trim().length > 0);\n\n\t\tconst thinkingBlocks = msg.parts.filter((block) => block.type === \"thinking\") as Message.ThinkingContent[];\n\t\tconst nonEmptyThinkingBlocks = thinkingBlocks.filter((block) => block.thinking.trim().length > 0);\n\n\t\tif (compat.requiresThinkingAsText && nonEmptyThinkingBlocks.length > 0) {\n\t\t\ttextSegments.unshift(...nonEmptyThinkingBlocks.map((block) => sanitizeSurrogates(block.thinking)));\n\t\t} else if (nonEmptyThinkingBlocks.length > 0) {\n\t\t\tconst signature = nonEmptyThinkingBlocks[0]?.thinkingSignature;\n\t\t\tif (signature && signature.length > 0) {\n\t\t\t\t(assistantMsg as ChatCompletionAssistantMessageParam & Record<string, string>)[signature] =\n\t\t\t\t\tnonEmptyThinkingBlocks.map((block) => sanitizeSurrogates(block.thinking)).join(\"\\n\");\n\t\t\t}\n\t\t}\n\n\t\tif (textSegments.length > 0) {\n\t\t\tassistantMsg.content = textSegments.join(\"\");\n\t\t}\n\n\t\tconst toolCalls = msg.parts.filter((block) => block.type === \"toolCall\") as Message.ToolCall[];\n\t\tif (toolCalls.length > 0) {\n\t\t\tassistantMsg.tool_calls = toolCalls.map((toolCall) => ({\n\t\t\t\tid: toolCall.callID,\n\t\t\t\ttype: \"function\" as const,\n\t\t\t\tfunction: {\n\t\t\t\t\tname: toolCall.name,\n\t\t\t\t\targuments: JSON.stringify(toolCall.arguments),\n\t\t\t\t},\n\t\t\t}));\n\n\t\t\tconst reasoningDetails = toolCalls\n\t\t\t\t.filter((toolCall) => toolCall.thoughtSignature)\n\t\t\t\t.map((toolCall) => {\n\t\t\t\t\ttry {\n\t\t\t\t\t\treturn JSON.parse(toolCall.thoughtSignature!);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\treturn null;\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.filter(Boolean);\n\n\t\t\tif (reasoningDetails.length > 0) {\n\t\t\t\t(\n\t\t\t\t\tassistantMsg as ChatCompletionAssistantMessageParam & { reasoning_details?: unknown[] }\n\t\t\t\t).reasoning_details = reasoningDetails;\n\t\t\t}\n\t\t}\n\n\t\tconst assistantContent = assistantMsg.content;\n\t\tconst hasAssistantContent =\n\t\t\tassistantContent !== null &&\n\t\t\tassistantContent !== undefined &&\n\t\t\t(typeof assistantContent === \"string\" ? assistantContent.length > 0 : assistantContent.length > 0);\n\t\tif (!hasAssistantContent && !assistantMsg.tool_calls) {\n\t\t\tcontinue;\n\t\t}\n\n\t\tparams.push(assistantMsg);\n\t\tlastRole = \"assistant\";\n\n\t\tconst imageBlocks: Array<{ type: \"image_url\"; image_url: { url: string } }> = [];\n\n\t\tfor (const toolCall of toolCalls) {\n\t\t\tif (toolCall.status === \"pending\" || toolCall.status === \"running\") {\n\t\t\t\tparams.push(buildSyntheticToolResult(toolCall, compat));\n\t\t\t\tlastRole = \"tool\";\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst textResult = toolCall.result.content\n\t\t\t\t.filter((content) => content.type === \"text\")\n\t\t\t\t.map((content) => content.text)\n\t\t\t\t.join(\"\\n\");\n\t\t\tconst hasImages = toolCall.result.content.some((content) => content.type === \"image\");\n\n\t\t\tconst toolResultMsg: ChatCompletionToolMessageParam = {\n\t\t\t\trole: \"tool\",\n\t\t\t\tcontent: sanitizeSurrogates(textResult.length > 0 ? textResult : \"(see attached image)\"),\n\t\t\t\ttool_call_id: toolCall.callID,\n\t\t\t};\n\t\t\tif (compat.requiresToolResultName) {\n\t\t\t\t(toolResultMsg as ChatCompletionToolMessageParam & { name?: string }).name = toolCall.name;\n\t\t\t}\n\t\t\tparams.push(toolResultMsg);\n\t\t\tlastRole = \"tool\";\n\n\t\t\tif (hasImages && model.input.includes(\"image\")) {\n\t\t\t\tfor (const block of toolCall.result.content) {\n\t\t\t\t\tif (block.type === \"image\") {\n\t\t\t\t\t\timageBlocks.push({\n\t\t\t\t\t\t\ttype: \"image_url\",\n\t\t\t\t\t\t\timage_url: {\n\t\t\t\t\t\t\t\turl: `data:${block.mimeType};base64,${block.data}`,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (imageBlocks.length > 0) {\n\t\t\tif (compat.requiresAssistantAfterToolResult) {\n\t\t\t\tparams.push({\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tcontent: \"I have processed the tool results.\",\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tparams.push({\n\t\t\t\trole: \"user\",\n\t\t\t\tcontent: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\ttext: \"Attached image(s) from tool result:\",\n\t\t\t\t\t},\n\t\t\t\t\t...imageBlocks,\n\t\t\t\t],\n\t\t\t});\n\t\t\tlastRole = \"user\";\n\t\t}\n\t}\n\n\treturn params;\n}\n\nfunction convertTools(\n\ttools: Message.Tool[],\n\tcompat: Required<Model.OpenAICompletionsCompat>,\n): OpenAI.Chat.Completions.ChatCompletionTool[] {\n\treturn tools.map((tool) => ({\n\t\ttype: \"function\",\n\t\tfunction: {\n\t\t\tname: tool.name,\n\t\t\tdescription: tool.description,\n\t\t\tparameters: tool.parameters as Record<string, unknown>,\n\t\t\t...(compat.supportsStrictMode !== false && { strict: false }),\n\t\t},\n\t}));\n}\n\nfunction parseChunkUsage(\n\trawUsage: {\n\t\tprompt_tokens?: number;\n\t\tcompletion_tokens?: number;\n\t\tprompt_tokens_details?: { cached_tokens?: number; cache_write_tokens?: number };\n\t\tcompletion_tokens_details?: { reasoning_tokens?: number };\n\t},\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n): Message.AssistantMessage[\"usage\"] {\n\tconst promptTokens = rawUsage.prompt_tokens || 0;\n\tconst reportedCachedTokens = rawUsage.prompt_tokens_details?.cached_tokens || 0;\n\tconst cacheWriteTokens = rawUsage.prompt_tokens_details?.cache_write_tokens || 0;\n\tconst reasoningTokens = rawUsage.completion_tokens_details?.reasoning_tokens || 0;\n\n\tconst cacheReadTokens =\n\t\tcacheWriteTokens > 0 ? Math.max(0, reportedCachedTokens - cacheWriteTokens) : reportedCachedTokens;\n\n\tconst input = Math.max(0, promptTokens - cacheReadTokens - cacheWriteTokens);\n\tconst outputTokens = (rawUsage.completion_tokens || 0) + reasoningTokens;\n\tconst usage: Message.AssistantMessage[\"usage\"] = {\n\t\tinput,\n\t\toutput: outputTokens,\n\t\tcacheRead: cacheReadTokens,\n\t\tcacheWrite: cacheWriteTokens,\n\t\ttotalTokens: input + outputTokens + cacheReadTokens + cacheWriteTokens,\n\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t};\n\tModel.calculateCost(model, usage);\n\treturn usage;\n}\n\nfunction mapStopReason(reason: string | null): {\n\tstopReason: Message.StopReason;\n\terrorMessage?: string;\n} {\n\tif (reason === null) return { stopReason: \"stop\" };\n\tswitch (reason) {\n\t\tcase \"stop\":\n\t\tcase \"end\":\n\t\t\treturn { stopReason: \"stop\" };\n\t\tcase \"length\":\n\t\t\treturn { stopReason: \"length\" };\n\t\tcase \"function_call\":\n\t\tcase \"tool_calls\":\n\t\t\treturn { stopReason: \"toolUse\" };\n\t\tcase \"content_filter\":\n\t\t\treturn { stopReason: \"error\", errorMessage: \"Provider finish_reason: content_filter\" };\n\t\tcase \"network_error\":\n\t\t\treturn { stopReason: \"error\", errorMessage: \"Provider finish_reason: network_error\" };\n\t\tdefault:\n\t\t\treturn {\n\t\t\t\tstopReason: \"error\",\n\t\t\t\terrorMessage: `Provider finish_reason: ${reason}`,\n\t\t\t};\n\t}\n}\n\nfunction detectCompat(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n): Required<Model.OpenAICompletionsCompat> {\n\tconst provider = model.provider.id;\n\tconst baseUrl = resolveBaseUrl(model);\n\n\tconst isZai = provider === \"zai\" || baseUrl.includes(\"api.z.ai\");\n\tconst isNonStandard =\n\t\tprovider === \"cerebras\" ||\n\t\tbaseUrl.includes(\"cerebras.ai\") ||\n\t\tprovider === \"xai\" ||\n\t\tbaseUrl.includes(\"api.x.ai\") ||\n\t\tbaseUrl.includes(\"chutes.ai\") ||\n\t\tbaseUrl.includes(\"deepseek.com\") ||\n\t\tisZai ||\n\t\tprovider === \"opencode\" ||\n\t\tbaseUrl.includes(\"opencode.ai\");\n\n\tconst useMaxTokens = baseUrl.includes(\"chutes.ai\");\n\tconst isGrok = provider === \"xai\" || baseUrl.includes(\"api.x.ai\");\n\tconst isGroq = provider === \"groq\" || baseUrl.includes(\"groq.com\");\n\n\tconst reasoningEffortMap: Partial<Record<OpenAIReasoningEffort, string>> =\n\t\tisGroq && model.id === \"qwen/qwen3-32b\"\n\t\t\t? {\n\t\t\t\t\tminimal: \"default\",\n\t\t\t\t\tlow: \"default\",\n\t\t\t\t\tmedium: \"default\",\n\t\t\t\t\thigh: \"default\",\n\t\t\t\t\txhigh: \"default\",\n\t\t\t\t}\n\t\t\t: {};\n\n\treturn {\n\t\tsupportsStore: !isNonStandard,\n\t\tsupportsDeveloperRole: !isNonStandard,\n\t\tsupportsReasoningEffort: !isGrok && !isZai,\n\t\treasoningEffortMap,\n\t\tsupportsUsageInStreaming: true,\n\t\tmaxTokensField: useMaxTokens ? \"max_tokens\" : \"max_completion_tokens\",\n\t\trequiresToolResultName: false,\n\t\trequiresAssistantAfterToolResult: false,\n\t\trequiresThinkingAsText: false,\n\t\tthinkingFormat: isZai\n\t\t\t? \"zai\"\n\t\t\t: provider === \"openrouter\" || baseUrl.includes(\"openrouter.ai\")\n\t\t\t\t? \"openrouter\"\n\t\t\t\t: \"openai\",\n\t\topenRouterRouting: {},\n\t\tvercelGatewayRouting: {},\n\t\tzaiToolStream: false,\n\t\tsupportsStrictMode: true,\n\t};\n}\n\n/**\n * Get resolved compatibility settings for a model.\n * Uses explicit model.compat if provided, otherwise auto-detects from provider/URL.\n */\nfunction getCompat(\n\tmodel: Model.TModel<typeof Model.KnownProtocolEnum.openaiCompletions>,\n): Required<Model.OpenAICompletionsCompat> {\n\tconst detected = detectCompat(model);\n\tif (!model.compat) return detected;\n\n\treturn {\n\t\tsupportsStore: model.compat.supportsStore ?? detected.supportsStore,\n\t\tsupportsDeveloperRole: model.compat.supportsDeveloperRole ?? detected.supportsDeveloperRole,\n\t\tsupportsReasoningEffort: model.compat.supportsReasoningEffort ?? detected.supportsReasoningEffort,\n\t\treasoningEffortMap: model.compat.reasoningEffortMap ?? detected.reasoningEffortMap,\n\t\tsupportsUsageInStreaming: model.compat.supportsUsageInStreaming ?? detected.supportsUsageInStreaming,\n\t\tmaxTokensField: model.compat.maxTokensField ?? detected.maxTokensField,\n\t\trequiresToolResultName: model.compat.requiresToolResultName ?? detected.requiresToolResultName,\n\t\trequiresAssistantAfterToolResult:\n\t\t\tmodel.compat.requiresAssistantAfterToolResult ?? detected.requiresAssistantAfterToolResult,\n\t\trequiresThinkingAsText: model.compat.requiresThinkingAsText ?? detected.requiresThinkingAsText,\n\t\tthinkingFormat: model.compat.thinkingFormat ?? detected.thinkingFormat,\n\t\topenRouterRouting: model.compat.openRouterRouting ?? {},\n\t\tvercelGatewayRouting: model.compat.vercelGatewayRouting ?? detected.vercelGatewayRouting,\n\t\tzaiToolStream: model.compat.zaiToolStream ?? detected.zaiToolStream,\n\t\tsupportsStrictMode: model.compat.supportsStrictMode ?? detected.supportsStrictMode,\n\t};\n}\n\nconst openAICompletionsProtocolProvider: Stream.ProtocolProvider<\n\ttypeof Model.KnownProtocolEnum.openaiCompletions,\n\tOpenAICompletionsOptions\n> = {\n\tprotocol: Model.KnownProtocolEnum.openaiCompletions,\n\tstream: streamOpenAICompletions,\n\tstreamSimple: streamSimpleOpenAICompletions,\n};\n\nexport default openAICompletionsProtocolProvider;\n","import anthropicProvider from \"./providers/anthropic/index\";\nimport openAICompletionsProvider from \"./providers/openai/completions\";\nimport { Stream } from \"./stream\";\n\nStream.registerProtocolProvider(anthropicProvider, \"providers/anthropic/index.ts\");\nStream.registerProtocolProvider(openAICompletionsProvider, \"providers/openai/completions.ts\");\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, type TSchema, Type } from \"@sinclair/typebox\";\nimport type { Event } from \"../event/event\";\nimport { Message } from \"../message/message\";\nimport { Model } from \"../model/model\";\nimport type { Provider } from \"../provider/provider\";\nimport \"../provider/register\";\nimport { Stream } from \"../provider/stream\";\nimport { Loop } from \"./loop\";\n\nexport namespace Agent {\n\texport const ToolTerminalResultSchema = Type.Union([Message.ToolCompletedSchema, Message.ToolErrorSchema]);\n\texport const ToolResultSchema = Type.Union([\n\t\tMessage.ToolRunningSchema,\n\t\tMessage.ToolCompletedSchema,\n\t\tMessage.ToolErrorSchema,\n\t]);\n\n\texport type ToolRunningResult<T> = Omit<Static<typeof Message.ToolRunningSchema>, \"partial\"> & {\n\t\tpartial?: Omit<Static<typeof Message.ToolRunningPartial>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolCompletedResult<T> = Omit<Static<typeof Message.ToolCompletedSchema>, \"result\"> & {\n\t\tresult: Omit<Static<typeof Message.ToolSuccessResult>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolErrorResult<T> = Omit<Static<typeof Message.ToolErrorSchema>, \"result\"> & {\n\t\tresult: Omit<Static<typeof Message.ToolErrorResult>, \"details\"> & {\n\t\t\tdetails?: T;\n\t\t};\n\t};\n\texport type ToolTerminalResult<TCompleted = unknown, TError = unknown> =\n\t\t| ToolCompletedResult<TCompleted>\n\t\t| ToolErrorResult<TError>;\n\ttype InferSchema<T extends TSchema | undefined> = T extends TSchema ? Static<T> : unknown;\n\n\t// callback for tool execution updates.\n\t// consumers can narrow on status if needed\n\t// type inference:\n\t// U - update\n\texport type ToolUpdateCallback<U = unknown> = (result: ToolRunningResult<U>) => Promise<void> | void;\n\n\texport interface AgentTool<\n\t\tTParameters extends TSchema = TSchema,\n\t\tTOutput extends TSchema | undefined = undefined,\n\t\tTUpdate = unknown,\n\t\tTError extends TSchema | undefined = undefined,\n\t> extends Message.Tool<TParameters> {\n\t\t// A human-readable label for the tool for display\n\t\tlabel: string;\n\t\toutputSchema?: TOutput;\n\t\terrorSchema?: TError;\n\t\texecute: (\n\t\t\tcallID: string,\n\t\t\tparams: Static<TParameters>,\n\t\t\tsignal?: AbortSignal,\n\t\t\tonUpdate?: ToolUpdateCallback<TUpdate>,\n\t\t) => Promise<ToolTerminalResult<InferSchema<TOutput>, InferSchema<TError>>>;\n\t}\n\n\texport function defineTool<\n\t\tTParameters extends TSchema,\n\t\tTOutput extends TSchema | undefined = undefined,\n\t\tTUpdate = unknown,\n\t\tTError extends TSchema | undefined = undefined,\n\t>(tool: AgentTool<TParameters, TOutput, TUpdate, TError>): AgentTool<TParameters, TOutput, TUpdate, TError> {\n\t\treturn tool;\n\t}\n\n\texport type AnyAgentTool = AgentTool<any, any, any, any>;\n\n\texport interface State {\n\t\tname: string;\n\t\tsystemPrompt: string;\n\t\tmodel: Model.Info;\n\t\tthinkingLevel: Stream.ThinkingLevel;\n\t\ttools: AnyAgentTool[];\n\t\tmessages: Message.Message[];\n\t\tisStreaming: boolean;\n\t\tstreamMessage: Message.Message | null;\n\t\tpendingToolCalls: Set<string>;\n\t\terror?: string;\n\t}\n\n\t// AgentContext is like Message.Context but uses AgentTool\n\t// TODO: @sanchitrk: rename this to Context; Agent.Context\n\texport interface AgentContext {\n\t\tsystemPrompt: string;\n\t\tmessages: Message.Message[];\n\t\ttools?: AnyAgentTool[];\n\t}\n\n\texport const ToolCallInFlightSchema = Type.Object({\n\t\tcallID: Type.String(),\n\t\tname: Type.String(),\n\t\trawArgs: Type.Record(Type.String(), Type.Unknown()),\n\t\targs: Type.Optional(Type.Unknown()), // post validation\n\t});\n\texport type ToolCallInFlight = Static<typeof ToolCallInFlightSchema>;\n\n\texport const ModelNotFoundErr = NamedError.create(\n\t\t\"ModelNotFoundErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t\tprovider: Type.String(),\n\t\t\tmodel: Type.String(),\n\t\t}),\n\t);\n\n\texport const ModelNotConfiguredErr = NamedError.create(\n\t\t\"ModelNotConfiguredErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\n\texport interface AgentOptions {\n\t\tinitialState?: Partial<State>;\n\t\tconvertToLlm?: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\t/**\n\t\t * Optional transform applied to the context before `convertToLlm`.\n\t\t *\n\t\t * Use this for operations that work at the AgentMessage level:\n\t\t * - Context window management (pruning old messages)\n\t\t * - Injecting context from external sources\n\t\t *\n\t\t * @example\n\t\t * ```typescript\n\t\t * transformContext: async (messages) => {\n\t\t * if (estimateTokens(messages) > MAX_TOKENS) {\n\t\t * return pruneOldMessages(messages);\n\t\t * }\n\t\t * return messages;\n\t\t * }\n\t\t * ```\n\t\t */\n\t\ttransformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\t\t/**\n\t\t * Steering mode: \"all\" = send all steering messages at once, \"one-at-a-time\" = one per turn\n\t\t */\n\t\tsteeringMode?: \"all\" | \"one-at-a-time\";\n\n\t\t/**\n\t\t * Follow-up mode: \"all\" = send all follow-up messages at once, \"one-at-a-time\" = one per turn\n\t\t */\n\t\tfollowUpMode?: \"all\" | \"one-at-a-time\";\n\t\t/**\n\t\t * Custom stream function (for proxy backends, etc.). Default uses streamSimple.\n\t\t */\n\t\tstreamFn?: Loop.StreamFn;\n\t\t/**\n\t\t * Optional session identifier forwarded to LLM providers.\n\t\t * Used by providers that support session-based caching (e.g., OpenAI Codex).\n\t\t */\n\t\tsessionId?: string;\n\t\t/**\n\t\t * Resolves an API key dynamically for each LLM call.\n\t\t * Useful for expiring tokens (e.g., GitHub Copilot OAuth).\n\t\t */\n\t\tgetApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\t\t/**\n\t\t * Inspect or replace provider payloads before they are sent.\n\t\t */\n\t\tonPayload?: Stream.SimpleOptions[\"onPayload\"];\n\t\t/**\n\t\t * Custom token budgets for thinking levels (token-based providers only).\n\t\t */\n\t\tthinkingBudgets?: Stream.ThinkingBudgets;\n\t\t/**\n\t\t * Preferred transport for providers that support multiple transports.\n\t\t */\n\t\ttransport?: Stream.Transport;\n\t\t/**\n\t\t * Maximum delay in milliseconds to wait for a retry when the server requests a long wait.\n\t\t * If the server's requested delay exceeds this value, the request fails immediately,\n\t\t * allowing higher-level retry logic to handle it with user visibility.\n\t\t * Default: 60000 (60 seconds). Set to 0 to disable the cap.\n\t\t */\n\t\tmaxRetryDelayMs?: number;\n\t\t/** Tool execution mode. Default: \"parallel\" */\n\t\ttoolExecution?: Loop.ToolExecutionMode;\n\t\t/** Called before a tool is executed, after arguments have been validated. */\n\t\tbeforeToolExecution?: (\n\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Loop.BeforeToolCallResult | undefined>;\n\t\t/** Called after a tool finishes executing, before final tool events are emitted. */\n\t\tafterToolExecution?: (\n\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\t}\n\n\texport const AgentInStreamingErr = NamedError.create(\n\t\t\"AgentInStreamingErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t\tname: Type.String(),\n\t\t}),\n\t);\n\n\texport class Instance {\n\t\tprivate _state: State;\n\n\t\tprivate listeners = new Set<(e: Event.AgentEvent) => void>();\n\t\tprivate abortController?: AbortController;\n\n\t\tprivate convertToLlm: (messages: Message.Message[]) => Message.Message[] | Promise<Message.Message[]>;\n\t\tprivate transformContext?: (messages: Message.Message[], signal?: AbortSignal) => Promise<Message.Message[]>;\n\n\t\tprivate steeringQueue: Message.UserMessage[] = [];\n\t\tprivate followUpQueue: Message.UserMessage[] = [];\n\t\tprivate steeringMode: \"all\" | \"one-at-a-time\";\n\t\tprivate followUpMode: \"all\" | \"one-at-a-time\";\n\n\t\tpublic streamFn: Loop.StreamFn;\n\n\t\tprivate _sessionId?: string;\n\t\tpublic getApiKey?: (provider: Provider.Info) => Promise<string | undefined> | string | undefined;\n\n\t\tprivate _onPayload?: Stream.SimpleOptions[\"onPayload\"];\n\n\t\tprivate runningPrompt?: Promise<void>;\n\t\tprivate resolveRunningPrompt?: () => void;\n\t\tprivate _thinkingBudgets?: Stream.ThinkingBudgets;\n\t\tprivate _transport: Stream.Transport;\n\t\tprivate _maxRetryDelayMs?: number;\n\t\tprivate _toolExecution: Loop.ToolExecutionMode;\n\n\t\tprivate _beforeToolExecution?: (\n\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Loop.BeforeToolCallResult | undefined>;\n\t\tprivate _afterToolExecution?: (\n\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\tsignal?: AbortSignal,\n\t\t) => Promise<Agent.ToolTerminalResult<unknown> | undefined>;\n\n\t\tconstructor(name: string, model: Model.Info, opts: AgentOptions = {}) {\n\t\t\tthis._state = {\n\t\t\t\tsystemPrompt: \"\",\n\t\t\t\tthinkingLevel: \"off\",\n\t\t\t\ttools: [],\n\t\t\t\tmessages: [],\n\t\t\t\tisStreaming: false,\n\t\t\t\tstreamMessage: null,\n\t\t\t\tpendingToolCalls: new Set<string>(),\n\t\t\t\terror: undefined,\n\t\t\t\t...opts.initialState,\n\t\t\t\tname,\n\t\t\t\tmodel,\n\t\t\t};\n\t\t\t/**\n\t\t\t * Transformation logic to prepare messages for the LLM.\n\t\t\t * * @remarks\n\t\t\t * Currently just forwards messages as-is. Modify this logic when\n\t\t\t * specific formatting or filtering is required.\n\t\t\t * A good example is using user message parts with custom content\n\t\t\t * * @default\n\t\t\t * forwards messages as is.\n\t\t\t */\n\t\t\tthis.convertToLlm = opts.convertToLlm || ((messages: Message.Message[]) => messages);\n\t\t\tthis.transformContext = opts.transformContext;\n\n\t\t\tthis.steeringMode = opts.steeringMode || \"one-at-a-time\";\n\t\t\tthis.followUpMode = opts.followUpMode || \"one-at-a-time\";\n\n\t\t\tthis.streamFn = opts.streamFn || Stream.streamSimple;\n\t\t\tthis._sessionId = opts.sessionId;\n\n\t\t\tthis.getApiKey = opts.getApiKey;\n\t\t\tthis._onPayload = opts.onPayload;\n\n\t\t\tthis._thinkingBudgets = opts.thinkingBudgets;\n\t\t\tthis._transport = opts.transport ?? \"sse\";\n\t\t\tthis._maxRetryDelayMs = opts.maxRetryDelayMs;\n\n\t\t\tthis._toolExecution = opts.toolExecution ?? \"parallel\";\n\t\t\tthis._beforeToolExecution = opts.beforeToolExecution;\n\t\t\tthis._afterToolExecution = opts.afterToolExecution;\n\t\t}\n\n\t\t/**\n\t\t * Get the current session ID used for provider caching.\n\t\t */\n\t\tget sessionId(): string | undefined {\n\t\t\treturn this._sessionId;\n\t\t}\n\n\t\t/**\n\t\t * Set the session ID for provider caching.\n\t\t * Call this when switching sessions (new session, branch, resume, etc).\n\t\t */\n\t\tset sessionId(value: string | undefined) {\n\t\t\tthis._sessionId = value;\n\t\t}\n\t\t/**\n\t\t * Get the current thinking budgets.\n\t\t */\n\t\tget thinkingBudgets(): Stream.ThinkingBudgets | undefined {\n\t\t\treturn this._thinkingBudgets;\n\t\t}\n\t\t/**\n\t\t * Set custom thinking budgets for token-based providers.\n\t\t */\n\t\tset thinkingBudgets(value: Stream.ThinkingBudgets | undefined) {\n\t\t\tthis._thinkingBudgets = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the current preferred transport.\n\t\t */\n\t\tget transport(): Stream.Transport {\n\t\t\treturn this._transport;\n\t\t}\n\t\t/**\n\t\t * Set the preferred transport.\n\t\t */\n\t\tsetTransport(value: Stream.Transport) {\n\t\t\tthis._transport = value;\n\t\t}\n\n\t\t/**\n\t\t * Get the current max retry delay in milliseconds.\n\t\t */\n\t\tget maxRetryDelayMs(): number | undefined {\n\t\t\treturn this._maxRetryDelayMs;\n\t\t}\n\n\t\t/**\n\t\t * Set the maximum delay to wait for server-requested retries.\n\t\t * Set to 0 to disable the cap.\n\t\t */\n\t\tset maxRetryDelayMs(value: number | undefined) {\n\t\t\tthis._maxRetryDelayMs = value;\n\t\t}\n\n\t\tget toolExecution(): Loop.ToolExecutionMode {\n\t\t\treturn this._toolExecution;\n\t\t}\n\n\t\tsetToolExecution(value: Loop.ToolExecutionMode) {\n\t\t\tthis._toolExecution = value;\n\t\t}\n\n\t\tsetBeforeToolExecution(\n\t\t\tvalue:\n\t\t\t\t| ((\n\t\t\t\t\t\tcontext: Loop.BeforeToolExecutionContext,\n\t\t\t\t\t\tsignal?: AbortSignal,\n\t\t\t\t ) => Promise<Loop.BeforeToolCallResult | undefined>)\n\t\t\t\t| undefined,\n\t\t) {\n\t\t\tthis._beforeToolExecution = value;\n\t\t}\n\n\t\tsetAfterToolExecution(\n\t\t\tvalue:\n\t\t\t\t| ((\n\t\t\t\t\t\tcontext: Loop.AfterToolExecutionContext,\n\t\t\t\t\t\tsignal?: AbortSignal,\n\t\t\t\t ) => Promise<Agent.ToolTerminalResult<unknown> | undefined>)\n\t\t\t\t| undefined,\n\t\t) {\n\t\t\tthis._afterToolExecution = value;\n\t\t}\n\n\t\tget state(): State {\n\t\t\treturn this._state;\n\t\t}\n\n\t\tsubscribe(fn: (e: Event.AgentEvent) => void): () => void {\n\t\t\tthis.listeners.add(fn);\n\t\t\treturn () => this.listeners.delete(fn);\n\t\t}\n\n\t\t// State mutators\n\t\tsetSystemPrompt(v: string) {\n\t\t\tthis._state.systemPrompt = v;\n\t\t}\n\t\tsetModel(m: Model.Info) {\n\t\t\tthis._state.model = m;\n\t\t}\n\t\tsetThinkingLevel(l: Stream.ThinkingLevel) {\n\t\t\tthis._state.thinkingLevel = l;\n\t\t}\n\t\tsetSteeringMode(mode: \"all\" | \"one-at-a-time\") {\n\t\t\tthis.steeringMode = mode;\n\t\t}\n\n\t\tgetSteeringMode(): \"all\" | \"one-at-a-time\" {\n\t\t\treturn this.steeringMode;\n\t\t}\n\n\t\tsetFollowUpMode(mode: \"all\" | \"one-at-a-time\") {\n\t\t\tthis.followUpMode = mode;\n\t\t}\n\n\t\tgetFollowUpMode(): \"all\" | \"one-at-a-time\" {\n\t\t\treturn this.followUpMode;\n\t\t}\n\n\t\tsetTools(t: AgentTool<any>[]) {\n\t\t\tthis._state.tools = t;\n\t\t}\n\n\t\treplaceMessages(ms: Message.Message[]) {\n\t\t\tthis._state.messages = ms.slice();\n\t\t}\n\n\t\tappendMessage(m: Message.Message) {\n\t\t\tthis._state.messages = [...this._state.messages, m];\n\t\t}\n\n\t\tprivate findMessageIndexById(messageId: string): number {\n\t\t\treturn this._state.messages.findIndex((message) => message.messageId === messageId);\n\t\t}\n\n\t\tprivate replaceMessageById(message: Message.Message): boolean {\n\t\t\tconst messageIndex = this.findMessageIndexById(message.messageId);\n\t\t\tif (messageIndex === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst messages = this._state.messages.slice();\n\t\t\tmessages[messageIndex] = message;\n\t\t\tthis._state.messages = messages;\n\t\t\treturn true;\n\t\t}\n\n\t\tprivate upsertMessage(message: Message.Message): void {\n\t\t\tif (this.replaceMessageById(message)) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tthis.appendMessage(message);\n\t\t}\n\n\t\tprivate patchStoredAssistantPart(\n\t\t\tmessageId: string,\n\t\t\tpartIndex: number,\n\t\t\tpart: Message.AssistantMessage[\"parts\"][number],\n\t\t): boolean {\n\t\t\tconst messageIndex = this.findMessageIndexById(messageId);\n\t\t\tif (messageIndex === -1) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst messages = this._state.messages.slice();\n\t\t\tconst existing = messages[messageIndex];\n\t\t\tif (!existing || existing.role !== \"assistant\") {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tconst nextParts = existing.parts.slice();\n\t\t\tnextParts[partIndex] = part;\n\t\t\tmessages[messageIndex] = {\n\t\t\t\t...existing,\n\t\t\t\tparts: nextParts,\n\t\t\t};\n\t\t\tthis._state.messages = messages;\n\t\t\treturn true;\n\t\t}\n\n\t\t/**\n\t\t * Queue a steering message while the agent is running.\n\t\t * Delivered after the current assistant turn finishes executing its tool calls,\n\t\t * before the next LLM call.\n\t\t */\n\t\tsteer(m: Message.UserMessage) {\n\t\t\tthis.steeringQueue.push(m);\n\t\t}\n\n\t\t/**\n\t\t * Queue a follow-up message to be processed after the agent finishes.\n\t\t * Delivered only when agent has no more tool calls or steering messages.\n\t\t */\n\t\tfollowUp(m: Message.UserMessage) {\n\t\t\tthis.followUpQueue.push(m);\n\t\t}\n\n\t\tclearSteeringQueue() {\n\t\t\tthis.steeringQueue = [];\n\t\t}\n\n\t\tclearFollowUpQueue() {\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\tclearAllQueues() {\n\t\t\tthis.steeringQueue = [];\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\thasQueuedMessages(): boolean {\n\t\t\treturn this.steeringQueue.length > 0 || this.followUpQueue.length > 0;\n\t\t}\n\n\t\tprivate dequeueSteeringMessages(): Message.UserMessage[] {\n\t\t\tif (this.steeringMode === \"one-at-a-time\") {\n\t\t\t\tif (this.steeringQueue.length > 0) {\n\t\t\t\t\tconst first = this.steeringQueue[0]!;\n\t\t\t\t\tthis.steeringQueue = this.steeringQueue.slice(1);\n\t\t\t\t\treturn [first];\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst steering = this.steeringQueue.slice();\n\t\t\tthis.steeringQueue = [];\n\t\t\treturn steering;\n\t\t}\n\n\t\tprivate dequeueFollowUpMessages(): Message.UserMessage[] {\n\t\t\tif (this.followUpMode === \"one-at-a-time\") {\n\t\t\t\tif (this.followUpQueue.length > 0) {\n\t\t\t\t\tconst first = this.followUpQueue[0]!;\n\t\t\t\t\tthis.followUpQueue = this.followUpQueue.slice(1);\n\t\t\t\t\treturn [first];\n\t\t\t\t}\n\t\t\t\treturn [];\n\t\t\t}\n\n\t\t\tconst followUp = this.followUpQueue.slice();\n\t\t\tthis.followUpQueue = [];\n\t\t\treturn followUp;\n\t\t}\n\n\t\tclearMessages() {\n\t\t\tthis._state.messages = [];\n\t\t}\n\n\t\tabort() {\n\t\t\tthis.abortController?.abort();\n\t\t}\n\n\t\twaitForIdle(): Promise<void> {\n\t\t\treturn this.runningPrompt ?? Promise.resolve();\n\t\t}\n\n\t\treset() {\n\t\t\tthis._state.messages = [];\n\t\t\tthis._state.isStreaming = false;\n\t\t\tthis._state.streamMessage = null;\n\t\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\t\tthis._state.error = undefined;\n\t\t\tthis.steeringQueue = [];\n\t\t\tthis.followUpQueue = [];\n\t\t}\n\n\t\tgetName(): string {\n\t\t\treturn this._state.name;\n\t\t}\n\n\t\tprivate ensureIdle() {\n\t\t\tif (this._state.isStreaming) {\n\t\t\t\tthrow new AgentInStreamingErr({\n\t\t\t\t\tmessage:\n\t\t\t\t\t\t\"agent is already processing a prompt. Use steer() or followup() to queue messages, or wait for completion.\",\n\t\t\t\t\tname: this._state.name,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tprivate async _runLoop(messages?: Message.UserMessage[], opts?: { skipInitialSteeringPoll?: boolean }) {\n\t\t\tconst model = this._state.model;\n\t\t\tif (!model)\n\t\t\t\tthrow new ModelNotConfiguredErr({\n\t\t\t\t\tmessage: \"no model configured yet\",\n\t\t\t\t});\n\n\t\t\tthis.runningPrompt = new Promise<void>((resolve) => {\n\t\t\t\tthis.resolveRunningPrompt = resolve;\n\t\t\t});\n\n\t\t\tthis.abortController = new AbortController();\n\t\t\tthis._state.isStreaming = true;\n\t\t\tthis._state.streamMessage = null;\n\t\t\tthis._state.error = undefined;\n\n\t\t\tconst reasoning = this.state.thinkingLevel === \"off\" ? undefined : this._state.thinkingLevel;\n\n\t\t\tconst context: Agent.AgentContext = {\n\t\t\t\tsystemPrompt: this._state.systemPrompt,\n\t\t\t\tmessages: this._state.messages.slice(),\n\t\t\t\ttools: this._state.tools,\n\t\t\t};\n\n\t\t\tlet skipInitialSteeringPoll = opts?.skipInitialSteeringPoll === true;\n\n\t\t\tconst config: Loop.Config = {\n\t\t\t\tmodel,\n\t\t\t\treasoning,\n\t\t\t\tsessionId: this._sessionId,\n\t\t\t\tonPayload: this._onPayload,\n\t\t\t\ttransport: this._transport,\n\t\t\t\tthinkingBudgets: this._thinkingBudgets,\n\t\t\t\tmaxRetryDelayMs: this._maxRetryDelayMs,\n\t\t\t\ttoolExecution: this._toolExecution,\n\t\t\t\tbeforeToolExecution: this._beforeToolExecution,\n\t\t\t\tafterToolExecution: this._afterToolExecution,\n\t\t\t\tconvertToLlm: this.convertToLlm,\n\t\t\t\ttransformContext: this.transformContext,\n\t\t\t\tgetApiKey: this.getApiKey,\n\t\t\t\tgetSteeringMessages: async () => {\n\t\t\t\t\tif (skipInitialSteeringPoll) {\n\t\t\t\t\t\tskipInitialSteeringPoll = false;\n\t\t\t\t\t\treturn [];\n\t\t\t\t\t}\n\t\t\t\t\treturn this.dequeueSteeringMessages();\n\t\t\t\t},\n\t\t\t\tgetFollowUpMessages: async () => this.dequeueFollowUpMessages(),\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tif (messages) {\n\t\t\t\t\tawait Loop.runAgentLoop(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tmessages,\n\t\t\t\t\t\tasync (e) => this._processLoopEvent(e),\n\t\t\t\t\t\tthis.streamFn,\n\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tawait Loop.runAgentLoopContinue(\n\t\t\t\t\t\tconfig,\n\t\t\t\t\t\tcontext,\n\t\t\t\t\t\tasync (e) => this._processLoopEvent(e),\n\t\t\t\t\t\tthis.streamFn,\n\t\t\t\t\t\tthis.abortController.signal,\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} catch (err: any) {\n\t\t\t\tconst message = Message.createAssistantMessage({\n\t\t\t\t\trole: \"assistant\",\n\t\t\t\t\tprotocol: model.protocol,\n\t\t\t\t\tprovider: model.provider,\n\t\t\t\t\tmodel: model.id,\n\t\t\t\t\tusage: {\n\t\t\t\t\t\tinput: 0,\n\t\t\t\t\t\toutput: 0,\n\t\t\t\t\t\tcacheRead: 0,\n\t\t\t\t\t\tcacheWrite: 0,\n\t\t\t\t\t\ttotalTokens: 0,\n\t\t\t\t\t\tcost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n\t\t\t\t\t},\n\t\t\t\t\tstopReason: this.abortController.signal.aborted ? \"aborted\" : \"error\",\n\t\t\t\t\terrorMessage: err?.message || String(err),\n\t\t\t\t\ttime: {\n\t\t\t\t\t\tcreated: Date.now(),\n\t\t\t\t\t\tcompleted: Date.now(),\n\t\t\t\t\t},\n\t\t\t\t\tparts: [],\n\t\t\t\t});\n\n\t\t\t\tthis.appendMessage(message);\n\t\t\t\tthis._state.error = err?.message || String(err);\n\t\t\t\tthis.emit({ type: \"agent.end\", messages: [message] });\n\t\t\t} finally {\n\t\t\t\tthis._state.isStreaming = false;\n\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\tthis._state.pendingToolCalls = new Set<string>();\n\t\t\t\tthis.abortController = undefined;\n\t\t\t\tthis.resolveRunningPrompt?.();\n\t\t\t\tthis.runningPrompt = undefined;\n\t\t\t\tthis.resolveRunningPrompt = undefined;\n\t\t\t}\n\t\t}\n\n\t\tasync loop(messages: Message.UserMessage[]): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tawait this._runLoop(messages);\n\t\t}\n\n\t\tasync loopContinue(): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tawait this._runLoop();\n\t\t}\n\n\t\tasync prompt(messages: Message.TextContent[], images?: Message.ImageContent[]): Promise<void> {\n\t\t\tthis.ensureIdle();\n\t\t\tconst model = this._state.model;\n\t\t\tif (!model)\n\t\t\t\tthrow new ModelNotConfiguredErr({\n\t\t\t\t\tmessage: \"no model configured yet.\",\n\t\t\t\t});\n\n\t\t\tconst message = Message.createUserMessage({\n\t\t\t\trole: \"user\",\n\t\t\t\ttime: {\n\t\t\t\t\tcreated: Date.now(),\n\t\t\t\t},\n\t\t\t\tparts: [...messages, ...(images ?? [])],\n\t\t\t});\n\n\t\t\tawait this.loop([message]);\n\t\t}\n\n\t\tprivate _processLoopEvent(event: Event.AgentEvent): void {\n\t\t\tswitch (event.type) {\n\t\t\t\tcase \"message.start\": {\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"message.part.start\":\n\t\t\t\tcase \"message.part.update\":\n\t\t\t\tcase \"message.part.end\": {\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tif (event.message.role === \"assistant\") {\n\t\t\t\t\t\tthis.patchStoredAssistantPart(event.message.messageId, event.partIndex, event.part);\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"message.update\":\n\t\t\t\t\tthis._state.streamMessage = event.message;\n\t\t\t\t\tthis.replaceMessageById(event.message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"message.end\":\n\t\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\t\tthis.upsertMessage(event.message);\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tool.execution.start\": {\n\t\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\t\tpendingToolCalls.add(event.callID);\n\t\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"tool.execution.end\": {\n\t\t\t\t\tconst pendingToolCalls = new Set(this._state.pendingToolCalls);\n\t\t\t\t\tpendingToolCalls.delete(event.callID);\n\t\t\t\t\tthis._state.pendingToolCalls = pendingToolCalls;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"turn.end\":\n\t\t\t\t\tif (event.message.role === \"assistant\" && event.message.parts.length > 0) {\n\t\t\t\t\t\tthis._state.error = event.message.errorMessage;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"agent.end\":\n\t\t\t\t\tthis._state.isStreaming = false;\n\t\t\t\t\tthis._state.streamMessage = null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tthis.emit(event);\n\t\t}\n\n\t\tprivate emit(e: Event.AgentEvent) {\n\t\t\tfor (const listener of this.listeners) {\n\t\t\t\tlistener(e);\n\t\t\t}\n\t\t}\n\t}\n\n\texport async function create<TProvider extends Provider.KnownProvider, TModel extends Model.Info[\"id\"]>(\n\t\toptions: AgentOptions & {\n\t\t\tprovider: TProvider;\n\t\t\tmodel: TModel;\n\t\t\tname?: string;\n\t\t},\n\t): Promise<Instance>;\n\texport async function create(options: AgentOptions & { model: Model.Info; name?: string }): Promise<Instance>;\n\texport async function create(\n\t\toptions:\n\t\t\t| (AgentOptions & { model: Model.Info; name?: string })\n\t\t\t| (AgentOptions & {\n\t\t\t\t\tprovider: Provider.KnownProvider;\n\t\t\t\t\tmodel: Model.Info[\"id\"];\n\t\t\t\t\tname?: string;\n\t\t\t }),\n\t): Promise<Instance> {\n\t\tlet resolvedModel: Model.Info;\n\t\tif (\"provider\" in options) {\n\t\t\tconst result = await Model.getModel(options.provider, options.model);\n\t\t\tif (!result) {\n\t\t\t\tthrow new ModelNotFoundErr({\n\t\t\t\t\tmessage: \"model not found or not configured yet\",\n\t\t\t\t\tprovider: options.provider,\n\t\t\t\t\tmodel: options.model,\n\t\t\t\t});\n\t\t\t}\n\t\t\tresolvedModel = result;\n\t\t} else {\n\t\t\tresolvedModel = options.model;\n\t\t}\n\n\t\treturn new Instance(options.name ?? \"main\", resolvedModel, options);\n\t}\n}\n","import { NamedError } from \"@codeworksh/utils\";\nimport { type Static, type TSchema, Type, TypeGuard } from \"@sinclair/typebox\";\nimport { transform } from \"esbuild\";\nimport { capitalize } from \"remeda\";\nimport { validateSchema } from \"../../utils/validation\";\nimport { Agent } from \"../agent\";\n\nexport namespace CodeMode {\n\texport const ToolDefinitionErr = NamedError.create(\n\t\t\"ToolDefinitionErr\",\n\t\tType.Object({\n\t\t\tmessage: Type.String(),\n\t\t}),\n\t);\n\n\tconst toolFnPrefix = process.env.CODEWORK_CODEMODE_FN_PREFIX ?? \"external_\";\n\n\texport const SandboxExecutionInputSchema = Type.Object({\n\t\ttypescriptCode: Type.String({\n\t\t\tdescription: \"TypeScript code to execute in the sandbox.\",\n\t\t}),\n\t});\n\texport type SandboxExecutionInput = Static<typeof SandboxExecutionInputSchema>;\n\n\texport const SandboxExecutionOutputSchema = Type.Object({\n\t\tresult: Type.Optional(Type.Unknown()),\n\t\tlogs: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type SandboxExecutionOutput = Static<typeof SandboxExecutionOutputSchema>;\n\n\texport const SandboxExecutionErrorSchema = Type.Object({\n\t\tmessage: Type.String(),\n\t\tname: Type.Optional(Type.String()),\n\t\tstack: Type.Optional(Type.String()),\n\t\tline: Type.Optional(Type.Number()),\n\t\tlogs: Type.Optional(Type.Array(Type.String())),\n\t});\n\texport type SandboxExecutionError = Static<typeof SandboxExecutionErrorSchema>;\n\n\texport interface NormalizedError {\n\t\tmessage: string;\n\t\tname?: string;\n\t\tstack?: string;\n\t\tline?: number;\n\t}\n\n\texport interface ExecutionResult<T = unknown> {\n\t\tsuccess: boolean;\n\t\tvalue?: T;\n\t\tlogs?: string[];\n\t\terror?: NormalizedError;\n\t}\n\n\texport interface Context {\n\t\texecute: <T = unknown>(code: string) => Promise<ExecutionResult<T>>;\n\t\tdispose: () => Promise<void>;\n\t}\n\n\texport interface DriverContextConfig {\n\t\tbindings: Record<string, ToolBinding>;\n\t\ttimeout?: number;\n\t\tmemoryLimit?: number;\n\t\tsignal?: AbortSignal;\n\t}\n\n\texport interface Driver {\n\t\tcreateContext: (config: DriverContextConfig) => Promise<Context>;\n\t}\n\n\texport interface ToolConfig {\n\t\t/**\n\t\t * Driver for sandbox code execution\n\t\t */\n\t\tdriver: Driver;\n\t\t/**\n\t\t * Tools to expose for functions in sandbox\n\t\t */\n\t\ttools: Agent.AnyAgentTool[];\n\t\t/**\n\t\t * Execution timeout in milliseconds (default: 30000)\n\t\t */\n\t\ttimeout?: number;\n\t\t/**\n\t\t * Memory limit in MB for sandbox (default: 128)\n\t\t */\n\t\tmemoryLimit?: number;\n\t\t/**\n\t\t * Tool function prefix.\n\t\t * @default env.CODEWORK_CODEMODE_FN_PREFIX ?? \"external_\"\n\t\t */\n\t\tfnPrefix?: string;\n\t}\n\n\texport interface ToolBinding {\n\t\tname: string;\n\t\tdescription: string;\n\t\tinputSchema: TSchema;\n\t\toutputSchema?: TSchema;\n\t\terrorSchema?: TSchema;\n\t\texecute: (callID: string, params: unknown, signal?: AbortSignal) => Promise<unknown>;\n\t}\n\n\t/**\n\t * Options for type stub generation\n\t */\n\texport interface TypeGeneratorOptions {\n\t\t/**\n\t\t * Include JSDoc comments with descriptions\n\t\t * @default true\n\t\t */\n\t\tincludeDescriptions?: boolean;\n\t}\n\n\tfunction withMessageInStack(message: string, stack: string | undefined): string | undefined {\n\t\tif (!stack) return undefined;\n\t\treturn stack.includes(message) ? stack : `${message}\\n${stack}`;\n\t}\n\n\tfunction normalizeExecutionError(error: unknown): NormalizedError {\n\t\tif (error instanceof Error) {\n\t\t\treturn {\n\t\t\t\tname: error.name,\n\t\t\t\tmessage: error.message,\n\t\t\t\tstack: withMessageInStack(error.message, error.stack),\n\t\t\t\tline: parseErrorLine(error.stack),\n\t\t\t};\n\t\t}\n\n\t\tif (typeof error === \"object\" && error !== null) {\n\t\t\tconst candidate = error as Record<string, unknown>;\n\t\t\treturn {\n\t\t\t\tname: typeof candidate.name === \"string\" ? candidate.name : undefined,\n\t\t\t\tmessage:\n\t\t\t\t\ttypeof candidate.message === \"string\"\n\t\t\t\t\t\t? candidate.message\n\t\t\t\t\t\t: JSON.stringify(candidate) || \"Unknown execution error\",\n\t\t\t\tstack:\n\t\t\t\t\ttypeof candidate.stack === \"string\"\n\t\t\t\t\t\t? withMessageInStack(\n\t\t\t\t\t\t\t\ttypeof candidate.message === \"string\"\n\t\t\t\t\t\t\t\t\t? candidate.message\n\t\t\t\t\t\t\t\t\t: JSON.stringify(candidate) || \"Unknown execution error\",\n\t\t\t\t\t\t\t\tcandidate.stack,\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t: undefined,\n\t\t\t\tline: typeof candidate.line === \"number\" ? candidate.line : parseErrorLine(candidate.stack),\n\t\t\t};\n\t\t}\n\n\t\treturn {\n\t\t\tname: \"Error\",\n\t\t\tmessage: String(error),\n\t\t};\n\t}\n\n\tfunction parseErrorLine(stack: unknown): number | undefined {\n\t\tif (typeof stack !== \"string\") return undefined;\n\t\tconst lineMatch = stack.match(/:(\\d+)(?::\\d+)?\\)?$/m);\n\t\treturn lineMatch ? Number(lineMatch[1]) : undefined;\n\t}\n\n\tfunction serializeForContent(value: unknown): string {\n\t\treturn JSON.stringify(\n\t\t\tvalue,\n\t\t\t(_key, currentValue) => (typeof currentValue === \"bigint\" ? currentValue.toString() : currentValue),\n\t\t\t2,\n\t\t);\n\t}\n\n\tfunction toolContentToText(result: { content: Array<{ type: string; text?: string }> }): string {\n\t\tconst parts = result.content\n\t\t\t.filter((part) => part.type === \"text\" && typeof part.text === \"string\")\n\t\t\t.map((part) => part.text);\n\t\treturn parts.join(\"\\n\").trim();\n\t}\n\n\tfunction unwrapToolResult(tool: Agent.AnyAgentTool, result: Agent.ToolTerminalResult<unknown, unknown>): unknown {\n\t\tif (result.status === \"completed\") {\n\t\t\tif (tool.outputSchema) {\n\t\t\t\treturn validateSchema(tool.outputSchema, result.result.details, `Tool \"${tool.name}\" output`);\n\t\t\t}\n\t\t\treturn result.result.details;\n\t\t}\n\n\t\tif (tool.errorSchema && result.result.details !== undefined) {\n\t\t\tvalidateSchema(tool.errorSchema, result.result.details, `Tool \"${tool.name}\" error`);\n\t\t}\n\n\t\tconst message = toolContentToText(result.result) || `Tool \"${tool.name}\" failed`;\n\t\tconst error = new Error(message);\n\t\tif (result.result.details !== undefined) {\n\t\t\t(error as Error & { cause?: unknown }).cause = result.result.details;\n\t\t}\n\t\tthrow error;\n\t}\n\n\tfunction toolToBinding(tool: Agent.AnyAgentTool, prefix: string = \"\"): ToolBinding {\n\t\tconst inputSchema = TypeGuard.IsSchema(tool.parameters) ? tool.parameters : Type.Object({});\n\t\tconst outputSchema = TypeGuard.IsSchema(tool.outputSchema) ? tool.outputSchema : undefined;\n\t\tconst errorSchema = TypeGuard.IsSchema(tool.errorSchema) ? tool.errorSchema : undefined;\n\n\t\tif (!(\"execute\" in tool) || typeof tool.execute !== \"function\") {\n\t\t\tthrow new ToolDefinitionErr({\n\t\t\t\tmessage: `tool \"${tool.name}\" does not have an execute function. code mode requires tools with implementation`,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tname: `${prefix}${tool.name}`,\n\t\t\tdescription: tool.description,\n\t\t\tinputSchema,\n\t\t\toutputSchema,\n\t\t\terrorSchema,\n\t\t\texecute: async (callID: string, params: unknown, signal?: AbortSignal) => {\n\t\t\t\tconst validatedParams = validateSchema(inputSchema, params, `Tool \"${tool.name}\" input`);\n\t\t\t\tconst terminalResult = await tool.execute(callID, validatedParams, signal);\n\t\t\t\treturn unwrapToolResult(tool, terminalResult);\n\t\t\t},\n\t\t};\n\t}\n\n\tfunction toolsForBinding(tools: Agent.AnyAgentTool[], prefix: string): Record<string, ToolBinding> {\n\t\tconst bindings: Record<string, ToolBinding> = {};\n\n\t\tfor (const tool of tools) {\n\t\t\tconst name = `${prefix}${tool.name}`;\n\t\t\tbindings[name] = toolToBinding(tool, prefix);\n\t\t}\n\n\t\treturn bindings;\n\t}\n\n\tfunction indent(value: string, depth: number = 1): string {\n\t\tconst prefix = \"\\t\".repeat(depth);\n\t\treturn value\n\t\t\t.split(\"\\n\")\n\t\t\t.map((line) => `${prefix}${line}`)\n\t\t\t.join(\"\\n\");\n\t}\n\n\tfunction toPropertyKey(name: string): string {\n\t\treturn /^[$A-Z_a-z][$\\w]*$/i.test(name) ? name : JSON.stringify(name);\n\t}\n\n\tfunction schemaToTypeScript(schema: TSchema): string {\n\t\tif (TypeGuard.IsAny(schema)) return \"any\";\n\t\tif (TypeGuard.IsUnknown(schema)) return \"unknown\";\n\t\tif (TypeGuard.IsString(schema)) return \"string\";\n\t\tif (TypeGuard.IsNumber(schema) || TypeGuard.IsInteger(schema)) return \"number\";\n\t\tif (TypeGuard.IsBoolean(schema)) return \"boolean\";\n\t\tif (TypeGuard.IsNull(schema)) return \"null\";\n\t\tif (TypeGuard.IsUndefined(schema) || TypeGuard.IsVoid(schema)) return \"undefined\";\n\t\tif (TypeGuard.IsLiteral(schema)) return JSON.stringify(schema.const);\n\n\t\tif (TypeGuard.IsArray(schema)) {\n\t\t\treturn `Array<${schemaToTypeScript(schema.items)}>`;\n\t\t}\n\n\t\tif (TypeGuard.IsTuple(schema)) {\n\t\t\tconst items = schema.items ?? [];\n\t\t\treturn `[${items.map((item) => schemaToTypeScript(item)).join(\", \")}]`;\n\t\t}\n\n\t\tif (TypeGuard.IsUnion(schema)) {\n\t\t\treturn schema.anyOf.map((item) => schemaToTypeScript(item)).join(\" | \");\n\t\t}\n\n\t\tif (TypeGuard.IsIntersect(schema)) {\n\t\t\treturn schema.allOf.map((item) => schemaToTypeScript(item)).join(\" & \");\n\t\t}\n\n\t\tif (TypeGuard.IsRecord(schema)) {\n\t\t\tconst valueSchema =\n\t\t\t\tObject.values(schema.patternProperties ?? {}).find(TypeGuard.IsSchema) ??\n\t\t\t\t(schema.additionalProperties && TypeGuard.IsSchema(schema.additionalProperties)\n\t\t\t\t\t? schema.additionalProperties\n\t\t\t\t\t: Type.Unknown());\n\t\t\treturn `Record<string, ${schemaToTypeScript(valueSchema)}>`;\n\t\t}\n\n\t\tif (TypeGuard.IsObject(schema)) {\n\t\t\tconst required = new Set(schema.required ?? []);\n\t\t\tconst properties = Object.entries(schema.properties ?? {}).map(([key, value]) => {\n\t\t\t\tconst optional = required.has(key) ? \"\" : \"?\";\n\t\t\t\treturn `${toPropertyKey(key)}${optional}: ${schemaToTypeScript(value)};`;\n\t\t\t});\n\n\t\t\tif (schema.additionalProperties === true) {\n\t\t\t\tproperties.push(\"[key: string]: unknown;\");\n\t\t\t} else if (schema.additionalProperties && TypeGuard.IsSchema(schema.additionalProperties)) {\n\t\t\t\tproperties.push(`[key: string]: ${schemaToTypeScript(schema.additionalProperties)};`);\n\t\t\t}\n\n\t\t\tif (properties.length === 0) return \"{}\";\n\n\t\t\treturn `{\\n${indent(properties.join(\"\\n\"))}\\n}`;\n\t\t}\n\n\t\treturn \"unknown\";\n\t}\n\n\t/**\n\t * Generate TypeScript type stubs for all tool bindings.\n\t *\n\t * These stubs are included in the LLM system prompt so it knows the exact\n\t * type signatures of available tools.\n\t */\n\texport function generateTypeStubs(\n\t\tbindings: Record<string, ToolBinding>,\n\t\toptions: TypeGeneratorOptions = {},\n\t): string {\n\t\tconst { includeDescriptions = true } = options;\n\t\tconst declarations: string[] = [];\n\n\t\tfor (const [name, binding] of Object.entries(bindings)) {\n\t\t\tconst inputTypeName = `${capitalize(name)}Input`;\n\t\t\tconst outputTypeName = `${capitalize(name)}Output`;\n\n\t\t\tdeclarations.push(`type ${inputTypeName} = ${schemaToTypeScript(binding.inputSchema)};`);\n\n\t\t\tlet outputTypeRef = \"unknown\";\n\t\t\tif (binding.outputSchema !== undefined) {\n\t\t\t\tdeclarations.push(`type ${outputTypeName} = ${schemaToTypeScript(binding.outputSchema)};`);\n\t\t\t\toutputTypeRef = outputTypeName;\n\t\t\t}\n\n\t\t\tconst description = includeDescriptions && binding.description ? `/** ${binding.description} */\\n` : \"\";\n\t\t\tdeclarations.push(\n\t\t\t\t`${description}declare function ${name}(input: ${inputTypeName}): Promise<${outputTypeRef}>;`,\n\t\t\t);\n\t\t}\n\n\t\treturn declarations.join(\"\\n\\n\");\n\t}\n\n\tfunction buildExampleSnippet(): string[] {\n\t\treturn [\n\t\t\t\"```typescript\",\n\t\t\t\"const numbers = [12, 24, 36];\",\n\t\t\t\"const total = numbers.reduce((sum, value) => sum + value, 0);\",\n\t\t\t\"\",\n\t\t\t\"return {\",\n\t\t\t\" count: numbers.length,\",\n\t\t\t\" average: total / numbers.length,\",\n\t\t\t\"};\",\n\t\t\t\"```\",\n\t\t];\n\t}\n\n\texport function generateSystemPrompt(config: ToolConfig): string {\n\t\tconst fnPrefix = config.fnPrefix ?? toolFnPrefix;\n\t\tconst bindings = toolsForBinding(config.tools, fnPrefix);\n\t\tconst typeStubs = generateTypeStubs(bindings);\n\t\tconst functionDocs =\n\t\t\tObject.entries(bindings)\n\t\t\t\t.map(([name, binding]) => `- \\`${name}(input)\\`: ${binding.description}`)\n\t\t\t\t.join(\"\\n\") || \"- No external APIs available for this run.\";\n\n\t\treturn [\n\t\t\t\"## Code Execution Tool\",\n\t\t\t\"\",\n\t\t\t\"You have access to `sandbox_execute_typescript` which runs TypeScript code in a sandboxed environment.\",\n\t\t\t\"\",\n\t\t\t\"### When to Use\",\n\t\t\t\"\",\n\t\t\t\"Use `sandbox_execute_typescript` when you need to:\",\n\t\t\t\"- Process data with loops, conditionals, or complex logic\",\n\t\t\t\"- Make multiple tool calls in parallel with `Promise.all(...)`\",\n\t\t\t\"- Transform, filter, or aggregate data\",\n\t\t\t\"- Perform calculations or data analysis\",\n\t\t\t\"\",\n\t\t\t\"For simple operations, prefer calling tools directly.\",\n\t\t\t\"\",\n\t\t\t\"### Available External APIs\",\n\t\t\t\"\",\n\t\t\t\"Inside your TypeScript code, you can call these async functions:\",\n\t\t\t\"\",\n\t\t\tfunctionDocs,\n\t\t\t\"\",\n\t\t\t\"### Type Definitions\",\n\t\t\t\"\",\n\t\t\t\"```typescript\",\n\t\t\ttypeStubs,\n\t\t\t\"```\",\n\t\t\t\"\",\n\t\t\t\"### Example\",\n\t\t\t\"\",\n\t\t\t...buildExampleSnippet(),\n\t\t\t\"\",\n\t\t\t\"### Important Notes\",\n\t\t\t\"\",\n\t\t\t\"- All\" + `\\`${fnPrefix}\\`*` + \"calls are async, so always use `await`\",\n\t\t\t\"- Return a value to pass results back to you\",\n\t\t\t\"- Use `console.log()` for debugging (logs are captured)\",\n\t\t\t\"- The sandbox is isolated - no network access or file system\",\n\t\t\t\"- Each execution is isolated and does not share state with previous runs\",\n\t\t\t\"\",\n\t\t].join(\"\\n\");\n\t}\n\n\tasync function transpileTypeScript(typescriptCode: string): Promise<string> {\n\t\tconst wrappedSource = [\n\t\t\t\"(async () => {\",\n\t\t\t\"\\tconst __codemodeNormalizeError = (error: unknown) => {\",\n\t\t\t\"\\t\\tif (error instanceof Error) return { name: error.name, message: error.message, stack: error.stack };\",\n\t\t\t\"\\t\\tif (typeof error === 'object' && error !== null) {\",\n\t\t\t\"\\t\\t\\tconst candidate = error as { name?: unknown; message?: unknown; stack?: unknown };\",\n\t\t\t\"\\t\\t\\treturn {\",\n\t\t\t\"\\t\\t\\t\\tname: typeof candidate.name === 'string' ? candidate.name : 'Error',\",\n\t\t\t\"\\t\\t\\t\\tmessage:\",\n\t\t\t\"\\t\\t\\t\\t\\ttypeof candidate.message === 'string'\",\n\t\t\t\"\\t\\t\\t\\t\\t\\t? candidate.message\",\n\t\t\t\"\\t\\t\\t\\t\\t\\t: JSON.stringify(candidate) || 'Unknown execution error',\",\n\t\t\t\"\\t\\t\\t\\tstack: typeof candidate.stack === 'string' ? candidate.stack : undefined,\",\n\t\t\t\"\\t\\t\\t};\",\n\t\t\t\"\\t\\t}\",\n\t\t\t\"\\t\\treturn { name: 'Error', message: String(error) };\",\n\t\t\t\"\\t};\",\n\t\t\t\"\\ttry {\",\n\t\t\ttypescriptCode,\n\t\t\t\"\\t} catch (error) {\",\n\t\t\t\"\\t\\tthrow __codemodeNormalizeError(error);\",\n\t\t\t\"\\t}\",\n\t\t\t\"})()\",\n\t\t].join(\"\\n\");\n\t\tconst transformed = await transform(wrappedSource, {\n\t\t\tloader: \"ts\",\n\t\t\ttarget: \"es2022\",\n\t\t\tsourcefile: \"script.ts\",\n\t\t\tminify: false,\n\t\t\tkeepNames: false,\n\t\t});\n\t\treturn transformed.code;\n\t}\n\n\tfunction buildToolDescription(tools: Agent.AnyAgentTool[], fnPrefix = toolFnPrefix): string {\n\t\tconst externalFunctions = tools.map((tool) => `${fnPrefix}${tool.name}`).join(\"\\n\");\n\n\t\treturn [\n\t\t\t\"Execute TypeScript code in a secure sandbox environment. \",\n\t\t\t\"The code can use these external API functions:\",\n\t\t\t\"<functions>\",\n\t\t\t` ${externalFunctions}`,\n\t\t\t\"</functions>\",\n\t\t\t`All ${fnPrefix}* calls are async and must be awaited. `,\n\t\t\t\"Return a value to pass results back. Use console.log() for debugging.\",\n\t\t].join(\"\\n\");\n\t}\n\n\texport function createCodeModeTool(\n\t\tconfig: ToolConfig,\n\t): Agent.AgentTool<\n\t\ttypeof SandboxExecutionInputSchema,\n\t\ttypeof SandboxExecutionOutputSchema,\n\t\tunknown,\n\t\ttypeof SandboxExecutionErrorSchema\n\t> {\n\t\tif (config.tools.length === 0) {\n\t\t\tthrow new ToolDefinitionErr({ message: \"at least one tool must be provided to `createCodeModeTool`\" });\n\t\t}\n\n\t\tconst tool = Agent.defineTool({\n\t\t\tname: \"sandbox_execute_typescript\",\n\t\t\tlabel: \"Sandbox TypeScript\",\n\t\t\tdescription: buildToolDescription(config.tools, config.fnPrefix),\n\t\t\tparameters: SandboxExecutionInputSchema,\n\t\t\toutputSchema: SandboxExecutionOutputSchema,\n\t\t\terrorSchema: SandboxExecutionErrorSchema,\n\t\t\tasync execute(_callID, params, signal, onUpdate) {\n\t\t\t\tconst bindings = toolsForBinding(config.tools, config.fnPrefix ?? toolFnPrefix);\n\t\t\t\tlet context: Context | undefined;\n\n\t\t\t\ttry {\n\t\t\t\t\tawait onUpdate?.({\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t\tpartial: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Transpiling TypeScript for sandbox execution\" }],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tconst javascriptCode = await transpileTypeScript(params.typescriptCode);\n\n\t\t\t\t\tawait onUpdate?.({\n\t\t\t\t\t\tstatus: \"running\",\n\t\t\t\t\t\tpartial: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: \"Executing code in sandbox runtime\" }],\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\n\t\t\t\t\tcontext = await config.driver.createContext({\n\t\t\t\t\t\tbindings,\n\t\t\t\t\t\ttimeout: config.timeout,\n\t\t\t\t\t\tmemoryLimit: config.memoryLimit,\n\t\t\t\t\t\tsignal,\n\t\t\t\t\t});\n\n\t\t\t\t\tconst executionResult = await context.execute(javascriptCode);\n\t\t\t\t\tif (executionResult.success) {\n\t\t\t\t\t\tconst details: SandboxExecutionOutput = {\n\t\t\t\t\t\t\tresult: executionResult.value,\n\t\t\t\t\t\t\t...(executionResult.logs && executionResult.logs.length > 0 ? { logs: executionResult.logs } : {}),\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\treturn {\n\t\t\t\t\t\t\tstatus: \"completed\",\n\t\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\t\tisError: false,\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t};\n\t\t\t\t\t}\n\n\t\t\t\t\tconst details: SandboxExecutionError = {\n\t\t\t\t\t\tmessage: executionResult.error?.message || \"sandbox execution failed\",\n\t\t\t\t\t\t...(executionResult.error?.name ? { name: executionResult.error.name } : {}),\n\t\t\t\t\t\t...(executionResult.error?.stack ? { stack: executionResult.error.stack } : {}),\n\t\t\t\t\t\t...(executionResult.error?.line != null ? { line: executionResult.error.line } : {}),\n\t\t\t\t\t\t...(executionResult.logs && executionResult.logs.length > 0 ? { logs: executionResult.logs } : {}),\n\t\t\t\t\t};\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} catch (error) {\n\t\t\t\t\tconst normalizedError = normalizeExecutionError(error);\n\t\t\t\t\tconst details: SandboxExecutionError = {\n\t\t\t\t\t\tmessage: normalizedError.message,\n\t\t\t\t\t\t...(normalizedError.name ? { name: normalizedError.name } : {}),\n\t\t\t\t\t\t...(normalizedError.stack ? { stack: normalizedError.stack } : {}),\n\t\t\t\t\t\t...(normalizedError.line != null ? { line: normalizedError.line } : {}),\n\t\t\t\t\t};\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tstatus: \"error\",\n\t\t\t\t\t\tresult: {\n\t\t\t\t\t\t\tcontent: [{ type: \"text\", text: serializeForContent(details) }],\n\t\t\t\t\t\t\tdetails,\n\t\t\t\t\t\t\tisError: true,\n\t\t\t\t\t\t},\n\t\t\t\t\t};\n\t\t\t\t} finally {\n\t\t\t\t\tawait context?.dispose();\n\t\t\t\t}\n\t\t\t},\n\t\t});\n\t\treturn tool;\n\t}\n\n\texport async function create(config: ToolConfig) {\n\t\treturn {\n\t\t\ttool: createCodeModeTool(config),\n\t\t\tsystemPrompt: generateSystemPrompt(config),\n\t\t};\n\t}\n}\n","import { Model } from \"./model/model\";\nimport type { Provider } from \"./provider/provider\";\n\ntype LLM = {\n\t<TProvider extends Provider.KnownProvider, TModel extends Model.Info[\"id\"]>(\n\t\tprovider: TProvider,\n\t\tmodel: TModel,\n\t\toverrides?: Partial<Model.Info>,\n\t): Promise<Model.Info | undefined>;\n\tmodel: typeof Model.getModel;\n\tmodels: typeof Model.getModels;\n\tproviders: typeof Model.getProviders;\n\tregistry: typeof Model.registry;\n\tsupportsXhigh: typeof Model.supportsXhigh;\n\tmodelsAreEqual: typeof Model.modelsAreEqual;\n};\n\nconst llmImpl = async <TProvider extends Provider.KnownProvider, TModel extends Model.Info[\"id\"]>(\n\tprovider: TProvider,\n\tmodel: TModel,\n\toverrides?: Partial<Model.Info>,\n): Promise<Model.Info | undefined> => Model.getModel(provider, model, overrides);\n\nexport const llm = Object.assign(llmImpl, {\n\tmodel: Model.getModel,\n\tmodels: Model.getModels,\n\tproviders: Model.getProviders,\n\tregistry: Model.registry,\n\tsupportsXhigh: Model.supportsXhigh,\n\tmodelsAreEqual: Model.modelsAreEqual,\n}) as LLM;\n","import \"./provider/register\";\n\nimport type { Message } from \"./message/message\";\nimport type { Model } from \"./model/model\";\nimport { Stream } from \"./provider/stream\";\nimport type { AssistantMessageEventStream } from \"./utils/eventstream\";\n\n/**\n * Stream assistant responses for a model and context.\n *\n * Example:\n *\n * ```ts\n * const s = stream(model, context, {\n * apiKey: process.env.ANTHROPIC_API_KEY,\n * });\n *\n * for await (const event of s) {\n * if (event.type === \"text.delta\") {\n * process.stdout.write(event.delta);\n * }\n * }\n *\n * const message = await s.result();\n * ```\n *\n * This export also includes convenience helpers:\n *\n * ```ts\n * const message = await stream.complete(model, context, options);\n * const simple = stream.simple(model, context, options);\n * const simpleMessage = await stream.completeSimple(model, context, options);\n * ```\n */\ntype StreamCallable = {\n\t(model: Model.Info, context: Message.Context, options?: Stream.Options): AssistantMessageEventStream;\n\tcomplete: typeof Stream.complete;\n\tsimple: typeof Stream.streamSimple;\n\tcompleteSimple: typeof Stream.completeSimple;\n\tresolveProtocolProvider: typeof Stream.resolveProtocolProvider;\n};\n\nconst streamImpl = (\n\tmodel: Model.Info,\n\tcontext: Message.Context,\n\toptions?: Stream.Options,\n): AssistantMessageEventStream => Stream.stream(model, context, options);\n\n/**\n * Start a streaming assistant response for a model/context pair.\n *\n * This is the main streaming entrypoint.\n * Attached helpers:\n *\n * - `stream.complete(...)` resolves the final assistant message without manually iterating events.\n * - `stream.simple(...)` uses `Stream.SimpleOptions` for higher-level reasoning controls.\n * - `stream.completeSimple(...)` is the non-streaming counterpart to `stream.simple(...)`.\n * - `stream.resolveProtocolProvider(...)` exposes protocol resolution for advanced integrations.\n */\nexport const stream = Object.assign(streamImpl, {\n\tcomplete: Stream.complete,\n\tsimple: Stream.streamSimple,\n\tcompleteSimple: Stream.completeSimple,\n\tresolveProtocolProvider: Stream.resolveProtocolProvider,\n}) as StreamCallable;\n\n/** Resolve a streamed response directly to the final assistant message. */\nexport const complete = Stream.complete;\n/** Start a stream using the simplified options surface. */\nexport const streamSimple = Stream.streamSimple;\n/** Resolve a simplified stream request directly to the final assistant message. */\nexport const completeSimple = Stream.completeSimple;\n"],"mappings":"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"}