cartethyia 2.5.3 → 2.5.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 (456) hide show
  1. package/.env.example +13 -4
  2. package/README.md +2 -2
  3. package/dist/dashboard/assets/{BannedPage-hfCzi-Ux.js → BannedPage-CADDq4IU.js} +1 -1
  4. package/dist/dashboard/assets/BannedPage-CADDq4IU.js.gz +0 -0
  5. package/dist/dashboard/assets/CliToolDetailPage-_z1hID7E.js +1 -0
  6. package/dist/dashboard/assets/CliToolDetailPage-_z1hID7E.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-DEDyKBlC.js → CliToolsPage-DuO1Z7dq.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-DuO1Z7dq.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-DNEPi3xU.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-DNEPi3xU.js.gz +0 -0
  11. package/dist/dashboard/assets/{ConsoleLogPage-bsLuZmYH.js → ConsoleLogPage-BVdpfiz1.js} +1 -1
  12. package/dist/dashboard/assets/ConsoleLogPage-BVdpfiz1.js.gz +0 -0
  13. package/dist/dashboard/assets/{CustomizationPage-_UWhwziJ.js → CustomizationPage-BR5HHvbi.js} +1 -1
  14. package/dist/dashboard/assets/CustomizationPage-BR5HHvbi.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-mUfcknqm.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-mUfcknqm.js.gz +0 -0
  17. package/dist/dashboard/assets/{LoginPage-DDVIfZGW.js → LoginPage-V5faV9V2.js} +1 -1
  18. package/dist/dashboard/assets/LoginPage-V5faV9V2.js.gz +0 -0
  19. package/dist/dashboard/assets/ModelPicker-C7pDb41R.js +1 -0
  20. package/dist/dashboard/assets/ModelPicker-C7pDb41R.js.gz +0 -0
  21. package/dist/dashboard/assets/OverviewPage-BDu20Jdx.js +1 -0
  22. package/dist/dashboard/assets/OverviewPage-BDu20Jdx.js.gz +0 -0
  23. package/dist/dashboard/assets/ProviderDetailPage-Dllr_aFO.js +3 -0
  24. package/dist/dashboard/assets/ProviderDetailPage-Dllr_aFO.js.gz +0 -0
  25. package/dist/dashboard/assets/ProvidersPage-uPiGVTTK.js +1 -0
  26. package/dist/dashboard/assets/ProvidersPage-uPiGVTTK.js.gz +0 -0
  27. package/dist/dashboard/assets/ProxyPage-BaUkO-4O.js +7 -0
  28. package/dist/dashboard/assets/ProxyPage-BaUkO-4O.js.gz +0 -0
  29. package/dist/dashboard/assets/QuotaPage-o0IFAsFb.js +1 -0
  30. package/dist/dashboard/assets/QuotaPage-o0IFAsFb.js.gz +0 -0
  31. package/dist/dashboard/assets/SettingsPage-CYWqbXjp.js +1 -0
  32. package/dist/dashboard/assets/SettingsPage-CYWqbXjp.js.gz +0 -0
  33. package/dist/dashboard/assets/{SetupPage-D6pmQ86L.js → SetupPage-UB690SE2.js} +1 -1
  34. package/dist/dashboard/assets/SetupPage-UB690SE2.js.gz +0 -0
  35. package/dist/dashboard/assets/{SortableList-DWvKiuSl.js → SortableList-BLujdX7N.js} +1 -1
  36. package/dist/dashboard/assets/SortableList-BLujdX7N.js.gz +0 -0
  37. package/dist/dashboard/assets/{StudioPage-CmkUrgdj.js → StudioPage-D5C2raAc.js} +3 -3
  38. package/dist/dashboard/assets/StudioPage-D5C2raAc.js.gz +0 -0
  39. package/dist/dashboard/assets/UsagePage-8uIcxa1W.js +56 -0
  40. package/dist/dashboard/assets/UsagePage-8uIcxa1W.js.gz +0 -0
  41. package/dist/dashboard/assets/api-keys-DQYLQxpW.js +1 -0
  42. package/dist/dashboard/assets/api-keys-DQYLQxpW.js.gz +0 -0
  43. package/dist/dashboard/assets/app-CX_Z8cMs.css +2 -0
  44. package/dist/dashboard/assets/app-CX_Z8cMs.css.gz +0 -0
  45. package/dist/dashboard/assets/{assert-NHwYq95t.js → assert-C9FD_JwJ.js} +1 -1
  46. package/dist/dashboard/assets/assert-C9FD_JwJ.js.gz +0 -0
  47. package/dist/dashboard/assets/{badge-6uzDDvqs.js → badge-CR72dasT.js} +1 -1
  48. package/dist/dashboard/assets/badge-CR72dasT.js.gz +0 -0
  49. package/dist/dashboard/assets/{banner-4_WNg2WZ.js → banner-CI9_eSfO.js} +1 -1
  50. package/dist/dashboard/assets/banner-CI9_eSfO.js.gz +0 -0
  51. package/dist/dashboard/assets/{card--AtFedAq.js → card-DS7CQEsO.js} +1 -1
  52. package/dist/dashboard/assets/card-DS7CQEsO.js.gz +0 -0
  53. package/dist/dashboard/assets/{cli-tools-B3e7dx3N.js → cli-tools-CNqzrfdb.js} +1 -1
  54. package/dist/dashboard/assets/cli-tools-CNqzrfdb.js.gz +0 -0
  55. package/dist/dashboard/assets/{clipboard-button-NreUx6c8.js → clipboard-button-611pSsaX.js} +1 -1
  56. package/dist/dashboard/assets/clipboard-button-611pSsaX.js.gz +0 -0
  57. package/dist/dashboard/assets/{fingerprint-pattern-BWuHtbW4.js → concurrency-BDF0ok7y.js} +1 -1
  58. package/dist/dashboard/assets/concurrency-BDF0ok7y.js.gz +0 -0
  59. package/dist/dashboard/assets/database-Dz9N3zGd.js +1 -0
  60. package/dist/dashboard/assets/database-Dz9N3zGd.js.gz +0 -0
  61. package/dist/dashboard/assets/dialog-k37exjNt.js +1 -0
  62. package/dist/dashboard/assets/dialog-k37exjNt.js.gz +0 -0
  63. package/dist/dashboard/assets/drawer-CX7N8ucR.js +1 -0
  64. package/dist/dashboard/assets/drawer-CX7N8ucR.js.gz +0 -0
  65. package/dist/dashboard/assets/entry-B9Xvtnfj.js +1 -0
  66. package/dist/dashboard/assets/entry-B9Xvtnfj.js.gz +0 -0
  67. package/dist/dashboard/assets/entry-CTP8AyiS.js +1 -0
  68. package/dist/dashboard/assets/entry-CTP8AyiS.js.gz +0 -0
  69. package/dist/dashboard/assets/entry-DxBHnauy.js +4 -0
  70. package/dist/dashboard/assets/entry-DxBHnauy.js.gz +0 -0
  71. package/dist/dashboard/assets/{github-badge-D_eM3IgG.js → github-badge-sltk1qUi.js} +1 -1
  72. package/dist/dashboard/assets/github-badge-sltk1qUi.js.gz +0 -0
  73. package/dist/dashboard/assets/{index-BydyKaDz.js → index-CmxZr14F.js} +2 -2
  74. package/dist/dashboard/assets/index-CmxZr14F.js.gz +0 -0
  75. package/dist/dashboard/assets/{inline-BcNGF8Gr.js → inline-BhY2sSnO.js} +1 -1
  76. package/dist/dashboard/assets/inline-BhY2sSnO.js.gz +0 -0
  77. package/dist/dashboard/assets/{input-BG41et9G.js → input-V1umFiBk.js} +1 -1
  78. package/dist/dashboard/assets/input-V1umFiBk.js.gz +0 -0
  79. package/dist/dashboard/assets/layout-BBOYycyS.js +1 -0
  80. package/dist/dashboard/assets/layout-BBOYycyS.js.gz +0 -0
  81. package/dist/dashboard/assets/{list-row-Gh_W4OR_.js → list-row-1zzZYM0B.js} +1 -1
  82. package/dist/dashboard/assets/list-row-1zzZYM0B.js.gz +0 -0
  83. package/dist/dashboard/assets/{live-BJGYRBnR.js → live-BivGfuUs.js} +1 -1
  84. package/dist/dashboard/assets/live-BivGfuUs.js.gz +0 -0
  85. package/dist/dashboard/assets/model-bans-CmffjLuG.js +1 -0
  86. package/dist/dashboard/assets/model-bans-CmffjLuG.js.gz +0 -0
  87. package/dist/dashboard/assets/{mutation-BkoLM5Ba.js → mutation-46P0oWMe.js} +1 -1
  88. package/dist/dashboard/assets/mutation-46P0oWMe.js.gz +0 -0
  89. package/dist/dashboard/assets/numbers-DkfMR5Qs.js +2 -0
  90. package/dist/dashboard/assets/numbers-DkfMR5Qs.js.gz +0 -0
  91. package/dist/dashboard/assets/{query-keys-D7wX2vM5.js → query-keys-BFhGpwR1.js} +1 -1
  92. package/dist/dashboard/assets/query-keys-BFhGpwR1.js.gz +0 -0
  93. package/dist/dashboard/assets/{routing-CcusqXA7.js → routing-CAb4F37R.js} +1 -1
  94. package/dist/dashboard/assets/routing-CAb4F37R.js.gz +0 -0
  95. package/dist/dashboard/assets/{select-BO6h8yNv.js → select-BYR_5K2c.js} +2 -2
  96. package/dist/dashboard/assets/select-BYR_5K2c.js.gz +0 -0
  97. package/dist/dashboard/assets/{settings-mpmXTgUa.js → settings-DNX9sydi.js} +1 -1
  98. package/dist/dashboard/assets/settings-DNX9sydi.js.gz +0 -0
  99. package/dist/dashboard/assets/{stack-DwLmjUFK.js → stack-BHTfXdz_.js} +1 -1
  100. package/dist/dashboard/assets/stack-BHTfXdz_.js.gz +0 -0
  101. package/dist/dashboard/assets/{state-DYdQmdAl.js → state-mPDRlQkl.js} +1 -1
  102. package/dist/dashboard/assets/state-mPDRlQkl.js.gz +0 -0
  103. package/dist/dashboard/assets/switch-DOmJxg7H.js +1 -0
  104. package/dist/dashboard/assets/switch-DOmJxg7H.js.gz +0 -0
  105. package/dist/dashboard/assets/terminal-0_IjPWTk.js +1 -0
  106. package/dist/dashboard/assets/terminal-0_IjPWTk.js.gz +0 -0
  107. package/dist/dashboard/assets/tokens-COzario9.js +1 -0
  108. package/dist/dashboard/assets/tokens-COzario9.js.gz +0 -0
  109. package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js +1 -0
  110. package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js.gz +0 -0
  111. package/dist/dashboard/assets/{useMutation-w4u4CVue.js → useMutation-Dem0lXQj.js} +1 -1
  112. package/dist/dashboard/assets/useMutation-Dem0lXQj.js.gz +0 -0
  113. package/dist/dashboard/assets/zap-C4EeVW4q.js +1 -0
  114. package/dist/dashboard/assets/zap-C4EeVW4q.js.gz +0 -0
  115. package/dist/dashboard/donation/qris-risun-marke.png +0 -0
  116. package/dist/dashboard/index.html +1 -1
  117. package/dist/dashboard/index.html.gz +0 -0
  118. package/dist/dashboard/precompressed-assets.json +57 -57
  119. package/migrations/README.md +52 -52
  120. package/migrations/lite-sqlite3/0000_baseline.sql +2 -2
  121. package/package.json +96 -95
  122. package/scripts/cli/admin.ts +125 -0
  123. package/scripts/cli/autostart.ts +237 -0
  124. package/scripts/cli/{ui/background.ts → background.ts} +1 -1
  125. package/scripts/cli/{command/console-menu.ts → console-menu.ts} +275 -248
  126. package/scripts/cli/doctor.ts +37 -0
  127. package/scripts/cli/{support/env.ts → env.ts} +99 -99
  128. package/scripts/cli/{gateway/spawn.ts → gateway.ts} +112 -24
  129. package/scripts/cli/instance.ts +224 -0
  130. package/scripts/cli/main.ts +88 -18
  131. package/scripts/cli/{support/platform.ts → platform.ts} +64 -64
  132. package/scripts/cli/port.ts +100 -0
  133. package/scripts/cli/{support/services.ts → services.ts} +88 -88
  134. package/scripts/cli/{command/setup.ts → setup.ts} +35 -34
  135. package/scripts/cli/{command/start.ts → start.ts} +10 -5
  136. package/scripts/cli/{support/startup-signal.ts → startup-signal.ts} +23 -23
  137. package/scripts/cli/tray/index.ts +62 -12
  138. package/scripts/cli/{command/tray.ts → tray.ts} +208 -208
  139. package/scripts/cli/update.ts +40 -0
  140. package/scripts/cli/version.ts +67 -0
  141. package/scripts/cli/{ui/wordmark.ts → wordmark.ts} +58 -58
  142. package/src/boot/app.ts +11 -7
  143. package/src/boot/dependencies.ts +50 -19
  144. package/src/boot/timeout.ts +2 -13
  145. package/src/config/cooldowns.ts +186 -138
  146. package/src/config/network.ts +8 -14
  147. package/src/config/providers.ts +7 -10
  148. package/src/config/runtime.ts +76 -76
  149. package/src/config/security.ts +15 -0
  150. package/src/config/spec.ts +52 -7
  151. package/src/config/telemetry.ts +26 -0
  152. package/src/config/timeouts.ts +0 -6
  153. package/src/console/admin/model-abuse/contracts.ts +28 -6
  154. package/src/console/admin/model-abuse/routes.ts +56 -3
  155. package/src/console/api-keys/bucket-spend.ts +15 -4
  156. package/src/console/api-keys/contracts.ts +410 -414
  157. package/src/console/api-keys/routes.ts +881 -880
  158. package/src/console/auth/credentials.ts +3 -3
  159. package/src/console/auth/setup-service.ts +2 -2
  160. package/src/console/backup/contracts.ts +15 -2
  161. package/src/console/backup/export-endpoint.ts +6 -2
  162. package/src/console/backup/nine-router.ts +2 -5
  163. package/src/console/backup/service.ts +4 -0
  164. package/src/console/backup/store.ts +192 -29
  165. package/src/console/backup/validate.ts +3 -45
  166. package/src/console/cli-tools/fs-ops.ts +487 -487
  167. package/src/console/console-router-guards.ts +1 -1
  168. package/src/console/console-router.ts +8 -0
  169. package/src/console/data-management/contracts.ts +100 -0
  170. package/src/console/data-management/operations.ts +234 -0
  171. package/src/console/data-management/routes.ts +103 -0
  172. package/src/console/domain-registration.ts +45 -1
  173. package/src/console/observability/contracts.ts +524 -485
  174. package/src/console/observability/live.ts +22 -0
  175. package/src/console/observability/store.ts +1138 -1018
  176. package/src/console/observability/usage-dimensions.ts +4 -4
  177. package/src/console/providers/catalog/catalog-projections.ts +6 -7
  178. package/src/console/providers/catalog/contracts.ts +6 -0
  179. package/src/console/providers/catalog/model-operations.ts +5 -2
  180. package/src/console/providers/catalog/provider-operations.ts +24 -4
  181. package/src/console/providers/catalog/public-model-store.ts +8 -11
  182. package/src/console/providers/catalog/routes.ts +7 -0
  183. package/src/console/providers/catalog/store.ts +1553 -1532
  184. package/src/console/providers/oauth/routes.ts +8 -12
  185. package/src/console/quota/account-quota-shared.ts +52 -39
  186. package/src/console/quota/account-quota-tenant.ts +6 -6
  187. package/src/console/quota/quota-view.ts +1 -1
  188. package/src/console/quota/refresh.ts +441 -429
  189. package/src/console/remote-support/contracts.ts +61 -0
  190. package/src/console/remote-support/routes.ts +65 -0
  191. package/src/console/remote-support/service.ts +207 -0
  192. package/src/console/response-compression.ts +0 -3
  193. package/src/console/routing/pools/import-parse.ts +206 -0
  194. package/src/console/routing/pools/operations.ts +543 -501
  195. package/src/console/routing/pools/probe-result.ts +3 -2
  196. package/src/console/routing/pools/probe-verdict.ts +132 -132
  197. package/src/console/routing/pools/routes.ts +181 -164
  198. package/src/console/routing/pools/store.ts +8 -8
  199. package/src/console/settings/contracts.ts +95 -2
  200. package/src/console/settings/store.ts +81 -3
  201. package/src/console/shared/cursor.ts +8 -8
  202. package/src/console/shared/errors.ts +1 -3
  203. package/src/console/updates/routes.ts +16 -0
  204. package/src/main.ts +10 -0
  205. package/src/network/http2-bidi.ts +2 -4
  206. package/src/network/pool/agent.ts +478 -478
  207. package/src/network/pool/selector.ts +5 -4
  208. package/src/network/retry.ts +1 -2
  209. package/src/network/ssrf.ts +5 -4
  210. package/src/observability/event-compaction.ts +317 -0
  211. package/src/observability/event-day-index.ts +440 -0
  212. package/src/observability/event-log.ts +155 -6
  213. package/src/observability/logger.ts +6 -6
  214. package/src/observability/payload-capture.ts +158 -33
  215. package/src/observability/payload-store.ts +82 -61
  216. package/src/observability/redaction.ts +5 -6
  217. package/src/observability/request-notify.ts +43 -0
  218. package/src/observability/telemetry-status.ts +8 -9
  219. package/src/observability/token-speed.ts +5 -4
  220. package/src/persistence/db-mode.ts +7 -7
  221. package/src/persistence/health-event-flush.ts +36 -0
  222. package/src/persistence/readiness.ts +1 -1
  223. package/src/persistence/schema.ts +75 -29
  224. package/src/persistence/shared-cache.ts +1 -2
  225. package/src/persistence/stores/api-key-store.ts +18 -6
  226. package/src/persistence/stores/share-store.ts +4 -3
  227. package/src/persistence/stores/telemetry-store.ts +33 -11
  228. package/src/protocol/canonical-model.ts +11 -3
  229. package/src/protocol/codecs.ts +139 -6
  230. package/src/protocol/gateway-error.ts +6 -4
  231. package/src/protocol/image-clamp.ts +19 -1
  232. package/src/protocol/registry.ts +8 -0
  233. package/src/protocol/request/chat.ts +21 -1
  234. package/src/protocol/request/codex.ts +10 -1
  235. package/src/protocol/request/gemini.ts +9 -2
  236. package/src/protocol/request/messages.ts +18 -7
  237. package/src/protocol/request/responses.ts +9 -1
  238. package/src/protocol/response/chat.ts +34 -4
  239. package/src/protocol/response/codex.ts +7 -4
  240. package/src/protocol/response/dsml.ts +140 -28
  241. package/src/protocol/response/responses.ts +11 -5
  242. package/src/protocol/stream-error-frames.ts +4 -5
  243. package/src/providers/adapters/compatible-adapter.ts +3 -0
  244. package/src/providers/authentication/jwt-validator.ts +9 -10
  245. package/src/providers/authentication/oauth-refresh-service.ts +9 -11
  246. package/src/providers/bundled-discovery-providers.ts +122 -119
  247. package/src/providers/configured-openai-providers.ts +4 -4
  248. package/src/providers/default-registry.ts +5 -4
  249. package/src/providers/discovery/catalog/catalog-blob.ts +18 -18
  250. package/src/providers/discovery/catalog/catalog-format.ts +3 -6
  251. package/src/providers/discovery/models-dev-catalog.ts +354 -354
  252. package/src/providers/discovery/openai-model-discovery.ts +5 -0
  253. package/src/providers/discovery/openrouter-free-roster.ts +15 -17
  254. package/src/providers/discovery/probe-phases.ts +4 -4
  255. package/src/providers/discovery/probe-wire.ts +6 -13
  256. package/src/providers/discovery/probing-service.ts +1117 -1045
  257. package/src/providers/integrations/alibabacp/alibabacp.ts +1 -1
  258. package/src/providers/integrations/antigravity/antigravity-quota.ts +5 -7
  259. package/src/providers/integrations/buddy/buddy-chat-shared.ts +23 -2
  260. package/src/providers/integrations/buddy/buddy-checkin.ts +1 -4
  261. package/src/providers/integrations/buddy/buddy-cli-headers.ts +23 -6
  262. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -1
  263. package/src/providers/integrations/buddy/buddy-identity.ts +52 -0
  264. package/src/providers/integrations/buddy/buddy-media.ts +2 -2
  265. package/src/providers/integrations/buddy/buddy-usage-store.ts +3 -4
  266. package/src/providers/integrations/buddy/codebuddy/quota.ts +2 -13
  267. package/src/providers/integrations/buddy/codebuddy/shared.ts +118 -115
  268. package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -11
  269. package/src/providers/integrations/buddy/workbuddy/shared.ts +5 -2
  270. package/src/providers/integrations/claude/claude.ts +608 -608
  271. package/src/providers/integrations/cline/cline-quota.ts +27 -20
  272. package/src/providers/integrations/cline/cline.ts +537 -539
  273. package/src/providers/integrations/codex/codex-headers.ts +25 -39
  274. package/src/providers/integrations/codex/codex-oauth.ts +1 -1
  275. package/src/providers/integrations/codex/codex.ts +2 -29
  276. package/src/providers/integrations/commandcode/commandcode.ts +674 -675
  277. package/src/providers/integrations/commandcode/discovery.ts +117 -116
  278. package/src/providers/integrations/cursor/cursor-auth.ts +418 -418
  279. package/src/providers/integrations/cursor/cursor-quota.ts +309 -0
  280. package/src/providers/integrations/cursor/cursor-request.ts +616 -471
  281. package/src/providers/integrations/cursor/cursor-session-manager.ts +319 -281
  282. package/src/providers/integrations/cursor/cursor.ts +1333 -960
  283. package/src/providers/integrations/cursor/protocol/messages.ts +25 -0
  284. package/src/providers/integrations/factory/factory-models.ts +3 -5
  285. package/src/providers/integrations/factory/factory.ts +8 -1
  286. package/src/providers/integrations/gemini.ts +6 -1
  287. package/src/providers/integrations/grok/grok-install-id.ts +2 -3
  288. package/src/providers/integrations/grok/grok-quota.ts +279 -177
  289. package/src/providers/integrations/grok/grok-ratelimit-store.ts +73 -0
  290. package/src/providers/integrations/grok/grok-ratelimit.ts +218 -0
  291. package/src/providers/integrations/grok/grok.ts +6 -7
  292. package/src/providers/integrations/hermes.ts +14 -18
  293. package/src/providers/integrations/kiro/kiro-discovery.ts +1 -1
  294. package/src/providers/integrations/kiro/kiro.ts +1 -1
  295. package/src/providers/integrations/mistral.ts +6 -6
  296. package/src/providers/integrations/opencode/fingerprint.ts +3 -3
  297. package/src/providers/integrations/opencode/provider.ts +19 -20
  298. package/src/providers/integrations/qoder/qoder-catalog.ts +450 -450
  299. package/src/providers/integrations/qoder/qoder-oauth.ts +388 -310
  300. package/src/providers/integrations/qoder/qoder-quota.ts +192 -0
  301. package/src/providers/integrations/qoder/qoder.ts +884 -865
  302. package/src/providers/integrations/shared/connect.ts +6 -6
  303. package/src/providers/integrations/trae/trae-catalog.ts +1 -2
  304. package/src/providers/integrations/trae/trae-quota.ts +384 -0
  305. package/src/providers/integrations/trae/trae.ts +2 -2
  306. package/src/providers/integrations/zcode/oauth.ts +6 -1
  307. package/src/providers/operations/account-health-service.ts +75 -27
  308. package/src/providers/operations/account-reset-service.ts +1 -1
  309. package/src/providers/operations/client-versions.ts +6 -6
  310. package/src/providers/operations/custom-cli-headers.ts +3 -4
  311. package/src/providers/operations/provider-catalog-seeder.ts +95 -95
  312. package/src/providers/operations/provider-catalog-service.ts +3 -4
  313. package/src/providers/provider-contracts.ts +7 -0
  314. package/src/providers/provider-metadata.ts +10 -8
  315. package/src/providers/provider-registry.ts +6 -7
  316. package/src/providers/provider-usage.ts +1 -1
  317. package/src/providers/quota/quota-support.ts +8 -0
  318. package/src/security/abuse.ts +15 -10
  319. package/src/security/access-control.ts +144 -146
  320. package/src/security/admission/contracts.ts +11 -0
  321. package/src/security/admission/in-memory-store.ts +4 -3
  322. package/src/security/admission/lease-sweep.ts +6 -6
  323. package/src/security/admission/reasons.ts +5 -1
  324. package/src/security/admission/redis-store.ts +211 -210
  325. package/src/security/admission/service.ts +4 -0
  326. package/src/security/api-key-auth.ts +27 -17
  327. package/src/security/ip-boundary.ts +155 -15
  328. package/src/security/model-abuse.ts +366 -94
  329. package/src/security/outbound-headers.ts +3 -4
  330. package/src/shared/sleep.ts +4 -0
  331. package/src/transport/dispatch/attempt-finalize.ts +47 -5
  332. package/src/transport/dispatch/attempt-loop.ts +531 -530
  333. package/src/transport/dispatch/generation.ts +6 -0
  334. package/src/transport/dispatch/proxy-request.ts +24 -1
  335. package/src/transport/dispatch/ratelimit-capture.ts +37 -0
  336. package/src/transport/dispatch/stream-bridge.ts +1 -3
  337. package/src/transport/dispatch/streaming/finalize.ts +1 -1
  338. package/src/transport/dispatch/streaming/stream.ts +19 -6
  339. package/src/transport/dispatch/upstream.ts +9 -0
  340. package/src/transport/failure-policy.ts +162 -8
  341. package/src/transport/guards/auth-guard.ts +7 -4
  342. package/src/transport/guards/concurrency-guard.ts +0 -5
  343. package/src/transport/guards/error-lifecycle.ts +13 -6
  344. package/src/transport/guards/pipeline.ts +15 -3
  345. package/src/transport/guards/request-context.ts +8 -2
  346. package/src/transport/request/inflight.ts +5 -6
  347. package/src/transport/request/preparer.ts +9 -8
  348. package/src/transport/request/state.ts +21 -8
  349. package/src/transport/request/tenant-preferences.ts +60 -0
  350. package/src/transport/routing/admission.ts +4 -0
  351. package/src/transport/routing/route-catalog.ts +65 -10
  352. package/src/transport/routing/route-model.ts +46 -14
  353. package/src/transport/routing/router.ts +21 -14
  354. package/src/transport/surface/completion.ts +2 -3
  355. package/src/transport/surface/dialects.ts +5 -6
  356. package/src/transport/surface/responses/encode.ts +38 -0
  357. package/src/transport/surface/responses/parse.ts +4 -0
  358. package/src/transport/translation/capabilities.ts +2 -3
  359. package/src/transport/translation/quirks.ts +3 -3
  360. package/src/workers/buddy-growth-tasks.ts +5 -10
  361. package/src/workers/daily-checkin.ts +17 -23
  362. package/src/workers/quota-refresh-sweep.ts +26 -26
  363. package/dist/dashboard/assets/BannedPage-hfCzi-Ux.js.gz +0 -0
  364. package/dist/dashboard/assets/CliToolDetailPage-DLGqYEwI.js +0 -1
  365. package/dist/dashboard/assets/CliToolDetailPage-DLGqYEwI.js.gz +0 -0
  366. package/dist/dashboard/assets/CliToolsPage-DEDyKBlC.js.gz +0 -0
  367. package/dist/dashboard/assets/CombosPage-CfuYiQ8Z.js +0 -1
  368. package/dist/dashboard/assets/CombosPage-CfuYiQ8Z.js.gz +0 -0
  369. package/dist/dashboard/assets/ConsoleLogPage-bsLuZmYH.js.gz +0 -0
  370. package/dist/dashboard/assets/CustomizationPage-_UWhwziJ.js.gz +0 -0
  371. package/dist/dashboard/assets/HealthEventsModal-Cjfc5WFS.js +0 -1
  372. package/dist/dashboard/assets/HealthEventsModal-Cjfc5WFS.js.gz +0 -0
  373. package/dist/dashboard/assets/LoginPage-DDVIfZGW.js.gz +0 -0
  374. package/dist/dashboard/assets/ModelPicker-CWkTUtpX.js +0 -1
  375. package/dist/dashboard/assets/ModelPicker-CWkTUtpX.js.gz +0 -0
  376. package/dist/dashboard/assets/OverviewPage-B53YYMng.js +0 -1
  377. package/dist/dashboard/assets/OverviewPage-B53YYMng.js.gz +0 -0
  378. package/dist/dashboard/assets/ProviderDetailPage-B0KaAQf0.js +0 -3
  379. package/dist/dashboard/assets/ProviderDetailPage-B0KaAQf0.js.gz +0 -0
  380. package/dist/dashboard/assets/ProvidersPage-Dx31DgIO.js +0 -1
  381. package/dist/dashboard/assets/ProvidersPage-Dx31DgIO.js.gz +0 -0
  382. package/dist/dashboard/assets/ProxyPage-BpnR4kXT.js +0 -7
  383. package/dist/dashboard/assets/ProxyPage-BpnR4kXT.js.gz +0 -0
  384. package/dist/dashboard/assets/QuotaPage-BpOQCnun.js +0 -1
  385. package/dist/dashboard/assets/QuotaPage-BpOQCnun.js.gz +0 -0
  386. package/dist/dashboard/assets/SettingsPage-DV1eo2J_.js +0 -1
  387. package/dist/dashboard/assets/SettingsPage-DV1eo2J_.js.gz +0 -0
  388. package/dist/dashboard/assets/SetupPage-D6pmQ86L.js.gz +0 -0
  389. package/dist/dashboard/assets/SortableList-DWvKiuSl.js.gz +0 -0
  390. package/dist/dashboard/assets/StudioPage-CmkUrgdj.js.gz +0 -0
  391. package/dist/dashboard/assets/UsagePage-B47uOydr.js +0 -56
  392. package/dist/dashboard/assets/UsagePage-B47uOydr.js.gz +0 -0
  393. package/dist/dashboard/assets/api-keys-uNywYlfv.js +0 -1
  394. package/dist/dashboard/assets/api-keys-uNywYlfv.js.gz +0 -0
  395. package/dist/dashboard/assets/app-DxivpfYG.css +0 -2
  396. package/dist/dashboard/assets/app-DxivpfYG.css.gz +0 -0
  397. package/dist/dashboard/assets/assert-NHwYq95t.js.gz +0 -0
  398. package/dist/dashboard/assets/badge-6uzDDvqs.js.gz +0 -0
  399. package/dist/dashboard/assets/banner-4_WNg2WZ.js.gz +0 -0
  400. package/dist/dashboard/assets/card--AtFedAq.js.gz +0 -0
  401. package/dist/dashboard/assets/cli-tools-B3e7dx3N.js.gz +0 -0
  402. package/dist/dashboard/assets/clipboard-button-NreUx6c8.js.gz +0 -0
  403. package/dist/dashboard/assets/dialog-BtpsJU98.js +0 -1
  404. package/dist/dashboard/assets/dialog-BtpsJU98.js.gz +0 -0
  405. package/dist/dashboard/assets/download-A0SW9OCW.js +0 -1
  406. package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
  407. package/dist/dashboard/assets/drawer-WwwtzihF.js +0 -1
  408. package/dist/dashboard/assets/drawer-WwwtzihF.js.gz +0 -0
  409. package/dist/dashboard/assets/entry-CkryrIea.js +0 -4
  410. package/dist/dashboard/assets/entry-CkryrIea.js.gz +0 -0
  411. package/dist/dashboard/assets/entry-TJIye_jT.js +0 -1
  412. package/dist/dashboard/assets/entry-TJIye_jT.js.gz +0 -0
  413. package/dist/dashboard/assets/entry-jy9_4-Ke.js +0 -1
  414. package/dist/dashboard/assets/entry-jy9_4-Ke.js.gz +0 -0
  415. package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
  416. package/dist/dashboard/assets/github-badge-D_eM3IgG.js.gz +0 -0
  417. package/dist/dashboard/assets/index-BydyKaDz.js.gz +0 -0
  418. package/dist/dashboard/assets/inline-BcNGF8Gr.js.gz +0 -0
  419. package/dist/dashboard/assets/input-BG41et9G.js.gz +0 -0
  420. package/dist/dashboard/assets/layout-C8mer_Ak.js +0 -1
  421. package/dist/dashboard/assets/layout-C8mer_Ak.js.gz +0 -0
  422. package/dist/dashboard/assets/list-row-Gh_W4OR_.js.gz +0 -0
  423. package/dist/dashboard/assets/live-BJGYRBnR.js.gz +0 -0
  424. package/dist/dashboard/assets/model-bans-DeVLDA7I.js +0 -1
  425. package/dist/dashboard/assets/model-bans-DeVLDA7I.js.gz +0 -0
  426. package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
  427. package/dist/dashboard/assets/numbers-Bs4LOOuf.js +0 -2
  428. package/dist/dashboard/assets/numbers-Bs4LOOuf.js.gz +0 -0
  429. package/dist/dashboard/assets/query-keys-D7wX2vM5.js.gz +0 -0
  430. package/dist/dashboard/assets/routing-CcusqXA7.js.gz +0 -0
  431. package/dist/dashboard/assets/select-BO6h8yNv.js.gz +0 -0
  432. package/dist/dashboard/assets/settings-mpmXTgUa.js.gz +0 -0
  433. package/dist/dashboard/assets/sparkles-BRaRUxAU.js +0 -1
  434. package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
  435. package/dist/dashboard/assets/stack-DwLmjUFK.js.gz +0 -0
  436. package/dist/dashboard/assets/state-DYdQmdAl.js.gz +0 -0
  437. package/dist/dashboard/assets/switch-CidSfbG7.js +0 -1
  438. package/dist/dashboard/assets/switch-CidSfbG7.js.gz +0 -0
  439. package/dist/dashboard/assets/terminal-Bd4ee8TA.js +0 -1
  440. package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
  441. package/dist/dashboard/assets/tokens-DDxMbSRL.js +0 -1
  442. package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
  443. package/dist/dashboard/assets/use-presence-BSZEBx7U.js +0 -1
  444. package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
  445. package/dist/dashboard/assets/useMutation-w4u4CVue.js.gz +0 -0
  446. package/scripts/cli/command/admin.ts +0 -65
  447. package/scripts/cli/command/doctor.ts +0 -257
  448. package/scripts/cli/command/update.ts +0 -23
  449. package/scripts/cli/gateway/drain-token.ts +0 -78
  450. package/scripts/cli/gateway/instance-lock.ts +0 -105
  451. package/scripts/cli/gateway/stop.ts +0 -51
  452. package/scripts/cli/support/bun.ts +0 -27
  453. package/scripts/cli/support/version.ts +0 -37
  454. /package/dist/dashboard/assets/{app-CafWtVXA.js → app-BIt446yE.js} +0 -0
  455. /package/dist/dashboard/assets/{app-CafWtVXA.js.gz → app-BIt446yE.js.gz} +0 -0
  456. /package/scripts/cli/{ui/prompt.ts → prompt.ts} +0 -0
@@ -2,72 +2,72 @@
2
2
  "count": 114,
3
3
  "assets": [
4
4
  "assets\\AccountCooldown-Bjo92Qat.js",
5
- "assets\\BannedPage-hfCzi-Ux.js",
6
- "assets\\CliToolDetailPage-DLGqYEwI.js",
7
- "assets\\CliToolsPage-DEDyKBlC.js",
8
- "assets\\CombosPage-CfuYiQ8Z.js",
9
- "assets\\ConsoleLogPage-bsLuZmYH.js",
10
- "assets\\CustomizationPage-_UWhwziJ.js",
11
- "assets\\HealthEventsModal-Cjfc5WFS.js",
12
- "assets\\LoginPage-DDVIfZGW.js",
13
- "assets\\ModelPicker-CWkTUtpX.js",
14
- "assets\\OverviewPage-B53YYMng.js",
15
- "assets\\ProviderDetailPage-B0KaAQf0.js",
5
+ "assets\\BannedPage-CADDq4IU.js",
6
+ "assets\\CliToolDetailPage-_z1hID7E.js",
7
+ "assets\\CliToolsPage-DuO1Z7dq.js",
8
+ "assets\\CombosPage-DNEPi3xU.js",
9
+ "assets\\ConsoleLogPage-BVdpfiz1.js",
10
+ "assets\\CustomizationPage-BR5HHvbi.js",
11
+ "assets\\HealthEventsModal-mUfcknqm.js",
12
+ "assets\\LoginPage-V5faV9V2.js",
13
+ "assets\\ModelPicker-C7pDb41R.js",
14
+ "assets\\OverviewPage-BDu20Jdx.js",
15
+ "assets\\ProviderDetailPage-Dllr_aFO.js",
16
16
  "assets\\ProviderIcon-CmfzxpVM.js",
17
- "assets\\ProvidersPage-Dx31DgIO.js",
18
- "assets\\ProxyPage-BpnR4kXT.js",
19
- "assets\\QuotaPage-BpOQCnun.js",
20
- "assets\\SettingsPage-DV1eo2J_.js",
21
- "assets\\SetupPage-D6pmQ86L.js",
22
- "assets\\SortableList-DWvKiuSl.js",
23
- "assets\\StudioPage-CmkUrgdj.js",
17
+ "assets\\ProvidersPage-uPiGVTTK.js",
18
+ "assets\\ProxyPage-BaUkO-4O.js",
19
+ "assets\\QuotaPage-o0IFAsFb.js",
20
+ "assets\\SettingsPage-CYWqbXjp.js",
21
+ "assets\\SetupPage-UB690SE2.js",
22
+ "assets\\SortableList-BLujdX7N.js",
23
+ "assets\\StudioPage-D5C2raAc.js",
24
24
  "assets\\ToolIcon-K1ckcDKg.js",
25
- "assets\\UsagePage-B47uOydr.js",
26
- "assets\\api-keys-uNywYlfv.js",
27
- "assets\\app-CafWtVXA.js",
28
- "assets\\app-DxivpfYG.css",
25
+ "assets\\UsagePage-8uIcxa1W.js",
26
+ "assets\\api-keys-DQYLQxpW.js",
27
+ "assets\\app-BIt446yE.js",
28
+ "assets\\app-CX_Z8cMs.css",
29
29
  "assets\\arrow-left-CpBxkoxI.js",
30
30
  "assets\\arrow-right-Dl5yKnp8.js",
31
- "assets\\assert-NHwYq95t.js",
31
+ "assets\\assert-C9FD_JwJ.js",
32
32
  "assets\\backup-file-gdKIlg8U.js",
33
- "assets\\badge-6uzDDvqs.js",
34
- "assets\\banner-4_WNg2WZ.js",
33
+ "assets\\badge-CR72dasT.js",
34
+ "assets\\banner-CI9_eSfO.js",
35
35
  "assets\\brain-Cwed_72z.js",
36
- "assets\\card--AtFedAq.js",
36
+ "assets\\card-DS7CQEsO.js",
37
37
  "assets\\chevron-right-BXIy5l3h.js",
38
38
  "assets\\circle-alert-CntYHV5v.js",
39
39
  "assets\\circle-check-BU3v_mFW.js",
40
- "assets\\cli-tools-B3e7dx3N.js",
41
- "assets\\clipboard-button-NreUx6c8.js",
40
+ "assets\\cli-tools-CNqzrfdb.js",
41
+ "assets\\clipboard-button-611pSsaX.js",
42
42
  "assets\\cog-CdWhsajs.js",
43
- "assets\\dialog-BtpsJU98.js",
43
+ "assets\\concurrency-BDF0ok7y.js",
44
+ "assets\\database-Dz9N3zGd.js",
44
45
  "assets\\dialog-actions-B1axpEg7.js",
45
- "assets\\download-A0SW9OCW.js",
46
+ "assets\\dialog-k37exjNt.js",
46
47
  "assets\\download-dRFo5_Wu.js",
47
- "assets\\drawer-WwwtzihF.js",
48
- "assets\\entry-CkryrIea.js",
49
- "assets\\entry-TJIye_jT.js",
50
- "assets\\entry-jy9_4-Ke.js",
48
+ "assets\\drawer-CX7N8ucR.js",
49
+ "assets\\entry-B9Xvtnfj.js",
50
+ "assets\\entry-CTP8AyiS.js",
51
+ "assets\\entry-DxBHnauy.js",
51
52
  "assets\\eye-C_hawfH4.js",
52
53
  "assets\\eye-off-Bk5g2luF.js",
53
- "assets\\fingerprint-pattern-BWuHtbW4.js",
54
54
  "assets\\gauge-BbIMy7MB.js",
55
- "assets\\github-badge-D_eM3IgG.js",
55
+ "assets\\github-badge-sltk1qUi.js",
56
56
  "assets\\image-BPaouViG.js",
57
- "assets\\index-BydyKaDz.js",
58
- "assets\\inline-BcNGF8Gr.js",
59
- "assets\\input-BG41et9G.js",
57
+ "assets\\index-CmxZr14F.js",
58
+ "assets\\inline-BhY2sSnO.js",
59
+ "assets\\input-V1umFiBk.js",
60
60
  "assets\\jsx-runtime-CXUMngI_.js",
61
61
  "assets\\key-round-UkavsGxp.js",
62
62
  "assets\\layers-2-glBbjl.js",
63
- "assets\\layout-C8mer_Ak.js",
64
- "assets\\list-row-Gh_W4OR_.js",
65
- "assets\\live-BJGYRBnR.js",
63
+ "assets\\layout-BBOYycyS.js",
64
+ "assets\\list-row-1zzZYM0B.js",
65
+ "assets\\live-BivGfuUs.js",
66
66
  "assets\\log-in-BmRjy60c.js",
67
67
  "assets\\message-circle-CCxGwRvv.js",
68
- "assets\\model-bans-DeVLDA7I.js",
69
- "assets\\mutation-BkoLM5Ba.js",
70
- "assets\\numbers-Bs4LOOuf.js",
68
+ "assets\\model-bans-CmffjLuG.js",
69
+ "assets\\mutation-46P0oWMe.js",
70
+ "assets\\numbers-DkfMR5Qs.js",
71
71
  "assets\\pencil-768ysRAr.js",
72
72
  "assets\\plus-DIdX_g-x.js",
73
73
  "assets\\power-off-Yjw9GMJh.js",
@@ -89,31 +89,31 @@
89
89
  "assets\\providers\\parallel.svg",
90
90
  "assets\\providers\\tokenharbor.svg",
91
91
  "assets\\providers\\zai-coding-plan.svg",
92
- "assets\\query-keys-D7wX2vM5.js",
92
+ "assets\\query-keys-BFhGpwR1.js",
93
93
  "assets\\quota-DZGyp0N5.js",
94
94
  "assets\\refresh-cw-BqJFk4sU.js",
95
95
  "assets\\rotate-ccw-CufcqITi.js",
96
96
  "assets\\route-CNSNj9Zm.js",
97
- "assets\\routing-CcusqXA7.js",
97
+ "assets\\routing-CAb4F37R.js",
98
98
  "assets\\scaling-nWE4Cx8f.js",
99
99
  "assets\\search-JOKus9rb.js",
100
- "assets\\select-BO6h8yNv.js",
101
- "assets\\settings-mpmXTgUa.js",
100
+ "assets\\select-BYR_5K2c.js",
101
+ "assets\\settings-DNX9sydi.js",
102
102
  "assets\\shield-check-DVS0Foqh.js",
103
- "assets\\sparkles-BRaRUxAU.js",
104
- "assets\\stack-DwLmjUFK.js",
105
- "assets\\state-DYdQmdAl.js",
103
+ "assets\\stack-BHTfXdz_.js",
104
+ "assets\\state-mPDRlQkl.js",
106
105
  "assets\\stream-retry-5QnVuSSo.js",
107
- "assets\\switch-CidSfbG7.js",
108
- "assets\\terminal-Bd4ee8TA.js",
109
- "assets\\tokens-DDxMbSRL.js",
106
+ "assets\\switch-DOmJxg7H.js",
107
+ "assets\\terminal-0_IjPWTk.js",
108
+ "assets\\tokens-COzario9.js",
110
109
  "assets\\trash-Cppn5c3R.js",
111
110
  "assets\\use-clipboard-B0Sy03fE.js",
112
- "assets\\use-presence-BSZEBx7U.js",
111
+ "assets\\use-modal-focus-By7oJoGd.js",
113
112
  "assets\\use-reduced-motion-C4B0R6Sz.js",
114
113
  "assets\\use-timeout-BwcBBRrT.js",
115
- "assets\\useMutation-w4u4CVue.js",
114
+ "assets\\useMutation-Dem0lXQj.js",
116
115
  "assets\\wrench-B6E1oEuY.js",
116
+ "assets\\zap-C4EeVW4q.js",
117
117
  "index.html"
118
118
  ]
119
119
  }
@@ -1,52 +1,52 @@
1
- # Database baselines
2
-
3
- Cartethyia keeps one SQL baseline per database backend:
4
-
5
- - `full-postgres/0000_baseline.sql` defines the foundational PostgreSQL schema
6
- for a new database.
7
- - `lite-sqlite3/0000_baseline.sql` is generated from the PostgreSQL baseline by
8
- `scripts/generate/sqlite-ddl.ts`; do not edit it by hand.
9
-
10
- The startup runner applies the baseline and numbered forward migrations,
11
- recording them in `cartethyia_schema_migrations` along with a hash marker for
12
- the exact baseline contents. Released baselines are immutable so existing
13
- installations keep matching their marker; numbered migrations bring that
14
- foundational schema up to the current schema. Each backend's migrations must
15
- have matching behavior. Startup fails with a recovery instruction for a
16
- database with unsupported retired migration history instead of treating it as
17
- current.
18
-
19
- ## Recovering an existing installation
20
-
21
- 1. Export a backup from the existing installation before switching it to a
22
- release with unsupported migration history.
23
- 2. Create a fresh database and point the application at it.
24
- 3. Start the application so it creates the baseline schema.
25
- 4. Restore the backup through the console restore flow.
26
-
27
- Restore normalizes legacy values that no longer satisfy current constraints,
28
- including `bypass_proxy` → `skip_proxy`, `bridge` → `https`, the retired
29
- provider User-Agent default, Cline's skip-proxy default, and `fusion` →
30
- `fallback`. Unknown or retired columns are reported and skipped according to
31
- the backup contract.
32
-
33
- Do not point tests or recovery steps at development or production databases.
34
- The startup path runs `ensureMigrated()` before provider/catalog seeding. Full
35
- mode uses `src/persistence/db-pg.ts` and an advisory lock; Lite uses
36
- `src/persistence/db-sqlite.ts`. Readiness compares the ledger to the available baseline and forward migration
37
- files. A failed migration aborts startup and is not recorded.
38
-
39
- Migrations are package assets, not resolved from the process working directory:
40
- `src/config/package-paths.ts` resolves them from the package root. `package.json`
41
- includes `migrations/` in the published files, and the Dockerfile copies the
42
- migration directories into `/app/migrations`.
43
-
44
- ## Next schema change
45
-
46
- 1. Update `src/persistence/schema.ts` and add matching numbered migrations to
47
- both backends. Preserve released baseline files so existing baseline markers
48
- remain valid.
49
- 2. Update backup validation/mapping when old exported rows need normalization
50
- or new required values.
51
- 3. Run focused migration, restore, and typecheck tests. Validate against an
52
- isolated database only.
1
+ # Database baselines
2
+
3
+ Cartethyia keeps one SQL baseline per database backend:
4
+
5
+ - `full-postgres/0000_baseline.sql` defines the foundational PostgreSQL schema
6
+ for a new database.
7
+ - `lite-sqlite3/0000_baseline.sql` is generated from the PostgreSQL baseline by
8
+ `scripts/tools/generate-sqlite.ts`; do not edit it by hand.
9
+
10
+ The startup runner applies the baseline and numbered forward migrations,
11
+ recording them in `cartethyia_schema_migrations` along with a hash marker for
12
+ the exact baseline contents. Released baselines are immutable so existing
13
+ installations keep matching their marker; numbered migrations bring that
14
+ foundational schema up to the current schema. Each backend's migrations must
15
+ have matching behavior. Startup fails with a recovery instruction for a
16
+ database with unsupported retired migration history instead of treating it as
17
+ current.
18
+
19
+ ## Recovering an existing installation
20
+
21
+ 1. Export a backup from the existing installation before switching it to a
22
+ release with unsupported migration history.
23
+ 2. Create a fresh database and point the application at it.
24
+ 3. Start the application so it creates the baseline schema.
25
+ 4. Restore the backup through the console restore flow.
26
+
27
+ Restore normalizes legacy values that no longer satisfy current constraints,
28
+ including `bypass_proxy` → `skip_proxy`, `bridge` → `https`, the retired
29
+ provider User-Agent default, Cline's skip-proxy default, and `fusion` →
30
+ `fallback`. Unknown or retired columns are reported and skipped according to
31
+ the backup contract.
32
+
33
+ Do not point tests or recovery steps at development or production databases.
34
+ The startup path runs `ensureMigrated()` before provider/catalog seeding. Full
35
+ mode uses `src/persistence/db-pg.ts` and an advisory lock; Lite uses
36
+ `src/persistence/db-sqlite.ts`. Readiness compares the ledger to the available baseline and forward migration
37
+ files. A failed migration aborts startup and is not recorded.
38
+
39
+ Migrations are package assets, not resolved from the process working directory:
40
+ `src/config/package-paths.ts` resolves them from the package root. `package.json`
41
+ includes `migrations/` in the published files, and the Dockerfile copies the
42
+ migration directories into `/app/migrations`.
43
+
44
+ ## Next schema change
45
+
46
+ 1. Update `src/persistence/schema.ts` and add matching numbered migrations to
47
+ both backends. Preserve released baseline files so existing baseline markers
48
+ remain valid.
49
+ 2. Update backup validation/mapping when old exported rows need normalization
50
+ or new required values.
51
+ 3. Run focused migration, restore, and typecheck tests. Validate against an
52
+ isolated database only.
@@ -1,6 +1,6 @@
1
- -- Generated by scripts/generate/sqlite-ddl.ts from migrations/full-postgres/0000_baseline.sql.
1
+ -- Generated by scripts/tools/generate-sqlite.ts from migrations/full-postgres/0000_baseline.sql.
2
2
  -- Do not edit by hand: change src/persistence/schema.ts, then re-run
3
- -- `bun scripts/generate/sqlite-ddl.ts`. The PostgreSQL baseline this is
3
+ -- `bun scripts/tools/generate-sqlite.ts`. The PostgreSQL baseline this is
4
4
  -- derived from is hand-written and hash-pinned; add a numbered migration
5
5
  -- for a schema change instead of editing it.
6
6
  --> statement-breakpoint
package/package.json CHANGED
@@ -1,95 +1,96 @@
1
- {
2
- "name": "cartethyia",
3
- "version": "2.5.3",
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
- "license": "GPL-3.0-only",
6
- "type": "module",
7
- "packageManager": "bun@1.4.0",
8
- "repository": {
9
- "type": "git",
10
- "url": "git+https://github.com/risunCodex/Cartethyia.git"
11
- },
12
- "homepage": "https://github.com/risunCodex/Cartethyia#readme",
13
- "bugs": {
14
- "url": "https://github.com/risunCodex/Cartethyia/issues"
15
- },
16
- "keywords": [
17
- "ai",
18
- "gateway",
19
- "llm",
20
- "bun",
21
- "self-hosted"
22
- ],
23
- "bin": {
24
- "cartethyia": "scripts/cli/bin/cartethyia.cjs",
25
- "carte": "scripts/cli/bin/carte.cjs"
26
- },
27
- "files": [
28
- "scripts/cli/",
29
- "src/",
30
- "migrations/",
31
- "dist/dashboard/",
32
- ".env.example",
33
- "README.md"
34
- ],
35
- "workspaces": [
36
- "dashboard"
37
- ],
38
- "engines": {
39
- "bun": ">=1.4.0"
40
- },
41
- "scripts": {
42
- "dev": "bun run dev:stack",
43
- "dev:watch": "bun run scripts/dev/supervisor.ts",
44
- "test": "bun run scripts/ci/run.ts",
45
- "build": "bun run scripts/binary/build.ts",
46
- "prepack": "bun run dashboard:build",
47
- "setup": "bun run scripts/cli/command/setup.ts",
48
- "start": "bun run scripts/cli/main.ts start",
49
- "doctor": "bun run scripts/cli/command/doctor.ts",
50
- "probe:egress": "bun run scripts/operations/probe-egress.ts",
51
- "restart": "bun run scripts/binary/restart.ts",
52
- "build:aot": "bun run scripts/binary/aot.ts",
53
- "dev:stack": "concurrently -n BACKEND,DASHBOARD -c cyan,magenta --kill-others-on-fail \"bun run dev:backend\" \"bun run dashboard:dev\"",
54
- "typecheck": "tsc --noEmit",
55
- "test:watch": "bun run scripts/ci/run.ts --watch",
56
- "test-db:up": "docker compose -f docker-compose.test.yml up -d --wait postgres-test",
57
- "dev:backend": "bun run --hot src/main.ts",
58
- "dev:console-auth": "bun run scripts/qa/console-session.ts",
59
- "dev:visual-baseline": "bun run scripts/qa/visual-baseline.ts",
60
- "build:binary": "bun run scripts/binary/compile.ts",
61
- "test:backend": "bun run scripts/ci/run.ts --scope backend",
62
- "test-db:down": "docker compose -f docker-compose.test.yml down",
63
- "dashboard:dev": "bun run --cwd dashboard dev",
64
- "test-db:check": "bun run scripts/ci/db-check.ts",
65
- "dashboard:test": "bun run scripts/ci/run.ts --scope dashboard",
66
- "test-db:reset": "docker compose -f docker-compose.test.yml down -v && docker compose -f docker-compose.test.yml up -d --wait postgres-test",
67
- "dashboard:build": "bun run --cwd dashboard build",
68
- "dashboard:typecheck": "bun run --cwd dashboard typecheck",
69
- "check:migrations": "bun run scripts/ci/check-migrations.ts"
70
- },
71
- "dependencies": {
72
- "drizzle-orm": "0.45.2",
73
- "elysia": "^2.0.0-beta.16",
74
- "enquirer": "^2.4.1",
75
- "ioredis": "6.0.0",
76
- "jose": "^6.2.12",
77
- "jsonrepair": "^3.15.0",
78
- "pg": "8.23.0",
79
- "pino": "^10.3.1",
80
- "pino-pretty": "^13.1.3",
81
- "protobufjs": "^7.6.5",
82
- "socks-proxy-agent": "^10.1.0",
83
- "systray2": "2.1.4",
84
- "typebox": "1.3.27",
85
- "ws": "8.22.0"
86
- },
87
- "devDependencies": {
88
- "@types/pg": "8.11.10",
89
- "@types/ws": "8.18.1",
90
- "bun-types": "1.4.0",
91
- "concurrently": "^10.0.5",
92
- "drizzle-kit": "^0.31.11",
93
- "typescript": "5.9.2"
94
- }
95
- }
1
+ {
2
+ "name": "cartethyia",
3
+ "version": "2.5.6",
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 \u2014 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
+ "license": "GPL-3.0-only",
6
+ "type": "module",
7
+ "packageManager": "bun@1.4.0",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/risunCodex/Cartethyia.git"
11
+ },
12
+ "homepage": "https://github.com/risunCodex/Cartethyia#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/risunCodex/Cartethyia/issues"
15
+ },
16
+ "keywords": [
17
+ "ai",
18
+ "gateway",
19
+ "llm",
20
+ "bun",
21
+ "self-hosted"
22
+ ],
23
+ "bin": {
24
+ "cartethyia": "scripts/cli/bin/cartethyia.cjs",
25
+ "carte": "scripts/cli/bin/carte.cjs"
26
+ },
27
+ "files": [
28
+ "scripts/cli/",
29
+ "src/",
30
+ "migrations/",
31
+ "dist/dashboard/",
32
+ ".env.example",
33
+ "README.md"
34
+ ],
35
+ "workspaces": [
36
+ "dashboard"
37
+ ],
38
+ "engines": {
39
+ "bun": ">=1.4.0"
40
+ },
41
+ "scripts": {
42
+ "dev": "bun run dev:stack",
43
+ "dev:watch": "bun run scripts/dev/supervisor.ts",
44
+ "test": "bun run scripts/test/run.ts",
45
+ "build": "bun run scripts/build/build.ts",
46
+ "prepack": "bun run dashboard:build",
47
+ "setup": "bun run scripts/cli/setup.ts",
48
+ "start": "bun run scripts/cli/main.ts start",
49
+ "doctor": "bun run scripts/cli/doctor.ts",
50
+ "probe:egress": "bun run scripts/tools/probe-egress.ts",
51
+ "restart": "bun run scripts/build/restart.ts",
52
+ "build:aot": "bun run scripts/build/aot.ts",
53
+ "dev:stack": "concurrently -n BACKEND,DASHBOARD -c cyan,magenta --kill-others-on-fail \"bun run dev:backend\" \"bun run dashboard:dev\"",
54
+ "typecheck": "tsc --noEmit",
55
+ "test:watch": "bun run scripts/test/run.ts --watch",
56
+ "test-db:up": "docker compose -f docker-compose.test.yml up -d --wait postgres-test",
57
+ "dev:backend": "bun run --hot src/main.ts",
58
+ "dev:console-auth": "bun run scripts/test/console-session.ts",
59
+ "dev:visual-baseline": "bun run scripts/test/visual-baseline.ts",
60
+ "build:binary": "bun run scripts/build/compile.ts",
61
+ "test:backend": "bun run scripts/test/run.ts --scope backend",
62
+ "test-db:down": "docker compose -f docker-compose.test.yml down",
63
+ "dashboard:dev": "bun run --cwd dashboard dev",
64
+ "test-db:check": "bun run scripts/test/check-db.ts",
65
+ "dashboard:test": "bun run scripts/test/run.ts --scope dashboard",
66
+ "test-db:reset": "docker compose -f docker-compose.test.yml down -v && docker compose -f docker-compose.test.yml up -d --wait postgres-test",
67
+ "dashboard:build": "bun run --cwd dashboard build",
68
+ "dashboard:typecheck": "bun run --cwd dashboard typecheck",
69
+ "check:migrations": "bun run scripts/test/check-migrations.ts",
70
+ "install": "bun run scripts/install/install.ts"
71
+ },
72
+ "dependencies": {
73
+ "drizzle-orm": "0.45.2",
74
+ "elysia": "2.0.0-beta.16",
75
+ "enquirer": "^2.4.1",
76
+ "ioredis": "6.0.0",
77
+ "jose": "^6.2.12",
78
+ "jsonrepair": "^3.15.0",
79
+ "pg": "8.23.0",
80
+ "pino": "^10.3.1",
81
+ "pino-pretty": "^13.1.3",
82
+ "protobufjs": "^7.6.5",
83
+ "socks-proxy-agent": "^10.1.0",
84
+ "systray2": "2.1.4",
85
+ "typebox": "1.3.27",
86
+ "ws": "8.22.0"
87
+ },
88
+ "devDependencies": {
89
+ "@types/pg": "8.11.10",
90
+ "@types/ws": "8.18.1",
91
+ "bun-types": "1.4.0",
92
+ "concurrently": "^10.0.5",
93
+ "drizzle-kit": "^0.31.11",
94
+ "typescript": "5.9.2"
95
+ }
96
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * The two admin actions the menu and the tray both offer.
3
+ *
4
+ * Both go through the running gateway rather than the database file: the
5
+ * gateway holds the connection and the schema is dialect-dependent, so reading
6
+ * or writing the tables from this process would need a second implementation
7
+ * of both.
8
+ */
9
+
10
+ import { ENV_PATH, readEnvFile } from "./env";
11
+
12
+ /**
13
+ * Asks the gateway to write a gzipped config backup into the download
14
+ * directory. Returns the written path and counts, or null when it failed.
15
+ */
16
+ export async function exportBackup(
17
+ port: number,
18
+ token: string,
19
+ ): Promise<{ path: string; bytes: number; counts: Record<string, number> } | null> {
20
+ try {
21
+ const response = await fetch(`http://127.0.0.1:${port}/admin/export-backup`, {
22
+ method: "POST",
23
+ headers: { "content-type": "application/json", "x-drain-token": token },
24
+ body: JSON.stringify({}),
25
+ signal: AbortSignal.timeout(60_000),
26
+ });
27
+ if (!response.ok) {
28
+ const detail = await response.text().catch(() => "");
29
+ console.error(`The gateway refused the backup (HTTP ${response.status}). ${detail}`.trim());
30
+ return null;
31
+ }
32
+ return (await response.json()) as {
33
+ path: string;
34
+ bytes: number;
35
+ counts: Record<string, number>;
36
+ };
37
+ } catch {
38
+ console.error("Could not reach the gateway. Is it still running?");
39
+ return null;
40
+ }
41
+ }
42
+
43
+ /**
44
+ * Posts the console-account reset to the running gateway.
45
+ *
46
+ * Returns 0 on success and 1 on any failure so the caller can print one line
47
+ * either way.
48
+ */
49
+ export async function resetConsoleAccount(port: number, token: string): Promise<number> {
50
+ try {
51
+ const response = await fetch(`http://127.0.0.1:${port}/admin/reset-console-account`, {
52
+ method: "POST",
53
+ headers: { "content-type": "application/json", "x-drain-token": token },
54
+ body: JSON.stringify({ confirm: "RESET" }),
55
+ signal: AbortSignal.timeout(10_000),
56
+ });
57
+ if (!response.ok) {
58
+ const detail = await response.text().catch(() => "");
59
+ console.error(`The gateway refused the reset (HTTP ${response.status}). ${detail}`.trim());
60
+ return 1;
61
+ }
62
+ return 0;
63
+ } catch {
64
+ console.error("Could not reach the gateway. Is it still running?");
65
+ return 1;
66
+ }
67
+ }
68
+
69
+
70
+ /**
71
+ * Operator escape hatch: clears the console login lockout bucket.
72
+ *
73
+ * The lockout is keyed by `<username>:<clientIp>` and lasts an hour, and there
74
+ * is no console surface to clear it — a locked-out operator has no way back in
75
+ * short of editing the database by hand. This is the documented reset.
76
+ *
77
+ * Usage:
78
+ * cartethyia admin reset-lockout <username> <clientIp>
79
+ * cartethyia admin reset-lockout --all
80
+ */
81
+ export async function resetLockout(args: readonly string[]): Promise<void> {
82
+ const all = args.includes("--all");
83
+ const positional = args.filter((arg) => !arg.startsWith("--"));
84
+ if (!all && positional.length < 2) {
85
+ console.error("Usage: cartethyia admin reset-lockout <username> <clientIp>");
86
+ console.error(" cartethyia admin reset-lockout --all");
87
+ process.exit(1);
88
+ }
89
+
90
+ const env = await readEnvFile(ENV_PATH);
91
+ const databaseUrl = env.DATABASE_URL ?? process.env.DATABASE_URL;
92
+ if (!databaseUrl) {
93
+ console.error("✗ DATABASE_URL is not set; cannot reach the lockout table.");
94
+ process.exit(1);
95
+ }
96
+ process.env.DATABASE_URL = databaseUrl;
97
+
98
+ const { getDb, closeDb } = await import("../../src/persistence/boot");
99
+ const { consoleLockouts } = await import("../../src/persistence/schema");
100
+ const { eq, or } = await import("drizzle-orm");
101
+
102
+ const db = getDb();
103
+ try {
104
+ if (all) {
105
+ const cleared = await db.delete(consoleLockouts).returning({ ip: consoleLockouts.ip });
106
+ console.log(`✓ Cleared ${cleared.length} lockout row(s).`);
107
+ return;
108
+ }
109
+ const username = positional[0]!.trim().toLowerCase();
110
+ const clientIp = positional[1]!;
111
+ // The bucket key is `<identifier>:<ip>`; match either exact spelling so
112
+ // an operator does not have to guess how the identifier was normalized.
113
+ const cleared = await db
114
+ .delete(consoleLockouts)
115
+ .where(or(eq(consoleLockouts.ip, `${username}:${clientIp}`), eq(consoleLockouts.ip, clientIp)))
116
+ .returning({ ip: consoleLockouts.ip });
117
+ if (cleared.length === 0) {
118
+ console.log(`• No lockout row for ${username}:${clientIp} (already clear).`);
119
+ } else {
120
+ console.log(`✓ Cleared lockout for ${cleared.map((row) => row.ip).join(", ")}.`);
121
+ }
122
+ } finally {
123
+ await closeDb();
124
+ }
125
+ }