cartethyia 2.7.4 → 2.7.5
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 +2 -0
- package/README.md +17 -5
- package/dist/dashboard/assets/{BannedPage-ChG5svFb.js → BannedPage-Cj15GsMp.js} +1 -1
- package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +1 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolDetailPage-BIcWQun7.js → CliToolDetailPage-DZKmVuJN.js} +1 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
- package/dist/dashboard/assets/{CliToolsPage-Bf2VelDe.js → CliToolsPage-BIccZmeL.js} +1 -1
- package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +1 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-ggeMSjte.js → CustomizationPage-BKj_r0rp.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js +656 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
- package/dist/dashboard/assets/{LoginPage-U6AKaJcF.js → LoginPage-DkXb6dx-.js} +1 -1
- package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-DnQPSIA8.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +1 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +5 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-5SnUSy3j.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +1 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js +1 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
- package/dist/dashboard/assets/{SetupPage-f0DE1h0-.js → SetupPage-WTa0sktC.js} +1 -1
- package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-BfAb5-o_.js} +3 -3
- package/dist/dashboard/assets/StudioPage-BfAb5-o_.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js +56 -0
- package/dist/dashboard/assets/UsagePage-BNzeZ2Vk.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js +1 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
- package/dist/dashboard/assets/app--PJWq8_C.css +2 -0
- package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
- package/dist/dashboard/assets/assert-C0K-c4eo.js +1 -0
- package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-DfbhQU4k.js} +1 -1
- package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DympBNq4.js → banner-BllT4LcF.js} +1 -1
- package/dist/dashboard/assets/banner-BllT4LcF.js.gz +0 -0
- package/dist/dashboard/assets/brand/login_register.jpg +0 -0
- package/dist/dashboard/assets/brand/login_register_initial.jpg +0 -0
- package/dist/dashboard/assets/brand/og_bansos.jpg +0 -0
- package/dist/dashboard/assets/brand/og_image.jpg +0 -0
- package/dist/dashboard/assets/{card-ibRWU_uT.js → card-CtkX66Wd.js} +1 -1
- package/dist/dashboard/assets/card-CtkX66Wd.js.gz +0 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js +1 -0
- package/dist/dashboard/assets/chevron-left-Bf6CaTSJ.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js +1 -0
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-BQqBQd2n.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
- package/dist/dashboard/assets/{dialog-8fiE6tec.js → dialog-BEK7KP0H.js} +1 -1
- package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-BrTEZ8zu.js} +1 -1
- package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js +1 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
- package/dist/dashboard/assets/{entry-BSAsYsmV.js → entry-EBHJ3DrE.js} +1 -1
- package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js +4 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-BAACA727.js} +1 -1
- package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
- package/dist/dashboard/assets/{github-badge-CPK47xQx.js → github-badge-YSCE4UC2.js} +1 -1
- package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
- package/dist/dashboard/assets/{index-DBNPOfhV.js → index-FQlj0HUT.js} +2 -2
- package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-C4gU5iOL.js} +1 -1
- package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
- package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BHHX_Tmm.js} +1 -1
- package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-CajrYUnD.js} +1 -1
- package/dist/dashboard/assets/layout-CajrYUnD.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Bx2I7XUe.js} +1 -1
- package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js +1 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js +1 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js +2 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js +1 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.js.gz +0 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js +1 -0
- package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
- package/dist/dashboard/assets/routing-in0f_IfK.js +1 -0
- package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
- package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BLULNqTp.js} +1 -1
- package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js +1 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js.gz +0 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js +1 -0
- package/dist/dashboard/assets/shield-BMQNxORh.js.gz +0 -0
- package/dist/dashboard/assets/{stack-DfgnFDWY.js → stack-D2lIR0tg.js} +1 -1
- package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
- package/dist/dashboard/assets/{state-CkfdYWel.js → state-DTARjfiW.js} +1 -1
- package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
- package/dist/dashboard/assets/{switch-SYm237HG.js → switch-c0oPSnqW.js} +1 -1
- package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-m8WGNPrz.js} +1 -1
- package/dist/dashboard/assets/useMutation-m8WGNPrz.js.gz +0 -0
- package/dist/dashboard/console-backgrounds.jpg +0 -0
- package/dist/dashboard/console-backgrounds_initial.jpg +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +56 -55
- package/migrations/full-postgres/0036_system_prompt_presets_refs.sql +10 -0
- package/migrations/full-postgres/0037_share_concurrency_scope.sql +3 -0
- package/migrations/full-postgres/0038_add_accounts_quota_snapshot.sql +7 -0
- package/migrations/full-postgres/0039_add_telemetry_provider_model_indexes.sql +13 -0
- package/migrations/full-postgres/0040_add_models_dialect.sql +3 -0
- package/migrations/full-postgres/0041_add_daily_checkin_ledger_account_fk.sql +7 -0
- package/migrations/lite-sqlite3/0036_system_prompt_presets_refs.sql +14 -0
- package/migrations/lite-sqlite3/0037_share_concurrency_scope.sql +3 -0
- package/migrations/lite-sqlite3/0038_add_accounts_quota_snapshot.sql +4 -0
- package/migrations/lite-sqlite3/0039_add_telemetry_provider_model_indexes.sql +6 -0
- package/migrations/lite-sqlite3/0040_add_models_dialect.sql +3 -0
- package/migrations/lite-sqlite3/0041_add_daily_checkin_ledger_account_fk.sql +26 -0
- package/package.json +4 -6
- package/scripts/cli/update.ts +15 -41
- package/src/boot/app.ts +58 -2
- package/src/boot/dependencies.ts +786 -732
- package/src/boot/lifecycle.ts +11 -12
- package/src/config/cooldowns.ts +34 -55
- package/src/config/network.ts +1 -1
- package/src/config/package-paths.ts +1 -1
- package/src/config/providers.ts +13 -14
- package/src/config/resources.ts +0 -5
- package/src/config/runtime.ts +2 -5
- package/src/config/spec.ts +26 -6
- package/src/console/api-keys/ban-constants.ts +38 -0
- package/src/console/api-keys/contracts.ts +71 -62
- package/src/console/api-keys/routes.ts +48 -12
- package/src/console/auth/access.ts +4 -4
- package/src/console/auth/account-reset.ts +1 -1
- package/src/console/auth/audit-recorder.ts +1 -1
- package/src/console/auth/lockout.ts +7 -3
- package/src/console/auth/row-coercion.ts +57 -12
- package/src/console/auth/session-resolver.ts +1 -1
- package/src/console/auth/session-service.ts +8 -2
- package/src/console/auth/session.ts +37 -31
- package/src/console/auth/setup-service.ts +4 -3
- package/src/console/auth/user-store.ts +1 -1
- package/src/console/backup/9router-map.ts +0 -3
- package/src/console/backup/contracts.ts +9 -9
- package/src/console/backup/export-endpoint.ts +5 -6
- package/src/console/backup/nine-router.ts +1 -7
- package/src/console/backup/routes.ts +29 -33
- package/src/console/backup/service.ts +468 -468
- package/src/console/backup/store.ts +47 -29
- package/src/console/backup/validate.ts +11 -1
- package/src/console/cli-tools/contracts.ts +7 -7
- package/src/console/cli-tools/injectors/cline.ts +110 -110
- package/src/console/cli-tools/injectors/codex.ts +181 -181
- package/src/console/cli-tools/injectors/copilot.ts +108 -108
- package/src/console/cli-tools/injectors/driver.ts +247 -247
- package/src/console/cli-tools/injectors/jcode.ts +115 -115
- package/src/console/cli-tools/injectors/openclaw.ts +161 -161
- package/src/console/cli-tools/injectors/opencode.ts +153 -153
- package/src/console/cli-tools/routes.ts +1 -1
- package/src/console/cli-tools/service.ts +1 -1
- package/src/console/cli-tools/store.ts +2 -2
- package/src/console/console-router.ts +32 -0
- package/src/console/dashboard-assets.ts +9 -9
- package/src/console/domain-registration.ts +16 -2
- package/src/console/inferhub/client.ts +0 -7
- package/src/console/inferhub/key-store.ts +1 -1
- package/src/console/inferhub/normalize.ts +2 -2
- package/src/console/inferhub/routes.ts +1 -1
- package/src/console/inferhub/types.ts +1 -1
- package/src/console/observability/contracts.ts +1 -1
- package/src/console/observability/live.ts +31 -18
- package/src/console/observability/logs.ts +1 -1
- package/src/console/observability/sse.ts +62 -8
- package/src/console/observability/store.ts +20 -4
- package/src/console/providers/catalog/catalog-projections.ts +1 -1
- package/src/console/providers/catalog/contracts.ts +39 -0
- package/src/console/providers/catalog/model-operations.ts +1 -1
- package/src/console/providers/catalog/provider-operations.ts +95 -17
- package/src/console/providers/catalog/public-model-store.ts +0 -0
- package/src/console/providers/catalog/routes.ts +27 -3
- package/src/console/providers/catalog/store.ts +147 -8
- package/src/console/providers/detail/routes.ts +1 -1
- package/src/console/providers/oauth/callback-listener.ts +100 -18
- package/src/console/providers/oauth/routes.ts +92 -13
- package/src/console/quota/account-quota-global.ts +41 -3
- package/src/console/quota/account-quota-shared.ts +10 -3
- package/src/console/quota/account-quota-tenant.ts +259 -66
- package/src/console/quota/daily-growth-job.ts +308 -0
- package/src/console/quota/native-identity.ts +2 -2
- package/src/console/quota/quota-view.ts +1 -1
- package/src/console/remote-support/routes.ts +1 -1
- package/src/console/remote-support/service.ts +2 -2
- package/src/console/routing/model/contracts.ts +1 -1
- package/src/console/routing/pools/contracts.ts +2 -2
- package/src/console/routing/pools/import-parse.ts +3 -3
- package/src/console/routing/pools/relay-deploy.ts +3 -3
- package/src/console/settings/contracts.ts +29 -2
- package/src/console/settings/store.ts +20 -0
- package/src/console/share/share-router.ts +100 -32
- package/src/console/share/share-stats.ts +4 -4
- package/src/console/share/share-usage.ts +1 -1
- package/src/console/shared/errors.ts +2 -2
- package/src/console/shared/object.ts +18 -0
- package/src/console/shared/read-through-cache.ts +4 -4
- package/src/console/shared/transaction.ts +14 -0
- package/src/console/system-prompt/contracts.ts +89 -12
- package/src/console/system-prompt/routes.ts +98 -45
- package/src/console/updates/apply-update.ts +244 -0
- package/src/console/updates/routes.ts +252 -97
- package/src/main.ts +11 -5
- package/src/network/http2-bidi.ts +1 -1
- package/src/network/ip-utils.ts +298 -0
- package/src/network/outbound-fetch.ts +1 -1
- package/src/network/pool/agent.ts +7 -6
- package/src/network/pool/byte-accounting.ts +1 -1
- package/src/network/pool/resolver.ts +16 -12
- package/src/network/pool/selector.ts +150 -136
- package/src/network/pool-health-machine.ts +1 -1
- package/src/network/rate-limit-verdict.ts +1 -1
- package/src/network/retry.ts +1 -1
- package/src/network/ssrf.ts +20 -71
- package/src/observability/event-log.ts +2 -2
- package/src/observability/event-query.ts +59 -291
- package/src/observability/log-sanitize.ts +1 -1
- package/src/observability/metrics.ts +4 -4
- package/src/observability/payload-capture.ts +6 -5
- package/src/observability/payload-store.ts +1 -1
- package/src/observability/runtime-metrics.ts +1 -1
- package/src/observability/telemetry-buffer.ts +12 -3
- package/src/observability/telemetry-reconciliation.ts +3 -3
- package/src/observability/token-speed.ts +1 -1
- package/src/persistence/connection-url.ts +1 -1
- package/src/persistence/db-handle.ts +1 -1
- package/src/persistence/db-pg.ts +2 -2
- package/src/persistence/db-sqlite.ts +3 -3
- package/src/persistence/dialect.ts +5 -1
- package/src/persistence/readiness.ts +1 -1
- package/src/persistence/redis.ts +1 -1
- package/src/persistence/schema.ts +113 -40
- package/src/persistence/shared-cache.ts +2 -2
- package/src/persistence/sort-order.ts +1 -1
- package/src/persistence/stores/api-key-store.ts +10 -1
- package/src/persistence/stores/share-store.ts +20 -8
- package/src/persistence/system-prompt-store.ts +63 -18
- package/src/persistence/tenant-preferences.ts +1 -1
- package/src/persistence/ttl-cache.ts +3 -3
- package/src/persistence/usage-flush.ts +7 -2
- package/src/protocol/canonical-model.ts +1 -1
- package/src/protocol/codecs.ts +6 -10
- package/src/protocol/dsml.ts +3 -49
- package/src/protocol/image-clamp.ts +2 -2
- package/src/protocol/reasoning-text.ts +1 -1
- package/src/protocol/reasoning.ts +7 -52
- package/src/protocol/registry.ts +50 -15
- package/src/protocol/request/chat.ts +46 -19
- package/src/protocol/request/codex.ts +1 -1
- package/src/protocol/request/messages.ts +46 -14
- package/src/protocol/request/responses.ts +19 -10
- package/src/protocol/response/chat.ts +25 -10
- package/src/protocol/response/codex.ts +1 -1
- package/src/protocol/response/messages.ts +1 -1
- package/src/protocol/response/omp-tool-call-markup.ts +1 -1
- package/src/protocol/response/responses.ts +1 -1
- package/src/protocol/sse-decoder.ts +50 -1
- package/src/protocol/stop-reason.ts +2 -2
- package/src/protocol/think-split.ts +347 -0
- package/src/protocol/translation/attachment-integrity.ts +3 -3
- package/src/protocol/translation/cache-controls.ts +8 -20
- package/src/protocol/translation/capabilities.ts +6 -6
- package/src/protocol/translation/dialect/deepseek.ts +10 -0
- package/src/protocol/translation/dialect/inband.ts +39 -0
- package/src/protocol/translation/dialect/model-thinking.ts +89 -0
- package/src/protocol/translation/dialect/qwen.ts +114 -0
- package/src/protocol/translation/dialect/resolver.ts +83 -0
- package/src/protocol/translation/dialect/rules.ts +93 -0
- package/src/protocol/translation/dialect/thinking-ladder.ts +245 -0
- package/src/protocol/translation/dialect/types.ts +58 -0
- package/src/protocol/translation/quirks.ts +18 -4
- package/src/protocol/translation/thinking.ts +12 -252
- package/src/protocol/translation/tool-id.ts +3 -3
- package/src/protocol/translation/tool-repair.ts +1 -1
- package/src/protocol/upstream/post-json.ts +6 -1
- package/src/providers/adapters/compatible-adapter.ts +42 -3
- package/src/providers/authentication/jwt-validator.ts +0 -5
- package/src/providers/authentication/oauth-client.ts +254 -253
- package/src/providers/authentication/oauth-flow-store.ts +42 -7
- package/src/providers/bundled-discovery-providers.ts +6 -30
- package/src/providers/configured-openai-providers.ts +82 -97
- package/src/providers/default-registry.ts +23 -35
- package/src/providers/discovery/catalog/catalog-format.ts +13 -2
- package/src/providers/discovery/discovery-types.ts +0 -1
- package/src/providers/discovery/openai-model-discovery.ts +2 -2
- package/src/providers/discovery/probe-phases.ts +48 -13
- package/src/providers/discovery/probing-service.ts +6 -8
- package/src/providers/integrations/agentrouter/agentrouter.ts +12 -2
- package/src/providers/integrations/antigravity/antigravity-oauth.ts +0 -1
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +0 -14
- package/src/providers/integrations/antigravity/antigravity.ts +2 -2
- package/src/providers/integrations/buddy/buddy-catalog-shared.ts +1 -1
- package/src/providers/integrations/buddy/buddy-chat-shared.ts +20 -4
- package/src/providers/integrations/buddy/buddy-cli-headers.ts +19 -52
- package/src/providers/integrations/buddy/buddy-identity.ts +86 -0
- package/src/providers/integrations/buddy/buddy-oauth-shared.ts +1 -1
- package/src/providers/integrations/buddy/codebuddy/cn-provider.ts +1 -2
- package/src/providers/integrations/buddy/codebuddy/provider.ts +4 -15
- package/src/providers/integrations/buddy/codebuddy/shared.ts +30 -9
- package/src/providers/integrations/buddy/workbuddy/provider.ts +5 -9
- package/src/providers/integrations/buddy/workbuddy/shared.ts +21 -3
- package/src/providers/integrations/claude/claude-cch.ts +148 -148
- package/src/providers/integrations/claude/fallback-credit.ts +3 -7
- package/src/providers/integrations/cline/cline.ts +1 -1
- package/src/providers/integrations/codex/codex-device-code.ts +101 -101
- package/src/providers/integrations/codex/codex-oauth.ts +0 -1
- package/src/providers/integrations/commandcode/commandcode.ts +75 -115
- package/src/providers/integrations/commandcode/quota.ts +131 -51
- package/src/providers/integrations/cursor/cursor-http2.ts +0 -3
- package/src/providers/integrations/cursor/cursor-quota.ts +2 -6
- package/src/providers/integrations/cursor/cursor-request.ts +0 -87
- package/src/providers/integrations/cursor/cursor-shared.ts +0 -4
- package/src/providers/integrations/cursor/cursor.ts +38 -5
- package/src/providers/integrations/cursor/protocol/framing.ts +0 -56
- package/src/providers/integrations/cursor/protocol/messages.ts +0 -96
- package/src/providers/integrations/factory/factory.ts +9 -9
- package/src/providers/integrations/github/github-discovery.ts +55 -10
- package/src/providers/integrations/github/github-oauth.ts +6 -5
- package/src/providers/integrations/github/github.ts +41 -14
- package/src/providers/integrations/grok/grok-oauth.ts +261 -261
- package/src/providers/integrations/grok/grok-quota-frame.ts +1 -1
- package/src/providers/integrations/grok/grok-quota.ts +16 -7
- package/src/providers/integrations/grok/grok-ratelimit-store.ts +0 -5
- package/src/providers/integrations/grok/grok-ratelimit.ts +3 -0
- package/src/providers/integrations/grok/grok.ts +86 -36
- package/src/providers/integrations/kilo/kilo-oauth.ts +1 -1
- package/src/providers/integrations/kiro/kiro-cache.ts +31 -0
- package/src/providers/integrations/kiro/kiro-catalog.ts +31 -5
- package/src/providers/integrations/kiro/kiro-discovery.ts +47 -43
- package/src/providers/integrations/kiro/kiro-machine-id.ts +6 -3
- package/src/providers/integrations/kiro/kiro-oauth.ts +523 -255
- package/src/providers/integrations/kiro/kiro-quota.ts +35 -47
- package/src/providers/integrations/kiro/kiro-request.ts +8 -11
- package/src/providers/integrations/kiro/kiro-stream.ts +13 -0
- package/src/providers/integrations/kiro/kiro.ts +81 -68
- package/src/providers/integrations/muse/muse-oauth.ts +0 -1
- package/src/providers/integrations/muse/muse-quota.ts +0 -4
- package/src/providers/integrations/opencode/fingerprint.ts +7 -5
- package/src/providers/integrations/opencode/provider.ts +17 -24
- package/src/providers/integrations/qoder/qoder-catalog.ts +85 -8
- package/src/providers/integrations/qoder/qoder-oauth.ts +165 -25
- package/src/providers/integrations/qoder/qoder-quota.ts +48 -6
- package/src/providers/integrations/qoder/qoder-realm.ts +10 -31
- package/src/providers/integrations/qoder/qoder-sse.ts +159 -0
- package/src/providers/integrations/qoder/qoder-umid.ts +21 -25
- package/src/providers/integrations/qoder/qoder-virtual.ts +12 -0
- package/src/providers/integrations/qoder/qoder.ts +354 -62
- package/src/providers/integrations/shared/connect.ts +0 -54
- package/src/providers/integrations/shared/hash.ts +15 -0
- package/src/providers/integrations/shared/session-cache.ts +136 -0
- package/src/providers/integrations/trae/trae-cache.ts +7 -87
- package/src/providers/integrations/trae/trae-catalog.ts +1 -6
- package/src/providers/integrations/trae/trae-protocol.ts +17 -8
- package/src/providers/integrations/trae/trae-realm.ts +0 -7
- package/src/providers/integrations/trae/trae.ts +53 -10
- package/src/providers/integrations/xai/xai-oauth.ts +5 -5
- package/src/providers/integrations/zcode-start-plan/gifts.ts +265 -0
- package/src/providers/integrations/zcode-start-plan/oauth.ts +154 -0
- package/src/providers/integrations/zcode-start-plan/provider.ts +131 -0
- package/src/providers/integrations/zcode-start-plan/quota.ts +152 -0
- package/src/providers/integrations/zcode-start-plan/zcode_prompt.json +10 -0
- package/src/providers/operations/account-error-classification.ts +131 -116
- package/src/providers/operations/account-health-service.ts +31 -39
- package/src/providers/operations/account-reset-service.ts +58 -1
- package/src/providers/operations/cli-platform.ts +31 -5
- package/src/providers/operations/client-version-resolver.ts +4 -6
- package/src/providers/operations/client-versions.ts +10 -7
- package/src/providers/operations/provider-catalog-seeder.ts +2 -0
- package/src/providers/operations/provider-catalog-service.ts +18 -2
- package/src/providers/operations/provider-credential-service.ts +19 -2
- package/src/providers/provider-contracts.ts +18 -7
- package/src/providers/provider-metadata.ts +17 -2
- package/src/providers/provider-model-definition.ts +22 -1
- package/src/providers/provider-probe.ts +4 -2
- package/src/providers/provider-usage.ts +81 -16
- package/src/providers/quota/cache.ts +29 -0
- package/src/providers/quota/quota-contracts.ts +4 -0
- package/src/providers/quota/refresh.ts +27 -4
- package/src/providers/quota/snapshot.ts +94 -0
- package/src/providers/search/search-provider.ts +1 -3
- package/src/providers/search/search-providers.ts +2 -1
- package/src/security/abuse.ts +4 -4
- package/src/security/admission/service.ts +2 -2
- package/src/security/admission/ttl.ts +61 -61
- package/src/security/api-key-auth.ts +16 -4
- package/src/security/client-router-fingerprint.ts +4 -4
- package/src/security/credential-codec.ts +3 -3
- package/src/security/csrf.ts +2 -2
- package/src/security/ip-boundary.ts +16 -189
- package/src/security/model-access-rule.ts +1 -1
- package/src/security/outbound-headers.ts +18 -0
- package/src/shared/invoke-guard.ts +47 -0
- package/src/transport/contracts.ts +13 -4
- package/src/transport/dispatch/attempt-finalize.ts +1 -1
- package/src/transport/dispatch/capture-policy.ts +34 -37
- package/src/transport/dispatch/empty-stream.ts +23 -20
- package/src/transport/dispatch/generation.ts +25 -45
- package/src/transport/dispatch/native-shared.ts +127 -0
- package/src/transport/dispatch/proxy-request.ts +3 -1
- package/src/transport/dispatch/responses-compact.ts +25 -46
- package/src/transport/dispatch/streaming/encoder.ts +18 -72
- package/src/transport/dispatch/streaming/finalize.ts +2 -2
- package/src/transport/dispatch/streaming/stream.ts +7 -3
- package/src/transport/dispatch/streaming/thinking-loop.ts +1 -1
- package/src/transport/dispatch/systemone.ts +20 -48
- package/src/transport/dispatch/token-count.ts +41 -38
- package/src/transport/dispatch/websearch.ts +19 -45
- package/src/transport/drain-endpoint.ts +1 -1
- package/src/transport/failure-policy.ts +6 -0
- package/src/transport/guards/auth-guard.ts +0 -6
- package/src/transport/guards/body-policy.ts +3 -3
- package/src/transport/guards/headroom-guard.ts +1 -1
- package/src/transport/guards/pipeline.ts +1 -1
- package/src/transport/guards/request-context.ts +12 -17
- package/src/transport/request/preparer.ts +286 -7
- package/src/transport/request/rtk/compress-request.ts +3 -3
- package/src/transport/request/rtk/rtk-constants.ts +2 -2
- package/src/transport/request/rtk/rtk-filters.ts +8 -8
- package/src/transport/request/state.ts +1 -13
- package/src/transport/request/system-prompt-injection.ts +74 -11
- package/src/transport/request/tenant-preferences.ts +22 -0
- package/src/transport/routing/candidate-index.ts +2 -2
- package/src/transport/routing/round-robin.ts +1 -1
- package/src/transport/routing/route-catalog.ts +17 -18
- package/src/transport/routing/route-model.ts +126 -33
- package/src/transport/routing/router.ts +152 -37
- package/src/transport/shutdown-notice.ts +2 -2
- package/src/transport/surface/adapters.ts +3 -3
- package/src/transport/surface/chat/encode.ts +7 -7
- package/src/transport/surface/chat/parse.ts +7 -7
- package/src/transport/surface/completion.ts +2 -2
- package/src/transport/surface/content-parts.ts +1 -1
- package/src/transport/surface/dialects.ts +2 -2
- package/src/transport/surface/messages/parse.ts +3 -3
- package/src/transport/surface/responses/adapter.ts +1 -1
- package/src/transport/surface/responses/errors.ts +0 -9
- package/src/transport/vision-handoff-cache.ts +58 -0
- package/src/transport/vision-handoff.ts +376 -0
- package/src/workers/account-identity-sweep.ts +2 -2
- package/src/workers/buddy-growth-tasks.ts +392 -346
- package/src/workers/daily-checkin.ts +102 -49
- package/src/workers/maintenance-lease.ts +2 -35
- package/src/workers/oauth-refresh-sweep.ts +8 -1
- package/src/workers/quota-refresh-sweep.ts +120 -82
- package/src/workers/scheduler.ts +67 -4
- package/src/workers/sweep-runner.ts +24 -5
- package/src/workers/zcode-gift-claim.ts +108 -0
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js +0 -1
- package/dist/dashboard/assets/AccountCooldown-Bjo92Qat.js.gz +0 -0
- package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js +0 -1
- package/dist/dashboard/assets/CombosPage-DCgm5g6g.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js +0 -1
- package/dist/dashboard/assets/ConsoleLogPage-a8mD0QF1.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-ggeMSjte.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js +0 -1
- package/dist/dashboard/assets/HealthEventsModal-DzSWzE_j.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-U6AKaJcF.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-BMS2t8BA.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js +0 -1
- package/dist/dashboard/assets/OverviewPage-D2D4IiHl.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js +0 -5
- package/dist/dashboard/assets/ProviderDetailPage-CrNf7j_X.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-FB6yS4v1.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-BSDbquc1.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-lsrx7NYg.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js +0 -1
- package/dist/dashboard/assets/QuotaPage-L0skzML8.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js +0 -1
- package/dist/dashboard/assets/SettingsPage-CmAbjRHW.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-f0DE1h0-.js.gz +0 -0
- package/dist/dashboard/assets/SortableList-ClzpwyET.js +0 -1
- package/dist/dashboard/assets/SortableList-ClzpwyET.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-Cq5tW7hW.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js +0 -56
- package/dist/dashboard/assets/UsagePage-Dfc9rWQn.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-C38iXoO4.js +0 -1
- package/dist/dashboard/assets/api-keys-C38iXoO4.js.gz +0 -0
- package/dist/dashboard/assets/app-a159k0ub.css +0 -2
- package/dist/dashboard/assets/app-a159k0ub.css.gz +0 -0
- package/dist/dashboard/assets/assert-DbRA8EG2.js +0 -15
- package/dist/dashboard/assets/assert-DbRA8EG2.js.gz +0 -0
- package/dist/dashboard/assets/badge-D9CS6dZk.js.gz +0 -0
- package/dist/dashboard/assets/banner-DympBNq4.js.gz +0 -0
- package/dist/dashboard/assets/card-ibRWU_uT.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js +0 -1
- package/dist/dashboard/assets/cli-tools-63qBGaRw.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-DJm-9pz7.js.gz +0 -0
- package/dist/dashboard/assets/dialog-8fiE6tec.js.gz +0 -0
- package/dist/dashboard/assets/drawer-CqGYeOrd.js.gz +0 -0
- package/dist/dashboard/assets/entry-BSAsYsmV.js.gz +0 -0
- package/dist/dashboard/assets/entry-CiIQULZD.js +0 -4
- package/dist/dashboard/assets/entry-CiIQULZD.js.gz +0 -0
- package/dist/dashboard/assets/entry-Daz0lJ-W.js +0 -1
- package/dist/dashboard/assets/entry-Daz0lJ-W.js.gz +0 -0
- package/dist/dashboard/assets/formatters-D-MTJxMr.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-CPK47xQx.js.gz +0 -0
- package/dist/dashboard/assets/index-DBNPOfhV.js.gz +0 -0
- package/dist/dashboard/assets/inline-BT0zntEr.js.gz +0 -0
- package/dist/dashboard/assets/input-Da2ZViWg.js.gz +0 -0
- package/dist/dashboard/assets/layout-BXNeLw6M.js.gz +0 -0
- package/dist/dashboard/assets/list-row-BycOrrIV.js.gz +0 -0
- package/dist/dashboard/assets/live-DCQNZpF7.js +0 -1
- package/dist/dashboard/assets/live-DCQNZpF7.js.gz +0 -0
- package/dist/dashboard/assets/network-9Yj2ZyLo.js +0 -1
- package/dist/dashboard/assets/network-9Yj2ZyLo.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js +0 -2
- package/dist/dashboard/assets/numbers-CEagj6ZZ.js.gz +0 -0
- package/dist/dashboard/assets/quota-Caw7wqci.js +0 -1
- package/dist/dashboard/assets/quota-Caw7wqci.js.gz +0 -0
- package/dist/dashboard/assets/routing-CO9zCUus.js +0 -1
- package/dist/dashboard/assets/routing-CO9zCUus.js.gz +0 -0
- package/dist/dashboard/assets/select-BIYIBkMU.js.gz +0 -0
- package/dist/dashboard/assets/settings-jS3-PNSA.js +0 -1
- package/dist/dashboard/assets/settings-jS3-PNSA.js.gz +0 -0
- package/dist/dashboard/assets/stack-DfgnFDWY.js.gz +0 -0
- package/dist/dashboard/assets/state-CkfdYWel.js.gz +0 -0
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js +0 -1
- package/dist/dashboard/assets/stream-retry-5QnVuSSo.js.gz +0 -0
- package/dist/dashboard/assets/switch-SYm237HG.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-BQqCRNIi.js.gz +0 -0
- package/src/network/response-headers.ts +0 -39
- package/src/protocol/response/dsml.ts +0 -38
- package/src/providers/integrations/xiaomi-mimo/think-stream.ts +0 -229
- /package/dist/dashboard/assets/{app-BayTTy01.js → app-Bgd3zANQ.js} +0 -0
- /package/dist/dashboard/assets/{app-BayTTy01.js.gz → app-Bgd3zANQ.js.gz} +0 -0
- /package/dist/dashboard/assets/brand/{og_bansos.webp → og_bansos_initial.webp} +0 -0
- /package/dist/dashboard/assets/brand/{og_image.webp → og_image_initial.webp} +0 -0
|
@@ -38,6 +38,7 @@ import { appendFile, mkdir } from "node:fs/promises";
|
|
|
38
38
|
import { getTableColumns, type Column, type SQL, type Table } from "drizzle-orm";
|
|
39
39
|
import type { CartethyiaDatabase } from "../../persistence/db-handle";
|
|
40
40
|
import { decryptCredentialToString, encryptCredential } from "../../security/crypto";
|
|
41
|
+
import { asConsoleDb } from "../shared/transaction";
|
|
41
42
|
import {
|
|
42
43
|
apiKeys,
|
|
43
44
|
cliToolMappings,
|
|
@@ -75,7 +76,7 @@ import {
|
|
|
75
76
|
tableName,
|
|
76
77
|
type BackupBytes,
|
|
77
78
|
type BackupDate,
|
|
78
|
-
type
|
|
79
|
+
type BackupPayloadExport,
|
|
79
80
|
type BackupPayload,
|
|
80
81
|
type BackupRow,
|
|
81
82
|
type ValidatedRestore,
|
|
@@ -187,11 +188,15 @@ function decodeCell(value: unknown, dataType: string): unknown {
|
|
|
187
188
|
}
|
|
188
189
|
|
|
189
190
|
/** Column name → the object key Drizzle uses for it, and its data type. */
|
|
191
|
+
const COLUMN_INDEX_CACHE = new WeakMap<Table, ReadonlyMap<string, { key: string; dataType: string }>>();
|
|
190
192
|
function columnIndex(table: Table): ReadonlyMap<string, { key: string; dataType: string }> {
|
|
193
|
+
const cached = COLUMN_INDEX_CACHE.get(table);
|
|
194
|
+
if (cached) return cached;
|
|
191
195
|
const out = new Map<string, { key: string; dataType: string }>();
|
|
192
196
|
for (const [key, column] of Object.entries(getTableColumns(table))) {
|
|
193
197
|
out.set(column.name, { key, dataType: column.dataType });
|
|
194
198
|
}
|
|
199
|
+
COLUMN_INDEX_CACHE.set(table, out);
|
|
195
200
|
return out;
|
|
196
201
|
}
|
|
197
202
|
|
|
@@ -386,13 +391,6 @@ async function* pagedTelemetryEvents(
|
|
|
386
391
|
}
|
|
387
392
|
}
|
|
388
393
|
|
|
389
|
-
/**
|
|
390
|
-
* Streams the payload document: the requested tables, grouped into their
|
|
391
|
-
* sections, written membrane-incrementally so the process never holds a table
|
|
392
|
-
* — let alone every table and a second JSON copy — in memory. Consumed
|
|
393
|
-
* chunks concatenated are exactly the JSON the buffered variant used to
|
|
394
|
-
* stringify in one piece.
|
|
395
|
-
*/
|
|
396
394
|
/**
|
|
397
395
|
* Streams the payload document: the requested tables, grouped into their
|
|
398
396
|
* sections, written incrementally so the process never holds a table — let
|
|
@@ -571,7 +569,7 @@ export async function exportBackup(
|
|
|
571
569
|
db: CartethyiaDatabase,
|
|
572
570
|
tables: readonly Table[],
|
|
573
571
|
tenantId: string,
|
|
574
|
-
): Promise<
|
|
572
|
+
): Promise<BackupPayloadExport> {
|
|
575
573
|
const stream = exportBackupStream(db, tables, tenantId);
|
|
576
574
|
let document = "";
|
|
577
575
|
for await (const chunk of stream.jsonChunks) document += chunk;
|
|
@@ -618,7 +616,7 @@ export async function compressBackupStream(chunks: AsyncGenerator<string, void,
|
|
|
618
616
|
const GZIP_MAGIC = [0x1f, 0x8b] as const;
|
|
619
617
|
|
|
620
618
|
/** Whether `bytes` starts with the gzip magic. */
|
|
621
|
-
|
|
619
|
+
function isGzipBytes(bytes: Uint8Array): boolean {
|
|
622
620
|
return GZIP_MAGIC.every((byte, index) => bytes[index] === byte);
|
|
623
621
|
}
|
|
624
622
|
|
|
@@ -722,7 +720,6 @@ function createdAtIso(value: unknown): string {
|
|
|
722
720
|
* timestamps are normalised in SQL to the same ISO spelling the payload uses,
|
|
723
721
|
* so the two sides are comparable regardless of how the driver types them.
|
|
724
722
|
*/
|
|
725
|
-
/** Natural keys already present in the event file, so a re-import skips them. */
|
|
726
723
|
async function existingEventFileKeys(db: CartethyiaDatabase, tenantId: string, rows: readonly BackupRow[]): Promise<Set<string>> {
|
|
727
724
|
const wanted = new Set(rows.map((row) => row.request_id).filter((id): id is string => typeof id === "string"));
|
|
728
725
|
if (wanted.size === 0) return new Set();
|
|
@@ -894,9 +891,8 @@ async function insertRows(
|
|
|
894
891
|
// stays writable and the per-row path can isolate the offending row.
|
|
895
892
|
const count = await tx.transaction(async (innerTx) => {
|
|
896
893
|
// Drizzle types the nested transaction callback with the dialect's
|
|
897
|
-
// own transaction handle;
|
|
898
|
-
|
|
899
|
-
const inner = innerTx as unknown as CartethyiaDatabase; // nested-tx handle; mirrors applyRestore's outer `scoped` cast on line 607.
|
|
894
|
+
// own transaction handle; normalize once via the shared helper.
|
|
895
|
+
const inner = asConsoleDb(innerTx);
|
|
900
896
|
const statement = inner.insert(table).values(chunk as never);
|
|
901
897
|
if (options.ignoreConflicts) {
|
|
902
898
|
if (options.conflictTarget === undefined) {
|
|
@@ -1003,22 +999,46 @@ export async function normalizeShareChildPolicy(
|
|
|
1003
999
|
db: CartethyiaDatabase,
|
|
1004
1000
|
tenantId: string,
|
|
1005
1001
|
): Promise<void> {
|
|
1002
|
+
// Template policy columns are nulled on every child so auth reads the full
|
|
1003
|
+
// policy from the parent (`policy = parent ?? row`). The exception is a
|
|
1004
|
+
// `per_key` concurrency child: it carries its own cap (copied at issue) and
|
|
1005
|
+
// its own admission identity, so `concurrency_scope` and
|
|
1006
|
+
// `max_concurrent_requests` are preserved for those rows.
|
|
1007
|
+
const policyNulls = {
|
|
1008
|
+
notesTitle: null,
|
|
1009
|
+
notesSubtitle: null,
|
|
1010
|
+
notesBody: null,
|
|
1011
|
+
requestsPerMinute: null,
|
|
1012
|
+
dailyTokenLimit: null,
|
|
1013
|
+
monthlyTokenLimit: null,
|
|
1014
|
+
lifetimeTokenBudget: null,
|
|
1015
|
+
modelPrefix: null,
|
|
1016
|
+
modelList: null,
|
|
1017
|
+
clientRouterDenylist: null,
|
|
1018
|
+
};
|
|
1006
1019
|
await db
|
|
1007
1020
|
.update(apiKeys)
|
|
1008
1021
|
.set({
|
|
1009
|
-
|
|
1010
|
-
notesSubtitle: null,
|
|
1011
|
-
notesBody: null,
|
|
1012
|
-
requestsPerMinute: null,
|
|
1013
|
-
dailyTokenLimit: null,
|
|
1014
|
-
monthlyTokenLimit: null,
|
|
1015
|
-
lifetimeTokenBudget: null,
|
|
1022
|
+
...policyNulls,
|
|
1016
1023
|
maxConcurrentRequests: null,
|
|
1017
|
-
modelPrefix: null,
|
|
1018
|
-
modelList: null,
|
|
1019
|
-
clientRouterDenylist: null,
|
|
1020
1024
|
})
|
|
1021
|
-
.where(
|
|
1025
|
+
.where(
|
|
1026
|
+
and(
|
|
1027
|
+
eq(apiKeys.tenantId, tenantId),
|
|
1028
|
+
isNotNull(apiKeys.parentKeyId),
|
|
1029
|
+
sql`${apiKeys.concurrencyScope} <> 'per_key'`,
|
|
1030
|
+
),
|
|
1031
|
+
);
|
|
1032
|
+
await db
|
|
1033
|
+
.update(apiKeys)
|
|
1034
|
+
.set(policyNulls)
|
|
1035
|
+
.where(
|
|
1036
|
+
and(
|
|
1037
|
+
eq(apiKeys.tenantId, tenantId),
|
|
1038
|
+
isNotNull(apiKeys.parentKeyId),
|
|
1039
|
+
eq(apiKeys.concurrencyScope, "per_key"),
|
|
1040
|
+
),
|
|
1041
|
+
);
|
|
1022
1042
|
}
|
|
1023
1043
|
|
|
1024
1044
|
/**
|
|
@@ -1046,7 +1066,7 @@ export async function applyRestore(
|
|
|
1046
1066
|
const skipped: Record<string, number> = {};
|
|
1047
1067
|
|
|
1048
1068
|
await db.transaction(async (tx) => {
|
|
1049
|
-
const scoped = tx
|
|
1069
|
+
const scoped = asConsoleDb(tx);
|
|
1050
1070
|
|
|
1051
1071
|
// The tenant row is ensured, never replaced: it almost always exists, and
|
|
1052
1072
|
// its PK is `id`, so a conflict means "already there" rather than an error.
|
|
@@ -1199,7 +1219,7 @@ export async function deleteAll(
|
|
|
1199
1219
|
const apiKeyIds: string[] = [];
|
|
1200
1220
|
|
|
1201
1221
|
await db.transaction(async (tx) => {
|
|
1202
|
-
const scoped = tx
|
|
1222
|
+
const scoped = asConsoleDb(tx);
|
|
1203
1223
|
const remove = async (table: Table, filter: SQL, name = tableName(table)): Promise<void> => {
|
|
1204
1224
|
const rows = await scoped.delete(table).where(filter).returning();
|
|
1205
1225
|
if (rows.length > 0) deleted[name] = (deleted[name] ?? 0) + rows.length;
|
|
@@ -1241,5 +1261,3 @@ export async function deleteAll(
|
|
|
1241
1261
|
|
|
1242
1262
|
return { deleted, apiKeyIds };
|
|
1243
1263
|
}
|
|
1244
|
-
|
|
1245
|
-
export { and, eq };
|
|
@@ -101,12 +101,17 @@ function normalizeLegacyCiphertext(table: Table, row: Record<string, unknown>):
|
|
|
101
101
|
return normalized;
|
|
102
102
|
}
|
|
103
103
|
|
|
104
|
+
const COLUMN_TYPES_CACHE = new WeakMap<Table, ReadonlyMap<string, string>>();
|
|
105
|
+
|
|
104
106
|
/** Column name → its Drizzle data type, so validation knows what may nest. */
|
|
105
107
|
function columnTypes(table: Table): ReadonlyMap<string, string> {
|
|
108
|
+
const cached = COLUMN_TYPES_CACHE.get(table);
|
|
109
|
+
if (cached) return cached;
|
|
106
110
|
const out = new Map<string, string>();
|
|
107
111
|
for (const column of Object.values(getTableColumns(table))) {
|
|
108
112
|
out.set(column.name, column.dataType);
|
|
109
113
|
}
|
|
114
|
+
COLUMN_TYPES_CACHE.set(table, out);
|
|
110
115
|
return out;
|
|
111
116
|
}
|
|
112
117
|
|
|
@@ -122,7 +127,11 @@ function columnTypes(table: Table): ReadonlyMap<string, string> {
|
|
|
122
127
|
* would write a row the operator never had, and guessing wrong on a credential
|
|
123
128
|
* column is worse than not restoring that one row.
|
|
124
129
|
*/
|
|
130
|
+
const REQUIRED_COLUMNS_CACHE = new WeakMap<Table, ReadonlySet<string>>();
|
|
131
|
+
|
|
125
132
|
function requiredColumns(table: Table): ReadonlySet<string> {
|
|
133
|
+
const cached = REQUIRED_COLUMNS_CACHE.get(table);
|
|
134
|
+
if (cached) return cached;
|
|
126
135
|
const out = new Set<string>();
|
|
127
136
|
for (const column of Object.values(getTableColumns(table))) {
|
|
128
137
|
if (!column.notNull || column.hasDefault) continue;
|
|
@@ -132,11 +141,12 @@ function requiredColumns(table: Table): ReadonlySet<string> {
|
|
|
132
141
|
if (column.name === "tenant_id") continue;
|
|
133
142
|
out.add(column.name);
|
|
134
143
|
}
|
|
144
|
+
REQUIRED_COLUMNS_CACHE.set(table, out);
|
|
135
145
|
return out;
|
|
136
146
|
}
|
|
137
147
|
|
|
138
148
|
/** Detection outcome for an uploaded file. */
|
|
139
|
-
|
|
149
|
+
type DetectedFormat =
|
|
140
150
|
| { readonly kind: "native"; readonly payload: Record<string, unknown> }
|
|
141
151
|
| { readonly kind: "nine_router"; readonly payload: Record<string, unknown> }
|
|
142
152
|
| { readonly kind: "unknown"; readonly reason: string };
|
|
@@ -19,13 +19,13 @@ import { ensureV1Suffix } from "./fs-ops";
|
|
|
19
19
|
* sibling project used `openai-chat | openai-responses | anthropic-messages`;
|
|
20
20
|
* Cartethyia's canonical surface vocabulary is the shorter form.
|
|
21
21
|
*/
|
|
22
|
-
|
|
22
|
+
type CliToolSurface = "chat" | "responses" | "messages";
|
|
23
23
|
|
|
24
24
|
/** How the tool's config is managed. */
|
|
25
|
-
|
|
25
|
+
type ConfigType = "env" | "custom" | "guide";
|
|
26
26
|
|
|
27
27
|
/** A native model slot exposed by a CLI tool. */
|
|
28
|
-
|
|
28
|
+
interface ToolModelDef {
|
|
29
29
|
readonly id: string;
|
|
30
30
|
readonly name: string;
|
|
31
31
|
readonly alias: string;
|
|
@@ -63,13 +63,13 @@ export interface CliMappingSettings {
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
/** A note shown in the tool card UI. */
|
|
66
|
-
|
|
66
|
+
interface ToolNote {
|
|
67
67
|
readonly type: "info" | "warning" | "error";
|
|
68
68
|
readonly text: string;
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
/** A guide step for guide-only tools. */
|
|
72
|
-
|
|
72
|
+
interface GuideStep {
|
|
73
73
|
readonly step: number;
|
|
74
74
|
readonly title: string;
|
|
75
75
|
readonly desc?: string;
|
|
@@ -78,7 +78,7 @@ export interface GuideStep {
|
|
|
78
78
|
}
|
|
79
79
|
|
|
80
80
|
/** A code block for guide-only tools. */
|
|
81
|
-
|
|
81
|
+
interface GuideCodeBlock {
|
|
82
82
|
readonly language: string;
|
|
83
83
|
readonly code: string;
|
|
84
84
|
}
|
|
@@ -235,7 +235,7 @@ export interface ToolInjector {
|
|
|
235
235
|
export type AllStatusesResult = Readonly<Record<string, ToolStatus>>;
|
|
236
236
|
|
|
237
237
|
/** Status details extracted from a tool's configuration file(s). */
|
|
238
|
-
|
|
238
|
+
interface StatusDetails {
|
|
239
239
|
readonly configured: boolean;
|
|
240
240
|
readonly currentEndpoint?: string | null | undefined;
|
|
241
241
|
readonly currentApiKeyPrefix?: string | null | undefined;
|
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { homeDir, isLocalEndpoint, readJsonFile, stripV1Suffix, writeJsonFile } from "../fs-ops";
|
|
3
|
-
import type { InjectorSpec } from "../contracts";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// Cline injector spec.
|
|
7
|
-
interface ClineGlobalState {
|
|
8
|
-
actModeApiProvider?: string;
|
|
9
|
-
planModeApiProvider?: string;
|
|
10
|
-
openAiBaseUrl?: string;
|
|
11
|
-
openAiModelId?: string;
|
|
12
|
-
planModeOpenAiModelId?: string;
|
|
13
|
-
[key: string]: unknown;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
interface ClineSecrets {
|
|
17
|
-
openAiApiKey?: string;
|
|
18
|
-
[key: string]: unknown;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
const clineSecretsPath = () => `${homeDir()}/.cline/data/secrets.json`;
|
|
22
|
-
|
|
23
|
-
export const clineSpec: InjectorSpec = {
|
|
24
|
-
toolId: "cline",
|
|
25
|
-
displayName: "Cline",
|
|
26
|
-
binary: "cline",
|
|
27
|
-
resolvePath: () => `${homeDir()}/.cline/data/globalState.json`,
|
|
28
|
-
resolveDir: () => `${homeDir()}/.cline/data`,
|
|
29
|
-
|
|
30
|
-
async readStatus(path) {
|
|
31
|
-
const state = (await readJsonFile(path)) as ClineGlobalState | null;
|
|
32
|
-
const secrets = (await readJsonFile(clineSecretsPath())) as ClineSecrets | null;
|
|
33
|
-
const endpoint = state?.openAiBaseUrl ?? null;
|
|
34
|
-
const models = [state?.openAiModelId, state?.planModeOpenAiModelId].filter(
|
|
35
|
-
(m): m is string => typeof m === "string",
|
|
36
|
-
);
|
|
37
|
-
const configured = state?.actModeApiProvider === "openai" && isLocalEndpoint(endpoint);
|
|
38
|
-
return {
|
|
39
|
-
configured,
|
|
40
|
-
currentEndpoint: endpoint,
|
|
41
|
-
rawApiKey: secrets?.openAiApiKey ?? null,
|
|
42
|
-
currentModels: models.length > 0 ? models : null,
|
|
43
|
-
};
|
|
44
|
-
},
|
|
45
|
-
|
|
46
|
-
async apply(input, path) {
|
|
47
|
-
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
48
|
-
const baseUrl = stripV1Suffix(input.endpoint);
|
|
49
|
-
|
|
50
|
-
const state = ((await readJsonFile(path)) as ClineGlobalState | null) ?? {};
|
|
51
|
-
state.actModeApiProvider = "openai";
|
|
52
|
-
state.planModeApiProvider = "openai";
|
|
53
|
-
state.openAiBaseUrl = baseUrl;
|
|
54
|
-
state.openAiModelId = model;
|
|
55
|
-
state.planModeOpenAiModelId = model;
|
|
56
|
-
await writeJsonFile(path, state);
|
|
57
|
-
|
|
58
|
-
const secrets = ((await readJsonFile(clineSecretsPath())) as ClineSecrets | null) ?? {};
|
|
59
|
-
secrets.openAiApiKey = input.apiKey;
|
|
60
|
-
await writeJsonFile(clineSecretsPath(), secrets);
|
|
61
|
-
},
|
|
62
|
-
|
|
63
|
-
async reset(path) {
|
|
64
|
-
const state = (await readJsonFile(path)) as ClineGlobalState | null;
|
|
65
|
-
if (!state) return false;
|
|
66
|
-
|
|
67
|
-
if (state.actModeApiProvider === "openai") {
|
|
68
|
-
delete state.openAiBaseUrl;
|
|
69
|
-
delete state.openAiModelId;
|
|
70
|
-
delete state.planModeOpenAiModelId;
|
|
71
|
-
state.actModeApiProvider = "cline";
|
|
72
|
-
state.planModeApiProvider = "cline";
|
|
73
|
-
}
|
|
74
|
-
await writeJsonFile(path, state);
|
|
75
|
-
|
|
76
|
-
const secrets = (await readJsonFile(clineSecretsPath())) as ClineSecrets | null;
|
|
77
|
-
if (secrets?.openAiApiKey) {
|
|
78
|
-
delete secrets.openAiApiKey;
|
|
79
|
-
await writeJsonFile(clineSecretsPath(), secrets);
|
|
80
|
-
}
|
|
81
|
-
},
|
|
82
|
-
|
|
83
|
-
download(input) {
|
|
84
|
-
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
85
|
-
const baseUrl = stripV1Suffix(input.endpoint);
|
|
86
|
-
const globalState = JSON.stringify(
|
|
87
|
-
{
|
|
88
|
-
actModeApiProvider: "openai",
|
|
89
|
-
planModeApiProvider: "openai",
|
|
90
|
-
openAiBaseUrl: baseUrl,
|
|
91
|
-
openAiModelId: model,
|
|
92
|
-
planModeOpenAiModelId: model,
|
|
93
|
-
},
|
|
94
|
-
null,
|
|
95
|
-
2,
|
|
96
|
-
);
|
|
97
|
-
const secrets = JSON.stringify({ openAiApiKey: input.apiKey }, null, 2);
|
|
98
|
-
return {
|
|
99
|
-
content: `# ~/.cline/data/globalState.json\n${globalState}\n\n# ~/.cline/data/secrets.json\n${secrets}\n`,
|
|
100
|
-
filename: "cline-config.txt",
|
|
101
|
-
mimeType: "text/plain",
|
|
102
|
-
};
|
|
103
|
-
},
|
|
104
|
-
|
|
105
|
-
messages: {
|
|
106
|
-
applied: "Cline settings applied successfully",
|
|
107
|
-
reset: "Cartethyia settings removed from Cline",
|
|
108
|
-
},
|
|
109
|
-
};
|
|
110
|
-
|
|
1
|
+
import type {} from "../contracts";
|
|
2
|
+
import { homeDir, isLocalEndpoint, readJsonFile, stripV1Suffix, writeJsonFile } from "../fs-ops";
|
|
3
|
+
import type { InjectorSpec } from "../contracts";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// Cline injector spec.
|
|
7
|
+
interface ClineGlobalState {
|
|
8
|
+
actModeApiProvider?: string;
|
|
9
|
+
planModeApiProvider?: string;
|
|
10
|
+
openAiBaseUrl?: string;
|
|
11
|
+
openAiModelId?: string;
|
|
12
|
+
planModeOpenAiModelId?: string;
|
|
13
|
+
[key: string]: unknown;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
interface ClineSecrets {
|
|
17
|
+
openAiApiKey?: string;
|
|
18
|
+
[key: string]: unknown;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const clineSecretsPath = () => `${homeDir()}/.cline/data/secrets.json`;
|
|
22
|
+
|
|
23
|
+
export const clineSpec: InjectorSpec = {
|
|
24
|
+
toolId: "cline",
|
|
25
|
+
displayName: "Cline",
|
|
26
|
+
binary: "cline",
|
|
27
|
+
resolvePath: () => `${homeDir()}/.cline/data/globalState.json`,
|
|
28
|
+
resolveDir: () => `${homeDir()}/.cline/data`,
|
|
29
|
+
|
|
30
|
+
async readStatus(path) {
|
|
31
|
+
const state = (await readJsonFile(path)) as ClineGlobalState | null;
|
|
32
|
+
const secrets = (await readJsonFile(clineSecretsPath())) as ClineSecrets | null;
|
|
33
|
+
const endpoint = state?.openAiBaseUrl ?? null;
|
|
34
|
+
const models = [state?.openAiModelId, state?.planModeOpenAiModelId].filter(
|
|
35
|
+
(m): m is string => typeof m === "string",
|
|
36
|
+
);
|
|
37
|
+
const configured = state?.actModeApiProvider === "openai" && isLocalEndpoint(endpoint);
|
|
38
|
+
return {
|
|
39
|
+
configured,
|
|
40
|
+
currentEndpoint: endpoint,
|
|
41
|
+
rawApiKey: secrets?.openAiApiKey ?? null,
|
|
42
|
+
currentModels: models.length > 0 ? models : null,
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
|
|
46
|
+
async apply(input, path) {
|
|
47
|
+
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
48
|
+
const baseUrl = stripV1Suffix(input.endpoint);
|
|
49
|
+
|
|
50
|
+
const state = ((await readJsonFile(path)) as ClineGlobalState | null) ?? {};
|
|
51
|
+
state.actModeApiProvider = "openai";
|
|
52
|
+
state.planModeApiProvider = "openai";
|
|
53
|
+
state.openAiBaseUrl = baseUrl;
|
|
54
|
+
state.openAiModelId = model;
|
|
55
|
+
state.planModeOpenAiModelId = model;
|
|
56
|
+
await writeJsonFile(path, state);
|
|
57
|
+
|
|
58
|
+
const secrets = ((await readJsonFile(clineSecretsPath())) as ClineSecrets | null) ?? {};
|
|
59
|
+
secrets.openAiApiKey = input.apiKey;
|
|
60
|
+
await writeJsonFile(clineSecretsPath(), secrets);
|
|
61
|
+
},
|
|
62
|
+
|
|
63
|
+
async reset(path) {
|
|
64
|
+
const state = (await readJsonFile(path)) as ClineGlobalState | null;
|
|
65
|
+
if (!state) return false;
|
|
66
|
+
|
|
67
|
+
if (state.actModeApiProvider === "openai") {
|
|
68
|
+
delete state.openAiBaseUrl;
|
|
69
|
+
delete state.openAiModelId;
|
|
70
|
+
delete state.planModeOpenAiModelId;
|
|
71
|
+
state.actModeApiProvider = "cline";
|
|
72
|
+
state.planModeApiProvider = "cline";
|
|
73
|
+
}
|
|
74
|
+
await writeJsonFile(path, state);
|
|
75
|
+
|
|
76
|
+
const secrets = (await readJsonFile(clineSecretsPath())) as ClineSecrets | null;
|
|
77
|
+
if (secrets?.openAiApiKey) {
|
|
78
|
+
delete secrets.openAiApiKey;
|
|
79
|
+
await writeJsonFile(clineSecretsPath(), secrets);
|
|
80
|
+
}
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
download(input) {
|
|
84
|
+
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
85
|
+
const baseUrl = stripV1Suffix(input.endpoint);
|
|
86
|
+
const globalState = JSON.stringify(
|
|
87
|
+
{
|
|
88
|
+
actModeApiProvider: "openai",
|
|
89
|
+
planModeApiProvider: "openai",
|
|
90
|
+
openAiBaseUrl: baseUrl,
|
|
91
|
+
openAiModelId: model,
|
|
92
|
+
planModeOpenAiModelId: model,
|
|
93
|
+
},
|
|
94
|
+
null,
|
|
95
|
+
2,
|
|
96
|
+
);
|
|
97
|
+
const secrets = JSON.stringify({ openAiApiKey: input.apiKey }, null, 2);
|
|
98
|
+
return {
|
|
99
|
+
content: `# ~/.cline/data/globalState.json\n${globalState}\n\n# ~/.cline/data/secrets.json\n${secrets}\n`,
|
|
100
|
+
filename: "cline-config.txt",
|
|
101
|
+
mimeType: "text/plain",
|
|
102
|
+
};
|
|
103
|
+
},
|
|
104
|
+
|
|
105
|
+
messages: {
|
|
106
|
+
applied: "Cline settings applied successfully",
|
|
107
|
+
reset: "Cartethyia settings removed from Cline",
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
|