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
@@ -19,8 +19,7 @@
19
19
  */
20
20
  import { defineModel } from "../../provider-model-definition";
21
21
  import type { ModelDefinition } from "../../provider-model-definition";
22
-
23
- export const ALIBABACP_PROVIDER_ID = "alibabacp" as const;
22
+ import { ALIBABACP_PROVIDER_ID } from "./alibabacp";
24
23
 
25
24
  /** Chat path below the region's `/compatible-mode/v1` base. */
26
25
  const CHAT_ENDPOINT = "/chat/completions";
@@ -17,8 +17,8 @@
17
17
  * does not publish yet arrives through the sync control instead of being
18
18
  * asserted ahead of the upstream.
19
19
  */
20
- import { defineModel } from "../provider-model-definition";
21
- import type { ModelDefinition } from "../provider-model-definition";
20
+ import { defineModel } from "../../provider-model-definition";
21
+ import type { ModelDefinition } from "../../provider-model-definition";
22
22
 
23
23
  export const DASHSCOPE_PROVIDER_ID = "dashscope" as const;
24
24
 
@@ -267,6 +267,85 @@ export function normalizeAntigravityToolSchema(schema: unknown): unknown {
267
267
  return schema;
268
268
  }
269
269
 
270
+ /**
271
+ * Flattens JSON-Schema constructs the Antigravity upstream rejects.
272
+ *
273
+ * Verified live (2026-11-05): the Claude-route upstream validates tool
274
+ * schemas as strict JSON Schema draft 2020-12 and refuses every `anyOf` /
275
+ * `oneOf` / multi-type `type: [...]` declaration — even a degenerate
276
+ * `anyOf` of two identical string schemas, and even at the root. The Gemini
277
+ * builder's sanitizer keeps those constructs (Gemini itself accepts them), so
278
+ * a tool that declares a union (e.g. OMP's `task` tool's `model` field)
279
+ * ships an invalid schema and the upstream 400s the whole request with
280
+ * `tools.N.custom.input_schema: JSON schema is invalid`.
281
+ *
282
+ * The rewrite replaces `anyOf`/`oneOf` with the single most permissive
283
+ * alternative's type (string when a choice is a string, otherwise any
284
+ * surviving type), and a multi-type `type: [...]` with its first entry —
285
+ * the most permissive shape a strict single-type validator can express.
286
+ * Recurses through `properties` and `items`.
287
+ */
288
+ export function flattenAntigravitySchema(schema: unknown): unknown {
289
+ if (!isRecord(schema)) return schema;
290
+ const out: Record<string, unknown> = {};
291
+ for (const [key, child] of Object.entries(schema)) {
292
+ if (key === "anyOf" || key === "oneOf") {
293
+ if (!Array.isArray(child)) continue;
294
+ const chosen = child.map((entry) => flattenAntigravitySchema(entry)).find(isRecord);
295
+ if (chosen === undefined) continue;
296
+ if (typeof chosen["type"] === "string") out["type"] = chosen["type"];
297
+ for (const [nestedKey, nestedValue] of Object.entries(chosen)) {
298
+ if (nestedKey === "type") continue;
299
+ out[nestedKey] = nestedValue;
300
+ }
301
+ continue;
302
+ }
303
+ if (key === "type" && Array.isArray(child)) {
304
+ const first = child.find((entry): entry is string => typeof entry === "string");
305
+ if (first !== undefined) out["type"] = first;
306
+ continue;
307
+ }
308
+ if (key === "properties" && isRecord(child)) {
309
+ out["properties"] = Object.fromEntries(
310
+ Object.entries(child).map(([name, entry]) => [name, flattenAntigravitySchema(entry)]),
311
+ );
312
+ continue;
313
+ }
314
+ if (key === "items" && Array.isArray(child)) {
315
+ out["items"] = child.map((entry) => flattenAntigravitySchema(entry));
316
+ continue;
317
+ }
318
+ if (key === "items" && isRecord(child)) {
319
+ out["items"] = flattenAntigravitySchema(child);
320
+ continue;
321
+ }
322
+ out[key] = child;
323
+ }
324
+ return out;
325
+ }
326
+
327
+ /**
328
+ * Applies both tool-schema normalizations (unwrap `parametersJsonSchema`,
329
+ * flatten rejected union constructs) and reports whether anything changed.
330
+ *
331
+ * When flattening is a no-op, the *original* reference is returned so the
332
+ * request-level helper can detect an unchanged request without a deep compare.
333
+ */
334
+ export function normalizeAntigravityToolSchemaForWire(schema: unknown): {
335
+ readonly schema: unknown;
336
+ readonly changed: boolean;
337
+ } {
338
+ const unwrapped = normalizeAntigravityToolSchema(schema);
339
+ const flattened = flattenAntigravitySchema(unwrapped);
340
+ const unwrapChanged = unwrapped !== schema;
341
+ const flattenChanged =
342
+ flattened !== unwrapped && JSON.stringify(flattened) !== JSON.stringify(unwrapped);
343
+ return {
344
+ schema: flattenChanged ? flattened : unwrapped,
345
+ changed: unwrapChanged || flattenChanged,
346
+ };
347
+ }
348
+
270
349
  /**
271
350
  * Normalizes every declared tool's schema on a canonical request, returning a
272
351
  * shallow copy of the request when anything changed and the original object
@@ -286,14 +365,54 @@ export function normalizeAntigravityToolSchemas(request: CanonicalRequest): Cano
286
365
  if (tools === undefined || tools.length === 0) return request;
287
366
  let changed = false;
288
367
  const normalized = tools.map((tool) => {
289
- const schema = normalizeAntigravityToolSchema(tool.jsonSchema);
290
- if (schema === tool.jsonSchema) return tool;
368
+ const { schema, changed: schemaChanged } = normalizeAntigravityToolSchemaForWire(tool.jsonSchema);
369
+ if (!schemaChanged) return tool;
291
370
  changed = true;
292
371
  return { ...tool, jsonSchema: schema };
293
372
  });
294
373
  return changed ? { ...request, tools: normalized } : request;
295
374
  }
296
375
 
376
+ /**
377
+ * Drops replayed reasoning blocks that carry no signature on a Claude route.
378
+ *
379
+ * The Claude-route upstream requires every `thinking` block in a replayed
380
+ * assistant turn to carry a `signature`; an unsigned block is rejected with
381
+ * `400 messages.N.content.0.thinking.signature: Field required`. Chat-surface
382
+ * clients (e.g. OMP) replay reasoning as a bare `reasoning_content` string
383
+ * that has no signature — there is nothing to forward, and sending it as an
384
+ * unsigned `thought` part guarantees the 400.
385
+ *
386
+ * The reference client solves this with a `drop-unsigned-thinking` compat flag
387
+ * on `google-antigravity` (donor `anthropic.kdl:743-748`): a thinking block
388
+ * without a signature is simply not replayed. This mirrors that behavior —
389
+ * reasoning with a real signature still replays; reasoning without one is
390
+ * dropped so the upstream never sees an unsigned `thinking` part.
391
+ */
392
+ export function dropAntigravityUnsignedReasoning(
393
+ request: CanonicalRequest,
394
+ isClaudeRoute: boolean,
395
+ ): CanonicalRequest {
396
+ if (!isClaudeRoute) return request;
397
+ const messages = request.messages;
398
+ let changed = false;
399
+ const next = messages.map((message) => {
400
+ if (message.role !== "assistant") return message;
401
+ const content = message.content.filter((part) => {
402
+ if (part.kind !== "reasoning") return true;
403
+ // A present-but-empty signature is still unsigned: upstream rejects a
404
+ // `thinking` part whose `signature` is missing *or* empty with
405
+ // `400 messages.N.content.0.thinking.signature: Field required`. Only a
406
+ // non-empty signature is a real one.
407
+ if (typeof part.signature === "string" && part.signature.length > 0) return true;
408
+ changed = true;
409
+ return false;
410
+ });
411
+ return changed ? { ...message, content } : message;
412
+ });
413
+ return changed ? { ...request, messages: next } : request;
414
+ }
415
+
297
416
  // Last-good-endpoint stickiness
298
417
 
299
418
  /**
@@ -41,6 +41,7 @@ import {
41
41
  import {
42
42
  antigravityWireModelId,
43
43
  applySkipThoughtSignatureBypass,
44
+ dropAntigravityUnsignedReasoning,
44
45
  getAntigravityModelWireProfile,
45
46
  getAntigravityUserAgent,
46
47
  loadAntigravityProject,
@@ -334,6 +335,7 @@ class AntigravityAdapter implements ProviderAdapter {
334
335
  kind: "reasoning",
335
336
  payload: null,
336
337
  summary: output.thought,
338
+ ...(output.thoughtSignature ? { signature: output.thoughtSignature } : {}),
337
339
  },
338
340
  } as CanonicalEvent;
339
341
  }
@@ -448,6 +450,7 @@ class AntigravityAdapter implements ProviderAdapter {
448
450
  kind: "reasoning",
449
451
  payload: null,
450
452
  summary: output.thought,
453
+ ...(output.thoughtSignature ? { signature: output.thoughtSignature } : {}),
451
454
  },
452
455
  } as CanonicalEvent;
453
456
  }
@@ -912,7 +915,16 @@ export function buildAntigravityEnvelope(
912
915
  // for that key and would drop both the wrapper and the schema inside it —
913
916
  // the tool would ship as `{"type":"object"}` with every property gone.
914
917
  // Rewriting after the payload is built leaves nothing to recover.
915
- const geminiPayload = buildGeminiPayload(normalizeAntigravityToolSchemas(request));
918
+ //
919
+ // Claude routes also drop replayed reasoning without a signature (donor
920
+ // `drop-unsigned-thinking`): upstream rejects an unsigned `thinking` part
921
+ // with 400 `messages.N.content.0.thinking.signature: Field required`.
922
+ const isClaudeRoute = logicalModelId.toLowerCase().includes("claude");
923
+ const geminiPayload = buildGeminiPayload(
924
+ normalizeAntigravityToolSchemas(
925
+ dropAntigravityUnsignedReasoning(request, isClaudeRoute),
926
+ ),
927
+ );
916
928
  const profile = getAntigravityModelWireProfile(wireModelId);
917
929
 
918
930
  const generationConfig = isRecord(geminiPayload["generationConfig"])
@@ -946,7 +958,6 @@ export function buildAntigravityEnvelope(
946
958
  const existingContents = Array.isArray(geminiPayload["contents"])
947
959
  ? (geminiPayload["contents"] as Record<string, unknown>[])
948
960
  : [];
949
- const isClaudeRoute = logicalModelId.toLowerCase().includes("claude");
950
961
  // Forced choice on Gemini routes: the backend drops `toolConfig` here, so a
951
962
  // canonical `tool_choice=required` with no declared change is restated as a
952
963
  // trailing user directive (reference behavior). Claude routes implement
@@ -8,10 +8,9 @@
8
8
  * declarations.
9
9
  *
10
10
  * Only the row shape and the builder are shared. Identity headers are not:
11
- * `codebuddyHeaders` and `workbuddyHeaders` send genuinely different bytes
12
- * (`X-Product`/`X-IDE-Type`/`X-Domain` versus `origin`/`referer` and the
13
- * account-derived `x-user-id`/`x-machine-id`/`x-session-id`), and those stay
14
- * with their own provider.
11
+ * `codebuddyHeaders` sends genuinely different bytes per realm
12
+ * (`X-Product`/`X-IDE-Type`/`X-Domain` versus the CN CLI profile), and those
13
+ * stay with the provider.
15
14
  */
16
15
  import { GatewayError } from "../../../protocol/gateway-error";
17
16
  import { defineModel } from "../../provider-model-definition";
@@ -42,7 +41,8 @@ export const BUDDY_INTL_EFFORTS: Readonly<Record<string, readonly string[]>> = {
42
41
  "glm-5.2": ["high", "xhigh"],
43
42
  "glm-5.3": ["low", "high", "max"],
44
43
  hy3: ["low", "high"],
45
- "hy4-preview-f": ["high"],
44
+ hy4: ["high"],
45
+ hy4free: ["high"],
46
46
  };
47
47
  export const BUDDY_CN_EFFORTS: Readonly<Record<string, readonly string[]>> = {
48
48
  "deepseek-v4-flash": ["low", "high", "max"],
@@ -53,7 +53,8 @@ export const BUDDY_CN_EFFORTS: Readonly<Record<string, readonly string[]>> = {
53
53
  "glm-5.3": ["low", "high", "max"],
54
54
  "glm-5.3-flash": ["low", "high", "max"],
55
55
  hy3: ["low", "high"],
56
- "hy4-preview": ["high"],
56
+ hy4: ["high"],
57
+ hy4free: ["high"],
57
58
  };
58
59
 
59
60
  /** The image-generation ids the international buddy providers serve. */
@@ -75,9 +76,9 @@ const BUDDY_IMAGE_MODEL_IDS: readonly { id: string; endpoint: string; ctx: numbe
75
76
  * `seedance-2.5` is the text-to-video model the buddy facade exposes. It is a
76
77
  * distinct service kind (`videoGeneration`), not a chat or image row, so it is
77
78
  * built by {@link makeBuddyVideoModels} and reached through
78
- * `/videos/generations` (relative to each variant's own base, which is why the
79
- * WorkBuddy rows carry the `/v2` segment themselves) rather than a chat wire.
80
- * CodeBuddy CN is deliberately absent — it publishes a different roster.
79
+ * `/videos/generations` (relative to each variant's own base) rather than a
80
+ * chat wire. CodeBuddy CN is deliberately absent — it publishes a different
81
+ * roster.
81
82
  */
82
83
  const BUDDY_VIDEO_MODEL_IDS: readonly { id: string; endpoint: string; ctx: number; out: number }[] = [
83
84
  { id: "seedance-2.5", endpoint: "/videos/generations", ctx: 1_000_000, out: 128_000 },
@@ -103,16 +104,15 @@ export const BUDDY_IMAGE_MODEL_ID_SET: ReadonlySet<string> = new Set(
103
104
  * The CN realm's image-generation ids.
104
105
  *
105
106
  * Separate from {@link BUDDY_IMAGE_MODEL_IDS} because the realms do not share
106
- * a roster: `hunyuan-image-alpha` is published by the CN `/v3/config` only, and
107
- * the intl image ids are not served there. Sharing one list would either leak
108
- * CN-only ids onto the international catalogs or force a realm check into
109
- * every consumer.
110
- *
111
- * `hunyuan-image-alpha-edit` carries `image-to-image` and is deliberately NOT
112
- * here: it is not in the CLI roster, so it is not a routable generation model.
107
+ * a roster: `hunyuan-image-alpha` (text-to-image) and
108
+ * `hunyuan-image-alpha-edit` (image-to-image) are published by the CN
109
+ * `/v3/config` only, and the intl image ids are not served there. Sharing one
110
+ * list would either leak CN-only ids onto the international catalogs or force
111
+ * a realm check into every consumer.
113
112
  */
114
113
  const BUDDY_CN_IMAGE_MODEL_IDS: readonly { id: string; ctx: number; out: number }[] = [
115
114
  { id: "hunyuan-image-alpha", ctx: 1_000_000, out: 64_000 },
115
+ { id: "hunyuan-image-alpha-edit", ctx: 1_000_000, out: 64_000 },
116
116
  ];
117
117
 
118
118
  /** The CN analogue of {@link BUDDY_IMAGE_MODEL_ID_SET}. */
@@ -145,10 +145,54 @@ export function makeBuddyCnImageModels(
145
145
  );
146
146
  }
147
147
 
148
+ /**
149
+ * The CN realm's video-generation ids.
150
+ *
151
+ * `kling-video-v3` (text-to-video + image-to-video) and
152
+ * `minimax-video-h3` (text-to-video) are published by the CN `/v3/config`,
153
+ * sharing the async task surface the intl video rows use.
154
+ */
155
+ const BUDDY_CN_VIDEO_MODEL_IDS: readonly { id: string; ctx: number; out: number }[] = [
156
+ { id: "kling-video-v3", ctx: 1_000_000, out: 128_000 },
157
+ { id: "minimax-video-h3", ctx: 1_000_000, out: 128_000 },
158
+ ];
159
+
160
+ /** The CN analogue of {@link BUDDY_VIDEO_MODEL_ID_SET}. */
161
+ export const BUDDY_CN_VIDEO_MODEL_ID_SET: ReadonlySet<string> = new Set(
162
+ BUDDY_CN_VIDEO_MODEL_IDS.map((entry) => entry.id),
163
+ );
164
+
165
+ /**
166
+ * Builds the CN video-generation rows for one buddy CN provider.
167
+ *
168
+ * Same shape as {@link makeBuddyVideoModels}, scoped to the CN roster: a video
169
+ * row produces `["video"]` on the `videoGeneration` surface and is reached
170
+ * through the native video route, not a chat wire.
171
+ */
172
+ export function makeBuddyCnVideoModels(
173
+ providerId: string,
174
+ endpoint: string,
175
+ ): readonly ModelDefinition[] {
176
+ return BUDDY_CN_VIDEO_MODEL_IDS.map((entry) =>
177
+ defineModel({
178
+ id: entry.id,
179
+ providerId,
180
+ serviceKind: "videoGeneration",
181
+ wireFamily: "chat",
182
+ endpoint,
183
+ ctx: entry.ctx,
184
+ out: entry.out,
185
+ vision: true,
186
+ output: ["video"],
187
+ toolCall: false,
188
+ }),
189
+ );
190
+ }
191
+
148
192
  /**
149
193
  * Ids the buddy facade refuses on a free plan.
150
194
  *
151
- * The international CodeBuddy and WorkBuddy catalogs share this roster and
195
+ * The international CodeBuddy catalog shares this roster and
152
196
  * the same Pro-tier model classification.
153
197
  *
154
198
  * Nothing in the console directory predicts it. `credits` does not — `kimi-k3`
@@ -186,12 +230,12 @@ export const BUDDY_PRO_ONLY_MODEL_IDS: ReadonlySet<string> = new Set([
186
230
  /**
187
231
  * Builds the image-generation rows for one buddy provider.
188
232
  *
189
- * Shared rather than copied per provider: cb and WorkBuddy serve the same image
233
+ * Shared rather than copied per provider: cb serves the same image
190
234
  * models from the same facade, so the roster and the declared capabilities are
191
235
  * one decision instead of two that drift. CodeBuddy CN is deliberately absent —
192
236
  * it publishes a different roster.
193
237
  *
194
- * `endpoint` is explicit because the two families disagree about the path their
238
+ * `endpoint` is explicit because the realms disagree about the path their
195
239
  * base URL expects, and a bare `defineModel` would infer the generic default
196
240
  * and produce a URL the upstream rejects.
197
241
  */
@@ -260,12 +304,9 @@ export const BUDDY_VIDEO_MODEL_ID_SET: ReadonlySet<string> = new Set(
260
304
  * Builds one buddy catalog row.
261
305
  *
262
306
  * `endpoint` is explicit rather than left to the generic `/chat/completions`
263
- * default because the two families disagree about it: CodeBuddy's base URL
264
- * carries a version segment the default joins onto correctly, while
265
- * WorkBuddy's does not — the default would produce
266
- * `https://www.workbuddy.ai/chat/completions`, which that upstream answers
267
- * with a 405 HTML page. Callers pass the endpoint their base URL actually
268
- * serves, and `undefined` for the default.
307
+ * default because the family's CN base URL differs from the intl one; callers
308
+ * pass the endpoint their base URL actually serves, and `undefined` for the
309
+ * default.
269
310
  */
270
311
  export function makeBuddyModel(
271
312
  entry: BuddyRawEntry,
@@ -297,14 +338,11 @@ export function makeBuddyModel(
297
338
  }
298
339
 
299
340
  /**
300
- * The shared model roster for the two international buddy sites.
341
+ * The shared model roster for the international buddy site.
301
342
  *
302
- * CodeBuddy intl and WorkBuddy serve the same model set from the same console
303
- * directory shape, so the two catalogs were kept as separate hand-written lists
304
- * and had already drifted: each carried ids the other lacked. One list is the
305
- * single source of truth, and each provider maps it with its own endpoint
306
- * (`workbuddy.ts` needs the explicit `/v2/chat/completions`, `codebuddy.ts`
307
- * takes the family default) — the endpoint is the only thing that differs.
343
+ * CodeBuddy intl serves the model set from the same console directory shape, so
344
+ * the catalog is one hand-written list as the single source of truth, mapped
345
+ * with the provider's own endpoint (`codebuddy.ts` takes the family default).
308
346
  *
309
347
  * CodeBuddy CN is deliberately NOT on this list: its console publishes a
310
348
  * different roster (its own `glm-5v-turbo` / `kimi-k3-1` ids and CN-specific
@@ -349,8 +387,8 @@ export const BUDDY_SHARED_RAW: readonly BuddyRawEntry[] = [
349
387
  ["grok-4.6", "Grok 4.6", true, true, 500_000, 500_000],
350
388
  ["grok-4.7", "Grok 4.7", true, true, 500_000, 128_000],
351
389
  ["hy3", "Hy3", true, true, 192_000, 64_000, true],
352
- ["hy4-preview", "Hy4 Preview", true, true, 1_000_000, 64_000, true],
353
- ["hy4-preview-f", "Hy4 Preview F", true, true, 1_000_000, 64_000, true],
390
+ ["hy4", "Hy4", true, true, 1_000_000, 64_000, true],
391
+ ["hy4free", "Hy4 Free", true, true, 1_000_000, 64_000, true],
354
392
  ["kimi-k2.5", "Kimi K2.5", true, false, 164_000, 262_144],
355
393
  ["kimi-k2.6", "Kimi K2.6", true, false, 256_000, 262_144],
356
394
  ["kimi-k2.7", "Kimi K2.7", true, false, 256_000, 65_536],