nextclaw 0.48.3 → 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-BJSCnCIN.js → nextclaw-cli-app-CjtgVEdo.js} +300 -2
- package/dist/nextclaw-cli-app-CjtgVEdo.js.map +1 -0
- package/package.json +15 -15
- package/resources/USAGE.md +32 -80
- package/ui-dist/.vite/manifest.json +208 -195
- package/ui-dist/.vite/manifest.json.gz +0 -0
- package/ui-dist/assets/{account-panel-BRTSwNvA.js → account-panel-UvHFa8Kl.js} +1 -1
- package/ui-dist/assets/account-panel-UvHFa8Kl.js.gz +0 -0
- package/ui-dist/assets/{api-BnUzdltV.js → api-Dffeij78.js} +5 -5
- package/ui-dist/assets/api-Dffeij78.js.gz +0 -0
- package/ui-dist/assets/{app-data-Bjh_zM45.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-BrOYSgG0.js → appearance-settings-page-D8cWniw-.js} +1 -1
- package/ui-dist/assets/appearance-settings-page-D8cWniw-.js.gz +0 -0
- package/ui-dist/assets/{channels-list-page-BE0TxB3B.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/{config-split-page-BxDwwAGa.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-S5JxZcS1.js → confirm-dialog-ClT6iaj8.js} +1 -1
- package/ui-dist/assets/confirm-dialog-ClT6iaj8.js.gz +0 -0
- package/ui-dist/assets/{desktop-capabilities-page-BwHxJpbl.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-Bfg7OdJ2.js → desktop-update-config-OuQV73gg.js} +1 -1
- package/ui-dist/assets/desktop-update-config-OuQV73gg.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BFkslEzY.js +1 -0
- package/ui-dist/assets/{doc-browser-C8eqJLi_.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-BPCDFcC-.js → doc-browser-context-CekJxJFm.js} +1 -1
- package/ui-dist/assets/doc-browser-context-CekJxJFm.js.gz +0 -0
- package/ui-dist/assets/{extensions-DgKQRebe.js → extensions-B5r-0jCq.js} +1 -1
- package/ui-dist/assets/extensions-B5r-0jCq.js.gz +0 -0
- package/ui-dist/assets/{i18n-CKvm9zyk.js → i18n-CPjq_hQX.js} +2 -2
- package/ui-dist/assets/i18n-CPjq_hQX.js.gz +0 -0
- package/ui-dist/assets/{i18n-provider-CPV43pMX.js → i18n-provider-BYO9AhFy.js} +1 -1
- package/ui-dist/assets/keyboard-shortcuts-settings-page-1efEkGwq.js +1 -0
- package/ui-dist/assets/{login-page-DeDQjVxv.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/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-CWjJGp_D.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-Dv_zE7HN.js → model-config-page-DBcuZyRC.js} +1 -1
- package/ui-dist/assets/model-config-page-DBcuZyRC.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-CFRBHV94.js → panelStandalone-BGA1s7JG.js} +2 -2
- package/ui-dist/assets/panelStandalone-BGA1s7JG.js.gz +0 -0
- package/ui-dist/assets/{privacy-settings-page-D6uc9f-A.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-DUa_9uwg.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-DAiqxlF_.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/{pwa-C_Zte1xe.js → pwa-C3kR9mdy.js} +1 -1
- package/ui-dist/assets/pwa-C3kR9mdy.js.gz +0 -0
- package/ui-dist/assets/remote-Cnawibbg.js +1 -0
- 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/{search-config-page-3xbhRlW2.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-Dn8_rdOj.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/{service-apps-panel-CGc04aMn.js → service-apps-panel-Bshf3Wmq.js} +1 -1
- package/ui-dist/assets/service-apps-panel-Bshf3Wmq.js.gz +0 -0
- package/ui-dist/assets/{tag-chip-BDzpHEli.js → tag-chip-gAH1IOsZ.js} +1 -1
- package/ui-dist/assets/{theme-provider-B6FinATQ.js → theme-provider-DE7m9jvf.js} +1 -1
- package/ui-dist/assets/theme-provider-DE7m9jvf.js.gz +0 -0
- package/ui-dist/assets/{use-config-BPUM2lbo.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-BDjArQP3.js → use-desktop-capabilities-OKG96v4y.js} +1 -1
- package/ui-dist/assets/use-desktop-capabilities-OKG96v4y.js.gz +0 -0
- package/ui-dist/index.html +18 -18
- package/ui-dist/index.html.gz +0 -0
- package/ui-dist/panel-standalone.html +5 -5
- package/ui-dist/panel-standalone.html.gz +0 -0
- package/dist/nextclaw-cli-app-BJSCnCIN.js.map +0 -1
- package/ui-dist/assets/account-panel-BRTSwNvA.js.gz +0 -0
- package/ui-dist/assets/api-BnUzdltV.js.gz +0 -0
- package/ui-dist/assets/app-data-Bjh_zM45.js.gz +0 -0
- package/ui-dist/assets/app-presenter-provider-CBt-lyr_.js +0 -109
- package/ui-dist/assets/app-presenter-provider-CBt-lyr_.js.gz +0 -0
- package/ui-dist/assets/appearance-settings-page-BrOYSgG0.js.gz +0 -0
- package/ui-dist/assets/channels-list-page-BE0TxB3B.js.gz +0 -0
- package/ui-dist/assets/config-split-page-BxDwwAGa.js.gz +0 -0
- package/ui-dist/assets/confirm-dialog-S5JxZcS1.js.gz +0 -0
- package/ui-dist/assets/desktop-capabilities-page-BwHxJpbl.js.gz +0 -0
- package/ui-dist/assets/desktop-update-config-Bfg7OdJ2.js.gz +0 -0
- package/ui-dist/assets/doc-browser-BgRP0Wni.js +0 -1
- package/ui-dist/assets/doc-browser-C8eqJLi_.js.gz +0 -0
- package/ui-dist/assets/doc-browser-context-BPCDFcC-.js.gz +0 -0
- package/ui-dist/assets/extensions-DgKQRebe.js.gz +0 -0
- package/ui-dist/assets/i18n-CKvm9zyk.js.gz +0 -0
- package/ui-dist/assets/login-page-ClcrvN04.js +0 -1
- package/ui-dist/assets/login-page-DeDQjVxv.js.gz +0 -0
- package/ui-dist/assets/main-DGqlaAaI.css +0 -1
- package/ui-dist/assets/main-DGqlaAaI.css.gz +0 -0
- package/ui-dist/assets/main-i18n-catalog.config-CpNF5aVc.js +0 -1
- package/ui-dist/assets/main-i18n-catalog.config-CpNF5aVc.js.gz +0 -0
- package/ui-dist/assets/main-nMVfHb5K.js +0 -2
- package/ui-dist/assets/main-nMVfHb5K.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-CWjJGp_D.js.gz +0 -0
- package/ui-dist/assets/mcp-marketplace-page-fvu2NcXT.js +0 -1
- package/ui-dist/assets/model-config-page-Dv_zE7HN.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-BzxE3tZb.js +0 -1
- package/ui-dist/assets/panelStandalone-CFRBHV94.js.gz +0 -0
- package/ui-dist/assets/privacy-settings-page-D6uc9f-A.js.gz +0 -0
- package/ui-dist/assets/projects-BD1rG75R.js +0 -1
- package/ui-dist/assets/projects-BD1rG75R.js.gz +0 -0
- package/ui-dist/assets/provider-scoped-model-input-DUa_9uwg.js.gz +0 -0
- package/ui-dist/assets/providers-config-page-DAiqxlF_.js.gz +0 -0
- package/ui-dist/assets/pwa-C_Zte1xe.js.gz +0 -0
- package/ui-dist/assets/remote-BO0QP7ua.js +0 -1
- package/ui-dist/assets/runtime-config-page-w1UAkGF_.js +0 -1
- package/ui-dist/assets/runtime-config-page-w1UAkGF_.js.gz +0 -0
- package/ui-dist/assets/search-config-page-3xbhRlW2.js.gz +0 -0
- package/ui-dist/assets/secrets-config-page-Dn8_rdOj.js.gz +0 -0
- package/ui-dist/assets/security-config-Y1nEGM3A.js +0 -1
- package/ui-dist/assets/service-apps-panel-CGc04aMn.js.gz +0 -0
- package/ui-dist/assets/theme-provider-B6FinATQ.js.gz +0 -0
- package/ui-dist/assets/use-config-BPUM2lbo.js.gz +0 -0
- package/ui-dist/assets/use-desktop-capabilities-BDjArQP3.js.gz +0 -0
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";
|
|
@@ -6127,6 +6127,302 @@ function registerExecCommand(program, nextclaw) {
|
|
|
6127
6127
|
});
|
|
6128
6128
|
}
|
|
6129
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
|
|
6130
6426
|
//#region src/cli/app/nextclaw-cli-app.ts
|
|
6131
6427
|
const LOGO = "🤖";
|
|
6132
6428
|
const program = new Command();
|
|
@@ -6162,6 +6458,8 @@ registerSessionCommands(program, runtime);
|
|
|
6162
6458
|
registerExecCommand(program, runtime);
|
|
6163
6459
|
registerAppCommands(program, { portableServiceRunnerPath: NextclawDistributionService.get().portableServiceRunnerPath });
|
|
6164
6460
|
const config = program.command("config").description("Manage config values");
|
|
6461
|
+
registerProviderCommands(program);
|
|
6462
|
+
registerModelSearchCommands(program);
|
|
6165
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));
|
|
6166
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));
|
|
6167
6465
|
config.command("unset <path>").description("Remove a config value by dot path").action((path) => runtime.commands.config.unset(path));
|
|
@@ -6200,4 +6498,4 @@ program.command("usage").description("Show observed LLM usage snapshots, history
|
|
|
6200
6498
|
//#endregion
|
|
6201
6499
|
export { program as nextclawCliProgram };
|
|
6202
6500
|
|
|
6203
|
-
//# sourceMappingURL=nextclaw-cli-app-
|
|
6501
|
+
//# sourceMappingURL=nextclaw-cli-app-CjtgVEdo.js.map
|