cartethyia 2.7.7 → 2.7.9

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 (372) hide show
  1. package/.env.example +0 -1
  2. package/README.md +29 -59
  3. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
  5. package/dist/dashboard/assets/{CliToolDetailPage-CLUhmjUy.js → CliToolDetailPage-ixwgKk53.js} +1 -1
  6. package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-CQmrqqrk.js → CliToolsPage-BmttNV3U.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
  17. package/dist/dashboard/assets/{InjectSystemPromptPanel-C-e2AMz6.js → InjectSystemPromptPanel-BOoO8rpz.js} +2 -2
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-J8wPbmfT.js → LoginPage-ChJuNNVN.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-C6WlpU5E.js → ModelPicker-BZAJtPg1.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +8 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-BBTRBAQ3.js → ProxyPage-BJ87Pp0U.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
  33. package/dist/dashboard/assets/{QuotaPage-B2WqMSG1.js → QuotaPage-gkSyRAKa.js} +1 -1
  34. package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-LND6_Ss7.js → SetupPage-CFNcATJJ.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-BzNnm6Bi.js → StudioPage-YoD4tY5l.js} +1 -1
  40. package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js +1 -0
  44. package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
  45. package/dist/dashboard/assets/app-BX2nnKqs.css +2 -0
  46. package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
  47. package/dist/dashboard/assets/assert-CndthXFQ.js +1 -0
  48. package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-BaX2GTrn.js → badge-DdbT_7Am.js} +1 -1
  50. package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
  51. package/dist/dashboard/assets/ban-durations-B58FyRxC.js +1 -0
  52. package/dist/dashboard/assets/ban-durations-B58FyRxC.js.gz +0 -0
  53. package/dist/dashboard/assets/{banner-DFH4Bkte.js → banner-CsGN-nbm.js} +1 -1
  54. package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
  55. package/dist/dashboard/assets/brand/bansos_page.webp +0 -0
  56. package/dist/dashboard/assets/brand/denia_bansos.webp +0 -0
  57. package/dist/dashboard/assets/brand/favicon.webp +0 -0
  58. package/dist/dashboard/assets/brand/login_register.webp +0 -0
  59. package/dist/dashboard/assets/brand/login_register_initial.webp +0 -0
  60. package/dist/dashboard/assets/brand/og_bansos.webp +0 -0
  61. package/dist/dashboard/assets/brand/og_image.webp +0 -0
  62. package/dist/dashboard/assets/brand/sidebar_ico.webp +0 -0
  63. package/dist/dashboard/assets/{card-CxDw0lK6.js → card-mgZ_TLLZ.js} +1 -1
  64. package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
  65. package/dist/dashboard/assets/cli-tools-A1-v8-03.js +1 -0
  66. package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
  67. package/dist/dashboard/assets/{clipboard-button-DfS1ntiq.js → clipboard-button-CJ4Zty89.js} +1 -1
  68. package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
  69. package/dist/dashboard/assets/{dialog-BK-NRr5u.js → dialog-B5L2jPQ_.js} +1 -1
  70. package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
  71. package/dist/dashboard/assets/{drawer-QqPul6sC.js → drawer-DkjUouAj.js} +1 -1
  72. package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
  73. package/dist/dashboard/assets/{entry-BMlYJVFj.js → entry-B-LVLV6o.js} +1 -1
  74. package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
  75. package/dist/dashboard/assets/entry-CAhdYl3B.js +1 -0
  76. package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-D2xD0Tmd.js +4 -0
  78. package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
  79. package/dist/dashboard/assets/{formatters-DP-5E01-.js → formatters-CrsdLVsn.js} +1 -1
  80. package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
  81. package/dist/dashboard/assets/{index-D36vCZht.js → index-BU64Lqvp.js} +2 -2
  82. package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
  83. package/dist/dashboard/assets/{inline-CHJQwxLa.js → inline-B2aDLyyg.js} +1 -1
  84. package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
  85. package/dist/dashboard/assets/{input-BlmlizVV.js → input-BCVkdR9d.js} +1 -1
  86. package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
  87. package/dist/dashboard/assets/{layout-Bz93I-yE.js → layout-DNcAdMK-.js} +1 -1
  88. package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
  89. package/dist/dashboard/assets/{list-row-Ml16KCfu.js → list-row-DgrIH0hw.js} +1 -1
  90. package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
  91. package/dist/dashboard/assets/{live-7_QpnYGu.js → live-Cae01iu8.js} +1 -1
  92. package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
  93. package/dist/dashboard/assets/{mutation-GU7XdEjz.js → mutation-BQ0ccH_A.js} +1 -1
  94. package/dist/dashboard/assets/mutation-BQ0ccH_A.js.gz +0 -0
  95. package/dist/dashboard/assets/{network-CuMDaTzT.js → network-CRib7H_2.js} +1 -1
  96. package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
  97. package/dist/dashboard/assets/{numbers-CoqpaDMx.js → numbers-BKQE8Xpz.js} +1 -1
  98. package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
  99. package/dist/dashboard/assets/{pagination-B5aOoweZ.js → pagination-ecPvG_8g.js} +1 -1
  100. package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
  101. package/dist/dashboard/assets/providers/devin.svg +9 -0
  102. package/dist/dashboard/assets/providers/devin.svg.gz +0 -0
  103. package/dist/dashboard/assets/providers/windsurf.svg +10 -0
  104. package/dist/dashboard/assets/providers/windsurf.svg.gz +0 -0
  105. package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
  106. package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
  107. package/dist/dashboard/assets/routing-Ckm1UXuC.js +1 -0
  108. package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
  109. package/dist/dashboard/assets/{select-C9Ssle9b.js → select-ChoFWyKz.js} +1 -1
  110. package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
  111. package/dist/dashboard/assets/settings-CKjFPlKW.js +1 -0
  112. package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
  113. package/dist/dashboard/assets/{stack-j7cXjgYX.js → stack-DWCwU3fh.js} +1 -1
  114. package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
  115. package/dist/dashboard/assets/{state-DHmEnLa2.js → state-Cg3VL5J_.js} +1 -1
  116. package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
  117. package/dist/dashboard/assets/story/25817331.webp +0 -0
  118. package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
  119. package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
  120. package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
  121. package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
  122. package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
  123. package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
  124. package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
  125. package/dist/dashboard/assets/{switch-DmZcyTIC.js → switch-Db70BMix.js} +1 -1
  126. package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
  127. package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BqdE0LuM.js} +1 -1
  128. package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
  129. package/dist/dashboard/console-backgrounds.webp +0 -0
  130. package/dist/dashboard/console-backgrounds_initial.webp +0 -0
  131. package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
  132. package/dist/dashboard/index.html +3 -3
  133. package/dist/dashboard/index.html.gz +0 -0
  134. package/dist/dashboard/precompressed-assets.json +57 -55
  135. package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
  136. package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  137. package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
  138. package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  139. package/package.json +1 -1
  140. package/src/boot/dependencies.ts +11 -3
  141. package/src/config/cooldowns.ts +1 -1
  142. package/src/config/spec.ts +0 -6
  143. package/src/console/api-keys/routes.ts +11 -4
  144. package/src/console/console-router.ts +7 -0
  145. package/src/console/dashboard-assets.ts +5 -5
  146. package/src/console/domain-registration.ts +27 -0
  147. package/src/console/ip-bans/routes.ts +99 -0
  148. package/src/console/providers/catalog/catalog-projections.ts +5 -2
  149. package/src/console/providers/catalog/contracts.ts +123 -0
  150. package/src/console/providers/catalog/model-operations.ts +122 -10
  151. package/src/console/providers/catalog/provider-operations.ts +116 -8
  152. package/src/console/providers/catalog/public-model-store.ts +0 -0
  153. package/src/console/providers/catalog/routes.ts +64 -4
  154. package/src/console/providers/catalog/store-helpers.ts +30 -1
  155. package/src/console/providers/catalog/store.ts +243 -3
  156. package/src/console/quota/account-quota-global.ts +89 -1
  157. package/src/console/quota/native-identity.ts +2 -0
  158. package/src/console/settings/contracts.ts +18 -0
  159. package/src/console/settings/store.ts +32 -0
  160. package/src/console/system-prompt/contracts.ts +0 -1
  161. package/src/main.ts +1 -0
  162. package/src/observability/event-query.ts +18 -4
  163. package/src/persistence/dialect.ts +12 -0
  164. package/src/persistence/schema.ts +20 -2
  165. package/src/protocol/dsml.ts +1 -1
  166. package/src/protocol/gateway-error.ts +1 -0
  167. package/src/protocol/reasoning.ts +1 -1
  168. package/src/protocol/request/chat.ts +4 -4
  169. package/src/protocol/request/messages.ts +1 -1
  170. package/src/protocol/response/gemini.ts +6 -1
  171. package/src/protocol/sse-decoder.ts +25 -8
  172. package/src/protocol/stream-error-frames.ts +13 -3
  173. package/src/protocol/translation/quirks.ts +1 -1
  174. package/src/protocol/translation/tool-repair.ts +2 -2
  175. package/src/protocol/upstream/send-claude-messages.ts +15 -4
  176. package/src/protocol/upstream-parsing.ts +1 -1
  177. package/src/providers/adapters/compatible-adapter.ts +7 -5
  178. package/src/providers/authentication/oauth-refresh-service.ts +149 -36
  179. package/src/providers/default-registry.ts +68 -3
  180. package/src/providers/discovery/discovery-types.ts +12 -0
  181. package/src/providers/discovery/probe-phases.ts +61 -30
  182. package/src/providers/discovery/probing-service.ts +279 -164
  183. package/src/providers/integrations/antigravity/antigravity-protocol.ts +117 -2
  184. package/src/providers/integrations/antigravity/antigravity.ts +13 -2
  185. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
  186. package/src/providers/integrations/buddy/buddy-chat-shared.ts +18 -18
  187. package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
  188. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
  189. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
  190. package/src/providers/integrations/buddy/buddy-identity.ts +70 -0
  191. package/src/providers/integrations/buddy/buddy-media.ts +4 -5
  192. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
  193. package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
  194. package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
  195. package/src/providers/integrations/buddy/capabilities.ts +4 -41
  196. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
  197. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +20 -1
  198. package/src/providers/integrations/buddy/codebuddy/provider.ts +2 -2
  199. package/src/providers/integrations/buddy/codebuddy/shared.ts +6 -10
  200. package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
  201. package/src/providers/integrations/cursor/cursor-exec.ts +738 -0
  202. package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
  203. package/src/providers/integrations/cursor/cursor-request.ts +9 -8
  204. package/src/providers/integrations/cursor/cursor-shared.ts +19 -1
  205. package/src/providers/integrations/cursor/cursor.ts +50 -30
  206. package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
  207. package/src/providers/integrations/devin/devin-auth.ts +353 -0
  208. package/src/providers/integrations/devin/devin-catalog.ts +207 -0
  209. package/src/providers/integrations/devin/devin-http.ts +91 -0
  210. package/src/providers/integrations/devin/devin-quota.ts +214 -0
  211. package/src/providers/integrations/devin/devin-shared.ts +111 -0
  212. package/src/providers/integrations/devin/devin.ts +539 -0
  213. package/src/providers/integrations/devin/protocol/devin-proto.ts +584 -0
  214. package/src/providers/integrations/devin/protocol/framing.ts +124 -0
  215. package/src/providers/integrations/factory/factory.ts +2 -2
  216. package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
  217. package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
  218. package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
  219. package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
  220. package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
  221. package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
  222. package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
  223. package/src/providers/integrations/freepi/freepi.ts +292 -0
  224. package/src/providers/integrations/gemini.ts +2 -2
  225. package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
  226. package/src/providers/integrations/hermes.ts +4 -12
  227. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  228. package/src/providers/integrations/perch/perch-catalog.ts +105 -0
  229. package/src/providers/integrations/perch/perch-oauth.ts +170 -0
  230. package/src/providers/integrations/perch/perch-protocol.ts +211 -0
  231. package/src/providers/integrations/perch/perch-quota.ts +137 -0
  232. package/src/providers/integrations/perch/perch-realm.ts +82 -0
  233. package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
  234. package/src/providers/integrations/perch/perch.ts +315 -0
  235. package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
  236. package/src/providers/integrations/qoder/chat-proto.ts +328 -328
  237. package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
  238. package/src/providers/integrations/qoder/qoder-adapter.ts +89 -28
  239. package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
  240. package/src/providers/integrations/qoder/qoder-catalog.ts +6 -1
  241. package/src/providers/integrations/qoder/qoder-checkin.ts +2 -2
  242. package/src/providers/integrations/qoder/qoder-grpc.ts +209 -5
  243. package/src/providers/integrations/qoder/qoder-ide.ts +5 -1
  244. package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
  245. package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
  246. package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
  247. package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
  248. package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
  249. package/src/providers/integrations/qoder/qoder.ts +3 -6
  250. package/src/providers/integrations/trae/trae-catalog.ts +9 -14
  251. package/src/providers/integrations/trae/trae-headers.ts +36 -11
  252. package/src/providers/integrations/trae/trae-oauth.ts +14 -17
  253. package/src/providers/integrations/trae/trae-protocol.ts +3 -6
  254. package/src/providers/integrations/trae/trae-quota.ts +103 -21
  255. package/src/providers/integrations/trae/trae-realm.ts +36 -15
  256. package/src/providers/integrations/trae/trae.ts +97 -7
  257. package/src/providers/operations/account-error-classification.ts +66 -1
  258. package/src/providers/operations/account-health-service.ts +192 -26
  259. package/src/providers/operations/account-refresh-status.ts +284 -0
  260. package/src/providers/operations/account-tier.ts +67 -0
  261. package/src/providers/operations/byok-wire-profile.ts +9 -12
  262. package/src/providers/operations/client-versions.ts +37 -99
  263. package/src/providers/operations/cooldown-rules.ts +61 -0
  264. package/src/providers/operations/provider-catalog-seeder.ts +4 -0
  265. package/src/providers/provider-contracts.ts +29 -0
  266. package/src/providers/provider-metadata.ts +59 -4
  267. package/src/providers/provider-model-definition.ts +36 -0
  268. package/src/providers/quota/refresh.ts +21 -0
  269. package/src/security/abuse.ts +71 -0
  270. package/src/transport/dispatch/proxy-request.ts +1 -0
  271. package/src/transport/dispatch/streaming/stream.ts +1 -0
  272. package/src/transport/dispatch/upstream.ts +4 -1
  273. package/src/transport/failure-policy.ts +113 -7
  274. package/src/transport/routing/router.ts +25 -1
  275. package/src/transport/surface/messages/adapter.ts +2 -1
  276. package/src/transport/surface/responses/encode.ts +12 -1
  277. package/src/workers/daily-checkin.ts +1 -1
  278. package/src/workers/quota-refresh-sweep.ts +1 -1
  279. package/src/workers/scheduler.ts +22 -4
  280. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js +0 -1
  281. package/dist/dashboard/assets/BannedPage-B05aF8Dg.js.gz +0 -0
  282. package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js.gz +0 -0
  283. package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js.gz +0 -0
  284. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js +0 -1
  285. package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js.gz +0 -0
  286. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js +0 -1
  287. package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js.gz +0 -0
  288. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js +0 -1
  289. package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js.gz +0 -0
  290. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js +0 -1
  291. package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js.gz +0 -0
  292. package/dist/dashboard/assets/InjectSystemPromptPanel-C-e2AMz6.js.gz +0 -0
  293. package/dist/dashboard/assets/LoginPage-J8wPbmfT.js.gz +0 -0
  294. package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
  295. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js +0 -1
  296. package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js.gz +0 -0
  297. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js +0 -7
  298. package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js.gz +0 -0
  299. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
  300. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  301. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js +0 -1
  302. package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js.gz +0 -0
  303. package/dist/dashboard/assets/ProxyPage-BBTRBAQ3.js.gz +0 -0
  304. package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js.gz +0 -0
  305. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js +0 -1
  306. package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js.gz +0 -0
  307. package/dist/dashboard/assets/SetupPage-LND6_Ss7.js.gz +0 -0
  308. package/dist/dashboard/assets/StudioPage-BzNnm6Bi.js.gz +0 -0
  309. package/dist/dashboard/assets/UsagePage-C1TbL24N.js +0 -56
  310. package/dist/dashboard/assets/UsagePage-C1TbL24N.js.gz +0 -0
  311. package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
  312. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  313. package/dist/dashboard/assets/app-mweRcsKp.css +0 -2
  314. package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
  315. package/dist/dashboard/assets/assert-CidQVoNo.js +0 -1
  316. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  317. package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
  318. package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
  319. package/dist/dashboard/assets/brand/bansos_page.png +0 -0
  320. package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
  321. package/dist/dashboard/assets/brand/favicon.jpg +0 -0
  322. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  323. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  324. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  325. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  326. package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
  327. package/dist/dashboard/assets/card-CxDw0lK6.js.gz +0 -0
  328. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
  329. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  330. package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
  331. package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
  332. package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
  333. package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
  334. package/dist/dashboard/assets/entry-Dmx7gBiN.js +0 -1
  335. package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
  336. package/dist/dashboard/assets/entry-vqGb8yVz.js +0 -4
  337. package/dist/dashboard/assets/entry-vqGb8yVz.js.gz +0 -0
  338. package/dist/dashboard/assets/formatters-DP-5E01-.js.gz +0 -0
  339. package/dist/dashboard/assets/index-D36vCZht.js.gz +0 -0
  340. package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
  341. package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
  342. package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
  343. package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
  344. package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
  345. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
  346. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
  347. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  348. package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
  349. package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
  350. package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
  351. package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
  352. package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
  353. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  354. package/dist/dashboard/assets/select-C9Ssle9b.js.gz +0 -0
  355. package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
  356. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  357. package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
  358. package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
  359. package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
  360. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  361. package/dist/dashboard/console-backgrounds.jpg +0 -0
  362. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  363. package/dist/dashboard/donation/qris-risun-marke.png +0 -0
  364. package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
  365. package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
  366. package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
  367. package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
  368. package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
  369. package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
  370. package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
  371. /package/dist/dashboard/assets/{app-DRnQLhsc.js → app-B7kIWFm5.js} +0 -0
  372. /package/dist/dashboard/assets/{app-DRnQLhsc.js.gz → app-B7kIWFm5.js.gz} +0 -0
@@ -1,77 +1,77 @@
1
1
  {
2
- "count": 119,
2
+ "count": 121,
3
3
  "assets": [
4
- "assets/BannedPage-B05aF8Dg.js",
5
- "assets/CliToolDetailPage-CLUhmjUy.js",
6
- "assets/CliToolsPage-CQmrqqrk.js",
7
- "assets/CombosPage-CHG_1Wr3.js",
8
- "assets/ConsoleLogPage-DPgbklad.js",
9
- "assets/CustomizationPage-pnfAqr_-.js",
10
- "assets/HealthEventsModal-DGJuU2A6.js",
11
- "assets/InjectSystemPromptPanel-C-e2AMz6.js",
12
- "assets/LoginPage-J8wPbmfT.js",
13
- "assets/ModelPicker-C6WlpU5E.js",
14
- "assets/OverviewPage-BSQnF2Lp.js",
15
- "assets/ProviderDetailPage-DK_e0FJz.js",
16
- "assets/ProviderIcon-jjqXJDA3.js",
17
- "assets/ProvidersPage-D_a3r6Gc.js",
18
- "assets/ProxyPage-BBTRBAQ3.js",
19
- "assets/QuotaPage-B2WqMSG1.js",
20
- "assets/SettingsPage-D7xp5Ij_.js",
21
- "assets/SetupPage-LND6_Ss7.js",
22
- "assets/StudioPage-BzNnm6Bi.js",
4
+ "assets/BannedPage-BxoG1MrL.js",
5
+ "assets/CliToolDetailPage-ixwgKk53.js",
6
+ "assets/CliToolsPage-BmttNV3U.js",
7
+ "assets/CombosPage-BE3qwwfC.js",
8
+ "assets/ConsoleLogPage-CRZdmMIX.js",
9
+ "assets/CustomizationPage-Dv_FJ6Er.js",
10
+ "assets/HealthEventsModal-CoVrw2sM.js",
11
+ "assets/InjectSystemPromptPanel-BOoO8rpz.js",
12
+ "assets/LoginPage-ChJuNNVN.js",
13
+ "assets/ModelPicker-BZAJtPg1.js",
14
+ "assets/OverviewPage-BE40s3u5.js",
15
+ "assets/ProviderDetailPage-sfLoQtPV.js",
16
+ "assets/ProviderIcon-CQ6bPUf_.js",
17
+ "assets/ProvidersPage-DcepmPWo.js",
18
+ "assets/ProxyPage-BJ87Pp0U.js",
19
+ "assets/QuotaPage-gkSyRAKa.js",
20
+ "assets/SettingsPage-C5HPWqEv.js",
21
+ "assets/SetupPage-CFNcATJJ.js",
22
+ "assets/StudioPage-YoD4tY5l.js",
23
23
  "assets/ToolIcon-CfeLA-Z_.js",
24
- "assets/UsagePage-C1TbL24N.js",
25
- "assets/api-keys-KvX83mRe.js",
26
- "assets/app-DRnQLhsc.js",
27
- "assets/app-mweRcsKp.css",
24
+ "assets/UsagePage-DxjaAhb_.js",
25
+ "assets/api-keys-BTlkq_Uk.js",
26
+ "assets/app-B7kIWFm5.js",
27
+ "assets/app-BX2nnKqs.css",
28
28
  "assets/arrow-left-CpBxkoxI.js",
29
29
  "assets/arrow-right-Dl5yKnp8.js",
30
30
  "assets/arrow-up-59ms1iiT.js",
31
- "assets/assert-CidQVoNo.js",
31
+ "assets/assert-CndthXFQ.js",
32
32
  "assets/backup-file-gdKIlg8U.js",
33
- "assets/badge-BaX2GTrn.js",
34
- "assets/banner-DFH4Bkte.js",
33
+ "assets/badge-DdbT_7Am.js",
34
+ "assets/ban-durations-B58FyRxC.js",
35
+ "assets/banner-CsGN-nbm.js",
35
36
  "assets/brain-Cwed_72z.js",
36
- "assets/card-CxDw0lK6.js",
37
+ "assets/card-mgZ_TLLZ.js",
37
38
  "assets/chevron-left-Bf6CaTSJ.js",
38
39
  "assets/chevron-right-BXIy5l3h.js",
39
40
  "assets/circle-alert-CntYHV5v.js",
40
41
  "assets/circle-check-BU3v_mFW.js",
41
42
  "assets/circle-question-mark-Cz4un8sH.js",
42
- "assets/cli-tools-Bwv5-zGZ.js",
43
- "assets/clipboard-button-DfS1ntiq.js",
43
+ "assets/cli-tools-A1-v8-03.js",
44
+ "assets/clipboard-button-CJ4Zty89.js",
44
45
  "assets/database-Dz9N3zGd.js",
45
- "assets/dialog-BK-NRr5u.js",
46
+ "assets/dialog-B5L2jPQ_.js",
46
47
  "assets/dialog-actions-B1axpEg7.js",
47
48
  "assets/download-dRFo5_Wu.js",
48
- "assets/drawer-QqPul6sC.js",
49
- "assets/entry-BMlYJVFj.js",
50
- "assets/entry-Dmx7gBiN.js",
51
- "assets/entry-vqGb8yVz.js",
49
+ "assets/drawer-DkjUouAj.js",
50
+ "assets/entry-B-LVLV6o.js",
51
+ "assets/entry-CAhdYl3B.js",
52
+ "assets/entry-D2xD0Tmd.js",
52
53
  "assets/eye-C_hawfH4.js",
53
54
  "assets/eye-off-Bk5g2luF.js",
54
55
  "assets/fingerprint-pattern-BWuHtbW4.js",
55
- "assets/formatters-DP-5E01-.js",
56
+ "assets/formatters-CrsdLVsn.js",
56
57
  "assets/gauge-BbIMy7MB.js",
57
58
  "assets/house-h9AZlJuT.js",
58
59
  "assets/image-BPaouViG.js",
59
- "assets/index-D36vCZht.js",
60
- "assets/inline-CHJQwxLa.js",
61
- "assets/input-BlmlizVV.js",
60
+ "assets/index-BU64Lqvp.js",
61
+ "assets/inline-B2aDLyyg.js",
62
+ "assets/input-BCVkdR9d.js",
62
63
  "assets/jsx-runtime-CXUMngI_.js",
63
64
  "assets/key-round-UkavsGxp.js",
64
65
  "assets/layers-2-glBbjl.js",
65
- "assets/layout-Bz93I-yE.js",
66
- "assets/list-row-Ml16KCfu.js",
67
- "assets/live-7_QpnYGu.js",
66
+ "assets/layout-DNcAdMK-.js",
67
+ "assets/list-row-DgrIH0hw.js",
68
+ "assets/live-Cae01iu8.js",
68
69
  "assets/log-in-BmRjy60c.js",
69
70
  "assets/message-circle-CCxGwRvv.js",
70
- "assets/minimize-2-BTmMTK4o.js",
71
- "assets/mutation-GU7XdEjz.js",
72
- "assets/network-CuMDaTzT.js",
73
- "assets/numbers-CoqpaDMx.js",
74
- "assets/pagination-B5aOoweZ.js",
71
+ "assets/mutation-BQ0ccH_A.js",
72
+ "assets/network-CRib7H_2.js",
73
+ "assets/numbers-BKQE8Xpz.js",
74
+ "assets/pagination-ecPvG_8g.js",
75
75
  "assets/pencil-768ysRAr.js",
76
76
  "assets/plus-DIdX_g-x.js",
77
77
  "assets/power-off-Yjw9GMJh.js",
@@ -84,6 +84,7 @@
84
84
  "assets/providers/bai.svg",
85
85
  "assets/providers/blackbox.svg",
86
86
  "assets/providers/claude-code.svg",
87
+ "assets/providers/devin.svg",
87
88
  "assets/providers/exa.svg",
88
89
  "assets/providers/gmi-cloud.svg",
89
90
  "assets/providers/inception.svg",
@@ -93,22 +94,23 @@
93
94
  "assets/providers/openai-light.svg",
94
95
  "assets/providers/parallel.svg",
95
96
  "assets/providers/tokenharbor.svg",
96
- "assets/query-keys-YSoQOUh6.js",
97
+ "assets/providers/windsurf.svg",
98
+ "assets/query-keys-IKLh0YFd.js",
97
99
  "assets/quota-DJ1QlAOq.js",
98
100
  "assets/refresh-cw-BqJFk4sU.js",
99
101
  "assets/rotate-ccw-CufcqITi.js",
100
102
  "assets/route-CNSNj9Zm.js",
101
- "assets/routing-fnCsxgNO.js",
103
+ "assets/routing-Ckm1UXuC.js",
102
104
  "assets/scaling-nWE4Cx8f.js",
103
105
  "assets/search-JOKus9rb.js",
104
- "assets/select-C9Ssle9b.js",
106
+ "assets/select-ChoFWyKz.js",
105
107
  "assets/settings-2-Ds9DQp0t.js",
106
- "assets/settings-BxslsErn.js",
108
+ "assets/settings-CKjFPlKW.js",
107
109
  "assets/shield-BMQNxORh.js",
108
110
  "assets/shield-check-DVS0Foqh.js",
109
- "assets/stack-j7cXjgYX.js",
110
- "assets/state-DHmEnLa2.js",
111
- "assets/switch-DmZcyTIC.js",
111
+ "assets/stack-DWCwU3fh.js",
112
+ "assets/state-Cg3VL5J_.js",
113
+ "assets/switch-Db70BMix.js",
112
114
  "assets/terminal-0_IjPWTk.js",
113
115
  "assets/tokens-COzario9.js",
114
116
  "assets/trash-Cppn5c3R.js",
@@ -116,7 +118,7 @@
116
118
  "assets/use-modal-focus-By7oJoGd.js",
117
119
  "assets/use-reduced-motion-C4B0R6Sz.js",
118
120
  "assets/use-timeout-BwcBBRrT.js",
119
- "assets/useMutation-CbCP4w1o.js",
121
+ "assets/useMutation-BqdE0LuM.js",
120
122
  "assets/wrench-B6E1oEuY.js",
121
123
  "assets/zap-C4EeVW4q.js",
122
124
  "index.html"
@@ -0,0 +1,10 @@
1
+ -- Adds `models.warning_metadata` (jsonb, nullable) — display-only warning
2
+ -- metadata for a model row, carried as `{ warnings: [{ kind, message,
3
+ -- severity?, updatedAt? }] }`. NULL means "no warnings"; the column is not
4
+ -- read by routing. Part of the provider-account model-update proposal §3.4
5
+ -- (area 06).
6
+ --
7
+ -- Idempotency comes from the migration ledger plus `ADD COLUMN IF NOT EXISTS`:
8
+ -- a database built from a newer baseline that already carries the column must
9
+ -- not fail startup.
10
+ ALTER TABLE "models" ADD COLUMN IF NOT EXISTS "warning_metadata" jsonb;
@@ -0,0 +1,156 @@
1
+ -- Migrate WorkBuddy provider data onto the CodeBuddy providers, then drop
2
+ -- the WorkBuddy providers entirely.
3
+ --
4
+ -- workbuddy -> cb (CodeBuddy intl)
5
+ -- workbuddycn -> cbcn (CodeBuddy CN)
6
+ --
7
+ -- This mirrors the opencode rename pattern: the parent `providers` row is
8
+ -- copied under the new id, every dependent table is repointed, and the old
9
+ -- row is dropped last. Inside the migration transaction this is atomic.
10
+ --
11
+ -- A database that never had the WorkBuddy ids is unaffected — every statement
12
+ -- matches zero rows. If a deployment somehow carries both spellings, the
13
+ -- repoint merges them onto the new id, which is the correct outcome for one
14
+ -- provider with two names.
15
+
16
+ -- ── workbuddy -> cb ────────────────────────────────────────────────────────
17
+
18
+ INSERT INTO "providers" (
19
+ "id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
20
+ "compatibility_profile", "enabled", "requires_account"
21
+ )
22
+ SELECT
23
+ 'cb', "tenant_id", "wire_family_default", "capability_profile", "base_url",
24
+ "compatibility_profile", "enabled", "requires_account"
25
+ FROM "providers"
26
+ WHERE "id" = 'workbuddy'
27
+ ON CONFLICT ("id") DO NOTHING;
28
+
29
+ -- Drop rows the repoint would collide with on a unique index.
30
+ DELETE FROM "models"
31
+ WHERE "provider_id" = 'workbuddy'
32
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
33
+ AND EXISTS (
34
+ SELECT 1 FROM "models" AS keep
35
+ WHERE keep."provider_id" = 'cb'
36
+ AND keep."model_id" = "models"."model_id"
37
+ AND keep."endpoint_path" = "models"."endpoint_path"
38
+ );
39
+ DELETE FROM "tenant_disabled_models"
40
+ WHERE "provider_id" = 'workbuddy'
41
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
42
+ AND EXISTS (
43
+ SELECT 1 FROM "tenant_disabled_models" AS keep
44
+ WHERE keep."provider_id" = 'cb'
45
+ AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
46
+ AND keep."model_id" = "tenant_disabled_models"."model_id"
47
+ AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
48
+ );
49
+ DELETE FROM "provider_accounts"
50
+ WHERE "provider_id" = 'workbuddy'
51
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
52
+ AND EXISTS (
53
+ SELECT 1 FROM "provider_accounts" AS keep
54
+ WHERE keep."provider_id" = 'cb'
55
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
56
+ AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
57
+ );
58
+ DELETE FROM "provider_routing_settings"
59
+ WHERE "provider_id" = 'workbuddy'
60
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
61
+ AND EXISTS (
62
+ SELECT 1 FROM "provider_routing_settings" AS keep
63
+ WHERE keep."provider_id" = 'cb'
64
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
65
+ );
66
+
67
+ UPDATE "provider_accounts" SET "provider_id" = 'cb'
68
+ WHERE "provider_id" = 'workbuddy'
69
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
70
+ UPDATE "models" SET "provider_id" = 'cb'
71
+ WHERE "provider_id" = 'workbuddy'
72
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
73
+ UPDATE "tenant_disabled_models" SET "provider_id" = 'cb'
74
+ WHERE "provider_id" = 'workbuddy'
75
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
76
+ UPDATE "provider_routing_settings" SET "provider_id" = 'cb'
77
+ WHERE "provider_id" = 'workbuddy'
78
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
79
+ UPDATE "telemetry_events" SET "provider_id" = 'cb'
80
+ WHERE "provider_id" = 'workbuddy'
81
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
82
+
83
+ DELETE FROM "providers"
84
+ WHERE "id" = 'workbuddy'
85
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
86
+
87
+ -- ── workbuddycn -> cbcn ──────────────────────────────────────────────────────
88
+
89
+ INSERT INTO "providers" (
90
+ "id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
91
+ "compatibility_profile", "enabled", "requires_account"
92
+ )
93
+ SELECT
94
+ 'cbcn', "tenant_id", "wire_family_default", "capability_profile", "base_url",
95
+ "compatibility_profile", "enabled", "requires_account"
96
+ FROM "providers"
97
+ WHERE "id" = 'workbuddycn'
98
+ ON CONFLICT ("id") DO NOTHING;
99
+
100
+ -- Drop rows the repoint would collide with on a unique index.
101
+ DELETE FROM "models"
102
+ WHERE "provider_id" = 'workbuddycn'
103
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
104
+ AND EXISTS (
105
+ SELECT 1 FROM "models" AS keep
106
+ WHERE keep."provider_id" = 'cbcn'
107
+ AND keep."model_id" = "models"."model_id"
108
+ AND keep."endpoint_path" = "models"."endpoint_path"
109
+ );
110
+ DELETE FROM "tenant_disabled_models"
111
+ WHERE "provider_id" = 'workbuddycn'
112
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
113
+ AND EXISTS (
114
+ SELECT 1 FROM "tenant_disabled_models" AS keep
115
+ WHERE keep."provider_id" = 'cbcn'
116
+ AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
117
+ AND keep."model_id" = "tenant_disabled_models"."model_id"
118
+ AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
119
+ );
120
+ DELETE FROM "provider_accounts"
121
+ WHERE "provider_id" = 'workbuddycn'
122
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
123
+ AND EXISTS (
124
+ SELECT 1 FROM "provider_accounts" AS keep
125
+ WHERE keep."provider_id" = 'cbcn'
126
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
127
+ AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
128
+ );
129
+ DELETE FROM "provider_routing_settings"
130
+ WHERE "provider_id" = 'workbuddycn'
131
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
132
+ AND EXISTS (
133
+ SELECT 1 FROM "provider_routing_settings" AS keep
134
+ WHERE keep."provider_id" = 'cbcn'
135
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
136
+ );
137
+
138
+ UPDATE "provider_accounts" SET "provider_id" = 'cbcn'
139
+ WHERE "provider_id" = 'workbuddycn'
140
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
141
+ UPDATE "models" SET "provider_id" = 'cbcn'
142
+ WHERE "provider_id" = 'workbuddycn'
143
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
144
+ UPDATE "tenant_disabled_models" SET "provider_id" = 'cbcn'
145
+ WHERE "provider_id" = 'workbuddycn'
146
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
147
+ UPDATE "provider_routing_settings" SET "provider_id" = 'cbcn'
148
+ WHERE "provider_id" = 'workbuddycn'
149
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
150
+ UPDATE "telemetry_events" SET "provider_id" = 'cbcn'
151
+ WHERE "provider_id" = 'workbuddycn'
152
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
153
+
154
+ DELETE FROM "providers"
155
+ WHERE "id" = 'workbuddycn'
156
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
@@ -0,0 +1,11 @@
1
+ -- Adds `models.warning_metadata` (text, nullable) — display-only warning
2
+ -- metadata for a model row, stored as a JSON string in SQLite (the dialect's
3
+ -- jsonb analogue; Postgres keeps the same column as jsonb). NULL means "no
4
+ -- warnings"; the column is not read by routing. Part of the provider-account
5
+ -- model-update proposal §3.4 (area 06).
6
+ --
7
+ -- Idempotency comes from the migration ledger, not from the statement: the
8
+ -- runner records the file inside the same transaction, so a file that has
9
+ -- already run is never re-executed. The baseline is generated from
10
+ -- `0000_baseline.sql` alone and does not carry this column.
11
+ ALTER TABLE "models" ADD COLUMN "warning_metadata" text;
@@ -0,0 +1,156 @@
1
+ -- Migrate WorkBuddy provider data onto the CodeBuddy providers, then drop
2
+ -- the WorkBuddy providers entirely.
3
+ --
4
+ -- workbuddy -> cb (CodeBuddy intl)
5
+ -- workbuddycn -> cbcn (CodeBuddy CN)
6
+ --
7
+ -- This mirrors the opencode rename pattern: the parent `providers` row is
8
+ -- copied under the new id, every dependent table is repointed, and the old
9
+ -- row is dropped last. Inside the migration transaction this is atomic.
10
+ --
11
+ -- A database that never had the WorkBuddy ids is unaffected — every statement
12
+ -- matches zero rows. If a deployment somehow carries both spellings, the
13
+ -- repoint merges them onto the new id, which is the correct outcome for one
14
+ -- provider with two names.
15
+
16
+ -- ── workbuddy -> cb ────────────────────────────────────────────────────────
17
+
18
+ INSERT INTO "providers" (
19
+ "id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
20
+ "compatibility_profile", "enabled", "requires_account"
21
+ )
22
+ SELECT
23
+ 'cb', "tenant_id", "wire_family_default", "capability_profile", "base_url",
24
+ "compatibility_profile", "enabled", "requires_account"
25
+ FROM "providers"
26
+ WHERE "id" = 'workbuddy'
27
+ ON CONFLICT ("id") DO NOTHING;
28
+
29
+ -- Drop rows the repoint would collide with on a unique index.
30
+ DELETE FROM "models"
31
+ WHERE "provider_id" = 'workbuddy'
32
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
33
+ AND EXISTS (
34
+ SELECT 1 FROM "models" AS keep
35
+ WHERE keep."provider_id" = 'cb'
36
+ AND keep."model_id" = "models"."model_id"
37
+ AND keep."endpoint_path" = "models"."endpoint_path"
38
+ );
39
+ DELETE FROM "tenant_disabled_models"
40
+ WHERE "provider_id" = 'workbuddy'
41
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
42
+ AND EXISTS (
43
+ SELECT 1 FROM "tenant_disabled_models" AS keep
44
+ WHERE keep."provider_id" = 'cb'
45
+ AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
46
+ AND keep."model_id" = "tenant_disabled_models"."model_id"
47
+ AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
48
+ );
49
+ DELETE FROM "provider_accounts"
50
+ WHERE "provider_id" = 'workbuddy'
51
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
52
+ AND EXISTS (
53
+ SELECT 1 FROM "provider_accounts" AS keep
54
+ WHERE keep."provider_id" = 'cb'
55
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
56
+ AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
57
+ );
58
+ DELETE FROM "provider_routing_settings"
59
+ WHERE "provider_id" = 'workbuddy'
60
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb')
61
+ AND EXISTS (
62
+ SELECT 1 FROM "provider_routing_settings" AS keep
63
+ WHERE keep."provider_id" = 'cb'
64
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
65
+ );
66
+
67
+ UPDATE "provider_accounts" SET "provider_id" = 'cb'
68
+ WHERE "provider_id" = 'workbuddy'
69
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
70
+ UPDATE "models" SET "provider_id" = 'cb'
71
+ WHERE "provider_id" = 'workbuddy'
72
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
73
+ UPDATE "tenant_disabled_models" SET "provider_id" = 'cb'
74
+ WHERE "provider_id" = 'workbuddy'
75
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
76
+ UPDATE "provider_routing_settings" SET "provider_id" = 'cb'
77
+ WHERE "provider_id" = 'workbuddy'
78
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
79
+ UPDATE "telemetry_events" SET "provider_id" = 'cb'
80
+ WHERE "provider_id" = 'workbuddy'
81
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
82
+
83
+ DELETE FROM "providers"
84
+ WHERE "id" = 'workbuddy'
85
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cb');
86
+
87
+ -- ── workbuddycn -> cbcn ──────────────────────────────────────────────────────
88
+
89
+ INSERT INTO "providers" (
90
+ "id", "tenant_id", "wire_family_default", "capability_profile", "base_url",
91
+ "compatibility_profile", "enabled", "requires_account"
92
+ )
93
+ SELECT
94
+ 'cbcn', "tenant_id", "wire_family_default", "capability_profile", "base_url",
95
+ "compatibility_profile", "enabled", "requires_account"
96
+ FROM "providers"
97
+ WHERE "id" = 'workbuddycn'
98
+ ON CONFLICT ("id") DO NOTHING;
99
+
100
+ -- Drop rows the repoint would collide with on a unique index.
101
+ DELETE FROM "models"
102
+ WHERE "provider_id" = 'workbuddycn'
103
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
104
+ AND EXISTS (
105
+ SELECT 1 FROM "models" AS keep
106
+ WHERE keep."provider_id" = 'cbcn'
107
+ AND keep."model_id" = "models"."model_id"
108
+ AND keep."endpoint_path" = "models"."endpoint_path"
109
+ );
110
+ DELETE FROM "tenant_disabled_models"
111
+ WHERE "provider_id" = 'workbuddycn'
112
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
113
+ AND EXISTS (
114
+ SELECT 1 FROM "tenant_disabled_models" AS keep
115
+ WHERE keep."provider_id" = 'cbcn'
116
+ AND keep."tenant_id" = "tenant_disabled_models"."tenant_id"
117
+ AND keep."model_id" = "tenant_disabled_models"."model_id"
118
+ AND keep."endpoint_path" = "tenant_disabled_models"."endpoint_path"
119
+ );
120
+ DELETE FROM "provider_accounts"
121
+ WHERE "provider_id" = 'workbuddycn'
122
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
123
+ AND EXISTS (
124
+ SELECT 1 FROM "provider_accounts" AS keep
125
+ WHERE keep."provider_id" = 'cbcn'
126
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_accounts"."tenant_id"
127
+ AND keep."credential_fingerprint" IS NOT DISTINCT FROM "provider_accounts"."credential_fingerprint"
128
+ );
129
+ DELETE FROM "provider_routing_settings"
130
+ WHERE "provider_id" = 'workbuddycn'
131
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn')
132
+ AND EXISTS (
133
+ SELECT 1 FROM "provider_routing_settings" AS keep
134
+ WHERE keep."provider_id" = 'cbcn'
135
+ AND keep."tenant_id" IS NOT DISTINCT FROM "provider_routing_settings"."tenant_id"
136
+ );
137
+
138
+ UPDATE "provider_accounts" SET "provider_id" = 'cbcn'
139
+ WHERE "provider_id" = 'workbuddycn'
140
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
141
+ UPDATE "models" SET "provider_id" = 'cbcn'
142
+ WHERE "provider_id" = 'workbuddycn'
143
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
144
+ UPDATE "tenant_disabled_models" SET "provider_id" = 'cbcn'
145
+ WHERE "provider_id" = 'workbuddycn'
146
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
147
+ UPDATE "provider_routing_settings" SET "provider_id" = 'cbcn'
148
+ WHERE "provider_id" = 'workbuddycn'
149
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
150
+ UPDATE "telemetry_events" SET "provider_id" = 'cbcn'
151
+ WHERE "provider_id" = 'workbuddycn'
152
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
153
+
154
+ DELETE FROM "providers"
155
+ WHERE "id" = 'workbuddycn'
156
+ AND EXISTS (SELECT 1 FROM "providers" WHERE "id" = 'cbcn');
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cartethyia",
3
- "version": "2.7.7",
3
+ "version": "2.7.9",
4
4
  "description": "A powerful, self-hosted reverse proxy for OpenAI- and Anthropic-compatible AI clients, powered by native Bun and Elysia. It serves both protocols from a single server, routes every model across any configured provider, and translates requests and responses in real time — streaming and prompt caching included. Underneath it runs a full delivery engine: per-account health tracking, quota and cooldown enforcement, automatic failover across pools and providers, usage accounting, and telemetry. Point OpenCode, Cline, Claude Code, Codex, or any compatible client at Cartethyia and it keeps its native protocol while the gateway absorbs every provider-specific difference behind it. Runs on embedded SQLite or external PostgreSQL with optional Redis coordination, ships as a global CLI with a system-tray console, and needs only Bun 1.4+ alongside Node.js/npm.",
5
5
  "license": "GPL-3.0-only",
6
6
  "type": "module",
@@ -39,7 +39,7 @@ import { setPendingUsageSource } from "../security/api-key-auth";
39
39
  import { HealthEventFlushBuffer, setHealthEventBuffer } from "../persistence/health-event-flush";
40
40
  import { subscribePeerSettingsRevisions } from "../persistence/settings-revision";
41
41
  import { deleteExpiredSessions } from "../console/auth/session-service";
42
- import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore } from "../security/abuse";
42
+ import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore, type IpAbuseStore } from "../security/abuse";
43
43
  import { checkReadiness } from "../persistence/readiness";
44
44
  import { ProxyRequestPreparer } from "../transport/request/preparer";
45
45
  import { DrizzleNetworkPoolLoader } from "../network/pool/loader";
@@ -104,6 +104,8 @@ export interface ProductionDeps {
104
104
  proxyPreparer: ProxyRequestPreparer;
105
105
  networkBindingFactory: ValidatedNetworkBindingFactory;
106
106
  ipAbuseProtection: IpAbuseProtectionService;
107
+ /** The abuse store backing manual IP bans and the ban list. */
108
+ ipAbuseStore: IpAbuseStore;
107
109
  readiness: () => Promise<ReadinessCheckResult>;
108
110
  scheduledTasks: ScheduledTaskRegistry;
109
111
  poolAgentResolver: PoolAgentResolver;
@@ -593,6 +595,11 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
593
595
  name: "client-version-monitor",
594
596
  intervalMs: CLIENT_VERSION_MONITOR_INTERVAL_MS,
595
597
  initialDelayMs: CLIENT_VERSION_INITIAL_DELAY_MS,
598
+ // Pure outbound reads with no shared rows/files: they must not be gated
599
+ // by the process-wide busy latch, or a nearly-continuous heavy sweep
600
+ // (quota-refresh) starves this monitor at its single initial tick and
601
+ // every 30-minute interval after it.
602
+ skipGate: true,
596
603
  run: refreshProviderClientVersions,
597
604
  });
598
605
 
@@ -606,13 +613,13 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
606
613
  // first open after an expiry always blocks on the provider.
607
614
  //
608
615
  // It also carries the daily check-in ride-along: each account refreshed
609
- // here gets its once-per-day WorkBuddy/CodeBuddy credit grant claimed in
616
+ // here gets its once-per-day CodeBuddy credit grant claimed in
610
617
  // the same pass (one attempt per account per day, guarded by a day
611
618
  // marker), so no second timer duplicates the credential resolution.
612
619
  //
613
620
  // Registered in **every** mode, not only when Redis is present: gating it on
614
621
  // Redis would cost Lite proactive quota warming and the check-in ride-along
615
- // above that claims the once-per-day WorkBuddy/CodeBuddy credit grant. The
622
+ // above that claims the once-per-day CodeBuddy credit grant. The
616
623
  // whole sweep chain accepts `RedisClient | undefined` and falls back to the
617
624
  // in-process TTL cache and an in-process day marker, so Redis is an
618
625
  // optimization here rather than a precondition — which is exactly what
@@ -739,6 +746,7 @@ export async function buildProductionDeps(): Promise<ProductionDeps> {
739
746
  }),
740
747
  networkBindingFactory,
741
748
  ipAbuseProtection,
749
+ ipAbuseStore: ipStore,
742
750
  readiness,
743
751
  scheduledTasks,
744
752
  poolAgentResolver,
@@ -119,7 +119,7 @@ export function resolveAccountAuthRejectedCooldownMs(): number {
119
119
  * Deliberately a *base*, not the 24h flat penalty it replaced. `11140` has two
120
120
  * documented causes our classifier cannot separate from the response alone: the
121
121
  * user's prompt failed a safety review, **and** sending the wrong desktop
122
- * `User-Agent` brand (`workbuddy/shared.ts`). A flat 24h meant that after we
122
+ * `User-Agent` brand (`codebuddy/shared.ts`). A flat 24h meant that after we
123
123
  * fixed a header regression every buddy account stayed dead for up to a further
124
124
  * day, and one unsafe prompt cost a whole account a day.
125
125
  *
@@ -173,12 +173,6 @@ export const CONFIG_SPEC = {
173
173
  */
174
174
  CARTETHYIA_DISABLED_TASKS: { kind: "list" },
175
175
 
176
- /**
177
- * Force the Qoder UMID bridge to the mini-ELF bundle on Linux
178
- * (`1` = always mini, `0` = never mini; absent = auto-detect containers).
179
- */
180
- CARTETHYIA_QODER_UMID_MINI: { kind: "int", default: 0, min: 0, max: 1 },
181
-
182
176
  /**
183
177
  * How long a day's telemetry is kept, in days.
184
178
  *
@@ -80,18 +80,24 @@ function parseSharedChildrenQuery(query: URLSearchParams): SharedChildrenPageOpt
80
80
 
81
81
  export function createApiKeyOperations(config: ApiKeyConfig) {
82
82
  const operations = {
83
- async listKeys(access: AccessDecision | undefined): Promise<ApiKeyResponse[]> {
83
+ async listKeys(access: AccessDecision | undefined, includeChildren = false): Promise<ApiKeyResponse[]> {
84
84
  const authorized = requireTenantScope(access, "dashboard:read");
85
85
  const records = await config.store.list(authorized.tenantId);
86
86
  const topLevel = records.filter(
87
87
  (record) => record.revokedAt === undefined && record.parentKeyId === undefined,
88
88
  );
89
+ // Share children are omitted from the main key list (they belong to a
90
+ // template), but the Banned Users search wants them so a child can be
91
+ // found and banned by hand.
92
+ const visible = includeChildren
93
+ ? records.filter((record) => record.revokedAt === undefined)
94
+ : topLevel;
89
95
  // A share template's own counter is the live family accumulator now:
90
96
  // every recipient commit adds to it (see ApiKeyAdmissionService
91
97
  // commitUsage), so reporting it raw gives the enforced family total.
92
98
  // No telemetry add-on is needed, and adding it here would double-count.
93
99
  return Promise.all(
94
- topLevel.map(async (record) => {
100
+ visible.map(async (record) => {
95
101
  const response = sanitizeApiKeyResponse(record);
96
102
  if (record.keyMode !== "share") return response;
97
103
  return response;
@@ -921,9 +927,10 @@ function jsonNull(): Response {
921
927
  export function createApiKeyRoutes(config: ApiKeyConfig): AnyElysia {
922
928
  const factory = createApiKeyOperations(config);
923
929
  return new Elysia({ prefix: "/api-keys" })
924
- .get("/", async ({ request, set }) => {
930
+ .get("/", async ({ request, set, query }) => {
925
931
  try {
926
- return await factory.listKeys(config.accessResolver(request));
932
+ const includeChildren = query?.["includeChildren"] === "1" || query?.["includeChildren"] === "true";
933
+ return await factory.listKeys(config.accessResolver(request), includeChildren);
927
934
  } catch (error) {
928
935
  return errorResponse(error, set, "API-key operation failed");
929
936
  }