cartethyia 2.4.6 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -13
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js +1 -0
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-Bcy150Jo.js → CliToolDetailPage-ZRr2K2sF.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-ZRr2K2sF.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-DyNXefph.js → CliToolsPage-D3xqZbN-.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-D3xqZbN-.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js +1 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-CATpAEOz.js → ConsoleLogPage-u6W1UXSc.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-D6jEU7nL.js → CustomizationPage-CTTpCb25.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-CTTpCb25.js.gz +0 -0
- package/dist/dashboard/assets/{HealthEventsModal-CZkpn0a7.js → HealthEventsModal-C5XpWlvy.js} +1 -1
- package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-BJlMVN4U.js → LoginPage-DHoB3Agn.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DHoB3Agn.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-Br3CXEau.js → ModelPicker-oQ-SDXp8.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js +7 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-BHW4Zt06.js → SettingsPage-CvjZxHE4.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-CvjZxHE4.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-VOYC_lIa.js → SetupPage-D3nza7LH.js} +1 -1
- package/dist/dashboard/assets/SetupPage-D3nza7LH.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-Dtt12WT1.js +1 -0
- package/dist/dashboard/assets/SortableList-Dtt12WT1.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-BNIDLiU6.js → StudioPage-CbK3hXvU.js} +4 -4
- package/dist/dashboard/assets/StudioPage-CbK3hXvU.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js +56 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-BETfaMYZ.js → api-keys-BmDbsior.js} +1 -1
- package/dist/dashboard/assets/api-keys-BmDbsior.js.gz +0 -0
- package/dist/dashboard/assets/app-BbpSarVV.css +2 -0
- package/dist/dashboard/assets/app-BbpSarVV.css.gz +0 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js +1 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js.gz +0 -0
- package/dist/dashboard/assets/{badge-BTyGk_DL.js → badge-DpXT4Ixt.js} +1 -1
- package/dist/dashboard/assets/badge-DpXT4Ixt.js.gz +0 -0
- package/dist/dashboard/assets/{banner-bujTWYM4.js → banner-CSAAWLJv.js} +1 -1
- package/dist/dashboard/assets/banner-CSAAWLJv.js.gz +0 -0
- package/dist/dashboard/assets/{card-B0Bnx5CA.js → card-DEhRXXw4.js} +1 -1
- package/dist/dashboard/assets/card-DEhRXXw4.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-DE2ug812.js → cli-tools-B0wBq-RL.js} +1 -1
- package/dist/dashboard/assets/cli-tools-B0wBq-RL.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-R_rArH8S.js → clipboard-button-DOo6EU8O.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-BWIP_EvW.js → dialog-BvQeBMfP.js} +1 -1
- package/dist/dashboard/assets/dialog-BvQeBMfP.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-BKcgVugF.js → drawer-CMwPXwQB.js} +1 -1
- package/dist/dashboard/assets/drawer-CMwPXwQB.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CcWkGR4a.js → entry-D4O2229X.js} +1 -1
- package/dist/dashboard/assets/{entry-CcWkGR4a.js.gz → entry-D4O2229X.js.gz} +0 -0
- package/dist/dashboard/assets/{entry-kTiTFrvh.js → entry-DKvr5Q9K.js} +1 -1
- package/dist/dashboard/assets/entry-DKvr5Q9K.js.gz +0 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js +4 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-Booc5mNe.js → github-badge-zliLvBwr.js} +1 -1
- package/dist/dashboard/assets/github-badge-zliLvBwr.js.gz +0 -0
- package/dist/dashboard/assets/{index-D70pChfn.js → index-CXm3FIyt.js} +2 -2
- package/dist/dashboard/assets/index-CXm3FIyt.js.gz +0 -0
- package/dist/dashboard/assets/{inline-D1TCqM2D.js → inline-D1IlZZ8H.js} +1 -1
- package/dist/dashboard/assets/inline-D1IlZZ8H.js.gz +0 -0
- package/dist/dashboard/assets/{input-B9oyU93y.js → input-BpVZdrbc.js} +1 -1
- package/dist/dashboard/assets/input-BpVZdrbc.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BArzXirQ.js → layout-BioLW7gN.js} +1 -1
- package/dist/dashboard/assets/layout-BioLW7gN.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BVZzaoHF.js → list-row-CwVcGAIc.js} +1 -1
- package/dist/dashboard/assets/list-row-CwVcGAIc.js.gz +0 -0
- package/dist/dashboard/assets/{live-EmuIayqp.js → live-yfEJFF9T.js} +1 -1
- package/dist/dashboard/assets/live-yfEJFF9T.js.gz +0 -0
- package/dist/dashboard/assets/{model-bans-CSPQ9xB0.js → model-bans-CT-TxSNX.js} +1 -1
- package/dist/dashboard/assets/model-bans-CT-TxSNX.js.gz +0 -0
- package/dist/dashboard/assets/providers/cursor.webp +0 -0
- package/dist/dashboard/assets/providers/trae.webp +0 -0
- package/dist/dashboard/assets/{routing-BExgxxBU.js → routing-Cs6jl49L.js} +1 -1
- package/dist/dashboard/assets/routing-Cs6jl49L.js.gz +0 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js +41 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js.gz +0 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js +1 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js.gz +0 -0
- package/dist/dashboard/assets/{stack-Ca5HxI5i.js → stack-C9_uUjaA.js} +1 -1
- package/dist/dashboard/assets/stack-C9_uUjaA.js.gz +0 -0
- package/dist/dashboard/assets/{state-CzUPfLXo.js → state-DA0B95UQ.js} +1 -1
- package/dist/dashboard/assets/state-DA0B95UQ.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DOUIky_i.js → switch-Cittxy-x.js} +1 -1
- package/dist/dashboard/assets/switch-Cittxy-x.js.gz +0 -0
- package/dist/dashboard/assets/{toast-C76WrMhc.js → toast-CNt_jzO4.js} +1 -1
- package/dist/dashboard/assets/toast-CNt_jzO4.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-D87FZwH0.js → useMutation-BQKMcJ1H.js} +1 -1
- package/dist/dashboard/assets/useMutation-BQKMcJ1H.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +51 -52
- package/migrations/full-postgres/0015_add_payload_stages.sql +18 -0
- package/migrations/full-postgres/0016_add_share_link_slug.sql +20 -0
- package/migrations/full-postgres/0017_add_models_pro_only.sql +18 -0
- package/migrations/full-postgres/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/full-postgres/0019_add_models_free_tier.sql +15 -0
- package/migrations/lite-sqlite3/0015_add_payload_stages.sql +18 -0
- package/migrations/lite-sqlite3/0016_add_share_link_slug.sql +20 -0
- package/migrations/lite-sqlite3/0017_add_models_pro_only.sql +18 -0
- package/migrations/lite-sqlite3/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/lite-sqlite3/0019_add_models_free_tier.sql +15 -0
- package/package.json +3 -2
- package/scripts/cli/command/console-menu.ts +30 -11
- package/scripts/cli/command/start.ts +77 -13
- package/scripts/cli/command/update.ts +1 -1
- package/scripts/cli/gateway/instance-lock.ts +105 -0
- package/scripts/cli/gateway/spawn.ts +173 -101
- package/scripts/cli/ui/background.ts +110 -49
- package/src/boot/app.ts +20 -6
- package/src/boot/dependencies.ts +19 -0
- package/src/boot/elysia-typebox-bridge.ts +37 -0
- package/src/boot/lifecycle.ts +2 -0
- package/src/config/cooldowns.ts +138 -138
- package/src/config/providers.ts +5 -5
- package/src/config/runtime.ts +19 -3
- package/src/config/spec.ts +9 -0
- package/src/console/api-keys/contracts.ts +414 -391
- package/src/console/api-keys/routes.ts +880 -870
- package/src/console/auth/account-reset-store.ts +14 -0
- package/src/console/auth/account-reset.ts +3 -2
- package/src/console/auth/setup-service.ts +6 -3
- package/src/console/domain-registration.ts +9 -2
- package/src/console/observability/contracts.ts +475 -455
- package/src/console/observability/store.ts +1015 -952
- package/src/console/providers/catalog/contracts.ts +31 -0
- package/src/console/providers/catalog/provider-operations.ts +8 -0
- package/src/console/providers/catalog/store.ts +1532 -1525
- package/src/console/providers/oauth/callback-listener.ts +18 -3
- package/src/console/providers/oauth/routes.ts +38 -15
- package/src/console/quota/refresh.ts +19 -0
- package/src/console/updates/routes.ts +162 -4
- package/src/main.ts +3 -0
- package/src/network/http2-bidi.ts +85 -0
- package/src/network/outbound-fetch.ts +1 -26
- package/src/network/pool/agent.ts +478 -460
- package/src/network/pool/resolver.ts +1104 -544
- package/src/network/pool-health-machine.ts +12 -5
- package/src/observability/payload-capture.ts +344 -324
- package/src/persistence/db-pg.ts +9 -3
- package/src/persistence/db-sqlite.ts +497 -495
- package/src/persistence/health-event-flush.ts +137 -0
- package/src/persistence/migrate.ts +181 -129
- package/src/persistence/schema.ts +1360 -1295
- package/src/persistence/settings-revision.ts +25 -0
- package/src/persistence/shared-cache.ts +217 -0
- package/src/persistence/stores/share-store.ts +556 -528
- package/src/persistence/usage-flush.ts +61 -1
- package/src/protocol/canonical-model.ts +23 -1
- package/src/protocol/response/chat.ts +143 -10
- package/src/protocol/response/omp-tool-call-markup.ts +221 -0
- package/src/providers/default-registry.ts +173 -1
- package/src/providers/discovery/openai-model-discovery.ts +39 -3
- package/src/providers/discovery/openrouter-free-roster.ts +98 -0
- package/src/providers/discovery/probing-service.ts +1022 -1001
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +39 -0
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +913 -914
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +18 -5
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +4 -0
- package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -175
- package/src/providers/integrations/buddy/codebuddy/shared.ts +15 -6
- package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -204
- package/src/providers/integrations/buddy/workbuddy/shared.ts +3 -3
- package/src/providers/integrations/claude/claude.ts +606 -582
- package/src/providers/integrations/cline/cline-quota.ts +18 -16
- package/src/providers/integrations/cline/cline.ts +539 -468
- package/src/providers/integrations/commandcode/commandcode.ts +675 -541
- package/src/providers/integrations/commandcode/discovery.ts +116 -0
- package/src/providers/integrations/commandcode/quota.ts +160 -0
- package/src/providers/integrations/cursor/cursor-auth.ts +418 -0
- package/src/providers/integrations/cursor/cursor-catalog.ts +368 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +300 -0
- package/src/providers/integrations/cursor/cursor-identity.ts +92 -0
- package/src/providers/integrations/cursor/cursor-request.ts +471 -0
- package/src/providers/integrations/cursor/cursor-session-manager.ts +281 -0
- package/src/providers/integrations/cursor/cursor-shared.ts +108 -0
- package/src/providers/integrations/cursor/cursor.ts +960 -0
- package/src/providers/integrations/cursor/protocol/framing.ts +129 -0
- package/src/providers/integrations/cursor/protocol/messages.ts +2355 -0
- package/src/providers/integrations/cursor/protocol/struct.ts +305 -0
- package/src/providers/integrations/github/github.ts +4 -4
- package/src/providers/integrations/hermes.ts +79 -8
- package/src/providers/integrations/kilo/kilo-discovery.ts +10 -1
- package/src/providers/integrations/kilo/kilo.ts +153 -146
- package/src/providers/integrations/opencode/provider.ts +532 -538
- package/src/providers/integrations/openrouter/provider.ts +139 -281
- package/src/providers/integrations/qoder/qoder-catalog.ts +450 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +310 -257
- package/src/providers/integrations/qoder/qoder-realm.ts +106 -0
- package/src/providers/integrations/qoder/qoder-virtual.ts +77 -0
- package/src/providers/integrations/qoder/qoder.ts +865 -730
- package/src/providers/integrations/trae/trae-catalog.ts +190 -0
- package/src/providers/integrations/trae/trae-headers.ts +149 -0
- package/src/providers/integrations/trae/trae-oauth.ts +773 -0
- package/src/providers/integrations/trae/trae-protocol.ts +400 -0
- package/src/providers/integrations/trae/trae-realm.ts +220 -0
- package/src/providers/integrations/trae/trae.ts +458 -0
- package/src/providers/operations/account-health-service.ts +107 -10
- package/src/providers/operations/client-versions.ts +133 -6
- package/src/providers/operations/provider-catalog-seeder.ts +95 -86
- package/src/providers/operations/provider-credential-service.ts +46 -7
- package/src/providers/provider-contracts.ts +76 -0
- package/src/providers/provider-metadata.ts +78 -6
- package/src/providers/provider-model-definition.ts +373 -349
- package/src/security/api-key-auth.ts +126 -8
- package/src/transport/contracts.ts +3 -0
- package/src/transport/dispatch/attempt-finalize.ts +32 -1
- package/src/transport/dispatch/attempt-loop.ts +530 -515
- package/src/transport/dispatch/generation.ts +88 -21
- package/src/transport/dispatch/leases.ts +99 -2
- package/src/transport/dispatch/proxy-request.ts +60 -3
- package/src/transport/dispatch/streaming/finalize.ts +16 -1
- package/src/transport/dispatch/streaming/stream.ts +22 -2
- package/src/transport/dispatch/upstream.ts +19 -1
- package/src/transport/guards/auth-guard.ts +26 -1
- package/src/transport/guards/body-policy.ts +5 -4
- package/src/transport/request/preparer.ts +103 -0
- package/src/transport/request/state.ts +14 -0
- package/src/transport/routing/plan-gate.ts +45 -0
- package/src/transport/routing/route-catalog.ts +799 -777
- package/src/transport/routing/route-model.ts +52 -1
- package/src/transport/routing/router.ts +51 -0
- package/dist/dashboard/assets/BannedPage-QhvbJB9o.js +0 -1
- package/dist/dashboard/assets/BannedPage-QhvbJB9o.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-Bcy150Jo.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-DyNXefph.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-Cak0ljnO.js +0 -1
- package/dist/dashboard/assets/CombosPage-Cak0ljnO.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CATpAEOz.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-D6jEU7nL.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-CZkpn0a7.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-BJlMVN4U.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-Br3CXEau.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-CQxXbo2g.js +0 -1
- package/dist/dashboard/assets/OverviewPage-CQxXbo2g.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage--0RBNh99.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-1M-C3mbu.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CXiumA53.js +0 -7
- package/dist/dashboard/assets/ProxyPage-CXiumA53.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js +0 -1
- package/dist/dashboard/assets/QuotaPage-BGDIfIYP.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BHW4Zt06.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-VOYC_lIa.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-DpOTnGuH.js +0 -1
- package/dist/dashboard/assets/SortableList-DpOTnGuH.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-BNIDLiU6.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BAFaSDQV.js +0 -56
- package/dist/dashboard/assets/UsagePage-BAFaSDQV.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BETfaMYZ.js.gz +0 -0
- package/dist/dashboard/assets/app-BLCvGdzb.css +0 -2
- package/dist/dashboard/assets/app-BLCvGdzb.css.gz +0 -0
- package/dist/dashboard/assets/assert-7J6_LVD3.js +0 -1
- package/dist/dashboard/assets/assert-7J6_LVD3.js.gz +0 -0
- package/dist/dashboard/assets/badge-BTyGk_DL.js.gz +0 -0
- package/dist/dashboard/assets/banner-bujTWYM4.js.gz +0 -0
- package/dist/dashboard/assets/card-B0Bnx5CA.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-DE2ug812.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-R_rArH8S.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BWIP_EvW.js.gz +0 -0
- package/dist/dashboard/assets/drawer-BKcgVugF.js.gz +0 -0
- package/dist/dashboard/assets/entry-7dpgvpJ3.js +0 -4
- package/dist/dashboard/assets/entry-7dpgvpJ3.js.gz +0 -0
- package/dist/dashboard/assets/entry-kTiTFrvh.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-Booc5mNe.js.gz +0 -0
- package/dist/dashboard/assets/index-D70pChfn.js.gz +0 -0
- package/dist/dashboard/assets/inline-D1TCqM2D.js.gz +0 -0
- package/dist/dashboard/assets/input-B9oyU93y.js.gz +0 -0
- package/dist/dashboard/assets/layout-BArzXirQ.js.gz +0 -0
- package/dist/dashboard/assets/list-row-BVZzaoHF.js.gz +0 -0
- package/dist/dashboard/assets/live-EmuIayqp.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-CSPQ9xB0.js.gz +0 -0
- package/dist/dashboard/assets/routing-BExgxxBU.js.gz +0 -0
- package/dist/dashboard/assets/select-C9mMoEpJ.js +0 -41
- package/dist/dashboard/assets/select-C9mMoEpJ.js.gz +0 -0
- package/dist/dashboard/assets/settings-C4_Gn_wq.js +0 -1
- package/dist/dashboard/assets/settings-C4_Gn_wq.js.gz +0 -0
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +0 -1
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js.gz +0 -0
- package/dist/dashboard/assets/stack-Ca5HxI5i.js.gz +0 -0
- package/dist/dashboard/assets/state-CzUPfLXo.js.gz +0 -0
- package/dist/dashboard/assets/switch-DOUIky_i.js.gz +0 -0
- package/dist/dashboard/assets/toast-C76WrMhc.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-D87FZwH0.js.gz +0 -0
- package/src/network/tls/bun-client-hello.ts +0 -112
- /package/dist/dashboard/assets/{app-Cjq7nrwu.js → app-C-Y4oZT0.js} +0 -0
- /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
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
"
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
* `
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
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
|
+
}
|