cartethyia 2.4.5 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (415) hide show
  1. package/.env.example +4 -1
  2. package/README.md +63 -13
  3. package/dist/dashboard/assets/AccountCooldown-ChpdzxRH.js.gz +0 -0
  4. package/dist/dashboard/assets/BannedPage-9igfctfZ.js +1 -0
  5. package/dist/dashboard/assets/BannedPage-9igfctfZ.js.gz +0 -0
  6. package/dist/dashboard/assets/{CliToolDetailPage-BzGevuql.js → CliToolDetailPage-ZRr2K2sF.js} +1 -1
  7. package/dist/dashboard/assets/CliToolDetailPage-ZRr2K2sF.js.gz +0 -0
  8. package/dist/dashboard/assets/{CliToolsPage-BaRM_7We.js → CliToolsPage-D3xqZbN-.js} +1 -1
  9. package/dist/dashboard/assets/CliToolsPage-D3xqZbN-.js.gz +0 -0
  10. package/dist/dashboard/assets/CombosPage-CVnQPBBz.js +1 -0
  11. package/dist/dashboard/assets/CombosPage-CVnQPBBz.js.gz +0 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js +1 -0
  13. package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js.gz +0 -0
  14. package/dist/dashboard/assets/{CustomizationPage-DqUGcoH0.js → CustomizationPage-CTTpCb25.js} +1 -1
  15. package/dist/dashboard/assets/CustomizationPage-CTTpCb25.js.gz +0 -0
  16. package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js +1 -0
  17. package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js.gz +0 -0
  18. package/dist/dashboard/assets/{LoginPage-DbhTGfhb.js → LoginPage-DHoB3Agn.js} +1 -1
  19. package/dist/dashboard/assets/LoginPage-DHoB3Agn.js.gz +0 -0
  20. package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js +1 -0
  21. package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js.gz +0 -0
  22. package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js +1 -0
  23. package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js.gz +0 -0
  24. package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js +3 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js.gz +0 -0
  26. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +1 -0
  27. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
  28. package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js +1 -0
  29. package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js.gz +0 -0
  30. package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js +7 -0
  31. package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js.gz +0 -0
  32. package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js +1 -0
  33. package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js.gz +0 -0
  34. package/dist/dashboard/assets/{SettingsPage-YxRml8AT.js → SettingsPage-CvjZxHE4.js} +1 -1
  35. package/dist/dashboard/assets/SettingsPage-CvjZxHE4.js.gz +0 -0
  36. package/dist/dashboard/assets/SetupPage-D3nza7LH.js +1 -0
  37. package/dist/dashboard/assets/SetupPage-D3nza7LH.js.gz +0 -0
  38. package/dist/dashboard/assets/{SortableList-Bol1ASmI.js → SortableList-Dtt12WT1.js} +1 -1
  39. package/dist/dashboard/assets/SortableList-Dtt12WT1.js.gz +0 -0
  40. package/dist/dashboard/assets/StudioPage-CbK3hXvU.js +31 -0
  41. package/dist/dashboard/assets/StudioPage-CbK3hXvU.js.gz +0 -0
  42. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
  43. package/dist/dashboard/assets/UsagePage-BQlWbWg2.js +56 -0
  44. package/dist/dashboard/assets/UsagePage-BQlWbWg2.js.gz +0 -0
  45. package/dist/dashboard/assets/api-keys-BmDbsior.js +1 -0
  46. package/dist/dashboard/assets/api-keys-BmDbsior.js.gz +0 -0
  47. package/dist/dashboard/assets/app-BbpSarVV.css +2 -0
  48. package/dist/dashboard/assets/app-BbpSarVV.css.gz +0 -0
  49. package/dist/dashboard/assets/{app-BDJWMThu.js → app-C-Y4oZT0.js} +3 -3
  50. package/dist/dashboard/assets/app-C-Y4oZT0.js.gz +0 -0
  51. package/dist/dashboard/assets/arrow-left-CpBxkoxI.js.gz +0 -0
  52. package/dist/dashboard/assets/arrow-right-Dl5yKnp8.js.gz +0 -0
  53. package/dist/dashboard/assets/assert-BHfaei-X.js +1 -0
  54. package/dist/dashboard/assets/assert-BHfaei-X.js.gz +0 -0
  55. package/dist/dashboard/assets/backup-file-gdKIlg8U.js.gz +0 -0
  56. package/dist/dashboard/assets/{badge-BwmwEOgA.js → badge-DpXT4Ixt.js} +1 -1
  57. package/dist/dashboard/assets/badge-DpXT4Ixt.js.gz +0 -0
  58. package/dist/dashboard/assets/{banner-BKBfKTqn.js → banner-CSAAWLJv.js} +1 -1
  59. package/dist/dashboard/assets/banner-CSAAWLJv.js.gz +0 -0
  60. package/dist/dashboard/assets/brain-Cwed_72z.js.gz +0 -0
  61. package/dist/dashboard/assets/{card-BTdbRFFg.js → card-DEhRXXw4.js} +1 -1
  62. package/dist/dashboard/assets/card-DEhRXXw4.js.gz +0 -0
  63. package/dist/dashboard/assets/check-D69FzdvC.js.gz +0 -0
  64. package/dist/dashboard/assets/chevron-right-BXIy5l3h.js.gz +0 -0
  65. package/dist/dashboard/assets/circle-alert-CntYHV5v.js.gz +0 -0
  66. package/dist/dashboard/assets/circle-check-BU3v_mFW.js.gz +0 -0
  67. package/dist/dashboard/assets/cli-tools-B0wBq-RL.js +1 -0
  68. package/dist/dashboard/assets/cli-tools-B0wBq-RL.js.gz +0 -0
  69. package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js +1 -0
  70. package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js.gz +0 -0
  71. package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
  72. package/dist/dashboard/assets/copy-ngmQ9zcZ.js.gz +0 -0
  73. package/dist/dashboard/assets/{dialog-iocKA3jr.js → dialog-BvQeBMfP.js} +1 -1
  74. package/dist/dashboard/assets/dialog-BvQeBMfP.js.gz +0 -0
  75. package/dist/dashboard/assets/dialog-actions-B1axpEg7.js.gz +0 -0
  76. package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
  77. package/dist/dashboard/assets/download-dRFo5_Wu.js.gz +0 -0
  78. package/dist/dashboard/assets/{drawer-CDKOTZdY.js → drawer-CMwPXwQB.js} +1 -1
  79. package/dist/dashboard/assets/drawer-CMwPXwQB.js.gz +0 -0
  80. package/dist/dashboard/assets/entry-D4O2229X.js +1 -0
  81. package/dist/dashboard/assets/entry-D4O2229X.js.gz +0 -0
  82. package/dist/dashboard/assets/entry-DKvr5Q9K.js +1 -0
  83. package/dist/dashboard/assets/entry-DKvr5Q9K.js.gz +0 -0
  84. package/dist/dashboard/assets/entry-FQCejoDY.js +4 -0
  85. package/dist/dashboard/assets/entry-FQCejoDY.js.gz +0 -0
  86. package/dist/dashboard/assets/eye-C_hawfH4.js.gz +0 -0
  87. package/dist/dashboard/assets/eye-off-Bk5g2luF.js.gz +0 -0
  88. package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
  89. package/dist/dashboard/assets/gauge-BbIMy7MB.js.gz +0 -0
  90. package/dist/dashboard/assets/github-badge-zliLvBwr.js +1 -0
  91. package/dist/dashboard/assets/github-badge-zliLvBwr.js.gz +0 -0
  92. package/dist/dashboard/assets/image-BPaouViG.js.gz +0 -0
  93. package/dist/dashboard/assets/{index-C4hXfAMs.js → index-CXm3FIyt.js} +2 -2
  94. package/dist/dashboard/assets/index-CXm3FIyt.js.gz +0 -0
  95. package/dist/dashboard/assets/{inline-DCejSLlA.js → inline-D1IlZZ8H.js} +1 -1
  96. package/dist/dashboard/assets/inline-D1IlZZ8H.js.gz +0 -0
  97. package/dist/dashboard/assets/{input-Bn4_kNav.js → input-BpVZdrbc.js} +1 -1
  98. package/dist/dashboard/assets/input-BpVZdrbc.js.gz +0 -0
  99. package/dist/dashboard/assets/jsx-runtime-CXUMngI_.js.gz +0 -0
  100. package/dist/dashboard/assets/key-round-UkavsGxp.js.gz +0 -0
  101. package/dist/dashboard/assets/layers-2-glBbjl.js.gz +0 -0
  102. package/dist/dashboard/assets/{layout-Bv-NxqZ5.js → layout-BioLW7gN.js} +1 -1
  103. package/dist/dashboard/assets/layout-BioLW7gN.js.gz +0 -0
  104. package/dist/dashboard/assets/{list-row-BLA0sldD.js → list-row-CwVcGAIc.js} +1 -1
  105. package/dist/dashboard/assets/list-row-CwVcGAIc.js.gz +0 -0
  106. package/dist/dashboard/assets/{live-YlifPYox.js → live-yfEJFF9T.js} +1 -1
  107. package/dist/dashboard/assets/live-yfEJFF9T.js.gz +0 -0
  108. package/dist/dashboard/assets/log-in-BmRjy60c.js.gz +0 -0
  109. package/dist/dashboard/assets/message-circle-CCxGwRvv.js.gz +0 -0
  110. package/dist/dashboard/assets/model-bans-CT-TxSNX.js +1 -0
  111. package/dist/dashboard/assets/model-bans-CT-TxSNX.js.gz +0 -0
  112. package/dist/dashboard/assets/mutation-BkoLM5Ba.js +1 -0
  113. package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
  114. package/dist/dashboard/assets/numbers-CFL4_Dqc.js.gz +0 -0
  115. package/dist/dashboard/assets/pencil-768ysRAr.js.gz +0 -0
  116. package/dist/dashboard/assets/plus-DIdX_g-x.js.gz +0 -0
  117. package/dist/dashboard/assets/power-off-Yjw9GMJh.js +1 -0
  118. package/dist/dashboard/assets/power-off-Yjw9GMJh.js.gz +0 -0
  119. package/dist/dashboard/assets/privacy-mode-GM8bej85.js +1 -0
  120. package/dist/dashboard/assets/privacy-mode-GM8bej85.js.gz +0 -0
  121. package/dist/dashboard/assets/providers/agentrouter.svg.gz +0 -0
  122. package/dist/dashboard/assets/providers/aihubmix.svg.gz +0 -0
  123. package/dist/dashboard/assets/providers/alibaba-coding-plan.svg.gz +0 -0
  124. package/dist/dashboard/assets/providers/alibaba.svg.gz +0 -0
  125. package/dist/dashboard/assets/providers/antigravity.svg.gz +0 -0
  126. package/dist/dashboard/assets/providers/bai.svg.gz +0 -0
  127. package/dist/dashboard/assets/providers/blackbox.svg.gz +0 -0
  128. package/dist/dashboard/assets/providers/claude-code.svg.gz +0 -0
  129. package/dist/dashboard/assets/providers/cursor.webp +0 -0
  130. package/dist/dashboard/assets/providers/exa.svg.gz +0 -0
  131. package/dist/dashboard/assets/providers/gmi-cloud.svg.gz +0 -0
  132. package/dist/dashboard/assets/providers/inferhub.svg.gz +0 -0
  133. package/dist/dashboard/assets/providers/muse.svg.gz +0 -0
  134. package/dist/dashboard/assets/providers/nous-research.svg.gz +0 -0
  135. package/dist/dashboard/assets/providers/openai-light.svg.gz +0 -0
  136. package/dist/dashboard/assets/providers/parallel.svg.gz +0 -0
  137. package/dist/dashboard/assets/providers/tokenharbor.svg.gz +0 -0
  138. package/dist/dashboard/assets/providers/trae.webp +0 -0
  139. package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
  140. package/dist/dashboard/assets/{query-keys-ROf-g1Wi.js → query-keys-D7wX2vM5.js} +1 -1
  141. package/dist/dashboard/assets/query-keys-D7wX2vM5.js.gz +0 -0
  142. package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
  143. package/dist/dashboard/assets/refresh-cw-BqJFk4sU.js.gz +0 -0
  144. package/dist/dashboard/assets/rotate-ccw-CufcqITi.js.gz +0 -0
  145. package/dist/dashboard/assets/route-CNSNj9Zm.js.gz +0 -0
  146. package/dist/dashboard/assets/routing-Cs6jl49L.js +1 -0
  147. package/dist/dashboard/assets/routing-Cs6jl49L.js.gz +0 -0
  148. package/dist/dashboard/assets/scaling-nWE4Cx8f.js.gz +0 -0
  149. package/dist/dashboard/assets/search-JOKus9rb.js.gz +0 -0
  150. package/dist/dashboard/assets/select-C0Rer3gF.js +41 -0
  151. package/dist/dashboard/assets/select-C0Rer3gF.js.gz +0 -0
  152. package/dist/dashboard/assets/settings-CfcTcOyU.js +1 -0
  153. package/dist/dashboard/assets/settings-CfcTcOyU.js.gz +0 -0
  154. package/dist/dashboard/assets/shield-check-DVS0Foqh.js.gz +0 -0
  155. package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
  156. package/dist/dashboard/assets/{stack-C1kTcOmP.js → stack-C9_uUjaA.js} +1 -1
  157. package/dist/dashboard/assets/stack-C9_uUjaA.js.gz +0 -0
  158. package/dist/dashboard/assets/{state-DHKdg-pm.js → state-DA0B95UQ.js} +1 -1
  159. package/dist/dashboard/assets/state-DA0B95UQ.js.gz +0 -0
  160. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  161. package/dist/dashboard/assets/{switch-DIDeAiz9.js → switch-Cittxy-x.js} +1 -1
  162. package/dist/dashboard/assets/switch-Cittxy-x.js.gz +0 -0
  163. package/dist/dashboard/assets/terminal-Bd4ee8TA.js +1 -0
  164. package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
  165. package/dist/dashboard/assets/toast-CNt_jzO4.js +2 -0
  166. package/dist/dashboard/assets/toast-CNt_jzO4.js.gz +0 -0
  167. package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
  168. package/dist/dashboard/assets/trash-Cppn5c3R.js.gz +0 -0
  169. package/dist/dashboard/assets/use-clipboard-B0Sy03fE.js.gz +0 -0
  170. package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
  171. package/dist/dashboard/assets/use-reduced-motion-C4B0R6Sz.js.gz +0 -0
  172. package/dist/dashboard/assets/use-timeout-BwcBBRrT.js.gz +0 -0
  173. package/dist/dashboard/assets/{useMutation-DVmwOKU-.js → useMutation-BQKMcJ1H.js} +1 -1
  174. package/dist/dashboard/assets/useMutation-BQKMcJ1H.js.gz +0 -0
  175. package/dist/dashboard/assets/wrench-B6E1oEuY.js.gz +0 -0
  176. package/dist/dashboard/index.html +1 -1
  177. package/dist/dashboard/index.html.gz +0 -0
  178. package/dist/dashboard/precompressed-assets.json +122 -0
  179. package/migrations/full-postgres/0013_add_providers_tenant_id_index.sql +22 -0
  180. package/migrations/full-postgres/0014_add_provider_accounts_tenant_id_index.sql +21 -0
  181. package/migrations/full-postgres/0015_add_payload_stages.sql +18 -0
  182. package/migrations/full-postgres/0016_add_share_link_slug.sql +20 -0
  183. package/migrations/full-postgres/0017_add_models_pro_only.sql +18 -0
  184. package/migrations/full-postgres/0018_add_accounts_quota_plan.sql +18 -0
  185. package/migrations/full-postgres/0019_add_models_free_tier.sql +15 -0
  186. package/migrations/lite-sqlite3/0000_baseline.sql +4 -2
  187. package/migrations/lite-sqlite3/0013_add_providers_tenant_id_index.sql +4 -0
  188. package/migrations/lite-sqlite3/0014_add_provider_accounts_tenant_id_index.sql +4 -0
  189. package/migrations/lite-sqlite3/0015_add_payload_stages.sql +18 -0
  190. package/migrations/lite-sqlite3/0016_add_share_link_slug.sql +20 -0
  191. package/migrations/lite-sqlite3/0017_add_models_pro_only.sql +18 -0
  192. package/migrations/lite-sqlite3/0018_add_accounts_quota_plan.sql +18 -0
  193. package/migrations/lite-sqlite3/0019_add_models_free_tier.sql +15 -0
  194. package/package.json +26 -30
  195. package/scripts/cli/{carte-launcher.cjs → bin/carte.cjs} +8 -8
  196. package/scripts/cli/{cli-launcher.cjs → bin/cartethyia.cjs} +167 -134
  197. package/scripts/cli/command/admin.ts +65 -0
  198. package/scripts/cli/command/console-menu.ts +246 -0
  199. package/scripts/cli/{doctor.ts → command/doctor.ts} +257 -258
  200. package/scripts/cli/{setup.ts → command/setup.ts} +8 -12
  201. package/scripts/cli/command/start.ts +77 -0
  202. package/scripts/cli/command/tray.ts +165 -0
  203. package/scripts/cli/command/update.ts +23 -0
  204. package/scripts/cli/{runtime-state.ts → gateway/drain-token.ts} +78 -78
  205. package/scripts/cli/gateway/instance-lock.ts +105 -0
  206. package/scripts/cli/gateway/spawn.ts +173 -0
  207. package/scripts/cli/gateway/stop.ts +51 -0
  208. package/scripts/cli/main.ts +94 -0
  209. package/scripts/cli/support/bun.ts +27 -0
  210. package/scripts/cli/support/env.ts +99 -0
  211. package/scripts/cli/support/platform.ts +64 -0
  212. package/scripts/cli/support/services.ts +88 -0
  213. package/scripts/cli/support/startup-signal.ts +23 -0
  214. package/scripts/cli/{version.ts → support/version.ts} +1 -1
  215. package/scripts/cli/tray/hidden-window.vbs +28 -0
  216. package/scripts/cli/{tray.ts → tray/index.ts} +3 -3
  217. package/scripts/cli/{tray.ps1 → tray/windows.ps1} +107 -98
  218. package/scripts/cli/ui/background.ts +110 -0
  219. package/src/boot/app.ts +23 -7
  220. package/src/boot/dependencies.ts +55 -13
  221. package/src/boot/elysia-typebox-bridge.ts +37 -0
  222. package/src/boot/lifecycle.ts +2 -0
  223. package/src/config/cooldowns.ts +138 -138
  224. package/src/config/providers.ts +31 -5
  225. package/src/config/runtime.ts +19 -3
  226. package/src/config/spec.ts +20 -0
  227. package/src/console/api-keys/contracts.ts +414 -391
  228. package/src/console/api-keys/routes.ts +880 -870
  229. package/src/console/auth/account-reset-store.ts +14 -0
  230. package/src/console/auth/account-reset.ts +3 -2
  231. package/src/console/auth/setup-service.ts +6 -3
  232. package/src/console/backup/routes.ts +8 -0
  233. package/src/console/cli-tools/contracts.ts +6 -6
  234. package/src/console/console-router.ts +5 -3
  235. package/src/console/dashboard-assets.ts +81 -11
  236. package/src/console/domain-registration.ts +9 -2
  237. package/src/console/observability/contracts.ts +475 -423
  238. package/src/console/observability/routes.ts +31 -6
  239. package/src/console/observability/store.ts +1015 -912
  240. package/src/console/providers/catalog/contracts.ts +31 -0
  241. package/src/console/providers/catalog/provider-operations.ts +8 -0
  242. package/src/console/providers/catalog/public-model-store.ts +91 -60
  243. package/src/console/providers/catalog/store.ts +1532 -1521
  244. package/src/console/providers/oauth/callback-listener.ts +18 -3
  245. package/src/console/providers/oauth/routes.ts +38 -15
  246. package/src/console/quota/account-quota-tenant.ts +9 -6
  247. package/src/console/quota/refresh.ts +19 -0
  248. package/src/console/response-compression.ts +69 -2
  249. package/src/console/routing/pools/probe-verdict.ts +72 -0
  250. package/src/console/share/share-router.ts +7 -4
  251. package/src/console/share/share-stats.ts +12 -5
  252. package/src/console/shared/read-through-cache.ts +133 -7
  253. package/src/console/updates/repository-updates.ts +39 -34
  254. package/src/console/updates/routes.ts +162 -4
  255. package/src/main.ts +3 -0
  256. package/src/network/http2-bidi.ts +85 -0
  257. package/src/network/outbound-fetch.ts +87 -24
  258. package/src/network/pool/agent.ts +478 -460
  259. package/src/network/pool/resolver.ts +1104 -544
  260. package/src/network/pool-health-machine.ts +12 -5
  261. package/src/observability/event-log.ts +29 -8
  262. package/src/observability/metrics.ts +40 -13
  263. package/src/observability/payload-capture.ts +344 -324
  264. package/src/observability/runtime-metrics.ts +7 -0
  265. package/src/persistence/db-pg.ts +9 -3
  266. package/src/persistence/db-sqlite.ts +497 -495
  267. package/src/persistence/health-event-flush.ts +137 -0
  268. package/src/persistence/migrate.ts +181 -129
  269. package/src/persistence/schema.ts +1360 -1257
  270. package/src/persistence/settings-revision.ts +25 -0
  271. package/src/persistence/shared-cache.ts +217 -0
  272. package/src/persistence/stores/share-store.ts +556 -528
  273. package/src/persistence/usage-flush.ts +61 -1
  274. package/src/protocol/canonical-model.ts +23 -1
  275. package/src/protocol/response/chat.ts +143 -10
  276. package/src/protocol/response/codex.ts +9 -75
  277. package/src/protocol/response/omp-tool-call-markup.ts +221 -0
  278. package/src/protocol/tool-identity.ts +43 -9
  279. package/src/providers/authentication/jwt-validator.ts +130 -187
  280. package/src/providers/authentication/oauth-flow-store.ts +16 -9
  281. package/src/providers/default-registry.ts +177 -1
  282. package/src/providers/discovery/catalog/catalog-format.ts +20 -0
  283. package/src/providers/discovery/models-dev-catalog.ts +39 -22
  284. package/src/providers/discovery/openai-model-discovery.ts +39 -3
  285. package/src/providers/discovery/openrouter-free-roster.ts +98 -0
  286. package/src/providers/discovery/probe-wire.ts +29 -5
  287. package/src/providers/discovery/probing-service.ts +1022 -1001
  288. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +42 -2
  289. package/src/providers/integrations/buddy/buddy-chat-shared.ts +913 -914
  290. package/src/providers/integrations/buddy/buddy-cli-headers.ts +88 -0
  291. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +22 -5
  292. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +33 -1
  293. package/src/providers/integrations/buddy/buddy-identity.ts +46 -0
  294. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +37 -1
  295. package/src/providers/integrations/buddy/buddy-usage-store.ts +40 -5
  296. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +4 -0
  297. package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -175
  298. package/src/providers/integrations/buddy/codebuddy/shared.ts +115 -73
  299. package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +5 -2
  300. package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -204
  301. package/src/providers/integrations/buddy/workbuddy/quota.ts +172 -159
  302. package/src/providers/integrations/buddy/workbuddy/shared.ts +200 -171
  303. package/src/providers/integrations/claude/claude.ts +606 -582
  304. package/src/providers/integrations/cline/cline-quota.ts +18 -16
  305. package/src/providers/integrations/cline/cline.ts +539 -468
  306. package/src/providers/integrations/codex/codex.ts +5 -8
  307. package/src/providers/integrations/commandcode/commandcode.ts +675 -541
  308. package/src/providers/integrations/commandcode/discovery.ts +116 -0
  309. package/src/providers/integrations/commandcode/quota.ts +160 -0
  310. package/src/providers/integrations/cursor/cursor-auth.ts +418 -0
  311. package/src/providers/integrations/cursor/cursor-catalog.ts +368 -0
  312. package/src/providers/integrations/cursor/cursor-http2.ts +300 -0
  313. package/src/providers/integrations/cursor/cursor-identity.ts +92 -0
  314. package/src/providers/integrations/cursor/cursor-request.ts +471 -0
  315. package/src/providers/integrations/cursor/cursor-session-manager.ts +281 -0
  316. package/src/providers/integrations/cursor/cursor-shared.ts +108 -0
  317. package/src/providers/integrations/cursor/cursor.ts +960 -0
  318. package/src/providers/integrations/cursor/protocol/framing.ts +129 -0
  319. package/src/providers/integrations/cursor/protocol/messages.ts +2355 -0
  320. package/src/providers/integrations/cursor/protocol/struct.ts +305 -0
  321. package/src/providers/integrations/factory/factory-oauth.ts +7 -11
  322. package/src/providers/integrations/github/github.ts +4 -4
  323. package/src/providers/integrations/hermes.ts +79 -8
  324. package/src/providers/integrations/kilo/kilo-discovery.ts +10 -1
  325. package/src/providers/integrations/kilo/kilo.ts +153 -146
  326. package/src/providers/integrations/opencode/opencode-go-quota.ts +130 -0
  327. package/src/providers/integrations/opencode/provider.ts +532 -499
  328. package/src/providers/integrations/openrouter/provider.ts +139 -281
  329. package/src/providers/integrations/qoder/qoder-catalog.ts +450 -0
  330. package/src/providers/integrations/qoder/qoder-oauth.ts +310 -263
  331. package/src/providers/integrations/qoder/qoder-realm.ts +106 -0
  332. package/src/providers/integrations/qoder/qoder-virtual.ts +77 -0
  333. package/src/providers/integrations/qoder/qoder.ts +865 -730
  334. package/src/providers/integrations/shared/install-id.ts +29 -2
  335. package/src/providers/integrations/trae/trae-catalog.ts +190 -0
  336. package/src/providers/integrations/trae/trae-headers.ts +149 -0
  337. package/src/providers/integrations/trae/trae-oauth.ts +773 -0
  338. package/src/providers/integrations/trae/trae-protocol.ts +400 -0
  339. package/src/providers/integrations/trae/trae-realm.ts +220 -0
  340. package/src/providers/integrations/trae/trae.ts +458 -0
  341. package/src/providers/operations/account-health-service.ts +107 -10
  342. package/src/providers/operations/client-versions.ts +143 -6
  343. package/src/providers/operations/model-catalog-cache.ts +18 -3
  344. package/src/providers/operations/provider-catalog-seeder.ts +95 -86
  345. package/src/providers/operations/provider-catalog-service.ts +76 -0
  346. package/src/providers/operations/provider-credential-service.ts +46 -7
  347. package/src/providers/provider-contracts.ts +76 -0
  348. package/src/providers/provider-metadata.ts +78 -6
  349. package/src/providers/provider-model-definition.ts +373 -349
  350. package/src/security/api-key-auth.ts +126 -8
  351. package/src/transport/contracts.ts +3 -0
  352. package/src/transport/dispatch/attempt-finalize.ts +39 -2
  353. package/src/transport/dispatch/attempt-loop.ts +530 -513
  354. package/src/transport/dispatch/empty-stream.ts +17 -26
  355. package/src/transport/dispatch/generation.ts +88 -21
  356. package/src/transport/dispatch/leases.ts +99 -2
  357. package/src/transport/dispatch/proxy-request.ts +60 -3
  358. package/src/transport/dispatch/streaming/finalize.ts +16 -1
  359. package/src/transport/dispatch/streaming/stream.ts +22 -2
  360. package/src/transport/dispatch/upstream.ts +19 -1
  361. package/src/transport/failure-policy.ts +20 -0
  362. package/src/transport/guards/auth-guard.ts +26 -1
  363. package/src/transport/guards/body-policy.ts +5 -4
  364. package/src/transport/request/preparer.ts +103 -0
  365. package/src/transport/request/state.ts +14 -0
  366. package/src/transport/routing/plan-gate.ts +45 -0
  367. package/src/transport/routing/route-catalog.ts +799 -738
  368. package/src/transport/routing/route-model.ts +52 -1
  369. package/src/transport/routing/router.ts +51 -0
  370. package/src/transport/surface/chat/encode.ts +18 -31
  371. package/src/transport/surface/messages/stream.ts +3 -2
  372. package/src/transport/translation/tool-repair.ts +37 -16
  373. package/src/workers/account-identity-sweep.ts +14 -12
  374. package/src/workers/daily-checkin.ts +62 -0
  375. package/src/workers/quota-refresh-sweep.ts +27 -2
  376. package/dist/dashboard/assets/BannedPage-DUrXpp-X.js +0 -1
  377. package/dist/dashboard/assets/CombosPage-B7ETkfVH.js +0 -1
  378. package/dist/dashboard/assets/ConsoleLogPage-AisQzCI1.js +0 -1
  379. package/dist/dashboard/assets/HealthEventsModal-BNflDm_f.js +0 -1
  380. package/dist/dashboard/assets/ModelPicker-CAiPR5Vd.js +0 -1
  381. package/dist/dashboard/assets/OverviewPage-C3NIzsDx.js +0 -1
  382. package/dist/dashboard/assets/ProviderDetailPage-BK8i5B5X.js +0 -3
  383. package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +0 -1
  384. package/dist/dashboard/assets/ProvidersPage-CvCVgm1e.js +0 -1
  385. package/dist/dashboard/assets/ProxyPage-DjabkuzP.js +0 -7
  386. package/dist/dashboard/assets/QuotaPage-Dxe0B0iu.js +0 -1
  387. package/dist/dashboard/assets/SetupPage-BaD4P_jW.js +0 -1
  388. package/dist/dashboard/assets/StudioPage-CLP4le3U.js +0 -31
  389. package/dist/dashboard/assets/UsagePage-Djes-Epy.js +0 -56
  390. package/dist/dashboard/assets/api-keys-CjIGQhe7.js +0 -1
  391. package/dist/dashboard/assets/app-Cjgo4-Lf.css +0 -2
  392. package/dist/dashboard/assets/assert-Bwh6DJTK.js +0 -1
  393. package/dist/dashboard/assets/cli-tools-DccaOfhX.js +0 -1
  394. package/dist/dashboard/assets/clipboard-button-DQmMikNQ.js +0 -1
  395. package/dist/dashboard/assets/entry-Cpi0rph1.js +0 -4
  396. package/dist/dashboard/assets/entry-Dm3PpDCO.js +0 -1
  397. package/dist/dashboard/assets/entry-keNDZ_Wz.js +0 -1
  398. package/dist/dashboard/assets/github-badge-BuAJr8oU.js +0 -1
  399. package/dist/dashboard/assets/model-bans-CVvHZ-qz.js +0 -1
  400. package/dist/dashboard/assets/mutation-BIizFZav.js +0 -1
  401. package/dist/dashboard/assets/privacy-mode-CQjbZ3xk.js +0 -1
  402. package/dist/dashboard/assets/routing-jntw9-Ui.js +0 -1
  403. package/dist/dashboard/assets/select-CGUuTQmj.js +0 -41
  404. package/dist/dashboard/assets/settings-BAS6QbmJ.js +0 -1
  405. package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +0 -1
  406. package/dist/dashboard/assets/terminal-C9mZ4Ugm.js +0 -1
  407. package/dist/dashboard/assets/toast-DKAdP2mo.js +0 -2
  408. package/scripts/cli/cli.ts +0 -771
  409. package/scripts/operations/probe-egress.ts +0 -335
  410. package/scripts/operations/restart.ts +0 -120
  411. package/scripts/shared/env.ts +0 -269
  412. /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.ico +0 -0
  413. /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.png +0 -0
  414. /package/scripts/cli/{menu.ts → ui/prompt.ts} +0 -0
  415. /package/scripts/cli/{wordmark.ts → ui/wordmark.ts} +0 -0
@@ -0,0 +1,14 @@
1
+ import type { CartethyiaDatabase } from "../../persistence/db-handle";
2
+ import { consoleLockouts, consoleUsers } from "../../persistence/schema";
3
+
4
+ /**
5
+ * Clears console lockouts and accounts atomically so a reset can be followed
6
+ * immediately by first-boot setup from the same client address.
7
+ */
8
+ export function resetConsoleAuthState(db: CartethyiaDatabase): Promise<number> {
9
+ return db.transaction(async (tx) => {
10
+ await tx.delete(consoleLockouts);
11
+ const users = await tx.delete(consoleUsers);
12
+ return users.rowCount ?? 0;
13
+ });
14
+ }
@@ -5,8 +5,9 @@
5
5
  * `/console/api/auth/change-password` requires the current password, and
6
6
  * first-boot setup only runs when no console user exists. The only documented
7
7
  * escape was deleting the database by hand. This endpoint removes every console
8
- * user, which puts `requiresSetup()` back to true so the next visit to
9
- * `/console` runs the create-an-account wizard again.
8
+ * user and login lockouts, which puts `requiresSetup()` back to true so the
9
+ * next visit to `/console` runs the create-an-account wizard again without
10
+ * inheriting a stale failure lock.
10
11
  *
11
12
  * What it does not touch: providers, provider accounts, API keys, routing,
12
13
  * combos, aliases, usage, and telemetry. Those are not authentication state and
@@ -15,7 +15,6 @@ import { hashSecret, encryptCredential } from "../../security/crypto";
15
15
  import type { CartethyiaDatabase } from "../../persistence/db-handle";
16
16
  import {
17
17
  DEFAULT_API_KEY_LABEL,
18
- DEFAULT_API_KEY_PREFIX,
19
18
  generateApiKeySecret,
20
19
  } from "../api-keys/contracts";
21
20
  import { resolveDefaultGatewayApiKey } from "../../config/runtime";
@@ -132,7 +131,8 @@ export class FirstBootSetupService {
132
131
  // encryption key, so an install that never touched the variable still
133
132
  // boots with a usable key instead of failing later with
134
133
  // "the default gateway API key is missing".
135
- const secret = defaultApiKey ?? generateApiKeySecret().secret;
134
+ const generated = generateApiKeySecret();
135
+ const secret = defaultApiKey ?? generated.secret;
136
136
  const keyHash = hashSecret(secret);
137
137
  const existingApiKey = await db
138
138
  .select({ id: apiKeys.id })
@@ -146,7 +146,10 @@ export class FirstBootSetupService {
146
146
  keyHash,
147
147
  label: DEFAULT_API_KEY_LABEL,
148
148
  scopes: TENANT_KEY_SCOPES,
149
- keyPrefix: defaultApiKey === undefined ? DEFAULT_API_KEY_PREFIX : secret.slice(0, 3),
149
+ // The generated prefix, not a slice of the secret: a slice assumed a
150
+ // fixed-width prefix, so a longer one would store a truncated value
151
+ // that no longer matches the key the operator was shown.
152
+ keyPrefix: defaultApiKey === undefined ? generated.prefix : secret.slice(0, 3),
150
153
  keyEncrypted: encryptCredential(secret),
151
154
  requestsPerMinute: 240,
152
155
  isDefault: true,
@@ -18,6 +18,7 @@ import { Elysia, t } from "elysia";
18
18
  import type { ConsoleAccessResolver } from "../auth/access";
19
19
  import { invalidateApiKeyCache } from "../../security/api-key-auth";
20
20
  import { ConsoleDomainError, errorResponse, requireAnyScope } from "../shared/errors";
21
+ import { NO_COMPRESS_HEADER } from "../response-compression";
21
22
  import { MAX_BACKUP_BYTES } from "./contracts";
22
23
  import type { BackupSection } from "./contracts";
23
24
  import { DELETE_ALL_SCOPES, compressBackup } from "./store";
@@ -124,6 +125,13 @@ export function createBackupRoutes(config: BackupRoutesConfig): Elysia {
124
125
  }
125
126
  const bytes = compressBackup(payload);
126
127
  set.headers["content-type"] = "application/json; charset=utf-8";
128
+ // Opt out of the response wrapper's gzip rather than declaring
129
+ // `content-encoding: gzip`: the bytes here are base64 of a gzip
130
+ // stream, and a client told "this is gzip" tries to inflate the
131
+ // base64 text and fails. The payload inside is already compressed,
132
+ // and a second pass over base64 would find nothing to gain while
133
+ // paying a synchronous `gzipSync` over the whole multi-MB body.
134
+ set.headers[NO_COMPRESS_HEADER] = "1";
127
135
  return { compressed: true, filename: `cartethyia_backup_${stamp}.json.gz`, bytes: bytes.toString("base64") };
128
136
  } catch (error) {
129
137
  return errorResponse(error, set, "Backup export failed");
@@ -486,9 +486,9 @@ export const TOOL_REGISTRY = {
486
486
  roleKind: "primary",
487
487
  },
488
488
  {
489
- id: "gpt-5.1",
490
- name: "GPT-5.1",
491
- alias: "gpt-5.1",
489
+ id: "gpt-5.6-sol",
490
+ name: "GPT-5.6 Sol",
491
+ alias: "gpt-5.6-sol",
492
492
  roleLabel: "Fallback Agent",
493
493
  roleKind: "secondary",
494
494
  },
@@ -505,7 +505,7 @@ export const TOOL_REGISTRY = {
505
505
  settingsFile: "~/.factory/settings.json",
506
506
  defaultModels: [
507
507
  { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
508
- { id: "gpt-5.1", name: "GPT-5.1", alias: "gpt-5.1" },
508
+ { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
509
509
  ],
510
510
  },
511
511
 
@@ -540,7 +540,7 @@ export const TOOL_REGISTRY = {
540
540
  surface: "chat" as const,
541
541
  settingsFile: "Code/User/chatLanguageModels.json",
542
542
  defaultModels: [
543
- { id: "gpt-5.1", name: "GPT-5.1", alias: "gpt-5.1" },
543
+ { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
544
544
  { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
545
545
  ],
546
546
  },
@@ -703,7 +703,7 @@ amp --model "{{model}}"`,
703
703
  docsUrl: "https://qwenlm.github.io/qwen-code-docs/en/users/configuration/model-providers/",
704
704
  defaultModels: [
705
705
  { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
706
- { id: "gpt-5.1", name: "GPT-5.1", alias: "gpt-5.1" },
706
+ { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
707
707
  ],
708
708
  notes: [
709
709
  {
@@ -209,9 +209,11 @@ export function createConsoleRouter(deps: ConsoleApiCompositionDeps): Elysia {
209
209
  // nothing to compress and no size to judge. `wrap` sits outside the router
210
210
  // and sees the finished `Response`, which is what this needs.
211
211
  //
212
- // Scoped to the console instance: `/v1/*` is a separate Elysia and is
213
- // deliberately not covered, because a streaming completion must not be
214
- // buffered and proxied bodies are the provider's own bytes. See
212
+ // Scoped by path *inside* `gzipResponse`, not by this instance: Elysia's
213
+ // `use()` merges a child's `hoc` into the root app's ext, so this wrap is
214
+ // reached by `/v1/*` as well. The allowlist is `/console/api/` + `/metrics`.
215
+ // `/v1/*` is deliberately excluded, because a streaming completion must not
216
+ // be buffered and proxied bodies are the provider's own bytes. See
215
217
  // `response-compression.ts` for the full reasoning and the measured win.
216
218
  console.wrap(
217
219
  (fetch) => (request: Request, ...rest: unknown[]) =>
@@ -4,6 +4,7 @@ import {
4
4
  X_FRAME_OPTIONS,
5
5
  dashboardContentSecurityPolicy,
6
6
  } from "../security/outbound-headers";
7
+ import { acceptsGzip } from "./response-compression";
7
8
 
8
9
  /**
9
10
  * Represents the result of serving a static file.
@@ -148,9 +149,39 @@ function entryDocumentFor(pathname: string, entries: Readonly<Record<string, str
148
149
  * - Serves hashed assets with immutable cache headers and documents with no-cache
149
150
  * - Returns 404 for missing asset-like files
150
151
  */
152
+ /**
153
+ * The `.gz` sibling of an asset, when one exists and the client offered gzip.
154
+ *
155
+ * Restricted to hashed assets — see the check below for why — and best-effort:
156
+ * a build that emitted no `.gz` simply serves the plain file.
157
+ */
158
+ async function readPrecompressed(
159
+ fullPath: string,
160
+ acceptEncoding: string | undefined | null,
161
+ ): Promise<Uint8Array | undefined> {
162
+ if (acceptEncoding === undefined || acceptEncoding === null) return undefined;
163
+ if (!acceptsGzip(acceptEncoding)) return undefined;
164
+ // Only hashed assets: those are the immutable ones, and they are what the
165
+ // Vite build precompresses. An unhashed asset is served with a revalidating
166
+ // cache header precisely because it may be replaced in place, and a `.gz`
167
+ // left beside a file that was swapped afterwards would not match it.
168
+ if (!hasHashInFilename(fullPath)) return undefined;
169
+ const file = Bun.file(`${fullPath}.gz`);
170
+ if (!(await file.exists())) return undefined;
171
+ return await file.bytes();
172
+ }
173
+
174
+ /**
175
+ * Builds the static handler.
176
+ *
177
+ * The returned function takes an optional `acceptEncoding` so the caller can
178
+ * pass the request's header: a precompressed `.gz` sibling is only usable when
179
+ * the client asking for it offered gzip. Omitting it serves the plain file,
180
+ * which is what the tests and any non-HTTP caller want.
181
+ */
151
182
  export function createStaticHandler(
152
183
  config: StaticHandlerConfig,
153
- ): (pathname: string) => Promise<StaticServeResult> {
184
+ ): (pathname: string, acceptEncoding?: string | null) => Promise<StaticServeResult> {
154
185
  const buildDirResolved = resolve(config.buildDir);
155
186
  const buildDirNorm = normalizePathSeparators(buildDirResolved);
156
187
  const entries = config.entries ?? DEFAULT_ENTRY_DOCUMENTS;
@@ -173,7 +204,10 @@ export function createStaticHandler(
173
204
  };
174
205
  };
175
206
 
176
- const serve = async (pathname: string): Promise<StaticServeResult> => {
207
+ const serve = async (
208
+ pathname: string,
209
+ acceptEncoding?: string | null,
210
+ ): Promise<StaticServeResult> => {
177
211
  // Reject the reserved `/console/api` namespace, including its bare prefix.
178
212
  if (pathname === "/console/api" || pathname.startsWith("/console/api/")) {
179
213
  return {
@@ -241,6 +275,28 @@ export function createStaticHandler(
241
275
  cacheControl = "public, max-age=3600";
242
276
  }
243
277
 
278
+ // A precompressed sibling is served when the client asked for gzip
279
+ // and the build emitted one. The bytes were compressed at build time
280
+ // (level 9), so this is a disk read rather than a per-request
281
+ // compress — and a build with no `.gz` falls through to the plain
282
+ // file, which is why there is no error path here.
283
+ const precompressed = await readPrecompressed(fullPath, acceptEncoding);
284
+ if (precompressed !== undefined) {
285
+ return {
286
+ status: 200,
287
+ body: precompressed,
288
+ headers: {
289
+ "content-type": mimeType,
290
+ "cache-control": cacheControl,
291
+ "content-encoding": "gzip",
292
+ // Without this a shared cache would hand the gzipped bytes to a
293
+ // client that never offered gzip: the URL is identical either
294
+ // way, so `accept-encoding` is the only thing that differs.
295
+ vary: "accept-encoding",
296
+ },
297
+ };
298
+ }
299
+
244
300
  return {
245
301
  status: 200,
246
302
  body: data,
@@ -260,8 +316,8 @@ export function createStaticHandler(
260
316
  return { status: 404, body: undefined, headers: {} };
261
317
  };
262
318
 
263
- return async (pathname: string): Promise<StaticServeResult> =>
264
- applyStaticSecurityHeaders(await serve(pathname));
319
+ return async (pathname: string, acceptEncoding?: string | null): Promise<StaticServeResult> =>
320
+ applyStaticSecurityHeaders(await serve(pathname, acceptEncoding));
265
321
  }
266
322
 
267
323
  /**
@@ -328,13 +384,27 @@ function getMimeType(filePath: string): string {
328
384
  }
329
385
 
330
386
  /**
331
- * Checks if a filename contains a hash (common pattern: name.hash.ext).
332
- * This is a heuristic that looks for hex-like strings in the filename.
387
+ * True when a filename carries a build hash, so its bytes are immutable.
388
+ *
389
+ * Matched on the two separator forms a bundler actually emits — `app.a1b2c3d4.js`
390
+ * and the modern Vite spelling `app-BCnqn3N3.js` — plus `_`, and then required
391
+ * to *look generated*: the segment must contain a digit or mix upper and lower
392
+ * case. The second half is what keeps a plain word out of the set, since
393
+ * `console-backgrounds.jpg` and `openai-light.svg` both match the separator
394
+ * alone and are emphatically not immutable.
395
+ *
396
+ * Getting this wrong in either direction costs real money: a hashed asset
397
+ * served with a revalidating header is re-downloaded after every deploy, and an
398
+ * unhashed one served `immutable` is pinned in the browser cache until it
399
+ * expires. Measured against a real build, this matches 198 of 288 files — all
400
+ * of them hashed bundles — and rejects every icon, photo, and document.
333
401
  */
334
402
  function hasHashInFilename(filePath: string): boolean {
335
- const filename = filePath.split(/[/\\]/).pop() || "";
336
- // Match patterns like: app.abc123def.js, script.12345678.mjs, etc.
337
- // Look for segments that are at least 8 characters of hex digits
338
- const hashPattern = /\.[a-f0-9]{6,}\./i;
339
- return hashPattern.test(filename);
403
+ const filename = filePath.split(/[/\\]/).pop() ?? "";
404
+ const match = /[._-]([A-Za-z0-9_-]{8,})\./.exec(filename);
405
+ if (match === null) return false;
406
+ const segment = match[1] ?? "";
407
+ const hasDigit = /[0-9]/.test(segment);
408
+ const hasMixedCase = /[a-z]/.test(segment) && /[A-Z]/.test(segment);
409
+ return hasDigit || hasMixedCase;
340
410
  }
@@ -180,6 +180,7 @@ export function registerConsoleDomains(
180
180
  if (slot) {
181
181
  return {
182
182
  fetch: ctx.networkBindingFactory.fetch(slot.poolId, tenantId),
183
+ http2Bidi: ctx.networkBindingFactory.http2Bidi(slot.poolId, tenantId),
183
184
  networkPoolId: slot.poolId,
184
185
  release: slot.release,
185
186
  };
@@ -195,7 +196,10 @@ export function registerConsoleDomains(
195
196
  }
196
197
  }
197
198
 
198
- return { fetch: ctx.networkBindingFactory.fetch(undefined, tenantId) };
199
+ return {
200
+ fetch: ctx.networkBindingFactory.fetch(undefined, tenantId),
201
+ http2Bidi: ctx.networkBindingFactory.http2Bidi(undefined, tenantId),
202
+ };
199
203
  },
200
204
  snapshotInvalidator: ctx.routeSnapshotService,
201
205
  readAccountInflight: async (providerId, tenantId) =>
@@ -219,7 +223,10 @@ export function registerConsoleDomains(
219
223
  }));
220
224
  console.use(createLogRoutes({ accessResolver: ctx.accessResolver, auditSink: ctx.auditRecorder }));
221
225
  console.use(createPerformanceRoutes({ accessResolver: ctx.accessResolver }));
222
- console.use(createUpdateRoutes());
226
+ console.use(createUpdateRoutes({
227
+ accessResolver: ctx.accessResolver,
228
+ observabilityStore,
229
+ }));
223
230
  console.use(createAuditRoutes({ store: auditReadStore, accessResolver: ctx.accessResolver }));
224
231
  if (ctx.modelStrikes) {
225
232
  console.use(createModelAbuseRoutes({