nextclaw 0.48.2 → 0.49.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/app/index.js +1 -1
- package/dist/{nextclaw-cli-app-C1L77sjJ.js → nextclaw-cli-app-CjtgVEdo.js} +300 -3
- package/dist/nextclaw-cli-app-CjtgVEdo.js.map +1 -0
- package/package.json +17 -17
- package/resources/USAGE.md +33 -85
- package/ui-dist/.vite/manifest.json +538 -525
- package/ui-dist/.vite/manifest.json.gz +0 -0
- package/ui-dist/assets/{account-panel-BxMlLXYH.js → account-panel-UvHFa8Kl.js} +1 -1
- package/ui-dist/assets/account-panel-UvHFa8Kl.js.gz +0 -0
- package/ui-dist/assets/{api-Utt-xzrT.js → api-Dffeij78.js} +5 -5
- package/ui-dist/assets/api-Dffeij78.js.gz +0 -0
- package/ui-dist/assets/{app-data-DYXDL6X2.js → app-data-DzaIMy4D.js} +1 -1
- package/ui-dist/assets/app-data-DzaIMy4D.js.gz +0 -0
- package/ui-dist/assets/app-presenter-provider-O2tUKKGf.js +109 -0
- package/ui-dist/assets/app-presenter-provider-O2tUKKGf.js.gz +0 -0
- package/ui-dist/assets/{appearance-settings-page-BfYznAK5.js → appearance-settings-page-D8cWniw-.js} +1 -1
- package/ui-dist/assets/appearance-settings-page-D8cWniw-.js.gz +0 -0
- package/ui-dist/assets/{book-open-DDW_3XpM.js → book-open-xqEj1OLE.js} +1 -1
- package/ui-dist/assets/{boxes-DwJeuK_h.js → boxes-D6uPnkGo.js} +1 -1
- package/ui-dist/assets/{card-IevY2nm-.js → card-CS8su2Zh.js} +1 -1
- package/ui-dist/assets/card-CS8su2Zh.js.gz +0 -0
- package/ui-dist/assets/{channels-list-page-DitnqbMR.js → channels-list-page-B_fYP1Pn.js} +1 -1
- package/ui-dist/assets/channels-list-page-B_fYP1Pn.js.gz +0 -0
- package/ui-dist/assets/{chevron-down-An7Km-t4.js → chevron-down-BL-yMYcX.js} +1 -1
- package/ui-dist/assets/{circle-alert-CDXqELuo.js → circle-alert-lSa3LRvS.js} +1 -1
- package/ui-dist/assets/{circle-dashed-CapXEpiV.js → circle-dashed-CU3yApvP.js} +1 -1
- package/ui-dist/assets/{client-B0krol7A.js → client-BtGBwLTs.js} +1 -1
- package/ui-dist/assets/{config-split-page-BtnkqWVp.js → config-split-page-6hHiiapl.js} +1 -1
- package/ui-dist/assets/config-split-page-6hHiiapl.js.gz +0 -0
- package/ui-dist/assets/{confirm-dialog-DFt4jpN7.js → confirm-dialog-ClT6iaj8.js} +1 -1
- package/ui-dist/assets/confirm-dialog-ClT6iaj8.js.gz +0 -0
- package/ui-dist/assets/{createLucideIcon-BTHK0Ot9.js → createLucideIcon-BNKf0_kc.js} +1 -1
- package/ui-dist/assets/{desktop-capabilities-page-CCf14WId.js → desktop-capabilities-page-CB5pniTx.js} +1 -1
- package/ui-dist/assets/desktop-capabilities-page-CB5pniTx.js.gz +0 -0
- package/ui-dist/assets/{desktop-update-config-DVoVgfFi.js → desktop-update-config-OuQV73gg.js} +1 -1
- package/ui-dist/assets/desktop-update-config-OuQV73gg.js.gz +0 -0
- package/ui-dist/assets/{dialog-BFN_1DBH.js → dialog-Xe73hpQz.js} +1 -1
- package/ui-dist/assets/dialog-Xe73hpQz.js.gz +0 -0
- package/ui-dist/assets/{dist-Bc9hOVNN.js → dist-BiIcnf9j.js} +1 -1
- package/ui-dist/assets/dist-BiIcnf9j.js.gz +0 -0
- package/ui-dist/assets/{dist-CEhIDAnr.js → dist-C5I0v8Qn.js} +1 -1
- package/ui-dist/assets/dist-C5I0v8Qn.js.gz +0 -0
- package/ui-dist/assets/{dist-hkVPP1th.js → dist-czPa8xFO.js} +1 -1
- package/ui-dist/assets/dist-czPa8xFO.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BFkslEzY.js +1 -0
- package/ui-dist/assets/{doc-browser-BNUxmwD6.js → doc-browser-Cu58uiEg.js} +1 -1
- package/ui-dist/assets/doc-browser-Cu58uiEg.js.gz +0 -0
- package/ui-dist/assets/{doc-browser-context-C4yQrKrH.js → doc-browser-context-CekJxJFm.js} +1 -1
- package/ui-dist/assets/doc-browser-context-CekJxJFm.js.gz +0 -0
- package/ui-dist/assets/{ellipsis-BRI6ROeu.js → ellipsis-C5YXdOUx.js} +1 -1
- package/ui-dist/assets/{es2015-MOCbM0Eu.js → es2015-cuwbYI-l.js} +1 -1
- package/ui-dist/assets/es2015-cuwbYI-l.js.gz +0 -0
- package/ui-dist/assets/{extensions-DxUBMtHW.js → extensions-B5r-0jCq.js} +1 -1
- package/ui-dist/assets/extensions-B5r-0jCq.js.gz +0 -0
- package/ui-dist/assets/{eye-cnynUDGt.js → eye-C84inPcV.js} +1 -1
- package/ui-dist/assets/{form-actions-gQ0JEUwB.js → form-actions-AIdXOoCL.js} +1 -1
- package/ui-dist/assets/{i18n-B9yXA8KO.js → i18n-CPjq_hQX.js} +2 -2
- package/ui-dist/assets/i18n-CPjq_hQX.js.gz +0 -0
- package/ui-dist/assets/{i18n-provider-BYBJua91.js → i18n-provider-BYO9AhFy.js} +1 -1
- package/ui-dist/assets/keyboard-shortcuts-settings-page-1efEkGwq.js +1 -0
- package/ui-dist/assets/loader-circle-K1BDdHR5.js +1 -0
- package/ui-dist/assets/{login-page-CqrHhzaN.js → login-page-DBqkVTVD.js} +1 -1
- package/ui-dist/assets/login-page-DBqkVTVD.js.gz +0 -0
- package/ui-dist/assets/login-page-DjcRQLQe.js +1 -0
- package/ui-dist/assets/{logo-badge-Cr03YceJ.js → logo-badge-C-5-zim6.js} +1 -1
- package/ui-dist/assets/logo-badge-C-5-zim6.js.gz +0 -0
- package/ui-dist/assets/main-CLwCjK9U.css +1 -0
- package/ui-dist/assets/main-CLwCjK9U.css.gz +0 -0
- package/ui-dist/assets/main-CQ6GUYdX.js +2 -0
- package/ui-dist/assets/main-CQ6GUYdX.js.gz +0 -0
- package/ui-dist/assets/main-i18n-catalog.config-QB4DfJRJ.js +1 -0
- package/ui-dist/assets/main-i18n-catalog.config-QB4DfJRJ.js.gz +0 -0
- package/ui-dist/assets/{mcp-marketplace-page-CifiVgFD.js → mcp-marketplace-page-CWAxBNaS.js} +1 -1
- package/ui-dist/assets/mcp-marketplace-page-CWAxBNaS.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-Ct090ceA.js +1 -0
- package/ui-dist/assets/{model-config-page-C6jVNbSj.js → model-config-page-DBcuZyRC.js} +1 -1
- package/ui-dist/assets/model-config-page-DBcuZyRC.js.gz +0 -0
- package/ui-dist/assets/{navigation-link-kbCLRSr_.js → navigation-link-BAQjgx2F.js} +1 -1
- package/ui-dist/assets/navigation-link-BAQjgx2F.js.gz +0 -0
- package/ui-dist/assets/panel-app-i18n-catalog.config-CQFujXqt.js +1 -0
- package/ui-dist/assets/panel-app-maumVhbl.js +1 -0
- package/ui-dist/assets/panel-app-maumVhbl.js.gz +0 -0
- package/ui-dist/assets/{panelStandalone-DMBnYyTw.js → panelStandalone-BGA1s7JG.js} +2 -2
- package/ui-dist/assets/panelStandalone-BGA1s7JG.js.gz +0 -0
- package/ui-dist/assets/plus-LA8-jpxP.js +1 -0
- package/ui-dist/assets/{popover-XVDgjxcl.js → popover-NkrFlWHp.js} +1 -1
- package/ui-dist/assets/popover-NkrFlWHp.js.gz +0 -0
- package/ui-dist/assets/{privacy-settings-page-BN27MBVA.js → privacy-settings-page-DVC-aq1v.js} +1 -1
- package/ui-dist/assets/privacy-settings-page-DVC-aq1v.js.gz +0 -0
- package/ui-dist/assets/projects-Cq0E3c7N.js +1 -0
- package/ui-dist/assets/projects-Cq0E3c7N.js.gz +0 -0
- package/ui-dist/assets/{provider-scoped-model-input-BGZMCThn.js → provider-scoped-model-input-BGdZMWWa.js} +1 -1
- package/ui-dist/assets/provider-scoped-model-input-BGdZMWWa.js.gz +0 -0
- package/ui-dist/assets/{providers-config-page-D5aBwbOD.js → providers-config-page-B-IhHl6x.js} +1 -1
- package/ui-dist/assets/providers-config-page-B-IhHl6x.js.gz +0 -0
- package/ui-dist/assets/{puzzle-D5Dhacmb.js → puzzle-D6gulz7u.js} +1 -1
- package/ui-dist/assets/{pwa-ClQK56Qe.js → pwa-C3kR9mdy.js} +1 -1
- package/ui-dist/assets/pwa-C3kR9mdy.js.gz +0 -0
- package/ui-dist/assets/{refresh-cw-Bw5BY7vp.js → refresh-cw-h9Xq3LY3.js} +1 -1
- package/ui-dist/assets/remote-Cnawibbg.js +1 -0
- package/ui-dist/assets/{rotate-cw-BksCLAeE.js → rotate-cw-B6xm41Wn.js} +1 -1
- package/ui-dist/assets/runtime-config-page-LmrB2q65.js +1 -0
- package/ui-dist/assets/runtime-config-page-LmrB2q65.js.gz +0 -0
- package/ui-dist/assets/{save-CVi8VWzb.js → save-fff_WpY2.js} +1 -1
- package/ui-dist/assets/{search-DN-f7IIC.js → search-CUe41wjm.js} +1 -1
- package/ui-dist/assets/{search-config-page-BmuZTVxs.js → search-config-page-BIXmv5FY.js} +1 -1
- package/ui-dist/assets/search-config-page-BIXmv5FY.js.gz +0 -0
- package/ui-dist/assets/{secrets-config-page-NPHpg9sb.js → secrets-config-page-DU3fadrq.js} +1 -1
- package/ui-dist/assets/secrets-config-page-DU3fadrq.js.gz +0 -0
- package/ui-dist/assets/security-config-9s0i0I4N.js +1 -0
- package/ui-dist/assets/{select-CmDTqk2C.js → select-CG5YWnwe.js} +1 -1
- package/ui-dist/assets/select-CG5YWnwe.js.gz +0 -0
- package/ui-dist/assets/{service-apps-panel-BYGJ9_pO.js → service-apps-panel-Bshf3Wmq.js} +1 -1
- package/ui-dist/assets/service-apps-panel-Bshf3Wmq.js.gz +0 -0
- package/ui-dist/assets/{settings-2-B62YtZon.js → settings-2-CE3ELQyk.js} +1 -1
- package/ui-dist/assets/skeleton-BL9h32W7.js +1 -0
- package/ui-dist/assets/{tabs-Bk_mG7ql.js → tabs-BuE0qKMh.js} +1 -1
- package/ui-dist/assets/tabs-BuE0qKMh.js.gz +0 -0
- package/ui-dist/assets/{tag-chip-DgqKlI5D.js → tag-chip-gAH1IOsZ.js} +1 -1
- package/ui-dist/assets/{theme-provider-CeBY2pyu.js → theme-provider-DE7m9jvf.js} +1 -1
- package/ui-dist/assets/theme-provider-DE7m9jvf.js.gz +0 -0
- package/ui-dist/assets/{tooltip-CgGbBdYf.js → tooltip-DYcuWhuP.js} +1 -1
- package/ui-dist/assets/tooltip-DYcuWhuP.js.gz +0 -0
- package/ui-dist/assets/{trash-2-CVOev8yc.js → trash-2-BPPYt2NV.js} +1 -1
- package/ui-dist/assets/{use-config-b2DN67gs.js → use-config-Cyiw06-j.js} +1 -1
- package/ui-dist/assets/use-config-Cyiw06-j.js.gz +0 -0
- package/ui-dist/assets/{use-desktop-capabilities-B3tLU1yl.js → use-desktop-capabilities-OKG96v4y.js} +1 -1
- package/ui-dist/assets/use-desktop-capabilities-OKG96v4y.js.gz +0 -0
- package/ui-dist/assets/{use-panel-app-scroll-restoration-BekzoX6z.js → use-panel-app-scroll-restoration-DsV1IJx-.js} +1 -1
- package/ui-dist/assets/use-panel-app-scroll-restoration-DsV1IJx-.js.gz +0 -0
- package/ui-dist/assets/{use-viewport-layout-CUA3jQsA.js → use-viewport-layout-BS18drMT.js} +1 -1
- package/ui-dist/assets/use-viewport-layout-BS18drMT.js.gz +0 -0
- package/ui-dist/assets/{utils-UBHTdG5Q.js → utils-CBZPzC_b.js} +1 -1
- package/ui-dist/assets/{utils-UBHTdG5Q.js.gz → utils-CBZPzC_b.js.gz} +0 -0
- package/ui-dist/assets/x-DdXOqLnX.js +1 -0
- package/ui-dist/index.html +50 -50
- package/ui-dist/index.html.gz +0 -0
- package/ui-dist/panel-standalone.html +15 -15
- package/ui-dist/panel-standalone.html.gz +0 -0
- package/dist/nextclaw-cli-app-C1L77sjJ.js.map +0 -1
- package/ui-dist/assets/account-panel-BxMlLXYH.js.gz +0 -0
- package/ui-dist/assets/api-Utt-xzrT.js.gz +0 -0
- package/ui-dist/assets/app-data-DYXDL6X2.js.gz +0 -0
- package/ui-dist/assets/app-presenter-provider-CLsFiXvV.js +0 -109
- package/ui-dist/assets/app-presenter-provider-CLsFiXvV.js.gz +0 -0
- package/ui-dist/assets/appearance-settings-page-BfYznAK5.js.gz +0 -0
- package/ui-dist/assets/card-IevY2nm-.js.gz +0 -0
- package/ui-dist/assets/channels-list-page-DitnqbMR.js.gz +0 -0
- package/ui-dist/assets/config-split-page-BtnkqWVp.js.gz +0 -0
- package/ui-dist/assets/confirm-dialog-DFt4jpN7.js.gz +0 -0
- package/ui-dist/assets/desktop-capabilities-page-CCf14WId.js.gz +0 -0
- package/ui-dist/assets/desktop-update-config-DVoVgfFi.js.gz +0 -0
- package/ui-dist/assets/dialog-BFN_1DBH.js.gz +0 -0
- package/ui-dist/assets/dist-Bc9hOVNN.js.gz +0 -0
- package/ui-dist/assets/dist-CEhIDAnr.js.gz +0 -0
- package/ui-dist/assets/dist-hkVPP1th.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BNUxmwD6.js.gz +0 -0
- package/ui-dist/assets/doc-browser-context-C4yQrKrH.js.gz +0 -0
- package/ui-dist/assets/doc-browser-w4eGZXLu.js +0 -1
- package/ui-dist/assets/es2015-MOCbM0Eu.js.gz +0 -0
- package/ui-dist/assets/extensions-DxUBMtHW.js.gz +0 -0
- package/ui-dist/assets/i18n-B9yXA8KO.js.gz +0 -0
- package/ui-dist/assets/loader-circle-rWr5Yo0E.js +0 -1
- package/ui-dist/assets/login-page-CfMSkOsg.js +0 -1
- package/ui-dist/assets/login-page-CqrHhzaN.js.gz +0 -0
- package/ui-dist/assets/logo-badge-Cr03YceJ.js.gz +0 -0
- package/ui-dist/assets/main-8cVkMfgE.css +0 -1
- package/ui-dist/assets/main-8cVkMfgE.css.gz +0 -0
- package/ui-dist/assets/main-Bys58GxY.js +0 -2
- package/ui-dist/assets/main-Bys58GxY.js.gz +0 -0
- package/ui-dist/assets/main-i18n-catalog.config-BSq9yiUQ.js +0 -1
- package/ui-dist/assets/main-i18n-catalog.config-BSq9yiUQ.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-CifiVgFD.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-DX5VE3mU.js +0 -1
- package/ui-dist/assets/model-config-page-C6jVNbSj.js.gz +0 -0
- package/ui-dist/assets/navigation-link-kbCLRSr_.js.gz +0 -0
- package/ui-dist/assets/panel-app-BUUle0gP.js +0 -1
- package/ui-dist/assets/panel-app-BUUle0gP.js.gz +0 -0
- package/ui-dist/assets/panel-app-i18n-catalog.config-C2St67SP.js +0 -1
- package/ui-dist/assets/panelStandalone-DMBnYyTw.js.gz +0 -0
- package/ui-dist/assets/plus-BHnKwuPq.js +0 -1
- package/ui-dist/assets/popover-XVDgjxcl.js.gz +0 -0
- package/ui-dist/assets/privacy-settings-page-BN27MBVA.js.gz +0 -0
- package/ui-dist/assets/projects-DV3UuJMS.js +0 -1
- package/ui-dist/assets/projects-DV3UuJMS.js.gz +0 -0
- package/ui-dist/assets/provider-scoped-model-input-BGZMCThn.js.gz +0 -0
- package/ui-dist/assets/providers-config-page-D5aBwbOD.js.gz +0 -0
- package/ui-dist/assets/pwa-ClQK56Qe.js.gz +0 -0
- package/ui-dist/assets/remote-Bl005fzu.js +0 -1
- package/ui-dist/assets/runtime-config-page-CmktQcMW.js +0 -1
- package/ui-dist/assets/runtime-config-page-CmktQcMW.js.gz +0 -0
- package/ui-dist/assets/search-config-page-BmuZTVxs.js.gz +0 -0
- package/ui-dist/assets/secrets-config-page-NPHpg9sb.js.gz +0 -0
- package/ui-dist/assets/security-config-Djptuyf2.js +0 -1
- package/ui-dist/assets/select-CmDTqk2C.js.gz +0 -0
- package/ui-dist/assets/service-apps-panel-BYGJ9_pO.js.gz +0 -0
- package/ui-dist/assets/skeleton-Eh64l4T2.js +0 -1
- package/ui-dist/assets/tabs-Bk_mG7ql.js.gz +0 -0
- package/ui-dist/assets/theme-provider-CeBY2pyu.js.gz +0 -0
- package/ui-dist/assets/tooltip-CgGbBdYf.js.gz +0 -0
- package/ui-dist/assets/use-config-b2DN67gs.js.gz +0 -0
- package/ui-dist/assets/use-desktop-capabilities-B3tLU1yl.js.gz +0 -0
- package/ui-dist/assets/use-panel-app-scroll-restoration-BekzoX6z.js.gz +0 -0
- package/ui-dist/assets/use-viewport-layout-CUA3jQsA.js.gz +0 -0
- package/ui-dist/assets/x-C0iaOsRW.js +0 -1
package/dist/cli/app/index.js
CHANGED
|
@@ -5,7 +5,7 @@ import { NextclawDistributionService } from "@nextclaw/service";
|
|
|
5
5
|
const distribution = createNextclawDistribution(import.meta.url);
|
|
6
6
|
repairPackagedPortableRunnerPermissions(distribution);
|
|
7
7
|
NextclawDistributionService.configureRuntime(distribution);
|
|
8
|
-
const { nextclawCliProgram } = await import("../../nextclaw-cli-app-
|
|
8
|
+
const { nextclawCliProgram } = await import("../../nextclaw-cli-app-CjtgVEdo.js");
|
|
9
9
|
await nextclawCliProgram.parseAsync(process.argv);
|
|
10
10
|
//#endregion
|
|
11
11
|
export {};
|
|
@@ -3,7 +3,7 @@ import { APP_NAME, APP_TAGLINE, getConfigPath, getDataDir, getRunPath, loadConfi
|
|
|
3
3
|
import { NextclawDistributionService, NextclawServiceRuntime, readLearningLoopRuntimeConfig } from "@nextclaw/service";
|
|
4
4
|
import { constants, existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
5
5
|
import path, { join, resolve } from "node:path";
|
|
6
|
-
import { Command, InvalidArgumentError } from "commander";
|
|
6
|
+
import { Argument, Command, InvalidArgumentError, Option } from "commander";
|
|
7
7
|
import { createHash, randomBytes } from "node:crypto";
|
|
8
8
|
import { execFile } from "node:child_process";
|
|
9
9
|
import { tmpdir } from "node:os";
|
|
@@ -5918,7 +5918,6 @@ function registerProjectCommands(program, nextclaw) {
|
|
|
5918
5918
|
const projects = program.command("projects").description("Manage projects");
|
|
5919
5919
|
projects.command("list").description("List registered projects, including projects without sessions").option("--json", "Output JSON", false).action((options) => commands.list(options));
|
|
5920
5920
|
projects.command("templates").description("List built-in project templates").option("--json", "Output JSON", false).action((options) => commands.templates(options));
|
|
5921
|
-
projects.command("observe <root-path>").description("Observe a registered project without changing project data").option("--json", "Output JSON", false).action((rootPath, options) => commands.observe(rootPath, options));
|
|
5922
5921
|
projects.command("create <name>").description("Create and register a project").option("--path <directory>", "Target directory").option("--template <template>", "Project template: empty or knowledge-base", "empty").option("--json", "Output JSON", false).action((name, options) => commands.create(name, options));
|
|
5923
5922
|
projects.command("remove <project-id>").description("Remove a project from the project list without deleting files or sessions").requiredOption("--confirm <project-id>", "Confirm the exact project id").option("--json", "Output JSON", false).action((projectId, options) => commands.remove(projectId, options));
|
|
5924
5923
|
registerProjectWorkCommands(projects, commands);
|
|
@@ -6128,6 +6127,302 @@ function registerExecCommand(program, nextclaw) {
|
|
|
6128
6127
|
});
|
|
6129
6128
|
}
|
|
6130
6129
|
//#endregion
|
|
6130
|
+
//#region src/cli/app/utils/config-command-options.utils.ts
|
|
6131
|
+
function requireConfigApiClient() {
|
|
6132
|
+
const client = createLocalUiApiClient();
|
|
6133
|
+
if (!client) throw new Error("NextClaw is not running. Run nextclaw start before managing providers, models or search.");
|
|
6134
|
+
return client;
|
|
6135
|
+
}
|
|
6136
|
+
function printConfigResult(value) {
|
|
6137
|
+
process.stdout.write(`${JSON.stringify(value, (key, item) => {
|
|
6138
|
+
if (key === "extraHeaders" && item && typeof item === "object") return Object.fromEntries(Object.keys(item).map((name) => [name, "[redacted]"]));
|
|
6139
|
+
return item;
|
|
6140
|
+
}, 2)}\n`);
|
|
6141
|
+
}
|
|
6142
|
+
function parseConfigBoolean(value) {
|
|
6143
|
+
if (value === "true") return true;
|
|
6144
|
+
if (value === "false") return false;
|
|
6145
|
+
throw new InvalidArgumentError("Expected true or false.");
|
|
6146
|
+
}
|
|
6147
|
+
function collectConfigOption(value, previous = []) {
|
|
6148
|
+
return [...previous, value];
|
|
6149
|
+
}
|
|
6150
|
+
function parseConfigAssignment(value) {
|
|
6151
|
+
const separator = value.indexOf("=");
|
|
6152
|
+
if (separator < 1 || !value.slice(0, separator).trim() || separator === value.length - 1) throw new InvalidArgumentError("Expected name=value.");
|
|
6153
|
+
return [value.slice(0, separator).trim(), value.slice(separator + 1)];
|
|
6154
|
+
}
|
|
6155
|
+
function readConfigApiKey(options) {
|
|
6156
|
+
const { apiKeyEnv, clearApiKey } = options;
|
|
6157
|
+
if (apiKeyEnv && clearApiKey) throw new Error("Choose --api-key-env or --clear-api-key, not both.");
|
|
6158
|
+
if (clearApiKey) return null;
|
|
6159
|
+
if (!apiKeyEnv) return void 0;
|
|
6160
|
+
const value = process.env[apiKeyEnv];
|
|
6161
|
+
if (!value?.trim()) throw new Error(`Environment variable ${apiKeyEnv} is empty or missing.`);
|
|
6162
|
+
return value;
|
|
6163
|
+
}
|
|
6164
|
+
function requireConfigChange(patch) {
|
|
6165
|
+
if (Object.keys(patch).length === 0) throw new Error("No changes specified. See command --help for supported options.");
|
|
6166
|
+
}
|
|
6167
|
+
//#endregion
|
|
6168
|
+
//#region src/cli/app/controllers/config/provider-command.controller.ts
|
|
6169
|
+
const thinkingLevels = [
|
|
6170
|
+
"off",
|
|
6171
|
+
"minimal",
|
|
6172
|
+
"low",
|
|
6173
|
+
"medium",
|
|
6174
|
+
"high",
|
|
6175
|
+
"adaptive",
|
|
6176
|
+
"xhigh"
|
|
6177
|
+
];
|
|
6178
|
+
var ProviderCommandController = class {
|
|
6179
|
+
constructor(createApi = requireConfigApiClient) {
|
|
6180
|
+
this.createApi = createApi;
|
|
6181
|
+
}
|
|
6182
|
+
path = (id) => `/api/providers/${encodeURIComponent(id)}`;
|
|
6183
|
+
showRequest = async (path, method = "GET", body) => {
|
|
6184
|
+
printConfigResult(await this.createApi().request({
|
|
6185
|
+
path,
|
|
6186
|
+
method,
|
|
6187
|
+
body
|
|
6188
|
+
}));
|
|
6189
|
+
};
|
|
6190
|
+
list = async () => this.showRequest("/api/providers");
|
|
6191
|
+
templates = async () => this.showRequest("/api/provider-templates");
|
|
6192
|
+
show = async (id) => {
|
|
6193
|
+
const result = await this.createApi().request({ path: "/api/providers" });
|
|
6194
|
+
if (!Object.hasOwn(result.providers, id)) throw new Error(`Unknown provider: ${id}`);
|
|
6195
|
+
printConfigResult(result.providers[id]);
|
|
6196
|
+
};
|
|
6197
|
+
add = async (id, options) => {
|
|
6198
|
+
if (!id.trim() || id.includes("/")) throw new Error("Provider id must be non-empty and cannot contain '/'.");
|
|
6199
|
+
const patch = this.providerPatch(options);
|
|
6200
|
+
await this.validateTemplate(patch.providerType);
|
|
6201
|
+
await this.showRequest("/api/providers", "POST", {
|
|
6202
|
+
providerId: id,
|
|
6203
|
+
...patch
|
|
6204
|
+
});
|
|
6205
|
+
};
|
|
6206
|
+
update = async (id, options) => {
|
|
6207
|
+
const patch = this.providerPatch(options);
|
|
6208
|
+
requireConfigChange(patch);
|
|
6209
|
+
await this.validateTemplate(patch.providerType);
|
|
6210
|
+
await this.showRequest(this.path(id), "PUT", patch);
|
|
6211
|
+
};
|
|
6212
|
+
remove = async (id) => this.showRequest(this.path(id), "DELETE");
|
|
6213
|
+
enabled = async (id, enabled) => this.showRequest(this.path(id), "PUT", { enabled });
|
|
6214
|
+
models = async (id) => {
|
|
6215
|
+
const result = await this.createApi().request({ path: "/api/providers" });
|
|
6216
|
+
if (!Object.hasOwn(result.providers, id)) throw new Error(`Unknown provider: ${id}`);
|
|
6217
|
+
const provider = result.providers[id];
|
|
6218
|
+
printConfigResult({
|
|
6219
|
+
providerId: id,
|
|
6220
|
+
models: provider.models ?? [],
|
|
6221
|
+
modelConfig: provider.modelConfig ?? {}
|
|
6222
|
+
});
|
|
6223
|
+
};
|
|
6224
|
+
discover = async (id) => this.showRequest(`${this.path(id)}/models/discover`, "POST", {});
|
|
6225
|
+
setModels = async (id, models) => this.showRequest(this.path(id), "PUT", { models });
|
|
6226
|
+
configureModels = async (id, options) => {
|
|
6227
|
+
const { vision = [], thinking = [], thinkingDefault = [], clear } = options;
|
|
6228
|
+
const entries = [
|
|
6229
|
+
...vision,
|
|
6230
|
+
...thinking,
|
|
6231
|
+
...thinkingDefault
|
|
6232
|
+
];
|
|
6233
|
+
if (clear && entries.length) throw new Error("--clear cannot be combined with model capability options.");
|
|
6234
|
+
if (!clear && !entries.length) throw new Error("Specify model capabilities or --clear.");
|
|
6235
|
+
const modelConfig = Object.create(null);
|
|
6236
|
+
for (const entry of vision) {
|
|
6237
|
+
const [model, value] = parseConfigAssignment(entry);
|
|
6238
|
+
(modelConfig[model] ??= {}).vision = parseConfigBoolean(value);
|
|
6239
|
+
}
|
|
6240
|
+
for (const entry of thinking) {
|
|
6241
|
+
const [model, value] = parseConfigAssignment(entry);
|
|
6242
|
+
(modelConfig[model] ??= {}).thinking = { supported: value.split(",").map(parseThinkingLevel) };
|
|
6243
|
+
}
|
|
6244
|
+
for (const entry of thinkingDefault) {
|
|
6245
|
+
const [model, value] = parseConfigAssignment(entry);
|
|
6246
|
+
const config = modelConfig[model] ??= {};
|
|
6247
|
+
const level = parseThinkingLevel(value);
|
|
6248
|
+
if (!config.thinking?.supported?.includes(level)) throw new Error(`Default thinking level for ${model} must be included in --thinking for that model.`);
|
|
6249
|
+
config.thinking.default = level;
|
|
6250
|
+
}
|
|
6251
|
+
await this.showRequest(this.path(id), "PUT", { modelConfig });
|
|
6252
|
+
};
|
|
6253
|
+
test = async (id, options) => {
|
|
6254
|
+
const result = await this.createApi().request({
|
|
6255
|
+
path: `${this.path(id)}/test`,
|
|
6256
|
+
method: "POST",
|
|
6257
|
+
body: { model: options.model }
|
|
6258
|
+
});
|
|
6259
|
+
printConfigResult(result);
|
|
6260
|
+
if (!result.success) process.exitCode = 1;
|
|
6261
|
+
};
|
|
6262
|
+
startAuth = async (id, options) => this.showRequest(`${this.path(id)}/auth/start`, "POST", { methodId: options.method });
|
|
6263
|
+
pollAuth = async (id, sessionId) => {
|
|
6264
|
+
const result = await this.createApi().request({
|
|
6265
|
+
path: `${this.path(id)}/auth/poll`,
|
|
6266
|
+
method: "POST",
|
|
6267
|
+
body: { sessionId }
|
|
6268
|
+
});
|
|
6269
|
+
printConfigResult(result);
|
|
6270
|
+
if ([
|
|
6271
|
+
"denied",
|
|
6272
|
+
"expired",
|
|
6273
|
+
"error"
|
|
6274
|
+
].includes(result.status)) process.exitCode = 1;
|
|
6275
|
+
};
|
|
6276
|
+
importAuth = async (id) => this.showRequest(`${this.path(id)}/auth/import-cli`, "POST", {});
|
|
6277
|
+
validateTemplate = async (type) => {
|
|
6278
|
+
if (type == null) return;
|
|
6279
|
+
const { providerTemplates } = await this.createApi().request({ path: "/api/provider-templates" });
|
|
6280
|
+
if (!providerTemplates.some((template) => template.id === type)) throw new Error(`Unknown provider type: ${type}. Use providers templates or --type custom.`);
|
|
6281
|
+
};
|
|
6282
|
+
providerPatch = (options) => {
|
|
6283
|
+
const { type, name, apiBase, wireApi, header, clearHeaders } = options;
|
|
6284
|
+
const patch = {};
|
|
6285
|
+
if (type !== void 0) patch.providerType = type === "custom" ? null : type;
|
|
6286
|
+
if (name !== void 0) patch.displayName = name;
|
|
6287
|
+
if (apiBase !== void 0) patch.apiBase = apiBase || null;
|
|
6288
|
+
if (wireApi !== void 0) patch.wireApi = wireApi;
|
|
6289
|
+
const key = readConfigApiKey(options);
|
|
6290
|
+
if (key !== void 0) patch.apiKey = key;
|
|
6291
|
+
if (header && clearHeaders) throw new Error("Choose --header or --clear-headers, not both.");
|
|
6292
|
+
if (header) patch.extraHeaders = Object.fromEntries(header.map(parseConfigAssignment));
|
|
6293
|
+
if (clearHeaders) patch.extraHeaders = null;
|
|
6294
|
+
return patch;
|
|
6295
|
+
};
|
|
6296
|
+
};
|
|
6297
|
+
function parseThinkingLevel(value) {
|
|
6298
|
+
const level = thinkingLevels.find((item) => item === value);
|
|
6299
|
+
if (!level) throw new Error(`Unknown thinking level: ${value}. Choose ${thinkingLevels.join(", ")}.`);
|
|
6300
|
+
return level;
|
|
6301
|
+
}
|
|
6302
|
+
//#endregion
|
|
6303
|
+
//#region src/cli/app/commands/provider-command-registration.utils.ts
|
|
6304
|
+
function registerProviderCommands(program, controller = new ProviderCommandController()) {
|
|
6305
|
+
const providers = program.command("providers").description("Manage model providers through the running NextClaw host");
|
|
6306
|
+
const output = (command) => command.option("--json", "Output JSON (also the default)");
|
|
6307
|
+
output(providers.command("list").description("List providers without exposing credentials")).action(controller.list);
|
|
6308
|
+
output(providers.command("templates").description("List provider templates and authorization methods")).action(controller.templates);
|
|
6309
|
+
output(providers.command("show <provider-id>").description("Show one provider")).action(controller.show);
|
|
6310
|
+
output(providerOptions(providers.command("add <provider-id>").description("Create a provider instance"))).action(controller.add);
|
|
6311
|
+
output(providerOptions(providers.command("update <provider-id>").description("Update specified provider settings"))).action(controller.update);
|
|
6312
|
+
output(providers.command("remove <provider-id>").description("Remove a provider and its secret references")).action(controller.remove);
|
|
6313
|
+
output(providers.command("enable <provider-id>").description("Enable a provider")).action(async (id) => controller.enabled(id, true));
|
|
6314
|
+
output(providers.command("disable <provider-id>").description("Disable a provider")).action(async (id) => controller.enabled(id, false));
|
|
6315
|
+
output(providers.command("test <provider-id>").description("Test a provider connection; failure exits non-zero").option("--model <model>", "Model to test")).action(controller.test);
|
|
6316
|
+
const models = providers.command("models").description("Manage a provider's models");
|
|
6317
|
+
output(models.command("list <provider-id>").description("Show configured models and capability overrides")).action(controller.models);
|
|
6318
|
+
output(models.command("discover <provider-id>").description("Discover available models without changing configuration")).action(controller.discover);
|
|
6319
|
+
output(models.command("set <provider-id> [models...]").description("Replace the configured model list; omit models to clear it")).action(controller.setModels);
|
|
6320
|
+
output(models.command("configure <provider-id>").description("Replace all model capability overrides (model list is unchanged)").option("--vision <model=true|false>", "Vision capability (repeatable)", collectConfigOption).option("--thinking <model=levels>", "Comma-separated supported thinking levels (repeatable)", collectConfigOption).option("--thinking-default <model=level>", "Default thinking level (repeatable)", collectConfigOption).option("--clear", "Clear all model capability overrides")).action(controller.configureModels);
|
|
6321
|
+
const auth = providers.command("auth").description("Authorize a provider");
|
|
6322
|
+
output(auth.command("start <provider-id>").description("Start authorization; returns verification URI, user code and session id").option("--method <id>", "Authorization method from providers templates")).action(controller.startAuth);
|
|
6323
|
+
output(auth.command("poll <provider-id> <session-id>").description("Poll once; respect the returned nextPollMs before polling again")).action(controller.pollAuth);
|
|
6324
|
+
output(auth.command("import <provider-id>").description("Import credentials from a supported provider CLI")).action(controller.importAuth);
|
|
6325
|
+
}
|
|
6326
|
+
function providerOptions(command) {
|
|
6327
|
+
return command.option("--type <type>", "Template type from providers templates, or custom").option("--name <name>", "Display name").option("--api-base <url>", "API base URL; empty string resets it").option("--api-key-env <name>", "Read the API key from an environment variable").option("--clear-api-key", "Clear the stored API key and its secret reference").addOption(new Option("--wire-api <protocol>", "API protocol").choices([
|
|
6328
|
+
"auto",
|
|
6329
|
+
"chat",
|
|
6330
|
+
"responses"
|
|
6331
|
+
])).option("--header <name=value>", "Replace custom headers with the supplied entries (repeatable)", collectConfigOption).option("--clear-headers", "Clear custom headers");
|
|
6332
|
+
}
|
|
6333
|
+
//#endregion
|
|
6334
|
+
//#region src/cli/app/controllers/config/model-search-command.controller.ts
|
|
6335
|
+
var ModelSearchCommandController = class {
|
|
6336
|
+
constructor(createApi = requireConfigApiClient) {
|
|
6337
|
+
this.createApi = createApi;
|
|
6338
|
+
}
|
|
6339
|
+
listModels = async () => {
|
|
6340
|
+
printConfigResult(await this.createApi().request({ path: "/api/provider-model-catalog" }));
|
|
6341
|
+
};
|
|
6342
|
+
showModel = async () => {
|
|
6343
|
+
printConfigResult({ model: (await this.createApi().request({ path: "/api/config" })).agents.defaults.model });
|
|
6344
|
+
};
|
|
6345
|
+
setModel = async (model) => {
|
|
6346
|
+
if (!model.trim()) throw new Error("Model must not be empty.");
|
|
6347
|
+
printConfigResult(await this.createApi().request({
|
|
6348
|
+
path: "/api/config/model",
|
|
6349
|
+
method: "PUT",
|
|
6350
|
+
body: { model }
|
|
6351
|
+
}));
|
|
6352
|
+
};
|
|
6353
|
+
showSearch = async () => {
|
|
6354
|
+
printConfigResult((await this.createApi().request({ path: "/api/config" })).search);
|
|
6355
|
+
};
|
|
6356
|
+
configureSearch = async (options) => {
|
|
6357
|
+
const { provider, enabledProvider, clearEnabledProviders, maxResults } = options;
|
|
6358
|
+
const patch = {};
|
|
6359
|
+
if (provider !== void 0) patch.provider = provider;
|
|
6360
|
+
if (enabledProvider !== void 0) patch.enabledProviders = enabledProvider;
|
|
6361
|
+
if (clearEnabledProviders) {
|
|
6362
|
+
if (enabledProvider) throw new Error("Choose --enabled-provider or --clear-enabled-providers, not both.");
|
|
6363
|
+
patch.enabledProviders = [];
|
|
6364
|
+
}
|
|
6365
|
+
if (maxResults !== void 0) patch.defaults = { maxResults };
|
|
6366
|
+
await this.updateSearch(patch);
|
|
6367
|
+
};
|
|
6368
|
+
configureSearchProvider = async (provider, options) => {
|
|
6369
|
+
const patch = {};
|
|
6370
|
+
const apiKey = readConfigApiKey(options);
|
|
6371
|
+
if (apiKey !== void 0) patch.apiKey = apiKey;
|
|
6372
|
+
if (options.baseUrl !== void 0) patch.baseUrl = options.baseUrl || null;
|
|
6373
|
+
const bochaFields = [
|
|
6374
|
+
"docsUrl",
|
|
6375
|
+
"summary",
|
|
6376
|
+
"freshness"
|
|
6377
|
+
];
|
|
6378
|
+
const tavilyFields = ["searchDepth", "includeAnswer"];
|
|
6379
|
+
for (const field of bochaFields) {
|
|
6380
|
+
if (options[field] === void 0) continue;
|
|
6381
|
+
if (provider !== "bocha") throw new Error(`${field} is only supported by bocha.`);
|
|
6382
|
+
patch[field] = options[field];
|
|
6383
|
+
}
|
|
6384
|
+
for (const field of tavilyFields) {
|
|
6385
|
+
if (options[field] === void 0) continue;
|
|
6386
|
+
if (provider !== "tavily") throw new Error(`${field} is only supported by tavily.`);
|
|
6387
|
+
patch[field] = options[field];
|
|
6388
|
+
}
|
|
6389
|
+
requireConfigChange(patch);
|
|
6390
|
+
await this.updateSearch({ providers: { [provider]: patch } });
|
|
6391
|
+
};
|
|
6392
|
+
updateSearch = async (patch) => {
|
|
6393
|
+
requireConfigChange(patch);
|
|
6394
|
+
printConfigResult(await this.createApi().request({
|
|
6395
|
+
path: "/api/config/search",
|
|
6396
|
+
method: "PUT",
|
|
6397
|
+
body: patch
|
|
6398
|
+
}));
|
|
6399
|
+
};
|
|
6400
|
+
};
|
|
6401
|
+
//#endregion
|
|
6402
|
+
//#region src/cli/app/commands/model-search-command-registration.utils.ts
|
|
6403
|
+
const searchProviders = [
|
|
6404
|
+
"bocha",
|
|
6405
|
+
"tavily",
|
|
6406
|
+
"brave",
|
|
6407
|
+
"exa"
|
|
6408
|
+
];
|
|
6409
|
+
function registerModelSearchCommands(program, controller = new ModelSearchCommandController()) {
|
|
6410
|
+
const output = (command) => command.option("--json", "Output JSON (also the default)");
|
|
6411
|
+
const models = program.command("models").description("Inspect available models and manage the default model");
|
|
6412
|
+
output(models.command("list").description("Show the runtime model catalog and discovery status")).action(controller.listModels);
|
|
6413
|
+
output(models.command("show").description("Show the default model")).action(controller.showModel);
|
|
6414
|
+
output(models.command("set <model>").description("Set the default model using a provider-scoped model id")).action(controller.setModel);
|
|
6415
|
+
const search = program.command("search").description("Manage web search settings through the running host");
|
|
6416
|
+
output(search.command("show").description("Show search settings without exposing credentials")).action(controller.showSearch);
|
|
6417
|
+
output(search.command("configure").description("Configure default search provider, enabled providers and result count").addOption(new Option("--provider <provider>", "Default search provider").choices(searchProviders)).addOption(new Option("--enabled-provider <providers...>", "Replace enabled search providers").choices(searchProviders)).option("--clear-enabled-providers", "Disable all search providers").option("--max-results <count>", "Default result count (1-50)", parseResultCount)).action(controller.configureSearch);
|
|
6418
|
+
output(search.command("provider").description("Update one search provider's credentials and supported options").addArgument(new Argument("<provider>").choices(searchProviders)).option("--api-key-env <name>", "Read the API key from an environment variable").option("--clear-api-key", "Clear the stored API key and its secret reference").option("--base-url <url>", "Search API base URL; empty string resets it").option("--docs-url <url>", "Bocha documentation URL").option("--summary <boolean>", "Bocha summary", parseConfigBoolean).option("--freshness <value>", "Bocha freshness").addOption(new Option("--search-depth <depth>", "Tavily search depth").choices(["basic", "advanced"])).option("--include-answer <boolean>", "Tavily synthesized answer", parseConfigBoolean)).action(controller.configureSearchProvider);
|
|
6419
|
+
}
|
|
6420
|
+
function parseResultCount(value) {
|
|
6421
|
+
const count = Number(value);
|
|
6422
|
+
if (!Number.isInteger(count) || count < 1 || count > 50) throw new InvalidArgumentError("Expected an integer from 1 to 50.");
|
|
6423
|
+
return count;
|
|
6424
|
+
}
|
|
6425
|
+
//#endregion
|
|
6131
6426
|
//#region src/cli/app/nextclaw-cli-app.ts
|
|
6132
6427
|
const LOGO = "🤖";
|
|
6133
6428
|
const program = new Command();
|
|
@@ -6163,6 +6458,8 @@ registerSessionCommands(program, runtime);
|
|
|
6163
6458
|
registerExecCommand(program, runtime);
|
|
6164
6459
|
registerAppCommands(program, { portableServiceRunnerPath: NextclawDistributionService.get().portableServiceRunnerPath });
|
|
6165
6460
|
const config = program.command("config").description("Manage config values");
|
|
6461
|
+
registerProviderCommands(program);
|
|
6462
|
+
registerModelSearchCommands(program);
|
|
6166
6463
|
config.command("get <path>").description("Get a config value by dot path").option("--json", "Output JSON", false).action((path, opts) => runtime.commands.config.get(path, opts));
|
|
6167
6464
|
config.command("set <path> <value>").description("Set a config value by dot path").option("--json", "Parse value as JSON", false).action((path, value, opts) => runtime.commands.config.set(path, value, opts));
|
|
6168
6465
|
config.command("unset <path>").description("Remove a config value by dot path").action((path) => runtime.commands.config.unset(path));
|
|
@@ -6201,4 +6498,4 @@ program.command("usage").description("Show observed LLM usage snapshots, history
|
|
|
6201
6498
|
//#endregion
|
|
6202
6499
|
export { program as nextclawCliProgram };
|
|
6203
6500
|
|
|
6204
|
-
//# sourceMappingURL=nextclaw-cli-app-
|
|
6501
|
+
//# sourceMappingURL=nextclaw-cli-app-CjtgVEdo.js.map
|