cartethyia 2.5.9 → 2.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +15 -42
- package/README.md +11 -10
- package/dist/dashboard/assets/{BannedPage-Brvuj_Eb.js → BannedPage-l6XMnfr9.js} +1 -1
- package/dist/dashboard/assets/BannedPage-l6XMnfr9.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-CqfXtI3y.js → CliToolDetailPage-DwOzAW45.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DwOzAW45.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-GQeS91bg.js → CliToolsPage-BT3Up3QA.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BT3Up3QA.js.gz +0 -0
- package/dist/dashboard/assets/{CombosPage-BDRsTXBB.js → CombosPage-6kYIUpzR.js} +1 -1
- package/dist/dashboard/assets/CombosPage-6kYIUpzR.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-zP8AFHX0.js → ConsoleLogPage-zRnj1mlR.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-zRnj1mlR.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-BmfrNZ14.js → CustomizationPage-C7m-H1Rz.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-C7m-H1Rz.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-C8MR_BdB.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-C8MR_BdB.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-DoreIgm8.js → LoginPage-CbphLvjg.js} +1 -1
- package/dist/dashboard/assets/LoginPage-CbphLvjg.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-C7pDb41R.js → ModelPicker-DVny4S5_.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-DVny4S5_.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DABu2Wgt.js +1 -0
- package/dist/dashboard/assets/OverviewPage-DABu2Wgt.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-C15x9q13.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-C15x9q13.js.gz +0 -0
- package/dist/dashboard/assets/{ProvidersPage-BnoPgA7w.js → ProvidersPage-Dfb2896L.js} +1 -1
- package/dist/dashboard/assets/ProvidersPage-Dfb2896L.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-Bq_TGgdb.js → ProxyPage-BaCIdAUt.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-BaCIdAUt.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-BsdoCIw1.js +1 -0
- package/dist/dashboard/assets/QuotaPage-BsdoCIw1.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-KVJFh3Ip.js +1 -0
- package/dist/dashboard/assets/SettingsPage-KVJFh3Ip.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-Day3mCOn.js → SetupPage-D4g6vOGc.js} +1 -1
- package/dist/dashboard/assets/SetupPage-D4g6vOGc.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-DQxllnB5.js → SortableList-C93i14BD.js} +1 -1
- package/dist/dashboard/assets/SortableList-C93i14BD.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-uMExoWu1.js → StudioPage-SgQpymjm.js} +1 -1
- package/dist/dashboard/assets/{StudioPage-uMExoWu1.js.gz → StudioPage-SgQpymjm.js.gz} +0 -0
- package/dist/dashboard/assets/{UsagePage-DXa1oR-4.js → UsagePage-BFME-eba.js} +2 -2
- package/dist/dashboard/assets/UsagePage-BFME-eba.js.gz +0 -0
- package/dist/dashboard/assets/{api-keys-DQYLQxpW.js → api-keys-C23S9sgp.js} +1 -1
- package/dist/dashboard/assets/api-keys-C23S9sgp.js.gz +0 -0
- package/dist/dashboard/assets/{app-BIt446yE.js → app-2KhtHCv9.js} +1 -1
- package/dist/dashboard/assets/{app-BIt446yE.js.gz → app-2KhtHCv9.js.gz} +0 -0
- package/dist/dashboard/assets/app-CEeaMHOy.css +2 -0
- package/dist/dashboard/assets/app-CEeaMHOy.css.gz +0 -0
- package/dist/dashboard/assets/{assert-C9FD_JwJ.js → assert-DU6qrMA_.js} +1 -1
- package/dist/dashboard/assets/assert-DU6qrMA_.js.gz +0 -0
- package/dist/dashboard/assets/{badge-CR72dasT.js → badge-CKsF123d.js} +1 -1
- package/dist/dashboard/assets/badge-CKsF123d.js.gz +0 -0
- package/dist/dashboard/assets/{banner-CI9_eSfO.js → banner-8j7uChA9.js} +1 -1
- package/dist/dashboard/assets/banner-8j7uChA9.js.gz +0 -0
- package/dist/dashboard/assets/{card-DS7CQEsO.js → card-CdsSlWA3.js} +1 -1
- package/dist/dashboard/assets/card-CdsSlWA3.js.gz +0 -0
- package/dist/dashboard/assets/{cli-tools-CNqzrfdb.js → cli-tools-BaFUuFFF.js} +1 -1
- package/dist/dashboard/assets/cli-tools-BaFUuFFF.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-611pSsaX.js → clipboard-button-uL5aYLfW.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-uL5aYLfW.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-k37exjNt.js → dialog-C07hr5_G.js} +1 -1
- package/dist/dashboard/assets/dialog-C07hr5_G.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CX7N8ucR.js → drawer-BPO1TcKH.js} +1 -1
- package/dist/dashboard/assets/drawer-BPO1TcKH.js.gz +0 -0
- package/dist/dashboard/assets/{entry-CTP8AyiS.js → entry-Bz_CtDfC.js} +1 -1
- package/dist/dashboard/assets/entry-Bz_CtDfC.js.gz +0 -0
- package/dist/dashboard/assets/entry-CwPRKk0d.js +4 -0
- package/dist/dashboard/assets/entry-CwPRKk0d.js.gz +0 -0
- package/dist/dashboard/assets/entry-GJRbmrpA.js +1 -0
- package/dist/dashboard/assets/entry-GJRbmrpA.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-sltk1qUi.js → github-badge-DmQreSDd.js} +1 -1
- package/dist/dashboard/assets/github-badge-DmQreSDd.js.gz +0 -0
- package/dist/dashboard/assets/{index-z3zDOSMM.js → index-Bblu6erR.js} +2 -2
- package/dist/dashboard/assets/index-Bblu6erR.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BhY2sSnO.js → inline-C9dCYaBZ.js} +1 -1
- package/dist/dashboard/assets/inline-C9dCYaBZ.js.gz +0 -0
- package/dist/dashboard/assets/{input-V1umFiBk.js → input-CjCnXweJ.js} +1 -1
- package/dist/dashboard/assets/input-CjCnXweJ.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BBOYycyS.js → layout-V6y8DAkl.js} +1 -1
- package/dist/dashboard/assets/layout-V6y8DAkl.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-1zzZYM0B.js → list-row-CM1AaG_y.js} +1 -1
- package/dist/dashboard/assets/list-row-CM1AaG_y.js.gz +0 -0
- package/dist/dashboard/assets/{live-BivGfuUs.js → live-ta6GMb-8.js} +1 -1
- package/dist/dashboard/assets/live-ta6GMb-8.js.gz +0 -0
- package/dist/dashboard/assets/{model-bans-CmffjLuG.js → model-bans-BmYTmbAk.js} +1 -1
- package/dist/dashboard/assets/model-bans-BmYTmbAk.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-46P0oWMe.js → mutation-g_fduiNw.js} +1 -1
- package/dist/dashboard/assets/mutation-g_fduiNw.js.gz +0 -0
- package/dist/dashboard/assets/{numbers-DkfMR5Qs.js → numbers-BOevJzdz.js} +1 -1
- package/dist/dashboard/assets/numbers-BOevJzdz.js.gz +0 -0
- package/dist/dashboard/assets/{query-keys-BFhGpwR1.js → query-keys-UETqfytp.js} +1 -1
- package/dist/dashboard/assets/query-keys-UETqfytp.js.gz +0 -0
- package/dist/dashboard/assets/{routing-CAb4F37R.js → routing-BPUo-W8d.js} +1 -1
- package/dist/dashboard/assets/routing-BPUo-W8d.js.gz +0 -0
- package/dist/dashboard/assets/{select-C6MMiaio.js → select-C980c4cz.js} +1 -1
- package/dist/dashboard/assets/select-C980c4cz.js.gz +0 -0
- package/dist/dashboard/assets/{settings-DNX9sydi.js → settings--3hxSyry.js} +1 -1
- package/dist/dashboard/assets/settings--3hxSyry.js.gz +0 -0
- package/dist/dashboard/assets/{stack-BHTfXdz_.js → stack-_gfTdLVB.js} +1 -1
- package/dist/dashboard/assets/stack-_gfTdLVB.js.gz +0 -0
- package/dist/dashboard/assets/{state-mPDRlQkl.js → state-2c5V4zo7.js} +1 -1
- package/dist/dashboard/assets/state-2c5V4zo7.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DOmJxg7H.js → switch-Dkke7Naf.js} +1 -1
- package/dist/dashboard/assets/switch-Dkke7Naf.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-Dem0lXQj.js → useMutation-EDFRkn1i.js} +1 -1
- package/dist/dashboard/assets/useMutation-EDFRkn1i.js.gz +0 -0
- package/dist/dashboard/index.html +1 -1
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +51 -51
- package/migrations/README.md +52 -52
- package/migrations/full-postgres/0020_add_telemetry_event_analytics.sql +77 -0
- package/migrations/full-postgres/0021_add_api_key_concurrency_tolerance.sql +13 -0
- package/migrations/full-postgres/0022_add_inferhub_config_key.sql +17 -0
- package/migrations/full-postgres/0023_drop_api_key_concurrency_tolerance.sql +13 -0
- package/migrations/lite-sqlite3/0020_add_telemetry_event_analytics.sql +69 -0
- package/migrations/lite-sqlite3/0021_add_api_key_concurrency_tolerance.sql +13 -0
- package/migrations/lite-sqlite3/0022_add_inferhub_config_key.sql +17 -0
- package/migrations/lite-sqlite3/0023_drop_api_key_concurrency_tolerance.sql +13 -0
- package/package.json +96 -97
- package/scripts/cli/admin.ts +126 -125
- package/scripts/cli/autostart.ts +237 -237
- package/scripts/cli/background.ts +120 -110
- package/scripts/cli/bin/carte.cjs +8 -8
- package/scripts/cli/bin/cartethyia.cjs +167 -167
- package/scripts/cli/console-menu.ts +308 -275
- package/scripts/cli/controller.ts +145 -0
- package/scripts/cli/doctor.ts +1 -1
- package/scripts/cli/env.ts +99 -99
- package/scripts/cli/gateway.ts +264 -261
- package/scripts/{health.ts → cli/health.ts} +4 -4
- package/scripts/cli/instance.ts +234 -224
- package/scripts/cli/main.ts +188 -164
- package/scripts/cli/platform.ts +64 -64
- package/scripts/cli/prompt.ts +275 -107
- package/scripts/cli/services.ts +88 -88
- package/scripts/cli/setup.ts +445 -445
- package/scripts/cli/start.ts +85 -82
- package/scripts/cli/startup-signal.ts +23 -23
- package/scripts/cli/telemetry.ts +70 -0
- package/scripts/cli/tray/index.ts +263 -263
- package/scripts/cli/tray/windows.ps1 +107 -107
- package/scripts/cli/tray.ts +192 -208
- package/scripts/cli/update.ts +39 -39
- package/scripts/cli/version.ts +67 -67
- package/scripts/cli/wordmark.ts +58 -58
- package/src/boot/app.ts +16 -1
- package/src/boot/dependencies.ts +128 -25
- package/src/config/package-paths.ts +24 -0
- package/src/config/resources.ts +137 -0
- package/src/config/runtime.ts +133 -76
- package/src/config/spec.ts +30 -29
- package/src/config/telemetry.ts +0 -25
- package/src/console/api-keys/bucket-spend.ts +14 -17
- package/src/console/api-keys/contracts.ts +410 -410
- package/src/console/api-keys/routes.ts +12 -0
- package/src/console/audit/store.ts +2 -3
- package/src/console/auth/setup-service.ts +8 -1
- package/src/console/backup/routes.ts +7 -0
- package/src/console/backup/service.ts +463 -463
- package/src/console/backup/store.ts +16 -11
- package/src/console/backup/validate.ts +1 -4
- package/src/console/cli-tools/fs-ops.ts +18 -2
- package/src/console/data-management/contracts.ts +1 -8
- package/src/console/data-management/operations.ts +61 -48
- package/src/console/data-management/routes.ts +4 -2
- package/src/console/domain-registration.ts +25 -3
- package/src/console/inferhub/client.ts +139 -0
- package/src/console/inferhub/key-store.ts +129 -0
- package/src/console/inferhub/normalize.ts +347 -0
- package/src/console/inferhub/routes.ts +411 -0
- package/src/console/inferhub/store.ts +109 -0
- package/src/console/inferhub/types.ts +183 -0
- package/src/console/observability/contracts.ts +2 -41
- package/src/console/observability/store.ts +176 -371
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/store.ts +23 -36
- package/src/console/quota/account-quota-shared.ts +52 -52
- package/src/console/quota/account-quota-tenant.ts +16 -24
- package/src/console/quota/refresh.ts +441 -441
- package/src/console/remote-support/service.ts +270 -114
- package/src/console/routing/pools/import-parse.ts +206 -206
- package/src/console/routing/pools/operations.ts +543 -543
- package/src/console/routing/pools/probe-verdict.ts +132 -132
- package/src/console/routing/pools/routes.ts +181 -181
- package/src/console/routing/pools/store.ts +1 -1
- package/src/console/settings/contracts.ts +42 -40
- package/src/console/settings/store.ts +25 -25
- package/src/console/share/share-stats.ts +22 -4
- package/src/console/share/share-usage.ts +30 -4
- package/src/console/shared/cursor.ts +15 -0
- package/src/console/updates/repository-updates.ts +40 -39
- package/src/console/updates/routes.ts +12 -0
- package/src/main.ts +13 -5
- package/src/network/pool/resolver.ts +1104 -1104
- package/src/observability/client-name.ts +22 -0
- package/src/observability/event-log.ts +5 -29
- package/src/observability/event-query.ts +690 -0
- package/src/observability/log-ring.ts +26 -2
- package/src/observability/log-sanitize.ts +118 -0
- package/src/observability/logger.ts +17 -13
- package/src/observability/metrics.ts +35 -0
- package/src/observability/payload-capture.ts +114 -41
- package/src/observability/payload-store.ts +249 -24
- package/src/observability/raw-event-writer.ts +118 -0
- package/src/observability/runtime-metrics.ts +71 -1
- package/src/observability/telemetry-buffer.ts +100 -17
- package/src/observability/telemetry-reconciliation.ts +417 -0
- package/src/persistence/boot.ts +20 -9
- package/src/persistence/db-pg.ts +13 -0
- package/src/persistence/db-sqlite.ts +569 -497
- package/src/persistence/dialect.ts +3 -2
- package/src/persistence/migrate.ts +181 -181
- package/src/persistence/schema.ts +1496 -1406
- package/src/persistence/shared-cache.ts +5 -1
- package/src/persistence/stores/api-key-store.ts +581 -581
- package/src/persistence/stores/telemetry-store.ts +124 -63
- package/src/protocol/reasoning-text.ts +30 -0
- package/src/protocol/registry.ts +2 -0
- package/src/protocol/response/chat.ts +33 -7
- package/src/protocol/response/codex.ts +14 -2
- package/src/protocol/response/messages.ts +5 -2
- package/src/providers/authentication/oauth-flow-store.ts +3 -10
- package/src/providers/bundled-discovery-providers.ts +122 -122
- package/src/providers/default-registry.ts +14 -0
- package/src/providers/discovery/catalog/catalog-blob.ts +18 -18
- package/src/providers/discovery/models-dev-catalog.ts +354 -354
- package/src/providers/discovery/probe-phases.ts +43 -7
- package/src/providers/discovery/probing-service.ts +70 -32
- package/src/providers/integrations/antigravity/antigravity.ts +9 -2
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +85 -17
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +934 -934
- package/src/providers/integrations/buddy/buddy-checkin.ts +5 -9
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +3 -7
- package/src/providers/integrations/buddy/buddy-quota-shared.ts +3 -1
- package/src/providers/integrations/buddy/capabilities.ts +4 -0
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +57 -49
- package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -180
- package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -206
- package/src/providers/integrations/buddy/workbuddy/quota.ts +161 -161
- package/src/providers/integrations/claude/claude-quota.ts +2 -2
- package/src/providers/integrations/claude/claude-user-profiles.ts +3 -2
- package/src/providers/integrations/claude/claude.ts +3 -4
- package/src/providers/integrations/cline/cline.ts +94 -8
- package/src/providers/integrations/codex/codex.ts +61 -37
- package/src/providers/integrations/cursor/cursor-catalog.ts +368 -368
- package/src/providers/integrations/cursor/cursor-http2.ts +300 -300
- package/src/providers/integrations/cursor/cursor-identity.ts +2 -4
- package/src/providers/integrations/cursor/cursor-request.ts +11 -0
- package/src/providers/integrations/cursor/cursor.ts +29 -17
- package/src/providers/integrations/cursor/protocol/framing.ts +129 -129
- package/src/providers/integrations/cursor/protocol/messages.ts +2380 -2380
- package/src/providers/integrations/cursor/protocol/struct.ts +305 -305
- package/src/providers/integrations/cursor/protocol/tool-canonical.ts +275 -0
- package/src/providers/integrations/github/github.ts +3 -1
- package/src/providers/integrations/grok/grok-quota.ts +279 -279
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +73 -73
- package/src/providers/integrations/grok/grok-ratelimit.ts +218 -218
- package/src/providers/integrations/hermes.ts +7 -1
- package/src/providers/integrations/inferhub.ts +201 -73
- package/src/providers/integrations/kilo/kilo.ts +152 -152
- package/src/providers/integrations/kiro/kiro-machine-id.ts +2 -4
- package/src/providers/integrations/opencode/provider.ts +2 -0
- package/src/providers/integrations/openrouter/provider.ts +129 -129
- package/src/providers/integrations/qoder/qoder-quota.ts +193 -192
- package/src/providers/integrations/qoder/qoder-realm.ts +106 -106
- package/src/providers/integrations/trae/trae-headers.ts +17 -48
- package/src/providers/integrations/trae/trae-oauth.ts +4 -26
- package/src/providers/integrations/trae/trae-quota.ts +389 -384
- package/src/providers/integrations/trae/trae-realm.ts +15 -2
- package/src/providers/integrations/trae/trae.ts +22 -24
- package/src/providers/integrations/xiaomi-mimo/think-stream.ts +100 -24
- package/src/providers/integrations/zcode/oauth.ts +1 -1
- package/src/providers/operations/account-health-service.ts +605 -279
- package/src/providers/provider-metadata.ts +12 -1
- package/src/providers/provider-model-definition.ts +373 -373
- package/src/providers/provider-probe.ts +3 -0
- package/src/providers/quota/quota-contracts.ts +3 -7
- package/src/providers/search/search-provider.ts +2 -6
- package/src/security/admission/contracts.ts +10 -0
- package/src/security/admission/in-memory-store.ts +89 -14
- package/src/security/admission/lua.ts +191 -182
- package/src/security/admission/redis-store.ts +30 -0
- package/src/security/admission/service.ts +18 -0
- package/src/security/api-key-auth-cache.ts +96 -0
- package/src/security/api-key-auth.ts +11 -100
- package/src/security/client-router-fingerprint.ts +3 -7
- package/src/security/ip-boundary.ts +7 -3
- package/src/shared/coerce.ts +67 -0
- package/src/shared/hash.ts +6 -0
- package/src/shared/time.ts +7 -0
- package/src/transport/dispatch/attempt-finalize.ts +26 -138
- package/src/transport/dispatch/attempt-loop.ts +103 -81
- package/src/transport/dispatch/capture-policy.ts +78 -0
- package/src/transport/dispatch/proxy-request.ts +4 -2
- package/src/transport/dispatch/streaming/encoder.ts +111 -5
- package/src/transport/dispatch/streaming/stream.ts +19 -2
- package/src/transport/dispatch/streaming/thinking-loop.ts +300 -0
- package/src/transport/failure-policy.ts +27 -0
- package/src/transport/guards/abuse-guard.ts +2 -2
- package/src/transport/guards/auth-guard.ts +17 -0
- package/src/transport/guards/body-policy.ts +3 -2
- package/src/transport/guards/concurrency-guard.ts +89 -13
- package/src/transport/guards/early-rejection-capture.ts +43 -3
- package/src/transport/guards/error-lifecycle.ts +10 -2
- package/src/transport/guards/guard-errors.ts +23 -0
- package/src/transport/guards/headroom-guard.ts +41 -7
- package/src/transport/guards/pipeline.ts +24 -0
- package/src/transport/guards/request-context.ts +2 -1
- package/src/transport/routing/admission.ts +51 -9
- package/src/transport/routing/bounded-lru.ts +49 -0
- package/src/transport/routing/candidate-index.ts +88 -0
- package/src/transport/routing/reservations.ts +121 -7
- package/src/transport/routing/round-robin.ts +10 -22
- package/src/transport/routing/route-catalog.ts +26 -13
- package/src/transport/routing/route-model.ts +22 -2
- package/src/transport/routing/router.ts +53 -31
- package/src/transport/surface/chat/encode.ts +2 -3
- package/src/transport/surface/chat/parse.ts +2 -1
- package/src/transport/surface/dialects.ts +11 -3
- package/src/transport/surface/messages/encode.ts +2 -1
- package/src/transport/surface/messages/parse.ts +3 -1
- package/src/transport/surface/messages/stream.ts +2 -6
- package/src/workers/maintenance-lease.ts +200 -0
- package/src/workers/scheduler.ts +101 -1
- package/dist/dashboard/assets/BannedPage-Brvuj_Eb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-CqfXtI3y.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-GQeS91bg.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-BDRsTXBB.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-zP8AFHX0.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-BmfrNZ14.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-Dn3M6WZc.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-Dn3M6WZc.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-DoreIgm8.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-C7pDb41R.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-CvvD1Ugk.js +0 -1
- package/dist/dashboard/assets/OverviewPage-CvvD1Ugk.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-Clbn1gsW.js +0 -3
- package/dist/dashboard/assets/ProviderDetailPage-Clbn1gsW.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BnoPgA7w.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-Bq_TGgdb.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-D9DHXvom.js +0 -1
- package/dist/dashboard/assets/QuotaPage-D9DHXvom.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-7xV8WkWL.js +0 -1
- package/dist/dashboard/assets/SettingsPage-7xV8WkWL.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-Day3mCOn.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-DQxllnB5.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-DXa1oR-4.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-DQYLQxpW.js.gz +0 -0
- package/dist/dashboard/assets/app-CX_Z8cMs.css +0 -2
- package/dist/dashboard/assets/app-CX_Z8cMs.css.gz +0 -0
- package/dist/dashboard/assets/assert-C9FD_JwJ.js.gz +0 -0
- package/dist/dashboard/assets/badge-CR72dasT.js.gz +0 -0
- package/dist/dashboard/assets/banner-CI9_eSfO.js.gz +0 -0
- package/dist/dashboard/assets/card-DS7CQEsO.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-CNqzrfdb.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-611pSsaX.js.gz +0 -0
- package/dist/dashboard/assets/dialog-k37exjNt.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CX7N8ucR.js.gz +0 -0
- package/dist/dashboard/assets/entry-B9Xvtnfj.js +0 -1
- package/dist/dashboard/assets/entry-B9Xvtnfj.js.gz +0 -0
- package/dist/dashboard/assets/entry-ByMGkR3C.js +0 -4
- package/dist/dashboard/assets/entry-ByMGkR3C.js.gz +0 -0
- package/dist/dashboard/assets/entry-CTP8AyiS.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-sltk1qUi.js.gz +0 -0
- package/dist/dashboard/assets/index-z3zDOSMM.js.gz +0 -0
- package/dist/dashboard/assets/inline-BhY2sSnO.js.gz +0 -0
- package/dist/dashboard/assets/input-V1umFiBk.js.gz +0 -0
- package/dist/dashboard/assets/layout-BBOYycyS.js.gz +0 -0
- package/dist/dashboard/assets/list-row-1zzZYM0B.js.gz +0 -0
- package/dist/dashboard/assets/live-BivGfuUs.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-CmffjLuG.js.gz +0 -0
- package/dist/dashboard/assets/mutation-46P0oWMe.js.gz +0 -0
- package/dist/dashboard/assets/numbers-DkfMR5Qs.js.gz +0 -0
- package/dist/dashboard/assets/query-keys-BFhGpwR1.js.gz +0 -0
- package/dist/dashboard/assets/routing-CAb4F37R.js.gz +0 -0
- package/dist/dashboard/assets/select-C6MMiaio.js.gz +0 -0
- package/dist/dashboard/assets/settings-DNX9sydi.js.gz +0 -0
- package/dist/dashboard/assets/stack-BHTfXdz_.js.gz +0 -0
- package/dist/dashboard/assets/state-mPDRlQkl.js.gz +0 -0
- package/dist/dashboard/assets/switch-DOmJxg7H.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-Dem0lXQj.js.gz +0 -0
- package/scripts/build/aot.ts +0 -143
- package/scripts/build/build.ts +0 -24
- package/scripts/build/compile.ts +0 -88
- package/scripts/build/restart.ts +0 -120
- package/scripts/build/start.ts +0 -25
- package/src/observability/event-compaction.ts +0 -317
- package/src/observability/event-day-index.ts +0 -440
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InferHub market types.
|
|
3
|
+
*
|
|
4
|
+
* Two layers, deliberately separate. The raw shapes mirror the wire exactly,
|
|
5
|
+
* including the split the InferHub API makes between **decimal strings**
|
|
6
|
+
* (`/api/catalog`, `/api/budgets` — `$/Mtok` as `"3.5"`) and **numbers**
|
|
7
|
+
* (`/api/market` — `3.5`). Collapsing them into one type is how a string price
|
|
8
|
+
* silently becomes `NaN` or a number price becomes `"3.5" + 1`, so the two
|
|
9
|
+
* sources have two types and never share a field.
|
|
10
|
+
*
|
|
11
|
+
* Everything here is untrusted remote data: labels and `systemPromptNote` arrive
|
|
12
|
+
* from the marketplace and must be rendered as text, never interpolated into a
|
|
13
|
+
* prompt or a URL.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** One price tier: a distinct ask and how many live providers offer it. */
|
|
17
|
+
export interface Tier {
|
|
18
|
+
readonly price: number;
|
|
19
|
+
/** Percentage below the official price; null when the official price is unknown. */
|
|
20
|
+
readonly discountPct: number | null;
|
|
21
|
+
/** Live providers offering this price. */
|
|
22
|
+
readonly avail: number;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/** Upstream family health, as InferHub reports it. */
|
|
26
|
+
export type FamilyState = "operational" | "degraded" | "major_outage" | "low_traffic";
|
|
27
|
+
|
|
28
|
+
export interface ModelHealth {
|
|
29
|
+
/** Null below InferHub's volume floor (10 requests). Null means unknown, not bad. */
|
|
30
|
+
readonly successRatePct: number | null;
|
|
31
|
+
/** Null below the sample floor (3 samples). */
|
|
32
|
+
readonly avgTtftMs: number | null;
|
|
33
|
+
readonly avgTps: number | null;
|
|
34
|
+
readonly familyState: FamilyState | null;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export interface ModelCapabilities {
|
|
38
|
+
readonly contextWindow: number | null;
|
|
39
|
+
readonly maxOutputTokens: number | null;
|
|
40
|
+
readonly modalities: readonly string[];
|
|
41
|
+
readonly outputModality: "text" | "image" | "video";
|
|
42
|
+
readonly reasoningLevels: readonly string[];
|
|
43
|
+
readonly supportsCache: boolean;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** One normalized marketplace model. */
|
|
47
|
+
export interface ModelMarket {
|
|
48
|
+
/** `"cc/claude-opus-5-5"` — the prefix is load-bearing and never stripped. */
|
|
49
|
+
readonly id: string;
|
|
50
|
+
readonly prefix: string;
|
|
51
|
+
readonly family: string;
|
|
52
|
+
readonly modelId: string;
|
|
53
|
+
/** Cross-prefix comparison key; see `normalize.ts`. */
|
|
54
|
+
readonly aliasKey: string;
|
|
55
|
+
readonly officialIn: number | null;
|
|
56
|
+
readonly officialOut: number | null;
|
|
57
|
+
/** Ascending by price. */
|
|
58
|
+
readonly tiersIn: readonly Tier[];
|
|
59
|
+
readonly tiersOut: readonly Tier[];
|
|
60
|
+
readonly minAskIn: number | null;
|
|
61
|
+
readonly minAskOut: number | null;
|
|
62
|
+
readonly maxAskIn: number | null;
|
|
63
|
+
readonly maxAskOut: number | null;
|
|
64
|
+
/** Zero means no live provider — listed, but never routed to. */
|
|
65
|
+
readonly providersLive: number;
|
|
66
|
+
readonly lastRate: number | null;
|
|
67
|
+
readonly cacheHitRate: number | null;
|
|
68
|
+
readonly health: ModelHealth;
|
|
69
|
+
readonly capabilities: ModelCapabilities;
|
|
70
|
+
/** Untrusted remote prose describing how the upstream rewrites the system prompt. */
|
|
71
|
+
readonly systemPromptNote: string | null;
|
|
72
|
+
/** Whether this model may be routed to right now. */
|
|
73
|
+
readonly routable: boolean;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/** Per-upstream-family summary for the providers view. */
|
|
77
|
+
export interface ProviderMarket {
|
|
78
|
+
readonly prefix: string;
|
|
79
|
+
readonly family: string;
|
|
80
|
+
readonly activeProviders: number;
|
|
81
|
+
readonly familyState: FamilyState | null;
|
|
82
|
+
readonly availability24hPct: number | null;
|
|
83
|
+
readonly availability7dPct: number | null;
|
|
84
|
+
readonly p50DurationMs: number | null;
|
|
85
|
+
readonly p95DurationMs: number | null;
|
|
86
|
+
readonly avgTtftMs1h: number | null;
|
|
87
|
+
readonly avgTps1h: number | null;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** Platform pricing configuration. */
|
|
91
|
+
export interface PricingConfig {
|
|
92
|
+
readonly maxAskPctOfOfficial: number | null;
|
|
93
|
+
readonly platformFeePct: number | null;
|
|
94
|
+
readonly publisherSharePct: number | null;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/** Which upstream a snapshot came from, and when. */
|
|
98
|
+
export type InferhubSource = "market" | "status" | "catalog" | "pricingConfig";
|
|
99
|
+
|
|
100
|
+
/** A snapshot plus its freshness, as the API reports it. */
|
|
101
|
+
export interface SnapshotMeta {
|
|
102
|
+
readonly fetchedAt: number;
|
|
103
|
+
readonly ageSeconds: number;
|
|
104
|
+
/** True when the snapshot is older than its freshness window. */
|
|
105
|
+
readonly stale: boolean;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// ── Raw wire shapes ────────────────────────────────────────────────────────
|
|
109
|
+
|
|
110
|
+
/** `GET /api/market` — money is numeric here. */
|
|
111
|
+
export interface RawMarketModel {
|
|
112
|
+
readonly slug?: unknown;
|
|
113
|
+
readonly family?: unknown;
|
|
114
|
+
readonly minAskIn?: unknown;
|
|
115
|
+
readonly minAskOut?: unknown;
|
|
116
|
+
readonly maxAskIn?: unknown;
|
|
117
|
+
readonly maxAskOut?: unknown;
|
|
118
|
+
readonly lastRate?: unknown;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
/** `GET /api/catalog` — money is a decimal string here. */
|
|
122
|
+
export interface RawCatalogModel {
|
|
123
|
+
readonly id?: unknown;
|
|
124
|
+
/** The routable slug, e.g. `claude-haiku-4-5`. `id` is a UUID. */
|
|
125
|
+
readonly upstreamModelId?: unknown;
|
|
126
|
+
readonly label?: unknown;
|
|
127
|
+
readonly officialIn?: unknown;
|
|
128
|
+
readonly officialOut?: unknown;
|
|
129
|
+
/**
|
|
130
|
+
* `[price, providerCount]` tuples — InferHub pre-aggregates tiers, so one
|
|
131
|
+
* entry is one distinct price and its live-provider count. Money is numeric
|
|
132
|
+
* here even though `officialIn`/`officialOut` are decimal strings.
|
|
133
|
+
*/
|
|
134
|
+
readonly pricePointsIn?: unknown;
|
|
135
|
+
readonly pricePointsOut?: unknown;
|
|
136
|
+
readonly asksIn?: unknown;
|
|
137
|
+
readonly asksOut?: unknown;
|
|
138
|
+
readonly enabled?: unknown;
|
|
139
|
+
readonly modelDisabled?: unknown;
|
|
140
|
+
readonly supportsCache?: unknown;
|
|
141
|
+
readonly cacheHitRate?: unknown;
|
|
142
|
+
readonly contextWindow?: unknown;
|
|
143
|
+
readonly maxOutputTokens?: unknown;
|
|
144
|
+
readonly reasoningLevels?: unknown;
|
|
145
|
+
readonly modalities?: unknown;
|
|
146
|
+
readonly outputModality?: unknown;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export interface RawUpstreamCard {
|
|
150
|
+
readonly id?: unknown;
|
|
151
|
+
readonly slug?: unknown;
|
|
152
|
+
readonly prefix?: unknown;
|
|
153
|
+
readonly label?: unknown;
|
|
154
|
+
readonly status?: unknown;
|
|
155
|
+
readonly activeProviders?: unknown;
|
|
156
|
+
readonly systemPromptNote?: unknown;
|
|
157
|
+
readonly models?: unknown;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/** `GET /api/status` — per-model health and per-family state. */
|
|
161
|
+
export interface RawStatusModel {
|
|
162
|
+
/** The full `prefix/model` key. `slug` is the fallback for older payloads. */
|
|
163
|
+
readonly id?: unknown;
|
|
164
|
+
readonly slug?: unknown;
|
|
165
|
+
readonly successRatePct?: unknown;
|
|
166
|
+
readonly avgTtftMs?: unknown;
|
|
167
|
+
readonly avgTps?: unknown;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
export interface RawStatusFamily {
|
|
171
|
+
readonly slug?: unknown;
|
|
172
|
+
readonly prefix?: unknown;
|
|
173
|
+
/** Display name, e.g. `Antigravity`. `slug` is the lowercase key. */
|
|
174
|
+
readonly family?: unknown;
|
|
175
|
+
readonly currentAvailabilityPct?: unknown;
|
|
176
|
+
readonly state?: unknown;
|
|
177
|
+
readonly availability24hPct?: unknown;
|
|
178
|
+
readonly availability7dPct?: unknown;
|
|
179
|
+
readonly p50DurationMs?: unknown;
|
|
180
|
+
readonly p95DurationMs?: unknown;
|
|
181
|
+
readonly avgTtftMs1h?: unknown;
|
|
182
|
+
readonly avgTps1h?: unknown;
|
|
183
|
+
}
|
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
import type { ConsoleAccessResolver } from "../auth/access";
|
|
2
2
|
// Telemetry domain: system health, usage, and telemetry-event read API.
|
|
3
3
|
|
|
4
|
-
import { readdir } from "node:fs/promises";
|
|
5
4
|
import { ConsoleDomainError, requireTenantScope } from "../shared/errors";
|
|
6
5
|
import { conditionalResponse, type CachedResult } from "../shared/read-through-cache";
|
|
7
6
|
import { parseQueryLimit } from "../shared/query";
|
|
8
7
|
import type { AccessDecision } from "../../security/access-control";
|
|
9
|
-
import { resolveTelemetryCompactAfterDays } from "../../config/telemetry";
|
|
10
8
|
import { USAGE_DIMENSIONS, type UsageDimension } from "./usage-dimensions";
|
|
11
9
|
|
|
12
10
|
/**
|
|
@@ -23,31 +21,6 @@ export function isSupportedUsagePeriod(period: string): boolean {
|
|
|
23
21
|
return Number.isSafeInteger(amount) && amount >= 1 && amount <= cap;
|
|
24
22
|
}
|
|
25
23
|
|
|
26
|
-
/**
|
|
27
|
-
* Why a request detail cannot be shown.
|
|
28
|
-
*
|
|
29
|
-
* A compacted request is genuinely gone: past the compaction age its row was
|
|
30
|
-
* folded into a per-day summary, and the individual request no longer exists
|
|
31
|
-
* anywhere. That is by design, not data loss — but "Request not found" reads
|
|
32
|
-
* like the latter, and an operator who thinks history was lost will go looking
|
|
33
|
-
* for a bug that is not there.
|
|
34
|
-
*
|
|
35
|
-
* The age is checked against the summary files rather than assumed: a request
|
|
36
|
-
* from before retention is aged out, not compacted, and the two deserve
|
|
37
|
-
* different words.
|
|
38
|
-
*/
|
|
39
|
-
async function detailNotFoundMessage(requestId: string, noun = "Request"): Promise<string> {
|
|
40
|
-
const compacted = await readdir("./data/telemetry-events").catch(() => [] as string[]);
|
|
41
|
-
const hasSummaries = compacted.some((file) => file.endsWith(".index.json"));
|
|
42
|
-
if (!hasSummaries) return `${noun} ${requestId} not found`;
|
|
43
|
-
return (
|
|
44
|
-
`${noun} ${requestId} is no longer stored individually: requests older than ` +
|
|
45
|
-
`${resolveTelemetryCompactAfterDays()} day(s) are compacted into daily summaries. ` +
|
|
46
|
-
`Its totals still count in Usage — raise CARTETHYIA_TELEMETRY_COMPACT_AFTER_DAYS ` +
|
|
47
|
-
`to keep individual requests longer.`
|
|
48
|
-
);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
24
|
export { USAGE_PERIODS, type UsagePeriod } from "./usage-periods";
|
|
52
25
|
|
|
53
26
|
export interface SystemHealthResponse {
|
|
@@ -413,13 +386,7 @@ export function createObservabilityOperations(config: ObservabilityConfig) {
|
|
|
413
386
|
includePayload,
|
|
414
387
|
createdAt,
|
|
415
388
|
);
|
|
416
|
-
if (!detail) {
|
|
417
|
-
throw new ConsoleDomainError(
|
|
418
|
-
"event_not_found",
|
|
419
|
-
404,
|
|
420
|
-
await detailNotFoundMessage(eventId, "Event"),
|
|
421
|
-
);
|
|
422
|
-
}
|
|
389
|
+
if (!detail) throw new ConsoleDomainError("event_not_found", 404, `Event ${eventId} not found`);
|
|
423
390
|
return detail;
|
|
424
391
|
},
|
|
425
392
|
requirePeriod(period: string): string {
|
|
@@ -509,13 +476,7 @@ export function createObservabilityOperations(config: ObservabilityConfig) {
|
|
|
509
476
|
): Promise<UsageRequestDetail> {
|
|
510
477
|
const tenantId = operations.requireTenant(access);
|
|
511
478
|
const detail = await config.store.usageRequestDetail(tenantId, requestId);
|
|
512
|
-
if (!detail) {
|
|
513
|
-
throw new ConsoleDomainError(
|
|
514
|
-
"event_not_found",
|
|
515
|
-
404,
|
|
516
|
-
await detailNotFoundMessage(requestId),
|
|
517
|
-
);
|
|
518
|
-
}
|
|
479
|
+
if (!detail) throw new ConsoleDomainError("event_not_found", 404, `Request ${requestId} not found`);
|
|
519
480
|
const payloads = detail.payloads ?? null;
|
|
520
481
|
return { ...detail, payloads };
|
|
521
482
|
},
|