cartethyia 2.7.4 → 2.7.5

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 (553) hide show
  1. package/.env.example +2 -0
  2. package/README.md +17 -5
  3. package/dist/dashboard/assets/{BannedPage-ChG5svFb.js → BannedPage-Cj15GsMp.js} +1 -1
  4. package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
  5. package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +1 -0
  6. package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
  7. package/dist/dashboard/assets/{CliToolDetailPage-BIcWQun7.js → CliToolDetailPage-DZKmVuJN.js} +1 -1
  8. package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
  9. package/dist/dashboard/assets/{CliToolsPage-Bf2VelDe.js → CliToolsPage-BIccZmeL.js} +1 -1
  10. package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
  11. package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +1 -0
  12. package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
  13. package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js +1 -0
  14. package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
  15. package/dist/dashboard/assets/{CustomizationPage-ggeMSjte.js → CustomizationPage-BKj_r0rp.js} +1 -1
  16. package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
  17. package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js +656 -0
  18. package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
  19. package/dist/dashboard/assets/{LoginPage-U6AKaJcF.js → LoginPage-DkXb6dx-.js} +1 -1
  20. package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
  21. package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-DnQPSIA8.js} +1 -1
  22. package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
  23. package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +1 -0
  24. package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
  25. package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +5 -0
  26. package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
  27. package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +1 -0
  28. package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
  29. package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +1 -0
  30. package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
  31. package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-5SnUSy3j.js} +1 -1
  32. package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
  33. package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +1 -0
  34. package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
  35. package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js +1 -0
  36. package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
  37. package/dist/dashboard/assets/{SetupPage-f0DE1h0-.js → SetupPage-WTa0sktC.js} +1 -1
  38. package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
  39. package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-BfAb5-o_.js} +3 -3
  40. package/dist/dashboard/assets/StudioPage-BfAb5-o_.js.gz +0 -0
  41. package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js +56 -0
  42. package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js.gz +0 -0
  43. package/dist/dashboard/assets/api-keys-l29JROPv.js +1 -0
  44. package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
  45. package/dist/dashboard/assets/app--PJWq8_C.css +2 -0
  46. package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
  47. package/dist/dashboard/assets/assert-C0K-c4eo.js +1 -0
  48. package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
  49. package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-DfbhQU4k.js} +1 -1
  50. package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
  51. package/dist/dashboard/assets/{banner-DympBNq4.js → banner-BllT4LcF.js} +1 -1
  52. package/dist/dashboard/assets/banner-BllT4LcF.js.gz +0 -0
  53. package/dist/dashboard/assets/brand/login_register.jpg +0 -0
  54. package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
  55. package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
  56. package/dist/dashboard/assets/brand/og_image.jpg +0 -0
  57. package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CtkX66Wd.js} +1 -1
  58. package/dist/dashboard/assets/card-CtkX66Wd.js.gz +0 -0
  59. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
  60. package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
  61. package/dist/dashboard/assets/cli-tools-CQXVMn4P.js +1 -0
  62. package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
  63. package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-BQqBQd2n.js} +1 -1
  64. package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
  65. package/dist/dashboard/assets/{dialog-8fiE6tec.js → dialog-BEK7KP0H.js} +1 -1
  66. package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
  67. package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-BrTEZ8zu.js} +1 -1
  68. package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
  69. package/dist/dashboard/assets/entry-CHWxbS56.js +1 -0
  70. package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
  71. package/dist/dashboard/assets/{entry-BSAsYsmV.js → entry-EBHJ3DrE.js} +1 -1
  72. package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
  73. package/dist/dashboard/assets/entry-LCS85hiq.js +4 -0
  74. package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
  75. package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-BAACA727.js} +1 -1
  76. package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
  77. package/dist/dashboard/assets/{github-badge-CPK47xQx.js → github-badge-YSCE4UC2.js} +1 -1
  78. package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
  79. package/dist/dashboard/assets/{index-DBNPOfhV.js → index-FQlj0HUT.js} +2 -2
  80. package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
  81. package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-C4gU5iOL.js} +1 -1
  82. package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
  83. package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BHHX_Tmm.js} +1 -1
  84. package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
  85. package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-CajrYUnD.js} +1 -1
  86. package/dist/dashboard/assets/layout-CajrYUnD.js.gz +0 -0
  87. package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Bx2I7XUe.js} +1 -1
  88. package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
  89. package/dist/dashboard/assets/live-DNNqRbj2.js +1 -0
  90. package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
  91. package/dist/dashboard/assets/network-C5UBACrJ.js +1 -0
  92. package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
  93. package/dist/dashboard/assets/numbers-CUWAZK4J.js +2 -0
  94. package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
  95. package/dist/dashboard/assets/pagination-Xsi9Qx04.js +1 -0
  96. package/dist/dashboard/assets/pagination-Xsi9Qx04.js.gz +0 -0
  97. package/dist/dashboard/assets/quota-DvQbD_sr.js +1 -0
  98. package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
  99. package/dist/dashboard/assets/routing-in0f_IfK.js +1 -0
  100. package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
  101. package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BLULNqTp.js} +1 -1
  102. package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
  103. package/dist/dashboard/assets/settings-CcGczj6I.js +1 -0
  104. package/dist/dashboard/assets/settings-CcGczj6I.js.gz +0 -0
  105. package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
  106. package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
  107. package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-D2lIR0tg.js} +1 -1
  108. package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
  109. package/dist/dashboard/assets/{state-CkfdYWel.js → state-DTARjfiW.js} +1 -1
  110. package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
  111. package/dist/dashboard/assets/{switch-SYm237HG.js → switch-c0oPSnqW.js} +1 -1
  112. package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
  113. package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-m8WGNPrz.js} +1 -1
  114. package/dist/dashboard/assets/useMutation-m8WGNPrz.js.gz +0 -0
  115. package/dist/dashboard/console-backgrounds.jpg +0 -0
  116. package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
  117. package/dist/dashboard/index.html +2 -2
  118. package/dist/dashboard/index.html.gz +0 -0
  119. package/dist/dashboard/precompressed-assets.json +56 -55
  120. package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
  121. package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
  122. package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
  123. package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
  124. package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
  125. package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
  126. package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
  127. package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
  128. package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
  129. package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
  130. package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
  131. package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
  132. package/package.json +4 -6
  133. package/scripts/cli/update.ts +15 -41
  134. package/src/boot/app.ts +58 -2
  135. package/src/boot/dependencies.ts +786 -732
  136. package/src/boot/lifecycle.ts +11 -12
  137. package/src/config/cooldowns.ts +34 -55
  138. package/src/config/network.ts +1 -1
  139. package/src/config/package-paths.ts +1 -1
  140. package/src/config/providers.ts +13 -14
  141. package/src/config/resources.ts +0 -5
  142. package/src/config/runtime.ts +2 -5
  143. package/src/config/spec.ts +26 -6
  144. package/src/console/api-keys/ban-constants.ts +38 -0
  145. package/src/console/api-keys/contracts.ts +71 -62
  146. package/src/console/api-keys/routes.ts +48 -12
  147. package/src/console/auth/access.ts +4 -4
  148. package/src/console/auth/account-reset.ts +1 -1
  149. package/src/console/auth/audit-recorder.ts +1 -1
  150. package/src/console/auth/lockout.ts +7 -3
  151. package/src/console/auth/row-coercion.ts +57 -12
  152. package/src/console/auth/session-resolver.ts +1 -1
  153. package/src/console/auth/session-service.ts +8 -2
  154. package/src/console/auth/session.ts +37 -31
  155. package/src/console/auth/setup-service.ts +4 -3
  156. package/src/console/auth/user-store.ts +1 -1
  157. package/src/console/backup/9router-map.ts +0 -3
  158. package/src/console/backup/contracts.ts +9 -9
  159. package/src/console/backup/export-endpoint.ts +5 -6
  160. package/src/console/backup/nine-router.ts +1 -7
  161. package/src/console/backup/routes.ts +29 -33
  162. package/src/console/backup/service.ts +468 -468
  163. package/src/console/backup/store.ts +47 -29
  164. package/src/console/backup/validate.ts +11 -1
  165. package/src/console/cli-tools/contracts.ts +7 -7
  166. package/src/console/cli-tools/injectors/cline.ts +110 -110
  167. package/src/console/cli-tools/injectors/codex.ts +181 -181
  168. package/src/console/cli-tools/injectors/copilot.ts +108 -108
  169. package/src/console/cli-tools/injectors/driver.ts +247 -247
  170. package/src/console/cli-tools/injectors/jcode.ts +115 -115
  171. package/src/console/cli-tools/injectors/openclaw.ts +161 -161
  172. package/src/console/cli-tools/injectors/opencode.ts +153 -153
  173. package/src/console/cli-tools/routes.ts +1 -1
  174. package/src/console/cli-tools/service.ts +1 -1
  175. package/src/console/cli-tools/store.ts +2 -2
  176. package/src/console/console-router.ts +32 -0
  177. package/src/console/dashboard-assets.ts +9 -9
  178. package/src/console/domain-registration.ts +16 -2
  179. package/src/console/inferhub/client.ts +0 -7
  180. package/src/console/inferhub/key-store.ts +1 -1
  181. package/src/console/inferhub/normalize.ts +2 -2
  182. package/src/console/inferhub/routes.ts +1 -1
  183. package/src/console/inferhub/types.ts +1 -1
  184. package/src/console/observability/contracts.ts +1 -1
  185. package/src/console/observability/live.ts +31 -18
  186. package/src/console/observability/logs.ts +1 -1
  187. package/src/console/observability/sse.ts +62 -8
  188. package/src/console/observability/store.ts +20 -4
  189. package/src/console/providers/catalog/catalog-projections.ts +1 -1
  190. package/src/console/providers/catalog/contracts.ts +39 -0
  191. package/src/console/providers/catalog/model-operations.ts +1 -1
  192. package/src/console/providers/catalog/provider-operations.ts +95 -17
  193. package/src/console/providers/catalog/public-model-store.ts +0 -0
  194. package/src/console/providers/catalog/routes.ts +27 -3
  195. package/src/console/providers/catalog/store.ts +147 -8
  196. package/src/console/providers/detail/routes.ts +1 -1
  197. package/src/console/providers/oauth/callback-listener.ts +100 -18
  198. package/src/console/providers/oauth/routes.ts +92 -13
  199. package/src/console/quota/account-quota-global.ts +41 -3
  200. package/src/console/quota/account-quota-shared.ts +10 -3
  201. package/src/console/quota/account-quota-tenant.ts +259 -66
  202. package/src/console/quota/daily-growth-job.ts +308 -0
  203. package/src/console/quota/native-identity.ts +2 -2
  204. package/src/console/quota/quota-view.ts +1 -1
  205. package/src/console/remote-support/routes.ts +1 -1
  206. package/src/console/remote-support/service.ts +2 -2
  207. package/src/console/routing/model/contracts.ts +1 -1
  208. package/src/console/routing/pools/contracts.ts +2 -2
  209. package/src/console/routing/pools/import-parse.ts +3 -3
  210. package/src/console/routing/pools/relay-deploy.ts +3 -3
  211. package/src/console/settings/contracts.ts +29 -2
  212. package/src/console/settings/store.ts +20 -0
  213. package/src/console/share/share-router.ts +100 -32
  214. package/src/console/share/share-stats.ts +4 -4
  215. package/src/console/share/share-usage.ts +1 -1
  216. package/src/console/shared/errors.ts +2 -2
  217. package/src/console/shared/object.ts +18 -0
  218. package/src/console/shared/read-through-cache.ts +4 -4
  219. package/src/console/shared/transaction.ts +14 -0
  220. package/src/console/system-prompt/contracts.ts +89 -12
  221. package/src/console/system-prompt/routes.ts +98 -45
  222. package/src/console/updates/apply-update.ts +244 -0
  223. package/src/console/updates/routes.ts +252 -97
  224. package/src/main.ts +11 -5
  225. package/src/network/http2-bidi.ts +1 -1
  226. package/src/network/ip-utils.ts +298 -0
  227. package/src/network/outbound-fetch.ts +1 -1
  228. package/src/network/pool/agent.ts +7 -6
  229. package/src/network/pool/byte-accounting.ts +1 -1
  230. package/src/network/pool/resolver.ts +16 -12
  231. package/src/network/pool/selector.ts +150 -136
  232. package/src/network/pool-health-machine.ts +1 -1
  233. package/src/network/rate-limit-verdict.ts +1 -1
  234. package/src/network/retry.ts +1 -1
  235. package/src/network/ssrf.ts +20 -71
  236. package/src/observability/event-log.ts +2 -2
  237. package/src/observability/event-query.ts +59 -291
  238. package/src/observability/log-sanitize.ts +1 -1
  239. package/src/observability/metrics.ts +4 -4
  240. package/src/observability/payload-capture.ts +6 -5
  241. package/src/observability/payload-store.ts +1 -1
  242. package/src/observability/runtime-metrics.ts +1 -1
  243. package/src/observability/telemetry-buffer.ts +12 -3
  244. package/src/observability/telemetry-reconciliation.ts +3 -3
  245. package/src/observability/token-speed.ts +1 -1
  246. package/src/persistence/connection-url.ts +1 -1
  247. package/src/persistence/db-handle.ts +1 -1
  248. package/src/persistence/db-pg.ts +2 -2
  249. package/src/persistence/db-sqlite.ts +3 -3
  250. package/src/persistence/dialect.ts +5 -1
  251. package/src/persistence/readiness.ts +1 -1
  252. package/src/persistence/redis.ts +1 -1
  253. package/src/persistence/schema.ts +113 -40
  254. package/src/persistence/shared-cache.ts +2 -2
  255. package/src/persistence/sort-order.ts +1 -1
  256. package/src/persistence/stores/api-key-store.ts +10 -1
  257. package/src/persistence/stores/share-store.ts +20 -8
  258. package/src/persistence/system-prompt-store.ts +63 -18
  259. package/src/persistence/tenant-preferences.ts +1 -1
  260. package/src/persistence/ttl-cache.ts +3 -3
  261. package/src/persistence/usage-flush.ts +7 -2
  262. package/src/protocol/canonical-model.ts +1 -1
  263. package/src/protocol/codecs.ts +6 -10
  264. package/src/protocol/dsml.ts +3 -49
  265. package/src/protocol/image-clamp.ts +2 -2
  266. package/src/protocol/reasoning-text.ts +1 -1
  267. package/src/protocol/reasoning.ts +7 -52
  268. package/src/protocol/registry.ts +50 -15
  269. package/src/protocol/request/chat.ts +46 -19
  270. package/src/protocol/request/codex.ts +1 -1
  271. package/src/protocol/request/messages.ts +46 -14
  272. package/src/protocol/request/responses.ts +19 -10
  273. package/src/protocol/response/chat.ts +25 -10
  274. package/src/protocol/response/codex.ts +1 -1
  275. package/src/protocol/response/messages.ts +1 -1
  276. package/src/protocol/response/omp-tool-call-markup.ts +1 -1
  277. package/src/protocol/response/responses.ts +1 -1
  278. package/src/protocol/sse-decoder.ts +50 -1
  279. package/src/protocol/stop-reason.ts +2 -2
  280. package/src/protocol/think-split.ts +347 -0
  281. package/src/protocol/translation/attachment-integrity.ts +3 -3
  282. package/src/protocol/translation/cache-controls.ts +8 -20
  283. package/src/protocol/translation/capabilities.ts +6 -6
  284. package/src/protocol/translation/dialect/deepseek.ts +10 -0
  285. package/src/protocol/translation/dialect/inband.ts +39 -0
  286. package/src/protocol/translation/dialect/model-thinking.ts +89 -0
  287. package/src/protocol/translation/dialect/qwen.ts +114 -0
  288. package/src/protocol/translation/dialect/resolver.ts +83 -0
  289. package/src/protocol/translation/dialect/rules.ts +93 -0
  290. package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
  291. package/src/protocol/translation/dialect/types.ts +58 -0
  292. package/src/protocol/translation/quirks.ts +18 -4
  293. package/src/protocol/translation/thinking.ts +12 -252
  294. package/src/protocol/translation/tool-id.ts +3 -3
  295. package/src/protocol/translation/tool-repair.ts +1 -1
  296. package/src/protocol/upstream/post-json.ts +6 -1
  297. package/src/providers/adapters/compatible-adapter.ts +42 -3
  298. package/src/providers/authentication/jwt-validator.ts +0 -5
  299. package/src/providers/authentication/oauth-client.ts +254 -253
  300. package/src/providers/authentication/oauth-flow-store.ts +42 -7
  301. package/src/providers/bundled-discovery-providers.ts +6 -30
  302. package/src/providers/configured-openai-providers.ts +82 -97
  303. package/src/providers/default-registry.ts +23 -35
  304. package/src/providers/discovery/catalog/catalog-format.ts +13 -2
  305. package/src/providers/discovery/discovery-types.ts +0 -1
  306. package/src/providers/discovery/openai-model-discovery.ts +2 -2
  307. package/src/providers/discovery/probe-phases.ts +48 -13
  308. package/src/providers/discovery/probing-service.ts +6 -8
  309. package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
  310. package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
  311. package/src/providers/integrations/antigravity/antigravity-protocol.ts +0 -14
  312. package/src/providers/integrations/antigravity/antigravity.ts +2 -2
  313. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
  314. package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
  315. package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
  316. package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
  317. package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
  318. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
  319. package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
  320. package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
  321. package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
  322. package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
  323. package/src/providers/integrations/claude/claude-cch.ts +148 -148
  324. package/src/providers/integrations/claude/fallback-credit.ts +3 -7
  325. package/src/providers/integrations/cline/cline.ts +1 -1
  326. package/src/providers/integrations/codex/codex-device-code.ts +101 -101
  327. package/src/providers/integrations/codex/codex-oauth.ts +0 -1
  328. package/src/providers/integrations/commandcode/commandcode.ts +75 -115
  329. package/src/providers/integrations/commandcode/quota.ts +131 -51
  330. package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
  331. package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
  332. package/src/providers/integrations/cursor/cursor-request.ts +0 -87
  333. package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
  334. package/src/providers/integrations/cursor/cursor.ts +38 -5
  335. package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
  336. package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
  337. package/src/providers/integrations/factory/factory.ts +9 -9
  338. package/src/providers/integrations/github/github-discovery.ts +55 -10
  339. package/src/providers/integrations/github/github-oauth.ts +6 -5
  340. package/src/providers/integrations/github/github.ts +41 -14
  341. package/src/providers/integrations/grok/grok-oauth.ts +261 -261
  342. package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
  343. package/src/providers/integrations/grok/grok-quota.ts +16 -7
  344. package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
  345. package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
  346. package/src/providers/integrations/grok/grok.ts +86 -36
  347. package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
  348. package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
  349. package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
  350. package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
  351. package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
  352. package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
  353. package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
  354. package/src/providers/integrations/kiro/kiro-request.ts +8 -11
  355. package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
  356. package/src/providers/integrations/kiro/kiro.ts +81 -68
  357. package/src/providers/integrations/muse/muse-oauth.ts +0 -1
  358. package/src/providers/integrations/muse/muse-quota.ts +0 -4
  359. package/src/providers/integrations/opencode/fingerprint.ts +7 -5
  360. package/src/providers/integrations/opencode/provider.ts +17 -24
  361. package/src/providers/integrations/qoder/qoder-catalog.ts +85 -8
  362. package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
  363. package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
  364. package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
  365. package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
  366. package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
  367. package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
  368. package/src/providers/integrations/qoder/qoder.ts +354 -62
  369. package/src/providers/integrations/shared/connect.ts +0 -54
  370. package/src/providers/integrations/shared/hash.ts +15 -0
  371. package/src/providers/integrations/shared/session-cache.ts +136 -0
  372. package/src/providers/integrations/trae/trae-cache.ts +7 -87
  373. package/src/providers/integrations/trae/trae-catalog.ts +1 -6
  374. package/src/providers/integrations/trae/trae-protocol.ts +17 -8
  375. package/src/providers/integrations/trae/trae-realm.ts +0 -7
  376. package/src/providers/integrations/trae/trae.ts +53 -10
  377. package/src/providers/integrations/xai/xai-oauth.ts +5 -5
  378. package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
  379. package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
  380. package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
  381. package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
  382. package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
  383. package/src/providers/operations/account-error-classification.ts +131 -116
  384. package/src/providers/operations/account-health-service.ts +31 -39
  385. package/src/providers/operations/account-reset-service.ts +58 -1
  386. package/src/providers/operations/cli-platform.ts +31 -5
  387. package/src/providers/operations/client-version-resolver.ts +4 -6
  388. package/src/providers/operations/client-versions.ts +10 -7
  389. package/src/providers/operations/provider-catalog-seeder.ts +2 -0
  390. package/src/providers/operations/provider-catalog-service.ts +18 -2
  391. package/src/providers/operations/provider-credential-service.ts +19 -2
  392. package/src/providers/provider-contracts.ts +18 -7
  393. package/src/providers/provider-metadata.ts +17 -2
  394. package/src/providers/provider-model-definition.ts +22 -1
  395. package/src/providers/provider-probe.ts +4 -2
  396. package/src/providers/provider-usage.ts +81 -16
  397. package/src/providers/quota/cache.ts +29 -0
  398. package/src/providers/quota/quota-contracts.ts +4 -0
  399. package/src/providers/quota/refresh.ts +27 -4
  400. package/src/providers/quota/snapshot.ts +94 -0
  401. package/src/providers/search/search-provider.ts +1 -3
  402. package/src/providers/search/search-providers.ts +2 -1
  403. package/src/security/abuse.ts +4 -4
  404. package/src/security/admission/service.ts +2 -2
  405. package/src/security/admission/ttl.ts +61 -61
  406. package/src/security/api-key-auth.ts +16 -4
  407. package/src/security/client-router-fingerprint.ts +4 -4
  408. package/src/security/credential-codec.ts +3 -3
  409. package/src/security/csrf.ts +2 -2
  410. package/src/security/ip-boundary.ts +16 -189
  411. package/src/security/model-access-rule.ts +1 -1
  412. package/src/security/outbound-headers.ts +18 -0
  413. package/src/shared/invoke-guard.ts +47 -0
  414. package/src/transport/contracts.ts +13 -4
  415. package/src/transport/dispatch/attempt-finalize.ts +1 -1
  416. package/src/transport/dispatch/capture-policy.ts +34 -37
  417. package/src/transport/dispatch/empty-stream.ts +23 -20
  418. package/src/transport/dispatch/generation.ts +25 -45
  419. package/src/transport/dispatch/native-shared.ts +127 -0
  420. package/src/transport/dispatch/proxy-request.ts +3 -1
  421. package/src/transport/dispatch/responses-compact.ts +25 -46
  422. package/src/transport/dispatch/streaming/encoder.ts +18 -72
  423. package/src/transport/dispatch/streaming/finalize.ts +2 -2
  424. package/src/transport/dispatch/streaming/stream.ts +7 -3
  425. package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
  426. package/src/transport/dispatch/systemone.ts +20 -48
  427. package/src/transport/dispatch/token-count.ts +41 -38
  428. package/src/transport/dispatch/websearch.ts +19 -45
  429. package/src/transport/drain-endpoint.ts +1 -1
  430. package/src/transport/failure-policy.ts +6 -0
  431. package/src/transport/guards/auth-guard.ts +0 -6
  432. package/src/transport/guards/body-policy.ts +3 -3
  433. package/src/transport/guards/headroom-guard.ts +1 -1
  434. package/src/transport/guards/pipeline.ts +1 -1
  435. package/src/transport/guards/request-context.ts +12 -17
  436. package/src/transport/request/preparer.ts +286 -7
  437. package/src/transport/request/rtk/compress-request.ts +3 -3
  438. package/src/transport/request/rtk/rtk-constants.ts +2 -2
  439. package/src/transport/request/rtk/rtk-filters.ts +8 -8
  440. package/src/transport/request/state.ts +1 -13
  441. package/src/transport/request/system-prompt-injection.ts +74 -11
  442. package/src/transport/request/tenant-preferences.ts +22 -0
  443. package/src/transport/routing/candidate-index.ts +2 -2
  444. package/src/transport/routing/round-robin.ts +1 -1
  445. package/src/transport/routing/route-catalog.ts +17 -18
  446. package/src/transport/routing/route-model.ts +126 -33
  447. package/src/transport/routing/router.ts +152 -37
  448. package/src/transport/shutdown-notice.ts +2 -2
  449. package/src/transport/surface/adapters.ts +3 -3
  450. package/src/transport/surface/chat/encode.ts +7 -7
  451. package/src/transport/surface/chat/parse.ts +7 -7
  452. package/src/transport/surface/completion.ts +2 -2
  453. package/src/transport/surface/content-parts.ts +1 -1
  454. package/src/transport/surface/dialects.ts +2 -2
  455. package/src/transport/surface/messages/parse.ts +3 -3
  456. package/src/transport/surface/responses/adapter.ts +1 -1
  457. package/src/transport/surface/responses/errors.ts +0 -9
  458. package/src/transport/vision-handoff-cache.ts +58 -0
  459. package/src/transport/vision-handoff.ts +376 -0
  460. package/src/workers/account-identity-sweep.ts +2 -2
  461. package/src/workers/buddy-growth-tasks.ts +392 -346
  462. package/src/workers/daily-checkin.ts +102 -49
  463. package/src/workers/maintenance-lease.ts +2 -35
  464. package/src/workers/oauth-refresh-sweep.ts +8 -1
  465. package/src/workers/quota-refresh-sweep.ts +120 -82
  466. package/src/workers/scheduler.ts +67 -4
  467. package/src/workers/sweep-runner.ts +24 -5
  468. package/src/workers/zcode-gift-claim.ts +108 -0
  469. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
  470. package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
  471. package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
  472. package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
  473. package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
  474. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
  475. package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
  476. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
  477. package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
  478. package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
  479. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
  480. package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
  481. package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
  482. package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
  483. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
  484. package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
  485. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
  486. package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
  487. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
  488. package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
  489. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
  490. package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
  491. package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
  492. package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
  493. package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
  494. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
  495. package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
  496. package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
  497. package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
  498. package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
  499. package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
  500. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
  501. package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
  502. package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
  503. package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
  504. package/dist/dashboard/assets/app-a159k0ub.css +0 -2
  505. package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
  506. package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
  507. package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
  508. package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
  509. package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
  510. package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
  511. package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
  512. package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
  513. package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
  514. package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
  515. package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
  516. package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
  517. package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
  518. package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
  519. package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
  520. package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
  521. package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
  522. package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
  523. package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
  524. package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
  525. package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
  526. package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
  527. package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
  528. package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
  529. package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
  530. package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
  531. package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
  532. package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
  533. package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
  534. package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
  535. package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
  536. package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
  537. package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
  538. package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
  539. package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
  540. package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
  541. package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
  542. package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
  543. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
  544. package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
  545. package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
  546. package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
  547. package/src/network/response-headers.ts +0 -39
  548. package/src/protocol/response/dsml.ts +0 -38
  549. package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
  550. /package/dist/dashboard/assets/{app-BayTTy01.js → app-Bgd3zANQ.js} +0 -0
  551. /package/dist/dashboard/assets/{app-BayTTy01.js.gz → app-Bgd3zANQ.js.gz} +0 -0
  552. /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
  553. /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
@@ -32,7 +32,7 @@ export interface ParamQuirk {
32
32
  }
33
33
 
34
34
  /** Per-wire output-token policy, in one table instead of per-builder branches. */
35
- export interface WireTokenBound {
35
+ interface WireTokenBound {
36
36
  /** Default when the caller sent no limit (undefined = leave absent). */
37
37
  readonly defaultMaxTokens?: number;
38
38
  /** Floor applied to any positive caller value below it (wire minimum). */
@@ -66,6 +66,13 @@ const DEFAULT_OUTPUT_TOKENS = 32_000;
66
66
  * Output-token bounds per wire family. Chat has no global ceiling: a model's
67
67
  * catalog output limit is the ceiling, and an unknown model passes the
68
68
  * caller's value through. Messages keeps its Anthropic floors and OAuth cap.
69
+ *
70
+ * The ceiling only ever comes from `options.maxOutputTokens` (the model's
71
+ * catalog output limit, supplied by the compatible adapter from
72
+ * `candidate.output_limit`). When it is omitted there is nothing to clamp to,
73
+ * which is intentional pass-through: a direct codec caller without a catalog
74
+ * limit is unbounded, and an unknown model passes the caller's value through by
75
+ * design — the bound table supplies floors/defaults, never an invented ceiling.
69
76
  */
70
77
  export const WIRE_TOKEN_BOUNDS: Readonly<Record<string, WireTokenBound>> = {
71
78
  chat: { minTokens: 16, defaultMaxTokens: DEFAULT_OUTPUT_TOKENS },
@@ -73,7 +80,14 @@ export const WIRE_TOKEN_BOUNDS: Readonly<Record<string, WireTokenBound>> = {
73
80
  responses: { minTokens: 16, defaultMaxTokens: DEFAULT_OUTPUT_TOKENS },
74
81
  };
75
82
 
76
- /** Resolves the output-token value for one wire from caller controls. */
83
+ /**
84
+ * Resolves the output-token value for one wire from caller controls.
85
+ *
86
+ * Clamping to a ceiling happens only when `options.maxOutputTokens` (the
87
+ * model's catalog limit) is present. An omitted `maxOutputTokens` means
88
+ * pass-through by design: a direct codec caller without a catalog limit is
89
+ * unbounded, and this function never fabricates a ceiling on its own.
90
+ */
77
91
  export function resolveWireMaxTokens(
78
92
  wire: string,
79
93
  controls: { max_tokens?: number | undefined },
@@ -120,7 +134,7 @@ function modelGeneration(modelId: string): { family: string; major: number; mino
120
134
  }
121
135
 
122
136
  /** True when the model rejects `temperature`/`top_p`/`top_k` at any thinking setting. */
123
- export function rejectsSamplingParams(modelId: string): boolean {
137
+ function rejectsSamplingParams(modelId: string): boolean {
124
138
  const generation = modelGeneration(modelId);
125
139
  if (generation === undefined) return false;
126
140
  // Opus turns strict at 4.7; the other families at 5.0.
@@ -157,7 +171,7 @@ const PARAM_QUIRKS: readonly ParamQuirk[] = [
157
171
  ];
158
172
 
159
173
  /** Finds the first quirk matching the provider/model pair, or undefined. */
160
- export function findParamQuirk(
174
+ function findParamQuirk(
161
175
  providerId: string,
162
176
  modelId: string,
163
177
  ): ParamQuirk | undefined {
@@ -5,7 +5,9 @@
5
5
  // so the native config (`thinking_type` + `budget_tokens`) is dropped while the
6
6
  // request-level effort intent (OpenAI `reasoning_effort`) survives — that field
7
7
  // is a property of the request, not of the turn.
8
- import type { CanonicalRequest, ReasoningIntent, WireFamily } from "../canonical-model";
8
+ import type { CanonicalRequest, ReasoningIntent } from "../canonical-model";
9
+ import type { ThinkingConfig } from "./dialect/thinking-ladder";
10
+ import { clampThinkingLevelForModel } from "./dialect/model-thinking";
9
11
 
10
12
  /**
11
13
  * Canonical reasoning effort ladder, ordered least to most intensive.
@@ -41,7 +43,7 @@ export type ThinkingSuffixIntent =
41
43
  * A parsed model name: the bare id the router and upstream must see, plus the
42
44
  * thinking level the caller asked for (or null when they asked for none).
43
45
  */
44
- export interface ParsedThinkingSuffix {
46
+ interface ParsedThinkingSuffix {
45
47
  readonly model: string;
46
48
  readonly intent: ThinkingSuffixIntent | null;
47
49
  }
@@ -200,248 +202,11 @@ export function withThinkingSuffixIntent(
200
202
  }
201
203
 
202
204
  /** Standard OpenAI Responses wire supported efforts (OpenAI, OpenCode, Azure). Responses API has no 'max' tier. */
203
- export const RESPONSES_WIRE_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
204
- "minimal",
205
- "low",
206
- "medium",
207
- "high",
208
- "xhigh",
209
- ];
210
-
211
- /** Full 6-tier effort scale for models that support 'max' (Claude, MiMo, Kimi, DeepSeek). */
212
- export const EXTENDED_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
213
- "minimal",
214
- "low",
215
- "medium",
216
- "high",
217
- "xhigh",
218
- "max",
219
- ];
220
-
221
- /** Standard 4-tier effort scale (Gemini, Qwen). */
222
- export const BASE_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
223
- "minimal",
224
- "low",
225
- "medium",
226
- "high",
227
- ];
228
-
229
- /**
230
- * The `mimo-v2.6` family rejects every effort outside this set.
231
- *
232
- * Verified live against OpenCode's `/zen/v1` on 2026-09-22: `minimal`, `xhigh`,
233
- * and `max` each answer `500 {"type":"error","error":{"message":"Internal server
234
- * error"}}` — an opaque failure that names nothing, so the caller sees a dead
235
- * request rather than a bad parameter — while `low`/`medium`/`high` and an
236
- * omitted field answer `200`. Its siblings on the very same endpoint
237
- * (`mimo-v2.5-free`, `nemotron-3-ultra-free`, `big-pickle`) accept the full
238
- * ladder, so this is a property of the model rather than of the route.
239
- *
240
- * Narrowing is the safe direction: every level here is accepted by all hosts of
241
- * the id, so the worst case for a host that would also take `xhigh` is that the
242
- * request runs one tier below what the caller asked for instead of failing.
243
- */
244
- const MIMO_V26_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = ["low", "medium", "high"];
245
-
246
- /**
247
- * Mercury (Inception Labs) — the chat ladder is `{instant, low, medium,
248
- * high}`: `minimal`, `xhigh`, and `max` each answer a 400
249
- * `reasoning_effort must be one of: 'instant', 'low', 'medium', 'high'`.
250
- * `instant` is not on the canonical ladder, so it can only appear here; the
251
- * clamp steps down to `high` for any higher request.
252
- */
253
- const INCEPTION_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
254
- "instant",
255
- "low",
256
- "medium",
257
- "high",
258
- ];
259
205
 
260
- /**
261
- * `low..max`: the OpenAI 5.6/6/daybreak generation and the new-gen Claude
262
- * adaptive models (`fable`/`mythos`/`opus-5`/`sonnet-5`/`opus-4-7`/`opus-4-8`)
263
- * all serve `max`, and none of them advertises `minimal`.
264
- */
265
- const LOW_TO_MAX_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
266
- "low",
267
- "medium",
268
- "high",
269
- "xhigh",
270
- "max",
271
- ];
272
-
273
- /** `gpt-5.5` rows: neither `minimal` nor `max`. */
274
- const GPT55_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
275
- "low",
276
- "medium",
277
- "high",
278
- "xhigh",
279
- ];
280
-
281
- /** Claude adaptive 4.6 pair: `low..high`, no `xhigh`/`max`. */
282
- const CLAUDE_ADAPTIVE_46_SUPPORTED_EFFORTS: readonly ReasoningEffortLevel[] = [
283
- "low",
284
- "medium",
285
- "high",
286
- ];
287
-
288
- /**
289
- * Resolves the valid reasoning effort levels for a given model and wire family.
290
- *
291
- * Priority order:
292
- * 1. Explicit model-declared `reasoningEfforts` from the catalog.
293
- * 2. Wire family constraint: the Responses wire API (`/v1/responses`) does not
294
- * support 'max' (capped at 'xhigh') unless the model's published ladder
295
- * includes it.
296
- * 3. Model family heuristics, matching each family's published ladder:
297
- * - Muse Spark (Meta on OpenCode / Fireworks): `["minimal", "low", "medium", "high", "xhigh"]`
298
- * - Gemini: `["minimal", "low", "medium", "high"]`
299
- * - Claude: per-generation — 4.6 adaptive stops at `high`, budget-era 4.5/4.1
300
- * tops out at `xhigh`, new-gen adaptive is `low..max`.
301
- * - DeepSeek, Kimi, MiMo: full extended ladder including 'max'
302
- * - Default: extended ladder.
303
- */
304
- export function resolveSupportedReasoningEfforts(
305
- modelId?: string,
306
- wireFamily?: WireFamily,
307
- declaredEfforts?: readonly string[],
308
- ): readonly ReasoningEffortLevel[] {
309
- if (declaredEfforts !== undefined && declaredEfforts.length > 0) {
310
- const filtered = declaredEfforts.filter((e): e is ReasoningEffortLevel =>
311
- REASONING_EFFORT_LADDER.includes(e as ReasoningEffortLevel),
312
- );
313
- if (filtered.length > 0) return filtered;
314
- }
315
-
316
- const id = (modelId ?? "").toLowerCase();
317
-
318
- if (wireFamily === "responses") {
319
- // Catalog ladders for the ChatGPT/OpenAI generations: `gpt-5.5`
320
- // is the one row that stops at `xhigh`.
321
- if (id.includes("gpt-5.5")) return GPT55_SUPPORTED_EFFORTS;
322
- if (id.includes("gpt-5.6") || id.includes("gpt-6") || id.includes("daybreak")) {
323
- return LOW_TO_MAX_SUPPORTED_EFFORTS;
324
- }
325
- return RESPONSES_WIRE_SUPPORTED_EFFORTS;
326
- }
327
-
328
- if (id.includes("muse")) {
329
- return RESPONSES_WIRE_SUPPORTED_EFFORTS;
330
- }
331
- if (id.includes("gemini")) {
332
- return BASE_SUPPORTED_EFFORTS;
333
- }
334
- // Checked before the generic default, which would hand this family `xhigh`
335
- // and `max` — both of which it answers with an opaque 500.
336
- if (id.includes("mimo-v2.6")) {
337
- return MIMO_V26_SUPPORTED_EFFORTS;
338
- }
339
- // Checked before the generic default: Mercury's chat endpoint answers every
340
- // effort outside {instant, low, medium, high} with a 400 that names the
341
- // field (recorded live from request 40b60777).
342
- if (id.includes("mercury") && wireFamily === "chat") {
343
- return INCEPTION_SUPPORTED_EFFORTS;
344
- }
345
- // Claude catalog ladders: `output_config.effort` rides the
346
- // Messages wire, so an out-of-ladder tier is an upstream rejection risk.
347
- // Dot-tolerant (`cb/claude-opus-4.6`) because gateway-prefixed ids keep the
348
- // upstream separator.
349
- if (id.includes("claude")) {
350
- const claudeId = id.replaceAll(".", "-");
351
- if (claudeId.includes("opus-4-6") || claudeId.includes("sonnet-4-6")) {
352
- return CLAUDE_ADAPTIVE_46_SUPPORTED_EFFORTS;
353
- }
354
- if (
355
- claudeId.includes("fable") ||
356
- claudeId.includes("mythos") ||
357
- claudeId.includes("opus-5") ||
358
- claudeId.includes("sonnet-5") ||
359
- claudeId.includes("opus-4-7") ||
360
- claudeId.includes("opus-4-8")
361
- ) {
362
- return LOW_TO_MAX_SUPPORTED_EFFORTS;
363
- }
364
- if (
365
- claudeId.includes("opus-4-5") ||
366
- claudeId.includes("sonnet-4-5") ||
367
- claudeId.includes("haiku-4-5") ||
368
- claudeId.includes("opus-4-1") ||
369
- claudeId.includes("opus-4-0") ||
370
- claudeId.includes("sonnet-4-0")
371
- ) {
372
- // Budget-mode rows: `minimal..xhigh`, no `max` — same shape as the
373
- // responses-wire default.
374
- return RESPONSES_WIRE_SUPPORTED_EFFORTS;
375
- }
376
- }
377
-
378
- return EXTENDED_SUPPORTED_EFFORTS;
379
- }
380
-
381
- /**
382
- * Whether a Claude model wants *adaptive* thinking (`thinking.type: "adaptive"`
383
- * + `output_config.effort`) or *budget* thinking (`thinking.type: "enabled"` +
384
- * `budget_tokens`).
385
- *
386
- * The two generations reject each other's shape: an adaptive-era model answers
387
- * a budget block with `thinking.budget_tokens: Extra inputs are not permitted`,
388
- * and a budget-era model answers an adaptive block with `adaptive thinking is
389
- * not supported on this model` (verified live against the Anthropic OAuth
390
- * route — opus-4-5/sonnet-4-5/haiku-4-5 400 on adaptive, while
391
- * opus-4-6+/sonnet-4-6+/5-series accept it).
392
- *
393
- * Adaptive era, per the reference catalog: Opus 4.6+, Sonnet 4.6+, and the
394
- * 5-series (fable/mythos/opus-5/sonnet-5). Everything older is budget era.
395
- * The rule is stated once here so the Messages codec and the effort ladder
396
- * cannot disagree about which generation a model belongs to.
397
- */
398
- export function claudeUsesAdaptiveThinking(modelId: string): boolean {
399
- const id = modelId.toLowerCase().replaceAll(".", "-");
400
- if (id.includes("fable") || id.includes("mythos")) return true;
401
- if (id.includes("opus-5") || id.includes("sonnet-5")) return true;
402
- if (id.includes("opus-4-6") || id.includes("sonnet-4-6")) return true;
403
- if (id.includes("opus-4-7") || id.includes("opus-4-8")) return true;
404
- return false;
405
- }
406
-
407
- /**
408
- * Clamps a requested reasoning effort against a target model/wire's supported ladder.
409
- *
410
- * If the requested effort is not in the supported list, it gracefully steps down to the
411
- * highest supported level that is less than or equal to the requested index in the canonical ladder.
412
- * Synonyms are normalized: 'ultra' -> 'max', 'off' -> 'none'.
413
- * Returns undefined for 'none' / unrequested.
414
- */
415
- export function clampReasoningEffort(
416
- requested: string | undefined,
417
- supported: readonly ReasoningEffortLevel[],
418
- ): ReasoningEffortLevel | undefined {
419
- if (!requested || typeof requested !== "string") return undefined;
420
- const raw = requested.toLowerCase().trim();
421
- const normalized = raw === "ultra" ? "max" : raw === "off" ? "none" : raw;
422
- if (normalized === "none") return undefined;
423
-
424
- const reqLevel = normalized as ReasoningEffortLevel;
425
- // Don't clamp if provider declares it supports the level but we haven't updated constants yet.
426
- // Fall through to direct return for any ladder member the caller asked for.
427
- if (supported.includes(reqLevel)) return reqLevel;
428
- // Unknown string → drop, don't invent a fallback.
429
- const requestedIndex = REASONING_EFFORT_LADDER.indexOf(reqLevel);
430
- if (requestedIndex === -1) return undefined;
431
-
432
- let clamped: ReasoningEffortLevel | undefined;
433
- for (const level of supported) {
434
- if (REASONING_EFFORT_LADDER.indexOf(level) > requestedIndex) break;
435
- clamped = level;
436
- }
437
- // No smaller supported level exists (caller asked below floor): use floor rather than max.
438
- return clamped ?? supported[0];
439
- }
440
206
 
441
- export interface ThinkingNormalizationOptions {
442
- readonly wireFamily?: WireFamily;
443
- readonly modelId?: string;
444
- readonly supportedEfforts?: readonly string[];
207
+ interface ThinkingNormalizationOptions {
208
+ /** Resolved thinking config (from `resolveThinkingForModel`). Absent = no clamp. */
209
+ readonly thinking?: ThinkingConfig;
445
210
  }
446
211
 
447
212
  /**
@@ -459,7 +224,7 @@ function isLastMessageFromUser(request: CanonicalRequest): boolean {
459
224
  * `thinking` config is also present, so a config drop must never leave them
460
225
  * orphaned.
461
226
  */
462
- export function hasReplayedThinkingBlocks(request: CanonicalRequest): boolean {
227
+ function hasReplayedThinkingBlocks(request: CanonicalRequest): boolean {
463
228
  for (const message of request.messages) {
464
229
  for (const part of message.content) {
465
230
  if (part.kind !== "reasoning") continue;
@@ -504,15 +269,10 @@ export function normalizeThinkingConfig(
504
269
  }
505
270
  }
506
271
 
507
- // Only clamp when caller actually set an effort AND provider declares a ladder.
508
- // If provider doesn't declare supportedEfforts, don't invent a 32k clamp — pass through.
509
- if (reasoning?.effort !== undefined && options?.supportedEfforts !== undefined && options.supportedEfforts.length > 0) {
510
- const supported = resolveSupportedReasoningEfforts(
511
- options?.modelId ?? request.model,
512
- options?.wireFamily,
513
- options?.supportedEfforts,
514
- );
515
- const clamped = clampReasoningEffort(reasoning.effort, supported);
272
+ // Only clamp when caller actually set an effort AND a thinking config is
273
+ // resolved (ladder known). Without one, don't invent a clamp — pass through.
274
+ if (reasoning?.effort !== undefined && options?.thinking !== undefined) {
275
+ const clamped = clampThinkingLevelForModel(options.thinking, reasoning.effort);
516
276
  if (clamped !== reasoning.effort) {
517
277
  reasoning = { ...reasoning };
518
278
  if (clamped === undefined) delete reasoning.effort;
@@ -9,7 +9,7 @@
9
9
  import type { CanonicalRequest } from "../canonical-model";
10
10
 
11
11
  /** Anthropic tool ID contract: alphanumerics, underscore, hyphen only. */
12
- export const TOOL_ID_PATTERN: RegExp = /^[a-zA-Z0-9_-]+$/;
12
+ const TOOL_ID_PATTERN: RegExp = /^[a-zA-Z0-9_-]+$/;
13
13
 
14
14
  const INVALID_TOOL_ID_CHARS = /[^a-zA-Z0-9_-]/g;
15
15
 
@@ -21,7 +21,7 @@ const INVALID_TOOL_ID_CHARS = /[^a-zA-Z0-9_-]/g;
21
21
  * input is not a non-empty string or nothing valid remains, so callers can
22
22
  * fall back to a deterministic generated ID.
23
23
  */
24
- export function sanitizeToolId(id: unknown): string | null {
24
+ function sanitizeToolId(id: unknown): string | null {
25
25
  if (typeof id !== "string" || id.length === 0) return null;
26
26
  const base = id.includes("|") ? (id.split("|")[0] ?? id) : id;
27
27
  const sanitized = base.replace(INVALID_TOOL_ID_CHARS, "");
@@ -33,7 +33,7 @@ export function sanitizeToolId(id: unknown): string | null {
33
33
  * identical histories produce byte-identical requests — cache-friendly and
34
34
  * directly testable.
35
35
  */
36
- export function generateToolCallId(msgIndex = 0, tcIndex = 0, toolName?: string): string {
36
+ function generateToolCallId(msgIndex = 0, tcIndex = 0, toolName?: string): string {
37
37
  const name = toolName ? `_${toolName.replace(INVALID_TOOL_ID_CHARS, "")}` : "";
38
38
  return `call_msg${msgIndex}_tc${tcIndex}${name}`;
39
39
  }
@@ -211,7 +211,7 @@ function toolCallIdsIn(message: CanonicalMessage): string[] {
211
211
  * and is repaired by synthesizing a result (`repairMissingToolResponses`), not
212
212
  * by deleting the call — the model should see that the tool was interrupted.
213
213
  */
214
- export function dropOrphanToolResults(
214
+ function dropOrphanToolResults(
215
215
  messages: readonly CanonicalMessage[],
216
216
  ): CanonicalMessage[] {
217
217
  const callIds = new Set<string>();
@@ -1,6 +1,10 @@
1
1
  /**
2
2
  * Shared upstream JSON executor for [OpenAI]-compatible adapters: POSTs a payload
3
3
  * with deadline/abort wiring and returns the response plus a release hook.
4
+ *
5
+ * `bodyEncoder` lets a provider send the same body with non-JSON encoding
6
+ * (e.g. zstd, which the Grok Build CLI does). When omitted, the JSON string is
7
+ * sent as-is.
4
8
  */
5
9
  import type { ProviderDispatchContext, ValidatedOutboundFetch } from "../../providers/provider-contracts";
6
10
  import { abortGatewayError, createUpstreamDeadlineLifecycle } from "../../providers/operations/upstream-deadline";
@@ -11,13 +15,14 @@ export async function postUpstreamJson(
11
15
  payload: Record<string, unknown>,
12
16
  context: ProviderDispatchContext,
13
17
  outboundFetch: ValidatedOutboundFetch,
18
+ bodyEncoder?: (payload: Record<string, unknown>) => string | Uint8Array<ArrayBuffer>,
14
19
  ): Promise<{ res: Response; signal: AbortSignal; release: () => void }> {
15
20
  const lifecycle = createUpstreamDeadlineLifecycle(context);
16
21
  try {
17
22
  const res = await outboundFetch(fetchUrl, {
18
23
  method: "POST",
19
24
  headers,
20
- body: JSON.stringify(payload),
25
+ body: bodyEncoder ? bodyEncoder(payload) : JSON.stringify(payload),
21
26
  signal: lifecycle.signal,
22
27
  });
23
28
  return {
@@ -13,6 +13,9 @@ import {
13
13
  import { applyRouteUserAgent, type ProviderDispatchTarget, type ProviderId, type ProviderDispatchContext } from "../provider-contracts";
14
14
  import { BaseProviderAdapter } from "./base-adapter";
15
15
  import { encodeWireRequest, decodeWireResponse, decodeWireStream } from "../../protocol/registry";
16
+ import { resolveDialect } from "../../protocol/translation/dialect/resolver";
17
+ import { resolveThinkingForModel } from "../../protocol/translation/dialect/thinking-ladder";
18
+ import type { DialectPolicy } from "../../protocol/translation/dialect/types";
16
19
  import { postUpstreamJson } from "../../protocol/upstream/post-json";
17
20
  import { GATEWAY_USER_AGENT } from "../operations/gateway-user-agent";
18
21
  import { resolvePromptCacheKey } from "../operations/session-resolution";
@@ -89,6 +92,14 @@ export interface OpenAICompatibleAdapterConfig {
89
92
  * this is the enforcement boundary, not account-creation validation.
90
93
  */
91
94
  readonly credential_forwarding?: "account" | "never";
95
+ /**
96
+ * Body encoding for the upstream POST. `"json"` (default) sends the plain
97
+ * JSON string. `"zstd"` compresses the JSON with `Bun.zstdCompressSync` and
98
+ * stamps `Content-Encoding: zstd` — the Grok Build CLI does this via its
99
+ * sampler (`request_compression.rs`), and the proxy accepts it (verified
100
+ * live 2026-11-02). Falls back to plain JSON if the runtime lacks zstd.
101
+ */
102
+ readonly request_compression?: "json" | "zstd";
92
103
  /**
93
104
  * Stamps `user-agent: Cartethyia/<version>` on every dispatch. Explicit
94
105
  * opt-in per provider spec — never a default — so first-party cloaking
@@ -188,6 +199,10 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
188
199
  // serving the stale pinned fallback on the first dispatch.
189
200
  Object.assign(headers, await this.config.buildExtraHeaders(context, request, candidate));
190
201
  }
202
+ // The compression header must match the body actually sent. It is stamped
203
+ // here — alongside the other request headers — so auth/proxy layers see the
204
+ // final shape before the transport runs.
205
+ if (this.config.request_compression === "zstd") headers["content-encoding"] = "zstd";
191
206
  Object.assign(headers, filterProviderCustomHeaders(context.credential.custom_headers));
192
207
  applyRouteUserAgent(headers, context.credential, context.user_agent);
193
208
  return headers;
@@ -201,6 +216,17 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
201
216
  const wireFamily = candidate.wire_family;
202
217
  const effectiveRequest = this.config.prepareRequest?.(request) ?? request;
203
218
  const promptCacheKey = resolvePromptCacheKey(effectiveRequest, context);
219
+ const dialectPolicy: DialectPolicy = resolveDialect(
220
+ candidate.model_id,
221
+ candidate.provider_id,
222
+ wireFamily,
223
+ candidate.dialect,
224
+ );
225
+ const thinking = resolveThinkingForModel(
226
+ candidate.model_id,
227
+ candidate.provider_id,
228
+ wireFamily,
229
+ );
204
230
  const payload = await encodeWireRequest(wireFamily, effectiveRequest, {
205
231
  supportsPromptCaching: this.config.supports_prompt_caching !== false,
206
232
  ...(promptCacheKey === undefined ? {} : { promptCacheKey }),
@@ -211,6 +237,8 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
211
237
  ...(context.image_clamp_max_bytes === undefined
212
238
  ? {}
213
239
  : { maxBytesOverride: context.image_clamp_max_bytes }),
240
+ dialectPolicy,
241
+ thinking,
214
242
  });
215
243
  if (
216
244
  wireFamily !== "messages" &&
@@ -283,6 +311,11 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
283
311
  payload as Record<string, unknown>,
284
312
  context,
285
313
  outboundFetch,
314
+ // zstd body encoding: matches the Grok Build CLI's
315
+ // `request_compression` (zstd with a JSON fallback when unavailable).
316
+ this.config.request_compression === "zstd" && typeof Bun?.zstdCompressSync === "function"
317
+ ? (p) => Bun.zstdCompressSync(Buffer.from(JSON.stringify(p))) as Uint8Array<ArrayBuffer>
318
+ : undefined,
286
319
  );
287
320
  upstream.release();
288
321
  return upstream.res;
@@ -300,8 +333,11 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
300
333
  * the caller (the route handler validates only the trust boundary), so this
301
334
  * method only stamps headers and posts.
302
335
  *
303
- * `systemone` is kept as a named alias because the `/v1/systemone` route
304
- * reads it directly; both names are the same behavior.
336
+ * `systemone` is kept as a named alias because both names are live: the
337
+ * transport dispatch handler for `POST /v1/systemone`
338
+ * (transport/dispatch/systemone.ts) and the discovery probing service
339
+ * (discovery/probing-service.ts) read it directly; both names are the same
340
+ * behavior.
305
341
  */
306
342
  async dispatchNativeService(
307
343
  body: Record<string, unknown>,
@@ -356,7 +392,10 @@ export class OpenAICompatibleAdapter extends BaseProviderAdapter {
356
392
  "upstream",
357
393
  );
358
394
  }
359
- yield* decodeWireStream(wireFamily, res.body, request, { signal: context.abort_signal });
395
+ yield* decodeWireStream(wireFamily, res.body, request, {
396
+ signal: context.abort_signal,
397
+ dialectPolicy: resolveDialect(candidate.model_id, candidate.provider_id, wireFamily, candidate.dialect),
398
+ });
360
399
  } else {
361
400
  // A streaming request answered with a non-SSE body is a provider
362
401
  // protocol violation, and the body is often an error envelope or a
@@ -340,11 +340,6 @@ export function jwksVerifierFor(
340
340
  return verifier;
341
341
  }
342
342
 
343
- /** Test hook: forgets cached JWKS verifiers. */
344
- export function resetJwksVerifiersForTests(): void {
345
- jwksVerifiers.clear();
346
- }
347
-
348
343
  interface IssuedTokenValidation {
349
344
  readonly jwksUrl?: string;
350
345
  readonly issuer?: string | readonly string[];