cartethyia 2.6.7 → 2.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (335) hide show
  1. package/.env.example +1 -7
  2. package/README.md +25 -2
  3. package/dist/dashboard/assets/{BannedPage-Dskhyp0l.js → BannedPage-D-J75hBM.js} +1 -1
  4. package/dist/dashboard/assets/BannedPage-D-J75hBM.js.gz +0 -0
  5. package/dist/dashboard/assets/{CliToolDetailPage--SJhk7qQ.js → CliToolDetailPage-CVe6RaBH.js} +1 -1
  6. package/dist/dashboard/assets/CliToolDetailPage-CVe6RaBH.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-C203VT-c.js → CliToolsPage-Dd8ZSamp.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-Dd8ZSamp.js.gz +0 -0
  9. package/dist/dashboard/assets/{CombosPage-BcS7kGG1.js → CombosPage-QoJ6foxo.js} +1 -1
  10. package/dist/dashboard/assets/CombosPage-QoJ6foxo.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-DpNRay4C.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-DpNRay4C.js.gz +0 -0
  13. package/dist/dashboard/assets/{CustomizationPage-uujbBYwC.js → CustomizationPage-CKUFTcW4.js} +1 -1
  14. package/dist/dashboard/assets/CustomizationPage-CKUFTcW4.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-CzSLiDzr.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-CzSLiDzr.js.gz +0 -0
  17. package/dist/dashboard/assets/LoginPage-DubdQcvX.js +1 -0
  18. package/dist/dashboard/assets/LoginPage-DubdQcvX.js.gz +0 -0
  19. package/dist/dashboard/assets/{ModelPicker-CA1kLs45.js → ModelPicker-BH8Tehdi.js} +1 -1
  20. package/dist/dashboard/assets/ModelPicker-BH8Tehdi.js.gz +0 -0
  21. package/dist/dashboard/assets/OverviewPage-DuWzAQFL.js +1 -0
  22. package/dist/dashboard/assets/OverviewPage-DuWzAQFL.js.gz +0 -0
  23. package/dist/dashboard/assets/ProviderDetailPage-BKEKe2Fm.js +4 -0
  24. package/dist/dashboard/assets/ProviderDetailPage-BKEKe2Fm.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +1 -0
  26. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  27. package/dist/dashboard/assets/ProvidersPage-Bwotu8UJ.js +1 -0
  28. package/dist/dashboard/assets/ProvidersPage-Bwotu8UJ.js.gz +0 -0
  29. package/dist/dashboard/assets/ProxyPage-D7hpWbg9.js +9 -0
  30. package/dist/dashboard/assets/ProxyPage-D7hpWbg9.js.gz +0 -0
  31. package/dist/dashboard/assets/{QuotaPage-BueSWX5D.js → QuotaPage-ATpaxrbl.js} +1 -1
  32. package/dist/dashboard/assets/QuotaPage-ATpaxrbl.js.gz +0 -0
  33. package/dist/dashboard/assets/SettingsPage-CETophpx.js +1 -0
  34. package/dist/dashboard/assets/SettingsPage-CETophpx.js.gz +0 -0
  35. package/dist/dashboard/assets/SetupPage-BdgECjqq.js +1 -0
  36. package/dist/dashboard/assets/SetupPage-BdgECjqq.js.gz +0 -0
  37. package/dist/dashboard/assets/{SortableList-DrKeMcGN.js → SortableList-CAK-EN9z.js} +1 -1
  38. package/dist/dashboard/assets/SortableList-CAK-EN9z.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-qjuYtccc.js → StudioPage-B7W2_RhT.js} +3 -3
  40. package/dist/dashboard/assets/StudioPage-B7W2_RhT.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-6T4EFDjW.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-6T4EFDjW.js.gz +0 -0
  43. package/dist/dashboard/assets/{api-keys-C23S9sgp.js → api-keys-CUi6UXsR.js} +1 -1
  44. package/dist/dashboard/assets/api-keys-CUi6UXsR.js.gz +0 -0
  45. package/dist/dashboard/assets/app-KvsUJUMF.css +2 -0
  46. package/dist/dashboard/assets/app-KvsUJUMF.css.gz +0 -0
  47. package/dist/dashboard/assets/{assert-DU6qrMA_.js → assert-67xXH5rf.js} +1 -1
  48. package/dist/dashboard/assets/assert-67xXH5rf.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-Bkz_-RrM.js → badge-DC2L43Mj.js} +1 -1
  50. package/dist/dashboard/assets/badge-DC2L43Mj.js.gz +0 -0
  51. package/dist/dashboard/assets/{banner-C-7y3VKV.js → banner-BBVcb0J3.js} +1 -1
  52. package/dist/dashboard/assets/banner-BBVcb0J3.js.gz +0 -0
  53. package/dist/dashboard/assets/{card-BOPBuBzD.js → card-Cca1XC6G.js} +1 -1
  54. package/dist/dashboard/assets/card-Cca1XC6G.js.gz +0 -0
  55. package/dist/dashboard/assets/{cli-tools-BaFUuFFF.js → cli-tools-KvsWa1Jl.js} +1 -1
  56. package/dist/dashboard/assets/cli-tools-KvsWa1Jl.js.gz +0 -0
  57. package/dist/dashboard/assets/{clipboard-button-e-Mlk0FH.js → clipboard-button-DUzEbynq.js} +1 -1
  58. package/dist/dashboard/assets/clipboard-button-DUzEbynq.js.gz +0 -0
  59. package/dist/dashboard/assets/{dialog-Iec_ywbD.js → dialog-DFvWhwTa.js} +1 -1
  60. package/dist/dashboard/assets/dialog-DFvWhwTa.js.gz +0 -0
  61. package/dist/dashboard/assets/{drawer-Bs8MIIHc.js → drawer-CFM2sMX1.js} +1 -1
  62. package/dist/dashboard/assets/drawer-CFM2sMX1.js.gz +0 -0
  63. package/dist/dashboard/assets/{entry-DOddwoc0.js → entry-BLBLxX0h.js} +3 -3
  64. package/dist/dashboard/assets/entry-BLBLxX0h.js.gz +0 -0
  65. package/dist/dashboard/assets/{entry-DcobaKFu.js → entry-Bqy8RFvM.js} +1 -1
  66. package/dist/dashboard/assets/entry-Bqy8RFvM.js.gz +0 -0
  67. package/dist/dashboard/assets/{entry-BRszm4_Z.js → entry-_xHo5x6r.js} +1 -1
  68. package/dist/dashboard/assets/entry-_xHo5x6r.js.gz +0 -0
  69. package/dist/dashboard/assets/formatters-mpBPqAQ8.js +1 -0
  70. package/dist/dashboard/assets/formatters-mpBPqAQ8.js.gz +0 -0
  71. package/dist/dashboard/assets/{github-badge-BuDsrsPn.js → github-badge-C9e8Ts7e.js} +1 -1
  72. package/dist/dashboard/assets/github-badge-C9e8Ts7e.js.gz +0 -0
  73. package/dist/dashboard/assets/{index-BeLRhsmt.js → index-D6QzEC_n.js} +2 -2
  74. package/dist/dashboard/assets/index-D6QzEC_n.js.gz +0 -0
  75. package/dist/dashboard/assets/{inline-DToMICwl.js → inline-BFUcvllj.js} +1 -1
  76. package/dist/dashboard/assets/inline-BFUcvllj.js.gz +0 -0
  77. package/dist/dashboard/assets/{input-WlyHWeG2.js → input-C_ILAvBb.js} +1 -1
  78. package/dist/dashboard/assets/input-C_ILAvBb.js.gz +0 -0
  79. package/dist/dashboard/assets/{layout-DaJ5baJr.js → layout-CBIyT6Rt.js} +1 -1
  80. package/dist/dashboard/assets/layout-CBIyT6Rt.js.gz +0 -0
  81. package/dist/dashboard/assets/{list-row-B3oSK13z.js → list-row-ebJ_-Nsb.js} +1 -1
  82. package/dist/dashboard/assets/list-row-ebJ_-Nsb.js.gz +0 -0
  83. package/dist/dashboard/assets/{live-ta6GMb-8.js → live-D0mm--ME.js} +1 -1
  84. package/dist/dashboard/assets/live-D0mm--ME.js.gz +0 -0
  85. package/dist/dashboard/assets/minimize-2-D-MN8W8a.js +1 -0
  86. package/dist/dashboard/assets/minimize-2-D-MN8W8a.js.gz +0 -0
  87. package/dist/dashboard/assets/{mutation-g_fduiNw.js → mutation-sMD965oO.js} +1 -1
  88. package/dist/dashboard/assets/mutation-sMD965oO.js.gz +0 -0
  89. package/dist/dashboard/assets/{numbers-Dulqgys5.js → numbers-BO9dKaFr.js} +1 -1
  90. package/dist/dashboard/assets/numbers-BO9dKaFr.js.gz +0 -0
  91. package/dist/dashboard/assets/providers/inception.svg +5 -0
  92. package/dist/dashboard/assets/providers/inception.svg.gz +0 -0
  93. package/dist/dashboard/assets/{query-keys-UETqfytp.js → query-keys-CfL_Zdoh.js} +1 -1
  94. package/dist/dashboard/assets/query-keys-CfL_Zdoh.js.gz +0 -0
  95. package/dist/dashboard/assets/{routing-BPUo-W8d.js → routing-BnIpi1IJ.js} +1 -1
  96. package/dist/dashboard/assets/routing-BnIpi1IJ.js.gz +0 -0
  97. package/dist/dashboard/assets/{select-BfZ3SCTM.js → select-Cj5Nw43g.js} +1 -1
  98. package/dist/dashboard/assets/select-Cj5Nw43g.js.gz +0 -0
  99. package/dist/dashboard/assets/settings-BAFhDgX8.js +1 -0
  100. package/dist/dashboard/assets/settings-BAFhDgX8.js.gz +0 -0
  101. package/dist/dashboard/assets/{stack-B1w5BM0u.js → stack-EMrOMt4I.js} +1 -1
  102. package/dist/dashboard/assets/stack-EMrOMt4I.js.gz +0 -0
  103. package/dist/dashboard/assets/{state-DhZBfWgx.js → state-CWoo7ty5.js} +1 -1
  104. package/dist/dashboard/assets/state-CWoo7ty5.js.gz +0 -0
  105. package/dist/dashboard/assets/{switch-yD7D99Lg.js → switch-CCjT6IkF.js} +1 -1
  106. package/dist/dashboard/assets/switch-CCjT6IkF.js.gz +0 -0
  107. package/dist/dashboard/assets/{useMutation-EDFRkn1i.js → useMutation-DjkLHUcE.js} +1 -1
  108. package/dist/dashboard/assets/useMutation-DjkLHUcE.js.gz +0 -0
  109. package/dist/dashboard/index.html +1 -1
  110. package/dist/dashboard/index.html.gz +0 -0
  111. package/dist/dashboard/precompressed-assets.json +55 -54
  112. package/migrations/full-postgres/0024_add_pool_provider_cooldowns.sql +12 -0
  113. package/migrations/full-postgres/0025_add_pool_random_strategy.sql +3 -0
  114. package/migrations/lite-sqlite3/0024_add_pool_provider_cooldowns.sql +12 -0
  115. package/migrations/lite-sqlite3/0025_add_pool_random_strategy.sql +20 -0
  116. package/package.json +1 -1
  117. package/scripts/cli/console-menu.ts +5 -2
  118. package/scripts/cli/tray.ts +21 -6
  119. package/src/boot/app.ts +24 -62
  120. package/src/boot/dependencies.ts +732 -750
  121. package/src/config/cooldowns.ts +16 -0
  122. package/src/config/providers.ts +13 -1
  123. package/src/config/resources.ts +13 -80
  124. package/src/config/security.ts +2 -38
  125. package/src/config/spec.ts +16 -23
  126. package/src/console/console-router.ts +7 -7
  127. package/src/console/domain-registration.ts +19 -12
  128. package/src/console/providers/catalog/catalog-projections.ts +2 -6
  129. package/src/console/providers/catalog/contracts.ts +19 -0
  130. package/src/console/providers/catalog/provider-operations.ts +38 -0
  131. package/src/console/providers/catalog/routes.ts +14 -0
  132. package/src/console/providers/catalog/store-helpers.ts +326 -0
  133. package/src/console/providers/catalog/store.ts +1292 -1563
  134. package/src/console/quota/account-quota-global.ts +2 -2
  135. package/src/console/quota/account-quota-shared.ts +1 -1
  136. package/src/console/quota/account-quota-tenant.ts +35 -12
  137. package/src/console/quota/quota-view.ts +2 -2
  138. package/src/console/remote-support/contracts.ts +3 -1
  139. package/src/console/remote-support/service.ts +115 -6
  140. package/src/console/routing/pools/contracts.ts +41 -1
  141. package/src/console/routing/pools/operations.ts +183 -4
  142. package/src/console/routing/pools/relay-deploy.ts +17 -4
  143. package/src/console/routing/pools/routes.ts +30 -0
  144. package/src/console/routing/pools/store.ts +98 -8
  145. package/src/main.ts +16 -2
  146. package/src/network/outbound-fetch.ts +226 -365
  147. package/src/network/pool/agent.ts +8 -0
  148. package/src/network/pool/pool-state.ts +7 -0
  149. package/src/network/pool/selector.ts +110 -2
  150. package/src/network/pool-cooldown-store.ts +252 -0
  151. package/src/network/pool-health-machine.ts +5 -3
  152. package/src/network/pool-health.ts +36 -9
  153. package/src/observability/event-query.ts +57 -0
  154. package/src/observability/metrics.ts +15 -5
  155. package/src/observability/runtime-metrics.ts +30 -15
  156. package/src/persistence/health-event-flush.ts +2 -0
  157. package/src/persistence/schema.ts +19 -0
  158. package/src/persistence/usage-flush.ts +8 -3
  159. package/src/protocol/canonical-model.ts +1 -1
  160. package/src/protocol/dsml.ts +377 -0
  161. package/src/protocol/gateway-error.ts +0 -1
  162. package/src/{providers/provider-reasoning.ts → protocol/reasoning.ts} +10 -9
  163. package/src/protocol/request/chat.ts +7 -7
  164. package/src/protocol/request/codex.ts +2 -2
  165. package/src/protocol/request/gemini.ts +1 -1
  166. package/src/protocol/request/messages.ts +6 -6
  167. package/src/protocol/request/responses.ts +7 -7
  168. package/src/protocol/response/dsml.ts +12 -133
  169. package/src/{transport → protocol}/translation/attachment-integrity.ts +2 -2
  170. package/src/{transport → protocol}/translation/cache-controls.ts +1 -1
  171. package/src/{transport → protocol}/translation/capabilities.ts +2 -2
  172. package/src/{transport → protocol}/translation/normalize.ts +1 -1
  173. package/src/{transport → protocol}/translation/quirks.ts +1 -1
  174. package/src/{transport → protocol}/translation/search.ts +1 -1
  175. package/src/{transport → protocol}/translation/thinking.ts +23 -1
  176. package/src/{transport → protocol}/translation/tool-id.ts +1 -1
  177. package/src/{transport → protocol}/translation/tool-repair.ts +2 -2
  178. package/src/protocol/upstream-parsing.ts +176 -0
  179. package/src/providers/adapters/compatible-adapter.ts +11 -2
  180. package/src/providers/authentication/oauth-refresh-service.ts +9 -5
  181. package/src/providers/default-registry.ts +21 -5
  182. package/src/providers/discovery/probe-phases.ts +16 -3
  183. package/src/providers/discovery/probing-service.ts +4 -1
  184. package/src/providers/integrations/anthropic.ts +1 -1
  185. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -4
  186. package/src/providers/integrations/buddy/buddy-chat-shared.ts +141 -8
  187. package/src/providers/integrations/buddy/buddy-checkin.ts +5 -1
  188. package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -82
  189. package/src/providers/integrations/buddy/buddy-identity.ts +25 -0
  190. package/src/providers/integrations/buddy/buddy-server-tools.ts +240 -0
  191. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +36 -0
  192. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +6 -31
  193. package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -0
  194. package/src/providers/integrations/buddy/codebuddy/shared.ts +19 -4
  195. package/src/providers/integrations/buddy/turing-device-token.ts +262 -0
  196. package/src/providers/integrations/buddy/workbuddy/provider.ts +2 -0
  197. package/src/providers/integrations/buddy/workbuddy/shared.ts +56 -3
  198. package/src/providers/integrations/claude/claude.ts +1 -1
  199. package/src/providers/integrations/cloudflareai/cloudflareai.ts +1 -1
  200. package/src/providers/integrations/codex/codex-errors.ts +1 -1
  201. package/src/providers/integrations/codex/codex.ts +1 -1
  202. package/src/providers/integrations/commandcode/commandcode.ts +134 -104
  203. package/src/providers/integrations/commandcode/discovery.ts +6 -5
  204. package/src/providers/integrations/factory/factory.ts +1 -1
  205. package/src/providers/integrations/github/github.ts +1 -1
  206. package/src/providers/integrations/grok/grok.ts +1 -1
  207. package/src/providers/integrations/inception/provider.ts +91 -0
  208. package/src/providers/integrations/inferhub.ts +1 -1
  209. package/src/providers/integrations/kiro/kiro-request.ts +1 -1
  210. package/src/providers/integrations/mistral.ts +193 -19
  211. package/src/providers/integrations/opencode/fingerprint.ts +19 -2
  212. package/src/providers/integrations/opencode/prompt.ts +111 -0
  213. package/src/providers/integrations/opencode/provider.ts +101 -23
  214. package/src/providers/integrations/opencode/tool-definitions.ts +4 -4
  215. package/src/providers/integrations/qoder/qoder-checkin.ts +303 -0
  216. package/src/providers/integrations/qoder/qoder.ts +1641 -884
  217. package/src/providers/integrations/shared/install-id.ts +2 -1
  218. package/src/providers/integrations/trae/trae-cache.ts +110 -0
  219. package/src/providers/integrations/trae/trae-oauth.ts +29 -4
  220. package/src/providers/integrations/trae/trae-protocol.ts +2 -1
  221. package/src/providers/integrations/trae/trae.ts +106 -23
  222. package/src/providers/operations/account-error-classification.ts +1660 -0
  223. package/src/providers/operations/account-health-service.ts +621 -2097
  224. package/src/providers/operations/account-reset-service.ts +2 -0
  225. package/src/providers/provider-contracts.ts +0 -2
  226. package/src/providers/provider-metadata.ts +25 -4
  227. package/src/providers/provider-probe.ts +2 -2
  228. package/src/{console → providers}/quota/cache.ts +1 -1
  229. package/src/{console → providers}/quota/refresh.ts +5 -5
  230. package/src/security/abuse.ts +17 -0
  231. package/src/transport/dispatch/attempt-finalize.ts +114 -12
  232. package/src/transport/dispatch/attempt-loop.ts +3 -0
  233. package/src/transport/dispatch/empty-stream.ts +224 -217
  234. package/src/transport/dispatch/generation.ts +37 -55
  235. package/src/transport/dispatch/handler-deps.ts +32 -0
  236. package/src/transport/dispatch/leases.ts +9 -4
  237. package/src/transport/dispatch/proxy-request.ts +6 -30
  238. package/src/transport/dispatch/responses-compact.ts +22 -43
  239. package/src/transport/dispatch/streaming/finalize.ts +3 -0
  240. package/src/transport/dispatch/streaming/stream.ts +0 -8
  241. package/src/transport/dispatch/systemone.ts +22 -42
  242. package/src/transport/dispatch/token-count.ts +23 -39
  243. package/src/transport/dispatch/upstream.ts +1 -3
  244. package/src/transport/dispatch/websearch.ts +22 -41
  245. package/src/transport/failure-policy.ts +59 -178
  246. package/src/transport/guards/abuse-guard.ts +10 -0
  247. package/src/transport/guards/auth-guard.ts +0 -18
  248. package/src/transport/guards/error-lifecycle.ts +1 -1
  249. package/src/transport/guards/pipeline.ts +0 -6
  250. package/src/transport/guards/request-context.ts +18 -91
  251. package/src/transport/request/degradation.ts +20 -1
  252. package/src/transport/request/inflight.ts +4 -95
  253. package/src/transport/request/preparer.ts +6 -6
  254. package/src/transport/request/state.ts +66 -38
  255. package/src/transport/request/tenant-preferences.ts +1 -1
  256. package/src/transport/routing/route-catalog.ts +41 -31
  257. package/src/transport/routing/router.ts +2 -2
  258. package/src/transport/surface/messages/parse.ts +1 -1
  259. package/src/workers/buddy-growth-tasks.ts +346 -425
  260. package/src/workers/daily-checkin.ts +17 -6
  261. package/src/workers/quota-refresh-sweep.ts +2 -2
  262. package/src/workers/scheduler.ts +17 -1
  263. package/dist/dashboard/assets/BannedPage-Dskhyp0l.js.gz +0 -0
  264. package/dist/dashboard/assets/CliToolDetailPage--SJhk7qQ.js.gz +0 -0
  265. package/dist/dashboard/assets/CliToolsPage-C203VT-c.js.gz +0 -0
  266. package/dist/dashboard/assets/CombosPage-BcS7kGG1.js.gz +0 -0
  267. package/dist/dashboard/assets/ConsoleLogPage-ChmiSLwO.js +0 -1
  268. package/dist/dashboard/assets/ConsoleLogPage-ChmiSLwO.js.gz +0 -0
  269. package/dist/dashboard/assets/CustomizationPage-uujbBYwC.js.gz +0 -0
  270. package/dist/dashboard/assets/HealthEventsModal-fKAWd-OQ.js +0 -1
  271. package/dist/dashboard/assets/HealthEventsModal-fKAWd-OQ.js.gz +0 -0
  272. package/dist/dashboard/assets/LoginPage-DoOUthbG.js +0 -1
  273. package/dist/dashboard/assets/LoginPage-DoOUthbG.js.gz +0 -0
  274. package/dist/dashboard/assets/ModelPicker-CA1kLs45.js.gz +0 -0
  275. package/dist/dashboard/assets/OverviewPage-C5Z-UBz1.js +0 -1
  276. package/dist/dashboard/assets/OverviewPage-C5Z-UBz1.js.gz +0 -0
  277. package/dist/dashboard/assets/ProviderDetailPage-CFu1qGcT.js +0 -3
  278. package/dist/dashboard/assets/ProviderDetailPage-CFu1qGcT.js.gz +0 -0
  279. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +0 -1
  280. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
  281. package/dist/dashboard/assets/ProvidersPage-CnlJZbxF.js +0 -1
  282. package/dist/dashboard/assets/ProvidersPage-CnlJZbxF.js.gz +0 -0
  283. package/dist/dashboard/assets/ProxyPage-B9mBTweh.js +0 -7
  284. package/dist/dashboard/assets/ProxyPage-B9mBTweh.js.gz +0 -0
  285. package/dist/dashboard/assets/QuotaPage-BueSWX5D.js.gz +0 -0
  286. package/dist/dashboard/assets/SettingsPage-B0x00MVY.js +0 -1
  287. package/dist/dashboard/assets/SettingsPage-B0x00MVY.js.gz +0 -0
  288. package/dist/dashboard/assets/SetupPage-DQ9oDRpi.js +0 -1
  289. package/dist/dashboard/assets/SetupPage-DQ9oDRpi.js.gz +0 -0
  290. package/dist/dashboard/assets/SortableList-DrKeMcGN.js.gz +0 -0
  291. package/dist/dashboard/assets/StudioPage-qjuYtccc.js.gz +0 -0
  292. package/dist/dashboard/assets/UsagePage-Be7aNviQ.js +0 -56
  293. package/dist/dashboard/assets/UsagePage-Be7aNviQ.js.gz +0 -0
  294. package/dist/dashboard/assets/api-keys-C23S9sgp.js.gz +0 -0
  295. package/dist/dashboard/assets/app-BUSiYL6F.css +0 -2
  296. package/dist/dashboard/assets/app-BUSiYL6F.css.gz +0 -0
  297. package/dist/dashboard/assets/assert-DU6qrMA_.js.gz +0 -0
  298. package/dist/dashboard/assets/badge-Bkz_-RrM.js.gz +0 -0
  299. package/dist/dashboard/assets/banner-C-7y3VKV.js.gz +0 -0
  300. package/dist/dashboard/assets/card-BOPBuBzD.js.gz +0 -0
  301. package/dist/dashboard/assets/cli-tools-BaFUuFFF.js.gz +0 -0
  302. package/dist/dashboard/assets/clipboard-button-e-Mlk0FH.js.gz +0 -0
  303. package/dist/dashboard/assets/cog-CdWhsajs.js +0 -1
  304. package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
  305. package/dist/dashboard/assets/dialog-Iec_ywbD.js.gz +0 -0
  306. package/dist/dashboard/assets/drawer-Bs8MIIHc.js.gz +0 -0
  307. package/dist/dashboard/assets/entry-BRszm4_Z.js.gz +0 -0
  308. package/dist/dashboard/assets/entry-DOddwoc0.js.gz +0 -0
  309. package/dist/dashboard/assets/entry-DcobaKFu.js.gz +0 -0
  310. package/dist/dashboard/assets/github-badge-BuDsrsPn.js.gz +0 -0
  311. package/dist/dashboard/assets/index-BeLRhsmt.js.gz +0 -0
  312. package/dist/dashboard/assets/inline-DToMICwl.js.gz +0 -0
  313. package/dist/dashboard/assets/input-WlyHWeG2.js.gz +0 -0
  314. package/dist/dashboard/assets/layout-DaJ5baJr.js.gz +0 -0
  315. package/dist/dashboard/assets/list-row-B3oSK13z.js.gz +0 -0
  316. package/dist/dashboard/assets/live-ta6GMb-8.js.gz +0 -0
  317. package/dist/dashboard/assets/model-bans-BmYTmbAk.js +0 -1
  318. package/dist/dashboard/assets/model-bans-BmYTmbAk.js.gz +0 -0
  319. package/dist/dashboard/assets/mutation-g_fduiNw.js.gz +0 -0
  320. package/dist/dashboard/assets/numbers-Dulqgys5.js.gz +0 -0
  321. package/dist/dashboard/assets/query-keys-UETqfytp.js.gz +0 -0
  322. package/dist/dashboard/assets/routing-BPUo-W8d.js.gz +0 -0
  323. package/dist/dashboard/assets/select-BfZ3SCTM.js.gz +0 -0
  324. package/dist/dashboard/assets/settings--3hxSyry.js +0 -1
  325. package/dist/dashboard/assets/settings--3hxSyry.js.gz +0 -0
  326. package/dist/dashboard/assets/stack-B1w5BM0u.js.gz +0 -0
  327. package/dist/dashboard/assets/state-DhZBfWgx.js.gz +0 -0
  328. package/dist/dashboard/assets/switch-yD7D99Lg.js.gz +0 -0
  329. package/dist/dashboard/assets/useMutation-EDFRkn1i.js.gz +0 -0
  330. package/src/console/admin/model-abuse/contracts.ts +0 -38
  331. package/src/console/admin/model-abuse/routes.ts +0 -97
  332. package/src/security/model-abuse.ts +0 -704
  333. package/src/transport/guards/concurrency-guard.ts +0 -125
  334. /package/dist/dashboard/assets/{app-MdVfwraB.js → app-BaWd0puM.js} +0 -0
  335. /package/dist/dashboard/assets/{app-MdVfwraB.js.gz → app-BaWd0puM.js.gz} +0 -0
@@ -3,12 +3,7 @@ import type { ProviderDispatchContext, ProviderId, ProviderAdapter } from "../..
3
3
  import { GatewayError } from "../../protocol/gateway-error";
4
4
  import type { CanonicalEvent } from "../../protocol/canonical-model";
5
5
  import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
6
- import type { OAuthTokenRefresher } from "../../providers/authentication/oauth-refresh-service";
7
- import type { OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
8
- import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
9
6
  import type { ByokUpstreamHost } from "../../providers/operations/provider-catalog-service";
10
- import type { CartethyiaDatabase } from "../../persistence/db-handle";
11
- import type { RouteSnapshotService } from "../routing/route-model";
12
7
  import { chatAdapter } from "../surface/chat/adapter";
13
8
  import { responsesAdapter } from "../surface/responses/adapter";
14
9
  import { messagesAdapter } from "../surface/messages/adapter";
@@ -21,10 +16,6 @@ import {
21
16
  resolveTenantImageClampMaxBytes,
22
17
  } from "../request/tenant-preferences";
23
18
  import { metrics } from "../../observability/metrics";
24
- import type { NetworkPoolSelector } from "../../network/pool/selector";
25
- import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
26
- import { ProxyRequestStateStore } from "../request/state";
27
- import type { ProxyRequestPreparer } from "../request/preparer";
28
19
  import { repriceUsage } from "../../providers/provider-usage";
29
20
  import {
30
21
  captureProviderExchange,
@@ -40,27 +31,17 @@ import {
40
31
  shouldCaptureProviderBodyForRequest,
41
32
  } from "./capture-policy";
42
33
  import { runAttemptLoop } from "./attempt-loop";
43
- import { projectForRoute, routeCapabilitiesFor } from "../translation/capabilities";
34
+ import { projectForRoute, routeCapabilitiesFor } from "../../protocol/translation/capabilities";
44
35
  import { dispatchStreamingAttempt } from "./streaming/stream";
45
36
  import type { ProviderContinuationScope } from "../../providers/provider-contracts";
46
37
  import type { PreparedProxyRequest } from "../request/preparer";
47
38
 
48
- export interface ProviderProxyHandlerDeps {
49
- readonly db: CartethyiaDatabase;
50
- readonly providerAdapters: ReadonlyMap<string, ProviderAdapter>;
51
- /** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
52
- readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
53
- readonly stateStore: ProxyRequestStateStore;
54
- readonly proxyPreparer?: ProxyRequestPreparer;
55
- readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
39
+ import type { GatewayHandlerDeps } from "./handler-deps";
40
+
41
+ export type ProviderProxyHandlerDeps = GatewayHandlerDeps & {
56
42
  /** Live lookup of a provider's SSRF-validated upstream host. */
57
43
  readonly byokUpstreamHosts?: { readonly get: (providerId: string) => ByokUpstreamHost | undefined };
58
- readonly poolSelector?: NetworkPoolSelector;
59
- readonly snapshotService?: RouteSnapshotService;
60
- readonly telemetryBuffer?: TelemetryBatchBuffer;
61
- readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
62
- readonly oauthRefreshService?: OAuthRefreshService;
63
- }
44
+ };
64
45
 
65
46
  /**
66
47
  * The continuation scope one dispatch carries.
@@ -200,9 +181,7 @@ export async function handleProviderProxyRequest(
200
181
  provider_id: candidate.provider_id as ProviderId,
201
182
  credential_kind: "none" as const,
202
183
  };
203
- const adapter = deps.resolveProviderAdapter
204
- ? await deps.resolveProviderAdapter(candidate.provider_id)
205
- : deps.providerAdapters.get(candidate.provider_id);
184
+ const adapter = await deps.resolveProviderAdapter?.(candidate.provider_id);
206
185
  if (!adapter)
207
186
  throw new GatewayError("admission_unavailable", 503, "provider adapter not registered");
208
187
  if (!isBundledProviderId(candidate.provider_id)) {
@@ -284,9 +263,6 @@ export async function handleProviderProxyRequest(
284
263
  ),
285
264
  }
286
265
  : {}),
287
- ...(deps.networkBindingFactory
288
- ? { outboundWebSocket: deps.networkBindingFactory.webSocket(networkPoolId, prepared.authorization.snapshot.tenant_id) }
289
- : {}),
290
266
  ...(deps.networkBindingFactory
291
267
  ? {
292
268
  outboundHttp2: deps.networkBindingFactory.http2Bidi(
@@ -1,18 +1,9 @@
1
- import type { ProviderAdapter } from "../../providers/provider-contracts";
2
1
  import { GatewayError } from "../../protocol/gateway-error";
3
2
  import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
4
- import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
5
- import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
6
- import type { CartethyiaDatabase } from "../../persistence/db-handle";
7
- import type { RouteSnapshotService } from "../routing/route-model";
8
3
  import { metrics } from "../../observability/metrics";
9
- import type { NetworkPoolSelector } from "../../network/pool/selector";
10
- import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
11
- import { ProxyRequestStateStore } from "../request/state";
12
- import { ProxyRequestPreparer } from "../request/preparer";
13
- import { parseThinkingSuffix } from "../translation/thinking";
4
+ import { parseThinkingSuffix } from "../../protocol/translation/thinking";
14
5
  import type { CodexCompactAdapter } from "../../providers/integrations/codex/codex";
15
- import { completeAttempt, estimatedUsage } from "./attempt-finalize";
6
+ import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
16
7
  import { repriceUsage, usageFromProvider } from "../../providers/provider-usage";
17
8
  import { runAttemptLoop } from "./attempt-loop";
18
9
 
@@ -20,20 +11,9 @@ import { runAttemptLoop } from "./attempt-loop";
20
11
  * The native Codex compaction route (`POST /v1/responses/compact`) and the
21
12
  * dependency surface it needs to drive `runAttemptLoop`.
22
13
  */
23
- export interface ResponsesCompactHandlerDeps {
24
- readonly db: CartethyiaDatabase;
25
- readonly providerAdapters: ReadonlyMap<string, ProviderAdapter>;
26
- /** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
27
- readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
28
- readonly proxyPreparer: ProxyRequestPreparer;
29
- readonly stateStore: ProxyRequestStateStore;
30
- readonly poolSelector?: NetworkPoolSelector;
31
- readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
32
- readonly snapshotService?: RouteSnapshotService;
33
- readonly telemetryBuffer?: TelemetryBatchBuffer;
34
- readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
35
- readonly oauthRefreshService?: OAuthRefreshService;
36
- }
14
+ import type { GatewayHandlerDeps } from "./handler-deps";
15
+
16
+ export type ResponsesCompactHandlerDeps = GatewayHandlerDeps;
37
17
 
38
18
  /**
39
19
  * Handles `POST /v1/responses/compact`: the native Codex compaction proxy. The
@@ -72,9 +52,7 @@ export function createResponsesCompactHandler(deps: ResponsesCompactHandlerDeps)
72
52
  400,
73
53
  "Responses compact does not support streaming",
74
54
  );
75
- const adapter = (deps.resolveProviderAdapter
76
- ? await deps.resolveProviderAdapter("codex")
77
- : deps.providerAdapters.get("codex")) as CodexCompactAdapter | undefined;
55
+ const adapter = (await deps.resolveProviderAdapter?.("codex")) as CodexCompactAdapter | undefined;
78
56
  if (!adapter || typeof adapter.compact !== "function")
79
57
  throw new GatewayError("admission_unavailable", 503, "Codex compact transport unavailable");
80
58
  const prepared = await deps.proxyPreparer.prepareNativeCompact({
@@ -167,22 +145,23 @@ export function createResponsesCompactHandler(deps: ResponsesCompactHandlerDeps)
167
145
  );
168
146
  await completeAttempt(state, {
169
147
  status: "completed",
170
- providerId: candidate.provider_id,
171
- ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
172
- ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
173
- ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
174
- usage,
175
- modelId: candidate.model_id,
176
- lease: leases.lease,
177
- commitUsage: usage,
178
- terminal: true,
179
- tenantId: prepared.authorization.tenantId,
180
- ingressBody: state.ingressBody,
148
+ ...nativeCompletionBase({
149
+ providerId: candidate.provider_id,
150
+ ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
151
+ ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
152
+ ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
153
+ usage,
154
+ modelId: candidate.model_id,
155
+ lease: leases.lease,
156
+ commitUsage: usage,
157
+ tenantId: prepared.authorization.tenantId,
158
+ ingressBody: state.ingressBody,
159
+ providerCapture,
160
+ db: deps.db,
161
+ ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
162
+ ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
163
+ }),
181
164
  responseBody: null,
182
- providerCapture,
183
- db: deps.db,
184
- ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
185
- ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
186
165
  });
187
166
  metrics.proxy_requests_total.inc(1, { status: "completed" });
188
167
  return new Response(response.body, {
@@ -558,6 +558,9 @@ export class StreamFinalizer {
558
558
  // never an upstream-reported error — the upstream path is already
559
559
  // covered by the `GatewayError` branch keeping its own origin.
560
560
  errorOrigin: terminalOutcome.errorOrigin,
561
+ ...(terminalOutcome.httpStatus === undefined
562
+ ? {}
563
+ : { terminalHttpStatus: terminalOutcome.httpStatus }),
561
564
  ...(!cancelled ? { error: streamError } : {}),
562
565
  ...(!cancelled
563
566
  ? {
@@ -220,14 +220,6 @@ export async function dispatchStreamingAttempt(input: StreamingDispatchInput): P
220
220
  ...(candidate.user_agent === undefined ? {} : { userAgent: candidate.user_agent }),
221
221
  ...(wrappedOutboundFetch ? { outboundFetch: wrappedOutboundFetch } : {}),
222
222
  ...(outboundFetch ? { outboundAttachmentFetch: outboundFetch } : {}),
223
- ...(deps.networkBindingFactory
224
- ? {
225
- outboundWebSocket: deps.networkBindingFactory.webSocket(
226
- networkPoolId,
227
- prepared.authorization.snapshot.tenant_id,
228
- ),
229
- }
230
- : {}),
231
223
  ...(deps.networkBindingFactory
232
224
  ? {
233
225
  outboundHttp2: deps.networkBindingFactory.http2Bidi(
@@ -1,17 +1,9 @@
1
1
  import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/provider-contracts";
2
2
  import { GatewayError } from "../../protocol/gateway-error";
3
3
  import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
4
- import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
5
- import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
6
- import type { CartethyiaDatabase } from "../../persistence/db-handle";
7
- import type { RouteSnapshotService } from "../routing/route-model";
8
4
  import { metrics } from "../../observability/metrics";
9
- import type { NetworkPoolSelector } from "../../network/pool/selector";
10
- import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
11
- import { ProxyRequestStateStore } from "../request/state";
12
- import { ProxyRequestPreparer } from "../request/preparer";
13
- import { parseThinkingSuffix } from "../translation/thinking";
14
- import { completeAttempt, estimatedUsage } from "./attempt-finalize";
5
+ import { parseThinkingSuffix } from "../../protocol/translation/thinking";
6
+ import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
15
7
  import { repriceUsage, usageFromProvider } from "../../providers/provider-usage";
16
8
  import { runAttemptLoop } from "./attempt-loop";
17
9
 
@@ -26,20 +18,9 @@ import { runAttemptLoop } from "./attempt-loop";
26
18
  * route. The provider's adapter method (`ProviderAdapter.systemone`) forwards
27
19
  * the body untouched.
28
20
  */
29
- export interface SystemoneHandlerDeps {
30
- readonly db: CartethyiaDatabase;
31
- readonly providerAdapters: ReadonlyMap<string, ProviderAdapter>;
32
- /** Preferred over `providerAdapters`: resolves an adapter on demand and caches it. */
33
- readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
34
- readonly proxyPreparer: ProxyRequestPreparer;
35
- readonly stateStore: ProxyRequestStateStore;
36
- readonly poolSelector?: NetworkPoolSelector;
37
- readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
38
- readonly snapshotService?: RouteSnapshotService;
39
- readonly telemetryBuffer?: TelemetryBatchBuffer;
40
- readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
41
- readonly oauthRefreshService?: OAuthRefreshService;
42
- }
21
+ import type { GatewayHandlerDeps } from "./handler-deps";
22
+
23
+ export type SystemoneHandlerDeps = GatewayHandlerDeps;
43
24
 
44
25
  /** Adapter that can serve a System One decision request. */
45
26
  type SystemoneAdapter = ProviderAdapter & {
@@ -117,9 +98,7 @@ export function createSystemoneHandler(deps: SystemoneHandlerDeps) {
117
98
  provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
118
99
  credential_kind: "none" as const,
119
100
  };
120
- const adapter = (deps.resolveProviderAdapter
121
- ? await deps.resolveProviderAdapter(candidate.provider_id)
122
- : deps.providerAdapters.get(candidate.provider_id)) as SystemoneAdapter | undefined;
101
+ const adapter = (await deps.resolveProviderAdapter?.(candidate.provider_id)) as SystemoneAdapter | undefined;
123
102
  if (!adapter || typeof adapter.systemone !== "function")
124
103
  throw new GatewayError(
125
104
  "capability_unsupported",
@@ -194,22 +173,23 @@ export function createSystemoneHandler(deps: SystemoneHandlerDeps) {
194
173
  );
195
174
  await completeAttempt(state, {
196
175
  status: "completed",
197
- providerId: candidate.provider_id,
198
- ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
199
- ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
200
- ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
201
- usage,
202
- modelId: candidate.model_id,
203
- lease: leases.lease,
204
- commitUsage: usage,
205
- terminal: true,
206
- tenantId: prepared.authorization.tenantId,
207
- ingressBody: state.ingressBody,
176
+ ...nativeCompletionBase({
177
+ providerId: candidate.provider_id,
178
+ ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
179
+ ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
180
+ ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
181
+ usage,
182
+ modelId: candidate.model_id,
183
+ lease: leases.lease,
184
+ commitUsage: usage,
185
+ tenantId: prepared.authorization.tenantId,
186
+ ingressBody: state.ingressBody,
187
+ providerCapture,
188
+ db: deps.db,
189
+ ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
190
+ ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
191
+ }),
208
192
  responseBody: null,
209
- providerCapture,
210
- db: deps.db,
211
- ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
212
- ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
213
193
  });
214
194
  metrics.proxy_requests_total.inc(1, { status: "completed" });
215
195
  return new Response(response.body, {
@@ -37,30 +37,15 @@ import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/pr
37
37
  import { GatewayError } from "../../protocol/gateway-error";
38
38
  import { isRecord } from "../../protocol/codecs";
39
39
  import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
40
- import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
41
- import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
42
- import type { CartethyiaDatabase } from "../../persistence/db-handle";
43
40
  import { metrics } from "../../observability/metrics";
44
- import type { NetworkPoolSelector } from "../../network/pool/selector";
45
- import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
46
- import type { ProxyRequestState, ProxyRequestStateStore } from "../request/state";
47
- import type { ProxyRequestPreparer, PreparedNativeRequest } from "../request/preparer";
48
- import { completeAttempt, estimatedUsage } from "./attempt-finalize";
41
+ import type { ProxyRequestState } from "../request/state";
42
+ import type { PreparedNativeRequest } from "../request/preparer";
43
+ import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
49
44
  import { runAttemptLoop } from "./attempt-loop";
50
45
 
51
- export interface TokenCountHandlerDeps {
52
- readonly db: CartethyiaDatabase;
53
- readonly providerAdapters: ReadonlyMap<string, ProviderAdapter>;
54
- readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
55
- readonly proxyPreparer: ProxyRequestPreparer;
56
- readonly stateStore: ProxyRequestStateStore;
57
- readonly poolSelector?: NetworkPoolSelector;
58
- readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
59
- readonly snapshotService?: import("../routing/route-model").RouteSnapshotService;
60
- readonly telemetryBuffer?: TelemetryBatchBuffer;
61
- readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
62
- readonly oauthRefreshService?: OAuthRefreshService;
63
- }
46
+ import type { GatewayHandlerDeps } from "./handler-deps";
47
+
48
+ export type TokenCountHandlerDeps = GatewayHandlerDeps;
64
49
 
65
50
  /** Builds the `POST /v1/messages/count_tokens` handler. */
66
51
  export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
@@ -144,9 +129,7 @@ export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
144
129
  provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
145
130
  credential_kind: "none" as const,
146
131
  };
147
- const adapter = deps.resolveProviderAdapter
148
- ? await deps.resolveProviderAdapter(candidate.provider_id)
149
- : deps.providerAdapters.get(candidate.provider_id);
132
+ const adapter = await deps.resolveProviderAdapter?.(candidate.provider_id);
150
133
  if (!adapter) {
151
134
  throw new GatewayError("capability_unsupported", 400, "token counting is unavailable for this provider");
152
135
  }
@@ -201,22 +184,23 @@ export function createTokenCountHandler(deps: TokenCountHandlerDeps) {
201
184
  // quietly stop holding.
202
185
  await completeAttempt(state, {
203
186
  status: upstream.ok ? "completed" : "failed",
204
- providerId: candidate.provider_id,
205
- ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
206
- ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
207
- ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
208
- usage: estimatedUsage(0, 0),
209
- modelId: candidate.model_id,
210
- lease: leases.lease,
211
- commitUsage: estimatedUsage(0, 0),
212
- terminal: true,
213
- tenantId: prepared.authorization.tenantId,
214
- ingressBody: state.ingressBody,
187
+ ...nativeCompletionBase({
188
+ providerId: candidate.provider_id,
189
+ ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
190
+ ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
191
+ ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
192
+ usage: estimatedUsage(0, 0),
193
+ modelId: candidate.model_id,
194
+ lease: leases.lease,
195
+ commitUsage: estimatedUsage(0, 0),
196
+ tenantId: prepared.authorization.tenantId,
197
+ ingressBody: state.ingressBody,
198
+ providerCapture,
199
+ db: deps.db,
200
+ ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
201
+ ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
202
+ }),
215
203
  responseBody: null,
216
- providerCapture,
217
- db: deps.db,
218
- ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
219
- ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
220
204
  });
221
205
  metrics.proxy_requests_total.inc(1, { status: upstream.ok ? "completed" : "failed" });
222
206
 
@@ -1,5 +1,5 @@
1
1
  import type { CanonicalEvent } from "../../protocol/canonical-model";
2
- import type { AttemptLeaseOwnership, ValidatedOutboundFetch, ValidatedOutboundHttp2Bidi, ValidatedOutboundWebSocket } from "../../providers/provider-contracts";
2
+ import type { AttemptLeaseOwnership, ValidatedOutboundFetch, ValidatedOutboundHttp2Bidi } from "../../providers/provider-contracts";
3
3
  import type { ProviderContinuationScope } from "../../providers/provider-contracts";
4
4
  import { GATEWAY_SECURITY_HEADERS } from "../../security/outbound-headers";
5
5
 
@@ -44,7 +44,6 @@ export function buildUpstreamDispatchContext(input: {
44
44
  readonly outboundFetch?: ValidatedOutboundFetch;
45
45
  /** Validated attachment egress that must not be wrapped by provider payload capture. */
46
46
  readonly outboundAttachmentFetch?: ValidatedOutboundFetch;
47
- readonly outboundWebSocket?: ValidatedOutboundWebSocket;
48
47
  /** Validated bidirectional HTTP/2 egress bound to the same selected pool. */
49
48
  readonly outboundHttp2?: ValidatedOutboundHttp2Bidi;
50
49
  /**
@@ -95,7 +94,6 @@ export function buildUpstreamDispatchContext(input: {
95
94
  ...(input.outboundAttachmentFetch
96
95
  ? { outbound_attachment_fetch: input.outboundAttachmentFetch }
97
96
  : {}),
98
- ...(input.outboundWebSocket ? { outbound_websocket: input.outboundWebSocket } : {}),
99
97
  ...(input.outboundHttp2 ? { outbound_http2: input.outboundHttp2 } : {}),
100
98
  ...(input.leaseOwnership ? { lease_ownership: input.leaseOwnership } : {}),
101
99
  ...(input.continuationScope ? { continuation_scope: input.continuationScope } : {}),
@@ -17,32 +17,14 @@
17
17
  import type { ProviderAdapter, ProviderDispatchTarget } from "../../providers/provider-contracts";
18
18
  import { GatewayError } from "../../protocol/gateway-error";
19
19
  import { resolveCredentialForAccount } from "../../providers/operations/provider-credential-service";
20
- import type { OAuthTokenRefresher, OAuthRefreshService } from "../../providers/authentication/oauth-refresh-service";
21
- import type { ValidatedNetworkBindingFactory } from "../../network/pool/resolver";
22
- import type { CartethyiaDatabase } from "../../persistence/db-handle";
23
- import type { RouteSnapshotService } from "../routing/route-model";
24
20
  import { metrics } from "../../observability/metrics";
25
- import type { NetworkPoolSelector } from "../../network/pool/selector";
26
- import type { TelemetryBatchBuffer } from "../../observability/telemetry-buffer";
27
- import { ProxyRequestStateStore } from "../request/state";
28
- import { ProxyRequestPreparer } from "../request/preparer";
29
- import { parseThinkingSuffix } from "../translation/thinking";
30
- import { completeAttempt, estimatedUsage } from "./attempt-finalize";
21
+ import { parseThinkingSuffix } from "../../protocol/translation/thinking";
22
+ import { completeAttempt, estimatedUsage, nativeCompletionBase } from "./attempt-finalize";
31
23
  import { runAttemptLoop } from "./attempt-loop";
32
24
 
33
- export interface WebsearchHandlerDeps {
34
- readonly db: CartethyiaDatabase;
35
- readonly providerAdapters: ReadonlyMap<string, ProviderAdapter>;
36
- readonly resolveProviderAdapter?: (providerId: string) => Promise<ProviderAdapter | undefined>;
37
- readonly proxyPreparer: ProxyRequestPreparer;
38
- readonly stateStore: ProxyRequestStateStore;
39
- readonly poolSelector?: NetworkPoolSelector;
40
- readonly networkBindingFactory?: ValidatedNetworkBindingFactory;
41
- readonly snapshotService?: RouteSnapshotService;
42
- readonly telemetryBuffer?: TelemetryBatchBuffer;
43
- readonly resolveOAuthRefresher?: (providerId: string) => Promise<OAuthTokenRefresher | undefined>;
44
- readonly oauthRefreshService?: OAuthRefreshService;
45
- }
25
+ import type { GatewayHandlerDeps } from "./handler-deps";
26
+
27
+ export type WebsearchHandlerDeps = GatewayHandlerDeps;
46
28
 
47
29
 
48
30
 
@@ -122,9 +104,7 @@ export function createWebsearchHandler(deps: WebsearchHandlerDeps) {
122
104
  provider_id: candidate.provider_id as ProviderAdapter["provider_id"],
123
105
  credential_kind: "none" as const,
124
106
  };
125
- const adapter = (deps.resolveProviderAdapter
126
- ? await deps.resolveProviderAdapter(candidate.provider_id)
127
- : deps.providerAdapters.get(candidate.provider_id)) as WebsearchAdapter | undefined;
107
+ const adapter = (await deps.resolveProviderAdapter?.(candidate.provider_id)) as WebsearchAdapter | undefined;
128
108
  if (!adapter || typeof adapter.websearch !== "function")
129
109
  throw new GatewayError(
130
110
  "capability_unsupported",
@@ -174,22 +154,23 @@ export function createWebsearchHandler(deps: WebsearchHandlerDeps) {
174
154
  const usage = estimatedUsage(0, 0);
175
155
  await completeAttempt(state, {
176
156
  status: "completed",
177
- providerId: candidate.provider_id,
178
- ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
179
- ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
180
- ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
181
- usage,
182
- modelId: candidate.model_id,
183
- lease: leases.lease,
184
- commitUsage: usage,
185
- terminal: true,
186
- tenantId: prepared.authorization.tenantId,
187
- ingressBody: state.ingressBody,
157
+ ...nativeCompletionBase({
158
+ providerId: candidate.provider_id,
159
+ ...(candidate.provider_account_id ? { accountId: candidate.provider_account_id } : {}),
160
+ ...(candidate.provider_account_label ? { accountLabel: candidate.provider_account_label } : {}),
161
+ ...(leases.proxySlot ? { networkPoolId: leases.proxySlot.poolId } : {}),
162
+ usage,
163
+ modelId: candidate.model_id,
164
+ lease: leases.lease,
165
+ commitUsage: usage,
166
+ tenantId: prepared.authorization.tenantId,
167
+ ingressBody: state.ingressBody,
168
+ providerCapture,
169
+ db: deps.db,
170
+ ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
171
+ ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
172
+ }),
188
173
  responseBody: payload,
189
- providerCapture,
190
- db: deps.db,
191
- ...(deps.telemetryBuffer ? { telemetryBuffer: deps.telemetryBuffer } : {}),
192
- ...(deps.snapshotService ? { snapshotService: deps.snapshotService } : {}),
193
174
  });
194
175
  metrics.proxy_requests_total.inc(1, { status: "completed" });
195
176
  return jsonResponse(payload, 200, state.requestId);