cartethyia 2.8.0 → 2.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (348) hide show
  1. package/.env.example +3 -3
  2. package/dist/dashboard/assets/{BannedPage-Cc0vKpMG.js → BannedPage-Dq530awD.js} +1 -1
  3. package/dist/dashboard/assets/BannedPage-Dq530awD.js.gz +0 -0
  4. package/dist/dashboard/assets/{CliToolDetailPage-Bqj2aa1T.js → CliToolDetailPage-DZzaS-7S.js} +1 -1
  5. package/dist/dashboard/assets/CliToolDetailPage-DZzaS-7S.js.gz +0 -0
  6. package/dist/dashboard/assets/{CliToolsPage-CXsaOAO2.js → CliToolsPage-DaZZ3cqP.js} +1 -1
  7. package/dist/dashboard/assets/CliToolsPage-DaZZ3cqP.js.gz +0 -0
  8. package/dist/dashboard/assets/{CombosPage-BeLpJ4ma.js → CombosPage-BlC_xdkX.js} +1 -1
  9. package/dist/dashboard/assets/CombosPage-BlC_xdkX.js.gz +0 -0
  10. package/dist/dashboard/assets/{ConsoleLogPage-DnV0uZ3m.js → ConsoleLogPage-D-rqeVtG.js} +1 -1
  11. package/dist/dashboard/assets/ConsoleLogPage-D-rqeVtG.js.gz +0 -0
  12. package/dist/dashboard/assets/{CustomizationPage-CBxAjo63.js → CustomizationPage-7xT5yg2E.js} +1 -1
  13. package/dist/dashboard/assets/CustomizationPage-7xT5yg2E.js.gz +0 -0
  14. package/dist/dashboard/assets/{HealthEventsModal-B5yEE0k6.js → HealthEventsModal-Clq8E9cW.js} +1 -1
  15. package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js.gz +0 -0
  16. package/dist/dashboard/assets/{InjectSystemPromptPanel-BWFLECmz.js → InjectSystemPromptPanel-6Teoq9Se.js} +1 -1
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-6Teoq9Se.js.gz +0 -0
  18. package/dist/dashboard/assets/{LoginPage-CgoPc5B9.js → LoginPage-CZuI0MAR.js} +1 -1
  19. package/dist/dashboard/assets/LoginPage-CZuI0MAR.js.gz +0 -0
  20. package/dist/dashboard/assets/{ModelPicker-D9bFQern.js → ModelPicker-C1hNTlkr.js} +1 -1
  21. package/dist/dashboard/assets/ModelPicker-C1hNTlkr.js.gz +0 -0
  22. package/dist/dashboard/assets/{OverviewPage-B_p4tL8k.js → OverviewPage-0yfhSI1C.js} +1 -1
  23. package/dist/dashboard/assets/OverviewPage-0yfhSI1C.js.gz +0 -0
  24. package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js +8 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js.gz +0 -0
  26. package/dist/dashboard/assets/{ProviderIcon-D_0PiZtg.js → ProviderIcon-Ddhm1InL.js} +1 -1
  27. package/dist/dashboard/assets/ProviderIcon-Ddhm1InL.js.gz +0 -0
  28. package/dist/dashboard/assets/{ProvidersPage-CLI2bJTK.js → ProvidersPage-C3fYuu6i.js} +1 -1
  29. package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js.gz +0 -0
  30. package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js +9 -0
  31. package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js.gz +0 -0
  32. package/dist/dashboard/assets/{QuotaPage-DA-a1iSN.js → QuotaPage-D1RV_2BX.js} +1 -1
  33. package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js.gz +0 -0
  34. package/dist/dashboard/assets/{SettingsPage-CctTga2C.js → SettingsPage-BzZAvYSX.js} +1 -1
  35. package/dist/dashboard/assets/SettingsPage-BzZAvYSX.js.gz +0 -0
  36. package/dist/dashboard/assets/{SetupPage-febLU4r1.js → SetupPage--s-EfEIL.js} +1 -1
  37. package/dist/dashboard/assets/SetupPage--s-EfEIL.js.gz +0 -0
  38. package/dist/dashboard/assets/{StudioPage-M6fvR5Wz.js → StudioPage-BjXFGSK4.js} +1 -1
  39. package/dist/dashboard/assets/StudioPage-BjXFGSK4.js.gz +0 -0
  40. package/dist/dashboard/assets/{UsagePage-nyeuRqz9.js → UsagePage-CP8F8BN7.js} +1 -1
  41. package/dist/dashboard/assets/UsagePage-CP8F8BN7.js.gz +0 -0
  42. package/dist/dashboard/assets/{api-keys-BFOlvrJC.js → api-keys-2hc12Uz2.js} +1 -1
  43. package/dist/dashboard/assets/api-keys-2hc12Uz2.js.gz +0 -0
  44. package/dist/dashboard/assets/app-DGXbNfAR.css +2 -0
  45. package/dist/dashboard/assets/app-DGXbNfAR.css.gz +0 -0
  46. package/dist/dashboard/assets/{assert-CqTLw5e7.js → assert-BMcj1xZE.js} +1 -1
  47. package/dist/dashboard/assets/assert-BMcj1xZE.js.gz +0 -0
  48. package/dist/dashboard/assets/{badge-C83EqLB0.js → badge-DkRUuVfz.js} +1 -1
  49. package/dist/dashboard/assets/badge-DkRUuVfz.js.gz +0 -0
  50. package/dist/dashboard/assets/{banner-D1xn7pIe.js → banner-CDjW841Q.js} +1 -1
  51. package/dist/dashboard/assets/banner-CDjW841Q.js.gz +0 -0
  52. package/dist/dashboard/assets/{card-DU3Lq5Lm.js → card-Bto5UlL9.js} +1 -1
  53. package/dist/dashboard/assets/card-Bto5UlL9.js.gz +0 -0
  54. package/dist/dashboard/assets/{cli-tools-Dw1U_drK.js → cli-tools-DaH6g9hL.js} +1 -1
  55. package/dist/dashboard/assets/cli-tools-DaH6g9hL.js.gz +0 -0
  56. package/dist/dashboard/assets/{clipboard-button-CEL5Sg_J.js → clipboard-button-BYKBCzjk.js} +1 -1
  57. package/dist/dashboard/assets/clipboard-button-BYKBCzjk.js.gz +0 -0
  58. package/dist/dashboard/assets/{dialog-BjFR5UHy.js → dialog-DL0Zftwv.js} +1 -1
  59. package/dist/dashboard/assets/dialog-DL0Zftwv.js.gz +0 -0
  60. package/dist/dashboard/assets/{drawer-HvBW0AjI.js → drawer-Dpx_UXaS.js} +1 -1
  61. package/dist/dashboard/assets/drawer-Dpx_UXaS.js.gz +0 -0
  62. package/dist/dashboard/assets/{entry-CECVELyy.js → entry-BV7-1NoM.js} +1 -1
  63. package/dist/dashboard/assets/entry-BV7-1NoM.js.gz +0 -0
  64. package/dist/dashboard/assets/{entry-DYYofQ7W.js → entry-CGvdNU6r.js} +1 -1
  65. package/dist/dashboard/assets/entry-CGvdNU6r.js.gz +0 -0
  66. package/dist/dashboard/assets/{entry-BSu3gFlt.js → entry-DScKYvZj.js} +3 -3
  67. package/dist/dashboard/assets/entry-DScKYvZj.js.gz +0 -0
  68. package/dist/dashboard/assets/{formatters-DLW4i8zK.js → formatters-BS3DZlZj.js} +1 -1
  69. package/dist/dashboard/assets/formatters-BS3DZlZj.js.gz +0 -0
  70. package/dist/dashboard/assets/{index-1-fCqe64.js → index-SQnvvTWX.js} +2 -2
  71. package/dist/dashboard/assets/index-SQnvvTWX.js.gz +0 -0
  72. package/dist/dashboard/assets/{inline-DGvU2oLK.js → inline-Dl-cuLK0.js} +1 -1
  73. package/dist/dashboard/assets/inline-Dl-cuLK0.js.gz +0 -0
  74. package/dist/dashboard/assets/{input-iNnO1X2K.js → input-Bfx0EzRc.js} +1 -1
  75. package/dist/dashboard/assets/input-Bfx0EzRc.js.gz +0 -0
  76. package/dist/dashboard/assets/{layout-0q8UGypb.js → layout-BxhbQ_JS.js} +1 -1
  77. package/dist/dashboard/assets/layout-BxhbQ_JS.js.gz +0 -0
  78. package/dist/dashboard/assets/{list-row-C0w2bQjJ.js → list-row-D49Y4ptn.js} +1 -1
  79. package/dist/dashboard/assets/list-row-D49Y4ptn.js.gz +0 -0
  80. package/dist/dashboard/assets/{live-M5aJ_xCa.js → live-CbVTdX9V.js} +1 -1
  81. package/dist/dashboard/assets/live-CbVTdX9V.js.gz +0 -0
  82. package/dist/dashboard/assets/{network-BKeQGT3K.js → network-JGvDveof.js} +1 -1
  83. package/dist/dashboard/assets/network-JGvDveof.js.gz +0 -0
  84. package/dist/dashboard/assets/{numbers-CivAk3da.js → numbers-Dw6kiew-.js} +1 -1
  85. package/dist/dashboard/assets/numbers-Dw6kiew-.js.gz +0 -0
  86. package/dist/dashboard/assets/{pagination-CpzvI5ep.js → pagination-iUoI8GeE.js} +1 -1
  87. package/dist/dashboard/assets/pagination-iUoI8GeE.js.gz +0 -0
  88. package/dist/dashboard/assets/providers/sensenova-intl.png +0 -0
  89. package/dist/dashboard/assets/providers/sensenova.png +0 -0
  90. package/dist/dashboard/assets/{routing-BFQX2VBc.js → routing-8jZr-3WE.js} +1 -1
  91. package/dist/dashboard/assets/routing-8jZr-3WE.js.gz +0 -0
  92. package/dist/dashboard/assets/{select-CXbck0jG.js → select-oO1FxMVb.js} +1 -1
  93. package/dist/dashboard/assets/select-oO1FxMVb.js.gz +0 -0
  94. package/dist/dashboard/assets/{settings-C_XvMHh9.js → settings-CLr3kdIx.js} +1 -1
  95. package/dist/dashboard/assets/settings-CLr3kdIx.js.gz +0 -0
  96. package/dist/dashboard/assets/{stack-DggRiCxE.js → stack-Y3pDteZr.js} +1 -1
  97. package/dist/dashboard/assets/stack-Y3pDteZr.js.gz +0 -0
  98. package/dist/dashboard/assets/{state-ClFzfbYp.js → state-CArX_Iak.js} +1 -1
  99. package/dist/dashboard/assets/state-CArX_Iak.js.gz +0 -0
  100. package/dist/dashboard/assets/{switch-CTIFxKqS.js → switch-DwlwmDO-.js} +1 -1
  101. package/dist/dashboard/assets/switch-DwlwmDO-.js.gz +0 -0
  102. package/dist/dashboard/assets/{useMutation-BClG3yWj.js → useMutation-DJ9GYEgf.js} +1 -1
  103. package/dist/dashboard/assets/useMutation-DJ9GYEgf.js.gz +0 -0
  104. package/dist/dashboard/index.html +2 -2
  105. package/dist/dashboard/index.html.gz +0 -0
  106. package/dist/dashboard/precompressed-assets.json +51 -51
  107. package/migrations/full-postgres/0047_add_provider_device_flow_proxy.sql +17 -0
  108. package/migrations/lite-sqlite3/0047_add_provider_device_flow_proxy.sql +19 -0
  109. package/package.json +1 -1
  110. package/src/boot/app.ts +1 -1
  111. package/src/boot/dependencies.ts +4 -6
  112. package/src/config/providers.ts +6 -5
  113. package/src/config/spec.ts +8 -8
  114. package/src/console/backup/nine-router.ts +71 -10
  115. package/src/console/backup/service.ts +8 -1
  116. package/src/console/console-router.ts +1 -1
  117. package/src/console/domain-registration.ts +7 -2
  118. package/src/console/inferhub/client.ts +1 -1
  119. package/src/console/observability/live.ts +2 -2
  120. package/src/console/providers/catalog/contracts.ts +9 -3
  121. package/src/console/providers/catalog/model-operations.ts +2 -3
  122. package/src/console/providers/catalog/provider-operations.ts +1 -1
  123. package/src/console/providers/catalog/routes.ts +2 -2
  124. package/src/console/providers/catalog/store.ts +1914 -1907
  125. package/src/console/providers/detail/routes.ts +1 -0
  126. package/src/console/providers/detail/store.ts +4 -0
  127. package/src/console/providers/oauth/callback-listener.ts +30 -11
  128. package/src/console/providers/oauth/device-egress.ts +123 -0
  129. package/src/console/providers/oauth/routes.ts +123 -16
  130. package/src/console/quota/account-quota-tenant.ts +5 -5
  131. package/src/console/quota/account-test-egress.ts +2 -2
  132. package/src/console/quota/daily-growth-job.ts +1 -1
  133. package/src/console/routing/pools/contracts.ts +1 -1
  134. package/src/console/routing/pools/operations.ts +1 -1
  135. package/src/console/routing/pools/probe-verdict.ts +2 -2
  136. package/src/console/routing/pools/relay-deploy.ts +1 -1
  137. package/src/console/routing/pools/store.ts +4 -4
  138. package/src/network/client.ts +67 -0
  139. package/src/network/egress/bidi-session.ts +322 -0
  140. package/src/network/egress/dial.ts +201 -0
  141. package/src/network/egress/factory.ts +191 -0
  142. package/src/network/{outbound-fetch.ts → egress/fetch.ts} +195 -29
  143. package/src/network/egress/tls-profile.ts +123 -0
  144. package/src/network/egress/ws.ts +175 -0
  145. package/src/network/{types.ts → pool/agent-config.ts} +1 -1
  146. package/src/network/pool/agent.ts +2 -2
  147. package/src/network/{pool-cooldown-store.ts → pool/cooldown-store.ts} +7 -7
  148. package/src/network/{pool-health-machine.ts → pool/health.ts} +205 -6
  149. package/src/network/pool/resolver.ts +10 -849
  150. package/src/network/pool/selector.ts +2 -2
  151. package/src/network/ssrf.ts +1 -1
  152. package/src/network/{retry.ts → util/retry.ts} +1 -1
  153. package/src/observability/telemetry-buffer.ts +1 -1
  154. package/src/persistence/schema.ts +9 -0
  155. package/src/persistence/ttl-cache.ts +1 -1
  156. package/src/protocol/codecs.ts +58 -1
  157. package/src/protocol/request/messages.ts +31 -18
  158. package/src/protocol/response/messages.ts +34 -7
  159. package/src/protocol/translation/quirks.ts +15 -0
  160. package/src/protocol/upstream/send-claude-messages.ts +2 -2
  161. package/src/providers/adapters/compatible-adapter.ts +5 -0
  162. package/src/providers/authentication/oauth-client.ts +40 -6
  163. package/src/providers/authentication/oauth-device-flow.ts +7 -3
  164. package/src/providers/authentication/oauth-flow-store.ts +82 -1
  165. package/src/providers/authentication/oauth-refresh-service.ts +766 -739
  166. package/src/providers/default-registry.ts +76 -0
  167. package/src/providers/discovery/discovery-types.ts +7 -0
  168. package/src/providers/discovery/probe-phases.ts +6 -2
  169. package/src/providers/discovery/probing-service.ts +7 -0
  170. package/src/providers/integrations/antigravity/antigravity-protocol.ts +11 -0
  171. package/src/providers/integrations/buddy/account.ts +969 -0
  172. package/src/providers/integrations/buddy/capabilities.ts +10 -10
  173. package/src/providers/integrations/buddy/{buddy-catalog-shared.ts → catalog.ts} +198 -136
  174. package/src/providers/integrations/buddy/{buddy-chat-shared.ts → chat.ts} +5 -5
  175. package/src/providers/integrations/buddy/codebuddy/index.ts +429 -0
  176. package/src/providers/integrations/buddy/codebuddy/shared.ts +4 -4
  177. package/src/providers/integrations/buddy/{buddy-identity.ts → headers.ts} +138 -140
  178. package/src/providers/integrations/buddy/lifecycle.ts +1018 -0
  179. package/src/providers/integrations/buddy/{buddy-media.ts → media.ts} +1 -1
  180. package/src/providers/integrations/cline/cline-oauth.ts +10 -5
  181. package/src/providers/integrations/cline/cline.ts +3 -4
  182. package/src/providers/integrations/clixad/clixad-oauth.ts +98 -0
  183. package/src/providers/integrations/clixad/clixad-quota.ts +132 -0
  184. package/src/providers/integrations/clixad/provider.ts +145 -0
  185. package/src/providers/integrations/codex/codex-oauth.ts +8 -5
  186. package/src/providers/integrations/cursor/cursor-auth.ts +1 -1
  187. package/src/providers/integrations/cursor/cursor-hardening.ts +279 -0
  188. package/src/providers/integrations/cursor/cursor-http2.ts +605 -6
  189. package/src/providers/integrations/cursor/cursor-shared.ts +1 -1
  190. package/src/providers/integrations/cursor/cursor.ts +485 -70
  191. package/src/providers/integrations/deepai/deepai-catalog.ts +149 -0
  192. package/src/providers/integrations/deepai/deepai-common.ts +145 -0
  193. package/src/providers/integrations/deepai/deepai-oauth.ts +129 -0
  194. package/src/providers/integrations/deepai/deepai-quota.ts +97 -0
  195. package/src/providers/integrations/deepai/provider.ts +42 -0
  196. package/src/providers/integrations/devin/devin-auth.ts +7 -0
  197. package/src/providers/integrations/factory/factory-oauth.ts +16 -7
  198. package/src/providers/integrations/freebuff/freebuff.ts +2 -2
  199. package/src/providers/integrations/freepi/freepi-catalog.ts +5 -0
  200. package/src/providers/integrations/freepi/freepi-discovery.ts +2 -2
  201. package/src/providers/integrations/freepi/freepi-headers.ts +2 -2
  202. package/src/providers/integrations/freepi/freepi-protocol.ts +11 -2
  203. package/src/providers/integrations/freepi/freepi-realm.ts +0 -3
  204. package/src/providers/integrations/freepi/freepi-session.ts +158 -0
  205. package/src/providers/integrations/freepi/freepi.ts +80 -54
  206. package/src/providers/integrations/github/github-discovery.ts +30 -13
  207. package/src/providers/integrations/github/github-oauth.ts +217 -44
  208. package/src/providers/integrations/github/github-quota.ts +22 -5
  209. package/src/providers/integrations/github/github.ts +40 -32
  210. package/src/providers/integrations/grok/grok-oauth.ts +4 -4
  211. package/src/providers/integrations/hermes/hermes-oauth.ts +3 -3
  212. package/src/providers/integrations/hermes/hermes.ts +34 -5
  213. package/src/providers/integrations/kilo/kilo-oauth.ts +4 -4
  214. package/src/providers/integrations/kilo/kilo.ts +1 -1
  215. package/src/providers/integrations/kimi/kimi-oauth.ts +3 -3
  216. package/src/providers/integrations/kiro/kiro-oauth.ts +2 -2
  217. package/src/providers/integrations/muse/muse-oauth.ts +5 -5
  218. package/src/providers/integrations/opencode/fingerprint.ts +1 -1
  219. package/src/providers/integrations/openrouter/provider.ts +1 -1
  220. package/src/providers/integrations/perch/perch-protocol.ts +0 -3
  221. package/src/providers/integrations/perch/perch.ts +3 -3
  222. package/src/providers/integrations/qoder/claim-qoder-credits.ts +1 -1
  223. package/src/providers/integrations/qoder/qoder-adapter.ts +19 -113
  224. package/src/providers/integrations/qoder/qoder-auth.ts +8 -1
  225. package/src/providers/integrations/qoder/qoder-catalog.ts +1 -1
  226. package/src/providers/integrations/qoder/qoder-chat.ts +25 -8
  227. package/src/providers/integrations/qoder/qoder-checkin.ts +1 -1
  228. package/src/providers/integrations/qoder/qoder-cosy.ts +37 -9
  229. package/src/providers/integrations/qoder/qoder-oauth.ts +9 -2
  230. package/src/providers/integrations/qoder/qoder-realm.ts +13 -36
  231. package/src/providers/integrations/qoder/qoder-sse.ts +447 -68
  232. package/src/providers/integrations/qoder/qoder-types.ts +9 -0
  233. package/src/providers/integrations/qoder/qoder.ts +3 -25
  234. package/src/providers/integrations/sensenova/provider.ts +144 -0
  235. package/src/providers/integrations/trae/trae-quota.ts +15 -1
  236. package/src/providers/integrations/vercel/provider.ts +117 -0
  237. package/src/providers/integrations/vercel/vercel-quota.ts +96 -0
  238. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  239. package/src/providers/integrations/zcode-start-plan/gifts.ts +1 -1
  240. package/src/providers/integrations/zcode-start-plan/oauth.ts +3 -3
  241. package/src/providers/integrations/zro/zro.ts +2 -1
  242. package/src/providers/operations/account-refresh-status.ts +14 -0
  243. package/src/providers/operations/client-versions.ts +95 -30
  244. package/src/providers/operations/oauth-refresh-lead.ts +46 -22
  245. package/src/providers/operations/provider-caches.ts +1 -1
  246. package/src/providers/operations/provider-credential-service.ts +22 -25
  247. package/src/providers/operations/session-resolution.ts +17 -1
  248. package/src/providers/provider-contracts.ts +2 -2
  249. package/src/providers/provider-metadata.ts +30 -0
  250. package/src/providers/quota/quota-contracts.ts +2 -0
  251. package/src/providers/quota/refresh.ts +25 -3
  252. package/src/security/ip-boundary.ts +1 -1
  253. package/src/transport/dispatch/attempt-finalize.ts +1 -1
  254. package/src/transport/dispatch/attempt-loop.ts +3 -3
  255. package/src/transport/dispatch/handler-deps.ts +1 -1
  256. package/src/transport/dispatch/leases.ts +1 -1
  257. package/src/transport/dispatch/retry-policy.ts +1 -1
  258. package/src/transport/dispatch/streaming/finalize.ts +2 -2
  259. package/src/transport/dispatch/streaming/stream.ts +1 -1
  260. package/src/transport/dispatch/upstream.ts +1 -1
  261. package/src/transport/shutdown-notice.ts +1 -1
  262. package/src/workers/buddy-growth-tasks.ts +8 -8
  263. package/src/workers/daily-checkin.ts +4 -4
  264. package/src/workers/quota-refresh-sweep.ts +1 -1
  265. package/src/workers/zcode-gift-claim.ts +1 -1
  266. package/dist/dashboard/assets/BannedPage-Cc0vKpMG.js.gz +0 -0
  267. package/dist/dashboard/assets/CliToolDetailPage-Bqj2aa1T.js.gz +0 -0
  268. package/dist/dashboard/assets/CliToolsPage-CXsaOAO2.js.gz +0 -0
  269. package/dist/dashboard/assets/CombosPage-BeLpJ4ma.js.gz +0 -0
  270. package/dist/dashboard/assets/ConsoleLogPage-DnV0uZ3m.js.gz +0 -0
  271. package/dist/dashboard/assets/CustomizationPage-CBxAjo63.js.gz +0 -0
  272. package/dist/dashboard/assets/HealthEventsModal-B5yEE0k6.js.gz +0 -0
  273. package/dist/dashboard/assets/InjectSystemPromptPanel-BWFLECmz.js.gz +0 -0
  274. package/dist/dashboard/assets/LoginPage-CgoPc5B9.js.gz +0 -0
  275. package/dist/dashboard/assets/ModelPicker-D9bFQern.js.gz +0 -0
  276. package/dist/dashboard/assets/OverviewPage-B_p4tL8k.js.gz +0 -0
  277. package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js +0 -8
  278. package/dist/dashboard/assets/ProviderDetailPage-rs5E2rxv.js.gz +0 -0
  279. package/dist/dashboard/assets/ProviderIcon-D_0PiZtg.js.gz +0 -0
  280. package/dist/dashboard/assets/ProvidersPage-CLI2bJTK.js.gz +0 -0
  281. package/dist/dashboard/assets/ProxyPage-BwNC_-Cx.js +0 -9
  282. package/dist/dashboard/assets/ProxyPage-BwNC_-Cx.js.gz +0 -0
  283. package/dist/dashboard/assets/QuotaPage-DA-a1iSN.js.gz +0 -0
  284. package/dist/dashboard/assets/SettingsPage-CctTga2C.js.gz +0 -0
  285. package/dist/dashboard/assets/SetupPage-febLU4r1.js.gz +0 -0
  286. package/dist/dashboard/assets/StudioPage-M6fvR5Wz.js.gz +0 -0
  287. package/dist/dashboard/assets/UsagePage-nyeuRqz9.js.gz +0 -0
  288. package/dist/dashboard/assets/api-keys-BFOlvrJC.js.gz +0 -0
  289. package/dist/dashboard/assets/app-Dx2QgsNj.css +0 -2
  290. package/dist/dashboard/assets/app-Dx2QgsNj.css.gz +0 -0
  291. package/dist/dashboard/assets/assert-CqTLw5e7.js.gz +0 -0
  292. package/dist/dashboard/assets/badge-C83EqLB0.js.gz +0 -0
  293. package/dist/dashboard/assets/banner-D1xn7pIe.js.gz +0 -0
  294. package/dist/dashboard/assets/card-DU3Lq5Lm.js.gz +0 -0
  295. package/dist/dashboard/assets/cli-tools-Dw1U_drK.js.gz +0 -0
  296. package/dist/dashboard/assets/clipboard-button-CEL5Sg_J.js.gz +0 -0
  297. package/dist/dashboard/assets/dialog-BjFR5UHy.js.gz +0 -0
  298. package/dist/dashboard/assets/drawer-HvBW0AjI.js.gz +0 -0
  299. package/dist/dashboard/assets/entry-BSu3gFlt.js.gz +0 -0
  300. package/dist/dashboard/assets/entry-CECVELyy.js.gz +0 -0
  301. package/dist/dashboard/assets/entry-DYYofQ7W.js.gz +0 -0
  302. package/dist/dashboard/assets/formatters-DLW4i8zK.js.gz +0 -0
  303. package/dist/dashboard/assets/index-1-fCqe64.js.gz +0 -0
  304. package/dist/dashboard/assets/inline-DGvU2oLK.js.gz +0 -0
  305. package/dist/dashboard/assets/input-iNnO1X2K.js.gz +0 -0
  306. package/dist/dashboard/assets/layout-0q8UGypb.js.gz +0 -0
  307. package/dist/dashboard/assets/list-row-C0w2bQjJ.js.gz +0 -0
  308. package/dist/dashboard/assets/live-M5aJ_xCa.js.gz +0 -0
  309. package/dist/dashboard/assets/network-BKeQGT3K.js.gz +0 -0
  310. package/dist/dashboard/assets/numbers-CivAk3da.js.gz +0 -0
  311. package/dist/dashboard/assets/pagination-CpzvI5ep.js.gz +0 -0
  312. package/dist/dashboard/assets/routing-BFQX2VBc.js.gz +0 -0
  313. package/dist/dashboard/assets/select-CXbck0jG.js.gz +0 -0
  314. package/dist/dashboard/assets/settings-C_XvMHh9.js.gz +0 -0
  315. package/dist/dashboard/assets/stack-DggRiCxE.js.gz +0 -0
  316. package/dist/dashboard/assets/state-ClFzfbYp.js.gz +0 -0
  317. package/dist/dashboard/assets/switch-CTIFxKqS.js.gz +0 -0
  318. package/dist/dashboard/assets/useMutation-BClG3yWj.js.gz +0 -0
  319. package/src/console/providers/catalog/discover-constants.ts +0 -6
  320. package/src/network/pool-health.ts +0 -198
  321. package/src/providers/integrations/buddy/buddy-checkin.ts +0 -521
  322. package/src/providers/integrations/buddy/buddy-cli-headers.ts +0 -76
  323. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -130
  324. package/src/providers/integrations/buddy/buddy-discovery-shared.ts +0 -234
  325. package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -496
  326. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +0 -341
  327. package/src/providers/integrations/buddy/buddy-quota-shared.ts +0 -417
  328. package/src/providers/integrations/buddy/buddy-server-tools.ts +0 -240
  329. package/src/providers/integrations/buddy/buddy-usage-shared.ts +0 -221
  330. package/src/providers/integrations/buddy/buddy-usage-store.ts +0 -181
  331. package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +0 -37
  332. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +0 -188
  333. package/src/providers/integrations/buddy/codebuddy/oauth.ts +0 -47
  334. package/src/providers/integrations/buddy/codebuddy/provider.ts +0 -179
  335. package/src/providers/integrations/buddy/codebuddy/quota.ts +0 -154
  336. package/src/providers/integrations/qoder/chat-proto.ts +0 -328
  337. package/src/providers/integrations/qoder/qoder-grpc.ts +0 -870
  338. package/src/providers/integrations/qoder/qoder-ide.ts +0 -481
  339. /package/dist/dashboard/assets/{app-DIXLjojg.js → app-C0gTXEoN.js} +0 -0
  340. /package/dist/dashboard/assets/{app-DIXLjojg.js.gz → app-C0gTXEoN.js.gz} +0 -0
  341. /package/src/network/{http2-bidi.ts → bidi.ts} +0 -0
  342. /package/src/network/pool/{byte-accounting.ts → accounting.ts} +0 -0
  343. /package/src/network/pool/{pool-scripts.ts → scripts.ts} +0 -0
  344. /package/src/network/pool/{pool-state.ts → state.ts} +0 -0
  345. /package/src/network/{backoff.ts → util/backoff.ts} +0 -0
  346. /package/src/network/{deduplication.ts → util/dedupe.ts} +0 -0
  347. /package/src/network/{ip-utils.ts → util/ip.ts} +0 -0
  348. /package/src/network/{rate-limit-verdict.ts → verdict.ts} +0 -0
@@ -0,0 +1,429 @@
1
+ import { BuddyMediaAdapter } from "../media";
2
+ import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderAdapter } from "../../../provider-contracts";
3
+ import type { ModelDefinition } from "../../../provider-model-definition";
4
+ import type { DiscoveryInput } from "../../../discovery/discovery-types";
5
+ import { GatewayError } from "../../../../protocol/gateway-error";
6
+ import type { CanonicalRequest } from "../../../../protocol/canonical-model";
7
+ import { providerBaseUrl } from "../../../provider-metadata";
8
+ import { ensurePayloadModel } from "../../../configured-provider";
9
+ import { codebuddyAdapterConfig, codebuddyDomain, codebuddyHeaders } from "./shared";
10
+ import {
11
+ BUDDY_SHARED_RAW,
12
+ BUDDY_IMAGE_MODEL_ID_SET,
13
+ BUDDY_VIDEO_MODEL_ID_SET,
14
+ BUDDY_INTL_MODELS_PATH,
15
+ BUDDY_CN_MODELS_PATH,
16
+ BUDDY_CN_IMAGE_MODEL_ID_SET,
17
+ BUDDY_CN_VIDEO_MODEL_ID_SET,
18
+ CODEBUDDY_CN_RAW,
19
+ type BuddyRawEntry,
20
+ makeBuddyModel,
21
+ makeBuddyImageModels,
22
+ makeBuddyVideoModels,
23
+ makeBuddyCnImageModels,
24
+ makeBuddyCnVideoModels,
25
+ fetchBuddyDirectoryModels,
26
+ } from "../catalog";
27
+ import {
28
+ applyBuddySystemPrompt,
29
+ buddyPrePayloadCommon,
30
+ finalizeBuddyMessages,
31
+ injectBuddyParallelToolCalls,
32
+ normalizeBuddyToolNames,
33
+ } from "../chat";
34
+ import {
35
+ BuddyOAuthClient,
36
+ type BuddyOAuthVariant,
37
+ strictResponseCode,
38
+ fetchTencentBillingQuota,
39
+ fetchBuddyRequestUsage,
40
+ type BuddyUsageResult,
41
+ } from "../account";
42
+ import { buildCodeBuddyUserAgent } from "../../../operations/client-versions";
43
+ import type { FetchLike, ProviderQuotaResult } from "../../../quota/quota-contracts";
44
+
45
+ // ── codebuddy/provider ──────────────────────────────────────────
46
+
47
+ export const CODEBUDDY_PROVIDER_ID = "cb" as const;
48
+
49
+ export const CODEBUDDY_BASE_URL = providerBaseUrl("cb");
50
+
51
+ export const CODEBUDDY_SYSTEM_PROMPT = "You are a helpful assistant.";
52
+
53
+ function codeBuddyIntlPrePayload(
54
+ payload: Record<string, unknown>,
55
+ request: CanonicalRequest,
56
+ candidate: ProviderDispatchTarget,
57
+ context?: ProviderDispatchContext,
58
+ ): void {
59
+ // International ladder: DeepSeek Flash and friends serve only `high`.
60
+ buddyPrePayloadCommon(payload, request, "intl", context);
61
+ const rawModel = payload["model"];
62
+ const source =
63
+ typeof rawModel === "string" && rawModel.length > 0
64
+ ? rawModel
65
+ : candidate.model_id;
66
+ if (!source) throw new GatewayError("invalid_request", 400, "CodeBuddy model is required (request {requestId}). Check the shape of what you sent — then resend 🪞");
67
+ const messages = payload["messages"];
68
+ if (Array.isArray(messages)) {
69
+ applyBuddySystemPrompt(
70
+ messages as Array<Record<string, unknown>>,
71
+ CODEBUDDY_SYSTEM_PROMPT,
72
+ context?.tenant_system_prompt,
73
+ );
74
+ }
75
+ normalizeBuddyToolNames(payload);
76
+ injectBuddyParallelToolCalls(payload, request);
77
+ void request;
78
+ }
79
+
80
+ const CODEBUDDY_INTL_RAW: readonly BuddyRawEntry[] = BUDDY_SHARED_RAW;
81
+
82
+ export const CODEBUDDY_IMAGE_MODELS: readonly ModelDefinition[] = makeBuddyImageModels(
83
+ "cb",
84
+ "/images/generations",
85
+ );
86
+
87
+ export const CODEBUDDY_VIDEO_MODELS: readonly ModelDefinition[] = makeBuddyVideoModels(
88
+ "cb",
89
+ "/videos/generations",
90
+ );
91
+
92
+ export const CODEBUDDY_MODELS: readonly ModelDefinition[] = [
93
+ ...CODEBUDDY_INTL_RAW.filter(
94
+ (entry) => !BUDDY_IMAGE_MODEL_ID_SET.has(entry[0]) && !BUDDY_VIDEO_MODEL_ID_SET.has(entry[0]),
95
+ ).map((entry) => makeBuddyModel(entry, "cb")),
96
+ ...CODEBUDDY_IMAGE_MODELS,
97
+ ...CODEBUDDY_VIDEO_MODELS,
98
+ ];
99
+
100
+ export async function discoverCodeBuddyModels(
101
+ input: DiscoveryInput,
102
+ ): Promise<readonly ModelDefinition[] | null> {
103
+ return fetchBuddyDirectoryModels({
104
+ siteUrl: CODEBUDDY_BASE_URL,
105
+ providerId: CODEBUDDY_PROVIDER_ID,
106
+ credential: input.credential,
107
+ modelsPath: BUDDY_INTL_MODELS_PATH,
108
+ endpoint: undefined,
109
+ ...(input.signal ? { signal: input.signal } : {}),
110
+ ...(input.fetcher ? { fetcher: input.fetcher } : {}),
111
+ });
112
+ }
113
+
114
+ export function createCodeBuddyAdapter(fetchImpl?: typeof fetch): ProviderAdapter {
115
+ return new BuddyMediaAdapter(
116
+ codebuddyAdapterConfig({
117
+ providerId: CODEBUDDY_PROVIDER_ID,
118
+ baseUrl: CODEBUDDY_BASE_URL,
119
+ variant: "IDE",
120
+ cliIdentity: true,
121
+ prePayload: codeBuddyIntlPrePayload,
122
+ // The intl CLI profile gzips the chat body and recovers a channel-check
123
+ // 400 by retrying once on the console chat endpoint (donor behavior).
124
+ requestCompression: "gzip",
125
+ channelFallbackPath: "/console/chat/completions",
126
+ ...(fetchImpl ? { fetchImpl } : {}),
127
+ }),
128
+ {
129
+ variant: "IDE",
130
+ // BuddyMediaConfig has no `cliIdentity`; the CLI identity is selected by
131
+ // supplying the builder that takes it.
132
+ buildHeaders: (context, request) => codebuddyHeaders("IDE", context, request, true),
133
+ systemPrompt: CODEBUDDY_SYSTEM_PROMPT,
134
+ baseUrl: CODEBUDDY_BASE_URL,
135
+ imageGenerationPath: "/images/generations",
136
+ },
137
+ );
138
+ }
139
+
140
+ // ── codebuddy/cn-provider ──────────────────────────────────────────
141
+
142
+ export const CODEBUDDY_CN_PROVIDER_ID = "cbcn" as const;
143
+
144
+ export const CODEBUDDY_CN_BASE_URL = providerBaseUrl("cbcn");
145
+
146
+ function isAgentPromptText(text: string): boolean {
147
+ return /you are claude code|claude.?code.+official.+cli|anthropic.+official.+cli|anxthxropic.+official.+cli|you are (?:cursor|windsurf|cline|aider|continue|copilot|cody)|you are an? (?:ai )?(?:coding |code )?agent|cc_entrypoint\s*=\s*(?:cli|vscode|jetbrains|gui)|claude.?code.+issues|give feedback.+claude.?code|you are .{0,30}(?:powerful )?ai agent|orchestration capabilities|OhMyOpenCode|<agent-identity>|<Role>|<Behavior_Instructions>/i.test(
148
+ text,
149
+ );
150
+ }
151
+
152
+ const CODEBUDDY_CN_NEUTRAL_PROMPT = "You are a helpful assistant.";
153
+
154
+ function flattenContent(content: unknown): string {
155
+ if (typeof content === "string") return content;
156
+ if (!Array.isArray(content)) return "";
157
+ return content
158
+ .map((part) =>
159
+ part !== null && typeof part === "object" && "text" in part
160
+ ? String((part as Record<string, unknown>)["text"] ?? "")
161
+ : "",
162
+ )
163
+ .join("\n");
164
+ }
165
+
166
+ function neutralizeCnMessages(messages: Array<Record<string, unknown>>): void {
167
+ for (let index = 0; index < messages.length; index += 1) {
168
+ const message = messages[index];
169
+ if (!message || message["role"] !== "system") continue;
170
+ const content = message["content"];
171
+ const text = flattenContent(content);
172
+ if (text.length <= 2_000 && !isAgentPromptText(text)) continue;
173
+ messages[index] =
174
+ typeof content === "string"
175
+ ? { ...message, content: CODEBUDDY_CN_NEUTRAL_PROMPT }
176
+ : {
177
+ ...message,
178
+ content: [{ type: "text", text: CODEBUDDY_CN_NEUTRAL_PROMPT }],
179
+ };
180
+ }
181
+ }
182
+
183
+ export function codeBuddyCnPrePayload(
184
+ payload: Record<string, unknown>,
185
+ request: CanonicalRequest,
186
+ candidate: ProviderDispatchTarget,
187
+ context?: ProviderDispatchContext,
188
+ ): void {
189
+ // CN ladder: the CN backend serves `low`/`max` levels the international one
190
+ // rejects, so the realm must be named rather than left to default to intl.
191
+ buddyPrePayloadCommon(payload, request, "cn", context);
192
+ if (Array.isArray(payload["messages"])) {
193
+ const messages = payload["messages"] as Array<Record<string, unknown>>;
194
+ neutralizeCnMessages(messages);
195
+ finalizeBuddyMessages(messages, { leadPrompt: CODEBUDDY_CN_NEUTRAL_PROMPT });
196
+ }
197
+ ensurePayloadModel(payload, candidate, "CodeBuddy CN");
198
+ normalizeBuddyToolNames(payload);
199
+ injectBuddyParallelToolCalls(payload, request);
200
+ void request;
201
+ }
202
+
203
+ export { CODEBUDDY_CN_RAW };
204
+
205
+ export const CODEBUDDY_CN_IMAGE_MODELS: readonly ModelDefinition[] = makeBuddyCnImageModels(
206
+ CODEBUDDY_CN_PROVIDER_ID,
207
+ "/images/generations",
208
+ );
209
+
210
+ export const CODEBUDDY_CN_VIDEO_MODELS: readonly ModelDefinition[] = makeBuddyCnVideoModels(
211
+ CODEBUDDY_CN_PROVIDER_ID,
212
+ "/videos/generations",
213
+ );
214
+
215
+ export const CODEBUDDY_CN_MODELS: readonly ModelDefinition[] = [
216
+ ...CODEBUDDY_CN_RAW.filter(
217
+ (entry) =>
218
+ !BUDDY_CN_IMAGE_MODEL_ID_SET.has(entry[0]) &&
219
+ !BUDDY_CN_VIDEO_MODEL_ID_SET.has(entry[0]),
220
+ ).map((entry) =>
221
+ makeBuddyModel(entry, CODEBUDDY_CN_PROVIDER_ID, undefined, "cn"),
222
+ ),
223
+ ...CODEBUDDY_CN_IMAGE_MODELS,
224
+ ...CODEBUDDY_CN_VIDEO_MODELS,
225
+ ];
226
+
227
+ export async function discoverCodeBuddyCnModels(
228
+ input: DiscoveryInput,
229
+ ): Promise<readonly ModelDefinition[] | null> {
230
+ return fetchBuddyDirectoryModels({
231
+ siteUrl: CODEBUDDY_CN_BASE_URL,
232
+ providerId: CODEBUDDY_CN_PROVIDER_ID,
233
+ credential: input.credential,
234
+ modelsPath: BUDDY_CN_MODELS_PATH,
235
+ endpoint: undefined,
236
+ ...(input.signal ? { signal: input.signal } : {}),
237
+ ...(input.fetcher ? { fetcher: input.fetcher } : {}),
238
+ });
239
+ }
240
+
241
+ export function createCodeBuddyCnAdapter(fetchImpl?: typeof fetch): ProviderAdapter {
242
+ // BuddyMediaAdapter, not OpenAICompatibleAdapter: the CN realm publishes an
243
+ // image-generation row, and the plain compatible adapter has no image path,
244
+ // so `hunyuan-image-alpha` would route to /chat/completions and fail.
245
+ return new BuddyMediaAdapter(
246
+ codebuddyAdapterConfig({
247
+ providerId: CODEBUDDY_CN_PROVIDER_ID,
248
+ baseUrl: CODEBUDDY_CN_BASE_URL,
249
+ variant: "CLI",
250
+ prePayload: codeBuddyCnPrePayload,
251
+ // The CN CLI profile gzips the chat body (donor behavior). The console
252
+ // channel fallback is an intl-only recovery; CN has no second endpoint.
253
+ requestCompression: "gzip",
254
+ ...(fetchImpl ? { fetchImpl } : {}),
255
+ }),
256
+ {
257
+ variant: "CLI",
258
+ // The CN realm has no separate system prompt of its own; the neutral CN
259
+ // prompt is applied by `codeBuddyCnPrePayload`, so the media config
260
+ // reuses the intl one purely to satisfy the required field. Image
261
+ // generation sends a prompt, not a conversation, so this turn is
262
+ // discarded by the image path in every case.
263
+ systemPrompt: CODEBUDDY_SYSTEM_PROMPT,
264
+ baseUrl: CODEBUDDY_CN_BASE_URL,
265
+ imageGenerationPath: "/images/generations",
266
+ },
267
+ );
268
+ }
269
+
270
+ // ── codebuddy/oauth ──────────────────────────────────────────
271
+
272
+ const CODEBUDDY_INTL_DEVICE_START_URL = `${providerBaseUrl("cb")}/plugin/auth/state`;
273
+
274
+ const CODEBUDDY_INTL_DEVICE_POLL_URL = `${providerBaseUrl("cb")}/plugin/auth/token`;
275
+
276
+ const CODEBUDDY_INTL_REFRESH_URL = `${providerBaseUrl("cb")}/plugin/auth/token/refresh`;
277
+
278
+ const CODEBUDDY_CN_DEVICE_START_URL = `${providerBaseUrl("cbcn")}/plugin/auth/state`;
279
+
280
+ const CODEBUDDY_CN_DEVICE_POLL_URL = `${providerBaseUrl("cbcn")}/plugin/auth/token`;
281
+
282
+ const CODEBUDDY_CN_REFRESH_URL = `${providerBaseUrl("cbcn")}/plugin/auth/token/refresh`;
283
+
284
+ export const CODEBUDDY_INTL_VARIANT: BuddyOAuthVariant = {
285
+ providerId: "cb",
286
+ providerLabel: "CodeBuddy",
287
+ domain: "www.codebuddy.ai",
288
+ platform: "ide",
289
+ userAgent: async () => {
290
+ return buildCodeBuddyUserAgent("IDE");
291
+ },
292
+ deviceStartUrl: CODEBUDDY_INTL_DEVICE_START_URL,
293
+ devicePollUrl: CODEBUDDY_INTL_DEVICE_POLL_URL,
294
+ refreshUrl: CODEBUDDY_INTL_REFRESH_URL,
295
+ responseCode: strictResponseCode,
296
+ };
297
+
298
+ export const CODEBUDDY_CN_VARIANT: BuddyOAuthVariant = {
299
+ providerId: "cbcn",
300
+ providerLabel: "CodeBuddy",
301
+ domain: "copilot.tencent.com",
302
+ platform: "CLI",
303
+ userAgent: async () => {
304
+ return buildCodeBuddyUserAgent("CLI");
305
+ },
306
+ deviceStartUrl: CODEBUDDY_CN_DEVICE_START_URL,
307
+ devicePollUrl: CODEBUDDY_CN_DEVICE_POLL_URL,
308
+ refreshUrl: CODEBUDDY_CN_REFRESH_URL,
309
+ responseCode: strictResponseCode,
310
+ };
311
+
312
+ export const codeBuddyOAuthClient = new BuddyOAuthClient(CODEBUDDY_INTL_VARIANT);
313
+
314
+ export const codeBuddyCnOAuthClient = new BuddyOAuthClient(CODEBUDDY_CN_VARIANT);
315
+
316
+ // ── codebuddy/quota ──────────────────────────────────────────
317
+
318
+ export const CODEBUDDY_CN_USAGE_URL =
319
+ `${providerBaseUrl("cbcn")}/billing/meter/get-user-resource`;
320
+
321
+ export const CODEBUDDY_INTL_USAGE_URL =
322
+ `${providerBaseUrl("cb")}/billing/meter/get-user-resource`;
323
+
324
+ const CODEBUDDY_CN_REQUEST_USAGE_URL =
325
+ `${providerBaseUrl("cbcn")}/billing/meter/get-user-request-usage`;
326
+
327
+ const CODEBUDDY_INTL_REQUEST_USAGE_URL =
328
+ `${providerBaseUrl("cb")}/billing/meter/get-user-request-usage`;
329
+
330
+ type CodeBuddyProviderId = "cb" | "cbcn";
331
+
332
+ async function cnHeaders(enterpriseId?: string): Promise<Record<string, string>> {
333
+ return {
334
+ "User-Agent": buildCodeBuddyUserAgent("CLI"),
335
+ "X-Product": "SaaS",
336
+ "X-IDE-Type": "CLI",
337
+ "X-IDE-Name": "CLI",
338
+ "X-Domain": codebuddyDomain("CLI"),
339
+ "x-requested-with": "XMLHttpRequest",
340
+ "x-codebuddy-request": "1",
341
+ ...(enterpriseId === undefined || enterpriseId.length === 0
342
+ ? {}
343
+ : { "X-Tenant-Id": enterpriseId, "X-Enterprise-Id": enterpriseId }),
344
+ };
345
+ }
346
+
347
+ async function intlHeaders(enterpriseId?: string): Promise<Record<string, string>> {
348
+ return {
349
+ "User-Agent": buildCodeBuddyUserAgent("IDE"),
350
+ "X-Product": "SaaS",
351
+ "X-IDE-Type": "IDE",
352
+ "X-IDE-Name": "IDE",
353
+ "X-Domain": codebuddyDomain("IDE"),
354
+ "x-requested-with": "XMLHttpRequest",
355
+ "x-codebuddy-request": "1",
356
+ ...(enterpriseId === undefined || enterpriseId.length === 0
357
+ ? {}
358
+ : { "X-Tenant-Id": enterpriseId, "X-Enterprise-Id": enterpriseId }),
359
+ };
360
+ }
361
+
362
+ function parseProviderId(providerId: string): CodeBuddyProviderId {
363
+ const value = providerId.trim().toLowerCase();
364
+ if (value === "cb") return "cb";
365
+ if (value === "cbcn") return "cbcn";
366
+ throw new Error(`Unsupported CodeBuddy provider ${providerId}`);
367
+ }
368
+
369
+ async function providerConfig(
370
+ providerId: CodeBuddyProviderId,
371
+ enterpriseId?: string,
372
+ ): Promise<{
373
+ url: string;
374
+ headers: Record<string, string>;
375
+ display: string;
376
+ }> {
377
+ if (providerId === "cb") {
378
+ return { url: CODEBUDDY_INTL_USAGE_URL, headers: await intlHeaders(enterpriseId), display: "CodeBuddy" };
379
+ }
380
+ return { url: CODEBUDDY_CN_USAGE_URL, headers: await cnHeaders(enterpriseId), display: "CodeBuddy CN" };
381
+ }
382
+
383
+ export async function fetchCodeBuddyQuota(
384
+ credential: string,
385
+ fetcher: FetchLike,
386
+ providerId: string = "cbcn",
387
+ enterpriseId?: string,
388
+ ): Promise<ProviderQuotaResult> {
389
+ const source = parseProviderId(providerId);
390
+ const cfg = await providerConfig(source, enterpriseId);
391
+ return fetchTencentBillingQuota({
392
+ source,
393
+ display: cfg.display,
394
+ url: cfg.url,
395
+ headers: cfg.headers,
396
+ credential,
397
+ fetcher,
398
+ defaultPlan: "CodeBuddy",
399
+ });
400
+ }
401
+
402
+ export const fetchCodeBuddyCnQuota = (
403
+ credential: string,
404
+ fetcher: FetchLike,
405
+ ): Promise<ProviderQuotaResult> => fetchCodeBuddyQuota(credential, fetcher, "cbcn");
406
+
407
+ export const fetchCodeBuddyIntlQuota = (
408
+ credential: string,
409
+ fetcher: FetchLike,
410
+ ): Promise<ProviderQuotaResult> => fetchCodeBuddyQuota(credential, fetcher, "cb");
411
+
412
+ export async function fetchCodeBuddyRequestUsage(
413
+ credential: string,
414
+ fetcher: FetchLike,
415
+ providerId: string = "cbcn",
416
+ days: number = 30,
417
+ enterpriseId?: string,
418
+ ): Promise<BuddyUsageResult> {
419
+ const source = parseProviderId(providerId);
420
+ const cfg = await providerConfig(source, enterpriseId);
421
+ return fetchBuddyRequestUsage({
422
+ url:
423
+ source === "cb" ? CODEBUDDY_INTL_REQUEST_USAGE_URL : CODEBUDDY_CN_REQUEST_USAGE_URL,
424
+ headers: cfg.headers,
425
+ credential,
426
+ fetcher,
427
+ days,
428
+ });
429
+ }
@@ -2,7 +2,7 @@ import { withBearerAuthentication, type OpenAICompatibleAdapterConfig } from "..
2
2
  import type { CanonicalRequest } from "../../../../protocol/canonical-model";
3
3
  import type { ProviderDispatchContext, ProviderDispatchTarget, ProviderId } from "../../../provider-contracts";
4
4
  import { resolveInboundSessionId } from "../../../operations/session-resolution";
5
- import { buddyConversationHeaders } from "../buddy-conversation-headers";
5
+ import { buddyConversationHeaders } from "../headers";
6
6
  import {
7
7
  buddyAgentPurpose,
8
8
  buddyEnterprise,
@@ -11,10 +11,10 @@ import {
11
11
  buddyUserId,
12
12
  resolveBuddyDeviceBinding,
13
13
  resolveBuddyIdentity,
14
- } from "../buddy-identity";
14
+ } from "../headers";
15
15
  import { buildCodeBuddyUserAgent, getCodeBuddyCnVersion, getCodeBuddyVersion } from "../../../operations/client-versions";
16
- import { buddyDeviceTokenHeaders } from "../buddy-identity";
17
- import { buddyCliHeaders, buddyCliTraceHeaders } from "../buddy-cli-headers";
16
+ import { buddyDeviceTokenHeaders } from "../headers";
17
+ import { buddyCliHeaders, buddyCliTraceHeaders } from "../headers";
18
18
 
19
19
  /** Client identity variant behind the per-request CodeBuddy headers. */
20
20
  export type CodeBuddyVariant = "IDE" | "CLI";