cartethyia 2.7.4 → 2.7.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.example +5 -0
- package/README.md +18 -6
- package/dist/dashboard/assets/BannedPage-B1N603cM.js +1 -0
- package/dist/dashboard/assets/BannedPage-B1N603cM.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js +3 -0
- package/dist/dashboard/assets/CliToolDetailPage-9q4_4NoK.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js +1 -0
- package/dist/dashboard/assets/CliToolsPage-DwshGtK-.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-D762MIkp.js +1 -0
- package/dist/dashboard/assets/CombosPage-D762MIkp.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js +1 -0
- package/dist/dashboard/assets/ConsoleLogPage-KRYjHZsX.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js +1 -0
- package/dist/dashboard/assets/CustomizationPage-DXsxk5uM.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-BEjAjD4F.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js +899 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-d5v3K_Yc.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js +1 -0
- package/dist/dashboard/assets/LoginPage-Ccv4tjNS.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-BMS2t8BA.js → ModelPicker-C6WlpU5E.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js +1 -0
- package/dist/dashboard/assets/OverviewPage-DN9fYNWA.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js +5 -0
- package/dist/dashboard/assets/ProviderDetailPage-BY0ieUgz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js +1 -0
- package/dist/dashboard/assets/ProviderIcon-jjqXJDA3.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-DNsbfea2.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-lsrx7NYg.js → ProxyPage-DxjvUzSD.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-DxjvUzSD.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-OaHScjpX.js +1 -0
- package/dist/dashboard/assets/QuotaPage-OaHScjpX.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js +1 -0
- package/dist/dashboard/assets/SettingsPage-BW4AKj2H.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-44BZrxFC.js +1 -0
- package/dist/dashboard/assets/SetupPage-44BZrxFC.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-Cq5tW7hW.js → StudioPage-DRPavCdU.js} +4 -4
- package/dist/dashboard/assets/StudioPage-DRPavCdU.js.gz +0 -0
- package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js +1 -0
- package/dist/dashboard/assets/ToolIcon-CfeLA-Z_.js.gz +0 -0
- package/dist/dashboard/assets/UsagePage-B7M7LvMM.js +56 -0
- package/dist/dashboard/assets/UsagePage-B7M7LvMM.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js +1 -0
- package/dist/dashboard/assets/api-keys-KvX83mRe.js.gz +0 -0
- package/dist/dashboard/assets/app-DRnQLhsc.js +9 -0
- package/dist/dashboard/assets/app-DRnQLhsc.js.gz +0 -0
- package/dist/dashboard/assets/app-mweRcsKp.css +2 -0
- package/dist/dashboard/assets/app-mweRcsKp.css.gz +0 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js +1 -0
- package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-D9CS6dZk.js → badge-BaX2GTrn.js} +1 -1
- package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
- package/dist/dashboard/assets/{banner-DympBNq4.js → banner-DFH4Bkte.js} +1 -1
- package/dist/dashboard/assets/banner-DFH4Bkte.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-CxDw0lK6.js} +1 -1
- package/dist/dashboard/assets/card-CxDw0lK6.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/circle-question-mark-Cz4un8sH.js +1 -0
- package/dist/dashboard/assets/circle-question-mark-Cz4un8sH.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js +1 -0
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-DJm-9pz7.js → clipboard-button-DfS1ntiq.js} +1 -1
- package/dist/dashboard/assets/clipboard-button-DfS1ntiq.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BK-NRr5u.js +1 -0
- package/dist/dashboard/assets/dialog-BK-NRr5u.js.gz +0 -0
- package/dist/dashboard/assets/{drawer-CqGYeOrd.js → drawer-QqPul6sC.js} +1 -1
- package/dist/dashboard/assets/drawer-QqPul6sC.js.gz +0 -0
- package/dist/dashboard/assets/entry-BMlYJVFj.js +1 -0
- package/dist/dashboard/assets/entry-BMlYJVFj.js.gz +0 -0
- package/dist/dashboard/assets/entry-D6WvojeD.js +4 -0
- package/dist/dashboard/assets/entry-D6WvojeD.js.gz +0 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js +1 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
- package/dist/dashboard/assets/{formatters-D-MTJxMr.js → formatters-u7JPB5BX.js} +1 -1
- package/dist/dashboard/assets/formatters-u7JPB5BX.js.gz +0 -0
- package/dist/dashboard/assets/house-h9AZlJuT.js +1 -0
- package/dist/dashboard/assets/house-h9AZlJuT.js.gz +0 -0
- package/dist/dashboard/assets/{index-DBNPOfhV.js → index-Ko4dLRnV.js} +2 -2
- package/dist/dashboard/assets/index-Ko4dLRnV.js.gz +0 -0
- package/dist/dashboard/assets/{inline-BT0zntEr.js → inline-CHJQwxLa.js} +1 -1
- package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
- package/dist/dashboard/assets/{input-Da2ZViWg.js → input-BlmlizVV.js} +1 -1
- package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
- package/dist/dashboard/assets/{layout-BXNeLw6M.js → layout-Bz93I-yE.js} +1 -1
- package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-BycOrrIV.js → list-row-Ml16KCfu.js} +1 -1
- package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
- package/dist/dashboard/assets/live-7_QpnYGu.js +1 -0
- package/dist/dashboard/assets/live-7_QpnYGu.js.gz +0 -0
- package/dist/dashboard/assets/{mutation-Rr0TIvcj.js → mutation-GU7XdEjz.js} +1 -1
- package/dist/dashboard/assets/mutation-GU7XdEjz.js.gz +0 -0
- package/dist/dashboard/assets/network-CuMDaTzT.js +1 -0
- package/dist/dashboard/assets/network-CuMDaTzT.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CoqpaDMx.js +2 -0
- package/dist/dashboard/assets/numbers-CoqpaDMx.js.gz +0 -0
- package/dist/dashboard/assets/pagination-B5aOoweZ.js +1 -0
- package/dist/dashboard/assets/pagination-B5aOoweZ.js.gz +0 -0
- package/dist/dashboard/assets/providers/zai.webp +0 -0
- package/dist/dashboard/assets/providers/zcode.webp +0 -0
- package/dist/dashboard/assets/{query-keys-BloKtaXJ.js → query-keys-YSoQOUh6.js} +1 -1
- package/dist/dashboard/assets/{query-keys-BloKtaXJ.js.gz → query-keys-YSoQOUh6.js.gz} +0 -0
- package/dist/dashboard/assets/quota-DJ1QlAOq.js +1 -0
- package/dist/dashboard/assets/quota-DJ1QlAOq.js.gz +0 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js +1 -0
- package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
- package/dist/dashboard/assets/{select-BIYIBkMU.js → select-BHqpd-bg.js} +2 -2
- package/dist/dashboard/assets/select-BHqpd-bg.js.gz +0 -0
- package/dist/dashboard/assets/settings-BxslsErn.js +1 -0
- package/dist/dashboard/assets/settings-BxslsErn.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-j7cXjgYX.js} +1 -1
- package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
- package/dist/dashboard/assets/{state-CkfdYWel.js → state-DHmEnLa2.js} +1 -1
- package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
- package/dist/dashboard/assets/{switch-SYm237HG.js → switch-DmZcyTIC.js} +1 -1
- package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-BQqCRNIi.js → useMutation-CbCP4w1o.js} +1 -1
- package/dist/dashboard/assets/useMutation-CbCP4w1o.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 +60 -59
- 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/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -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/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -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 +794 -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 +19 -14
- package/src/config/resources.ts +0 -5
- package/src/config/runtime.ts +2 -5
- package/src/config/spec.ts +33 -6
- package/src/config/usage.ts +27 -0
- 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 +56 -24
- 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 +43 -299
- package/src/console/cli-tools/fs-ops.ts +29 -0
- package/src/console/cli-tools/injectors/claude.ts +3 -3
- package/src/console/cli-tools/injectors/codex.ts +181 -181
- package/src/console/cli-tools/injectors/driver.ts +150 -247
- package/src/console/cli-tools/injectors/kilo.ts +146 -21
- package/src/console/cli-tools/injectors/opencode.ts +176 -153
- package/src/console/cli-tools/routes.ts +7 -1
- package/src/console/cli-tools/service.ts +8 -7
- 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 +7 -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 +23 -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 +11 -13
- 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 +9 -2
- package/src/observability/event-query.ts +61 -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 +19 -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 +121 -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 +29 -2
- 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 +8 -125
- 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 +71 -4
- 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 +35 -37
- 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 +88 -28
- package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
- package/src/providers/integrations/antigravity/antigravity.ts +22 -13
- 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 +35 -3
- 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 +70 -12
- package/src/providers/integrations/github/github-oauth.ts +184 -14
- package/src/providers/integrations/github/github.ts +134 -26
- 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 +80 -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 +94 -11
- 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 +422 -71
- 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 +51 -8
- 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 +198 -133
- package/src/providers/operations/account-health-service.ts +31 -39
- package/src/providers/operations/account-reset-service.ts +58 -1
- package/src/providers/operations/byok-wire-profile.ts +19 -15
- 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 +50 -19
- 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 +13 -6
- package/src/security/admission/ttl.ts +61 -61
- package/src/security/api-key-auth.ts +17 -3
- 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 +70 -22
- package/src/transport/dispatch/attempt-loop.ts +22 -0
- 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 +21 -1
- package/src/transport/guards/auth-guard.ts +0 -6
- package/src/transport/guards/body-policy.ts +3 -3
- package/src/transport/guards/error-lifecycle.ts +4 -0
- 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 +7 -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 +159 -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/reasoning-summary.ts +9 -14
- 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 +431 -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 +0 -1
- package/dist/dashboard/assets/BannedPage-ChG5svFb.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-BIcWQun7.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-Bf2VelDe.js +0 -1
- 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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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/ToolIcon-K1ckcDKg.js +0 -1
- package/dist/dashboard/assets/ToolIcon-K1ckcDKg.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-BayTTy01.js +0 -9
- package/dist/dashboard/assets/app-BayTTy01.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 +0 -1
- 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 +0 -1
- 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 +0 -1
- 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/mutation-Rr0TIvcj.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/providers/zai-coding-plan.svg +0 -6
- package/dist/dashboard/assets/providers/zai-coding-plan.svg.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/console/cli-tools/injectors/cline.ts +0 -110
- package/src/console/cli-tools/injectors/copilot.ts +0 -108
- package/src/console/cli-tools/injectors/cowork.ts +0 -64
- package/src/console/cli-tools/injectors/deepseek-tui.ts +0 -85
- package/src/console/cli-tools/injectors/droid.ts +0 -96
- package/src/console/cli-tools/injectors/grok-build.ts +0 -70
- package/src/console/cli-tools/injectors/hermes.ts +0 -101
- package/src/console/cli-tools/injectors/jcode.ts +0 -115
- package/src/console/cli-tools/injectors/openclaw.ts +0 -161
- 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/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 };
|
|
@@ -6,12 +6,11 @@ import { ensureV1Suffix } from "./fs-ops";
|
|
|
6
6
|
* CLI Tools type contracts — shared across registry, injectors, service,
|
|
7
7
|
* dashboard, and API routes.
|
|
8
8
|
*
|
|
9
|
-
* Each supported CLI coding agent ([CC], Codex,
|
|
10
|
-
* with static metadata and
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* without clobbering user settings.
|
|
9
|
+
* Each supported CLI coding agent ([CC], Codex, Kilo, OpenCode) has a `ToolDef`
|
|
10
|
+
* with static metadata and a paired `ToolInjector` that reads and writes the
|
|
11
|
+
* tool's config files on the host filesystem. The dashboard picks an API key +
|
|
12
|
+
* models, POSTs to the backend, and the injector merges Cartethyia-specific
|
|
13
|
+
* fields into the tool's config without clobbering user settings.
|
|
15
14
|
*/
|
|
16
15
|
|
|
17
16
|
/**
|
|
@@ -19,13 +18,13 @@ import { ensureV1Suffix } from "./fs-ops";
|
|
|
19
18
|
* sibling project used `openai-chat | openai-responses | anthropic-messages`;
|
|
20
19
|
* Cartethyia's canonical surface vocabulary is the shorter form.
|
|
21
20
|
*/
|
|
22
|
-
|
|
21
|
+
type CliToolSurface = "chat" | "responses" | "messages";
|
|
23
22
|
|
|
24
23
|
/** How the tool's config is managed. */
|
|
25
|
-
|
|
24
|
+
type ConfigType = "env" | "custom";
|
|
26
25
|
|
|
27
26
|
/** A native model slot exposed by a CLI tool. */
|
|
28
|
-
|
|
27
|
+
interface ToolModelDef {
|
|
29
28
|
readonly id: string;
|
|
30
29
|
readonly name: string;
|
|
31
30
|
readonly alias: string;
|
|
@@ -53,6 +52,13 @@ export interface CliMappingInput {
|
|
|
53
52
|
/** The user-facing routing mode for a CLI tool: `remote` routes are resolved by the gateway, `local` routes are baked into the tool's own config file. */
|
|
54
53
|
export type CliMappingMode = "remote" | "local";
|
|
55
54
|
|
|
55
|
+
/**
|
|
56
|
+
* The default runtime SDK package for OpenCode: its native
|
|
57
|
+
* `@opencode/ai/providers/openai-compatible` package (bundled with OpenCode
|
|
58
|
+
* itself, not the AI SDK).
|
|
59
|
+
*/
|
|
60
|
+
export const DEFAULT_SDK: string = "@opencode/ai/providers/openai-compatible";
|
|
61
|
+
|
|
56
62
|
/** Persisted mapping settings for one CLI tool + API key pair. */
|
|
57
63
|
export interface CliMappingSettings {
|
|
58
64
|
readonly toolId: string;
|
|
@@ -63,26 +69,11 @@ export interface CliMappingSettings {
|
|
|
63
69
|
}
|
|
64
70
|
|
|
65
71
|
/** A note shown in the tool card UI. */
|
|
66
|
-
|
|
72
|
+
interface ToolNote {
|
|
67
73
|
readonly type: "info" | "warning" | "error";
|
|
68
74
|
readonly text: string;
|
|
69
75
|
}
|
|
70
76
|
|
|
71
|
-
/** A guide step for guide-only tools. */
|
|
72
|
-
export interface GuideStep {
|
|
73
|
-
readonly step: number;
|
|
74
|
-
readonly title: string;
|
|
75
|
-
readonly desc?: string;
|
|
76
|
-
readonly value?: string;
|
|
77
|
-
readonly type?: "apiKeySelector" | "modelSelector";
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/** A code block for guide-only tools. */
|
|
81
|
-
export interface GuideCodeBlock {
|
|
82
|
-
readonly language: string;
|
|
83
|
-
readonly code: string;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
77
|
/** Static metadata for a CLI tool — consumed by both backend and frontend. */
|
|
87
78
|
export interface ToolDef {
|
|
88
79
|
readonly id: string;
|
|
@@ -95,8 +86,6 @@ export interface ToolDef {
|
|
|
95
86
|
readonly settingsFile?: string;
|
|
96
87
|
readonly docsUrl?: string;
|
|
97
88
|
readonly notes?: readonly ToolNote[];
|
|
98
|
-
readonly guideSteps?: readonly GuideStep[];
|
|
99
|
-
readonly codeBlock?: GuideCodeBlock;
|
|
100
89
|
/**
|
|
101
90
|
* How this tool's slot→route mapping behaves, which also decides whether the
|
|
102
91
|
* tool has a mapping surface at all.
|
|
@@ -109,9 +98,7 @@ export interface ToolDef {
|
|
|
109
98
|
* so a slot has one value (written to the file) rather than a separate
|
|
110
99
|
* target. There is nothing to persist; the model is baked into the file.
|
|
111
100
|
*
|
|
112
|
-
* Absent means the tool exposes no configurable model slots at all
|
|
113
|
-
* guide-only tool). This replaces a separate `mappingSupported` flag that
|
|
114
|
-
* had to be kept consistent with the mode by hand — the mode already says it.
|
|
101
|
+
* Absent means the tool exposes no configurable model slots at all.
|
|
115
102
|
*/
|
|
116
103
|
readonly mappingMode?: CliMappingMode;
|
|
117
104
|
}
|
|
@@ -137,8 +124,6 @@ export type ToolRegistryEntry = Pick<
|
|
|
137
124
|
| "settingsFile"
|
|
138
125
|
| "docsUrl"
|
|
139
126
|
| "notes"
|
|
140
|
-
| "guideSteps"
|
|
141
|
-
| "codeBlock"
|
|
142
127
|
> & { readonly mappingSupported: boolean };
|
|
143
128
|
|
|
144
129
|
/** Runtime status of a CLI tool on the host. */
|
|
@@ -175,6 +160,17 @@ export interface ApplyInput {
|
|
|
175
160
|
readonly mapping?: CliMappingInput;
|
|
176
161
|
/** Enables [CC]'s bypass-permissions (YOLO) mode when explicitly selected. */
|
|
177
162
|
readonly bypassPermissions?: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* The runtime SDK package to write into the tool's config (e.g. OpenCode's
|
|
165
|
+
* `provider.*.npm`). Absent = the tool's default.
|
|
166
|
+
*/
|
|
167
|
+
readonly sdk?: string;
|
|
168
|
+
/**
|
|
169
|
+
* WebSearch provider selection written into OpenCode's config. "carte"
|
|
170
|
+
* routes search through the Cartethyia gateway; "native" (or absent) leaves
|
|
171
|
+
* OpenCode's own provider selection in place.
|
|
172
|
+
*/
|
|
173
|
+
readonly websearch?: string;
|
|
178
174
|
}
|
|
179
175
|
|
|
180
176
|
/** Result of an apply or reset operation. */
|
|
@@ -182,6 +178,8 @@ export interface ApplyResult {
|
|
|
182
178
|
readonly success: boolean;
|
|
183
179
|
readonly settingsPath?: string;
|
|
184
180
|
readonly message: string;
|
|
181
|
+
/** Non-fatal notes for the operator, e.g. preserved pre-existing providers. */
|
|
182
|
+
readonly warnings?: readonly string[];
|
|
185
183
|
}
|
|
186
184
|
|
|
187
185
|
/**
|
|
@@ -195,9 +193,9 @@ export interface ApplyResult {
|
|
|
195
193
|
* persisted routing rows on each `/v1/*` call. Works when the gateway is
|
|
196
194
|
* remote, containerised, or the CLI lives on another machine.
|
|
197
195
|
* - `both` — the tool's config was written and a remote route was recorded.
|
|
198
|
-
* - `none` — nothing ran: the tool has no injectable config
|
|
199
|
-
*
|
|
200
|
-
*
|
|
196
|
+
* - `none` — nothing ran: the tool has no injectable config and the request
|
|
197
|
+
* asked for no remote route. Reported rather than folded into `file`, so
|
|
198
|
+
* the UI never claims a write that did not happen.
|
|
201
199
|
*/
|
|
202
200
|
export type ApplyOutcome = "file" | "remote" | "both" | "none";
|
|
203
201
|
|
|
@@ -210,6 +208,8 @@ export interface ApplyConfigResult {
|
|
|
210
208
|
readonly savedRemoteRoute: boolean;
|
|
211
209
|
readonly settingsPath?: string;
|
|
212
210
|
readonly message: string;
|
|
211
|
+
/** Non-fatal notes for the operator (see `ApplyResult.warnings`). */
|
|
212
|
+
readonly warnings?: readonly string[];
|
|
213
213
|
}
|
|
214
214
|
|
|
215
215
|
/** Result of a download-config operation. */
|
|
@@ -220,8 +220,7 @@ export interface DownloadResult {
|
|
|
220
220
|
}
|
|
221
221
|
|
|
222
222
|
/**
|
|
223
|
-
* Injector contract — one per
|
|
224
|
-
* Guide-only tools share a single GuideInjector that generates config text.
|
|
223
|
+
* Injector contract — one per tool.
|
|
225
224
|
*/
|
|
226
225
|
export interface ToolInjector {
|
|
227
226
|
readonly toolId: string;
|
|
@@ -235,7 +234,7 @@ export interface ToolInjector {
|
|
|
235
234
|
export type AllStatusesResult = Readonly<Record<string, ToolStatus>>;
|
|
236
235
|
|
|
237
236
|
/** Status details extracted from a tool's configuration file(s). */
|
|
238
|
-
|
|
237
|
+
interface StatusDetails {
|
|
239
238
|
readonly configured: boolean;
|
|
240
239
|
readonly currentEndpoint?: string | null | undefined;
|
|
241
240
|
readonly currentApiKeyPrefix?: string | null | undefined;
|
|
@@ -325,8 +324,12 @@ export interface InjectorSpec {
|
|
|
325
324
|
/** Extract status details from existing settings file(s) */
|
|
326
325
|
readonly readStatus: (path: string) => Promise<StatusDetails> | StatusDetails;
|
|
327
326
|
|
|
328
|
-
/**
|
|
329
|
-
|
|
327
|
+
/**
|
|
328
|
+
* Apply Cartethyia configuration to the settings file(s). Return an array of
|
|
329
|
+
* non-fatal warning strings to surface them to the operator (e.g. preserved
|
|
330
|
+
* pre-existing providers).
|
|
331
|
+
*/
|
|
332
|
+
readonly apply: (input: ApplyInput, path: string) => Promise<readonly string[] | void> | readonly string[] | void;
|
|
330
333
|
|
|
331
334
|
/**
|
|
332
335
|
* Reset Cartethyia configuration from settings file(s).
|
|
@@ -449,32 +452,6 @@ export const TOOL_REGISTRY = {
|
|
|
449
452
|
],
|
|
450
453
|
},
|
|
451
454
|
|
|
452
|
-
cline: {
|
|
453
|
-
id: "cline",
|
|
454
|
-
name: "Cline",
|
|
455
|
-
color: "#00D1B2",
|
|
456
|
-
description: "Cline AI Coding Assistant (VS Code)",
|
|
457
|
-
configType: "custom" as const,
|
|
458
|
-
surface: "chat" as const,
|
|
459
|
-
settingsFile: "~/.cline/data/globalState.json",
|
|
460
|
-
defaultModels: [
|
|
461
|
-
{
|
|
462
|
-
id: "claude/claude-sonnet-5",
|
|
463
|
-
name: "Claude Sonnet 5",
|
|
464
|
-
alias: "sonnet",
|
|
465
|
-
roleLabel: "Primary Agent",
|
|
466
|
-
roleKind: "primary",
|
|
467
|
-
},
|
|
468
|
-
{
|
|
469
|
-
id: "claude/claude-opus-4-8",
|
|
470
|
-
name: "Claude Opus",
|
|
471
|
-
alias: "opus",
|
|
472
|
-
roleLabel: "Advanced Agent",
|
|
473
|
-
roleKind: "secondary",
|
|
474
|
-
},
|
|
475
|
-
],
|
|
476
|
-
},
|
|
477
|
-
|
|
478
455
|
opencode: {
|
|
479
456
|
id: "opencode",
|
|
480
457
|
name: "OpenCode",
|
|
@@ -501,86 +478,6 @@ export const TOOL_REGISTRY = {
|
|
|
501
478
|
],
|
|
502
479
|
},
|
|
503
480
|
|
|
504
|
-
droid: {
|
|
505
|
-
id: "droid",
|
|
506
|
-
name: "Factory Droid",
|
|
507
|
-
color: "#00D4FF",
|
|
508
|
-
description: "Factory Droid AI Assistant",
|
|
509
|
-
configType: "custom" as const,
|
|
510
|
-
surface: "chat" as const,
|
|
511
|
-
settingsFile: "~/.factory/settings.json",
|
|
512
|
-
defaultModels: [
|
|
513
|
-
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
514
|
-
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
515
|
-
],
|
|
516
|
-
},
|
|
517
|
-
|
|
518
|
-
hermes: {
|
|
519
|
-
id: "hermes",
|
|
520
|
-
name: "Hermes Agent",
|
|
521
|
-
color: "#8B5CF6",
|
|
522
|
-
description: "Nous Research self-improving AI agent",
|
|
523
|
-
configType: "custom" as const,
|
|
524
|
-
surface: "chat" as const,
|
|
525
|
-
settingsFile: "~/.hermes/config.yaml",
|
|
526
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
527
|
-
},
|
|
528
|
-
|
|
529
|
-
"grok-build": {
|
|
530
|
-
id: "grok-build",
|
|
531
|
-
name: "Grok Build",
|
|
532
|
-
color: "#1DA1F2",
|
|
533
|
-
description: "xAI Grok Build CLI",
|
|
534
|
-
configType: "custom" as const,
|
|
535
|
-
surface: "chat" as const,
|
|
536
|
-
settingsFile: "~/.grok/config.toml",
|
|
537
|
-
defaultModels: [{ id: "grok/grok-4", name: "Grok 4", alias: "grok-4" }],
|
|
538
|
-
},
|
|
539
|
-
|
|
540
|
-
copilot: {
|
|
541
|
-
id: "copilot",
|
|
542
|
-
name: "GitHub Copilot",
|
|
543
|
-
color: "#1F6FEB",
|
|
544
|
-
description: "GitHub Copilot Chat (VS Code chatLanguageModels.json)",
|
|
545
|
-
configType: "custom" as const,
|
|
546
|
-
surface: "chat" as const,
|
|
547
|
-
settingsFile: "Code/User/chatLanguageModels.json",
|
|
548
|
-
defaultModels: [
|
|
549
|
-
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
550
|
-
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
551
|
-
],
|
|
552
|
-
},
|
|
553
|
-
|
|
554
|
-
"deepseek-tui": {
|
|
555
|
-
id: "deepseek-tui",
|
|
556
|
-
name: "DeepSeek TUI",
|
|
557
|
-
color: "#4D6BFE",
|
|
558
|
-
description: "DeepSeek Terminal Coding Agent (Rust TUI)",
|
|
559
|
-
configType: "custom" as const,
|
|
560
|
-
surface: "chat" as const,
|
|
561
|
-
settingsFile: "~/.deepseek/config.toml",
|
|
562
|
-
defaultModels: [
|
|
563
|
-
{ id: "deepseek/deepseek-chat", name: "DeepSeek Chat", alias: "deepseek-chat" },
|
|
564
|
-
{
|
|
565
|
-
id: "deepseek/deepseek-reasoner",
|
|
566
|
-
name: "DeepSeek Reasoner",
|
|
567
|
-
alias: "deepseek-reasoner",
|
|
568
|
-
},
|
|
569
|
-
],
|
|
570
|
-
},
|
|
571
|
-
|
|
572
|
-
jcode: {
|
|
573
|
-
id: "jcode",
|
|
574
|
-
name: "jcode",
|
|
575
|
-
color: "#FF6B35",
|
|
576
|
-
description: "High-performance Rust-based coding agent harness",
|
|
577
|
-
configType: "custom" as const,
|
|
578
|
-
surface: "chat" as const,
|
|
579
|
-
settingsFile: "~/.jcode/config.toml",
|
|
580
|
-
docsUrl: "https://github.com/1jehuang/jcode",
|
|
581
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
582
|
-
},
|
|
583
|
-
|
|
584
481
|
kilo: {
|
|
585
482
|
id: "kilo",
|
|
586
483
|
name: "Kilo Code",
|
|
@@ -591,159 +488,6 @@ export const TOOL_REGISTRY = {
|
|
|
591
488
|
settingsFile: "~/.local/share/kilo/auth.json",
|
|
592
489
|
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
593
490
|
},
|
|
594
|
-
|
|
595
|
-
openclaw: {
|
|
596
|
-
id: "openclaw",
|
|
597
|
-
name: "Open Claw",
|
|
598
|
-
color: "#FF6B35",
|
|
599
|
-
description: "Open Claw AI Assistant",
|
|
600
|
-
configType: "custom" as const,
|
|
601
|
-
surface: "messages" as const,
|
|
602
|
-
settingsFile: "~/.openclaw/openclaw.json",
|
|
603
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
604
|
-
},
|
|
605
|
-
|
|
606
|
-
cowork: {
|
|
607
|
-
id: "cowork",
|
|
608
|
-
name: "Claude Cowork",
|
|
609
|
-
color: "#D97757",
|
|
610
|
-
description: "Claude Desktop Cowork (third-party inference)",
|
|
611
|
-
configType: "custom" as const,
|
|
612
|
-
surface: "messages" as const,
|
|
613
|
-
settingsFile: "Claude/configLibrary/_meta.json",
|
|
614
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
615
|
-
},
|
|
616
|
-
// ── Guide-only tools (no fs injection — show steps + downloadable config) ──
|
|
617
|
-
roo: {
|
|
618
|
-
id: "roo",
|
|
619
|
-
name: "Roo",
|
|
620
|
-
color: "#FF6B6B",
|
|
621
|
-
description: "Roo AI Assistant",
|
|
622
|
-
configType: "guide" as const,
|
|
623
|
-
surface: "chat" as const,
|
|
624
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
625
|
-
guideSteps: [
|
|
626
|
-
{ step: 1, title: "Open Settings", desc: "Go to Roo Settings panel" },
|
|
627
|
-
{ step: 2, title: "Select Provider", desc: "Choose API Provider → Ollama" },
|
|
628
|
-
{ step: 3, title: "Base URL", value: "{{baseUrl}}" },
|
|
629
|
-
{ step: 4, title: "API Key", type: "apiKeySelector" },
|
|
630
|
-
{ step: 5, title: "Select Model", type: "modelSelector" },
|
|
631
|
-
],
|
|
632
|
-
},
|
|
633
|
-
|
|
634
|
-
continue: {
|
|
635
|
-
id: "continue",
|
|
636
|
-
name: "Continue",
|
|
637
|
-
color: "#7C3AED",
|
|
638
|
-
description: "Continue AI Assistant",
|
|
639
|
-
configType: "guide" as const,
|
|
640
|
-
surface: "chat" as const,
|
|
641
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
642
|
-
guideSteps: [
|
|
643
|
-
{ step: 1, title: "Open Config", desc: "Open Continue configuration file" },
|
|
644
|
-
{ step: 2, title: "API Key", type: "apiKeySelector" },
|
|
645
|
-
{ step: 3, title: "Select Model", type: "modelSelector" },
|
|
646
|
-
{
|
|
647
|
-
step: 4,
|
|
648
|
-
title: "Add Model Config",
|
|
649
|
-
desc: "Add the following configuration to your models array:",
|
|
650
|
-
},
|
|
651
|
-
],
|
|
652
|
-
codeBlock: {
|
|
653
|
-
language: "json",
|
|
654
|
-
code: `{
|
|
655
|
-
"apiBase": "{{baseUrl}}",
|
|
656
|
-
"title": "{{model}}",
|
|
657
|
-
"model": "{{model}}",
|
|
658
|
-
"provider": "openai",
|
|
659
|
-
"apiKey": "{{apiKey}}"
|
|
660
|
-
}`,
|
|
661
|
-
},
|
|
662
|
-
},
|
|
663
|
-
|
|
664
|
-
amp: {
|
|
665
|
-
id: "amp",
|
|
666
|
-
name: "Amp CLI",
|
|
667
|
-
color: "#F97316",
|
|
668
|
-
description: "Sourcegraph Amp coding assistant CLI",
|
|
669
|
-
configType: "guide" as const,
|
|
670
|
-
surface: "chat" as const,
|
|
671
|
-
docsUrl: "/docs?section=cli-tools&tool=amp",
|
|
672
|
-
defaultModels: [{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" }],
|
|
673
|
-
notes: [
|
|
674
|
-
{
|
|
675
|
-
type: "info",
|
|
676
|
-
text: "Use Cartethyia model aliases to keep Amp shorthand mappings stable across provider updates.",
|
|
677
|
-
},
|
|
678
|
-
],
|
|
679
|
-
guideSteps: [
|
|
680
|
-
{
|
|
681
|
-
step: 1,
|
|
682
|
-
title: "Install Amp",
|
|
683
|
-
desc: "Install the Amp CLI using the package manager supported by your environment.",
|
|
684
|
-
},
|
|
685
|
-
{ step: 2, title: "API Key", type: "apiKeySelector" },
|
|
686
|
-
{ step: 3, title: "Base URL", value: "{{baseUrl}}" },
|
|
687
|
-
{ step: 4, title: "Select Model", type: "modelSelector" },
|
|
688
|
-
{
|
|
689
|
-
step: 5,
|
|
690
|
-
title: "Add Shorthands",
|
|
691
|
-
desc: "Map Amp shorthand names to Cartethyia aliases in your local config.",
|
|
692
|
-
},
|
|
693
|
-
],
|
|
694
|
-
codeBlock: {
|
|
695
|
-
language: "bash",
|
|
696
|
-
code: `export OPENAI_API_KEY="{{apiKey}}"
|
|
697
|
-
export OPENAI_BASE_URL="{{baseUrl}}"
|
|
698
|
-
amp --model "{{model}}"`,
|
|
699
|
-
},
|
|
700
|
-
},
|
|
701
|
-
|
|
702
|
-
qwen: {
|
|
703
|
-
id: "qwen",
|
|
704
|
-
name: "Qwen Code",
|
|
705
|
-
color: "#10B981",
|
|
706
|
-
description: "Alibaba Qwen Code CLI — OpenAI-compatible via Cartethyia",
|
|
707
|
-
configType: "guide" as const,
|
|
708
|
-
surface: "chat" as const,
|
|
709
|
-
docsUrl: "https://qwenlm.github.io/qwen-code-docs/en/users/configuration/model-providers/",
|
|
710
|
-
defaultModels: [
|
|
711
|
-
{ id: "claude/claude-sonnet-5", name: "Claude Sonnet 5", alias: "sonnet" },
|
|
712
|
-
{ id: "gpt-5.6-sol", name: "GPT-5.6 Sol", alias: "gpt-5.6-sol" },
|
|
713
|
-
],
|
|
714
|
-
notes: [
|
|
715
|
-
{
|
|
716
|
-
type: "warning",
|
|
717
|
-
text: "Config path: Linux/macOS ~/.qwen/settings.json - Windows %USERPROFILE%\\.qwen\\settings.json",
|
|
718
|
-
},
|
|
719
|
-
],
|
|
720
|
-
guideSteps: [
|
|
721
|
-
{ step: 1, title: "Install Qwen Code", desc: "npm install -g @qwen-code/qwen-code" },
|
|
722
|
-
{ step: 2, title: "API Key", type: "apiKeySelector" },
|
|
723
|
-
{ step: 3, title: "Base URL", value: "{{baseUrl}}" },
|
|
724
|
-
{ step: 4, title: "Select Model", type: "modelSelector" },
|
|
725
|
-
{
|
|
726
|
-
step: 5,
|
|
727
|
-
title: "Save Config",
|
|
728
|
-
desc: "Copy the JSON below to your ~/.qwen/settings.json file.",
|
|
729
|
-
},
|
|
730
|
-
],
|
|
731
|
-
codeBlock: {
|
|
732
|
-
language: "json",
|
|
733
|
-
code: `{
|
|
734
|
-
"security": {
|
|
735
|
-
"auth": {
|
|
736
|
-
"selectedType": "openai",
|
|
737
|
-
"apiKey": "{{apiKey}}",
|
|
738
|
-
"baseUrl": "{{baseUrl}}"
|
|
739
|
-
}
|
|
740
|
-
},
|
|
741
|
-
"model": {
|
|
742
|
-
"name": "{{model}}"
|
|
743
|
-
}
|
|
744
|
-
}`,
|
|
745
|
-
},
|
|
746
|
-
},
|
|
747
491
|
} satisfies Record<string, ToolDef>;
|
|
748
492
|
|
|
749
493
|
export type ToolId = keyof typeof TOOL_REGISTRY;
|