cartethyia 2.7.5 → 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 +4 -1
- package/README.md +1 -1
- 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-D5rol2j2.js → ConsoleLogPage-KRYjHZsX.js} +1 -1
- 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-B5nZvmf0.js → InjectSystemPromptPanel-d5v3K_Yc.js} +245 -2
- 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-DnQPSIA8.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-5SnUSy3j.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-BJtRZ4qD.js → SettingsPage-BW4AKj2H.js} +1 -1
- 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-BfAb5-o_.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-BNzeZ2Vk.js → UsagePage-B7M7LvMM.js} +13 -13
- 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-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-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-BAACA727.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-FQlj0HUT.js → index-Ko4dLRnV.js} +2 -2
- package/dist/dashboard/assets/index-Ko4dLRnV.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-BHqpd-bg.js} +2 -2
- package/dist/dashboard/assets/select-BHqpd-bg.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/lite-sqlite3/0042_add_telemetry_degenerate_stop.sql +12 -0
- package/package.json +1 -1
- package/src/boot/dependencies.ts +10 -2
- package/src/config/providers.ts +13 -7
- package/src/config/spec.ts +18 -11
- package/src/config/usage.ts +27 -0
- package/src/console/api-keys/routes.ts +19 -23
- 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 +28 -5
- 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/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 +7 -0
- package/src/persistence/schema.ts +8 -0
- package/src/persistence/stores/api-key-store.ts +19 -1
- package/src/protocol/dsml.ts +5 -76
- package/src/providers/adapters/compatible-adapter.ts +29 -1
- package/src/providers/default-registry.ts +12 -2
- package/src/providers/integrations/antigravity/antigravity-protocol.ts +88 -14
- package/src/providers/integrations/antigravity/antigravity-quota.ts +18 -6
- package/src/providers/integrations/antigravity/antigravity.ts +20 -11
- 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/qoder-catalog.ts +9 -3
- package/src/providers/integrations/qoder/qoder.ts +147 -88
- 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-usage.ts +15 -49
- 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/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/router.ts +7 -0
- 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 +0 -1
- 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.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
|
@@ -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
|
-
|