cartethyia 2.7.4 → 2.7.6

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 (595) hide show
  1. package/.env.example +5 -0
  2. package/README.md +18 -6
  3. package/dist/dashboard/assets/BannedPage-B1N603cM.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-B1N603cM.js.gz +0 -0
  5. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js +3 -0
  6. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js.gz +0 -0
  7. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js +1 -0
  8. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-D762MIkp.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-D762MIkp.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js.gz +0 -0
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js +899 -0
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js.gz +0 -0
  19. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js +1 -0
  20. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-C6WlpU5E.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js +5 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-DxjvUzSD.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-DxjvUzSD.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js.gz +0 -0
  37. package/dist/dashboard/assets/SetupPage-44BZrxFC.js +1 -0
  38. package/dist/dashboard/assets/SetupPage-44BZrxFC.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-DRPavCdU.js} +4 -4
  40. package/dist/dashboard/assets/StudioPage-DRPavCdU.js.gz +0 -0
  41. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js +1 -0
  42. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js.gz +0 -0
  43. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js +56 -0
  44. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js.gz +0 -0
  45. package/dist/dashboard/assets/api-keys-KvX83mRe.js +1 -0
  46. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  47. package/dist/dashboard/assets/app-DRnQLhsc.js +9 -0
  48. package/dist/dashboard/assets/app-DRnQLhsc.js.gz +0 -0
  49. package/dist/dashboard/assets/app-mweRcsKp.css +2 -0
  50. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  51. package/dist/dashboard/assets/assert-CidQVoNo.js +1 -0
  52. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  53. package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-BaX2GTrn.js} +1 -1
  54. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  55. package/dist/dashboard/assets/{banner-DympBNq4.js → banner-DFH4Bkte.js} +1 -1
  56. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  57. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  58. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  59. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  60. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  61. package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CxDw0lK6.js} +1 -1
  62. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  63. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
  64. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
  65. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js +1 -0
  66. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js.gz +0 -0
  67. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +1 -0
  68. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  69. package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-DfS1ntiq.js} +1 -1
  70. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  71. package/dist/dashboard/assets/dialog-BK-NRr5u.js +1 -0
  72. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  73. package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-QqPul6sC.js} +1 -1
  74. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-BMlYJVFj.js +1 -0
  76. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D6WvojeD.js +4 -0
  78. package/dist/dashboard/assets/entry-D6WvojeD.js.gz +0 -0
  79. package/dist/dashboard/assets/entry-Dmx7gBiN.js +1 -0
  80. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  81. package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-u7JPB5BX.js} +1 -1
  82. package/dist/dashboard/assets/formatters-u7JPB5BX.js.gz +0 -0
  83. package/dist/dashboard/assets/house-h9AZlJuT.js +1 -0
  84. package/dist/dashboard/assets/house-h9AZlJuT.js.gz +0 -0
  85. package/dist/dashboard/assets/{index-DBNPOfhV.js → index-Ko4dLRnV.js} +2 -2
  86. package/dist/dashboard/assets/index-Ko4dLRnV.js.gz +0 -0
  87. package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-CHJQwxLa.js} +1 -1
  88. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  89. package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BlmlizVV.js} +1 -1
  90. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  91. package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-Bz93I-yE.js} +1 -1
  92. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  93. package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Ml16KCfu.js} +1 -1
  94. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  95. package/dist/dashboard/assets/live-7_QpnYGu.js +1 -0
  96. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  97. package/dist/dashboard/assets/{mutation-Rr0TIvcj.js → mutation-GU7XdEjz.js} +1 -1
  98. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  99. package/dist/dashboard/assets/network-CuMDaTzT.js +1 -0
  100. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  101. package/dist/dashboard/assets/numbers-CoqpaDMx.js +2 -0
  102. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  103. package/dist/dashboard/assets/pagination-B5aOoweZ.js +1 -0
  104. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  105. package/dist/dashboard/assets/providers/zai.webp +0 -0
  106. package/dist/dashboard/assets/providers/zcode.webp +0 -0
  107. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js → query-keys-YSoQOUh6.js} +1 -1
  108. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js.gz → query-keys-YSoQOUh6.js.gz} +0 -0
  109. package/dist/dashboard/assets/quota-DJ1QlAOq.js +1 -0
  110. package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
  111. package/dist/dashboard/assets/routing-fnCsxgNO.js +1 -0
  112. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  113. package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BHqpd-bg.js} +2 -2
  114. package/dist/dashboard/assets/select-BHqpd-bg.js.gz +0 -0
  115. package/dist/dashboard/assets/settings-BxslsErn.js +1 -0
  116. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  117. package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
  118. package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
  119. package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-j7cXjgYX.js} +1 -1
  120. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  121. package/dist/dashboard/assets/{state-CkfdYWel.js → state-DHmEnLa2.js} +1 -1
  122. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  123. package/dist/dashboard/assets/{switch-SYm237HG.js → switch-DmZcyTIC.js} +1 -1
  124. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  125. package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-CbCP4w1o.js} +1 -1
  126. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  127. package/dist/dashboard/console-backgrounds.jpg +0 -0
  128. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  129. package/dist/dashboard/index.html +2 -2
  130. package/dist/dashboard/index.html.gz +0 -0
  131. package/dist/dashboard/precompressed-assets.json +60 -59
  132. package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
  133. package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
  134. package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
  135. package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
  136. package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
  137. package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
  138. package/migrations/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -0
  139. package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
  140. package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
  141. package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
  142. package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
  143. package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
  144. package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
  145. package/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
  146. package/package.json +4 -6
  147. package/scripts/cli/update.ts +15 -41
  148. package/src/boot/app.ts +58 -2
  149. package/src/boot/dependencies.ts +794 -732
  150. package/src/boot/lifecycle.ts +11 -12
  151. package/src/config/cooldowns.ts +34 -55
  152. package/src/config/network.ts +1 -1
  153. package/src/config/package-paths.ts +1 -1
  154. package/src/config/providers.ts +19 -14
  155. package/src/config/resources.ts +0 -5
  156. package/src/config/runtime.ts +2 -5
  157. package/src/config/spec.ts +33 -6
  158. package/src/config/usage.ts +27 -0
  159. package/src/console/api-keys/ban-constants.ts +38 -0
  160. package/src/console/api-keys/contracts.ts +71 -62
  161. package/src/console/api-keys/routes.ts +56 -24
  162. package/src/console/auth/access.ts +4 -4
  163. package/src/console/auth/account-reset.ts +1 -1
  164. package/src/console/auth/audit-recorder.ts +1 -1
  165. package/src/console/auth/lockout.ts +7 -3
  166. package/src/console/auth/row-coercion.ts +57 -12
  167. package/src/console/auth/session-resolver.ts +1 -1
  168. package/src/console/auth/session-service.ts +8 -2
  169. package/src/console/auth/session.ts +37 -31
  170. package/src/console/auth/setup-service.ts +4 -3
  171. package/src/console/auth/user-store.ts +1 -1
  172. package/src/console/backup/9router-map.ts +0 -3
  173. package/src/console/backup/contracts.ts +9 -9
  174. package/src/console/backup/export-endpoint.ts +5 -6
  175. package/src/console/backup/nine-router.ts +1 -7
  176. package/src/console/backup/routes.ts +29 -33
  177. package/src/console/backup/service.ts +468 -468
  178. package/src/console/backup/store.ts +47 -29
  179. package/src/console/backup/validate.ts +11 -1
  180. package/src/console/cli-tools/contracts.ts +43 -299
  181. package/src/console/cli-tools/fs-ops.ts +29 -0
  182. package/src/console/cli-tools/injectors/claude.ts +3 -3
  183. package/src/console/cli-tools/injectors/codex.ts +181 -181
  184. package/src/console/cli-tools/injectors/driver.ts +150 -247
  185. package/src/console/cli-tools/injectors/kilo.ts +146 -21
  186. package/src/console/cli-tools/injectors/opencode.ts +176 -153
  187. package/src/console/cli-tools/routes.ts +7 -1
  188. package/src/console/cli-tools/service.ts +8 -7
  189. package/src/console/cli-tools/store.ts +2 -2
  190. package/src/console/console-router.ts +32 -0
  191. package/src/console/dashboard-assets.ts +9 -9
  192. package/src/console/domain-registration.ts +16 -2
  193. package/src/console/inferhub/client.ts +0 -7
  194. package/src/console/inferhub/key-store.ts +1 -1
  195. package/src/console/inferhub/normalize.ts +2 -2
  196. package/src/console/inferhub/routes.ts +1 -1
  197. package/src/console/inferhub/types.ts +1 -1
  198. package/src/console/observability/contracts.ts +7 -1
  199. package/src/console/observability/live.ts +31 -18
  200. package/src/console/observability/logs.ts +1 -1
  201. package/src/console/observability/sse.ts +62 -8
  202. package/src/console/observability/store.ts +23 -4
  203. package/src/console/providers/catalog/catalog-projections.ts +1 -1
  204. package/src/console/providers/catalog/contracts.ts +39 -0
  205. package/src/console/providers/catalog/model-operations.ts +1 -1
  206. package/src/console/providers/catalog/provider-operations.ts +95 -17
  207. package/src/console/providers/catalog/public-model-store.ts +0 -0
  208. package/src/console/providers/catalog/routes.ts +27 -3
  209. package/src/console/providers/catalog/store.ts +147 -8
  210. package/src/console/providers/detail/routes.ts +1 -1
  211. package/src/console/providers/oauth/callback-listener.ts +100 -18
  212. package/src/console/providers/oauth/routes.ts +92 -13
  213. package/src/console/quota/account-quota-global.ts +41 -3
  214. package/src/console/quota/account-quota-shared.ts +10 -3
  215. package/src/console/quota/account-quota-tenant.ts +259 -66
  216. package/src/console/quota/daily-growth-job.ts +308 -0
  217. package/src/console/quota/native-identity.ts +2 -2
  218. package/src/console/quota/quota-view.ts +1 -1
  219. package/src/console/remote-support/routes.ts +1 -1
  220. package/src/console/remote-support/service.ts +2 -2
  221. package/src/console/routing/model/contracts.ts +1 -1
  222. package/src/console/routing/pools/contracts.ts +2 -2
  223. package/src/console/routing/pools/import-parse.ts +3 -3
  224. package/src/console/routing/pools/relay-deploy.ts +3 -3
  225. package/src/console/settings/contracts.ts +29 -2
  226. package/src/console/settings/store.ts +20 -0
  227. package/src/console/share/share-router.ts +100 -32
  228. package/src/console/share/share-stats.ts +11 -13
  229. package/src/console/share/share-usage.ts +1 -1
  230. package/src/console/shared/errors.ts +2 -2
  231. package/src/console/shared/object.ts +18 -0
  232. package/src/console/shared/read-through-cache.ts +4 -4
  233. package/src/console/shared/transaction.ts +14 -0
  234. package/src/console/system-prompt/contracts.ts +89 -12
  235. package/src/console/system-prompt/routes.ts +98 -45
  236. package/src/console/updates/apply-update.ts +244 -0
  237. package/src/console/updates/routes.ts +252 -97
  238. package/src/main.ts +11 -5
  239. package/src/network/http2-bidi.ts +1 -1
  240. package/src/network/ip-utils.ts +298 -0
  241. package/src/network/outbound-fetch.ts +1 -1
  242. package/src/network/pool/agent.ts +7 -6
  243. package/src/network/pool/byte-accounting.ts +1 -1
  244. package/src/network/pool/resolver.ts +16 -12
  245. package/src/network/pool/selector.ts +150 -136
  246. package/src/network/pool-health-machine.ts +1 -1
  247. package/src/network/rate-limit-verdict.ts +1 -1
  248. package/src/network/retry.ts +1 -1
  249. package/src/network/ssrf.ts +20 -71
  250. package/src/observability/event-log.ts +9 -2
  251. package/src/observability/event-query.ts +61 -291
  252. package/src/observability/log-sanitize.ts +1 -1
  253. package/src/observability/metrics.ts +4 -4
  254. package/src/observability/payload-capture.ts +6 -5
  255. package/src/observability/payload-store.ts +1 -1
  256. package/src/observability/runtime-metrics.ts +1 -1
  257. package/src/observability/telemetry-buffer.ts +19 -3
  258. package/src/observability/telemetry-reconciliation.ts +3 -3
  259. package/src/observability/token-speed.ts +1 -1
  260. package/src/persistence/connection-url.ts +1 -1
  261. package/src/persistence/db-handle.ts +1 -1
  262. package/src/persistence/db-pg.ts +2 -2
  263. package/src/persistence/db-sqlite.ts +3 -3
  264. package/src/persistence/dialect.ts +5 -1
  265. package/src/persistence/readiness.ts +1 -1
  266. package/src/persistence/redis.ts +1 -1
  267. package/src/persistence/schema.ts +121 -40
  268. package/src/persistence/shared-cache.ts +2 -2
  269. package/src/persistence/sort-order.ts +1 -1
  270. package/src/persistence/stores/api-key-store.ts +29 -2
  271. package/src/persistence/stores/share-store.ts +20 -8
  272. package/src/persistence/system-prompt-store.ts +63 -18
  273. package/src/persistence/tenant-preferences.ts +1 -1
  274. package/src/persistence/ttl-cache.ts +3 -3
  275. package/src/persistence/usage-flush.ts +7 -2
  276. package/src/protocol/canonical-model.ts +1 -1
  277. package/src/protocol/codecs.ts +6 -10
  278. package/src/protocol/dsml.ts +8 -125
  279. package/src/protocol/image-clamp.ts +2 -2
  280. package/src/protocol/reasoning-text.ts +1 -1
  281. package/src/protocol/reasoning.ts +7 -52
  282. package/src/protocol/registry.ts +50 -15
  283. package/src/protocol/request/chat.ts +46 -19
  284. package/src/protocol/request/codex.ts +1 -1
  285. package/src/protocol/request/messages.ts +46 -14
  286. package/src/protocol/request/responses.ts +19 -10
  287. package/src/protocol/response/chat.ts +25 -10
  288. package/src/protocol/response/codex.ts +1 -1
  289. package/src/protocol/response/messages.ts +1 -1
  290. package/src/protocol/response/omp-tool-call-markup.ts +1 -1
  291. package/src/protocol/response/responses.ts +1 -1
  292. package/src/protocol/sse-decoder.ts +50 -1
  293. package/src/protocol/stop-reason.ts +2 -2
  294. package/src/protocol/think-split.ts +347 -0
  295. package/src/protocol/translation/attachment-integrity.ts +3 -3
  296. package/src/protocol/translation/cache-controls.ts +8 -20
  297. package/src/protocol/translation/capabilities.ts +6 -6
  298. package/src/protocol/translation/dialect/deepseek.ts +10 -0
  299. package/src/protocol/translation/dialect/inband.ts +39 -0
  300. package/src/protocol/translation/dialect/model-thinking.ts +89 -0
  301. package/src/protocol/translation/dialect/qwen.ts +114 -0
  302. package/src/protocol/translation/dialect/resolver.ts +83 -0
  303. package/src/protocol/translation/dialect/rules.ts +93 -0
  304. package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
  305. package/src/protocol/translation/dialect/types.ts +58 -0
  306. package/src/protocol/translation/quirks.ts +18 -4
  307. package/src/protocol/translation/thinking.ts +12 -252
  308. package/src/protocol/translation/tool-id.ts +3 -3
  309. package/src/protocol/translation/tool-repair.ts +1 -1
  310. package/src/protocol/upstream/post-json.ts +6 -1
  311. package/src/providers/adapters/compatible-adapter.ts +71 -4
  312. package/src/providers/authentication/jwt-validator.ts +0 -5
  313. package/src/providers/authentication/oauth-client.ts +254 -253
  314. package/src/providers/authentication/oauth-flow-store.ts +42 -7
  315. package/src/providers/bundled-discovery-providers.ts +6 -30
  316. package/src/providers/configured-openai-providers.ts +82 -97
  317. package/src/providers/default-registry.ts +35 -37
  318. package/src/providers/discovery/catalog/catalog-format.ts +13 -2
  319. package/src/providers/discovery/discovery-types.ts +0 -1
  320. package/src/providers/discovery/openai-model-discovery.ts +2 -2
  321. package/src/providers/discovery/probe-phases.ts +48 -13
  322. package/src/providers/discovery/probing-service.ts +6 -8
  323. package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
  324. package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
  325. package/src/providers/integrations/antigravity/antigravity-protocol.ts +88 -28
  326. package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
  327. package/src/providers/integrations/antigravity/antigravity.ts +22 -13
  328. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
  329. package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
  330. package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
  331. package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
  332. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
  333. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
  334. package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
  335. package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
  336. package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
  337. package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
  338. package/src/providers/integrations/claude/claude-cch.ts +148 -148
  339. package/src/providers/integrations/claude/fallback-credit.ts +3 -7
  340. package/src/providers/integrations/cline/cline.ts +1 -1
  341. package/src/providers/integrations/codex/codex-device-code.ts +101 -101
  342. package/src/providers/integrations/codex/codex-oauth.ts +0 -1
  343. package/src/providers/integrations/commandcode/commandcode.ts +75 -115
  344. package/src/providers/integrations/commandcode/quota.ts +131 -51
  345. package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
  346. package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
  347. package/src/providers/integrations/cursor/cursor-request.ts +0 -87
  348. package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
  349. package/src/providers/integrations/cursor/cursor.ts +35 -3
  350. package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
  351. package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
  352. package/src/providers/integrations/factory/factory.ts +9 -9
  353. package/src/providers/integrations/github/github-discovery.ts +70 -12
  354. package/src/providers/integrations/github/github-oauth.ts +184 -14
  355. package/src/providers/integrations/github/github.ts +134 -26
  356. package/src/providers/integrations/grok/grok-oauth.ts +261 -261
  357. package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
  358. package/src/providers/integrations/grok/grok-quota.ts +16 -7
  359. package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
  360. package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
  361. package/src/providers/integrations/grok/grok.ts +86 -36
  362. package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
  363. package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
  364. package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
  365. package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
  366. package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
  367. package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
  368. package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
  369. package/src/providers/integrations/kiro/kiro-request.ts +8 -11
  370. package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
  371. package/src/providers/integrations/kiro/kiro.ts +80 -68
  372. package/src/providers/integrations/muse/muse-oauth.ts +0 -1
  373. package/src/providers/integrations/muse/muse-quota.ts +0 -4
  374. package/src/providers/integrations/opencode/fingerprint.ts +7 -5
  375. package/src/providers/integrations/opencode/provider.ts +17 -24
  376. package/src/providers/integrations/qoder/qoder-catalog.ts +94 -11
  377. package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
  378. package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
  379. package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
  380. package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
  381. package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
  382. package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
  383. package/src/providers/integrations/qoder/qoder.ts +422 -71
  384. package/src/providers/integrations/shared/connect.ts +0 -54
  385. package/src/providers/integrations/shared/hash.ts +15 -0
  386. package/src/providers/integrations/shared/session-cache.ts +136 -0
  387. package/src/providers/integrations/trae/trae-cache.ts +7 -87
  388. package/src/providers/integrations/trae/trae-catalog.ts +1 -6
  389. package/src/providers/integrations/trae/trae-protocol.ts +17 -8
  390. package/src/providers/integrations/trae/trae-realm.ts +0 -7
  391. package/src/providers/integrations/trae/trae.ts +51 -8
  392. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  393. package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
  394. package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
  395. package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
  396. package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
  397. package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
  398. package/src/providers/operations/account-error-classification.ts +198 -133
  399. package/src/providers/operations/account-health-service.ts +31 -39
  400. package/src/providers/operations/account-reset-service.ts +58 -1
  401. package/src/providers/operations/byok-wire-profile.ts +19 -15
  402. package/src/providers/operations/cli-platform.ts +31 -5
  403. package/src/providers/operations/client-version-resolver.ts +4 -6
  404. package/src/providers/operations/client-versions.ts +10 -7
  405. package/src/providers/operations/provider-catalog-seeder.ts +2 -0
  406. package/src/providers/operations/provider-catalog-service.ts +18 -2
  407. package/src/providers/operations/provider-credential-service.ts +19 -2
  408. package/src/providers/provider-contracts.ts +18 -7
  409. package/src/providers/provider-metadata.ts +17 -2
  410. package/src/providers/provider-model-definition.ts +22 -1
  411. package/src/providers/provider-probe.ts +4 -2
  412. package/src/providers/provider-usage.ts +50 -19
  413. package/src/providers/quota/cache.ts +29 -0
  414. package/src/providers/quota/quota-contracts.ts +4 -0
  415. package/src/providers/quota/refresh.ts +27 -4
  416. package/src/providers/quota/snapshot.ts +94 -0
  417. package/src/providers/search/search-provider.ts +1 -3
  418. package/src/providers/search/search-providers.ts +2 -1
  419. package/src/security/abuse.ts +4 -4
  420. package/src/security/admission/service.ts +13 -6
  421. package/src/security/admission/ttl.ts +61 -61
  422. package/src/security/api-key-auth.ts +17 -3
  423. package/src/security/client-router-fingerprint.ts +4 -4
  424. package/src/security/credential-codec.ts +3 -3
  425. package/src/security/csrf.ts +2 -2
  426. package/src/security/ip-boundary.ts +16 -189
  427. package/src/security/model-access-rule.ts +1 -1
  428. package/src/security/outbound-headers.ts +18 -0
  429. package/src/shared/invoke-guard.ts +47 -0
  430. package/src/transport/contracts.ts +13 -4
  431. package/src/transport/dispatch/attempt-finalize.ts +70 -22
  432. package/src/transport/dispatch/attempt-loop.ts +22 -0
  433. package/src/transport/dispatch/capture-policy.ts +34 -37
  434. package/src/transport/dispatch/empty-stream.ts +23 -20
  435. package/src/transport/dispatch/generation.ts +25 -45
  436. package/src/transport/dispatch/native-shared.ts +127 -0
  437. package/src/transport/dispatch/proxy-request.ts +3 -1
  438. package/src/transport/dispatch/responses-compact.ts +25 -46
  439. package/src/transport/dispatch/streaming/encoder.ts +18 -72
  440. package/src/transport/dispatch/streaming/finalize.ts +2 -2
  441. package/src/transport/dispatch/streaming/stream.ts +7 -3
  442. package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
  443. package/src/transport/dispatch/systemone.ts +20 -48
  444. package/src/transport/dispatch/token-count.ts +41 -38
  445. package/src/transport/dispatch/websearch.ts +19 -45
  446. package/src/transport/drain-endpoint.ts +1 -1
  447. package/src/transport/failure-policy.ts +21 -1
  448. package/src/transport/guards/auth-guard.ts +0 -6
  449. package/src/transport/guards/body-policy.ts +3 -3
  450. package/src/transport/guards/error-lifecycle.ts +4 -0
  451. package/src/transport/guards/headroom-guard.ts +1 -1
  452. package/src/transport/guards/pipeline.ts +1 -1
  453. package/src/transport/guards/request-context.ts +12 -17
  454. package/src/transport/request/preparer.ts +286 -7
  455. package/src/transport/request/rtk/compress-request.ts +3 -3
  456. package/src/transport/request/rtk/rtk-constants.ts +2 -2
  457. package/src/transport/request/rtk/rtk-filters.ts +8 -8
  458. package/src/transport/request/state.ts +7 -13
  459. package/src/transport/request/system-prompt-injection.ts +74 -11
  460. package/src/transport/request/tenant-preferences.ts +22 -0
  461. package/src/transport/routing/candidate-index.ts +2 -2
  462. package/src/transport/routing/round-robin.ts +1 -1
  463. package/src/transport/routing/route-catalog.ts +17 -18
  464. package/src/transport/routing/route-model.ts +126 -33
  465. package/src/transport/routing/router.ts +159 -37
  466. package/src/transport/shutdown-notice.ts +2 -2
  467. package/src/transport/surface/adapters.ts +3 -3
  468. package/src/transport/surface/chat/encode.ts +7 -7
  469. package/src/transport/surface/chat/parse.ts +7 -7
  470. package/src/transport/surface/completion.ts +2 -2
  471. package/src/transport/surface/content-parts.ts +1 -1
  472. package/src/transport/surface/dialects.ts +2 -2
  473. package/src/transport/surface/messages/parse.ts +3 -3
  474. package/src/transport/surface/reasoning-summary.ts +9 -14
  475. package/src/transport/surface/responses/adapter.ts +1 -1
  476. package/src/transport/surface/responses/errors.ts +0 -9
  477. package/src/transport/vision-handoff-cache.ts +58 -0
  478. package/src/transport/vision-handoff.ts +431 -0
  479. package/src/workers/account-identity-sweep.ts +2 -2
  480. package/src/workers/buddy-growth-tasks.ts +392 -346
  481. package/src/workers/daily-checkin.ts +102 -49
  482. package/src/workers/maintenance-lease.ts +2 -35
  483. package/src/workers/oauth-refresh-sweep.ts +8 -1
  484. package/src/workers/quota-refresh-sweep.ts +120 -82
  485. package/src/workers/scheduler.ts +67 -4
  486. package/src/workers/sweep-runner.ts +24 -5
  487. package/src/workers/zcode-gift-claim.ts +108 -0
  488. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
  489. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
  490. package/dist/dashboard/assets/BannedPage-ChG5svFb.js +0 -1
  491. package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
  492. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js +0 -1
  493. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
  494. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js +0 -1
  495. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
  496. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
  497. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
  498. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
  499. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
  500. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js +0 -1
  501. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
  502. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
  503. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
  504. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js +0 -1
  505. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
  506. package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
  507. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
  508. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
  509. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
  510. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
  511. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
  512. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  513. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
  514. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
  515. package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
  516. package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
  517. package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
  518. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
  519. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
  520. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js +0 -1
  521. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
  522. package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
  523. package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
  524. package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
  525. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js +0 -1
  526. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
  527. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
  528. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
  529. package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
  530. package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
  531. package/dist/dashboard/assets/app-BayTTy01.js +0 -9
  532. package/dist/dashboard/assets/app-BayTTy01.js.gz +0 -0
  533. package/dist/dashboard/assets/app-a159k0ub.css +0 -2
  534. package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
  535. package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
  536. package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
  537. package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
  538. package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
  539. package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
  540. package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
  541. package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
  542. package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
  543. package/dist/dashboard/assets/dialog-8fiE6tec.js +0 -1
  544. package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
  545. package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
  546. package/dist/dashboard/assets/entry-BSAsYsmV.js +0 -1
  547. package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
  548. package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
  549. package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
  550. package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
  551. package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
  552. package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
  553. package/dist/dashboard/assets/github-badge-CPK47xQx.js +0 -1
  554. package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
  555. package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
  556. package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
  557. package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
  558. package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
  559. package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
  560. package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
  561. package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
  562. package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
  563. package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
  564. package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
  565. package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
  566. package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
  567. package/dist/dashboard/assets/providers/zai-coding-plan.svg +0 -6
  568. package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
  569. package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
  570. package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
  571. package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
  572. package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
  573. package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
  574. package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
  575. package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
  576. package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
  577. package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
  578. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
  579. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  580. package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
  581. package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
  582. package/src/console/cli-tools/injectors/cline.ts +0 -110
  583. package/src/console/cli-tools/injectors/copilot.ts +0 -108
  584. package/src/console/cli-tools/injectors/cowork.ts +0 -64
  585. package/src/console/cli-tools/injectors/deepseek-tui.ts +0 -85
  586. package/src/console/cli-tools/injectors/droid.ts +0 -96
  587. package/src/console/cli-tools/injectors/grok-build.ts +0 -70
  588. package/src/console/cli-tools/injectors/hermes.ts +0 -101
  589. package/src/console/cli-tools/injectors/jcode.ts +0 -115
  590. package/src/console/cli-tools/injectors/openclaw.ts +0 -161
  591. package/src/network/response-headers.ts +0 -39
  592. package/src/protocol/response/dsml.ts +0 -38
  593. package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
  594. /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
  595. /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
@@ -1,75 +1,77 @@
1
1
  {
2
- "count": 118,
2
+ "count": 119,
3
3
  "assets": [
4
- "assets/AccountCooldown-Bjo92Qat.js",
5
- "assets/BannedPage-ChG5svFb.js",
6
- "assets/CliToolDetailPage-BIcWQun7.js",
7
- "assets/CliToolsPage-Bf2VelDe.js",
8
- "assets/CombosPage-DCgm5g6g.js",
9
- "assets/ConsoleLogPage-a8mD0QF1.js",
10
- "assets/CustomizationPage-ggeMSjte.js",
11
- "assets/HealthEventsModal-DzSWzE_j.js",
12
- "assets/LoginPage-U6AKaJcF.js",
13
- "assets/ModelPicker-BMS2t8BA.js",
14
- "assets/OverviewPage-D2D4IiHl.js",
15
- "assets/ProviderDetailPage-CrNf7j_X.js",
16
- "assets/ProviderIcon-FB6yS4v1.js",
17
- "assets/ProvidersPage-BSDbquc1.js",
18
- "assets/ProxyPage-lsrx7NYg.js",
19
- "assets/QuotaPage-L0skzML8.js",
20
- "assets/SettingsPage-CmAbjRHW.js",
21
- "assets/SetupPage-f0DE1h0-.js",
22
- "assets/SortableList-ClzpwyET.js",
23
- "assets/StudioPage-Cq5tW7hW.js",
24
- "assets/ToolIcon-K1ckcDKg.js",
25
- "assets/UsagePage-Dfc9rWQn.js",
26
- "assets/api-keys-C38iXoO4.js",
27
- "assets/app-BayTTy01.js",
28
- "assets/app-a159k0ub.css",
4
+ "assets/BannedPage-B1N603cM.js",
5
+ "assets/CliToolDetailPage-9q4_4NoK.js",
6
+ "assets/CliToolsPage-DwshGtK-.js",
7
+ "assets/CombosPage-D762MIkp.js",
8
+ "assets/ConsoleLogPage-KRYjHZsX.js",
9
+ "assets/CustomizationPage-DXsxk5uM.js",
10
+ "assets/HealthEventsModal-BEjAjD4F.js",
11
+ "assets/InjectSystemPromptPanel-d5v3K_Yc.js",
12
+ "assets/LoginPage-Ccv4tjNS.js",
13
+ "assets/ModelPicker-C6WlpU5E.js",
14
+ "assets/OverviewPage-DN9fYNWA.js",
15
+ "assets/ProviderDetailPage-BY0ieUgz.js",
16
+ "assets/ProviderIcon-jjqXJDA3.js",
17
+ "assets/ProvidersPage-DNsbfea2.js",
18
+ "assets/ProxyPage-DxjvUzSD.js",
19
+ "assets/QuotaPage-OaHScjpX.js",
20
+ "assets/SettingsPage-BW4AKj2H.js",
21
+ "assets/SetupPage-44BZrxFC.js",
22
+ "assets/StudioPage-DRPavCdU.js",
23
+ "assets/ToolIcon-CfeLA-Z_.js",
24
+ "assets/UsagePage-B7M7LvMM.js",
25
+ "assets/api-keys-KvX83mRe.js",
26
+ "assets/app-DRnQLhsc.js",
27
+ "assets/app-mweRcsKp.css",
29
28
  "assets/arrow-left-CpBxkoxI.js",
30
29
  "assets/arrow-right-Dl5yKnp8.js",
31
30
  "assets/arrow-up-59ms1iiT.js",
32
- "assets/assert-DbRA8EG2.js",
31
+ "assets/assert-CidQVoNo.js",
33
32
  "assets/backup-file-gdKIlg8U.js",
34
- "assets/badge-D9CS6dZk.js",
35
- "assets/banner-DympBNq4.js",
33
+ "assets/badge-BaX2GTrn.js",
34
+ "assets/banner-DFH4Bkte.js",
36
35
  "assets/brain-Cwed_72z.js",
37
- "assets/card-ibRWU_uT.js",
36
+ "assets/card-CxDw0lK6.js",
37
+ "assets/chevron-left-Bf6CaTSJ.js",
38
38
  "assets/chevron-right-BXIy5l3h.js",
39
39
  "assets/circle-alert-CntYHV5v.js",
40
40
  "assets/circle-check-BU3v_mFW.js",
41
- "assets/cli-tools-63qBGaRw.js",
42
- "assets/clipboard-button-DJm-9pz7.js",
41
+ "assets/circle-question-mark-Cz4un8sH.js",
42
+ "assets/cli-tools-Bwv5-zGZ.js",
43
+ "assets/clipboard-button-DfS1ntiq.js",
43
44
  "assets/database-Dz9N3zGd.js",
44
- "assets/dialog-8fiE6tec.js",
45
+ "assets/dialog-BK-NRr5u.js",
45
46
  "assets/dialog-actions-B1axpEg7.js",
46
47
  "assets/download-dRFo5_Wu.js",
47
- "assets/drawer-CqGYeOrd.js",
48
- "assets/entry-BSAsYsmV.js",
49
- "assets/entry-CiIQULZD.js",
50
- "assets/entry-Daz0lJ-W.js",
48
+ "assets/drawer-QqPul6sC.js",
49
+ "assets/entry-BMlYJVFj.js",
50
+ "assets/entry-D6WvojeD.js",
51
+ "assets/entry-Dmx7gBiN.js",
51
52
  "assets/eye-C_hawfH4.js",
52
53
  "assets/eye-off-Bk5g2luF.js",
53
54
  "assets/fingerprint-pattern-BWuHtbW4.js",
54
- "assets/formatters-D-MTJxMr.js",
55
+ "assets/formatters-u7JPB5BX.js",
55
56
  "assets/gauge-BbIMy7MB.js",
56
- "assets/github-badge-CPK47xQx.js",
57
+ "assets/house-h9AZlJuT.js",
57
58
  "assets/image-BPaouViG.js",
58
- "assets/index-DBNPOfhV.js",
59
- "assets/inline-BT0zntEr.js",
60
- "assets/input-Da2ZViWg.js",
59
+ "assets/index-Ko4dLRnV.js",
60
+ "assets/inline-CHJQwxLa.js",
61
+ "assets/input-BlmlizVV.js",
61
62
  "assets/jsx-runtime-CXUMngI_.js",
62
63
  "assets/key-round-UkavsGxp.js",
63
64
  "assets/layers-2-glBbjl.js",
64
- "assets/layout-BXNeLw6M.js",
65
- "assets/list-row-BycOrrIV.js",
66
- "assets/live-DCQNZpF7.js",
65
+ "assets/layout-Bz93I-yE.js",
66
+ "assets/list-row-Ml16KCfu.js",
67
+ "assets/live-7_QpnYGu.js",
67
68
  "assets/log-in-BmRjy60c.js",
68
69
  "assets/message-circle-CCxGwRvv.js",
69
70
  "assets/minimize-2-BTmMTK4o.js",
70
- "assets/mutation-Rr0TIvcj.js",
71
- "assets/network-9Yj2ZyLo.js",
72
- "assets/numbers-CEagj6ZZ.js",
71
+ "assets/mutation-GU7XdEjz.js",
72
+ "assets/network-CuMDaTzT.js",
73
+ "assets/numbers-CoqpaDMx.js",
74
+ "assets/pagination-B5aOoweZ.js",
73
75
  "assets/pencil-768ysRAr.js",
74
76
  "assets/plus-DIdX_g-x.js",
75
77
  "assets/power-off-Yjw9GMJh.js",
@@ -91,23 +93,22 @@
91
93
  "assets/providers/openai-light.svg",
92
94
  "assets/providers/parallel.svg",
93
95
  "assets/providers/tokenharbor.svg",
94
- "assets/providers/zai-coding-plan.svg",
95
- "assets/query-keys-BloKtaXJ.js",
96
- "assets/quota-Caw7wqci.js",
96
+ "assets/query-keys-YSoQOUh6.js",
97
+ "assets/quota-DJ1QlAOq.js",
97
98
  "assets/refresh-cw-BqJFk4sU.js",
98
99
  "assets/rotate-ccw-CufcqITi.js",
99
100
  "assets/route-CNSNj9Zm.js",
100
- "assets/routing-CO9zCUus.js",
101
+ "assets/routing-fnCsxgNO.js",
101
102
  "assets/scaling-nWE4Cx8f.js",
102
103
  "assets/search-JOKus9rb.js",
103
- "assets/select-BIYIBkMU.js",
104
+ "assets/select-BHqpd-bg.js",
104
105
  "assets/settings-2-Ds9DQp0t.js",
105
- "assets/settings-jS3-PNSA.js",
106
+ "assets/settings-BxslsErn.js",
107
+ "assets/shield-BMQNxORh.js",
106
108
  "assets/shield-check-DVS0Foqh.js",
107
- "assets/stack-DfgnFDWY.js",
108
- "assets/state-CkfdYWel.js",
109
- "assets/stream-retry-5QnVuSSo.js",
110
- "assets/switch-SYm237HG.js",
109
+ "assets/stack-j7cXjgYX.js",
110
+ "assets/state-DHmEnLa2.js",
111
+ "assets/switch-DmZcyTIC.js",
111
112
  "assets/terminal-0_IjPWTk.js",
112
113
  "assets/tokens-COzario9.js",
113
114
  "assets/trash-Cppn5c3R.js",
@@ -115,7 +116,7 @@
115
116
  "assets/use-modal-focus-By7oJoGd.js",
116
117
  "assets/use-reduced-motion-C4B0R6Sz.js",
117
118
  "assets/use-timeout-BwcBBRrT.js",
118
- "assets/useMutation-BQqCRNIi.js",
119
+ "assets/useMutation-CbCP4w1o.js",
119
120
  "assets/wrench-B6E1oEuY.js",
120
121
  "assets/zap-C4EeVW4q.js",
121
122
  "index.html"
@@ -0,0 +1,10 @@
1
+ -- Tenant system-prompt injection: presets + combo/alias scopes + scope refs.
2
+ --
3
+ -- Legacy shape: `providers` (followGlobal + optional inline setting), `models`
4
+ -- (providerId::modelId -> setting). New shape: every scope map stores a
5
+ -- reference, and a named preset collection is introduced. Legacy rows remain
6
+ -- readable (the store's defensive reader normalizes them); this migration only
7
+ -- adds the new columns so the new shapes can be written.
8
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "presets" jsonb NOT NULL DEFAULT '{}';
9
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "combos" jsonb NOT NULL DEFAULT '{}';
10
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "aliases" jsonb NOT NULL DEFAULT '{}';
@@ -0,0 +1,3 @@
1
+ -- Share-template concurrency scope: family (one cap for all recipients, the
2
+ -- default) vs per_key (each recipient key carries its own cap and counter).
3
+ ALTER TABLE "api_keys" ADD COLUMN "concurrency_scope" text NOT NULL DEFAULT 'family';
@@ -0,0 +1,7 @@
1
+ -- Last successful quota read, persisted as JSON so an account's balance
2
+ -- survives a process restart (the in-process quota cache does not).
3
+ --
4
+ -- Only a successful read is stored; a failed fetch leaves the previous
5
+ -- snapshot in place, mirroring `quota_plan`.
6
+ ALTER TABLE "provider_accounts"
7
+ ADD COLUMN IF NOT EXISTS "quota_snapshot" jsonb;
@@ -0,0 +1,13 @@
1
+ -- Indexes for the console's per-provider and per-model telemetry aggregates.
2
+ --
3
+ -- The provider usage matrix and `breakdownTelemetry("provider")` filter on
4
+ -- `tenant_id` + `provider_id` and aggregate over `created_at`; the top-model
5
+ -- breakdown does the same for `requested_model`. These queries used the
6
+ -- tenant-range index, which scanned every event in the window for one
7
+ -- provider/model card. Each new index turns the card into an index-only range
8
+ -- scan.
9
+ CREATE INDEX IF NOT EXISTS "telemetry_events_tenant_provider_created_idx"
10
+ ON "telemetry_events" USING btree ("tenant_id", "provider_id", "created_at");
11
+
12
+ CREATE INDEX IF NOT EXISTS "telemetry_events_tenant_model_created_idx"
13
+ ON "telemetry_events" USING btree ("tenant_id", "requested_model", "created_at");
@@ -0,0 +1,3 @@
1
+ -- Explicit wire dialect per model row (nullable; absent = resolver fallback).
2
+ -- See documentation/features/09-wire-dialects.md.
3
+ ALTER TABLE "models" ADD COLUMN "dialect" TEXT;
@@ -0,0 +1,7 @@
1
+ -- `daily_checkin_ledger.account_id` referenced `provider_accounts.id` only by
2
+ -- convention; deleting an account left orphan ledger rows behind. This adds the
3
+ -- missing FK with `ON DELETE CASCADE` so a deleted account's daily check-in
4
+ -- markers go with it.
5
+ ALTER TABLE "daily_checkin_ledger"
6
+ ADD CONSTRAINT "daily_checkin_ledger_account_id_provider_accounts_id_fk"
7
+ FOREIGN KEY ("account_id") REFERENCES "provider_accounts" ("id") ON DELETE CASCADE;
@@ -0,0 +1,14 @@
1
+ -- Adds `telemetry_events.degenerate_stop` (boolean, nullable).
2
+ --
3
+ -- Marked on completed requests whose output is far smaller than the model's
4
+ -- ceiling and which ended with an ordinary `stop`. This is the signature of a
5
+ -- model truncating itself on a cached prefix: a short, cut-off reply that the
6
+ -- upstream reported as a clean stop. The column lets an operator measure how
7
+ -- often that happens instead of having to eyeball request detail.
8
+ --
9
+ -- NULL means the row predates this column (or the request never reached a
10
+ -- completed outcome). Only completed requests can carry a value.
11
+ --
12
+ -- `ADD COLUMN IF NOT EXISTS` keeps the file idempotent: a database built from a
13
+ -- newer baseline that already carries the column must not fail startup.
14
+ ALTER TABLE "telemetry_events" ADD COLUMN IF NOT EXISTS "degenerate_stop" boolean;
@@ -0,0 +1,14 @@
1
+ -- Tenant system-prompt injection: presets + combo/alias scopes + scope refs.
2
+ --
3
+ -- Legacy shape: `providers` (followGlobal + optional inline setting), `models`
4
+ -- (providerId::modelId -> setting). New shape: every scope map stores a
5
+ -- reference, and a named preset collection is introduced. Legacy rows remain
6
+ -- readable (the store's defensive reader normalizes them); this migration only
7
+ -- adds the new columns so the new shapes can be written.
8
+ --
9
+ -- SQLite stores JSON as TEXT, so the new maps are TEXT columns with an
10
+ -- empty-object default, mirroring the existing `providers`/`models` TEXT
11
+ -- columns.
12
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "presets" TEXT NOT NULL DEFAULT '{}';
13
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "combos" TEXT NOT NULL DEFAULT '{}';
14
+ ALTER TABLE "tenant_system_prompts" ADD COLUMN "aliases" TEXT NOT NULL DEFAULT '{}';
@@ -0,0 +1,3 @@
1
+ -- Share-template concurrency scope: family (one cap for all recipients, the
2
+ -- default) vs per_key (each recipient key carries its own cap and counter).
3
+ ALTER TABLE "api_keys" ADD COLUMN "concurrency_scope" TEXT NOT NULL DEFAULT 'family';
@@ -0,0 +1,4 @@
1
+ -- SQLite mirror of `full-postgres/0038_add_accounts_quota_snapshot.sql`:
2
+ -- the column is `text` (the SQLite representation of jsonb).
3
+ ALTER TABLE "provider_accounts"
4
+ ADD COLUMN "quota_snapshot" text;
@@ -0,0 +1,6 @@
1
+ -- SQLite mirror of `full-postgres/0039_add_telemetry_provider_model_indexes.sql`.
2
+ CREATE INDEX IF NOT EXISTS "telemetry_events_tenant_provider_created_idx"
3
+ ON "telemetry_events" ("tenant_id", "provider_id", "created_at");
4
+
5
+ CREATE INDEX IF NOT EXISTS "telemetry_events_tenant_model_created_idx"
6
+ ON "telemetry_events" ("tenant_id", "requested_model", "created_at");
@@ -0,0 +1,3 @@
1
+ -- Explicit wire dialect per model row (nullable; absent = resolver fallback).
2
+ -- See documentation/features/09-wire-dialects.md.
3
+ ALTER TABLE "models" ADD COLUMN "dialect" TEXT;
@@ -0,0 +1,26 @@
1
+ -- `daily_checkin_ledger.account_id` referenced `provider_accounts.id` only by
2
+ -- convention; deleting an account left orphan ledger rows behind. This adds the
3
+ -- missing FK with `ON DELETE CASCADE` so a deleted account's daily check-in
4
+ -- markers go with it.
5
+ --
6
+ -- SQLite cannot add a FK to an existing table in place, so the ledger is
7
+ -- rebuilt with the constraint. The runner wraps the file in a transaction, so
8
+ -- `PRAGMA foreign_keys = OFF` is unusable (a no-op inside a transaction);
9
+ -- `defer_foreign_keys` postpones enforcement to commit time instead, letting
10
+ -- the drop/rename complete mid-rebuild.
11
+
12
+ PRAGMA defer_foreign_keys = ON;
13
+
14
+ CREATE TABLE "daily_checkin_ledger__new" (
15
+ "day_key" text NOT NULL,
16
+ "account_id" text NOT NULL,
17
+ "claimed_at" text DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')) NOT NULL,
18
+ CONSTRAINT "daily_checkin_ledger_day_key_account_id_pk" PRIMARY KEY("day_key", "account_id"),
19
+ CONSTRAINT "daily_checkin_ledger_account_id_provider_accounts_id_fk" FOREIGN KEY ("account_id") REFERENCES "provider_accounts"("id") ON DELETE cascade
20
+ );
21
+ INSERT INTO "daily_checkin_ledger__new" ("day_key", "account_id", "claimed_at")
22
+ SELECT "day_key", "account_id", "claimed_at" FROM "daily_checkin_ledger";
23
+ DROP TABLE "daily_checkin_ledger";
24
+ ALTER TABLE "daily_checkin_ledger__new" RENAME TO "daily_checkin_ledger";
25
+
26
+ PRAGMA defer_foreign_keys = OFF;
@@ -0,0 +1,12 @@
1
+ -- Adds `telemetry_events.degenerate_stop` (boolean, nullable) — see the
2
+ -- identically named PostgreSQL migration for why. Both backends must apply the
3
+ -- same behavior; SQLite stores it as integer (0/1).
4
+ --
5
+ -- Idempotency comes from the migration ledger, not from the statement: the
6
+ -- runner records the file inside the same transaction, so a file that has
7
+ -- already run is never re-executed. The baseline is generated from
8
+ -- `0000_baseline.sql` alone and does not carry this column.
9
+ --
10
+ -- NOTE: the runner already wraps each migration in a transaction, so this file
11
+ -- must NOT issue BEGIN/COMMIT.
12
+ ALTER TABLE "telemetry_events" ADD COLUMN "degenerate_stop" integer;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cartethyia",
3
- "version": "2.7.4",
3
+ "version": "2.7.6",
4
4
  "description": "A powerful, self-hosted reverse proxy for OpenAI- and Anthropic-compatible AI clients, powered by native Bun and Elysia. It serves both protocols from a single server, routes every model across any configured provider, and translates requests and responses in real time — streaming and prompt caching included. Underneath it runs a full delivery engine: per-account health tracking, quota and cooldown enforcement, automatic failover across pools and providers, usage accounting, and telemetry. Point OpenCode, Cline, Claude Code, Codex, or any compatible client at Cartethyia and it keeps its native protocol while the gateway absorbs every provider-specific difference behind it. Runs on embedded SQLite or external PostgreSQL with optional Redis coordination, ships as a global CLI with a system-tray console, and needs only Bun 1.4+ alongside Node.js/npm.",
5
5
  "license": "GPL-3.0-only",
6
6
  "type": "module",
@@ -39,7 +39,7 @@
39
39
  "bun": ">=1.4.0"
40
40
  },
41
41
  "scripts": {
42
- "dev": "bun run dev:stack",
42
+ "dev": "bun run dev:watch",
43
43
  "dev:watch": "bun run scripts/dev/supervisor.ts",
44
44
  "test": "bun run scripts/test/run.ts",
45
45
  "build": "bun run scripts/build/build.ts",
@@ -47,15 +47,13 @@
47
47
  "setup": "bun run scripts/cli/setup.ts",
48
48
  "start": "bun run scripts/cli/main.ts start",
49
49
  "doctor": "bun run scripts/cli/doctor.ts",
50
- "probe:egress": "bun run scripts/tools/probe-egress.ts",
51
- "probe:qoder": "bun run scripts/provider-probing/qoder/probe-qoder.ts",
52
50
  "restart": "bun run scripts/build/restart.ts",
53
51
  "build:aot": "bun run scripts/build/aot.ts",
54
52
  "dev:stack": "concurrently -n BACKEND,DASHBOARD -c cyan,magenta --kill-others-on-fail \"bun run dev:backend\" \"bun run dashboard:dev\"",
55
53
  "typecheck": "tsc --noEmit",
56
54
  "test:watch": "bun run scripts/test/run.ts --watch",
57
55
  "test-db:up": "docker compose -f docker-compose.test.yml up -d --wait postgres-test",
58
- "dev:backend": "bun run --hot src/main.ts",
56
+ "dev:backend": "bun run src/main.ts",
59
57
  "dev:console-auth": "bun run scripts/test/console-session.ts",
60
58
  "dev:visual-baseline": "bun run scripts/test/visual-baseline.ts",
61
59
  "build:binary": "bun run scripts/build/compile.ts",
@@ -79,7 +77,6 @@
79
77
  "jsonrepair": "^3.15.0",
80
78
  "pg": "8.23.0",
81
79
  "pino": "^10.3.1",
82
- "pino-pretty": "^13.1.3",
83
80
  "protobufjs": "^7.6.5",
84
81
  "socks-proxy-agent": "^10.1.0",
85
82
  "systray2": "2.1.4",
@@ -92,6 +89,7 @@
92
89
  "bun-types": "1.4.0",
93
90
  "concurrently": "^10.0.5",
94
91
  "drizzle-kit": "^0.31.11",
92
+ "pino-pretty": "^13.1.3",
95
93
  "typescript": "5.9.2"
96
94
  }
97
95
  }
@@ -1,5 +1,6 @@
1
1
  /**
2
- * The update path.
2
+ * The update path — CLI-side wrapper over the shared detached-install flow in
3
+ * `src/console/updates/apply-update.ts`.
3
4
  *
4
5
  * npm cannot replace this package's directory while a process is executing out
5
6
  * of it (EBUSY on Windows). So we spawn the installer as a detached process,
@@ -8,50 +9,20 @@
8
9
  * `cartethyia start`), so the new version comes up automatically.
9
10
  * Cross-OS: uses npm.cmd on Windows.
10
11
  */
11
- import { spawn } from "node:child_process";
12
+ import {
13
+ spawnDetachedUpdate,
14
+ UPDATE_INSTALL_COMMAND,
15
+ type UpdateStatus,
16
+ } from "../../src/console/updates/apply-update";
12
17
 
13
18
  export function updateCommand(): string {
14
- return "npm install -g cartethyia@latest --prefer-online";
15
- }
16
-
17
- /**
18
- * Processes still running out of the package directory, so npm can rename it.
19
- *
20
- * The rename is the whole install on Windows, and it fails with EBUSY while
21
- * anything holds the directory — including a hold that outlives the process
22
- * that took it. `carte` itself runs from that directory, so the install has to
23
- * wait until this process is gone; these are the others.
24
- */
25
- function stopHoldingProcesses(): void {
26
- if (process.platform !== "win32") return;
27
- // `taskkill` filters on the window title and image name only, so it is asked
28
- // for the two processes this CLI can leave behind. /T takes the tree, so a
29
- // detached gateway started by a tray goes with it.
30
- for (const image of ["cartethyia.exe", "carte.exe"]) {
31
- try {
32
- spawn("taskkill", ["/F", "/T", "/IM", image], { stdio: "ignore" }).unref();
33
- } catch {
34
- // A missing taskkill is not the install's problem; npm will report the
35
- // hold if one is left.
36
- }
37
- }
19
+ return UPDATE_INSTALL_COMMAND;
38
20
  }
39
21
 
40
22
  export function runDetachedUpdate(): void {
41
- const isWin = process.platform === "win32";
42
- const shell = isWin ? "cmd.exe" : "/bin/sh";
43
- const install = "npm install -g cartethyia@latest --prefer-online";
44
- const restart = isWin
45
- ? "cartethyia start"
46
- : "systemctl restart cartethyia 2>/dev/null || cartethyia start";
47
- const script = `${install} && ${restart}`;
48
- const args = isWin ? ["/c", script] : ["-c", script];
49
- stopHoldingProcesses();
50
- const child = spawn(shell, args, {
51
- detached: true,
52
- stdio: "ignore",
53
- });
54
- child.unref();
23
+ // The shared module owns stopHoldingProcesses, the wrapper, the status file,
24
+ // and the update.log redirection; the CLI only prints.
25
+ spawnDetachedUpdate({});
55
26
  }
56
27
 
57
28
  export function printUpdateInstructions(from: string, to: string | null): void {
@@ -73,4 +44,7 @@ export function printUpdateInstructions(from: string, to: string | null): void {
73
44
  console.log("If `carte` still shows the old version afterwards, run:");
74
45
  console.log(` ${updateCommand()}`);
75
46
  console.log("");
76
- }
47
+ }
48
+
49
+ /** Status shape the shared module writes; re-exported for CLI readers. */
50
+ export type { UpdateStatus };
package/src/boot/app.ts CHANGED
@@ -27,6 +27,8 @@ import type { ByokUpstreamHost } from "../providers/operations/provider-catalog-
27
27
  import type { NetworkPoolSelector } from "../network/pool/selector";
28
28
  import type { ProxyRequestPreparer } from "../transport/request/preparer";
29
29
  import { ProxyRequestStateStore } from "../transport/request/state";
30
+ import { resolveTenantVisionHandoffModels } from "../transport/request/tenant-preferences";
31
+ import { tryVisionHandoff, type VisionHandoffDeps } from "../transport/vision-handoff";
30
32
  import { fastPathname } from "../transport/pathname";
31
33
  import {
32
34
  handleProviderProxyRequest,
@@ -60,6 +62,7 @@ import type { ValidatedNetworkBindingFactory } from "../network/pool/resolver";
60
62
  import { metrics } from "../observability/metrics";
61
63
  import type { RuntimeMetricsSampler } from "../observability/runtime-metrics";
62
64
  import { API_CONTENT_SECURITY_POLICY, X_FRAME_OPTIONS } from "../security/outbound-headers";
65
+ import { setProxyBusySource } from "../shared/invoke-guard";
63
66
 
64
67
 
65
68
  import type { TelemetryBatchBuffer } from "../observability/telemetry-buffer";
@@ -105,7 +108,7 @@ interface GatewayShellDeps {
105
108
  * `runtime/dependencies.ts` either supplies it or the app does not boot, so
106
109
  * there is no runtime shape check to fall through.
107
110
  */
108
- export interface ProductionAppDeps {
111
+ interface ProductionAppDeps {
109
112
  readonly mode: "production";
110
113
  readonly db: CartethyiaDatabase;
111
114
  readonly proxyPreparer: ProxyRequestPreparer;
@@ -158,6 +161,23 @@ export interface ProductionAppDeps {
158
161
  /** Either app mode. The discriminant decides which builder path runs. */
159
162
  type GatewayAppDeps = GatewayShellDeps | ProductionAppDeps;
160
163
 
164
+ /**
165
+ * Adapts the static handler's `Uint8Array | undefined` body to `BodyInit`.
166
+ *
167
+ * Typed-array buffers are `ArrayBufferLike` (may be a SharedArrayBuffer), but
168
+ * `BodyInit` only accepts `ArrayBuffer`-backed views, so a direct assignment
169
+ * does not type-check. The common case reuses the same bytes without copying;
170
+ * the exotic SharedArrayBuffer case falls back to a copy. This replaces the
171
+ * old `as unknown as BodyInit` double cast with a structural guard.
172
+ */
173
+ function staticBodyToInit(body: Uint8Array | undefined): BodyInit | null {
174
+ if (body === undefined) return null;
175
+ if (body.buffer instanceof ArrayBuffer) {
176
+ return new Uint8Array(body.buffer, body.byteOffset, body.byteLength);
177
+ }
178
+ return new Uint8Array(body);
179
+ }
180
+
161
181
  function checkDatabaseConnection(): Promise<void> {
162
182
  return getDbHandle()
163
183
  .query("SELECT 1")
@@ -204,7 +224,7 @@ export function createGatewayApp(deps: GatewayAppDeps) {
204
224
  // The client's `accept-encoding` is what decides whether a precompressed
205
225
  // `.gz` sibling can be served instead of the plain asset.
206
226
  const result = await staticHandler(pathname, request.headers.get("accept-encoding"));
207
- return new Response(result.body ? (result.body as unknown as BodyInit) : null, {
227
+ return new Response(staticBodyToInit(result.body), {
208
228
  status: result.status,
209
229
  headers: result.headers,
210
230
  });
@@ -241,6 +261,38 @@ export function createGatewayApp(deps: GatewayAppDeps) {
241
261
  deps.mode === "production" ? deps.shutdownCoordinator : undefined,
242
262
  );
243
263
  deps.runtimeMetricsSampler?.bindInFlight(() => requestStateStore.inFlightCount());
264
+ // G-03 InvokeGuard: expose the proxy plane's live in-flight count as the
265
+ // "foreground busy" source the scheduled worker registry consults before a
266
+ // tick. Bound once here, where the request store exists; a proxy invoke in
267
+ // progress (or a page-open console poll) keeps background sweeps from
268
+ // contending for the single event loop.
269
+ setProxyBusySource(() => requestStateStore.inFlightCount() > 0);
270
+ // Vision handoff runs as an internal sub-dispatch when the tenant configured
271
+ // an ordered list of vision models. Wire the preparer's runner here, where
272
+ // the request state store and the full dispatch dependency surface exist.
273
+ if (deps.mode === "production") {
274
+ deps.proxyPreparer.bindVisionHandoff(async (input) => {
275
+ const models = await resolveTenantVisionHandoffModels(
276
+ deps.db,
277
+ input.authorization.tenantId,
278
+ );
279
+ if (models.length === 0) return [];
280
+ const runnerDeps: VisionHandoffDeps = {
281
+ db: deps.db,
282
+ stateStore: requestStateStore,
283
+ proxyPreparer: deps.proxyPreparer,
284
+ resolveProviderAdapter: deps.resolveProviderAdapter,
285
+ byokUpstreamHosts: deps.byokUpstreamHosts,
286
+ networkBindingFactory: deps.networkBindingFactory,
287
+ snapshotService: deps.snapshotService,
288
+ telemetryBuffer: deps.telemetryBuffer,
289
+ resolveOAuthRefresher: deps.resolveOAuthRefresher,
290
+ oauthRefreshService: deps.oauthRefreshService,
291
+ poolSelector: deps.poolSelector,
292
+ };
293
+ return tryVisionHandoff(runnerDeps, input, models);
294
+ });
295
+ }
244
296
  // Shutdown ordering: abort in-flight proxy controllers first so the
245
297
  // bounded drain observes cancellation and finalizers run before
246
298
  // telemetry flush and pool close. The reason is threaded through so the
@@ -635,6 +687,10 @@ export function createGatewayApp(deps: GatewayAppDeps) {
635
687
  stateStore: requestStateStore,
636
688
  resolvePeerAddress: (request) => peerAddresses.get(request) ?? null,
637
689
  trustedProxyBoundary: deps.trustedProxyBoundary,
690
+ // The update apply route drains through the process coordinator
691
+ // before exiting, so the destructive path cannot skip telemetry
692
+ // flush and pool close.
693
+ shutdownCoordinator: deps.shutdownCoordinator,
638
694
  }),
639
695
  );
640
696
  }