cartethyia 2.5.4 → 2.5.6
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 +13 -4
- package/README.md +2 -2
- package/dist/dashboard/assets/{BannedPage-C2orBsI2.js → BannedPage-CADDq4IU.js} +1 -1
- package/dist/dashboard/assets/BannedPage-CADDq4IU.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-_z1hID7E.js +1 -0
- package/dist/dashboard/assets/CliToolDetailPage-_z1hID7E.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BV6pxVQo.js → CliToolsPage-DuO1Z7dq.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-DuO1Z7dq.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DNEPi3xU.js +1 -0
- package/dist/dashboard/assets/CombosPage-DNEPi3xU.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-CW-wPmJ6.js → ConsoleLogPage-BVdpfiz1.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-BVdpfiz1.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-0p8uX7vB.js → CustomizationPage-BR5HHvbi.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-BR5HHvbi.js.gz +0 -0
- package/dist/dashboard/assets/{HealthEventsModal-BjqSMfko.js → HealthEventsModal-mUfcknqm.js} +1 -1
- package/dist/dashboard/assets/HealthEventsModal-mUfcknqm.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-BvzCx8Kr.js → LoginPage-V5faV9V2.js} +1 -1
- package/dist/dashboard/assets/LoginPage-V5faV9V2.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-C7pDb41R.js +1 -0
- package/dist/dashboard/assets/ModelPicker-C7pDb41R.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BDu20Jdx.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BDu20Jdx.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-Dllr_aFO.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-Dllr_aFO.js.gz +0 -0
- package/dist/dashboard/assets/{ProvidersPage-Js9jUPSb.js → ProvidersPage-uPiGVTTK.js} +1 -1
- package/dist/dashboard/assets/ProvidersPage-uPiGVTTK.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-BaUkO-4O.js +7 -0
- package/dist/dashboard/assets/ProxyPage-BaUkO-4O.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-o0IFAsFb.js +1 -0
- package/dist/dashboard/assets/QuotaPage-o0IFAsFb.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CYWqbXjp.js +1 -0
- package/dist/dashboard/assets/SettingsPage-CYWqbXjp.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-DDbMQsoo.js → SetupPage-UB690SE2.js} +1 -1
- package/dist/dashboard/assets/SetupPage-UB690SE2.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-CB3Z7VTf.js → SortableList-BLujdX7N.js} +1 -1
- package/dist/dashboard/assets/SortableList-BLujdX7N.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-D95UCPHI.js → StudioPage-D5C2raAc.js} +3 -3
- package/dist/dashboard/assets/StudioPage-D5C2raAc.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-8uIcxa1W.js +56 -0
- package/dist/dashboard/assets/UsagePage-8uIcxa1W.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-DQYLQxpW.js +1 -0
- package/dist/dashboard/assets/api-keys-DQYLQxpW.js.gz +0 -0
- package/dist/dashboard/assets/app-CX_Z8cMs.css +2 -0
- package/dist/dashboard/assets/app-CX_Z8cMs.css.gz +0 -0
- package/dist/dashboard/assets/{assert-Chi7pCnt.js → assert-C9FD_JwJ.js} +1 -1
- package/dist/dashboard/assets/assert-C9FD_JwJ.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D4pQapKj.js → badge-CR72dasT.js} +1 -1
- package/dist/dashboard/assets/badge-CR72dasT.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DH6cg-_B.js → banner-CI9_eSfO.js} +1 -1
- package/dist/dashboard/assets/banner-CI9_eSfO.js.gz +0 -0
- package/dist/dashboard/assets/{card-BKqlUOe4.js → card-DS7CQEsO.js} +1 -1
- package/dist/dashboard/assets/card-DS7CQEsO.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-fTgljTGA.js → cli-tools-CNqzrfdb.js} +1 -1
- package/dist/dashboard/assets/cli-tools-CNqzrfdb.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-D5Ys_sM0.js → clipboard-button-611pSsaX.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-611pSsaX.js.gz +0 -0
- package/dist/dashboard/assets/{fingerprint-pattern-BWuHtbW4.js → concurrency-BDF0ok7y.js} +1 -1
- package/dist/dashboard/assets/concurrency-BDF0ok7y.js.gz +0 -0
- package/dist/dashboard/assets/dialog-k37exjNt.js +1 -0
- package/dist/dashboard/assets/dialog-k37exjNt.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CX7N8ucR.js +1 -0
- package/dist/dashboard/assets/drawer-CX7N8ucR.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CQBr6U9c.js → entry-B9Xvtnfj.js} +1 -1
- package/dist/dashboard/assets/entry-B9Xvtnfj.js.gz +0 -0
- package/dist/dashboard/assets/entry-CTP8AyiS.js +1 -0
- package/dist/dashboard/assets/entry-CTP8AyiS.js.gz +0 -0
- package/dist/dashboard/assets/entry-DxBHnauy.js +4 -0
- package/dist/dashboard/assets/entry-DxBHnauy.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-BlptL8Uf.js → github-badge-sltk1qUi.js} +1 -1
- package/dist/dashboard/assets/github-badge-sltk1qUi.js.gz +0 -0
- package/dist/dashboard/assets/{index-js6TJvdr.js → index-CmxZr14F.js} +2 -2
- package/dist/dashboard/assets/index-CmxZr14F.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DUWDSmDV.js → inline-BhY2sSnO.js} +1 -1
- package/dist/dashboard/assets/inline-BhY2sSnO.js.gz +0 -0
- package/dist/dashboard/assets/{input-LVjgZq4f.js → input-V1umFiBk.js} +1 -1
- package/dist/dashboard/assets/input-V1umFiBk.js.gz +0 -0
- package/dist/dashboard/assets/layout-BBOYycyS.js +1 -0
- package/dist/dashboard/assets/layout-BBOYycyS.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-DupvLfDx.js → list-row-1zzZYM0B.js} +1 -1
- package/dist/dashboard/assets/list-row-1zzZYM0B.js.gz +0 -0
- package/dist/dashboard/assets/{live-C4pEJUqI.js → live-BivGfuUs.js} +1 -1
- package/dist/dashboard/assets/live-BivGfuUs.js.gz +0 -0
- package/dist/dashboard/assets/{model-bans-BRiuufkB.js → model-bans-CmffjLuG.js} +1 -1
- package/dist/dashboard/assets/model-bans-CmffjLuG.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-B4ROwk8L.js → mutation-46P0oWMe.js} +1 -1
- package/dist/dashboard/assets/mutation-46P0oWMe.js.gz +0 -0
- package/dist/dashboard/assets/numbers-DkfMR5Qs.js +2 -0
- package/dist/dashboard/assets/numbers-DkfMR5Qs.js.gz +0 -0
- package/dist/dashboard/assets/{query-keys-gmjzC3RS.js → query-keys-BFhGpwR1.js} +1 -1
- package/dist/dashboard/assets/query-keys-BFhGpwR1.js.gz +0 -0
- package/dist/dashboard/assets/{routing-C7tBT5o-.js → routing-CAb4F37R.js} +1 -1
- package/dist/dashboard/assets/routing-CAb4F37R.js.gz +0 -0
- package/dist/dashboard/assets/{select-WUCXorXw.js → select-BYR_5K2c.js} +1 -1
- package/dist/dashboard/assets/select-BYR_5K2c.js.gz +0 -0
- package/dist/dashboard/assets/{settings-C_zKl1GS.js → settings-DNX9sydi.js} +1 -1
- package/dist/dashboard/assets/settings-DNX9sydi.js.gz +0 -0
- package/dist/dashboard/assets/{stack-_3O0F8Xn.js → stack-BHTfXdz_.js} +1 -1
- package/dist/dashboard/assets/stack-BHTfXdz_.js.gz +0 -0
- package/dist/dashboard/assets/{state-BgTxHcJS.js → state-mPDRlQkl.js} +1 -1
- package/dist/dashboard/assets/state-mPDRlQkl.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DEjTtOWf.js → switch-DOmJxg7H.js} +1 -1
- package/dist/dashboard/assets/switch-DOmJxg7H.js.gz +0 -0
- package/dist/dashboard/assets/tokens-COzario9.js +1 -0
- package/dist/dashboard/assets/tokens-COzario9.js.gz +0 -0
- package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js +1 -0
- package/dist/dashboard/assets/use-modal-focus-By7oJoGd.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BWSC0UAS.js → useMutation-Dem0lXQj.js} +1 -1
- package/dist/dashboard/assets/useMutation-Dem0lXQj.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 +54 -54
- package/migrations/README.md +52 -52
- package/migrations/lite-sqlite3/0000_baseline.sql +2 -2
- package/package.json +96 -95
- package/scripts/cli/admin.ts +125 -0
- package/scripts/cli/{ui/background.ts → background.ts} +1 -1
- package/scripts/cli/{command/console-menu.ts → console-menu.ts} +275 -244
- package/scripts/cli/doctor.ts +37 -0
- package/scripts/cli/{support/env.ts → env.ts} +99 -99
- package/scripts/cli/{gateway/spawn.ts → gateway.ts} +112 -24
- package/scripts/cli/instance.ts +224 -0
- package/scripts/cli/main.ts +61 -18
- package/scripts/cli/{support/platform.ts → platform.ts} +64 -64
- package/scripts/cli/port.ts +100 -0
- package/scripts/cli/{support/services.ts → services.ts} +88 -88
- package/scripts/cli/{command/setup.ts → setup.ts} +35 -34
- package/scripts/cli/{command/start.ts → start.ts} +10 -5
- package/scripts/cli/{support/startup-signal.ts → startup-signal.ts} +23 -23
- package/scripts/cli/tray/index.ts +62 -12
- package/scripts/cli/{command/tray.ts → tray.ts} +208 -208
- package/scripts/cli/{command/update.ts → update.ts} +39 -39
- package/scripts/cli/version.ts +67 -0
- package/scripts/cli/{ui/wordmark.ts → wordmark.ts} +58 -58
- package/src/boot/app.ts +697 -693
- package/src/boot/dependencies.ts +647 -646
- package/src/boot/timeout.ts +2 -13
- package/src/config/cooldowns.ts +186 -138
- package/src/config/network.ts +8 -14
- package/src/config/providers.ts +7 -10
- package/src/config/runtime.ts +76 -76
- package/src/config/security.ts +15 -0
- package/src/config/spec.ts +20 -30
- package/src/config/telemetry.ts +0 -20
- package/src/config/timeouts.ts +0 -6
- package/src/console/admin/model-abuse/contracts.ts +28 -6
- package/src/console/admin/model-abuse/routes.ts +56 -3
- package/src/console/api-keys/contracts.ts +410 -414
- package/src/console/api-keys/routes.ts +881 -880
- package/src/console/auth/credentials.ts +3 -3
- package/src/console/auth/setup-service.ts +2 -2
- package/src/console/backup/export-endpoint.ts +6 -2
- package/src/console/backup/nine-router.ts +2 -5
- package/src/console/backup/service.ts +4 -0
- package/src/console/backup/store.ts +192 -29
- package/src/console/backup/validate.ts +3 -45
- package/src/console/cli-tools/fs-ops.ts +487 -487
- package/src/console/console-router-guards.ts +1 -1
- package/src/console/data-management/contracts.ts +13 -6
- package/src/console/data-management/operations.ts +23 -18
- package/src/console/data-management/routes.ts +0 -1
- package/src/console/domain-registration.ts +10 -5
- package/src/console/observability/live.ts +22 -0
- package/src/console/observability/store.ts +39 -16
- package/src/console/observability/usage-dimensions.ts +4 -4
- package/src/console/providers/catalog/catalog-projections.ts +6 -7
- package/src/console/providers/catalog/model-operations.ts +5 -2
- package/src/console/providers/catalog/provider-operations.ts +4 -4
- package/src/console/providers/catalog/public-model-store.ts +8 -11
- package/src/console/providers/catalog/store.ts +1553 -1553
- package/src/console/providers/oauth/routes.ts +8 -12
- package/src/console/quota/account-quota-tenant.ts +6 -6
- package/src/console/quota/quota-view.ts +1 -1
- package/src/console/remote-support/contracts.ts +61 -0
- package/src/console/remote-support/routes.ts +65 -0
- package/src/console/remote-support/service.ts +207 -0
- package/src/console/response-compression.ts +0 -3
- package/src/console/routing/pools/probe-result.ts +3 -2
- package/src/console/routing/pools/probe-verdict.ts +132 -132
- package/src/console/routing/pools/store.ts +8 -8
- package/src/console/settings/contracts.ts +58 -2
- package/src/console/settings/store.ts +30 -3
- package/src/console/shared/cursor.ts +8 -8
- package/src/console/shared/errors.ts +1 -3
- package/src/network/http2-bidi.ts +2 -4
- package/src/network/pool/agent.ts +478 -478
- package/src/network/pool/selector.ts +5 -4
- package/src/network/retry.ts +1 -2
- package/src/network/ssrf.ts +5 -4
- package/src/observability/event-compaction.ts +80 -78
- package/src/observability/event-day-index.ts +13 -15
- package/src/observability/event-log.ts +4 -4
- package/src/observability/logger.ts +6 -6
- package/src/observability/payload-capture.ts +151 -33
- package/src/observability/payload-store.ts +397 -440
- package/src/observability/redaction.ts +5 -6
- package/src/observability/request-notify.ts +43 -0
- package/src/observability/telemetry-status.ts +8 -9
- package/src/observability/token-speed.ts +5 -4
- package/src/persistence/db-mode.ts +7 -7
- package/src/persistence/readiness.ts +1 -1
- package/src/persistence/schema.ts +1406 -1402
- package/src/persistence/shared-cache.ts +1 -2
- package/src/persistence/stores/api-key-store.ts +18 -6
- package/src/persistence/stores/share-store.ts +4 -3
- package/src/persistence/stores/telemetry-store.ts +236 -237
- package/src/protocol/canonical-model.ts +11 -3
- package/src/protocol/codecs.ts +138 -4
- package/src/protocol/gateway-error.ts +6 -4
- package/src/protocol/request/chat.ts +21 -1
- package/src/protocol/request/codex.ts +10 -1
- package/src/protocol/request/messages.ts +4 -5
- package/src/protocol/request/responses.ts +9 -1
- package/src/protocol/response/chat.ts +34 -4
- package/src/protocol/response/codex.ts +7 -4
- package/src/protocol/response/dsml.ts +140 -28
- package/src/protocol/response/responses.ts +11 -5
- package/src/protocol/stream-error-frames.ts +4 -5
- package/src/providers/authentication/jwt-validator.ts +9 -10
- package/src/providers/authentication/oauth-refresh-service.ts +9 -11
- package/src/providers/configured-openai-providers.ts +134 -136
- package/src/providers/discovery/catalog/catalog-blob.ts +18 -18
- package/src/providers/discovery/catalog/catalog-format.ts +3 -6
- package/src/providers/discovery/models-dev-catalog.ts +354 -354
- package/src/providers/discovery/probe-phases.ts +4 -4
- package/src/providers/discovery/probe-wire.ts +6 -13
- package/src/providers/discovery/probing-service.ts +1117 -1045
- package/src/providers/integrations/alibabacp/alibabacp.ts +1 -1
- package/src/providers/integrations/antigravity/antigravity-quota.ts +5 -7
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +23 -2
- package/src/providers/integrations/buddy/buddy-checkin.ts +1 -4
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +23 -6
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +0 -1
- package/src/providers/integrations/buddy/buddy-identity.ts +52 -0
- package/src/providers/integrations/buddy/buddy-media.ts +2 -2
- package/src/providers/integrations/buddy/buddy-usage-store.ts +3 -4
- package/src/providers/integrations/buddy/codebuddy/quota.ts +2 -13
- package/src/providers/integrations/buddy/codebuddy/shared.ts +118 -115
- package/src/providers/integrations/buddy/workbuddy/quota.ts +0 -11
- package/src/providers/integrations/buddy/workbuddy/shared.ts +5 -2
- package/src/providers/integrations/claude/claude.ts +608 -608
- package/src/providers/integrations/cline/cline-quota.ts +132 -132
- package/src/providers/integrations/cline/cline.ts +537 -539
- package/src/providers/integrations/codex/codex-oauth.ts +1 -1
- package/src/providers/integrations/commandcode/commandcode.ts +674 -675
- package/src/providers/integrations/commandcode/discovery.ts +117 -116
- package/src/providers/integrations/cursor/cursor-auth.ts +418 -418
- package/src/providers/integrations/cursor/cursor-quota.ts +309 -310
- package/src/providers/integrations/cursor/cursor.ts +11 -163
- package/src/providers/integrations/factory/factory-models.ts +3 -5
- package/src/providers/integrations/grok/grok-install-id.ts +2 -3
- package/src/providers/integrations/grok/grok.ts +6 -7
- package/src/providers/integrations/hermes.ts +14 -18
- package/src/providers/integrations/kiro/kiro-discovery.ts +1 -1
- package/src/providers/integrations/kiro/kiro.ts +1 -1
- package/src/providers/integrations/mistral.ts +6 -6
- package/src/providers/integrations/opencode/fingerprint.ts +3 -3
- package/src/providers/integrations/opencode/provider.ts +8 -8
- package/src/providers/integrations/qoder/qoder-catalog.ts +450 -450
- package/src/providers/integrations/qoder/qoder-oauth.ts +388 -310
- package/src/providers/integrations/qoder/qoder.ts +884 -865
- package/src/providers/integrations/shared/connect.ts +6 -6
- package/src/providers/integrations/trae/trae-catalog.ts +1 -2
- package/src/providers/integrations/trae/trae.ts +2 -2
- package/src/providers/integrations/zcode/oauth.ts +6 -1
- package/src/providers/operations/account-health-service.ts +1528 -1523
- package/src/providers/operations/account-reset-service.ts +1 -1
- package/src/providers/operations/client-versions.ts +6 -6
- package/src/providers/operations/custom-cli-headers.ts +3 -4
- package/src/providers/operations/provider-catalog-seeder.ts +95 -95
- package/src/providers/operations/provider-catalog-service.ts +3 -4
- package/src/providers/provider-metadata.ts +4 -8
- package/src/providers/provider-registry.ts +6 -7
- package/src/providers/provider-usage.ts +1 -1
- package/src/security/abuse.ts +15 -10
- package/src/security/access-control.ts +144 -146
- package/src/security/admission/contracts.ts +11 -0
- package/src/security/admission/in-memory-store.ts +4 -3
- package/src/security/admission/lease-sweep.ts +6 -6
- package/src/security/admission/reasons.ts +5 -1
- package/src/security/admission/redis-store.ts +211 -210
- package/src/security/admission/service.ts +4 -0
- package/src/security/api-key-auth.ts +504 -504
- package/src/security/ip-boundary.ts +155 -15
- package/src/security/model-abuse.ts +366 -94
- package/src/security/outbound-headers.ts +3 -4
- package/src/shared/sleep.ts +4 -0
- package/src/transport/dispatch/attempt-finalize.ts +47 -5
- package/src/transport/dispatch/attempt-loop.ts +531 -530
- package/src/transport/dispatch/stream-bridge.ts +1 -3
- package/src/transport/dispatch/streaming/finalize.ts +1 -1
- package/src/transport/dispatch/streaming/stream.ts +5 -6
- package/src/transport/failure-policy.ts +162 -8
- package/src/transport/guards/auth-guard.ts +7 -4
- package/src/transport/guards/concurrency-guard.ts +0 -5
- package/src/transport/guards/error-lifecycle.ts +13 -6
- package/src/transport/guards/pipeline.ts +15 -3
- package/src/transport/guards/request-context.ts +8 -2
- package/src/transport/request/inflight.ts +5 -6
- package/src/transport/request/preparer.ts +2 -2
- package/src/transport/request/state.ts +12 -8
- package/src/transport/routing/admission.ts +4 -0
- package/src/transport/routing/route-catalog.ts +8 -1
- package/src/transport/routing/route-model.ts +46 -14
- package/src/transport/routing/router.ts +21 -14
- package/src/transport/surface/completion.ts +2 -3
- package/src/transport/surface/dialects.ts +5 -6
- package/src/transport/surface/responses/encode.ts +38 -0
- package/src/transport/surface/responses/parse.ts +4 -0
- package/src/transport/translation/capabilities.ts +2 -3
- package/src/transport/translation/quirks.ts +3 -3
- package/src/workers/buddy-growth-tasks.ts +5 -10
- package/src/workers/daily-checkin.ts +17 -23
- package/src/workers/quota-refresh-sweep.ts +26 -26
- package/dist/dashboard/assets/BannedPage-C2orBsI2.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-DUcZ6pMB.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-BV6pxVQo.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-Bsan4679.js +0 -1
- package/dist/dashboard/assets/CombosPage-Bsan4679.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-CW-wPmJ6.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-0p8uX7vB.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BjqSMfko.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-BvzCx8Kr.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BY1aKEkP.js +0 -1
- package/dist/dashboard/assets/ModelPicker-BY1aKEkP.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js +0 -1
- package/dist/dashboard/assets/OverviewPage-DOQpy1y0.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage-ecxyUMzt.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Js9jUPSb.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js +0 -7
- package/dist/dashboard/assets/ProxyPage-J3TBi3Kx.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js +0 -1
- package/dist/dashboard/assets/QuotaPage-C1gZS6xr.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CS86ho5X.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-DDbMQsoo.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-CB3Z7VTf.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-D95UCPHI.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Cnae9SWA.js +0 -56
- package/dist/dashboard/assets/UsagePage-Cnae9SWA.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-VY68Mhd1.js +0 -1
- package/dist/dashboard/assets/api-keys-VY68Mhd1.js.gz +0 -0
- package/dist/dashboard/assets/app-COlK95oi.css +0 -2
- package/dist/dashboard/assets/app-COlK95oi.css.gz +0 -0
- package/dist/dashboard/assets/assert-Chi7pCnt.js.gz +0 -0
- package/dist/dashboard/assets/badge-D4pQapKj.js.gz +0 -0
- package/dist/dashboard/assets/banner-DH6cg-_B.js.gz +0 -0
- package/dist/dashboard/assets/card-BKqlUOe4.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-fTgljTGA.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-D5Ys_sM0.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BYj-8WuK.js +0 -1
- package/dist/dashboard/assets/dialog-BYj-8WuK.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CmXIZ6H1.js +0 -1
- package/dist/dashboard/assets/drawer-CmXIZ6H1.js.gz +0 -0
- package/dist/dashboard/assets/entry-CBg5zeu8.js +0 -1
- package/dist/dashboard/assets/entry-CBg5zeu8.js.gz +0 -0
- package/dist/dashboard/assets/entry-CQBr6U9c.js.gz +0 -0
- package/dist/dashboard/assets/entry-CgdSAzEV.js +0 -4
- package/dist/dashboard/assets/entry-CgdSAzEV.js.gz +0 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-BlptL8Uf.js.gz +0 -0
- package/dist/dashboard/assets/index-js6TJvdr.js.gz +0 -0
- package/dist/dashboard/assets/inline-DUWDSmDV.js.gz +0 -0
- package/dist/dashboard/assets/input-LVjgZq4f.js.gz +0 -0
- package/dist/dashboard/assets/layout-CPfxpsfy.js +0 -1
- package/dist/dashboard/assets/layout-CPfxpsfy.js.gz +0 -0
- package/dist/dashboard/assets/list-row-DupvLfDx.js.gz +0 -0
- package/dist/dashboard/assets/live-C4pEJUqI.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-BRiuufkB.js.gz +0 -0
- package/dist/dashboard/assets/mutation-B4ROwk8L.js.gz +0 -0
- package/dist/dashboard/assets/numbers-YNcHvRY7.js +0 -2
- package/dist/dashboard/assets/numbers-YNcHvRY7.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-gmjzC3RS.js.gz +0 -0
- package/dist/dashboard/assets/routing-C7tBT5o-.js.gz +0 -0
- package/dist/dashboard/assets/select-WUCXorXw.js.gz +0 -0
- package/dist/dashboard/assets/settings-C_zKl1GS.js.gz +0 -0
- package/dist/dashboard/assets/stack-_3O0F8Xn.js.gz +0 -0
- package/dist/dashboard/assets/state-BgTxHcJS.js.gz +0 -0
- package/dist/dashboard/assets/switch-DEjTtOWf.js.gz +0 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js +0 -1
- package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js +0 -1
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BWSC0UAS.js.gz +0 -0
- package/scripts/cli/command/admin.ts +0 -65
- package/scripts/cli/command/doctor.ts +0 -257
- package/scripts/cli/gateway/drain-token.ts +0 -78
- package/scripts/cli/gateway/instance-lock.ts +0 -105
- package/scripts/cli/gateway/stop.ts +0 -51
- package/scripts/cli/support/bun.ts +0 -27
- package/scripts/cli/support/version.ts +0 -37
- /package/dist/dashboard/assets/{app-DCQZRmHY.js → app-BIt446yE.js} +0 -0
- /package/dist/dashboard/assets/{app-DCQZRmHY.js.gz → app-BIt446yE.js.gz} +0 -0
- /package/scripts/cli/{ui/prompt.ts → prompt.ts} +0 -0
|
@@ -1,132 +1,132 @@
|
|
|
1
|
-
import type { FetchLike, ProviderQuotaResult, ProviderQuotaWindow } from "../../quota/quota-contracts";
|
|
2
|
-
import { authCredential, getJson, record, text } from "../../quota/quota-contracts";
|
|
3
|
-
import { parseLimitWindows } from "../../quota/quota-limit-windows";
|
|
4
|
-
import { getClineCliVersion, getClineSdkVersion } from "../../operations/client-versions";
|
|
5
|
-
import { clinePlatform, clinePlatformVersion } from "../../operations/cli-platform";
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* Quota headers always carry the currently resolved CLI version.
|
|
9
|
-
*
|
|
10
|
-
* The two version headers are two different versions and must stay that way.
|
|
11
|
-
* `x-client-version` is the Cline CLI the operator is running (`cline` on npm),
|
|
12
|
-
* from the shared pooler. `x-core-version` is the `@cline/sdk` version — a
|
|
13
|
-
* separate npm package with its own release line, though one the CLI pins as a
|
|
14
|
-
* dependency
|
|
15
|
-
*
|
|
16
|
-
* that `@cline/sdk` never published.
|
|
17
|
-
*
|
|
18
|
-
* Both surfaces
|
|
19
|
-
* same `cline-cli` client type. A header the upstream can validate is not
|
|
20
|
-
* cosmetic: an implausible core version is exactly what a "please update and
|
|
21
|
-
* re-authenticate" refusal is shaped like, and it is indistinguishable from a
|
|
22
|
-
* dead credential from the response alone.
|
|
23
|
-
*
|
|
24
|
-
* Header identity is not what gates these endpoints: probing `/users/me`,
|
|
25
|
-
* `/users/me/plan` and `/users/me/plan/usage-limits` with no identity headers,
|
|
26
|
-
* the SDK identity and the CLI identity all returned identical responses. The
|
|
27
|
-
* 404 from the plan routes is "no plan history found for user", i.e. account
|
|
28
|
-
* state, not a rejected client.
|
|
29
|
-
*/
|
|
30
|
-
function clineQuotaHeaders(): Record<string, string> {
|
|
31
|
-
const version = getClineCliVersion();
|
|
32
|
-
return {
|
|
33
|
-
accept: "application/json",
|
|
34
|
-
"content-type": "application/json",
|
|
35
|
-
"user-agent": `Cline/${version}`,
|
|
36
|
-
"x-platform": clinePlatform(),
|
|
37
|
-
"x-platform-version": clinePlatformVersion(),
|
|
38
|
-
"x-client-type": "cline-cli",
|
|
39
|
-
"x-client-version": version,
|
|
40
|
-
"x-core-version": getClineSdkVersion(),
|
|
41
|
-
"x-is-multiroot": "false",
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
const CLINE_WINDOW_LABELS: Readonly<Record<string, string>> = {
|
|
46
|
-
five_hour: "5 Hour",
|
|
47
|
-
weekly: "7 Day",
|
|
48
|
-
monthly: "30 Day",
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
/** Reads Cline's `limits[]` array — one entry per billing window. */
|
|
52
|
-
function usageWindows(value: unknown): readonly ProviderQuotaWindow[] {
|
|
53
|
-
return [
|
|
54
|
-
...parseLimitWindows(value, {
|
|
55
|
-
kindPaths: ["type"],
|
|
56
|
-
percentPaths: ["percentUsed"],
|
|
57
|
-
resetPaths: ["resetsAt"],
|
|
58
|
-
limitPaths: ["limit", "entitlement", "total"],
|
|
59
|
-
usedPaths: ["used", "usedCredits"],
|
|
60
|
-
// Cline reports a percentage and a ceiling but no absolute used value,
|
|
61
|
-
// so the absolute is derived rather than left null.
|
|
62
|
-
deriveUsed: (_entry, usedPercent, limit) =>
|
|
63
|
-
usedPercent !== null && limit !== null ? (limit * usedPercent) / 100 : null,
|
|
64
|
-
labelFor: (kind) => CLINE_WINDOW_LABELS[kind] ?? null,
|
|
65
|
-
fallbackLabel: (kind) => kind,
|
|
66
|
-
}),
|
|
67
|
-
];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
function isMissingPlanHistory(reason: unknown): boolean {
|
|
71
|
-
const message =
|
|
72
|
-
reason instanceof Error ? reason.message : typeof reason === "string" ? reason : "";
|
|
73
|
-
return /\b404\b|\bno plan history\b/i.test(message);
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/** Envelope marking a resolved secret as an api key rather than an OAuth grant. */
|
|
77
|
-
export const CLINE_API_KEY_PREFIX = "cline-api-key:" as const;
|
|
78
|
-
|
|
79
|
-
/** Wraps a resolved api_key secret so the collector can route it to /models. */
|
|
80
|
-
export function markClineApiKeyCredential(credential: string): string {
|
|
81
|
-
return credential.startsWith(CLINE_API_KEY_PREFIX) ? credential : `${CLINE_API_KEY_PREFIX}${credential}`;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
export async function fetchClineQuota(
|
|
85
|
-
credential: string,
|
|
86
|
-
fetcher: FetchLike,
|
|
87
|
-
): Promise<ProviderQuotaResult> {
|
|
88
|
-
const isApiKey = credential.startsWith(CLINE_API_KEY_PREFIX);
|
|
89
|
-
const bearer = isApiKey ? credential.slice(CLINE_API_KEY_PREFIX.length) : null;
|
|
90
|
-
|
|
91
|
-
let headers: Record<string, string>;
|
|
92
|
-
if (isApiKey && bearer) {
|
|
93
|
-
// An api key is its own bearer token: `Authorization: Bearer sk_...`, with
|
|
94
|
-
// no `workos:` prefix.
|
|
95
|
-
//
|
|
96
|
-
// Prefixing it is what produced "Unauthorized: please make sure you're
|
|
97
|
-
// using the latest version of Cline and re-authenticate" — verified against
|
|
98
|
-
// a live key, where the same key returned 200 on `/users/me` bare and 401
|
|
99
|
-
// once `workos:` was prepended. The message names a version problem, so it
|
|
100
|
-
// reads as a client the upstream refuses rather than a malformed header,
|
|
101
|
-
// which is why it went unrecognised for so long.
|
|
102
|
-
headers = { ...clineQuotaHeaders(), authorization: `Bearer ${bearer}` };
|
|
103
|
-
} else {
|
|
104
|
-
const fields = authCredential(credential);
|
|
105
|
-
const access = text(fields.accessToken);
|
|
106
|
-
if (!access) throw new Error("Cline credential has no access token.");
|
|
107
|
-
headers = {
|
|
108
|
-
...clineQuotaHeaders(),
|
|
109
|
-
authorization: `Bearer ${access.startsWith("workos:") ? access : `workos:${access}`}`,
|
|
110
|
-
};
|
|
111
|
-
}
|
|
112
|
-
const me = record(await getJson("https://api.cline.bot/api/v1/users/me", headers, fetcher));
|
|
113
|
-
const userId = text(me?.id);
|
|
114
|
-
if (!userId) throw new Error("Cline account response has no user id.");
|
|
115
|
-
const [planRaw, limitsRaw] = await Promise.allSettled([
|
|
116
|
-
getJson("https://api.cline.bot/api/v1/users/me/plan", headers, fetcher),
|
|
117
|
-
getJson("https://api.cline.bot/api/v1/users/me/plan/usage-limits", headers, fetcher),
|
|
118
|
-
]);
|
|
119
|
-
const plan = record(planRaw.status === "fulfilled" ? planRaw.value : null);
|
|
120
|
-
const limitsFailed = limitsRaw.status === "rejected";
|
|
121
|
-
const windows = usageWindows(limitsRaw.status === "fulfilled" ? limitsRaw.value : null);
|
|
122
|
-
const error =
|
|
123
|
-
limitsFailed && !isMissingPlanHistory(limitsRaw.reason)
|
|
124
|
-
? "Failed to fetch quota limits."
|
|
125
|
-
: null;
|
|
126
|
-
return {
|
|
127
|
-
source: "cline",
|
|
128
|
-
plan: text(record(plan?.plan)?.displayName) ?? text(plan?.displayName) ?? "Cline",
|
|
129
|
-
windows,
|
|
130
|
-
error,
|
|
131
|
-
};
|
|
132
|
-
}
|
|
1
|
+
import type { FetchLike, ProviderQuotaResult, ProviderQuotaWindow } from "../../quota/quota-contracts";
|
|
2
|
+
import { authCredential, getJson, record, text } from "../../quota/quota-contracts";
|
|
3
|
+
import { parseLimitWindows } from "../../quota/quota-limit-windows";
|
|
4
|
+
import { getClineCliVersion, getClineSdkVersion } from "../../operations/client-versions";
|
|
5
|
+
import { clinePlatform, clinePlatformVersion } from "../../operations/cli-platform";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Quota headers always carry the currently resolved CLI version.
|
|
9
|
+
*
|
|
10
|
+
* The two version headers are two different versions and must stay that way.
|
|
11
|
+
* `x-client-version` is the Cline CLI the operator is running (`cline` on npm),
|
|
12
|
+
* from the shared pooler. `x-core-version` is the `@cline/sdk` version — a
|
|
13
|
+
* separate npm package with its own release line, though one the CLI pins as a
|
|
14
|
+
* dependency — sending the client version in both slots would tell the billing
|
|
15
|
+
* surface our core was `4.1.23`, a vscode extension version
|
|
16
|
+
* that `@cline/sdk` never published.
|
|
17
|
+
*
|
|
18
|
+
* Both surfaces send the same pairing (`cliVersion` / `sdkVersion`) and the
|
|
19
|
+
* same `cline-cli` client type. A header the upstream can validate is not
|
|
20
|
+
* cosmetic: an implausible core version is exactly what a "please update and
|
|
21
|
+
* re-authenticate" refusal is shaped like, and it is indistinguishable from a
|
|
22
|
+
* dead credential from the response alone.
|
|
23
|
+
*
|
|
24
|
+
* Header identity is not what gates these endpoints: probing `/users/me`,
|
|
25
|
+
* `/users/me/plan` and `/users/me/plan/usage-limits` with no identity headers,
|
|
26
|
+
* the SDK identity and the CLI identity all returned identical responses. The
|
|
27
|
+
* 404 from the plan routes is "no plan history found for user", i.e. account
|
|
28
|
+
* state, not a rejected client.
|
|
29
|
+
*/
|
|
30
|
+
function clineQuotaHeaders(): Record<string, string> {
|
|
31
|
+
const version = getClineCliVersion();
|
|
32
|
+
return {
|
|
33
|
+
accept: "application/json",
|
|
34
|
+
"content-type": "application/json",
|
|
35
|
+
"user-agent": `Cline/${version}`,
|
|
36
|
+
"x-platform": clinePlatform(),
|
|
37
|
+
"x-platform-version": clinePlatformVersion(),
|
|
38
|
+
"x-client-type": "cline-cli",
|
|
39
|
+
"x-client-version": version,
|
|
40
|
+
"x-core-version": getClineSdkVersion(),
|
|
41
|
+
"x-is-multiroot": "false",
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const CLINE_WINDOW_LABELS: Readonly<Record<string, string>> = {
|
|
46
|
+
five_hour: "5 Hour",
|
|
47
|
+
weekly: "7 Day",
|
|
48
|
+
monthly: "30 Day",
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/** Reads Cline's `limits[]` array — one entry per billing window. */
|
|
52
|
+
function usageWindows(value: unknown): readonly ProviderQuotaWindow[] {
|
|
53
|
+
return [
|
|
54
|
+
...parseLimitWindows(value, {
|
|
55
|
+
kindPaths: ["type"],
|
|
56
|
+
percentPaths: ["percentUsed"],
|
|
57
|
+
resetPaths: ["resetsAt"],
|
|
58
|
+
limitPaths: ["limit", "entitlement", "total"],
|
|
59
|
+
usedPaths: ["used", "usedCredits"],
|
|
60
|
+
// Cline reports a percentage and a ceiling but no absolute used value,
|
|
61
|
+
// so the absolute is derived rather than left null.
|
|
62
|
+
deriveUsed: (_entry, usedPercent, limit) =>
|
|
63
|
+
usedPercent !== null && limit !== null ? (limit * usedPercent) / 100 : null,
|
|
64
|
+
labelFor: (kind) => CLINE_WINDOW_LABELS[kind] ?? null,
|
|
65
|
+
fallbackLabel: (kind) => kind,
|
|
66
|
+
}),
|
|
67
|
+
];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function isMissingPlanHistory(reason: unknown): boolean {
|
|
71
|
+
const message =
|
|
72
|
+
reason instanceof Error ? reason.message : typeof reason === "string" ? reason : "";
|
|
73
|
+
return /\b404\b|\bno plan history\b/i.test(message);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Envelope marking a resolved secret as an api key rather than an OAuth grant. */
|
|
77
|
+
export const CLINE_API_KEY_PREFIX = "cline-api-key:" as const;
|
|
78
|
+
|
|
79
|
+
/** Wraps a resolved api_key secret so the collector can route it to /models. */
|
|
80
|
+
export function markClineApiKeyCredential(credential: string): string {
|
|
81
|
+
return credential.startsWith(CLINE_API_KEY_PREFIX) ? credential : `${CLINE_API_KEY_PREFIX}${credential}`;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export async function fetchClineQuota(
|
|
85
|
+
credential: string,
|
|
86
|
+
fetcher: FetchLike,
|
|
87
|
+
): Promise<ProviderQuotaResult> {
|
|
88
|
+
const isApiKey = credential.startsWith(CLINE_API_KEY_PREFIX);
|
|
89
|
+
const bearer = isApiKey ? credential.slice(CLINE_API_KEY_PREFIX.length) : null;
|
|
90
|
+
|
|
91
|
+
let headers: Record<string, string>;
|
|
92
|
+
if (isApiKey && bearer) {
|
|
93
|
+
// An api key is its own bearer token: `Authorization: Bearer sk_...`, with
|
|
94
|
+
// no `workos:` prefix.
|
|
95
|
+
//
|
|
96
|
+
// Prefixing it is what produced "Unauthorized: please make sure you're
|
|
97
|
+
// using the latest version of Cline and re-authenticate" — verified against
|
|
98
|
+
// a live key, where the same key returned 200 on `/users/me` bare and 401
|
|
99
|
+
// once `workos:` was prepended. The message names a version problem, so it
|
|
100
|
+
// reads as a client the upstream refuses rather than a malformed header,
|
|
101
|
+
// which is why it went unrecognised for so long.
|
|
102
|
+
headers = { ...clineQuotaHeaders(), authorization: `Bearer ${bearer}` };
|
|
103
|
+
} else {
|
|
104
|
+
const fields = authCredential(credential);
|
|
105
|
+
const access = text(fields.accessToken);
|
|
106
|
+
if (!access) throw new Error("Cline credential has no access token.");
|
|
107
|
+
headers = {
|
|
108
|
+
...clineQuotaHeaders(),
|
|
109
|
+
authorization: `Bearer ${access.startsWith("workos:") ? access : `workos:${access}`}`,
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const me = record(await getJson("https://api.cline.bot/api/v1/users/me", headers, fetcher));
|
|
113
|
+
const userId = text(me?.id);
|
|
114
|
+
if (!userId) throw new Error("Cline account response has no user id.");
|
|
115
|
+
const [planRaw, limitsRaw] = await Promise.allSettled([
|
|
116
|
+
getJson("https://api.cline.bot/api/v1/users/me/plan", headers, fetcher),
|
|
117
|
+
getJson("https://api.cline.bot/api/v1/users/me/plan/usage-limits", headers, fetcher),
|
|
118
|
+
]);
|
|
119
|
+
const plan = record(planRaw.status === "fulfilled" ? planRaw.value : null);
|
|
120
|
+
const limitsFailed = limitsRaw.status === "rejected";
|
|
121
|
+
const windows = usageWindows(limitsRaw.status === "fulfilled" ? limitsRaw.value : null);
|
|
122
|
+
const error =
|
|
123
|
+
limitsFailed && !isMissingPlanHistory(limitsRaw.reason)
|
|
124
|
+
? "Failed to fetch quota limits."
|
|
125
|
+
: null;
|
|
126
|
+
return {
|
|
127
|
+
source: "cline",
|
|
128
|
+
plan: text(record(plan?.plan)?.displayName) ?? text(plan?.displayName) ?? "Cline",
|
|
129
|
+
windows,
|
|
130
|
+
error,
|
|
131
|
+
};
|
|
132
|
+
}
|