cartethyia 2.4.6 → 2.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (303) hide show
  1. package/README.md +45 -13
  2. package/dist/dashboard/assets/BannedPage-ChqnTRpZ.js +1 -0
  3. package/dist/dashboard/assets/BannedPage-ChqnTRpZ.js.gz +0 -0
  4. package/dist/dashboard/assets/{CliToolDetailPage-Bcy150Jo.js → CliToolDetailPage-Bb9CNuoh.js} +1 -1
  5. package/dist/dashboard/assets/CliToolDetailPage-Bb9CNuoh.js.gz +0 -0
  6. package/dist/dashboard/assets/{CliToolsPage-DyNXefph.js → CliToolsPage-BXUaRCQQ.js} +1 -1
  7. package/dist/dashboard/assets/CliToolsPage-BXUaRCQQ.js.gz +0 -0
  8. package/dist/dashboard/assets/CombosPage-CisNZOUt.js +1 -0
  9. package/dist/dashboard/assets/CombosPage-CisNZOUt.js.gz +0 -0
  10. package/dist/dashboard/assets/{ConsoleLogPage-CATpAEOz.js → ConsoleLogPage-BOpI_LOH.js} +1 -1
  11. package/dist/dashboard/assets/ConsoleLogPage-BOpI_LOH.js.gz +0 -0
  12. package/dist/dashboard/assets/{CustomizationPage-D6jEU7nL.js → CustomizationPage-DAkdvJ4k.js} +1 -1
  13. package/dist/dashboard/assets/CustomizationPage-DAkdvJ4k.js.gz +0 -0
  14. package/dist/dashboard/assets/{HealthEventsModal-CZkpn0a7.js → HealthEventsModal-DeT-VXHd.js} +1 -1
  15. package/dist/dashboard/assets/HealthEventsModal-DeT-VXHd.js.gz +0 -0
  16. package/dist/dashboard/assets/{LoginPage-BJlMVN4U.js → LoginPage-CytxSeGP.js} +1 -1
  17. package/dist/dashboard/assets/LoginPage-CytxSeGP.js.gz +0 -0
  18. package/dist/dashboard/assets/{ModelPicker-Br3CXEau.js → ModelPicker-oQ-SDXp8.js} +1 -1
  19. package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js.gz +0 -0
  20. package/dist/dashboard/assets/OverviewPage-CU7S1wJs.js +1 -0
  21. package/dist/dashboard/assets/OverviewPage-CU7S1wJs.js.gz +0 -0
  22. package/dist/dashboard/assets/ProviderDetailPage-DLm2baot.js +3 -0
  23. package/dist/dashboard/assets/ProviderDetailPage-DLm2baot.js.gz +0 -0
  24. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +1 -0
  25. package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
  26. package/dist/dashboard/assets/ProvidersPage-DOXfuzfL.js +1 -0
  27. package/dist/dashboard/assets/ProvidersPage-DOXfuzfL.js.gz +0 -0
  28. package/dist/dashboard/assets/ProxyPage-wvk0ciQN.js +7 -0
  29. package/dist/dashboard/assets/ProxyPage-wvk0ciQN.js.gz +0 -0
  30. package/dist/dashboard/assets/QuotaPage-Cn_fcUHE.js +1 -0
  31. package/dist/dashboard/assets/QuotaPage-Cn_fcUHE.js.gz +0 -0
  32. package/dist/dashboard/assets/{SettingsPage-BHW4Zt06.js → SettingsPage-8-eVadhc.js} +1 -1
  33. package/dist/dashboard/assets/SettingsPage-8-eVadhc.js.gz +0 -0
  34. package/dist/dashboard/assets/{SetupPage-VOYC_lIa.js → SetupPage-uEIXPyGO.js} +1 -1
  35. package/dist/dashboard/assets/SetupPage-uEIXPyGO.js.gz +0 -0
  36. package/dist/dashboard/assets/SortableList-DCY0TPTZ.js +1 -0
  37. package/dist/dashboard/assets/SortableList-DCY0TPTZ.js.gz +0 -0
  38. package/dist/dashboard/assets/{StudioPage-BNIDLiU6.js → StudioPage-DqK5E26W.js} +4 -4
  39. package/dist/dashboard/assets/StudioPage-DqK5E26W.js.gz +0 -0
  40. package/dist/dashboard/assets/UsagePage-38JfiZ0H.js +56 -0
  41. package/dist/dashboard/assets/UsagePage-38JfiZ0H.js.gz +0 -0
  42. package/dist/dashboard/assets/{api-keys-BETfaMYZ.js → api-keys-BmDbsior.js} +1 -1
  43. package/dist/dashboard/assets/api-keys-BmDbsior.js.gz +0 -0
  44. package/dist/dashboard/assets/app-BbpSarVV.css +2 -0
  45. package/dist/dashboard/assets/app-BbpSarVV.css.gz +0 -0
  46. package/dist/dashboard/assets/assert-BHfaei-X.js +1 -0
  47. package/dist/dashboard/assets/assert-BHfaei-X.js.gz +0 -0
  48. package/dist/dashboard/assets/{badge-BTyGk_DL.js → badge-DpXT4Ixt.js} +1 -1
  49. package/dist/dashboard/assets/badge-DpXT4Ixt.js.gz +0 -0
  50. package/dist/dashboard/assets/{banner-bujTWYM4.js → banner-CSAAWLJv.js} +1 -1
  51. package/dist/dashboard/assets/banner-CSAAWLJv.js.gz +0 -0
  52. package/dist/dashboard/assets/{card-B0Bnx5CA.js → card-DEhRXXw4.js} +1 -1
  53. package/dist/dashboard/assets/card-DEhRXXw4.js.gz +0 -0
  54. package/dist/dashboard/assets/{cli-tools-DE2ug812.js → cli-tools-B0wBq-RL.js} +1 -1
  55. package/dist/dashboard/assets/cli-tools-B0wBq-RL.js.gz +0 -0
  56. package/dist/dashboard/assets/{clipboard-button-R_rArH8S.js → clipboard-button-DOo6EU8O.js} +1 -1
  57. package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js.gz +0 -0
  58. package/dist/dashboard/assets/{dialog-BWIP_EvW.js → dialog-BvQeBMfP.js} +1 -1
  59. package/dist/dashboard/assets/dialog-BvQeBMfP.js.gz +0 -0
  60. package/dist/dashboard/assets/{drawer-BKcgVugF.js → drawer-CMwPXwQB.js} +1 -1
  61. package/dist/dashboard/assets/drawer-CMwPXwQB.js.gz +0 -0
  62. package/dist/dashboard/assets/entry--yj84zk3.js +4 -0
  63. package/dist/dashboard/assets/entry--yj84zk3.js.gz +0 -0
  64. package/dist/dashboard/assets/{entry-CcWkGR4a.js → entry-D4O2229X.js} +1 -1
  65. package/dist/dashboard/assets/{entry-CcWkGR4a.js.gz → entry-D4O2229X.js.gz} +0 -0
  66. package/dist/dashboard/assets/{entry-kTiTFrvh.js → entry-DKvr5Q9K.js} +1 -1
  67. package/dist/dashboard/assets/entry-DKvr5Q9K.js.gz +0 -0
  68. package/dist/dashboard/assets/{github-badge-Booc5mNe.js → github-badge-zliLvBwr.js} +1 -1
  69. package/dist/dashboard/assets/github-badge-zliLvBwr.js.gz +0 -0
  70. package/dist/dashboard/assets/{index-D70pChfn.js → index-CcD1eSJ6.js} +2 -2
  71. package/dist/dashboard/assets/index-CcD1eSJ6.js.gz +0 -0
  72. package/dist/dashboard/assets/{inline-D1TCqM2D.js → inline-D1IlZZ8H.js} +1 -1
  73. package/dist/dashboard/assets/inline-D1IlZZ8H.js.gz +0 -0
  74. package/dist/dashboard/assets/{input-B9oyU93y.js → input-BpVZdrbc.js} +1 -1
  75. package/dist/dashboard/assets/input-BpVZdrbc.js.gz +0 -0
  76. package/dist/dashboard/assets/{layout-BArzXirQ.js → layout-BioLW7gN.js} +1 -1
  77. package/dist/dashboard/assets/layout-BioLW7gN.js.gz +0 -0
  78. package/dist/dashboard/assets/{list-row-BVZzaoHF.js → list-row-CwVcGAIc.js} +1 -1
  79. package/dist/dashboard/assets/list-row-CwVcGAIc.js.gz +0 -0
  80. package/dist/dashboard/assets/{live-EmuIayqp.js → live-yfEJFF9T.js} +1 -1
  81. package/dist/dashboard/assets/live-yfEJFF9T.js.gz +0 -0
  82. package/dist/dashboard/assets/{model-bans-CSPQ9xB0.js → model-bans-CT-TxSNX.js} +1 -1
  83. package/dist/dashboard/assets/model-bans-CT-TxSNX.js.gz +0 -0
  84. package/dist/dashboard/assets/providers/cursor.webp +0 -0
  85. package/dist/dashboard/assets/providers/trae.webp +0 -0
  86. package/dist/dashboard/assets/{routing-BExgxxBU.js → routing-Cs6jl49L.js} +1 -1
  87. package/dist/dashboard/assets/routing-Cs6jl49L.js.gz +0 -0
  88. package/dist/dashboard/assets/select-XPJ-dIw3.js +41 -0
  89. package/dist/dashboard/assets/select-XPJ-dIw3.js.gz +0 -0
  90. package/dist/dashboard/assets/settings-CfcTcOyU.js +1 -0
  91. package/dist/dashboard/assets/settings-CfcTcOyU.js.gz +0 -0
  92. package/dist/dashboard/assets/{stack-Ca5HxI5i.js → stack-C9_uUjaA.js} +1 -1
  93. package/dist/dashboard/assets/stack-C9_uUjaA.js.gz +0 -0
  94. package/dist/dashboard/assets/{state-CzUPfLXo.js → state-DA0B95UQ.js} +1 -1
  95. package/dist/dashboard/assets/state-DA0B95UQ.js.gz +0 -0
  96. package/dist/dashboard/assets/{switch-DOUIky_i.js → switch-Cittxy-x.js} +1 -1
  97. package/dist/dashboard/assets/switch-Cittxy-x.js.gz +0 -0
  98. package/dist/dashboard/assets/{toast-C76WrMhc.js → toast-CNt_jzO4.js} +1 -1
  99. package/dist/dashboard/assets/toast-CNt_jzO4.js.gz +0 -0
  100. package/dist/dashboard/assets/{useMutation-D87FZwH0.js → useMutation-BQKMcJ1H.js} +1 -1
  101. package/dist/dashboard/assets/useMutation-BQKMcJ1H.js.gz +0 -0
  102. package/dist/dashboard/index.html +1 -1
  103. package/dist/dashboard/index.html.gz +0 -0
  104. package/dist/dashboard/precompressed-assets.json +51 -52
  105. package/migrations/full-postgres/0015_add_payload_stages.sql +18 -0
  106. package/migrations/full-postgres/0016_add_share_link_slug.sql +20 -0
  107. package/migrations/full-postgres/0017_add_models_pro_only.sql +18 -0
  108. package/migrations/full-postgres/0018_add_accounts_quota_plan.sql +18 -0
  109. package/migrations/full-postgres/0019_add_models_free_tier.sql +15 -0
  110. package/migrations/lite-sqlite3/0015_add_payload_stages.sql +18 -0
  111. package/migrations/lite-sqlite3/0016_add_share_link_slug.sql +20 -0
  112. package/migrations/lite-sqlite3/0017_add_models_pro_only.sql +18 -0
  113. package/migrations/lite-sqlite3/0018_add_accounts_quota_plan.sql +18 -0
  114. package/migrations/lite-sqlite3/0019_add_models_free_tier.sql +15 -0
  115. package/package.json +3 -2
  116. package/scripts/cli/command/console-menu.ts +30 -11
  117. package/scripts/cli/command/start.ts +77 -13
  118. package/scripts/cli/command/tray.ts +47 -8
  119. package/scripts/cli/command/update.ts +1 -1
  120. package/scripts/cli/gateway/instance-lock.ts +105 -0
  121. package/scripts/cli/gateway/spawn.ts +173 -101
  122. package/scripts/cli/ui/background.ts +110 -49
  123. package/src/boot/app.ts +20 -6
  124. package/src/boot/dependencies.ts +19 -0
  125. package/src/boot/elysia-typebox-bridge.ts +37 -0
  126. package/src/boot/lifecycle.ts +2 -0
  127. package/src/config/cooldowns.ts +138 -138
  128. package/src/config/providers.ts +5 -5
  129. package/src/config/runtime.ts +19 -3
  130. package/src/config/spec.ts +9 -0
  131. package/src/console/api-keys/contracts.ts +414 -391
  132. package/src/console/api-keys/routes.ts +880 -870
  133. package/src/console/auth/account-reset-store.ts +14 -0
  134. package/src/console/auth/account-reset.ts +3 -2
  135. package/src/console/auth/setup-service.ts +6 -3
  136. package/src/console/domain-registration.ts +9 -2
  137. package/src/console/observability/contracts.ts +475 -455
  138. package/src/console/observability/store.ts +1015 -952
  139. package/src/console/providers/catalog/contracts.ts +31 -0
  140. package/src/console/providers/catalog/provider-operations.ts +8 -0
  141. package/src/console/providers/catalog/store.ts +1532 -1525
  142. package/src/console/providers/oauth/callback-listener.ts +18 -3
  143. package/src/console/providers/oauth/routes.ts +38 -15
  144. package/src/console/quota/refresh.ts +19 -0
  145. package/src/console/updates/routes.ts +162 -4
  146. package/src/main.ts +3 -0
  147. package/src/network/http2-bidi.ts +85 -0
  148. package/src/network/outbound-fetch.ts +1 -26
  149. package/src/network/pool/agent.ts +478 -460
  150. package/src/network/pool/resolver.ts +1104 -544
  151. package/src/network/pool-health-machine.ts +12 -5
  152. package/src/observability/payload-capture.ts +344 -324
  153. package/src/persistence/db-pg.ts +9 -3
  154. package/src/persistence/db-sqlite.ts +497 -495
  155. package/src/persistence/health-event-flush.ts +137 -0
  156. package/src/persistence/migrate.ts +181 -129
  157. package/src/persistence/schema.ts +1360 -1295
  158. package/src/persistence/settings-revision.ts +25 -0
  159. package/src/persistence/shared-cache.ts +217 -0
  160. package/src/persistence/stores/share-store.ts +556 -528
  161. package/src/persistence/usage-flush.ts +61 -1
  162. package/src/protocol/canonical-model.ts +23 -1
  163. package/src/protocol/response/chat.ts +143 -10
  164. package/src/protocol/response/omp-tool-call-markup.ts +221 -0
  165. package/src/providers/default-registry.ts +173 -1
  166. package/src/providers/discovery/openai-model-discovery.ts +39 -3
  167. package/src/providers/discovery/openrouter-free-roster.ts +98 -0
  168. package/src/providers/discovery/probing-service.ts +1022 -1001
  169. package/src/providers/integrations/buddy/buddy-catalog-shared.ts +39 -0
  170. package/src/providers/integrations/buddy/buddy-chat-shared.ts +913 -914
  171. package/src/providers/integrations/buddy/buddy-conversation-headers.ts +18 -5
  172. package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +4 -0
  173. package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -175
  174. package/src/providers/integrations/buddy/codebuddy/shared.ts +15 -6
  175. package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -204
  176. package/src/providers/integrations/buddy/workbuddy/shared.ts +3 -3
  177. package/src/providers/integrations/claude/claude.ts +606 -582
  178. package/src/providers/integrations/cline/cline-quota.ts +18 -16
  179. package/src/providers/integrations/cline/cline.ts +539 -468
  180. package/src/providers/integrations/commandcode/commandcode.ts +675 -541
  181. package/src/providers/integrations/commandcode/discovery.ts +116 -0
  182. package/src/providers/integrations/commandcode/quota.ts +160 -0
  183. package/src/providers/integrations/cursor/cursor-auth.ts +418 -0
  184. package/src/providers/integrations/cursor/cursor-catalog.ts +368 -0
  185. package/src/providers/integrations/cursor/cursor-http2.ts +300 -0
  186. package/src/providers/integrations/cursor/cursor-identity.ts +92 -0
  187. package/src/providers/integrations/cursor/cursor-request.ts +471 -0
  188. package/src/providers/integrations/cursor/cursor-session-manager.ts +281 -0
  189. package/src/providers/integrations/cursor/cursor-shared.ts +108 -0
  190. package/src/providers/integrations/cursor/cursor.ts +960 -0
  191. package/src/providers/integrations/cursor/protocol/framing.ts +129 -0
  192. package/src/providers/integrations/cursor/protocol/messages.ts +2355 -0
  193. package/src/providers/integrations/cursor/protocol/struct.ts +305 -0
  194. package/src/providers/integrations/github/github.ts +4 -4
  195. package/src/providers/integrations/hermes.ts +79 -8
  196. package/src/providers/integrations/kilo/kilo-discovery.ts +10 -1
  197. package/src/providers/integrations/kilo/kilo.ts +153 -146
  198. package/src/providers/integrations/opencode/provider.ts +532 -538
  199. package/src/providers/integrations/openrouter/provider.ts +139 -281
  200. package/src/providers/integrations/qoder/qoder-catalog.ts +450 -0
  201. package/src/providers/integrations/qoder/qoder-oauth.ts +310 -257
  202. package/src/providers/integrations/qoder/qoder-realm.ts +106 -0
  203. package/src/providers/integrations/qoder/qoder-virtual.ts +77 -0
  204. package/src/providers/integrations/qoder/qoder.ts +865 -730
  205. package/src/providers/integrations/trae/trae-catalog.ts +190 -0
  206. package/src/providers/integrations/trae/trae-headers.ts +149 -0
  207. package/src/providers/integrations/trae/trae-oauth.ts +773 -0
  208. package/src/providers/integrations/trae/trae-protocol.ts +400 -0
  209. package/src/providers/integrations/trae/trae-realm.ts +220 -0
  210. package/src/providers/integrations/trae/trae.ts +458 -0
  211. package/src/providers/operations/account-health-service.ts +107 -10
  212. package/src/providers/operations/client-versions.ts +133 -6
  213. package/src/providers/operations/provider-catalog-seeder.ts +95 -86
  214. package/src/providers/operations/provider-credential-service.ts +46 -7
  215. package/src/providers/provider-contracts.ts +76 -0
  216. package/src/providers/provider-metadata.ts +78 -6
  217. package/src/providers/provider-model-definition.ts +373 -349
  218. package/src/security/api-key-auth.ts +126 -8
  219. package/src/transport/contracts.ts +3 -0
  220. package/src/transport/dispatch/attempt-finalize.ts +32 -1
  221. package/src/transport/dispatch/attempt-loop.ts +530 -515
  222. package/src/transport/dispatch/generation.ts +88 -21
  223. package/src/transport/dispatch/leases.ts +99 -2
  224. package/src/transport/dispatch/proxy-request.ts +60 -3
  225. package/src/transport/dispatch/streaming/finalize.ts +16 -1
  226. package/src/transport/dispatch/streaming/stream.ts +22 -2
  227. package/src/transport/dispatch/upstream.ts +19 -1
  228. package/src/transport/guards/auth-guard.ts +26 -1
  229. package/src/transport/guards/body-policy.ts +5 -4
  230. package/src/transport/request/preparer.ts +103 -0
  231. package/src/transport/request/state.ts +14 -0
  232. package/src/transport/routing/plan-gate.ts +45 -0
  233. package/src/transport/routing/route-catalog.ts +799 -777
  234. package/src/transport/routing/route-model.ts +52 -1
  235. package/src/transport/routing/router.ts +51 -0
  236. package/dist/dashboard/assets/BannedPage-QhvbJB9o.js +0 -1
  237. package/dist/dashboard/assets/BannedPage-QhvbJB9o.js.gz +0 -0
  238. package/dist/dashboard/assets/CliToolDetailPage-Bcy150Jo.js.gz +0 -0
  239. package/dist/dashboard/assets/CliToolsPage-DyNXefph.js.gz +0 -0
  240. package/dist/dashboard/assets/CombosPage-Cak0ljnO.js +0 -1
  241. package/dist/dashboard/assets/CombosPage-Cak0ljnO.js.gz +0 -0
  242. package/dist/dashboard/assets/ConsoleLogPage-CATpAEOz.js.gz +0 -0
  243. package/dist/dashboard/assets/CustomizationPage-D6jEU7nL.js.gz +0 -0
  244. package/dist/dashboard/assets/HealthEventsModal-CZkpn0a7.js.gz +0 -0
  245. package/dist/dashboard/assets/LoginPage-BJlMVN4U.js.gz +0 -0
  246. package/dist/dashboard/assets/ModelPicker-Br3CXEau.js.gz +0 -0
  247. package/dist/dashboard/assets/OverviewPage-CQxXbo2g.js +0 -1
  248. package/dist/dashboard/assets/OverviewPage-CQxXbo2g.js.gz +0 -0
  249. package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js +0 -3
  250. package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js.gz +0 -0
  251. package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +0 -1
  252. package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js.gz +0 -0
  253. package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js +0 -1
  254. package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js.gz +0 -0
  255. package/dist/dashboard/assets/ProxyPage-CXiumA53.js +0 -7
  256. package/dist/dashboard/assets/ProxyPage-CXiumA53.js.gz +0 -0
  257. package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js +0 -1
  258. package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js.gz +0 -0
  259. package/dist/dashboard/assets/SettingsPage-BHW4Zt06.js.gz +0 -0
  260. package/dist/dashboard/assets/SetupPage-VOYC_lIa.js.gz +0 -0
  261. package/dist/dashboard/assets/SortableList-DpOTnGuH.js +0 -1
  262. package/dist/dashboard/assets/SortableList-DpOTnGuH.js.gz +0 -0
  263. package/dist/dashboard/assets/StudioPage-BNIDLiU6.js.gz +0 -0
  264. package/dist/dashboard/assets/UsagePage-BAFaSDQV.js +0 -56
  265. package/dist/dashboard/assets/UsagePage-BAFaSDQV.js.gz +0 -0
  266. package/dist/dashboard/assets/api-keys-BETfaMYZ.js.gz +0 -0
  267. package/dist/dashboard/assets/app-BLCvGdzb.css +0 -2
  268. package/dist/dashboard/assets/app-BLCvGdzb.css.gz +0 -0
  269. package/dist/dashboard/assets/assert-7J6_LVD3.js +0 -1
  270. package/dist/dashboard/assets/assert-7J6_LVD3.js.gz +0 -0
  271. package/dist/dashboard/assets/badge-BTyGk_DL.js.gz +0 -0
  272. package/dist/dashboard/assets/banner-bujTWYM4.js.gz +0 -0
  273. package/dist/dashboard/assets/card-B0Bnx5CA.js.gz +0 -0
  274. package/dist/dashboard/assets/cli-tools-DE2ug812.js.gz +0 -0
  275. package/dist/dashboard/assets/clipboard-button-R_rArH8S.js.gz +0 -0
  276. package/dist/dashboard/assets/dialog-BWIP_EvW.js.gz +0 -0
  277. package/dist/dashboard/assets/drawer-BKcgVugF.js.gz +0 -0
  278. package/dist/dashboard/assets/entry-7dpgvpJ3.js +0 -4
  279. package/dist/dashboard/assets/entry-7dpgvpJ3.js.gz +0 -0
  280. package/dist/dashboard/assets/entry-kTiTFrvh.js.gz +0 -0
  281. package/dist/dashboard/assets/github-badge-Booc5mNe.js.gz +0 -0
  282. package/dist/dashboard/assets/index-D70pChfn.js.gz +0 -0
  283. package/dist/dashboard/assets/inline-D1TCqM2D.js.gz +0 -0
  284. package/dist/dashboard/assets/input-B9oyU93y.js.gz +0 -0
  285. package/dist/dashboard/assets/layout-BArzXirQ.js.gz +0 -0
  286. package/dist/dashboard/assets/list-row-BVZzaoHF.js.gz +0 -0
  287. package/dist/dashboard/assets/live-EmuIayqp.js.gz +0 -0
  288. package/dist/dashboard/assets/model-bans-CSPQ9xB0.js.gz +0 -0
  289. package/dist/dashboard/assets/routing-BExgxxBU.js.gz +0 -0
  290. package/dist/dashboard/assets/select-C9mMoEpJ.js +0 -41
  291. package/dist/dashboard/assets/select-C9mMoEpJ.js.gz +0 -0
  292. package/dist/dashboard/assets/settings-C4_Gn_wq.js +0 -1
  293. package/dist/dashboard/assets/settings-C4_Gn_wq.js.gz +0 -0
  294. package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +0 -1
  295. package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js.gz +0 -0
  296. package/dist/dashboard/assets/stack-Ca5HxI5i.js.gz +0 -0
  297. package/dist/dashboard/assets/state-CzUPfLXo.js.gz +0 -0
  298. package/dist/dashboard/assets/switch-DOUIky_i.js.gz +0 -0
  299. package/dist/dashboard/assets/toast-C76WrMhc.js.gz +0 -0
  300. package/dist/dashboard/assets/useMutation-D87FZwH0.js.gz +0 -0
  301. package/src/network/tls/bun-client-hello.ts +0 -112
  302. /package/dist/dashboard/assets/{app-Cjq7nrwu.js → app-C-Y4oZT0.js} +0 -0
  303. /package/dist/dashboard/assets/{app-Cjq7nrwu.js.gz → app-C-Y4oZT0.js.gz} +0 -0
@@ -1,281 +1,139 @@
1
- import type { ApiKeyProviderSpec } from "../../configured-provider";
2
- import type { ModelDefinition } from "../../provider-model-definition";
3
- import { fetchOpenAICompatibleModels } from "../../discovery/openai-model-discovery";
4
- import { providerBaseUrl } from "../../provider-metadata";
5
- import type { DiscoveryInput } from "../../discovery/discovery-types";
6
- import { defineModel } from "../../provider-model-definition";
7
-
8
- const OPENROUTER_PROVIDER_ID = "openrouter" as const;
9
-
10
- /** OpenRouter requires these on every request for ranking/attribution. */
11
- const OPENROUTER_REQUIRED_HEADERS: Readonly<Record<string, string>> = {
12
- "HTTP-Referer": "https://endpoint-proxy.local",
13
- "X-Title": "Endpoint Proxy",
14
- };
15
-
16
- /**
17
- * OpenRouter's non-chat service models.
18
- *
19
- * OpenRouter fronts the System One decision API (`/api/v1/systemone`) as
20
- * `typesafe/jev-1.13`, which is not a chat model: it answers `{answers}` to a
21
- * `{state, questions}` body. `/api/v1/models` does not list it under a wire the
22
- * generic fetcher can classify, so it is declared here — a `serviceKind` row
23
- * served by the native System One route, never by the chat surface.
24
- */
25
- export const OPENROUTER_MODELS: readonly ModelDefinition[] = [
26
- defineModel({
27
- id: "typesafe/jev-1.13",
28
- providerId: "openrouter",
29
- serviceKind: "systemone",
30
- wireFamily: "chat",
31
- endpoint: "/systemone",
32
- ctx: 200_000,
33
- out: 8_192,
34
- toolCall: false,
35
- }),
36
- ];
37
-
38
-
39
- /**
40
- * OpenRouter's `:free` tier, as a default catalog.
41
- *
42
- * OpenRouter runs live `/api/v1/models` discovery, so this is a floor rather
43
- * than the only source — but without it the provider lists nothing at all
44
- * until a discovery run happens to fetch it, and the free tier is the one part
45
- * of OpenRouter an operator can use with no spend.
46
- *
47
- * Fetched 2026-10-12 from `https://openrouter.ai/api/v1/models`, which served
48
- * 15 `:free` rows; the 14 that the base catalog also files under `openrouter`
49
- * are listed here. `apodex/apodex-1.1-mini:free` is absent because the base
50
- * catalog has no row for it under any provider, so its limits and price would
51
- * have to be guessed — and a published guess reads as a measurement. Discovery
52
- * still picks it up, which is the correct path for a row with no catalog data.
53
- *
54
- * Every row is marked `freeTier` as well as `free`, because the two answer
55
- * different questions: `free` says this bills zero per token, and `freeTier` is
56
- * what the model list groups on so the free roster is labelled as such rather
57
- * than mixed in with the billed catalog.
58
- */
59
- export const OPENROUTER_FREE_MODELS: readonly ModelDefinition[] = [
60
- defineModel({
61
- id: "cohere/north-mini-code:free",
62
- providerId: OPENROUTER_PROVIDER_ID,
63
- reasoning: true,
64
- toolCall: true,
65
- free: true,
66
- freeTier: true,
67
- }),
68
- defineModel({
69
- id: "dots-studio/dots-3-note-preview:free",
70
- providerId: OPENROUTER_PROVIDER_ID,
71
- reasoning: true,
72
- toolCall: true,
73
- free: true,
74
- freeTier: true,
75
- }),
76
- defineModel({
77
- id: "google/gemma-4-26b-a4b-it:free",
78
- providerId: OPENROUTER_PROVIDER_ID,
79
- reasoning: true,
80
- toolCall: true,
81
- free: true,
82
- freeTier: true,
83
- }),
84
- defineModel({
85
- id: "google/gemma-4-31b-it:free",
86
- providerId: OPENROUTER_PROVIDER_ID,
87
- reasoning: true,
88
- toolCall: true,
89
- free: true,
90
- freeTier: true,
91
- }),
92
- defineModel({
93
- id: "inclusionai/ling-3.0-flash-fin:free",
94
- providerId: OPENROUTER_PROVIDER_ID,
95
- reasoning: true,
96
- toolCall: true,
97
- free: true,
98
- freeTier: true,
99
- }),
100
- defineModel({
101
- id: "inclusionai/ling-3.0-flash-sante:free",
102
- providerId: OPENROUTER_PROVIDER_ID,
103
- reasoning: true,
104
- toolCall: true,
105
- free: true,
106
- freeTier: true,
107
- }),
108
- defineModel({
109
- id: "liquid/lfm-2.5-2.6b:free",
110
- providerId: OPENROUTER_PROVIDER_ID,
111
- reasoning: true,
112
- toolCall: true,
113
- free: true,
114
- freeTier: true,
115
- }),
116
- defineModel({
117
- id: "nex-agi/nex-n2.5-mini:free",
118
- providerId: OPENROUTER_PROVIDER_ID,
119
- reasoning: true,
120
- toolCall: true,
121
- free: true,
122
- freeTier: true,
123
- }),
124
- defineModel({
125
- id: "nex-agi/nex-n2.5-pro:free",
126
- providerId: OPENROUTER_PROVIDER_ID,
127
- reasoning: true,
128
- toolCall: true,
129
- free: true,
130
- freeTier: true,
131
- }),
132
- defineModel({
133
- id: "nvidia/nemotron-3-nano-omni-30b-a3b-reasoning:free",
134
- providerId: OPENROUTER_PROVIDER_ID,
135
- audio: true,
136
- reasoning: true,
137
- toolCall: true,
138
- free: true,
139
- freeTier: true,
140
- }),
141
- defineModel({
142
- id: "nvidia/nemotron-3-super-120b-a12b:free",
143
- providerId: OPENROUTER_PROVIDER_ID,
144
- reasoning: true,
145
- toolCall: true,
146
- free: true,
147
- freeTier: true,
148
- }),
149
- defineModel({
150
- id: "nvidia/nemotron-3-ultra-550b-a55b:free",
151
- providerId: OPENROUTER_PROVIDER_ID,
152
- reasoning: true,
153
- toolCall: true,
154
- free: true,
155
- freeTier: true,
156
- }),
157
- defineModel({
158
- id: "nvidia/nemotron-3.5-content-safety:free",
159
- providerId: OPENROUTER_PROVIDER_ID,
160
- reasoning: true,
161
- // A content-safety classifier, not a chat model: it is published on the
162
- // same free tier and serves no tool calls.
163
- toolCall: false,
164
- free: true,
165
- freeTier: true,
166
- }),
167
- defineModel({
168
- id: "nvidia/nemotron-3.5-lightning:free",
169
- providerId: OPENROUTER_PROVIDER_ID,
170
- reasoning: true,
171
- toolCall: true,
172
- free: true,
173
- freeTier: true,
174
- }),
175
- defineModel({
176
- id: "poolside/laguna-s-2.1:free",
177
- providerId: OPENROUTER_PROVIDER_ID,
178
- reasoning: true,
179
- toolCall: true,
180
- free: true,
181
- freeTier: true,
182
- }),
183
- defineModel({
184
- id: "poolside/laguna-xs-2.1:free",
185
- providerId: OPENROUTER_PROVIDER_ID,
186
- reasoning: true,
187
- toolCall: true,
188
- free: true,
189
- freeTier: true,
190
- }),
191
- defineModel({
192
- id: "qwen/qwen3.8-27b:free",
193
- providerId: OPENROUTER_PROVIDER_ID,
194
- reasoning: true,
195
- toolCall: true,
196
- free: true,
197
- freeTier: true,
198
- }),
199
- defineModel({
200
- id: "thinkingmachines/inkling-small:free",
201
- providerId: OPENROUTER_PROVIDER_ID,
202
- reasoning: true,
203
- toolCall: true,
204
- free: true,
205
- freeTier: true,
206
- }),
207
- defineModel({
208
- id: "thinkingmachines/inkling:free",
209
- providerId: OPENROUTER_PROVIDER_ID,
210
- reasoning: true,
211
- toolCall: true,
212
- free: true,
213
- freeTier: true,
214
- }),
215
- defineModel({
216
- id: "z-ai/glm-5.2:free",
217
- providerId: OPENROUTER_PROVIDER_ID,
218
- reasoning: true,
219
- toolCall: true,
220
- free: true,
221
- freeTier: true,
222
- }),
223
- ];
224
-
225
-
226
- /**
227
- * OpenRouter's `:free` rows, discovered live.
228
- *
229
- * OpenRouter rotates its free tier constantly — models are added and pulled
230
- * within days — so a committed list is only ever a snapshot of one afternoon.
231
- * This is the same shape as the OpenCode Zen free fetch: filter the provider's
232
- * own live listing down to the free rows and mark each one `freeTier`, which is
233
- * what the model list groups under "Free models (auto)".
234
- *
235
- * The rows are the fetcher's own definitions, spread rather than rebuilt: it
236
- * has already resolved limits, pricing, and the wire family from the id, and
237
- * re-deriving that here would discard the resolution and let the two drift.
238
- */
239
- export async function discoverOpenrouterFreeModels(
240
- input: DiscoveryInput,
241
- ): Promise<readonly ModelDefinition[] | null> {
242
- const listed = await discoverOpenrouterModels(input);
243
- if (listed === null) return null;
244
- return (
245
- listed
246
- // OpenRouter's free-tier spelling is a `:free` id suffix, matched exactly
247
- // rather than as a substring so a model whose own name contains "free" is
248
- // not swept in by accident.
249
- .filter((model) => model.modelId.endsWith(":free"))
250
- .map((model) => ({
251
- ...model,
252
- // `free` is a billing statement and `freeTier` a catalog one. The
253
- // `:free` suffix answers both, so both are set; the cost is left as the
254
- // fetcher resolved it because OpenRouter publishes a real zero price.
255
- free: true,
256
- freeTier: true,
257
- }))
258
- );
259
- }
260
-
261
-
262
- /** OpenRouter adapter spec; the registry builds it via `createApiKeyAdapter`. */
263
- export const OPENROUTER_SPEC: ApiKeyProviderSpec = {
264
- provider_id: OPENROUTER_PROVIDER_ID,
265
- endpoint_paths_by_wire_family: {},
266
- extra_headers: OPENROUTER_REQUIRED_HEADERS,
267
- };
268
-
269
- export async function discoverOpenrouterModels(
270
- input: DiscoveryInput,
271
- ): Promise<readonly ModelDefinition[] | null> {
272
- return fetchOpenAICompatibleModels({
273
- baseUrl: providerBaseUrl("openrouter"),
274
- headers: {
275
- authorization: `Bearer ${input.credential}`,
276
- ...OPENROUTER_REQUIRED_HEADERS,
277
- },
278
- ...(input.signal ? { signal: input.signal } : {}),
279
- ...(input.fetcher ? { fetcher: input.fetcher } : {}),
280
- });
281
- }
1
+ import type { ApiKeyProviderSpec } from "../../configured-provider";
2
+ import type { ModelDefinition } from "../../provider-model-definition";
3
+ import { fetchOpenAICompatibleModels } from "../../discovery/openai-model-discovery";
4
+ import { providerBaseUrl } from "../../provider-metadata";
5
+ import type { DiscoveryInput } from "../../discovery/discovery-types";
6
+ import { defineModel } from "../../provider-model-definition";
7
+ import { openrouterFreeRoster } from "../../discovery/openrouter-free-roster";
8
+
9
+ const OPENROUTER_PROVIDER_ID = "openrouter" as const;
10
+
11
+ /** OpenRouter requires these on every request for ranking/attribution. */
12
+ const OPENROUTER_REQUIRED_HEADERS: Readonly<Record<string, string>> = {
13
+ "HTTP-Referer": "https://endpoint-proxy.local",
14
+ "X-Title": "Endpoint Proxy",
15
+ };
16
+
17
+ /**
18
+ * OpenRouter's non-chat service models.
19
+ *
20
+ * OpenRouter fronts the System One decision API (`/api/v1/systemone`) as
21
+ * `typesafe/jev-1.13`, which is not a chat model: it answers `{answers}` to a
22
+ * `{state, questions}` body. `/api/v1/models` does not list it under a wire the
23
+ * generic fetcher can classify, so it is declared here — a `serviceKind` row
24
+ * served by the native System One route, never by the chat surface.
25
+ */
26
+ export const OPENROUTER_MODELS: readonly ModelDefinition[] = [
27
+ // The router, and only the router. A hand-kept catalog of specific ids was a
28
+ // snapshot of one afternoon: OpenRouter adds and pulls models within days, so
29
+ // every committed row outside this one drifts out of truth. Discovery is the
30
+ // authority, and the free roster below is the offline floor.
31
+ defineModel({
32
+ id: "openrouter/auto",
33
+ providerId: OPENROUTER_PROVIDER_ID,
34
+ wireFamily: "chat",
35
+ endpoint: "/chat/completions",
36
+ // The catalog publishes no limits for a router (pricing is -1, meaning
37
+ // "decided at dispatch"), so this is the largest window it may select into.
38
+ ctx: 2_000_000,
39
+ out: 128_000,
40
+ reasoning: true,
41
+ }),
42
+ // Not a chat row: it answers `{answers}` to a `{state, questions}` body, and
43
+ // is served by the native System One route. Kept because deleting it removes
44
+ // that route, which is a capability, not a stale catalog entry.
45
+ defineModel({
46
+ id: "typesafe/jev-1.13",
47
+ providerId: "openrouter",
48
+ serviceKind: "systemone",
49
+ wireFamily: "chat",
50
+ endpoint: "/systemone",
51
+ ctx: 200_000,
52
+ out: 8_192,
53
+ toolCall: false,
54
+ }),
55
+ ];
56
+
57
+
58
+ /**
59
+ * OpenRouter's `:free` tier, as a default catalog.
60
+ *
61
+ * OpenRouter runs live `/api/v1/models` discovery, so this is a floor rather
62
+ * than the only source — but without it the provider lists nothing at all
63
+ * until a discovery run happens to fetch it, and the free tier is the one part
64
+ * of OpenRouter an operator can use with no spend.
65
+ *
66
+ * Fetched 2026-10-12 from `https://openrouter.ai/api/v1/models`, which served
67
+ * 15 `:free` rows; the 14 that the base catalog also files under `openrouter`
68
+ * are listed here. `apodex/apodex-1.1-mini:free` is absent because the base
69
+ * catalog has no row for it under any provider, so its limits and price would
70
+ * have to be guessed — and a published guess reads as a measurement. Discovery
71
+ * still picks it up, which is the correct path for a row with no catalog data.
72
+ *
73
+ * Every row is marked `freeTier` as well as `free`, because the two answer
74
+ * different questions: `free` says this bills zero per token, and `freeTier` is
75
+ * what the model list groups on so the free roster is labelled as such rather
76
+ * than mixed in with the billed catalog.
77
+ */
78
+ export const OPENROUTER_FREE_MODELS: readonly ModelDefinition[] = openrouterFreeRoster({
79
+ providerId: OPENROUTER_PROVIDER_ID,
80
+ endpoint: "/chat/completions",
81
+ });
82
+
83
+
84
+ /**
85
+ * OpenRouter's `:free` rows, discovered live.
86
+ *
87
+ * OpenRouter rotates its free tier constantly — models are added and pulled
88
+ * within days — so a committed list is only ever a snapshot of one afternoon.
89
+ * This is the same shape as the OpenCode Zen free fetch: filter the provider's
90
+ * own live listing down to the free rows and mark each one `freeTier`, which is
91
+ * what the model list groups under "Free models (auto)".
92
+ *
93
+ * The rows are the fetcher's own definitions, spread rather than rebuilt: it
94
+ * has already resolved limits, pricing, and the wire family from the id, and
95
+ * re-deriving that here would discard the resolution and let the two drift.
96
+ */
97
+ export async function discoverOpenrouterFreeModels(
98
+ input: DiscoveryInput,
99
+ ): Promise<readonly ModelDefinition[] | null> {
100
+ const listed = await discoverOpenrouterModels(input);
101
+ if (listed === null) return null;
102
+ return (
103
+ listed
104
+ // OpenRouter's free-tier spelling is a `:free` id suffix, matched exactly
105
+ // rather than as a substring so a model whose own name contains "free" is
106
+ // not swept in by accident.
107
+ .filter((model) => model.modelId.endsWith(":free"))
108
+ .map((model) => ({
109
+ ...model,
110
+ // `free` is a billing statement and `freeTier` a catalog one. The
111
+ // `:free` suffix answers both, so both are set; the cost is left as the
112
+ // fetcher resolved it because OpenRouter publishes a real zero price.
113
+ free: true,
114
+ freeTier: true,
115
+ }))
116
+ );
117
+ }
118
+
119
+
120
+ /** OpenRouter adapter spec; the registry builds it via `createApiKeyAdapter`. */
121
+ export const OPENROUTER_SPEC: ApiKeyProviderSpec = {
122
+ provider_id: OPENROUTER_PROVIDER_ID,
123
+ endpoint_paths_by_wire_family: {},
124
+ extra_headers: OPENROUTER_REQUIRED_HEADERS,
125
+ };
126
+
127
+ export async function discoverOpenrouterModels(
128
+ input: DiscoveryInput,
129
+ ): Promise<readonly ModelDefinition[] | null> {
130
+ return fetchOpenAICompatibleModels({
131
+ baseUrl: providerBaseUrl("openrouter"),
132
+ headers: {
133
+ authorization: `Bearer ${input.credential}`,
134
+ ...OPENROUTER_REQUIRED_HEADERS,
135
+ },
136
+ ...(input.signal ? { signal: input.signal } : {}),
137
+ ...(input.fetcher ? { fetcher: input.fetcher } : {}),
138
+ });
139
+ }