@theokit/sdk 5.3.3 → 5.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (87) hide show
  1. package/CHANGELOG.md +101 -0
  2. package/dist/{agent-CTbU0O1R.d.ts → agent-CjMVbhhY.d.ts} +95 -2
  3. package/dist/{agent-QLwxhXY3.d.cts → agent-DyB_lzrx.d.cts} +95 -2
  4. package/dist/{agent-PNYJ5S2Y.js → agent-G3T7Q3SQ.js} +8 -8
  5. package/dist/{agent-PNYJ5S2Y.js.map → agent-G3T7Q3SQ.js.map} +1 -1
  6. package/dist/{agent-KJLAWKZB.cjs → agent-YWSIHHFM.cjs} +9 -9
  7. package/dist/{agent-KJLAWKZB.cjs.map → agent-YWSIHHFM.cjs.map} +1 -1
  8. package/dist/{chunk-AWINL3ZC.js → chunk-2QKV4CGK.js} +3 -3
  9. package/dist/{chunk-AWINL3ZC.js.map → chunk-2QKV4CGK.js.map} +1 -1
  10. package/dist/{chunk-L4XENLQO.cjs → chunk-2ZLQZHZC.cjs} +4 -4
  11. package/dist/{chunk-L4XENLQO.cjs.map → chunk-2ZLQZHZC.cjs.map} +1 -1
  12. package/dist/{chunk-DWB3CN46.cjs → chunk-43YXGD3P.cjs} +14 -4
  13. package/dist/chunk-43YXGD3P.cjs.map +1 -0
  14. package/dist/{chunk-IQBDR5YZ.cjs → chunk-AYA65JA5.cjs} +5 -5
  15. package/dist/{chunk-IQBDR5YZ.cjs.map → chunk-AYA65JA5.cjs.map} +1 -1
  16. package/dist/{chunk-2HPNT6HH.cjs → chunk-C4ZQPWXJ.cjs} +9 -9
  17. package/dist/chunk-C4ZQPWXJ.cjs.map +1 -0
  18. package/dist/{chunk-Y2KYR2ED.cjs → chunk-DZG77WU7.cjs} +3 -3
  19. package/dist/{chunk-Y2KYR2ED.cjs.map → chunk-DZG77WU7.cjs.map} +1 -1
  20. package/dist/{chunk-K3NH62DG.js → chunk-KZSKIUXZ.js} +7 -7
  21. package/dist/chunk-KZSKIUXZ.js.map +1 -0
  22. package/dist/{chunk-ZITYGJOD.js → chunk-M3ZGRGOG.js} +3 -3
  23. package/dist/{chunk-ZITYGJOD.js.map → chunk-M3ZGRGOG.js.map} +1 -1
  24. package/dist/{chunk-RP3VXJMA.js → chunk-NSLHPAC7.js} +14 -4
  25. package/dist/chunk-NSLHPAC7.js.map +1 -0
  26. package/dist/{chunk-DLFWMJE3.js → chunk-O7L7M42F.js} +3 -3
  27. package/dist/{chunk-DLFWMJE3.js.map → chunk-O7L7M42F.js.map} +1 -1
  28. package/dist/{chunk-363RBGIR.js → chunk-ODBID5TG.js} +63 -27
  29. package/dist/chunk-ODBID5TG.js.map +1 -0
  30. package/dist/{chunk-7L3MIW2F.js → chunk-S6B5XYC3.js} +4 -4
  31. package/dist/chunk-S6B5XYC3.js.map +1 -0
  32. package/dist/{chunk-Y46VI73J.cjs → chunk-UKJJRU7C.cjs} +132 -96
  33. package/dist/chunk-UKJJRU7C.cjs.map +1 -0
  34. package/dist/{chunk-65UMH5V3.cjs → chunk-VY6NKMOA.cjs} +6 -6
  35. package/dist/chunk-VY6NKMOA.cjs.map +1 -0
  36. package/dist/{compact-session-BHTPCIHA.cjs → compact-session-7FMYJXQ7.cjs} +11 -11
  37. package/dist/{compact-session-BHTPCIHA.cjs.map → compact-session-7FMYJXQ7.cjs.map} +1 -1
  38. package/dist/{compact-session-W4WLJTHA.js → compact-session-YSEK7NQF.js} +3 -3
  39. package/dist/{compact-session-W4WLJTHA.js.map → compact-session-YSEK7NQF.js.map} +1 -1
  40. package/dist/context-3HPU754C.js +6 -0
  41. package/dist/{context-BUIE52VH.js.map → context-3HPU754C.js.map} +1 -1
  42. package/dist/{context-FCCJQ3FN.cjs → context-JTGSBJT6.cjs} +7 -7
  43. package/dist/{context-FCCJQ3FN.cjs.map → context-JTGSBJT6.cjs.map} +1 -1
  44. package/dist/{cron-Dz8AOpy3.d.cts → cron-Bgivg88c.d.cts} +1 -1
  45. package/dist/{cron-Cl8FrK3D.d.ts → cron-CNUa7PDo.d.ts} +1 -1
  46. package/dist/cron.cjs +8 -8
  47. package/dist/cron.d.cts +2 -2
  48. package/dist/cron.d.ts +2 -2
  49. package/dist/cron.js +7 -7
  50. package/dist/eval.cjs +7 -7
  51. package/dist/eval.js +6 -6
  52. package/dist/index.cjs +30 -30
  53. package/dist/index.d.cts +3 -3
  54. package/dist/index.d.ts +3 -3
  55. package/dist/index.js +9 -9
  56. package/dist/{inject-session-SUM6TDJF.js → inject-session-J4LBWAPH.js} +3 -3
  57. package/dist/{inject-session-SUM6TDJF.js.map → inject-session-J4LBWAPH.js.map} +1 -1
  58. package/dist/{inject-session-W6A46J3E.cjs → inject-session-PC73TMP2.cjs} +4 -4
  59. package/dist/{inject-session-W6A46J3E.cjs.map → inject-session-PC73TMP2.cjs.map} +1 -1
  60. package/dist/internal/llm/tool-result-content.d.ts +1 -1
  61. package/dist/internal/persistence/index.cjs +4 -4
  62. package/dist/internal/persistence/index.js +1 -1
  63. package/dist/internal/runtime/hooks/hooks-executor.d.ts +35 -1
  64. package/dist/internal/runtime/hooks/hooks-source.d.ts +10 -0
  65. package/dist/subagents-loader-AIVDQ2D5.js +7 -0
  66. package/dist/{subagents-loader-PAZVOZHI.js.map → subagents-loader-AIVDQ2D5.js.map} +1 -1
  67. package/dist/subagents-loader-DN4LETGL.cjs +16 -0
  68. package/dist/{subagents-loader-7G76XOZU.cjs.map → subagents-loader-DN4LETGL.cjs.map} +1 -1
  69. package/dist/subagents-loader.cjs +3 -3
  70. package/dist/subagents-loader.d.cts +1 -1
  71. package/dist/subagents-loader.d.ts +1 -1
  72. package/dist/subagents-loader.js +2 -2
  73. package/dist/types/agent.d.ts +25 -2
  74. package/dist/types/hooks.d.ts +70 -0
  75. package/docs/error-codes.md +4 -4
  76. package/package.json +1 -1
  77. package/dist/chunk-2HPNT6HH.cjs.map +0 -1
  78. package/dist/chunk-363RBGIR.js.map +0 -1
  79. package/dist/chunk-65UMH5V3.cjs.map +0 -1
  80. package/dist/chunk-7L3MIW2F.js.map +0 -1
  81. package/dist/chunk-DWB3CN46.cjs.map +0 -1
  82. package/dist/chunk-K3NH62DG.js.map +0 -1
  83. package/dist/chunk-RP3VXJMA.js.map +0 -1
  84. package/dist/chunk-Y46VI73J.cjs.map +0 -1
  85. package/dist/context-BUIE52VH.js +0 -6
  86. package/dist/subagents-loader-7G76XOZU.cjs +0 -16
  87. package/dist/subagents-loader-PAZVOZHI.js +0 -7
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/internal/providers/discovery.ts","../src/internal/error-mappers/anthropic.ts","../src/internal/llm/finish.ts","../src/internal/llm/tool-result-content.ts","../src/internal/llm/anthropic-shared.ts","../src/internal/llm/sse.ts","../src/internal/llm/transport-error.ts","../src/internal/llm/anthropic.ts","../src/internal/error-mappers/bedrock.ts","../src/internal/llm/bedrock-token-cache.ts","../src/internal/llm/bedrock-anthropic.ts","../src/internal/llm/fault-injection.ts","../src/internal/error-mappers/ollama.ts","../src/internal/llm/ollama-native.ts","../src/internal/base-url.ts","../src/internal/http.ts","../src/internal/llm/hermes-tool-extract.ts","../src/internal/llm/openai-messages.ts","../src/internal/llm/openai.ts","../src/internal/retry/circuit-breaker.ts","../src/internal/llm/abort-error.ts","../src/internal/llm/stream-relay.ts","../src/internal/llm/pool-aware-client.ts","../src/internal/llm/responses.ts","../src/internal/llm/retrying-client.ts","../src/internal/error-mappers/vertex.ts","../src/internal/llm/vertex-auth.ts","../src/internal/llm/vertex-anthropic.ts","../src/internal/llm/vertex-gemini.ts","../src/internal/llm/vertex-router.ts","../src/internal/llm/router.ts","../src/internal/auth/api-key-validator.ts","../src/internal/providers/register-plugin-providers.ts","../src/internal/auth/credential-availability.ts","../src/internal/runtime/fixtures/fixture-mode.ts","../src/internal/local-agent/real-local-run-provider.ts","../src/internal/runtime/compression/compression-model-registry.ts","../src/internal/runtime/compression/compression-summarizer.ts","../src/internal/session/compact-session.ts"],"names":["globalSingleton","join","homedir","existsSync","readFileSync","diag","readdir","pathToFileURL","registerProvider","buildErrorMetadata","AuthenticationError","RateLimitError","ConfigurationError","NetworkError","UnknownAgentError","httpStatusToErrorCode","tryJson","isPlainObject","TheokitAgentError","body","parseErrorBody","createRequire","inferRegionFromModelId","stripBedrockPrefix","resolveBedrockBaseUrl","mapOpenAICompatibleError","IntegrationNotConnectedError","sanitizeToolInput","flush","joinTextParts","buildClient","CredentialPoolExhaustedError","computeBackoffMs","sleepWithAbort","isTransientError","resolveVertexBaseUrl","stripVertexPrefix","inferModelDialect","inner","registerBuiltins","getProviderProfile","currentCredentialPool","newPooledCredential","CredentialPool","apiKey","readStoredOAuth","providerFromApiKeyPrefix","parseModelId","reconstructMessages","estimateTokens","SessionTranscript","invalidateSessionCache"],"mappings":"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","file":"chunk-2HPNT6HH.cjs","sourcesContent":["/**\n * Lazy provider discovery (T3.4, ADR D107).\n *\n * Scans `~/.theokit/plugins/model-providers/<name>/index.{js,mjs}` and\n * imports each as a Plugin. Plugins with `kind: \"model-provider\"` register\n * their profile. Errors per plugin are logged + skipped. Idempotent per\n * process.\n *\n * EC-9: dynamic `import()` in Node 22 needs `file://` URL for absolute\n * paths in ESM contexts. `pathToFileURL` handles both.\n *\n * @internal\n */\n\nimport { existsSync, readFileSync } from \"node:fs\";\nimport { readdir } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { pathToFileURL } from \"node:url\";\nimport { diag } from \"../diagnostics.js\";\nimport { globalSingleton } from \"../global-singleton.js\";\nimport { registerProvider } from \"./registry.js\";\n\n// M47 review F3 — the idempotence flag lives on `globalThis` via `Symbol.for`, mirroring registry.ts's\n// M44 B1 pattern: tsup bundles each entry (`dist/index.js`, `dist/cron.js`, …) with its OWN module copy,\n// so a module-local `let discovered` would re-run discovery once per entry (duplicate I/O + spurious\n// \"Provider overridden\" WARNs). Every bundle copy shares THIS state.\nconst discoveryState = globalSingleton(\"theokit-sdk.providers.discovered\", () => ({\n done: false,\n}));\n\nfunction pluginsRoot(): string {\n return join(homedir(), \".theokit\", \"plugins\", \"model-providers\");\n}\n\n/** The explicit trust allowlist the human edits (M47). Fail-closed: missing/malformed ⇒ empty. */\nfunction trustFilePath(): string {\n return join(homedir(), \".theokit\", \"plugins\", \"trusted-providers.json\");\n}\n\n/**\n * M47 — the trust gate for the dynamic-import surface. A plugin's `index.{js,mjs}` executes arbitrary code\n * at import time, so NOTHING is imported unless the human explicitly trusted the plugin name: either in\n * `~/.theokit/plugins/trusted-providers.json` (a JSON string array — the auditable primary, mirroring the\n * approved-hooks posture) or the additive `THEOKIT_TRUSTED_PROVIDERS` env (comma-separated convenience).\n * Fail-closed: a missing or malformed trust file trusts NOTHING (a malformed file WARNs).\n */\n// PRE-EXISTING debt, exposed when M75 fixed the Biome config that used to abort before\n// sweeping these files (a nested root under refactor/). It is not new code and was not touched\n// by M75; refactoring SDK internals without review would trade a visible problem for a diff\n// risky. Tracked in usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: see the reason just above\nfunction loadTrustedNames(): Set<string> {\n const trusted = new Set<string>();\n const path = trustFilePath();\n if (existsSync(path)) {\n try {\n const parsed: unknown = JSON.parse(readFileSync(path, \"utf-8\"));\n if (Array.isArray(parsed)) {\n let discarded = 0;\n for (const name of parsed) {\n if (typeof name === \"string\" && name.length > 0) trusted.add(name);\n else discarded += 1;\n }\n // M47 review F5 — fail-closed AND fail-clear: a valid array with wrong-shaped entries\n // (numbers, objects) silently trusting nothing would leave the user with only the generic\n // per-plugin WARN and no clue the FILE shape is wrong.\n if (discarded > 0) {\n diag(\n `[theokit-sdk] WARN: ${path} contains ${discarded} non-string entr${discarded === 1 ? \"y\" : \"ies\"} — discarded (entries must be plugin-name strings)\\n`,\n );\n }\n } else {\n diag(\n `[theokit-sdk] WARN: ${path} is not a JSON array — trusting NO provider plugins (fail-closed)\\n`,\n );\n }\n } catch {\n diag(\n `[theokit-sdk] WARN: ${path} is not valid JSON — trusting NO provider plugins (fail-closed)\\n`,\n );\n }\n }\n for (const name of (process.env.THEOKIT_TRUSTED_PROVIDERS ?? \"\").split(\",\")) {\n const trimmed = name.trim();\n if (trimmed.length > 0) trusted.add(trimmed);\n }\n return trusted;\n}\n\nexport async function discoverProviderPlugins(): Promise<void> {\n if (discoveryState.done) return;\n discoveryState.done = true;\n\n const root = pluginsRoot();\n if (!existsSync(root)) return;\n\n let entries: string[];\n try {\n entries = await readdir(root);\n } catch {\n return;\n }\n\n const trusted = loadTrustedNames();\n for (const entry of entries) {\n // M47 — the gate fires BEFORE any import(): untrusted code is never evaluated (import-time side effects\n // ARE the attack; a post-import check would be theater).\n if (!trusted.has(entry)) {\n // M47 review F4/F7 — the remedy must be complete: discovery is once-per-process (the latch above),\n // so editing the trust file only takes effect after a restart; and the env format is comma-separated.\n diag(\n `[theokit-sdk] WARN: provider plugin \"${entry}\" is present but NOT trusted — skipped. ` +\n `To trust it, add \"${entry}\" to ${trustFilePath()} (JSON array of names) or ` +\n `THEOKIT_TRUSTED_PROVIDERS (comma-separated), then restart the process.\\n`,\n );\n continue;\n }\n await loadOne(join(root, entry), entry);\n }\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 2-extension loader (mjs / js) + plugin shape detection (default / named / direct) — inlining is clearer than 5 helper fns.\nasync function loadOne(dir: string, entryName: string): Promise<void> {\n for (const ext of [\"index.mjs\", \"index.js\"]) {\n const indexPath = join(dir, ext);\n if (!existsSync(indexPath)) continue;\n try {\n const mod = await import(pathToFileURL(indexPath).href);\n const plugin = mod.default ?? mod[entryName] ?? mod;\n if (\n plugin !== null &&\n typeof plugin === \"object\" &&\n (plugin as { kind?: unknown }).kind === \"model-provider\"\n ) {\n const profile = (plugin as { profile?: unknown }).profile;\n if (profile !== undefined && typeof profile === \"object\") {\n registerProvider(profile as Parameters<typeof registerProvider>[0]);\n }\n }\n return;\n } catch (err) {\n const msg = err instanceof Error ? err.message : String(err);\n diag(`[theokit-sdk] failed to load provider plugin \"${entryName}\": ${msg}\\n`);\n return;\n }\n }\n}\n\n/** Test-only reset. @internal */\nexport function _resetDiscovery(): void {\n discoveryState.done = false;\n}\n","/**\n * Anthropic HTTP error mapper (ADR D67).\n *\n * Translates an Anthropic API error response into a typed\n * `TheokitAgentError` subclass with full `ErrorMetadata`. Mapping rules:\n *\n * 401/403 → `AuthenticationError` (`code: \"auth_failed\"`)\n * 429 → `RateLimitError` (`code: \"rate_limit\"`)\n * 400 → `ConfigurationError` (`code: \"context_too_long\"` if body\n * mentions context length, else\n * `\"invalid_request\"`; or\n * `\"content_filtered\"` for policy.)\n * 408 → `NetworkError` (`code: \"timeout\"`)\n * 5xx → `NetworkError` (`code: \"server_error\"` — covers 529\n * overloaded_error common at peak\n * at peak)\n * other → `UnknownAgentError` (`code: \"unknown\"`)\n *\n * Never throws — caller is already in an error path.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n type ErrorCode,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata, httpStatusToErrorCode } from \"./shared.js\";\n\ninterface MapAnthropicErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\nexport function mapAnthropicError(args: MapAnthropicErrorArgs): TheokitAgentError {\n const { status, body, headers, endpoint } = args;\n const code = mapAnthropicStatusToCode(status, body);\n const message = formatMessage(status, code);\n const metadata = buildErrorMetadata({\n provider: \"anthropic\",\n endpoint,\n code,\n status,\n headers,\n body,\n });\n\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, { code: \"anthropic_auth_failed\", metadata });\n }\n if (status === 429) {\n return new RateLimitError(message, { code: \"anthropic_rate_limit\", metadata });\n }\n if (status === 400) {\n return new ConfigurationError(message, {\n code: `anthropic_${code}`,\n metadata,\n });\n }\n if (status === 408) {\n return new NetworkError(message, { code: \"anthropic_timeout\", metadata });\n }\n if (status >= 500 && status < 600) {\n return new NetworkError(message, { code: \"anthropic_server_error\", metadata });\n }\n return new UnknownAgentError(message, { code: \"anthropic_unknown\", metadata });\n}\n\n/**\n * Anthropic's own body dialect first, then the shared RFC 9110 ladder.\n *\n * Only the 400 arm is Anthropic-specific: the vendor expresses \"context too long\"\n * and \"content filtered\" inside the body of a generic bad-request, so reading it\n * is a real per-vendor contract. Everything else — 401/403, 402, 408, 429, 5xx —\n * is HTTP semantics and lives once, in `httpStatusToErrorCode`. It used to be\n * copied here, and the copy could not reach `quota_exceeded` at all.\n */\nfunction mapAnthropicStatusToCode(status: number, body: unknown): ErrorCode {\n if (status === 400) {\n const text = JSON.stringify(body ?? \"\").toLowerCase();\n if (\n text.includes(\"context\") &&\n (text.includes(\"too long\") || text.includes(\"too_long\") || text.includes(\"length\"))\n ) {\n return \"context_too_long\";\n }\n if (\n text.includes(\"filtered\") ||\n text.includes(\"content policy\") ||\n text.includes(\"content_policy\")\n ) {\n return \"content_filtered\";\n }\n return \"invalid_request\";\n }\n return httpStatusToErrorCode(status);\n}\n\nfunction formatMessage(status: number, code: ErrorCode): string {\n return `Anthropic API error: ${code} (HTTP ${status})`;\n}\n","import { isPlainObject, tryJson } from \"../../sanitize/coerce.js\";\nimport { diag } from \"../diagnostics.js\";\nimport type { LlmFinish, LlmRequest, LlmStopReason, LlmToolCallPart } from \"./types.js\";\n\n/**\n * Collapse the wider `LlmRequest.system` shape (undefined | string | block[])\n * into a single string. Providers that don't support per-block prompt caching\n * join blocks with a blank-line separator.\n *\n * Shared between Ollama native and OpenAI-compatible clients.\n *\n * @internal\n */\nexport function collapseSystemText(system: LlmRequest[\"system\"]): string {\n if (system === undefined) return \"\";\n if (typeof system === \"string\") return system;\n return system.map((b) => b.text).join(\"\\n\\n\");\n}\n\n/**\n * Decode a buffered JSON-arguments string into an object. Falls back to a\n * `{ raw }` envelope so we never crash on malformed provider output.\n *\n * @internal\n */\nexport function parseToolArguments(buffered: string | undefined): Record<string, unknown> {\n if (buffered === undefined || buffered.length === 0) return {};\n try {\n return JSON.parse(buffered) as Record<string, unknown>;\n } catch {\n // M2 #61 — attempt jsonrepair (reusing the sanitize coerce helper, Rule 9)\n // before giving up, so a slightly-malformed native tool call (trailing\n // comma, unquoted key — the Kimi/K2 class) parses instead of landing in\n // `{ raw }` and bouncing to the model as an invalid_request round-trip.\n const repaired = tryJson(buffered, true);\n if (isPlainObject(repaired)) return repaired;\n return { raw: buffered };\n }\n}\n\n/**\n * Map an OpenAI-compatible `finish_reason` to the provider-agnostic stop reason.\n * Shared by the OpenAI stream accumulator. Unknown reasons fall back to `end_turn`.\n *\n * @internal\n */\nexport function mapOpenAIFinish(reason: string): LlmStopReason {\n switch (reason) {\n case \"tool_calls\":\n return \"tool_use\";\n case \"length\":\n return \"max_tokens\";\n default:\n return \"end_turn\";\n }\n}\n\n/**\n * A provider-reported token count, or `undefined` when what arrived is not one.\n *\n * Accepts a non-negative finite number, and a numeric STRING — providers returning numeric JSON\n * fields as strings is not exotic, and untreated it produced `\"0\" + \"100\" + \"050\"` where a sum was\n * intended, feeding `\"0100050\"` to pricing (#372). Fractional values are floored: a count is a\n * count, and discarding one because a provider sent `12.7` would lose real usage.\n *\n * Rejects negatives, `NaN`, `Infinity` and anything non-numeric. A negative count is the dangerous\n * one: it moves a budget gate DOWNWARD, so the guard exists to protect spend accounting, not to\n * tidy types.\n *\n * MAGNITUDE IS DELIBERATELY NOT CHECKED. `9e15` tokens is absurd and yields an absurd cost, but any\n * ceiling here would be invented — it would reject a legitimate large batch while still passing\n * anything just under it. \"How much is too much\" is a budget policy, and `@theokit/sdk-budget` is\n * where a cap belongs and already lives.\n */\nfunction asTokenCount(value: unknown): number | undefined {\n const n = typeof value === \"string\" ? Number(value) : value;\n if (typeof n !== \"number\" || !Number.isFinite(n) || n < 0) return undefined;\n return Math.floor(n);\n}\n\n/** The `LlmFinish` fields that carry a token count — the ones {@link assign} may write. */\ntype TokenField =\n | \"inputTokens\"\n | \"outputTokens\"\n | \"cacheReadTokens\"\n | \"cacheWriteTokens\"\n | \"reasoningTokens\";\n\n/** Set `key` on `finish` when `value` survives {@link asTokenCount}; report it on stderr when it does not. */\nfunction assign(finish: LlmFinish, key: TokenField, value: unknown): void {\n if (value === undefined) return;\n const count = asTokenCount(value);\n if (count === undefined) {\n diag(\n `[theokit-sdk] provider reported an unusable ${key} (${String(value)}) — dropping it. ` +\n `Usage and cost for this turn will be incomplete.\\n`,\n );\n return;\n }\n finish[key] = count;\n}\n\n/**\n * Build the provider-agnostic `LlmFinish` shape from accumulator state.\n * Shared between the Anthropic and OpenAI stream parsers so the two\n * implementations don't drift on token-usage fields.\n *\n * @internal\n */\nexport function makeLlmFinish(state: {\n stopReason: LlmStopReason;\n text: string;\n toolCalls: LlmToolCallPart[];\n inputTokens?: number;\n outputTokens?: number;\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n reasoningTokens?: number;\n /** theokit#122 — the turn's thinking block, with its provider signature when one was issued. */\n thinking?: import(\"./types.js\").LlmThinkingPart;\n}): LlmFinish {\n const finish: LlmFinish = {\n stopReason: state.stopReason,\n text: state.text,\n toolCalls: state.toolCalls,\n };\n // #372 — validate at the boundary (`error-handling.md` § 2). Everything below arrives from a\n // provider's JSON and reaches `run.usage`, the cost calculation and `@theokit/sdk-budget` with no\n // check of its own further down.\n assign(finish, \"inputTokens\", state.inputTokens);\n assign(finish, \"outputTokens\", state.outputTokens);\n assign(finish, \"cacheReadTokens\", state.cacheReadTokens);\n assign(finish, \"cacheWriteTokens\", state.cacheWriteTokens);\n assign(finish, \"reasoningTokens\", state.reasoningTokens);\n if (state.thinking !== undefined) finish.thinking = state.thinking;\n return finish;\n}\n","/**\n * SE7 — provider-agnostic helpers for structured tool-result content\n * ({@link ToolResultContentBlock}). Named by CAPABILITY, not by provider:\n *\n * - `toBlockToolResultContent` — for a wire that ACCEPTS content blocks.\n * - `toStringToolResultContent` — for a string-only wire (fail-fast on an image).\n * - `renderToolResultContentText` — map the text parts through a fn (for the guard).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport type { ToolResultContentBlock } from \"../../types/content-blocks.js\";\n\n/**\n * For a block-capable provider wire: pass a string through unchanged, or forward\n * the structured blocks as-is (text + image).\n *\n * This is an INTENTIONAL identity: `ToolResultContentBlock` is defined to be\n * exactly the on-wire content-block shape that block-capable providers accept\n * for a tool result — `{ type: \"text\", text }` and\n * `{ type: \"image\", source: { type: \"base64\", media_type, data } }`. Because the\n * SDK type already IS the wire shape, no transformation is needed; this function\n * names that contract at the call site (and is the single seam to add a mapping\n * later, if a block-capable wire ever diverges from this shape). Do NOT add\n * SDK-internal fields to `ToolResultContentBlock` without updating this seam —\n * they would otherwise be forwarded verbatim onto the wire.\n */\nexport function toBlockToolResultContent(\n content: string | ToolResultContentBlock[],\n): string | ToolResultContentBlock[] {\n return content;\n}\n\n/**\n * For a string-only provider wire: pass a string through; flatten text-only\n * blocks to a newline-joined string; **fail fast** with a typed\n * {@link ConfigurationError} when an image block is present — that provider\n * cannot carry an image in a tool result, and silently dropping it would hand\n * the model a lie (per error-handling policy).\n */\nexport function toStringToolResultContent(\n content: string | ToolResultContentBlock[],\n providerName: string,\n): string {\n if (typeof content === \"string\") return content;\n if (content.some((block) => block.type === \"image\")) {\n throw new ConfigurationError(\n `provider \"${providerName}\" does not support image content in tool results`,\n );\n }\n return content\n .filter(\n (block): block is Extract<ToolResultContentBlock, { type: \"text\" }> => block.type === \"text\",\n )\n .map((block) => block.text)\n .join(\"\\n\");\n}\n\n/**\n * Apply `fn` to the text of a tool-result content (both the string form and the\n * text blocks of the structured form); image blocks pass through untouched.\n * Used by the tool-result guard so redaction/delimiting still covers text.\n */\nexport function renderToolResultContentText(\n content: string | ToolResultContentBlock[],\n fn: (text: string) => string,\n): string | ToolResultContentBlock[] {\n if (typeof content === \"string\") return fn(content);\n return content.map((block) =>\n block.type === \"text\" ? { type: \"text\" as const, text: fn(block.text) } : block,\n );\n}\n","/**\n * Shared helpers for Anthropic Messages wire format across direct API\n * (anthropic.ts), Vertex (vertex-anthropic.ts), and Bedrock (bedrock-anthropic.ts)\n * clients. Extracted to remove cross-module clones flagged by jscpd.\n *\n * @internal\n */\n\nimport { parseToolArguments } from \"./finish.js\";\nimport { toBlockToolResultContent } from \"./tool-result-content.js\";\nimport type {\n LlmContentPart,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmSystemBlock,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface AnthropicResponseLike {\n content?: Array<\n | { type: \"text\"; text: string }\n | { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> }\n >;\n stop_reason?: string | null;\n usage?: { input_tokens?: number; output_tokens?: number };\n}\n\nexport function extractAnthropicText(response: AnthropicResponseLike): string {\n return (response.content ?? [])\n .filter((c): c is { type: \"text\"; text: string } => c.type === \"text\")\n .map((c) => c.text)\n .join(\"\");\n}\n\nexport function extractAnthropicToolCalls(response: AnthropicResponseLike): LlmToolCallPart[] {\n return (response.content ?? [])\n .filter(\n (c): c is { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> } =>\n c.type === \"tool_use\",\n )\n .map((c) => ({\n type: \"tool_use\" as const,\n id: c.id,\n name: c.name,\n input: parseToolArguments(JSON.stringify(c.input)),\n }));\n}\n\nexport function mapAnthropicStopReason(reason: string | null): LlmStopReason {\n switch (reason) {\n case \"tool_use\":\n return \"tool_use\";\n case \"max_tokens\":\n return \"max_tokens\";\n case \"stop_sequence\":\n return \"stop_sequence\";\n case \"end_turn\":\n case null:\n return \"end_turn\";\n default:\n return \"end_turn\";\n }\n}\n\n/**\n * theokit#122 — replay an extended-thinking block WITH its signature.\n *\n * Anthropic verifies the signature against the text, so both must go back byte-identically or the\n * request is rejected with `400 \"thinking blocks cannot be modified\"`. A part with no signature —\n * an OpenAI-compatible provider's reasoning text, or history recorded before this shipped — is\n * dropped rather than sent unsigned: an unsigned block fails the same validation, so sending it\n * would break the whole turn instead of losing one block of context.\n */\nfunction thinkingToWireBlock(\n part: Extract<LlmContentPart, { type: \"thinking\" }>,\n): Record<string, unknown> | undefined {\n return part.signature === undefined\n ? undefined\n : { type: \"thinking\", thinking: part.text, signature: part.signature };\n}\n\n/** Map one SDK content part to its Anthropic wire block (`undefined` = do not send). */\nfunction partToWireBlock(part: LlmContentPart): Record<string, unknown> | undefined {\n if (part.type === \"text\") return { type: \"text\", text: part.text };\n if (part.type === \"tool_use\") {\n return { type: \"tool_use\", id: part.id, name: part.name, input: part.input };\n }\n // M35 — Anthropic native image block: base64 source, unchanged shape.\n if (part.type === \"image\") return { type: \"image\", source: part.source };\n if (part.type === \"thinking\") return thinkingToWireBlock(part);\n return {\n type: \"tool_result\",\n tool_use_id: part.toolUseId,\n // SE7 — this wire is block-capable: strings pass through, structured\n // text/image blocks are forwarded natively.\n content: toBlockToolResultContent(part.content),\n ...(part.isError === true ? { is_error: true } : {}),\n };\n}\n\n/**\n * Convert an SDK `LlmMessage` to the Anthropic Messages wire shape.\n * Identical across the three Anthropic-compatible clients (D289/D292).\n */\nexport function toAnthropicWireMessage(message: LlmMessage): Record<string, unknown> {\n const role = message.role === \"system\" ? \"user\" : message.role;\n // theokit#122 — `filter` drops the blocks the mapper declined to serialize.\n const content = message.content\n .map(partToWireBlock)\n .filter((b): b is Record<string, unknown> => b !== undefined);\n return { role, content };\n}\n\n/**\n * Issue a POST to an Anthropic-compatible Messages endpoint with the\n * standard auth + content-type headers. Caller maps non-2xx via its own\n * dialect-specific error mapper.\n */\nexport function postAnthropicRequest(args: {\n fetchImpl: typeof fetch;\n url: string;\n token: string;\n body: Record<string, unknown>;\n signal: AbortSignal;\n}): Promise<Response> {\n return args.fetchImpl(args.url, {\n method: \"POST\",\n signal: args.signal,\n headers: {\n \"content-type\": \"application/json\",\n accept: \"application/json\",\n authorization: `Bearer ${args.token}`,\n },\n body: JSON.stringify(args.body),\n });\n}\n\n/**\n * Map non-2xx response to a typed error via the dialect mapper; consume\n * 2xx body into the Anthropic-shape result. Shared by Bedrock + Vertex\n * Anthropic clients to remove the ~15-line clone (jscpd).\n */\nexport async function handleAnthropicResponse(args: {\n response: Response;\n endpoint: string;\n errorMapper: (info: {\n status: number;\n body: unknown;\n headers: Headers;\n endpoint: string;\n }) => Error;\n}): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n if (!args.response.ok) {\n throw args.errorMapper({\n status: args.response.status,\n body: await parseHttpErrorBody(args.response),\n headers: args.response.headers,\n endpoint: args.endpoint,\n });\n }\n return consumeAnthropicResponse(args.response);\n}\n\nexport async function consumeAnthropicResponse(response: Response): Promise<{\n text: string;\n toolCalls: LlmToolCallPart[];\n stopReason: LlmStopReason;\n inputTokens?: number;\n outputTokens?: number;\n}> {\n const data = (await response.json()) as AnthropicResponseLike;\n return {\n text: extractAnthropicText(data),\n toolCalls: extractAnthropicToolCalls(data),\n stopReason: mapAnthropicStopReason(data.stop_reason ?? null),\n inputTokens: data.usage?.input_tokens,\n outputTokens: data.usage?.output_tokens,\n };\n}\n\nexport async function parseHttpErrorBody(response: Response): Promise<unknown> {\n const text = await response.text().catch(() => \"\");\n try {\n return JSON.parse(text);\n } catch {\n return text;\n }\n}\n\nexport interface AnthropicTextBlock {\n type: \"text\";\n text: string;\n cache_control?: { type: \"ephemeral\" };\n}\n\n/**\n * theokit#122 — map the provider-agnostic reasoning `effort` onto Anthropic's token budget.\n *\n * Anthropic does not take an effort label; it takes `budget_tokens`, and the API requires\n * `budget_tokens >= 1024` and `max_tokens > budget_tokens`. The three tiers mirror the effort\n * vocabulary the OpenAI-compatible wire uses, so a caller writes `thinking: \"low\"` once and both\n * providers do something sensible. An unrecognised effort maps to the medium tier rather than\n * failing the request — the knob is a hint, not a contract.\n */\nfunction thinkingBudgetTokens(effort: string): number {\n if (effort === \"low\" || effort === \"minimal\") return 1024;\n if (effort === \"high\" || effort === \"max\") return 16_384;\n return 4096;\n}\n\n/**\n * Build the common body shape for Anthropic Messages requests. Caller\n * is responsible for adding wire-specific fields (`anthropic_version`,\n * `model`, `stream`, etc.).\n */\nexport function buildAnthropicCommonBody(request: LlmRequest): {\n max_tokens: number;\n messages: Array<Record<string, unknown>>;\n system?: string | AnthropicTextBlock[];\n temperature?: number;\n tools?: Array<{ name: string; description: string; input_schema: unknown }>;\n thinking?: { type: \"enabled\"; budget_tokens: number };\n} {\n const body: ReturnType<typeof buildAnthropicCommonBody> = {\n max_tokens: request.maxTokens ?? 4096,\n messages: request.messages.map(toAnthropicWireMessage),\n };\n // theokit#122 — without this the adapter never requested extended thinking, so no signature was\n // ever issued and the rest of the chain would have been dead code (the theokit#144 lesson).\n if (request.reasoning?.effort !== undefined) {\n const budget = thinkingBudgetTokens(request.reasoning.effort);\n body.thinking = { type: \"enabled\", budget_tokens: budget };\n // The API rejects `max_tokens <= budget_tokens`. Raise the ceiling rather than silently\n // shrinking the budget the caller asked for.\n if (body.max_tokens <= budget) body.max_tokens = budget + 4096;\n }\n const wireSystem = encodeAnthropicSystem(request.system);\n if (wireSystem !== undefined) body.system = wireSystem;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n if (request.tools !== undefined && request.tools.length > 0) {\n body.tools = request.tools.map((tool) => ({\n name: tool.name,\n description: tool.description,\n input_schema: tool.inputSchema,\n }));\n }\n return body;\n}\n\n/**\n * T3.5 — translate `LlmRequest.system` to the Anthropic wire shape.\n *\n * - `undefined` → omit (`undefined`).\n * - `string` → forward verbatim (back-compat, no caching).\n * - `LlmSystemBlock[]` → array of `{type:\"text\", text, cache_control?}`.\n * `cacheable: true` → emit `cache_control:{type:\"ephemeral\"}`.\n * Empty array short-circuits to `undefined`.\n *\n * @internal\n */\nfunction encodeAnthropicSystem(\n system: string | LlmSystemBlock[] | undefined,\n): string | AnthropicTextBlock[] | undefined {\n if (system === undefined) return undefined;\n if (typeof system === \"string\") return system;\n if (system.length === 0) return undefined;\n return system.map((block) => {\n const wire: AnthropicTextBlock = { type: \"text\", text: block.text };\n if (block.cacheable === true) wire.cache_control = { type: \"ephemeral\" };\n return wire;\n });\n}\n","/**\n * Minimal Server-Sent-Events parser. Consumes a fetch `Response` body\n * stream and yields `{ event, data }` records as they arrive. Used by\n * both the Anthropic and OpenAI streaming clients — neither vendor sends\n * binary SSE so a simple text decoder is enough.\n *\n * @internal\n */\n\nimport { NetworkError } from \"../../errors.js\";\n\nexport interface SseRecord {\n event: string;\n data: string;\n}\n\n/**\n * M2 #61 — default idle timeout (ms) between SSE reads. \"Idle\" means *no bytes\n * at all* arrive within the window — distinct from a slow-but-alive stream that\n * keeps trickling chunks. A stalled upstream that handshakes then goes silent no\n * longer hangs the AsyncGenerator forever; it rejects a typed NetworkError so\n * FallbackLlmClient / retry can route it. Pass `0` to disable.\n */\nexport const DEFAULT_SSE_IDLE_MS = 60_000;\n\ninterface ParserState {\n buffer: string;\n event: string;\n data: string;\n}\n\nexport async function* parseSseStream(\n body: ReadableStream<Uint8Array> | null,\n signal: AbortSignal,\n idleTimeoutMs: number = DEFAULT_SSE_IDLE_MS,\n): AsyncGenerator<SseRecord, void, void> {\n if (body === null) return;\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n const state: ParserState = { buffer: \"\", event: \"message\", data: \"\" };\n try {\n for await (const chunk of readChunks(reader, signal, idleTimeoutMs)) {\n state.buffer += decoder.decode(chunk, { stream: true });\n for (const record of drainCompleteRecords(state)) yield record;\n }\n if (state.data.length > 0) yield { event: state.event, data: state.data };\n } finally {\n // T3.2 + T3.3 — cancel the underlying body stream on EVERY exit path\n // (abort, normal close, consumer break, consumer throw). Without this\n // the upstream HTTP TCP socket stays in CLOSE_WAIT until the OS times\n // it out. cancel() on a finished stream is a no-op so always-cancel\n // is safe.\n await cancelReaderQuietly(reader);\n releaseReader(reader);\n }\n}\n\n/**\n * T3.2 — yield each chunk from `reader` until `done` OR `signal.aborted`.\n * Extracted from `parseSseStream` so its complexity stays under budget.\n *\n * @internal\n */\nasync function* readChunks(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n signal: AbortSignal,\n idleTimeoutMs: number,\n): AsyncGenerator<Uint8Array, void, void> {\n while (true) {\n if (signal.aborted) return;\n const { value, done } = await readWithIdleTimeout(reader, idleTimeoutMs);\n if (done) return;\n if (value !== undefined) yield value;\n }\n}\n\n/**\n * M2 #61 — race a single `reader.read()` against an idle timer. The timer is\n * cleared the moment the read settles (success OR error), so a healthy stream\n * never leaves a dangling timeout. When the timer wins, reject a typed\n * `NetworkError` (`code: \"stream_idle_timeout\"`); the caller's `finally` cancels\n * the body socket. `idleTimeoutMs <= 0` disables the bound (legacy behavior).\n *\n * @internal\n */\nfunction readWithIdleTimeout(\n reader: ReadableStreamDefaultReader<Uint8Array>,\n idleTimeoutMs: number,\n): Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>> {\n if (idleTimeoutMs <= 0) return reader.read();\n return new Promise<Awaited<ReturnType<ReadableStreamDefaultReader<Uint8Array>[\"read\"]>>>(\n (resolve, reject) => {\n const timer = setTimeout(() => {\n reject(\n new NetworkError(`SSE stream idle for ${idleTimeoutMs}ms — upstream stalled`, {\n code: \"stream_idle_timeout\",\n }),\n );\n }, idleTimeoutMs);\n reader.read().then(\n (result) => {\n clearTimeout(timer);\n resolve(result);\n },\n (err: unknown) => {\n clearTimeout(timer);\n reject(err);\n },\n );\n },\n );\n}\n\n/**\n * T3.2 + T3.3 — cancel the underlying body stream on every exit path.\n * Swallows any cancel-time error per ADR D34's safe-exporter contract\n * (cancel-time errors never propagate to caller).\n *\n * Calling cancel on a stream that already completed naturally is a no-op\n * per the WHATWG streams spec, so unconditional cancel is safe.\n *\n * @internal\n */\nasync function cancelReaderQuietly(reader: ReadableStreamDefaultReader<Uint8Array>): Promise<void> {\n try {\n await reader.cancel();\n } catch {\n // best-effort — already cancelled OR upstream closed\n }\n}\n\nfunction drainCompleteRecords(state: ParserState): SseRecord[] {\n const out: SseRecord[] = [];\n let newlineIndex = state.buffer.indexOf(\"\\n\");\n while (newlineIndex !== -1) {\n const line = state.buffer.slice(0, newlineIndex).replace(/\\r$/, \"\");\n state.buffer = state.buffer.slice(newlineIndex + 1);\n const finished = applyLine(state, line);\n if (finished !== undefined) out.push(finished);\n newlineIndex = state.buffer.indexOf(\"\\n\");\n }\n return out;\n}\n\nfunction applyLine(state: ParserState, line: string): SseRecord | undefined {\n if (line === \"\") {\n if (state.data.length === 0) {\n state.event = \"message\";\n return undefined;\n }\n const record: SseRecord = { event: state.event, data: state.data };\n state.event = \"message\";\n state.data = \"\";\n return record;\n }\n if (line.startsWith(\":\")) return undefined;\n if (line.startsWith(\"event:\")) {\n // T3.1 — HTML Living Standard § 9.2.6: strip exactly ONE leading\n // U+0020 SPACE from the value; preserve other whitespace verbatim.\n state.event = stripOneLeadingSpace(line.slice(6));\n return undefined;\n }\n if (line.startsWith(\"data:\")) {\n const piece = stripOneLeadingSpace(line.slice(5));\n state.data = state.data.length === 0 ? piece : `${state.data}\\n${piece}`;\n }\n return undefined;\n}\n\n/**\n * T3.1 — HTML Living Standard § 9.2.6 step 5 of \"Process the field\":\n * \"If the value of field starts with a U+0020 SPACE character, remove\n * it from value.\"\n *\n * Pre-T3.1 the parser called `.trim()` which destroyed legitimate trailing\n * whitespace (and any extra leading whitespace beyond the first space).\n * This helper strips at most one leading space and leaves everything else.\n *\n * @internal\n */\nfunction stripOneLeadingSpace(value: string): string {\n return value.startsWith(\" \") ? value.slice(1) : value;\n}\n\nfunction releaseReader(reader: ReadableStreamDefaultReader<Uint8Array>): void {\n try {\n reader.releaseLock();\n } catch {\n // already released\n }\n}\n","/**\n * Types the socket failure `fetch` throws **before** any response exists.\n *\n * ## The hole this closes\n *\n * `mapAnthropicError` / `mapOpenAIError` only come into play when there is a `Response` — that is, for\n * **HTTP** errors. An ECONNREFUSED / ETIMEDOUT / DNS failure blows up at `await fetch(...)`, and until\n * M93 it propagated raw: `anthropic.ts` had no `try` at all, and `openai.ts` mapped **only** Ollama and\n * rethrew the rest (`throw fetchErr`).\n *\n * This matters because `isTransientError` — the SDK's single source of truth — returns `false` for\n * a foreign error **by contract** (\"wrap a foreign error in the appropriate SDK error first\",\n * `errors.ts:429`). With the transport letting the raw error escape, M93's retry would be dead\n * exactly the most classic failure it exists to cover. The same applied to the pool's\n * `classifyAndDecide`, which predates this milestone.\n *\n * ## Cancellation is NOT a transport failure\n *\n * `AbortError` also comes out of `fetch`, and wrapping it in a `NetworkError` (which is `isRetryable: true`)\n * would make an explicit user cancellation be retried three times. It propagates intact.\n *\n * @internal\n */\nimport { NetworkError, TheokitAgentError } from \"../../errors.js\";\n\n/** Did the error come from an `abort()` rather than a network failure? */\nfunction isAbortError(err: unknown): boolean {\n if (typeof err !== \"object\" || err === null) return false;\n const name = (err as { name?: unknown }).name;\n return name === \"AbortError\" || name === \"TimeoutError\";\n}\n\n/**\n * Wraps a socket failure in a {@link NetworkError}, preserving the cause.\n *\n * Returns the original error — unwrapped — when it is an abort or already an SDK error.\n */\nexport function wrapTransportError(\n err: unknown,\n ctx: { providerId: string; endpoint: string },\n): unknown {\n if (isAbortError(err)) return err;\n // Any SDK error already carries a mapped message and code — a provider's 429 or context-length\n // refusal must not be relabelled \"transport failure\" on its way out (#371 widened this from\n // `NetworkError` to the whole hierarchy when the SSE read started routing through here).\n if (err instanceof TheokitAgentError) return err;\n const detail = err instanceof Error ? err.message : String(err);\n return new NetworkError(`${ctx.providerId} transport failure on ${ctx.endpoint}: ${detail}`, {\n code: \"transport_failure\",\n cause: err,\n });\n}\n","import { NetworkError } from \"../../errors.js\";\nimport { mapAnthropicError } from \"../error-mappers/anthropic.js\";\nimport { buildAnthropicCommonBody, mapAnthropicStopReason } from \"./anthropic-shared.js\";\nimport { makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport { wrapTransportError } from \"./transport-error.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * Real Anthropic Messages client. Streams `/v1/messages` and translates the\n * vendor SSE events (`content_block_delta`, `content_block_start`,\n * `message_delta`, `message_stop`) into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `@anthropic-ai/sdk` dependency.\n *\n * @internal\n */\n\nexport interface AnthropicClientOptions {\n apiKey: string;\n baseUrl?: string;\n version?: string;\n fetch?: typeof fetch;\n /**\n * M45 — extra HTTP headers merged into the request (the profile's static `extraHeaders` + a provider\n * `transform.headers(ctx)`). Assigned AFTER the base headers (mirror of the M41 OpenAIClient wiring), so\n * a provider that owns its auth CAN override them by design.\n */\n extraHeaders?: Record<string, string>;\n}\n\ninterface AnthropicTextDelta {\n type: \"content_block_delta\";\n delta: { type: \"text_delta\"; text: string };\n}\n\ninterface AnthropicToolStart {\n type: \"content_block_start\";\n index: number;\n content_block: { type: \"tool_use\"; id: string; name: string; input: Record<string, unknown> };\n}\n\n/**\n * theokit#122 — the extended-thinking wire.\n *\n * Anthropic opens a `thinking` content block, streams its text as `thinking_delta`, and then emits\n * ONE `signature_delta` carrying the cryptographic signature for that block. All three are needed:\n * replaying the text without the signature is rejected on the next turn with\n * `400 \"thinking blocks cannot be modified\"`.\n */\ninterface AnthropicThinkingStart {\n type: \"content_block_start\";\n index: number;\n content_block: { type: \"thinking\"; thinking?: string; signature?: string };\n}\n\ninterface AnthropicThinkingDelta {\n type: \"content_block_delta\";\n index: number;\n delta: { type: \"thinking_delta\"; thinking: string };\n}\n\ninterface AnthropicSignatureDelta {\n type: \"content_block_delta\";\n index: number;\n delta: { type: \"signature_delta\"; signature: string };\n}\n\ninterface AnthropicToolDelta {\n type: \"content_block_delta\";\n index: number;\n delta: { type: \"input_json_delta\"; partial_json: string };\n}\n\ninterface AnthropicMessageDelta {\n type: \"message_delta\";\n delta: { stop_reason: string | null };\n /**\n * T3.8 — Anthropic native usage shape carries the 5-bucket cache counters\n * when the request annotated system blocks with `cache_control:\n * {type:\"ephemeral\"}` (shipped in T3.5). `cache_creation_input_tokens`\n * surfaces as `LlmFinish.cacheWriteTokens` (the 1.25x billing tier);\n * `cache_read_input_tokens` surfaces as `LlmFinish.cacheReadTokens` (the\n * 0.1x billing tier). Pre-T3.8 the SDK dropped both fields silently.\n */\n usage?: {\n input_tokens?: number;\n output_tokens?: number;\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n}\n\ntype AnthropicEvent =\n | AnthropicTextDelta\n | AnthropicToolStart\n | AnthropicToolDelta\n | AnthropicThinkingStart\n | AnthropicThinkingDelta\n | AnthropicSignatureDelta\n | AnthropicMessageDelta\n | { type: \"message_stop\" }\n | { type: string };\n\nexport class AnthropicClient implements LlmClient {\n readonly name = \"anthropic\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: AnthropicClientOptions) {\n this.baseUrl = options.baseUrl ?? \"https://api.anthropic.com\";\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const body = buildAnthropicBody(request);\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n \"x-api-key\": this.options.apiKey,\n \"anthropic-version\": this.options.version ?? \"2023-06-01\",\n };\n // M45 — merge extra/dynamic headers (assign LAST — same override semantics as the chat_completions client).\n if (this.options.extraHeaders !== undefined) Object.assign(headers, this.options.extraHeaders);\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.baseUrl}/v1/messages`, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(body),\n });\n } catch (fetchErr) {\n // M93 — a socket failure has no `Response`, so `mapAnthropicError` never saw it and it\n // propagated raw. A foreign error is NON-transient per `isTransientError`'s contract, so\n // retry was switched off on exactly the ECONNREFUSED/ETIMEDOUT case.\n throw wrapTransportError(fetchErr, { providerId: this.name, endpoint: \"/v1/messages\" });\n }\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n // Parse body as JSON when possible — gives the mapper access to\n // `error.code` / `error.type` fields. Leave as string otherwise.\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n // not JSON — keep as string\n }\n throw mapAnthropicError({\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/messages\",\n });\n }\n\n const accumulator = new AnthropicStreamAccumulator();\n for await (const record of parseSseStream(response.body, signal)) {\n if (record.event === \"ping\" || record.event === \"message_start\") continue;\n let parsed: AnthropicEvent;\n try {\n parsed = JSON.parse(record.data) as AnthropicEvent;\n } catch {\n continue;\n }\n const events = accumulator.consume(parsed);\n for (const event of events) yield event;\n }\n // M2 #61 — a stream that ended without a terminal `message_delta`\n // (stop_reason) was truncated (dropped connection / proxy hiccup); throw a\n // typed error rather than commit the partial turn as a clean `end_turn`\n // (parity with the OpenAI client's truncation guard).\n if (!accumulator.finishReasonSeen) {\n throw new NetworkError(\"Anthropic SSE stream truncated (no stop_reason)\", {\n code: \"stream_truncated\",\n });\n }\n return accumulator.finish();\n }\n}\n\nclass AnthropicStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n /**\n * M2 #61 — whether a `message_delta` carrying a real `stop_reason` was seen.\n * A stream that closes before it is a truncation (server FIN / proxy hiccup),\n * not a clean `end_turn` — the caller throws `stream_truncated` on `false`.\n */\n private sawStopReason = false;\n private inputTokens?: number;\n private outputTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n private readonly toolCalls = new Map<number, LlmToolCallPart>();\n private readonly toolBuffers = new Map<number, string>();\n /**\n * theokit#122 — the turn's thinking block. Text accumulates across `thinking_delta`s; the\n * signature arrives once, on a `signature_delta` for the same block. Undefined until the model\n * actually opens a thinking block, so a non-thinking turn reports nothing.\n */\n private thinking: { text: string; signature?: string } | undefined;\n\n consume(event: AnthropicEvent): LlmEvent[] {\n if (event.type === \"content_block_start\") {\n const block = (event as AnthropicToolStart | AnthropicThinkingStart).content_block;\n if (block.type === \"thinking\") this.handleThinkingStart(event as AnthropicThinkingStart);\n else this.handleToolStart(event as AnthropicToolStart);\n return [];\n }\n if (event.type === \"content_block_delta\") {\n return this.handleContentDelta(event as AnthropicTextDelta | AnthropicToolDelta);\n }\n if (event.type === \"message_delta\") {\n this.handleMessageDelta(event as AnthropicMessageDelta);\n }\n return [];\n }\n\n private handleToolStart(start: AnthropicToolStart): void {\n if (start.content_block.type !== \"tool_use\") return;\n this.toolCalls.set(start.index, {\n type: \"tool_use\",\n id: start.content_block.id,\n name: start.content_block.name,\n input: { ...start.content_block.input },\n });\n this.toolBuffers.set(start.index, \"\");\n }\n\n private handleThinkingStart(start: AnthropicThinkingStart): void {\n // A thinking block can open carrying its opening text (and, on a replayed block, a signature).\n this.thinking = {\n text: start.content_block.thinking ?? \"\",\n ...(start.content_block.signature !== undefined\n ? { signature: start.content_block.signature }\n : {}),\n };\n }\n\n private handleContentDelta(\n delta:\n | AnthropicTextDelta\n | AnthropicToolDelta\n | AnthropicThinkingDelta\n | AnthropicSignatureDelta,\n ): LlmEvent[] {\n if (delta.delta.type === \"text_delta\") {\n const text = (delta as AnthropicTextDelta).delta.text;\n this.text += text;\n return [{ type: \"text_delta\", text }];\n }\n // theokit#122 — extended thinking streams on its own channel, surfaced as `reasoning_delta`\n // exactly like the OpenAI-compatible providers, so the loop needs no provider branch.\n if (delta.delta.type === \"thinking_delta\") {\n const text = (delta as AnthropicThinkingDelta).delta.thinking;\n this.thinking = {\n ...(this.thinking ?? { text: \"\" }),\n text: (this.thinking?.text ?? \"\") + text,\n };\n return [{ type: \"reasoning_delta\", text }];\n }\n // The signature closes the block. It carries no text, so it rides an empty reasoning delta —\n // the loop's accumulator keeps the last signature it sees for the turn.\n if (delta.delta.type === \"signature_delta\") {\n const signature = (delta as AnthropicSignatureDelta).delta.signature;\n this.thinking = { text: this.thinking?.text ?? \"\", signature };\n return [{ type: \"reasoning_delta\", text: \"\", signature }];\n }\n const idx = (delta as AnthropicToolDelta).index;\n const existing = this.toolBuffers.get(idx) ?? \"\";\n this.toolBuffers.set(idx, existing + (delta as AnthropicToolDelta).delta.partial_json);\n return [];\n }\n\n /**\n * T3.8 — extract token counters from Anthropic's `message_delta` usage.\n * Public on the class so the test seam can drive it directly without\n * spinning the SSE parser.\n */\n handleMessageDelta(md: AnthropicMessageDelta): void {\n if (md.delta.stop_reason !== undefined && md.delta.stop_reason !== null) {\n this.sawStopReason = true;\n }\n this.stopReason = mapAnthropicStopReason(md.delta.stop_reason);\n if (md.usage?.input_tokens !== undefined) this.inputTokens = md.usage.input_tokens;\n if (md.usage?.output_tokens !== undefined) this.outputTokens = md.usage.output_tokens;\n // T3.8 — treat 0 as \"no cache activity\" and leave the bucket\n // unreported (mirrors usage-accumulator's filter where zero-value\n // entries are stripped from the emitted TokenUsage).\n if (\n md.usage?.cache_creation_input_tokens !== undefined &&\n md.usage.cache_creation_input_tokens > 0\n ) {\n this.cacheWriteTokens = md.usage.cache_creation_input_tokens;\n }\n if (md.usage?.cache_read_input_tokens !== undefined && md.usage.cache_read_input_tokens > 0) {\n this.cacheReadTokens = md.usage.cache_read_input_tokens;\n }\n }\n\n /** M2 #61 — whether the terminal `message_delta` (stop_reason) was seen. */\n get finishReasonSeen(): boolean {\n return this.sawStopReason;\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const [index, tool] of this.toolCalls.entries()) {\n const buffered = this.toolBuffers.get(index);\n const parsed = parseToolArguments(buffered);\n if (Object.keys(parsed).length > 0) tool.input = parsed;\n toolCalls.push(tool);\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n // T3.8 — surface Anthropic native cache-token counters when the\n // request used `cache_control: {type:\"ephemeral\"}` on system blocks.\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n // theokit#122 — carry the thinking block + its signature so the turn can be replayed.\n ...(this.thinking !== undefined\n ? { thinking: { type: \"thinking\" as const, ...this.thinking } }\n : {}),\n });\n }\n}\n\n/**\n * T3.8 — test seam: exposes the AnthropicStreamAccumulator directly so\n * unit tests can drive the message_delta path without spinning the SSE\n * parser. `@internal` — not part of the public surface.\n */\nexport const __testing__AnthropicAccumulator = AnthropicStreamAccumulator;\n\nfunction buildAnthropicBody(request: LlmRequest): Record<string, unknown> {\n return {\n model: request.model,\n stream: true,\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * AWS Bedrock HTTP error mapper (ADRs D67, D300).\n *\n * Bedrock returns either AWS-style `{ message, __type: \"ThrottlingException\" }`\n * or sometimes `{ Message }` (capitalized) depending on the model dialect.\n * We accept both shapes and map to canonical `TheokitAgentError` subclasses.\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata, httpStatusToErrorCode, parseErrorBody } from \"./shared.js\";\n\ninterface BedrockErrorBody {\n __type?: string;\n message?: string;\n Message?: string;\n}\n\nexport interface MapBedrockErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype BedrockCode =\n | \"rate_limit\"\n | \"auth_failed\"\n | \"invalid_request\"\n | \"quota_exceeded\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nfunction classifyBedrockError(\n args: MapBedrockErrorArgs,\n awsType: string,\n message: string,\n): BedrockCode {\n // AWS's `__type` strings and the account-setup message ARE a Bedrock contract, so\n // they are classified here and they win. HTTP 404 stays too: Bedrock is the only\n // mapper that reads it as a validation failure, and folding that into the shared\n // ladder would silently change the other three.\n if (awsType.includes(\"Throttling\") || awsType.includes(\"TooManyRequests\")) {\n return \"rate_limit\";\n }\n if (awsType.includes(\"AccessDenied\") || awsType.includes(\"UnauthorizedOperation\")) {\n return \"auth_failed\";\n }\n if (\n args.status === 404 ||\n awsType.includes(\"ValidationException\") ||\n awsType.includes(\"ResourceNotFound\") ||\n message.includes(\"use case details\")\n ) {\n return \"invalid_request\";\n }\n if (awsType.includes(\"Timeout\")) return \"timeout\";\n\n // Everything else is RFC 9110 and lives once, in shared.ts. This arm used to be a\n // fourth copy of the ladder, and it was one of the two that guarded `>= 500` with\n // no upper bound — so a malformed 6xx read as `server_error` here and `unknown` in\n // anthropic / openai-compatible.\n return httpStatusToErrorCode(args.status);\n}\n\nfunction buildBedrockMetadata(args: MapBedrockErrorArgs, code: BedrockCode) {\n return buildErrorMetadata({\n provider: \"bedrock\",\n endpoint: args.endpoint,\n code,\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nexport function mapBedrockError(args: MapBedrockErrorArgs): TheokitAgentError {\n const parsed = parseErrorBody<BedrockErrorBody>(args.body);\n const awsType = parsed.__type ?? \"\";\n const message = parsed.message ?? parsed.Message ?? \"Bedrock request failed\";\n const code = classifyBedrockError(args, awsType, message);\n const metadata = buildBedrockMetadata(args, code);\n\n switch (code) {\n case \"rate_limit\":\n return new RateLimitError(`Bedrock throttled: ${message}`, { metadata });\n case \"auth_failed\":\n return new AuthenticationError(`Bedrock auth: ${message}`, { metadata });\n case \"invalid_request\": {\n const friendly = message.includes(\"use case details\")\n ? `Bedrock account setup required: ${message} (AWS Console → Bedrock → Model access → Anthropic → Submit use case form, then retry in 15 min.)`\n : `Bedrock validation: ${message}`;\n return new ConfigurationError(friendly, { metadata });\n }\n case \"quota_exceeded\":\n return new RateLimitError(`Bedrock quota exceeded: ${message}`, { metadata });\n case \"timeout\":\n return new NetworkError(`Bedrock timeout: ${message}`, { metadata });\n case \"server_error\":\n return new NetworkError(`Bedrock server error: ${message}`, { metadata });\n default:\n return new UnknownAgentError(`Bedrock unknown: ${message}`, { metadata });\n }\n}\n","/**\n * Bedrock Bearer token resolution + cache (ADRs D287, D295).\n *\n * Two paths:\n * 1. Explicit env (`AWS_BEARER_TOKEN_BEDROCK`) wins; no refresh.\n * 2. Optional peer dep `@aws/bedrock-token-generator` (D287) auto-generates\n * short-term tokens from the standard AWS credential chain\n * (`@aws-sdk/credential-providers`). Cached for 1.5h.\n *\n * `resolveBedrockToken` returns `undefined` only when BOTH paths produce no\n * token. Caller (router) is responsible for throwing a helpful error\n * (D279/EC-6) — this module is auth-resolution only.\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\ninterface CachedToken {\n value: string;\n expiresAt: number;\n}\n\nlet cachedToken: CachedToken | null = null;\n\ninterface BedrockTokenGeneratorApi {\n getToken: (opts: { credentials: unknown; region: string }) => Promise<string>;\n}\n\ninterface CredentialProvidersApi {\n fromNodeProviderChain: () => () => Promise<unknown>;\n}\n\nconst CACHE_TTL_MS = 90 * 60 * 1000; // 1.5h\n\nexport async function resolveBedrockToken(region: string): Promise<string | undefined> {\n const env = process.env.AWS_BEARER_TOKEN_BEDROCK;\n if (env !== undefined && env.length > 0) return env;\n\n const now = Date.now();\n if (cachedToken !== null && cachedToken.expiresAt > now) {\n return cachedToken.value;\n }\n\n try {\n const r = createRequire(import.meta.url);\n const gen = r(\"@aws/bedrock-token-generator\") as BedrockTokenGeneratorApi;\n if (typeof gen.getToken !== \"function\") return undefined;\n\n const providers = r(\"@aws-sdk/credential-providers\") as CredentialProvidersApi;\n if (typeof providers.fromNodeProviderChain !== \"function\") return undefined;\n\n const credentialProvider = providers.fromNodeProviderChain();\n const token = await gen.getToken({ credentials: credentialProvider, region });\n cachedToken = { value: token, expiresAt: now + CACHE_TTL_MS };\n return token;\n } catch {\n return undefined;\n }\n}\n\n/** Test seam — clear cache between tests. */\nexport function __resetBedrockTokenCache(): void {\n cachedToken = null;\n}\n","/**\n * AWS Bedrock client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D286-D302).\n *\n * v1: non-streaming only (`POST /model/{id}/invoke`). D302 defers\n * `/invoke-with-response-stream` (AWS Event Stream binary format) to v1.x.\n *\n * Body massage (D289):\n * - inject `anthropic_version: \"bedrock-2023-05-31\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body (D302 — non-streaming only in v1)\n *\n * Uses native `fetch` only — no `@aws-sdk/client-bedrock-runtime`.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapBedrockError } from \"../error-mappers/bedrock.js\";\nimport {\n inferRegionFromModelId,\n resolveBedrockBaseUrl,\n stripBedrockPrefix,\n} from \"../providers/builtin/bedrock.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { resolveBedrockToken } from \"./bedrock-token-cache.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nexport interface BedrockAnthropicClientOptions {\n /**\n * AWS Bearer token. When non-empty, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveBedrockToken(region)` (D287).\n */\n apiKey?: string;\n /** Override the resolved baseUrl (rarely needed; defaults derive from model id). */\n baseUrl?: string;\n /** Injected fetch impl for tests. */\n fetch?: typeof fetch;\n}\n\nexport class BedrockAnthropicClient implements LlmClient {\n readonly name = \"bedrock\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: BedrockAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private async resolveTokenOrThrow(region: string): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromEnv = await resolveBedrockToken(region);\n if (fromEnv !== undefined && fromEnv.length > 0) return fromEnv;\n throw new ConfigurationError(\n \"Bedrock requires AWS_BEARER_TOKEN_BEDROCK env var, or install `@aws/bedrock-token-generator` for auto-refresh, or pass apiKey explicitly.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const region = inferRegionFromModelId(request.model) ?? process.env.AWS_REGION ?? \"us-east-1\";\n const token = await this.resolveTokenOrThrow(region);\n\n const bareModel = stripBedrockPrefix(request.model);\n const baseUrl = this.options.baseUrl ?? resolveBedrockBaseUrl(request.model);\n const endpoint = `/model/${encodeURIComponent(bareModel)}/invoke`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token,\n body: buildBedrockBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapBedrockError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildBedrockBody(request: LlmRequest): Record<string, unknown> {\n // D289: anthropic_version injected; model + stream stripped.\n return {\n anthropic_version: \"bedrock-2023-05-31\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * D14 — Fault injection via `THEOKIT_TEST_RESPONSE_OVERRIDE` env var.\n *\n * Decorator pattern (D127 inspired): wraps any `LlmClient` and short-circuits\n * the network call when:\n *\n * 1. `process.env.NODE_ENV === \"test\"` (fail-safe gate — prevents production\n * footgun), AND\n * 2. `process.env.THEOKIT_TEST_RESPONSE_OVERRIDE` is a non-empty JSON string\n * shaped as `{ \"status\": number, \"body\": object | string }`.\n *\n * On any other condition (different NODE_ENV, missing env, malformed JSON),\n * the wrapper delegates to the real client — graceful degradation.\n *\n * Use cases (FAANG-grade chaos testing):\n *\n * - `{\"status\":429,\"body\":{\"error\":{\"code\":\"rate_limit_exceeded\"}}}` →\n * deterministic RateLimitError without burning real quota\n * - `{\"status\":500,\"body\":{\"error\":{\"code\":\"internal_error\"}}}` →\n * deterministic NetworkError for retry/circuit-breaker tests\n * - `{\"status\":200,\"body\":{\"choices\":[{\"message\":{\"content\":\"fake\"}}]}}` →\n * deterministic happy-path text for snapshot tests\n *\n * Compatible with the dogfood-stranger chaos phases (12-15). Replaces the\n * flaky \"50 parallel requests to force 429\" anti-pattern.\n *\n * Wire format mirrors OpenAI Chat Completions (universal — same shape every\n * provider returns). Error mapping reuses `mapOpenAICompatibleError` so the\n * injected errors are byte-equal to what the real provider would raise.\n *\n * @internal\n */\n\nimport { diag } from \"../diagnostics.js\";\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\nconst ENV_GATE_KEY = \"NODE_ENV\";\nconst ENV_GATE_VALUE = \"test\";\nconst ENV_OVERRIDE_KEY = \"THEOKIT_TEST_RESPONSE_OVERRIDE\";\n\ninterface ParsedOverride {\n status: number;\n body: unknown;\n}\n\n/**\n * Wrap an `LlmClient` with the fault-injection decorator. Returns the\n * original client unchanged when the activation gate is not satisfied\n * (cheap noop — no allocation in the hot path of production runtime).\n */\nexport function maybeWrapWithFaultInjection(client: LlmClient): LlmClient {\n // Cheap gate first — production calls never allocate the wrapper.\n if (!isGateOn()) return client;\n return new FaultInjectingLlmClient(client);\n}\n\nexport class FaultInjectingLlmClient implements LlmClient {\n readonly name: string;\n /**\n * Inner (real) client. Exposed so layered transport assertions (router\n * pool-wiring tests, telemetry inspectors) can walk one level deep —\n * same pattern PoolAwareLlmClient uses for its inner transport.\n */\n readonly inner: LlmClient;\n constructor(inner: LlmClient) {\n this.inner = inner;\n this.name = inner.name;\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // Re-check gate on every call — env vars can change between calls and\n // the cost is negligible relative to a network roundtrip.\n if (!isGateOn()) {\n return yield* this.inner.stream(request, signal);\n }\n const parsed = parseOverrideOrWarnOnce();\n if (parsed === undefined) {\n return yield* this.inner.stream(request, signal);\n }\n // Active: synthesize response without calling the real client.\n if (parsed.status >= 400) {\n throw mapOpenAICompatibleError({\n providerId: this.name,\n status: parsed.status,\n body: parsed.body,\n headers: undefined,\n endpoint: \"/v1/chat/completions\",\n });\n }\n const text = extractText(parsed.body);\n yield { type: \"text_delta\", text };\n // theokit#144: no `stop` event — the reason travels on the finish value below.\n return {\n stopReason: \"end_turn\",\n text,\n toolCalls: [],\n inputTokens: 0,\n outputTokens: 0,\n };\n }\n}\n\nfunction isGateOn(): boolean {\n return process.env[ENV_GATE_KEY] === ENV_GATE_VALUE;\n}\n\nlet warnedInvalidJson = false;\n\nfunction parseOverrideOrWarnOnce(): ParsedOverride | undefined {\n const raw = process.env[ENV_OVERRIDE_KEY];\n if (raw === undefined || raw.length === 0) return undefined;\n let candidate: unknown;\n try {\n candidate = JSON.parse(raw);\n } catch (_err) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n if (candidate === null || typeof candidate !== \"object\") {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n const obj = candidate as { status?: unknown; body?: unknown };\n if (typeof obj.status !== \"number\" || !Number.isFinite(obj.status)) {\n warnInvalidJsonOnce(raw);\n return undefined;\n }\n return { status: obj.status, body: obj.body };\n}\n\nfunction warnInvalidJsonOnce(_raw: string): void {\n if (warnedInvalidJson) return;\n warnedInvalidJson = true;\n diag(\n `[theokit-sdk] ${ENV_OVERRIDE_KEY} is set but value is not valid JSON of shape ` +\n `\\`{\"status\": number, \"body\": object | string}\\`. Falling back to real LLM call. ` +\n `This warning is shown once per process.\\n`,\n );\n}\n\n/**\n * Extract textual content from an arbitrary body. Supports:\n * - plain string: returned as-is\n * - OpenAI shape: `body.choices[0].message.content` (most common)\n * - object with `text` field: `body.text`\n * - everything else: empty string (caller can still inspect parsed.body if needed)\n */\nfunction extractText(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const fromOpenAi = readOpenAiContent(body);\n if (fromOpenAi !== undefined) return fromOpenAi;\n const obj = body as { text?: unknown };\n if (typeof obj.text === \"string\") return obj.text;\n return \"\";\n}\n\nfunction readOpenAiContent(body: unknown): string | undefined {\n const obj = body as { choices?: unknown };\n if (!Array.isArray(obj.choices) || obj.choices.length === 0) return undefined;\n const first = obj.choices[0] as { message?: { content?: unknown } } | undefined;\n const content = first?.message?.content;\n if (typeof content === \"string\") return content;\n return undefined;\n}\n\n/**\n * Test-only reset for the one-shot stderr warning. Mirrors the D187\n * `_resetNoAuthApiKeyWarnings` pattern.\n *\n * @internal\n */\nexport function _resetFaultInjectionWarnings(): void {\n warnedInvalidJson = false;\n}\n","/**\n * Ollama-specific HTTP/transport error mapper (T1.1, ADR D185).\n *\n * Sits ABOVE the generic OpenAI-compatible mapper for `providerId: \"ollama\"`.\n * Returns `undefined` when the error doesn't match an Ollama-specific\n * pattern — caller (OpenAIClient) then falls back to the generic mapper.\n *\n * Surfaces 3 Ollama-specific failure modes with actionable messages\n * targeted at non-technical users (CLAUDE.md primary persona):\n *\n * 1. **Transport-level `ECONNREFUSED` / `ENOTFOUND`** → \"Run `ollama serve`\"\n * 2. **HTTP 404 with `not found, try pulling`** → \"Run `ollama pull <model>`\"\n * 3. **HTTP 503 with `model is loading`** → retryable (model warming up)\n *\n * @internal\n */\n\nimport { ConfigurationError, NetworkError, type TheokitAgentError } from \"../../errors.js\";\nimport { buildErrorMetadata } from \"./shared.js\";\n\ninterface MapOllamaTransportArgs {\n providerId: string;\n cause: unknown;\n endpoint: string;\n}\n\ninterface MapOllamaHttpArgs {\n providerId: string;\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\n/**\n * Maps fetch-level failures (Node TypeError with `cause.code`). Returns\n * `undefined` for anything that isn't `ECONNREFUSED` / `ENOTFOUND` so\n * the caller can re-throw the original error untouched.\n */\nexport function mapOllamaTransportError(\n args: MapOllamaTransportArgs,\n): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n const causeCode = extractCauseCode(args.cause);\n if (causeCode !== \"ECONNREFUSED\" && causeCode !== \"ENOTFOUND\") return undefined;\n\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"network\",\n status: 0,\n headers: undefined,\n body: { cause: causeCode },\n });\n return new ConfigurationError(\n \"Ollama is not reachable. Run `ollama serve` to start the local runtime, \" +\n \"or set OLLAMA_HOST to point at a remote Ollama server.\",\n { code: \"ollama_unreachable\", metadata },\n );\n}\n\n/**\n * Maps HTTP-level Ollama failures. Returns `undefined` for status codes\n * that aren't Ollama-specific so the caller falls back to the generic\n * OpenAI-compatible mapper.\n */\nexport function mapOllamaHttpError(args: MapOllamaHttpArgs): TheokitAgentError | undefined {\n if (args.providerId !== \"ollama\") return undefined;\n\n const errString = extractErrorString(args.body).toLowerCase();\n\n // 404 + \"not found, try pulling\" → model not pulled.\n if (args.status === 404 && errString.includes(\"not found\") && errString.includes(\"pull\")) {\n const modelHint = extractModelName(errString);\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"model_unavailable\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n const pullCmd = modelHint !== undefined ? `ollama pull ${modelHint}` : \"ollama pull <model>\";\n return new ConfigurationError(\n `Ollama model is not pulled. Run \\`${pullCmd}\\` to download it first.`,\n { code: \"ollama_model_not_pulled\", metadata },\n );\n }\n\n // 503 + \"model is loading\" → retryable transient.\n if (args.status === 503 && errString.includes(\"model is loading\")) {\n const metadata = buildErrorMetadata({\n provider: \"ollama\",\n endpoint: args.endpoint,\n code: \"server_error\",\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n // NetworkError isRetryable: true (default per errors.ts contract).\n return new NetworkError(\n \"Ollama model is loading. Retry in a few seconds — Ollama is warming up the model into memory.\",\n { code: \"ollama_model_loading\", metadata },\n );\n }\n\n return undefined;\n}\n\nfunction extractCauseCode(cause: unknown): string | undefined {\n if (cause === null || typeof cause !== \"object\") return undefined;\n // Native fetch wraps in TypeError(\"fetch failed\") with `cause` chain.\n const directCode = (cause as { code?: unknown }).code;\n if (typeof directCode === \"string\") return directCode;\n const nested = (cause as { cause?: unknown }).cause;\n if (nested !== undefined) return extractCauseCode(nested);\n return undefined;\n}\n\nfunction extractErrorString(body: unknown): string {\n if (typeof body === \"string\") return body;\n if (body === null || typeof body !== \"object\") return \"\";\n const err = (body as { error?: unknown }).error;\n if (typeof err === \"string\") return err;\n return \"\";\n}\n\n/** Pull the model name out of e.g. `model 'llama3.2' not found, try pulling it first`. */\nfunction extractModelName(errString: string): string | undefined {\n const match = errString.match(/'([^']+)'/);\n return match?.[1];\n}\n","/**\n * Ollama native API client (T8.1 follow-up, ADR D191).\n *\n * Targets Ollama's native `/api/chat` endpoint with NDJSON streaming.\n * Critical for **tool calling** — per peer-project upstream warning, the\n * OpenAI-compat `/v1/chat/completions` endpoint BREAKS tool calling in\n * Ollama (models emit raw tool JSON as text instead of structured\n * `tool_calls` blocks). Mirrors peer-project `extensions/ollama/src/stream.ts`.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport { collapseSystemText, makeLlmFinish } from \"./finish.js\";\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport { wrapTransportError } from \"./transport-error.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface OllamaNativeClientOptions {\n /** Optional API key for Ollama Cloud / reverse-proxy. Local Ollama ignores `Authorization`. */\n apiKey?: string;\n /** Base URL. Default `http://localhost:11434`. `/v1` suffix is stripped automatically. */\n baseUrl?: string;\n fetch?: typeof fetch;\n}\n\ninterface OllamaToolCall {\n function: {\n name: string;\n arguments: Record<string, unknown> | string;\n };\n}\n\ninterface OllamaChatChunk {\n message?: {\n role?: \"assistant\";\n content?: string;\n tool_calls?: OllamaToolCall[];\n };\n done?: boolean;\n done_reason?: string;\n prompt_eval_count?: number;\n eval_count?: number;\n}\n\ninterface OllamaChatMessage {\n role: \"system\" | \"user\" | \"assistant\" | \"tool\";\n content: string;\n tool_calls?: OllamaToolCall[];\n tool_name?: string;\n}\n\ninterface OllamaTool {\n type: \"function\";\n function: {\n name: string;\n description: string;\n parameters: Record<string, unknown>;\n };\n}\n\nexport class OllamaNativeClient implements LlmClient {\n readonly name = \"ollama\";\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OllamaNativeClientOptions) {\n // Strip `/v1` if user mistakenly included it (peer-project guard).\n const raw = (options.baseUrl ?? \"http://localhost:11434\").replace(/\\/+$/, \"\");\n this.baseUrl = raw.replace(/\\/v1$/i, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+NDJSON handshake + accumulator is intentionally one block (mirrors openai.ts)\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (this.options.apiKey !== undefined && this.options.apiKey.length > 0) {\n headers.authorization = `Bearer ${this.options.apiKey}`;\n }\n const body = buildOllamaChatBody(request);\n const url = `${this.baseUrl}/api/chat`;\n\n let response: Response;\n try {\n response = await this.fetchImpl(url, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(body),\n });\n } catch (fetchErr) {\n const mapped = mapOllamaTransportError({\n providerId: \"ollama\",\n cause: fetchErr,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n // A raw fetch error must NOT leave this file. `isTransientError` is\n // `err instanceof TheokitAgentError && err.isRetryable`, and router.ts wraps every resolved\n // client in RetryingLlmClient — so a foreign error is non-transient BY CONTRACT and a dropped\n // connection to a local Ollama, the most ordinary transient failure there is, was never\n // retried. openai.ts:183 records this same bug being fixed for the other transports and names\n // Ollama as the one that still had it. `wrapTransportError` passes AbortError and any\n // TheokitAgentError through untouched, so it cannot relabel an already-mapped provider error.\n throw wrapTransportError(fetchErr, { providerId: \"ollama\", endpoint: \"/api/chat\" });\n }\n\n if (!response.ok) {\n const text = await response.text().catch(() => \"\");\n let bodyJson: unknown = text;\n try {\n bodyJson = JSON.parse(text);\n } catch {\n /* not JSON */\n }\n const mapped = mapOllamaHttpError({\n providerId: \"ollama\",\n status: response.status,\n body: bodyJson,\n headers: response.headers,\n endpoint: \"/api/chat\",\n });\n if (mapped !== undefined) throw mapped;\n // A status the Ollama body dialect does not recognise still has an HTTP meaning, and that\n // meaning lives in ONE place — the shared RFC 9110 ladder the four provider mappers delegate\n // to. Reaching for it here rather than writing a sixth copy is the point of that unification;\n // a bare `new Error` would be outside the hierarchy exactly like the raw fetch error above.\n throw mapOpenAICompatibleError({\n providerId: \"ollama\",\n status: response.status,\n body: bodyJson,\n headers: response.headers,\n endpoint: \"/api/chat\",\n });\n }\n\n const accumulator = new OllamaStreamAccumulator();\n if (response.body === null) {\n return accumulator.finish();\n }\n for await (const chunk of parseNdjsonStream(response.body, signal)) {\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n if (chunk.done === true) break;\n }\n return accumulator.finish();\n }\n}\n\nclass OllamaStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private readonly toolCalls: LlmToolCallPart[] = [];\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON chunk dispatch — text delta + tool_call append + finish-reason mapping is one cohesive accumulator (mirrors openai.ts OpenAIStreamAccumulator.consume).\n consume(chunk: OllamaChatChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n if (chunk.prompt_eval_count !== undefined) this.inputTokens = chunk.prompt_eval_count;\n if (chunk.eval_count !== undefined) this.outputTokens = chunk.eval_count;\n const msg = chunk.message;\n if (msg?.content !== undefined && msg.content.length > 0) {\n this.text += msg.content;\n events.push({ type: \"text_delta\", text: msg.content });\n }\n if (msg?.tool_calls !== undefined) {\n for (const call of msg.tool_calls) {\n const input =\n typeof call.function.arguments === \"string\"\n ? parseOllamaToolArguments(call.function.arguments)\n : call.function.arguments;\n this.toolCalls.push({\n type: \"tool_use\",\n id: `ollama_call_${this.toolCalls.length + 1}`,\n name: call.function.name,\n input,\n });\n }\n }\n if (chunk.done === true && chunk.done_reason !== undefined) {\n this.stopReason = mapOllamaDoneReason(chunk.done_reason, this.toolCalls.length > 0);\n }\n return events;\n }\n\n finish(): LlmFinish {\n if (this.toolCalls.length > 0 && this.stopReason === \"end_turn\") {\n this.stopReason = \"tool_use\";\n }\n return makeLlmFinish({\n stopReason: this.stopReason,\n text: this.text,\n toolCalls: this.toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n });\n }\n}\n\nfunction parseOllamaToolArguments(raw: string): Record<string, unknown> {\n try {\n const parsed = JSON.parse(raw);\n return typeof parsed === \"object\" && parsed !== null ? (parsed as Record<string, unknown>) : {};\n } catch {\n return {};\n }\n}\n\nfunction mapOllamaDoneReason(reason: string, hasToolCalls: boolean): LlmStopReason {\n if (hasToolCalls) return \"tool_use\";\n if (reason === \"length\") return \"max_tokens\";\n if (reason === \"stop\") return \"end_turn\";\n return \"end_turn\";\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: NDJSON line buffering + JSON.parse-with-skip-malformed + signal abort + trailing-buffer flush is one cohesive parser, mirrors peer-project's parseJsonLineStream.\nasync function* parseNdjsonStream(\n body: ReadableStream<Uint8Array>,\n signal: AbortSignal,\n): AsyncGenerator<OllamaChatChunk, void, void> {\n const reader = body.getReader();\n const decoder = new TextDecoder(\"utf-8\");\n let buffer = \"\";\n try {\n while (true) {\n if (signal.aborted) return;\n const { done, value } = await reader.read();\n if (done) break;\n buffer += decoder.decode(value, { stream: true });\n const lines = buffer.split(\"\\n\");\n buffer = lines.pop() ?? \"\";\n for (const line of lines) {\n const trimmed = line.trim();\n if (trimmed.length === 0) continue;\n try {\n yield JSON.parse(trimmed) as OllamaChatChunk;\n } catch {\n /* skip malformed NDJSON line */\n }\n }\n }\n const tail = buffer.trim();\n if (tail.length > 0) {\n try {\n yield JSON.parse(tail) as OllamaChatChunk;\n } catch {\n /* ignore */\n }\n }\n } finally {\n // T3.2 + T3.3 — mirror sse.ts: cancel the underlying body stream on\n // every exit path (abort, normal close, consumer break, consumer\n // throw). Without this the upstream Ollama HTTP TCP socket stays in\n // CLOSE_WAIT until the OS times it out. cancel() on a finished stream\n // is a no-op so always-cancel is safe.\n try {\n await reader.cancel();\n } catch {\n // best-effort — already cancelled OR upstream closed\n }\n reader.releaseLock();\n }\n}\n\n/**\n * T3.5 — collapse the wider `LlmRequest.system` shape into the legacy\n * single-string form Ollama expects.\n *\n * @internal\n */\nconst ollamaSystemText = collapseSystemText;\n\nfunction buildOllamaChatBody(request: LlmRequest): Record<string, unknown> {\n const messages: OllamaChatMessage[] = [];\n const systemText = ollamaSystemText(request.system);\n if (systemText.length > 0) {\n messages.push({ role: \"system\", content: systemText });\n }\n for (const message of request.messages) {\n for (const out of toOllamaMessages(message)) messages.push(out);\n }\n const tools = toOllamaTools(request.tools);\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n messages,\n // ADR D192: 24h keep_alive prevents Ollama from evicting the chat model\n // when other models (embeddings, judges) are loaded between turns.\n // Cuts cold-load latency from 20-30s to single-digit ms per turn.\n keep_alive: process.env.OLLAMA_KEEP_ALIVE ?? \"24h\",\n };\n if (tools.length > 0) body.tools = tools;\n const opts: Record<string, unknown> = {};\n if (request.maxTokens !== undefined) opts.num_predict = request.maxTokens;\n if (request.temperature !== undefined) opts.temperature = request.temperature;\n if (Object.keys(opts).length > 0) body.options = opts;\n return body;\n}\n\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 3-role transformation (system/user/assistant) with tool_result→tool role demotion + tool_use→tool_calls promotion is one cohesive mapper; splitting hurts readability.\nfunction toOllamaMessages(message: LlmMessage): OllamaChatMessage[] {\n if (message.role === \"system\") {\n return [{ role: \"system\", content: joinTextParts(message) }];\n }\n if (message.role === \"user\") {\n // M35 — the ollama-native wire has no image content channel here. Fail fast rather than silently\n // dropping an attached image (error-handling.md: no silent drop); OpenAI/OpenRouter carries images.\n if (message.content.some((p) => p.type === \"image\")) {\n throw new ConfigurationError(\n \"image input is not supported on the ollama-native provider; use an OpenAI/OpenRouter model for multimodal turns\",\n { code: \"ollama_image_unsupported\" },\n );\n }\n const out: OllamaChatMessage[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n // SE7 — string-only tool role: text blocks flatten; image fails fast.\n content: toStringToolResultContent(part.content, \"ollama\"),\n tool_name: part.toolUseId,\n });\n }\n }\n const userText = joinTextParts(message);\n if (userText.length > 0) out.push({ role: \"user\", content: userText });\n return out;\n }\n // assistant\n const text = joinTextParts(message);\n const toolCalls: OllamaToolCall[] = [];\n for (const part of message.content) {\n if (part.type === \"tool_use\") {\n toolCalls.push({\n function: { name: part.name, arguments: part.input },\n });\n }\n }\n const msg: OllamaChatMessage = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) msg.tool_calls = toolCalls;\n return [msg];\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n}\n\nfunction toOllamaTools(tools: LlmRequest[\"tools\"]): OllamaTool[] {\n if (tools === undefined || tools.length === 0) return [];\n return tools.map((tool) => ({\n type: \"function\",\n function: {\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n },\n }));\n}\n","/**\n * `THEOKIT_API_BASE_URL`, read in one place.\n *\n * A leaf on purpose: `internal/http.ts` resolves the SDK's endpoint from it, and so do the cloud\n * agent and `internal/agent/helpers.ts`. It used to live in `runtime/fixtures/fixture-mode.ts`,\n * which meant a production HTTP module resolved its base URL out of a module named for test\n * fixtures. `fixture-mode.ts` is now one of its four consumers rather than its owner — it needs the\n * value because an explicitly configured base URL short-circuits fixture mode.\n *\n * Nothing is imported here beyond the environment, so no consumer risks a cycle through it.\n *\n * @internal\n */\n\n/**\n * Returns the base URL configured via `THEOKIT_API_BASE_URL`, or `undefined`\n * when not set.\n *\n * @internal\n */\nexport function getConfiguredBaseUrl(): string | undefined {\n const value = process.env.THEOKIT_API_BASE_URL;\n if (value === undefined || value.length === 0) return undefined;\n return value;\n}\n","import {\n AuthenticationError,\n ConfigurationError,\n IntegrationNotConnectedError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../errors.js\";\nimport { getConfiguredBaseUrl } from \"./base-url.js\";\n\n/**\n * Default base URL used when neither `THEOKIT_API_BASE_URL` nor an explicit\n * override is provided. The fixture-mode short-circuit normally bypasses this\n * for `theo_test_*` keys; consumers with real keys hit this URL.\n *\n * @internal\n */\nexport const DEFAULT_BASE_URL = \"https://api.usetheo.dev\";\n\n/**\n * HTTP request options accepted by {@link httpRequest}.\n *\n * @internal\n */\nexport interface HttpRequestOptions {\n apiKey: string;\n method?: \"GET\" | \"POST\" | \"PUT\" | \"PATCH\" | \"DELETE\";\n body?: unknown;\n /** Override the default `fetch` (useful for tests / instrumentation). */\n fetchFn?: typeof globalThis.fetch;\n /** Extra headers merged into the default set. */\n headers?: Record<string, string>;\n}\n\n/**\n * Server-side error envelope (`{ error: { code, message, ... } }` or a flat\n * shape) parsed off non-2xx responses.\n *\n * @internal\n */\ninterface ErrorEnvelope {\n code?: string;\n message?: string;\n protoErrorCode?: string;\n provider?: string;\n helpUrl?: string;\n}\n\n/**\n * Resolve the effective base URL (explicit env > default).\n *\n * @internal\n */\nexport function resolveBaseUrl(): string {\n return getConfiguredBaseUrl() ?? DEFAULT_BASE_URL;\n}\n\n/**\n * Perform an authenticated JSON HTTP request, mapping non-2xx responses to\n * the public typed-error hierarchy. Throws subclasses of `TheokitAgentError`\n * on failure.\n *\n * @internal\n */\nexport async function httpRequest<T>(path: string, options: HttpRequestOptions): Promise<T> {\n const url = `${resolveBaseUrl()}${path}`;\n const fetchFn = options.fetchFn ?? globalThis.fetch;\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${options.apiKey}`,\n ...(options.headers ?? {}),\n };\n const body = options.body !== undefined ? JSON.stringify(options.body) : undefined;\n\n const response = await safeFetch(fetchFn, url, {\n method: options.method ?? \"GET\",\n headers,\n body,\n });\n\n if (!response.ok) {\n const parsed = await safeParseJsonResponse(response);\n throw mapHttpStatusToError(response.status, parsed);\n }\n\n return (await safeParseJsonResponse(response)) as T;\n}\n\nasync function safeFetch(\n fetchFn: typeof globalThis.fetch,\n url: string,\n init: RequestInit,\n): Promise<Response> {\n try {\n return await fetchFn(url, init);\n } catch (cause) {\n throw new NetworkError(\"HTTP request failed\", { code: \"network_error\", cause });\n }\n}\n\nasync function safeParseJsonResponse(response: Response): Promise<unknown> {\n try {\n return await response.json();\n } catch {\n return undefined;\n }\n}\n\n/**\n * Read the body of a NON-OK response for an error mapper: JSON when it parses, the raw\n * text otherwise (never throws, never `undefined` — an unreadable stream reads as `\"\"`).\n *\n * Distinct from {@link safeParseJsonResponse}, which drops a non-JSON body to `undefined`.\n * Error mappers need the raw text preserved: it is what surfaces on the mapped error's\n * `raw` field when a provider answers with HTML or a bare string.\n *\n * @internal\n */\nexport async function readErrorResponseBody(response: Response): Promise<unknown> {\n const text = await response.text().catch(() => \"\");\n try {\n return JSON.parse(text);\n } catch {\n // not JSON — keep as string for the mapper's raw field\n return text;\n }\n}\n\n/**\n * Translate an HTTP error response into a typed `TheokitAgentError` subclass.\n *\n * @internal\n */\nexport function mapHttpStatusToError(status: number, body: unknown): TheokitAgentError {\n const envelope = extractErrorEnvelope(body);\n const message = envelope.message ?? `HTTP ${status}`;\n const errorOptions = {\n code: envelope.code,\n protoErrorCode: envelope.protoErrorCode,\n cause: body,\n };\n\n // The envelope is a Theokit-API contract and outranks the status: the server has\n // told us WHICH condition this is, and the status is only its HTTP shadow.\n if (envelope.code === \"integration_not_connected\") {\n return new IntegrationNotConnectedError(message, {\n provider: envelope.provider ?? \"unknown\",\n helpUrl: envelope.helpUrl ?? \"\",\n code: envelope.code,\n cause: body,\n });\n }\n return statusToError(status, message, errorOptions);\n}\n\n/**\n * The status ladder, split out from the envelope handling above.\n *\n * Two responsibilities lived in one function and it crossed the cognitive-complexity\n * ceiling the moment the 408 arm was added. They are genuinely different questions —\n * \"did the server name the condition?\" and \"what does this status mean?\" — and only\n * the second one grows as statuses are added.\n */\nfunction statusToError(\n status: number,\n message: string,\n errorOptions: { code?: string; protoErrorCode?: string; cause: unknown },\n): TheokitAgentError {\n if (status === 401 || status === 403) {\n return new AuthenticationError(message, errorOptions);\n }\n if (status === 429) {\n return new RateLimitError(message, errorOptions);\n }\n if (status === 408) {\n // 408 Request Timeout is TRANSIENT, not a caller mistake: the request did not arrive in time\n // and the same request may succeed on retry. Without this arm 408 fell through to the generic\n // 4xx branch below and came back as a non-retryable ConfigurationError, while all four provider\n // mappers — openai-compatible.ts:59, anthropic.ts:67, bedrock.ts:71, vertex.ts:54 — already map\n // it to a retryable NetworkError with a `timeout` code. This ladder is the fifth copy of that\n // knowledge and it was the copy that drifted.\n return new NetworkError(message, { ...errorOptions, code: errorOptions.code ?? \"timeout\" });\n }\n if (status >= 400 && status < 500) {\n return new ConfigurationError(message, errorOptions);\n }\n if (status >= 500) {\n return new NetworkError(message, errorOptions);\n }\n return new UnknownAgentError(message, errorOptions);\n}\n\nfunction extractErrorEnvelope(body: unknown): ErrorEnvelope {\n if (!body || typeof body !== \"object\") return {};\n const record = body as Record<string, unknown>;\n const inner = record.error;\n const source: unknown = inner && typeof inner === \"object\" ? inner : record;\n return readEnvelopeFields(source as Record<string, unknown>);\n}\n\nfunction readEnvelopeFields(record: Record<string, unknown>): ErrorEnvelope {\n return {\n code: pickString(record, \"code\"),\n message: pickString(record, \"message\"),\n protoErrorCode: pickString(record, \"protoErrorCode\"),\n provider: pickString(record, \"provider\"),\n helpUrl: pickString(record, \"helpUrl\"),\n };\n}\n\nfunction pickString(record: Record<string, unknown>, key: string): string | undefined {\n const value = record[key];\n return typeof value === \"string\" ? value : undefined;\n}\n","/**\n * Hermes tool-call extraction — leaked-dialect safe-parse (theokit#58 follow-up).\n *\n * Some models (qwen3-coder via OpenRouter, OpenAI-compatible API) intermittently emit their\n * Hermes tool-call dialect as assistant TEXT content instead of native `tool_calls`:\n *\n * <function=NAME><parameter=KEY>VALUE</parameter>...</function></tool_call>\n *\n * When that happens the provider sends ZERO native tool_calls, so the agent loop sees an\n * `end_turn` with no tools and the intended call is silently lost. This pure helper recovers\n * those calls from the content so the loop can execute them.\n *\n * OPT-IN only (`ProviderProfile.extractToolCallsFromContent`) and run ONLY when the provider\n * emitted no native tool_calls. A code assistant can legitimately print a literal `<function=` in a\n * fenced code block, so recovery is gated TWICE: the per-route flag is the coarse enable, and the R5\n * request-scoped `allowedToolNames` allowlist below is the precise false-positive guard — a block is\n * promoted only when its name is a real tool in the current request. The size-guard (no native call)\n * prevents double-counting a real native call.\n *\n * Fail-open like `stripThinkBlocks`: a partial/unclosed block (missing the `</tool_call>`\n * marker) is NOT matched — it stays in the residual text and yields no tool call, so a corrupted\n * stream never fabricates a call from junk.\n *\n * Accepted best-effort limit (mirrors the consumer-side stripper EC-5): if a parameter VALUE\n * contains the literal substring `</tool_call>`, the non-greedy block scanner closes at that inner\n * occurrence. This errs toward NOT over-consuming text — same class as `strip-think`'s EC-10.\n *\n * Recovered parameter values are ALWAYS strings: the text dialect carries no per-param type info, so\n * `<parameter=count>5</parameter>` yields `{ count: \"5\" }`, not `{ count: 5 }`. A downstream schema\n * (e.g. Zod) coercing/validating the tool input is the right place to type it — a mismatch there\n * fails clear (typed tool error), never silently. This differs from the native `tool_calls` path,\n * whose `arguments` is JSON and is parsed into typed values.\n *\n * @internal\n */\nimport { sanitizeToolInput } from \"../../sanitize/sanitize-tool-input.js\";\nimport type { LlmToolCallPart } from \"./types.js\";\n\n/** A full leaked block: `<function=NAME> …inner… </tool_call>`. The closing `</tool_call>` is\n * required (fail-open: a partial block at stream end is left as text). Non-greedy inner. */\nconst HERMES_BLOCK = /<function=\\s*([^>\\s]+)\\s*>([\\s\\S]*?)<\\/tool_call>/g;\n/** A single parameter inside a block: `<parameter=KEY>VALUE</parameter>`. Non-greedy value. */\nconst HERMES_PARAM = /<parameter=\\s*([^>\\s]+)\\s*>([\\s\\S]*?)<\\/parameter>/g;\n\nexport interface HermesExtractResult {\n /** Recovered tool calls (empty when none matched). */\n toolCalls: LlmToolCallPart[];\n /** Content with every PROMOTED block removed + trimmed; gated-out and unmatched blocks stay visible. */\n residualText: string;\n /** Names of well-formed leaked blocks that WERE dropped by the request-scoped allowlist (R5) — a\n * block whose name is not a tool in the current request. Empty when no allowlist was applied or\n * nothing was gated out. The caller logs these so a guard firing is observable in production. */\n droppedNames: string[];\n}\n\n/**\n * Recover Hermes-dialect tool calls leaked into assistant text. `makeId` supplies a unique id per\n * recovered call (the provider gave none). Pure — no side effects.\n *\n * @param allowedToolNames R5 request-scoped gate — when provided, only a block whose name is in the\n * set is promoted (exact, case-sensitive); an empty set promotes nothing; `undefined` recovers all\n * (back-compat). Gated-out blocks stay as visible text (they are not tool calls).\n * @internal\n */\nexport function extractHermesToolCalls(\n content: string,\n makeId: () => string,\n allowedToolNames?: ReadonlySet<string>,\n): HermesExtractResult {\n // R5 request-scoped gate: promote a block only when its name is a real tool in the current request\n // (exact, case-sensitive — peer-project payload.ts:190). `undefined` allowlist → recover-all (back-compat\n // for direct callers); an EMPTY set recovers nothing (a request with no tools has nothing legitimate\n // to recover). The name is already trimmed above, so the gate and the emitted call agree (EC-1).\n const isPromoted = (name: string): boolean =>\n name.length > 0 && (allowedToolNames === undefined || allowedToolNames.has(name));\n const toolCalls: LlmToolCallPart[] = [];\n const droppedNames: string[] = [];\n for (const block of content.matchAll(HERMES_BLOCK)) {\n const name = (block[1] ?? \"\").trim();\n if (!isPromoted(name)) {\n // A well-formed leaked block gated out by a defined allowlist — record it for observability.\n if (name.length > 0 && allowedToolNames !== undefined) droppedNames.push(name);\n continue;\n }\n toolCalls.push({\n type: \"tool_use\",\n id: makeId(),\n name,\n input: parseHermesParams(block[2] ?? \"\"),\n });\n }\n // EC-5: strip ONLY promoted blocks — a gated-out block (e.g. a `<function=example>` in a code fence\n // whose name is not a request tool) keeps its text visible instead of being silently deleted.\n const residualText =\n toolCalls.length === 0\n ? content\n : content\n .replace(HERMES_BLOCK, (full, rawName) =>\n isPromoted((rawName ?? \"\").trim()) ? \"\" : full,\n )\n .trim();\n return { toolCalls, residualText, droppedNames };\n}\n\n/** Parse the `<parameter=KEY>VALUE</parameter>` pairs inside a block's inner text into an input map.\n *\n * Value hygiene is DELEGATED to the public `sanitizeToolInput` primitive (`@theokit/sdk/sanitize`,\n * trim-only) so the internal recovery and the public sanitizer share ONE source of truth (DRY) — the\n * P0 bug (`\\n`-wrapped paths → `not_found` → stalled multi-read loops) was born from an ad-hoc,\n * un-shared trim. Keys are trimmed here (the regex already excludes whitespace from the key capture);\n * values stay strings (the doc-comment invariant), trimmed by the shared primitive. */\nfunction parseHermesParams(inner: string): Record<string, unknown> {\n const input: Record<string, unknown> = {};\n for (const param of inner.matchAll(HERMES_PARAM)) {\n const key = param[1];\n const value = param[2];\n if (key === undefined || value === undefined) continue;\n input[key.trim()] = value;\n }\n return sanitizeToolInput(input, { trim: true }).value;\n}\n\nconst STREAM_MARKER = \"<function=\";\nconst DEFAULT_STREAM_BUFFER_CAP = 8192;\n\nconst isStreamWs = (c: string | undefined): boolean =>\n c === \" \" || c === \"\\t\" || c === \"\\n\" || c === \"\\r\";\n\n/**\n * R7 stream-boundary suppression FSM. Classifies a suspicion buffer (accumulated streamed content)\n * as `\"possible\"` — it could still become a `<function=NAME>` tool call for a request tool, so the\n * caller HOLDS it (emits no text_delta) — or `\"impossible\"` — confirmed NOT a tool call, so the\n * caller FLUSHES it as visible text. The marker match is CASE-SENSITIVE, identical to `HERMES_BLOCK`\n * (no `/i`), so the FSM never holds a block `extractHermesToolCalls` would not recover (EC-1). An\n * empty allowlist promotes nothing (`\"impossible\"`); over `cap` while still tool-call-like fails open\n * to `\"impossible\"` (flush) so a never-closing marker cannot grow unbounded. Pure — never throws.\n * @internal\n */\nexport function streamToolCallBufferState(\n held: string,\n allowedToolNames: ReadonlySet<string>,\n cap: number = DEFAULT_STREAM_BUFFER_CAP,\n): \"possible\" | \"impossible\" {\n if (allowedToolNames.size === 0) return \"impossible\";\n const t = held.trimStart();\n if (t.length < STREAM_MARKER.length) {\n // Still building the marker itself (e.g. \"<fun\").\n return STREAM_MARKER.startsWith(t) ? \"possible\" : \"impossible\";\n }\n if (!t.startsWith(STREAM_MARKER)) return \"impossible\";\n const parsed = parseStreamMarkerName(t);\n if (parsed === \"building\") return \"possible\";\n if (parsed === \"invalid\") return \"impossible\";\n const nameOk = parsed.complete\n ? allowedToolNames.has(parsed.name)\n : someToolNameStartsWith(allowedToolNames, parsed.name);\n if (!nameOk) return \"impossible\";\n return held.length > cap ? \"impossible\" : \"possible\";\n}\n\n/** Read the (partial) tool name after a confirmed `<function=` marker (skipping the regex `\\s*`).\n * `\"building\"` = only the marker(+ws) so far; `\"invalid\"` = a `>`/other char with no name. */\nfunction parseStreamMarkerName(\n t: string,\n): { name: string; complete: boolean } | \"building\" | \"invalid\" {\n let cursor = STREAM_MARKER.length;\n while (cursor < t.length && isStreamWs(t[cursor])) cursor += 1;\n const nameStart = cursor;\n while (cursor < t.length && t[cursor] !== \">\" && !isStreamWs(t[cursor])) cursor += 1;\n const name = t.slice(nameStart, cursor);\n if (name.length === 0) return cursor >= t.length ? \"building\" : \"invalid\";\n return { name, complete: cursor < t.length && t[cursor] === \">\" };\n}\n\n/** True when any allowed tool name starts with `prefix` — the streaming partial-name probe (R7 D2). */\nfunction someToolNameStartsWith(allowedToolNames: ReadonlySet<string>, prefix: string): boolean {\n for (const name of allowedToolNames) {\n if (name.startsWith(prefix)) return true;\n }\n return false;\n}\n\n/**\n * R7 mixed-delta split: given a suspicion buffer that is NOT itself a possible tool call as a whole,\n * find the first `<` index whose suffix COULD still become a `<function=NAME>` tool call for a request\n * tool — so the caller flushes the definitely-prose prefix and holds only the suspicious suffix (e.g.\n * a `hello <function=read` delta flushes `hello ` and holds `<function=read`). Returns `-1` when no\n * suffix is suspicious (flush the whole buffer). Bounded: scans only `<` positions. @internal\n */\nexport function firstPossibleMarkerStart(\n held: string,\n allowedToolNames: ReadonlySet<string>,\n): number {\n for (let i = held.indexOf(\"<\"); i !== -1; i = held.indexOf(\"<\", i + 1)) {\n if (streamToolCallBufferState(held.slice(i), allowedToolNames) === \"possible\") return i;\n }\n return -1;\n}\n\n/**\n * R7 stateful stream-suppression buffer. Owns the held-content buffer for one stream: `push` feeds a\n * content delta and returns the text to emit now (or `undefined` to HOLD while it could still be a\n * `<function=NAME>` tool call for a request tool); `drain` finalizes at stream end. Extracted from the\n * OpenAI accumulator so the adapter stays thin (G8). @internal\n */\nexport class StreamSuppressionBuffer {\n #held = \"\";\n constructor(private readonly allowedToolNames: ReadonlySet<string>) {}\n\n /** Feed a content delta; returns the text to emit as a `text_delta` now, or `undefined` to hold. */\n push(content: string): string | undefined {\n this.#held += content;\n if (streamToolCallBufferState(this.#held, this.allowedToolNames) === \"possible\")\n return undefined;\n // Whole buffer is not a tool call, but a marker for a request tool may start mid-buffer (prose +\n // marker in one delta) — flush the prose prefix, hold the suspicious suffix.\n const holdStart = firstPossibleMarkerStart(this.#held, this.allowedToolNames);\n if (holdStart > 0) {\n const flush = this.#held.slice(0, holdStart);\n this.#held = this.#held.slice(holdStart);\n return flush;\n }\n const flush = this.#held;\n this.#held = \"\";\n return flush;\n }\n\n /** Drain the held buffer at stream end. `hasNativeCalls` mirrors `finish()`'s size-guard: when\n * native `tool_calls` exist, `finish()` won't strip the leaked block, so stream the held text WHOLE\n * (keeping `accumulatedText == finish.text`); otherwise strip the recoverable blocks. Idempotent. */\n drain(hasNativeCalls: boolean): string | undefined {\n if (this.#held.length === 0) return undefined;\n const held = this.#held;\n this.#held = \"\";\n if (hasNativeCalls) return held;\n const residual = extractHermesToolCalls(held, () => \"held\", this.allowedToolNames).residualText;\n return residual.length > 0 ? residual : undefined;\n }\n}\n","/**\n * Mapping from `LlmMessage` to OpenAI's message format.\n *\n * Extracted from `openai.ts` in M75 because the G8 gate (<= 400 LoC) caught it at 427 — PRE-EXISTING debt,\n * which stayed invisible while `knip` failed before the gate ran.\n *\n * The seam is not arbitrary: these five functions form ONE responsibility — translating our\n * message format into OpenAI's wire format — and none of them knows about transport, streaming or\n * request policy. The rest of `openai.ts` handles that.\n */\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport type { LlmMessage } from \"./types.js\";\n\nexport function toOpenAIMessages(message: LlmMessage): Array<Record<string, unknown>> {\n if (message.role === \"system\") return [systemMessage(message)];\n if (message.role === \"user\") return userOrToolMessages(message);\n return [assistantMessage(message)];\n}\n\nfunction systemMessage(message: LlmMessage): Record<string, unknown> {\n return { role: \"system\", content: joinTextParts(message) };\n}\n\nfunction joinTextParts(message: LlmMessage): string {\n return message.content\n .filter((part) => part.type === \"text\")\n .map((part) => (part as { text: string }).text)\n .join(\"\\n\");\n}\n\n/**\n * Translate a logical `user` turn. If the turn contains tool_result parts\n * they must be emitted as `role: \"tool\"` messages with matching\n * `tool_call_id` — OpenAI rejects tool_calls followed by a user message.\n * Plain text parts (and any other parts) collapse into a single user\n * message that follows the tool messages.\n */\n// PRE-EXISTING debt, exposed when M75 fixed the Biome config that used to abort before\n// sweeping these files (a nested root under refactor/). It is not new code and was not touched\n// by M75; refactoring SDK internals without review would trade a visible problem for a diff\n// risky. Tracked in usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: see the reason just above\nfunction userOrToolMessages(message: LlmMessage): Array<Record<string, unknown>> {\n const out: Array<Record<string, unknown>> = [];\n for (const part of message.content) {\n if (part.type === \"tool_result\") {\n out.push({\n role: \"tool\",\n tool_call_id: part.toolUseId,\n // SE7 — this wire's tool role is string-only: text blocks flatten; an\n // image block fails fast (ConfigurationError).\n content: toStringToolResultContent(part.content, \"openai\"),\n });\n }\n }\n const userText = joinTextParts(message);\n // M35 — image parts turn the user message into OpenAI/OpenRouter's content-array form\n // (`[{type:\"text\"}, {type:\"image_url\", image_url:{url: data-URL}}]`); text-only stays a plain string.\n const imageParts = message.content.filter(\n (p): p is import(\"./types.js\").LlmImagePart => p.type === \"image\",\n );\n if (imageParts.length > 0) {\n const content: Array<Record<string, unknown>> = [];\n if (userText.length > 0) content.push({ type: \"text\", text: userText });\n for (const img of imageParts) {\n // OpenAI/OpenRouter `image_url` accepts BOTH a data URL (inline base64) and a real https URL.\n const url =\n img.source.type === \"base64\"\n ? `data:${img.source.media_type};base64,${img.source.data}`\n : img.source.url;\n content.push({ type: \"image_url\", image_url: { url } });\n }\n out.push({ role: \"user\", content });\n } else if (userText.length > 0) {\n out.push({ role: \"user\", content: userText });\n }\n return out;\n}\n\nfunction assistantMessage(message: LlmMessage): Record<string, unknown> {\n const text = joinTextParts(message);\n const toolCalls = message.content\n .filter((part) => part.type === \"tool_use\")\n .map((part) => {\n const tc = part as { id: string; name: string; input: Record<string, unknown> };\n return {\n id: tc.id,\n type: \"function\",\n function: { name: tc.name, arguments: JSON.stringify(tc.input) },\n };\n });\n const result: Record<string, unknown> = { role: \"assistant\", content: text };\n if (toolCalls.length > 0) result.tool_calls = toolCalls;\n return result;\n}\n","/**\n * Real OpenAI Chat Completions client. Streams `/v1/chat/completions` and\n * translates delta chunks into our provider-agnostic `LlmEvent`s.\n *\n * Uses native `fetch` only — no `openai` SDK dependency.\n *\n * @internal\n */\n\nimport { NetworkError } from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { mapOllamaHttpError, mapOllamaTransportError } from \"../error-mappers/ollama.js\";\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport { readErrorResponseBody } from \"../http.js\";\nimport {\n collapseSystemText,\n makeLlmFinish,\n mapOpenAIFinish,\n parseToolArguments,\n} from \"./finish.js\";\nimport { extractHermesToolCalls, StreamSuppressionBuffer } from \"./hermes-tool-extract.js\";\nimport { toOpenAIMessages } from \"./openai-messages.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport { wrapTransportError } from \"./transport-error.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\n/**\n * M45 — derive the chat-completions path from the baseUrl: a path already carrying a version segment\n * (`/v1`, `/v1beta`, …) gets `/chat/completions`; host-only (or unparseable) baseUrls keep the legacy\n * `/v1/chat/completions`. Unparseable NEVER throws (H1) — the transport surfaces a typed error at fetch time.\n */\nfunction deriveChatPath(baseUrl: string): string {\n try {\n return /\\/v\\d+[a-z]*(\\/|$)/.test(new URL(baseUrl).pathname)\n ? \"/chat/completions\"\n : \"/v1/chat/completions\";\n } catch {\n return \"/v1/chat/completions\";\n }\n}\n\nexport interface OpenAIClientOptions {\n apiKey: string;\n baseUrl?: string;\n organization?: string;\n fetch?: typeof fetch;\n /**\n * Provider name for error mapping dispatch (T1.1, ADR D185). When set\n * to `\"ollama\"`, transport and HTTP errors go through `mapOllamaTransportError`\n * / `mapOllamaHttpError` for actionable messages before falling back to\n * the generic OpenAI-compatible mapper. Default `\"openai\"`.\n */\n providerName?: string;\n /**\n * Opt-in leaked-dialect safe-parse (theokit#58 follow-up). When `true`, a finish that carries\n * ZERO native `tool_calls` has its assistant text scanned for the Hermes `<function=…></tool_call>`\n * dialect; any recovered calls are surfaced as real `tool_calls` so the loop executes them.\n * Default `false` — a code assistant can legitimately print a literal `<function=` in code text.\n */\n extractToolCallsFromContent?: boolean;\n /**\n * M41 — extra HTTP headers merged into the request (the profile's static `extraHeaders` + a provider\n * `transform.headers(ctx)`). Spread AFTER the base `authorization`/`content-type`, so a provider that owns\n * its auth CAN override them by design (document this on `ProviderTransform.headers`).\n */\n extraHeaders?: Record<string, string>;\n /** M45 — explicit chat-completions path (from `ProviderProfile.chatCompletionsPath`). */\n chatCompletionsPath?: string;\n}\n\ninterface OpenAIDeltaChunk {\n choices?: Array<{\n index: number;\n delta?: {\n content?: string;\n /** OpenRouter unified reasoning delta (issue #47) — streamed separately from `content`. */\n reasoning?: string;\n /**\n * Sibling reasoning field used by some OpenAI-compatible providers (DeepSeek's direct API,\n * many vLLM / LMStudio reasoning parsers). Treated identically to `reasoning` (issue #47,\n * F-domain-2). OpenRouter normalizes to `reasoning`; this is the fallback for non-OpenRouter\n * compat endpoints reached via `baseUrl` override.\n */\n reasoning_content?: string;\n tool_calls?: Array<{\n index: number;\n id?: string;\n function?: { name?: string; arguments?: string };\n }>;\n };\n finish_reason?: string | null;\n }>;\n usage?: {\n prompt_tokens?: number;\n completion_tokens?: number;\n /**\n * OpenAI + OpenRouter extended usage (D376). Anthropic prompt caching\n * surfaces as `prompt_tokens_details.cached_tokens` on OpenRouter passthrough;\n * native OpenAI exposes the same field on `chatcmpl-*` responses.\n */\n prompt_tokens_details?: { cached_tokens?: number };\n completion_tokens_details?: { reasoning_tokens?: number };\n /** Anthropic-on-OpenRouter passes cache_creation_tokens top-level (a peer#10266). */\n cache_creation_input_tokens?: number;\n cache_read_input_tokens?: number;\n };\n /**\n * In-stream provider error. OpenRouter (and some OpenAI-compatible proxies)\n * report auth / quota / rate-limit failures as an HTTP 200 SSE body carrying\n * `data: {\"error\":{\"message\":\"...\",\"code\":401}}` instead of a non-2xx status.\n * Without surfacing this, the round finishes empty and the failure is silent\n * (usetheodev/theocode#31).\n */\n error?: { message?: string; code?: number | string; type?: string };\n}\n\nexport class OpenAIClient implements LlmClient {\n readonly name = \"openai\";\n private readonly baseUrl: string;\n private readonly chatPath: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: OpenAIClientOptions) {\n // M45 review M3 — strip trailing slashes so `…/v1/` (the python-openai-popularized form) joins cleanly.\n this.baseUrl = (options.baseUrl ?? \"https://api.openai.com\").replace(/\\/+$/, \"\");\n // M45 — URL-join rule (kills the /v1/v1 doubling): explicit override > version-segment detection >\n // legacy `/v1/chat/completions`. A baseUrl already carrying a version path segment (…/openai/v1,\n // …/v1beta/openai) gets only `/chat/completions`; host-only baseUrls are byte-identical to before.\n // M45 review H1 — the parse NEVER throws from the constructor: a malformed baseUrl (scheme-less host,\n // empty env var) degrades to the LEGACY path (byte-identical to pre-M45 string concat) and fails, typed,\n // at the first fetch — never poisoning the whole provider chain at construction time.\n this.chatPath = options.chatCompletionsPath ?? deriveChatPath(this.baseUrl);\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n /**\n * Whether this client recovers leaked Hermes tool-call dialect from assistant\n * text (theokit#58 follow-up). Observability for the route→client wiring of\n * `extractToolCallsFromContent`. @internal\n */\n get recoversLeakedToolCalls(): boolean {\n return this.options.extractToolCallsFromContent ?? false;\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: HTTP+SSE handshake + accumulator is intentionally one block\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const headers: Record<string, string> = {\n \"content-type\": \"application/json\",\n authorization: `Bearer ${this.options.apiKey}`,\n };\n if (this.options.organization !== undefined) {\n headers[\"openai-organization\"] = this.options.organization;\n }\n // M41 — merge extra/dynamic headers (spread last: a provider that owns its auth may override base headers).\n if (this.options.extraHeaders !== undefined) Object.assign(headers, this.options.extraHeaders);\n const providerId = this.options.providerName ?? this.name;\n let response: Response;\n try {\n response = await this.fetchImpl(`${this.baseUrl}${this.chatPath}`, {\n method: \"POST\",\n signal,\n headers,\n body: JSON.stringify(buildOpenAIBody(request, providerId)),\n });\n } catch (fetchErr) {\n // T1.1: Ollama-specific transport error mapping (ECONNREFUSED / ENOTFOUND).\n const mapped = mapOllamaTransportError({\n providerId,\n cause: fetchErr,\n endpoint: \"/v1/chat/completions\",\n });\n if (mapped !== undefined) throw mapped;\n // M93 — before this, a raw `throw fetchErr` left here for every provider other than Ollama, and\n // a foreign error is NON-transient by contract (`errors.ts:429`): retry stayed off\n // in the most classic case.\n throw wrapTransportError(fetchErr, { providerId, endpoint: \"/v1/chat/completions\" });\n }\n if (!response.ok) {\n const body = await readErrorResponseBody(response);\n // T1.1: try Ollama-specific HTTP mapper first; falls through to generic.\n const ollamaMapped = mapOllamaHttpError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n if (ollamaMapped !== undefined) throw ollamaMapped;\n // Use the openai-compatible mapper. For OpenAI proper the providerId\n // is \"openai\"; OpenRouter is handled in its own client subclass (see\n // OpenRouterClient if/when added). Providers tagged differently via\n // wrapper clients can pass their own providerId by overriding.\n throw mapOpenAICompatibleError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n }\n\n const accumulator = new OpenAIStreamAccumulator(\n this.options.extractToolCallsFromContent ?? false,\n providerId,\n // R5: request-scoped allowlist — leaked recovery only promotes a block whose name is a tool the\n // model was actually given. Empty set (no tools) recovers nothing.\n new Set(request.tools?.map((tool) => tool.name) ?? []),\n );\n let sawDone = false;\n // #371 — reading the BODY can fail too (socket destroyed mid-stream), and only the initial\n // `fetch` was wrapped. Undici's raw \"terminated\" reached the caller with no provider, no\n // endpoint and `code: undefined`, while every other transport failure on this path reads\n // \"openai transport failure on /v1/chat/completions: …\" and carries `transport_failure`. The\n // wrapper returns any SDK error untouched, so an in-stream provider error keeps its own mapping.\n const records = (async function* () {\n try {\n yield* parseSseStream(response.body, signal);\n } catch (readErr) {\n throw wrapTransportError(readErr, { providerId, endpoint: \"/v1/chat/completions\" });\n }\n })();\n for await (const record of records) {\n if (record.data === \"[DONE]\") {\n sawDone = true;\n break;\n }\n let chunk: OpenAIDeltaChunk;\n try {\n chunk = JSON.parse(record.data) as OpenAIDeltaChunk;\n } catch {\n continue;\n }\n // Fail-loud on an in-stream provider error (OpenRouter HTTP-200 error body).\n // The accumulator only reads `choices`, so an error-only chunk would finish\n // the round empty and swallow the failure (theocode#31). Map it to the same\n // typed error a non-2xx HTTP status would have produced.\n if (chunk.error !== undefined && chunk.error !== null) {\n const status = typeof chunk.error.code === \"number\" ? chunk.error.code : 502;\n throw mapOpenAICompatibleError({\n providerId,\n status,\n body: chunk,\n headers: response.headers,\n endpoint: \"/v1/chat/completions\",\n });\n }\n const events = accumulator.consume(chunk);\n for (const event of events) yield event;\n }\n // M2 #61 — a stream ending with NEITHER `[DONE]` NOR a `finish_reason` was\n // truncated (dropped connection / proxy hiccup); throw a typed error rather\n // than commit the partial turn as a clean `end_turn` (codex prior art).\n if (!sawDone && !accumulator.finishReasonSeen) {\n throw new NetworkError(\"SSE stream truncated (no finish_reason / [DONE])\", {\n code: \"stream_truncated\",\n });\n }\n // R7: drain any held buffer so leaked-dialect text is never silently dropped.\n const drainEvent = accumulator.finalizeHeldText();\n if (drainEvent !== undefined) yield drainEvent;\n return accumulator.finish();\n }\n}\n\nclass OpenAIStreamAccumulator {\n private text = \"\";\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n private reasoningTokens?: number;\n private readonly toolCalls = new Map<number, { id: string; name: string; args: string }>();\n /** R7: present only when recovery is enabled AND the request declares tools — holds suspected\n * leaked-dialect content back from the `text_delta` stream. `undefined` ⇒ stream immediately. */\n private readonly suppress?: StreamSuppressionBuffer;\n\n /**\n * @param extractFromContent opt-in leaked-dialect safe-parse (theokit#58). Default false.\n * @param providerName provider id, used only to label the recovery log line.\n * @param allowedToolNames R5 request-scoped allowlist — built from `request.tools` at `stream()`;\n * leaked recovery in `finish()` only promotes a block whose name is in this set. `undefined`\n * (direct construction) recovers all (back-compat); an empty set recovers nothing.\n */\n constructor(\n private readonly extractFromContent = false,\n private readonly providerName = \"openai\",\n private readonly allowedToolNames?: ReadonlySet<string>,\n ) {\n this.suppress =\n extractFromContent && allowedToolNames !== undefined && allowedToolNames.size > 0\n ? new StreamSuppressionBuffer(allowedToolNames)\n : undefined;\n }\n\n consume(chunk: OpenAIDeltaChunk): LlmEvent[] {\n const events: LlmEvent[] = [];\n this.applyUsage(chunk.usage);\n for (const choice of chunk.choices ?? []) {\n events.push(...this.applyChoice(choice));\n }\n return events;\n }\n\n private applyChoice(choice: NonNullable<OpenAIDeltaChunk[\"choices\"]>[number]): LlmEvent[] {\n const events: LlmEvent[] = [];\n // issue #47: reasoning delta precedes the visible text in arrival order. OpenRouter streams it\n // as `reasoning`; some compat providers use `reasoning_content` (F-domain-2) — accept either.\n const reasoningEvent = this.applyReasoningDelta(\n choice.delta?.reasoning ?? choice.delta?.reasoning_content,\n );\n if (reasoningEvent !== undefined) events.push(reasoningEvent);\n const textEvent = this.applyContentDelta(choice.delta?.content);\n if (textEvent !== undefined) events.push(textEvent);\n this.mergeToolCallDeltas(choice.delta?.tool_calls);\n this.applyFinishReason(choice.finish_reason);\n // R7: at the terminal chunk, flush the held buffer's residual (held minus recoverable blocks)\n // AFTER this chunk's content was appended above — so `accumulatedText == finish.text`.\n if (choice.finish_reason !== undefined && choice.finish_reason !== null) {\n const flushEvent = this.finalizeHeldText();\n if (flushEvent !== undefined) events.push(flushEvent);\n }\n return events;\n }\n\n private applyReasoningDelta(reasoning: string | undefined): LlmEvent | undefined {\n // issue #47: reasoning is NOT accumulated into `this.text` (the visible answer) — it is a\n // separate channel surfaced as `reasoning_delta` (→ thinking events at the loop layer).\n if (typeof reasoning !== \"string\" || reasoning.length === 0) return undefined;\n return { type: \"reasoning_delta\", text: reasoning };\n }\n\n private applyUsage(usage: OpenAIDeltaChunk[\"usage\"]): void {\n if (usage?.prompt_tokens !== undefined) this.inputTokens = usage.prompt_tokens;\n if (usage?.completion_tokens !== undefined) this.outputTokens = usage.completion_tokens;\n // D376: cache + reasoning buckets via OpenRouter passthrough + OpenAI native.\n const cachedDetail = usage?.prompt_tokens_details?.cached_tokens;\n if (cachedDetail !== undefined) this.cacheReadTokens = cachedDetail;\n const reasoningDetail = usage?.completion_tokens_details?.reasoning_tokens;\n if (reasoningDetail !== undefined) this.reasoningTokens = reasoningDetail;\n // a peer#10266 top-level fallback for Anthropic-on-OpenRouter.\n if (usage?.cache_read_input_tokens !== undefined) {\n this.cacheReadTokens = usage.cache_read_input_tokens;\n }\n if (usage?.cache_creation_input_tokens !== undefined) {\n this.cacheWriteTokens = usage.cache_creation_input_tokens;\n }\n }\n\n private applyContentDelta(content: string | undefined): LlmEvent | undefined {\n if (typeof content !== \"string\" || content.length === 0) return undefined;\n this.text += content;\n // R7: when suppression is active, HOLD content that could still be a leaked tool call (the buffer\n // returns the text to emit now, or `undefined` to hold). Otherwise stream immediately.\n if (this.suppress === undefined) return { type: \"text_delta\", text: content };\n const emit = this.suppress.push(content);\n return emit !== undefined ? { type: \"text_delta\", text: emit } : undefined;\n }\n\n /** R7 held-buffer finalizer, called at the `finish_reason` chunk (in `applyChoice`) AND after the\n * SSE loop in `stream()` — so a stream that omits a `finish_reason` terminal never silently drops\n * held text. `toolCalls.size > 0` (native calls present) makes `finish()` skip recovery, so the\n * buffer streams the held text whole. Idempotent once drained. */\n finalizeHeldText(): LlmEvent | undefined {\n const emit = this.suppress?.drain(this.toolCalls.size > 0);\n return emit !== undefined ? { type: \"text_delta\", text: emit } : undefined;\n }\n\n private mergeToolCallDeltas(\n deltas: NonNullable<NonNullable<OpenAIDeltaChunk[\"choices\"]>[number][\"delta\"]>[\"tool_calls\"],\n ): void {\n for (const call of deltas ?? []) {\n const existing = this.toolCalls.get(call.index) ?? { id: \"\", name: \"\", args: \"\" };\n if (call.id !== undefined) existing.id = call.id;\n if (call.function?.name !== undefined) existing.name = call.function.name;\n if (call.function?.arguments !== undefined) existing.args += call.function.arguments;\n this.toolCalls.set(call.index, existing);\n }\n }\n\n /** M2 #61 — true once any chunk carried a non-null `finish_reason` (else a\n * stream ending without `[DONE]` is a truncation, not a clean end). */\n private sawFinishReason = false;\n get finishReasonSeen(): boolean {\n return this.sawFinishReason;\n }\n\n private applyFinishReason(reason: string | null | undefined): void {\n if (reason === undefined || reason === null) return;\n this.sawFinishReason = true;\n this.stopReason = mapOpenAIFinish(reason);\n }\n\n finish(): LlmFinish {\n const toolCalls: LlmToolCallPart[] = [];\n for (const call of this.toolCalls.values()) {\n const input = parseToolArguments(call.args);\n toolCalls.push({ type: \"tool_use\", id: call.id, name: call.name, input });\n }\n let text = this.text;\n let stopReason = this.stopReason;\n // theokit#58 follow-up: leaked-dialect safe-parse. Opt-in, and ONLY when the provider sent no\n // native tool_calls (the size-guard prevents double-counting a real call). Recovered calls flip\n // the stopReason to \"tool_use\" so the agent loop dispatches them; the consumed dialect is stripped\n // from the visible text.\n if (this.extractFromContent && toolCalls.length === 0) {\n const recovered = extractHermesToolCalls(\n this.text,\n () => `hermes-${globalThis.crypto.randomUUID()}`,\n this.allowedToolNames,\n );\n if (recovered.toolCalls.length > 0) {\n toolCalls.push(...recovered.toolCalls);\n text = recovered.residualText;\n stopReason = \"tool_use\";\n // Observability (wiring triad pillar c): recovery is a model-misbehavior workaround, so make\n // it visible — a route that leaks often should be diagnosable without a debugger.\n diag(\n `[theokit-sdk] recovered ${recovered.toolCalls.length} leaked tool call(s) from assistant content ` +\n `(provider=\"${this.providerName}\", names=${recovered.toolCalls.map((c) => c.name).join(\",\")})\\n`,\n );\n }\n // R5 observability: a leaked block DROPPED by the request-scoped allowlist is the guard firing —\n // surface it too, so a model emitting `<function=NAME>` for an undeclared tool is diagnosable.\n if (recovered.droppedNames.length > 0) {\n diag(\n `[theokit-sdk] dropped ${recovered.droppedNames.length} leaked block(s) whose name is not a ` +\n `tool in the request (provider=\"${this.providerName}\", names=${recovered.droppedNames.join(\",\")})\\n`,\n );\n }\n }\n return makeLlmFinish({\n stopReason,\n text,\n toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n reasoningTokens: this.reasoningTokens,\n });\n }\n}\n\n/**\n * issue #47 / F-domain-1: encode the reasoning request in the shape the target provider accepts.\n * Native OpenAI Chat Completions rejects unknown body params and expects the top-level\n * `reasoning_effort` string; OpenRouter (and OpenAI-compatible passthroughs) use the unified\n * `reasoning: { effort }` object. `stream()` always passes the resolved provider id, so a native\n * OpenAI request never 400s on the OpenRouter shape. When `providerName` is unspecified (test seam),\n * the unified object is used — the broader-compatibility default.\n */\nfunction applyReasoningRequest(\n body: Record<string, unknown>,\n effort: string,\n providerName: string | undefined,\n): void {\n if (providerName === \"openai\") {\n body.reasoning_effort = effort;\n return;\n }\n body.reasoning = { effort };\n}\n\n/**\n * Encode the `tools` array + per-request `tool_choice` gate (step-cap force-close). `tool_choice`\n * is meaningful only alongside `tools`, so both are emitted together (or neither). `\"none\"` advertises\n * the tools but forbids calling them — forcing a text answer from an agent whose tools are registered.\n */\nfunction applyToolsRequest(body: Record<string, unknown>, request: LlmRequest): void {\n if (request.tools === undefined || request.tools.length === 0) return;\n body.tools = request.tools.map((tool) => ({\n type: \"function\",\n function: { name: tool.name, description: tool.description, parameters: tool.inputSchema },\n }));\n if (request.toolChoice !== undefined) body.tool_choice = request.toolChoice;\n}\n\nfunction buildOpenAIBody(request: LlmRequest, providerName?: string): Record<string, unknown> {\n const messages: Array<Record<string, unknown>> = [];\n const systemText = openAISystemText(request.system);\n if (systemText.length > 0) {\n messages.push({ role: \"system\", content: systemText });\n }\n for (const message of request.messages) {\n for (const out of toOpenAIMessages(message)) messages.push(out);\n }\n const body: Record<string, unknown> = {\n model: request.model,\n stream: true,\n // D376: opt-in to OpenAI's final-chunk usage record (no-op for providers\n // that don't honor it; OpenRouter / OpenAI both respect it).\n stream_options: { include_usage: true },\n messages,\n };\n if (request.maxTokens !== undefined) body.max_tokens = request.maxTokens;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n // issue #47: reasoning request — only when an effort was requested. Provider-specific wire shape.\n if (request.reasoning?.effort !== undefined)\n applyReasoningRequest(body, request.reasoning.effort, providerName);\n applyToolsRequest(body, request);\n const responseFormat = encodeOpenAIResponseFormat(request.responseFormat);\n if (responseFormat !== undefined) body.response_format = responseFormat;\n return body;\n}\n\n/**\n * T3.5 follow-up — collapse `LlmRequest.system` to the OpenAI wire shape\n * (single string).\n *\n * @internal\n */\nconst openAISystemText = collapseSystemText;\n\n/**\n * T3.6 — encode `LlmResponseFormat` into the OpenAI wire shape. The\n * structured-outputs path defaults `strict` to `true` (provider guarantees\n * the response matches the schema).\n *\n * @internal\n */\nfunction encodeOpenAIResponseFormat(\n rf: LlmRequest[\"responseFormat\"],\n): Record<string, unknown> | undefined {\n if (rf === undefined) return undefined;\n if (rf.type === \"json_object\") return { type: \"json_object\" };\n return {\n type: \"json_schema\",\n json_schema: {\n name: rf.jsonSchema.name,\n schema: rf.jsonSchema.schema,\n strict: rf.jsonSchema.strict ?? true,\n },\n };\n}\n\n/**\n * T3.6 — public test seam for `buildOpenAIBody`. The implementation is\n * file-local; the seam lets unit tests verify the wire shape without\n * exercising the streaming path.\n *\n * @internal\n */\nexport const __testing__buildOpenAIBody = buildOpenAIBody;\n/** issue #47 test seam — exercise reasoning-delta parsing without a live stream. */\nexport const __testing__OpenAIStreamAccumulator = OpenAIStreamAccumulator;\n","/**\n * Consecutive-failure circuit breaker — a cross-cutting resilience primitive.\n *\n * Used by Active Memory recall (timeout-driven) and the LLM credential pool\n * (429/terminal-failure-driven). Domain-neutral: it counts consecutive\n * failure events per key and trips after N, staying open for `cooldownMs`.\n *\n * Mirrors peer-project's `circuitBreakerMaxTimeouts` + `circuitBreakerCooldownMs`\n * config: after N consecutive timeouts the breaker trips and `shouldSkip`\n * returns `true` until `cooldownMs` has elapsed. A successful recall resets\n * the counter immediately.\n *\n * Per-key isolation so two agents in the same process don't share a counter.\n *\n * @internal\n */\n\nexport interface CircuitBreakerOptions {\n maxTimeouts?: number;\n cooldownMs?: number;\n /** Injectable clock for tests. */\n now?: () => number;\n}\n\ninterface KeyState {\n consecutiveTimeouts: number;\n cooldownUntilMs: number;\n}\n\nconst DEFAULT_MAX_TIMEOUTS = 3;\nconst DEFAULT_COOLDOWN_MS = 60_000;\n\nexport class CircuitBreaker {\n private readonly states = new Map<string, KeyState>();\n\n constructor(private readonly opts: CircuitBreakerOptions = {}) {}\n\n /** @returns true when the breaker is open and the call should be skipped. */\n shouldSkip(key: string): boolean {\n const state = this.states.get(key);\n if (state === undefined) return false;\n if (state.cooldownUntilMs === 0) return false;\n if (this.now() < state.cooldownUntilMs) return true;\n // Cooldown elapsed — close the breaker.\n state.cooldownUntilMs = 0;\n state.consecutiveTimeouts = 0;\n return false;\n }\n\n recordSuccess(key: string): void {\n const state = this.states.get(key);\n if (state === undefined) return;\n state.consecutiveTimeouts = 0;\n state.cooldownUntilMs = 0;\n }\n\n recordTimeout(key: string): void {\n const state = this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n state.consecutiveTimeouts += 1;\n if (state.consecutiveTimeouts >= (this.opts.maxTimeouts ?? DEFAULT_MAX_TIMEOUTS)) {\n state.cooldownUntilMs = this.now() + (this.opts.cooldownMs ?? DEFAULT_COOLDOWN_MS);\n }\n this.states.set(key, state);\n }\n\n /** @internal — tests inspect counter state. */\n inspect(key: string): Readonly<KeyState> {\n return this.states.get(key) ?? { consecutiveTimeouts: 0, cooldownUntilMs: 0 };\n }\n\n private now(): number {\n return this.opts.now?.() ?? Date.now();\n }\n}\n","/**\n * The error to throw when an `AbortSignal` is already aborted.\n *\n * Extracted in M93 (adversarial review, L1) when this would have been the **third** copy — rule of 3.\n * `pool-aware-client.ts` and `fallback-client.ts` kept the same function with slightly different string\n * fallbacks; this version preserves the more informative of the two.\n *\n * Preferring `signal.reason` over a raw `new Error(\"aborted\")` is what `error-handling.md` § 2 asks for: a\n * cancellation carries the canceller's reason, and replacing it with generic text erases the cause.\n *\n * @internal\n */\nexport function abortError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n return new Error(signal.reason !== undefined ? String(signal.reason) : \"aborted\");\n}\n","/**\n * Shared streaming helpers for `LlmClient` wrappers\n * (`FallbackLlmClient`, `PoolAwareLlmClient`).\n *\n * `tryFirstEvent` probes the first chunk of a stream to decide\n * whether the handshake succeeded. If it raises an\n * `AuthenticationError`/`RateLimitError`/`NetworkError`, the wrapper\n * captures the typed error for routing (rotate vs fallback) WITHOUT\n * starting the actual yield. Once the first event lands, the stream\n * is committed and partial-output cannot be reverted.\n *\n * `relay` yields the prefetched first chunk and then forwards the\n * remaining generator output verbatim.\n *\n * @internal\n */\n\nimport { AuthenticationError, NetworkError, RateLimitError } from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * Outcome of probing a client's first stream event.\n *\n * @internal\n */\nexport type StreamAttempt =\n | {\n kind: \"ok\";\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>;\n firstResult: IteratorResult<LlmEvent, LlmFinish>;\n }\n | { kind: \"handshake_error\"; error: RateLimitError | AuthenticationError | NetworkError };\n\n/**\n * Try to obtain the FIRST event from `client.stream(...)`. Typed\n * provider failures surface as `kind: \"handshake_error\"`; everything\n * else propagates upward unchanged.\n *\n * Optionally writes a `[theokit-sdk] provider X failed (CODE): falling back`\n * line to stderr when `logFallback` is true — used by `FallbackLlmClient`.\n *\n * @internal\n */\nexport async function tryFirstEvent(\n client: LlmClient,\n request: LlmRequest,\n signal: AbortSignal,\n logFallback = false,\n): Promise<StreamAttempt> {\n const generator = client.stream(request, signal);\n try {\n const firstResult = await generator.next();\n return { kind: \"ok\", generator, firstResult };\n } catch (cause) {\n if (\n cause instanceof NetworkError ||\n cause instanceof RateLimitError ||\n cause instanceof AuthenticationError\n ) {\n if (logFallback) {\n const errCode = cause.metadata?.code ?? cause.code ?? \"unknown\";\n diag(`[theokit-sdk] provider ${client.name} failed (${errCode}): falling back\\n`);\n }\n return { kind: \"handshake_error\", error: cause };\n }\n throw cause;\n }\n}\n\n/**\n * Yield the prefetched first event, then forward the rest of the\n * generator. Identical to a normal `yield*` but with the lookahead\n * already in hand from `tryFirstEvent`.\n *\n * @internal\n */\nexport async function* relayStream(\n generator: AsyncGenerator<LlmEvent, LlmFinish, void>,\n firstResult: IteratorResult<LlmEvent, LlmFinish>,\n): AsyncGenerator<LlmEvent, LlmFinish, void> {\n if (firstResult.done === true) return firstResult.value;\n yield firstResult.value;\n while (true) {\n const next = await generator.next();\n if (next.done === true) return next.value;\n yield next.value;\n }\n}\n","/**\n * `LlmClient` wrapper that pools multiple API keys for the same\n * provider and rotates on HTTP 429/402/401 (ADRs D123-D133).\n *\n * Composition wrapper (D127) — wraps a builder that produces a real\n * `LlmClient` for a given API key. The wrapper picks a key via the\n * pool, instantiates the real client, attempts the stream, and on a\n * pre-stream error decides retry-vs-rotate per the decision matrix.\n *\n * Once `yield*` starts (first event received), rotation is impossible —\n * partial output would corrupt the stream. Same contract as\n * `FallbackLlmClient` (D2).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n CredentialPoolExhaustedError,\n NetworkError,\n RateLimitError,\n} from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { CircuitBreaker } from \"../retry/circuit-breaker.js\";\nimport { abortError } from \"./abort-error.js\";\nimport type { CredentialPool } from \"./credential-pool.js\";\nimport { computeBackoffMs, sleepWithAbort } from \"./retry.js\";\nimport { relayStream, tryFirstEvent } from \"./stream-relay.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/**\n * M2 #60 — optional resilience knobs. `breaker` guards the provider with a\n * consecutive-failure circuit breaker; `backoffBaseMs`/`rng` tune the\n * full-jitter sleep inserted before a same-key 429 retry (tests inject a\n * deterministic `rng` + a small base). All optional — omit for defaults.\n *\n * @internal\n */\nexport interface PoolResilienceOptions {\n breaker?: CircuitBreaker;\n backoffBaseMs?: number;\n rng?: () => number;\n /**\n * SE2 — invoked right before a 429 same-key retry backs off, so the runtime can\n * surface a `rate_limit` RunEvent. `attempt` is 1-based; `retryAfterMs` is the\n * backoff about to be waited. Best-effort observer — must not throw.\n */\n onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n}\n\n/** Decision returned by `classifyAndDecide`. */\ntype Decision = \"retry\" | \"rotate\" | \"propagate\";\n\n/**\n * Pool-aware `LlmClient`. Constructs real clients on demand via\n * `buildClient(apiKey)` — kept lazy so the pool can pick AT request\n * time (not at construction) and rotation produces a fresh client\n * each iteration.\n *\n * @internal\n */\nexport class PoolAwareLlmClient implements LlmClient {\n readonly name: string;\n\n constructor(\n private readonly pool: CredentialPool,\n private readonly buildClient: (apiKey: string) => LlmClient,\n /**\n * T3.9 — Optional override for the upper bound on how long\n * `stream()` waits for a cooldown to expire before throwing\n * `CredentialPoolExhaustedError`. Defaults to 30 s. The actual\n * wait inside `pool.waitForAvailable` is jittered (AWS Brooker\n * 2015 full-jitter), so concurrent callers stagger their\n * re-probe of the pool — preventing reconnect storms.\n *\n * Set to `0` to opt out (legacy pre-T3.9 behavior — throw on\n * first `select()`-returns-null).\n *\n * @internal\n */\n private readonly waitForAvailableMs: number = 30_000,\n resilience: PoolResilienceOptions = {},\n ) {\n this.name = `pool-aware:${pool.provider}`;\n this.breaker = resilience.breaker ?? new CircuitBreaker();\n this.backoffBaseMs = resilience.backoffBaseMs;\n this.rng = resilience.rng;\n this.onRateLimit = resilience.onRateLimit;\n }\n\n private readonly onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n\n /** M2 #60 — provider-level circuit breaker (consecutive-failure). */\n private readonly breaker: CircuitBreaker;\n private readonly backoffBaseMs: number | undefined;\n private readonly rng: (() => number) | undefined;\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: stream() must serialize pool-select → build client → first-event probe → classify → retry/rotate/propagate. Extracting helpers fragments the linear narrative; the comments above each branch keep it readable.\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // M2 #60 — fail fast while the provider circuit is open, instead of\n // re-running the whole select→retry→rotate dance against a down provider.\n if (this.breaker.shouldSkip(this.pool.provider)) {\n throw new NetworkError(`${this.pool.provider} circuit open — failing fast`, {\n code: \"circuit_open\",\n });\n }\n let hasRetried429 = false;\n while (true) {\n if (signal.aborted) throw abortError(signal);\n\n let entry = await this.pool.select();\n if (entry === null) {\n // T3.9 — Reconnect storm prevention. Instead of throwing\n // immediately, wait (with jitter) for the earliest cooldown to\n // expire. Concurrent callers each pick a random delay within\n // the window to the earliest reset, so they wake at staggered\n // times and do not all re-hammer the upstream at the same\n // instant. `waitForAvailableMs === 0` opts out for legacy\n // callers and for unit tests that prefer the pre-T3.9\n // throw-fast contract.\n if (this.waitForAvailableMs > 0) {\n const available = await this.pool.waitForAvailable(signal, {\n maxWaitMs: this.waitForAvailableMs,\n });\n if (available) {\n entry = await this.pool.select();\n }\n }\n if (entry === null) {\n // M2 #60 — a whole-attempt terminal failure trips the breaker.\n this.breaker.recordTimeout(this.pool.provider);\n throw new CredentialPoolExhaustedError(\n `All ${this.pool.provider} credentials exhausted; next retry available at ${\n this.nextRetryHint() ?? \"unknown\"\n }`,\n { provider: this.pool.provider, nextRetryAt: this.nextRetryHint() },\n );\n }\n }\n\n // EC-D: a failure inside buildClient (e.g., invalid baseUrl) is\n // a transport-config bug, NOT a credential failure. Propagate\n // without marking the entry exhausted.\n const realClient: LlmClient = this.buildClient(entry.accessToken);\n\n const attempt = await tryFirstEvent(realClient, request, signal);\n if (attempt.kind === \"ok\") {\n // Stream started — rotation is no longer possible. A healthy start\n // closes the circuit breaker (M2 #60).\n this.breaker.recordSuccess(this.pool.provider);\n return yield* relayStream(attempt.generator, attempt.firstResult);\n }\n\n const decision = classifyAndDecide(attempt.error, hasRetried429);\n if (decision === \"retry\") {\n // D126: first 429 retries the same key. Don't mark exhausted yet.\n // M2 #60 — back off with full jitter before re-hitting the SAME key,\n // so a shared-quota thundering herd no longer burns the retry in <1ms\n // (AWS Brooker 2015). We deliberately do NOT sleep the provider's\n // `Retry-After` here: for a multi-key pool the right move on a 429 is to\n // fail this brief retry and ROTATE to a fresh key immediately (waiting\n // would defeat the pool). `Retry-After` IS honored at the pool-selection\n // level — the rotate path below sets the key's `resetAtMs` cooldown, so\n // subsequent selection skips a rate-limited key until its window passes\n // (a single-key pool then fails fast with CredentialPoolExhaustedError).\n const backoffMs = computeBackoffMs({\n attempt: 0,\n ...(this.backoffBaseMs !== undefined ? { baseMs: this.backoffBaseMs } : {}),\n ...(this.rng !== undefined ? { rng: this.rng } : {}),\n });\n // SE2 — surface a `rate_limit` RunEvent for the retry that is about to back off.\n this.onRateLimit?.({ attempt: 1, retryAfterMs: backoffMs });\n await sleepWithAbort(backoffMs, signal);\n hasRetried429 = true;\n continue;\n }\n if (decision === \"rotate\") {\n // EC-A: persistence failures during rotate must NOT abort the\n // stream. Pool state in-memory is the source of truth; disk\n // staleness self-corrects on the next successful save.\n try {\n await this.pool.markExhaustedAndRotate({\n entryId: entry.id,\n statusCode: attempt.error.metadata?.statusCode ?? inferStatusCode(attempt.error),\n ...(parseRetryAfterMs(attempt.error) !== undefined\n ? { resetAtMs: parseRetryAfterMs(attempt.error) }\n : {}),\n });\n } catch (persistErr) {\n diag(\n `[theokit-sdk] credential-pool: persist failed during rotate; continuing in-memory: ${\n persistErr instanceof Error ? persistErr.message : String(persistErr)\n }\\n`,\n );\n }\n hasRetried429 = false;\n continue;\n }\n // decision === \"propagate\" — a whole-attempt terminal failure (M2 #60).\n this.breaker.recordTimeout(this.pool.provider);\n throw attempt.error;\n }\n }\n\n /**\n * Earliest epoch ms among entries' `lastErrorResetAt` — best estimate\n * for the caller's `CredentialPoolExhaustedError.nextRetryAt`.\n */\n private nextRetryHint(): number | undefined {\n const resets = this.pool\n .list()\n .map((e) => e.lastErrorResetAt)\n .filter((v): v is number => v !== undefined);\n return resets.length === 0 ? undefined : Math.min(...resets);\n }\n}\n\n/**\n * Decision matrix per ADR D125 + D126. Pure function — testable in isolation.\n *\n * @internal\n */\nexport function classifyAndDecide(\n error: RateLimitError | AuthenticationError | NetworkError,\n hasRetried429: boolean,\n): Decision {\n // 5xx / network errors: pool doesn't help — propagate so cross-provider\n // fallback (FallbackLlmClient) can try a different provider.\n if (error instanceof NetworkError) return \"propagate\";\n\n // 401/403: rotate. No OAuth refresh in v1 (out of scope).\n if (error instanceof AuthenticationError) return \"rotate\";\n\n // RateLimitError covers 429 AND 402 (billing/quota) — distinguish via statusCode.\n const status = error.metadata?.statusCode ?? 429;\n if (status === 402) return \"rotate\"; // immediate, no retry (billing won't recover in ms)\n\n // 429: retry once, rotate on second.\n return hasRetried429 ? \"rotate\" : \"retry\";\n}\n\n/**\n * Convert provider's `retry-after` hint (seconds) into epoch ms.\n * The error mapper (D67) normalizes the header into `metadata.retryAfter`\n * (numeric seconds form only). Older formats land in `metadata.raw`.\n *\n * @internal\n */\nexport function parseRetryAfterMs(\n error: RateLimitError | AuthenticationError | NetworkError,\n): number | undefined {\n const seconds = error.metadata?.retryAfter;\n if (typeof seconds === \"number\" && seconds > 0) {\n return Date.now() + seconds * 1000;\n }\n return undefined;\n}\n\nfunction inferStatusCode(error: RateLimitError | AuthenticationError | NetworkError): number {\n if (error instanceof AuthenticationError) return 401;\n if (error instanceof RateLimitError) return 429;\n return 0;\n}\n","/**\n * OpenAI **Responses API** transport (`apiMode: \"responses_api\"`).\n *\n * The SDK's `ApiMode` declared `\"responses_api\"` but shipped NO transport — `selectTransport` threw\n * `transport_unavailable`. This IS that\n * transport: an `LlmClient` that POSTs the Responses-API body to `${baseUrl}/responses` and translates the\n * SSE event stream into `LlmEvent`/`LlmFinish`. It powers the ChatGPT Codex backend\n * (`https://chatgpt.com/backend-api/codex/responses`) and any responses-API provider.\n *\n * The request-body shape and the SSE event names/fields follow the OpenAI Responses API wire protocol\n * (event names, field access, terminal/usage handling), implemented against theokit's\n * `LlmClient` contract (`name` + `stream → AsyncGenerator<LlmEvent, LlmFinish>`).\n *\n * `extraHeaders` (unused by the chat-completions transport until now) + `baseUrl` are consumed here; a `fetch`\n * override lets a host inject a refresh-aware fetch (dynamic `ChatGPT-Account-Id` / `session-id`, mid-turn\n * token refresh) — mirroring `OpenAIClient`.\n */\nimport { mapOpenAICompatibleError } from \"../error-mappers/openai-compatible.js\";\nimport { collapseSystemText, makeLlmFinish, parseToolArguments } from \"./finish.js\";\nimport { parseSseStream } from \"./sse.js\";\nimport { toStringToolResultContent } from \"./tool-result-content.js\";\nimport type {\n LlmClient,\n LlmEvent,\n LlmFinish,\n LlmMessage,\n LlmRequest,\n LlmStopReason,\n LlmToolCallPart,\n} from \"./types.js\";\n\nexport interface ResponsesApiClientOptions {\n apiKey: string;\n /** e.g. `https://chatgpt.com/backend-api/codex`; the client POSTs `${baseUrl}/responses`. */\n baseUrl?: string;\n /** Static headers the profile declares (e.g. `ChatGPT-Account-Id`, `originator`). */\n extraHeaders?: Record<string, string>;\n /** Injected fetch (refresh-aware / dynamic headers). Defaults to global `fetch`. */\n fetch?: typeof fetch;\n providerName?: string;\n /**\n * usetheokit/theokit-sdk#383 — carry the model's ENCRYPTED reasoning across the rounds of a turn.\n * Forwarded from `ProviderProfile.encryptedReasoning`; default off. See\n * {@link ResponsesBodyOptions.encryptedReasoning} for what it puts on the wire and why it is\n * opt-in rather than universal.\n */\n encryptedReasoning?: boolean;\n}\n\n/**\n * usetheokit/theokit-sdk#383 — one reasoning item the model produced, as it must be replayed.\n *\n * `encrypted_content` is opaque ciphertext only the provider can read; the SDK never inspects it,\n * never logs it, and never persists it. It exists to be handed straight back.\n */\ninterface ResponsesReasoningItem {\n id: string;\n encrypted_content: string;\n}\n\n/** Options that shape the request body beyond what an `LlmRequest` carries. */\nexport interface ResponsesBodyOptions {\n /**\n * usetheokit/theokit-sdk#383 — when `true`, add `include: [\"reasoning.encrypted_content\"]` and\n * `reasoning.context: \"all_turns\"`, and replay the reasoning items captured from earlier rounds.\n *\n * **What it buys.** With `store: false` the provider keeps nothing between requests, so a model\n * that reasoned its way to a tool call in round 1 starts round 2 with no memory of that reasoning\n * and derives it again — paid for again, every round. `include` asks the provider to return the\n * reasoning as ciphertext; replaying that ciphertext on the next request hands the chain of\n * thought back. Codex does exactly this against the same endpoint (issue #383 captured the\n * request), which is the evidence that the backend accepts both fields.\n *\n * **Why opt-in and not on for every `responses_api` provider.** `include` is a documented\n * Responses-API field, but `reasoning.context` is not part of the public Responses API surface —\n * it was observed on the ChatGPT Codex backend. A provider that validates its input strictly\n * answers an unknown key with `400`, which turns a cost optimisation into a total outage for that\n * provider. Scoping it to profiles that DECLARE support keeps every other provider's request\n * byte-identical to what it was, and makes enabling it a statement someone made about a specific\n * backend rather than a hope about all of them.\n */\n encryptedReasoning?: boolean;\n /**\n * usetheokit/theokit-sdk#383 — reasoning items captured from earlier rounds, keyed by the\n * `call_id` of the tool call each batch preceded.\n *\n * Keying on `call_id` is what keeps the replay ORDERED and self-correcting. The provider requires\n * a reasoning item to sit immediately before the output it produced, and the conversation history\n * the loop replays is the authority on which tool calls survived and in what order — so emitting\n * each batch just before its own `function_call` reproduces the original sequence without the\n * transport having to track conversation positions. A batch whose tool call is no longer in\n * history is simply never emitted.\n */\n reasoningByCallId?: ReadonlyMap<string, readonly ResponsesReasoningItem[]>;\n}\n\n/** Translate an `LlmMessage` into the Responses-API `input[]` items it contributes. */\n// PRE-EXISTING debt, exposed when M75 fixed the Biome config that used to abort before\n// sweeping these files (a nested root under refactor/). It is not new code and was not touched\n// by M75; refactoring SDK internals without review would trade a visible problem for a diff\n// risky. Tracked in usetheodev/theokit-sdk#151.\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: see the reason just above\nfunction messageToInputItems(\n message: LlmMessage,\n reasoningByCallId?: ReadonlyMap<string, readonly ResponsesReasoningItem[]>,\n): unknown[] {\n const items: unknown[] = [];\n if (message.role === \"user\") {\n const content: unknown[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"input_text\", text: part.text });\n } else if (part.type === \"image\") {\n const url =\n part.source.type === \"base64\"\n ? `data:${part.source.media_type};base64,${part.source.data}`\n : part.source.url;\n content.push({ type: \"input_image\", image_url: url });\n } else if (part.type === \"tool_result\") {\n items.push({\n type: \"function_call_output\",\n call_id: part.toolUseId,\n output: toStringToolResultContent(part.content, \"openai-responses\"),\n });\n }\n }\n if (content.length > 0) items.push({ role: \"user\", content });\n return items;\n }\n if (message.role === \"assistant\") {\n const content: unknown[] = [];\n for (const part of message.content) {\n if (part.type === \"text\") {\n content.push({ type: \"output_text\", text: part.text });\n } else if (part.type === \"tool_use\") {\n // usetheokit/theokit-sdk#383 — the reasoning that produced this call goes back FIRST. The\n // provider rejects a reasoning item that does not immediately precede its own output, so\n // replaying it here (rather than at the top of the message) is what keeps the sequence\n // valid when a round produced several calls.\n for (const reasoning of reasoningByCallId?.get(part.id) ?? []) {\n items.push({\n type: \"reasoning\",\n id: reasoning.id,\n encrypted_content: reasoning.encrypted_content,\n summary: [],\n });\n }\n items.push({\n type: \"function_call\",\n call_id: part.id,\n name: part.name,\n arguments: JSON.stringify(part.input),\n });\n }\n }\n if (content.length > 0) items.push({ role: \"assistant\", content });\n return items;\n }\n // system role rarely appears here (system travels on `request.system`); fold to text.\n const text = message.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n if (text.length > 0) items.push({ role: \"system\", content: text });\n return items;\n}\n\n/** Build the Responses-API request body from an `LlmRequest`. */\nexport function buildResponsesBody(\n request: LlmRequest,\n options: ResponsesBodyOptions = {},\n): Record<string, unknown> {\n const input: unknown[] = [];\n for (const message of request.messages) {\n for (const item of messageToInputItems(message, options.reasoningByCallId)) input.push(item);\n }\n // The Responses API wants the BARE model id (`gpt-5.4`), never a `provider/model` id. The router\n // normally strips the provider prefix before the transport; strip here too as defense-in-depth so an\n // unstripped `openai-chatgpt/gpt-5.4` can never reach the backend as a 400 (decoupled from the router's\n // provider-inference heuristics).\n const slash = request.model.lastIndexOf(\"/\");\n const model = slash >= 0 ? request.model.slice(slash + 1) : request.model;\n // `store: false` is a DECISION, not a leftover — usetheokit/theokit-sdk#383 asked for it to be\n // revisited and it stays `false`. Codex sends `true`, and the asymmetry between the two errors is\n // what settles it: `store: true` asks the provider to RETAIN the request server-side, and this\n // SDK's requests routinely carry a consumer's source code, file contents and shell output from\n // machines whose operator never agreed to that retention. Enabling it would silently widen where\n // that content lives. Turning it off costs nothing that #383 was about — `prompt_cache_key` is\n // what makes the prefix cacheable, and `include: [\"reasoning.encrypted_content\"]` is precisely\n // the mechanism for carrying reasoning forward WITHOUT server-side state. So the cheap error is\n // \"we retained less than we could have\" and the expensive one is \"we retained a customer's source\n // code by default\". There is no knob: a per-request override would be a privacy setting reachable\n // from a request builder, and nobody has asked for one.\n const body: Record<string, unknown> = { model, input, stream: true, store: false };\n const instructions = collapseSystemText(request.system);\n if (instructions.length > 0) body.instructions = instructions;\n if (request.maxTokens !== undefined) body.max_output_tokens = request.maxTokens;\n if (request.temperature !== undefined) body.temperature = request.temperature;\n const tools = (request.tools ?? []).map((tool) => ({\n type: \"function\",\n name: tool.name,\n description: tool.description,\n parameters: tool.inputSchema,\n strict: false,\n }));\n if (tools.length > 0) body.tools = tools;\n applyPromptCachingFields(body, request, options);\n return body;\n}\n\n/**\n * usetheokit/theokit-sdk#383 — the fields that decide whether a round is billed as a cache hit.\n *\n * Kept together and apart from the rest of the body because they answer one question (\"what may the\n * provider reuse from the previous round?\") and because the issue's measurement is about them and\n * nothing else: same provider, same model, same task, a third of our bytes, 2.8x our tokens.\n */\nfunction applyPromptCachingFields(\n body: Record<string, unknown>,\n request: LlmRequest,\n options: ResponsesBodyOptions,\n): void {\n const carryReasoning = options.encryptedReasoning === true;\n // `reasoning.context: \"all_turns\"` only ever extends an effort the caller already asked for. A\n // `reasoning` object holding nothing but `context` is a shape no captured request exhibits, and\n // inventing one to send to a strict backend is how an optimisation becomes a 400.\n if (request.reasoning !== undefined) {\n body.reasoning = {\n effort: request.reasoning.effort,\n ...(carryReasoning ? { context: \"all_turns\" } : {}),\n };\n }\n if (carryReasoning) body.include = [\"reasoning.encrypted_content\"];\n // The field the whole issue is about. Sent to every provider when the request carries a key:\n // `prompt_cache_key` is a documented Responses-API field of the same tier as `store` and `stream`,\n // which this transport has always sent unconditionally. Absent ⇒ omitted, so a caller that builds\n // a body by hand gets the pre-#383 request unchanged.\n if (request.promptCacheKey !== undefined) body.prompt_cache_key = request.promptCacheKey;\n}\n\ninterface ResponsesEvent {\n type?: string;\n delta?: string;\n item_id?: string;\n item?: {\n type?: string;\n id?: string;\n call_id?: string;\n name?: string;\n arguments?: string;\n /** usetheokit/theokit-sdk#383 — present on a `reasoning` item when `include` asked for it. */\n encrypted_content?: string;\n };\n response?: {\n usage?: {\n input_tokens?: number;\n /**\n * The slice of `input_tokens` the provider served from its prompt cache.\n *\n * Read because `input_tokens` INCLUDES it: a consumer adding input to output without\n * subtracting this reports tokens nobody is paying for. Measured 2026-08-25 with\n * `prompt_cache_key` in use — a three-round turn reported 9,835 where 619 were new, 16x.\n * The sibling Chat Completions transport has always read the equivalent\n * (`prompt_tokens_details.cached_tokens`); this one read the reasoning detail beside it and\n * skipped this one.\n */\n input_tokens_details?: { cached_tokens?: number; cache_write_tokens?: number };\n output_tokens?: number;\n output_tokens_details?: { reasoning_tokens?: number };\n };\n error?: { message?: string };\n };\n message?: string;\n}\n\n/**\n * The SSE state machine of the Responses API, as a class rather than as one block inside the\n * generator.\n *\n * It is the same organisation `OpenAIStreamAccumulator` (openai.ts) already uses for the sibling\n * transport: the accumulated values are fields, each event kind is a small method, and the caller's\n * loop is `for await (…) yield* accumulator.consume(event)`. The suppression this replaces claimed\n * to be \"mirroring OpenAIStreamAccumulator.consume\" — it mirrored what that method DOES, not how it\n * is organised: `consume` is seven lines delegating to `applyChoice` / `applyUsage`, while this was\n * a 165-line block with ten mutable locals and eight else-if arms.\n *\n * `response.failed` / `error` stays with the caller on purpose. Reporting it needs `providerId` and\n * the response headers — facts about the REQUEST, which this object does not have and should not\n * grow a field for. {@link failureMessage} is how the caller recognises the arm.\n */\nclass ResponsesStreamAccumulator {\n private text = \"\";\n private readonly toolCalls: LlmToolCallPart[] = [];\n private stopReason: LlmStopReason = \"end_turn\";\n private inputTokens?: number;\n private outputTokens?: number;\n private reasoningTokens?: number;\n private cacheReadTokens?: number;\n private cacheWriteTokens?: number;\n /** Function-call accumulation keyed by the streamed output-item id. */\n private readonly pending: Record<string, { callId: string; name: string; args: string }> = {};\n /**\n * usetheokit/theokit-sdk#383 — reasoning items seen so far in THIS response and not yet claimed\n * by a tool call. Claimed (and cleared) when the next `function_call` completes, which is what\n * binds each batch to the call it produced.\n */\n private unclaimedReasoning: ResponsesReasoningItem[] = [];\n\n constructor(\n private readonly rememberReasoning: (\n callId: string,\n items: readonly ResponsesReasoningItem[],\n ) => void,\n ) {}\n\n /** The message of a terminal failure event, or `undefined` when this is not one. */\n static failureMessage(event: ResponsesEvent): string | undefined {\n if (event.type !== \"response.failed\" && event.type !== \"error\") return undefined;\n return event.response?.error?.message ?? event.message ?? \"responses stream failed\";\n }\n\n consume(event: ResponsesEvent): LlmEvent[] {\n // Two categories, asked in turn: the events that produce something for the caller to yield, and\n // the ones that only move state. `undefined` means \"not mine\", which keeps each half small\n // enough to read without counting braces.\n return this.applyDelta(event) ?? this.applyStructural(event) ?? [];\n }\n\n /** The three event kinds that produce an event for the consumer. */\n private applyDelta(event: ResponsesEvent): LlmEvent[] | undefined {\n const t = event.type;\n if (t === \"response.output_text.delta\") {\n const d = event.delta ?? \"\";\n if (d.length === 0) return [];\n this.text += d;\n return [{ type: \"text_delta\", text: d }];\n }\n if (t === \"response.reasoning_summary_text.delta\" || t === \"response.reasoning_text.delta\") {\n const d = event.delta ?? \"\";\n return d.length > 0 ? [{ type: \"reasoning_delta\", text: d }] : [];\n }\n return undefined;\n }\n\n /** The event kinds that only move accumulator state. Routing only — each arm is its own method. */\n private applyStructural(event: ResponsesEvent): LlmEvent[] | undefined {\n const t = event.type;\n if (t === \"response.output_item.added\" || t === \"response.output_item.done\") {\n this.applyOutputItem(t, event);\n return [];\n }\n if (t === \"response.function_call_arguments.delta\") {\n this.appendArguments(event);\n return [];\n }\n if (t === \"response.completed\" || t === \"response.incomplete\") {\n this.applyTerminal(t, event);\n return [];\n }\n return undefined;\n }\n\n private appendArguments(event: ResponsesEvent): void {\n const c = event.item_id !== undefined ? this.pending[event.item_id] : undefined;\n if (c !== undefined) c.args += event.delta ?? \"\";\n }\n\n private applyTerminal(\n t: \"response.completed\" | \"response.incomplete\",\n event: ResponsesEvent,\n ): void {\n this.applyUsage(event.response?.usage);\n this.stopReason = t === \"response.incomplete\" ? \"max_tokens\" : \"end_turn\";\n }\n\n finish(): LlmFinish {\n // theokit#144: `stopReason` is returned on the finish value, not yielded as an event.\n const stopReason =\n this.toolCalls.length > 0 && this.stopReason === \"end_turn\" ? \"tool_use\" : this.stopReason;\n return makeLlmFinish({\n stopReason,\n text: this.text,\n toolCalls: this.toolCalls,\n inputTokens: this.inputTokens,\n outputTokens: this.outputTokens,\n reasoningTokens: this.reasoningTokens,\n cacheReadTokens: this.cacheReadTokens,\n cacheWriteTokens: this.cacheWriteTokens,\n });\n }\n\n private applyOutputItem(\n t: \"response.output_item.added\" | \"response.output_item.done\",\n event: ResponsesEvent,\n ): void {\n const item = event.item;\n if (item === undefined) return;\n if (t === \"response.output_item.added\") {\n if (item.type === \"function_call\") this.beginFunctionCall(item);\n return;\n }\n if (item.type === \"reasoning\") this.applyReasoningItem(item);\n else if (item.type === \"function_call\") this.applyFunctionCallDone(item);\n }\n\n private beginFunctionCall(item: NonNullable<ResponsesEvent[\"item\"]>): void {\n const id = item.id ?? item.call_id ?? \"call-0\";\n this.pending[id] = {\n callId: item.call_id ?? id,\n name: item.name ?? \"\",\n args: item.arguments ?? \"\",\n };\n }\n\n private applyReasoningItem(item: NonNullable<ResponsesEvent[\"item\"]>): void {\n const id = item.id;\n const encrypted = item.encrypted_content;\n // Both fields or neither: a reasoning item without ciphertext cannot be replayed, and one\n // without an id cannot be addressed. Requesting `include` is what makes them appear, so their\n // absence here is the normal shape for a provider that ignored the field.\n if (id !== undefined && encrypted !== undefined && encrypted.length > 0) {\n this.unclaimedReasoning.push({ id, encrypted_content: encrypted });\n }\n }\n\n private applyFunctionCallDone(item: NonNullable<ResponsesEvent[\"item\"]>): void {\n const id = item.id ?? item.call_id ?? \"call-0\";\n const c = this.pending[id] ?? {\n callId: item.call_id ?? id,\n name: item.name ?? \"\",\n args: item.arguments ?? \"\",\n };\n const call: LlmToolCallPart = {\n type: \"tool_use\",\n id: c.callId,\n name: c.name.length > 0 ? c.name : (item.name ?? \"\"),\n input: parseToolArguments(item.arguments ?? c.args),\n };\n // theokit#144: the call is carried by `LlmFinish.toolCalls`. It used to also be yielded as a\n // `tool_use` event that no consumer read — see the `LlmEvent` docblock for why the live tool\n // channel is `onDelta`, not this stream.\n this.toolCalls.push(call);\n if (this.unclaimedReasoning.length > 0) {\n this.rememberReasoning(call.id, this.unclaimedReasoning);\n this.unclaimedReasoning = [];\n }\n delete this.pending[id];\n }\n\n private applyUsage(usage: NonNullable<ResponsesEvent[\"response\"]>[\"usage\"]): void {\n if (usage === undefined) return;\n this.inputTokens = usage.input_tokens;\n this.outputTokens = usage.output_tokens;\n this.reasoningTokens = usage.output_tokens_details?.reasoning_tokens;\n this.cacheReadTokens = usage.input_tokens_details?.cached_tokens;\n this.cacheWriteTokens = usage.input_tokens_details?.cache_write_tokens;\n }\n}\n\n/**\n * usetheokit/theokit-sdk#383 — cap on how many tool calls' reasoning one client remembers.\n *\n * The client instance outlives a turn, so without a cap a long-lived run accumulates ciphertext for\n * every tool call it ever made. Evicting oldest-first is safe: a batch is only ever read on the\n * round immediately after the one that produced it, so an entry old enough to evict is an entry\n * whose tool call is far enough back in history that dropping it costs a re-derivation at worst.\n */\nconst MAX_REMEMBERED_REASONING_CALLS = 256;\n\nexport class ResponsesApiClient implements LlmClient {\n readonly name: string;\n private readonly baseUrl: string;\n private readonly fetchImpl: typeof fetch;\n /**\n * usetheokit/theokit-sdk#383 — reasoning ciphertext captured from earlier rounds, keyed by the\n * `call_id` it preceded. Held on the CLIENT rather than threaded through `LlmRequest` because a\n * round's reasoning is provider-shaped ciphertext with a provider-shaped ordering rule; the agent\n * loop has no use for it and the same client instance serves every round of a turn. Insertion\n * order is the eviction order (see {@link MAX_REMEMBERED_REASONING_CALLS}).\n */\n private readonly reasoningByCallId = new Map<string, ResponsesReasoningItem[]>();\n\n constructor(private readonly options: ResponsesApiClientOptions) {\n this.name = options.providerName ?? \"openai-responses\";\n this.baseUrl = (options.baseUrl ?? \"https://api.openai.com/v1\").replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n /**\n * usetheokit/theokit-sdk#383 — bind a batch of reasoning ciphertext to the tool call it produced,\n * evicting the oldest binding once the cap is reached.\n */\n private rememberReasoning(callId: string, items: readonly ResponsesReasoningItem[]): void {\n this.reasoningByCallId.set(callId, [...items]);\n while (this.reasoningByCallId.size > MAX_REMEMBERED_REASONING_CALLS) {\n const oldest = this.reasoningByCallId.keys().next();\n if (oldest.done === true) break;\n this.reasoningByCallId.delete(oldest.value);\n }\n }\n\n /** Issues the streaming request. Separated so `stream()` reads as fetch → check → consume. */\n private async post(request: LlmRequest, signal: AbortSignal): Promise<Response> {\n return await this.fetchImpl(`${this.baseUrl}/responses`, {\n method: \"POST\",\n signal,\n headers: {\n \"content-type\": \"application/json\",\n accept: \"text/event-stream\",\n authorization: `Bearer ${this.options.apiKey}`,\n ...(this.options.extraHeaders ?? {}),\n },\n body: JSON.stringify(\n // Both options ride the SAME flag on purpose: a provider that never declared support gets\n // the byte-identical pre-#383 body, even in the impossible case where it returned ciphertext\n // nobody asked for.\n buildResponsesBody(\n request,\n this.options.encryptedReasoning === true\n ? { encryptedReasoning: true, reasoningByCallId: this.reasoningByCallId }\n : {},\n ),\n ),\n });\n }\n\n /** Maps a non-2xx response to a typed error. Returns it rather than throwing, so the caller's\n * control flow stays visible at the call site. */\n private async errorFor(response: Response, providerId: string): Promise<Error> {\n const text = await response.text().catch(() => \"\");\n let body: unknown = text;\n try {\n body = JSON.parse(text);\n } catch {\n /* not JSON */\n }\n return mapOpenAICompatibleError({\n providerId,\n status: response.status,\n body,\n headers: response.headers,\n endpoint: \"/responses\",\n });\n }\n\n /**\n * SSE frames → parsed events, stopping at `[DONE]`. A frame that is not JSON is skipped rather\n * than fatal: a provider that emits a keep-alive or a comment frame must not end the response.\n */\n private async *decode(\n body: NonNullable<Response[\"body\"]>,\n signal: AbortSignal,\n ): AsyncGenerator<ResponsesEvent, void, void> {\n for await (const record of parseSseStream(body, signal)) {\n if (record.data === \"[DONE]\") return;\n let event: ResponsesEvent;\n try {\n event = JSON.parse(record.data) as ResponsesEvent;\n } catch {\n continue;\n }\n yield event;\n }\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const providerId = this.options.providerName ?? \"openai\";\n const response = await this.post(request, signal);\n if (!response.ok) throw await this.errorFor(response, providerId);\n\n const acc = new ResponsesStreamAccumulator((callId, items) =>\n this.rememberReasoning(callId, items),\n );\n\n if (response.body !== null) {\n for await (const event of this.decode(response.body, signal)) {\n const failure = ResponsesStreamAccumulator.failureMessage(event);\n if (failure !== undefined) {\n // Never echo a raw provider body — report the message only, then map to a typed error.\n // The event is the consumer's copy of the message; the throw is what stops the loop.\n yield { type: \"error\", message: failure };\n throw mapOpenAICompatibleError({\n providerId,\n status: 502,\n body: { error: { message: failure } },\n headers: response.headers,\n endpoint: \"/responses\",\n });\n }\n yield* acc.consume(event);\n }\n }\n\n return acc.finish();\n }\n}\n","/**\n * M93 — retry for the **single-key** path, which had none.\n *\n * ## The defect\n *\n * `buildPoolOrSingle` returns a `PoolAwareLlmClient` — with circuit breaker, full-jitter backoff,\n * `Retry-After` handling and rotation — when there are **>= 2** keys. With **one**, it returns the\n * raw transport. A consumer resolving exactly one credential (the common case) never gets a retry:\n * a 429 after eight tool calls kills the turn.\n *\n * The asymmetry has no domain justification. **A pool of 1 key is a pool of size 1** — what changes\n * between 1 and 2 keys is whether there is somewhere to rotate to, not whether resilience exists.\n *\n * ## Why a decorator, and why it is cheap\n *\n * `computeBackoffMs`, `sleepWithAbort` and `CircuitBreaker` **are already independent modules** —\n * `PoolAwareLlmClient` imports them, it does not contain them. So this is composition, not a\n * rewrite (parsimony rung 4: reuse what is already installed). What was missing was not the logic;\n * it was the logic being reachable outside the pool path.\n *\n * A decorator rather than a branch inside the pool: an `LlmClient` wrapping another applies to\n * **both** arms without duplicating anything, and the pool gains no degenerate one-element mode.\n *\n * ## Only transient errors are retried\n *\n * `error-handling.md` § 2 is explicit: \"external-API timeout -> retry with backoff; business-rule\n * violation -> fail immediately\". A 401 retried three times delays the error by seconds without\n * changing the outcome — and hides the real cause from the user for longer.\n *\n * @internal\n */\nimport {\n CredentialPoolExhaustedError,\n isTransientError,\n RateLimitError,\n TheokitAgentError,\n} from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { abortError } from \"./abort-error.js\";\nimport { computeBackoffMs, sleepWithAbort } from \"./retry.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\n\n/** Attempt ceiling. Fixed at 3 — M93's DoD names the number. */\nexport const MAX_ATTEMPTS = 3;\n\n/**\n * Is the error transient — that is, can retrying change the outcome?\n *\n * ## Delegates to `isTransientError`, and states what it subtracts\n *\n * The SDK **already** publishes `isTransientError` — documented as \"a single source of truth rather\n * than a re-derivation\", with the explicit warning that \"It never inspects `err.message`\". The first\n * version of this function ignored both: it re-derived, by regex over the message (`/\\b4\\d\\d\\b/`).\n * Adversarial review measured the cost — `connect ECONNREFUSED 127.0.0.1:443` was classified as NOT\n * transient, because the **port** matches the regex. The network errors retry exists for were\n * exactly the ones excluded.\n *\n * Reinventing here violated parsimony rung 4 with the part already at hand. What remains of this\n * function are **three subtractions** from the owner's verdict, each with a reason:\n *\n * | Subtraction | Why |\n * |---|---|\n * | `CredentialPoolExhaustedError` | the pool already spent its own attempt and rotation budget; `nextRetryAt` is tens of seconds out. Retrying would multiply the wait by `MAX_ATTEMPTS` with no chance of success. |\n * | `code === \"circuit_open\"` | the breaker exists **in order to** fail fast; wrapping it in a retry undoes from outside the decision it just made. |\n * | `RateLimitError` with 402 | a billing quota does not resolve in milliseconds — which is why the pool's `classifyAndDecide` rotates instead of waiting. |\n *\n * The first two came out of the review's measurements: with them treated as transient, the entire\n * pool was retried 3x, and a 30 s wait became ~90 s.\n */\nexport function isRetriableError(err: unknown): boolean {\n if (!isTransientError(err)) return false;\n if (err instanceof CredentialPoolExhaustedError) return false;\n if (err instanceof TheokitAgentError && err.code === \"circuit_open\") return false;\n if (err instanceof RateLimitError && err.metadata?.statusCode === 402) return false;\n return true;\n}\n\n/** The `Retry-After` normalized by the error mapper, in ms from now. */\nfunction retryAfterHintMs(err: unknown): number | undefined {\n if (!(err instanceof RateLimitError)) return undefined;\n const seconds = err.metadata?.retryAfter;\n return typeof seconds === \"number\" && seconds > 0 ? seconds * 1000 : undefined;\n}\n\n/**\n * Forwards the inner stream, flagging `state` as soon as the first event leaves.\n *\n * The flag has to live OUTSIDE the generator because the `catch` that decides about retrying is in\n * the caller — and it is that distinction (emitted or not) that separates \"a retriable failure\"\n * from \"a turn already partially delivered to the consumer\".\n */\nasync function* consume(\n gen: AsyncGenerator<LlmEvent, LlmFinish, void>,\n state: { emitted: boolean },\n): AsyncGenerator<LlmEvent, LlmFinish, void> {\n let step = await gen.next();\n while (step.done !== true) {\n state.emitted = true;\n yield step.value;\n step = await gen.next();\n }\n return step.value;\n}\n\n/** Worth retrying? Not if it already emitted, not on the last attempt, not if the error is final. */\nfunction canRetry(err: unknown, emitted: boolean, attempt: number): boolean {\n if (emitted) return false;\n if (attempt === MAX_ATTEMPTS - 1) return false;\n return isRetriableError(err);\n}\n\n/**\n * ## Why there is NO circuit breaker here\n *\n * The package's `CircuitBreaker` is **keyed by credential** (`recordSuccess(key)` /\n * `recordTimeout(key)`): it exists so the pool can mark a key unhealthy and **skip** to another.\n * With a single key there is nowhere to skip to, so a breaker here would record state nobody reads.\n *\n * Parsimony rung 1 — \"does this need to exist?\". No: it would be ceremony with resilience's name on\n * it. What protects the single-key path is the attempt ceiling and the backoff, and both are below.\n */\nexport class RetryingLlmClient implements LlmClient {\n readonly #inner: LlmClient;\n readonly #rng: (() => number) | undefined;\n\n constructor(inner: LlmClient, opts?: { rng?: () => number }) {\n this.#inner = inner;\n this.#rng = opts?.rng;\n }\n\n /**\n * The decorated client. Public by the same convention as `FaultInjectingLlmClient.inner`: the\n * router's wiring tests assert `instanceof PoolAwareLlmClient` and need to see through the\n * decorators. Without this, adding a decorator breaks tests whose intent is still valid — which is\n * exactly what M93 did to 4 pre-existing tests.\n */\n get inner(): LlmClient {\n return this.#inner;\n }\n\n get name(): string {\n return this.#inner.name;\n }\n\n /**\n * Waits out attempt `n`'s backoff, honoring the provider's `Retry-After` when one arrived.\n *\n * Its own method because `stream` is a generator with a nested loop, and inlining the conditional\n * option assembly here pushed cognitive complexity to 19 (project ceiling: 10). The body of\n * `stream` stays nothing but the attempt machine.\n */\n async #waitBackoff(err: unknown, attempt: number, signal: AbortSignal): Promise<void> {\n const hint = retryAfterHintMs(err);\n const ms = computeBackoffMs({\n attempt,\n ...(hint !== undefined ? { retryAfterMs: hint } : {}),\n ...(this.#rng !== undefined ? { rng: this.#rng } : {}),\n });\n // theokit-sdk#165 — announce the attempt BEFORE sleeping.\n //\n // Without this signal a retry is indistinguishable from no retry, and the issue shows what that\n // costs: a 429 in ~3s led to the conclusion that the retry path was never reached, when it was.\n // The backoff is full-jitter (`floor(random() * ceiling)`), so three attempts fit inside\n // milliseconds and vanish into the response latency — the only thing visible was the final error.\n //\n // It goes through the diagnostics channel, not stderr: the library does not own the host's\n // terminal (theokit#147). With no sink installed, silence.\n const cause = err instanceof Error ? err.name : typeof err;\n diag(\n `retry ${attempt + 1}/${MAX_ATTEMPTS} in ${String(ms)}ms — ${cause}` +\n (hint !== undefined ? ` (Retry-After: ${String(hint)}ms)` : \"\"),\n );\n await sleepWithAbort(ms, signal);\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n let lastError: unknown;\n for (let attempt = 0; attempt < MAX_ATTEMPTS; attempt++) {\n if (signal.aborted) throw lastError ?? abortError(signal);\n // A failure AFTER the first event is NOT retriable: the consumer has already seen tokens, and\n // repeating would produce duplicated text — and, in the scenario that motivates M93 (a 429\n // after eight tool calls), duplicated `tool_use` blocks.\n //\n // Until M93's adversarial review this invariant lived only in the comment: the `yield` and the\n // following `gen.next()` both sat inside the `try`, so a failure mid-stream retried the whole\n // turn. Measured: the consumer received `[tok1, tok2]` across 2 attempts. The comment asserted\n // a guarantee the code did not provide — the rot class `adr-governance.md` § 5 residue 2\n // enumerates.\n const state = { emitted: false };\n try {\n return yield* consume(this.#inner.stream(request, signal), state);\n } catch (err) {\n lastError = err;\n if (!canRetry(err, state.emitted, attempt)) throw err;\n await this.#waitBackoff(err, attempt, signal);\n }\n }\n throw lastError ?? new Error(\"retries exhausted with no recorded error\");\n }\n}\n","/**\n * GCP Vertex AI HTTP error mapper (ADRs D67, D300).\n *\n * Vertex returns `{ error: { code, status, message, details } }` (Google\n * AIP-193 standard error shape).\n *\n * @internal\n */\n\nimport {\n AuthenticationError,\n ConfigurationError,\n NetworkError,\n RateLimitError,\n type TheokitAgentError,\n UnknownAgentError,\n} from \"../../errors.js\";\nimport { buildErrorMetadata, httpStatusToErrorCode, parseErrorBody } from \"./shared.js\";\n\ninterface VertexErrorBody {\n error?: {\n code?: number;\n status?: string;\n message?: string;\n details?: unknown;\n };\n}\n\nexport interface MapVertexErrorArgs {\n status: number;\n body: unknown;\n headers: Headers | undefined;\n endpoint: string;\n}\n\ntype VertexCode =\n | \"rate_limit\"\n | \"auth_unauthenticated\"\n | \"auth_permission\"\n | \"invalid_request\"\n | \"quota_exceeded\"\n | \"timeout\"\n | \"server_error\"\n | \"unknown\";\n\nconst VERTEX_RULES: ReadonlyArray<{ test: (s: number, e: string) => boolean; code: VertexCode }> = [\n { test: (s, e) => s === 429 || e === \"RESOURCE_EXHAUSTED\", code: \"rate_limit\" },\n { test: (s, e) => s === 401 || e === \"UNAUTHENTICATED\", code: \"auth_unauthenticated\" },\n { test: (s, e) => s === 403 || e === \"PERMISSION_DENIED\", code: \"auth_permission\" },\n {\n test: (s, e) =>\n s === 400 || e === \"INVALID_ARGUMENT\" || e === \"FAILED_PRECONDITION\" || e === \"NOT_FOUND\",\n code: \"invalid_request\",\n },\n { test: (s, e) => s === 408 || e === \"DEADLINE_EXCEEDED\", code: \"timeout\" },\n];\n\n/**\n * Vertex's `google.rpc` status enum is a real Google contract and is classified by\n * VERTEX_RULES, which win. Anything the enum does not answer falls through to the\n * shared RFC 9110 ladder rather than to a fourth hand-written copy of it — the copy\n * that used to live here guarded `>= 500` with no ceiling and could not reach\n * `quota_exceeded` at all.\n *\n * The one translation: Vertex splits authentication into `auth_unauthenticated`\n * (401 / UNAUTHENTICATED) and `auth_permission` (403 / PERMISSION_DENIED), which is\n * finer than the shared `auth_failed`. Both rules match on status before the\n * fallback runs, so the `auth_failed` arm below is defensive rather than live — a\n * 401/403 arriving with a body that somehow defeats both rules still lands on an\n * authentication error instead of on `unknown`.\n */\nfunction classifyVertexError(args: MapVertexErrorArgs, errStatus: string): VertexCode {\n for (const rule of VERTEX_RULES) {\n if (rule.test(args.status, errStatus)) return rule.code;\n }\n const shared = httpStatusToErrorCode(args.status);\n return shared === \"auth_failed\" ? \"auth_permission\" : shared;\n}\n\nfunction vertexMetadata(args: MapVertexErrorArgs, code: string) {\n return buildErrorMetadata({\n provider: \"vertex\",\n endpoint: args.endpoint,\n code: code as Parameters<typeof buildErrorMetadata>[0][\"code\"],\n status: args.status,\n headers: args.headers,\n body: args.body,\n });\n}\n\nconst VERTEX_ERROR_BUILDERS: Record<\n VertexCode,\n (args: MapVertexErrorArgs, msg: string) => TheokitAgentError\n> = {\n rate_limit: (args, msg) =>\n new RateLimitError(`Vertex quota exhausted: ${msg}`, {\n metadata: vertexMetadata(args, \"rate_limit\"),\n }),\n auth_unauthenticated: (args, msg) =>\n new AuthenticationError(`Vertex unauthenticated: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n auth_permission: (args, msg) =>\n new AuthenticationError(`Vertex permission denied: ${msg}`, {\n metadata: vertexMetadata(args, \"auth_failed\"),\n }),\n invalid_request: (args, msg) =>\n new ConfigurationError(`Vertex validation: ${msg}`, {\n metadata: vertexMetadata(args, \"invalid_request\"),\n }),\n quota_exceeded: (args, msg) =>\n new RateLimitError(`Vertex quota exceeded: ${msg}`, {\n metadata: vertexMetadata(args, \"quota_exceeded\"),\n }),\n timeout: (args, msg) =>\n new NetworkError(`Vertex timeout: ${msg}`, { metadata: vertexMetadata(args, \"timeout\") }),\n server_error: (args, msg) =>\n new NetworkError(`Vertex server error: ${msg}`, {\n metadata: vertexMetadata(args, \"server_error\"),\n }),\n unknown: (args, msg) =>\n new UnknownAgentError(`Vertex unknown: ${msg}`, { metadata: vertexMetadata(args, \"unknown\") }),\n};\n\nexport function mapVertexError(args: MapVertexErrorArgs): TheokitAgentError {\n const parsed = parseErrorBody<VertexErrorBody>(args.body);\n const errStatus = parsed.error?.status ?? \"\";\n const message = parsed.error?.message ?? \"Vertex request failed\";\n const code = classifyVertexError(args, errStatus);\n return VERTEX_ERROR_BUILDERS[code](args, message);\n}\n","/**\n * Vertex AI access token + config resolution (ADRs D288, D295).\n *\n * Uses `google-auth-library` (required peer dep) for ADC discovery:\n * 1. `GOOGLE_APPLICATION_CREDENTIALS` env (path to Service Account JSON)\n * 2. `gcloud auth application-default login` cached credentials\n * 3. Metadata server (GCE/GKE/Cloud Run/Cloud Functions)\n * 4. Workload Identity Federation (WIF; configured via Service Account JSON)\n *\n * EC-3 absorbed: differentiate \"peer dep missing\" (throws ConfigurationError\n * with install hint) from \"no credentials in ADC chain\" (returns undefined\n * so caller can throw a clearer downstream error).\n *\n * @internal\n */\n\nimport { createRequire } from \"node:module\";\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\n\ninterface GoogleAuthClient {\n getAccessToken: () => Promise<{ token: string | null }>;\n}\n\ninterface GoogleAuthLib {\n GoogleAuth: new (opts: {\n scopes: string[];\n }) => {\n getClient: () => Promise<GoogleAuthClient>;\n };\n}\n\nlet cachedAuthClient: GoogleAuthClient | undefined;\n\nconst SCOPE_CLOUD_PLATFORM = \"https://www.googleapis.com/auth/cloud-platform\";\n\nexport async function resolveVertexAccessToken(): Promise<string | undefined> {\n if (cachedAuthClient === undefined) {\n cachedAuthClient = await getAuthClientOrThrow();\n }\n try {\n const result = await cachedAuthClient.getAccessToken();\n return result.token ?? undefined;\n } catch {\n // ADC chain exhausted — caller (router) emits the helpful error.\n return undefined;\n }\n}\n\nasync function getAuthClientOrThrow(): Promise<GoogleAuthClient> {\n let mod: GoogleAuthLib;\n try {\n const r = createRequire(import.meta.url);\n mod = r(\"google-auth-library\") as GoogleAuthLib;\n } catch (err) {\n // EC-3: differentiate module-not-found from runtime ADC failure.\n const isModuleMissing =\n err instanceof Error &&\n (err.message.includes(\"Cannot find module\") ||\n (err as { code?: string }).code === \"MODULE_NOT_FOUND\");\n if (isModuleMissing) {\n throw new ConfigurationError(\n \"Vertex provider requires `google-auth-library`. Install: `pnpm add google-auth-library`.\",\n { code: \"auth_failed\", cause: err },\n );\n }\n throw err;\n }\n try {\n const auth = new mod.GoogleAuth({ scopes: [SCOPE_CLOUD_PLATFORM] });\n return await auth.getClient();\n } catch (err) {\n // ADC chain exhausted at client construction time — return a stub that\n // forces resolveVertexAccessToken to return undefined.\n diag(\n `[theokit-sdk] Vertex ADC initialization failed: ${err instanceof Error ? err.message : String(err)}\\n`,\n );\n return { getAccessToken: async () => ({ token: null }) };\n }\n}\n\n/** Resolve project id via env vars (env-only in v1). */\nexport function resolveVertexProjectId(): string | undefined {\n return (\n process.env.GOOGLE_CLOUD_PROJECT ??\n process.env.GOOGLE_CLOUD_PROJECT_ID ??\n process.env.GCLOUD_PROJECT\n );\n}\n\n/** Resolve Vertex location (region) from env; defaults to `us-central1`. */\nexport function resolveVertexLocation(): string {\n return process.env.GOOGLE_CLOUD_LOCATION ?? process.env.CLOUD_ML_REGION ?? \"us-central1\";\n}\n\n/** Test seam — reset cached auth client. */\nexport function __resetVertexAuth(): void {\n cachedAuthClient = undefined;\n}\n\n/** Test seam — inject a custom client for unit tests. */\nexport function __setVertexAuthClientForTests(client: GoogleAuthClient | undefined): void {\n cachedAuthClient = client;\n}\n","/**\n * GCP Vertex AI client for Anthropic Messages (Adoption Roadmap #8; ADRs\n * D292, D293).\n *\n * v1 uses `:rawPredict` (non-streaming). Streaming via `:streamRawPredict`\n * with SSE follows the same shape but is gated behind a future iteration —\n * v1 returns the full response as a single delta to keep the streaming\n * interface contract.\n *\n * Body massage (D292):\n * - inject `anthropic_version: \"vertex-2023-10-16\"`\n * - strip `model` from body (goes in URL)\n * - strip `stream` from body\n *\n * Uses native `fetch` only — no `@anthropic-ai/vertex-sdk` (D294).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { mapVertexError } from \"../error-mappers/vertex.js\";\nimport { resolveVertexBaseUrl, stripVertexPrefix } from \"../providers/builtin/vertex.js\";\nimport {\n buildAnthropicCommonBody,\n handleAnthropicResponse,\n postAnthropicRequest,\n} from \"./anthropic-shared.js\";\nimport { makeLlmFinish } from \"./finish.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexAnthropicClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /**\n * OAuth access token. When provided, used as-is. When empty/undefined,\n * resolved lazily per request via `resolveVertexAccessToken()` (D288).\n */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexAnthropicClient implements LlmClient {\n readonly name = \"vertex_anthropic\";\n private readonly fetchImpl: typeof fetch;\n\n constructor(private readonly options: VertexAnthropicClientOptions) {\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n private resolveProjectOrThrow(): string {\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId !== undefined) return projectId;\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run `gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n\n private async resolveTokenOrThrow(): Promise<string> {\n const fromOpts = this.options.apiKey;\n if (fromOpts !== undefined && fromOpts.length > 0) return fromOpts;\n const fromAdc = await resolveVertexAccessToken();\n if (fromAdc !== undefined && fromAdc.length > 0) return fromAdc;\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run `gcloud auth application-default login` or set GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const projectId = this.resolveProjectOrThrow();\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken = await this.resolveTokenOrThrow();\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"anthropic\" });\n const bareModel = stripVertexPrefix(request.model);\n const endpoint = `/models/${encodeURIComponent(bareModel)}:rawPredict`;\n const url = `${baseUrl}${endpoint}`;\n\n const response = await postAnthropicRequest({\n fetchImpl: this.fetchImpl,\n url,\n token: accessToken,\n body: buildVertexAnthropicBody(request),\n signal,\n });\n\n const consumed = await handleAnthropicResponse({\n response,\n endpoint,\n errorMapper: mapVertexError,\n });\n if (consumed.text.length > 0) yield { type: \"text_delta\", text: consumed.text };\n return makeLlmFinish(consumed);\n }\n}\n\nfunction buildVertexAnthropicBody(request: LlmRequest): Record<string, unknown> {\n // D292: anthropic_version is REQUIRED in body (not header) and `model` is stripped.\n return {\n anthropic_version: \"vertex-2023-10-16\",\n ...buildAnthropicCommonBody(request),\n };\n}\n","/**\n * GCP Vertex AI Gemini client (Adoption Roadmap #8; ADR D291).\n *\n * Uses the **OpenAI-compat** endpoint:\n * POST https://{LOCATION}-aiplatform.googleapis.com/v1/projects/{P}/locations/{L}/endpoints/openapi/chat/completions\n *\n * Wraps `OpenAIClient` with the Vertex baseUrl + lazy OAuth token from\n * `google-auth-library` (D288). Limitation: Vertex silently drops\n * unsupported OpenAI params (D264-style trade-off).\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { resolveVertexBaseUrl } from \"../providers/builtin/vertex.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport {\n resolveVertexAccessToken,\n resolveVertexLocation,\n resolveVertexProjectId,\n} from \"./vertex-auth.js\";\n\nexport interface VertexGeminiClientOptions {\n /** When undefined, resolved lazily via `resolveVertexProjectId()`. */\n projectId?: string;\n /** When undefined, resolved lazily via `resolveVertexLocation()`. */\n location?: string;\n /** When non-empty, used as-is. Otherwise resolved lazily via ADC. */\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexGeminiClient implements LlmClient {\n readonly name = \"vertex_gemini\";\n\n constructor(private readonly options: VertexGeminiClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n // EC-1 absorbed: helpful errors when projectId / token missing.\n const projectId = this.options.projectId ?? resolveVertexProjectId();\n if (projectId === undefined) {\n throw new ConfigurationError(\n \"Vertex requires a project id. Set GOOGLE_CLOUD_PROJECT env var or run \" +\n \"`gcloud config set project <id>`.\",\n { code: \"auth_failed\" },\n );\n }\n const location = this.options.location ?? resolveVertexLocation();\n const accessToken =\n this.options.apiKey !== undefined && this.options.apiKey.length > 0\n ? this.options.apiKey\n : await resolveVertexAccessToken();\n if (accessToken === undefined || accessToken.length === 0) {\n throw new ConfigurationError(\n \"Vertex could not resolve an access token. Run \" +\n \"`gcloud auth application-default login` or set \" +\n \"GOOGLE_APPLICATION_CREDENTIALS to a service-account JSON path.\",\n { code: \"auth_failed\" },\n );\n }\n\n // Vertex OpenAI-compat URL: baseUrl includes `.../endpoints/openapi`.\n // OpenAIClient appends `/v1/chat/completions` which gives the wrong path —\n // so we strip the `/v1/` suffix from our baseUrl construction by using\n // the parent URL and letting OpenAIClient add the suffix back.\n //\n // Resolved baseUrl (target):\n // .../endpoints/openapi/chat/completions\n // OpenAIClient builds:\n // {baseUrl}/v1/chat/completions\n // So we need baseUrl = `.../endpoints/openapi-no-suffix` such that\n // `{baseUrl}/v1/chat/completions` = `.../endpoints/openapi/chat/completions`.\n // That's not achievable via simple concat; the cleanest path is to\n // delegate directly using a custom URL — but to keep the existing\n // OpenAIClient code-path, we set baseUrl so that the suffix is correct\n // by mounting \"openapi\" as the leaf and letting `/v1/chat/completions`\n // append. Vertex's documented path is exactly:\n // .../endpoints/openapi/chat/completions (NO /v1)\n // We achieve this by providing a base ending in `/endpoints` and\n // re-mapping `/v1/chat/completions` → `/openapi/chat/completions`\n // via a custom URL builder client.\n //\n // For v1 we ship a minimal own client that targets the exact endpoint.\n const baseUrl = resolveVertexBaseUrl({ projectId, location, modelDialect: \"gemini\" });\n const url = `${baseUrl}/chat/completions`;\n\n // Reuse OpenAIClient by injecting a baseUrl that matches its `/v1/chat/completions` suffix.\n // To avoid that suffix mismatch, we bypass OpenAIClient.stream() entirely and\n // do a direct fetch — but Gemini's response shape IS OpenAI shape, so we\n // borrow OpenAIClient's accumulator via composition: pre-build the body,\n // then hand off to OpenAIClient with a synthetic baseUrl whose `/v1/chat/completions`\n // suffix lands on our actual endpoint.\n //\n // Simplest: create a wrapper fetch that rewrites the URL before delegating.\n const innerFetch = this.options.fetch ?? fetch;\n // B-103 (measured 2026-08-19): OpenAIClient is the only caller of this `fetch`, and\n // it invokes it exactly once with the template-literal string\n // `${baseUrl}${chatPath}` (openai.ts:169). For the placeholder baseUrl used below,\n // that literal is always \"https://_vertex_placeholder/v1/chat/completions\" — so the\n // `RequestInfo | URL` input forms and the endsWith fallback that `typeof fetch`\n // nominally allows for are unreachable from any caller today. Decision: removed\n // rather than kept as untested defensive code (parsimony ladder rung 1). The\n // `typeof fetch` signature is preserved so this still satisfies OpenAIClient's\n // `fetch` option; `_input` is intentionally unused. If a second caller starts\n // passing something other than that exact string, this needs a real rewrite rule\n // for it (and a test), not a silent guess.\n const rewriteFetch: typeof fetch = (_input, init) => innerFetch(url, init);\n\n // Delegate to OpenAIClient with auth + rewrite.\n const inner = new OpenAIClient({\n apiKey: accessToken,\n baseUrl: \"https://_vertex_placeholder\",\n providerName: \"vertex\",\n fetch: rewriteFetch,\n });\n return yield* inner.stream(request, signal);\n }\n}\n","/**\n * Vertex AI dispatcher (Adoption Roadmap #8; ADRs D291, D292, D301).\n *\n * `selectTransport` doesn't see the model id (the credential resolution\n * happens before request dispatch). This client inspects `request.model`\n * at stream time and delegates to either `VertexGeminiClient` (OpenAI-compat\n * for Gemini) or `VertexAnthropicClient` (`:rawPredict` for Claude).\n *\n * @internal\n */\n\nimport { inferModelDialect } from \"../providers/builtin/vertex.js\";\nimport type { LlmClient, LlmEvent, LlmFinish, LlmRequest } from \"./types.js\";\nimport { VertexAnthropicClient } from \"./vertex-anthropic.js\";\nimport { VertexGeminiClient } from \"./vertex-gemini.js\";\n\nexport interface VertexRouterClientOptions {\n apiKey?: string;\n fetch?: typeof fetch;\n}\n\nexport class VertexRouterClient implements LlmClient {\n readonly name = \"vertex\";\n\n constructor(private readonly options: VertexRouterClientOptions) {}\n\n async *stream(\n request: LlmRequest,\n signal: AbortSignal,\n ): AsyncGenerator<LlmEvent, LlmFinish, void> {\n const dialect = inferModelDialect(request.model);\n if (dialect === \"anthropic\") {\n const inner = new VertexAnthropicClient(this.options);\n return yield* inner.stream(request, signal);\n }\n const inner = new VertexGeminiClient(this.options);\n return yield* inner.stream(request, signal);\n }\n}\n","import { ConfigurationError } from \"../../errors.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { getProviderProfile, type ProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { AnthropicClient } from \"./anthropic.js\";\nimport { BedrockAnthropicClient } from \"./bedrock-anthropic.js\";\nimport { CredentialPool, newPooledCredential } from \"./credential-pool.js\";\nimport { currentCredentialPool } from \"./credential-pool-context.js\";\nimport type { CredentialPoolStrategy } from \"./credential-pool-types.js\";\nimport { maybeWrapWithFaultInjection } from \"./fault-injection.js\";\nimport { OllamaNativeClient } from \"./ollama-native.js\";\nimport { OpenAIClient } from \"./openai.js\";\nimport { PoolAwareLlmClient } from \"./pool-aware-client.js\";\nimport { ResponsesApiClient } from \"./responses.js\";\nimport { RetryingLlmClient } from \"./retrying-client.js\";\nimport type { LlmClient } from \"./types.js\";\nimport { VertexRouterClient } from \"./vertex-router.js\";\n\n/**\n * Provider router (T4.3, ADRs D105-D107).\n *\n * Resolves an `LlmClient` from a `ProviderProfile`. The profile is the\n * data; the transport is selected by `apiMode`. Builtins are eagerly\n * registered on first call; user plugins in `~/.theokit/plugins/\n * model-providers/` are lazy-loaded.\n *\n * @internal\n */\n\nexport type ProviderName = \"anthropic\" | \"openai\" | \"openrouter\" | (string & {});\n\nexport interface ProviderRouterOptions {\n primary: ProviderName;\n fallback?: ProviderName[];\n /** Credential pools per provider (ADRs D123-D133). Optional. */\n apiKeys?: Record<string, string[]>;\n /** Pool rotation strategy per provider. Optional; default `\"fill_first\"`. */\n credentialPoolStrategy?: Record<string, CredentialPoolStrategy>;\n /**\n * Per-run opt-in leaked-dialect safe-parse derived from the chat route\n * (theokit#58 follow-up). When `true`, the resolved profile is cloned with\n * `extractToolCallsFromContent: true` so the OpenAI-compatible transport\n * recovers Hermes `<function=…></tool_call>` dialect leaked as text. Applied\n * to the resolved chain; fail-open, so a non-leaking provider is unaffected.\n */\n extractToolCallsFromContent?: boolean;\n /**\n * SE2 — forwarded into the pool-aware client so a 429 retry surfaces a\n * `rate_limit` RunEvent. Wired from `SendOptions.onRunEvent` at the run boundary.\n */\n onRateLimit?: (info: { attempt: number; retryAfterMs?: number }) => void;\n /**\n * #332 — the endpoint THIS call should reach, from `ModelSelection.url`.\n *\n * It outranks the provider's base-URL env var deliberately. `OLLAMA_HOST` and friends are\n * process-wide, so with the env var winning, whoever set it for one model would keep hijacking\n * every other one — which is the bug this field exists to end, wearing a hat.\n */\n baseUrl?: string;\n}\n\n/**\n * Resolves the provider chain synchronously. Builtins are eagerly registered.\n * Provider plugin discovery is expected to have run upfront (e.g., via\n * Agent.create initialization) before this is called.\n */\nexport function resolveProviderChain(options: ProviderRouterOptions): LlmClient[] {\n registerBuiltins();\n return buildChain(options);\n}\n\nfunction buildChain(options: ProviderRouterOptions): LlmClient[] {\n // EC-B: warn (once) on apiKeys entries for providers we don't recognize.\n warnUnknownProvidersInApiKeys(options.apiKeys);\n\n const seen = new Set<string>();\n const clients: LlmClient[] = [];\n // `perCallBaseUrl` reaches ONLY the provider the model id names. It comes from\n // `ModelSelection.url`, documented above as \"the endpoint THIS call should reach\" — and a\n // fallback provider is a different endpoint by definition. Handing it to every client made a\n // fallback inherit the primary's host, so it could never reach its own: measured at primary 6\n // requests / fallback 0 (B-151). The irony was on the record — this field exists to stop a\n // process-wide setting hijacking models it was not meant for, and within a chain it was doing\n // exactly that itself.\n const addClient = (name: ProviderName, perCallBaseUrl?: string): void => {\n const lowered = name.toLowerCase();\n if (seen.has(lowered)) return;\n seen.add(lowered);\n const client = buildClient(lowered, options, perCallBaseUrl);\n // D14: wrap every resolved client with the fault-injection decorator.\n // The wrapper is a cheap noop unless `NODE_ENV=test` AND\n // `THEOKIT_TEST_RESPONSE_OVERRIDE` are both set — production is unaffected.\n if (client !== undefined) clients.push(maybeWrapWithFaultInjection(client));\n };\n addClient(options.primary, options.baseUrl);\n // No `perCallBaseUrl`: each fallback resolves its own endpoint from its profile and its own\n // `*_API_BASE_URL`, which is what makes a fallback a different destination rather than a retry.\n for (const fallback of options.fallback ?? []) addClient(fallback);\n if (clients.length === 0) {\n throw new ConfigurationError(\n `No provider client could be resolved (primary=${options.primary}). ` +\n `Set ANTHROPIC_API_KEY or OPENAI_API_KEY / OPENROUTER_API_KEY.`,\n { code: \"provider_unresolved\" },\n );\n }\n return clients;\n}\n\n/**\n * Resolves the transport for `name` — every arm returns it RAW.\n *\n * Retry is applied ONCE, by {@link buildClient}, and that split is the point. Three arms wrapped\n * themselves and a fourth did not: `maybeBuildNoAuthTransport` returned an unwrapped transport, so an\n * Ollama / LM Studio / llama.cpp user passing a placeholder key got zero retries on a transient 5xx\n * while every other configuration retried. The sweep that fixed the other three found them one at a\n * time — its own comment records the third being discovered while testing the second — and a fourth\n * was always going to be possible while each arm opted in for itself.\n *\n * A new return path added here cannot opt out of resilience by omission.\n */\nfunction buildTransport(\n name: string,\n routerOptions: ProviderRouterOptions,\n perCallBaseUrl?: string,\n): LlmClient | undefined {\n const baseProfile = getProviderProfile(name);\n if (baseProfile === undefined) return undefined;\n // theokit#58 follow-up: per-run route opt-in clones the resolved profile with\n // the leaked-dialect recovery flag so the OpenAI-compatible transport surfaces\n // Hermes `<function=…></tool_call>` calls leaked as text. Built-in profiles\n // ship the flag off; this is the per-run enablement path.\n const profile =\n routerOptions.extractToolCallsFromContent === true &&\n baseProfile.extractToolCallsFromContent !== true\n ? { ...baseProfile, extractToolCallsFromContent: true }\n : baseProfile;\n const resilience =\n routerOptions.onRateLimit !== undefined ? { onRateLimit: routerOptions.onRateLimit } : {};\n const ambient = currentCredentialPool(name);\n if (ambient !== undefined) {\n // M93 — the THIRD arm. Found while writing the second one's test: the ambient pool also returned\n // the client without the decorator, and leaving it out would create the same asymmetry the milestone removes,\n // only on a less visible path.\n return new PoolAwareLlmClient(\n ambient,\n (apiKey) => selectTransport(profile, apiKey, perCallBaseUrl),\n undefined,\n resilience,\n );\n }\n const poolKeys = filterPoolKeys(routerOptions.apiKeys?.[name]);\n const noAuthOverride = maybeBuildNoAuthTransport(profile, poolKeys, perCallBaseUrl);\n if (noAuthOverride !== undefined) return noAuthOverride;\n return buildPoolOrSingle({ name, profile, poolKeys, routerOptions, perCallBaseUrl });\n}\n\n/** Resolves the transport and applies retry — the one place resilience is attached. */\nfunction buildClient(\n name: string,\n routerOptions: ProviderRouterOptions,\n perCallBaseUrl?: string,\n): LlmClient | undefined {\n const transport = buildTransport(name, routerOptions, perCallBaseUrl);\n return transport === undefined ? undefined : new RetryingLlmClient(transport);\n}\n\n/**\n * EC-C MUST FIX (ADR D187): `authType: \"none\"` providers ignore apiKeys.\n * Building a CredentialPool against a runtime without auth is semantically\n * meaningless; emit one-shot warn and route to the sentinel transport.\n */\nfunction maybeBuildNoAuthTransport(\n profile: ProviderProfile,\n poolKeys: string[] | undefined,\n baseUrl?: string,\n): LlmClient | undefined {\n if (profile.authType !== \"none\" || poolKeys === undefined || poolKeys.length === 0) {\n return undefined;\n }\n warnNoAuthApiKeysIgnoredOnce(profile.name);\n const sentinel = sentinelForNoAuth(profile);\n if (sentinel === undefined) return undefined;\n return selectTransport(profile, sentinel, baseUrl);\n}\n\n/** Pool path for ≥2 keys; single-key fast path otherwise; sentinel fallback. */\nfunction buildPoolOrSingle(args: {\n name: string;\n profile: ProviderProfile;\n poolKeys: string[] | undefined;\n routerOptions: ProviderRouterOptions;\n /** `ModelSelection.url`, and ONLY for the provider the model id names — see `addClient`. */\n perCallBaseUrl: string | undefined;\n}): LlmClient | undefined {\n const { name, profile, poolKeys, routerOptions, perCallBaseUrl } = args;\n if (poolKeys !== undefined && poolKeys.length >= 2) {\n const strategy = routerOptions.credentialPoolStrategy?.[name] ?? \"fill_first\";\n const entries = poolKeys.map((accessToken, priority) =>\n newPooledCredential({ provider: name, accessToken, priority, source: \"manual\" }),\n );\n const pool = new CredentialPool(name, entries, strategy);\n const resilience =\n routerOptions.onRateLimit !== undefined ? { onRateLimit: routerOptions.onRateLimit } : {};\n // M93 — the pool ALREADY had retry inside; the outer decorator covers what it propagates (5xx and\n // network, which `classifyAndDecide` tells it to propagate because \"the pool does not help\"). Additive: rotation\n // behavior does not change.\n return new PoolAwareLlmClient(\n pool,\n (apiKey) => selectTransport(profile, apiKey, perCallBaseUrl),\n undefined,\n resilience,\n );\n }\n // 1-entry pool / single-key fast path: prefer explicit apiKeys[name] over env.\n // D182: `authType: \"none\"` providers fall back to a sentinel placeholder\n // when no key is set — transports that ignore the Authorization header still work.\n // D286/D288: `aws_bearer` / `gcp_oauth` profiles use a lazy sentinel so the\n // client can resolve real credentials at stream time (helpful error if missing).\n const apiKey =\n poolKeys?.[0] ??\n resolveApiKey(profile.envVars) ??\n sentinelForNoAuth(profile) ??\n sentinelForLazyAuth(profile);\n if (apiKey === undefined) return undefined;\n // M93 — the ONE-key arm returned the RAW transport, with no retry at all. A pool of 1 key is a\n // pool of size 1: what changes between 1 and 2 keys is whether there is somewhere to rotate to, not\n // whether resilience exists. The typical consumer resolves exactly one credential and always landed here.\n return selectTransport(profile, apiKey, perCallBaseUrl);\n}\n\n/**\n * Base-URL override read from the environment, for the providers that document one.\n *\n * `ollama` is deliberately absent. It never reached this switch: `selectTransport` returns\n * `OllamaNativeClient` for it before the `chat_completions` body runs, so `OLLAMA_HOST` is read at\n * that earlier branch instead. The arm that used to sit here was unreachable and read like the\n * mechanism implementing `OLLAMA_HOST` — a decoy that cost a measurement pass (B-097).\n */\nfunction resolveBaseUrlEnvOverride(providerName: string): string | undefined {\n switch (providerName) {\n case \"openai\":\n return process.env.OPENAI_API_BASE_URL;\n case \"openrouter\":\n return process.env.OPENROUTER_API_BASE_URL;\n case \"lmstudio\":\n return process.env.LMSTUDIO_HOST;\n case \"llamacpp\":\n return process.env.LLAMACPP_HOST;\n default:\n return undefined;\n }\n}\n\n// EC-C: one-shot warn keyed by provider name.\nconst warnedNoAuthApiKeys = new Set<string>();\nfunction warnNoAuthApiKeysIgnoredOnce(provider: string): void {\n if (warnedNoAuthApiKeys.has(provider)) return;\n warnedNoAuthApiKeys.add(provider);\n diag(\n `[theokit-sdk] provider \"${provider}\" has authType: \"none\" — apiKeys ignored (no auth required for local runtime).\\n`,\n );\n}\n\n/** Test-only reset. @internal */\nexport function _resetNoAuthApiKeyWarnings(): void {\n warnedNoAuthApiKeys.clear();\n}\n\n/**\n * D182: providers declaring `authType: \"none\"` use a placeholder credential\n * so the OpenAI-compat transport keeps working. The placeholder value is\n * never sensitive — local runtimes ignore the Authorization header.\n */\nfunction sentinelForNoAuth(profile: ProviderProfile): string | undefined {\n return profile.authType === \"none\" ? profile.name : undefined;\n}\n\n/**\n * D286 / D288: providers with lazy-resolved auth (Bedrock Bearer via\n * `@aws/bedrock-token-generator`, Vertex via `google-auth-library`) may not\n * have credentials available at construction time — the client resolves\n * them per-request and throws helpful `ConfigurationError` if missing\n * (EC-1, EC-6 absorbed). Use a placeholder so the router still builds\n * the client; the user sees the helpful error on the first `agent.send`.\n */\nfunction sentinelForLazyAuth(profile: ProviderProfile): string | undefined {\n if (profile.authType === \"aws_bearer\") return \"__bedrock_lazy_token__\";\n if (profile.authType === \"gcp_oauth\") return \"__vertex_lazy_token__\";\n // M42: an oauth provider carries no static key — build the client with a lazy placeholder so its M41\n // `transform.fetch(ctx)` (which calls `resolveCredential` to obtain a freshly-refreshed bearer) owns\n // the real Authorization at stream time. Plain (api_key/none) profiles are unaffected.\n if (profile.authType === \"oauth_device_code\" || profile.authType === \"oauth_external\") {\n return \"__oauth_lazy_token__\";\n }\n return undefined;\n}\n\nfunction filterPoolKeys(keys: string[] | undefined): string[] | undefined {\n if (keys === undefined) return undefined;\n const cleaned = keys.filter((k) => typeof k === \"string\" && k.length > 0);\n return cleaned.length === 0 ? undefined : cleaned;\n}\n\nconst warnedProviders = new Set<string>();\nfunction warnUnknownProvidersInApiKeys(apiKeys: Record<string, string[]> | undefined): void {\n if (apiKeys === undefined) return;\n for (const name of Object.keys(apiKeys)) {\n if (warnedProviders.has(name)) continue;\n const profile = getProviderProfile(name);\n if (profile === undefined) {\n warnedProviders.add(name);\n diag(\n `[theokit-sdk] credential-pool: unknown provider \"${name}\" in apiKeys (no profile registered)\\n`,\n );\n }\n }\n}\n\n/** Test-only reset. @internal */\nexport function _resetCredentialPoolWarnings(): void {\n warnedProviders.clear();\n}\n\n/**\n * Test seam for {@link resolveApiKey}. NOT re-exported from any barrel — `_...ForTests` is this\n * repo's convention for reaching a private function from a test rather than copying it.\n *\n * It exists because the ordering this function implements had no test that could fail. The one named\n * for it set a single env var and asserted the chain had length 1, which proves the fallback is\n * consulted and would survive the profile's list being reversed. The only other place the choice is\n * observable is the Authorization header at stream time, and reaching it for a BUILTIN profile means\n * a real request — measured: the first attempt at that test sent one to openrouter and came back 401.\n *\n * @internal\n */\nexport function _resolveApiKeyForTests(envVars: ReadonlyArray<string>): string | undefined {\n return resolveApiKey(envVars);\n}\n\n/**\n * EC-10: resolve API key from ordered envVars list; first non-empty wins.\n */\nfunction resolveApiKey(envVars: ReadonlyArray<string>): string | undefined {\n for (const v of envVars) {\n const value = process.env[v];\n if (value !== undefined && value.length > 0) return value;\n }\n return undefined;\n}\n\n/**\n * EC-3 fix: exhaustive switch with actionable error on unsupported apiMode.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: 4-mode transport ladder (chat_completions / anthropic_messages / responses_api / bedrock) + Ollama native dispatch (D191) + per-provider envOverride is one cohesive switch — splitting hurts readability and obscures the dispatch contract.\nfunction selectTransport(\n profile: ProviderProfile,\n apiKey: string,\n /** #332 — the endpoint THIS call should reach; outranks the provider's base-URL env var. */\n baseUrl?: string,\n): LlmClient {\n // M41 — the optional provider `transform` seam (refresh-aware `fetch` + dynamic `headers` from the resolved\n // bearer). Invoked LAZILY, per-branch, ONLY by the transports that consume it (chat_completions +\n // responses_api) — so a transform's side effects (e.g. a token refresh) never fire for a transport that\n // ignores it (bedrock / ollama). Absent ⇒ each branch takes its byte-for-byte static path.\n const applyTransform = (): { fetch?: typeof fetch; headers?: Record<string, string> } => {\n if (profile.transform === undefined) return {};\n const ctx = { apiKey };\n return { fetch: profile.transform.fetch?.(ctx), headers: profile.transform.headers?.(ctx) };\n };\n\n /**\n * Applies the provider's transform over `opts` and returns the constructed client.\n *\n * The `chat_completions` and `anthropic_messages` arms did this IDENTICALLY, differing only in the\n * final constructor. That is duplicated KNOWLEDGE: \"apply the transform, require OAuth to be\n * resolved, and merge the dynamic headers ON TOP of the profile's static ones\" is the same rule for\n * any provider — fixing it in one arm and forgetting the other would leave one provider with a\n * refresh-aware transport and the other without, silently.\n *\n * Generic over `O` because each arm declares its own `opts` with its constructor's type\n * (`ConstructorParameters<typeof OpenAIClient>[0]` vs Anthropic's) — that is why a\n * the first attempt with a non-generic helper, declared before the `if`s, did not compile.\n */\n const withTransform = <\n O extends { fetch?: typeof fetch; extraHeaders?: Record<string, string> },\n C,\n >(\n opts: O,\n construct: (o: O) => C,\n ): C => {\n const t = applyTransform();\n assertOAuthResolved(t);\n if (t.fetch !== undefined) opts.fetch = t.fetch;\n const merged =\n profile.extraHeaders !== undefined || t.headers !== undefined\n ? { ...profile.extraHeaders, ...t.headers }\n : undefined;\n if (merged !== undefined) opts.extraHeaders = merged;\n return construct(opts);\n };\n\n // M42 review MEDIUM-1 — the auth model: a provider's auth\n // resolves to real headers at request time or FAILS with `MissingCredentialError` — it NEVER puts a\n // placeholder on the wire. theokit builds an oauth provider's client with the `__oauth_lazy_token__`\n // placeholder (so the sync router can construct it), then the provider's `transform`\n // supplies the real bearer via fetch or an authorization header. If it supplies\n // neither, fail fast here with the MissingCredentialError analog instead of POSTing the placeholder upstream.\n const assertOAuthResolved = (t: {\n fetch?: typeof fetch;\n headers?: Record<string, string>;\n }): void => {\n if (apiKey !== \"__oauth_lazy_token__\") return;\n const auth = t.headers?.authorization ?? t.headers?.Authorization;\n if (t.fetch === undefined && auth === undefined) {\n throw new ConfigurationError(\n `provider \"${profile.name}\" uses OAuth (authType: ${profile.authType}) but no credential was ` +\n `resolved. Register a ProviderProfile.transform whose fetch (or headers.authorization) supplies ` +\n `the bearer — typically via resolveCredential() from \"@theokit/sdk/auth\".`,\n );\n }\n };\n\n if (profile.apiMode === \"chat_completions\") {\n // ADR D191 (T8.1 dogfood fix): Ollama tool calling REQUIRES the native\n // `/api/chat` endpoint. OpenAI-compat `/v1/chat/completions` causes\n // models to emit raw tool JSON as plain text — confirmed via peer-project\n // upstream warning and our own dogfood of telegram-pro.\n if (profile.name === \"ollama\") {\n const ollamaBase = baseUrl ?? process.env.OLLAMA_HOST ?? profile.baseUrl;\n return new OllamaNativeClient({ apiKey, baseUrl: ollamaBase });\n }\n const opts: ConstructorParameters<typeof OpenAIClient>[0] = { apiKey };\n opts.baseUrl = profile.baseUrl;\n // T1.1 (ADR D185): forward provider name so OpenAIClient can dispatch\n // Ollama-specific error mapping for ECONNREFUSED / 404-not-pulled / 503-loading.\n opts.providerName = profile.name;\n // theokit#58 follow-up: opt-in leaked-dialect safe-parse, declared per-profile (default off).\n if (profile.extractToolCallsFromContent === true) {\n opts.extractToolCallsFromContent = true;\n }\n // M45 — explicit chat-completions path override (data-only escape for unversioned shapes).\n if (profile.chatCompletionsPath !== undefined) {\n opts.chatCompletionsPath = profile.chatCompletionsPath;\n }\n if (profile.name === \"openai\" && process.env.OPENAI_ORGANIZATION !== undefined) {\n opts.organization = process.env.OPENAI_ORGANIZATION;\n }\n // Honor explicit base URL overrides for cloud providers + the local\n // `authType: \"none\"` family (D188, D189). All four `_HOST` /\n // `_API_BASE_URL` vars are intentionally separate so users can mix\n // remote-box pointing without disturbing the others. Ollama is NOT one of\n // them here — it returns above, and reads `OLLAMA_HOST` on that branch.\n const envOverride = resolveBaseUrlEnvOverride(profile.name);\n if (envOverride !== undefined) opts.baseUrl = envOverride;\n // #332 — last, so the model's own endpoint outranks the process-wide env var above.\n if (baseUrl !== undefined) opts.baseUrl = baseUrl;\n // M41 — feed the provider transform: `fetch` (refresh-aware transport) + `headers` merged over the\n // profile's static `extraHeaders`. OpenAIClient now honors `extraHeaders` (was ignored) — additive-safe:\n // no builtin sets it on chat_completions.\n return withTransform(opts, (o) => new OpenAIClient(o));\n }\n if (profile.apiMode === \"anthropic_messages\") {\n // Vertex sub-dispatch (D301): when profile.name === \"vertex\", route to\n // VertexRouterClient which picks Gemini vs Anthropic at stream time.\n // apiKey is either a real Bearer token (rare — caller passed it\n // explicitly) or the lazy sentinel `__vertex_lazy_token__` — strip\n // the latter so the client falls through to ADC discovery (D288).\n if (profile.name === \"vertex\") {\n const realKey = apiKey === \"__vertex_lazy_token__\" ? undefined : apiKey;\n return new VertexRouterClient(realKey !== undefined ? { apiKey: realKey } : {});\n }\n const opts: ConstructorParameters<typeof AnthropicClient>[0] = { apiKey };\n // `baseUrl` first, matching the chat_completions branch and the field's own contract:\n // `ModelSelection.url` is \"the endpoint THIS call should reach\" and outranks the process-wide\n // env var. It reached only `ollama` and `chat_completions`; here a run aimed at localhost went\n // to api.anthropic.com with the caller's key and said nothing (B-150).\n opts.baseUrl = baseUrl ?? process.env.ANTHROPIC_API_BASE_URL ?? profile.baseUrl;\n // M45 — feed the provider transform + static extraHeaders (mirror of the M41 chat_completions wiring),\n // so anthropic_messages providers can carry headers (anthropic-beta) and refresh-aware fetches (M46).\n return withTransform(opts, (o) => new AnthropicClient(o));\n }\n if (profile.apiMode === \"bedrock_anthropic\") {\n // D301: dedicated Bedrock InvokeModel client. apiKey from env when set;\n // strip the lazy sentinel so client triggers @aws/bedrock-token-generator (D287).\n const realKey = apiKey === \"__bedrock_lazy_token__\" ? undefined : apiKey;\n // `BedrockAnthropicClient` accepts `baseUrl` (bedrock-anthropic.ts:40) and the router never\n // passed it, so `model.url` was silently dropped on this branch too (B-150). Absent, the\n // client still derives the regional endpoint from the model id, as before.\n return new BedrockAnthropicClient({\n ...(realKey !== undefined ? { apiKey: realKey } : {}),\n ...(baseUrl !== undefined ? { baseUrl: baseUrl } : {}),\n });\n }\n if (profile.apiMode === \"responses_api\") {\n // M40 — the OpenAI Responses-API transport (ChatGPT Codex backend + any responses provider). Consumes\n // `baseUrl` + `extraHeaders`. M41 — feeds the provider `transform`: `headers` merge over `extraHeaders`\n // (dynamic auth headers like a live `ChatGPT-Account-Id`), and `fetch` becomes the refresh-aware fetch\n // (closes the gap where `ResponsesApiClient` accepted a `fetch?` the router never passed).\n const t = applyTransform();\n assertOAuthResolved(t);\n const mergedHeaders =\n profile.extraHeaders !== undefined || t.headers !== undefined\n ? { ...profile.extraHeaders, ...t.headers }\n : undefined;\n return new ResponsesApiClient({\n apiKey,\n // Per-call URL first, same contract as every other branch (B-150).\n ...((baseUrl ?? profile.baseUrl) !== undefined\n ? { baseUrl: (baseUrl ?? profile.baseUrl) as string }\n : {}),\n ...(mergedHeaders !== undefined ? { extraHeaders: mergedHeaders } : {}),\n ...(t.fetch !== undefined ? { fetch: t.fetch } : {}),\n // usetheokit/theokit-sdk#383 — forwarded only when the profile declares it, so a provider that\n // has not been measured against `reasoning.context` keeps the request it had.\n ...(profile.encryptedReasoning === true ? { encryptedReasoning: true } : {}),\n providerName: profile.name,\n });\n }\n // The message used to say: \"Install a third-party transport plugin\n // (@theokit-transport-${apiMode})\". There is no plugin mechanism to install into —\n // `registerTransport` and `transportRegistry` have zero hits in this package, and the only other\n // occurrence of the string `theokit-transport` was a docblock describing this line. A reader would\n // have searched for the package, then for the plugin API, before concluding the SDK was wrong\n // rather than their configuration. Transports are a closed set; the message now says so and names\n // the whole set, which is a smaller promise and the true one.\n throw new ConfigurationError(\n `Provider \"${profile.name}\" declares apiMode \"${profile.apiMode}\", which this SDK has no ` +\n `transport for. Transports are built in and cannot be extended by a plugin; the supported ` +\n `modes are \"chat_completions\", \"anthropic_messages\", \"bedrock_anthropic\" and ` +\n `\"responses_api\". Change the provider's apiMode to one of those, or open an issue if the ` +\n `provider genuinely speaks a fifth protocol.`,\n { code: \"transport_unavailable\" },\n );\n}\n","/**\n * T1.3 — API key boundary validation.\n *\n * `validateApiKeyShape(key, provider?)` runs at the create-agent boundary\n * and rejects malformed inputs early (whitespace-only strings, sub-16-char\n * fragments, embedded whitespace, missing-prefix shapes for providers that\n * stamp a known prefix). The check is shape-only — it does NOT make a\n * round-trip to the provider; live validation still happens at the first\n * `fetch` against the provider URL.\n *\n * Exempted from shape validation:\n * - fixture keys (prefix `theo_test_`) — used by SDK consumers' fixture-mode tests.\n * - local-runtime mock key `\"local\"` — used by Ollama / LMStudio / llama.cpp\n * sibling profiles (ADRs D182/D188/D189) whose `authType` is `\"none\"`.\n *\n * @internal\n */\n\nconst FIXTURE_KEY_PREFIX = \"theo_test_\";\n/**\n * The sentinel key that forces the local runtime without a real provider\n * credential. Exported so callers threading an explicit `apiKey` into the\n * provider router can skip it (it is not a real credential). @internal\n */\nexport const LOCAL_RUNTIME_MOCK_KEY = \"local\";\nconst MIN_KEY_LENGTH = 16;\n\ninterface ProviderPrefixHint {\n /** Substring (case-sensitive) that legitimate keys for this provider start with. */\n prefix: string;\n /** Provider canonical name used by the boundary helper for error messages. */\n provider: string;\n}\n\nconst KNOWN_PROVIDER_PREFIXES: ProviderPrefixHint[] = [\n { provider: \"openai\", prefix: \"sk-\" },\n { provider: \"anthropic\", prefix: \"sk-ant-\" },\n { provider: \"openrouter\", prefix: \"sk-or-\" },\n];\n\nexport interface ApiKeyValidationFailure {\n readonly malformed: true;\n readonly reason:\n | \"empty\"\n | \"whitespace_only\"\n | \"too_short\"\n | \"embedded_whitespace\"\n | \"missing_known_prefix\";\n readonly message: string;\n}\n\nexport interface ApiKeyValidationOk {\n readonly malformed: false;\n}\n\nexport type ApiKeyValidationResult = ApiKeyValidationOk | ApiKeyValidationFailure;\n\nexport interface ValidateApiKeyOptions {\n /** Provider name (lowercase) for prefix sanity check. */\n provider?: string;\n /**\n * When `false`, only OBVIOUSLY-malformed inputs (empty, whitespace-only,\n * < 4 chars) are rejected. Set when the caller knows the value is just an\n * identifier (e.g., `shouldUseRealLocalRuntime` mode where the real HTTP\n * call uses an env credential instead of this `apiKey`).\n *\n * When `true` (default), the full shape check applies: 16-char minimum,\n * provider-prefix sanity, no embedded whitespace.\n */\n strict?: boolean;\n}\n\n/**\n * Validate the shape of an API key. Returns a discriminated result; the\n * boundary caller (`agent.ts createLocalAgent` / `createCloudAgent`) throws\n * `AuthenticationError({code:\"malformed_api_key\"})` on failure.\n */\nexport function validateApiKeyShape(\n key: string | undefined,\n options: ValidateApiKeyOptions | string = {},\n): ApiKeyValidationResult {\n // Back-compat: legacy callers pass a bare `provider` string as 2nd arg.\n const opts: ValidateApiKeyOptions = typeof options === \"string\" ? { provider: options } : options;\n const tier1 = checkTier1(key);\n if (tier1.malformed) return tier1;\n // Tier 1 succeeded → key is a non-empty string ≥ 4 chars; narrow it.\n const validKey = key as string;\n if (validKey.startsWith(FIXTURE_KEY_PREFIX) || validKey === LOCAL_RUNTIME_MOCK_KEY) {\n return { malformed: false };\n }\n if (opts.strict === false) return { malformed: false };\n return checkTier2(validKey, opts.provider);\n}\n\nfunction checkTier1(key: string | undefined): ApiKeyValidationResult {\n if (key === undefined || key.length === 0) {\n return { malformed: true, reason: \"empty\", message: \"API key is empty.\" };\n }\n if (key.trim().length === 0) {\n return {\n malformed: true,\n reason: \"whitespace_only\",\n message: \"API key contains only whitespace.\",\n };\n }\n if (key.length < 4) {\n return {\n malformed: true,\n reason: \"too_short\",\n message: `API key must be at least 4 chars (got ${key.length}).`,\n };\n }\n return { malformed: false };\n}\n\nfunction checkTier2(key: string, provider: string | undefined): ApiKeyValidationResult {\n if (key.length < MIN_KEY_LENGTH) {\n return {\n malformed: true,\n reason: \"too_short\",\n message: `API key must be at least ${MIN_KEY_LENGTH} chars (got ${key.length}).`,\n };\n }\n if (/\\s/.test(key)) {\n return {\n malformed: true,\n reason: \"embedded_whitespace\",\n message: \"API key contains embedded whitespace.\",\n };\n }\n return checkProviderPrefix(key, provider);\n}\n\nfunction checkProviderPrefix(key: string, provider: string | undefined): ApiKeyValidationResult {\n if (provider === undefined) return { malformed: false };\n const hint = KNOWN_PROVIDER_PREFIXES.find((p) => p.provider === provider.toLowerCase());\n if (hint === undefined) return { malformed: false };\n if (!key.startsWith(hint.prefix)) {\n return {\n malformed: true,\n reason: \"missing_known_prefix\",\n message: `API key for provider \"${hint.provider}\" expected to start with \"${hint.prefix}\".`,\n };\n }\n return { malformed: false };\n}\n","/**\n * Bridge plugin-aggregated provider profiles into the provider registry so a\n * `kind: \"model-provider\"` plugin actually routes (T1 — closes the half-wired\n * path: `PluginManager` aggregated `providerProfiles` were never registered,\n * so `getProviderProfile`/`resolveProviderChain` never saw them).\n *\n * `registerProvider` is idempotent + WARN-on-override (ADR D107), so calling\n * this once per local run is safe.\n *\n * @internal\n */\n\nimport { registerProvider } from \"./registry.js\";\nimport type { ProviderProfile } from \"./types.js\";\n\n/** One aggregated provider entry, as collected by `PluginManager`. */\nexport interface PluginProviderEntry {\n readonly pluginName: string;\n readonly profile: ProviderProfile;\n}\n\n/**\n * Register every plugin-contributed provider profile. Returns the number of\n * profiles registered (used as the runtime signal for the wiring triad).\n */\nexport function registerPluginProviderProfiles(\n entries: ReadonlyArray<PluginProviderEntry>,\n): number {\n let registered = 0;\n for (const entry of entries) {\n registerProvider(entry.profile);\n registered += 1;\n }\n return registered;\n}\n","/**\n * \"Does this process hold a REAL provider credential?\" — one question, one home.\n *\n * It used to live in `runtime/fixtures/fixture-mode.ts`, a 229-line module answering three unrelated\n * questions. This one spans AWS Bedrock (env var, access key, profile, `~/.aws/credentials` on\n * disk), GCP Vertex (ADC), a stored OAuth credential read off disk, and three named provider env\n * vars — a credential policy, filed under a name about test fixtures. Its dependency already pointed\n * here: `internal/auth/credential-store.js`.\n *\n * Every predicate is SYNCHRONOUS and checks a signal, never a live endpoint. Probing would be async\n * and would make a decision that belongs at request time — an unreachable Ollama or an expired token\n * must surface as a typed error from the call, not as a silent fall-through to fixture data.\n *\n * @internal\n */\n\nimport { existsSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { readStoredOAuth } from \"./credential-store.js\";\nimport type { CredentialStoreConfig } from \"./types.js\";\n\n/**\n * The provider credentials `shouldUseRealLocalRuntime` consults by name.\n *\n * Exported so the \"Missing API key\" refusal can name the ones the caller actually set (#338 item\n * 5). The list used to live only inside the predicate below, which meant a caller with\n * `OPENROUTER_API_KEY` set and `THEOKIT_API_KEY` unset was refused by a message naming neither —\n * the SDK checks this exact variable a few lines down to decide the runtime, so the environment\n * looks configured to the person who set it up. Reported as a three-hour diagnosis.\n *\n * One list, two readers: a variable added here is recognised by the predicate AND named by the\n * error on the same commit, which is the only way the two stay in step.\n */\nexport const PROVIDER_CREDENTIAL_ENV_VARS: readonly string[] = [\n \"ANTHROPIC_API_KEY\",\n \"OPENAI_API_KEY\",\n \"OPENROUTER_API_KEY\",\n];\n\n/** Those of {@link PROVIDER_CREDENTIAL_ENV_VARS} that are non-empty in this process. */\nexport function presentProviderCredentialEnvVars(): readonly string[] {\n return PROVIDER_CREDENTIAL_ENV_VARS.filter((name) => {\n const value = process.env[name];\n return typeof value === \"string\" && value.length > 0;\n });\n}\n\n/**\n * The SDK's ambient credential store, mirroring the one `openai-chatgpt` reads. Kept in sync with\n * `providers/builtin/openai-chatgpt.ts`; `THEOKIT_AUTH_HOME` (not `THEOKIT_HOME`) is the override.\n */\nconst AMBIENT_STORE: CredentialStoreConfig = {\n home: homedir(),\n dirName: \".theokit\",\n fileName: \"auth.json\",\n homeEnvVar: \"THEOKIT_AUTH_HOME\",\n};\n\n/**\n * #445 — a stored OAuth credential green-lights the real runtime, the same way Bedrock and Vertex\n * do for their own non-env auth. Without it, `authType: \"oauth_device_code\"` providers fall through\n * to the fixture responder after a SUCCESSFUL login: the docblock's rule (\"a non-fixture API key AND\n * at least one provider env credential\") predates OAuth providers and was never revisited when\n * `openai-chatgpt` landed.\n *\n * Reads only — never refreshes, never writes. Presence is the signal; validity is the transform's\n * problem at request time, and an expired credential must surface as an auth error rather than as\n * a fixture answer that looks like success.\n *\n * @internal\n */\nexport function isStoredOAuthAvailable(\n env: Record<string, string | undefined> = process.env,\n): boolean {\n try {\n return readStoredOAuth(AMBIENT_STORE, env) !== undefined;\n } catch {\n // An unreadable or malformed store is not a green light, but it is also not a crash:\n // the caller falls through to the env-var path and the failure surfaces there.\n return false;\n }\n}\n\n/**\n * ADRs D286-D287: Bedrock green-lights real runtime when EITHER\n * `AWS_BEARER_TOKEN_BEDROCK` is set explicitly OR the standard AWS\n * credential chain (`AWS_ACCESS_KEY_ID` + `AWS_SECRET_ACCESS_KEY` /\n * `AWS_PROFILE` / instance role) can mint a Bearer via\n * `@aws/bedrock-token-generator`. We only check synchronous signals here;\n * the actual token resolution happens lazily in\n * `BedrockAnthropicClient.stream`.\n */\nexport function isAwsBedrockAuthAvailable(): boolean {\n if (\n typeof process.env.AWS_BEARER_TOKEN_BEDROCK === \"string\" &&\n process.env.AWS_BEARER_TOKEN_BEDROCK.length > 0\n ) {\n return true;\n }\n if (\n typeof process.env.AWS_ACCESS_KEY_ID === \"string\" &&\n process.env.AWS_ACCESS_KEY_ID.length > 0\n ) {\n return true;\n }\n if (typeof process.env.AWS_PROFILE === \"string\" && process.env.AWS_PROFILE.length > 0) {\n return true;\n }\n // Default profile file (~/.aws/credentials). The credential chain will\n // resolve it via fromNodeProviderChain() at stream time, or surface a\n // helpful error if neither file nor IMDS is reachable.\n return awsCredentialsFileExists();\n}\n\nfunction awsCredentialsFileExists(): boolean {\n try {\n const home = process.env.HOME ?? process.env.USERPROFILE;\n if (home === undefined || home.length === 0) return false;\n return existsSync(`${home}/.aws/credentials`) || existsSync(`${home}/.aws/config`);\n } catch {\n return false;\n }\n}\n\n/**\n * ADR D288: Vertex green-lights real runtime when EITHER\n * `GOOGLE_APPLICATION_CREDENTIALS` is set OR `GOOGLE_CLOUD_PROJECT` is set\n * (ADC will use gcloud user creds / metadata server). The actual token\n * resolution happens lazily in `VertexAnthropicClient.stream` /\n * `VertexGeminiClient.stream`.\n */\nexport function isGcpVertexAuthAvailable(): boolean {\n if (\n typeof process.env.GOOGLE_APPLICATION_CREDENTIALS === \"string\" &&\n process.env.GOOGLE_APPLICATION_CREDENTIALS.length > 0\n ) {\n return true;\n }\n if (\n typeof process.env.GOOGLE_CLOUD_PROJECT === \"string\" &&\n process.env.GOOGLE_CLOUD_PROJECT.length > 0\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * ADR D182 / T1.2: **always `true`.** Zero-config local providers (`authType: \"none\"`) need no\n * credential — Ollama defaults to localhost:11434, LM Studio to localhost:1234, llama.cpp to\n * localhost:8080 — and the SDK ships Ollama as a builtin, so one is always nominally available.\n * Nothing is probed here; probing would be async. If no daemon is up, the first real LLM call\n * surfaces `ollama_unreachable` via the typed mapper.\n *\n * This used to say it returned true \"when ANY of the documented local hosts is reachable in spirit\",\n * which reads as a probe and is not a testable statement. The body has always been `return true`.\n * The distinction matters because of where this sits — see the note on the `||` chain in\n * `shouldUseRealLocalRuntime`.\n */\nexport function isLocalNoAuthProviderAvailable(): boolean {\n return true;\n}\n","/**\n * Fixture-mode detection.\n *\n * When `THEOKIT_API_BASE_URL` is NOT set and the API key matches the\n * `theo_test_*` pattern, the SDK runs in fixture mode — it returns\n * deterministic, baked-in responses that match the golden fixtures under\n * `tests/golden/`. This is documented behavior and part of the contract\n * (analogous to Stripe's test keys), NOT a test-side mock.\n *\n * When `THEOKIT_API_BASE_URL` is set (e.g. pointing at a test HTTP server\n * or a real Theo PaaS instance), the SDK always performs real HTTP\n * requests — fixture mode is short-circuited.\n *\n *\n * WHAT THIS FILE NO LONGER ANSWERS. It used to answer three unrelated questions in 229 lines: this\n * one, \"what base URL is configured\" (now `internal/base-url.ts`, whose real consumer is the\n * production HTTP module) and \"does this process hold a real provider credential\" (now\n * `internal/auth/credential-availability.ts`, where its dependency already pointed).\n * `shouldUseRealLocalRuntime` stays here because it COMPOSES the three — it is the decision, not the\n * policy.\n *\n * @internal\n */\n\nimport {\n isAwsBedrockAuthAvailable,\n isGcpVertexAuthAvailable,\n isLocalNoAuthProviderAvailable,\n isStoredOAuthAvailable,\n presentProviderCredentialEnvVars,\n} from \"../../auth/credential-availability.js\";\nimport { getConfiguredBaseUrl } from \"../../base-url.js\";\n\nconst FIXTURE_API_KEY_PREFIX = \"theo_test_\";\n\n/**\n * Returns `true` when the given API key is a fixture-mode key.\n *\n * @internal\n */\nexport function isFixtureApiKey(apiKey: string | undefined): boolean {\n if (apiKey === undefined) return false;\n return apiKey.startsWith(FIXTURE_API_KEY_PREFIX);\n}\n\n/**\n * Returns `true` when the SDK should respond from baked-in fixture data\n * instead of performing a real HTTP request.\n *\n * Rule: fixture mode is on iff (no explicit base URL configured) AND\n * (API key matches the fixture-key pattern).\n *\n * @internal\n */\nexport function shouldUseFixtureMode(apiKey: string | undefined): boolean {\n if (getConfiguredBaseUrl() !== undefined) return false;\n return isFixtureApiKey(apiKey);\n}\n\n/**\n * Returns `true` when the local runtime should drive the real LLM agent\n * loop instead of the deterministic fixture responder. Real mode requires\n * a non-fixture API key AND at least one provider env credential.\n *\n * @internal\n */\nexport function shouldUseRealLocalRuntime(apiKey: string | undefined): boolean {\n if (isFixtureApiKey(apiKey)) return false;\n // #445: an OAuth provider holds NO apiKey and sets NO env var — the credential lives on disk,\n // which is the whole point of `/login`. Both gates below reject it by construction, so a\n // logged-in `openai-chatgpt` consumer silently got the fixture responder and a plausible\n // answer with no error. This check runs FIRST, because the apiKey gate is what rejects it.\n if (isStoredOAuthAvailable()) return true;\n if (apiKey === undefined || apiKey.length === 0) return false;\n // ADR D182 / T1.2: `authType: \"none\"` providers (Ollama, LM Studio,\n // llama.cpp) do not require any provider env var. Treat their presence\n // — signaled via OLLAMA_HOST/LMSTUDIO_HOST/LLAMACPP_HOST OR the\n // implicit-localhost default — as a green-light for real runtime.\n // For zero-config Ollama, we accept the default `http://localhost:11434`\n // unconditionally; the actual call will surface a typed\n // `ollama_unreachable` if Ollama is not running.\n // READ THIS BEFORE AUDITING THE CHAIN: the last term is unconditionally `true`, so this whole\n // expression is `true` for any non-fixture, non-empty key. The three terms above it cannot change\n // the outcome — they are documentation of which credentials the SDK recognises, not a decision.\n // `presentProviderCredentialEnvVars` is separately exported and IS load-bearing: the \"Missing API\n // key\" refusal names what the caller actually set (#338 item 5).\n //\n // The terms are kept rather than collapsed to `return true` because the day the builtin-Ollama\n // assumption is revisited, this is the list to re-activate — and because two tests and\n // `internal/agent/helpers.ts:130` already document the chain in this shape. What is not kept is\n // the impression that it discriminates.\n return (\n presentProviderCredentialEnvVars().length > 0 ||\n isAwsBedrockAuthAvailable() ||\n isGcpVertexAuthAvailable() ||\n isLocalNoAuthProviderAvailable()\n );\n}\n","/**\n * Provider inference helpers for the real local run — extracted from\n * `real-local-run.ts` to keep it within the G8 LoC budget and give the\n * \"which provider?\" heuristics one cohesive home.\n *\n * The precedence diagnostic joined them for the same two reasons: it answers the same question\n * (\"which provider, and was that what the caller asked for?\"), and adding it inline pushed\n * `real-local-run.ts` to 411 LoC against the 400 budget. The gate asked for a split and this is\n * where the split already lives.\n *\n * @internal\n */\n\nimport { providerFromApiKeyPrefix } from \"../auth/api-key-prefix.js\";\nimport { LOCAL_RUNTIME_MOCK_KEY } from \"../auth/api-key-validator.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { parseModelId } from \"../llm/model-identifier.js\";\nimport { getProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { registerPluginProviderProfiles } from \"../providers/register-plugin-providers.js\";\nimport { isFixtureApiKey } from \"../runtime/fixtures/fixture-mode.js\";\nimport type { CreateRealLocalRunOptions } from \"./real-local-run-options.js\";\n\n/**\n * The provider a key belongs to, **restricted to providers this runtime can construct**.\n *\n * The prefix table moved to `auth/api-key-prefix.ts` and is no longer duplicated here — it was the\n * same knowledge in two places, and the copy here relied on its entries being hand-written in\n * longest-first order to be correct at all. What stays is the part that is genuinely this path's\n * policy: the local run will not name a provider it has no profile for.\n *\n * @internal\n */\nexport function inferProviderFromApiKey(apiKey: string | undefined): string | undefined {\n const provider = providerFromApiKeyPrefix(apiKey);\n if (provider === undefined) return undefined;\n return getProviderProfile(provider) === undefined ? undefined : provider;\n}\n\n/**\n * The default primary provider from the environment: the first of\n * ANTHROPIC / OPENAI / OPENROUTER with a non-empty key, else `openai`.\n *\n * @internal\n */\nexport function detectPrimaryProvider(): string {\n if (process.env.ANTHROPIC_API_KEY !== undefined && process.env.ANTHROPIC_API_KEY.length > 0) {\n return \"anthropic\";\n }\n if (process.env.OPENAI_API_KEY !== undefined && process.env.OPENAI_API_KEY.length > 0) {\n return \"openai\";\n }\n if (process.env.OPENROUTER_API_KEY !== undefined && process.env.OPENROUTER_API_KEY.length > 0) {\n return \"openrouter\";\n }\n return \"openai\";\n}\n\n/**\n * Warns once per (asked, used) pair when the resolved provider is not the one the model id named.\n *\n * One-shot per pair, mirroring `warnNoAuthApiKeysIgnoredOnce` in `router.ts` — the same \"your\n * input was ignored, here is why\" shape, and a per-request warning is one nobody reads.\n *\n * Silent when the model id carried no provider prefix, or when the prefix IS what was used: an\n * override that did not happen is not news.\n *\n * @internal\n */\nconst warnedProviderPrecedence = new Set<string>();\nexport function warnProviderPrecedenceOnce(asked: string | undefined, used: string): void {\n if (asked === undefined || asked === used) return;\n const key = `${asked}->${used}`;\n if (warnedProviderPrecedence.has(key)) return;\n warnedProviderPrecedence.add(key);\n diag(\n `[theokit-sdk] model id names provider \"${asked}\", but \"${used}\" was used — an explicit ` +\n \"`providers.routes[0]` or the API key's own prefix outranks the model id's prefix. \" +\n \"Pass `providers.routes` to choose deliberately.\\n\",\n );\n}\n\n/** Test-only reset. @internal */\nexport function _resetProviderPrecedenceWarnings(): void {\n warnedProviderPrecedence.clear();\n}\n\n/**\n * MOVED HERE 2026-09-02 from `real-local-run.ts`, which was the largest file in the slice and held\n * six concerns. This is one of them: the four-level provider precedence — explicit route, then the\n * key's prefix, then the model's prefix, then env-var detection — plus the credential merge that\n * follows from it. Its neighbours in this file (`inferProviderFromApiKey`, `detectPrimaryProvider`,\n * `warnProviderPrecedenceOnce`) are the steps it composes, so the seam already existed; only the\n * composition was on the other side of it.\n */\n\n// Module-level one-shot: the observability line fires once per process, not\n// once per run, to avoid log spam when many agents are created.\nlet pluginProvidersAnnounced = false;\n\n/** Test-only reset for the one-shot announcement. @internal */\nexport function _resetPluginProviderAnnounce(): void {\n pluginProvidersAnnounced = false;\n}\n\n/**\n * Resolve the run's primary provider + effective model id.\n *\n * Registers builtins AND any plugin-contributed `kind: \"model-provider\"`\n * profiles FIRST, so the prefix-inference lookup (`model: { id: \"myprov/...\" }`)\n * can see a plugin-supplied provider. The aggregated profiles were otherwise\n * never registered (half-wired path). Extracted from `buildLoopInputs` (SRP)\n * and exported `@internal` so the plugin-provider wiring is regression-covered.\n *\n * ADR D182 / T1.2: explicit `providers.routes[0].provider` wins, then prefix\n * inference, then env-var heuristics (`detectPrimaryProvider`).\n *\n * @internal\n */\nexport function resolveRunProvider(options: CreateRealLocalRunOptions): {\n primary: string;\n effectiveModelId: string;\n} {\n registerBuiltins();\n const profiles = options.pluginManager?.aggregated.providerProfiles ?? [];\n const registered = registerPluginProviderProfiles(profiles);\n // Wiring-triad pillar (c): one-shot observability that plugin providers were\n // wired this process. Silent on the zero-plugin happy path.\n if (registered > 0 && !pluginProvidersAnnounced) {\n pluginProvidersAnnounced = true;\n const names = profiles.map((e) => e.profile.name).join(\", \");\n diag(`[theokit-sdk] registered ${registered} plugin provider profile(s): ${names}\\n`);\n }\n const parsedModel = parseModelId(options.model?.id);\n const modelInferredProvider =\n parsedModel.provider !== undefined && getProviderProfile(parsedModel.provider) !== undefined\n ? parsedModel.provider\n : undefined;\n // M4 (plan m4-provider-routing-apikey-fix): the explicitly-passed API key is\n // the ground-truth credential of which endpoint will be called, so it outranks\n // model-prefix inference for `primary` — a `sk-or-` key + an `openai/gpt-4o-mini`\n // model MUST route to OpenRouter, not the OpenAI provider. An explicit\n // `providers.routes[0].provider` still wins (user override).\n const keyInferredProvider = inferProviderFromApiKey(options.agentOptions.apiKey);\n const primary =\n options.agentOptions.providers?.routes?.[0]?.provider ??\n keyInferredProvider ??\n modelInferredProvider ??\n detectPrimaryProvider();\n // The precedence above is deliberate, but it used to be silent: a caller writing\n // `model: { id: \"e2elocal/gpt-4o-mini\" }` and receiving `openai API error: auth_failed` had no\n // way to learn their prefix had been overruled, because the error names only the winner\n // (B-156). `error-handling.md` § 2 asks that a substitution be visible.\n warnProviderPrecedenceOnce(modelInferredProvider, primary);\n // Strip the vendor prefix ONLY when the model's own prefix names the resolved\n // primary (anthropic/claude → claude for the anthropic provider). When primary\n // is an aggregator (openrouter) whose slug legitimately embeds a `vendor/`\n // segment (openai/gpt-4o-mini), pass the id through unstripped.\n const effectiveModelId =\n modelInferredProvider !== undefined && modelInferredProvider === primary\n ? parsedModel.name\n : (options.model?.id ?? \"claude-sonnet-4-6\");\n return { primary, effectiveModelId };\n}\n\n/**\n * M4: thread the single `Agent.create({ apiKey })` credential into the router's\n * per-provider pool for the resolved `primary`, so an explicitly-passed key is\n * used even when the matching env var is unset. An existing `providers.apiKeys`\n * pool for the provider wins (it is the more-specific config); fixture and\n * `local` sentinels are never threaded (they are not real credentials). @internal\n */\nexport function mergeExplicitApiKey(\n pools: Record<string, string[]> | undefined,\n primary: string,\n apiKey: string | undefined,\n): Record<string, string[]> | undefined {\n if (apiKey === undefined || apiKey.length === 0) return pools;\n if (isFixtureApiKey(apiKey) || apiKey === LOCAL_RUNTIME_MOCK_KEY) return pools;\n const existing = pools?.[primary];\n if (existing !== undefined && existing.length > 0) return pools;\n return { ...(pools ?? {}), [primary]: [apiKey] };\n}\n","/**\n * T2.2 — Provider-agnostic compression-model registry (ADR D440).\n *\n * Resolves a cheaper-tier summarization model in the SAME vendor family\n * as the agent's main model. Provider-agnostic by design: a consumer\n * running on Anthropic-only / Ollama-only / Bedrock-only never needs\n * to provision a second vendor's key for the compression aux-LLM.\n *\n * Resolution algorithm:\n *\n * 1. Exact match in `EXACT_REGISTRY` → cheaper-tier id (most cases).\n * 2. Wildcard match in `WILDCARD_REGISTRY` (`*` suffix in key) →\n * swap matched suffix (Bedrock region-prefixed variants).\n * 3. Provider in `NO_AUTH_PROVIDERS` (Ollama / LM Studio / llama.cpp)\n * → return SAME model id (local — cost N/A; running the same\n * model for summarization costs only the round-trip latency,\n * acceptable in dev/local mode).\n * 4. No match → throw `CompressionModelUnresolvedError` with the\n * actionable message naming the model + override path + the\n * registry-PR remediation hint.\n *\n * Step 1 of T2.2 (compression-helpers wire). Step 2 wires this into\n * `compression-config.ts`. Step 3 builds the OTel-instrumented aux\n * client. Step 4 wires into `loop.ts` ContextWindowExceededError catch.\n *\n * @internal\n */\n\nimport { TheokitAgentError } from \"../../../errors.js\";\n\n/**\n * Exact `agent-model → compression-model` map. Most cases land here.\n * Entries MUST keep cheaper-tier model within the SAME vendor family\n * as the key (Unbreakable Rule 9 — provider-agnostic).\n */\nconst EXACT_REGISTRY: ReadonlyMap<string, string> = new Map([\n // OpenAI family\n [\"openai/gpt-4o\", \"openai/gpt-4o-mini\"],\n [\"openai/gpt-4-turbo\", \"openai/gpt-4o-mini\"],\n [\"openai/gpt-4\", \"openai/gpt-4o-mini\"],\n [\"openai/o1-preview\", \"openai/gpt-4o-mini\"],\n [\"openai/o1\", \"openai/gpt-4o-mini\"],\n [\"openai/o3\", \"openai/gpt-4o-mini\"],\n [\"openai/o3-mini\", \"openai/gpt-4o-mini\"],\n // Anthropic family\n [\"anthropic/claude-opus-4\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-sonnet-4\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-5-sonnet\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-5-sonnet-latest\", \"anthropic/claude-3-5-haiku-latest\"],\n [\"anthropic/claude-3-opus\", \"anthropic/claude-3-haiku\"],\n [\"anthropic/claude-3-sonnet\", \"anthropic/claude-3-haiku\"],\n // Vertex (Gemini + Anthropic-on-Vertex)\n [\"vertex/gemini-1.5-pro\", \"vertex/gemini-1.5-flash\"],\n [\"vertex/gemini-2.0-pro\", \"vertex/gemini-1.5-flash\"],\n [\"vertex/claude-3-5-sonnet\", \"vertex/claude-3-5-haiku\"],\n [\"vertex/claude-3-opus\", \"vertex/claude-3-haiku\"],\n // OpenRouter (preserve openrouter prefix, swap tier within same vendor)\n [\"openrouter/openai/gpt-4o\", \"openrouter/openai/gpt-4o-mini\"],\n [\"openrouter/openai/gpt-4-turbo\", \"openrouter/openai/gpt-4o-mini\"],\n [\"openrouter/anthropic/claude-3-5-sonnet\", \"openrouter/anthropic/claude-3-5-haiku\"],\n [\"openrouter/anthropic/claude-opus-4\", \"openrouter/anthropic/claude-3-5-haiku\"],\n]);\n\n/**\n * Wildcard `agent-model-prefix* → compression-model-prefix*` map.\n * Used for region-prefixed Bedrock variants where the registry can't\n * enumerate every region literal. Matching algorithm: the registry\n * key MUST end with `*`; the input MUST match the prefix; the input's\n * suffix after the prefix is appended to the resolved value (also\n * ending with `*` to mark the swap point).\n */\nconst WILDCARD_REGISTRY: ReadonlyArray<readonly [string, string]> = [\n // Bedrock Anthropic: us.anthropic.claude-sonnet-* → us.anthropic.claude-3-haiku-*\n [\"bedrock/anthropic.claude-sonnet*\", \"bedrock/anthropic.claude-3-haiku*\"],\n [\"bedrock/anthropic.claude-opus*\", \"bedrock/anthropic.claude-3-haiku*\"],\n [\"bedrock/anthropic.claude-3-5-sonnet*\", \"bedrock/anthropic.claude-3-5-haiku*\"],\n];\n\n/**\n * Providers declaring `authType: \"none\"` in their profile (D182, D188,\n * D189). For these, return the SAME model — local runtime has no\n * \"cheaper tier\" semantics, latency penalty of summarizing twice is\n * acceptable in dev/local mode. Keys are the provider prefix BEFORE\n * the slash.\n */\nconst NO_AUTH_PROVIDERS: ReadonlySet<string> = new Set([\"ollama\", \"lmstudio\", \"llamacpp\"]);\n\n/**\n * T2.2 — Typed error thrown when `resolveCompressionModel` cannot\n * find a same-family-cheaper-tier mapping for `agentModel`. Surfaces\n * the offending model id so operators can either (a) provide\n * `Agent.create({compression: {model: ...}})` explicitly or (b) open\n * a registry-PR adding the missing entry.\n *\n * @public\n */\nexport class CompressionModelUnresolvedError extends TheokitAgentError {\n override readonly name = \"CompressionModelUnresolvedError\";\n readonly agentModel: string;\n constructor(agentModel: string) {\n // Not retryable: the registry has no entry for this model until someone adds one.\n super(\n `Could not resolve a same-family-cheaper-tier compression model for \"${agentModel}\". ` +\n `Provide Agent.create({compression: {model: \"<your-cheaper-model>\"}}) ` +\n `OR add \"${agentModel}\" to the compression-model-registry (see ADR D440).`,\n { code: \"compression_model_unresolved\", isRetryable: false },\n );\n this.agentModel = agentModel;\n }\n}\n\n/**\n * T2.2 — Resolve a cheaper-tier compression model from the agent's\n * main model id. Pure function — no I/O, no mutation, deterministic.\n *\n * @throws `CompressionModelUnresolvedError` when no rule matches.\n *\n * @internal\n */\nexport function resolveCompressionModel(agentModel: string): string {\n const exact = EXACT_REGISTRY.get(agentModel);\n if (exact !== undefined) return exact;\n const wildcard = matchWildcard(agentModel);\n if (wildcard !== null) return wildcard;\n if (isNoAuthProvider(agentModel)) return agentModel;\n throw new CompressionModelUnresolvedError(agentModel);\n}\n\n/** Wildcard suffix match — Bedrock region-prefixed variants. */\nfunction matchWildcard(agentModel: string): string | null {\n for (const [pattern, replacement] of WILDCARD_REGISTRY) {\n const prefix = pattern.endsWith(\"*\") ? pattern.slice(0, -1) : pattern;\n if (!agentModel.startsWith(prefix)) continue;\n const suffix = agentModel.slice(prefix.length);\n const replPrefix = replacement.endsWith(\"*\") ? replacement.slice(0, -1) : replacement;\n return `${replPrefix}${suffix}`;\n }\n return null;\n}\n\n/** Provider declares `authType: \"none\"` — local runtime, same model. */\nfunction isNoAuthProvider(agentModel: string): boolean {\n const slashIdx = agentModel.indexOf(\"/\");\n if (slashIdx <= 0) return false;\n return NO_AUTH_PROVIDERS.has(agentModel.slice(0, slashIdx));\n}\n","/**\n * T2.2 step 3/N — Compression summarizer (ADR D440).\n *\n * Takes a conversation window (messages to compress) + a resolved\n * compression model + an injected LLM caller, and returns a single\n * system-role summary message that replaces the compressed window.\n *\n * The `callLlm` parameter is dependency-injected so:\n * - Unit tests pass a deterministic fake (no real-LLM cost)\n * - The agent-loop passes a real LLM client bound to the resolved\n * compression config (step 4 wire)\n *\n * Failure mode per ADR D440: if the LLM call fails, throws\n * `CompressionFailedError` — the caller (loop.ts) catches this,\n * logs WARN with redacted metadata, and returns the ORIGINAL\n * conversation unchanged (counter incremented toward cap 3).\n *\n * @internal\n */\n\n// Canonical origin moved to the public `compaction.ts` (leaf type — M42 DTS lesson); re-exported\n// here for the existing internal importers.\nimport type { CompressibleMessage } from \"../../../compaction.js\";\nimport { TheokitAgentError } from \"../../../errors.js\";\n\nexport type { CompressibleMessage };\n\n/**\n * Typed error thrown when the compression LLM call fails or returns\n * an empty/ineffective summary. The caller catches and handles per\n * ADR D440 failure mode (WARN + original conversation + counter).\n *\n * @public\n */\nexport class CompressionFailedError extends TheokitAgentError {\n override readonly name = \"CompressionFailedError\";\n\n constructor(message: string, options: { cause?: unknown } = {}) {\n // Retryable: both throw sites are about ONE LLM call that failed or came back empty, which is\n // the transient shape the SDK's retry layer exists for.\n super(message, { ...options, code: \"compression_failed\", isRetryable: true });\n }\n}\n\n/**\n * Build the summarization prompt from a conversation window.\n * The prompt instructs the LLM to produce a concise summary that\n * preserves all facts, decisions, and context needed for the\n * conversation to continue.\n *\n * @internal\n */\nexport function buildCompressionPrompt(messages: readonly CompressibleMessage[]): string {\n const formatted = messages.map((m) => `[${m.role}]: ${m.content}`).join(\"\\n\\n\");\n\n return (\n `Summarize the following ${messages.length} conversation messages into a concise ` +\n `summary that preserves ALL facts, decisions, user preferences, and context ` +\n `needed for the conversation to continue naturally. The summary will replace ` +\n `these messages in the context window. Be thorough but concise.\\n\\n` +\n `--- CONVERSATION TO SUMMARIZE ---\\n${formatted}\\n--- END ---`\n );\n}\n\nconst COMPRESSION_SYSTEM =\n \"You are a conversation summarizer. Produce a concise factual summary. \" +\n \"Preserve all decisions, preferences, code snippets, and action items. \" +\n \"Do not add commentary or opinions. Output ONLY the summary text.\";\n\n/**\n * Compress a conversation window via an aux-LLM summarization call.\n *\n * @param opts.messages — the messages to compress\n * @param opts.model — resolved compression model id\n * @param opts.callLlm — injected LLM caller `(model, system, user) => Promise<string>`\n * @returns a single system-role message containing the summary\n *\n * @throws `CompressionFailedError` on LLM failure or empty summary.\n *\n * @internal\n */\nexport async function compressConversationWindow(opts: {\n messages: readonly CompressibleMessage[];\n model: string;\n callLlm: (model: string, system: string, user: string) => Promise<string>;\n}): Promise<CompressibleMessage> {\n const userPrompt = buildCompressionPrompt(opts.messages);\n\n let summary: string;\n try {\n summary = await opts.callLlm(opts.model, COMPRESSION_SYSTEM, userPrompt);\n } catch (cause) {\n throw new CompressionFailedError(\n `Compression LLM call failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n { cause: cause instanceof Error ? cause : undefined },\n );\n }\n\n if (!summary || summary.trim().length === 0) {\n throw new CompressionFailedError(\n \"Compression LLM returned empty summary — reduction ineffective.\",\n );\n }\n\n return {\n role: \"system\",\n content: `[Compressed conversation summary]: ${summary.trim()}`,\n };\n}\n","/**\n * M50 (agent-builder) — session-transcript compaction.\n *\n * The mechanism:\n * - the replacement history = recent USER messages verbatim (newest→oldest under a token budget;\n * prior summaries filtered by marker) + ONE summary message with a textual marker prefix,\n * injected as `role:\"user\"` (`build_compacted_history`, compact.rs:589-663);\n * - persistence is APPEND-ONLY: a `compact_boundary` record becomes the new DAG root and the\n * replacement messages are chained onto it — resume replays boundary→replacement→suffix\n * (equivalent of `CompactedItem.replacement_history`, rollout is never truncated);\n * - a failing summarizer leaves the transcript UNTOUCHED (typed error; no partial state).\n *\n * The summarizer is dependency-injected: tests pass a deterministic fake; the public\n * `Agent.compact` wires the ADR-D440 compression summarizer (its first real caller).\n */\n\nimport { type CompressibleMessage, estimateTokens } from \"../../compaction.js\";\nimport type { SessionStore } from \"../../types/session-store.js\";\nimport { diag } from \"../diagnostics.js\";\nimport { globalSingleton } from \"../global-singleton.js\";\nimport { resolveProviderChain } from \"../llm/router.js\";\nimport {\n detectPrimaryProvider,\n inferProviderFromApiKey,\n} from \"../local-agent/real-local-run-provider.js\";\nimport { reconstructMessages, SessionTranscript } from \"../persistence/session-transcript.js\";\nimport { getProviderProfile, registerBuiltins } from \"../providers/index.js\";\nimport { resolveCompressionModel } from \"../runtime/compression/compression-model-registry.js\";\nimport { compressConversationWindow } from \"../runtime/compression/compression-summarizer.js\";\nimport { invalidateSessionCache } from \"./session-cache.js\";\n\n/** Textual marker prefixing every compact summary (Codex `SUMMARY_PREFIX` analog). */\nexport const COMPACT_SUMMARY_MARKER = \"[[theokit:compact-summary]]\";\n\n/** Budget of VERBATIM user messages preserved in the replacement (Codex `COMPACT_USER_MESSAGE_MAX_TOKENS`). */\nexport const COMPACT_USER_MESSAGE_MAX_TOKENS = 20_000;\n\nexport interface CompactLocation {\n cwd: string;\n agentId: string;\n model?: string;\n}\n\nexport interface CompactResult {\n preTokens: number;\n postTokens: number;\n}\n\n/** Is this message a summary produced by a PRIOR compaction? (filtered from verbatim preservation). */\nexport function isCompactSummary(content: string): boolean {\n // M56 — goal-continuation boilerplate is loop plumbing, not user knowledge: preserving N copies of\n // the template verbatim would crowd out real user messages from the preservation budget.\n return (\n content.startsWith(COMPACT_SUMMARY_MARKER) ||\n content.startsWith(\"[[theokit:goal-continuation]]\")\n );\n}\n\n/**\n * Extract the text of an LlmMessage: content is `LlmContentPart[]` — concatenate the `text` parts\n * (tool_call / tool_result / image parts are skipped for compaction purposes).\n */\nfunction plainText(content: unknown): string | undefined {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return undefined;\n const texts = content\n .filter(\n (p): p is { type: string; text: string } =>\n p !== null &&\n typeof p === \"object\" &&\n (p as { type?: unknown }).type === \"text\" &&\n typeof (p as { text?: unknown }).text === \"string\",\n )\n .map((p) => p.text);\n return texts.length > 0 ? texts.join(\"\\n\") : undefined;\n}\n\n/**\n * Compact one session transcript: summarize the reconstructed history, then append (append-only)\n * a `compact_boundary` + the replacement chain (recent user messages verbatim + marker'd summary).\n *\n * @throws whatever `summarize` throws — with the transcript guaranteed untouched.\n */\n// biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\nexport async function compactSessionTranscript(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n trigger: \"manual\" | \"auto\";\n summarize: (messages: readonly CompressibleMessage[]) => Promise<string>;\n}): Promise<CompactResult> {\n const prior = await opts.store.readRecords(opts.loc.agentId);\n const history = reconstructMessages(prior);\n\n const compressible: CompressibleMessage[] = [];\n for (const m of history) {\n const text = plainText(m.content);\n if (\n text !== undefined &&\n (m.role === \"user\" || m.role === \"assistant\" || m.role === \"system\")\n ) {\n compressible.push({ role: m.role, content: text });\n }\n }\n const preTokens = estimateTokens(compressible.map((m) => m.content).join(\"\\n\"));\n\n // Summarize FIRST — a throwing summarizer must leave the transcript untouched (fail-safe).\n const summaryBody = await opts.summarize(compressible);\n\n // Recent user messages verbatim: newest→oldest under the budget, prior summaries filtered.\n const preserved: string[] = [];\n let budget = 0;\n for (let i = compressible.length - 1; i >= 0; i--) {\n const m = compressible[i];\n if (m === undefined || m.role !== \"user\" || isCompactSummary(m.content)) continue;\n const cost = estimateTokens(m.content);\n if (budget + cost > COMPACT_USER_MESSAGE_MAX_TOKENS) {\n // M50 review F8 — Codex TRUNCATES the overflowing message and keeps the piece\n // (compact.rs:620-629); dropping it entirely loses the most-recent context verbatim.\n const remaining = COMPACT_USER_MESSAGE_MAX_TOKENS - budget;\n if (remaining > 50) {\n preserved.unshift(`${m.content.slice(0, remaining * 4)}\\n[...truncated for compaction...]`);\n }\n break;\n }\n budget += cost;\n preserved.unshift(m.content); // chronological order in the replacement\n }\n\n const summary = `${COMPACT_SUMMARY_MARKER}\\n${summaryBody}`;\n\n // Append-only write: boundary (new root) + replacement chained onto it.\n const transcript = SessionTranscript.fromRecords(prior, {\n cwd: opts.loc.cwd,\n sessionId: opts.sessionId,\n model: opts.loc.model ?? \"unknown\",\n });\n transcript.appendCompactBoundary({ preTokens, trigger: opts.trigger });\n for (const text of preserved) transcript.appendUserTurn(text);\n transcript.appendUserTurn(summary);\n const delta = transcript.records().slice(prior.length);\n await opts.store.appendRecords(opts.loc.agentId, delta);\n\n // M50 review F1 — the live process must FEEL the compaction: drop the in-memory session cache so\n // the next send re-hydrates from disk (replacement + later turns) instead of replaying the full\n // pre-compact history until a restart.\n invalidateSessionCache(opts.loc.cwd, opts.loc.agentId);\n\n const postTokens = estimateTokens([...preserved, summary].join(\"\\n\"));\n return { preTokens, postTokens };\n}\n\n/**\n * M50 review F6 (fixed by the probe) — the summarizer's provider route, PURE and unit-tested.\n * Precedence mirrors the run's M4 rule exactly:\n * 1. an EXPLICIT credential's provider wins (an sk-or- key + `openai/…` model must summarize via\n * OpenRouter — the key is the ground truth of which endpoint gets called);\n * 2. else a model prefix with a REGISTERED profile (the oauth `openai-chatgpt` builtin owns its\n * auth; the M45 fleet resolves its own env vars) routes through that profile;\n * 3. else the ENV-detected provider (fresh process, aggregator credential in env).\n * `fullSlug` marks aggregator routes (provider ≠ prefix): the agent's slug passes unstripped.\n */\nexport function resolveSummarizerRoute(opts: {\n keyProvider: string | undefined;\n modelPrefix: string | undefined;\n prefixHasProfile: boolean;\n envProvider: string;\n}): { provider: string; fullSlug: boolean } {\n const provider =\n opts.keyProvider ??\n (opts.prefixHasProfile && opts.modelPrefix !== undefined ? opts.modelPrefix : opts.envProvider);\n return { provider, fullSlug: provider !== opts.modelPrefix };\n}\n\n// ─── Default summarizer (the ADR-D440 subsystem's first real caller) ─────────────────────────────\n\n/**\n * Build the default summarizer for `Agent.compact`: the D440 `compressConversationWindow`\n * (aux-LLM summarization with typed failure) driven by a router-resolved LLM client. The\n * compression model resolves via the D440 registry with the agent's own model as fallback.\n */\nexport function buildDefaultSummarizer(opts: {\n agentModel: string;\n apiKey?: string;\n}): (messages: readonly CompressibleMessage[]) => Promise<string> {\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\n return async (messages) => {\n // Provider resolution mirrors the RUN's own (M4 rule: the explicit API key outranks the model\n // prefix — an sk-or- key + openai/gpt model must summarize via OpenRouter too). Using anything\n // else 401s in real setups (proven live in the M50 probe).\n registerBuiltins();\n const modelPrefix = opts.agentModel.includes(\"/\")\n ? opts.agentModel.slice(0, opts.agentModel.indexOf(\"/\"))\n : undefined;\n const prefixProfile = modelPrefix !== undefined ? getProviderProfile(modelPrefix) : undefined;\n // A prefix profile is only USABLE when its credentials are actually resolvable here: oauth/none\n // profiles own their auth; api_key profiles need one of their env vars set. A profile without a\n // usable credential (e.g. `openai` builtin with only OPENROUTER_API_KEY in env) must NOT win.\n const prefixUsable =\n prefixProfile !== undefined &&\n (prefixProfile.authType !== \"api_key\" ||\n prefixProfile.envVars.some((v) => (process.env[v] ?? \"\").length > 0));\n const route = resolveSummarizerRoute({\n keyProvider: inferProviderFromApiKey(opts.apiKey),\n modelPrefix,\n prefixHasProfile: prefixUsable,\n envProvider: detectPrimaryProvider(),\n });\n const provider = route.provider;\n\n let model: string;\n if (route.fullSlug) {\n // Aggregator route (e.g. OpenRouter): pass the agent's full slug through unstripped.\n model = opts.agentModel;\n } else {\n try {\n model = resolveCompressionModel(opts.agentModel);\n } catch {\n model = opts.agentModel; // registry miss — summarize with the agent's own model\n }\n }\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: pre-existing (M50) — flagged only because this file was touched by an unrelated one-line M56 change; refactor tracked separately.\n const callLlm = async (m: string, system: string, user: string): Promise<string> => {\n const chain = resolveProviderChain({\n primary: provider,\n ...(opts.apiKey !== undefined ? { apiKeys: { [provider]: [opts.apiKey] } } : {}),\n });\n const client = chain[0];\n if (client === undefined) throw new Error(`no LLM client for provider \"${provider}\"`);\n const controller = new AbortController();\n let text = \"\";\n const stream = client.stream(\n { model: m, system, messages: [{ role: \"user\", content: [{ type: \"text\", text: user }] }] },\n controller.signal,\n );\n for (;;) {\n const step = await stream.next();\n if (step.done === true) break;\n if (step.value.type === \"text_delta\") text += step.value.text;\n if (step.value.type === \"error\") throw new Error(step.value.message);\n }\n return text;\n };\n\n const summary = await compressConversationWindow({ messages: [...messages], model, callLlm });\n return summary.content;\n };\n}\n\n// ─── Auto-compaction (Codex formula: fire at usage_real >= (cw*9)/10) ────────────────────────────\n\n/**\n * Should auto-compaction fire? Codex parity: `token_limit_reached` when real usage crosses 90% of\n * the model's context window (`context_window.rs:74-79`; limit default `(cw*9)/10`,\n * `openai_models.rs:459-469`). Missing inputs (no usage reported / model absent from the catalog)\n * NEVER fire — fail-safe toward \"do nothing\".\n */\nexport function shouldAutoCompact(opts: {\n usageTotal?: number | undefined;\n contextWindow?: number | undefined;\n}): boolean {\n if (opts.usageTotal === undefined || opts.contextWindow === undefined) return false;\n if (opts.usageTotal <= 0 || opts.contextWindow <= 0) return false;\n return opts.usageTotal >= Math.floor((opts.contextWindow * 9) / 10);\n}\n\n/** Anti-cascade bookkeeping: last turn we ATTEMPTED an auto-compact, per agent (globalThis — M44 B1). */\nconst autoCompactAttempts = globalSingleton(\n \"theokit-sdk.session.auto-compact-attempts\",\n () => new Map<string, number>(),\n);\n\n/**\n * Fire auto-compaction when the threshold is crossed — at most ONE attempt per turn per agent\n * (anti-cascade: a failing summarizer or a non-reducing summary must not loop). Returns whether a\n * compaction actually happened. Failures WARN and leave the transcript untouched.\n */\nexport async function autoCompactIfNeeded(opts: {\n store: SessionStore;\n loc: CompactLocation;\n sessionId: string;\n usageTotal?: number | undefined;\n contextWindow?: number | undefined;\n turnCount: number;\n summarize: (messages: readonly CompressibleMessage[]) => Promise<string>;\n}): Promise<boolean> {\n if (!shouldAutoCompact(opts)) return false;\n const key = `${opts.loc.cwd}::${opts.loc.agentId}`;\n if (autoCompactAttempts.get(key) === opts.turnCount) return false; // already attempted this turn\n autoCompactAttempts.set(key, opts.turnCount);\n try {\n await compactSessionTranscript({\n store: opts.store,\n loc: opts.loc,\n sessionId: opts.sessionId,\n trigger: \"auto\",\n summarize: opts.summarize,\n });\n return true;\n } catch (cause) {\n const msg = cause instanceof Error ? cause.message : String(cause);\n diag(`[theokit-sdk] auto-compaction failed (left transcript untouched): ${msg}\\n`);\n return false;\n }\n}\n"]}