cartethyia 2.7.8 → 2.8.0

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 (519) hide show
  1. package/.env.example +3 -3
  2. package/README.md +29 -59
  3. package/dist/dashboard/assets/BannedPage-Cc0vKpMG.js +1 -0
  4. package/dist/dashboard/assets/BannedPage-Cc0vKpMG.js.gz +0 -0
  5. package/dist/dashboard/assets/{CliToolDetailPage-BRWKPQPf.js → CliToolDetailPage-Bqj2aa1T.js} +1 -1
  6. package/dist/dashboard/assets/CliToolDetailPage-Bqj2aa1T.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolsPage-BP-Y5iHN.js → CliToolsPage-CXsaOAO2.js} +1 -1
  8. package/dist/dashboard/assets/CliToolsPage-CXsaOAO2.js.gz +0 -0
  9. package/dist/dashboard/assets/CombosPage-BeLpJ4ma.js +1 -0
  10. package/dist/dashboard/assets/CombosPage-BeLpJ4ma.js.gz +0 -0
  11. package/dist/dashboard/assets/ConsoleLogPage-DnV0uZ3m.js +1 -0
  12. package/dist/dashboard/assets/ConsoleLogPage-DnV0uZ3m.js.gz +0 -0
  13. package/dist/dashboard/assets/CustomizationPage-CBxAjo63.js +1 -0
  14. package/dist/dashboard/assets/CustomizationPage-CBxAjo63.js.gz +0 -0
  15. package/dist/dashboard/assets/HealthEventsModal-B5yEE0k6.js +1 -0
  16. package/dist/dashboard/assets/HealthEventsModal-B5yEE0k6.js.gz +0 -0
  17. package/dist/dashboard/assets/{InjectSystemPromptPanel-Cv-2Ol_K.js → InjectSystemPromptPanel-BWFLECmz.js} +2 -2
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-BWFLECmz.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-bKfz_b1K.js → LoginPage-CgoPc5B9.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-CgoPc5B9.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-B-WQxx_H.js → ModelPicker-D9bFQern.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-D9bFQern.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-B_p4tL8k.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-B_p4tL8k.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js +8 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-D_0PiZtg.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-D_0PiZtg.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-CLI2bJTK.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-CLI2bJTK.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-emlTuxz6.js → ProxyPage-BwNC_-Cx.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-BwNC_-Cx.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-DA-a1iSN.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-DA-a1iSN.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-CctTga2C.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-CctTga2C.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-CUZrKs9r.js → SetupPage-febLU4r1.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-febLU4r1.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-jWmUdDpy.js → StudioPage-M6fvR5Wz.js} +1 -1
  40. package/dist/dashboard/assets/StudioPage-M6fvR5Wz.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-nyeuRqz9.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-nyeuRqz9.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-BFOlvrJC.js +1 -0
  44. package/dist/dashboard/assets/api-keys-BFOlvrJC.js.gz +0 -0
  45. package/dist/dashboard/assets/app-Dx2QgsNj.css +2 -0
  46. package/dist/dashboard/assets/app-Dx2QgsNj.css.gz +0 -0
  47. package/dist/dashboard/assets/{assert-CidQVoNo.js → assert-CqTLw5e7.js} +1 -1
  48. package/dist/dashboard/assets/assert-CqTLw5e7.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-DyI_mJfi.js → badge-C83EqLB0.js} +1 -1
  50. package/dist/dashboard/assets/badge-C83EqLB0.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-B-yXtCqb.js → banner-D1xn7pIe.js} +1 -1
  54. package/dist/dashboard/assets/banner-D1xn7pIe.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-_HwAEqFF.js → card-DU3Lq5Lm.js} +1 -1
  64. package/dist/dashboard/assets/card-DU3Lq5Lm.js.gz +0 -0
  65. package/dist/dashboard/assets/cli-tools-Dw1U_drK.js +1 -0
  66. package/dist/dashboard/assets/cli-tools-Dw1U_drK.js.gz +0 -0
  67. package/dist/dashboard/assets/{clipboard-button-ByjCk0o9.js → clipboard-button-CEL5Sg_J.js} +1 -1
  68. package/dist/dashboard/assets/clipboard-button-CEL5Sg_J.js.gz +0 -0
  69. package/dist/dashboard/assets/{dialog-BZhOlfz-.js → dialog-BjFR5UHy.js} +1 -1
  70. package/dist/dashboard/assets/dialog-BjFR5UHy.js.gz +0 -0
  71. package/dist/dashboard/assets/{drawer-BADqIRYP.js → drawer-HvBW0AjI.js} +1 -1
  72. package/dist/dashboard/assets/drawer-HvBW0AjI.js.gz +0 -0
  73. package/dist/dashboard/assets/entry-BSu3gFlt.js +4 -0
  74. package/dist/dashboard/assets/entry-BSu3gFlt.js.gz +0 -0
  75. package/dist/dashboard/assets/{entry-COaC-irN.js → entry-CECVELyy.js} +1 -1
  76. package/dist/dashboard/assets/entry-CECVELyy.js.gz +0 -0
  77. package/dist/dashboard/assets/entry-DYYofQ7W.js +1 -0
  78. package/dist/dashboard/assets/entry-DYYofQ7W.js.gz +0 -0
  79. package/dist/dashboard/assets/{formatters-DcHJyRiu.js → formatters-DLW4i8zK.js} +1 -1
  80. package/dist/dashboard/assets/formatters-DLW4i8zK.js.gz +0 -0
  81. package/dist/dashboard/assets/{index-CgKmFngv.js → index-1-fCqe64.js} +2 -2
  82. package/dist/dashboard/assets/index-1-fCqe64.js.gz +0 -0
  83. package/dist/dashboard/assets/{inline-B2BirKry.js → inline-DGvU2oLK.js} +1 -1
  84. package/dist/dashboard/assets/inline-DGvU2oLK.js.gz +0 -0
  85. package/dist/dashboard/assets/{input-D-qV9dKY.js → input-iNnO1X2K.js} +1 -1
  86. package/dist/dashboard/assets/input-iNnO1X2K.js.gz +0 -0
  87. package/dist/dashboard/assets/{layout-B7tVWhtV.js → layout-0q8UGypb.js} +1 -1
  88. package/dist/dashboard/assets/layout-0q8UGypb.js.gz +0 -0
  89. package/dist/dashboard/assets/{list-row-CtkGE3bF.js → list-row-C0w2bQjJ.js} +1 -1
  90. package/dist/dashboard/assets/list-row-C0w2bQjJ.js.gz +0 -0
  91. package/dist/dashboard/assets/{live-DGizF06-.js → live-M5aJ_xCa.js} +1 -1
  92. package/dist/dashboard/assets/live-M5aJ_xCa.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-C9UE-bOr.js → network-BKeQGT3K.js} +1 -1
  96. package/dist/dashboard/assets/network-BKeQGT3K.js.gz +0 -0
  97. package/dist/dashboard/assets/{numbers-BnAd22a_.js → numbers-CivAk3da.js} +1 -1
  98. package/dist/dashboard/assets/numbers-CivAk3da.js.gz +0 -0
  99. package/dist/dashboard/assets/{pagination-BAywyMzS.js → pagination-CpzvI5ep.js} +1 -1
  100. package/dist/dashboard/assets/pagination-CpzvI5ep.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/providers/zro.svg +3 -0
  106. package/dist/dashboard/assets/providers/zro.svg.gz +0 -0
  107. package/dist/dashboard/assets/{query-keys-YSoQOUh6.js → query-keys-IKLh0YFd.js} +1 -1
  108. package/dist/dashboard/assets/query-keys-IKLh0YFd.js.gz +0 -0
  109. package/dist/dashboard/assets/quota-DiPD6UKH.js +1 -0
  110. package/dist/dashboard/assets/quota-DiPD6UKH.js.gz +0 -0
  111. package/dist/dashboard/assets/routing-BFQX2VBc.js +1 -0
  112. package/dist/dashboard/assets/routing-BFQX2VBc.js.gz +0 -0
  113. package/dist/dashboard/assets/{select-BCOcv8WK.js → select-CXbck0jG.js} +2 -2
  114. package/dist/dashboard/assets/select-CXbck0jG.js.gz +0 -0
  115. package/dist/dashboard/assets/settings-C_XvMHh9.js +1 -0
  116. package/dist/dashboard/assets/settings-C_XvMHh9.js.gz +0 -0
  117. package/dist/dashboard/assets/{stack-ByKt3Q1g.js → stack-DggRiCxE.js} +1 -1
  118. package/dist/dashboard/assets/stack-DggRiCxE.js.gz +0 -0
  119. package/dist/dashboard/assets/{state-DXbGTx7N.js → state-ClFzfbYp.js} +1 -1
  120. package/dist/dashboard/assets/state-ClFzfbYp.js.gz +0 -0
  121. package/dist/dashboard/assets/story/25817331.webp +0 -0
  122. package/dist/dashboard/assets/story/Shorekeeper.webp +0 -0
  123. package/dist/dashboard/assets/story/cartethyia-god.webp +0 -0
  124. package/dist/dashboard/assets/story/fleurdelys_plus.webp +0 -0
  125. package/dist/dashboard/assets/story/jinhsi-blossom.webp +0 -0
  126. package/dist/dashboard/assets/story/phrolova-a.webp +0 -0
  127. package/dist/dashboard/assets/story/requestdeniawokkjpg.webp +0 -0
  128. package/dist/dashboard/assets/story/wuthering-waves-hiyuki-aemeath-hiyuki-rover.webp +0 -0
  129. package/dist/dashboard/assets/{switch-ZeTsW623.js → switch-CTIFxKqS.js} +1 -1
  130. package/dist/dashboard/assets/switch-CTIFxKqS.js.gz +0 -0
  131. package/dist/dashboard/assets/{useMutation-CbCP4w1o.js → useMutation-BClG3yWj.js} +1 -1
  132. package/dist/dashboard/assets/useMutation-BClG3yWj.js.gz +0 -0
  133. package/dist/dashboard/console-backgrounds.webp +0 -0
  134. package/dist/dashboard/console-backgrounds_initial.webp +0 -0
  135. package/dist/dashboard/donation/qris-risun-marke.webp +0 -0
  136. package/dist/dashboard/index.html +3 -3
  137. package/dist/dashboard/index.html.gz +0 -0
  138. package/dist/dashboard/precompressed-assets.json +59 -56
  139. package/migrations/full-postgres/0044_add_models_warning_metadata.sql +10 -0
  140. package/migrations/full-postgres/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  141. package/migrations/full-postgres/0046_add_accounts_quota_plan_fetched_at.sql +7 -0
  142. package/migrations/lite-sqlite3/0044_add_models_warning_metadata.sql +11 -0
  143. package/migrations/lite-sqlite3/0045_migrate_workbuddy_to_codebuddy.sql +156 -0
  144. package/migrations/lite-sqlite3/0046_add_accounts_quota_plan_fetched_at.sql +4 -0
  145. package/package.json +1 -1
  146. package/src/boot/app.ts +10 -13
  147. package/src/boot/dependencies.ts +12 -4
  148. package/src/boot/flush.ts +20 -0
  149. package/src/boot/lifecycle.ts +7 -5
  150. package/src/config/cooldowns.ts +1 -1
  151. package/src/config/routing.ts +26 -0
  152. package/src/config/spec-metadata.ts +72 -0
  153. package/src/config/spec.ts +20 -6
  154. package/src/console/api-keys/contracts.ts +12 -1
  155. package/src/console/api-keys/routes.ts +50 -31
  156. package/src/console/auth/account-reset.ts +7 -9
  157. package/src/console/backup/contracts.ts +4 -0
  158. package/src/console/backup/export-endpoint.ts +7 -5
  159. package/src/console/cli-tools/service.ts +6 -12
  160. package/src/console/console-router-guards.ts +23 -16
  161. package/src/console/console-router.ts +7 -0
  162. package/src/console/dashboard-assets.ts +5 -5
  163. package/src/console/domain-registration.ts +27 -2
  164. package/src/console/inferhub/normalize.ts +24 -28
  165. package/src/console/inferhub/types.ts +3 -0
  166. package/src/console/ip-bans/routes.ts +93 -0
  167. package/src/console/observability/store.ts +0 -53
  168. package/src/console/providers/catalog/catalog-projections.ts +5 -2
  169. package/src/console/providers/catalog/contracts.ts +123 -0
  170. package/src/console/providers/catalog/discover-constants.ts +6 -0
  171. package/src/console/providers/catalog/model-operations.ts +122 -10
  172. package/src/console/providers/catalog/provider-operations.ts +116 -8
  173. package/src/console/providers/catalog/public-model-store.ts +0 -0
  174. package/src/console/providers/catalog/routes.ts +65 -4
  175. package/src/console/providers/catalog/store-helpers.ts +30 -1
  176. package/src/console/providers/catalog/store.ts +249 -4
  177. package/src/console/quota/account-quota-global.ts +97 -19
  178. package/src/console/quota/account-quota-shared.ts +49 -0
  179. package/src/console/quota/account-quota-tenant.ts +6 -18
  180. package/src/console/quota/native-identity.ts +2 -0
  181. package/src/console/quota/quota-view.ts +19 -3
  182. package/src/console/routing/pools/operations.ts +31 -46
  183. package/src/console/settings/contracts.ts +18 -0
  184. package/src/console/settings/store.ts +32 -0
  185. package/src/console/shared/errors.ts +33 -6
  186. package/src/console/system-prompt/contracts.ts +0 -1
  187. package/src/main.ts +3 -3
  188. package/src/network/pool/byte-accounting.ts +3 -2
  189. package/src/network/pool/selector.ts +182 -39
  190. package/src/network/pool-cooldown-store.ts +89 -14
  191. package/src/network/pool-health.ts +49 -61
  192. package/src/network/rate-limit-verdict.ts +1 -1
  193. package/src/network/ssrf.ts +6 -6
  194. package/src/observability/event-log.ts +7 -361
  195. package/src/observability/event-query.ts +18 -4
  196. package/src/observability/performance-metrics.ts +9 -0
  197. package/src/observability/runtime-metrics.ts +14 -9
  198. package/src/observability/telemetry-buffer.ts +15 -25
  199. package/src/observability/telemetry-reconciliation.ts +9 -37
  200. package/src/observability/telemetry-row.ts +125 -0
  201. package/src/persistence/db-mode.ts +4 -1
  202. package/src/persistence/dialect.ts +30 -0
  203. package/src/persistence/migrate.ts +6 -3
  204. package/src/persistence/schema.ts +28 -2
  205. package/src/persistence/ttl-cache.ts +20 -2
  206. package/src/protocol/codecs.ts +1 -1
  207. package/src/protocol/dsml.ts +35 -87
  208. package/src/protocol/gateway-error.ts +1 -0
  209. package/src/protocol/markup-stream-parser.ts +195 -0
  210. package/src/protocol/reasoning-text.ts +19 -0
  211. package/src/protocol/reasoning.ts +1 -1
  212. package/src/protocol/request/chat.ts +14 -14
  213. package/src/protocol/request/gemini.ts +8 -2
  214. package/src/protocol/request/messages.ts +4 -5
  215. package/src/protocol/response/chat.ts +12 -20
  216. package/src/protocol/response/gemini.ts +6 -1
  217. package/src/protocol/response/omp-tool-call-markup.ts +43 -86
  218. package/src/protocol/response/responses.ts +18 -2
  219. package/src/protocol/sse-decoder.ts +25 -8
  220. package/src/protocol/stop-reason.ts +23 -1
  221. package/src/protocol/stream-error-frames.ts +13 -3
  222. package/src/protocol/think-split.ts +112 -0
  223. package/src/protocol/translation/dialect/qwen.ts +26 -58
  224. package/src/protocol/translation/quirks.ts +1 -1
  225. package/src/protocol/translation/tool-repair.ts +2 -2
  226. package/src/protocol/upstream/send-claude-messages.ts +15 -4
  227. package/src/protocol/upstream-parsing.ts +1 -1
  228. package/src/providers/adapters/compatible-adapter.ts +78 -17
  229. package/src/providers/authentication/oauth-client.ts +1 -1
  230. package/src/providers/authentication/oauth-device-flow.ts +98 -8
  231. package/src/providers/authentication/oauth-refresh-service.ts +153 -59
  232. package/src/providers/configured-provider.ts +148 -0
  233. package/src/providers/default-registry.ts +117 -27
  234. package/src/providers/discovery/discovery-types.ts +12 -0
  235. package/src/providers/discovery/probe-phases.ts +74 -33
  236. package/src/providers/discovery/probing-service.ts +293 -165
  237. package/src/providers/integrations/alibabacp/alibabacp-models.ts +1 -2
  238. package/src/providers/integrations/{dashscope-models.ts → alibabacp/dashscope-models.ts} +2 -2
  239. package/src/providers/integrations/antigravity/antigravity-protocol.ts +121 -2
  240. package/src/providers/integrations/antigravity/antigravity.ts +13 -2
  241. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +72 -34
  242. package/src/providers/integrations/buddy/buddy-chat-shared.ts +191 -35
  243. package/src/providers/integrations/buddy/buddy-checkin.ts +17 -39
  244. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +2 -2
  245. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +5 -5
  246. package/src/providers/integrations/buddy/buddy-identity.ts +89 -6
  247. package/src/providers/integrations/buddy/buddy-media.ts +4 -5
  248. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +2 -2
  249. package/src/providers/integrations/buddy/buddy-quota-shared.ts +1 -1
  250. package/src/providers/integrations/buddy/buddy-usage-shared.ts +1 -3
  251. package/src/providers/integrations/buddy/capabilities.ts +6 -43
  252. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +2 -1
  253. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +23 -1
  254. package/src/providers/integrations/buddy/codebuddy/provider.ts +6 -2
  255. package/src/providers/integrations/buddy/codebuddy/shared.ts +38 -27
  256. package/src/providers/integrations/claude/claude-quota.ts +14 -17
  257. package/src/providers/integrations/cline/cline.ts +2 -2
  258. package/src/providers/integrations/commandcode/quota.ts +22 -28
  259. package/src/providers/integrations/cursor/cursor-auth.ts +0 -8
  260. package/src/providers/integrations/cursor/cursor-catalog.ts +2 -0
  261. package/src/providers/integrations/cursor/cursor-exec.ts +745 -0
  262. package/src/providers/integrations/cursor/cursor-http2.ts +2 -0
  263. package/src/providers/integrations/cursor/cursor-request.ts +35 -20
  264. package/src/providers/integrations/cursor/cursor-shared.ts +26 -5
  265. package/src/providers/integrations/cursor/cursor.ts +139 -70
  266. package/src/providers/integrations/cursor/protocol/messages.ts +22 -29
  267. package/src/providers/integrations/cursor/protocol/protobuf-schema.ts +37 -0
  268. package/src/providers/integrations/cursor/protocol/tool-canonical.ts +26 -100
  269. package/src/providers/integrations/devin/devin-auth.ts +353 -0
  270. package/src/providers/integrations/devin/devin-catalog.ts +207 -0
  271. package/src/providers/integrations/devin/devin-http.ts +91 -0
  272. package/src/providers/integrations/devin/devin-quota.ts +214 -0
  273. package/src/providers/integrations/devin/devin-shared.ts +111 -0
  274. package/src/providers/integrations/devin/devin.ts +539 -0
  275. package/src/providers/integrations/devin/protocol/devin-proto.ts +558 -0
  276. package/src/providers/integrations/devin/protocol/framing.ts +124 -0
  277. package/src/providers/integrations/factory/factory-oauth.ts +17 -44
  278. package/src/providers/integrations/factory/factory.ts +2 -2
  279. package/src/providers/integrations/freebuff/assets/official-system-manager.txt +88 -0
  280. package/src/providers/integrations/freebuff/assets/official-system-worker.txt +57 -0
  281. package/src/providers/integrations/freebuff/assets/official-tools.json +1070 -0
  282. package/src/providers/integrations/freebuff/freebuff-catalog.ts +120 -0
  283. package/src/providers/integrations/freebuff/freebuff-constants.ts +1233 -0
  284. package/src/providers/integrations/freebuff/freebuff-discovery.ts +108 -0
  285. package/src/providers/integrations/freebuff/freebuff-oauth.ts +240 -0
  286. package/src/providers/integrations/freebuff/freebuff-quota.ts +260 -0
  287. package/src/providers/integrations/freebuff/freebuff-virtual.ts +89 -0
  288. package/src/providers/integrations/freebuff/freebuff.ts +682 -0
  289. package/src/providers/integrations/freepi/freepi-catalog.ts +60 -0
  290. package/src/providers/integrations/freepi/freepi-discovery.ts +82 -0
  291. package/src/providers/integrations/freepi/freepi-headers.ts +21 -0
  292. package/src/providers/integrations/freepi/freepi-oauth.ts +142 -0
  293. package/src/providers/integrations/freepi/freepi-protocol.ts +242 -0
  294. package/src/providers/integrations/freepi/freepi-quota.ts +126 -0
  295. package/src/providers/integrations/freepi/freepi-realm.ts +35 -0
  296. package/src/providers/integrations/freepi/freepi.ts +292 -0
  297. package/src/providers/integrations/gemini.ts +2 -2
  298. package/src/providers/integrations/grok/grok-oauth.ts +48 -45
  299. package/src/providers/integrations/grok/grok-ratelimit-store.ts +10 -17
  300. package/src/providers/integrations/grok/grok-turn-index.ts +11 -16
  301. package/src/providers/integrations/hermes/hermes-oauth.ts +94 -0
  302. package/src/providers/integrations/{hermes.ts → hermes/hermes.ts} +13 -21
  303. package/src/providers/integrations/hermes/index.ts +2 -0
  304. package/src/providers/integrations/kiro/kiro-catalog.ts +17 -1
  305. package/src/providers/integrations/kiro/kiro-discovery.ts +10 -12
  306. package/src/providers/integrations/kiro/kiro-quota.ts +8 -4
  307. package/src/providers/integrations/kiro/kiro.ts +15 -19
  308. package/src/providers/integrations/ollamacloud/index.ts +2 -0
  309. package/src/providers/integrations/{ollamacloud-models.ts → ollamacloud/models.ts} +2 -2
  310. package/src/providers/integrations/{ollamacloud-quota.ts → ollamacloud/quota.ts} +3 -3
  311. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  312. package/src/providers/integrations/opencode/opencode-go-quota.ts +2 -8
  313. package/src/providers/integrations/perch/perch-catalog.ts +105 -0
  314. package/src/providers/integrations/perch/perch-credential.ts +25 -0
  315. package/src/providers/integrations/perch/perch-oauth.ts +170 -0
  316. package/src/providers/integrations/perch/perch-protocol.ts +208 -0
  317. package/src/providers/integrations/perch/perch-quota.ts +123 -0
  318. package/src/providers/integrations/perch/perch-realm.ts +82 -0
  319. package/src/providers/integrations/perch/perch-system-prompt.ts +13 -0
  320. package/src/providers/integrations/perch/perch.ts +305 -0
  321. package/src/providers/integrations/perch/saffron-system-prompt.txt +8 -0
  322. package/src/providers/integrations/qoder/chat-proto.ts +328 -328
  323. package/src/providers/integrations/qoder/claim-qoder-credits.ts +19 -60
  324. package/src/providers/integrations/qoder/qoder-adapter.ts +90 -40
  325. package/src/providers/integrations/qoder/qoder-auth.ts +101 -29
  326. package/src/providers/integrations/qoder/qoder-cache.ts +32 -0
  327. package/src/providers/integrations/qoder/qoder-catalog.ts +26 -6
  328. package/src/providers/integrations/qoder/qoder-chat.ts +7 -21
  329. package/src/providers/integrations/qoder/qoder-checkin.ts +6 -6
  330. package/src/providers/integrations/qoder/qoder-grpc.ts +210 -7
  331. package/src/providers/integrations/qoder/qoder-ide.ts +5 -108
  332. package/src/providers/integrations/qoder/qoder-identity-cache.ts +184 -0
  333. package/src/providers/integrations/qoder/qoder-native-identity-store.ts +83 -18
  334. package/src/providers/integrations/qoder/qoder-realm.ts +9 -6
  335. package/src/providers/integrations/qoder/qoder-umid.ts +109 -342
  336. package/src/providers/integrations/qoder/qoder-virtual.ts +33 -1
  337. package/src/providers/integrations/qoder/qoder.ts +3 -7
  338. package/src/providers/integrations/trae/trae-catalog.ts +9 -14
  339. package/src/providers/integrations/trae/trae-headers.ts +36 -11
  340. package/src/providers/integrations/trae/trae-oauth.ts +14 -17
  341. package/src/providers/integrations/trae/trae-protocol.ts +12 -11
  342. package/src/providers/integrations/trae/trae-quota.ts +96 -36
  343. package/src/providers/integrations/trae/trae-realm.ts +74 -15
  344. package/src/providers/integrations/trae/trae.ts +99 -26
  345. package/src/providers/integrations/zcode-start-plan/provider.ts +226 -23
  346. package/src/providers/integrations/zcode-start-plan/quota.ts +19 -2
  347. package/src/providers/integrations/zro/zro.ts +204 -0
  348. package/src/providers/operations/account-error-classification.ts +235 -278
  349. package/src/providers/operations/account-health-service.ts +273 -26
  350. package/src/providers/operations/account-refresh-status.ts +269 -0
  351. package/src/providers/operations/account-tier.ts +66 -0
  352. package/src/providers/operations/client-version-resolver.ts +1 -1
  353. package/src/providers/operations/client-versions.ts +42 -150
  354. package/src/providers/operations/cooldown-rules.ts +56 -0
  355. package/src/providers/operations/{model-catalog-cache.ts → provider-caches.ts} +68 -16
  356. package/src/providers/operations/provider-catalog-seeder.ts +4 -0
  357. package/src/providers/operations/provider-catalog-service.ts +1 -1
  358. package/src/providers/operations/provider-credential-service.ts +102 -32
  359. package/src/providers/operations/provider-rules/github.ts +48 -0
  360. package/src/providers/operations/provider-rules/grok.ts +33 -0
  361. package/src/providers/operations/provider-rules/inception.ts +49 -0
  362. package/src/providers/operations/provider-rules/index.ts +32 -0
  363. package/src/providers/operations/provider-rules/perch.ts +37 -0
  364. package/src/providers/operations/provider-rules/qoder.ts +70 -0
  365. package/src/providers/operations/provider-rules/trae.ts +81 -0
  366. package/src/providers/provider-contracts.ts +33 -2
  367. package/src/providers/{provider-credential-resolver.ts → provider-credentials.ts} +40 -3
  368. package/src/providers/provider-metadata.ts +99 -14
  369. package/src/providers/provider-model-definition.ts +36 -0
  370. package/src/providers/provider-probe.ts +15 -1
  371. package/src/providers/provider-registry.ts +42 -33
  372. package/src/providers/quota/quota-limit-windows.ts +16 -5
  373. package/src/providers/quota/quota-support.ts +1 -1
  374. package/src/providers/quota/quota-window-parser.ts +90 -18
  375. package/src/providers/quota/refresh.ts +96 -18
  376. package/src/security/abuse.ts +71 -0
  377. package/src/security/api-key-auth-cache.ts +1 -1
  378. package/src/security/api-key-auth.ts +6 -2
  379. package/src/transport/dispatch/attempt-finalize.ts +14 -13
  380. package/src/transport/dispatch/attempt-loop.ts +71 -17
  381. package/src/transport/dispatch/generation.ts +2 -8
  382. package/src/transport/dispatch/native-shared.ts +25 -0
  383. package/src/transport/dispatch/proxy-request.ts +9 -46
  384. package/src/transport/dispatch/responses-compact.ts +2 -8
  385. package/src/transport/dispatch/streaming/finalize.ts +9 -6
  386. package/src/transport/dispatch/streaming/stream.ts +9 -36
  387. package/src/transport/dispatch/systemone.ts +2 -8
  388. package/src/transport/dispatch/token-count.ts +2 -6
  389. package/src/transport/dispatch/upstream.ts +67 -1
  390. package/src/transport/drain-endpoint.ts +31 -4
  391. package/src/transport/failure-policy.ts +129 -37
  392. package/src/transport/guards/body-policy.ts +7 -1
  393. package/src/transport/guards/error-lifecycle.ts +13 -1
  394. package/src/transport/guards/request-context.ts +22 -14
  395. package/src/transport/request/preparer.ts +81 -71
  396. package/src/transport/routing/bounded-lru.ts +14 -0
  397. package/src/transport/routing/drain-reserve.ts +129 -0
  398. package/src/transport/routing/plan-gate.ts +7 -1
  399. package/src/transport/routing/round-robin.ts +60 -0
  400. package/src/transport/routing/route-catalog.ts +123 -111
  401. package/src/transport/routing/route-model.ts +51 -9
  402. package/src/transport/routing/router.ts +418 -33
  403. package/src/transport/surface/adapters.ts +11 -2
  404. package/src/transport/surface/chat/adapter.ts +2 -2
  405. package/src/transport/surface/chat/encode.ts +47 -4
  406. package/src/transport/surface/chat/parse.ts +2 -12
  407. package/src/transport/surface/completion.ts +44 -33
  408. package/src/transport/surface/content-parts.ts +21 -0
  409. package/src/transport/surface/messages/adapter.ts +9 -2
  410. package/src/transport/surface/messages/encode.ts +11 -3
  411. package/src/transport/surface/messages/parse.ts +2 -1
  412. package/src/transport/surface/messages/stream.ts +33 -17
  413. package/src/transport/surface/responses/encode.ts +34 -6
  414. package/src/transport/surface/responses/parse.ts +3 -11
  415. package/src/workers/daily-checkin.ts +1 -1
  416. package/src/workers/quota-refresh-sweep.ts +1 -1
  417. package/src/workers/scheduler.ts +22 -4
  418. package/dist/dashboard/assets/BannedPage-DeIbIiBU.js +0 -1
  419. package/dist/dashboard/assets/BannedPage-DeIbIiBU.js.gz +0 -0
  420. package/dist/dashboard/assets/CliToolDetailPage-BRWKPQPf.js.gz +0 -0
  421. package/dist/dashboard/assets/CliToolsPage-BP-Y5iHN.js.gz +0 -0
  422. package/dist/dashboard/assets/CombosPage-B7JHozVa.js +0 -1
  423. package/dist/dashboard/assets/CombosPage-B7JHozVa.js.gz +0 -0
  424. package/dist/dashboard/assets/ConsoleLogPage-GX7iGGcu.js +0 -1
  425. package/dist/dashboard/assets/ConsoleLogPage-GX7iGGcu.js.gz +0 -0
  426. package/dist/dashboard/assets/CustomizationPage-HVonbGEa.js +0 -1
  427. package/dist/dashboard/assets/CustomizationPage-HVonbGEa.js.gz +0 -0
  428. package/dist/dashboard/assets/HealthEventsModal-xaut4OJ9.js +0 -1
  429. package/dist/dashboard/assets/HealthEventsModal-xaut4OJ9.js.gz +0 -0
  430. package/dist/dashboard/assets/InjectSystemPromptPanel-Cv-2Ol_K.js.gz +0 -0
  431. package/dist/dashboard/assets/LoginPage-bKfz_b1K.js.gz +0 -0
  432. package/dist/dashboard/assets/ModelPicker-B-WQxx_H.js.gz +0 -0
  433. package/dist/dashboard/assets/OverviewPage-Z9pJZFo8.js +0 -1
  434. package/dist/dashboard/assets/OverviewPage-Z9pJZFo8.js.gz +0 -0
  435. package/dist/dashboard/assets/ProviderDetailPage-CMeDBxR1.js +0 -7
  436. package/dist/dashboard/assets/ProviderDetailPage-CMeDBxR1.js.gz +0 -0
  437. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +0 -1
  438. package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
  439. package/dist/dashboard/assets/ProvidersPage-BXPdOpG4.js +0 -1
  440. package/dist/dashboard/assets/ProvidersPage-BXPdOpG4.js.gz +0 -0
  441. package/dist/dashboard/assets/ProxyPage-emlTuxz6.js.gz +0 -0
  442. package/dist/dashboard/assets/QuotaPage-CMJKNYWb.js +0 -1
  443. package/dist/dashboard/assets/QuotaPage-CMJKNYWb.js.gz +0 -0
  444. package/dist/dashboard/assets/SettingsPage-BSy7EwGo.js +0 -1
  445. package/dist/dashboard/assets/SettingsPage-BSy7EwGo.js.gz +0 -0
  446. package/dist/dashboard/assets/SetupPage-CUZrKs9r.js.gz +0 -0
  447. package/dist/dashboard/assets/StudioPage-jWmUdDpy.js.gz +0 -0
  448. package/dist/dashboard/assets/UsagePage-5F9tGVGG.js +0 -56
  449. package/dist/dashboard/assets/UsagePage-5F9tGVGG.js.gz +0 -0
  450. package/dist/dashboard/assets/api-keys-KvX83mRe.js +0 -1
  451. package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
  452. package/dist/dashboard/assets/app-BEsU8hKs.css +0 -2
  453. package/dist/dashboard/assets/app-BEsU8hKs.css.gz +0 -0
  454. package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
  455. package/dist/dashboard/assets/badge-DyI_mJfi.js.gz +0 -0
  456. package/dist/dashboard/assets/banner-B-yXtCqb.js.gz +0 -0
  457. package/dist/dashboard/assets/brand/bansos_page.png +0 -0
  458. package/dist/dashboard/assets/brand/denia_bansos.jpg +0 -0
  459. package/dist/dashboard/assets/brand/favicon.jpg +0 -0
  460. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  461. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  462. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  463. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  464. package/dist/dashboard/assets/brand/sidebar_ico.jpg +0 -0
  465. package/dist/dashboard/assets/card-_HwAEqFF.js.gz +0 -0
  466. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +0 -1
  467. package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
  468. package/dist/dashboard/assets/clipboard-button-ByjCk0o9.js.gz +0 -0
  469. package/dist/dashboard/assets/dialog-BZhOlfz-.js.gz +0 -0
  470. package/dist/dashboard/assets/drawer-BADqIRYP.js.gz +0 -0
  471. package/dist/dashboard/assets/entry-COaC-irN.js.gz +0 -0
  472. package/dist/dashboard/assets/entry-Ca7LSCet.js +0 -4
  473. package/dist/dashboard/assets/entry-Ca7LSCet.js.gz +0 -0
  474. package/dist/dashboard/assets/entry-PDd27uCd.js +0 -1
  475. package/dist/dashboard/assets/entry-PDd27uCd.js.gz +0 -0
  476. package/dist/dashboard/assets/formatters-DcHJyRiu.js.gz +0 -0
  477. package/dist/dashboard/assets/index-CgKmFngv.js.gz +0 -0
  478. package/dist/dashboard/assets/inline-B2BirKry.js.gz +0 -0
  479. package/dist/dashboard/assets/input-D-qV9dKY.js.gz +0 -0
  480. package/dist/dashboard/assets/layout-B7tVWhtV.js.gz +0 -0
  481. package/dist/dashboard/assets/list-row-CtkGE3bF.js.gz +0 -0
  482. package/dist/dashboard/assets/live-DGizF06-.js.gz +0 -0
  483. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js +0 -1
  484. package/dist/dashboard/assets/minimize-2-BTmMTK4o.js.gz +0 -0
  485. package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
  486. package/dist/dashboard/assets/network-C9UE-bOr.js.gz +0 -0
  487. package/dist/dashboard/assets/numbers-BnAd22a_.js.gz +0 -0
  488. package/dist/dashboard/assets/pagination-BAywyMzS.js.gz +0 -0
  489. package/dist/dashboard/assets/query-keys-YSoQOUh6.js.gz +0 -0
  490. package/dist/dashboard/assets/quota-DJ1QlAOq.js +0 -1
  491. package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
  492. package/dist/dashboard/assets/routing-fnCsxgNO.js +0 -1
  493. package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
  494. package/dist/dashboard/assets/select-BCOcv8WK.js.gz +0 -0
  495. package/dist/dashboard/assets/settings-BxslsErn.js +0 -1
  496. package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
  497. package/dist/dashboard/assets/stack-ByKt3Q1g.js.gz +0 -0
  498. package/dist/dashboard/assets/state-DXbGTx7N.js.gz +0 -0
  499. package/dist/dashboard/assets/switch-ZeTsW623.js.gz +0 -0
  500. package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
  501. package/dist/dashboard/console-backgrounds.jpg +0 -0
  502. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  503. package/dist/dashboard/donation/qris-risun-marke.png +0 -0
  504. package/src/providers/bundled-discovery-providers.ts +0 -98
  505. package/src/providers/configured-openai-providers.ts +0 -120
  506. package/src/providers/integrations/buddy/turing-device-token.ts +0 -262
  507. package/src/providers/integrations/buddy/workbuddy/cn-oauth.ts +0 -30
  508. package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +0 -58
  509. package/src/providers/integrations/buddy/workbuddy/oauth.ts +0 -31
  510. package/src/providers/integrations/buddy/workbuddy/provider.ts +0 -209
  511. package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -161
  512. package/src/providers/integrations/buddy/workbuddy/shared.ts +0 -285
  513. package/src/providers/operations/model-discovery-cache.ts +0 -34
  514. package/src/providers/operations/probe-fetch.ts +0 -15
  515. package/src/providers/operations/provider-version-cache.ts +0 -30
  516. package/src/providers/provider-capabilities.ts +0 -33
  517. package/src/providers/provider-credential-envelope.ts +0 -43
  518. /package/dist/dashboard/assets/{app-CTxoqyYB.js → app-DIXLjojg.js} +0 -0
  519. /package/dist/dashboard/assets/{app-CTxoqyYB.js.gz → app-DIXLjojg.js.gz} +0 -0
@@ -1,120 +0,0 @@
1
- import type { ApiKeyProviderSpec } from "./configured-provider";
2
- import type { ProviderId } from "./provider-contracts";
3
-
4
- /**
5
- * The shared spec builder for every builtin bearer-AI provider: "bearer auth
6
- * against the provider's `BUNDLED_PROVIDER_METADATA` base URL, OpenAI-compatible
7
- * chat + responses, with the endpoint paths declared *below* the version root".
8
- *
9
- * `joinUrl` is plain concatenation and nothing rewrites a declared path, so a
10
- * base already rooted at a version (`/openai/v1`, `/v1/openai`, `/v3/openai`,
11
- * `/api/v1`, `/v2`, `/inference/v1`) plus a `/v1/…` path would double the
12
- * segment and 404 every request. These specs therefore declare the path below
13
- * the version root — the provider stating the truth about its own wire, not a
14
- * correction applied to it.
15
- */
16
- function apiKeySpec(
17
- providerId: ProviderId,
18
- paths: Readonly<Partial<Record<"chat" | "responses", string>>>,
19
- ): ApiKeyProviderSpec {
20
- return {
21
- provider_id: providerId,
22
- endpoint_paths_by_wire_family: paths,
23
- };
24
- }
25
-
26
- const BEARER_PATHS = { chat: "/chat/completions", responses: "/responses" } as const;
27
-
28
- /**
29
- * Builtin providers whose entire adapter contract is "bearer auth against the
30
- * provider's `BUNDLED_PROVIDER_METADATA` base URL, OpenAI-compatible chat +
31
- * responses, with endpoint paths declared below the base's version root". They
32
- * carry no catalog, no OAuth, and no provider-specific payload hook, so they
33
- * share one spec shape rather than one module each.
34
- *
35
- * `base_url` is resolved per provider by `providerBaseUrl(provider_id)`.
36
- *
37
- * These providers list their models through live `/v1/models` discovery rather
38
- * than a static catalog: every one of them republishes an aggregator's whole
39
- * roster, which changes faster than a committed array can. Each registry row
40
- * pairs this spec with `openAIModelDiscovery`.
41
- *
42
- * The id list is derived from the spec record so the two cannot drift apart.
43
- */
44
- export const GENERIC_API_KEY_SPECS = {
45
- larprouter: apiKeySpec("larprouter", BEARER_PATHS),
46
- mistral: apiKeySpec("mistral", BEARER_PATHS),
47
- fireworks: apiKeySpec("fireworks", BEARER_PATHS),
48
- nvidia: apiKeySpec("nvidia", BEARER_PATHS),
49
- gmi: apiKeySpec("gmi", BEARER_PATHS),
50
- ollamacloud: apiKeySpec("ollamacloud", BEARER_PATHS),
51
- together: apiKeySpec("together", BEARER_PATHS),
52
- siliconflow: apiKeySpec("siliconflow", BEARER_PATHS),
53
- siliconflowcn: apiKeySpec("siliconflowcn", BEARER_PATHS),
54
- nanogpt: apiKeySpec("nanogpt", BEARER_PATHS),
55
- baseten: apiKeySpec("baseten", BEARER_PATHS),
56
- synthetic: apiKeySpec("synthetic", BEARER_PATHS),
57
- stepfun: apiKeySpec("stepfun", BEARER_PATHS),
58
- sakana: apiKeySpec("sakana", BEARER_PATHS),
59
- helmcode: apiKeySpec("helmcode", BEARER_PATHS),
60
- coralbricks: apiKeySpec("coralbricks", BEARER_PATHS),
61
- aiand: apiKeySpec("aiand", BEARER_PATHS),
62
- wafer: apiKeySpec("wafer", BEARER_PATHS),
63
- coreweave: apiKeySpec("coreweave", BEARER_PATHS),
64
- dashscope: apiKeySpec("dashscope", BEARER_PATHS),
65
- "qwen-portal": apiKeySpec("qwen-portal", BEARER_PATHS),
66
- // `deepseek` is intentionally absent: it dispatches on the Anthropic Messages
67
- // wire at its `/anthropic` root, not the OpenAI chat/responses wires, so it
68
- // carries a dedicated entry in `default-registry.ts` instead.
69
- //
70
- // The aggregators below are absent for a different reason: their base URL is
71
- // already rooted at a version segment that the `/v1`-prefixed path this shape
72
- // pins would duplicate (`/openai/v1`, `/v1/openai`, `/v3/openai`, `/api/v1`,
73
- // `/v2`, and `/inference/v1`), so `joinUrl` would produce
74
- // `…/v1/v1/chat/completions`. They use the versioned-root spec instead,
75
- // which pins the path below the version root — the same reason `cerebras`
76
- // declares `/chat/completions` explicitly.
77
- } satisfies Readonly<Record<string, ApiKeyProviderSpec>>;
78
-
79
- /**
80
- * One id that has both a generic spec and a registry row.
81
- *
82
- * Exported so the registry can be checked against the spec list rather than
83
- * repeating the id as a string: `discoveryBackedProvider` takes this type, so a
84
- * row naming a provider with no spec is a compile error instead of an
85
- * `undefined` adapter at first dispatch.
86
- */
87
- export type GenericApiKeyProviderId = keyof typeof GENERIC_API_KEY_SPECS;
88
-
89
- export const GENERIC_API_KEY_PROVIDER_IDS = Object.keys(
90
- GENERIC_API_KEY_SPECS,
91
- ) as readonly GenericApiKeyProviderId[];
92
-
93
- /**
94
- * Ids whose base URL already ends at a version segment.
95
- *
96
- * `joinUrl` is plain concatenation and nothing rewrites a declared path, so a
97
- * base already rooted at a version plus a `/v1/…` path doubles the segment and
98
- * every request 404s. These specs therefore declare the path *below* the
99
- * version root. That is the provider stating the truth about its own wire, not
100
- * a correction applied to it: a wrong path now reaches the operator as the
101
- * wrong URL instead of being quietly rewritten into a different address.
102
- *
103
- * The id list is derived from the spec record so the two cannot drift apart.
104
- */
105
- export const VERSIONED_ROOT_API_KEY_SPECS = {
106
- groq: apiKeySpec("groq", BEARER_PATHS),
107
- deepinfra: apiKeySpec("deepinfra", BEARER_PATHS),
108
- novita: apiKeySpec("novita", BEARER_PATHS),
109
- venice: apiKeySpec("venice", BEARER_PATHS),
110
- qianfan: apiKeySpec("qianfan", BEARER_PATHS),
111
- zhipucoding: apiKeySpec("zhipucoding", BEARER_PATHS),
112
- firepass: apiKeySpec("firepass", BEARER_PATHS),
113
- } satisfies Readonly<Record<string, ApiKeyProviderSpec>>;
114
-
115
- export type VersionedRootApiKeyProviderId =
116
- keyof typeof VERSIONED_ROOT_API_KEY_SPECS;
117
-
118
- export const VERSIONED_ROOT_API_KEY_PROVIDER_IDS = Object.keys(
119
- VERSIONED_ROOT_API_KEY_SPECS,
120
- ) as readonly VersionedRootApiKeyProviderId[];
@@ -1,262 +0,0 @@
1
- /**
2
- * TuringShield device-token integration for the buddy providers.
3
- *
4
- * WorkBuddy/CodeBuddy desktop clients derive `X-Device-Token` from Tencent's
5
- * TuringShield SDK (native addon + DLL, channel 400111). The upstream risk
6
- * control expects that header on chat traffic, and the official desktop app
7
- * always presents either a real token or an `X-Device-Token-Error` — never
8
- * neither.
9
- *
10
- * The SDK is a proprietary native binary shipped inside this repository under
11
- * `vendor/turing-sdk/` (extracted from the WorkBuddy desktop app, channel
12
- * 400111). `CARTETHYIA_TURING_SDK_PATH` remains as an optional override for
13
- * deployments that bring their own copy. When neither is present the service
14
- * falls back to the same "sdk_not_initialized" failure state the desktop app
15
- * emits when the SDK cannot run.
16
- *
17
- * Loading and calling the SDK is safe: `configure()` is local-only, and
18
- * `fetchDeviceToken()` performs the SDK's normal network exchange with the
19
- * Turing endpoint (the same call the desktop client makes). On platforms
20
- * without native support (non-win32/darwin) the service degrades to the
21
- * fallback.
22
- */
23
- import { existsSync } from "node:fs";
24
- import path from "node:path";
25
- import { createHash } from "node:crypto";
26
- import { log } from "../../../observability/logger";
27
- import { resolvePackagePath } from "../../../config/package-paths";
28
-
29
- /** Channel assigned to the WorkBuddy desktop product (see cli/product.json). */
30
- export const TURING_CHANNEL_ID = 400111;
31
-
32
- /** Per-provider SDK configuration (payload identity sent to Turing). */
33
- export interface TuringSdkConfig {
34
- readonly channelId: number;
35
- readonly productName: string;
36
- readonly productVersion: string;
37
- }
38
-
39
- /** Canonical config for the WorkBuddy profile. */
40
- export const WORKBUDDY_TURING_CONFIG: TuringSdkConfig = {
41
- channelId: TURING_CHANNEL_ID,
42
- productName: "WorkBuddy AI",
43
- productVersion: "5.8.4",
44
- };
45
-
46
- /** Canonical config for the CodeBuddy profile (same SDK, distinct payload). */
47
- export const CODEBUDDY_TURING_CONFIG: TuringSdkConfig = {
48
- channelId: TURING_CHANNEL_ID,
49
- productName: "CodeBuddy",
50
- productVersion: "4.12.1",
51
- };
52
-
53
- /** Mirror the desktop client's service defaults (main-bootstrap.js). */
54
- const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
55
- const DEFAULT_REFRESH_INTERVAL_MS = 5 * 60_000;
56
- const DEFAULT_RETRY_BASE_DELAY_MS = 30_000;
57
- const DEFAULT_RETRY_MAX_DELAY_MS = 5 * 60_000;
58
- const MAX_BACKOFF_LEVEL = 20;
59
-
60
- /**
61
- * Resolve the directory holding the Turing SDK native files, or null.
62
- *
63
- * Priority: `CARTETHYIA_TURING_SDK_PATH` override → bundled copy in
64
- * `vendor/turing-sdk/build/Release/` under the package root (works both in
65
- * source and in the compiled binary, where `CARTETHYIA_PACKAGE_ROOT` points at
66
- * `/app`).
67
- */
68
- export function resolveTuringSdkRoot(): string | null {
69
- const env = process.env["CARTETHYIA_TURING_SDK_PATH"];
70
- if (env !== undefined && env.trim().length > 0) return env.trim();
71
- // Bundled SDK (committed in vendor/).
72
- const bundled = resolvePackagePath("vendor", "turing-sdk", "build", "Release");
73
- if (existsSync(path.join(bundled, "turing_sdk.node"))) return bundled;
74
- return null;
75
- }
76
-
77
- /** Pure header decision, matching the desktop app's `token || error` contract. */
78
- export function turingHeadersForRequest(args: {
79
- token?: string;
80
- error?: string;
81
- cliIdentity?: boolean;
82
- }): Record<string, string> {
83
- if (args.cliIdentity) return {};
84
- const token = args.token?.trim();
85
- if (token !== undefined && token.length > 0) return { "x-device-token": token };
86
- const error = args.error?.trim();
87
- if (error !== undefined && error.length > 0) return { "x-device-token-error": error };
88
- return { "x-device-token-error": "sdk_not_initialized" };
89
- }
90
-
91
- /** Stable identifier for logs (never the token itself). */
92
- function logDeviceFingerprint(): string {
93
- const parts = [process.platform, process.arch, process.env["COMPUTERNAME"] ?? process.env["HOSTNAME"] ?? ""];
94
- return createHash("sha256").update(parts.join("|")).digest("hex").slice(0, 12);
95
- }
96
-
97
- export class TuringDeviceTokenService {
98
- private binding: { configure(...a: unknown[]): unknown; fetchDeviceToken(o: unknown): unknown } | null = null;
99
- private loadAttempted = false;
100
- private configured = false;
101
-
102
- private cachedToken: string | undefined;
103
- private cachedError: string | undefined;
104
- private cachedAt = 0;
105
- private consecutiveFailures = 0;
106
- private nextRetryAt = 0;
107
- private inflight: Promise<string> | undefined;
108
-
109
- constructor(private readonly config: TuringSdkConfig = WORKBUDDY_TURING_CONFIG) {}
110
-
111
- private ensureLoaded(): boolean {
112
- if (this.loadAttempted) return this.configured;
113
- this.loadAttempted = true;
114
- const root = resolveTuringSdkRoot();
115
- if (root === null) {
116
- log.warn("[turing-sdk] no SDK root (env unset & vendor missing); device token fallback active");
117
- return false;
118
- }
119
- const nodePath = path.join(root, "turing_sdk.node");
120
- if (!existsSync(nodePath)) {
121
- log.warn("[turing-sdk] turing_sdk.node not found at " + nodePath);
122
- return false;
123
- }
124
- try {
125
- // eslint-disable-next-line @typescript-eslint/no-var-requires
126
- const loaded: unknown = require(nodePath);
127
- if (loaded === null || typeof loaded !== "object" || typeof (loaded as Record<string, unknown>)["configure"] !== "function") {
128
- log.warn("[turing-sdk] native addon loaded but exposes no configure()");
129
- return false;
130
- }
131
- const binding = loaded as NonNullable<TuringDeviceTokenService["binding"]>;
132
- binding.configure(this.config.channelId, this.config.productName, this.config.productVersion);
133
- this.binding = binding;
134
- this.configured = true;
135
- log.info(
136
- "[turing-sdk] native SDK configured (channel " + this.config.channelId +
137
- ", product " + this.config.productName + " " + this.config.productVersion +
138
- ", " + logDeviceFingerprint() + ")",
139
- );
140
- } catch (error) {
141
- log.warn("[turing-sdk] failed to load/configure native SDK: " + (error instanceof Error ? error.message : String(error)));
142
- this.binding = null;
143
- }
144
- return this.configured;
145
- }
146
-
147
- /** Returns a real token when the SDK can produce one; undefined otherwise. */
148
- async fetchDeviceToken(): Promise<string | undefined> {
149
- if (!this.ensureLoaded()) return undefined;
150
- const now = Date.now();
151
- if (this.inflight) return this.inflight;
152
- const task = this.performFetch().finally(() => {
153
- this.inflight = undefined;
154
- });
155
- this.inflight = task;
156
- try {
157
- const token = await task;
158
- this.cachedToken = token;
159
- this.cachedError = undefined;
160
- this.cachedAt = now;
161
- this.consecutiveFailures = 0;
162
- this.nextRetryAt = 0;
163
- return token;
164
- } catch (error) {
165
- const message = error instanceof Error ? error.message : String(error);
166
- this.cachedError = message.replace(/[^\x20-\x7E]/g, "").slice(0, 64);
167
- this.consecutiveFailures += 1;
168
- const level = Math.min(Math.max(0, this.consecutiveFailures - 1), MAX_BACKOFF_LEVEL);
169
- const delay = Math.min(DEFAULT_RETRY_BASE_DELAY_MS * 2 ** level, DEFAULT_RETRY_MAX_DELAY_MS);
170
- this.nextRetryAt = Date.now() + delay;
171
- return undefined;
172
- }
173
- }
174
-
175
- private async performFetch(): Promise<string> {
176
- const binding = this.binding;
177
- if (!binding) throw new Error("sdk_not_initialized");
178
- const timeoutMs = DEFAULT_REQUEST_TIMEOUT_MS;
179
- const promise = binding.fetchDeviceToken({
180
- usingCachedMessage: true,
181
- includesOutdatedMessage: false,
182
- includesDeviceInfo: true,
183
- timeoutMs,
184
- });
185
- const token = await this.withTimeout(Promise.resolve(promise) as Promise<string>, timeoutMs);
186
- const text = typeof token === "string" ? token : String(token ?? "");
187
- if (text.trim().length === 0) throw new Error("Turing SDK returned an empty device token");
188
- return text.trim();
189
- }
190
-
191
- private async withTimeout(promise: Promise<string>, ms: number): Promise<string> {
192
- let timer: ReturnType<typeof setTimeout> | undefined;
193
- try {
194
- return await Promise.race([
195
- promise,
196
- new Promise<string>((_, reject) => {
197
- timer = setTimeout(() => reject(new Error("Turing SDK device token request timed out after " + ms + "ms")), ms);
198
- timer.unref?.();
199
- }),
200
- ]);
201
- } finally {
202
- if (timer !== undefined) clearTimeout(timer);
203
- }
204
- }
205
-
206
- /**
207
- * Headers for one buddy request. Ensures a cached token exists (refreshing
208
- * in the background when stale), then returns the desktop `token || error`
209
- * contract.
210
- */
211
- async headersForRequest(cliIdentity?: boolean, requested?: TuringSdkConfig): Promise<Record<string, string>> {
212
- // The Turing SDK rejects a channelId change after initialization. Keep the
213
- // first config that actually configures the binding; later conflicting
214
- // requests are warned once and keep serving the active token.
215
- if (requested !== undefined) {
216
- const activeOrMine = this.configured ? this.config : requested;
217
- if (this.configured && (requested.channelId !== this.config.channelId || requested.productName !== this.config.productName)) {
218
- log.warn("[turing-sdk] ignoring conflicting SDK config (channel " + requested.channelId + ", " + requested.productName + "); active is channel " + this.config.channelId + ", " + this.config.productName);
219
- } else {
220
- void activeOrMine;
221
- }
222
- }
223
- let token: string | undefined = this.cachedToken;
224
- let error: string | undefined = this.cachedError;
225
- const now = Date.now();
226
- if (token === undefined) {
227
- if (now < this.nextRetryAt) {
228
- // Keep whatever we had; still within backoff.
229
- } else {
230
- token = await this.fetchDeviceToken();
231
- if (token === undefined) error = this.cachedError;
232
- }
233
- } else if (now - this.cachedAt >= DEFAULT_REFRESH_INTERVAL_MS) {
234
- // Stale: refresh opportunistically but keep serving the cached token.
235
- void this.fetchDeviceToken();
236
- }
237
- return turingHeadersForRequest({
238
- ...(token === undefined ? {} : { token }),
239
- ...(error === undefined ? {} : { error }),
240
- ...(cliIdentity === undefined ? {} : { cliIdentity }),
241
- });
242
- }
243
- }
244
-
245
- /**
246
- * Process-wide services keyed by their SDK config (channel/product). Each
247
- * provider identity gets its own service so its payload (productName,
248
- * productVersion) is used when the SDK is first configured. The underlying
249
- * native addon is shared, but configure() runs per instance.
250
- */
251
- const servicesByConfig = new Map<string, TuringDeviceTokenService>();
252
- export function getTuringDeviceTokenService(
253
- config: TuringSdkConfig = WORKBUDDY_TURING_CONFIG,
254
- ): TuringDeviceTokenService {
255
- const key = `${config.channelId}:${config.productName}`;
256
- let service = servicesByConfig.get(key);
257
- if (service === undefined) {
258
- service = new TuringDeviceTokenService(config);
259
- servicesByConfig.set(key, service);
260
- }
261
- return service;
262
- }
@@ -1,30 +0,0 @@
1
- // WorkBuddy CN device login shares WorkBuddy's contract on its China domain.
2
- import {
3
- buildWorkBuddyUserAgent,
4
- getWorkBuddyCnClientVersion,
5
- getWorkBuddyCliVersion,
6
- } from "../../../operations/client-versions";
7
- import { providerBaseUrl } from "../../../provider-metadata";
8
- import {
9
- BuddyOAuthClient,
10
- coercingResponseCode,
11
- type BuddyOAuthVariant,
12
- } from "../buddy-oauth-shared";
13
- import { WORKBUDDY_CN_DOMAIN } from "./cn-provider";
14
-
15
- const baseUrl = providerBaseUrl("workbuddycn");
16
-
17
- export const WORKBUDDY_CN_OAUTH_VARIANT: BuddyOAuthVariant = {
18
- providerId: "workbuddycn",
19
- providerLabel: "WorkBuddy CN",
20
- domain: WORKBUDDY_CN_DOMAIN,
21
- platform: "CLI",
22
- userAgent: async () =>
23
- buildWorkBuddyUserAgent(getWorkBuddyCnClientVersion(), getWorkBuddyCliVersion()),
24
- deviceStartUrl: `${baseUrl}/v2/plugin/auth/state`,
25
- devicePollUrl: `${baseUrl}/v2/plugin/auth/token`,
26
- refreshUrl: `${baseUrl}/v2/plugin/auth/token/refresh`,
27
- responseCode: coercingResponseCode,
28
- };
29
-
30
- export const workBuddyCnOAuthClient = new BuddyOAuthClient(WORKBUDDY_CN_OAUTH_VARIANT);
@@ -1,58 +0,0 @@
1
- // WorkBuddy CN uses the WorkBuddy contract on its China domain.
2
- import { BuddyMediaAdapter } from "../buddy-media";
3
- import type { ProviderAdapter } from "../../../provider-contracts";
4
- import type { DiscoveryInput } from "../../../discovery/discovery-types";
5
- import type { ModelDefinition } from "../../../provider-model-definition";
6
- import { providerBaseUrl } from "../../../provider-metadata";
7
- import { getWorkBuddyCnClientVersion } from "../../../operations/client-versions";
8
- import { BUDDY_CN_MODELS_PATH, fetchBuddyDirectoryModels } from "../buddy-discovery-shared";
9
- import { CODEBUDDY_CN_MODELS } from "../codebuddy/cn-provider";
10
- import { workbuddyPrePayload, WORKBUDDY_SYSTEM_PROMPT } from "./provider";
11
- import { workbuddyAdapterConfig, workbuddyHeaders, WORKBUDDY_CHAT_PATH } from "./shared";
12
-
13
- export const WORKBUDDY_CN_PROVIDER_ID = "workbuddycn" as const;
14
- export const WORKBUDDY_CN_DOMAIN = "www.workbuddy.cn" as const;
15
- export const WORKBUDDY_CN_BASE_URL = providerBaseUrl(WORKBUDDY_CN_PROVIDER_ID);
16
-
17
- export const WORKBUDDY_CN_MODELS: readonly ModelDefinition[] = [
18
- ...CODEBUDDY_CN_MODELS.map((model) => ({
19
- ...model,
20
- endpointPath: WORKBUDDY_CHAT_PATH,
21
- })),
22
- ];
23
-
24
- export async function discoverWorkBuddyCnModels(
25
- input: DiscoveryInput,
26
- ): Promise<readonly ModelDefinition[] | null> {
27
- return fetchBuddyDirectoryModels({
28
- siteUrl: WORKBUDDY_CN_BASE_URL,
29
- providerId: WORKBUDDY_CN_PROVIDER_ID,
30
- credential: input.credential,
31
- // The CN host answers the `/console/…` directory, exactly like the CodeBuddy
32
- // CN host does; the international path was inherited from the intl provider
33
- // and the CN edge answers it with a 500 rather than a 404.
34
- modelsPath: BUDDY_CN_MODELS_PATH,
35
- endpoint: WORKBUDDY_CHAT_PATH,
36
- ...(input.signal ? { signal: input.signal } : {}),
37
- ...(input.fetcher ? { fetcher: input.fetcher } : {}),
38
- });
39
- }
40
-
41
- export function createWorkBuddyCnAdapter(fetchImpl?: typeof fetch): ProviderAdapter {
42
- return new BuddyMediaAdapter(
43
- workbuddyAdapterConfig({
44
- providerId: WORKBUDDY_CN_PROVIDER_ID,
45
- baseUrl: WORKBUDDY_CN_BASE_URL,
46
- domain: WORKBUDDY_CN_DOMAIN,
47
- prePayload: workbuddyPrePayload,
48
- ...(fetchImpl ? { fetchImpl } : {}),
49
- }),
50
- {
51
- variant: "IDE",
52
- systemPrompt: WORKBUDDY_SYSTEM_PROMPT,
53
- baseUrl: WORKBUDDY_CN_BASE_URL,
54
- buildHeaders: (context) =>
55
- workbuddyHeaders(context, undefined, WORKBUDDY_CN_DOMAIN, getWorkBuddyCnClientVersion()),
56
- },
57
- );
58
- }
@@ -1,31 +0,0 @@
1
- // WorkBuddy OAuth — browser-assisted state polling (non-PKCE) plus refresh.
2
- // Canonical provider ID: workbuddy (international / WorkBuddy AI).
3
- import { providerBaseUrl } from "../../../provider-metadata";
4
- import { buildWorkBuddyUserAgent } from "../../../operations/client-versions";
5
- import {
6
- BuddyOAuthClient,
7
- coercingResponseCode,
8
- type BuddyOAuthVariant,
9
- } from "../buddy-oauth-shared";
10
- import { WORKBUDDY_DOMAIN } from "./shared";
11
-
12
- export const WORKBUDDY_DEVICE_START_URL = `${providerBaseUrl("workbuddy")}/v2/plugin/auth/state`;
13
- export const WORKBUDDY_DEVICE_POLL_URL = `${providerBaseUrl("workbuddy")}/v2/plugin/auth/token`;
14
- export const WORKBUDDY_REFRESH_URL = `${providerBaseUrl("workbuddy")}/v2/plugin/auth/token/refresh`;
15
-
16
- /** The international WorkBuddy gateway: `CLI` platform, `WorkBuddy AI` identity. */
17
- export const WORKBUDDY_OAUTH_VARIANT: BuddyOAuthVariant = {
18
- providerId: "workbuddy",
19
- providerLabel: "WorkBuddy",
20
- domain: WORKBUDDY_DOMAIN,
21
- platform: "CLI",
22
- userAgent: async () => {
23
- return buildWorkBuddyUserAgent();
24
- },
25
- deviceStartUrl: WORKBUDDY_DEVICE_START_URL,
26
- devicePollUrl: WORKBUDDY_DEVICE_POLL_URL,
27
- refreshUrl: WORKBUDDY_REFRESH_URL,
28
- responseCode: coercingResponseCode,
29
- };
30
-
31
- export const workBuddyOAuthClient = new BuddyOAuthClient(WORKBUDDY_OAUTH_VARIANT);