@theokit/sdk 5.14.0 → 5.15.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 (212) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/dist/{agent-Dfw3VsIX.d.ts → agent-B6C9i_qu.d.ts} +23 -213
  3. package/dist/{agent-DExqjqYy.d.cts → agent-B6FQad6P.d.cts} +23 -213
  4. package/dist/{agent-T34LCGQM.js → agent-DRDGUU6T.js} +18 -17
  5. package/dist/{agent-T34LCGQM.js.map → agent-DRDGUU6T.js.map} +1 -1
  6. package/dist/{agent-TL4K7BTG.cjs → agent-VI2HITPT.cjs} +19 -18
  7. package/dist/{agent-TL4K7BTG.cjs.map → agent-VI2HITPT.cjs.map} +1 -1
  8. package/dist/agent.d.ts +2 -3
  9. package/dist/{batch-EP3FCL6D.js → batch-N2XDYZED.js} +4 -4
  10. package/dist/{batch-EP3FCL6D.js.map → batch-N2XDYZED.js.map} +1 -1
  11. package/dist/{batch-IZ5EDKJ5.cjs → batch-VFR2MAUE.cjs} +7 -7
  12. package/dist/{batch-IZ5EDKJ5.cjs.map → batch-VFR2MAUE.cjs.map} +1 -1
  13. package/dist/{chunk-3ONIVO2I.js → chunk-23SS4ID4.js} +3 -3
  14. package/dist/{chunk-3ONIVO2I.js.map → chunk-23SS4ID4.js.map} +1 -1
  15. package/dist/{chunk-2C24NSNV.js → chunk-3BBTHFGJ.js} +3 -3
  16. package/dist/{chunk-2C24NSNV.js.map → chunk-3BBTHFGJ.js.map} +1 -1
  17. package/dist/{chunk-NP362THY.cjs → chunk-3F53FLQ7.cjs} +5 -7
  18. package/dist/chunk-3F53FLQ7.cjs.map +1 -0
  19. package/dist/{chunk-SXH37C7X.cjs → chunk-55LLQFHW.cjs} +6 -6
  20. package/dist/{chunk-SXH37C7X.cjs.map → chunk-55LLQFHW.cjs.map} +1 -1
  21. package/dist/{chunk-GARVAUCU.js → chunk-5M5GQYBM.js} +534 -236
  22. package/dist/chunk-5M5GQYBM.js.map +1 -0
  23. package/dist/{chunk-2WY2OFSC.cjs → chunk-64ECM3XM.cjs} +616 -318
  24. package/dist/chunk-64ECM3XM.cjs.map +1 -0
  25. package/dist/{chunk-ZJAYFSVI.js → chunk-7ACS6P5Z.js} +5 -7
  26. package/dist/chunk-7ACS6P5Z.js.map +1 -0
  27. package/dist/{chunk-NAVUTK6X.js → chunk-ARC2V7NY.js} +3 -3
  28. package/dist/{chunk-NAVUTK6X.js.map → chunk-ARC2V7NY.js.map} +1 -1
  29. package/dist/{chunk-WDVG5R2Q.cjs → chunk-AUH2EVWY.cjs} +4 -3
  30. package/dist/chunk-AUH2EVWY.cjs.map +1 -0
  31. package/dist/chunk-BNEUB52I.cjs +55 -0
  32. package/dist/chunk-BNEUB52I.cjs.map +1 -0
  33. package/dist/chunk-BPL5CVZ5.js +53 -0
  34. package/dist/chunk-BPL5CVZ5.js.map +1 -0
  35. package/dist/{chunk-NVQSBRG6.js → chunk-CBBT42VX.js} +3 -3
  36. package/dist/{chunk-NVQSBRG6.js.map → chunk-CBBT42VX.js.map} +1 -1
  37. package/dist/chunk-CHKV2L2Y.cjs +416 -0
  38. package/dist/chunk-CHKV2L2Y.cjs.map +1 -0
  39. package/dist/{chunk-SNVYOX46.cjs → chunk-DJKGDLYZ.cjs} +91 -61
  40. package/dist/chunk-DJKGDLYZ.cjs.map +1 -0
  41. package/dist/{chunk-354F3OF5.js → chunk-FGGVSHDW.js} +3 -3
  42. package/dist/{chunk-354F3OF5.js.map → chunk-FGGVSHDW.js.map} +1 -1
  43. package/dist/{chunk-6OCJWGVD.cjs → chunk-FTXY4D44.cjs} +4 -4
  44. package/dist/{chunk-6OCJWGVD.cjs.map → chunk-FTXY4D44.cjs.map} +1 -1
  45. package/dist/chunk-INVEGVGO.js +405 -0
  46. package/dist/chunk-INVEGVGO.js.map +1 -0
  47. package/dist/{chunk-ZOL3L4EH.js → chunk-IOBHFP2E.js} +49 -19
  48. package/dist/chunk-IOBHFP2E.js.map +1 -0
  49. package/dist/{chunk-BZK5QL3N.cjs → chunk-KMFBNKCT.cjs} +4 -4
  50. package/dist/{chunk-BZK5QL3N.cjs.map → chunk-KMFBNKCT.cjs.map} +1 -1
  51. package/dist/{chunk-DF77RBF4.js → chunk-LCCT5ZXJ.js} +6 -6
  52. package/dist/{chunk-DF77RBF4.js.map → chunk-LCCT5ZXJ.js.map} +1 -1
  53. package/dist/{chunk-G7XBVM3T.cjs → chunk-MHUOVS5I.cjs} +5 -5
  54. package/dist/{chunk-G7XBVM3T.cjs.map → chunk-MHUOVS5I.cjs.map} +1 -1
  55. package/dist/{chunk-CWQPQTUZ.cjs → chunk-NEH3BPFD.cjs} +15 -15
  56. package/dist/{chunk-CWQPQTUZ.cjs.map → chunk-NEH3BPFD.cjs.map} +1 -1
  57. package/dist/{chunk-5AR6O7GW.js → chunk-NK5EOTDY.js} +3 -3
  58. package/dist/{chunk-5AR6O7GW.js.map → chunk-NK5EOTDY.js.map} +1 -1
  59. package/dist/{chunk-4TEGFMSP.cjs → chunk-P7QYG4RZ.cjs} +23 -15
  60. package/dist/chunk-P7QYG4RZ.cjs.map +1 -0
  61. package/dist/chunk-PPU2D4FZ.js +19 -0
  62. package/dist/chunk-PPU2D4FZ.js.map +1 -0
  63. package/dist/{chunk-AB4OPJLD.js → chunk-RGVMJU57.js} +3 -3
  64. package/dist/{chunk-AB4OPJLD.js.map → chunk-RGVMJU57.js.map} +1 -1
  65. package/dist/{chunk-4KBI37F3.cjs → chunk-RTDVSHJR.cjs} +5 -5
  66. package/dist/{chunk-4KBI37F3.cjs.map → chunk-RTDVSHJR.cjs.map} +1 -1
  67. package/dist/{chunk-CJN5CEI3.js → chunk-RZL2W4C3.js} +23 -15
  68. package/dist/chunk-RZL2W4C3.js.map +1 -0
  69. package/dist/chunk-SPEN7RJU.cjs +18 -0
  70. package/dist/{chunk-R5UQL2R5.cjs.map → chunk-SPEN7RJU.cjs.map} +1 -1
  71. package/dist/{chunk-ZF2LDKQQ.cjs → chunk-U3DW3WDE.cjs} +9 -8
  72. package/dist/chunk-U3DW3WDE.cjs.map +1 -0
  73. package/dist/{chunk-LXG6VL6R.cjs → chunk-U7PRI3XM.cjs} +3 -3
  74. package/dist/{chunk-LXG6VL6R.cjs.map → chunk-U7PRI3XM.cjs.map} +1 -1
  75. package/dist/{chunk-H7G65PNI.js → chunk-VCQ37TC5.js} +3 -3
  76. package/dist/{chunk-H7G65PNI.js.map → chunk-VCQ37TC5.js.map} +1 -1
  77. package/dist/{chunk-SDZ4XDWS.cjs → chunk-VWYFGE27.cjs} +9 -9
  78. package/dist/{chunk-SDZ4XDWS.cjs.map → chunk-VWYFGE27.cjs.map} +1 -1
  79. package/dist/{chunk-RN3XDZGS.js → chunk-WM646HEN.js} +4 -3
  80. package/dist/chunk-WM646HEN.js.map +1 -0
  81. package/dist/chunk-X7CE7Y5W.js +305 -0
  82. package/dist/chunk-X7CE7Y5W.js.map +1 -0
  83. package/dist/{chunk-CGH4BCIY.cjs → chunk-XE3CAY6Z.cjs} +5 -5
  84. package/dist/{chunk-CGH4BCIY.cjs.map → chunk-XE3CAY6Z.cjs.map} +1 -1
  85. package/dist/chunk-XOU3CL7S.cjs +312 -0
  86. package/dist/chunk-XOU3CL7S.cjs.map +1 -0
  87. package/dist/{chunk-ULEK4OM4.js → chunk-YKNBTHMD.js} +3 -3
  88. package/dist/{chunk-ULEK4OM4.js.map → chunk-YKNBTHMD.js.map} +1 -1
  89. package/dist/{compact-session-D2MQDB6G.cjs → compact-session-NX7HUNTB.cjs} +16 -16
  90. package/dist/{compact-session-D2MQDB6G.cjs.map → compact-session-NX7HUNTB.cjs.map} +1 -1
  91. package/dist/{compact-session-N2PPHQO6.js → compact-session-Q5IGNFPW.js} +7 -7
  92. package/dist/{compact-session-N2PPHQO6.js.map → compact-session-Q5IGNFPW.js.map} +1 -1
  93. package/dist/{cron-CK2v0VWA.d.cts → cron-Bh3aWgQ2.d.cts} +2 -2
  94. package/dist/{cron-BubDpFJG.d.ts → cron-CCDxeeFZ.d.ts} +2 -2
  95. package/dist/cron.cjs +18 -17
  96. package/dist/cron.d.cts +4 -3
  97. package/dist/cron.d.ts +4 -3
  98. package/dist/cron.js +17 -16
  99. package/dist/eval.cjs +17 -16
  100. package/dist/eval.cjs.map +1 -1
  101. package/dist/eval.js +16 -15
  102. package/dist/eval.js.map +1 -1
  103. package/dist/fs-session-store-CYNTEPJZ.cjs +20 -0
  104. package/dist/{fs-session-store-S2AXVJIX.cjs.map → fs-session-store-CYNTEPJZ.cjs.map} +1 -1
  105. package/dist/fs-session-store-MYQEVUFL.js +11 -0
  106. package/dist/{fs-session-store-6ZCCJX3K.js.map → fs-session-store-MYQEVUFL.js.map} +1 -1
  107. package/dist/{index-manager-HO456AVW.cjs → index-manager-2KH75BRW.cjs} +7 -7
  108. package/dist/{index-manager-HO456AVW.cjs.map → index-manager-2KH75BRW.cjs.map} +1 -1
  109. package/dist/{index-manager-QDH56FER.js → index-manager-NF2WRLOU.js} +6 -6
  110. package/dist/{index-manager-QDH56FER.js.map → index-manager-NF2WRLOU.js.map} +1 -1
  111. package/dist/index.cjs +66 -262
  112. package/dist/index.cjs.map +1 -1
  113. package/dist/index.d.cts +10 -46
  114. package/dist/index.d.ts +10 -46
  115. package/dist/index.js +27 -227
  116. package/dist/index.js.map +1 -1
  117. package/dist/{inject-session-J26SHHIO.js → inject-session-4ROYLZHY.js} +3 -3
  118. package/dist/{inject-session-J26SHHIO.js.map → inject-session-4ROYLZHY.js.map} +1 -1
  119. package/dist/{inject-session-3ICZIJ2N.cjs → inject-session-AWKDCGHV.cjs} +4 -4
  120. package/dist/{inject-session-3ICZIJ2N.cjs.map → inject-session-AWKDCGHV.cjs.map} +1 -1
  121. package/dist/internal/agent-loop/doom-loop-tracker.d.ts +3 -0
  122. package/dist/internal/agent-loop/types.d.ts +6 -0
  123. package/dist/internal/error-mappers/anthropic.d.ts +3 -0
  124. package/dist/internal/error-mappers/openai-compatible.d.ts +2 -3
  125. package/dist/internal/local-agent/local-agent-dispatch.d.ts +3 -1
  126. package/dist/internal/local-agent/send-queue.d.ts +31 -0
  127. package/dist/internal/mcp/client.d.ts +2 -0
  128. package/dist/internal/mcp/oauth-bearer.d.ts +2 -0
  129. package/dist/internal/memory/adapters/index.cjs +3 -3
  130. package/dist/internal/memory/adapters/index.js +2 -2
  131. package/dist/internal/memory/dreaming/phases.d.ts +15 -0
  132. package/dist/internal/memory/dreaming/run.d.ts +29 -0
  133. package/dist/internal/memory/sdk-memory-peer-loader.d.ts +2 -0
  134. package/dist/internal/memory/storage/index.cjs +51 -35
  135. package/dist/internal/memory/storage/index.d.cts +2 -0
  136. package/dist/internal/memory/storage/index.d.ts +2 -0
  137. package/dist/internal/memory/storage/index.js +4 -4
  138. package/dist/internal/persistence/cwd-mutex.d.cts +4 -2
  139. package/dist/internal/persistence/cwd-mutex.d.ts +4 -2
  140. package/dist/internal/persistence/index.cjs +4 -4
  141. package/dist/internal/persistence/index.js +2 -2
  142. package/dist/internal/persistence/sqlite-session-store.d.cts +25 -0
  143. package/dist/internal/persistence/sqlite-session-store.d.ts +25 -0
  144. package/dist/internal/providers/registry.d.ts +5 -1
  145. package/dist/mcp-auth.cjs +25 -307
  146. package/dist/mcp-auth.cjs.map +1 -1
  147. package/dist/mcp-auth.js +5 -305
  148. package/dist/mcp-auth.js.map +1 -1
  149. package/dist/models.cjs +9 -9
  150. package/dist/models.js +2 -2
  151. package/dist/persistence.cjs +9 -4
  152. package/dist/persistence.cjs.map +1 -1
  153. package/dist/persistence.d.cts +744 -40
  154. package/dist/persistence.d.ts +744 -40
  155. package/dist/persistence.js +3 -2
  156. package/dist/persistence.js.map +1 -1
  157. package/dist/providers.cjs +4 -4
  158. package/dist/providers.js +2 -2
  159. package/dist/sandbox/docker-sandbox.d.cts +58 -0
  160. package/dist/sandbox/docker-sandbox.d.ts +58 -0
  161. package/dist/sandbox/index.cjs +129 -1
  162. package/dist/sandbox/index.cjs.map +1 -1
  163. package/dist/sandbox/index.d.cts +1 -0
  164. package/dist/sandbox/index.d.ts +1 -0
  165. package/dist/sandbox/index.js +132 -5
  166. package/dist/sandbox/index.js.map +1 -1
  167. package/dist/{sdk-agent-DwzHcuxy.d.cts → sdk-agent-BA_6_wtc.d.cts} +30 -2
  168. package/dist/{sdk-agent-a3fW1xUK.d.ts → sdk-agent-CnwPODYH.d.ts} +30 -2
  169. package/dist/session-store-Dh07jr9N.d.cts +209 -0
  170. package/dist/session-store-Dh07jr9N.d.ts +209 -0
  171. package/dist/sqlite-session-store-BbcpKY1L.d.ts +64 -0
  172. package/dist/sqlite-session-store-TKXtT4ON.d.cts +64 -0
  173. package/dist/subagents-loader-KLWF4QPD.cjs +16 -0
  174. package/dist/{subagents-loader-TXOA5EJJ.cjs.map → subagents-loader-KLWF4QPD.cjs.map} +1 -1
  175. package/dist/subagents-loader-SXETS2F2.js +7 -0
  176. package/dist/{subagents-loader-Z744TAKD.js.map → subagents-loader-SXETS2F2.js.map} +1 -1
  177. package/dist/subagents-loader.cjs +2 -2
  178. package/dist/subagents-loader.d.cts +3 -2
  179. package/dist/subagents-loader.d.ts +3 -2
  180. package/dist/subagents-loader.js +1 -1
  181. package/dist/types/agent.d.ts +14 -1
  182. package/dist/types/budget-tracker.d.ts +6 -2
  183. package/dist/types/mcp.d.ts +14 -0
  184. package/dist/types/run.d.ts +15 -1
  185. package/dist/workflow.d.cts +1 -1
  186. package/dist/workflow.d.ts +1 -1
  187. package/docs/adr/mutation-testing-scope.md +12 -2
  188. package/docs/error-codes.md +41 -40
  189. package/docs/harness-capability-map.md +32 -6
  190. package/package.json +1 -1
  191. package/dist/chunk-2WY2OFSC.cjs.map +0 -1
  192. package/dist/chunk-4TEGFMSP.cjs.map +0 -1
  193. package/dist/chunk-6CXRYPG7.cjs +0 -211
  194. package/dist/chunk-6CXRYPG7.cjs.map +0 -1
  195. package/dist/chunk-CJN5CEI3.js.map +0 -1
  196. package/dist/chunk-GARVAUCU.js.map +0 -1
  197. package/dist/chunk-MSEL5E5P.js +0 -204
  198. package/dist/chunk-MSEL5E5P.js.map +0 -1
  199. package/dist/chunk-NP362THY.cjs.map +0 -1
  200. package/dist/chunk-Q5EWJPRY.js +0 -18
  201. package/dist/chunk-Q5EWJPRY.js.map +0 -1
  202. package/dist/chunk-R5UQL2R5.cjs +0 -18
  203. package/dist/chunk-RN3XDZGS.js.map +0 -1
  204. package/dist/chunk-SNVYOX46.cjs.map +0 -1
  205. package/dist/chunk-WDVG5R2Q.cjs.map +0 -1
  206. package/dist/chunk-ZF2LDKQQ.cjs.map +0 -1
  207. package/dist/chunk-ZJAYFSVI.js.map +0 -1
  208. package/dist/chunk-ZOL3L4EH.js.map +0 -1
  209. package/dist/fs-session-store-6ZCCJX3K.js +0 -11
  210. package/dist/fs-session-store-S2AXVJIX.cjs +0 -20
  211. package/dist/subagents-loader-TXOA5EJJ.cjs +0 -16
  212. package/dist/subagents-loader-Z744TAKD.js +0 -7
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/llm/credential-pool-types.ts","../src/internal/llm/credential-pool.ts","../src/internal/llm/credential-pool-context.ts"],"names":["picked"],"mappings":"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","file":"chunk-5AR6O7GW.js","sourcesContent":["/**\n * Types for the credential pool subsystem (ADRs D123-D133).\n *\n * Pool a developer's multiple API keys for the SAME provider so the SDK\n * can rotate transparently on HTTP 429/402/401 instead of jumping\n * straight to a different provider via `FallbackLlmClient`.\n *\n * @internal\n */\n\n/**\n * Rotation strategy when picking the next credential from a pool.\n *\n * - `fill_first` (default): use entries[0] until exhausted, then [1]…\n * - `round_robin`: rotate after each `select()`\n * - `least_used`: pick the entry with the lowest `requestCount`\n * - `random`: random pick among healthy entries\n *\n * Closed enum per ADR D124 — adding a strategy is an explicit semver\n * minor that updates `selectByStrategy` exhaustively.\n *\n * @internal\n */\nexport type CredentialPoolStrategy = \"fill_first\" | \"round_robin\" | \"least_used\" | \"random\";\n\n/** Health flag tracked per credential. */\nexport type CredentialStatus = \"ok\" | \"exhausted\";\n\n/**\n * Provenance of a credential — where it came from when seeded.\n * Free-form string; conventional prefixes:\n *\n * - `env:<VAR_NAME>` — auto-discovered from environment variable\n * - `manual` — added via explicit `apiKeys` config\n * - `explicit-apikey` — wrapped from `AgentOptions.apiKey` single-key path (D132)\n */\nexport type CredentialSource = string;\n\n/**\n * Single credential entry inside a {@link CredentialPool}.\n *\n * `accessToken` is the sensitive field — must never be logged unredacted.\n * The lint gate `tests/lint/no-unredacted-pool-token.test.ts` enforces this.\n *\n * @internal\n */\nexport interface PooledCredential {\n /** Stable identifier (uuid v4) for log lines + telemetry. */\n id: string;\n /** Human-readable label for `Theokit.credentialPool.list()`. */\n label: string;\n /** Provider name (matches `ProviderProfile.name`). */\n provider: string;\n /** Sort key; lower = earlier in fill_first. Unique within a pool. */\n priority: number;\n /** Provenance string. */\n source: CredentialSource;\n /** Sensitive API key. NEVER LOG UNREDACTED. */\n accessToken: string;\n /** Current health. */\n lastStatus: CredentialStatus;\n /** Epoch ms of the last status change. */\n lastStatusAt: number | undefined;\n /** HTTP code that caused exhaustion (401/402/429). */\n lastErrorCode: number | undefined;\n /** Provider-supplied \"retry after this epoch ms\" hint. Overrides cooldown defaults. */\n lastErrorResetAt: number | undefined;\n /** Bumped per successful `select()` for `least_used` strategy. Lazy-persisted. */\n requestCount: number;\n}\n\n/**\n * Serializable snapshot of a single provider's pool. Used by the\n * persistence layer (T2.1) to read/write `~/.theokit/credential-pool.json`.\n *\n * @internal\n */\nexport interface CredentialPoolSnapshot {\n provider: string;\n strategy: CredentialPoolStrategy;\n entries: PooledCredential[];\n}\n\n/**\n * Cooldown ladder by HTTP error code (ADR D125). Provider-supplied\n * `lastErrorResetAt` overrides these defaults when present.\n *\n * @internal\n */\nexport const COOLDOWN_MS: Readonly<Record<number, number>> = {\n 401: 5 * 60 * 1000, // 5 minutes — OAuth refresh can recover quickly\n 402: 60 * 60 * 1000, // 1 hour — billing quota typically hourly+\n 429: 60 * 60 * 1000, // 1 hour — daily-rate-limit windows\n};\n\n/** Default cooldown when no specific code matches. */\nexport const DEFAULT_COOLDOWN_MS = 60 * 60 * 1000;\n","/**\n * In-memory credential pool with strategy-based rotation (ADRs D123-D133).\n *\n * Pure logic. No I/O — persistence lives in `internal/persistence/\n * credential-pool-store.ts`. The pool is the single source of truth for\n * rotation state within a process; if it diverges from disk (e.g.,\n * process killed mid-rotation per EC-I), the next save heals the\n * inconsistency — at the cost of one extra HTTP 429 per crash.\n *\n * Thread safety: the pool uses an in-process async-aware mutex\n * (`cwd-mutex` D9 keyed by `credential-pool:${provider}`). Cross-process\n * safety happens at the persistence layer via `withFileLock` (D61).\n * Two Node processes sharing the same file may double-pick momentarily\n * (worst case = 1 extra 429 per race) — acceptable per ADR D128.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\nimport {\n COOLDOWN_MS,\n type CredentialPoolSnapshot,\n type CredentialPoolStrategy,\n DEFAULT_COOLDOWN_MS,\n type PooledCredential,\n} from \"./credential-pool-types.js\";\nimport { sleepWithAbort } from \"./retry.js\";\n\n/**\n * Construct a `PooledCredential` with sane defaults.\n *\n * @internal\n */\nexport function newPooledCredential(args: {\n provider: string;\n accessToken: string;\n priority: number;\n source: string;\n label?: string;\n}): PooledCredential {\n return {\n id: globalThis.crypto.randomUUID(),\n label: args.label ?? labelFromSource(args.source, args.accessToken),\n provider: args.provider,\n priority: args.priority,\n source: args.source,\n accessToken: args.accessToken,\n lastStatus: \"ok\",\n lastStatusAt: undefined,\n lastErrorCode: undefined,\n lastErrorResetAt: undefined,\n requestCount: 0,\n };\n}\n\n/**\n * Build a human-readable label from the credential source. Used for\n * `Theokit.credentialPool.list()` UX. NEVER includes the raw token.\n *\n * @internal\n */\nfunction labelFromSource(source: string, accessToken: string): string {\n if (source.startsWith(\"env:\")) return source.slice(4);\n const masked =\n accessToken.length > 8 ? `${accessToken.slice(0, 4)}…${accessToken.slice(-4)}` : \"***\";\n return `${source}:${masked}`;\n}\n\n/**\n * Per-provider credential pool. Construct with one or more entries\n * sorted by priority. Throws `ConfigurationError` on empty input.\n *\n * EC-C: identical `accessToken`s are deduplicated during construction\n * (3 copies of \"k1\" → 1 entry). Otherwise an exhaustion event would\n * mark \"k1\" exhausted 3× wastefully.\n *\n * @internal\n */\nexport class CredentialPool {\n readonly provider: string;\n private readonly strategy: CredentialPoolStrategy;\n private entries: PooledCredential[];\n\n constructor(\n provider: string,\n entries: PooledCredential[],\n strategy: CredentialPoolStrategy = \"fill_first\",\n ) {\n if (entries.length === 0) {\n throw new ConfigurationError(\n `credential-pool: cannot construct empty pool for provider \"${provider}\"`,\n { code: \"credential_pool_empty\" },\n );\n }\n this.provider = provider;\n this.strategy = strategy;\n // EC-C: dedupe by accessToken before sort.\n this.entries = dedupeByToken(entries).sort((a, b) => a.priority - b.priority);\n }\n\n /** True if the pool was seeded with at least one entry. */\n hasCredentials(): boolean {\n return this.entries.length > 0;\n }\n\n /** True iff at least one entry is healthy (auto-healed if cooldown expired). */\n hasAvailable(): boolean {\n return this.availableEntries().length > 0;\n }\n\n /**\n * Earliest `lastErrorResetAt` across all entries, or `undefined` if no\n * entry is in cooldown. Used by `waitForAvailable` to compute the\n * upper bound of each jittered sleep window.\n *\n * @internal\n */\n earliestResetAt(): number | undefined {\n let earliest: number | undefined;\n for (const entry of this.entries) {\n if (entry.lastStatus === \"ok\") continue;\n if (entry.lastErrorResetAt === undefined) continue;\n if (earliest === undefined || entry.lastErrorResetAt < earliest) {\n earliest = entry.lastErrorResetAt;\n }\n }\n return earliest;\n }\n\n /**\n * Wait until at least one entry becomes healthy OR `maxWaitMs` elapses\n * OR `signal` aborts. Returns `true` if a healthy entry is available\n * when the call returns, `false` otherwise.\n *\n * T3.9 — Reconnect storm prevention. Concurrent callers each sleep a\n * random fraction of the window to the earliest cooldown reset (full\n * jitter — AWS Brooker 2015) so they do not all wake at the exact\n * instant cooldown expires and hammer the upstream simultaneously.\n *\n * The `sleeper` parameter is a dependency-injection seam for tests:\n * callers in production omit it and the default `setTimeout`-based\n * sleeper is used. The seam avoids the `vi.useFakeTimers()` mismatch\n * that blocked T3.4's wiring.\n *\n * @internal\n */\n async waitForAvailable(\n signal: AbortSignal,\n opts: {\n maxWaitMs: number;\n sleeper?: (ms: number, signal: AbortSignal) => Promise<void>;\n /**\n * Clock seam, the companion to `sleeper`. Production omits it and gets `Date.now`.\n *\n * `sleeper` alone was not enough to make this loop testable: a test could replace the SLEEP\n * but the deadline check still read real wall-clock, so the one case that exercises timeout\n * had to set `maxWaitMs: 5` and race the scheduler — with a comment in the committed file\n * saying so (\"we can't easily ... spec is wall-clock based\"). A sleeper that also advances a\n * virtual clock closes the loop deterministically, which is what `rules/testing.md` § 6 asks\n * for when it says to inject the clock rather than sleep.\n */\n now?: () => number;\n },\n ): Promise<boolean> {\n if (signal.aborted) return false;\n if (this.hasAvailable()) return true;\n const now = opts.now ?? Date.now;\n return await this.pollUntilAvailable(\n signal,\n now() + opts.maxWaitMs,\n opts.sleeper ?? sleepWithAbort,\n now,\n );\n }\n\n /**\n * The polling half of `waitForAvailable`, with both seams already resolved.\n *\n * Its own method because resolving two optional seams and running the loop in one body put the\n * function over the cognitive-complexity gate. The split is also the honest one: everything above\n * is a guard, everything here is the wait.\n */\n private async pollUntilAvailable(\n signal: AbortSignal,\n deadline: number,\n sleeper: (ms: number, signal: AbortSignal) => Promise<void>,\n now: () => number,\n ): Promise<boolean> {\n while (now() < deadline) {\n if (signal.aborted) return false;\n await sleeper(this.computeJitteredSleepMs(deadline, now), signal);\n if (signal.aborted) return false;\n if (this.hasAvailable()) return true;\n }\n return this.hasAvailable();\n }\n\n /**\n * Compute the next jittered sleep window (ms) for `waitForAvailable`.\n * Full-jitter cap: at most (a) time until the earliest reset (plus a\n * 50 ms grace so the entry actually heals before re-probe), or (b) the\n * remaining wait window, whichever is smaller. When no entry has a\n * known reset (rare — only if `markExhaustedAndRotate` was called\n * without `resetAtMs`), fall back to a 250 ms ceiling so we stay\n * responsive without hot-looping.\n */\n private computeJitteredSleepMs(deadline: number, now: () => number = Date.now): number {\n const resetAt = this.earliestResetAt();\n const remaining = deadline - now();\n const ceiling =\n resetAt === undefined\n ? Math.min(remaining, 250)\n : Math.min(remaining, Math.max(0, resetAt - now()) + 50);\n return Math.max(0, Math.floor(Math.random() * ceiling));\n }\n\n /** Live (frozen) view of all entries. */\n list(): readonly PooledCredential[] {\n return this.entries;\n }\n\n /**\n * Pick a healthy entry according to the configured strategy.\n * Mutates `requestCount` and (for round_robin) entry order.\n * Returns null if every entry is in cooldown.\n *\n * @internal\n */\n async select(): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => this.selectLocked());\n }\n\n /**\n * Mark the entry whose id matches `entryId` as exhausted with the\n * appropriate cooldown, then return the next healthy entry (or null).\n * If `entryId` is undefined, marks all currently-active entries (rare —\n * only used by admin reset scenarios).\n *\n * @internal\n */\n async markExhaustedAndRotate(args: {\n entryId: string;\n statusCode: number;\n resetAtMs?: number;\n }): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => {\n const entry = this.entries.find((e) => e.id === args.entryId);\n if (entry !== undefined) {\n const now = Date.now();\n const cooldown = COOLDOWN_MS[args.statusCode] ?? DEFAULT_COOLDOWN_MS;\n entry.lastStatus = \"exhausted\";\n entry.lastStatusAt = now;\n entry.lastErrorCode = args.statusCode;\n // EC-5: negative or stale resetAt → ignore, fall through to default.\n entry.lastErrorResetAt =\n args.resetAtMs !== undefined && args.resetAtMs > now ? args.resetAtMs : now + cooldown;\n }\n return this.selectLocked();\n });\n }\n\n /** Admin escape hatch: clear all cooldowns. */\n async resetAll(): Promise<void> {\n await withCwdMutex(`credential-pool:${this.provider}`, async () => {\n for (const e of this.entries) {\n e.lastStatus = \"ok\";\n e.lastStatusAt = undefined;\n e.lastErrorCode = undefined;\n e.lastErrorResetAt = undefined;\n }\n });\n }\n\n /** Materialize for persistence. */\n toSnapshot(): CredentialPoolSnapshot {\n return {\n provider: this.provider,\n strategy: this.strategy,\n entries: this.entries.map((e) => ({ ...e })),\n };\n }\n\n /** Hydrate from a previously-saved snapshot. */\n static fromSnapshot(snapshot: CredentialPoolSnapshot): CredentialPool {\n return new CredentialPool(snapshot.provider, snapshot.entries, snapshot.strategy);\n }\n\n // ─── Internal helpers (always called inside the mutex) ───\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: strategy dispatch must branch on 4 enum values (random/least_used/round_robin/fill_first) with 1-entry short-circuits per strategy. Each branch is 5-10 lines of focused logic; extracting per-strategy methods fragments the linear narrative.\n private selectLocked(): PooledCredential | null {\n const available = this.availableEntries();\n if (available.length === 0) return null;\n\n if (this.strategy === \"random\") {\n const idx = Math.floor(Math.random() * available.length);\n const picked = available[idx];\n if (picked === undefined) return null; // unreachable; satisfies strict\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"least_used\" && available.length > 1) {\n // EC-3: tie-break by priority ascending (first wins).\n const picked = [...available].sort(\n (a, b) => a.requestCount - b.requestCount || a.priority - b.priority,\n )[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"round_robin\" && available.length > 1) {\n // Pick head; move it to the end of `entries` so next call picks the next.\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n const rest = this.entries.filter((e) => e.id !== picked.id);\n // Re-assign priorities: rotated entry gets the highest priority value\n // so it sorts last after `fromSnapshot` rehydration. This makes EC-F\n // (round-robin state survives save/load) work without a separate field.\n const maxPriority = this.entries.length - 1;\n rest.forEach((e, i) => {\n e.priority = i;\n });\n picked.priority = maxPriority;\n this.entries = [...rest, picked];\n return picked;\n }\n\n // fill_first (default) and 1-entry edge case for round_robin/least_used\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n private availableEntries(): PooledCredential[] {\n const now = Date.now();\n const out: PooledCredential[] = [];\n for (const entry of this.entries) {\n if (entry.lastStatus === \"ok\") {\n out.push(entry);\n continue;\n }\n // EC-1: auto-heal expired cooldowns inline.\n const resetAt = entry.lastErrorResetAt;\n if (resetAt !== undefined && now >= resetAt) {\n entry.lastStatus = \"ok\";\n entry.lastStatusAt = undefined;\n entry.lastErrorCode = undefined;\n entry.lastErrorResetAt = undefined;\n out.push(entry);\n }\n }\n return out;\n }\n}\n\n/**\n * Drop duplicates by `accessToken`. Keeps the first occurrence (lowest\n * priority wins after sort). EC-C from the edge-case review.\n */\nfunction dedupeByToken(entries: PooledCredential[]): PooledCredential[] {\n const seen = new Set<string>();\n const out: PooledCredential[] = [];\n for (const e of entries) {\n if (seen.has(e.accessToken)) continue;\n seen.add(e.accessToken);\n out.push(e);\n }\n return out;\n}\n","/**\n * Per-fork credential-pool inheritance via `AsyncLocalStorage` (ADR D131).\n *\n * Mirrors the whitelist context pattern from D111\n * (`runtime/async-local-storage.ts`). Forked sub-agents inherit the\n * parent's pool *by reference* so concurrent rotations all observe\n * the same cooldown state — the desired behavior per Hermes parity.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { CredentialPool } from \"./credential-pool.js\";\n\n/** ALS slot — keyed by provider name → pool. */\nconst credentialPoolStore = new AsyncLocalStorage<Map<string, CredentialPool>>();\n\n/**\n * Run `fn` with `pools` as the active credential-pool registry for the\n * current async context. Nested calls shadow the outer map (parent\n * pools are not visible to children when the child sets its own).\n *\n * @internal\n */\nexport async function withCredentialPool<T>(\n pools: Map<string, CredentialPool>,\n fn: () => Promise<T>,\n): Promise<T> {\n return credentialPoolStore.run(pools, fn);\n}\n\n/**\n * Pool registered for `provider` in the current async context, or\n * `undefined` when no `withCredentialPool(...)` scope is active.\n *\n * @internal\n */\nexport function currentCredentialPool(provider: string): CredentialPool | undefined {\n return credentialPoolStore.getStore()?.get(provider);\n}\n"]}
1
+ {"version":3,"sources":["../src/internal/llm/credential-pool-types.ts","../src/internal/llm/credential-pool.ts","../src/internal/llm/credential-pool-context.ts"],"names":["picked"],"mappings":"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","file":"chunk-NK5EOTDY.js","sourcesContent":["/**\n * Types for the credential pool subsystem (ADRs D123-D133).\n *\n * Pool a developer's multiple API keys for the SAME provider so the SDK\n * can rotate transparently on HTTP 429/402/401 instead of jumping\n * straight to a different provider via `FallbackLlmClient`.\n *\n * @internal\n */\n\n/**\n * Rotation strategy when picking the next credential from a pool.\n *\n * - `fill_first` (default): use entries[0] until exhausted, then [1]…\n * - `round_robin`: rotate after each `select()`\n * - `least_used`: pick the entry with the lowest `requestCount`\n * - `random`: random pick among healthy entries\n *\n * Closed enum per ADR D124 — adding a strategy is an explicit semver\n * minor that updates `selectByStrategy` exhaustively.\n *\n * @internal\n */\nexport type CredentialPoolStrategy = \"fill_first\" | \"round_robin\" | \"least_used\" | \"random\";\n\n/** Health flag tracked per credential. */\nexport type CredentialStatus = \"ok\" | \"exhausted\";\n\n/**\n * Provenance of a credential — where it came from when seeded.\n * Free-form string; conventional prefixes:\n *\n * - `env:<VAR_NAME>` — auto-discovered from environment variable\n * - `manual` — added via explicit `apiKeys` config\n * - `explicit-apikey` — wrapped from `AgentOptions.apiKey` single-key path (D132)\n */\nexport type CredentialSource = string;\n\n/**\n * Single credential entry inside a {@link CredentialPool}.\n *\n * `accessToken` is the sensitive field — must never be logged unredacted.\n * The lint gate `tests/lint/no-unredacted-pool-token.test.ts` enforces this.\n *\n * @internal\n */\nexport interface PooledCredential {\n /** Stable identifier (uuid v4) for log lines + telemetry. */\n id: string;\n /** Human-readable label for `Theokit.credentialPool.list()`. */\n label: string;\n /** Provider name (matches `ProviderProfile.name`). */\n provider: string;\n /** Sort key; lower = earlier in fill_first. Unique within a pool. */\n priority: number;\n /** Provenance string. */\n source: CredentialSource;\n /** Sensitive API key. NEVER LOG UNREDACTED. */\n accessToken: string;\n /** Current health. */\n lastStatus: CredentialStatus;\n /** Epoch ms of the last status change. */\n lastStatusAt: number | undefined;\n /** HTTP code that caused exhaustion (401/402/429). */\n lastErrorCode: number | undefined;\n /** Provider-supplied \"retry after this epoch ms\" hint. Overrides cooldown defaults. */\n lastErrorResetAt: number | undefined;\n /** Bumped per successful `select()` for `least_used` strategy. Lazy-persisted. */\n requestCount: number;\n}\n\n/**\n * Serializable snapshot of a single provider's pool. Used by the\n * persistence layer (T2.1) to read/write `~/.theokit/credential-pool.json`.\n *\n * @internal\n */\nexport interface CredentialPoolSnapshot {\n provider: string;\n strategy: CredentialPoolStrategy;\n entries: PooledCredential[];\n}\n\n/**\n * Cooldown ladder by HTTP error code (ADR D125). Provider-supplied\n * `lastErrorResetAt` overrides these defaults when present.\n *\n * @internal\n */\nexport const COOLDOWN_MS: Readonly<Record<number, number>> = {\n 401: 5 * 60 * 1000, // 5 minutes — OAuth refresh can recover quickly\n 402: 60 * 60 * 1000, // 1 hour — billing quota typically hourly+\n 429: 60 * 60 * 1000, // 1 hour — daily-rate-limit windows\n};\n\n/** Default cooldown when no specific code matches. */\nexport const DEFAULT_COOLDOWN_MS = 60 * 60 * 1000;\n","/**\n * In-memory credential pool with strategy-based rotation (ADRs D123-D133).\n *\n * Pure logic. No I/O — persistence lives in `internal/persistence/\n * credential-pool-store.ts`. The pool is the single source of truth for\n * rotation state within a process; if it diverges from disk (e.g.,\n * process killed mid-rotation per EC-I), the next save heals the\n * inconsistency — at the cost of one extra HTTP 429 per crash.\n *\n * Thread safety: the pool uses an in-process async-aware mutex\n * (`cwd-mutex` D9 keyed by `credential-pool:${provider}`). Cross-process\n * safety happens at the persistence layer via `withFileLock` (D61).\n * Two Node processes sharing the same file may double-pick momentarily\n * (worst case = 1 extra 429 per race) — acceptable per ADR D128.\n *\n * @internal\n */\n\nimport { ConfigurationError } from \"../../errors.js\";\nimport { withCwdMutex } from \"../persistence/cwd-mutex.js\";\nimport {\n COOLDOWN_MS,\n type CredentialPoolSnapshot,\n type CredentialPoolStrategy,\n DEFAULT_COOLDOWN_MS,\n type PooledCredential,\n} from \"./credential-pool-types.js\";\nimport { sleepWithAbort } from \"./retry.js\";\n\n/**\n * Construct a `PooledCredential` with sane defaults.\n *\n * @internal\n */\nexport function newPooledCredential(args: {\n provider: string;\n accessToken: string;\n priority: number;\n source: string;\n label?: string;\n}): PooledCredential {\n return {\n id: globalThis.crypto.randomUUID(),\n label: args.label ?? labelFromSource(args.source, args.accessToken),\n provider: args.provider,\n priority: args.priority,\n source: args.source,\n accessToken: args.accessToken,\n lastStatus: \"ok\",\n lastStatusAt: undefined,\n lastErrorCode: undefined,\n lastErrorResetAt: undefined,\n requestCount: 0,\n };\n}\n\n/**\n * Build a human-readable label from the credential source. Used for\n * `Theokit.credentialPool.list()` UX. NEVER includes the raw token.\n *\n * @internal\n */\nfunction labelFromSource(source: string, accessToken: string): string {\n if (source.startsWith(\"env:\")) return source.slice(4);\n const masked =\n accessToken.length > 8 ? `${accessToken.slice(0, 4)}…${accessToken.slice(-4)}` : \"***\";\n return `${source}:${masked}`;\n}\n\n/**\n * Per-provider credential pool. Construct with one or more entries\n * sorted by priority. Throws `ConfigurationError` on empty input.\n *\n * EC-C: identical `accessToken`s are deduplicated during construction\n * (3 copies of \"k1\" → 1 entry). Otherwise an exhaustion event would\n * mark \"k1\" exhausted 3× wastefully.\n *\n * @internal\n */\nexport class CredentialPool {\n readonly provider: string;\n private readonly strategy: CredentialPoolStrategy;\n private entries: PooledCredential[];\n\n constructor(\n provider: string,\n entries: PooledCredential[],\n strategy: CredentialPoolStrategy = \"fill_first\",\n ) {\n if (entries.length === 0) {\n throw new ConfigurationError(\n `credential-pool: cannot construct empty pool for provider \"${provider}\"`,\n { code: \"credential_pool_empty\" },\n );\n }\n this.provider = provider;\n this.strategy = strategy;\n // EC-C: dedupe by accessToken before sort.\n this.entries = dedupeByToken(entries).sort((a, b) => a.priority - b.priority);\n }\n\n /** True if the pool was seeded with at least one entry. */\n hasCredentials(): boolean {\n return this.entries.length > 0;\n }\n\n /** True iff at least one entry is healthy (auto-healed if cooldown expired). */\n hasAvailable(): boolean {\n return this.availableEntries().length > 0;\n }\n\n /**\n * Earliest `lastErrorResetAt` across all entries, or `undefined` if no\n * entry is in cooldown. Used by `waitForAvailable` to compute the\n * upper bound of each jittered sleep window.\n *\n * @internal\n */\n earliestResetAt(): number | undefined {\n let earliest: number | undefined;\n for (const entry of this.entries) {\n if (entry.lastStatus === \"ok\") continue;\n if (entry.lastErrorResetAt === undefined) continue;\n if (earliest === undefined || entry.lastErrorResetAt < earliest) {\n earliest = entry.lastErrorResetAt;\n }\n }\n return earliest;\n }\n\n /**\n * Wait until at least one entry becomes healthy OR `maxWaitMs` elapses\n * OR `signal` aborts. Returns `true` if a healthy entry is available\n * when the call returns, `false` otherwise.\n *\n * T3.9 — Reconnect storm prevention. Concurrent callers each sleep a\n * random fraction of the window to the earliest cooldown reset (full\n * jitter — AWS Brooker 2015) so they do not all wake at the exact\n * instant cooldown expires and hammer the upstream simultaneously.\n *\n * The `sleeper` parameter is a dependency-injection seam for tests:\n * callers in production omit it and the default `setTimeout`-based\n * sleeper is used. The seam avoids the `vi.useFakeTimers()` mismatch\n * that blocked T3.4's wiring.\n *\n * @internal\n */\n async waitForAvailable(\n signal: AbortSignal,\n opts: {\n maxWaitMs: number;\n sleeper?: (ms: number, signal: AbortSignal) => Promise<void>;\n /**\n * Clock seam, the companion to `sleeper`. Production omits it and gets `Date.now`.\n *\n * `sleeper` alone was not enough to make this loop testable: a test could replace the SLEEP\n * but the deadline check still read real wall-clock, so the one case that exercises timeout\n * had to set `maxWaitMs: 5` and race the scheduler — with a comment in the committed file\n * saying so (\"we can't easily ... spec is wall-clock based\"). A sleeper that also advances a\n * virtual clock closes the loop deterministically, which is what `rules/testing.md` § 6 asks\n * for when it says to inject the clock rather than sleep.\n */\n now?: () => number;\n },\n ): Promise<boolean> {\n if (signal.aborted) return false;\n if (this.hasAvailable()) return true;\n const now = opts.now ?? Date.now;\n return await this.pollUntilAvailable(\n signal,\n now() + opts.maxWaitMs,\n opts.sleeper ?? sleepWithAbort,\n now,\n );\n }\n\n /**\n * The polling half of `waitForAvailable`, with both seams already resolved.\n *\n * Its own method because resolving two optional seams and running the loop in one body put the\n * function over the cognitive-complexity gate. The split is also the honest one: everything above\n * is a guard, everything here is the wait.\n */\n private async pollUntilAvailable(\n signal: AbortSignal,\n deadline: number,\n sleeper: (ms: number, signal: AbortSignal) => Promise<void>,\n now: () => number,\n ): Promise<boolean> {\n while (now() < deadline) {\n if (signal.aborted) return false;\n await sleeper(this.computeJitteredSleepMs(deadline, now), signal);\n if (signal.aborted) return false;\n if (this.hasAvailable()) return true;\n }\n return this.hasAvailable();\n }\n\n /**\n * Compute the next jittered sleep window (ms) for `waitForAvailable`.\n * Full-jitter cap: at most (a) time until the earliest reset (plus a\n * 50 ms grace so the entry actually heals before re-probe), or (b) the\n * remaining wait window, whichever is smaller. When no entry has a\n * known reset (rare — only if `markExhaustedAndRotate` was called\n * without `resetAtMs`), fall back to a 250 ms ceiling so we stay\n * responsive without hot-looping.\n */\n private computeJitteredSleepMs(deadline: number, now: () => number = Date.now): number {\n const resetAt = this.earliestResetAt();\n const remaining = deadline - now();\n const ceiling =\n resetAt === undefined\n ? Math.min(remaining, 250)\n : Math.min(remaining, Math.max(0, resetAt - now()) + 50);\n return Math.max(0, Math.floor(Math.random() * ceiling));\n }\n\n /** Live (frozen) view of all entries. */\n list(): readonly PooledCredential[] {\n return this.entries;\n }\n\n /**\n * Pick a healthy entry according to the configured strategy.\n * Mutates `requestCount` and (for round_robin) entry order.\n * Returns null if every entry is in cooldown.\n *\n * @internal\n */\n async select(): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => this.selectLocked());\n }\n\n /**\n * Mark the entry whose id matches `entryId` as exhausted with the\n * appropriate cooldown, then return the next healthy entry (or null).\n * If `entryId` is undefined, marks all currently-active entries (rare —\n * only used by admin reset scenarios).\n *\n * @internal\n */\n async markExhaustedAndRotate(args: {\n entryId: string;\n statusCode: number;\n resetAtMs?: number;\n }): Promise<PooledCredential | null> {\n return withCwdMutex(`credential-pool:${this.provider}`, async () => {\n const entry = this.entries.find((e) => e.id === args.entryId);\n if (entry !== undefined) {\n const now = Date.now();\n const cooldown = COOLDOWN_MS[args.statusCode] ?? DEFAULT_COOLDOWN_MS;\n entry.lastStatus = \"exhausted\";\n entry.lastStatusAt = now;\n entry.lastErrorCode = args.statusCode;\n // EC-5: negative or stale resetAt → ignore, fall through to default.\n entry.lastErrorResetAt =\n args.resetAtMs !== undefined && args.resetAtMs > now ? args.resetAtMs : now + cooldown;\n }\n return this.selectLocked();\n });\n }\n\n /** Admin escape hatch: clear all cooldowns. */\n async resetAll(): Promise<void> {\n await withCwdMutex(`credential-pool:${this.provider}`, async () => {\n for (const e of this.entries) {\n e.lastStatus = \"ok\";\n e.lastStatusAt = undefined;\n e.lastErrorCode = undefined;\n e.lastErrorResetAt = undefined;\n }\n });\n }\n\n /** Materialize for persistence. */\n toSnapshot(): CredentialPoolSnapshot {\n return {\n provider: this.provider,\n strategy: this.strategy,\n entries: this.entries.map((e) => ({ ...e })),\n };\n }\n\n /** Hydrate from a previously-saved snapshot. */\n static fromSnapshot(snapshot: CredentialPoolSnapshot): CredentialPool {\n return new CredentialPool(snapshot.provider, snapshot.entries, snapshot.strategy);\n }\n\n // ─── Internal helpers (always called inside the mutex) ───\n\n // biome-ignore lint/complexity/noExcessiveCognitiveComplexity: strategy dispatch must branch on 4 enum values (random/least_used/round_robin/fill_first) with 1-entry short-circuits per strategy. Each branch is 5-10 lines of focused logic; extracting per-strategy methods fragments the linear narrative.\n private selectLocked(): PooledCredential | null {\n const available = this.availableEntries();\n if (available.length === 0) return null;\n\n if (this.strategy === \"random\") {\n const idx = Math.floor(Math.random() * available.length);\n const picked = available[idx];\n if (picked === undefined) return null; // unreachable; satisfies strict\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"least_used\" && available.length > 1) {\n // EC-3: tie-break by priority ascending (first wins).\n const picked = [...available].sort(\n (a, b) => a.requestCount - b.requestCount || a.priority - b.priority,\n )[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n if (this.strategy === \"round_robin\" && available.length > 1) {\n // Pick head; move it to the end of `entries` so next call picks the next.\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n const rest = this.entries.filter((e) => e.id !== picked.id);\n // Re-assign priorities: rotated entry gets the highest priority value\n // so it sorts last after `fromSnapshot` rehydration. This makes EC-F\n // (round-robin state survives save/load) work without a separate field.\n const maxPriority = this.entries.length - 1;\n rest.forEach((e, i) => {\n e.priority = i;\n });\n picked.priority = maxPriority;\n this.entries = [...rest, picked];\n return picked;\n }\n\n // fill_first (default) and 1-entry edge case for round_robin/least_used\n const picked = available[0];\n if (picked === undefined) return null;\n picked.requestCount += 1;\n return picked;\n }\n\n private availableEntries(): PooledCredential[] {\n const now = Date.now();\n const out: PooledCredential[] = [];\n for (const entry of this.entries) {\n if (entry.lastStatus === \"ok\") {\n out.push(entry);\n continue;\n }\n // EC-1: auto-heal expired cooldowns inline.\n const resetAt = entry.lastErrorResetAt;\n if (resetAt !== undefined && now >= resetAt) {\n entry.lastStatus = \"ok\";\n entry.lastStatusAt = undefined;\n entry.lastErrorCode = undefined;\n entry.lastErrorResetAt = undefined;\n out.push(entry);\n }\n }\n return out;\n }\n}\n\n/**\n * Drop duplicates by `accessToken`. Keeps the first occurrence (lowest\n * priority wins after sort). EC-C from the edge-case review.\n */\nfunction dedupeByToken(entries: PooledCredential[]): PooledCredential[] {\n const seen = new Set<string>();\n const out: PooledCredential[] = [];\n for (const e of entries) {\n if (seen.has(e.accessToken)) continue;\n seen.add(e.accessToken);\n out.push(e);\n }\n return out;\n}\n","/**\n * Per-fork credential-pool inheritance via `AsyncLocalStorage` (ADR D131).\n *\n * Mirrors the whitelist context pattern from D111\n * (`runtime/async-local-storage.ts`). Forked sub-agents inherit the\n * parent's pool *by reference* so concurrent rotations all observe\n * the same cooldown state — the desired behavior per Hermes parity.\n *\n * @internal\n */\n\nimport { AsyncLocalStorage } from \"node:async_hooks\";\n\nimport type { CredentialPool } from \"./credential-pool.js\";\n\n/** ALS slot — keyed by provider name → pool. */\nconst credentialPoolStore = new AsyncLocalStorage<Map<string, CredentialPool>>();\n\n/**\n * Run `fn` with `pools` as the active credential-pool registry for the\n * current async context. Nested calls shadow the outer map (parent\n * pools are not visible to children when the child sets its own).\n *\n * @internal\n */\nexport async function withCredentialPool<T>(\n pools: Map<string, CredentialPool>,\n fn: () => Promise<T>,\n): Promise<T> {\n return credentialPoolStore.run(pools, fn);\n}\n\n/**\n * Pool registered for `provider` in the current async context, or\n * `undefined` when no `withCredentialPool(...)` scope is active.\n *\n * @internal\n */\nexport function currentCredentialPool(provider: string): CredentialPool | undefined {\n return credentialPoolStore.getStore()?.get(provider);\n}\n"]}
@@ -14,7 +14,15 @@ var REGISTRY = chunkNVXXWAU7_cjs.globalSingleton(
14
14
  () => /* @__PURE__ */ new Map()
15
15
  );
16
16
  var ALIASES = chunkNVXXWAU7_cjs.globalSingleton("theokit-sdk.providers.aliases", () => /* @__PURE__ */ new Map());
17
- function registerProvider(profile) {
17
+ function key(name) {
18
+ return name.toLowerCase();
19
+ }
20
+ function registerProvider(input) {
21
+ const profile = {
22
+ ...input,
23
+ name: key(input.name),
24
+ ...input.aliases === void 0 ? {} : { aliases: input.aliases.map(key) }
25
+ };
18
26
  if (REGISTRY.has(profile.name)) {
19
27
  chunkRNXXYF22_cjs.diag(`[theokit-sdk] Provider "${profile.name}" overridden by user plugin.
20
28
  `);
@@ -30,8 +38,8 @@ function registerProvider(profile) {
30
38
  }
31
39
  }
32
40
  function getProviderProfile(name) {
33
- const canonical = ALIASES.get(name) ?? name;
34
- return REGISTRY.get(canonical);
41
+ const lower = key(name);
42
+ return REGISTRY.get(ALIASES.get(lower) ?? lower);
35
43
  }
36
44
  function listProviders() {
37
45
  return Array.from(REGISTRY.values());
@@ -1416,18 +1424,18 @@ var patchedModelKeys = chunkNVXXWAU7_cjs.globalSingleton(
1416
1424
  var indexState = chunkNVXXWAU7_cjs.globalSingleton("theokit-sdk.providers.model-info-loaded", () => ({
1417
1425
  loaded: false
1418
1426
  }));
1419
- function getCatalogModelInfo(key) {
1427
+ function getCatalogModelInfo(key2) {
1420
1428
  ensureModelIndexLoaded();
1421
- return modelInfoIndex.get(key);
1429
+ return modelInfoIndex.get(key2);
1422
1430
  }
1423
- function isPatchedModelKey(key) {
1424
- return patchedModelKeys.has(key);
1431
+ function isPatchedModelKey(key2) {
1432
+ return patchedModelKeys.has(key2);
1425
1433
  }
1426
- function patchModelInfo(key, model) {
1434
+ function patchModelInfo(key2, model) {
1427
1435
  ensureModelIndexLoaded();
1428
- const existing = modelInfoIndex.get(key);
1429
- modelInfoIndex.set(key, existing === void 0 ? model : { ...existing, ...model });
1430
- patchedModelKeys.add(key);
1436
+ const existing = modelInfoIndex.get(key2);
1437
+ modelInfoIndex.set(key2, existing === void 0 ? model : { ...existing, ...model });
1438
+ patchedModelKeys.add(key2);
1431
1439
  }
1432
1440
  function ensureModelIndexLoaded() {
1433
1441
  if (indexState.loaded) return;
@@ -1457,8 +1465,8 @@ function indexEntryModels(entry) {
1457
1465
  }
1458
1466
  modelInfoIndex.set(`${entry.id}/${modelId}`, parsed.data);
1459
1467
  for (const alias of entry.aliases ?? []) {
1460
- const key = `${alias}/${modelId}`;
1461
- if (!modelInfoIndex.has(key)) modelInfoIndex.set(key, parsed.data);
1468
+ const key2 = `${alias}/${modelId}`;
1469
+ if (!modelInfoIndex.has(key2)) modelInfoIndex.set(key2, parsed.data);
1462
1470
  }
1463
1471
  }
1464
1472
  }
@@ -1887,5 +1895,5 @@ exports.resolveBedrockBaseUrl = resolveBedrockBaseUrl;
1887
1895
  exports.resolveVertexBaseUrl = resolveVertexBaseUrl;
1888
1896
  exports.stripBedrockPrefix = stripBedrockPrefix;
1889
1897
  exports.stripVertexPrefix = stripVertexPrefix;
1890
- //# sourceMappingURL=chunk-4TEGFMSP.cjs.map
1891
- //# sourceMappingURL=chunk-4TEGFMSP.cjs.map
1898
+ //# sourceMappingURL=chunk-P7QYG4RZ.cjs.map
1899
+ //# sourceMappingURL=chunk-P7QYG4RZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/providers/registry.ts","../src/internal/providers/catalog-schema.ts","../src/internal/providers/provider-catalog.json","../src/internal/providers/catalog-loader.ts","../src/internal/providers/builtin/anthropic.ts","../src/internal/providers/builtin/bedrock.ts","../src/internal/providers/builtin/openai-compatible.ts","../src/internal/providers/builtin/cerebras.ts","../src/internal/providers/builtin/cohere.ts","../src/internal/providers/builtin/deepinfra.ts","../src/internal/providers/builtin/gemini.ts","../src/internal/providers/builtin/google.ts","../src/internal/providers/builtin/groq.ts","../src/internal/providers/builtin/llamacpp.ts","../src/internal/providers/builtin/lmstudio.ts","../src/internal/providers/builtin/mistral.ts","../src/internal/providers/builtin/ollama.ts","../src/internal/providers/builtin/openai.ts","../src/internal/providers/builtin/openai-chatgpt.ts","../src/internal/providers/builtin/openrouter.ts","../src/internal/providers/builtin/perplexity.ts","../src/internal/providers/builtin/together.ts","../src/internal/providers/builtin/vertex.ts","../src/internal/providers/builtin/xai.ts","../src/internal/providers/builtin/index.ts"],"names":["globalSingleton","diag","z","key","homedir","resolveCredential","AuthenticationError","readStoredOAuth"],"mappings":"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","file":"chunk-P7QYG4RZ.cjs","sourcesContent":["/**\n * Provider registry (T3.2, ADR D107).\n *\n * `registerProvider` is idempotent and surface-warning: re-registering\n * a `name` logs to stderr (D107 last-writer-wins with WARN). Alias\n * collisions also warn (EC-5).\n *\n * @internal\n */\n\nimport { diag } from \"../diagnostics.js\";\nimport { globalSingleton } from \"../global-singleton.js\";\nimport type { ProviderProfile } from \"./types.js\";\n\n/**\n * M44 B1 fix — the registry state lives on `globalThis` keyed by `Symbol.for`, so EVERY bundle copy of this\n * module (tsup bundles each entry separately with `splitting: false` — `dist/index.js` and `dist/models.js`\n * each embed their own copy) shares the SAME maps. Without this, `@theokit/sdk/models`'s\n * `refreshModelCatalog` saw an eternally-empty registry and its patches were invisible to the core bundle's\n * capability/pricing lookups (state duplication made load-bearing by M44).\n */\nconst REGISTRY = globalSingleton(\n \"theokit-sdk.providers.registry\",\n () => new Map<string, ProviderProfile>(),\n);\nconst ALIASES = globalSingleton(\"theokit-sdk.providers.aliases\", () => new Map<string, string>());\n\n/** Routes look every provider name up in lowercase, so the registry keys by lowercase too. */\nfunction key(name: string): string {\n return name.toLowerCase();\n}\n\n/**\n * Registers `profile` under its lowercase name and lowercase aliases, because routes look provider\n * names up in lowercase: a profile named `AcmeAI` with alias `AcmeX` is reached by either spelling.\n */\nexport function registerProvider(input: ProviderProfile): void {\n const profile: ProviderProfile = {\n ...input,\n name: key(input.name),\n ...(input.aliases === undefined ? {} : { aliases: input.aliases.map(key) }),\n };\n if (REGISTRY.has(profile.name)) {\n diag(`[theokit-sdk] Provider \"${profile.name}\" overridden by user plugin.\\n`);\n }\n REGISTRY.set(profile.name, profile);\n for (const alias of profile.aliases ?? []) {\n // EC-5: surface alias collision so operators notice mis-routing.\n const previous = ALIASES.get(alias);\n if (previous !== undefined && previous !== profile.name) {\n diag(`[theokit-sdk] Alias \"${alias}\" collision: was \"${previous}\", now \"${profile.name}\".\\n`);\n }\n ALIASES.set(alias, profile.name);\n }\n}\n\nexport function getProviderProfile(name: string): ProviderProfile | undefined {\n const lower = key(name);\n return REGISTRY.get(ALIASES.get(lower) ?? lower);\n}\n\nexport function listProviders(): ProviderProfile[] {\n return Array.from(REGISTRY.values());\n}\n\n/** Test-only reset. @internal */\nexport function _resetProvidersForTests(): void {\n REGISTRY.clear();\n ALIASES.clear();\n}\n","import { z } from \"zod\";\n\n/**\n * M44 — the per-model catalog sub-schema. Field names mirror models.dev VERBATIM (snake_case) so\n * `scripts/refresh-catalog.mjs` regenerates the vendored data mechanically from `api.json` with zero\n * renaming (ADR D1).\n * TOLERANT by design: every field optional, unknown keys ignored — models.dev adds fields over time and\n * additive drift must never break the loader (Blueprint §6.4).\n *\n * theokit extensions beyond models.dev: `structured_output` / `cache_control` (both already exist on the\n * SDK's `ModelCapabilities`; models.dev has no such flags).\n *\n * Semver-exempt: nothing here is declared in `package.json` `exports`. `MODALITIES` is nonetheless\n * reachable from published declarations through the type graph, so it must be EMITTED.\n *\n * NOTE — no internal-visibility tag in this block. `tsconfig.base.json` sets `stripInternal: true`,\n * and TypeScript scans EVERY leading comment range of the declaration that follows; the tag that\n * used to sit here deleted the `MODALITIES` declaration below from the emitted `.d.ts`.\n */\n\nexport const MODALITIES = [\"text\", \"audio\", \"image\", \"video\", \"pdf\"] as const;\n\n/**\n * One input or output medium a model accepts or produces.\n *\n * The union is derived from `MODALITIES`, so it is closed: a models.dev entry whose\n * `modalities.input` or `modalities.output` array contains a string outside this set fails\n * `catalogModelSchema.safeParse`, and `patchIndexFromApiJson` drops that single model rather\n * than the whole payload. Widening the catalog to a new medium means adding it to `MODALITIES`\n * first — nothing else in the schema enumerates media.\n */\nexport type Modality = (typeof MODALITIES)[number];\n\nconst costSchema = z\n .object({\n /** USD per 1M tokens (models.dev convention). */\n input: z.number().nonnegative(),\n output: z.number().nonnegative(),\n cache_read: z.number().nonnegative().optional(),\n cache_write: z.number().nonnegative().optional(),\n })\n .loose();\n\nconst limitSchema = z\n .object({\n context: z.number().positive(),\n input: z.number().positive().optional(),\n output: z.number().positive().optional(),\n })\n .loose();\n\nconst modalitiesSchema = z\n .object({\n input: z.array(z.enum(MODALITIES)).optional(),\n output: z.array(z.enum(MODALITIES)).optional(),\n })\n .loose();\n\nexport const catalogModelSchema = z\n .object({\n name: z.string().optional(),\n release_date: z.string().optional(),\n attachment: z.boolean().optional(),\n reasoning: z.boolean().optional(),\n temperature: z.boolean().optional(),\n tool_call: z.boolean().optional(),\n /** theokit extension — maps to ModelCapabilities.supportsStructuredOutput. */\n structured_output: z.boolean().optional(),\n /** theokit extension — maps to ModelCapabilities.supportsCacheControl. */\n cache_control: z.boolean().optional(),\n cost: costSchema.optional(),\n limit: limitSchema.optional(),\n modalities: modalitiesSchema.optional(),\n status: z.enum([\"alpha\", \"beta\", \"deprecated\"]).optional(),\n })\n .loose();\n\n/**\n * One model entry as it is stored in the vendored catalog and as models.dev publishes it.\n *\n * Every field is optional, so an entry that carries only `name` still parses. Reading a value\n * therefore means handling `undefined` at each level — `model.cost?.cache_read`, not\n * `model.cost.cache_read`. Field names are models.dev's own snake_case, kept verbatim so the\n * refresh script can copy `api.json` across without renaming.\n *\n * The schema is loose rather than strict: unknown keys survive parsing and stay on the returned\n * object instead of being rejected or dropped. That is what lets models.dev add a field without\n * breaking the loader — the cost is that a typo in a key name parses silently, so a caller\n * cannot use \"it parsed\" as evidence that a field it expected was present.\n *\n * `structured_output` and `cache_control` are theokit's own additions; models.dev publishes\n * neither.\n */\nexport type CatalogModel = z.infer<typeof catalogModelSchema>;\n\n/**\n * Per-token pricing for one model, in USD per 1M tokens (models.dev's unit — not per token, and\n * not per 1K).\n *\n * `input` and `output` are required and non-negative; the two cache buckets are optional and\n * absent for models that do not price caching separately. Absent is not zero: a missing\n * `cache_read` means the catalog says nothing about the cost of a cache hit, so a caller that\n * defaults it to 0 is asserting free cache reads on its own authority.\n *\n * Like `CatalogModel`, the shape is loose — unknown pricing keys published upstream are kept on\n * the parsed value.\n */\nexport type CatalogModelCost = z.infer<typeof costSchema>;\n\n/**\n * One provider entry in the vendored catalog.\n *\n * LOOSE like `catalogModelSchema` beside it, and for the same reason: this validates a vendored data\n * file that upstream extends over time, so unknown keys are kept rather than rejected. What it does\n * NOT do is what the hand-rolled check it replaced did — assert. That check tested nine fields with\n * `typeof`/`Array.isArray` and then cast the whole object through `as unknown as CatalogEntry`, so\n * `capabilities`' contents, `aliases`, `modelsUrl`, `hostname`, `extraHeaders` and `models` were\n * declared and never checked. Standing next to zod — one of this package's three runtime\n * dependencies — and reimplementing a worse version of it is the Don't-Reinvent rung of\n * `rules/parsimony-ladder.md`.\n *\n * `apiMode` and `authType` are the closed unions from `types/provider-profile.ts`. Enumerating them\n * here means an entry naming a mode the SDK cannot dispatch is dropped with a WARN at load, instead\n * of reaching `selectTransport` as a string that matches no branch.\n */\nexport const catalogEntrySchema = z\n .object({\n id: z.string().min(1),\n displayName: z.string().min(1),\n apiMode: z.enum([\n \"chat_completions\",\n \"anthropic_messages\",\n \"responses_api\",\n \"bedrock\",\n \"bedrock_anthropic\",\n ]),\n authType: z.enum([\n \"api_key\",\n \"oauth_device_code\",\n \"oauth_external\",\n \"aws_sdk\",\n \"aws_bearer\",\n \"gcp_oauth\",\n \"none\",\n ]),\n baseUrl: z.string(),\n envVars: z.array(z.string()),\n fallbackModels: z.array(z.string()),\n capabilities: z.object({\n supportsToolUse: z.boolean(),\n supportsVision: z.boolean(),\n supportsStructuredOutput: z.boolean(),\n supportsStreaming: z.boolean(),\n supportsCacheControl: z.boolean(),\n maxContextTokens: z.number().int().positive().optional(),\n maxOutputTokens: z.number().int().positive().optional(),\n }),\n aliases: z.array(z.string()).optional(),\n modelsUrl: z.string().optional(),\n hostname: z.string().optional(),\n extraHeaders: z.record(z.string(), z.string()).optional(),\n models: z.record(z.string(), catalogModelSchema).optional(),\n })\n .loose();\n","[\n {\n \"id\": \"openai\",\n \"displayName\": \"OpenAI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.openai.com/v1\",\n \"envVars\": [\"OPENAI_API_KEY\"],\n \"fallbackModels\": [\"gpt-4o-mini\", \"gpt-4o\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"openai\", \"openai-chatgpt\"],\n \"models\": {\n \"gpt-4o-mini\": {\n \"name\": \"GPT-4o mini\",\n \"release_date\": \"2024-07-18\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 0.15,\n \"output\": 0.6,\n \"cache_read\": 0.075\n },\n \"limit\": {\n \"context\": 128000,\n \"output\": 16384\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"gpt-4o\": {\n \"name\": \"GPT-4o\",\n \"release_date\": \"2024-05-13\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 2.5,\n \"output\": 10,\n \"cache_read\": 1.25\n },\n \"limit\": {\n \"context\": 128000,\n \"output\": 16384\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"gpt-4-turbo\": {\n \"name\": \"GPT-4 Turbo\",\n \"release_date\": \"2023-11-06\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": false,\n \"cost\": {\n \"input\": 10,\n \"output\": 30\n },\n \"limit\": {\n \"context\": 128000,\n \"output\": 4096\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"o1\": {\n \"name\": \"o1\",\n \"release_date\": \"2024-12-05\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": false,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 15,\n \"output\": 60,\n \"cache_read\": 7.5\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 100000\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"o3\": {\n \"name\": \"o3\",\n \"release_date\": \"2025-04-16\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": false,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 2,\n \"output\": 8,\n \"cache_read\": 0.5\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 100000\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"gpt-4.1\": {\n \"name\": \"GPT-4.1\",\n \"release_date\": \"2025-04-14\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 2,\n \"output\": 8,\n \"cache_read\": 0.5\n },\n \"limit\": {\n \"context\": 1047576,\n \"output\": 32768\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"gpt-5.4\": {\n \"limit\": {\n \"context\": 400000,\n \"output\": 128000\n }\n },\n \"gpt-5.4-mini\": {\n \"limit\": {\n \"context\": 400000,\n \"output\": 128000\n }\n },\n \"gpt-5.3\": {\n \"limit\": {\n \"context\": 400000,\n \"output\": 128000\n }\n },\n \"gpt-5.2\": {\n \"limit\": {\n \"context\": 400000,\n \"output\": 128000\n }\n }\n }\n },\n {\n \"id\": \"anthropic\",\n \"displayName\": \"Anthropic\",\n \"apiMode\": \"anthropic_messages\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.anthropic.com/v1\",\n \"envVars\": [\"ANTHROPIC_API_KEY\"],\n \"fallbackModels\": [\"claude-sonnet-4-20250514\", \"claude-3-5-haiku-latest\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": true\n },\n \"aliases\": [\"anthropic\"],\n \"models\": {\n \"claude-3-5-haiku-latest\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 8192\n }\n },\n \"claude-opus-4-7\": {\n \"name\": \"Claude Opus 4.7\",\n \"release_date\": \"2026-04-14\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": false,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 5,\n \"output\": 25,\n \"cache_read\": 0.5,\n \"cache_write\": 6.25\n },\n \"limit\": {\n \"context\": 1000000,\n \"output\": 128000\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\", \"pdf\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": true\n },\n \"claude-sonnet-4-6\": {\n \"name\": \"Claude Sonnet 4.6\",\n \"release_date\": \"2026-02-17\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 3,\n \"output\": 15,\n \"cache_read\": 0.3,\n \"cache_write\": 3.75\n },\n \"limit\": {\n \"context\": 1000000,\n \"output\": 128000\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\", \"pdf\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": true\n },\n \"claude-haiku-4-5-20251001\": {\n \"name\": \"Claude Haiku 4.5\",\n \"release_date\": \"2025-10-15\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 1,\n \"output\": 5,\n \"cache_read\": 0.1,\n \"cache_write\": 1.25\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 64000\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\", \"pdf\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": true\n },\n \"claude-opus-4\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 32000\n }\n },\n \"claude-sonnet-4\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 16000\n }\n },\n \"claude-3-5-sonnet\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 8192\n }\n },\n \"claude-3-5-sonnet-latest\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 8192\n }\n },\n \"claude-3-haiku\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 4096\n }\n },\n \"claude-3-opus\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 4096\n }\n },\n \"claude-opus-4.1\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 32000\n }\n },\n \"claude-sonnet-4.5\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 16000\n }\n },\n \"claude-3.5-sonnet\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": true,\n \"modalities\": {\n \"input\": [\"text\", \"image\"]\n },\n \"limit\": {\n \"context\": 200000,\n \"output\": 8192\n }\n }\n }\n },\n {\n \"id\": \"openrouter\",\n \"displayName\": \"OpenRouter\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://openrouter.ai/api/v1\",\n \"envVars\": [\"OPENROUTER_API_KEY\"],\n \"fallbackModels\": [\"openai/gpt-4o-mini\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"openrouter\"]\n },\n {\n \"id\": \"groq\",\n \"displayName\": \"Groq\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.groq.com/openai/v1\",\n \"envVars\": [\"GROQ_API_KEY\"],\n \"fallbackModels\": [\"llama-3.3-70b-versatile\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"models\": {\n \"llama-3.3-70b-versatile\": {\n \"name\": \"Llama 3.3 70B\",\n \"release_date\": \"2024-12-06\",\n \"attachment\": false,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"cost\": {\n \"input\": 0.59,\n \"output\": 0.79\n },\n \"limit\": {\n \"context\": 131072,\n \"output\": 32768\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n }\n }\n }\n },\n {\n \"id\": \"mistral\",\n \"displayName\": \"Mistral AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.mistral.ai/v1\",\n \"envVars\": [\"MISTRAL_API_KEY\"],\n \"fallbackModels\": [\"mistral-large-latest\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"models\": {\n \"mistral-large-latest\": {\n \"name\": \"Mistral Large (latest)\",\n \"release_date\": \"2024-11-01\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"cost\": {\n \"input\": 0.5,\n \"output\": 1.5\n },\n \"limit\": {\n \"context\": 262144,\n \"output\": 262144\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n }\n }\n }\n },\n {\n \"id\": \"deepseek\",\n \"displayName\": \"DeepSeek\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.deepseek.com/v1\",\n \"envVars\": [\"DEEPSEEK_API_KEY\"],\n \"fallbackModels\": [\"deepseek-chat\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"models\": {\n \"deepseek-chat\": {\n \"name\": \"DeepSeek Chat\",\n \"release_date\": \"2025-12-01\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"cost\": {\n \"input\": 0.14,\n \"output\": 0.28,\n \"cache_read\": 0.0028\n },\n \"limit\": {\n \"context\": 1000000,\n \"output\": 384000\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n }\n },\n \"deepseek-v4-flash\": {\n \"name\": \"DeepSeek V4 Flash\",\n \"release_date\": \"2026-04-24\",\n \"attachment\": false,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": false,\n \"cost\": {\n \"input\": 0.14,\n \"output\": 0.28,\n \"cache_read\": 0.0028\n },\n \"limit\": {\n \"context\": 1048576,\n \"output\": 8000\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"deepseek-v3.2\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": false,\n \"modalities\": {\n \"input\": [\"text\"]\n },\n \"limit\": {\n \"context\": 131072,\n \"output\": 8000\n }\n }\n }\n },\n {\n \"id\": \"together\",\n \"displayName\": \"Together AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.together.xyz/v1\",\n \"envVars\": [\"TOGETHER_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"fireworks\",\n \"displayName\": \"Fireworks AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.fireworks.ai/inference/v1\",\n \"envVars\": [\"FIREWORKS_API_KEY\"],\n \"fallbackModels\": [\"accounts/fireworks/models/llama-v3p1-70b-instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"google-gemini\",\n \"displayName\": \"Google Gemini\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://generativelanguage.googleapis.com/v1beta/openai\",\n \"envVars\": [\"GOOGLE_API_KEY\", \"GEMINI_API_KEY\"],\n \"fallbackModels\": [\"gemini-2.0-flash\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"gemini\", \"google\"],\n \"models\": {\n \"gemini-2.0-flash\": {\n \"name\": \"Gemini 2.0 Flash\",\n \"release_date\": \"2024-12-11\",\n \"attachment\": true,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 0.1,\n \"output\": 0.4,\n \"cache_read\": 0.025\n },\n \"limit\": {\n \"context\": 1048576,\n \"output\": 8192\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\", \"audio\", \"video\", \"pdf\"],\n \"output\": [\"text\"]\n },\n \"status\": \"deprecated\"\n },\n \"gemini-2.5-flash-lite\": {\n \"name\": \"Gemini 2.5 Flash-Lite\",\n \"release_date\": \"2025-06-17\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 0.1,\n \"output\": 0.4,\n \"cache_read\": 0.01\n },\n \"limit\": {\n \"context\": 1048576,\n \"output\": 8000\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n },\n \"gemini-2.5-pro\": {\n \"name\": \"Gemini 2.5 Pro\",\n \"release_date\": \"2025-06-17\",\n \"attachment\": true,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"structured_output\": true,\n \"cost\": {\n \"input\": 1.25,\n \"output\": 10,\n \"cache_read\": 0.125\n },\n \"limit\": {\n \"context\": 1048576,\n \"output\": 8000\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n },\n \"cache_control\": false\n }\n }\n },\n {\n \"id\": \"ollama\",\n \"displayName\": \"Ollama\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"none\",\n \"baseUrl\": \"http://localhost:11434/v1\",\n \"envVars\": [],\n \"fallbackModels\": [\"llama3.2\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"ollama\"]\n },\n {\n \"id\": \"lmstudio\",\n \"displayName\": \"LM Studio\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"none\",\n \"baseUrl\": \"http://localhost:1234/v1\",\n \"envVars\": [],\n \"fallbackModels\": [\"lmstudio-community/default\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"lmstudio\"]\n },\n {\n \"id\": \"llamacpp\",\n \"displayName\": \"llama.cpp\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"none\",\n \"baseUrl\": \"http://localhost:8080/v1\",\n \"envVars\": [],\n \"fallbackModels\": [\"default\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"llamacpp\"]\n },\n {\n \"id\": \"bedrock\",\n \"displayName\": \"AWS Bedrock\",\n \"apiMode\": \"bedrock\",\n \"authType\": \"aws_sdk\",\n \"baseUrl\": \"https://bedrock-runtime.us-east-1.amazonaws.com\",\n \"envVars\": [\"AWS_ACCESS_KEY_ID\", \"AWS_SECRET_ACCESS_KEY\"],\n \"fallbackModels\": [\"anthropic.claude-3-5-sonnet-20241022-v2:0\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": true\n },\n \"aliases\": [\"bedrock\"]\n },\n {\n \"id\": \"vertex\",\n \"displayName\": \"Google Vertex AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"gcp_oauth\",\n \"baseUrl\": \"https://us-central1-aiplatform.googleapis.com/v1\",\n \"envVars\": [\"GOOGLE_APPLICATION_CREDENTIALS\"],\n \"fallbackModels\": [\"gemini-1.5-pro\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"vertex\"]\n },\n {\n \"id\": \"cohere\",\n \"displayName\": \"Cohere\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.cohere.com/v2\",\n \"envVars\": [\"COHERE_API_KEY\"],\n \"fallbackModels\": [\"command-r-plus\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"perplexity\",\n \"displayName\": \"Perplexity\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.perplexity.ai\",\n \"envVars\": [\"PERPLEXITY_API_KEY\"],\n \"fallbackModels\": [\"llama-3.1-sonar-large-128k-online\"],\n \"capabilities\": {\n \"supportsToolUse\": false,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"xai\",\n \"displayName\": \"xAI (Grok)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.x.ai/v1\",\n \"envVars\": [\"XAI_API_KEY\"],\n \"fallbackModels\": [\"grok-2\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"grok\"]\n },\n {\n \"id\": \"sambanova\",\n \"displayName\": \"SambaNova\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.sambanova.ai/v1\",\n \"envVars\": [\"SAMBANOVA_API_KEY\"],\n \"fallbackModels\": [\"Meta-Llama-3.1-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"cerebras\",\n \"displayName\": \"Cerebras\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.cerebras.ai/v1\",\n \"envVars\": [\"CEREBRAS_API_KEY\"],\n \"fallbackModels\": [\"llama3.1-70b\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"deepinfra\",\n \"displayName\": \"DeepInfra\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.deepinfra.com/v1/openai\",\n \"envVars\": [\"DEEPINFRA_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3.1-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"huggingface\",\n \"displayName\": \"Hugging Face\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api-inference.huggingface.co/v1\",\n \"envVars\": [\"HF_TOKEN\", \"HUGGINGFACE_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Llama-3.2-3B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"nvidia\",\n \"displayName\": \"NVIDIA NIM\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://integrate.api.nvidia.com/v1\",\n \"envVars\": [\"NVIDIA_API_KEY\"],\n \"fallbackModels\": [\"meta/llama-3.1-70b-instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"lepton\",\n \"displayName\": \"Lepton AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://llama3-1-70b.lepton.run/api/v1\",\n \"envVars\": [\"LEPTON_API_KEY\"],\n \"fallbackModels\": [\"llama3-1-70b\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"anyscale\",\n \"displayName\": \"Anyscale\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.endpoints.anyscale.com/v1\",\n \"envVars\": [\"ANYSCALE_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"replicate\",\n \"displayName\": \"Replicate\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://openai-proxy.replicate.com/v1\",\n \"envVars\": [\"REPLICATE_API_TOKEN\"],\n \"fallbackModels\": [\"meta/meta-llama-3-70b-instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": false,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"ai21\",\n \"displayName\": \"AI21 Labs\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.ai21.com/studio/v1\",\n \"envVars\": [\"AI21_API_KEY\"],\n \"fallbackModels\": [\"jamba-1.5-large\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"aleph-alpha\",\n \"displayName\": \"Aleph Alpha\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.aleph-alpha.com/v1\",\n \"envVars\": [\"ALEPH_ALPHA_API_KEY\"],\n \"fallbackModels\": [\"luminous-extended\"],\n \"capabilities\": {\n \"supportsToolUse\": false,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"cloudflare\",\n \"displayName\": \"Cloudflare Workers AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.cloudflare.com/client/v4/accounts/{account_id}/ai/v1\",\n \"envVars\": [\"CLOUDFLARE_API_TOKEN\", \"CLOUDFLARE_ACCOUNT_ID\"],\n \"fallbackModels\": [\"@cf/meta/llama-3.1-70b-instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"azure-openai\",\n \"displayName\": \"Azure OpenAI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://{resource}.openai.azure.com/openai/deployments/{deployment}\",\n \"envVars\": [\"AZURE_OPENAI_API_KEY\", \"AZURE_OPENAI_ENDPOINT\"],\n \"fallbackModels\": [\"gpt-4o\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"github-models\",\n \"displayName\": \"GitHub Models\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://models.inference.ai.azure.com\",\n \"envVars\": [\"GITHUB_TOKEN\"],\n \"fallbackModels\": [\"gpt-4o-mini\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"hyperbolic\",\n \"displayName\": \"Hyperbolic\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.hyperbolic.xyz/v1\",\n \"envVars\": [\"HYPERBOLIC_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3.1-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"novita\",\n \"displayName\": \"Novita AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.novita.ai/v3/openai\",\n \"envVars\": [\"NOVITA_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/llama-3.1-70b-instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"moonshot\",\n \"displayName\": \"Moonshot (Kimi)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.moonshot.cn/v1\",\n \"envVars\": [\"MOONSHOT_API_KEY\"],\n \"fallbackModels\": [\"moonshot-v1-8k\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"qwen\",\n \"displayName\": \"Qwen (Alibaba)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://dashscope.aliyuncs.com/compatible-mode/v1\",\n \"envVars\": [\"DASHSCOPE_API_KEY\"],\n \"fallbackModels\": [\"qwen-plus\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"dashscope\"],\n \"models\": {\n \"qwen3-coder-30b-a3b-instruct\": {\n \"tool_call\": true,\n \"structured_output\": false,\n \"cache_control\": false,\n \"modalities\": {\n \"input\": [\"text\"]\n },\n \"limit\": {\n \"context\": 160000,\n \"output\": 8000\n }\n }\n }\n },\n {\n \"id\": \"zhipu\",\n \"displayName\": \"Zhipu AI (GLM)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://open.bigmodel.cn/api/paas/v4\",\n \"envVars\": [\"ZHIPU_API_KEY\"],\n \"fallbackModels\": [\"glm-4-plus\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"aliases\": [\"glm\", \"z-ai\"],\n \"models\": {\n \"glm-4.7-flash\": {\n \"name\": \"GLM-4.7-Flash\",\n \"release_date\": \"2026-01-19\",\n \"attachment\": false,\n \"reasoning\": true,\n \"temperature\": true,\n \"tool_call\": true,\n \"cost\": {\n \"input\": 0,\n \"output\": 0,\n \"cache_read\": 0,\n \"cache_write\": 0\n },\n \"limit\": {\n \"context\": 202752,\n \"output\": 8000\n },\n \"modalities\": {\n \"input\": [\"text\"],\n \"output\": [\"text\"]\n },\n \"structured_output\": false,\n \"cache_control\": false\n }\n }\n },\n {\n \"id\": \"minimax\",\n \"displayName\": \"MiniMax\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.minimax.chat/v1\",\n \"envVars\": [\"MINIMAX_API_KEY\"],\n \"fallbackModels\": [\"MiniMax-Text-01\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"baichuan\",\n \"displayName\": \"Baichuan\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.baichuan-ai.com/v1\",\n \"envVars\": [\"BAICHUAN_API_KEY\"],\n \"fallbackModels\": [\"Baichuan4\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"voyage\",\n \"displayName\": \"Voyage AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.voyageai.com/v1\",\n \"envVars\": [\"VOYAGE_API_KEY\"],\n \"fallbackModels\": [\"voyage-3\"],\n \"capabilities\": {\n \"supportsToolUse\": false,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": false,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"jina\",\n \"displayName\": \"Jina AI\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.jina.ai/v1\",\n \"envVars\": [\"JINA_API_KEY\"],\n \"fallbackModels\": [\"jina-embeddings-v3\"],\n \"capabilities\": {\n \"supportsToolUse\": false,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": false,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"helicone\",\n \"displayName\": \"Helicone (Gateway)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://oai.helicone.ai/v1\",\n \"envVars\": [\"HELICONE_API_KEY\", \"OPENAI_API_KEY\"],\n \"fallbackModels\": [\"gpt-4o-mini\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n },\n \"models\": {\n \"gpt-4o-mini\": {\n \"name\": \"OpenAI GPT-4o-mini\",\n \"release_date\": \"2024-07-18\",\n \"attachment\": false,\n \"reasoning\": false,\n \"temperature\": true,\n \"tool_call\": true,\n \"cost\": {\n \"input\": 0.15,\n \"output\": 0.6,\n \"cache_read\": 0.075\n },\n \"limit\": {\n \"context\": 128000,\n \"output\": 16384\n },\n \"modalities\": {\n \"input\": [\"text\", \"image\"],\n \"output\": [\"text\"]\n }\n }\n }\n },\n {\n \"id\": \"portkey\",\n \"displayName\": \"Portkey (Gateway)\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.portkey.ai/v1\",\n \"envVars\": [\"PORTKEY_API_KEY\"],\n \"fallbackModels\": [\"gpt-4o-mini\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": true,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"baseten\",\n \"displayName\": \"Baseten\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://bridge.baseten.co/v1\",\n \"envVars\": [\"BASETEN_API_KEY\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": true,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n },\n {\n \"id\": \"modal\",\n \"displayName\": \"Modal\",\n \"apiMode\": \"chat_completions\",\n \"authType\": \"api_key\",\n \"baseUrl\": \"https://api.modal.com/v1\",\n \"envVars\": [\"MODAL_TOKEN_ID\", \"MODAL_TOKEN_SECRET\"],\n \"fallbackModels\": [\"meta-llama/Meta-Llama-3-70B-Instruct\"],\n \"capabilities\": {\n \"supportsToolUse\": true,\n \"supportsVision\": false,\n \"supportsStructuredOutput\": false,\n \"supportsStreaming\": true,\n \"supportsCacheControl\": false\n }\n }\n]\n","/**\n * Provider catalog loader (T10.1, ADR D447).\n *\n * Provider metadata, EMBEDDED at build time. Malformed entries are skipped with WARN (EC-1) — never\n * crash.\n *\n * ## Why embedded and not read from disk\n *\n * It used to be `readFileSync` from a directory computed as\n * `dirname(fileURLToPath(import.meta.url))` at module scope. Both halves break on a runtime with no\n * filesystem, in that order, and this file is only model METADATA — so an environment that could not\n * read it could not run a turn at all.\n *\n * Measured end to end on 2026-09-28, driving a real deploy of a TheoKit app (theokit#705):\n *\n * 1. Cloudflare EXECUTES the top-level module during validation, so the upload was refused before\n * any request existed — `The \"path\" argument must be of type string … Received undefined`,\n * code 10021.\n * 2. With `import.meta.url` substituted by the consumer's bundler, the module initialised and the\n * TURN failed: `[unenv] fs.readFileSync is not implemented yet!`\n * 3. With a newer `compatibility_date`, workerd implements `readFileSync` and the error became the\n * honest one: `ENOENT: readAll '/provider-catalog.json'`. The same `ENOENT` reached a deployed\n * Vercel function, whose bundle carries the JS and not the JSON.\n *\n * No consumer's bundler can fix that from outside. Probed from inside a deployed worker, workerd's\n * whole virtual filesystem is `/bundle/worker.js`, an empty `/tmp` and `/dev` — there is nowhere to\n * put this package's private data file such that `join(dirname(<a file URL>), …)` finds it, short of\n * hardcoding our internal layout into their build.\n *\n * `with { type: \"json\" }` follows `internal/budget/pricing-registry.ts`, which has imported a sibling\n * JSON exactly this way in this package for as long as it has existed. Bundlers inline it, so the\n * emitted module carries the data and reaches for nothing.\n *\n * @internal\n */\n\nimport { diag } from \"../diagnostics.js\";\nimport { globalSingleton } from \"../global-singleton.js\";\nimport { type CatalogModel, catalogEntrySchema, catalogModelSchema } from \"./catalog-schema.js\";\nimport embeddedCatalog from \"./provider-catalog.json\" with { type: \"json\" };\nimport { getProviderProfile, registerProvider } from \"./registry.js\";\nimport type { ApiMode, AuthType, ProviderProfile } from \"./types.js\";\n\nexport interface ProviderCapabilities {\n supportsToolUse: boolean;\n supportsVision: boolean;\n supportsStructuredOutput: boolean;\n supportsStreaming: boolean;\n supportsCacheControl: boolean;\n maxContextTokens?: number;\n maxOutputTokens?: number;\n}\n\nexport interface CatalogEntry {\n id: string;\n displayName: string;\n apiMode: ApiMode;\n authType: AuthType;\n baseUrl: string;\n envVars: string[];\n fallbackModels: string[];\n capabilities: ProviderCapabilities;\n aliases?: string[];\n modelsUrl?: string;\n hostname?: string;\n extraHeaders?: Record<string, string>;\n /**\n * M44 — OPTIONAL per-model data (models.dev shape, snake_case — see `catalog-schema.ts`), keyed by the\n * BARE model id. Additive: entries without it behave byte-identically to before. The loader indexes this\n * into the model-info index (`getCatalogModelInfo`) rather than onto `ProviderProfile` (ADR D2 — the\n * builtins-first registration skip means profile-attached data would never reach builtin providers).\n */\n models?: Record<string, CatalogModel>;\n}\n\n/**\n * M44 — the model-info index: `provider/model` → per-model catalog data (the EXACT-map key convention).\n * Populated by the vendored catalog load AND patched by the optional models-dev source (cache entries win\n * per model). The single lookup surface for capability / cost / limit enrichment.\n */\n// M44 B1 fix — index state on globalThis (Symbol.for) so every bundle copy shares the SAME maps (see the\n// identical pattern + rationale in registry.ts).\nconst modelInfoIndex = globalSingleton(\n \"theokit-sdk.providers.model-info-index\",\n () => new Map<string, CatalogModel>(),\n);\n/** M44 M5 fix — keys patched by the live models-dev source (honest pricing provenance). */\nconst patchedModelKeys = globalSingleton(\n \"theokit-sdk.providers.model-info-patched\",\n () => new Set<string>(),\n);\nconst indexState = globalSingleton(\"theokit-sdk.providers.model-info-loaded\", () => ({\n loaded: false,\n}));\n\n/**\n * Look up per-model catalog data by `provider/model` key.\n *\n * Semver-exempt: not declared in `package.json` `exports`, but re-exported by\n * `catalog-source-models-dev.ts`, whose declaration is reachable from published entries — so it\n * must be EMITTED.\n */\nexport function getCatalogModelInfo(key: string): CatalogModel | undefined {\n ensureModelIndexLoaded();\n return modelInfoIndex.get(key);\n}\n\n/** Was this key patched by the LIVE models-dev source (vs the vendored catalog)? @internal */\nexport function isPatchedModelKey(key: string): boolean {\n return patchedModelKeys.has(key);\n}\n\n/**\n * Patch the index with fresher per-model data (the models-dev source). M44 H2 fix — a per-FIELD shallow\n * MERGE, not a wholesale replace: models.dev can never supply the theokit extension fields\n * (`cache_control`, `structured_output` overlays), so a replace would wipe them and silently flip\n * capability answers. Incoming fields win; existing fields survive when the patch omits them.\n * @internal\n */\nexport function patchModelInfo(key: string, model: CatalogModel): void {\n ensureModelIndexLoaded();\n const existing = modelInfoIndex.get(key);\n modelInfoIndex.set(key, existing === undefined ? model : { ...existing, ...model });\n patchedModelKeys.add(key);\n}\n\n/** All indexed `provider/model` keys (for maintenance/tests). @internal */\nexport function listModelInfoKeys(): string[] {\n ensureModelIndexLoaded();\n return [...modelInfoIndex.keys()];\n}\n\nfunction ensureModelIndexLoaded(): void {\n if (indexState.loaded) return;\n indexState.loaded = true;\n // M44 L9 fix — never throw from a capability/pricing lookup: a missing/corrupt vendored catalog degrades\n // to conservative defaults with a WARN (the deleted EXACT map could never throw; keep that property).\n try {\n const catalog = loadProviderCatalog();\n for (const entry of Object.values(catalog)) {\n indexEntryModels(entry);\n }\n } catch (err) {\n diag(\n `[theokit-sdk] WARN: provider catalog unavailable (${(err as Error).message}) — per-model data disabled\\n`,\n );\n }\n}\n\n/**\n * Index an entry's `models` block. Runs for EVERY catalog entry — including those whose PROVIDER\n * registration is skipped builtins-first — so builtin providers still get their per-model data (ADR D2).\n * A malformed model sub-entry drops THAT MODEL with WARN and keeps the provider (EC-1 philosophy extended).\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: one pass over a vendored data file, branching per OPTIONAL field the upstream schema may or may not carry (models, cost, modalities, limits). Splitting it produces N helpers that each re-check the same entry — the branches are field presence, not decisions.\nfunction indexEntryModels(entry: CatalogEntry): void {\n if (entry.models === undefined || typeof entry.models !== \"object\") return;\n for (const [modelId, raw] of Object.entries(entry.models)) {\n const parsed = catalogModelSchema.safeParse(raw);\n if (!parsed.success) {\n diag(\n `[theokit-sdk] WARN: Skipping malformed catalog model \"${entry.id}/${modelId}\": ` +\n `${parsed.error.issues[0]?.message ?? \"invalid\"}\\n`,\n );\n continue;\n }\n // Index under the entry id AND every alias — capability lookups are VENDOR-keyed (e.g.\n // `google/gemini-2.5-pro` while the entry id is `google-gemini` with alias `google`), so alias keys are\n // what make the vendor-keyed convention resolve without a second mapping table.\n modelInfoIndex.set(`${entry.id}/${modelId}`, parsed.data);\n for (const alias of entry.aliases ?? []) {\n const key = `${alias}/${modelId}`;\n if (!modelInfoIndex.has(key)) modelInfoIndex.set(key, parsed.data);\n }\n }\n}\n\n/** Test-only reset for the model-info index. @internal */\nexport function _resetModelInfoIndexForTests(): void {\n modelInfoIndex.clear();\n patchedModelKeys.clear();\n indexState.loaded = false;\n}\n\ninterface LoadOptions {\n _testInjectMalformed?: boolean;\n}\n\nfunction validateEntry(raw: Record<string, unknown>): CatalogEntry | null {\n const parsed = catalogEntrySchema.safeParse(raw);\n // The WARN-and-skip behaviour at the call site is unchanged; only what counts as valid is.\n return parsed.success ? (parsed.data as CatalogEntry) : null;\n}\n\nexport function loadProviderCatalog(opts?: LoadOptions): Record<string, CatalogEntry> {\n // Copied, not aliased: `_testInjectMalformed` below appends to it, and the embedded array is a\n // module-level singleton every caller shares.\n let entries: Record<string, unknown>[] = [...(embeddedCatalog as Record<string, unknown>[])];\n\n if (opts?._testInjectMalformed) {\n entries = [\n ...entries,\n { id: \"malformed-provider\", displayName: \"Bad\" } as Record<string, unknown>,\n ];\n }\n\n const result: Record<string, CatalogEntry> = {};\n for (const raw of entries) {\n const validated = validateEntry(raw as Record<string, unknown>);\n if (validated === null) {\n diag(\n `[theokit-sdk] WARN: Skipping malformed catalog entry: ${JSON.stringify(raw).slice(0, 100)}\\n`,\n );\n continue;\n }\n result[validated.id] = validated;\n }\n return result;\n}\n\nlet _capabilitiesCache: Record<string, ProviderCapabilities> | null = null;\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: a lazily-built cache with three states (unbuilt, built-and-hit, built-and-miss) folded into one read. The branch count is the state machine; extracting the build makes the miss path re-enter the same check.\nexport function getCatalogCapabilities(providerId: string): ProviderCapabilities | undefined {\n if (_capabilitiesCache === null) {\n const catalog = loadProviderCatalog();\n _capabilitiesCache = {};\n for (const entry of Object.values(catalog)) {\n _capabilitiesCache[entry.id] = entry.capabilities;\n // M45 review L4 — alias keys too (e.g. entry `google-gemini` alias `google`), consistent with the\n // model-info index's alias-keyed convention.\n for (const alias of entry.aliases ?? []) {\n if (_capabilitiesCache[alias] === undefined) _capabilitiesCache[alias] = entry.capabilities;\n }\n }\n }\n return _capabilitiesCache[providerId];\n}\n\nexport function registerCatalogProviders(opts?: LoadOptions): void {\n const catalog = loadProviderCatalog(opts);\n for (const entry of Object.values(catalog)) {\n // Skip catalog entries that would overwrite first-party builtins.\n // Builtins have richer env-var handling and are registered first.\n // Also skip if any alias collides with an existing provider name.\n if (getProviderProfile(entry.id) !== undefined) continue;\n if (entry.aliases?.some((a) => getProviderProfile(a) !== undefined)) continue;\n\n const profile: ProviderProfile = {\n name: entry.id,\n apiMode: entry.apiMode,\n authType: entry.authType,\n baseUrl: entry.baseUrl,\n envVars: entry.envVars,\n fallbackModels: entry.fallbackModels,\n displayName: entry.displayName,\n aliases: entry.aliases,\n modelsUrl: entry.modelsUrl,\n hostname: entry.hostname,\n extraHeaders: entry.extraHeaders,\n };\n registerProvider(profile);\n }\n}\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const ANTHROPIC: ProviderProfile = {\n name: \"anthropic\",\n apiMode: \"anthropic_messages\",\n envVars: [\"ANTHROPIC_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://api.anthropic.com\",\n modelsUrl: \"https://api.anthropic.com/v1/models\",\n hostname: \"api.anthropic.com\",\n fallbackModels: [\"claude-opus-4-7\", \"claude-sonnet-4-6\", \"claude-haiku-4-5-20251001\"],\n // M45 — the Anthropic beta-features header (interleaved thinking + fine-grained tool streaming). An\n // Anthropic API constant. The\n // SANCTIONED behavior delta of M45 (ADR D4) — consumed by the anthropic transport's extraHeaders wiring.\n extraHeaders: {\n \"anthropic-beta\": \"interleaved-thinking-2025-05-14,fine-grained-tool-streaming-2025-05-14\",\n },\n};\n","/**\n * AWS Bedrock profile (Adoption Roadmap #8; ADRs D286-D302).\n *\n * Bearer-only auth via `AWS_BEARER_TOKEN_BEDROCK` env (GA Sep 2025).\n * Optional `@aws/bedrock-token-generator` peer dep auto-refreshes short-term\n * tokens (D287). Transport via native `fetch`; no `@aws-sdk/*` dependency.\n *\n * Model IDs follow the `bedrock/{aws-id}` convention so the router can\n * infer the provider via prefix routing (D186). The client strips the\n * `bedrock/` prefix before building the URL.\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"../types.js\";\n\nexport const BEDROCK: ProviderProfile = {\n name: \"bedrock\",\n apiMode: \"bedrock_anthropic\",\n envVars: [\"AWS_BEARER_TOKEN_BEDROCK\"],\n authType: \"aws_bearer\",\n baseUrl: \"https://bedrock-runtime.us-east-1.amazonaws.com\",\n modelsUrl: undefined,\n hostname: \"bedrock-runtime.amazonaws.com\",\n fallbackModels: [\n \"bedrock/us.anthropic.claude-sonnet-4-5-v1:0\",\n \"bedrock/us.anthropic.claude-opus-4-7-v1:0\",\n \"bedrock/global.anthropic.claude-haiku-4-5-v1:0\",\n ],\n};\n\n/** Strip `\"bedrock/\"` prefix so the raw AWS model id is used in the URL. */\nexport function stripBedrockPrefix(modelId: string): string {\n return modelId.replace(/^bedrock\\//, \"\");\n}\n\n/**\n * Infer AWS region from a Bedrock model id prefix (D290).\n *\n * `global.*` routes via `us-east-1` (AWS default entrypoint for global\n * inference profiles).\n */\nexport function inferRegionFromModelId(modelId: string): string | undefined {\n const id = stripBedrockPrefix(modelId);\n if (id.startsWith(\"global.\")) return \"us-east-1\";\n if (id.startsWith(\"us.\")) return process.env.AWS_REGION ?? \"us-east-1\";\n if (id.startsWith(\"eu.\")) return process.env.AWS_REGION ?? \"eu-west-1\";\n if (id.startsWith(\"apac.\")) return process.env.AWS_REGION ?? \"ap-southeast-1\";\n if (id.startsWith(\"jp.\")) return \"ap-northeast-1\";\n return undefined;\n}\n\n/** Resolve baseUrl from model id; falls back to `AWS_REGION` env or `us-east-1`. */\nexport function resolveBedrockBaseUrl(modelId: string): string {\n const region = inferRegionFromModelId(modelId) ?? process.env.AWS_REGION ?? \"us-east-1\";\n return `https://bedrock-runtime.${region}.amazonaws.com`;\n}\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * M45 — the data-only base for OpenAI-compatible chat_completions providers. A profile-map pattern\n * flattened to\n * theokit's data model: leaves declare name/baseUrl/envVars (+ overrides) in ~10 lines; the router's\n * URL-join rule (version-segment detection + `chatCompletionsPath` escape) derives the endpoint.\n *\n * @internal\n */\nexport function openAiCompatibleProfile(\n p: { name: string; baseUrl: string; envVars: readonly string[] } & Partial<ProviderProfile>,\n): ProviderProfile {\n return {\n apiMode: \"chat_completions\",\n authType: \"api_key\",\n fallbackModels: [],\n ...p,\n };\n}\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/**\n * M45 — Cerebras. The integration header value is theokit's own: the header attributes TRAFFIC.\n * Models per models.dev (2026-07 snapshot).\n */\nexport const CEREBRAS = openAiCompatibleProfile({\n name: \"cerebras\",\n baseUrl: \"https://api.cerebras.ai/v1\",\n envVars: [\"CEREBRAS_API_KEY\"],\n fallbackModels: [\"gpt-oss-120b\", \"zai-glm-4.7\"],\n extraHeaders: { \"X-Cerebras-3rd-Party-Integration\": \"theokit\" },\n hostname: \"api.cerebras.ai\",\n});\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/**\n * M45 — Cohere via its OpenAI-compatibility surface (`api.cohere.ai/compatibility/v1` — the native v2 API\n * is NOT chat_completions; the discovery flagged the old catalog baseUrl as doubly wrong). Models per\n * models.dev `cohere` (2026-07 snapshot). SOURCE NOTE (review L2): the compatibility endpoint + `CO_API_KEY`\n * come from Cohere's own docs/python-SDK convention (not vendored in this repo's references) — verify with a\n * live smoke when a key is available.\n */\nexport const COHERE = openAiCompatibleProfile({\n name: \"cohere\",\n baseUrl: \"https://api.cohere.ai/compatibility/v1\",\n envVars: [\"COHERE_API_KEY\", \"CO_API_KEY\"],\n fallbackModels: [\"command-a-03-2025\"],\n hostname: \"api.cohere.ai\",\n});\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/** M45 — DeepInfra. OpenAI-compat surface under /v1/openai (models.dev `deepinfra`). */\nexport const DEEPINFRA = openAiCompatibleProfile({\n name: \"deepinfra\",\n baseUrl: \"https://api.deepinfra.com/v1/openai\",\n envVars: [\"DEEPINFRA_API_KEY\"],\n fallbackModels: [\"Qwen/Qwen3-32B\"],\n hostname: \"api.deepinfra.com\",\n});\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * Gemini via OpenRouter passthrough. Direct Gemini API uses a different\n * dialect (`generateContent`); SDK currently routes through OpenRouter's\n * OpenAI-compatible endpoint so the chat_completions transport works.\n *\n * A future plugin `@theokit-provider-gemini-direct` can override this with\n * `apiMode: \"gemini_generate_content\"` once that transport ships.\n */\nexport const GEMINI: ProviderProfile = {\n name: \"gemini\",\n apiMode: \"chat_completions\",\n envVars: [\"OPENROUTER_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://openrouter.ai/api\",\n hostname: \"openrouter.ai\",\n fallbackModels: [\"google/gemini-2.0-flash-001\"],\n};\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/**\n * M45 — Google Gemini via the DIRECT OpenAI-compat endpoint (a Google API key, not OpenRouter). Distinct\n * from the `gemini` builtin (an OpenRouter passthrough) by ADR D3 — two routes, two names. Endpoint + env\n * vars per Google's OpenAI-compatibility docs (mirrored by models.dev `google` + the M44 catalog entry).\n */\nexport const GOOGLE = openAiCompatibleProfile({\n name: \"google\",\n baseUrl: \"https://generativelanguage.googleapis.com/v1beta/openai\",\n envVars: [\"GOOGLE_API_KEY\", \"GEMINI_API_KEY\", \"GOOGLE_GENERATIVE_AI_API_KEY\"],\n fallbackModels: [\"gemini-2.5-pro\", \"gemini-2.5-flash\"],\n hostname: \"generativelanguage.googleapis.com\",\n});\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/** M45 — Groq. Values per models.dev `groq` (2026-07 snapshot); OpenAI-compat surface under /openai/v1. */\nexport const GROQ = openAiCompatibleProfile({\n name: \"groq\",\n baseUrl: \"https://api.groq.com/openai/v1\",\n envVars: [\"GROQ_API_KEY\"],\n fallbackModels: [\"llama-3.3-70b-versatile\", \"llama-3.1-8b-instant\"],\n hostname: \"api.groq.com\",\n});\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * llama.cpp server provider profile (T7.2, ADR D189).\n *\n * llama.cpp ships a HTTP server binary (`./server` since b1500+) that\n * implements the OpenAI-compatible `/v1/chat/completions` endpoint on\n * `http://localhost:8080` by default. Inherits `authType: \"none\"` from\n * D182 — no API key required for local use.\n *\n * llama.cpp idiosyncrasies:\n * - Server loads a single GGUF model at startup via `--model` CLI\n * flag. The `model` field in the chat-completions request is\n * cosmetic — any string works; the response comes from the loaded\n * model regardless. This is documented in\n * `.claude/knowledge-base/reviews/edge-case/ollama-integration-edge-cases-2026-05-21.md`\n * as EC-O.\n * - Tool calling support depends entirely on the underlying model.\n *\n * Override the default URL with `LLAMACPP_HOST`.\n *\n * @internal\n */\nexport const LLAMACPP: ProviderProfile = {\n name: \"llamacpp\",\n aliases: [\"llama-cpp\", \"llama.cpp\"],\n apiMode: \"chat_completions\",\n envVars: [\"LLAMACPP_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:8080\",\n modelsUrl: \"http://localhost:8080/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"loaded-model\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * LM Studio provider profile (T7.1, ADR D188).\n *\n * LM Studio exposes an OpenAI-compatible `/v1/chat/completions` endpoint\n * on `http://localhost:1234` by default (configurable via the LM Studio\n * UI under \"Local Server\"). Inherits the `authType: \"none\"` primitive\n * from D182 — no API key required for local use.\n *\n * LM Studio idiosyncrasies:\n * - Loads ONE model at a time via the desktop UI. The `model` field in\n * the chat-completions request is informational only — LM Studio\n * serves whatever model is currently loaded.\n * - `/v1/models` returns a single entry pointing to the loaded model.\n * - Tool calling depends on the underlying model.\n *\n * Override the default URL with `LMSTUDIO_HOST` (mirrors `OLLAMA_HOST`).\n *\n * @internal\n */\nexport const LMSTUDIO: ProviderProfile = {\n name: \"lmstudio\",\n aliases: [\"lm-studio\", \"lm_studio\"],\n apiMode: \"chat_completions\",\n envVars: [\"LMSTUDIO_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:1234\",\n modelsUrl: \"http://localhost:1234/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"loaded-model\"],\n};\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/** M45 — Mistral (La Plateforme). Values per models.dev `mistral` (2026-07 snapshot). */\nexport const MISTRAL = openAiCompatibleProfile({\n name: \"mistral\",\n baseUrl: \"https://api.mistral.ai/v1\",\n envVars: [\"MISTRAL_API_KEY\"],\n fallbackModels: [\"mistral-large-latest\", \"codestral-latest\"],\n hostname: \"api.mistral.ai\",\n});\n","import type { ProviderProfile } from \"../types.js\";\n\n/**\n * Ollama — local-first LLM runtime (ADR D182).\n *\n * Ships as a builtin so `Agent.create({ model: \"ollama/llama3.2\" })` works\n * with zero configuration when `ollama serve` is running on the default\n * port. `authType: \"none\"` signals the router to skip env-key resolution\n * and use a placeholder credential (Ollama ignores Authorization headers\n * on local installs).\n *\n * Overrides:\n * - `OLLAMA_HOST` — replaces the default `http://localhost:11434` baseUrl\n * (advanced users running Ollama on a remote machine).\n * - `OLLAMA_API_KEY` — replaces the placeholder when Ollama is behind a\n * reverse-proxy with auth or when using Ollama Cloud (paid tier).\n */\nexport const OLLAMA: ProviderProfile = {\n name: \"ollama\",\n apiMode: \"chat_completions\",\n envVars: [\"OLLAMA_API_KEY\"],\n authType: \"none\",\n baseUrl: \"http://localhost:11434\",\n modelsUrl: \"http://localhost:11434/v1/models\",\n hostname: \"localhost\",\n fallbackModels: [\"llama3.2\", \"qwen2.5\", \"mistral\"],\n};\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const OPENAI: ProviderProfile = {\n name: \"openai\",\n apiMode: \"chat_completions\",\n envVars: [\"OPENAI_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://api.openai.com\",\n modelsUrl: \"https://api.openai.com/v1/models\",\n hostname: \"api.openai.com\",\n fallbackModels: [\"gpt-4o\", \"gpt-4o-mini\"],\n};\n","/**\n * M43 — the ChatGPT \"Codex\" backend as a first-class builtin `ProviderProfile`. Migrated from the\n * agent-builder M40 workaround; the SDK now owns the provider, so a consumer only selects\n * `openai-chatgpt/<model>` and logs in — ZERO provider logic in the consumer.\n *\n * The provider-auth model (see the codex-provider-in-sdk blueprint):\n * - static profile + a `transform.fetch` that resolves the LIVE credential per HTTP request (fresh Bearer +\n * dynamic `ChatGPT-Account-Id`), so a mid-turn expiry refreshes transparently with NO agent rebuild;\n * - the protocol values (endpoint, models, oauth config, `originator` header) are SDK-owned constants.\n *\n * @internal\n */\n\nimport { homedir } from \"node:os\";\n\nimport { AuthenticationError } from \"../../../errors.js\";\nimport { readStoredOAuth } from \"../../auth/credential-store.js\";\nimport { resolveCredential } from \"../../auth/resolve-credential.js\";\nimport type { CredentialStoreConfig, OAuthProviderConfig } from \"../../auth/types.js\";\nimport type { ProviderProfile } from \"../types.js\";\n\n/**\n * The SDK-owned ambient credential store the transform reads. Defaults to `~/.theokit/auth.json`. A consumer\n * points it at its existing store dir via the DEDICATED `THEOKIT_AUTH_HOME` env var (NOT `THEOKIT_HOME` — that\n * is the SDK's whole home directory for personality/credential-pool/profiles; overloading it would redirect\n * the entire runtime). The SDK's ambient credential service.\n */\nconst DEFAULT_STORE: CredentialStoreConfig = {\n home: homedir(),\n dirName: \".theokit\",\n fileName: \"auth.json\",\n homeEnvVar: \"THEOKIT_AUTH_HOME\",\n};\n\n/**\n * The OpenAI OAuth config the transform resolves + refreshes against. `provider: \"openai\"` is the STORE\n * provider (what `/login` persists), deliberately distinct from this profile's routing name `openai-chatgpt`\n * — the two-namespace split separates the integration id from the routed provider. Endpoints/clientId/scopes\n * are OpenAI's published OAuth values.\n */\nconst OPENAI_OAUTH_CONFIG: OAuthProviderConfig = {\n provider: \"openai\",\n authorizeEndpoint: \"https://auth.openai.com/oauth/authorize\",\n tokenEndpoint: \"https://auth.openai.com/oauth/token\",\n clientId: \"app_EMoamEEZ73f0CkXaXp7hrann\",\n scopes: [\"openid\", \"profile\", \"email\", \"offline_access\"],\n redirectUri: \"https://auth.openai.com/deviceauth/callback\",\n};\n\n/**\n * Build the per-request fetch: resolve a FRESH (refreshed) Bearer + the LIVE account-id from the ambient\n * store, and inject them as headers. Re-resolves on EVERY call → mid-turn refresh with no rebuild. A\n * `Headers` object is used so `authorization` is set case-insensitively (never doubled). If no credential is\n * logged in, throw a clear error rather than putting the router's `__oauth_lazy_token__` placeholder on the\n * wire (fail-closed — missing-credential semantics).\n */\nfunction codexFetch(): typeof fetch {\n return (async (input: Parameters<typeof fetch>[0], init?: Parameters<typeof fetch>[1]) => {\n const env = process.env as Record<string, string | undefined>;\n const resolved = await resolveCredential({\n provider: \"openai\",\n store: DEFAULT_STORE,\n oauth: OPENAI_OAUTH_CONFIG,\n env,\n });\n if (resolved === undefined) {\n // AuthenticationError, not a bare Error. `isTransientError` is\n // `err instanceof TheokitAgentError && err.isRetryable`, so a bare Error here is permanently\n // non-retryable AND invisible to a consumer branching on `instanceof AuthenticationError` —\n // which is what a caller does when a login has expired. router.ts:378 already throws typed for\n // the same missing-OAuth-credential condition.\n throw new AuthenticationError(\n 'openai-chatgpt: no ChatGPT credential found — run the OpenAI device login (e.g. \"/login openai\") first.',\n { code: \"missing_credential\" },\n );\n }\n const accountId = readStoredOAuth(DEFAULT_STORE, env)?.account_id;\n const headers = new Headers(init?.headers);\n headers.set(\"authorization\", `Bearer ${resolved.apiKey}`);\n if (accountId !== undefined) headers.set(\"ChatGPT-Account-Id\", accountId);\n return fetch(input, { ...init, headers });\n }) as typeof fetch;\n}\n\nexport const OPENAI_CHATGPT: ProviderProfile = {\n name: \"openai-chatgpt\",\n apiMode: \"responses_api\",\n authType: \"oauth_device_code\",\n baseUrl: \"https://chatgpt.com/backend-api/codex\",\n envVars: [],\n fallbackModels: [\n \"openai-chatgpt/gpt-5.4\",\n \"openai-chatgpt/gpt-5.4-mini\",\n \"openai-chatgpt/gpt-5.5\",\n ],\n // #165 — this shipped as `codex_cli_rs`, another vendor's client identifier. Claiming to be a different\n // vendor's client is a false statement of identity. Third-party clients send their OWN name against\n // this same endpoint, which also shows the route is not restricted to the official client.\n extraHeaders: { originator: \"theokit\" },\n // usetheokit/theokit-sdk#383 — carry the model's encrypted reasoning between the rounds of a turn.\n // On for THIS profile and no other because this is the endpoint the issue measured: OpenAI Codex\n // sends `include: [\"reasoning.encrypted_content\"]` with `reasoning.context: \"all_turns\"` to the\n // same backend, same model, on the same account, so acceptance is observed rather than assumed.\n // The issue's measurement — a third of our bytes, 2.8x our tokens — is what this closes together\n // with `prompt_cache_key`.\n encryptedReasoning: true,\n transform: {\n // Only `fetch` (async) can await the credential refresh; `headers` is sync and cannot.\n fetch: () => codexFetch(),\n },\n};\n","import type { ProviderProfile } from \"../types.js\";\n\nexport const OPENROUTER: ProviderProfile = {\n name: \"openrouter\",\n apiMode: \"chat_completions\",\n aliases: [\"or\"],\n // Ordered fallback (EC-10): OPENROUTER_API_KEY preferred, OPENAI_API_KEY as compat.\n envVars: [\"OPENROUTER_API_KEY\", \"OPENAI_API_KEY\"],\n authType: \"api_key\",\n baseUrl: \"https://openrouter.ai/api\",\n modelsUrl: \"https://openrouter.ai/api/v1/models\",\n hostname: \"openrouter.ai\",\n // M45 — models refreshed (claude-3-haiku retired upstream).\n fallbackModels: [\"openai/gpt-4o-mini\", \"anthropic/claude-haiku-4-5\"],\n // M45 — OpenRouter app-attribution headers. VALUES are\n // theokit's own — copying another app's referer would misattribute traffic).\n extraHeaders: { \"HTTP-Referer\": \"https://usetheo.dev\", \"X-Title\": \"theokit\" },\n};\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/**\n * M45 — Perplexity. Its endpoint is UNVERSIONED (`/chat/completions`) — the explicit `chatCompletionsPath`\n * escape expresses it (the sonar-online model family was retired; models per models.dev `perplexity`).\n */\nexport const PERPLEXITY = openAiCompatibleProfile({\n name: \"perplexity\",\n baseUrl: \"https://api.perplexity.ai\",\n chatCompletionsPath: \"/chat/completions\",\n envVars: [\"PERPLEXITY_API_KEY\"],\n fallbackModels: [\"sonar-pro\", \"sonar\"],\n hostname: \"api.perplexity.ai\",\n});\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/** M45 — Together AI (models.dev id `togetherai` — kept as an alias). Values per the 2026-07 snapshot. */\nexport const TOGETHER = openAiCompatibleProfile({\n name: \"together\",\n aliases: [\"togetherai\"],\n baseUrl: \"https://api.together.xyz/v1\",\n envVars: [\"TOGETHER_API_KEY\"],\n fallbackModels: [\"Qwen/Qwen2.5-7B-Instruct-Turbo\"],\n hostname: \"api.together.xyz\",\n});\n","/**\n * GCP Vertex AI profile (Adoption Roadmap #8; ADRs D286-D302).\n *\n * Required peer dep: `google-auth-library` (D288). Resolves access tokens\n * via ADC (env → gcloud → metadata server → WIF).\n *\n * Model IDs follow the convention `vertex/{dialect}/{model}`:\n * - `vertex/google/gemini-2.0-flash-001` → OpenAI-compat endpoint (D291)\n * - `vertex/anthropic/claude-sonnet-4-5@20250929` → :rawPredict (D292)\n *\n * @internal\n */\n\nimport type { ProviderProfile } from \"../types.js\";\n\nexport const VERTEX: ProviderProfile = {\n name: \"vertex\",\n apiMode: \"anthropic_messages\", // sub-dispatched in selectTransport by profile.name\n envVars: [\"GOOGLE_APPLICATION_CREDENTIALS\"],\n authType: \"gcp_oauth\",\n baseUrl: \"https://us-central1-aiplatform.googleapis.com\",\n modelsUrl: undefined,\n hostname: \"aiplatform.googleapis.com\",\n fallbackModels: [\n \"vertex/anthropic/claude-sonnet-4-5@20250929\",\n \"vertex/google/gemini-2.0-flash-001\",\n ],\n};\n\n/**\n * D293 absorbed: when location === \"global\", use `aiplatform.googleapis.com`\n * (no `global-` prefix) — known bug `streamRawPredict` 404 at\n * `global-aiplatform.googleapis.com` (a peer#10287).\n */\nexport function resolveVertexBaseUrl(opts: {\n projectId: string;\n location: string;\n modelDialect: \"anthropic\" | \"gemini\";\n}): string {\n const host =\n opts.location === \"global\"\n ? \"aiplatform.googleapis.com\"\n : `${opts.location}-aiplatform.googleapis.com`;\n if (opts.modelDialect === \"gemini\") {\n // OpenAI-compat endpoint (D291) — the client appends `/chat/completions`.\n return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/endpoints/openapi`;\n }\n // Anthropic — base URL up to `/publishers/anthropic` (model id appended by client).\n return `https://${host}/v1/projects/${opts.projectId}/locations/${opts.location}/publishers/anthropic`;\n}\n\n/** Detect dialect from a `vertex/{dialect}/{model}` id. Default: gemini. */\nexport function inferModelDialect(modelId: string): \"anthropic\" | \"gemini\" {\n if (modelId.includes(\"/anthropic/\")) return \"anthropic\";\n if (modelId.includes(\"/google/\")) return \"gemini\";\n return \"gemini\";\n}\n\n/** Strip the `vertex/{dialect}/` prefix so the raw model id is used in the URL. */\nexport function stripVertexPrefix(modelId: string): string {\n return modelId.replace(/^vertex\\/(anthropic|google)\\//, \"\");\n}\n","import { openAiCompatibleProfile } from \"./openai-compatible.js\";\n\n/** M45 — xAI (Grok). Values per models.dev `xai` (2026-07 snapshot; grok-2 retired). */\nexport const XAI = openAiCompatibleProfile({\n name: \"xai\",\n aliases: [\"grok\"],\n baseUrl: \"https://api.x.ai/v1\",\n envVars: [\"XAI_API_KEY\"],\n fallbackModels: [\"grok-4.5\", \"grok-4.3\"],\n hostname: \"api.x.ai\",\n});\n","/**\n * Eager registration of builtin providers (T3.3). Side-effect import:\n * importing this module registers the 4 builtins with the registry.\n *\n * Lazy user-plugin discovery is handled by `discovery.ts` (T3.4).\n *\n * @internal\n */\n\nimport { globalSingleton } from \"../../global-singleton.js\";\nimport { registerCatalogProviders } from \"../catalog-loader.js\";\nimport { registerProvider } from \"../registry.js\";\nimport { ANTHROPIC } from \"./anthropic.js\";\nimport { BEDROCK } from \"./bedrock.js\";\nimport { CEREBRAS } from \"./cerebras.js\";\nimport { COHERE } from \"./cohere.js\";\nimport { DEEPINFRA } from \"./deepinfra.js\";\nimport { GEMINI } from \"./gemini.js\";\nimport { GOOGLE } from \"./google.js\";\nimport { GROQ } from \"./groq.js\";\nimport { LLAMACPP } from \"./llamacpp.js\";\nimport { LMSTUDIO } from \"./lmstudio.js\";\nimport { MISTRAL } from \"./mistral.js\";\nimport { OLLAMA } from \"./ollama.js\";\nimport { OPENAI } from \"./openai.js\";\nimport { OPENAI_CHATGPT } from \"./openai-chatgpt.js\";\nimport { OPENROUTER } from \"./openrouter.js\";\nimport { PERPLEXITY } from \"./perplexity.js\";\nimport { TOGETHER } from \"./together.js\";\nimport { VERTEX } from \"./vertex.js\";\nimport { XAI } from \"./xai.js\";\n\n// M45 review M2 — the guard lives on globalThis like the registry itself (M44 B1): a process importing both\n// bundle copies (`@theokit/sdk` + `@theokit/sdk/models`) must not re-register 19 builtins with bogus\n// \"overridden by user plugin\" WARNs.\nconst _registeredState = globalSingleton(\"theokit-sdk.providers.builtins-registered\", () => ({\n done: false,\n}));\n\nexport function registerBuiltins(): void {\n if (_registeredState.done) return;\n _registeredState.done = true;\n // First-party builtins (take priority — registered first)\n registerProvider(ANTHROPIC);\n registerProvider(OPENAI);\n registerProvider(OPENAI_CHATGPT);\n registerProvider(OPENROUTER);\n registerProvider(GEMINI);\n registerProvider(OLLAMA);\n registerProvider(LMSTUDIO);\n registerProvider(LLAMACPP);\n registerProvider(BEDROCK);\n registerProvider(VERTEX);\n // M45 — the data-provider fleet (one file each on the openai-compatible base).\n registerProvider(GOOGLE);\n registerProvider(MISTRAL);\n registerProvider(GROQ);\n registerProvider(COHERE);\n registerProvider(DEEPINFRA);\n registerProvider(TOGETHER);\n registerProvider(XAI);\n registerProvider(PERPLEXITY);\n registerProvider(CEREBRAS);\n // Dynamic catalog — 40+ providers from JSON (T10.1, ADR D447)\n registerCatalogProviders();\n}\n\n/** Test-only reset. @internal */\nexport function _resetBuiltinsRegistered(): void {\n _registeredState.done = false;\n}\n\nexport {\n ANTHROPIC,\n BEDROCK,\n GEMINI,\n LLAMACPP,\n LMSTUDIO,\n OLLAMA,\n OPENAI,\n OPENAI_CHATGPT,\n OPENROUTER,\n VERTEX,\n};\n"]}
@@ -0,0 +1,19 @@
1
+ // src/internal/persistence/cwd-mutex.ts
2
+ var tails = /* @__PURE__ */ new Map();
3
+ function withCwdMutex(key, fn) {
4
+ const prev = tails.get(key) ?? Promise.resolve();
5
+ const next = prev.then(fn, fn);
6
+ const tail = next.then(
7
+ () => void 0,
8
+ () => void 0
9
+ );
10
+ tails.set(key, tail);
11
+ void tail.then(() => {
12
+ if (tails.get(key) === tail) tails.delete(key);
13
+ });
14
+ return next;
15
+ }
16
+
17
+ export { withCwdMutex };
18
+ //# sourceMappingURL=chunk-PPU2D4FZ.js.map
19
+ //# sourceMappingURL=chunk-PPU2D4FZ.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/internal/persistence/cwd-mutex.ts"],"names":[],"mappings":";AAGA,IAAM,KAAA,uBAAY,GAAA,EAA8B;AAoCzC,SAAS,YAAA,CAAgB,KAAa,EAAA,EAAkC;AAC7E,EAAA,MAAM,OAAO,KAAA,CAAM,GAAA,CAAI,GAAG,CAAA,IAAK,QAAQ,OAAA,EAAQ;AAC/C,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,IAAA,CAAK,EAAA,EAAI,EAAE,CAAA;AAI7B,EAAA,MAAM,OAAyB,IAAA,CAAK,IAAA;AAAA,IAClC,MAAM,MAAA;AAAA,IACN,MAAM;AAAA,GACR;AACA,EAAA,KAAA,CAAM,GAAA,CAAI,KAAK,IAAI,CAAA;AACnB,EAAA,KAAK,IAAA,CAAK,KAAK,MAAM;AACnB,IAAA,IAAI,MAAM,GAAA,CAAI,GAAG,MAAM,IAAA,EAAM,KAAA,CAAM,OAAO,GAAG,CAAA;AAAA,EAC/C,CAAC,CAAA;AACD,EAAA,OAAO,IAAA;AACT","file":"chunk-PPU2D4FZ.js","sourcesContent":["// Tail of the queue per key. Module-scoped on purpose — see `withCwdMutex` below, which is where\n// the contract is documented. An entry is removed once its key has no call pending, so the Map\n// holds only keys with work in flight, however many distinct keys were ever used.\nconst tails = new Map<string, Promise<unknown>>();\n\n/**\n * Run `fn` after every earlier `withCwdMutex` call for the same `key` has settled, and return\n * what `fn` returns.\n *\n * Calls with the same key run strictly in the order they were made — FIFO, never concurrent.\n * Calls with different keys never wait on each other. The key is an opaque string: two callers\n * serialize against each other exactly when they pass equal keys, so a shared key IS the\n * contract, and a mismatched one silently buys no protection at all.\n *\n * A rejection does not poison the queue. The next waiter runs whether the previous `fn` fulfilled\n * or rejected, and the rejection is delivered only to the caller whose `fn` threw. This function\n * neither retries nor swallows: the returned promise rejects with whatever `fn` rejected with.\n *\n * There is no timeout and no cancellation. An `fn` that never settles blocks that key for the\n * lifetime of the process.\n *\n * **Scope — this is an in-process lock only.** State is a module-scoped Map, so it serializes\n * callers that share one module instance and nothing else. Two processes, two worker threads, or\n * two copies of the SDK resolved into the same tree do not see each other's queue. When the\n * resource is a file that other processes can also write, use `withFileLock` from\n * `./file-lock.ts` instead — it takes an OS-level lock and layers this mutex underneath, so it\n * gives both guarantees. Reach for `withCwdMutex` directly when the shared state is in memory, or\n * when the file is one only this process touches.\n *\n * Extracted packages (`@theokit/sdk-budget`, `@theokit/sdk-memory`) import this from\n * `@theokit/sdk` rather than reimplementing it, precisely so the Map is the same one: a per-package\n * copy would give each package its own queue and let their writes race.\n *\n * The Map is module-scoped, so nothing survives a process restart or a fresh module instance.\n * An entry is dropped as soon as its key has no call pending.\n * Signature and semantics will not change before sdk-core v3.0.\n *\n * @public\n */\nexport function withCwdMutex<T>(key: string, fn: () => Promise<T>): Promise<T> {\n const prev = tails.get(key) ?? Promise.resolve();\n const next = prev.then(fn, fn); // run fn whether prev fulfilled or rejected\n // Save the new tail. It swallows the result so a failure here doesn't poison subsequent\n // waiters, and it removes the key once it is still the newest tail (no call is queued behind\n // it), so the Map holds entries only for keys with a call pending.\n const tail: Promise<unknown> = next.then(\n () => undefined,\n () => undefined,\n );\n tails.set(key, tail);\n void tail.then(() => {\n if (tails.get(key) === tail) tails.delete(key);\n });\n return next;\n}\n\n/** Number of keys with a call pending. Test-only observation of the queue map. */\nexport function pendingCwdMutexKeyCount(): number {\n return tails.size;\n}\n"]}