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
package/src/config/spec.ts
CHANGED
|
@@ -165,8 +165,7 @@ export const CONFIG_SPEC = {
|
|
|
165
165
|
* Age at which a request's detail is described as no longer stored.
|
|
166
166
|
*
|
|
167
167
|
* Retention itself is `CARTETHYIA_TELEMETRY_RETENTION_DAYS`; this only words
|
|
168
|
-
* the message shown when a request that old is asked for.
|
|
169
|
-
* message is operator-facing and was written against this knob.
|
|
168
|
+
* the operator-facing message shown when a request that old is asked for.
|
|
170
169
|
*/
|
|
171
170
|
CARTETHYIA_TELEMETRY_COMPACT_AFTER_DAYS: { kind: "int", default: 7, min: 1, max: 365 },
|
|
172
171
|
/**
|
|
@@ -183,27 +182,6 @@ export const CONFIG_SPEC = {
|
|
|
183
182
|
min: 5,
|
|
184
183
|
max: 1440,
|
|
185
184
|
},
|
|
186
|
-
/**
|
|
187
|
-
* Inert. Accepted so existing deployments keep booting; nothing reads it.
|
|
188
|
-
*
|
|
189
|
-
* It sized the one-file-per-window scheme — events were written to a file
|
|
190
|
-
* per this many minutes, 96 a day at the default. Events now append to one
|
|
191
|
-
* file per UTC day, so there is no window left to size.
|
|
192
|
-
*/
|
|
193
|
-
CARTETHYIA_TELEMETRY_WINDOW_MINUTES: {
|
|
194
|
-
kind: "int",
|
|
195
|
-
default: 15,
|
|
196
|
-
min: 1,
|
|
197
|
-
max: 1440,
|
|
198
|
-
},
|
|
199
|
-
/**
|
|
200
|
-
* Inert. Accepted so existing deployments keep booting; nothing reads it.
|
|
201
|
-
*
|
|
202
|
-
* It capped how many window files one pass could fold. Folding is driven by
|
|
203
|
-
* a byte offset into the day file now and never deletes the file, so there
|
|
204
|
-
* is no per-pass batch to bound.
|
|
205
|
-
*/
|
|
206
|
-
CARTETHYIA_TELEMETRY_COMPACT_MAX_FILES: { kind: "int", default: 48, min: 1, max: 10_000 },
|
|
207
185
|
CARTETHYIA_TELEMETRY_PAYLOAD_MAX_BYTES: {
|
|
208
186
|
kind: "int",
|
|
209
187
|
default: 16 * 1024 * 1024,
|
|
@@ -246,10 +224,10 @@ export const CONFIG_SPEC = {
|
|
|
246
224
|
/**
|
|
247
225
|
* An unmapped upstream failure cools the account down for 15 minutes.
|
|
248
226
|
*
|
|
249
|
-
*
|
|
250
|
-
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
227
|
+
* A shorter window puts the account straight back into rotation and re-dials
|
|
228
|
+
* an upstream that has just answered something this gateway does not
|
|
229
|
+
* understand — so the same unknown error is retried every minute, and an
|
|
230
|
+
* account that is actually broken contributes a steady stream of failed
|
|
253
231
|
* attempts instead of one. Fifteen minutes is long enough for a transient
|
|
254
232
|
* provider condition to clear on its own and short enough that no operator
|
|
255
233
|
* action is needed to recover it. It is still a cooldown with a deadline,
|
|
@@ -279,6 +257,18 @@ export const CONFIG_SPEC = {
|
|
|
279
257
|
CARTETHYIA_MODEL_STRIKE_THRESHOLD: { kind: "int", default: 10, min: 1, max: 100 },
|
|
280
258
|
CARTETHYIA_MODEL_STRIKE_WINDOW_MS: { kind: "int", default: 1_800_000, min: 1_000, max: 86_400_000 },
|
|
281
259
|
CARTETHYIA_MODEL_BAN_TTL_MS: { kind: "int", default: 21_600_000, min: 1_000, max: 604_800_000 },
|
|
260
|
+
/**
|
|
261
|
+
* The longest ban the console will record, however long a request asks for.
|
|
262
|
+
* The "Permanent" choice is a very long TTL rather than an unbounded one,
|
|
263
|
+
* and this is what keeps a typo in a duration from parking a caller for a
|
|
264
|
+
* decade.
|
|
265
|
+
*/
|
|
266
|
+
CARTETHYIA_MODEL_BAN_MAX_TTL_MS: {
|
|
267
|
+
kind: "int",
|
|
268
|
+
default: 604_800_000,
|
|
269
|
+
min: 1_000,
|
|
270
|
+
max: 604_800_000,
|
|
271
|
+
},
|
|
282
272
|
CARTETHYIA_ENCRYPTION_KEY: {
|
|
283
273
|
kind: "required",
|
|
284
274
|
error:
|
|
@@ -295,9 +285,9 @@ export const CONFIG_SPEC = {
|
|
|
295
285
|
/**
|
|
296
286
|
* Loopback port the browser-OAuth callback listener binds.
|
|
297
287
|
*
|
|
298
|
-
* Configurable because the default is a fixed number
|
|
299
|
-
*
|
|
300
|
-
* it. Codex's authorization server still expects 59653, so changing this
|
|
288
|
+
* Configurable because the default is a fixed number: a busy port would strand
|
|
289
|
+
* the operator, since the login could not start and there would be no way to
|
|
290
|
+
* move it. Codex's authorization server still expects 59653, so changing this
|
|
301
291
|
* only helps the providers whose redirect URI is not allowlisted upstream.
|
|
302
292
|
*/
|
|
303
293
|
CARTETHYIA_OAUTH_CALLBACK_PORT: { kind: "int", default: 59_653, min: 1_024, max: 65_535 },
|
package/src/config/telemetry.ts
CHANGED
|
@@ -44,24 +44,4 @@ export function resolveTelemetryCompactIntervalMs(): number {
|
|
|
44
44
|
return minutes * 60_000;
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
/**
|
|
48
|
-
* Minutes of events per source file, before it is folded into the day summary.
|
|
49
|
-
*
|
|
50
|
-
* Defaults to the sweep interval so exactly one window closes per pass: a
|
|
51
|
-
* window longer than the interval would leave files waiting several passes, and
|
|
52
|
-
* a shorter one would let several close between passes.
|
|
53
|
-
*/
|
|
54
|
-
export function resolveTelemetryWindowMinutes(): number {
|
|
55
|
-
return readInt(
|
|
56
|
-
"CARTETHYIA_TELEMETRY_WINDOW_MINUTES",
|
|
57
|
-
CONFIG_SPEC.CARTETHYIA_TELEMETRY_WINDOW_MINUTES,
|
|
58
|
-
);
|
|
59
|
-
}
|
|
60
47
|
|
|
61
|
-
/** Maximum hourly files folded in one compaction pass. */
|
|
62
|
-
export function resolveTelemetryCompactMaxFiles(): number {
|
|
63
|
-
return readInt(
|
|
64
|
-
"CARTETHYIA_TELEMETRY_COMPACT_MAX_FILES",
|
|
65
|
-
CONFIG_SPEC.CARTETHYIA_TELEMETRY_COMPACT_MAX_FILES,
|
|
66
|
-
);
|
|
67
|
-
}
|
package/src/config/timeouts.ts
CHANGED
|
@@ -51,12 +51,6 @@ let cachedUpstreamTimeoutMs: number | undefined;
|
|
|
51
51
|
let cachedStreamStallTimeoutMs: number | undefined;
|
|
52
52
|
let cachedInflightTtlSeconds: number | undefined;
|
|
53
53
|
|
|
54
|
-
/** Clears the memoized timeout cache; tests that mutate env mid-process only. */
|
|
55
|
-
export function resetTimeoutCacheForTests(): void {
|
|
56
|
-
cachedUpstreamTimeoutMs = undefined;
|
|
57
|
-
cachedStreamStallTimeoutMs = undefined;
|
|
58
|
-
cachedInflightTtlSeconds = undefined;
|
|
59
|
-
}
|
|
60
54
|
|
|
61
55
|
/**
|
|
62
56
|
* Crash-recovery TTL, in seconds, for a distributed inflight slot.
|
|
@@ -1,16 +1,38 @@
|
|
|
1
|
-
// Console surface for model-abuse bans: list active bans
|
|
1
|
+
// Console surface for model-abuse bans: list active bans, ban one, lift one.
|
|
2
2
|
//
|
|
3
|
-
// The strike layer (security/model-abuse.ts) bans a
|
|
4
|
-
//
|
|
5
|
-
//
|
|
6
|
-
//
|
|
3
|
+
// The strike layer (security/model-abuse.ts) bans a caller after repeated
|
|
4
|
+
// invalid-model requests. A ban lapses on its own after its TTL, and this is
|
|
5
|
+
// the escape hatch for lifting one early — a false positive (a shared NAT, a
|
|
6
|
+
// client that genuinely mistyped) must be fixable without SQL. It is a
|
|
7
7
|
// platform-admin surface: a ban is a security decision and the identity values
|
|
8
8
|
// are cross-tenant.
|
|
9
9
|
import type { AccessDecision } from "../../../security/access-control";
|
|
10
10
|
import type { ModelStrikeService } from "../../../security/model-abuse";
|
|
11
11
|
|
|
12
|
+
/**
|
|
13
|
+
* The ban durations the console offers, in whole minutes. `null` is the
|
|
14
|
+
* "Permanent" choice.
|
|
15
|
+
*
|
|
16
|
+
* Expressed in minutes rather than milliseconds because that is what an
|
|
17
|
+
* operator picks and what the label says — a millisecond constant here drifts
|
|
18
|
+
* from the copy the moment either changes.
|
|
19
|
+
*/
|
|
20
|
+
export const BAN_DURATION_CHOICES = [
|
|
21
|
+
{ minutes: 60, label: "1 hour" },
|
|
22
|
+
{ minutes: 6 * 60, label: "6 hours" },
|
|
23
|
+
{ minutes: 12 * 60, label: "12 hours" },
|
|
24
|
+
{ minutes: 24 * 60, label: "1 day" },
|
|
25
|
+
{ minutes: 7 * 24 * 60, label: "7 days" },
|
|
26
|
+
{ minutes: null, label: "Permanent" },
|
|
27
|
+
] as const;
|
|
28
|
+
|
|
29
|
+
/** The duration a bare "ban this user" click uses: the shortest one on offer. */
|
|
30
|
+
export const DEFAULT_BAN_MINUTES = 60;
|
|
31
|
+
|
|
32
|
+
/** Whole minutes the console accepts, or `null` for permanent. */
|
|
33
|
+
export type BanDurationMinutes = (typeof BAN_DURATION_CHOICES)[number]["minutes"];
|
|
34
|
+
|
|
12
35
|
export interface ModelAbuseRoutesConfig {
|
|
13
36
|
readonly strikes: Pick<ModelStrikeService, "listBans" | "unban" | "ban">;
|
|
14
37
|
readonly accessResolver: (request: Request) => AccessDecision | undefined;
|
|
15
38
|
}
|
|
16
|
-
|
|
@@ -1,16 +1,64 @@
|
|
|
1
1
|
import { Elysia, t } from "elysia";
|
|
2
|
-
import type
|
|
2
|
+
import { PERMANENT_BAN_TTL_MS, type ModelAbuseBan } from "../../../security/model-abuse";
|
|
3
3
|
import { ConsoleDomainError, errorResponse, requireGlobalAdmin } from "../../shared/errors";
|
|
4
|
-
import
|
|
4
|
+
import {
|
|
5
|
+
BAN_DURATION_CHOICES,
|
|
6
|
+
DEFAULT_BAN_MINUTES,
|
|
7
|
+
type ModelAbuseRoutesConfig,
|
|
8
|
+
} from "./contracts";
|
|
5
9
|
|
|
6
10
|
const unbanBody = t.Object({
|
|
11
|
+
/** The opaque member the listing reports, so a scoped ban lifts exactly it. */
|
|
7
12
|
identity: t.String({ minLength: 1 }),
|
|
8
13
|
});
|
|
9
14
|
|
|
10
15
|
const banBody = t.Object({
|
|
11
16
|
ip: t.String({ minLength: 1, maxLength: 45 }),
|
|
17
|
+
/**
|
|
18
|
+
* The key this ban is scoped to. Omitted or null is the blunt instrument:
|
|
19
|
+
* every key used from this address. That is a real choice an operator makes
|
|
20
|
+
* when the address is the problem, not a fallback for a missing value — so it
|
|
21
|
+
* is explicit in the body rather than inferred from an empty string.
|
|
22
|
+
*/
|
|
23
|
+
apiKeyId: t.Optional(t.Union([t.String({ minLength: 1 }), t.Null()])),
|
|
24
|
+
/** Whole minutes, or null for permanent. Default one hour. */
|
|
25
|
+
minutes: t.Optional(t.Union([t.Number({ minimum: 1 }), t.Null()])),
|
|
26
|
+
/**
|
|
27
|
+
* Bans the address outright, whatever `apiKeyId` says. Kept as its own flag
|
|
28
|
+
* so "no key supplied" cannot quietly widen into "every key" — the two read
|
|
29
|
+
* the same in a body that only had the one field.
|
|
30
|
+
*/
|
|
31
|
+
addressOnly: t.Optional(t.Boolean()),
|
|
12
32
|
});
|
|
13
33
|
|
|
34
|
+
/** The durations the route accepts, as whole minutes. `null` is permanent. */
|
|
35
|
+
const ALLOWED_MINUTES = new Set<number | null>(
|
|
36
|
+
BAN_DURATION_CHOICES.map((choice) => choice.minutes),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* How long a requested ban lasts, in milliseconds.
|
|
41
|
+
*
|
|
42
|
+
* `null` means permanent, which is a very long TTL rather than an unbounded
|
|
43
|
+
* ban: both stores lapse a ban by comparing an expiry to now, so a genuinely
|
|
44
|
+
* infinite ban would need a second mechanism and a second way to get it wrong.
|
|
45
|
+
*
|
|
46
|
+
* Anything not on the offered list is rejected rather than clamped. Clamping
|
|
47
|
+
* would answer a request for 90 days with a week and report success, and an
|
|
48
|
+
* operator who asked for the longer ban would believe they got it.
|
|
49
|
+
*/
|
|
50
|
+
function banTtlMs(minutes: number | null | undefined): number {
|
|
51
|
+
const chosen = minutes === undefined ? DEFAULT_BAN_MINUTES : minutes;
|
|
52
|
+
if (!ALLOWED_MINUTES.has(chosen)) {
|
|
53
|
+
throw new ConsoleDomainError(
|
|
54
|
+
"invalid_request",
|
|
55
|
+
400,
|
|
56
|
+
"Unsupported ban duration. Choose one of the offered durations.",
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
return chosen === null ? PERMANENT_BAN_TTL_MS : chosen * 60_000;
|
|
60
|
+
}
|
|
61
|
+
|
|
14
62
|
export function createModelAbuseRoutes(config: ModelAbuseRoutesConfig): Elysia {
|
|
15
63
|
return new Elysia()
|
|
16
64
|
.get("/model-bans", async ({ request, set }) => {
|
|
@@ -25,7 +73,12 @@ export function createModelAbuseRoutes(config: ModelAbuseRoutesConfig): Elysia {
|
|
|
25
73
|
.post("/model-bans", { body: banBody }, async ({ request, body, set }) => {
|
|
26
74
|
try {
|
|
27
75
|
requireGlobalAdmin(config.accessResolver(request));
|
|
28
|
-
const ban = await config.strikes.ban(
|
|
76
|
+
const ban = await config.strikes.ban({
|
|
77
|
+
ip: body.ip,
|
|
78
|
+
...(body.apiKeyId === undefined ? {} : { apiKeyId: body.apiKeyId }),
|
|
79
|
+
ttlMs: banTtlMs(body.minutes),
|
|
80
|
+
...(body.addressOnly === undefined ? {} : { addressOnly: body.addressOnly }),
|
|
81
|
+
});
|
|
29
82
|
return { ban };
|
|
30
83
|
} catch (e) {
|
|
31
84
|
return errorResponse(e, set, "Model ban failed");
|