cartethyia 2.7.5 → 2.7.7
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 +8 -3
- package/README.md +26 -2
- package/dist/dashboard/assets/BannedPage-B05aF8Dg.js +1 -0
- package/dist/dashboard/assets/BannedPage-B05aF8Dg.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js +3 -0
- package/dist/dashboard/assets/CliToolDetailPage-CLUhmjUy.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js +1 -0
- package/dist/dashboard/assets/CliToolsPage-CQmrqqrk.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js +1 -0
- package/dist/dashboard/assets/CombosPage-CHG_1Wr3.js.gz +0 -0
- package/dist/dashboard/assets/{ConsoleLogPage-D5rol2j2.js → ConsoleLogPage-DPgbklad.js} +1 -1
- package/dist/dashboard/assets/ConsoleLogPage-DPgbklad.js.gz +0 -0
- package/dist/dashboard/assets/{CustomizationPage-BKj_r0rp.js → CustomizationPage-pnfAqr_-.js} +1 -1
- package/dist/dashboard/assets/CustomizationPage-pnfAqr_-.js.gz +0 -0
- package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js +1 -0
- package/dist/dashboard/assets/HealthEventsModal-DGJuU2A6.js.gz +0 -0
- package/dist/dashboard/assets/{InjectSystemPromptPanel-B5nZvmf0.js → InjectSystemPromptPanel-C-e2AMz6.js} +245 -2
- package/dist/dashboard/assets/InjectSystemPromptPanel-C-e2AMz6.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-J8wPbmfT.js +1 -0
- package/dist/dashboard/assets/LoginPage-J8wPbmfT.js.gz +0 -0
- package/dist/dashboard/assets/{ModelPicker-DnQPSIA8.js → ModelPicker-C6WlpU5E.js} +1 -1
- package/dist/dashboard/assets/ModelPicker-C6WlpU5E.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js +1 -0
- package/dist/dashboard/assets/OverviewPage-BSQnF2Lp.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.js +7 -0
- package/dist/dashboard/assets/ProviderDetailPage-DK_e0FJz.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-D_a3r6Gc.js +1 -0
- package/dist/dashboard/assets/ProvidersPage-D_a3r6Gc.js.gz +0 -0
- package/dist/dashboard/assets/{ProxyPage-5SnUSy3j.js → ProxyPage-BBTRBAQ3.js} +1 -1
- package/dist/dashboard/assets/ProxyPage-BBTRBAQ3.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js +1 -0
- package/dist/dashboard/assets/QuotaPage-B2WqMSG1.js.gz +0 -0
- package/dist/dashboard/assets/{SettingsPage-BJtRZ4qD.js → SettingsPage-D7xp5Ij_.js} +1 -1
- package/dist/dashboard/assets/SettingsPage-D7xp5Ij_.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-LND6_Ss7.js +1 -0
- package/dist/dashboard/assets/SetupPage-LND6_Ss7.js.gz +0 -0
- package/dist/dashboard/assets/{StudioPage-BfAb5-o_.js → StudioPage-BzNnm6Bi.js} +4 -4
- package/dist/dashboard/assets/StudioPage-BzNnm6Bi.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-BNzeZ2Vk.js → UsagePage-C1TbL24N.js} +13 -13
- package/dist/dashboard/assets/UsagePage-C1TbL24N.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-C0K-c4eo.js → assert-CidQVoNo.js} +1 -1
- package/dist/dashboard/assets/assert-CidQVoNo.js.gz +0 -0
- package/dist/dashboard/assets/{badge-DfbhQU4k.js → badge-BaX2GTrn.js} +1 -1
- package/dist/dashboard/assets/badge-BaX2GTrn.js.gz +0 -0
- package/dist/dashboard/assets/{banner-BllT4LcF.js → banner-DFH4Bkte.js} +1 -1
- package/dist/dashboard/assets/banner-DFH4Bkte.js.gz +0 -0
- package/dist/dashboard/assets/{card-CtkX66Wd.js → card-CxDw0lK6.js} +1 -1
- package/dist/dashboard/assets/card-CxDw0lK6.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-CQXVMn4P.js → cli-tools-Bwv5-zGZ.js} +1 -1
- package/dist/dashboard/assets/cli-tools-Bwv5-zGZ.js.gz +0 -0
- package/dist/dashboard/assets/{clipboard-button-BQqBQd2n.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-BrTEZ8zu.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-Dmx7gBiN.js +1 -0
- package/dist/dashboard/assets/entry-Dmx7gBiN.js.gz +0 -0
- package/dist/dashboard/assets/entry-vqGb8yVz.js +4 -0
- package/dist/dashboard/assets/entry-vqGb8yVz.js.gz +0 -0
- package/dist/dashboard/assets/formatters-DP-5E01-.js +1 -0
- package/dist/dashboard/assets/formatters-DP-5E01-.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-FQlj0HUT.js → index-D36vCZht.js} +2 -2
- package/dist/dashboard/assets/index-D36vCZht.js.gz +0 -0
- package/dist/dashboard/assets/{inline-C4gU5iOL.js → inline-CHJQwxLa.js} +1 -1
- package/dist/dashboard/assets/inline-CHJQwxLa.js.gz +0 -0
- package/dist/dashboard/assets/{input-BHHX_Tmm.js → input-BlmlizVV.js} +1 -1
- package/dist/dashboard/assets/input-BlmlizVV.js.gz +0 -0
- package/dist/dashboard/assets/{layout-CajrYUnD.js → layout-Bz93I-yE.js} +1 -1
- package/dist/dashboard/assets/layout-Bz93I-yE.js.gz +0 -0
- package/dist/dashboard/assets/{list-row-Bx2I7XUe.js → list-row-Ml16KCfu.js} +1 -1
- package/dist/dashboard/assets/list-row-Ml16KCfu.js.gz +0 -0
- package/dist/dashboard/assets/{live-DNNqRbj2.js → live-7_QpnYGu.js} +1 -1
- 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-C5UBACrJ.js → network-CuMDaTzT.js} +1 -1
- 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-Xsi9Qx04.js → pagination-B5aOoweZ.js} +1 -1
- 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-in0f_IfK.js → routing-fnCsxgNO.js} +1 -1
- package/dist/dashboard/assets/routing-fnCsxgNO.js.gz +0 -0
- package/dist/dashboard/assets/{select-BLULNqTp.js → select-C9Ssle9b.js} +2 -2
- package/dist/dashboard/assets/select-C9Ssle9b.js.gz +0 -0
- package/dist/dashboard/assets/{settings-CcGczj6I.js → settings-BxslsErn.js} +1 -1
- package/dist/dashboard/assets/settings-BxslsErn.js.gz +0 -0
- package/dist/dashboard/assets/{stack-D2lIR0tg.js → stack-j7cXjgYX.js} +1 -1
- package/dist/dashboard/assets/stack-j7cXjgYX.js.gz +0 -0
- package/dist/dashboard/assets/{state-DTARjfiW.js → state-DHmEnLa2.js} +1 -1
- package/dist/dashboard/assets/state-DHmEnLa2.js.gz +0 -0
- package/dist/dashboard/assets/{switch-c0oPSnqW.js → switch-DmZcyTIC.js} +1 -1
- package/dist/dashboard/assets/switch-DmZcyTIC.js.gz +0 -0
- package/dist/dashboard/assets/{useMutation-m8WGNPrz.js → useMutation-CbCP4w1o.js} +1 -1
- package/dist/dashboard/assets/useMutation-CbCP4w1o.js.gz +0 -0
- package/dist/dashboard/index.html +2 -2
- package/dist/dashboard/index.html.gz +0 -0
- package/dist/dashboard/precompressed-assets.json +57 -57
- package/migrations/full-postgres/0042_add_telemetry_degenerate_stop.sql +14 -0
- package/migrations/full-postgres/0043_add_provider_custom_user_agent.sql +14 -0
- package/migrations/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
- package/migrations/lite-sqlite3/0043_add_provider_custom_user_agent.sql +10 -0
- package/package.json +3 -1
- package/src/boot/dependencies.ts +10 -2
- package/src/config/providers.ts +13 -7
- package/src/config/security.ts +1 -1
- package/src/config/spec.ts +31 -17
- package/src/config/usage.ts +27 -0
- package/src/console/api-keys/routes.ts +19 -23
- package/src/console/cli-tools/cartethyia-websearch-plugin.ts +186 -0
- package/src/console/cli-tools/contracts.ts +39 -295
- 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 +6 -6
- package/src/console/cli-tools/injectors/driver.ts +8 -105
- package/src/console/cli-tools/injectors/kilo.ts +146 -21
- package/src/console/cli-tools/injectors/opencode.ts +68 -17
- package/src/console/cli-tools/routes.ts +6 -0
- package/src/console/cli-tools/service.ts +7 -6
- package/src/console/observability/contracts.ts +6 -0
- package/src/console/observability/store.ts +3 -0
- package/src/console/providers/catalog/contracts.ts +4 -0
- package/src/console/providers/catalog/routes.ts +1 -0
- package/src/console/providers/detail/routes.ts +8 -0
- package/src/console/providers/detail/store.ts +4 -0
- package/src/console/quota/account-quota-tenant.ts +74 -0
- package/src/console/share/share-stats.ts +7 -9
- package/src/observability/event-log.ts +7 -0
- package/src/observability/event-query.ts +2 -0
- package/src/observability/telemetry-buffer.ts +9 -1
- package/src/persistence/boot.ts +13 -4
- package/src/persistence/schema.ts +15 -1
- package/src/persistence/stores/api-key-store.ts +19 -1
- package/src/protocol/canonical-model.ts +7 -0
- package/src/protocol/dsml.ts +5 -76
- package/src/protocol/request/gemini.ts +20 -1
- package/src/protocol/tool-identity.ts +15 -1
- package/src/providers/adapters/compatible-adapter.ts +29 -1
- package/src/providers/default-registry.ts +20 -4
- package/src/providers/discovery/discovery-types.ts +18 -0
- package/src/providers/discovery/probe-phases.ts +45 -0
- package/src/providers/discovery/probing-service.ts +41 -6
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +108 -16
- package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
- package/src/providers/integrations/antigravity/antigravity.ts +44 -11
- package/src/providers/integrations/codex/codex.ts +28 -1
- package/src/providers/integrations/cursor/cursor.ts +2 -3
- package/src/providers/integrations/github/github-discovery.ts +15 -2
- package/src/providers/integrations/github/github-oauth.ts +178 -9
- package/src/providers/integrations/github/github.ts +95 -14
- package/src/providers/integrations/kiro/kiro.ts +1 -2
- package/src/providers/integrations/qoder/chat-proto.ts +328 -0
- package/src/providers/integrations/qoder/claim-qoder-credits.ts +258 -0
- package/src/providers/integrations/qoder/qoder-adapter.ts +275 -0
- package/src/providers/integrations/qoder/qoder-auth.ts +201 -0
- package/src/providers/integrations/qoder/qoder-body.ts +78 -0
- package/src/providers/integrations/qoder/qoder-catalog.ts +14 -4
- package/src/providers/integrations/qoder/qoder-chat.ts +514 -0
- package/src/providers/integrations/qoder/qoder-cosy.ts +162 -0
- package/src/providers/integrations/qoder/qoder-grpc.ts +667 -0
- package/src/providers/integrations/qoder/qoder-ide.ts +584 -0
- package/src/providers/integrations/qoder/qoder-oauth.ts +4 -4
- package/src/providers/integrations/qoder/qoder-quota.ts +1 -1
- package/src/providers/integrations/qoder/qoder-realm.ts +40 -4
- package/src/providers/integrations/qoder/qoder-types.ts +51 -0
- package/src/providers/integrations/qoder/qoder-umid.ts +123 -8
- package/src/providers/integrations/qoder/qoder.ts +147 -1830
- package/src/providers/integrations/trae/trae.ts +2 -2
- package/src/providers/operations/account-error-classification.ts +67 -17
- package/src/providers/operations/byok-wire-profile.ts +19 -15
- package/src/providers/provider-contracts.ts +7 -0
- package/src/providers/provider-usage.ts +24 -55
- package/src/security/abuse.ts +5 -5
- package/src/security/admission/service.ts +11 -4
- package/src/security/api-key-auth.ts +5 -3
- package/src/transport/dispatch/attempt-finalize.ts +69 -21
- package/src/transport/dispatch/attempt-loop.ts +22 -0
- package/src/transport/dispatch/upstream.ts +4 -2
- package/src/transport/failure-policy.ts +15 -1
- package/src/transport/guards/error-lifecycle.ts +4 -0
- package/src/transport/request/state.ts +6 -0
- package/src/transport/routing/route-catalog.ts +8 -0
- package/src/transport/routing/route-model.ts +4 -0
- package/src/transport/routing/router.ts +8 -110
- package/src/transport/surface/reasoning-summary.ts +9 -14
- package/src/transport/vision-handoff.ts +83 -28
- package/dist/dashboard/assets/BannedPage-Cj15GsMp.js +0 -1
- package/dist/dashboard/assets/BannedPage-Cj15GsMp.js.gz +0 -0
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js +0 -1
- package/dist/dashboard/assets/ClaimGiftsButton-D83pBJ6J.js.gz +0 -0
- package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js +0 -1
- package/dist/dashboard/assets/CliToolDetailPage-DZKmVuJN.js.gz +0 -0
- package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js +0 -1
- package/dist/dashboard/assets/CliToolsPage-BIccZmeL.js.gz +0 -0
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js +0 -1
- package/dist/dashboard/assets/CombosPage-DEEKkYD-.js.gz +0 -0
- package/dist/dashboard/assets/ConsoleLogPage-D5rol2j2.js.gz +0 -0
- package/dist/dashboard/assets/CustomizationPage-BKj_r0rp.js.gz +0 -0
- package/dist/dashboard/assets/InjectSystemPromptPanel-B5nZvmf0.js.gz +0 -0
- package/dist/dashboard/assets/LoginPage-DkXb6dx-.js +0 -1
- package/dist/dashboard/assets/LoginPage-DkXb6dx-.js.gz +0 -0
- package/dist/dashboard/assets/ModelPicker-DnQPSIA8.js.gz +0 -0
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js +0 -1
- package/dist/dashboard/assets/OverviewPage-Ci2wQKUz.js.gz +0 -0
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js +0 -5
- package/dist/dashboard/assets/ProviderDetailPage-odlgYrOg.js.gz +0 -0
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js +0 -1
- package/dist/dashboard/assets/ProviderIcon-EfeloBn4.js.gz +0 -0
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js +0 -1
- package/dist/dashboard/assets/ProvidersPage-CqFBQEB8.js.gz +0 -0
- package/dist/dashboard/assets/ProxyPage-5SnUSy3j.js.gz +0 -0
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js +0 -1
- package/dist/dashboard/assets/QuotaPage-CmnMDzhP.js.gz +0 -0
- package/dist/dashboard/assets/SettingsPage-BJtRZ4qD.js.gz +0 -0
- package/dist/dashboard/assets/SetupPage-WTa0sktC.js +0 -1
- package/dist/dashboard/assets/SetupPage-WTa0sktC.js.gz +0 -0
- package/dist/dashboard/assets/StudioPage-BfAb5-o_.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-BNzeZ2Vk.js.gz +0 -0
- package/dist/dashboard/assets/api-keys-l29JROPv.js +0 -1
- package/dist/dashboard/assets/api-keys-l29JROPv.js.gz +0 -0
- package/dist/dashboard/assets/app--PJWq8_C.css +0 -2
- package/dist/dashboard/assets/app--PJWq8_C.css.gz +0 -0
- package/dist/dashboard/assets/app-Bgd3zANQ.js +0 -9
- package/dist/dashboard/assets/app-Bgd3zANQ.js.gz +0 -0
- package/dist/dashboard/assets/assert-C0K-c4eo.js.gz +0 -0
- package/dist/dashboard/assets/badge-DfbhQU4k.js.gz +0 -0
- package/dist/dashboard/assets/banner-BllT4LcF.js.gz +0 -0
- package/dist/dashboard/assets/card-CtkX66Wd.js.gz +0 -0
- package/dist/dashboard/assets/cli-tools-CQXVMn4P.js.gz +0 -0
- package/dist/dashboard/assets/clipboard-button-BQqBQd2n.js.gz +0 -0
- package/dist/dashboard/assets/dialog-BEK7KP0H.js +0 -1
- package/dist/dashboard/assets/dialog-BEK7KP0H.js.gz +0 -0
- package/dist/dashboard/assets/drawer-BrTEZ8zu.js.gz +0 -0
- package/dist/dashboard/assets/entry-CHWxbS56.js +0 -1
- package/dist/dashboard/assets/entry-CHWxbS56.js.gz +0 -0
- package/dist/dashboard/assets/entry-EBHJ3DrE.js +0 -1
- package/dist/dashboard/assets/entry-EBHJ3DrE.js.gz +0 -0
- package/dist/dashboard/assets/entry-LCS85hiq.js +0 -4
- package/dist/dashboard/assets/entry-LCS85hiq.js.gz +0 -0
- package/dist/dashboard/assets/formatters-BAACA727.js +0 -1
- package/dist/dashboard/assets/formatters-BAACA727.js.gz +0 -0
- package/dist/dashboard/assets/github-badge-YSCE4UC2.js +0 -1
- package/dist/dashboard/assets/github-badge-YSCE4UC2.js.gz +0 -0
- package/dist/dashboard/assets/index-FQlj0HUT.js.gz +0 -0
- package/dist/dashboard/assets/inline-C4gU5iOL.js.gz +0 -0
- package/dist/dashboard/assets/input-BHHX_Tmm.js.gz +0 -0
- package/dist/dashboard/assets/layout-CajrYUnD.js.gz +0 -0
- package/dist/dashboard/assets/list-row-Bx2I7XUe.js.gz +0 -0
- package/dist/dashboard/assets/live-DNNqRbj2.js.gz +0 -0
- package/dist/dashboard/assets/mutation-Rr0TIvcj.js.gz +0 -0
- package/dist/dashboard/assets/network-C5UBACrJ.js.gz +0 -0
- package/dist/dashboard/assets/numbers-CUWAZK4J.js +0 -2
- package/dist/dashboard/assets/numbers-CUWAZK4J.js.gz +0 -0
- package/dist/dashboard/assets/pagination-Xsi9Qx04.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-DvQbD_sr.js +0 -1
- package/dist/dashboard/assets/quota-DvQbD_sr.js.gz +0 -0
- package/dist/dashboard/assets/routing-in0f_IfK.js.gz +0 -0
- package/dist/dashboard/assets/select-BLULNqTp.js.gz +0 -0
- package/dist/dashboard/assets/settings-CcGczj6I.js.gz +0 -0
- package/dist/dashboard/assets/stack-D2lIR0tg.js.gz +0 -0
- package/dist/dashboard/assets/state-DTARjfiW.js.gz +0 -0
- package/dist/dashboard/assets/switch-c0oPSnqW.js.gz +0 -0
- package/dist/dashboard/assets/useMutation-m8WGNPrz.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/providers/integrations/qoder/qoder-text-tools.ts +0 -277
|
@@ -1,96 +0,0 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { jsonDownload } from "../contracts";
|
|
3
|
-
import { ensureV1Suffix, homeDir, readJsonFile, writeJsonFile } from "../fs-ops";
|
|
4
|
-
import type { InjectorSpec } from "../contracts";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// Factory Droid injector spec.
|
|
8
|
-
const DROID_PREFIX = "custom:Cartethyia";
|
|
9
|
-
|
|
10
|
-
interface DroidCustomModel {
|
|
11
|
-
id: string;
|
|
12
|
-
name: string;
|
|
13
|
-
baseUrl: string;
|
|
14
|
-
apiKey: string;
|
|
15
|
-
provider: string;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
interface DroidSettings {
|
|
19
|
-
customModels?: DroidCustomModel[];
|
|
20
|
-
model?: string;
|
|
21
|
-
[k: string]: unknown;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
function isCartethyiaDroidModel(m: { id?: string } | null | undefined): boolean {
|
|
25
|
-
return typeof m?.id === "string" && m.id.startsWith(DROID_PREFIX);
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
export const droidSpec: InjectorSpec = {
|
|
29
|
-
toolId: "droid",
|
|
30
|
-
displayName: "Factory Droid",
|
|
31
|
-
binary: "droid",
|
|
32
|
-
resolvePath: () => `${homeDir()}/.factory/settings.json`,
|
|
33
|
-
resolveDir: () => `${homeDir()}/.factory`,
|
|
34
|
-
|
|
35
|
-
async readStatus(path) {
|
|
36
|
-
const settings = (await readJsonFile(path)) as DroidSettings | null;
|
|
37
|
-
const ours = (settings?.customModels ?? []).filter(isCartethyiaDroidModel);
|
|
38
|
-
if (ours.length === 0) {
|
|
39
|
-
return { configured: false, currentEndpoint: null, rawApiKey: null, currentModels: null };
|
|
40
|
-
}
|
|
41
|
-
const first = ours[0]!;
|
|
42
|
-
return {
|
|
43
|
-
configured: true,
|
|
44
|
-
currentEndpoint: first.baseUrl ?? null,
|
|
45
|
-
rawApiKey: first.apiKey,
|
|
46
|
-
currentModels: ours.map((m) => m.name),
|
|
47
|
-
};
|
|
48
|
-
},
|
|
49
|
-
|
|
50
|
-
async apply(input, path) {
|
|
51
|
-
const existing = ((await readJsonFile(path)) as DroidSettings | null) ?? {};
|
|
52
|
-
const settings: DroidSettings = { ...existing };
|
|
53
|
-
const kept = (settings.customModels ?? []).filter((m) => !isCartethyiaDroidModel(m));
|
|
54
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
55
|
-
const apiKey = input.apiKey || "your_api_key";
|
|
56
|
-
const added = input.modelIds.map((m): DroidCustomModel => ({
|
|
57
|
-
id: `${DROID_PREFIX}:${m}`,
|
|
58
|
-
name: m,
|
|
59
|
-
baseUrl,
|
|
60
|
-
apiKey,
|
|
61
|
-
provider: "openai",
|
|
62
|
-
}));
|
|
63
|
-
settings.customModels = [...kept, ...added];
|
|
64
|
-
if (input.activeModel) settings.model = input.activeModel;
|
|
65
|
-
await writeJsonFile(path, settings);
|
|
66
|
-
},
|
|
67
|
-
|
|
68
|
-
async reset(path) {
|
|
69
|
-
const settings = (await readJsonFile(path)) as DroidSettings | null;
|
|
70
|
-
if (!settings) return false;
|
|
71
|
-
if (settings.customModels) {
|
|
72
|
-
settings.customModels = settings.customModels.filter((m) => !isCartethyiaDroidModel(m));
|
|
73
|
-
if (settings.customModels.length === 0) delete settings.customModels;
|
|
74
|
-
}
|
|
75
|
-
await writeJsonFile(path, settings);
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
download(input) {
|
|
79
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
80
|
-
const apiKey = input.apiKey || "your_api_key";
|
|
81
|
-
const customModels = input.modelIds.map((m): DroidCustomModel => ({
|
|
82
|
-
id: `${DROID_PREFIX}:${m}`,
|
|
83
|
-
name: m,
|
|
84
|
-
baseUrl,
|
|
85
|
-
apiKey,
|
|
86
|
-
provider: "openai",
|
|
87
|
-
}));
|
|
88
|
-
return jsonDownload({ customModels }, { filename: "settings.json" });
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
messages: {
|
|
92
|
-
applied: "Factory Droid settings applied",
|
|
93
|
-
reset: "Cartethyia settings removed from Factory Droid",
|
|
94
|
-
},
|
|
95
|
-
};
|
|
96
|
-
|
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { resolveApplyTarget, textDownload } from "../contracts";
|
|
3
|
-
import { checkBinaryInstalled, homeDir, readTextFile, textGet, textHas, textRemove, textUpsert, writeTextFile } from "../fs-ops";
|
|
4
|
-
import type { InjectorSpec } from "../contracts";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// Grok Build injector spec.
|
|
8
|
-
function grokModelSectionBody(model: string, baseUrl: string, apiKey: string): string {
|
|
9
|
-
const lines = [`default = "${model}"`, `base_url = "${baseUrl}"`, `provider = "custom"`];
|
|
10
|
-
if (apiKey) lines.push(`api_key = "${apiKey}"`);
|
|
11
|
-
return lines.join("\n");
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export const grokBuildSpec: InjectorSpec = {
|
|
15
|
-
toolId: "grok-build",
|
|
16
|
-
displayName: "Grok Build",
|
|
17
|
-
checkInstalled: async () => {
|
|
18
|
-
return checkBinaryInstalled("grok");
|
|
19
|
-
},
|
|
20
|
-
resolvePath: () => `${homeDir()}/.grok/config.toml`,
|
|
21
|
-
resolveDir: () => `${homeDir()}/.grok`,
|
|
22
|
-
|
|
23
|
-
async readStatus(path) {
|
|
24
|
-
const text = await readTextFile(path);
|
|
25
|
-
if (!text) {
|
|
26
|
-
return { configured: false, currentEndpoint: null, rawApiKey: null, currentModels: null };
|
|
27
|
-
}
|
|
28
|
-
const baseUrl = textGet(text, { kind: "flat", key: "base_url" });
|
|
29
|
-
const model = textGet(text, { kind: "flat", key: "default" });
|
|
30
|
-
const apiKey = textGet(text, { kind: "flat", key: "api_key" });
|
|
31
|
-
const configured = textHas(text, { kind: "section", section: "model" }) && baseUrl !== null;
|
|
32
|
-
return {
|
|
33
|
-
configured,
|
|
34
|
-
currentEndpoint: baseUrl,
|
|
35
|
-
rawApiKey: apiKey,
|
|
36
|
-
currentModels: model ? [model] : null,
|
|
37
|
-
};
|
|
38
|
-
},
|
|
39
|
-
|
|
40
|
-
async apply(input, path) {
|
|
41
|
-
const { model, baseUrl } = resolveApplyTarget(input);
|
|
42
|
-
let text = (await readTextFile(path)) ?? "";
|
|
43
|
-
text = textUpsert(
|
|
44
|
-
text,
|
|
45
|
-
{ kind: "section", section: "model" },
|
|
46
|
-
grokModelSectionBody(model, baseUrl, input.apiKey),
|
|
47
|
-
);
|
|
48
|
-
await writeTextFile(path, text);
|
|
49
|
-
},
|
|
50
|
-
|
|
51
|
-
async reset(path) {
|
|
52
|
-
let text = await readTextFile(path);
|
|
53
|
-
if (!text) return false;
|
|
54
|
-
text = textRemove(text, { kind: "section", section: "model" });
|
|
55
|
-
await writeTextFile(path, text);
|
|
56
|
-
},
|
|
57
|
-
|
|
58
|
-
download(input) {
|
|
59
|
-
const { model, baseUrl } = resolveApplyTarget(input);
|
|
60
|
-
const body = grokModelSectionBody(model, baseUrl, input.apiKey);
|
|
61
|
-
return textDownload(`[model]\n${body}\n`, { filename: "grok-config.toml" });
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
messages: {
|
|
65
|
-
applied: "Grok Build settings applied",
|
|
66
|
-
reset: "Cartethyia settings removed from Grok Build",
|
|
67
|
-
resetMissing: "No config file to reset",
|
|
68
|
-
},
|
|
69
|
-
};
|
|
70
|
-
|
|
@@ -1,101 +0,0 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { resolveApplyTarget, textDownload } from "../contracts";
|
|
3
|
-
import { homeDir, isLocalEndpoint, readTextFile, textGet, textRemove, textUpsert, writeTextFile } from "../fs-ops";
|
|
4
|
-
import type { InjectorSpec } from "../contracts";
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
// Hermes Agent injector spec.
|
|
8
|
-
const HERMES_MODEL_BLOCK_RE = /^model:[ \t]*\r?\n((?:[ \t]+.*\r?\n?|[ \t]*\r?\n)*)/m;
|
|
9
|
-
|
|
10
|
-
function parseHermesModelBlock(
|
|
11
|
-
yaml: string,
|
|
12
|
-
): { default: string | null; provider: string | null; base_url: string | null } | null {
|
|
13
|
-
const match = yaml.match(HERMES_MODEL_BLOCK_RE);
|
|
14
|
-
if (!match) return null;
|
|
15
|
-
const body = match[1] ?? "";
|
|
16
|
-
const get = (key: string): string | null => {
|
|
17
|
-
const m = body.match(new RegExp(`^[ \\t]+${key}:[ \\t]*["']?([^"'\\r\\n]+)["']?`, "m"));
|
|
18
|
-
return m ? (m[1] ?? "").trim() : null;
|
|
19
|
-
};
|
|
20
|
-
return { default: get("default"), provider: get("provider"), base_url: get("base_url") };
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
const hermesEnvPath = () => `${homeDir()}/.hermes/.env`;
|
|
24
|
-
|
|
25
|
-
export const hermesSpec: InjectorSpec = {
|
|
26
|
-
toolId: "hermes",
|
|
27
|
-
displayName: "Hermes Agent",
|
|
28
|
-
binary: "hermes",
|
|
29
|
-
resolvePath: () => `${homeDir()}/.hermes/config.yaml`,
|
|
30
|
-
resolveDir: () => `${homeDir()}/.hermes`,
|
|
31
|
-
|
|
32
|
-
async readStatus(path) {
|
|
33
|
-
const text = await readTextFile(path);
|
|
34
|
-
if (!text) {
|
|
35
|
-
return { configured: false, currentEndpoint: null, rawApiKey: null, currentModels: null };
|
|
36
|
-
}
|
|
37
|
-
const model = parseHermesModelBlock(text);
|
|
38
|
-
const baseUrl = model?.base_url ?? null;
|
|
39
|
-
const envText = await readTextFile(hermesEnvPath());
|
|
40
|
-
const apiKey = envText
|
|
41
|
-
? textGet(envText, { kind: "flat", key: "OPENAI_API_KEY", format: "env" })
|
|
42
|
-
: null;
|
|
43
|
-
const configured = model?.provider === "custom" && isLocalEndpoint(baseUrl);
|
|
44
|
-
return {
|
|
45
|
-
configured,
|
|
46
|
-
currentEndpoint: baseUrl,
|
|
47
|
-
rawApiKey: apiKey,
|
|
48
|
-
currentModels: model?.default ? [model.default] : null,
|
|
49
|
-
};
|
|
50
|
-
},
|
|
51
|
-
|
|
52
|
-
async apply(input, path) {
|
|
53
|
-
const { model, baseUrl } = resolveApplyTarget(input);
|
|
54
|
-
const block = `model:\n default: "${model}"\n provider: "custom"\n base_url: "${baseUrl}"\n`;
|
|
55
|
-
|
|
56
|
-
let yaml = (await readTextFile(path)) ?? "";
|
|
57
|
-
yaml = HERMES_MODEL_BLOCK_RE.test(yaml)
|
|
58
|
-
? yaml.replace(HERMES_MODEL_BLOCK_RE, block)
|
|
59
|
-
: yaml.length > 0
|
|
60
|
-
? `${block}\n${yaml}`
|
|
61
|
-
: block;
|
|
62
|
-
await writeTextFile(path, yaml);
|
|
63
|
-
|
|
64
|
-
let envText = (await readTextFile(hermesEnvPath())) ?? "";
|
|
65
|
-
envText = textUpsert(
|
|
66
|
-
envText,
|
|
67
|
-
{ kind: "flat", key: "OPENAI_API_KEY", format: "env" },
|
|
68
|
-
input.apiKey,
|
|
69
|
-
);
|
|
70
|
-
await writeTextFile(hermesEnvPath(), envText);
|
|
71
|
-
},
|
|
72
|
-
|
|
73
|
-
async reset(path) {
|
|
74
|
-
const yaml = await readTextFile(path);
|
|
75
|
-
if (yaml) {
|
|
76
|
-
await writeTextFile(path, yaml.replace(HERMES_MODEL_BLOCK_RE, "").replace(/^\n+/, ""));
|
|
77
|
-
}
|
|
78
|
-
const envText = await readTextFile(hermesEnvPath());
|
|
79
|
-
if (envText) {
|
|
80
|
-
await writeTextFile(
|
|
81
|
-
hermesEnvPath(),
|
|
82
|
-
textRemove(envText, { kind: "flat", key: "OPENAI_API_KEY", format: "env" }),
|
|
83
|
-
);
|
|
84
|
-
}
|
|
85
|
-
},
|
|
86
|
-
|
|
87
|
-
download(input) {
|
|
88
|
-
const { model, baseUrl } = resolveApplyTarget(input);
|
|
89
|
-
const yaml = `model:\n default: "${model}"\n provider: "custom"\n base_url: "${baseUrl}"\n`;
|
|
90
|
-
const envFile = `OPENAI_API_KEY=${input.apiKey}\n`;
|
|
91
|
-
return textDownload(`# ~/.hermes/config.yaml\n${yaml}\n# ~/.hermes/.env\n${envFile}`, {
|
|
92
|
-
filename: "hermes-config.txt",
|
|
93
|
-
});
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
messages: {
|
|
97
|
-
applied: "Hermes Agent settings applied",
|
|
98
|
-
reset: "Cartethyia settings removed from Hermes Agent",
|
|
99
|
-
},
|
|
100
|
-
};
|
|
101
|
-
|
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { ensureDir, ensureV1Suffix, homeDir, isLocalEndpoint, join, readTextFile, textGet, textHas, textRemove, textUpsert, writeTextFile } from "../fs-ops";
|
|
3
|
-
import type { InjectorSpec } from "../contracts";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// Jcode injector spec.
|
|
7
|
-
function jcodeEnvFileDir(): string {
|
|
8
|
-
return join(process.env.XDG_CONFIG_HOME ?? join(homeDir(), ".config"), "jcode");
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
function jcodeEnvFilePath(): string {
|
|
12
|
-
return join(jcodeEnvFileDir(), "provider-cartethyia.env");
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const jcodeSpec: InjectorSpec = {
|
|
16
|
-
toolId: "jcode",
|
|
17
|
-
displayName: "jcode",
|
|
18
|
-
binary: "jcode",
|
|
19
|
-
resolvePath: () => join(homeDir(), ".jcode", "config.toml"),
|
|
20
|
-
resolveDir: () => join(homeDir(), ".jcode"),
|
|
21
|
-
|
|
22
|
-
async readStatus(path) {
|
|
23
|
-
const text = await readTextFile(path);
|
|
24
|
-
if (!text) {
|
|
25
|
-
return { configured: false, currentEndpoint: null, rawApiKey: null, currentModels: null };
|
|
26
|
-
}
|
|
27
|
-
const configured = textHas(text, { kind: "section", section: "providers.cartethyia" });
|
|
28
|
-
// `base_url` is written inside `[providers.cartethyia]` by `apply` below, so
|
|
29
|
-
// it must be read from that section. Reading it as a root key returned null
|
|
30
|
-
// for a config this injector had just written, so a configured tool
|
|
31
|
-
// reported no endpoint.
|
|
32
|
-
const baseUrl = textGet(text, {
|
|
33
|
-
kind: "sectionKey",
|
|
34
|
-
section: "providers.cartethyia",
|
|
35
|
-
key: "base_url",
|
|
36
|
-
});
|
|
37
|
-
const envText = await readTextFile(jcodeEnvFilePath());
|
|
38
|
-
const apiKey = envText
|
|
39
|
-
? textGet(envText, { kind: "flat", key: "OPENAI_API_KEY", format: "env" })
|
|
40
|
-
: null;
|
|
41
|
-
return {
|
|
42
|
-
configured,
|
|
43
|
-
currentEndpoint: isLocalEndpoint(baseUrl) ? baseUrl : null,
|
|
44
|
-
rawApiKey: apiKey,
|
|
45
|
-
currentModels: null,
|
|
46
|
-
};
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
async apply(input, path) {
|
|
50
|
-
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
51
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
52
|
-
|
|
53
|
-
let text = (await readTextFile(path)) ?? "";
|
|
54
|
-
text = textUpsert(
|
|
55
|
-
text,
|
|
56
|
-
{ kind: "section", section: "providers.cartethyia" },
|
|
57
|
-
[
|
|
58
|
-
` type = "openai"`,
|
|
59
|
-
` base_url = "${baseUrl}"`,
|
|
60
|
-
` env_file = "provider-cartethyia.env"`,
|
|
61
|
-
` model = "${model}"`,
|
|
62
|
-
].join("\n"),
|
|
63
|
-
);
|
|
64
|
-
await writeTextFile(path, text);
|
|
65
|
-
|
|
66
|
-
await ensureDir(jcodeEnvFileDir());
|
|
67
|
-
let envText = (await readTextFile(jcodeEnvFilePath())) ?? "";
|
|
68
|
-
envText = textUpsert(
|
|
69
|
-
envText,
|
|
70
|
-
{ kind: "flat", key: "OPENAI_API_KEY", format: "env" },
|
|
71
|
-
input.apiKey,
|
|
72
|
-
);
|
|
73
|
-
await writeTextFile(jcodeEnvFilePath(), envText);
|
|
74
|
-
},
|
|
75
|
-
|
|
76
|
-
async reset(path) {
|
|
77
|
-
let text = await readTextFile(path);
|
|
78
|
-
if (text) {
|
|
79
|
-
text = textRemove(text, { kind: "section", section: "providers.cartethyia" });
|
|
80
|
-
await writeTextFile(path, text);
|
|
81
|
-
}
|
|
82
|
-
const envText = await readTextFile(jcodeEnvFilePath());
|
|
83
|
-
if (envText) {
|
|
84
|
-
await writeTextFile(
|
|
85
|
-
jcodeEnvFilePath(),
|
|
86
|
-
textRemove(envText, { kind: "flat", key: "OPENAI_API_KEY", format: "env" }),
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
download(input) {
|
|
92
|
-
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
93
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
94
|
-
const toml = [
|
|
95
|
-
`[providers.cartethyia]`,
|
|
96
|
-
` type = "openai"`,
|
|
97
|
-
` base_url = "${baseUrl}"`,
|
|
98
|
-
` env_file = "provider-cartethyia.env"`,
|
|
99
|
-
` model = "${model}"`,
|
|
100
|
-
"",
|
|
101
|
-
].join("\n");
|
|
102
|
-
const envFile = `OPENAI_API_KEY=${input.apiKey}\n`;
|
|
103
|
-
return {
|
|
104
|
-
content: `# config.toml\n${toml}\n# provider-cartethyia.env\n${envFile}`,
|
|
105
|
-
filename: "jcode-config.txt",
|
|
106
|
-
mimeType: "text/plain",
|
|
107
|
-
};
|
|
108
|
-
},
|
|
109
|
-
|
|
110
|
-
messages: {
|
|
111
|
-
applied: "jcode settings applied",
|
|
112
|
-
reset: "Cartethyia settings removed from jcode",
|
|
113
|
-
},
|
|
114
|
-
};
|
|
115
|
-
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import type {} from "../contracts";
|
|
2
|
-
import { ensureV1Suffix, homeDir, join, readJsonFile, writeJsonFile } from "../fs-ops";
|
|
3
|
-
import type { InjectorSpec } from "../contracts";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
// Open Claw injector spec.
|
|
7
|
-
function resolveOpenclawModel(m: unknown): string {
|
|
8
|
-
if (typeof m === "string") return m;
|
|
9
|
-
if (m !== null && typeof m === "object" && "primary" in m) {
|
|
10
|
-
return (m as { primary: string }).primary;
|
|
11
|
-
}
|
|
12
|
-
return "";
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export const openclawSpec: InjectorSpec = {
|
|
16
|
-
toolId: "openclaw",
|
|
17
|
-
displayName: "Open Claw",
|
|
18
|
-
binary: "openclaw",
|
|
19
|
-
resolvePath: () => join(homeDir(), ".openclaw", "openclaw.json"),
|
|
20
|
-
resolveDir: () => join(homeDir(), ".openclaw"),
|
|
21
|
-
|
|
22
|
-
async readStatus(path) {
|
|
23
|
-
const settings = (await readJsonFile(path)) as {
|
|
24
|
-
models?: {
|
|
25
|
-
providers?: Record<
|
|
26
|
-
string,
|
|
27
|
-
{ baseUrl?: string; apiKey?: string; models?: Array<{ id: string }> }
|
|
28
|
-
>;
|
|
29
|
-
};
|
|
30
|
-
agents?: { defaults?: { model?: { primary?: string } | string } };
|
|
31
|
-
} | null;
|
|
32
|
-
if (!settings) {
|
|
33
|
-
return { configured: false, currentEndpoint: null, rawApiKey: null, currentModels: null };
|
|
34
|
-
}
|
|
35
|
-
const provider = settings.models?.providers?.cartethyia;
|
|
36
|
-
const primaryModel = resolveOpenclawModel(settings.agents?.defaults?.model);
|
|
37
|
-
return {
|
|
38
|
-
configured: !!provider,
|
|
39
|
-
currentEndpoint: provider?.baseUrl ?? null,
|
|
40
|
-
rawApiKey: provider?.apiKey ?? null,
|
|
41
|
-
currentModels: primaryModel ? [primaryModel] : (provider?.models?.map((m) => m.id) ?? null),
|
|
42
|
-
};
|
|
43
|
-
},
|
|
44
|
-
|
|
45
|
-
async apply(input, path) {
|
|
46
|
-
const settings = ((await readJsonFile(path)) as Record<string, unknown> | null) ?? {};
|
|
47
|
-
|
|
48
|
-
if (typeof settings.models !== "object" || settings.models === null) settings.models = {};
|
|
49
|
-
const models = settings.models as Record<string, unknown>;
|
|
50
|
-
if (typeof models.providers !== "object" || models.providers === null) models.providers = {};
|
|
51
|
-
const providers = models.providers as Record<string, unknown>;
|
|
52
|
-
|
|
53
|
-
if (typeof settings.agents !== "object" || settings.agents === null) settings.agents = {};
|
|
54
|
-
const agents = settings.agents as Record<string, unknown>;
|
|
55
|
-
if (typeof agents.defaults !== "object" || agents.defaults === null) agents.defaults = {};
|
|
56
|
-
const defaults = agents.defaults as Record<string, unknown>;
|
|
57
|
-
if (typeof defaults.model !== "object" || defaults.model === null) defaults.model = {};
|
|
58
|
-
if (typeof defaults.models !== "object" || defaults.models === null) defaults.models = {};
|
|
59
|
-
|
|
60
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
61
|
-
const allModels = [
|
|
62
|
-
...new Set([...input.modelIds, ...(input.activeModel ? [input.activeModel] : [])]),
|
|
63
|
-
];
|
|
64
|
-
|
|
65
|
-
const defaultModels = defaults.models as Record<string, unknown>;
|
|
66
|
-
for (const key of Object.keys(defaultModels)) {
|
|
67
|
-
if (key.startsWith("cartethyia/")) delete defaultModels[key];
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
(defaults.model as { primary: string }).primary =
|
|
71
|
-
`cartethyia/${input.activeModel ?? input.modelIds[0] ?? ""}`;
|
|
72
|
-
|
|
73
|
-
for (const m of allModels) defaultModels[`cartethyia/${m}`] = {};
|
|
74
|
-
|
|
75
|
-
providers.cartethyia = {
|
|
76
|
-
baseUrl,
|
|
77
|
-
apiKey: input.apiKey,
|
|
78
|
-
api: "openai-completions",
|
|
79
|
-
models: allModels.map((m) => ({ id: m, name: m.split("/").pop() ?? m })),
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
if (Array.isArray(agents.list)) {
|
|
83
|
-
agents.list = (agents.list as Array<Record<string, unknown>>).map((agent) => {
|
|
84
|
-
if (resolveOpenclawModel(agent.model).startsWith("cartethyia/")) {
|
|
85
|
-
const { model: _m, ...rest } = agent;
|
|
86
|
-
void _m;
|
|
87
|
-
return rest;
|
|
88
|
-
}
|
|
89
|
-
return agent;
|
|
90
|
-
});
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
await writeJsonFile(path, settings);
|
|
94
|
-
},
|
|
95
|
-
|
|
96
|
-
async reset(path) {
|
|
97
|
-
const settings = (await readJsonFile(path)) as {
|
|
98
|
-
models?: { providers?: Record<string, unknown> };
|
|
99
|
-
agents?: {
|
|
100
|
-
defaults?: { model?: { primary?: string } | string; models?: Record<string, unknown> };
|
|
101
|
-
};
|
|
102
|
-
} | null;
|
|
103
|
-
if (!settings) return false;
|
|
104
|
-
|
|
105
|
-
delete settings.models?.providers?.cartethyia;
|
|
106
|
-
|
|
107
|
-
const defaultModels = settings.agents?.defaults?.models;
|
|
108
|
-
if (defaultModels) {
|
|
109
|
-
for (const key of Object.keys(defaultModels)) {
|
|
110
|
-
if (key.startsWith("cartethyia/")) delete defaultModels[key];
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
const primary = resolveOpenclawModel(settings.agents?.defaults?.model);
|
|
115
|
-
if (primary.startsWith("cartethyia/")) {
|
|
116
|
-
if (settings.agents?.defaults?.model && typeof settings.agents.defaults.model === "object") {
|
|
117
|
-
(settings.agents.defaults.model as { primary: string }).primary = "";
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
await writeJsonFile(path, settings);
|
|
122
|
-
},
|
|
123
|
-
|
|
124
|
-
download(input) {
|
|
125
|
-
const baseUrl = ensureV1Suffix(input.endpoint);
|
|
126
|
-
const model = input.activeModel ?? input.modelIds[0] ?? "";
|
|
127
|
-
const allModels = [...new Set([...input.modelIds, model])];
|
|
128
|
-
return {
|
|
129
|
-
content: JSON.stringify(
|
|
130
|
-
{
|
|
131
|
-
models: {
|
|
132
|
-
providers: {
|
|
133
|
-
cartethyia: {
|
|
134
|
-
baseUrl,
|
|
135
|
-
apiKey: input.apiKey,
|
|
136
|
-
api: "openai-completions",
|
|
137
|
-
models: allModels.map((m) => ({ id: m, name: m.split("/").pop() ?? m })),
|
|
138
|
-
},
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
agents: {
|
|
142
|
-
defaults: {
|
|
143
|
-
model: { primary: `cartethyia/${model}` },
|
|
144
|
-
models: Object.fromEntries(allModels.map((m) => [`cartethyia/${m}`, {}])),
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
},
|
|
148
|
-
null,
|
|
149
|
-
2,
|
|
150
|
-
),
|
|
151
|
-
filename: "openclaw.json",
|
|
152
|
-
mimeType: "application/json",
|
|
153
|
-
};
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
messages: {
|
|
157
|
-
applied: "Open Claw settings applied",
|
|
158
|
-
reset: "Cartethyia settings removed from Open Claw",
|
|
159
|
-
},
|
|
160
|
-
};
|
|
161
|
-
|