cartethyia 2.7.9 → 2.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +6 -5
- package/dist/dashboard/assets/{BannedPage-BxoG1MrL.js → BannedPage-Dq530awD.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Dq530awD.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-ixwgKk53.js → CliToolDetailPage-DZzaS-7S.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZzaS-7S.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BmttNV3U.js → CliToolsPage-DaZZ3cqP.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-DaZZ3cqP.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-BE3qwwfC.js → CombosPage-BlC_xdkX.js} +1 -1
- package/dist/dashboard/assets/CombosPage-BlC_xdkX.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-CRZdmMIX.js → ConsoleLogPage-D-rqeVtG.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-D-rqeVtG.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-Dv_FJ6Er.js → CustomizationPage-7xT5yg2E.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-7xT5yg2E.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-Clq8E9cW.js.gz +0 -0
- package/dist/dashboard/assets/{InjectSystemPromptPanel-BOoO8rpz.js → InjectSystemPromptPanel-6Teoq9Se.js} +2 -2
- package/dist/dashboard/assets/InjectSystemPromptPanel-6Teoq9Se.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-ChJuNNVN.js → LoginPage-CZuI0MAR.js} +1 -1
- package/dist/dashboard/assets/LoginPage-CZuI0MAR.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BZAJtPg1.js → ModelPicker-C1hNTlkr.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-C1hNTlkr.js.gz +0 -0
- package/dist/dashboard/assets/{OverviewPage-BE40s3u5.js → OverviewPage-0yfhSI1C.js} +1 -1
- package/dist/dashboard/assets/OverviewPage-0yfhSI1C.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js +8 -0
- package/dist/dashboard/assets/ProviderDetailPage-xqTxdQ4c.js.gz +0 -0
- package/dist/dashboard/assets/{ProviderIcon-CQ6bPUf_.js → ProviderIcon-Ddhm1InL.js} +1 -1
- package/dist/dashboard/assets/ProviderIcon-Ddhm1InL.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-C3fYuu6i.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js +9 -0
- package/dist/dashboard/assets/ProxyPage-CHtJtZ3u.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js +1 -0
- package/dist/dashboard/assets/QuotaPage-D1RV_2BX.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-C5HPWqEv.js → SettingsPage-BzZAvYSX.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-BzZAvYSX.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-CFNcATJJ.js → SetupPage--s-EfEIL.js} +1 -1
- package/dist/dashboard/assets/SetupPage--s-EfEIL.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-YoD4tY5l.js → StudioPage-BjXFGSK4.js} +1 -1
- package/dist/dashboard/assets/StudioPage-BjXFGSK4.js.gz +0 -0
- package/dist/dashboard/assets/{UsagePage-DxjaAhb_.js → UsagePage-CP8F8BN7.js} +1 -1
- package/dist/dashboard/assets/UsagePage-CP8F8BN7.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-BTlkq_Uk.js → api-keys-2hc12Uz2.js} +1 -1
- package/dist/dashboard/assets/api-keys-2hc12Uz2.js.gz +0 -0
- package/dist/dashboard/assets/app-DGXbNfAR.css +2 -0
- package/dist/dashboard/assets/app-DGXbNfAR.css.gz +0 -0
- package/dist/dashboard/assets/assert-BMcj1xZE.js +1 -0
- package/dist/dashboard/assets/assert-BMcj1xZE.js.gz +0 -0
- package/dist/dashboard/assets/{badge-DdbT_7Am.js → badge-DkRUuVfz.js} +1 -1
- package/dist/dashboard/assets/badge-DkRUuVfz.js.gz +0 -0
- package/dist/dashboard/assets/{banner-CsGN-nbm.js → banner-CDjW841Q.js} +1 -1
- package/dist/dashboard/assets/banner-CDjW841Q.js.gz +0 -0
- package/dist/dashboard/assets/{card-mgZ_TLLZ.js → card-Bto5UlL9.js} +1 -1
- package/dist/dashboard/assets/card-Bto5UlL9.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-A1-v8-03.js → cli-tools-DaH6g9hL.js} +1 -1
- package/dist/dashboard/assets/cli-tools-DaH6g9hL.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-CJ4Zty89.js → clipboard-button-BYKBCzjk.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-BYKBCzjk.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-B5L2jPQ_.js → dialog-DL0Zftwv.js} +1 -1
- package/dist/dashboard/assets/dialog-DL0Zftwv.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-DkjUouAj.js → drawer-Dpx_UXaS.js} +1 -1
- package/dist/dashboard/assets/drawer-Dpx_UXaS.js.gz +0 -0
- package/dist/dashboard/assets/{entry-B-LVLV6o.js → entry-BV7-1NoM.js} +1 -1
- package/dist/dashboard/assets/entry-BV7-1NoM.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CAhdYl3B.js → entry-CGvdNU6r.js} +1 -1
- package/dist/dashboard/assets/entry-CGvdNU6r.js.gz +0 -0
- package/dist/dashboard/assets/entry-DScKYvZj.js +4 -0
- package/dist/dashboard/assets/entry-DScKYvZj.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-CrsdLVsn.js → formatters-BS3DZlZj.js} +1 -1
- package/dist/dashboard/assets/formatters-BS3DZlZj.js.gz +0 -0
- package/dist/dashboard/assets/{index-BU64Lqvp.js → index-SQnvvTWX.js} +2 -2
- package/dist/dashboard/assets/index-SQnvvTWX.js.gz +0 -0
- package/dist/dashboard/assets/{inline-B2aDLyyg.js → inline-Dl-cuLK0.js} +1 -1
- package/dist/dashboard/assets/inline-Dl-cuLK0.js.gz +0 -0
- package/dist/dashboard/assets/{input-BCVkdR9d.js → input-Bfx0EzRc.js} +1 -1
- package/dist/dashboard/assets/input-Bfx0EzRc.js.gz +0 -0
- package/dist/dashboard/assets/{layout-DNcAdMK-.js → layout-BxhbQ_JS.js} +1 -1
- package/dist/dashboard/assets/layout-BxhbQ_JS.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-DgrIH0hw.js → list-row-D49Y4ptn.js} +1 -1
- package/dist/dashboard/assets/list-row-D49Y4ptn.js.gz +0 -0
- package/dist/dashboard/assets/{live-Cae01iu8.js → live-CbVTdX9V.js} +1 -1
- package/dist/dashboard/assets/live-CbVTdX9V.js.gz +0 -0
- package/dist/dashboard/assets/{network-CRib7H_2.js → network-JGvDveof.js} +1 -1
- package/dist/dashboard/assets/network-JGvDveof.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-BKQE8Xpz.js → numbers-Dw6kiew-.js} +1 -1
- package/dist/dashboard/assets/numbers-Dw6kiew-.js.gz +0 -0
- package/dist/dashboard/assets/{pagination-ecPvG_8g.js → pagination-iUoI8GeE.js} +1 -1
- package/dist/dashboard/assets/pagination-iUoI8GeE.js.gz +0 -0
- package/dist/dashboard/assets/providers/sensenova-intl.png +0 -0
- package/dist/dashboard/assets/providers/sensenova.png +0 -0
- package/dist/dashboard/assets/providers/zro.svg +3 -0
- package/dist/dashboard/assets/providers/zro.svg.gz +0 -0
- package/dist/dashboard/assets/quota-DiPD6UKH.js +1 -0
- package/dist/dashboard/assets/quota-DiPD6UKH.js.gz +0 -0
- package/dist/dashboard/assets/{routing-Ckm1UXuC.js → routing-8jZr-3WE.js} +1 -1
- package/dist/dashboard/assets/routing-8jZr-3WE.js.gz +0 -0
- package/dist/dashboard/assets/{select-ChoFWyKz.js → select-oO1FxMVb.js} +2 -2
- package/dist/dashboard/assets/select-oO1FxMVb.js.gz +0 -0
- package/dist/dashboard/assets/{settings-CKjFPlKW.js → settings-CLr3kdIx.js} +1 -1
- package/dist/dashboard/assets/settings-CLr3kdIx.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DWCwU3fh.js → stack-Y3pDteZr.js} +1 -1
- package/dist/dashboard/assets/stack-Y3pDteZr.js.gz +0 -0
- package/dist/dashboard/assets/{state-Cg3VL5J_.js → state-CArX_Iak.js} +1 -1
- package/dist/dashboard/assets/state-CArX_Iak.js.gz +0 -0
- package/dist/dashboard/assets/{switch-Db70BMix.js → switch-DwlwmDO-.js} +1 -1
- package/dist/dashboard/assets/switch-DwlwmDO-.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BqdE0LuM.js → useMutation-DJ9GYEgf.js} +1 -1
- package/dist/dashboard/assets/useMutation-DJ9GYEgf.js.gz +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +54 -53
- package/migrations/full-postgres/0046_add_accounts_quota_plan_fetched_at.sql +7 -0
- package/migrations/full-postgres/0047_add_provider_device_flow_proxy.sql +17 -0
- package/migrations/lite-sqlite3/0046_add_accounts_quota_plan_fetched_at.sql +4 -0
- package/migrations/lite-sqlite3/0047_add_provider_device_flow_proxy.sql +19 -0
- package/package.json +1 -1
- package/src/boot/app.ts +11 -14
- package/src/boot/dependencies.ts +5 -7
- package/src/boot/flush.ts +20 -0
- package/src/boot/lifecycle.ts +7 -5
- package/src/config/providers.ts +6 -5
- package/src/config/routing.ts +26 -0
- package/src/config/spec-metadata.ts +72 -0
- package/src/config/spec.ts +28 -8
- package/src/console/api-keys/contracts.ts +12 -1
- package/src/console/api-keys/routes.ts +40 -28
- package/src/console/auth/account-reset.ts +7 -9
- package/src/console/backup/contracts.ts +4 -0
- package/src/console/backup/export-endpoint.ts +7 -5
- package/src/console/backup/nine-router.ts +71 -10
- package/src/console/backup/service.ts +8 -1
- package/src/console/cli-tools/service.ts +6 -12
- package/src/console/console-router-guards.ts +23 -16
- package/src/console/console-router.ts +1 -1
- package/src/console/domain-registration.ts +7 -4
- package/src/console/inferhub/client.ts +1 -1
- package/src/console/inferhub/normalize.ts +24 -28
- package/src/console/inferhub/types.ts +3 -0
- package/src/console/ip-bans/routes.ts +7 -13
- package/src/console/observability/live.ts +2 -2
- package/src/console/observability/store.ts +0 -53
- package/src/console/providers/catalog/contracts.ts +9 -3
- package/src/console/providers/catalog/model-operations.ts +2 -3
- package/src/console/providers/catalog/provider-operations.ts +1 -1
- package/src/console/providers/catalog/routes.ts +3 -2
- package/src/console/providers/catalog/store.ts +1914 -1902
- package/src/console/providers/detail/routes.ts +1 -0
- package/src/console/providers/detail/store.ts +4 -0
- package/src/console/providers/oauth/callback-listener.ts +30 -11
- package/src/console/providers/oauth/device-egress.ts +123 -0
- package/src/console/providers/oauth/routes.ts +123 -16
- package/src/console/quota/account-quota-global.ts +14 -24
- package/src/console/quota/account-quota-shared.ts +49 -0
- package/src/console/quota/account-quota-tenant.ts +11 -23
- package/src/console/quota/account-test-egress.ts +2 -2
- package/src/console/quota/daily-growth-job.ts +1 -1
- package/src/console/quota/quota-view.ts +19 -3
- package/src/console/routing/pools/contracts.ts +1 -1
- package/src/console/routing/pools/operations.ts +32 -47
- package/src/console/routing/pools/probe-verdict.ts +2 -2
- package/src/console/routing/pools/relay-deploy.ts +1 -1
- package/src/console/routing/pools/store.ts +4 -4
- package/src/console/shared/errors.ts +33 -6
- package/src/main.ts +2 -3
- package/src/network/client.ts +67 -0
- package/src/network/egress/bidi-session.ts +322 -0
- package/src/network/egress/dial.ts +201 -0
- package/src/network/egress/factory.ts +191 -0
- package/src/network/{outbound-fetch.ts → egress/fetch.ts} +195 -29
- package/src/network/egress/tls-profile.ts +123 -0
- package/src/network/egress/ws.ts +175 -0
- package/src/network/pool/{byte-accounting.ts → accounting.ts} +3 -2
- package/src/network/{types.ts → pool/agent-config.ts} +1 -1
- package/src/network/pool/agent.ts +2 -2
- package/src/network/{pool-cooldown-store.ts → pool/cooldown-store.ts} +95 -20
- package/src/network/{pool-health-machine.ts → pool/health.ts} +205 -6
- package/src/network/pool/resolver.ts +10 -849
- package/src/network/pool/selector.ts +184 -41
- package/src/network/ssrf.ts +7 -7
- package/src/network/{retry.ts → util/retry.ts} +1 -1
- package/src/network/{rate-limit-verdict.ts → verdict.ts} +1 -1
- package/src/observability/event-log.ts +7 -361
- package/src/observability/performance-metrics.ts +9 -0
- package/src/observability/runtime-metrics.ts +14 -9
- package/src/observability/telemetry-buffer.ts +16 -26
- package/src/observability/telemetry-reconciliation.ts +9 -37
- package/src/observability/telemetry-row.ts +125 -0
- package/src/persistence/db-mode.ts +4 -1
- package/src/persistence/dialect.ts +18 -0
- package/src/persistence/migrate.ts +6 -3
- package/src/persistence/schema.ts +17 -0
- package/src/persistence/ttl-cache.ts +21 -3
- package/src/protocol/codecs.ts +59 -2
- package/src/protocol/dsml.ts +34 -86
- package/src/protocol/markup-stream-parser.ts +195 -0
- package/src/protocol/reasoning-text.ts +19 -0
- package/src/protocol/request/chat.ts +10 -10
- package/src/protocol/request/gemini.ts +8 -2
- package/src/protocol/request/messages.ts +34 -22
- package/src/protocol/response/chat.ts +12 -20
- package/src/protocol/response/messages.ts +34 -7
- package/src/protocol/response/omp-tool-call-markup.ts +43 -86
- package/src/protocol/response/responses.ts +18 -2
- package/src/protocol/stop-reason.ts +23 -1
- package/src/protocol/think-split.ts +112 -0
- package/src/protocol/translation/dialect/qwen.ts +26 -58
- package/src/protocol/translation/quirks.ts +15 -0
- package/src/protocol/upstream/send-claude-messages.ts +2 -2
- package/src/providers/adapters/compatible-adapter.ts +76 -12
- package/src/providers/authentication/oauth-client.ts +40 -6
- package/src/providers/authentication/oauth-device-flow.ts +105 -11
- package/src/providers/authentication/oauth-flow-store.ts +82 -1
- package/src/providers/authentication/oauth-refresh-service.ts +766 -758
- package/src/providers/configured-provider.ts +148 -0
- package/src/providers/default-registry.ts +137 -36
- package/src/providers/discovery/discovery-types.ts +7 -0
- package/src/providers/discovery/probe-phases.ts +20 -6
- package/src/providers/discovery/probing-service.ts +22 -2
- package/src/providers/integrations/alibabacp/alibabacp-models.ts +1 -2
- package/src/providers/integrations/{dashscope-models.ts → alibabacp/dashscope-models.ts} +2 -2
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +16 -1
- package/src/providers/integrations/buddy/account.ts +969 -0
- package/src/providers/integrations/buddy/capabilities.ts +12 -12
- package/src/providers/integrations/buddy/{buddy-catalog-shared.ts → catalog.ts} +198 -136
- package/src/providers/integrations/buddy/{buddy-chat-shared.ts → chat.ts} +176 -20
- package/src/providers/integrations/buddy/codebuddy/index.ts +429 -0
- package/src/providers/integrations/buddy/codebuddy/shared.ts +41 -26
- package/src/providers/integrations/buddy/headers.ts +311 -0
- package/src/providers/integrations/buddy/lifecycle.ts +1018 -0
- package/src/providers/integrations/buddy/{buddy-media.ts → media.ts} +1 -1
- package/src/providers/integrations/claude/claude-quota.ts +14 -17
- package/src/providers/integrations/cline/cline-oauth.ts +10 -5
- package/src/providers/integrations/cline/cline.ts +5 -6
- package/src/providers/integrations/clixad/clixad-oauth.ts +98 -0
- package/src/providers/integrations/clixad/clixad-quota.ts +132 -0
- package/src/providers/integrations/clixad/provider.ts +145 -0
- package/src/providers/integrations/codex/codex-oauth.ts +8 -5
- package/src/providers/integrations/commandcode/quota.ts +22 -28
- package/src/providers/integrations/cursor/cursor-auth.ts +1 -9
- package/src/providers/integrations/cursor/cursor-exec.ts +9 -2
- package/src/providers/integrations/cursor/cursor-hardening.ts +279 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +605 -6
- package/src/providers/integrations/cursor/cursor-request.ts +26 -12
- package/src/providers/integrations/cursor/cursor-shared.ts +8 -5
- package/src/providers/integrations/cursor/cursor.ts +574 -110
- package/src/providers/integrations/cursor/protocol/messages.ts +22 -29
- package/src/providers/integrations/cursor/protocol/protobuf-schema.ts +37 -0
- package/src/providers/integrations/deepai/deepai-catalog.ts +149 -0
- package/src/providers/integrations/deepai/deepai-common.ts +145 -0
- package/src/providers/integrations/deepai/deepai-oauth.ts +129 -0
- package/src/providers/integrations/deepai/deepai-quota.ts +97 -0
- package/src/providers/integrations/deepai/provider.ts +42 -0
- package/src/providers/integrations/devin/devin-auth.ts +7 -0
- package/src/providers/integrations/devin/protocol/devin-proto.ts +1 -27
- package/src/providers/integrations/factory/factory-oauth.ts +33 -51
- package/src/providers/integrations/freebuff/assets/official-system-manager.txt +88 -0
- package/src/providers/integrations/freebuff/assets/official-system-worker.txt +57 -0
- package/src/providers/integrations/freebuff/assets/official-tools.json +1070 -0
- package/src/providers/integrations/freebuff/freebuff-catalog.ts +120 -0
- package/src/providers/integrations/freebuff/freebuff-constants.ts +1233 -0
- package/src/providers/integrations/freebuff/freebuff-discovery.ts +108 -0
- package/src/providers/integrations/freebuff/freebuff-oauth.ts +240 -0
- package/src/providers/integrations/freebuff/freebuff-quota.ts +260 -0
- package/src/providers/integrations/freebuff/freebuff-virtual.ts +89 -0
- package/src/providers/integrations/freebuff/freebuff.ts +682 -0
- package/src/providers/integrations/freepi/freepi-catalog.ts +5 -0
- package/src/providers/integrations/freepi/freepi-discovery.ts +2 -2
- package/src/providers/integrations/freepi/freepi-headers.ts +2 -2
- package/src/providers/integrations/freepi/freepi-protocol.ts +11 -2
- package/src/providers/integrations/freepi/freepi-realm.ts +0 -3
- package/src/providers/integrations/freepi/freepi-session.ts +158 -0
- package/src/providers/integrations/freepi/freepi.ts +80 -54
- package/src/providers/integrations/github/github-discovery.ts +30 -13
- package/src/providers/integrations/github/github-oauth.ts +217 -44
- package/src/providers/integrations/github/github-quota.ts +22 -5
- package/src/providers/integrations/github/github.ts +40 -32
- package/src/providers/integrations/grok/grok-oauth.ts +52 -49
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +10 -17
- package/src/providers/integrations/grok/grok-turn-index.ts +11 -16
- package/src/providers/integrations/hermes/hermes-oauth.ts +3 -3
- package/src/providers/integrations/{hermes.ts → hermes/hermes.ts} +42 -13
- package/src/providers/integrations/hermes/index.ts +2 -0
- package/src/providers/integrations/kilo/kilo-oauth.ts +4 -4
- package/src/providers/integrations/kilo/kilo.ts +1 -1
- package/src/providers/integrations/kimi/kimi-oauth.ts +3 -3
- package/src/providers/integrations/kiro/kiro-catalog.ts +17 -1
- package/src/providers/integrations/kiro/kiro-discovery.ts +10 -12
- package/src/providers/integrations/kiro/kiro-oauth.ts +2 -2
- package/src/providers/integrations/kiro/kiro-quota.ts +8 -4
- package/src/providers/integrations/kiro/kiro.ts +15 -19
- package/src/providers/integrations/muse/muse-oauth.ts +5 -5
- package/src/providers/integrations/ollamacloud/index.ts +2 -0
- package/src/providers/integrations/{ollamacloud-models.ts → ollamacloud/models.ts} +2 -2
- package/src/providers/integrations/{ollamacloud-quota.ts → ollamacloud/quota.ts} +3 -3
- package/src/providers/integrations/opencode/fingerprint.ts +1 -1
- package/src/providers/integrations/opencode/opencode-go-quota.ts +2 -8
- package/src/providers/integrations/openrouter/provider.ts +1 -1
- package/src/providers/integrations/perch/perch-credential.ts +25 -0
- package/src/providers/integrations/perch/perch-protocol.ts +0 -6
- package/src/providers/integrations/perch/perch-quota.ts +2 -16
- package/src/providers/integrations/perch/perch.ts +6 -16
- package/src/providers/integrations/qoder/claim-qoder-credits.ts +19 -60
- package/src/providers/integrations/qoder/qoder-adapter.ts +20 -125
- package/src/providers/integrations/qoder/qoder-auth.ts +109 -30
- package/src/providers/integrations/qoder/qoder-catalog.ts +21 -6
- package/src/providers/integrations/qoder/qoder-chat.ts +32 -29
- package/src/providers/integrations/qoder/qoder-checkin.ts +5 -5
- package/src/providers/integrations/qoder/qoder-cosy.ts +37 -9
- package/src/providers/integrations/qoder/qoder-oauth.ts +9 -2
- package/src/providers/integrations/qoder/qoder-realm.ts +13 -36
- package/src/providers/integrations/qoder/qoder-sse.ts +447 -68
- package/src/providers/integrations/qoder/qoder-types.ts +9 -0
- package/src/providers/integrations/qoder/qoder.ts +3 -26
- package/src/providers/integrations/sensenova/provider.ts +144 -0
- package/src/providers/integrations/trae/trae-protocol.ts +9 -5
- package/src/providers/integrations/trae/trae-quota.ts +21 -29
- package/src/providers/integrations/trae/trae-realm.ts +38 -0
- package/src/providers/integrations/trae/trae.ts +7 -24
- package/src/providers/integrations/vercel/provider.ts +117 -0
- package/src/providers/integrations/vercel/vercel-quota.ts +96 -0
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode-start-plan/gifts.ts +1 -1
- package/src/providers/integrations/zcode-start-plan/oauth.ts +3 -3
- package/src/providers/integrations/zcode-start-plan/provider.ts +226 -23
- package/src/providers/integrations/zcode-start-plan/quota.ts +19 -2
- package/src/providers/integrations/zro/zro.ts +205 -0
- package/src/providers/operations/account-error-classification.ts +199 -307
- package/src/providers/operations/account-health-service.ts +82 -1
- package/src/providers/operations/account-refresh-status.ts +36 -37
- package/src/providers/operations/account-tier.ts +15 -16
- package/src/providers/operations/client-version-resolver.ts +1 -1
- package/src/providers/operations/client-versions.ts +100 -81
- package/src/providers/operations/cooldown-rules.ts +11 -16
- package/src/providers/operations/oauth-refresh-lead.ts +46 -22
- package/src/providers/operations/{model-catalog-cache.ts → provider-caches.ts} +68 -16
- package/src/providers/operations/provider-catalog-service.ts +1 -1
- package/src/providers/operations/provider-credential-service.ts +118 -51
- package/src/providers/operations/provider-rules/github.ts +48 -0
- package/src/providers/operations/provider-rules/grok.ts +33 -0
- package/src/providers/operations/provider-rules/inception.ts +49 -0
- package/src/providers/operations/provider-rules/index.ts +32 -0
- package/src/providers/operations/provider-rules/perch.ts +37 -0
- package/src/providers/operations/provider-rules/qoder.ts +70 -0
- package/src/providers/operations/provider-rules/trae.ts +81 -0
- package/src/providers/operations/session-resolution.ts +17 -1
- package/src/providers/provider-contracts.ts +6 -4
- package/src/providers/{provider-credential-resolver.ts → provider-credentials.ts} +40 -3
- package/src/providers/provider-metadata.ts +70 -10
- package/src/providers/provider-probe.ts +15 -1
- package/src/providers/provider-registry.ts +42 -33
- package/src/providers/quota/quota-contracts.ts +2 -0
- package/src/providers/quota/quota-limit-windows.ts +16 -5
- package/src/providers/quota/quota-support.ts +1 -1
- package/src/providers/quota/quota-window-parser.ts +90 -18
- package/src/providers/quota/refresh.ts +100 -21
- package/src/security/api-key-auth-cache.ts +1 -1
- package/src/security/api-key-auth.ts +6 -2
- package/src/security/ip-boundary.ts +1 -1
- package/src/transport/dispatch/attempt-finalize.ts +15 -14
- package/src/transport/dispatch/attempt-loop.ts +73 -19
- package/src/transport/dispatch/generation.ts +2 -8
- package/src/transport/dispatch/handler-deps.ts +1 -1
- package/src/transport/dispatch/leases.ts +1 -1
- package/src/transport/dispatch/native-shared.ts +25 -0
- package/src/transport/dispatch/proxy-request.ts +8 -46
- package/src/transport/dispatch/responses-compact.ts +2 -8
- package/src/transport/dispatch/retry-policy.ts +1 -1
- package/src/transport/dispatch/streaming/finalize.ts +10 -7
- package/src/transport/dispatch/streaming/stream.ts +9 -37
- package/src/transport/dispatch/systemone.ts +2 -8
- package/src/transport/dispatch/token-count.ts +2 -6
- package/src/transport/dispatch/upstream.ts +63 -0
- package/src/transport/drain-endpoint.ts +31 -4
- package/src/transport/failure-policy.ts +16 -30
- package/src/transport/guards/body-policy.ts +7 -1
- package/src/transport/guards/error-lifecycle.ts +13 -1
- package/src/transport/guards/request-context.ts +22 -14
- package/src/transport/request/preparer.ts +81 -71
- package/src/transport/routing/bounded-lru.ts +14 -0
- package/src/transport/routing/drain-reserve.ts +129 -0
- package/src/transport/routing/plan-gate.ts +7 -1
- package/src/transport/routing/round-robin.ts +60 -0
- package/src/transport/routing/route-catalog.ts +123 -111
- package/src/transport/routing/route-model.ts +51 -9
- package/src/transport/routing/router.ts +393 -32
- package/src/transport/shutdown-notice.ts +1 -1
- package/src/transport/surface/adapters.ts +11 -2
- package/src/transport/surface/chat/adapter.ts +2 -2
- package/src/transport/surface/chat/encode.ts +47 -4
- package/src/transport/surface/chat/parse.ts +2 -12
- package/src/transport/surface/completion.ts +44 -33
- package/src/transport/surface/content-parts.ts +21 -0
- package/src/transport/surface/messages/adapter.ts +7 -1
- package/src/transport/surface/messages/encode.ts +11 -3
- package/src/transport/surface/messages/parse.ts +2 -1
- package/src/transport/surface/messages/stream.ts +33 -17
- package/src/transport/surface/responses/encode.ts +22 -5
- package/src/transport/surface/responses/parse.ts +3 -11
- package/src/workers/buddy-growth-tasks.ts +8 -8
- package/src/workers/daily-checkin.ts +4 -4
- package/src/workers/quota-refresh-sweep.ts +1 -1
- package/src/workers/zcode-gift-claim.ts +1 -1
- package/dist/dashboard/assets/BannedPage-BxoG1MrL.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-ixwgKk53.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-BmttNV3U.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BE3qwwfC.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CRZdmMIX.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-Dv_FJ6Er.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-CoVrw2sM.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-BOoO8rpz.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-ChJuNNVN.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BZAJtPg1.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BE40s3u5.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js +0 -8
- package/dist/dashboard/assets/ProviderDetailPage-sfLoQtPV.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CQ6bPUf_.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-DcepmPWo.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js +0 -9
- package/dist/dashboard/assets/ProxyPage-BJ87Pp0U.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js +0 -1
- package/dist/dashboard/assets/QuotaPage-gkSyRAKa.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-C5HPWqEv.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-CFNcATJJ.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-YoD4tY5l.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DxjaAhb_.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BTlkq_Uk.js.gz +0 -0
- package/dist/dashboard/assets/app-BX2nnKqs.css +0 -2
- package/dist/dashboard/assets/app-BX2nnKqs.css.gz +0 -0
- package/dist/dashboard/assets/assert-CndthXFQ.js +0 -1
- package/dist/dashboard/assets/assert-CndthXFQ.js.gz +0 -0
- package/dist/dashboard/assets/badge-DdbT_7Am.js.gz +0 -0
- package/dist/dashboard/assets/banner-CsGN-nbm.js.gz +0 -0
- package/dist/dashboard/assets/card-mgZ_TLLZ.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-A1-v8-03.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-CJ4Zty89.js.gz +0 -0
- package/dist/dashboard/assets/dialog-B5L2jPQ_.js.gz +0 -0
- package/dist/dashboard/assets/drawer-DkjUouAj.js.gz +0 -0
- package/dist/dashboard/assets/entry-B-LVLV6o.js.gz +0 -0
- package/dist/dashboard/assets/entry-CAhdYl3B.js.gz +0 -0
- package/dist/dashboard/assets/entry-D2xD0Tmd.js +0 -4
- package/dist/dashboard/assets/entry-D2xD0Tmd.js.gz +0 -0
- package/dist/dashboard/assets/formatters-CrsdLVsn.js.gz +0 -0
- package/dist/dashboard/assets/index-BU64Lqvp.js.gz +0 -0
- package/dist/dashboard/assets/inline-B2aDLyyg.js.gz +0 -0
- package/dist/dashboard/assets/input-BCVkdR9d.js.gz +0 -0
- package/dist/dashboard/assets/layout-DNcAdMK-.js.gz +0 -0
- package/dist/dashboard/assets/list-row-DgrIH0hw.js.gz +0 -0
- package/dist/dashboard/assets/live-Cae01iu8.js.gz +0 -0
- package/dist/dashboard/assets/network-CRib7H_2.js.gz +0 -0
- package/dist/dashboard/assets/numbers-BKQE8Xpz.js.gz +0 -0
- package/dist/dashboard/assets/pagination-ecPvG_8g.js.gz +0 -0
- package/dist/dashboard/assets/quota-DJ1QlAOq.js +0 -1
- package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
- package/dist/dashboard/assets/routing-Ckm1UXuC.js.gz +0 -0
- package/dist/dashboard/assets/select-ChoFWyKz.js.gz +0 -0
- package/dist/dashboard/assets/settings-CKjFPlKW.js.gz +0 -0
- package/dist/dashboard/assets/stack-DWCwU3fh.js.gz +0 -0
- package/dist/dashboard/assets/state-Cg3VL5J_.js.gz +0 -0
- package/dist/dashboard/assets/switch-Db70BMix.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BqdE0LuM.js.gz +0 -0
- package/src/network/pool-health.ts +0 -210
- package/src/providers/bundled-discovery-providers.ts +0 -98
- package/src/providers/configured-openai-providers.ts +0 -120
- package/src/providers/integrations/buddy/buddy-checkin.ts +0 -521
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +0 -76
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -130
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +0 -234
- package/src/providers/integrations/buddy/buddy-growth-shared.ts +0 -496
- package/src/providers/integrations/buddy/buddy-identity.ts +0 -300
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +0 -341
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +0 -417
- package/src/providers/integrations/buddy/buddy-server-tools.ts +0 -240
- package/src/providers/integrations/buddy/buddy-usage-shared.ts +0 -221
- package/src/providers/integrations/buddy/buddy-usage-store.ts +0 -181
- package/src/providers/integrations/buddy/codebuddy/cn-catalog.ts +0 -37
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +0 -185
- package/src/providers/integrations/buddy/codebuddy/oauth.ts +0 -47
- package/src/providers/integrations/buddy/codebuddy/provider.ts +0 -175
- package/src/providers/integrations/buddy/codebuddy/quota.ts +0 -154
- package/src/providers/integrations/qoder/chat-proto.ts +0 -328
- package/src/providers/integrations/qoder/qoder-grpc.ts +0 -871
- package/src/providers/integrations/qoder/qoder-ide.ts +0 -588
- package/src/providers/operations/model-discovery-cache.ts +0 -34
- package/src/providers/operations/probe-fetch.ts +0 -15
- package/src/providers/operations/provider-version-cache.ts +0 -30
- package/src/providers/provider-capabilities.ts +0 -33
- package/src/providers/provider-credential-envelope.ts +0 -43
- /package/dist/dashboard/assets/{app-B7kIWFm5.js → app-C0gTXEoN.js} +0 -0
- /package/dist/dashboard/assets/{app-B7kIWFm5.js.gz → app-C0gTXEoN.js.gz} +0 -0
- /package/src/network/{http2-bidi.ts → bidi.ts} +0 -0
- /package/src/network/pool/{pool-scripts.ts → scripts.ts} +0 -0
- /package/src/network/pool/{pool-state.ts → state.ts} +0 -0
- /package/src/network/{backoff.ts → util/backoff.ts} +0 -0
- /package/src/network/{deduplication.ts → util/dedupe.ts} +0 -0
- /package/src/network/{ip-utils.ts → util/ip.ts} +0 -0
|
@@ -1,77 +1,77 @@
|
|
|
1
1
|
{
|
|
2
|
-
"count":
|
|
2
|
+
"count": 122,
|
|
3
3
|
"assets": [
|
|
4
|
-
"assets/BannedPage-
|
|
5
|
-
"assets/CliToolDetailPage-
|
|
6
|
-
"assets/CliToolsPage-
|
|
7
|
-
"assets/CombosPage-
|
|
8
|
-
"assets/ConsoleLogPage-
|
|
9
|
-
"assets/CustomizationPage-
|
|
10
|
-
"assets/HealthEventsModal-
|
|
11
|
-
"assets/InjectSystemPromptPanel-
|
|
12
|
-
"assets/LoginPage-
|
|
13
|
-
"assets/ModelPicker-
|
|
14
|
-
"assets/OverviewPage-
|
|
15
|
-
"assets/ProviderDetailPage-
|
|
16
|
-
"assets/ProviderIcon-
|
|
17
|
-
"assets/ProvidersPage-
|
|
18
|
-
"assets/ProxyPage-
|
|
19
|
-
"assets/QuotaPage-
|
|
20
|
-
"assets/SettingsPage-
|
|
21
|
-
"assets/SetupPage-
|
|
22
|
-
"assets/StudioPage-
|
|
4
|
+
"assets/BannedPage-Dq530awD.js",
|
|
5
|
+
"assets/CliToolDetailPage-DZzaS-7S.js",
|
|
6
|
+
"assets/CliToolsPage-DaZZ3cqP.js",
|
|
7
|
+
"assets/CombosPage-BlC_xdkX.js",
|
|
8
|
+
"assets/ConsoleLogPage-D-rqeVtG.js",
|
|
9
|
+
"assets/CustomizationPage-7xT5yg2E.js",
|
|
10
|
+
"assets/HealthEventsModal-Clq8E9cW.js",
|
|
11
|
+
"assets/InjectSystemPromptPanel-6Teoq9Se.js",
|
|
12
|
+
"assets/LoginPage-CZuI0MAR.js",
|
|
13
|
+
"assets/ModelPicker-C1hNTlkr.js",
|
|
14
|
+
"assets/OverviewPage-0yfhSI1C.js",
|
|
15
|
+
"assets/ProviderDetailPage-xqTxdQ4c.js",
|
|
16
|
+
"assets/ProviderIcon-Ddhm1InL.js",
|
|
17
|
+
"assets/ProvidersPage-C3fYuu6i.js",
|
|
18
|
+
"assets/ProxyPage-CHtJtZ3u.js",
|
|
19
|
+
"assets/QuotaPage-D1RV_2BX.js",
|
|
20
|
+
"assets/SettingsPage-BzZAvYSX.js",
|
|
21
|
+
"assets/SetupPage--s-EfEIL.js",
|
|
22
|
+
"assets/StudioPage-BjXFGSK4.js",
|
|
23
23
|
"assets/ToolIcon-CfeLA-Z_.js",
|
|
24
|
-
"assets/UsagePage-
|
|
25
|
-
"assets/api-keys-
|
|
26
|
-
"assets/app-
|
|
27
|
-
"assets/app-
|
|
24
|
+
"assets/UsagePage-CP8F8BN7.js",
|
|
25
|
+
"assets/api-keys-2hc12Uz2.js",
|
|
26
|
+
"assets/app-C0gTXEoN.js",
|
|
27
|
+
"assets/app-DGXbNfAR.css",
|
|
28
28
|
"assets/arrow-left-CpBxkoxI.js",
|
|
29
29
|
"assets/arrow-right-Dl5yKnp8.js",
|
|
30
30
|
"assets/arrow-up-59ms1iiT.js",
|
|
31
|
-
"assets/assert-
|
|
31
|
+
"assets/assert-BMcj1xZE.js",
|
|
32
32
|
"assets/backup-file-gdKIlg8U.js",
|
|
33
|
-
"assets/badge-
|
|
33
|
+
"assets/badge-DkRUuVfz.js",
|
|
34
34
|
"assets/ban-durations-B58FyRxC.js",
|
|
35
|
-
"assets/banner-
|
|
35
|
+
"assets/banner-CDjW841Q.js",
|
|
36
36
|
"assets/brain-Cwed_72z.js",
|
|
37
|
-
"assets/card-
|
|
37
|
+
"assets/card-Bto5UlL9.js",
|
|
38
38
|
"assets/chevron-left-Bf6CaTSJ.js",
|
|
39
39
|
"assets/chevron-right-BXIy5l3h.js",
|
|
40
40
|
"assets/circle-alert-CntYHV5v.js",
|
|
41
41
|
"assets/circle-check-BU3v_mFW.js",
|
|
42
42
|
"assets/circle-question-mark-Cz4un8sH.js",
|
|
43
|
-
"assets/cli-tools-
|
|
44
|
-
"assets/clipboard-button-
|
|
43
|
+
"assets/cli-tools-DaH6g9hL.js",
|
|
44
|
+
"assets/clipboard-button-BYKBCzjk.js",
|
|
45
45
|
"assets/database-Dz9N3zGd.js",
|
|
46
|
-
"assets/dialog-
|
|
46
|
+
"assets/dialog-DL0Zftwv.js",
|
|
47
47
|
"assets/dialog-actions-B1axpEg7.js",
|
|
48
48
|
"assets/download-dRFo5_Wu.js",
|
|
49
|
-
"assets/drawer-
|
|
50
|
-
"assets/entry-
|
|
51
|
-
"assets/entry-
|
|
52
|
-
"assets/entry-
|
|
49
|
+
"assets/drawer-Dpx_UXaS.js",
|
|
50
|
+
"assets/entry-BV7-1NoM.js",
|
|
51
|
+
"assets/entry-CGvdNU6r.js",
|
|
52
|
+
"assets/entry-DScKYvZj.js",
|
|
53
53
|
"assets/eye-C_hawfH4.js",
|
|
54
54
|
"assets/eye-off-Bk5g2luF.js",
|
|
55
55
|
"assets/fingerprint-pattern-BWuHtbW4.js",
|
|
56
|
-
"assets/formatters-
|
|
56
|
+
"assets/formatters-BS3DZlZj.js",
|
|
57
57
|
"assets/gauge-BbIMy7MB.js",
|
|
58
58
|
"assets/house-h9AZlJuT.js",
|
|
59
59
|
"assets/image-BPaouViG.js",
|
|
60
|
-
"assets/index-
|
|
61
|
-
"assets/inline-
|
|
62
|
-
"assets/input-
|
|
60
|
+
"assets/index-SQnvvTWX.js",
|
|
61
|
+
"assets/inline-Dl-cuLK0.js",
|
|
62
|
+
"assets/input-Bfx0EzRc.js",
|
|
63
63
|
"assets/jsx-runtime-CXUMngI_.js",
|
|
64
64
|
"assets/key-round-UkavsGxp.js",
|
|
65
65
|
"assets/layers-2-glBbjl.js",
|
|
66
|
-
"assets/layout-
|
|
67
|
-
"assets/list-row-
|
|
68
|
-
"assets/live-
|
|
66
|
+
"assets/layout-BxhbQ_JS.js",
|
|
67
|
+
"assets/list-row-D49Y4ptn.js",
|
|
68
|
+
"assets/live-CbVTdX9V.js",
|
|
69
69
|
"assets/log-in-BmRjy60c.js",
|
|
70
70
|
"assets/message-circle-CCxGwRvv.js",
|
|
71
71
|
"assets/mutation-BQ0ccH_A.js",
|
|
72
|
-
"assets/network-
|
|
73
|
-
"assets/numbers-
|
|
74
|
-
"assets/pagination-
|
|
72
|
+
"assets/network-JGvDveof.js",
|
|
73
|
+
"assets/numbers-Dw6kiew-.js",
|
|
74
|
+
"assets/pagination-iUoI8GeE.js",
|
|
75
75
|
"assets/pencil-768ysRAr.js",
|
|
76
76
|
"assets/plus-DIdX_g-x.js",
|
|
77
77
|
"assets/power-off-Yjw9GMJh.js",
|
|
@@ -95,22 +95,23 @@
|
|
|
95
95
|
"assets/providers/parallel.svg",
|
|
96
96
|
"assets/providers/tokenharbor.svg",
|
|
97
97
|
"assets/providers/windsurf.svg",
|
|
98
|
+
"assets/providers/zro.svg",
|
|
98
99
|
"assets/query-keys-IKLh0YFd.js",
|
|
99
|
-
"assets/quota-
|
|
100
|
+
"assets/quota-DiPD6UKH.js",
|
|
100
101
|
"assets/refresh-cw-BqJFk4sU.js",
|
|
101
102
|
"assets/rotate-ccw-CufcqITi.js",
|
|
102
103
|
"assets/route-CNSNj9Zm.js",
|
|
103
|
-
"assets/routing-
|
|
104
|
+
"assets/routing-8jZr-3WE.js",
|
|
104
105
|
"assets/scaling-nWE4Cx8f.js",
|
|
105
106
|
"assets/search-JOKus9rb.js",
|
|
106
|
-
"assets/select-
|
|
107
|
+
"assets/select-oO1FxMVb.js",
|
|
107
108
|
"assets/settings-2-Ds9DQp0t.js",
|
|
108
|
-
"assets/settings-
|
|
109
|
+
"assets/settings-CLr3kdIx.js",
|
|
109
110
|
"assets/shield-BMQNxORh.js",
|
|
110
111
|
"assets/shield-check-DVS0Foqh.js",
|
|
111
|
-
"assets/stack-
|
|
112
|
-
"assets/state-
|
|
113
|
-
"assets/switch-
|
|
112
|
+
"assets/stack-Y3pDteZr.js",
|
|
113
|
+
"assets/state-CArX_Iak.js",
|
|
114
|
+
"assets/switch-DwlwmDO-.js",
|
|
114
115
|
"assets/terminal-0_IjPWTk.js",
|
|
115
116
|
"assets/tokens-COzario9.js",
|
|
116
117
|
"assets/trash-Cppn5c3R.js",
|
|
@@ -118,7 +119,7 @@
|
|
|
118
119
|
"assets/use-modal-focus-By7oJoGd.js",
|
|
119
120
|
"assets/use-reduced-motion-C4B0R6Sz.js",
|
|
120
121
|
"assets/use-timeout-BwcBBRrT.js",
|
|
121
|
-
"assets/useMutation-
|
|
122
|
+
"assets/useMutation-DJ9GYEgf.js",
|
|
122
123
|
"assets/wrench-B6E1oEuY.js",
|
|
123
124
|
"assets/zap-C4EeVW4q.js",
|
|
124
125
|
"index.html"
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
-- Freshness stamp for `quota_plan`: the plan column is a bare string, so
|
|
2
|
+
-- routing cannot tell a fresh read from a stale one. This timestamp is written
|
|
3
|
+
-- together with `quota_plan` on a successful quota fetch and lets the routing
|
|
4
|
+
-- engine downgrade a plan older than the freshness horizon to `unknown`
|
|
5
|
+
-- instead of trusting it blindly.
|
|
6
|
+
ALTER TABLE "provider_accounts"
|
|
7
|
+
ADD COLUMN IF NOT EXISTS "quota_plan_fetched_at" timestamptz;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
-- Adds `provider_routing_settings.device_flow_proxy` (text, NOT NULL, default
|
|
2
|
+
-- 'random') — how device-code OAuth flows (start + poll) choose their egress.
|
|
3
|
+
--
|
|
4
|
+
-- 'random' (default) — route the device-authorization and token-poll
|
|
5
|
+
-- requests through a randomly selected active network pool. The upstream
|
|
6
|
+
-- sees a rotating IP, which prevents "multiple codes from one IP"
|
|
7
|
+
-- detection for Cursor/Grok/device-code providers.
|
|
8
|
+
-- 'direct' — always dial direct egress (the old behavior). Explicitly
|
|
9
|
+
-- selected by the operator, e.g. when pools are unavailable or the
|
|
10
|
+
-- provider must see one stable address.
|
|
11
|
+
--
|
|
12
|
+
-- Idempotency comes from the migration ledger, not from the statement: the
|
|
13
|
+
-- runner records the file inside the same transaction, so a file that has
|
|
14
|
+
-- already run is never re-executed. The baseline is generated from
|
|
15
|
+
-- `0000_baseline.sql` alone and does not carry this column.
|
|
16
|
+
ALTER TABLE "provider_routing_settings"
|
|
17
|
+
ADD COLUMN IF NOT EXISTS "device_flow_proxy" text NOT NULL DEFAULT 'random';
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
-- Adds `provider_routing_settings.device_flow_proxy` (text, NOT NULL, default
|
|
2
|
+
-- 'random') — how device-code OAuth flows (start + poll) choose their egress.
|
|
3
|
+
--
|
|
4
|
+
-- 'random' (default) — route the device-authorization and token-poll
|
|
5
|
+
-- requests through a randomly selected active network pool. The upstream
|
|
6
|
+
-- sees a rotating IP, which prevents "multiple codes from one IP"
|
|
7
|
+
-- detection for Cursor/Grok/device-code providers.
|
|
8
|
+
-- 'direct' — always dial direct egress (the old behavior). Explicitly
|
|
9
|
+
-- selected by the operator, e.g. when pools are unavailable or the
|
|
10
|
+
-- provider must see one stable address.
|
|
11
|
+
--
|
|
12
|
+
-- SQLite stores text as-is; a default is baked into the column so existing
|
|
13
|
+
-- rows read as 'random' without a backfill.
|
|
14
|
+
--
|
|
15
|
+
-- Idempotency comes from the migration ledger, not from the statement: the
|
|
16
|
+
-- runner records the file inside the same transaction, so a file that has
|
|
17
|
+
-- already run is never re-executed. The baseline is generated from
|
|
18
|
+
-- `0000_baseline.sql` alone and does not carry this column.
|
|
19
|
+
ALTER TABLE "provider_routing_settings" ADD COLUMN "device_flow_proxy" text NOT NULL DEFAULT 'random';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "cartethyia",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.8.1",
|
|
4
4
|
"description": "A powerful, self-hosted reverse proxy for OpenAI- and Anthropic-compatible AI clients, powered by native Bun and Elysia. It serves both protocols from a single server, routes every model across any configured provider, and translates requests and responses in real time — streaming and prompt caching included. Underneath it runs a full delivery engine: per-account health tracking, quota and cooldown enforcement, automatic failover across pools and providers, usage accounting, and telemetry. Point OpenCode, Cline, Claude Code, Codex, or any compatible client at Cartethyia and it keeps its native protocol while the gateway absorbs every provider-specific difference behind it. Runs on embedded SQLite or external PostgreSQL with optional Redis coordination, ships as a global CLI with a system-tray console, and needs only Bun 1.4+ alongside Node.js/npm.",
|
|
5
5
|
"license": "GPL-3.0-only",
|
|
6
6
|
"type": "module",
|
package/src/boot/app.ts
CHANGED
|
@@ -10,7 +10,7 @@ import { chatAdapter } from "../transport/surface/chat/adapter";
|
|
|
10
10
|
import { responsesAdapter } from "../transport/surface/responses/adapter";
|
|
11
11
|
import { messagesAdapter } from "../transport/surface/messages/adapter";
|
|
12
12
|
import { completionAdapter } from "../transport/surface/completion";
|
|
13
|
-
import { SurfaceAdapterRegistry } from "../transport/surface/adapters";
|
|
13
|
+
import { SurfaceAdapterRegistry, type SurfaceAdapter } from "../transport/surface/adapters";
|
|
14
14
|
import { GatewayError, publicGatewayErrorBody } from "../protocol/gateway-error";
|
|
15
15
|
import { shutdownError, shutdownNotice } from "../transport/shutdown-notice";
|
|
16
16
|
import type { CanonicalAdapter } from "../transport/contracts";
|
|
@@ -47,7 +47,7 @@ import {
|
|
|
47
47
|
import { createTokenCountHandler } from "../transport/dispatch/token-count";
|
|
48
48
|
|
|
49
49
|
import { createTransportPipeline } from "../transport/guards/pipeline";
|
|
50
|
-
import { createDrainHandler,
|
|
50
|
+
import { createDrainHandler, requireLoopbackAdmin } from "../transport/drain-endpoint";
|
|
51
51
|
import { createConsoleAccountResetHandler } from "../console/auth/account-reset";
|
|
52
52
|
import { resetConsoleAuthState } from "../console/auth/account-reset-store";
|
|
53
53
|
import { createBackupExportHandler } from "../console/backup/export-endpoint";
|
|
@@ -58,7 +58,7 @@ import type { ReadinessCheckResult } from "../persistence/readiness";
|
|
|
58
58
|
import type { RouteSnapshotService } from "../transport/routing/route-model";
|
|
59
59
|
import type { TrustedProxyBoundary } from "../config/network";
|
|
60
60
|
import { resolveClientIdentity } from "../security/ip-boundary";
|
|
61
|
-
import type { ValidatedNetworkBindingFactory } from "../network/
|
|
61
|
+
import type { ValidatedNetworkBindingFactory } from "../network/egress/factory";
|
|
62
62
|
import { metrics } from "../observability/metrics";
|
|
63
63
|
import type { RuntimeMetricsSampler } from "../observability/runtime-metrics";
|
|
64
64
|
import { API_CONTENT_SECURITY_POLICY, X_FRAME_OPTIONS } from "../security/outbound-headers";
|
|
@@ -210,7 +210,7 @@ export function createGatewayApp(deps: GatewayAppDeps) {
|
|
|
210
210
|
deps.mode === "route-only"
|
|
211
211
|
? (deps.checkRedis ?? checkRedisConnection)
|
|
212
212
|
: checkRedisConnection;
|
|
213
|
-
const registry = new SurfaceAdapterRegistry([
|
|
213
|
+
const registry = new SurfaceAdapterRegistry<SurfaceAdapter & CanonicalAdapter>([
|
|
214
214
|
chatAdapter,
|
|
215
215
|
responsesAdapter,
|
|
216
216
|
messagesAdapter,
|
|
@@ -424,12 +424,7 @@ export function createGatewayApp(deps: GatewayAppDeps) {
|
|
|
424
424
|
db: deps.db,
|
|
425
425
|
stateStore: requestStateStore,
|
|
426
426
|
surfaceRegistry: registry,
|
|
427
|
-
adapters: new Map<string, CanonicalAdapter>(
|
|
428
|
-
["chat", chatAdapter],
|
|
429
|
-
["responses", responsesAdapter],
|
|
430
|
-
["messages", messagesAdapter],
|
|
431
|
-
["completion", completionAdapter],
|
|
432
|
-
]),
|
|
427
|
+
adapters: new Map<string, CanonicalAdapter>(registry.bySurface()),
|
|
433
428
|
preparer: deps.proxyPreparer,
|
|
434
429
|
readiness: deps.readiness,
|
|
435
430
|
trustedProxyBoundary: deps.trustedProxyBoundary,
|
|
@@ -652,10 +647,12 @@ export function createGatewayApp(deps: GatewayAppDeps) {
|
|
|
652
647
|
// well-formed. What refused it is where it came from — the client asked
|
|
653
648
|
// for something only the local host may ask. `invalid_request` told an
|
|
654
649
|
// operator to fix the body, when the body was never the problem.
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
650
|
+
requireLoopbackAdmin(request, {
|
|
651
|
+
peer: peerAddresses.get(request) ?? null,
|
|
652
|
+
token,
|
|
653
|
+
policyRejectedMessage: "task trigger is only available from loopback (request {requestId}). This operation is only allowed from a trusted loopback connection — no hard feelings 🫂",
|
|
654
|
+
authenticationFailedMessage: "invalid drain token (request {requestId}). Wrong key, right door — check the token 🔑",
|
|
655
|
+
});
|
|
659
656
|
const name = params.name;
|
|
660
657
|
if (!tasks.names().includes(name))
|
|
661
658
|
throw new GatewayError("not_found", 404, `no such task: ${name} (request {requestId}). Nothing here but dust — check the task name 🌙`);
|
package/src/boot/dependencies.ts
CHANGED
|
@@ -43,12 +43,10 @@ import { InMemoryIpAbuseStore, IpAbuseProtectionService, RedisIpAbuseStore, type
|
|
|
43
43
|
import { checkReadiness } from "../persistence/readiness";
|
|
44
44
|
import { ProxyRequestPreparer } from "../transport/request/preparer";
|
|
45
45
|
import { DrizzleNetworkPoolLoader } from "../network/pool/loader";
|
|
46
|
-
import {
|
|
47
|
-
|
|
48
|
-
ValidatedNetworkBindingFactory,
|
|
49
|
-
} from "../network/pool/resolver";
|
|
46
|
+
import { PoolAgentResolver } from "../network/pool/resolver";
|
|
47
|
+
import { ValidatedNetworkBindingFactory } from "../network/egress/factory";
|
|
50
48
|
import { NetworkPoolSelector } from "../network/pool/selector";
|
|
51
|
-
import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool
|
|
49
|
+
import { restorePoolProbeVerdicts, restoreProviderCooldownMarkers } from "../network/pool/cooldown-store";
|
|
52
50
|
import { ScheduledTaskRegistry } from "../workers/scheduler";
|
|
53
51
|
import { quotaRefreshSweep } from "../workers/quota-refresh-sweep";
|
|
54
52
|
import { registerZcodeGiftClaimTask } from "../workers/zcode-gift-claim";
|
|
@@ -62,12 +60,12 @@ import {
|
|
|
62
60
|
} from "../workers/buddy-growth-tasks";
|
|
63
61
|
import { createAccountSecretResolver } from "../providers/operations/provider-credential-service";
|
|
64
62
|
import { quotaCacheSize } from "../providers/quota/cache";
|
|
65
|
-
import { modelCatalogCacheSize } from "../providers/operations/
|
|
63
|
+
import { modelCatalogCacheSize } from "../providers/operations/provider-caches";
|
|
66
64
|
import { preferencesReaderFor } from "../persistence/tenant-preferences";
|
|
67
65
|
import { sweepExpiredCooldowns } from "../providers/operations/account-health-service";
|
|
68
66
|
import { DrizzleTelemetryStore } from "../persistence/stores/telemetry-store";
|
|
69
67
|
import { TelemetryPayloadCapture } from "../observability/payload-capture";
|
|
70
|
-
import { sweepExpiredPoolCooldowns } from "../network/pool
|
|
68
|
+
import { sweepExpiredPoolCooldowns } from "../network/pool/health";
|
|
71
69
|
import { TelemetryBatchBuffer } from "../observability/telemetry-buffer";
|
|
72
70
|
import { RuntimeMetricsSampler } from "../observability/runtime-metrics";
|
|
73
71
|
import {
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
// Shared drain sequence for the process's queued writers. The console's manual
|
|
2
|
+
// "flush now" and the shutdown coordinator's telemetry flush must drain exactly
|
|
3
|
+
// the same buffers in the same order — a fourth writer added to one path but
|
|
4
|
+
// not the other would silently stop reaching the disk on one of them.
|
|
5
|
+
//
|
|
6
|
+
// The deps are the minimal write surface each buffer exposes: a `flush()` that
|
|
7
|
+
// resolves when the buffer is drained. The concrete buffers satisfy it, and a
|
|
8
|
+
// test can substitute stubs without casting.
|
|
9
|
+
export interface FlushAllBuffersDeps {
|
|
10
|
+
readonly telemetryBuffer: { flush(): Promise<void> };
|
|
11
|
+
readonly usageFlush: { flush(): Promise<void> };
|
|
12
|
+
readonly healthEventFlush: { flush(): Promise<void> };
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/** Drains every buffered writer, in the canonical order. */
|
|
16
|
+
export async function flushAllBuffers(deps: FlushAllBuffersDeps): Promise<void> {
|
|
17
|
+
await deps.telemetryBuffer.flush();
|
|
18
|
+
await deps.usageFlush.flush();
|
|
19
|
+
await deps.healthEventFlush.flush();
|
|
20
|
+
}
|
package/src/boot/lifecycle.ts
CHANGED
|
@@ -2,6 +2,7 @@ import { closeDb } from "../persistence/boot";
|
|
|
2
2
|
import { closeRedis } from "../persistence/redis";
|
|
3
3
|
import { buildProductionDeps } from "./dependencies";
|
|
4
4
|
import type { ProductionDeps } from "./dependencies";
|
|
5
|
+
import { flushAllBuffers } from "./flush";
|
|
5
6
|
import { withTimeout } from "./timeout";
|
|
6
7
|
import { resolveShutdownDrainWindowMs } from "../config/runtime";
|
|
7
8
|
import { log } from "../observability/logger";
|
|
@@ -35,8 +36,11 @@ export class ShutdownCoordinator {
|
|
|
35
36
|
) {
|
|
36
37
|
this.hooks = hooks ?? {};
|
|
37
38
|
this.drainWindowMs = opts?.drainWindowMs ?? 20_000;
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
// Defaults mirror what `bootstrap()` passes (8_000 / 1_000; drainWindowMs
|
|
40
|
+
// 20_000 is the spec default `resolveShutdownDrainWindowMs()` returns), so
|
|
41
|
+
// reasoning about drain timing from the class alone matches production.
|
|
42
|
+
this.drainTimeoutMs = opts?.drainTimeoutMs ?? 8_000;
|
|
43
|
+
this.flushTimeoutMs = opts?.flushTimeoutMs ?? 1_000;
|
|
40
44
|
}
|
|
41
45
|
|
|
42
46
|
/**
|
|
@@ -217,9 +221,7 @@ export async function bootstrap(): Promise<CartethyiaBoot> {
|
|
|
217
221
|
shutdownCoordinator: new ShutdownCoordinator(
|
|
218
222
|
{
|
|
219
223
|
flushTelemetry: async () => {
|
|
220
|
-
await deps
|
|
221
|
-
await deps.usageFlush.flush();
|
|
222
|
-
await deps.healthEventFlush.flush();
|
|
224
|
+
await flushAllBuffers(deps);
|
|
223
225
|
},
|
|
224
226
|
closePools: async () => {
|
|
225
227
|
await boot.server?.stop();
|
package/src/config/providers.ts
CHANGED
|
@@ -94,11 +94,12 @@ export function resolveGithubEnterpriseDomain(): string {
|
|
|
94
94
|
export type GithubCopilotMode = "opencode-copilot" | "vscode-client-real";
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
|
-
*
|
|
98
|
-
* `opencode-copilot`
|
|
99
|
-
*
|
|
100
|
-
*
|
|
101
|
-
*
|
|
97
|
+
* Selects the complete GitHub Copilot profile for OAuth login/refresh,
|
|
98
|
+
* inference, discovery, and quota identity. `opencode-copilot` is the default
|
|
99
|
+
* and uses the raw GitHub OAuth token with OpenCode identity. `vscode-client-real`
|
|
100
|
+
* uses the VS Code OAuth app and a minted Copilot token. Existing accounts must
|
|
101
|
+
* be re-authenticated after changing profiles; the upstream OAuth app binding
|
|
102
|
+
* prevents converting credentials between profiles.
|
|
102
103
|
*/
|
|
103
104
|
export function resolveGithubCopilotMode(): GithubCopilotMode {
|
|
104
105
|
const raw = readText(
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
// Routing configuration knobs.
|
|
2
|
+
import { CONFIG_SPEC, readInt } from "./spec";
|
|
3
|
+
|
|
4
|
+
/** Routing reserve percent (0–100). Accounts at/below this remaining-quota % are demoted. */
|
|
5
|
+
export function accountReservePct(): number {
|
|
6
|
+
return readInt(
|
|
7
|
+
"CARTETHYIA_ACCOUNT_RESERVE_PCT",
|
|
8
|
+
CONFIG_SPEC.CARTETHYIA_ACCOUNT_RESERVE_PCT,
|
|
9
|
+
);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Session-sticky warm window in ms. 0 disables stickiness. */
|
|
13
|
+
export function routingStickyWarmMs(): number {
|
|
14
|
+
return readInt(
|
|
15
|
+
"CARTETHYIA_ROUTING_STICKY_WARM_MS",
|
|
16
|
+
CONFIG_SPEC.CARTETHYIA_ROUTING_STICKY_WARM_MS,
|
|
17
|
+
);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** LRU cap on remembered session→account sticky state per provider. */
|
|
21
|
+
export function routingStickyMaxSessions(): number {
|
|
22
|
+
return readInt(
|
|
23
|
+
"CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS",
|
|
24
|
+
CONFIG_SPEC.CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS,
|
|
25
|
+
);
|
|
26
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared metadata for config docs and tests.
|
|
3
|
+
*
|
|
4
|
+
* `CONFIG_SPEC` declares the gateway's spec-driven variables. These constants
|
|
5
|
+
* name the deliberate asymmetries around it so `.env.example`, the generated
|
|
6
|
+
* reference, and the drift tests all project the same exception lists.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** Keys in `CONFIG_SPEC` that are intentionally absent from `.env.example`. */
|
|
10
|
+
export const SPEC_ONLY_ENV_EXAMPLE_KEYS: Readonly<Record<string, true>> = {
|
|
11
|
+
// Setup wizard writes this directly; a sample would mislead copy/paste.
|
|
12
|
+
CARTETHYIA_API_KEY: true,
|
|
13
|
+
// Opt-in diagnostics; sampling them would nudge operators to enable them.
|
|
14
|
+
CARTETHYIA_FORCED_GC: true,
|
|
15
|
+
CARTETHYIA_RUNTIME_METRICS_INTERVAL_MS: true,
|
|
16
|
+
// Advanced knobs documented in the generated configuration reference.
|
|
17
|
+
CARTETHYIA_DISABLED_TASKS: true,
|
|
18
|
+
// Install-identity directory; only operators who need a stable identity
|
|
19
|
+
// across restarts touch it, and the reference covers it.
|
|
20
|
+
CARTETHYIA_INSTALL_ID_DIR: true,
|
|
21
|
+
CARTETHYIA_OAUTH_CALLBACK_PORT: true,
|
|
22
|
+
// Provider-specific overrides. Readers live in `src/config/providers.ts`;
|
|
23
|
+
// the majority of installs do not need them in the starter sample.
|
|
24
|
+
CARTETHYIA_KIMI_OAUTH_HOST: true,
|
|
25
|
+
CARTETHYIA_KIMI_QUOTA_BASE_URL: true,
|
|
26
|
+
CARTETHYIA_GITHUB_ENTERPRISE_DOMAIN: true,
|
|
27
|
+
CARTETHYIA_OPENCODE_UNAVAILABLE_FREE: true,
|
|
28
|
+
// Telemetry retention is deployment-level and documented in the reference.
|
|
29
|
+
CARTETHYIA_TELEMETRY_RETENTION_DAYS: true,
|
|
30
|
+
CARTETHYIA_TELEMETRY_PAYLOAD_MAX_BYTES: true,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/** Keys in `.env.example` that `CONFIG_SPEC` does not declare. */
|
|
34
|
+
export const ENV_EXAMPLE_ONLY_KEYS: Readonly<Record<string, true>> = {
|
|
35
|
+
// Read outside `src/config/` by their owning modules.
|
|
36
|
+
CARTETHYIA_DB_MODE: true,
|
|
37
|
+
NODE_ENV: true,
|
|
38
|
+
LOG_LEVEL: true,
|
|
39
|
+
DATABASE_URL: true,
|
|
40
|
+
DATABASE_POOL_MAX: true,
|
|
41
|
+
DATABASE_POOL_IDLE_FLOOR: true,
|
|
42
|
+
REDIS_URL: true,
|
|
43
|
+
CARTETHYIA_DATA_DIR: true,
|
|
44
|
+
CARTETHYIA_TELEMETRY_PAYLOAD_DIR: true,
|
|
45
|
+
CARTETHYIA_CONFIG_DIR: true,
|
|
46
|
+
DASHBOARD_PORT: true,
|
|
47
|
+
VITE_BACKEND_URL: true,
|
|
48
|
+
// Test-runner-only knob, not read by the gateway runtime.
|
|
49
|
+
CARTETHYIA_TEST_JOBS: true,
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Operator-visible variables that are intentionally outside `CONFIG_SPEC` and
|
|
54
|
+
* therefore omitted from the generated configuration reference.
|
|
55
|
+
*/
|
|
56
|
+
export const CONFIG_REFERENCE_EXTERNAL_VARIABLES = [
|
|
57
|
+
"CARTETHYIA_DB_MODE",
|
|
58
|
+
"DATABASE_URL",
|
|
59
|
+
"REDIS_URL",
|
|
60
|
+
"NODE_ENV",
|
|
61
|
+
"LOG_LEVEL",
|
|
62
|
+
"DATABASE_POOL_MAX",
|
|
63
|
+
"DATABASE_POOL_IDLE_FLOOR",
|
|
64
|
+
"CARTETHYIA_DATA_DIR",
|
|
65
|
+
"CARTETHYIA_TELEMETRY_PAYLOAD_DIR",
|
|
66
|
+
"CARTETHYIA_CONFIG_DIR",
|
|
67
|
+
"DASHBOARD_PORT",
|
|
68
|
+
"VITE_BACKEND_URL",
|
|
69
|
+
"CARTETHYIA_TEST_DATABASE_URL",
|
|
70
|
+
"CARTETHYIA_TEST_JOBS",
|
|
71
|
+
"CARTETHYIA_REDIS_URL",
|
|
72
|
+
] as const;
|
package/src/config/spec.ts
CHANGED
|
@@ -264,6 +264,26 @@ export const CONFIG_SPEC = {
|
|
|
264
264
|
CARTETHYIA_ACCOUNT_AUTH_REJECTED_COOLDOWN_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
|
|
265
265
|
CARTETHYIA_ACCOUNT_POLICY_BLOCK_COOLDOWN_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
|
|
266
266
|
CARTETHYIA_ACCOUNT_DISABLED_RECOVERY_MS: { kind: "int", default: 86_400_000, min: 0, max: 604_800_000 },
|
|
267
|
+
/**
|
|
268
|
+
* Routing reserve: an account whose remaining quota fraction falls at or
|
|
269
|
+
* below this percent is demoted behind non-reserve siblings during ordering
|
|
270
|
+
* (it is still eligible and still routed — a reserve is a preference, never
|
|
271
|
+
* an exclusion). 0 disables reserve demotion for every account.
|
|
272
|
+
*/
|
|
273
|
+
CARTETHYIA_ACCOUNT_RESERVE_PCT: { kind: "int", default: 20, min: 0, max: 100 },
|
|
274
|
+
/**
|
|
275
|
+
* Session stickiness warm window (milliseconds). Within this window after an
|
|
276
|
+
* account last served a session id, routing prefers that account when it is
|
|
277
|
+
* still eligible — prompt-cache warmth is worth more than perfect load
|
|
278
|
+
* balance. Past the window, the sticky account is only an ordering hint.
|
|
279
|
+
* 0 disables stickiness.
|
|
280
|
+
*/
|
|
281
|
+
CARTETHYIA_ROUTING_STICKY_WARM_MS: { kind: "int", default: 300_000, min: 0, max: 86_400_000 },
|
|
282
|
+
/**
|
|
283
|
+
* Hard ceiling on distinct session ids whose sticky state is retained in
|
|
284
|
+
* memory per provider (LRU). Evicted sessions simply lose their preference.
|
|
285
|
+
*/
|
|
286
|
+
CARTETHYIA_ROUTING_STICKY_MAX_SESSIONS: { kind: "int", default: 256, min: 1, max: 10_000 },
|
|
267
287
|
|
|
268
288
|
// Proxy pool agents
|
|
269
289
|
CARTETHYIA_PROXY_MAX_SOCKETS: { kind: "int", default: 100, min: 1, max: 100_000 },
|
|
@@ -306,15 +326,15 @@ export const CONFIG_SPEC = {
|
|
|
306
326
|
*/
|
|
307
327
|
CARTETHYIA_GITHUB_ENTERPRISE_DOMAIN: { kind: "text", default: "" },
|
|
308
328
|
/**
|
|
309
|
-
*
|
|
310
|
-
*
|
|
329
|
+
* Selects the complete GitHub Copilot OAuth and wire profile:
|
|
330
|
+
*
|
|
331
|
+
* - `opencode-copilot` (default): OpenCode OAuth app, raw GitHub token, and
|
|
332
|
+
* OpenCode identity for login, refresh, inference, discovery, and quota.
|
|
333
|
+
* - `vscode-client-real`: VS Code OAuth app, minted Copilot token, and the
|
|
334
|
+
* VS Code reference identity for those surfaces.
|
|
311
335
|
*
|
|
312
|
-
*
|
|
313
|
-
*
|
|
314
|
-
* expiry. This is the most stable in practice.
|
|
315
|
-
* - `vscode-client-real`: a freshly minted Copilot token + the full VS Code
|
|
316
|
-
* reference headers. Matches the VS Code client exactly, but requires the
|
|
317
|
-
* minted token (expires ~25 min) and the reference identity.
|
|
336
|
+
* Restart after changing this setting and re-authenticate GitHub accounts;
|
|
337
|
+
* OAuth credentials cannot be converted between the two upstream apps.
|
|
318
338
|
*/
|
|
319
339
|
CARTETHYIA_GITHUB_COPILOT_MODE: { kind: "text", default: "opencode-copilot" },
|
|
320
340
|
// Only the literal true opts active ZCode accounts into daily gift claims.
|
|
@@ -11,7 +11,7 @@ import { type ShareLinkStore, type ShareLinkSummary } from "../../persistence/st
|
|
|
11
11
|
import { API_KEY_MODES, API_KEY_CONCURRENCY_SCOPES, type ApiKeyMode, type ApiKeyModelAccessMode, type ShareLinkKind } from "../../persistence/schema";
|
|
12
12
|
import { isValidTenantKeyScope, type AccessScope } from "../../security/access-control";
|
|
13
13
|
import { normalizeClientRouterId } from "../../security/client-router-fingerprint";
|
|
14
|
-
import type { ShareActivityPort } from "../share/share-usage";
|
|
14
|
+
import type { ShareActivityPort, SharedKeySummary } from "../share/share-usage";
|
|
15
15
|
import { ConsoleDomainError } from "../shared/errors";
|
|
16
16
|
import { pickDefined } from "../shared/object";
|
|
17
17
|
import type { ConsoleAccessResolver } from "../auth/access";
|
|
@@ -35,6 +35,17 @@ export type {
|
|
|
35
35
|
SharedKeySummary,
|
|
36
36
|
SharedKeyActivityDetail,
|
|
37
37
|
} from "../share/share-usage";
|
|
38
|
+
|
|
39
|
+
/** Paged response of the share-child list endpoint. */
|
|
40
|
+
export interface SharedKeyPage {
|
|
41
|
+
readonly rows: readonly SharedKeySummary[];
|
|
42
|
+
readonly total: number;
|
|
43
|
+
readonly active: number;
|
|
44
|
+
readonly revoked: number;
|
|
45
|
+
/** Family-wide lifetime tokens consumed, independent of the page. */
|
|
46
|
+
readonly consumed: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
38
49
|
/** How a share template's concurrency cap applies to its recipients. */
|
|
39
50
|
export type ConcurrencyScope = (typeof API_KEY_CONCURRENCY_SCOPES)[number];
|
|
40
51
|
|