cartethyia 2.4.5 → 2.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +4 -1
- package/README.md +63 -13
- package/dist/dashboard/assets/AccountCooldown-ChpdzxRH.js.gz +0 -0
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js +1 -0
- package/dist/dashboard/assets/BannedPage-9igfctfZ.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BzGevuql.js → CliToolDetailPage-ZRr2K2sF.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-ZRr2K2sF.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-BaRM_7We.js → CliToolsPage-D3xqZbN-.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-D3xqZbN-.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js +1 -0
- package/dist/dashboard/assets/CombosPage-CVnQPBBz.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-u6W1UXSc.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-DqUGcoH0.js → CustomizationPage-CTTpCb25.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-CTTpCb25.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-C5XpWlvy.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-DbhTGfhb.js → LoginPage-DHoB3Agn.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DHoB3Agn.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js +1 -0
- package/dist/dashboard/assets/ModelPicker-oQ-SDXp8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BrY4SgIt.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js +3 -0
- package/dist/dashboard/assets/ProviderDetailPage-D9VSt7T_.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-CmfzxpVM.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-Df77V5I5.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js +7 -0
- package/dist/dashboard/assets/ProxyPage-CDfxP7AC.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CY4o2t4p.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-YxRml8AT.js → SettingsPage-CvjZxHE4.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-CvjZxHE4.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-D3nza7LH.js +1 -0
- package/dist/dashboard/assets/SetupPage-D3nza7LH.js.gz +0 -0
- package/dist/dashboard/assets/{SortableList-Bol1ASmI.js → SortableList-Dtt12WT1.js} +1 -1
- package/dist/dashboard/assets/SortableList-Dtt12WT1.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-CbK3hXvU.js +31 -0
- package/dist/dashboard/assets/StudioPage-CbK3hXvU.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js +56 -0
- package/dist/dashboard/assets/UsagePage-BQlWbWg2.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-BmDbsior.js +1 -0
- package/dist/dashboard/assets/api-keys-BmDbsior.js.gz +0 -0
- package/dist/dashboard/assets/app-BbpSarVV.css +2 -0
- package/dist/dashboard/assets/app-BbpSarVV.css.gz +0 -0
- package/dist/dashboard/assets/{app-BDJWMThu.js → app-C-Y4oZT0.js} +3 -3
- package/dist/dashboard/assets/app-C-Y4oZT0.js.gz +0 -0
- package/dist/dashboard/assets/arrow-left-CpBxkoxI.js.gz +0 -0
- package/dist/dashboard/assets/arrow-right-Dl5yKnp8.js.gz +0 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js +1 -0
- package/dist/dashboard/assets/assert-BHfaei-X.js.gz +0 -0
- package/dist/dashboard/assets/backup-file-gdKIlg8U.js.gz +0 -0
- package/dist/dashboard/assets/{badge-BwmwEOgA.js → badge-DpXT4Ixt.js} +1 -1
- package/dist/dashboard/assets/badge-DpXT4Ixt.js.gz +0 -0
- package/dist/dashboard/assets/{banner-BKBfKTqn.js → banner-CSAAWLJv.js} +1 -1
- package/dist/dashboard/assets/banner-CSAAWLJv.js.gz +0 -0
- package/dist/dashboard/assets/brain-Cwed_72z.js.gz +0 -0
- package/dist/dashboard/assets/{card-BTdbRFFg.js → card-DEhRXXw4.js} +1 -1
- package/dist/dashboard/assets/card-DEhRXXw4.js.gz +0 -0
- package/dist/dashboard/assets/check-D69FzdvC.js.gz +0 -0
- package/dist/dashboard/assets/chevron-right-BXIy5l3h.js.gz +0 -0
- package/dist/dashboard/assets/circle-alert-CntYHV5v.js.gz +0 -0
- package/dist/dashboard/assets/circle-check-BU3v_mFW.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-B0wBq-RL.js +1 -0
- package/dist/dashboard/assets/cli-tools-B0wBq-RL.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js +1 -0
- package/dist/dashboard/assets/clipboard-button-DOo6EU8O.js.gz +0 -0
- package/dist/dashboard/assets/cog-CdWhsajs.js.gz +0 -0
- package/dist/dashboard/assets/copy-ngmQ9zcZ.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-iocKA3jr.js → dialog-BvQeBMfP.js} +1 -1
- package/dist/dashboard/assets/dialog-BvQeBMfP.js.gz +0 -0
- package/dist/dashboard/assets/dialog-actions-B1axpEg7.js.gz +0 -0
- package/dist/dashboard/assets/download-A0SW9OCW.js.gz +0 -0
- package/dist/dashboard/assets/download-dRFo5_Wu.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CDKOTZdY.js → drawer-CMwPXwQB.js} +1 -1
- package/dist/dashboard/assets/drawer-CMwPXwQB.js.gz +0 -0
- package/dist/dashboard/assets/entry-D4O2229X.js +1 -0
- package/dist/dashboard/assets/entry-D4O2229X.js.gz +0 -0
- package/dist/dashboard/assets/entry-DKvr5Q9K.js +1 -0
- package/dist/dashboard/assets/entry-DKvr5Q9K.js.gz +0 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js +4 -0
- package/dist/dashboard/assets/entry-FQCejoDY.js.gz +0 -0
- package/dist/dashboard/assets/eye-C_hawfH4.js.gz +0 -0
- package/dist/dashboard/assets/eye-off-Bk5g2luF.js.gz +0 -0
- package/dist/dashboard/assets/fingerprint-pattern-BWuHtbW4.js.gz +0 -0
- package/dist/dashboard/assets/gauge-BbIMy7MB.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-zliLvBwr.js +1 -0
- package/dist/dashboard/assets/github-badge-zliLvBwr.js.gz +0 -0
- package/dist/dashboard/assets/image-BPaouViG.js.gz +0 -0
- package/dist/dashboard/assets/{index-C4hXfAMs.js → index-CXm3FIyt.js} +2 -2
- package/dist/dashboard/assets/index-CXm3FIyt.js.gz +0 -0
- package/dist/dashboard/assets/{inline-DCejSLlA.js → inline-D1IlZZ8H.js} +1 -1
- package/dist/dashboard/assets/inline-D1IlZZ8H.js.gz +0 -0
- package/dist/dashboard/assets/{input-Bn4_kNav.js → input-BpVZdrbc.js} +1 -1
- package/dist/dashboard/assets/input-BpVZdrbc.js.gz +0 -0
- package/dist/dashboard/assets/jsx-runtime-CXUMngI_.js.gz +0 -0
- package/dist/dashboard/assets/key-round-UkavsGxp.js.gz +0 -0
- package/dist/dashboard/assets/layers-2-glBbjl.js.gz +0 -0
- package/dist/dashboard/assets/{layout-Bv-NxqZ5.js → layout-BioLW7gN.js} +1 -1
- package/dist/dashboard/assets/layout-BioLW7gN.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BLA0sldD.js → list-row-CwVcGAIc.js} +1 -1
- package/dist/dashboard/assets/list-row-CwVcGAIc.js.gz +0 -0
- package/dist/dashboard/assets/{live-YlifPYox.js → live-yfEJFF9T.js} +1 -1
- package/dist/dashboard/assets/live-yfEJFF9T.js.gz +0 -0
- package/dist/dashboard/assets/log-in-BmRjy60c.js.gz +0 -0
- package/dist/dashboard/assets/message-circle-CCxGwRvv.js.gz +0 -0
- package/dist/dashboard/assets/model-bans-CT-TxSNX.js +1 -0
- package/dist/dashboard/assets/model-bans-CT-TxSNX.js.gz +0 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js +1 -0
- package/dist/dashboard/assets/mutation-BkoLM5Ba.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CFL4_Dqc.js.gz +0 -0
- package/dist/dashboard/assets/pencil-768ysRAr.js.gz +0 -0
- package/dist/dashboard/assets/plus-DIdX_g-x.js.gz +0 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js +1 -0
- package/dist/dashboard/assets/power-off-Yjw9GMJh.js.gz +0 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js +1 -0
- package/dist/dashboard/assets/privacy-mode-GM8bej85.js.gz +0 -0
- package/dist/dashboard/assets/providers/agentrouter.svg.gz +0 -0
- package/dist/dashboard/assets/providers/aihubmix.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/providers/alibaba.svg.gz +0 -0
- package/dist/dashboard/assets/providers/antigravity.svg.gz +0 -0
- package/dist/dashboard/assets/providers/bai.svg.gz +0 -0
- package/dist/dashboard/assets/providers/blackbox.svg.gz +0 -0
- package/dist/dashboard/assets/providers/claude-code.svg.gz +0 -0
- package/dist/dashboard/assets/providers/cursor.webp +0 -0
- package/dist/dashboard/assets/providers/exa.svg.gz +0 -0
- package/dist/dashboard/assets/providers/gmi-cloud.svg.gz +0 -0
- package/dist/dashboard/assets/providers/inferhub.svg.gz +0 -0
- package/dist/dashboard/assets/providers/muse.svg.gz +0 -0
- package/dist/dashboard/assets/providers/nous-research.svg.gz +0 -0
- package/dist/dashboard/assets/providers/openai-light.svg.gz +0 -0
- package/dist/dashboard/assets/providers/parallel.svg.gz +0 -0
- package/dist/dashboard/assets/providers/tokenharbor.svg.gz +0 -0
- package/dist/dashboard/assets/providers/trae.webp +0 -0
- package/dist/dashboard/assets/providers/zai-coding-plan.svg.gz +0 -0
- package/dist/dashboard/assets/{query-keys-ROf-g1Wi.js → query-keys-D7wX2vM5.js} +1 -1
- package/dist/dashboard/assets/query-keys-D7wX2vM5.js.gz +0 -0
- package/dist/dashboard/assets/quota-DZGyp0N5.js.gz +0 -0
- package/dist/dashboard/assets/refresh-cw-BqJFk4sU.js.gz +0 -0
- package/dist/dashboard/assets/rotate-ccw-CufcqITi.js.gz +0 -0
- package/dist/dashboard/assets/route-CNSNj9Zm.js.gz +0 -0
- package/dist/dashboard/assets/routing-Cs6jl49L.js +1 -0
- package/dist/dashboard/assets/routing-Cs6jl49L.js.gz +0 -0
- package/dist/dashboard/assets/scaling-nWE4Cx8f.js.gz +0 -0
- package/dist/dashboard/assets/search-JOKus9rb.js.gz +0 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js +41 -0
- package/dist/dashboard/assets/select-C0Rer3gF.js.gz +0 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js +1 -0
- package/dist/dashboard/assets/settings-CfcTcOyU.js.gz +0 -0
- package/dist/dashboard/assets/shield-check-DVS0Foqh.js.gz +0 -0
- package/dist/dashboard/assets/sparkles-BRaRUxAU.js.gz +0 -0
- package/dist/dashboard/assets/{stack-C1kTcOmP.js → stack-C9_uUjaA.js} +1 -1
- package/dist/dashboard/assets/stack-C9_uUjaA.js.gz +0 -0
- package/dist/dashboard/assets/{state-DHKdg-pm.js → state-DA0B95UQ.js} +1 -1
- package/dist/dashboard/assets/state-DA0B95UQ.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/{switch-DIDeAiz9.js → switch-Cittxy-x.js} +1 -1
- package/dist/dashboard/assets/switch-Cittxy-x.js.gz +0 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js +1 -0
- package/dist/dashboard/assets/terminal-Bd4ee8TA.js.gz +0 -0
- package/dist/dashboard/assets/toast-CNt_jzO4.js +2 -0
- package/dist/dashboard/assets/toast-CNt_jzO4.js.gz +0 -0
- package/dist/dashboard/assets/tokens-DDxMbSRL.js.gz +0 -0
- package/dist/dashboard/assets/trash-Cppn5c3R.js.gz +0 -0
- package/dist/dashboard/assets/use-clipboard-B0Sy03fE.js.gz +0 -0
- package/dist/dashboard/assets/use-presence-BSZEBx7U.js.gz +0 -0
- package/dist/dashboard/assets/use-reduced-motion-C4B0R6Sz.js.gz +0 -0
- package/dist/dashboard/assets/use-timeout-BwcBBRrT.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-DVmwOKU-.js → useMutation-BQKMcJ1H.js} +1 -1
- package/dist/dashboard/assets/useMutation-BQKMcJ1H.js.gz +0 -0
- package/dist/dashboard/assets/wrench-B6E1oEuY.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 +122 -0
- package/migrations/full-postgres/0013_add_providers_tenant_id_index.sql +22 -0
- package/migrations/full-postgres/0014_add_provider_accounts_tenant_id_index.sql +21 -0
- package/migrations/full-postgres/0015_add_payload_stages.sql +18 -0
- package/migrations/full-postgres/0016_add_share_link_slug.sql +20 -0
- package/migrations/full-postgres/0017_add_models_pro_only.sql +18 -0
- package/migrations/full-postgres/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/full-postgres/0019_add_models_free_tier.sql +15 -0
- package/migrations/lite-sqlite3/0000_baseline.sql +4 -2
- package/migrations/lite-sqlite3/0013_add_providers_tenant_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0014_add_provider_accounts_tenant_id_index.sql +4 -0
- package/migrations/lite-sqlite3/0015_add_payload_stages.sql +18 -0
- package/migrations/lite-sqlite3/0016_add_share_link_slug.sql +20 -0
- package/migrations/lite-sqlite3/0017_add_models_pro_only.sql +18 -0
- package/migrations/lite-sqlite3/0018_add_accounts_quota_plan.sql +18 -0
- package/migrations/lite-sqlite3/0019_add_models_free_tier.sql +15 -0
- package/package.json +26 -30
- package/scripts/cli/{carte-launcher.cjs → bin/carte.cjs} +8 -8
- package/scripts/cli/{cli-launcher.cjs → bin/cartethyia.cjs} +167 -134
- package/scripts/cli/command/admin.ts +65 -0
- package/scripts/cli/command/console-menu.ts +246 -0
- package/scripts/cli/{doctor.ts → command/doctor.ts} +257 -258
- package/scripts/cli/{setup.ts → command/setup.ts} +8 -12
- package/scripts/cli/command/start.ts +77 -0
- package/scripts/cli/command/tray.ts +165 -0
- package/scripts/cli/command/update.ts +23 -0
- package/scripts/cli/{runtime-state.ts → gateway/drain-token.ts} +78 -78
- package/scripts/cli/gateway/instance-lock.ts +105 -0
- package/scripts/cli/gateway/spawn.ts +173 -0
- package/scripts/cli/gateway/stop.ts +51 -0
- package/scripts/cli/main.ts +94 -0
- package/scripts/cli/support/bun.ts +27 -0
- package/scripts/cli/support/env.ts +99 -0
- package/scripts/cli/support/platform.ts +64 -0
- package/scripts/cli/support/services.ts +88 -0
- package/scripts/cli/support/startup-signal.ts +23 -0
- package/scripts/cli/{version.ts → support/version.ts} +1 -1
- package/scripts/cli/tray/hidden-window.vbs +28 -0
- package/scripts/cli/{tray.ts → tray/index.ts} +3 -3
- package/scripts/cli/{tray.ps1 → tray/windows.ps1} +107 -98
- package/scripts/cli/ui/background.ts +110 -0
- package/src/boot/app.ts +23 -7
- package/src/boot/dependencies.ts +55 -13
- package/src/boot/elysia-typebox-bridge.ts +37 -0
- package/src/boot/lifecycle.ts +2 -0
- package/src/config/cooldowns.ts +138 -138
- package/src/config/providers.ts +31 -5
- package/src/config/runtime.ts +19 -3
- package/src/config/spec.ts +20 -0
- package/src/console/api-keys/contracts.ts +414 -391
- package/src/console/api-keys/routes.ts +880 -870
- package/src/console/auth/account-reset-store.ts +14 -0
- package/src/console/auth/account-reset.ts +3 -2
- package/src/console/auth/setup-service.ts +6 -3
- package/src/console/backup/routes.ts +8 -0
- package/src/console/cli-tools/contracts.ts +6 -6
- package/src/console/console-router.ts +5 -3
- package/src/console/dashboard-assets.ts +81 -11
- package/src/console/domain-registration.ts +9 -2
- package/src/console/observability/contracts.ts +475 -423
- package/src/console/observability/routes.ts +31 -6
- package/src/console/observability/store.ts +1015 -912
- package/src/console/providers/catalog/contracts.ts +31 -0
- package/src/console/providers/catalog/provider-operations.ts +8 -0
- package/src/console/providers/catalog/public-model-store.ts +91 -60
- package/src/console/providers/catalog/store.ts +1532 -1521
- package/src/console/providers/oauth/callback-listener.ts +18 -3
- package/src/console/providers/oauth/routes.ts +38 -15
- package/src/console/quota/account-quota-tenant.ts +9 -6
- package/src/console/quota/refresh.ts +19 -0
- package/src/console/response-compression.ts +69 -2
- package/src/console/routing/pools/probe-verdict.ts +72 -0
- package/src/console/share/share-router.ts +7 -4
- package/src/console/share/share-stats.ts +12 -5
- package/src/console/shared/read-through-cache.ts +133 -7
- package/src/console/updates/repository-updates.ts +39 -34
- package/src/console/updates/routes.ts +162 -4
- package/src/main.ts +3 -0
- package/src/network/http2-bidi.ts +85 -0
- package/src/network/outbound-fetch.ts +87 -24
- package/src/network/pool/agent.ts +478 -460
- package/src/network/pool/resolver.ts +1104 -544
- package/src/network/pool-health-machine.ts +12 -5
- package/src/observability/event-log.ts +29 -8
- package/src/observability/metrics.ts +40 -13
- package/src/observability/payload-capture.ts +344 -324
- package/src/observability/runtime-metrics.ts +7 -0
- package/src/persistence/db-pg.ts +9 -3
- package/src/persistence/db-sqlite.ts +497 -495
- package/src/persistence/health-event-flush.ts +137 -0
- package/src/persistence/migrate.ts +181 -129
- package/src/persistence/schema.ts +1360 -1257
- package/src/persistence/settings-revision.ts +25 -0
- package/src/persistence/shared-cache.ts +217 -0
- package/src/persistence/stores/share-store.ts +556 -528
- package/src/persistence/usage-flush.ts +61 -1
- package/src/protocol/canonical-model.ts +23 -1
- package/src/protocol/response/chat.ts +143 -10
- package/src/protocol/response/codex.ts +9 -75
- package/src/protocol/response/omp-tool-call-markup.ts +221 -0
- package/src/protocol/tool-identity.ts +43 -9
- package/src/providers/authentication/jwt-validator.ts +130 -187
- package/src/providers/authentication/oauth-flow-store.ts +16 -9
- package/src/providers/default-registry.ts +177 -1
- package/src/providers/discovery/catalog/catalog-format.ts +20 -0
- package/src/providers/discovery/models-dev-catalog.ts +39 -22
- package/src/providers/discovery/openai-model-discovery.ts +39 -3
- package/src/providers/discovery/openrouter-free-roster.ts +98 -0
- package/src/providers/discovery/probe-wire.ts +29 -5
- package/src/providers/discovery/probing-service.ts +1022 -1001
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +42 -2
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +913 -914
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +88 -0
- package/src/providers/integrations/buddy/buddy-conversation-headers.ts +22 -5
- package/src/providers/integrations/buddy/buddy-discovery-shared.ts +33 -1
- package/src/providers/integrations/buddy/buddy-identity.ts +46 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +37 -1
- package/src/providers/integrations/buddy/buddy-usage-store.ts +40 -5
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +4 -0
- package/src/providers/integrations/buddy/codebuddy/provider.ts +180 -175
- package/src/providers/integrations/buddy/codebuddy/shared.ts +115 -73
- package/src/providers/integrations/buddy/workbuddy/cn-provider.ts +5 -2
- package/src/providers/integrations/buddy/workbuddy/provider.ts +206 -204
- package/src/providers/integrations/buddy/workbuddy/quota.ts +172 -159
- package/src/providers/integrations/buddy/workbuddy/shared.ts +200 -171
- package/src/providers/integrations/claude/claude.ts +606 -582
- package/src/providers/integrations/cline/cline-quota.ts +18 -16
- package/src/providers/integrations/cline/cline.ts +539 -468
- package/src/providers/integrations/codex/codex.ts +5 -8
- package/src/providers/integrations/commandcode/commandcode.ts +675 -541
- package/src/providers/integrations/commandcode/discovery.ts +116 -0
- package/src/providers/integrations/commandcode/quota.ts +160 -0
- package/src/providers/integrations/cursor/cursor-auth.ts +418 -0
- package/src/providers/integrations/cursor/cursor-catalog.ts +368 -0
- package/src/providers/integrations/cursor/cursor-http2.ts +300 -0
- package/src/providers/integrations/cursor/cursor-identity.ts +92 -0
- package/src/providers/integrations/cursor/cursor-request.ts +471 -0
- package/src/providers/integrations/cursor/cursor-session-manager.ts +281 -0
- package/src/providers/integrations/cursor/cursor-shared.ts +108 -0
- package/src/providers/integrations/cursor/cursor.ts +960 -0
- package/src/providers/integrations/cursor/protocol/framing.ts +129 -0
- package/src/providers/integrations/cursor/protocol/messages.ts +2355 -0
- package/src/providers/integrations/cursor/protocol/struct.ts +305 -0
- package/src/providers/integrations/factory/factory-oauth.ts +7 -11
- package/src/providers/integrations/github/github.ts +4 -4
- package/src/providers/integrations/hermes.ts +79 -8
- package/src/providers/integrations/kilo/kilo-discovery.ts +10 -1
- package/src/providers/integrations/kilo/kilo.ts +153 -146
- package/src/providers/integrations/opencode/opencode-go-quota.ts +130 -0
- package/src/providers/integrations/opencode/provider.ts +532 -499
- package/src/providers/integrations/openrouter/provider.ts +139 -281
- package/src/providers/integrations/qoder/qoder-catalog.ts +450 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +310 -263
- package/src/providers/integrations/qoder/qoder-realm.ts +106 -0
- package/src/providers/integrations/qoder/qoder-virtual.ts +77 -0
- package/src/providers/integrations/qoder/qoder.ts +865 -730
- package/src/providers/integrations/shared/install-id.ts +29 -2
- package/src/providers/integrations/trae/trae-catalog.ts +190 -0
- package/src/providers/integrations/trae/trae-headers.ts +149 -0
- package/src/providers/integrations/trae/trae-oauth.ts +773 -0
- package/src/providers/integrations/trae/trae-protocol.ts +400 -0
- package/src/providers/integrations/trae/trae-realm.ts +220 -0
- package/src/providers/integrations/trae/trae.ts +458 -0
- package/src/providers/operations/account-health-service.ts +107 -10
- package/src/providers/operations/client-versions.ts +143 -6
- package/src/providers/operations/model-catalog-cache.ts +18 -3
- package/src/providers/operations/provider-catalog-seeder.ts +95 -86
- package/src/providers/operations/provider-catalog-service.ts +76 -0
- package/src/providers/operations/provider-credential-service.ts +46 -7
- package/src/providers/provider-contracts.ts +76 -0
- package/src/providers/provider-metadata.ts +78 -6
- package/src/providers/provider-model-definition.ts +373 -349
- package/src/security/api-key-auth.ts +126 -8
- package/src/transport/contracts.ts +3 -0
- package/src/transport/dispatch/attempt-finalize.ts +39 -2
- package/src/transport/dispatch/attempt-loop.ts +530 -513
- package/src/transport/dispatch/empty-stream.ts +17 -26
- package/src/transport/dispatch/generation.ts +88 -21
- package/src/transport/dispatch/leases.ts +99 -2
- package/src/transport/dispatch/proxy-request.ts +60 -3
- package/src/transport/dispatch/streaming/finalize.ts +16 -1
- package/src/transport/dispatch/streaming/stream.ts +22 -2
- package/src/transport/dispatch/upstream.ts +19 -1
- package/src/transport/failure-policy.ts +20 -0
- package/src/transport/guards/auth-guard.ts +26 -1
- package/src/transport/guards/body-policy.ts +5 -4
- package/src/transport/request/preparer.ts +103 -0
- package/src/transport/request/state.ts +14 -0
- package/src/transport/routing/plan-gate.ts +45 -0
- package/src/transport/routing/route-catalog.ts +799 -738
- package/src/transport/routing/route-model.ts +52 -1
- package/src/transport/routing/router.ts +51 -0
- package/src/transport/surface/chat/encode.ts +18 -31
- package/src/transport/surface/messages/stream.ts +3 -2
- package/src/transport/translation/tool-repair.ts +37 -16
- package/src/workers/account-identity-sweep.ts +14 -12
- package/src/workers/daily-checkin.ts +62 -0
- package/src/workers/quota-refresh-sweep.ts +27 -2
- package/dist/dashboard/assets/BannedPage-DUrXpp-X.js +0 -1
- package/dist/dashboard/assets/CombosPage-B7ETkfVH.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-AisQzCI1.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-BNflDm_f.js +0 -1
- package/dist/dashboard/assets/ModelPicker-CAiPR5Vd.js +0 -1
- package/dist/dashboard/assets/OverviewPage-C3NIzsDx.js +0 -1
- package/dist/dashboard/assets/ProviderDetailPage-BK8i5B5X.js +0 -3
- package/dist/dashboard/assets/ProviderIcon-paOCq8I0.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-CvCVgm1e.js +0 -1
- package/dist/dashboard/assets/ProxyPage-DjabkuzP.js +0 -7
- package/dist/dashboard/assets/QuotaPage-Dxe0B0iu.js +0 -1
- package/dist/dashboard/assets/SetupPage-BaD4P_jW.js +0 -1
- package/dist/dashboard/assets/StudioPage-CLP4le3U.js +0 -31
- package/dist/dashboard/assets/UsagePage-Djes-Epy.js +0 -56
- package/dist/dashboard/assets/api-keys-CjIGQhe7.js +0 -1
- package/dist/dashboard/assets/app-Cjgo4-Lf.css +0 -2
- package/dist/dashboard/assets/assert-Bwh6DJTK.js +0 -1
- package/dist/dashboard/assets/cli-tools-DccaOfhX.js +0 -1
- package/dist/dashboard/assets/clipboard-button-DQmMikNQ.js +0 -1
- package/dist/dashboard/assets/entry-Cpi0rph1.js +0 -4
- package/dist/dashboard/assets/entry-Dm3PpDCO.js +0 -1
- package/dist/dashboard/assets/entry-keNDZ_Wz.js +0 -1
- package/dist/dashboard/assets/github-badge-BuAJr8oU.js +0 -1
- package/dist/dashboard/assets/model-bans-CVvHZ-qz.js +0 -1
- package/dist/dashboard/assets/mutation-BIizFZav.js +0 -1
- package/dist/dashboard/assets/privacy-mode-CQjbZ3xk.js +0 -1
- package/dist/dashboard/assets/routing-jntw9-Ui.js +0 -1
- package/dist/dashboard/assets/select-CGUuTQmj.js +0 -41
- package/dist/dashboard/assets/settings-BAS6QbmJ.js +0 -1
- package/dist/dashboard/assets/sliders-horizontal-ClG7dBeJ.js +0 -1
- package/dist/dashboard/assets/terminal-C9mZ4Ugm.js +0 -1
- package/dist/dashboard/assets/toast-DKAdP2mo.js +0 -2
- package/scripts/cli/cli.ts +0 -771
- package/scripts/operations/probe-egress.ts +0 -335
- package/scripts/operations/restart.ts +0 -120
- package/scripts/shared/env.ts +0 -269
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.ico +0 -0
- /package/{tray-assets → scripts/cli/tray/assets}/cartethyia.png +0 -0
- /package/scripts/cli/{menu.ts → ui/prompt.ts} +0 -0
- /package/scripts/cli/{wordmark.ts → ui/wordmark.ts} +0 -0
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
2
|
+
import { consoleLockouts, consoleUsers } from "../../persistence/schema";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Clears console lockouts and accounts atomically so a reset can be followed
|
|
6
|
+
* immediately by first-boot setup from the same client address.
|
|
7
|
+
*/
|
|
8
|
+
export function resetConsoleAuthState(db: CartethyiaDatabase): Promise<number> {
|
|
9
|
+
return db.transaction(async (tx) => {
|
|
10
|
+
await tx.delete(consoleLockouts);
|
|
11
|
+
const users = await tx.delete(consoleUsers);
|
|
12
|
+
return users.rowCount ?? 0;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
* `/console/api/auth/change-password` requires the current password, and
|
|
6
6
|
* first-boot setup only runs when no console user exists. The only documented
|
|
7
7
|
* escape was deleting the database by hand. This endpoint removes every console
|
|
8
|
-
* user, which puts `requiresSetup()` back to true so the
|
|
9
|
-
* `/console` runs the create-an-account wizard again
|
|
8
|
+
* user and login lockouts, which puts `requiresSetup()` back to true so the
|
|
9
|
+
* next visit to `/console` runs the create-an-account wizard again without
|
|
10
|
+
* inheriting a stale failure lock.
|
|
10
11
|
*
|
|
11
12
|
* What it does not touch: providers, provider accounts, API keys, routing,
|
|
12
13
|
* combos, aliases, usage, and telemetry. Those are not authentication state and
|
|
@@ -15,7 +15,6 @@ import { hashSecret, encryptCredential } from "../../security/crypto";
|
|
|
15
15
|
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
16
16
|
import {
|
|
17
17
|
DEFAULT_API_KEY_LABEL,
|
|
18
|
-
DEFAULT_API_KEY_PREFIX,
|
|
19
18
|
generateApiKeySecret,
|
|
20
19
|
} from "../api-keys/contracts";
|
|
21
20
|
import { resolveDefaultGatewayApiKey } from "../../config/runtime";
|
|
@@ -132,7 +131,8 @@ export class FirstBootSetupService {
|
|
|
132
131
|
// encryption key, so an install that never touched the variable still
|
|
133
132
|
// boots with a usable key instead of failing later with
|
|
134
133
|
// "the default gateway API key is missing".
|
|
135
|
-
const
|
|
134
|
+
const generated = generateApiKeySecret();
|
|
135
|
+
const secret = defaultApiKey ?? generated.secret;
|
|
136
136
|
const keyHash = hashSecret(secret);
|
|
137
137
|
const existingApiKey = await db
|
|
138
138
|
.select({ id: apiKeys.id })
|
|
@@ -146,7 +146,10 @@ export class FirstBootSetupService {
|
|
|
146
146
|
keyHash,
|
|
147
147
|
label: DEFAULT_API_KEY_LABEL,
|
|
148
148
|
scopes: TENANT_KEY_SCOPES,
|
|
149
|
-
|
|
149
|
+
// The generated prefix, not a slice of the secret: a slice assumed a
|
|
150
|
+
// fixed-width prefix, so a longer one would store a truncated value
|
|
151
|
+
// that no longer matches the key the operator was shown.
|
|
152
|
+
keyPrefix: defaultApiKey === undefined ? generated.prefix : secret.slice(0, 3),
|
|
150
153
|
keyEncrypted: encryptCredential(secret),
|
|
151
154
|
requestsPerMinute: 240,
|
|
152
155
|
isDefault: true,
|
|
@@ -18,6 +18,7 @@ import { Elysia, t } from "elysia";
|
|
|
18
18
|
import type { ConsoleAccessResolver } from "../auth/access";
|
|
19
19
|
import { invalidateApiKeyCache } from "../../security/api-key-auth";
|
|
20
20
|
import { ConsoleDomainError, errorResponse, requireAnyScope } from "../shared/errors";
|
|
21
|
+
import { NO_COMPRESS_HEADER } from "../response-compression";
|
|
21
22
|
import { MAX_BACKUP_BYTES } from "./contracts";
|
|
22
23
|
import type { BackupSection } from "./contracts";
|
|
23
24
|
import { DELETE_ALL_SCOPES, compressBackup } from "./store";
|
|
@@ -124,6 +125,13 @@ export function createBackupRoutes(config: BackupRoutesConfig): Elysia {
|
|
|
124
125
|
}
|
|
125
126
|
const bytes = compressBackup(payload);
|
|
126
127
|
set.headers["content-type"] = "application/json; charset=utf-8";
|
|
128
|
+
// Opt out of the response wrapper's gzip rather than declaring
|
|
129
|
+
// `content-encoding: gzip`: the bytes here are base64 of a gzip
|
|
130
|
+
// stream, and a client told "this is gzip" tries to inflate the
|
|
131
|
+
// base64 text and fails. The payload inside is already compressed,
|
|
132
|
+
// and a second pass over base64 would find nothing to gain while
|
|
133
|
+
// paying a synchronous `gzipSync` over the whole multi-MB body.
|
|
134
|
+
set.headers[NO_COMPRESS_HEADER] = "1";
|
|
127
135
|
return { compressed: true, filename: `cartethyia_backup_${stamp}.json.gz`, bytes: bytes.toString("base64") };
|
|
128
136
|
} catch (error) {
|
|
129
137
|
return errorResponse(error, set, "Backup export failed");
|
|
@@ -486,9 +486,9 @@ export const TOOL_REGISTRY = {
|
|
|
486
486
|
roleKind: "primary",
|
|
487
487
|
},
|
|
488
488
|
{
|
|
489
|
-
id: "gpt-5.
|
|
490
|
-
name: "GPT-5.
|
|
491
|
-
alias: "gpt-5.
|
|
489
|
+
id: "gpt-5.6-sol",
|
|
490
|
+
name: "GPT-5.6 Sol",
|
|
491
|
+
alias: "gpt-5.6-sol",
|
|
492
492
|
roleLabel: "Fallback Agent",
|
|
493
493
|
roleKind: "secondary",
|
|
494
494
|
},
|
|
@@ -505,7 +505,7 @@ export const TOOL_REGISTRY = {
|
|
|
505
505
|
settingsFile: "~/.factory/settings.json",
|
|
506
506
|
defaultModels: [
|
|
507
507
|
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
508
|
-
{ id: "gpt-5.
|
|
508
|
+
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
509
509
|
],
|
|
510
510
|
},
|
|
511
511
|
|
|
@@ -540,7 +540,7 @@ export const TOOL_REGISTRY = {
|
|
|
540
540
|
surface: "chat" as const,
|
|
541
541
|
settingsFile: "Code/User/chatLanguageModels.json",
|
|
542
542
|
defaultModels: [
|
|
543
|
-
{ id: "gpt-5.
|
|
543
|
+
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
544
544
|
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
545
545
|
],
|
|
546
546
|
},
|
|
@@ -703,7 +703,7 @@ amp --model "{{model}}"`,
|
|
|
703
703
|
docsUrl: "https://qwenlm.github.io/qwen-code-docs/en/users/configuration/model-providers/",
|
|
704
704
|
defaultModels: [
|
|
705
705
|
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
706
|
-
{ id: "gpt-5.
|
|
706
|
+
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
707
707
|
],
|
|
708
708
|
notes: [
|
|
709
709
|
{
|
|
@@ -209,9 +209,11 @@ export function createConsoleRouter(deps: ConsoleApiCompositionDeps): Elysia {
|
|
|
209
209
|
// nothing to compress and no size to judge. `wrap` sits outside the router
|
|
210
210
|
// and sees the finished `Response`, which is what this needs.
|
|
211
211
|
//
|
|
212
|
-
// Scoped
|
|
213
|
-
//
|
|
214
|
-
//
|
|
212
|
+
// Scoped by path *inside* `gzipResponse`, not by this instance: Elysia's
|
|
213
|
+
// `use()` merges a child's `hoc` into the root app's ext, so this wrap is
|
|
214
|
+
// reached by `/v1/*` as well. The allowlist is `/console/api/` + `/metrics`.
|
|
215
|
+
// `/v1/*` is deliberately excluded, because a streaming completion must not
|
|
216
|
+
// be buffered and proxied bodies are the provider's own bytes. See
|
|
215
217
|
// `response-compression.ts` for the full reasoning and the measured win.
|
|
216
218
|
console.wrap(
|
|
217
219
|
(fetch) => (request: Request, ...rest: unknown[]) =>
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
X_FRAME_OPTIONS,
|
|
5
5
|
dashboardContentSecurityPolicy,
|
|
6
6
|
} from "../security/outbound-headers";
|
|
7
|
+
import { acceptsGzip } from "./response-compression";
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* Represents the result of serving a static file.
|
|
@@ -148,9 +149,39 @@ function entryDocumentFor(pathname: string, entries: Readonly<Record<string, str
|
|
|
148
149
|
* - Serves hashed assets with immutable cache headers and documents with no-cache
|
|
149
150
|
* - Returns 404 for missing asset-like files
|
|
150
151
|
*/
|
|
152
|
+
/**
|
|
153
|
+
* The `.gz` sibling of an asset, when one exists and the client offered gzip.
|
|
154
|
+
*
|
|
155
|
+
* Restricted to hashed assets — see the check below for why — and best-effort:
|
|
156
|
+
* a build that emitted no `.gz` simply serves the plain file.
|
|
157
|
+
*/
|
|
158
|
+
async function readPrecompressed(
|
|
159
|
+
fullPath: string,
|
|
160
|
+
acceptEncoding: string | undefined | null,
|
|
161
|
+
): Promise<Uint8Array | undefined> {
|
|
162
|
+
if (acceptEncoding === undefined || acceptEncoding === null) return undefined;
|
|
163
|
+
if (!acceptsGzip(acceptEncoding)) return undefined;
|
|
164
|
+
// Only hashed assets: those are the immutable ones, and they are what the
|
|
165
|
+
// Vite build precompresses. An unhashed asset is served with a revalidating
|
|
166
|
+
// cache header precisely because it may be replaced in place, and a `.gz`
|
|
167
|
+
// left beside a file that was swapped afterwards would not match it.
|
|
168
|
+
if (!hasHashInFilename(fullPath)) return undefined;
|
|
169
|
+
const file = Bun.file(`${fullPath}.gz`);
|
|
170
|
+
if (!(await file.exists())) return undefined;
|
|
171
|
+
return await file.bytes();
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Builds the static handler.
|
|
176
|
+
*
|
|
177
|
+
* The returned function takes an optional `acceptEncoding` so the caller can
|
|
178
|
+
* pass the request's header: a precompressed `.gz` sibling is only usable when
|
|
179
|
+
* the client asking for it offered gzip. Omitting it serves the plain file,
|
|
180
|
+
* which is what the tests and any non-HTTP caller want.
|
|
181
|
+
*/
|
|
151
182
|
export function createStaticHandler(
|
|
152
183
|
config: StaticHandlerConfig,
|
|
153
|
-
): (pathname: string) => Promise<StaticServeResult> {
|
|
184
|
+
): (pathname: string, acceptEncoding?: string | null) => Promise<StaticServeResult> {
|
|
154
185
|
const buildDirResolved = resolve(config.buildDir);
|
|
155
186
|
const buildDirNorm = normalizePathSeparators(buildDirResolved);
|
|
156
187
|
const entries = config.entries ?? DEFAULT_ENTRY_DOCUMENTS;
|
|
@@ -173,7 +204,10 @@ export function createStaticHandler(
|
|
|
173
204
|
};
|
|
174
205
|
};
|
|
175
206
|
|
|
176
|
-
const serve = async (
|
|
207
|
+
const serve = async (
|
|
208
|
+
pathname: string,
|
|
209
|
+
acceptEncoding?: string | null,
|
|
210
|
+
): Promise<StaticServeResult> => {
|
|
177
211
|
// Reject the reserved `/console/api` namespace, including its bare prefix.
|
|
178
212
|
if (pathname === "/console/api" || pathname.startsWith("/console/api/")) {
|
|
179
213
|
return {
|
|
@@ -241,6 +275,28 @@ export function createStaticHandler(
|
|
|
241
275
|
cacheControl = "public, max-age=3600";
|
|
242
276
|
}
|
|
243
277
|
|
|
278
|
+
// A precompressed sibling is served when the client asked for gzip
|
|
279
|
+
// and the build emitted one. The bytes were compressed at build time
|
|
280
|
+
// (level 9), so this is a disk read rather than a per-request
|
|
281
|
+
// compress — and a build with no `.gz` falls through to the plain
|
|
282
|
+
// file, which is why there is no error path here.
|
|
283
|
+
const precompressed = await readPrecompressed(fullPath, acceptEncoding);
|
|
284
|
+
if (precompressed !== undefined) {
|
|
285
|
+
return {
|
|
286
|
+
status: 200,
|
|
287
|
+
body: precompressed,
|
|
288
|
+
headers: {
|
|
289
|
+
"content-type": mimeType,
|
|
290
|
+
"cache-control": cacheControl,
|
|
291
|
+
"content-encoding": "gzip",
|
|
292
|
+
// Without this a shared cache would hand the gzipped bytes to a
|
|
293
|
+
// client that never offered gzip: the URL is identical either
|
|
294
|
+
// way, so `accept-encoding` is the only thing that differs.
|
|
295
|
+
vary: "accept-encoding",
|
|
296
|
+
},
|
|
297
|
+
};
|
|
298
|
+
}
|
|
299
|
+
|
|
244
300
|
return {
|
|
245
301
|
status: 200,
|
|
246
302
|
body: data,
|
|
@@ -260,8 +316,8 @@ export function createStaticHandler(
|
|
|
260
316
|
return { status: 404, body: undefined, headers: {} };
|
|
261
317
|
};
|
|
262
318
|
|
|
263
|
-
return async (pathname: string): Promise<StaticServeResult> =>
|
|
264
|
-
applyStaticSecurityHeaders(await serve(pathname));
|
|
319
|
+
return async (pathname: string, acceptEncoding?: string | null): Promise<StaticServeResult> =>
|
|
320
|
+
applyStaticSecurityHeaders(await serve(pathname, acceptEncoding));
|
|
265
321
|
}
|
|
266
322
|
|
|
267
323
|
/**
|
|
@@ -328,13 +384,27 @@ function getMimeType(filePath: string): string {
|
|
|
328
384
|
}
|
|
329
385
|
|
|
330
386
|
/**
|
|
331
|
-
*
|
|
332
|
-
*
|
|
387
|
+
* True when a filename carries a build hash, so its bytes are immutable.
|
|
388
|
+
*
|
|
389
|
+
* Matched on the two separator forms a bundler actually emits — `app.a1b2c3d4.js`
|
|
390
|
+
* and the modern Vite spelling `app-BCnqn3N3.js` — plus `_`, and then required
|
|
391
|
+
* to *look generated*: the segment must contain a digit or mix upper and lower
|
|
392
|
+
* case. The second half is what keeps a plain word out of the set, since
|
|
393
|
+
* `console-backgrounds.jpg` and `openai-light.svg` both match the separator
|
|
394
|
+
* alone and are emphatically not immutable.
|
|
395
|
+
*
|
|
396
|
+
* Getting this wrong in either direction costs real money: a hashed asset
|
|
397
|
+
* served with a revalidating header is re-downloaded after every deploy, and an
|
|
398
|
+
* unhashed one served `immutable` is pinned in the browser cache until it
|
|
399
|
+
* expires. Measured against a real build, this matches 198 of 288 files — all
|
|
400
|
+
* of them hashed bundles — and rejects every icon, photo, and document.
|
|
333
401
|
*/
|
|
334
402
|
function hasHashInFilename(filePath: string): boolean {
|
|
335
|
-
const filename = filePath.split(/[/\\]/).pop()
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
const
|
|
339
|
-
|
|
403
|
+
const filename = filePath.split(/[/\\]/).pop() ?? "";
|
|
404
|
+
const match = /[._-]([A-Za-z0-9_-]{8,})\./.exec(filename);
|
|
405
|
+
if (match === null) return false;
|
|
406
|
+
const segment = match[1] ?? "";
|
|
407
|
+
const hasDigit = /[0-9]/.test(segment);
|
|
408
|
+
const hasMixedCase = /[a-z]/.test(segment) && /[A-Z]/.test(segment);
|
|
409
|
+
return hasDigit || hasMixedCase;
|
|
340
410
|
}
|
|
@@ -180,6 +180,7 @@ export function registerConsoleDomains(
|
|
|
180
180
|
if (slot) {
|
|
181
181
|
return {
|
|
182
182
|
fetch: ctx.networkBindingFactory.fetch(slot.poolId, tenantId),
|
|
183
|
+
http2Bidi: ctx.networkBindingFactory.http2Bidi(slot.poolId, tenantId),
|
|
183
184
|
networkPoolId: slot.poolId,
|
|
184
185
|
release: slot.release,
|
|
185
186
|
};
|
|
@@ -195,7 +196,10 @@ export function registerConsoleDomains(
|
|
|
195
196
|
}
|
|
196
197
|
}
|
|
197
198
|
|
|
198
|
-
return {
|
|
199
|
+
return {
|
|
200
|
+
fetch: ctx.networkBindingFactory.fetch(undefined, tenantId),
|
|
201
|
+
http2Bidi: ctx.networkBindingFactory.http2Bidi(undefined, tenantId),
|
|
202
|
+
};
|
|
199
203
|
},
|
|
200
204
|
snapshotInvalidator: ctx.routeSnapshotService,
|
|
201
205
|
readAccountInflight: async (providerId, tenantId) =>
|
|
@@ -219,7 +223,10 @@ export function registerConsoleDomains(
|
|
|
219
223
|
}));
|
|
220
224
|
console.use(createLogRoutes({ accessResolver: ctx.accessResolver, auditSink: ctx.auditRecorder }));
|
|
221
225
|
console.use(createPerformanceRoutes({ accessResolver: ctx.accessResolver }));
|
|
222
|
-
console.use(createUpdateRoutes(
|
|
226
|
+
console.use(createUpdateRoutes({
|
|
227
|
+
accessResolver: ctx.accessResolver,
|
|
228
|
+
observabilityStore,
|
|
229
|
+
}));
|
|
223
230
|
console.use(createAuditRoutes({ store: auditReadStore, accessResolver: ctx.accessResolver }));
|
|
224
231
|
if (ctx.modelStrikes) {
|
|
225
232
|
console.use(createModelAbuseRoutes({
|