cartethyia 2.7.9 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (496) hide show
  1. package/.env.example +6 -5
  2. package/dist/dashboard/assets/{BannedPage-BxoG1MrL.js → BannedPage-Dq530awD.js} +1 -1
  3. package/dist/dashboard/assets/BannedPage-Dq530awD.js.gz +0 -0
  4. package/dist/dashboard/assets/{CliToolDetailPage-ixwgKk53.js → CliToolDetailPage-DZzaS-7S.js} +1 -1
  5. package/dist/dashboard/assets/CliToolDetailPage-DZzaS-7S.js.gz +0 -0
  6. package/dist/dashboard/assets/{CliToolsPage-BmttNV3U.js → CliToolsPage-DaZZ3cqP.js} +1 -1
  7. package/dist/dashboard/assets/CliToolsPage-DaZZ3cqP.js.gz +0 -0
  8. package/dist/dashboard/assets/{CombosPage-BE3qwwfC.js → CombosPage-BlC_xdkX.js} +1 -1
  9. package/dist/dashboard/assets/CombosPage-BlC_xdkX.js.gz +0 -0
  10. package/dist/dashboard/assets/{ConsoleLogPage-CRZdmMIX.js → ConsoleLogPage-D-rqeVtG.js} +1 -1
  11. package/dist/dashboard/assets/ConsoleLogPage-D-rqeVtG.js.gz +0 -0
  12. package/dist/dashboard/assets/{CustomizationPage-Dv_FJ6Er.js → CustomizationPage-7xT5yg2E.js} +1 -1
  13. package/dist/dashboard/assets/CustomizationPage-7xT5yg2E.js.gz +0 -0
  14. package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js +1 -0
  15. package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js.gz +0 -0
  16. package/dist/dashboard/assets/{InjectSystemPromptPanel-BOoO8rpz.js → InjectSystemPromptPanel-6Teoq9Se.js} +2 -2
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-6Teoq9Se.js.gz +0 -0
  18. package/dist/dashboard/assets/{LoginPage-ChJuNNVN.js → LoginPage-CZuI0MAR.js} +1 -1
  19. package/dist/dashboard/assets/LoginPage-CZuI0MAR.js.gz +0 -0
  20. package/dist/dashboard/assets/{ModelPicker-BZAJtPg1.js → ModelPicker-C1hNTlkr.js} +1 -1
  21. package/dist/dashboard/assets/ModelPicker-C1hNTlkr.js.gz +0 -0
  22. package/dist/dashboard/assets/{OverviewPage-BE40s3u5.js → OverviewPage-0yfhSI1C.js} +1 -1
  23. package/dist/dashboard/assets/OverviewPage-0yfhSI1C.js.gz +0 -0
  24. package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js +8 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js.gz +0 -0
  26. package/dist/dashboard/assets/{ProviderIcon-CQ6bPUf_.js → ProviderIcon-Ddhm1InL.js} +1 -1
  27. package/dist/dashboard/assets/ProviderIcon-Ddhm1InL.js.gz +0 -0
  28. package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js +1 -0
  29. package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js.gz +0 -0
  30. package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js +9 -0
  31. package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js.gz +0 -0
  32. package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js +1 -0
  33. package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js.gz +0 -0
  34. package/dist/dashboard/assets/{SettingsPage-C5HPWqEv.js → SettingsPage-BzZAvYSX.js} +1 -1
  35. package/dist/dashboard/assets/SettingsPage-BzZAvYSX.js.gz +0 -0
  36. package/dist/dashboard/assets/{SetupPage-CFNcATJJ.js → SetupPage--s-EfEIL.js} +1 -1
  37. package/dist/dashboard/assets/SetupPage--s-EfEIL.js.gz +0 -0
  38. package/dist/dashboard/assets/{StudioPage-YoD4tY5l.js → StudioPage-BjXFGSK4.js} +1 -1
  39. package/dist/dashboard/assets/StudioPage-BjXFGSK4.js.gz +0 -0
  40. package/dist/dashboard/assets/{UsagePage-DxjaAhb_.js → UsagePage-CP8F8BN7.js} +1 -1
  41. package/dist/dashboard/assets/UsagePage-CP8F8BN7.js.gz +0 -0
  42. package/dist/dashboard/assets/{api-keys-BTlkq_Uk.js → api-keys-2hc12Uz2.js} +1 -1
  43. package/dist/dashboard/assets/api-keys-2hc12Uz2.js.gz +0 -0
  44. package/dist/dashboard/assets/app-DGXbNfAR.css +2 -0
  45. package/dist/dashboard/assets/app-DGXbNfAR.css.gz +0 -0
  46. package/dist/dashboard/assets/assert-BMcj1xZE.js +1 -0
  47. package/dist/dashboard/assets/assert-BMcj1xZE.js.gz +0 -0
  48. package/dist/dashboard/assets/{badge-DdbT_7Am.js → badge-DkRUuVfz.js} +1 -1
  49. package/dist/dashboard/assets/badge-DkRUuVfz.js.gz +0 -0
  50. package/dist/dashboard/assets/{banner-CsGN-nbm.js → banner-CDjW841Q.js} +1 -1
  51. package/dist/dashboard/assets/banner-CDjW841Q.js.gz +0 -0
  52. package/dist/dashboard/assets/{card-mgZ_TLLZ.js → card-Bto5UlL9.js} +1 -1
  53. package/dist/dashboard/assets/card-Bto5UlL9.js.gz +0 -0
  54. package/dist/dashboard/assets/{cli-tools-A1-v8-03.js → cli-tools-DaH6g9hL.js} +1 -1
  55. package/dist/dashboard/assets/cli-tools-DaH6g9hL.js.gz +0 -0
  56. package/dist/dashboard/assets/{clipboard-button-CJ4Zty89.js → clipboard-button-BYKBCzjk.js} +1 -1
  57. package/dist/dashboard/assets/clipboard-button-BYKBCzjk.js.gz +0 -0
  58. package/dist/dashboard/assets/{dialog-B5L2jPQ_.js → dialog-DL0Zftwv.js} +1 -1
  59. package/dist/dashboard/assets/dialog-DL0Zftwv.js.gz +0 -0
  60. package/dist/dashboard/assets/{drawer-DkjUouAj.js → drawer-Dpx_UXaS.js} +1 -1
  61. package/dist/dashboard/assets/drawer-Dpx_UXaS.js.gz +0 -0
  62. package/dist/dashboard/assets/{entry-B-LVLV6o.js → entry-BV7-1NoM.js} +1 -1
  63. package/dist/dashboard/assets/entry-BV7-1NoM.js.gz +0 -0
  64. package/dist/dashboard/assets/{entry-CAhdYl3B.js → entry-CGvdNU6r.js} +1 -1
  65. package/dist/dashboard/assets/entry-CGvdNU6r.js.gz +0 -0
  66. package/dist/dashboard/assets/entry-DScKYvZj.js +4 -0
  67. package/dist/dashboard/assets/entry-DScKYvZj.js.gz +0 -0
  68. package/dist/dashboard/assets/{formatters-CrsdLVsn.js → formatters-BS3DZlZj.js} +1 -1
  69. package/dist/dashboard/assets/formatters-BS3DZlZj.js.gz +0 -0
  70. package/dist/dashboard/assets/{index-BU64Lqvp.js → index-SQnvvTWX.js} +2 -2
  71. package/dist/dashboard/assets/index-SQnvvTWX.js.gz +0 -0
  72. package/dist/dashboard/assets/{inline-B2aDLyyg.js → inline-Dl-cuLK0.js} +1 -1
  73. package/dist/dashboard/assets/inline-Dl-cuLK0.js.gz +0 -0
  74. package/dist/dashboard/assets/{input-BCVkdR9d.js → input-Bfx0EzRc.js} +1 -1
  75. package/dist/dashboard/assets/input-Bfx0EzRc.js.gz +0 -0
  76. package/dist/dashboard/assets/{layout-DNcAdMK-.js → layout-BxhbQ_JS.js} +1 -1
  77. package/dist/dashboard/assets/layout-BxhbQ_JS.js.gz +0 -0
  78. package/dist/dashboard/assets/{list-row-DgrIH0hw.js → list-row-D49Y4ptn.js} +1 -1
  79. package/dist/dashboard/assets/list-row-D49Y4ptn.js.gz +0 -0
  80. package/dist/dashboard/assets/{live-Cae01iu8.js → live-CbVTdX9V.js} +1 -1
  81. package/dist/dashboard/assets/live-CbVTdX9V.js.gz +0 -0
  82. package/dist/dashboard/assets/{network-CRib7H_2.js → network-JGvDveof.js} +1 -1
  83. package/dist/dashboard/assets/network-JGvDveof.js.gz +0 -0
  84. package/dist/dashboard/assets/{numbers-BKQE8Xpz.js → numbers-Dw6kiew-.js} +1 -1
  85. package/dist/dashboard/assets/numbers-Dw6kiew-.js.gz +0 -0
  86. package/dist/dashboard/assets/{pagination-ecPvG_8g.js → pagination-iUoI8GeE.js} +1 -1
  87. package/dist/dashboard/assets/pagination-iUoI8GeE.js.gz +0 -0
  88. package/dist/dashboard/assets/providers/sensenova-intl.png +0 -0
  89. package/dist/dashboard/assets/providers/sensenova.png +0 -0
  90. package/dist/dashboard/assets/providers/zro.svg +3 -0
  91. package/dist/dashboard/assets/providers/zro.svg.gz +0 -0
  92. package/dist/dashboard/assets/quota-DiPD6UKH.js +1 -0
  93. package/dist/dashboard/assets/quota-DiPD6UKH.js.gz +0 -0
  94. package/dist/dashboard/assets/{routing-Ckm1UXuC.js → routing-8jZr-3WE.js} +1 -1
  95. package/dist/dashboard/assets/routing-8jZr-3WE.js.gz +0 -0
  96. package/dist/dashboard/assets/{select-ChoFWyKz.js → select-oO1FxMVb.js} +2 -2
  97. package/dist/dashboard/assets/select-oO1FxMVb.js.gz +0 -0
  98. package/dist/dashboard/assets/{settings-CKjFPlKW.js → settings-CLr3kdIx.js} +1 -1
  99. package/dist/dashboard/assets/settings-CLr3kdIx.js.gz +0 -0
  100. package/dist/dashboard/assets/{stack-DWCwU3fh.js → stack-Y3pDteZr.js} +1 -1
  101. package/dist/dashboard/assets/stack-Y3pDteZr.js.gz +0 -0
  102. package/dist/dashboard/assets/{state-Cg3VL5J_.js → state-CArX_Iak.js} +1 -1
  103. package/dist/dashboard/assets/state-CArX_Iak.js.gz +0 -0
  104. package/dist/dashboard/assets/{switch-Db70BMix.js → switch-DwlwmDO-.js} +1 -1
  105. package/dist/dashboard/assets/switch-DwlwmDO-.js.gz +0 -0
  106. package/dist/dashboard/assets/{useMutation-BqdE0LuM.js → useMutation-DJ9GYEgf.js} +1 -1
  107. package/dist/dashboard/assets/useMutation-DJ9GYEgf.js.gz +0 -0
  108. package/dist/dashboard/index.html +2 -2
  109. package/dist/dashboard/index.html.gz +0 -0
  110. package/dist/dashboard/precompressed-assets.json +54 -53
  111. package/migrations/full-postgres/0046_add_accounts_quota_plan_fetched_at.sql +7 -0
  112. package/migrations/full-postgres/0047_add_provider_device_flow_proxy.sql +17 -0
  113. package/migrations/lite-sqlite3/0046_add_accounts_quota_plan_fetched_at.sql +4 -0
  114. package/migrations/lite-sqlite3/0047_add_provider_device_flow_proxy.sql +19 -0
  115. package/package.json +1 -1
  116. package/src/boot/app.ts +11 -14
  117. package/src/boot/dependencies.ts +5 -7
  118. package/src/boot/flush.ts +20 -0
  119. package/src/boot/lifecycle.ts +7 -5
  120. package/src/config/providers.ts +6 -5
  121. package/src/config/routing.ts +26 -0
  122. package/src/config/spec-metadata.ts +72 -0
  123. package/src/config/spec.ts +28 -8
  124. package/src/console/api-keys/contracts.ts +12 -1
  125. package/src/console/api-keys/routes.ts +40 -28
  126. package/src/console/auth/account-reset.ts +7 -9
  127. package/src/console/backup/contracts.ts +4 -0
  128. package/src/console/backup/export-endpoint.ts +7 -5
  129. package/src/console/backup/nine-router.ts +71 -10
  130. package/src/console/backup/service.ts +8 -1
  131. package/src/console/cli-tools/service.ts +6 -12
  132. package/src/console/console-router-guards.ts +23 -16
  133. package/src/console/console-router.ts +1 -1
  134. package/src/console/domain-registration.ts +7 -4
  135. package/src/console/inferhub/client.ts +1 -1
  136. package/src/console/inferhub/normalize.ts +24 -28
  137. package/src/console/inferhub/types.ts +3 -0
  138. package/src/console/ip-bans/routes.ts +7 -13
  139. package/src/console/observability/live.ts +2 -2
  140. package/src/console/observability/store.ts +0 -53
  141. package/src/console/providers/catalog/contracts.ts +9 -3
  142. package/src/console/providers/catalog/model-operations.ts +2 -3
  143. package/src/console/providers/catalog/provider-operations.ts +1 -1
  144. package/src/console/providers/catalog/routes.ts +3 -2
  145. package/src/console/providers/catalog/store.ts +1914 -1902
  146. package/src/console/providers/detail/routes.ts +1 -0
  147. package/src/console/providers/detail/store.ts +4 -0
  148. package/src/console/providers/oauth/callback-listener.ts +30 -11
  149. package/src/console/providers/oauth/device-egress.ts +123 -0
  150. package/src/console/providers/oauth/routes.ts +123 -16
  151. package/src/console/quota/account-quota-global.ts +14 -24
  152. package/src/console/quota/account-quota-shared.ts +49 -0
  153. package/src/console/quota/account-quota-tenant.ts +11 -23
  154. package/src/console/quota/account-test-egress.ts +2 -2
  155. package/src/console/quota/daily-growth-job.ts +1 -1
  156. package/src/console/quota/quota-view.ts +19 -3
  157. package/src/console/routing/pools/contracts.ts +1 -1
  158. package/src/console/routing/pools/operations.ts +32 -47
  159. package/src/console/routing/pools/probe-verdict.ts +2 -2
  160. package/src/console/routing/pools/relay-deploy.ts +1 -1
  161. package/src/console/routing/pools/store.ts +4 -4
  162. package/src/console/shared/errors.ts +33 -6
  163. package/src/main.ts +2 -3
  164. package/src/network/client.ts +67 -0
  165. package/src/network/egress/bidi-session.ts +322 -0
  166. package/src/network/egress/dial.ts +201 -0
  167. package/src/network/egress/factory.ts +191 -0
  168. package/src/network/{outbound-fetch.ts → egress/fetch.ts} +195 -29
  169. package/src/network/egress/tls-profile.ts +123 -0
  170. package/src/network/egress/ws.ts +175 -0
  171. package/src/network/pool/{byte-accounting.ts → accounting.ts} +3 -2
  172. package/src/network/{types.ts → pool/agent-config.ts} +1 -1
  173. package/src/network/pool/agent.ts +2 -2
  174. package/src/network/{pool-cooldown-store.ts → pool/cooldown-store.ts} +95 -20
  175. package/src/network/{pool-health-machine.ts → pool/health.ts} +205 -6
  176. package/src/network/pool/resolver.ts +10 -849
  177. package/src/network/pool/selector.ts +184 -41
  178. package/src/network/ssrf.ts +7 -7
  179. package/src/network/{retry.ts → util/retry.ts} +1 -1
  180. package/src/network/{rate-limit-verdict.ts → verdict.ts} +1 -1
  181. package/src/observability/event-log.ts +7 -361
  182. package/src/observability/performance-metrics.ts +9 -0
  183. package/src/observability/runtime-metrics.ts +14 -9
  184. package/src/observability/telemetry-buffer.ts +16 -26
  185. package/src/observability/telemetry-reconciliation.ts +9 -37
  186. package/src/observability/telemetry-row.ts +125 -0
  187. package/src/persistence/db-mode.ts +4 -1
  188. package/src/persistence/dialect.ts +18 -0
  189. package/src/persistence/migrate.ts +6 -3
  190. package/src/persistence/schema.ts +17 -0
  191. package/src/persistence/ttl-cache.ts +21 -3
  192. package/src/protocol/codecs.ts +59 -2
  193. package/src/protocol/dsml.ts +34 -86
  194. package/src/protocol/markup-stream-parser.ts +195 -0
  195. package/src/protocol/reasoning-text.ts +19 -0
  196. package/src/protocol/request/chat.ts +10 -10
  197. package/src/protocol/request/gemini.ts +8 -2
  198. package/src/protocol/request/messages.ts +34 -22
  199. package/src/protocol/response/chat.ts +12 -20
  200. package/src/protocol/response/messages.ts +34 -7
  201. package/src/protocol/response/omp-tool-call-markup.ts +43 -86
  202. package/src/protocol/response/responses.ts +18 -2
  203. package/src/protocol/stop-reason.ts +23 -1
  204. package/src/protocol/think-split.ts +112 -0
  205. package/src/protocol/translation/dialect/qwen.ts +26 -58
  206. package/src/protocol/translation/quirks.ts +15 -0
  207. package/src/protocol/upstream/send-claude-messages.ts +2 -2
  208. package/src/providers/adapters/compatible-adapter.ts +76 -12
  209. package/src/providers/authentication/oauth-client.ts +40 -6
  210. package/src/providers/authentication/oauth-device-flow.ts +105 -11
  211. package/src/providers/authentication/oauth-flow-store.ts +82 -1
  212. package/src/providers/authentication/oauth-refresh-service.ts +766 -758
  213. package/src/providers/configured-provider.ts +148 -0
  214. package/src/providers/default-registry.ts +137 -36
  215. package/src/providers/discovery/discovery-types.ts +7 -0
  216. package/src/providers/discovery/probe-phases.ts +20 -6
  217. package/src/providers/discovery/probing-service.ts +22 -2
  218. package/src/providers/integrations/alibabacp/alibabacp-models.ts +1 -2
  219. package/src/providers/integrations/{dashscope-models.ts → alibabacp/dashscope-models.ts} +2 -2
  220. package/src/providers/integrations/antigravity/antigravity-protocol.ts +16 -1
  221. package/src/providers/integrations/buddy/account.ts +969 -0
  222. package/src/providers/integrations/buddy/capabilities.ts +12 -12
  223. package/src/providers/integrations/buddy/{buddy-catalog-shared.ts → catalog.ts} +198 -136
  224. package/src/providers/integrations/buddy/{buddy-chat-shared.ts → chat.ts} +176 -20
  225. package/src/providers/integrations/buddy/codebuddy/index.ts +429 -0
  226. package/src/providers/integrations/buddy/codebuddy/shared.ts +41 -26
  227. package/src/providers/integrations/buddy/headers.ts +311 -0
  228. package/src/providers/integrations/buddy/lifecycle.ts +1018 -0
  229. package/src/providers/integrations/buddy/{buddy-media.ts → media.ts} +1 -1
  230. package/src/providers/integrations/claude/claude-quota.ts +14 -17
  231. package/src/providers/integrations/cline/cline-oauth.ts +10 -5
  232. package/src/providers/integrations/cline/cline.ts +5 -6
  233. package/src/providers/integrations/clixad/clixad-oauth.ts +98 -0
  234. package/src/providers/integrations/clixad/clixad-quota.ts +132 -0
  235. package/src/providers/integrations/clixad/provider.ts +145 -0
  236. package/src/providers/integrations/codex/codex-oauth.ts +8 -5
  237. package/src/providers/integrations/commandcode/quota.ts +22 -28
  238. package/src/providers/integrations/cursor/cursor-auth.ts +1 -9
  239. package/src/providers/integrations/cursor/cursor-exec.ts +9 -2
  240. package/src/providers/integrations/cursor/cursor-hardening.ts +279 -0
  241. package/src/providers/integrations/cursor/cursor-http2.ts +605 -6
  242. package/src/providers/integrations/cursor/cursor-request.ts +26 -12
  243. package/src/providers/integrations/cursor/cursor-shared.ts +8 -5
  244. package/src/providers/integrations/cursor/cursor.ts +574 -110
  245. package/src/providers/integrations/cursor/protocol/messages.ts +22 -29
  246. package/src/providers/integrations/cursor/protocol/protobuf-schema.ts +37 -0
  247. package/src/providers/integrations/deepai/deepai-catalog.ts +149 -0
  248. package/src/providers/integrations/deepai/deepai-common.ts +145 -0
  249. package/src/providers/integrations/deepai/deepai-oauth.ts +129 -0
  250. package/src/providers/integrations/deepai/deepai-quota.ts +97 -0
  251. package/src/providers/integrations/deepai/provider.ts +42 -0
  252. package/src/providers/integrations/devin/devin-auth.ts +7 -0
  253. package/src/providers/integrations/devin/protocol/devin-proto.ts +1 -27
  254. package/src/providers/integrations/factory/factory-oauth.ts +33 -51
  255. package/src/providers/integrations/freebuff/assets/official-system-manager.txt +88 -0
  256. package/src/providers/integrations/freebuff/assets/official-system-worker.txt +57 -0
  257. package/src/providers/integrations/freebuff/assets/official-tools.json +1070 -0
  258. package/src/providers/integrations/freebuff/freebuff-catalog.ts +120 -0
  259. package/src/providers/integrations/freebuff/freebuff-constants.ts +1233 -0
  260. package/src/providers/integrations/freebuff/freebuff-discovery.ts +108 -0
  261. package/src/providers/integrations/freebuff/freebuff-oauth.ts +240 -0
  262. package/src/providers/integrations/freebuff/freebuff-quota.ts +260 -0
  263. package/src/providers/integrations/freebuff/freebuff-virtual.ts +89 -0
  264. package/src/providers/integrations/freebuff/freebuff.ts +682 -0
  265. package/src/providers/integrations/freepi/freepi-catalog.ts +5 -0
  266. package/src/providers/integrations/freepi/freepi-discovery.ts +2 -2
  267. package/src/providers/integrations/freepi/freepi-headers.ts +2 -2
  268. package/src/providers/integrations/freepi/freepi-protocol.ts +11 -2
  269. package/src/providers/integrations/freepi/freepi-realm.ts +0 -3
  270. package/src/providers/integrations/freepi/freepi-session.ts +158 -0
  271. package/src/providers/integrations/freepi/freepi.ts +80 -54
  272. package/src/providers/integrations/github/github-discovery.ts +30 -13
  273. package/src/providers/integrations/github/github-oauth.ts +217 -44
  274. package/src/providers/integrations/github/github-quota.ts +22 -5
  275. package/src/providers/integrations/github/github.ts +40 -32
  276. package/src/providers/integrations/grok/grok-oauth.ts +52 -49
  277. package/src/providers/integrations/grok/grok-ratelimit-store.ts +10 -17
  278. package/src/providers/integrations/grok/grok-turn-index.ts +11 -16
  279. package/src/providers/integrations/hermes/hermes-oauth.ts +3 -3
  280. package/src/providers/integrations/{hermes.ts → hermes/hermes.ts} +42 -13
  281. package/src/providers/integrations/hermes/index.ts +2 -0
  282. package/src/providers/integrations/kilo/kilo-oauth.ts +4 -4
  283. package/src/providers/integrations/kilo/kilo.ts +1 -1
  284. package/src/providers/integrations/kimi/kimi-oauth.ts +3 -3
  285. package/src/providers/integrations/kiro/kiro-catalog.ts +17 -1
  286. package/src/providers/integrations/kiro/kiro-discovery.ts +10 -12
  287. package/src/providers/integrations/kiro/kiro-oauth.ts +2 -2
  288. package/src/providers/integrations/kiro/kiro-quota.ts +8 -4
  289. package/src/providers/integrations/kiro/kiro.ts +15 -19
  290. package/src/providers/integrations/muse/muse-oauth.ts +5 -5
  291. package/src/providers/integrations/ollamacloud/index.ts +2 -0
  292. package/src/providers/integrations/{ollamacloud-models.ts → ollamacloud/models.ts} +2 -2
  293. package/src/providers/integrations/{ollamacloud-quota.ts → ollamacloud/quota.ts} +3 -3
  294. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  295. package/src/providers/integrations/opencode/opencode-go-quota.ts +2 -8
  296. package/src/providers/integrations/openrouter/provider.ts +1 -1
  297. package/src/providers/integrations/perch/perch-credential.ts +25 -0
  298. package/src/providers/integrations/perch/perch-protocol.ts +0 -6
  299. package/src/providers/integrations/perch/perch-quota.ts +2 -16
  300. package/src/providers/integrations/perch/perch.ts +6 -16
  301. package/src/providers/integrations/qoder/claim-qoder-credits.ts +19 -60
  302. package/src/providers/integrations/qoder/qoder-adapter.ts +20 -125
  303. package/src/providers/integrations/qoder/qoder-auth.ts +109 -30
  304. package/src/providers/integrations/qoder/qoder-catalog.ts +21 -6
  305. package/src/providers/integrations/qoder/qoder-chat.ts +32 -29
  306. package/src/providers/integrations/qoder/qoder-checkin.ts +5 -5
  307. package/src/providers/integrations/qoder/qoder-cosy.ts +37 -9
  308. package/src/providers/integrations/qoder/qoder-oauth.ts +9 -2
  309. package/src/providers/integrations/qoder/qoder-realm.ts +13 -36
  310. package/src/providers/integrations/qoder/qoder-sse.ts +447 -68
  311. package/src/providers/integrations/qoder/qoder-types.ts +9 -0
  312. package/src/providers/integrations/qoder/qoder.ts +3 -26
  313. package/src/providers/integrations/sensenova/provider.ts +144 -0
  314. package/src/providers/integrations/trae/trae-protocol.ts +9 -5
  315. package/src/providers/integrations/trae/trae-quota.ts +21 -29
  316. package/src/providers/integrations/trae/trae-realm.ts +38 -0
  317. package/src/providers/integrations/trae/trae.ts +7 -24
  318. package/src/providers/integrations/vercel/provider.ts +117 -0
  319. package/src/providers/integrations/vercel/vercel-quota.ts +96 -0
  320. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  321. package/src/providers/integrations/zcode-start-plan/gifts.ts +1 -1
  322. package/src/providers/integrations/zcode-start-plan/oauth.ts +3 -3
  323. package/src/providers/integrations/zcode-start-plan/provider.ts +226 -23
  324. package/src/providers/integrations/zcode-start-plan/quota.ts +19 -2
  325. package/src/providers/integrations/zro/zro.ts +205 -0
  326. package/src/providers/operations/account-error-classification.ts +199 -307
  327. package/src/providers/operations/account-health-service.ts +82 -1
  328. package/src/providers/operations/account-refresh-status.ts +36 -37
  329. package/src/providers/operations/account-tier.ts +15 -16
  330. package/src/providers/operations/client-version-resolver.ts +1 -1
  331. package/src/providers/operations/client-versions.ts +100 -81
  332. package/src/providers/operations/cooldown-rules.ts +11 -16
  333. package/src/providers/operations/oauth-refresh-lead.ts +46 -22
  334. package/src/providers/operations/{model-catalog-cache.ts → provider-caches.ts} +68 -16
  335. package/src/providers/operations/provider-catalog-service.ts +1 -1
  336. package/src/providers/operations/provider-credential-service.ts +118 -51
  337. package/src/providers/operations/provider-rules/github.ts +48 -0
  338. package/src/providers/operations/provider-rules/grok.ts +33 -0
  339. package/src/providers/operations/provider-rules/inception.ts +49 -0
  340. package/src/providers/operations/provider-rules/index.ts +32 -0
  341. package/src/providers/operations/provider-rules/perch.ts +37 -0
  342. package/src/providers/operations/provider-rules/qoder.ts +70 -0
  343. package/src/providers/operations/provider-rules/trae.ts +81 -0
  344. package/src/providers/operations/session-resolution.ts +17 -1
  345. package/src/providers/provider-contracts.ts +6 -4
  346. package/src/providers/{provider-credential-resolver.ts → provider-credentials.ts} +40 -3
  347. package/src/providers/provider-metadata.ts +70 -10
  348. package/src/providers/provider-probe.ts +15 -1
  349. package/src/providers/provider-registry.ts +42 -33
  350. package/src/providers/quota/quota-contracts.ts +2 -0
  351. package/src/providers/quota/quota-limit-windows.ts +16 -5
  352. package/src/providers/quota/quota-support.ts +1 -1
  353. package/src/providers/quota/quota-window-parser.ts +90 -18
  354. package/src/providers/quota/refresh.ts +100 -21
  355. package/src/security/api-key-auth-cache.ts +1 -1
  356. package/src/security/api-key-auth.ts +6 -2
  357. package/src/security/ip-boundary.ts +1 -1
  358. package/src/transport/dispatch/attempt-finalize.ts +15 -14
  359. package/src/transport/dispatch/attempt-loop.ts +73 -19
  360. package/src/transport/dispatch/generation.ts +2 -8
  361. package/src/transport/dispatch/handler-deps.ts +1 -1
  362. package/src/transport/dispatch/leases.ts +1 -1
  363. package/src/transport/dispatch/native-shared.ts +25 -0
  364. package/src/transport/dispatch/proxy-request.ts +8 -46
  365. package/src/transport/dispatch/responses-compact.ts +2 -8
  366. package/src/transport/dispatch/retry-policy.ts +1 -1
  367. package/src/transport/dispatch/streaming/finalize.ts +10 -7
  368. package/src/transport/dispatch/streaming/stream.ts +9 -37
  369. package/src/transport/dispatch/systemone.ts +2 -8
  370. package/src/transport/dispatch/token-count.ts +2 -6
  371. package/src/transport/dispatch/upstream.ts +63 -0
  372. package/src/transport/drain-endpoint.ts +31 -4
  373. package/src/transport/failure-policy.ts +16 -30
  374. package/src/transport/guards/body-policy.ts +7 -1
  375. package/src/transport/guards/error-lifecycle.ts +13 -1
  376. package/src/transport/guards/request-context.ts +22 -14
  377. package/src/transport/request/preparer.ts +81 -71
  378. package/src/transport/routing/bounded-lru.ts +14 -0
  379. package/src/transport/routing/drain-reserve.ts +129 -0
  380. package/src/transport/routing/plan-gate.ts +7 -1
  381. package/src/transport/routing/round-robin.ts +60 -0
  382. package/src/transport/routing/route-catalog.ts +123 -111
  383. package/src/transport/routing/route-model.ts +51 -9
  384. package/src/transport/routing/router.ts +393 -32
  385. package/src/transport/shutdown-notice.ts +1 -1
  386. package/src/transport/surface/adapters.ts +11 -2
  387. package/src/transport/surface/chat/adapter.ts +2 -2
  388. package/src/transport/surface/chat/encode.ts +47 -4
  389. package/src/transport/surface/chat/parse.ts +2 -12
  390. package/src/transport/surface/completion.ts +44 -33
  391. package/src/transport/surface/content-parts.ts +21 -0
  392. package/src/transport/surface/messages/adapter.ts +7 -1
  393. package/src/transport/surface/messages/encode.ts +11 -3
  394. package/src/transport/surface/messages/parse.ts +2 -1
  395. package/src/transport/surface/messages/stream.ts +33 -17
  396. package/src/transport/surface/responses/encode.ts +22 -5
  397. package/src/transport/surface/responses/parse.ts +3 -11
  398. package/src/workers/buddy-growth-tasks.ts +8 -8
  399. package/src/workers/daily-checkin.ts +4 -4
  400. package/src/workers/quota-refresh-sweep.ts +1 -1
  401. package/src/workers/zcode-gift-claim.ts +1 -1
  402. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
  403. package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
  404. package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
  405. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
  406. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
  407. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
  408. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +0 -1
  409. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
  410. package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
  411. package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
  412. package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
  413. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
  414. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +0 -8
  415. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
  416. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
  417. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +0 -1
  418. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
  419. package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js +0 -9
  420. package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
  421. package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js +0 -1
  422. package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
  423. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
  424. package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
  425. package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
  426. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
  427. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
  428. package/dist/dashboard/assets/app-BX2nnKqs.css +0 -2
  429. package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
  430. package/dist/dashboard/assets/assert-CndthXFQ.js +0 -1
  431. package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
  432. package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
  433. package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
  434. package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
  435. package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
  436. package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
  437. package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
  438. package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
  439. package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
  440. package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
  441. package/dist/dashboard/assets/entry-D2xD0Tmd.js +0 -4
  442. package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
  443. package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
  444. package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
  445. package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
  446. package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
  447. package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
  448. package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
  449. package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
  450. package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
  451. package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
  452. package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
  453. package/dist/dashboard/assets/quota-DJ1QlAOq.js +0 -1
  454. package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
  455. package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
  456. package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
  457. package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
  458. package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
  459. package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
  460. package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
  461. package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
  462. package/src/network/pool-health.ts +0 -210
  463. package/src/providers/bundled-discovery-providers.ts +0 -98
  464. package/src/providers/configured-openai-providers.ts +0 -120
  465. package/src/providers/integrations/buddy/buddy-checkin.ts +0 -521
  466. package/src/providers/integrations/buddy/buddy-cli-headers.ts +0 -76
  467. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -130
  468. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +0 -234
  469. package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -496
  470. package/src/providers/integrations/buddy/buddy-identity.ts +0 -300
  471. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +0 -341
  472. package/src/providers/integrations/buddy/buddy-quota-shared.ts +0 -417
  473. package/src/providers/integrations/buddy/buddy-server-tools.ts +0 -240
  474. package/src/providers/integrations/buddy/buddy-usage-shared.ts +0 -221
  475. package/src/providers/integrations/buddy/buddy-usage-store.ts +0 -181
  476. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +0 -37
  477. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +0 -185
  478. package/src/providers/integrations/buddy/codebuddy/oauth.ts +0 -47
  479. package/src/providers/integrations/buddy/codebuddy/provider.ts +0 -175
  480. package/src/providers/integrations/buddy/codebuddy/quota.ts +0 -154
  481. package/src/providers/integrations/qoder/chat-proto.ts +0 -328
  482. package/src/providers/integrations/qoder/qoder-grpc.ts +0 -871
  483. package/src/providers/integrations/qoder/qoder-ide.ts +0 -588
  484. package/src/providers/operations/model-discovery-cache.ts +0 -34
  485. package/src/providers/operations/probe-fetch.ts +0 -15
  486. package/src/providers/operations/provider-version-cache.ts +0 -30
  487. package/src/providers/provider-capabilities.ts +0 -33
  488. package/src/providers/provider-credential-envelope.ts +0 -43
  489. /package/dist/dashboard/assets/{app-B7kIWFm5.js → app-C0gTXEoN.js} +0 -0
  490. /package/dist/dashboard/assets/{app-B7kIWFm5.js.gz → app-C0gTXEoN.js.gz} +0 -0
  491. /package/src/network/{http2-bidi.ts → bidi.ts} +0 -0
  492. /package/src/network/pool/{pool-scripts.ts → scripts.ts} +0 -0
  493. /package/src/network/pool/{pool-state.ts → state.ts} +0 -0
  494. /package/src/network/{backoff.ts → util/backoff.ts} +0 -0
  495. /package/src/network/{deduplication.ts → util/dedupe.ts} +0 -0
  496. /package/src/network/{ip-utils.ts → util/ip.ts} +0 -0
@@ -1,77 +1,77 @@
1
1
  {
2
- "count": 121,
2
+ "count": 122,
3
3
  "assets": [
4
- "assets/BannedPage-BxoG1MrL.js",
5
- "assets/CliToolDetailPage-ixwgKk53.js",
6
- "assets/CliToolsPage-BmttNV3U.js",
7
- "assets/CombosPage-BE3qwwfC.js",
8
- "assets/ConsoleLogPage-CRZdmMIX.js",
9
- "assets/CustomizationPage-Dv_FJ6Er.js",
10
- "assets/HealthEventsModal-CoVrw2sM.js",
11
- "assets/InjectSystemPromptPanel-BOoO8rpz.js",
12
- "assets/LoginPage-ChJuNNVN.js",
13
- "assets/ModelPicker-BZAJtPg1.js",
14
- "assets/OverviewPage-BE40s3u5.js",
15
- "assets/ProviderDetailPage-sfLoQtPV.js",
16
- "assets/ProviderIcon-CQ6bPUf_.js",
17
- "assets/ProvidersPage-DcepmPWo.js",
18
- "assets/ProxyPage-BJ87Pp0U.js",
19
- "assets/QuotaPage-gkSyRAKa.js",
20
- "assets/SettingsPage-C5HPWqEv.js",
21
- "assets/SetupPage-CFNcATJJ.js",
22
- "assets/StudioPage-YoD4tY5l.js",
4
+ "assets/BannedPage-Dq530awD.js",
5
+ "assets/CliToolDetailPage-DZzaS-7S.js",
6
+ "assets/CliToolsPage-DaZZ3cqP.js",
7
+ "assets/CombosPage-BlC_xdkX.js",
8
+ "assets/ConsoleLogPage-D-rqeVtG.js",
9
+ "assets/CustomizationPage-7xT5yg2E.js",
10
+ "assets/HealthEventsModal-Clq8E9cW.js",
11
+ "assets/InjectSystemPromptPanel-6Teoq9Se.js",
12
+ "assets/LoginPage-CZuI0MAR.js",
13
+ "assets/ModelPicker-C1hNTlkr.js",
14
+ "assets/OverviewPage-0yfhSI1C.js",
15
+ "assets/ProviderDetailPage-xqTxdQ4c.js",
16
+ "assets/ProviderIcon-Ddhm1InL.js",
17
+ "assets/ProvidersPage-C3fYuu6i.js",
18
+ "assets/ProxyPage-CHtJtZ3u.js",
19
+ "assets/QuotaPage-D1RV_2BX.js",
20
+ "assets/SettingsPage-BzZAvYSX.js",
21
+ "assets/SetupPage--s-EfEIL.js",
22
+ "assets/StudioPage-BjXFGSK4.js",
23
23
  "assets/ToolIcon-CfeLA-Z_.js",
24
- "assets/UsagePage-DxjaAhb_.js",
25
- "assets/api-keys-BTlkq_Uk.js",
26
- "assets/app-B7kIWFm5.js",
27
- "assets/app-BX2nnKqs.css",
24
+ "assets/UsagePage-CP8F8BN7.js",
25
+ "assets/api-keys-2hc12Uz2.js",
26
+ "assets/app-C0gTXEoN.js",
27
+ "assets/app-DGXbNfAR.css",
28
28
  "assets/arrow-left-CpBxkoxI.js",
29
29
  "assets/arrow-right-Dl5yKnp8.js",
30
30
  "assets/arrow-up-59ms1iiT.js",
31
- "assets/assert-CndthXFQ.js",
31
+ "assets/assert-BMcj1xZE.js",
32
32
  "assets/backup-file-gdKIlg8U.js",
33
- "assets/badge-DdbT_7Am.js",
33
+ "assets/badge-DkRUuVfz.js",
34
34
  "assets/ban-durations-B58FyRxC.js",
35
- "assets/banner-CsGN-nbm.js",
35
+ "assets/banner-CDjW841Q.js",
36
36
  "assets/brain-Cwed_72z.js",
37
- "assets/card-mgZ_TLLZ.js",
37
+ "assets/card-Bto5UlL9.js",
38
38
  "assets/chevron-left-Bf6CaTSJ.js",
39
39
  "assets/chevron-right-BXIy5l3h.js",
40
40
  "assets/circle-alert-CntYHV5v.js",
41
41
  "assets/circle-check-BU3v_mFW.js",
42
42
  "assets/circle-question-mark-Cz4un8sH.js",
43
- "assets/cli-tools-A1-v8-03.js",
44
- "assets/clipboard-button-CJ4Zty89.js",
43
+ "assets/cli-tools-DaH6g9hL.js",
44
+ "assets/clipboard-button-BYKBCzjk.js",
45
45
  "assets/database-Dz9N3zGd.js",
46
- "assets/dialog-B5L2jPQ_.js",
46
+ "assets/dialog-DL0Zftwv.js",
47
47
  "assets/dialog-actions-B1axpEg7.js",
48
48
  "assets/download-dRFo5_Wu.js",
49
- "assets/drawer-DkjUouAj.js",
50
- "assets/entry-B-LVLV6o.js",
51
- "assets/entry-CAhdYl3B.js",
52
- "assets/entry-D2xD0Tmd.js",
49
+ "assets/drawer-Dpx_UXaS.js",
50
+ "assets/entry-BV7-1NoM.js",
51
+ "assets/entry-CGvdNU6r.js",
52
+ "assets/entry-DScKYvZj.js",
53
53
  "assets/eye-C_hawfH4.js",
54
54
  "assets/eye-off-Bk5g2luF.js",
55
55
  "assets/fingerprint-pattern-BWuHtbW4.js",
56
- "assets/formatters-CrsdLVsn.js",
56
+ "assets/formatters-BS3DZlZj.js",
57
57
  "assets/gauge-BbIMy7MB.js",
58
58
  "assets/house-h9AZlJuT.js",
59
59
  "assets/image-BPaouViG.js",
60
- "assets/index-BU64Lqvp.js",
61
- "assets/inline-B2aDLyyg.js",
62
- "assets/input-BCVkdR9d.js",
60
+ "assets/index-SQnvvTWX.js",
61
+ "assets/inline-Dl-cuLK0.js",
62
+ "assets/input-Bfx0EzRc.js",
63
63
  "assets/jsx-runtime-CXUMngI_.js",
64
64
  "assets/key-round-UkavsGxp.js",
65
65
  "assets/layers-2-glBbjl.js",
66
- "assets/layout-DNcAdMK-.js",
67
- "assets/list-row-DgrIH0hw.js",
68
- "assets/live-Cae01iu8.js",
66
+ "assets/layout-BxhbQ_JS.js",
67
+ "assets/list-row-D49Y4ptn.js",
68
+ "assets/live-CbVTdX9V.js",
69
69
  "assets/log-in-BmRjy60c.js",
70
70
  "assets/message-circle-CCxGwRvv.js",
71
71
  "assets/mutation-BQ0ccH_A.js",
72
- "assets/network-CRib7H_2.js",
73
- "assets/numbers-BKQE8Xpz.js",
74
- "assets/pagination-ecPvG_8g.js",
72
+ "assets/network-JGvDveof.js",
73
+ "assets/numbers-Dw6kiew-.js",
74
+ "assets/pagination-iUoI8GeE.js",
75
75
  "assets/pencil-768ysRAr.js",
76
76
  "assets/plus-DIdX_g-x.js",
77
77
  "assets/power-off-Yjw9GMJh.js",
@@ -95,22 +95,23 @@
95
95
  "assets/providers/parallel.svg",
96
96
  "assets/providers/tokenharbor.svg",
97
97
  "assets/providers/windsurf.svg",
98
+ "assets/providers/zro.svg",
98
99
  "assets/query-keys-IKLh0YFd.js",
99
- "assets/quota-DJ1QlAOq.js",
100
+ "assets/quota-DiPD6UKH.js",
100
101
  "assets/refresh-cw-BqJFk4sU.js",
101
102
  "assets/rotate-ccw-CufcqITi.js",
102
103
  "assets/route-CNSNj9Zm.js",
103
- "assets/routing-Ckm1UXuC.js",
104
+ "assets/routing-8jZr-3WE.js",
104
105
  "assets/scaling-nWE4Cx8f.js",
105
106
  "assets/search-JOKus9rb.js",
106
- "assets/select-ChoFWyKz.js",
107
+ "assets/select-oO1FxMVb.js",
107
108
  "assets/settings-2-Ds9DQp0t.js",
108
- "assets/settings-CKjFPlKW.js",
109
+ "assets/settings-CLr3kdIx.js",
109
110
  "assets/shield-BMQNxORh.js",
110
111
  "assets/shield-check-DVS0Foqh.js",
111
- "assets/stack-DWCwU3fh.js",
112
- "assets/state-Cg3VL5J_.js",
113
- "assets/switch-Db70BMix.js",
112
+ "assets/stack-Y3pDteZr.js",
113
+ "assets/state-CArX_Iak.js",
114
+ "assets/switch-DwlwmDO-.js",
114
115
  "assets/terminal-0_IjPWTk.js",
115
116
  "assets/tokens-COzario9.js",
116
117
  "assets/trash-Cppn5c3R.js",
@@ -118,7 +119,7 @@
118
119
  "assets/use-modal-focus-By7oJoGd.js",
119
120
  "assets/use-reduced-motion-C4B0R6Sz.js",
120
121
  "assets/use-timeout-BwcBBRrT.js",
121
- "assets/useMutation-BqdE0LuM.js",
122
+ "assets/useMutation-DJ9GYEgf.js",
122
123
  "assets/wrench-B6E1oEuY.js",
123
124
  "assets/zap-C4EeVW4q.js",
124
125
  "index.html"
@@ -0,0 +1,7 @@
1
+ -- Freshness stamp for `quota_plan`: the plan column is a bare string, so
2
+ -- routing cannot tell a fresh read from a stale one. This timestamp is written
3
+ -- together with `quota_plan` on a successful quota fetch and lets the routing
4
+ -- engine downgrade a plan older than the freshness horizon to `unknown`
5
+ -- instead of trusting it blindly.
6
+ ALTER TABLE "provider_accounts"
7
+ ADD COLUMN IF NOT EXISTS "quota_plan_fetched_at" timestamptz;
@@ -0,0 +1,17 @@
1
+ -- Adds `provider_routing_settings.device_flow_proxy` (text, NOT NULL, default
2
+ -- 'random') — how device-code OAuth flows (start + poll) choose their egress.
3
+ --
4
+ -- 'random' (default) — route the device-authorization and token-poll
5
+ -- requests through a randomly selected active network pool. The upstream
6
+ -- sees a rotating IP, which prevents "multiple codes from one IP"
7
+ -- detection for Cursor/Grok/device-code providers.
8
+ -- 'direct' — always dial direct egress (the old behavior). Explicitly
9
+ -- selected by the operator, e.g. when pools are unavailable or the
10
+ -- provider must see one stable address.
11
+ --
12
+ -- Idempotency comes from the migration ledger, not from the statement: the
13
+ -- runner records the file inside the same transaction, so a file that has
14
+ -- already run is never re-executed. The baseline is generated from
15
+ -- `0000_baseline.sql` alone and does not carry this column.
16
+ ALTER TABLE "provider_routing_settings"
17
+ ADD COLUMN IF NOT EXISTS "device_flow_proxy" text NOT NULL DEFAULT 'random';
@@ -0,0 +1,4 @@
1
+ -- SQLite mirror of `full-postgres/0046_add_accounts_quota_plan_fetched_at.sql`:
2
+ -- the timestamp column is stored as an ISO-8601 text string.
3
+ ALTER TABLE "provider_accounts"
4
+ ADD COLUMN "quota_plan_fetched_at" text;
@@ -0,0 +1,19 @@
1
+ -- Adds `provider_routing_settings.device_flow_proxy` (text, NOT NULL, default
2
+ -- 'random') — how device-code OAuth flows (start + poll) choose their egress.
3
+ --
4
+ -- 'random' (default) — route the device-authorization and token-poll
5
+ -- requests through a randomly selected active network pool. The upstream
6
+ -- sees a rotating IP, which prevents "multiple codes from one IP"
7
+ -- detection for Cursor/Grok/device-code providers.
8
+ -- 'direct' — always dial direct egress (the old behavior). Explicitly
9
+ -- selected by the operator, e.g. when pools are unavailable or the
10
+ -- provider must see one stable address.
11
+ --
12
+ -- SQLite stores text as-is; a default is baked into the column so existing
13
+ -- rows read as 'random' without a backfill.
14
+ --
15
+ -- Idempotency comes from the migration ledger, not from the statement: the
16
+ -- runner records the file inside the same transaction, so a file that has
17
+ -- already run is never re-executed. The baseline is generated from
18
+ -- `0000_baseline.sql` alone and does not carry this column.
19
+ ALTER TABLE "provider_routing_settings" ADD COLUMN "device_flow_proxy" text NOT NULL DEFAULT 'random';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cartethyia",
3
- "version": "2.7.9",
3
+ "version": "2.8.1",
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",
package/src/boot/app.ts CHANGED
@@ -10,7 +10,7 @@ import { chatAdapter } from "../transport/surface/chat/adapter";
10
10
  import { responsesAdapter } from "../transport/surface/responses/adapter";
11
11
  import { messagesAdapter } from "../transport/surface/messages/adapter";
12
12
  import { completionAdapter } from "../transport/surface/completion";
13
- import { SurfaceAdapterRegistry } from "../transport/surface/adapters";
13
+ import { SurfaceAdapterRegistry, type SurfaceAdapter } from "../transport/surface/adapters";
14
14
  import { GatewayError, publicGatewayErrorBody } from "../protocol/gateway-error";
15
15
  import { shutdownError, shutdownNotice } from "../transport/shutdown-notice";
16
16
  import type { CanonicalAdapter } from "../transport/contracts";
@@ -47,7 +47,7 @@ import {
47
47
  import { createTokenCountHandler } from "../transport/dispatch/token-count";
48
48
 
49
49
  import { createTransportPipeline } from "../transport/guards/pipeline";
50
- import { createDrainHandler, isLoopbackPeer, tokenMatches } from "../transport/drain-endpoint";
50
+ import { createDrainHandler, requireLoopbackAdmin } from "../transport/drain-endpoint";
51
51
  import { createConsoleAccountResetHandler } from "../console/auth/account-reset";
52
52
  import { resetConsoleAuthState } from "../console/auth/account-reset-store";
53
53
  import { createBackupExportHandler } from "../console/backup/export-endpoint";
@@ -58,7 +58,7 @@ import type { ReadinessCheckResult } from "../persistence/readiness";
58
58
  import type { RouteSnapshotService } from "../transport/routing/route-model";
59
59
  import type { TrustedProxyBoundary } from "../config/network";
60
60
  import { resolveClientIdentity } from "../security/ip-boundary";
61
- import type { ValidatedNetworkBindingFactory } from "../network/pool/resolver";
61
+ import type { ValidatedNetworkBindingFactory } from "../network/egress/factory";
62
62
  import { metrics } from "../observability/metrics";
63
63
  import type { RuntimeMetricsSampler } from "../observability/runtime-metrics";
64
64
  import { API_CONTENT_SECURITY_POLICY, X_FRAME_OPTIONS } from "../security/outbound-headers";
@@ -210,7 +210,7 @@ export function createGatewayApp(deps: GatewayAppDeps) {
210
210
  deps.mode === "route-only"
211
211
  ? (deps.checkRedis ?? checkRedisConnection)
212
212
  : checkRedisConnection;
213
- const registry = new SurfaceAdapterRegistry([
213
+ const registry = new SurfaceAdapterRegistry<SurfaceAdapter & CanonicalAdapter>([
214
214
  chatAdapter,
215
215
  responsesAdapter,
216
216
  messagesAdapter,
@@ -424,12 +424,7 @@ export function createGatewayApp(deps: GatewayAppDeps) {
424
424
  db: deps.db,
425
425
  stateStore: requestStateStore,
426
426
  surfaceRegistry: registry,
427
- adapters: new Map<string, CanonicalAdapter>([
428
- ["chat", chatAdapter],
429
- ["responses", responsesAdapter],
430
- ["messages", messagesAdapter],
431
- ["completion", completionAdapter],
432
- ]),
427
+ adapters: new Map<string, CanonicalAdapter>(registry.bySurface()),
433
428
  preparer: deps.proxyPreparer,
434
429
  readiness: deps.readiness,
435
430
  trustedProxyBoundary: deps.trustedProxyBoundary,
@@ -652,10 +647,12 @@ export function createGatewayApp(deps: GatewayAppDeps) {
652
647
  // well-formed. What refused it is where it came from — the client asked
653
648
  // for something only the local host may ask. `invalid_request` told an
654
649
  // operator to fix the body, when the body was never the problem.
655
- if (!isLoopbackPeer(peerAddresses.get(request) ?? null))
656
- throw new GatewayError("policy_rejected", 403, "task trigger is only available from loopback (request {requestId}). This operation is only allowed from a trusted loopback connection — no hard feelings 🫂");
657
- if (!tokenMatches(request.headers.get("x-drain-token"), token))
658
- throw new GatewayError("authentication_failed", 401, "invalid drain token (request {requestId}). Wrong key, right door — check the token 🔑");
650
+ requireLoopbackAdmin(request, {
651
+ peer: peerAddresses.get(request) ?? null,
652
+ token,
653
+ policyRejectedMessage: "task trigger is only available from loopback (request {requestId}). This operation is only allowed from a trusted loopback connection — no hard feelings 🫂",
654
+ authenticationFailedMessage: "invalid drain token (request {requestId}). Wrong key, right door — check the token 🔑",
655
+ });
659
656
  const name = params.name;
660
657
  if (!tasks.names().includes(name))
661
658
  throw new GatewayError("not_found", 404, `no such task: ${name} (request {requestId}). Nothing here but dust — check the task name 🌙`);
@@ -43,12 +43,10 @@ import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore, type
43
43
  import { checkReadiness } from "../persistence/readiness";
44
44
  import { ProxyRequestPreparer } from "../transport/request/preparer";
45
45
  import { DrizzleNetworkPoolLoader } from "../network/pool/loader";
46
- import {
47
- PoolAgentResolver,
48
- ValidatedNetworkBindingFactory,
49
- } from "../network/pool/resolver";
46
+ import { PoolAgentResolver } from "../network/pool/resolver";
47
+ import { ValidatedNetworkBindingFactory } from "../network/egress/factory";
50
48
  import { NetworkPoolSelector } from "../network/pool/selector";
51
- import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool-cooldown-store";
49
+ import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool/cooldown-store";
52
50
  import { ScheduledTaskRegistry } from "../workers/scheduler";
53
51
  import { quotaRefreshSweep } from "../workers/quota-refresh-sweep";
54
52
  import { registerZcodeGiftClaimTask } from "../workers/zcode-gift-claim";
@@ -62,12 +60,12 @@ import {
62
60
  } from "../workers/buddy-growth-tasks";
63
61
  import { createAccountSecretResolver } from "../providers/operations/provider-credential-service";
64
62
  import { quotaCacheSize } from "../providers/quota/cache";
65
- import { modelCatalogCacheSize } from "../providers/operations/model-catalog-cache";
63
+ import { modelCatalogCacheSize } from "../providers/operations/provider-caches";
66
64
  import { preferencesReaderFor } from "../persistence/tenant-preferences";
67
65
  import { sweepExpiredCooldowns } from "../providers/operations/account-health-service";
68
66
  import { DrizzleTelemetryStore } from "../persistence/stores/telemetry-store";
69
67
  import { TelemetryPayloadCapture } from "../observability/payload-capture";
70
- import { sweepExpiredPoolCooldowns } from "../network/pool-health-machine";
68
+ import { sweepExpiredPoolCooldowns } from "../network/pool/health";
71
69
  import { TelemetryBatchBuffer } from "../observability/telemetry-buffer";
72
70
  import { RuntimeMetricsSampler } from "../observability/runtime-metrics";
73
71
  import {
@@ -0,0 +1,20 @@
1
+ // Shared drain sequence for the process's queued writers. The console's manual
2
+ // "flush now" and the shutdown coordinator's telemetry flush must drain exactly
3
+ // the same buffers in the same order — a fourth writer added to one path but
4
+ // not the other would silently stop reaching the disk on one of them.
5
+ //
6
+ // The deps are the minimal write surface each buffer exposes: a `flush()` that
7
+ // resolves when the buffer is drained. The concrete buffers satisfy it, and a
8
+ // test can substitute stubs without casting.
9
+ export interface FlushAllBuffersDeps {
10
+ readonly telemetryBuffer: { flush(): Promise<void> };
11
+ readonly usageFlush: { flush(): Promise<void> };
12
+ readonly healthEventFlush: { flush(): Promise<void> };
13
+ }
14
+
15
+ /** Drains every buffered writer, in the canonical order. */
16
+ export async function flushAllBuffers(deps: FlushAllBuffersDeps): Promise<void> {
17
+ await deps.telemetryBuffer.flush();
18
+ await deps.usageFlush.flush();
19
+ await deps.healthEventFlush.flush();
20
+ }
@@ -2,6 +2,7 @@ import { closeDb } from "../persistence/boot";
2
2
  import { closeRedis } from "../persistence/redis";
3
3
  import { buildProductionDeps } from "./dependencies";
4
4
  import type { ProductionDeps } from "./dependencies";
5
+ import { flushAllBuffers } from "./flush";
5
6
  import { withTimeout } from "./timeout";
6
7
  import { resolveShutdownDrainWindowMs } from "../config/runtime";
7
8
  import { log } from "../observability/logger";
@@ -35,8 +36,11 @@ export class ShutdownCoordinator {
35
36
  ) {
36
37
  this.hooks = hooks ?? {};
37
38
  this.drainWindowMs = opts?.drainWindowMs ?? 20_000;
38
- this.drainTimeoutMs = opts?.drainTimeoutMs ?? 5_000;
39
- this.flushTimeoutMs = opts?.flushTimeoutMs ?? 2_000;
39
+ // Defaults mirror what `bootstrap()` passes (8_000 / 1_000; drainWindowMs
40
+ // 20_000 is the spec default `resolveShutdownDrainWindowMs()` returns), so
41
+ // reasoning about drain timing from the class alone matches production.
42
+ this.drainTimeoutMs = opts?.drainTimeoutMs ?? 8_000;
43
+ this.flushTimeoutMs = opts?.flushTimeoutMs ?? 1_000;
40
44
  }
41
45
 
42
46
  /**
@@ -217,9 +221,7 @@ export async function bootstrap(): Promise<CartethyiaBoot> {
217
221
  shutdownCoordinator: new ShutdownCoordinator(
218
222
  {
219
223
  flushTelemetry: async () => {
220
- await deps.telemetryBuffer.flush();
221
- await deps.usageFlush.flush();
222
- await deps.healthEventFlush.flush();
224
+ await flushAllBuffers(deps);
223
225
  },
224
226
  closePools: async () => {
225
227
  await boot.server?.stop();
@@ -94,11 +94,12 @@ export function resolveGithubEnterpriseDomain(): string {
94
94
  export type GithubCopilotMode = "opencode-copilot" | "vscode-client-real";
95
95
 
96
96
  /**
97
- * Which GitHub Copilot wire identity the adapter uses. Defaults to
98
- * `opencode-copilot` (raw GitHub OAuth token + minimal OpenCode headers),
99
- * which is the proven-most-stable path (one token, no mint expiry). The
100
- * `vscode-client-real` mode matches the VS Code reference client exactly but
101
- * requires a freshly minted Copilot token.
97
+ * Selects the complete GitHub Copilot profile for OAuth login/refresh,
98
+ * inference, discovery, and quota identity. `opencode-copilot` is the default
99
+ * and uses the raw GitHub OAuth token with OpenCode identity. `vscode-client-real`
100
+ * uses the VS Code OAuth app and a minted Copilot token. Existing accounts must
101
+ * be re-authenticated after changing profiles; the upstream OAuth app binding
102
+ * prevents converting credentials between profiles.
102
103
  */
103
104
  export function resolveGithubCopilotMode(): GithubCopilotMode {
104
105
  const raw = readText(
@@ -0,0 +1,26 @@
1
+ // Routing configuration knobs.
2
+ import { CONFIG_SPEC, readInt } from "./spec";
3
+
4
+ /** Routing reserve percent (0–100). Accounts at/below this remaining-quota % are demoted. */
5
+ export function accountReservePct(): number {
6
+ return readInt(
7
+ "CARTETHYIA_ACCOUNT_RESERVE_PCT",
8
+ CONFIG_SPEC.CARTETHYIA_ACCOUNT_RESERVE_PCT,
9
+ );
10
+ }
11
+
12
+ /** Session-sticky warm window in ms. 0 disables stickiness. */
13
+ export function routingStickyWarmMs(): number {
14
+ return readInt(
15
+ "CARTETHYIA_ROUTING_STICKY_WARM_MS",
16
+ CONFIG_SPEC.CARTETHYIA_ROUTING_STICKY_WARM_MS,
17
+ );
18
+ }
19
+
20
+ /** LRU cap on remembered session→account sticky state per provider. */
21
+ export function routingStickyMaxSessions(): number {
22
+ return readInt(
23
+ "CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS",
24
+ CONFIG_SPEC.CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS,
25
+ );
26
+ }
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Shared metadata for config docs and tests.
3
+ *
4
+ * `CONFIG_SPEC` declares the gateway's spec-driven variables. These constants
5
+ * name the deliberate asymmetries around it so `.env.example`, the generated
6
+ * reference, and the drift tests all project the same exception lists.
7
+ */
8
+
9
+ /** Keys in `CONFIG_SPEC` that are intentionally absent from `.env.example`. */
10
+ export const SPEC_ONLY_ENV_EXAMPLE_KEYS: Readonly<Record<string, true>> = {
11
+ // Setup wizard writes this directly; a sample would mislead copy/paste.
12
+ CARTETHYIA_API_KEY: true,
13
+ // Opt-in diagnostics; sampling them would nudge operators to enable them.
14
+ CARTETHYIA_FORCED_GC: true,
15
+ CARTETHYIA_RUNTIME_METRICS_INTERVAL_MS: true,
16
+ // Advanced knobs documented in the generated configuration reference.
17
+ CARTETHYIA_DISABLED_TASKS: true,
18
+ // Install-identity directory; only operators who need a stable identity
19
+ // across restarts touch it, and the reference covers it.
20
+ CARTETHYIA_INSTALL_ID_DIR: true,
21
+ CARTETHYIA_OAUTH_CALLBACK_PORT: true,
22
+ // Provider-specific overrides. Readers live in `src/config/providers.ts`;
23
+ // the majority of installs do not need them in the starter sample.
24
+ CARTETHYIA_KIMI_OAUTH_HOST: true,
25
+ CARTETHYIA_KIMI_QUOTA_BASE_URL: true,
26
+ CARTETHYIA_GITHUB_ENTERPRISE_DOMAIN: true,
27
+ CARTETHYIA_OPENCODE_UNAVAILABLE_FREE: true,
28
+ // Telemetry retention is deployment-level and documented in the reference.
29
+ CARTETHYIA_TELEMETRY_RETENTION_DAYS: true,
30
+ CARTETHYIA_TELEMETRY_PAYLOAD_MAX_BYTES: true,
31
+ };
32
+
33
+ /** Keys in `.env.example` that `CONFIG_SPEC` does not declare. */
34
+ export const ENV_EXAMPLE_ONLY_KEYS: Readonly<Record<string, true>> = {
35
+ // Read outside `src/config/` by their owning modules.
36
+ CARTETHYIA_DB_MODE: true,
37
+ NODE_ENV: true,
38
+ LOG_LEVEL: true,
39
+ DATABASE_URL: true,
40
+ DATABASE_POOL_MAX: true,
41
+ DATABASE_POOL_IDLE_FLOOR: true,
42
+ REDIS_URL: true,
43
+ CARTETHYIA_DATA_DIR: true,
44
+ CARTETHYIA_TELEMETRY_PAYLOAD_DIR: true,
45
+ CARTETHYIA_CONFIG_DIR: true,
46
+ DASHBOARD_PORT: true,
47
+ VITE_BACKEND_URL: true,
48
+ // Test-runner-only knob, not read by the gateway runtime.
49
+ CARTETHYIA_TEST_JOBS: true,
50
+ };
51
+
52
+ /**
53
+ * Operator-visible variables that are intentionally outside `CONFIG_SPEC` and
54
+ * therefore omitted from the generated configuration reference.
55
+ */
56
+ export const CONFIG_REFERENCE_EXTERNAL_VARIABLES = [
57
+ "CARTETHYIA_DB_MODE",
58
+ "DATABASE_URL",
59
+ "REDIS_URL",
60
+ "NODE_ENV",
61
+ "LOG_LEVEL",
62
+ "DATABASE_POOL_MAX",
63
+ "DATABASE_POOL_IDLE_FLOOR",
64
+ "CARTETHYIA_DATA_DIR",
65
+ "CARTETHYIA_TELEMETRY_PAYLOAD_DIR",
66
+ "CARTETHYIA_CONFIG_DIR",
67
+ "DASHBOARD_PORT",
68
+ "VITE_BACKEND_URL",
69
+ "CARTETHYIA_TEST_DATABASE_URL",
70
+ "CARTETHYIA_TEST_JOBS",
71
+ "CARTETHYIA_REDIS_URL",
72
+ ] as const;
@@ -264,6 +264,26 @@ export const CONFIG_SPEC = {
264
264
  CARTETHYIA_ACCOUNT_AUTH_REJECTED_COOLDOWN_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
265
265
  CARTETHYIA_ACCOUNT_POLICY_BLOCK_COOLDOWN_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
266
266
  CARTETHYIA_ACCOUNT_DISABLED_RECOVERY_MS: { kind: "int", default: 86_400_000, min: 0, max: 604_800_000 },
267
+ /**
268
+ * Routing reserve: an account whose remaining quota fraction falls at or
269
+ * below this percent is demoted behind non-reserve siblings during ordering
270
+ * (it is still eligible and still routed — a reserve is a preference, never
271
+ * an exclusion). 0 disables reserve demotion for every account.
272
+ */
273
+ CARTETHYIA_ACCOUNT_RESERVE_PCT: { kind: "int", default: 20, min: 0, max: 100 },
274
+ /**
275
+ * Session stickiness warm window (milliseconds). Within this window after an
276
+ * account last served a session id, routing prefers that account when it is
277
+ * still eligible — prompt-cache warmth is worth more than perfect load
278
+ * balance. Past the window, the sticky account is only an ordering hint.
279
+ * 0 disables stickiness.
280
+ */
281
+ CARTETHYIA_ROUTING_STICKY_WARM_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
282
+ /**
283
+ * Hard ceiling on distinct session ids whose sticky state is retained in
284
+ * memory per provider (LRU). Evicted sessions simply lose their preference.
285
+ */
286
+ CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS: { kind: "int", default: 256, min: 1, max: 10_000 },
267
287
 
268
288
  // Proxy pool agents
269
289
  CARTETHYIA_PROXY_MAX_SOCKETS: { kind: "int", default: 100, min: 1, max: 100_000 },
@@ -306,15 +326,15 @@ export const CONFIG_SPEC = {
306
326
  */
307
327
  CARTETHYIA_GITHUB_ENTERPRISE_DOMAIN: { kind: "text", default: "" },
308
328
  /**
309
- * Which wire identity the GitHub Copilot Auto/chat path presents to the
310
- * upstream:
329
+ * Selects the complete GitHub Copilot OAuth and wire profile:
330
+ *
331
+ * - `opencode-copilot` (default): OpenCode OAuth app, raw GitHub token, and
332
+ * OpenCode identity for login, refresh, inference, discovery, and quota.
333
+ * - `vscode-client-real`: VS Code OAuth app, minted Copilot token, and the
334
+ * VS Code reference identity for those surfaces.
311
335
  *
312
- * - `opencode-copilot` (default): the long-lived GitHub OAuth token + minimal
313
- * OpenCode headers. One token, no mint step, no short-lived minted-token
314
- * expiry. This is the most stable in practice.
315
- * - `vscode-client-real`: a freshly minted Copilot token + the full VS Code
316
- * reference headers. Matches the VS Code client exactly, but requires the
317
- * minted token (expires ~25 min) and the reference identity.
336
+ * Restart after changing this setting and re-authenticate GitHub accounts;
337
+ * OAuth credentials cannot be converted between the two upstream apps.
318
338
  */
319
339
  CARTETHYIA_GITHUB_COPILOT_MODE: { kind: "text", default: "opencode-copilot" },
320
340
  // Only the literal true opts active ZCode accounts into daily gift claims.
@@ -11,7 +11,7 @@ import { type ShareLinkStore, type ShareLinkSummary } from "../../persistence/st
11
11
  import { API_KEY_MODES, API_KEY_CONCURRENCY_SCOPES, type ApiKeyMode, type ApiKeyModelAccessMode, type ShareLinkKind } from "../../persistence/schema";
12
12
  import { isValidTenantKeyScope, type AccessScope } from "../../security/access-control";
13
13
  import { normalizeClientRouterId } from "../../security/client-router-fingerprint";
14
- import type { ShareActivityPort } from "../share/share-usage";
14
+ import type { ShareActivityPort, SharedKeySummary } from "../share/share-usage";
15
15
  import { ConsoleDomainError } from "../shared/errors";
16
16
  import { pickDefined } from "../shared/object";
17
17
  import type { ConsoleAccessResolver } from "../auth/access";
@@ -35,6 +35,17 @@ export type {
35
35
  SharedKeySummary,
36
36
  SharedKeyActivityDetail,
37
37
  } from "../share/share-usage";
38
+
39
+ /** Paged response of the share-child list endpoint. */
40
+ export interface SharedKeyPage {
41
+ readonly rows: readonly SharedKeySummary[];
42
+ readonly total: number;
43
+ readonly active: number;
44
+ readonly revoked: number;
45
+ /** Family-wide lifetime tokens consumed, independent of the page. */
46
+ readonly consumed: number;
47
+ }
48
+
38
49
  /** How a share template's concurrency cap applies to its recipients. */
39
50
  export type ConcurrencyScope = (typeof API_KEY_CONCURRENCY_SCOPES)[number];
40
51