cartethyia 2.7.4 → 2.7.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (595) hide show
  1. package/.env.example +5 -0
  2. package/README.md +18 -6
  3. package/dist/dashboard/assets/BannedPage-B1N603cM.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-B1N603cM.js.gz +0 -0
  5. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js +3 -0
  6. package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js.gz +0 -0
  7. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js +1 -0
  8. package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-D762MIkp.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-D762MIkp.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js.gz +0 -0
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js +899 -0
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js.gz +0 -0
  19. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js +1 -0
  20. package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-C6WlpU5E.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js +5 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-DxjvUzSD.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-DxjvUzSD.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-OaHScjpX.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js.gz +0 -0
  37. package/dist/dashboard/assets/SetupPage-44BZrxFC.js +1 -0
  38. package/dist/dashboard/assets/SetupPage-44BZrxFC.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-DRPavCdU.js} +4 -4
  40. package/dist/dashboard/assets/StudioPage-DRPavCdU.js.gz +0 -0
  41. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js +1 -0
  42. package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js.gz +0 -0
  43. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js +56 -0
  44. package/dist/dashboard/assets/UsagePage-B7M7LvMM.js.gz +0 -0
  45. package/dist/dashboard/assets/api-keys-KvX83mRe.js +1 -0
  46. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  47. package/dist/dashboard/assets/app-DRnQLhsc.js +9 -0
  48. package/dist/dashboard/assets/app-DRnQLhsc.js.gz +0 -0
  49. package/dist/dashboard/assets/app-mweRcsKp.css +2 -0
  50. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  51. package/dist/dashboard/assets/assert-CidQVoNo.js +1 -0
  52. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  53. package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-BaX2GTrn.js} +1 -1
  54. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  55. package/dist/dashboard/assets/{banner-DympBNq4.js → banner-DFH4Bkte.js} +1 -1
  56. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  57. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  58. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  59. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  60. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  61. package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CxDw0lK6.js} +1 -1
  62. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  63. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
  64. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
  65. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js +1 -0
  66. package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js.gz +0 -0
  67. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +1 -0
  68. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  69. package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-DfS1ntiq.js} +1 -1
  70. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  71. package/dist/dashboard/assets/dialog-BK-NRr5u.js +1 -0
  72. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  73. package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-QqPul6sC.js} +1 -1
  74. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-BMlYJVFj.js +1 -0
  76. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D6WvojeD.js +4 -0
  78. package/dist/dashboard/assets/entry-D6WvojeD.js.gz +0 -0
  79. package/dist/dashboard/assets/entry-Dmx7gBiN.js +1 -0
  80. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  81. package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-u7JPB5BX.js} +1 -1
  82. package/dist/dashboard/assets/formatters-u7JPB5BX.js.gz +0 -0
  83. package/dist/dashboard/assets/house-h9AZlJuT.js +1 -0
  84. package/dist/dashboard/assets/house-h9AZlJuT.js.gz +0 -0
  85. package/dist/dashboard/assets/{index-DBNPOfhV.js → index-Ko4dLRnV.js} +2 -2
  86. package/dist/dashboard/assets/index-Ko4dLRnV.js.gz +0 -0
  87. package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-CHJQwxLa.js} +1 -1
  88. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  89. package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BlmlizVV.js} +1 -1
  90. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  91. package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-Bz93I-yE.js} +1 -1
  92. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  93. package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Ml16KCfu.js} +1 -1
  94. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  95. package/dist/dashboard/assets/live-7_QpnYGu.js +1 -0
  96. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  97. package/dist/dashboard/assets/{mutation-Rr0TIvcj.js → mutation-GU7XdEjz.js} +1 -1
  98. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  99. package/dist/dashboard/assets/network-CuMDaTzT.js +1 -0
  100. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  101. package/dist/dashboard/assets/numbers-CoqpaDMx.js +2 -0
  102. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  103. package/dist/dashboard/assets/pagination-B5aOoweZ.js +1 -0
  104. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  105. package/dist/dashboard/assets/providers/zai.webp +0 -0
  106. package/dist/dashboard/assets/providers/zcode.webp +0 -0
  107. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js → query-keys-YSoQOUh6.js} +1 -1
  108. package/dist/dashboard/assets/{query-keys-BloKtaXJ.js.gz → query-keys-YSoQOUh6.js.gz} +0 -0
  109. package/dist/dashboard/assets/quota-DJ1QlAOq.js +1 -0
  110. package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
  111. package/dist/dashboard/assets/routing-fnCsxgNO.js +1 -0
  112. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  113. package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BHqpd-bg.js} +2 -2
  114. package/dist/dashboard/assets/select-BHqpd-bg.js.gz +0 -0
  115. package/dist/dashboard/assets/settings-BxslsErn.js +1 -0
  116. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  117. package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
  118. package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
  119. package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-j7cXjgYX.js} +1 -1
  120. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  121. package/dist/dashboard/assets/{state-CkfdYWel.js → state-DHmEnLa2.js} +1 -1
  122. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  123. package/dist/dashboard/assets/{switch-SYm237HG.js → switch-DmZcyTIC.js} +1 -1
  124. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  125. package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-CbCP4w1o.js} +1 -1
  126. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  127. package/dist/dashboard/console-backgrounds.jpg +0 -0
  128. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  129. package/dist/dashboard/index.html +2 -2
  130. package/dist/dashboard/index.html.gz +0 -0
  131. package/dist/dashboard/precompressed-assets.json +60 -59
  132. package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
  133. package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
  134. package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
  135. package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
  136. package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
  137. package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
  138. package/migrations/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -0
  139. package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
  140. package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
  141. package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
  142. package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
  143. package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
  144. package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
  145. package/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
  146. package/package.json +4 -6
  147. package/scripts/cli/update.ts +15 -41
  148. package/src/boot/app.ts +58 -2
  149. package/src/boot/dependencies.ts +794 -732
  150. package/src/boot/lifecycle.ts +11 -12
  151. package/src/config/cooldowns.ts +34 -55
  152. package/src/config/network.ts +1 -1
  153. package/src/config/package-paths.ts +1 -1
  154. package/src/config/providers.ts +19 -14
  155. package/src/config/resources.ts +0 -5
  156. package/src/config/runtime.ts +2 -5
  157. package/src/config/spec.ts +33 -6
  158. package/src/config/usage.ts +27 -0
  159. package/src/console/api-keys/ban-constants.ts +38 -0
  160. package/src/console/api-keys/contracts.ts +71 -62
  161. package/src/console/api-keys/routes.ts +56 -24
  162. package/src/console/auth/access.ts +4 -4
  163. package/src/console/auth/account-reset.ts +1 -1
  164. package/src/console/auth/audit-recorder.ts +1 -1
  165. package/src/console/auth/lockout.ts +7 -3
  166. package/src/console/auth/row-coercion.ts +57 -12
  167. package/src/console/auth/session-resolver.ts +1 -1
  168. package/src/console/auth/session-service.ts +8 -2
  169. package/src/console/auth/session.ts +37 -31
  170. package/src/console/auth/setup-service.ts +4 -3
  171. package/src/console/auth/user-store.ts +1 -1
  172. package/src/console/backup/9router-map.ts +0 -3
  173. package/src/console/backup/contracts.ts +9 -9
  174. package/src/console/backup/export-endpoint.ts +5 -6
  175. package/src/console/backup/nine-router.ts +1 -7
  176. package/src/console/backup/routes.ts +29 -33
  177. package/src/console/backup/service.ts +468 -468
  178. package/src/console/backup/store.ts +47 -29
  179. package/src/console/backup/validate.ts +11 -1
  180. package/src/console/cli-tools/contracts.ts +43 -299
  181. package/src/console/cli-tools/fs-ops.ts +29 -0
  182. package/src/console/cli-tools/injectors/claude.ts +3 -3
  183. package/src/console/cli-tools/injectors/codex.ts +181 -181
  184. package/src/console/cli-tools/injectors/driver.ts +150 -247
  185. package/src/console/cli-tools/injectors/kilo.ts +146 -21
  186. package/src/console/cli-tools/injectors/opencode.ts +176 -153
  187. package/src/console/cli-tools/routes.ts +7 -1
  188. package/src/console/cli-tools/service.ts +8 -7
  189. package/src/console/cli-tools/store.ts +2 -2
  190. package/src/console/console-router.ts +32 -0
  191. package/src/console/dashboard-assets.ts +9 -9
  192. package/src/console/domain-registration.ts +16 -2
  193. package/src/console/inferhub/client.ts +0 -7
  194. package/src/console/inferhub/key-store.ts +1 -1
  195. package/src/console/inferhub/normalize.ts +2 -2
  196. package/src/console/inferhub/routes.ts +1 -1
  197. package/src/console/inferhub/types.ts +1 -1
  198. package/src/console/observability/contracts.ts +7 -1
  199. package/src/console/observability/live.ts +31 -18
  200. package/src/console/observability/logs.ts +1 -1
  201. package/src/console/observability/sse.ts +62 -8
  202. package/src/console/observability/store.ts +23 -4
  203. package/src/console/providers/catalog/catalog-projections.ts +1 -1
  204. package/src/console/providers/catalog/contracts.ts +39 -0
  205. package/src/console/providers/catalog/model-operations.ts +1 -1
  206. package/src/console/providers/catalog/provider-operations.ts +95 -17
  207. package/src/console/providers/catalog/public-model-store.ts +0 -0
  208. package/src/console/providers/catalog/routes.ts +27 -3
  209. package/src/console/providers/catalog/store.ts +147 -8
  210. package/src/console/providers/detail/routes.ts +1 -1
  211. package/src/console/providers/oauth/callback-listener.ts +100 -18
  212. package/src/console/providers/oauth/routes.ts +92 -13
  213. package/src/console/quota/account-quota-global.ts +41 -3
  214. package/src/console/quota/account-quota-shared.ts +10 -3
  215. package/src/console/quota/account-quota-tenant.ts +259 -66
  216. package/src/console/quota/daily-growth-job.ts +308 -0
  217. package/src/console/quota/native-identity.ts +2 -2
  218. package/src/console/quota/quota-view.ts +1 -1
  219. package/src/console/remote-support/routes.ts +1 -1
  220. package/src/console/remote-support/service.ts +2 -2
  221. package/src/console/routing/model/contracts.ts +1 -1
  222. package/src/console/routing/pools/contracts.ts +2 -2
  223. package/src/console/routing/pools/import-parse.ts +3 -3
  224. package/src/console/routing/pools/relay-deploy.ts +3 -3
  225. package/src/console/settings/contracts.ts +29 -2
  226. package/src/console/settings/store.ts +20 -0
  227. package/src/console/share/share-router.ts +100 -32
  228. package/src/console/share/share-stats.ts +11 -13
  229. package/src/console/share/share-usage.ts +1 -1
  230. package/src/console/shared/errors.ts +2 -2
  231. package/src/console/shared/object.ts +18 -0
  232. package/src/console/shared/read-through-cache.ts +4 -4
  233. package/src/console/shared/transaction.ts +14 -0
  234. package/src/console/system-prompt/contracts.ts +89 -12
  235. package/src/console/system-prompt/routes.ts +98 -45
  236. package/src/console/updates/apply-update.ts +244 -0
  237. package/src/console/updates/routes.ts +252 -97
  238. package/src/main.ts +11 -5
  239. package/src/network/http2-bidi.ts +1 -1
  240. package/src/network/ip-utils.ts +298 -0
  241. package/src/network/outbound-fetch.ts +1 -1
  242. package/src/network/pool/agent.ts +7 -6
  243. package/src/network/pool/byte-accounting.ts +1 -1
  244. package/src/network/pool/resolver.ts +16 -12
  245. package/src/network/pool/selector.ts +150 -136
  246. package/src/network/pool-health-machine.ts +1 -1
  247. package/src/network/rate-limit-verdict.ts +1 -1
  248. package/src/network/retry.ts +1 -1
  249. package/src/network/ssrf.ts +20 -71
  250. package/src/observability/event-log.ts +9 -2
  251. package/src/observability/event-query.ts +61 -291
  252. package/src/observability/log-sanitize.ts +1 -1
  253. package/src/observability/metrics.ts +4 -4
  254. package/src/observability/payload-capture.ts +6 -5
  255. package/src/observability/payload-store.ts +1 -1
  256. package/src/observability/runtime-metrics.ts +1 -1
  257. package/src/observability/telemetry-buffer.ts +19 -3
  258. package/src/observability/telemetry-reconciliation.ts +3 -3
  259. package/src/observability/token-speed.ts +1 -1
  260. package/src/persistence/connection-url.ts +1 -1
  261. package/src/persistence/db-handle.ts +1 -1
  262. package/src/persistence/db-pg.ts +2 -2
  263. package/src/persistence/db-sqlite.ts +3 -3
  264. package/src/persistence/dialect.ts +5 -1
  265. package/src/persistence/readiness.ts +1 -1
  266. package/src/persistence/redis.ts +1 -1
  267. package/src/persistence/schema.ts +121 -40
  268. package/src/persistence/shared-cache.ts +2 -2
  269. package/src/persistence/sort-order.ts +1 -1
  270. package/src/persistence/stores/api-key-store.ts +29 -2
  271. package/src/persistence/stores/share-store.ts +20 -8
  272. package/src/persistence/system-prompt-store.ts +63 -18
  273. package/src/persistence/tenant-preferences.ts +1 -1
  274. package/src/persistence/ttl-cache.ts +3 -3
  275. package/src/persistence/usage-flush.ts +7 -2
  276. package/src/protocol/canonical-model.ts +1 -1
  277. package/src/protocol/codecs.ts +6 -10
  278. package/src/protocol/dsml.ts +8 -125
  279. package/src/protocol/image-clamp.ts +2 -2
  280. package/src/protocol/reasoning-text.ts +1 -1
  281. package/src/protocol/reasoning.ts +7 -52
  282. package/src/protocol/registry.ts +50 -15
  283. package/src/protocol/request/chat.ts +46 -19
  284. package/src/protocol/request/codex.ts +1 -1
  285. package/src/protocol/request/messages.ts +46 -14
  286. package/src/protocol/request/responses.ts +19 -10
  287. package/src/protocol/response/chat.ts +25 -10
  288. package/src/protocol/response/codex.ts +1 -1
  289. package/src/protocol/response/messages.ts +1 -1
  290. package/src/protocol/response/omp-tool-call-markup.ts +1 -1
  291. package/src/protocol/response/responses.ts +1 -1
  292. package/src/protocol/sse-decoder.ts +50 -1
  293. package/src/protocol/stop-reason.ts +2 -2
  294. package/src/protocol/think-split.ts +347 -0
  295. package/src/protocol/translation/attachment-integrity.ts +3 -3
  296. package/src/protocol/translation/cache-controls.ts +8 -20
  297. package/src/protocol/translation/capabilities.ts +6 -6
  298. package/src/protocol/translation/dialect/deepseek.ts +10 -0
  299. package/src/protocol/translation/dialect/inband.ts +39 -0
  300. package/src/protocol/translation/dialect/model-thinking.ts +89 -0
  301. package/src/protocol/translation/dialect/qwen.ts +114 -0
  302. package/src/protocol/translation/dialect/resolver.ts +83 -0
  303. package/src/protocol/translation/dialect/rules.ts +93 -0
  304. package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
  305. package/src/protocol/translation/dialect/types.ts +58 -0
  306. package/src/protocol/translation/quirks.ts +18 -4
  307. package/src/protocol/translation/thinking.ts +12 -252
  308. package/src/protocol/translation/tool-id.ts +3 -3
  309. package/src/protocol/translation/tool-repair.ts +1 -1
  310. package/src/protocol/upstream/post-json.ts +6 -1
  311. package/src/providers/adapters/compatible-adapter.ts +71 -4
  312. package/src/providers/authentication/jwt-validator.ts +0 -5
  313. package/src/providers/authentication/oauth-client.ts +254 -253
  314. package/src/providers/authentication/oauth-flow-store.ts +42 -7
  315. package/src/providers/bundled-discovery-providers.ts +6 -30
  316. package/src/providers/configured-openai-providers.ts +82 -97
  317. package/src/providers/default-registry.ts +35 -37
  318. package/src/providers/discovery/catalog/catalog-format.ts +13 -2
  319. package/src/providers/discovery/discovery-types.ts +0 -1
  320. package/src/providers/discovery/openai-model-discovery.ts +2 -2
  321. package/src/providers/discovery/probe-phases.ts +48 -13
  322. package/src/providers/discovery/probing-service.ts +6 -8
  323. package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
  324. package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
  325. package/src/providers/integrations/antigravity/antigravity-protocol.ts +88 -28
  326. package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
  327. package/src/providers/integrations/antigravity/antigravity.ts +22 -13
  328. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
  329. package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
  330. package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
  331. package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
  332. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
  333. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
  334. package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
  335. package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
  336. package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
  337. package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
  338. package/src/providers/integrations/claude/claude-cch.ts +148 -148
  339. package/src/providers/integrations/claude/fallback-credit.ts +3 -7
  340. package/src/providers/integrations/cline/cline.ts +1 -1
  341. package/src/providers/integrations/codex/codex-device-code.ts +101 -101
  342. package/src/providers/integrations/codex/codex-oauth.ts +0 -1
  343. package/src/providers/integrations/commandcode/commandcode.ts +75 -115
  344. package/src/providers/integrations/commandcode/quota.ts +131 -51
  345. package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
  346. package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
  347. package/src/providers/integrations/cursor/cursor-request.ts +0 -87
  348. package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
  349. package/src/providers/integrations/cursor/cursor.ts +35 -3
  350. package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
  351. package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
  352. package/src/providers/integrations/factory/factory.ts +9 -9
  353. package/src/providers/integrations/github/github-discovery.ts +70 -12
  354. package/src/providers/integrations/github/github-oauth.ts +184 -14
  355. package/src/providers/integrations/github/github.ts +134 -26
  356. package/src/providers/integrations/grok/grok-oauth.ts +261 -261
  357. package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
  358. package/src/providers/integrations/grok/grok-quota.ts +16 -7
  359. package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
  360. package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
  361. package/src/providers/integrations/grok/grok.ts +86 -36
  362. package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
  363. package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
  364. package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
  365. package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
  366. package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
  367. package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
  368. package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
  369. package/src/providers/integrations/kiro/kiro-request.ts +8 -11
  370. package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
  371. package/src/providers/integrations/kiro/kiro.ts +80 -68
  372. package/src/providers/integrations/muse/muse-oauth.ts +0 -1
  373. package/src/providers/integrations/muse/muse-quota.ts +0 -4
  374. package/src/providers/integrations/opencode/fingerprint.ts +7 -5
  375. package/src/providers/integrations/opencode/provider.ts +17 -24
  376. package/src/providers/integrations/qoder/qoder-catalog.ts +94 -11
  377. package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
  378. package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
  379. package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
  380. package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
  381. package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
  382. package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
  383. package/src/providers/integrations/qoder/qoder.ts +422 -71
  384. package/src/providers/integrations/shared/connect.ts +0 -54
  385. package/src/providers/integrations/shared/hash.ts +15 -0
  386. package/src/providers/integrations/shared/session-cache.ts +136 -0
  387. package/src/providers/integrations/trae/trae-cache.ts +7 -87
  388. package/src/providers/integrations/trae/trae-catalog.ts +1 -6
  389. package/src/providers/integrations/trae/trae-protocol.ts +17 -8
  390. package/src/providers/integrations/trae/trae-realm.ts +0 -7
  391. package/src/providers/integrations/trae/trae.ts +51 -8
  392. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  393. package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
  394. package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
  395. package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
  396. package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
  397. package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
  398. package/src/providers/operations/account-error-classification.ts +198 -133
  399. package/src/providers/operations/account-health-service.ts +31 -39
  400. package/src/providers/operations/account-reset-service.ts +58 -1
  401. package/src/providers/operations/byok-wire-profile.ts +19 -15
  402. package/src/providers/operations/cli-platform.ts +31 -5
  403. package/src/providers/operations/client-version-resolver.ts +4 -6
  404. package/src/providers/operations/client-versions.ts +10 -7
  405. package/src/providers/operations/provider-catalog-seeder.ts +2 -0
  406. package/src/providers/operations/provider-catalog-service.ts +18 -2
  407. package/src/providers/operations/provider-credential-service.ts +19 -2
  408. package/src/providers/provider-contracts.ts +18 -7
  409. package/src/providers/provider-metadata.ts +17 -2
  410. package/src/providers/provider-model-definition.ts +22 -1
  411. package/src/providers/provider-probe.ts +4 -2
  412. package/src/providers/provider-usage.ts +50 -19
  413. package/src/providers/quota/cache.ts +29 -0
  414. package/src/providers/quota/quota-contracts.ts +4 -0
  415. package/src/providers/quota/refresh.ts +27 -4
  416. package/src/providers/quota/snapshot.ts +94 -0
  417. package/src/providers/search/search-provider.ts +1 -3
  418. package/src/providers/search/search-providers.ts +2 -1
  419. package/src/security/abuse.ts +4 -4
  420. package/src/security/admission/service.ts +13 -6
  421. package/src/security/admission/ttl.ts +61 -61
  422. package/src/security/api-key-auth.ts +17 -3
  423. package/src/security/client-router-fingerprint.ts +4 -4
  424. package/src/security/credential-codec.ts +3 -3
  425. package/src/security/csrf.ts +2 -2
  426. package/src/security/ip-boundary.ts +16 -189
  427. package/src/security/model-access-rule.ts +1 -1
  428. package/src/security/outbound-headers.ts +18 -0
  429. package/src/shared/invoke-guard.ts +47 -0
  430. package/src/transport/contracts.ts +13 -4
  431. package/src/transport/dispatch/attempt-finalize.ts +70 -22
  432. package/src/transport/dispatch/attempt-loop.ts +22 -0
  433. package/src/transport/dispatch/capture-policy.ts +34 -37
  434. package/src/transport/dispatch/empty-stream.ts +23 -20
  435. package/src/transport/dispatch/generation.ts +25 -45
  436. package/src/transport/dispatch/native-shared.ts +127 -0
  437. package/src/transport/dispatch/proxy-request.ts +3 -1
  438. package/src/transport/dispatch/responses-compact.ts +25 -46
  439. package/src/transport/dispatch/streaming/encoder.ts +18 -72
  440. package/src/transport/dispatch/streaming/finalize.ts +2 -2
  441. package/src/transport/dispatch/streaming/stream.ts +7 -3
  442. package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
  443. package/src/transport/dispatch/systemone.ts +20 -48
  444. package/src/transport/dispatch/token-count.ts +41 -38
  445. package/src/transport/dispatch/websearch.ts +19 -45
  446. package/src/transport/drain-endpoint.ts +1 -1
  447. package/src/transport/failure-policy.ts +21 -1
  448. package/src/transport/guards/auth-guard.ts +0 -6
  449. package/src/transport/guards/body-policy.ts +3 -3
  450. package/src/transport/guards/error-lifecycle.ts +4 -0
  451. package/src/transport/guards/headroom-guard.ts +1 -1
  452. package/src/transport/guards/pipeline.ts +1 -1
  453. package/src/transport/guards/request-context.ts +12 -17
  454. package/src/transport/request/preparer.ts +286 -7
  455. package/src/transport/request/rtk/compress-request.ts +3 -3
  456. package/src/transport/request/rtk/rtk-constants.ts +2 -2
  457. package/src/transport/request/rtk/rtk-filters.ts +8 -8
  458. package/src/transport/request/state.ts +7 -13
  459. package/src/transport/request/system-prompt-injection.ts +74 -11
  460. package/src/transport/request/tenant-preferences.ts +22 -0
  461. package/src/transport/routing/candidate-index.ts +2 -2
  462. package/src/transport/routing/round-robin.ts +1 -1
  463. package/src/transport/routing/route-catalog.ts +17 -18
  464. package/src/transport/routing/route-model.ts +126 -33
  465. package/src/transport/routing/router.ts +159 -37
  466. package/src/transport/shutdown-notice.ts +2 -2
  467. package/src/transport/surface/adapters.ts +3 -3
  468. package/src/transport/surface/chat/encode.ts +7 -7
  469. package/src/transport/surface/chat/parse.ts +7 -7
  470. package/src/transport/surface/completion.ts +2 -2
  471. package/src/transport/surface/content-parts.ts +1 -1
  472. package/src/transport/surface/dialects.ts +2 -2
  473. package/src/transport/surface/messages/parse.ts +3 -3
  474. package/src/transport/surface/reasoning-summary.ts +9 -14
  475. package/src/transport/surface/responses/adapter.ts +1 -1
  476. package/src/transport/surface/responses/errors.ts +0 -9
  477. package/src/transport/vision-handoff-cache.ts +58 -0
  478. package/src/transport/vision-handoff.ts +431 -0
  479. package/src/workers/account-identity-sweep.ts +2 -2
  480. package/src/workers/buddy-growth-tasks.ts +392 -346
  481. package/src/workers/daily-checkin.ts +102 -49
  482. package/src/workers/maintenance-lease.ts +2 -35
  483. package/src/workers/oauth-refresh-sweep.ts +8 -1
  484. package/src/workers/quota-refresh-sweep.ts +120 -82
  485. package/src/workers/scheduler.ts +67 -4
  486. package/src/workers/sweep-runner.ts +24 -5
  487. package/src/workers/zcode-gift-claim.ts +108 -0
  488. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
  489. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
  490. package/dist/dashboard/assets/BannedPage-ChG5svFb.js +0 -1
  491. package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
  492. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js +0 -1
  493. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
  494. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js +0 -1
  495. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
  496. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
  497. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
  498. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
  499. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
  500. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js +0 -1
  501. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
  502. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
  503. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
  504. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js +0 -1
  505. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
  506. package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
  507. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
  508. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
  509. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
  510. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
  511. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
  512. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  513. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
  514. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
  515. package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
  516. package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
  517. package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
  518. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
  519. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
  520. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js +0 -1
  521. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
  522. package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
  523. package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
  524. package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
  525. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js +0 -1
  526. package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
  527. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
  528. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
  529. package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
  530. package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
  531. package/dist/dashboard/assets/app-BayTTy01.js +0 -9
  532. package/dist/dashboard/assets/app-BayTTy01.js.gz +0 -0
  533. package/dist/dashboard/assets/app-a159k0ub.css +0 -2
  534. package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
  535. package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
  536. package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
  537. package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
  538. package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
  539. package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
  540. package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
  541. package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
  542. package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
  543. package/dist/dashboard/assets/dialog-8fiE6tec.js +0 -1
  544. package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
  545. package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
  546. package/dist/dashboard/assets/entry-BSAsYsmV.js +0 -1
  547. package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
  548. package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
  549. package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
  550. package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
  551. package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
  552. package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
  553. package/dist/dashboard/assets/github-badge-CPK47xQx.js +0 -1
  554. package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
  555. package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
  556. package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
  557. package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
  558. package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
  559. package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
  560. package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
  561. package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
  562. package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
  563. package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
  564. package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
  565. package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
  566. package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
  567. package/dist/dashboard/assets/providers/zai-coding-plan.svg +0 -6
  568. package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
  569. package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
  570. package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
  571. package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
  572. package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
  573. package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
  574. package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
  575. package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
  576. package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
  577. package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
  578. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
  579. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  580. package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
  581. package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
  582. package/src/console/cli-tools/injectors/cline.ts +0 -110
  583. package/src/console/cli-tools/injectors/copilot.ts +0 -108
  584. package/src/console/cli-tools/injectors/cowork.ts +0 -64
  585. package/src/console/cli-tools/injectors/deepseek-tui.ts +0 -85
  586. package/src/console/cli-tools/injectors/droid.ts +0 -96
  587. package/src/console/cli-tools/injectors/grok-build.ts +0 -70
  588. package/src/console/cli-tools/injectors/hermes.ts +0 -101
  589. package/src/console/cli-tools/injectors/jcode.ts +0 -115
  590. package/src/console/cli-tools/injectors/openclaw.ts +0 -161
  591. package/src/network/response-headers.ts +0 -39
  592. package/src/protocol/response/dsml.ts +0 -38
  593. package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
  594. /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
  595. /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
@@ -38,6 +38,7 @@ import { appendFile, mkdir } from "node:fs/promises";
38
38
  import { getTableColumns, type Column, type SQL, type Table } from "drizzle-orm";
39
39
  import type { CartethyiaDatabase } from "../../persistence/db-handle";
40
40
  import { decryptCredentialToString, encryptCredential } from "../../security/crypto";
41
+ import { asConsoleDb } from "../shared/transaction";
41
42
  import {
42
43
  apiKeys,
43
44
  cliToolMappings,
@@ -75,7 +76,7 @@ import {
75
76
  tableName,
76
77
  type BackupBytes,
77
78
  type BackupDate,
78
- type BackupExportResult,
79
+ type BackupPayloadExport,
79
80
  type BackupPayload,
80
81
  type BackupRow,
81
82
  type ValidatedRestore,
@@ -187,11 +188,15 @@ function decodeCell(value: unknown, dataType: string): unknown {
187
188
  }
188
189
 
189
190
  /** Column name → the object key Drizzle uses for it, and its data type. */
191
+ const COLUMN_INDEX_CACHE = new WeakMap<Table, ReadonlyMap<string, { key: string; dataType: string }>>();
190
192
  function columnIndex(table: Table): ReadonlyMap<string, { key: string; dataType: string }> {
193
+ const cached = COLUMN_INDEX_CACHE.get(table);
194
+ if (cached) return cached;
191
195
  const out = new Map<string, { key: string; dataType: string }>();
192
196
  for (const [key, column] of Object.entries(getTableColumns(table))) {
193
197
  out.set(column.name, { key, dataType: column.dataType });
194
198
  }
199
+ COLUMN_INDEX_CACHE.set(table, out);
195
200
  return out;
196
201
  }
197
202
 
@@ -386,13 +391,6 @@ async function* pagedTelemetryEvents(
386
391
  }
387
392
  }
388
393
 
389
- /**
390
- * Streams the payload document: the requested tables, grouped into their
391
- * sections, written membrane-incrementally so the process never holds a table
392
- * — let alone every table and a second JSON copy — in memory. Consumed
393
- * chunks concatenated are exactly the JSON the buffered variant used to
394
- * stringify in one piece.
395
- */
396
394
  /**
397
395
  * Streams the payload document: the requested tables, grouped into their
398
396
  * sections, written incrementally so the process never holds a table — let
@@ -571,7 +569,7 @@ export async function exportBackup(
571
569
  db: CartethyiaDatabase,
572
570
  tables: readonly Table[],
573
571
  tenantId: string,
574
- ): Promise<BackupExportResult> {
572
+ ): Promise<BackupPayloadExport> {
575
573
  const stream = exportBackupStream(db, tables, tenantId);
576
574
  let document = "";
577
575
  for await (const chunk of stream.jsonChunks) document += chunk;
@@ -618,7 +616,7 @@ export async function compressBackupStream(chunks: AsyncGenerator<string, void,
618
616
  const GZIP_MAGIC = [0x1f, 0x8b] as const;
619
617
 
620
618
  /** Whether `bytes` starts with the gzip magic. */
621
- export function isGzipBytes(bytes: Uint8Array): boolean {
619
+ function isGzipBytes(bytes: Uint8Array): boolean {
622
620
  return GZIP_MAGIC.every((byte, index) => bytes[index] === byte);
623
621
  }
624
622
 
@@ -722,7 +720,6 @@ function createdAtIso(value: unknown): string {
722
720
  * timestamps are normalised in SQL to the same ISO spelling the payload uses,
723
721
  * so the two sides are comparable regardless of how the driver types them.
724
722
  */
725
- /** Natural keys already present in the event file, so a re-import skips them. */
726
723
  async function existingEventFileKeys(db: CartethyiaDatabase, tenantId: string, rows: readonly BackupRow[]): Promise<Set<string>> {
727
724
  const wanted = new Set(rows.map((row) => row.request_id).filter((id): id is string => typeof id === "string"));
728
725
  if (wanted.size === 0) return new Set();
@@ -894,9 +891,8 @@ async function insertRows(
894
891
  // stays writable and the per-row path can isolate the offending row.
895
892
  const count = await tx.transaction(async (innerTx) => {
896
893
  // Drizzle types the nested transaction callback with the dialect's
897
- // own transaction handle; cast once to a named local with a reason,
898
- // never inline on member access.
899
- const inner = innerTx as unknown as CartethyiaDatabase; // nested-tx handle; mirrors applyRestore's outer `scoped` cast on line 607.
894
+ // own transaction handle; normalize once via the shared helper.
895
+ const inner = asConsoleDb(innerTx);
900
896
  const statement = inner.insert(table).values(chunk as never);
901
897
  if (options.ignoreConflicts) {
902
898
  if (options.conflictTarget === undefined) {
@@ -1003,22 +999,46 @@ export async function normalizeShareChildPolicy(
1003
999
  db: CartethyiaDatabase,
1004
1000
  tenantId: string,
1005
1001
  ): Promise<void> {
1002
+ // Template policy columns are nulled on every child so auth reads the full
1003
+ // policy from the parent (`policy = parent ?? row`). The exception is a
1004
+ // `per_key` concurrency child: it carries its own cap (copied at issue) and
1005
+ // its own admission identity, so `concurrency_scope` and
1006
+ // `max_concurrent_requests` are preserved for those rows.
1007
+ const policyNulls = {
1008
+ notesTitle: null,
1009
+ notesSubtitle: null,
1010
+ notesBody: null,
1011
+ requestsPerMinute: null,
1012
+ dailyTokenLimit: null,
1013
+ monthlyTokenLimit: null,
1014
+ lifetimeTokenBudget: null,
1015
+ modelPrefix: null,
1016
+ modelList: null,
1017
+ clientRouterDenylist: null,
1018
+ };
1006
1019
  await db
1007
1020
  .update(apiKeys)
1008
1021
  .set({
1009
- notesTitle: null,
1010
- notesSubtitle: null,
1011
- notesBody: null,
1012
- requestsPerMinute: null,
1013
- dailyTokenLimit: null,
1014
- monthlyTokenLimit: null,
1015
- lifetimeTokenBudget: null,
1022
+ ...policyNulls,
1016
1023
  maxConcurrentRequests: null,
1017
- modelPrefix: null,
1018
- modelList: null,
1019
- clientRouterDenylist: null,
1020
1024
  })
1021
- .where(and(eq(apiKeys.tenantId, tenantId), isNotNull(apiKeys.parentKeyId)));
1025
+ .where(
1026
+ and(
1027
+ eq(apiKeys.tenantId, tenantId),
1028
+ isNotNull(apiKeys.parentKeyId),
1029
+ sql`${apiKeys.concurrencyScope} <> 'per_key'`,
1030
+ ),
1031
+ );
1032
+ await db
1033
+ .update(apiKeys)
1034
+ .set(policyNulls)
1035
+ .where(
1036
+ and(
1037
+ eq(apiKeys.tenantId, tenantId),
1038
+ isNotNull(apiKeys.parentKeyId),
1039
+ eq(apiKeys.concurrencyScope, "per_key"),
1040
+ ),
1041
+ );
1022
1042
  }
1023
1043
 
1024
1044
  /**
@@ -1046,7 +1066,7 @@ export async function applyRestore(
1046
1066
  const skipped: Record<string, number> = {};
1047
1067
 
1048
1068
  await db.transaction(async (tx) => {
1049
- const scoped = tx as unknown as CartethyiaDatabase;
1069
+ const scoped = asConsoleDb(tx);
1050
1070
 
1051
1071
  // The tenant row is ensured, never replaced: it almost always exists, and
1052
1072
  // its PK is `id`, so a conflict means "already there" rather than an error.
@@ -1199,7 +1219,7 @@ export async function deleteAll(
1199
1219
  const apiKeyIds: string[] = [];
1200
1220
 
1201
1221
  await db.transaction(async (tx) => {
1202
- const scoped = tx as unknown as CartethyiaDatabase;
1222
+ const scoped = asConsoleDb(tx);
1203
1223
  const remove = async (table: Table, filter: SQL, name = tableName(table)): Promise<void> => {
1204
1224
  const rows = await scoped.delete(table).where(filter).returning();
1205
1225
  if (rows.length > 0) deleted[name] = (deleted[name] ?? 0) + rows.length;
@@ -1241,5 +1261,3 @@ export async function deleteAll(
1241
1261
 
1242
1262
  return { deleted, apiKeyIds };
1243
1263
  }
1244
-
1245
- export { and, eq };
@@ -101,12 +101,17 @@ function normalizeLegacyCiphertext(table: Table, row: Record<string, unknown>):
101
101
  return normalized;
102
102
  }
103
103
 
104
+ const COLUMN_TYPES_CACHE = new WeakMap<Table, ReadonlyMap<string, string>>();
105
+
104
106
  /** Column name → its Drizzle data type, so validation knows what may nest. */
105
107
  function columnTypes(table: Table): ReadonlyMap<string, string> {
108
+ const cached = COLUMN_TYPES_CACHE.get(table);
109
+ if (cached) return cached;
106
110
  const out = new Map<string, string>();
107
111
  for (const column of Object.values(getTableColumns(table))) {
108
112
  out.set(column.name, column.dataType);
109
113
  }
114
+ COLUMN_TYPES_CACHE.set(table, out);
110
115
  return out;
111
116
  }
112
117
 
@@ -122,7 +127,11 @@ function columnTypes(table: Table): ReadonlyMap<string, string> {
122
127
  * would write a row the operator never had, and guessing wrong on a credential
123
128
  * column is worse than not restoring that one row.
124
129
  */
130
+ const REQUIRED_COLUMNS_CACHE = new WeakMap<Table, ReadonlySet<string>>();
131
+
125
132
  function requiredColumns(table: Table): ReadonlySet<string> {
133
+ const cached = REQUIRED_COLUMNS_CACHE.get(table);
134
+ if (cached) return cached;
126
135
  const out = new Set<string>();
127
136
  for (const column of Object.values(getTableColumns(table))) {
128
137
  if (!column.notNull || column.hasDefault) continue;
@@ -132,11 +141,12 @@ function requiredColumns(table: Table): ReadonlySet<string> {
132
141
  if (column.name === "tenant_id") continue;
133
142
  out.add(column.name);
134
143
  }
144
+ REQUIRED_COLUMNS_CACHE.set(table, out);
135
145
  return out;
136
146
  }
137
147
 
138
148
  /** Detection outcome for an uploaded file. */
139
- export type DetectedFormat =
149
+ type DetectedFormat =
140
150
  | { readonly kind: "native"; readonly payload: Record<string, unknown> }
141
151
  | { readonly kind: "nine_router"; readonly payload: Record<string, unknown> }
142
152
  | { readonly kind: "unknown"; readonly reason: string };
@@ -6,12 +6,11 @@ import { ensureV1Suffix } from "./fs-ops";
6
6
  * CLI Tools type contracts — shared across registry, injectors, service,
7
7
  * dashboard, and API routes.
8
8
  *
9
- * Each supported CLI coding agent ([CC], Codex, Cline, etc.) has a `ToolDef`
10
- * with static metadata and (when `configType !== "guide"`) a paired
11
- * `ToolInjector` that reads and writes the tool's config files on the host
12
- * filesystem. The dashboard picks an API key + models, POSTs to the backend,
13
- * and the injector merges Cartethyia-specific fields into the tool's config
14
- * without clobbering user settings.
9
+ * Each supported CLI coding agent ([CC], Codex, Kilo, OpenCode) has a `ToolDef`
10
+ * with static metadata and a paired `ToolInjector` that reads and writes the
11
+ * tool's config files on the host filesystem. The dashboard picks an API key +
12
+ * models, POSTs to the backend, and the injector merges Cartethyia-specific
13
+ * fields into the tool's config without clobbering user settings.
15
14
  */
16
15
 
17
16
  /**
@@ -19,13 +18,13 @@ import { ensureV1Suffix } from "./fs-ops";
19
18
  * sibling project used `openai-chat | openai-responses | anthropic-messages`;
20
19
  * Cartethyia's canonical surface vocabulary is the shorter form.
21
20
  */
22
- export type CliToolSurface = "chat" | "responses" | "messages";
21
+ type CliToolSurface = "chat" | "responses" | "messages";
23
22
 
24
23
  /** How the tool's config is managed. */
25
- export type ConfigType = "env" | "custom" | "guide";
24
+ type ConfigType = "env" | "custom";
26
25
 
27
26
  /** A native model slot exposed by a CLI tool. */
28
- export interface ToolModelDef {
27
+ interface ToolModelDef {
29
28
  readonly id: string;
30
29
  readonly name: string;
31
30
  readonly alias: string;
@@ -53,6 +52,13 @@ export interface CliMappingInput {
53
52
  /** The user-facing routing mode for a CLI tool: `remote` routes are resolved by the gateway, `local` routes are baked into the tool's own config file. */
54
53
  export type CliMappingMode = "remote" | "local";
55
54
 
55
+ /**
56
+ * The default runtime SDK package for OpenCode: its native
57
+ * `@opencode/ai/providers/openai-compatible` package (bundled with OpenCode
58
+ * itself, not the AI SDK).
59
+ */
60
+ export const DEFAULT_SDK: string = "@opencode/ai/providers/openai-compatible";
61
+
56
62
  /** Persisted mapping settings for one CLI tool + API key pair. */
57
63
  export interface CliMappingSettings {
58
64
  readonly toolId: string;
@@ -63,26 +69,11 @@ export interface CliMappingSettings {
63
69
  }
64
70
 
65
71
  /** A note shown in the tool card UI. */
66
- export interface ToolNote {
72
+ interface ToolNote {
67
73
  readonly type: "info" | "warning" | "error";
68
74
  readonly text: string;
69
75
  }
70
76
 
71
- /** A guide step for guide-only tools. */
72
- export interface GuideStep {
73
- readonly step: number;
74
- readonly title: string;
75
- readonly desc?: string;
76
- readonly value?: string;
77
- readonly type?: "apiKeySelector" | "modelSelector";
78
- }
79
-
80
- /** A code block for guide-only tools. */
81
- export interface GuideCodeBlock {
82
- readonly language: string;
83
- readonly code: string;
84
- }
85
-
86
77
  /** Static metadata for a CLI tool — consumed by both backend and frontend. */
87
78
  export interface ToolDef {
88
79
  readonly id: string;
@@ -95,8 +86,6 @@ export interface ToolDef {
95
86
  readonly settingsFile?: string;
96
87
  readonly docsUrl?: string;
97
88
  readonly notes?: readonly ToolNote[];
98
- readonly guideSteps?: readonly GuideStep[];
99
- readonly codeBlock?: GuideCodeBlock;
100
89
  /**
101
90
  * How this tool's slot→route mapping behaves, which also decides whether the
102
91
  * tool has a mapping surface at all.
@@ -109,9 +98,7 @@ export interface ToolDef {
109
98
  * so a slot has one value (written to the file) rather than a separate
110
99
  * target. There is nothing to persist; the model is baked into the file.
111
100
  *
112
- * Absent means the tool exposes no configurable model slots at all (a
113
- * guide-only tool). This replaces a separate `mappingSupported` flag that
114
- * had to be kept consistent with the mode by hand — the mode already says it.
101
+ * Absent means the tool exposes no configurable model slots at all.
115
102
  */
116
103
  readonly mappingMode?: CliMappingMode;
117
104
  }
@@ -137,8 +124,6 @@ export type ToolRegistryEntry = Pick<
137
124
  | "settingsFile"
138
125
  | "docsUrl"
139
126
  | "notes"
140
- | "guideSteps"
141
- | "codeBlock"
142
127
  > & { readonly mappingSupported: boolean };
143
128
 
144
129
  /** Runtime status of a CLI tool on the host. */
@@ -175,6 +160,17 @@ export interface ApplyInput {
175
160
  readonly mapping?: CliMappingInput;
176
161
  /** Enables [CC]'s bypass-permissions (YOLO) mode when explicitly selected. */
177
162
  readonly bypassPermissions?: boolean;
163
+ /**
164
+ * The runtime SDK package to write into the tool's config (e.g. OpenCode's
165
+ * `provider.*.npm`). Absent = the tool's default.
166
+ */
167
+ readonly sdk?: string;
168
+ /**
169
+ * WebSearch provider selection written into OpenCode's config. "carte"
170
+ * routes search through the Cartethyia gateway; "native" (or absent) leaves
171
+ * OpenCode's own provider selection in place.
172
+ */
173
+ readonly websearch?: string;
178
174
  }
179
175
 
180
176
  /** Result of an apply or reset operation. */
@@ -182,6 +178,8 @@ export interface ApplyResult {
182
178
  readonly success: boolean;
183
179
  readonly settingsPath?: string;
184
180
  readonly message: string;
181
+ /** Non-fatal notes for the operator, e.g. preserved pre-existing providers. */
182
+ readonly warnings?: readonly string[];
185
183
  }
186
184
 
187
185
  /**
@@ -195,9 +193,9 @@ export interface ApplyResult {
195
193
  * persisted routing rows on each `/v1/*` call. Works when the gateway is
196
194
  * remote, containerised, or the CLI lives on another machine.
197
195
  * - `both` — the tool's config was written and a remote route was recorded.
198
- * - `none` — nothing ran: the tool has no injectable config (a guide tool) and
199
- * the request asked for no remote route. Reported rather than folded into
200
- * `file`, so the UI never claims a write that did not happen.
196
+ * - `none` — nothing ran: the tool has no injectable config and the request
197
+ * asked for no remote route. Reported rather than folded into `file`, so
198
+ * the UI never claims a write that did not happen.
201
199
  */
202
200
  export type ApplyOutcome = "file" | "remote" | "both" | "none";
203
201
 
@@ -210,6 +208,8 @@ export interface ApplyConfigResult {
210
208
  readonly savedRemoteRoute: boolean;
211
209
  readonly settingsPath?: string;
212
210
  readonly message: string;
211
+ /** Non-fatal notes for the operator (see `ApplyResult.warnings`). */
212
+ readonly warnings?: readonly string[];
213
213
  }
214
214
 
215
215
  /** Result of a download-config operation. */
@@ -220,8 +220,7 @@ export interface DownloadResult {
220
220
  }
221
221
 
222
222
  /**
223
- * Injector contract — one per file-based tool.
224
- * Guide-only tools share a single GuideInjector that generates config text.
223
+ * Injector contract — one per tool.
225
224
  */
226
225
  export interface ToolInjector {
227
226
  readonly toolId: string;
@@ -235,7 +234,7 @@ export interface ToolInjector {
235
234
  export type AllStatusesResult = Readonly<Record<string, ToolStatus>>;
236
235
 
237
236
  /** Status details extracted from a tool's configuration file(s). */
238
- export interface StatusDetails {
237
+ interface StatusDetails {
239
238
  readonly configured: boolean;
240
239
  readonly currentEndpoint?: string | null | undefined;
241
240
  readonly currentApiKeyPrefix?: string | null | undefined;
@@ -325,8 +324,12 @@ export interface InjectorSpec {
325
324
  /** Extract status details from existing settings file(s) */
326
325
  readonly readStatus: (path: string) => Promise<StatusDetails> | StatusDetails;
327
326
 
328
- /** Apply Cartethyia configuration to the settings file(s) */
329
- readonly apply: (input: ApplyInput, path: string) => Promise<void> | void;
327
+ /**
328
+ * Apply Cartethyia configuration to the settings file(s). Return an array of
329
+ * non-fatal warning strings to surface them to the operator (e.g. preserved
330
+ * pre-existing providers).
331
+ */
332
+ readonly apply: (input: ApplyInput, path: string) => Promise<readonly string[] | void> | readonly string[] | void;
330
333
 
331
334
  /**
332
335
  * Reset Cartethyia configuration from settings file(s).
@@ -449,32 +452,6 @@ export const TOOL_REGISTRY = {
449
452
  ],
450
453
  },
451
454
 
452
- cline: {
453
- id: "cline",
454
- name: "Cline",
455
- color: "#00D1B2",
456
- description: "Cline AI Coding Assistant (VS Code)",
457
- configType: "custom" as const,
458
- surface: "chat" as const,
459
- settingsFile: "~/.cline/data/globalState.json",
460
- defaultModels: [
461
- {
462
- id: "claude/claude-sonnet-5",
463
- name: "Claude Sonnet 5",
464
- alias: "sonnet",
465
- roleLabel: "Primary Agent",
466
- roleKind: "primary",
467
- },
468
- {
469
- id: "claude/claude-opus-4-8",
470
- name: "Claude Opus",
471
- alias: "opus",
472
- roleLabel: "Advanced Agent",
473
- roleKind: "secondary",
474
- },
475
- ],
476
- },
477
-
478
455
  opencode: {
479
456
  id: "opencode",
480
457
  name: "OpenCode",
@@ -501,86 +478,6 @@ export const TOOL_REGISTRY = {
501
478
  ],
502
479
  },
503
480
 
504
- droid: {
505
- id: "droid",
506
- name: "Factory Droid",
507
- color: "#00D4FF",
508
- description: "Factory Droid AI Assistant",
509
- configType: "custom" as const,
510
- surface: "chat" as const,
511
- settingsFile: "~/.factory/settings.json",
512
- defaultModels: [
513
- { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
514
- { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
515
- ],
516
- },
517
-
518
- hermes: {
519
- id: "hermes",
520
- name: "Hermes Agent",
521
- color: "#8B5CF6",
522
- description: "Nous Research self-improving AI agent",
523
- configType: "custom" as const,
524
- surface: "chat" as const,
525
- settingsFile: "~/.hermes/config.yaml",
526
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
527
- },
528
-
529
- "grok-build": {
530
- id: "grok-build",
531
- name: "Grok Build",
532
- color: "#1DA1F2",
533
- description: "xAI Grok Build CLI",
534
- configType: "custom" as const,
535
- surface: "chat" as const,
536
- settingsFile: "~/.grok/config.toml",
537
- defaultModels: [{ id: "grok/grok-4", name: "Grok 4", alias: "grok-4" }],
538
- },
539
-
540
- copilot: {
541
- id: "copilot",
542
- name: "GitHub Copilot",
543
- color: "#1F6FEB",
544
- description: "GitHub Copilot Chat (VS Code chatLanguageModels.json)",
545
- configType: "custom" as const,
546
- surface: "chat" as const,
547
- settingsFile: "Code/User/chatLanguageModels.json",
548
- defaultModels: [
549
- { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
550
- { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
551
- ],
552
- },
553
-
554
- "deepseek-tui": {
555
- id: "deepseek-tui",
556
- name: "DeepSeek TUI",
557
- color: "#4D6BFE",
558
- description: "DeepSeek Terminal Coding Agent (Rust TUI)",
559
- configType: "custom" as const,
560
- surface: "chat" as const,
561
- settingsFile: "~/.deepseek/config.toml",
562
- defaultModels: [
563
- { id: "deepseek/deepseek-chat", name: "DeepSeek Chat", alias: "deepseek-chat" },
564
- {
565
- id: "deepseek/deepseek-reasoner",
566
- name: "DeepSeek Reasoner",
567
- alias: "deepseek-reasoner",
568
- },
569
- ],
570
- },
571
-
572
- jcode: {
573
- id: "jcode",
574
- name: "jcode",
575
- color: "#FF6B35",
576
- description: "High-performance Rust-based coding agent harness",
577
- configType: "custom" as const,
578
- surface: "chat" as const,
579
- settingsFile: "~/.jcode/config.toml",
580
- docsUrl: "https://github.com/1jehuang/jcode",
581
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
582
- },
583
-
584
481
  kilo: {
585
482
  id: "kilo",
586
483
  name: "Kilo Code",
@@ -591,159 +488,6 @@ export const TOOL_REGISTRY = {
591
488
  settingsFile: "~/.local/share/kilo/auth.json",
592
489
  defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
593
490
  },
594
-
595
- openclaw: {
596
- id: "openclaw",
597
- name: "Open Claw",
598
- color: "#FF6B35",
599
- description: "Open Claw AI Assistant",
600
- configType: "custom" as const,
601
- surface: "messages" as const,
602
- settingsFile: "~/.openclaw/openclaw.json",
603
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
604
- },
605
-
606
- cowork: {
607
- id: "cowork",
608
- name: "Claude Cowork",
609
- color: "#D97757",
610
- description: "Claude Desktop Cowork (third-party inference)",
611
- configType: "custom" as const,
612
- surface: "messages" as const,
613
- settingsFile: "Claude/configLibrary/_meta.json",
614
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
615
- },
616
- // ── Guide-only tools (no fs injection — show steps + downloadable config) ──
617
- roo: {
618
- id: "roo",
619
- name: "Roo",
620
- color: "#FF6B6B",
621
- description: "Roo AI Assistant",
622
- configType: "guide" as const,
623
- surface: "chat" as const,
624
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
625
- guideSteps: [
626
- { step: 1, title: "Open Settings", desc: "Go to Roo Settings panel" },
627
- { step: 2, title: "Select Provider", desc: "Choose API Provider → Ollama" },
628
- { step: 3, title: "Base URL", value: "{{baseUrl}}" },
629
- { step: 4, title: "API Key", type: "apiKeySelector" },
630
- { step: 5, title: "Select Model", type: "modelSelector" },
631
- ],
632
- },
633
-
634
- continue: {
635
- id: "continue",
636
- name: "Continue",
637
- color: "#7C3AED",
638
- description: "Continue AI Assistant",
639
- configType: "guide" as const,
640
- surface: "chat" as const,
641
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
642
- guideSteps: [
643
- { step: 1, title: "Open Config", desc: "Open Continue configuration file" },
644
- { step: 2, title: "API Key", type: "apiKeySelector" },
645
- { step: 3, title: "Select Model", type: "modelSelector" },
646
- {
647
- step: 4,
648
- title: "Add Model Config",
649
- desc: "Add the following configuration to your models array:",
650
- },
651
- ],
652
- codeBlock: {
653
- language: "json",
654
- code: `{
655
- "apiBase": "{{baseUrl}}",
656
- "title": "{{model}}",
657
- "model": "{{model}}",
658
- "provider": "openai",
659
- "apiKey": "{{apiKey}}"
660
- }`,
661
- },
662
- },
663
-
664
- amp: {
665
- id: "amp",
666
- name: "Amp CLI",
667
- color: "#F97316",
668
- description: "Sourcegraph Amp coding assistant CLI",
669
- configType: "guide" as const,
670
- surface: "chat" as const,
671
- docsUrl: "/docs?section=cli-tools&tool=amp",
672
- defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
673
- notes: [
674
- {
675
- type: "info",
676
- text: "Use Cartethyia model aliases to keep Amp shorthand mappings stable across provider updates.",
677
- },
678
- ],
679
- guideSteps: [
680
- {
681
- step: 1,
682
- title: "Install Amp",
683
- desc: "Install the Amp CLI using the package manager supported by your environment.",
684
- },
685
- { step: 2, title: "API Key", type: "apiKeySelector" },
686
- { step: 3, title: "Base URL", value: "{{baseUrl}}" },
687
- { step: 4, title: "Select Model", type: "modelSelector" },
688
- {
689
- step: 5,
690
- title: "Add Shorthands",
691
- desc: "Map Amp shorthand names to Cartethyia aliases in your local config.",
692
- },
693
- ],
694
- codeBlock: {
695
- language: "bash",
696
- code: `export OPENAI_API_KEY="{{apiKey}}"
697
- export OPENAI_BASE_URL="{{baseUrl}}"
698
- amp --model "{{model}}"`,
699
- },
700
- },
701
-
702
- qwen: {
703
- id: "qwen",
704
- name: "Qwen Code",
705
- color: "#10B981",
706
- description: "Alibaba Qwen Code CLI — OpenAI-compatible via Cartethyia",
707
- configType: "guide" as const,
708
- surface: "chat" as const,
709
- docsUrl: "https://qwenlm.github.io/qwen-code-docs/en/users/configuration/model-providers/",
710
- defaultModels: [
711
- { id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
712
- { id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
713
- ],
714
- notes: [
715
- {
716
- type: "warning",
717
- text: "Config path: Linux/macOS ~/.qwen/settings.json - Windows %USERPROFILE%\\.qwen\\settings.json",
718
- },
719
- ],
720
- guideSteps: [
721
- { step: 1, title: "Install Qwen Code", desc: "npm install -g @qwen-code/qwen-code" },
722
- { step: 2, title: "API Key", type: "apiKeySelector" },
723
- { step: 3, title: "Base URL", value: "{{baseUrl}}" },
724
- { step: 4, title: "Select Model", type: "modelSelector" },
725
- {
726
- step: 5,
727
- title: "Save Config",
728
- desc: "Copy the JSON below to your ~/.qwen/settings.json file.",
729
- },
730
- ],
731
- codeBlock: {
732
- language: "json",
733
- code: `{
734
- "security": {
735
- "auth": {
736
- "selectedType": "openai",
737
- "apiKey": "{{apiKey}}",
738
- "baseUrl": "{{baseUrl}}"
739
- }
740
- },
741
- "model": {
742
- "name": "{{model}}"
743
- }
744
- }`,
745
- },
746
- },
747
491
  } satisfies Record<string, ToolDef>;
748
492
 
749
493
  export type ToolId = keyof typeof TOOL_REGISTRY;