@botconnector/bccli 0.4.10 → 0.4.12
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/{acp-L4WGVJTY.js → acp-JZW3XHE5.js} +20 -5
- package/dist/acp.d.ts +17 -1
- package/dist/args-XVO7TB4C.js +13 -0
- package/dist/budget.d.ts +4 -1
- package/dist/{chunk-67REFMSY.js → chunk-3CYQYHPK.js} +1 -1
- package/dist/{chunk-VXRW5SYP.js → chunk-6JK4IBGK.js} +25 -14
- package/dist/{chunk-MPYSYTSO.js → chunk-6SDRWEPN.js} +1 -1
- package/dist/{chunk-4WI5ON64.js → chunk-7GM6NN5E.js} +1 -1
- package/dist/{chunk-6RVAPAE5.js → chunk-7XD47KN5.js} +1 -1
- package/dist/{chunk-SXRQ2Q7A.js → chunk-INMSTUB2.js} +4 -4
- package/dist/{chunk-CIEPLTGS.js → chunk-ISOKH5WB.js} +5 -5
- package/dist/{chunk-6N2BBLIT.js → chunk-JUC3ZOCV.js} +2 -2
- package/dist/{chunk-3PUWH62K.js → chunk-KDVL2NP6.js} +34 -50
- package/dist/{chunk-24KDXQZT.js → chunk-KEKDRROL.js} +3 -3
- package/dist/{chunk-ZWXKBFKW.js → chunk-KJIXA6MP.js} +23 -9
- package/dist/{chunk-CBD52BYV.js → chunk-OFMZ6CE6.js} +1 -1
- package/dist/{chunk-7HDBPDAD.js → chunk-Q42ZGVAQ.js} +2 -2
- package/dist/{chunk-ED5TTYQU.js → chunk-R754XIBJ.js} +11 -3
- package/dist/{chunk-3K66L37W.js → chunk-S3QEZDKB.js} +3 -3
- package/dist/{chunk-PGDYPOQW.js → chunk-SWNRA3EW.js} +4 -4
- package/dist/{chunk-USFXL5BS.js → chunk-TLCL6DC7.js} +6 -6
- package/dist/{chunk-WFZKJY3R.js → chunk-YYTFJUO2.js} +3 -2
- package/dist/{chunk-5QCCV2JM.js → chunk-ZJRZTMJF.js} +47 -18
- package/dist/cli.js +39 -39
- package/dist/{completion-GEFRIQWV.js → completion-Q7VHOPPV.js} +1 -1
- package/dist/{config-JKMYKNAT.js → config-T7MKGJVG.js} +2 -2
- package/dist/{config-JLOH5M6B.js → config-YYEAEN2C.js} +3 -3
- package/dist/{ghBotCli-WEVS6S6O.js → ghBotCli-7VUGI63S.js} +18 -16
- package/dist/{integrationCli-PKMICTHC.js → integrationCli-TO42MBZB.js} +192 -12
- package/dist/{login-2TZRODUL.js → login-BSMUGW7L.js} +6 -4
- package/dist/login.d.ts +2 -0
- package/dist/{mcpCli-TAPKYGHO.js → mcpCli-ZT7CRYMP.js} +6 -6
- package/dist/{modelsCli-6PK7V2QZ.js → modelsCli-2ZRW4CC4.js} +6 -6
- package/dist/{oauthLogin-UI34LQZU.js → oauthLogin-THSM6FE7.js} +1 -1
- package/dist/{pluginsCli-RCF33U5J.js → pluginsCli-EKQI4CJW.js} +2 -2
- package/dist/{prCli-24PMW7NS.js → prCli-FMQTOBIV.js} +1 -1
- package/dist/providerCli-3TFEKV4C.js +15 -0
- package/dist/sdk.js +111 -75
- package/dist/{serve-7BFCIEPJ.js → serve-DC6YICSK.js} +16 -16
- package/dist/{serve-XNJI67DU.js → serve-V6YVZTNR.js} +3 -3
- package/dist/session-LX4UNPCD.js +12 -0
- package/dist/setup-MFG3BWEU.js +24 -0
- package/dist/setup.d.ts +5 -0
- package/dist/{statsCli-QDHE4TKB.js → statsCli-7MIQHLVW.js} +2 -2
- package/dist/tools/bash.d.ts +2 -0
- package/dist/{transferCli-7OKKYGG2.js → transferCli-SRSYQLSJ.js} +4 -4
- package/dist/{ui-SZAIIJC5.js → ui-IMCUSB6Q.js} +14 -14
- package/dist/{update-JSNVVXPS.js → update-POT5W6MC.js} +2 -2
- package/package.json +1 -1
- package/dist/args-EW7XJVQN.js +0 -13
- package/dist/providerCli-XA4LTWRD.js +0 -15
- package/dist/session-VAPIHHUG.js +0 -12
- package/dist/setup-GPIMZOWE.js +0 -24
|
@@ -5,13 +5,14 @@ import {
|
|
|
5
5
|
loadConfig,
|
|
6
6
|
readCredentials,
|
|
7
7
|
resolveModel
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-TLCL6DC7.js";
|
|
9
9
|
import {
|
|
10
10
|
t
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-R754XIBJ.js";
|
|
12
12
|
|
|
13
13
|
// src/integrationCli.ts
|
|
14
14
|
import { chmodSync, copyFileSync, existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
|
|
15
|
+
import { createHash } from "crypto";
|
|
15
16
|
import { dirname, join } from "path";
|
|
16
17
|
import { parseDocument } from "yaml";
|
|
17
18
|
var BASE_URL = "https://api.botconnector.id/v1";
|
|
@@ -30,10 +31,11 @@ var HERMES_ENV_ID = "BOTCONNECTOR_API_KEY";
|
|
|
30
31
|
var HERMES_PROVIDER_ID = "botconnector-cloud";
|
|
31
32
|
var FALLBACK_DEFAULT_MODEL = "glm-5.3-flash";
|
|
32
33
|
function parseTarget(raw) {
|
|
33
|
-
if (raw === "opencode" || raw === "aider" || raw === "cline" || raw === "deepseek-harness" || raw === "cursor" || raw === "openai-cli" || raw === "openai-sdk" || raw === "openai-compatible" || raw === "codex" || raw === "claude-code" || raw === "openclaw" || raw === "hermes") return raw;
|
|
34
|
+
if (raw === "opencode" || raw === "aider" || raw === "cline" || raw === "deepseek-harness" || raw === "cursor" || raw === "openai-cli" || raw === "openai-sdk" || raw === "openai-compatible" || raw === "codex" || raw === "claude-code" || raw === "openclaw" || raw === "hermes" || raw === "crush" || raw === "kilo") return raw;
|
|
34
35
|
if (raw === "dsh") return "deepseek-harness";
|
|
36
|
+
if (raw === "kilocode" || raw === "kilo-code") return "kilo";
|
|
35
37
|
throw new ConfigError(
|
|
36
|
-
t("Agent must be one of: opencode, aider, cline, deepseek-harness (dsh), cursor, openai-cli, openai-sdk, openai-compatible, codex, claude-code, openclaw, hermes")
|
|
38
|
+
t("Agent must be one of: opencode, aider, cline, deepseek-harness (dsh), cursor, openai-cli, openai-sdk, openai-compatible, codex, claude-code, openclaw, hermes, crush, kilo")
|
|
37
39
|
);
|
|
38
40
|
}
|
|
39
41
|
function homeDir(env) {
|
|
@@ -67,9 +69,20 @@ function safeBackup(path, env) {
|
|
|
67
69
|
function writeState(target, state, env) {
|
|
68
70
|
const path = statePath(target, env);
|
|
69
71
|
mkdirSync(dirname(path), { recursive: true });
|
|
70
|
-
|
|
72
|
+
const files = state.files.map((file) => {
|
|
73
|
+
const hash = hashFile(file.path);
|
|
74
|
+
return hash ? { ...file, hash } : file;
|
|
75
|
+
});
|
|
76
|
+
writeFileSync(path, `${JSON.stringify({ ...state, files }, null, 2)}
|
|
71
77
|
`, { mode: 384 });
|
|
72
78
|
}
|
|
79
|
+
function hashFile(path) {
|
|
80
|
+
try {
|
|
81
|
+
return createHash("sha256").update(readFileSync(path)).digest("hex");
|
|
82
|
+
} catch {
|
|
83
|
+
return void 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
73
86
|
function readState(target, env) {
|
|
74
87
|
const path = statePath(target, env);
|
|
75
88
|
if (!existsSync(path)) return null;
|
|
@@ -79,7 +92,7 @@ function readState(target, env) {
|
|
|
79
92
|
return null;
|
|
80
93
|
}
|
|
81
94
|
}
|
|
82
|
-
async function
|
|
95
|
+
async function botConnectorCatalog(deps) {
|
|
83
96
|
const config = loadConfig(deps.cwd, deps.env);
|
|
84
97
|
const resolved = resolveModel(config, config.model, deps.env);
|
|
85
98
|
const key = readCredentials(deps.env)["bc-cloud"] || resolved.apiKey;
|
|
@@ -89,9 +102,28 @@ async function botConnectorModels(deps) {
|
|
|
89
102
|
});
|
|
90
103
|
if (!response.ok) throw new ConfigError(t("Could not load the BotConnector model catalog (HTTP {status}).", { status: response.status }));
|
|
91
104
|
const payload = await response.json();
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
105
|
+
const entries = (payload.data ?? []).flatMap((item) => {
|
|
106
|
+
const id = typeof item.id === "string" ? item.id : "";
|
|
107
|
+
if (!id) return [];
|
|
108
|
+
const strings = (value) => Array.isArray(value) ? value.filter((v) => typeof v === "string") : void 0;
|
|
109
|
+
const num = (value) => typeof value === "number" ? value : void 0;
|
|
110
|
+
return [{
|
|
111
|
+
id,
|
|
112
|
+
name: typeof item.name === "string" ? item.name : void 0,
|
|
113
|
+
context: num(item.context),
|
|
114
|
+
context_window: num(item.context_window),
|
|
115
|
+
contextWindow: num(item.contextWindow),
|
|
116
|
+
max_tokens: num(item.max_tokens),
|
|
117
|
+
maxTokens: num(item.maxTokens),
|
|
118
|
+
capabilities: strings(item.capabilities),
|
|
119
|
+
input: strings(item.input)
|
|
120
|
+
}];
|
|
121
|
+
});
|
|
122
|
+
if (!entries.length) throw new ConfigError(t("The BotConnector model catalog is empty; cannot configure external agents."));
|
|
123
|
+
return entries;
|
|
124
|
+
}
|
|
125
|
+
async function botConnectorModels(deps) {
|
|
126
|
+
return (await botConnectorCatalog(deps)).map((item) => item.id);
|
|
95
127
|
}
|
|
96
128
|
async function connectOpenCode(deps) {
|
|
97
129
|
const home = homeDir(deps.env);
|
|
@@ -622,7 +654,14 @@ async function connectHermes(deps) {
|
|
|
622
654
|
discover_models: true,
|
|
623
655
|
models: Object.fromEntries(models.map((id) => [id, {}]))
|
|
624
656
|
});
|
|
625
|
-
|
|
657
|
+
const providerRef = `custom:${HERMES_PROVIDER_ID}`;
|
|
658
|
+
const currentModel = doc.getIn(["model"]);
|
|
659
|
+
if (currentModel && typeof currentModel === "object" && !Array.isArray(currentModel)) {
|
|
660
|
+
doc.setIn(["model", "default"], model);
|
|
661
|
+
doc.setIn(["model", "provider"], providerRef);
|
|
662
|
+
} else {
|
|
663
|
+
doc.setIn(["model"], { default: model, provider: providerRef });
|
|
664
|
+
}
|
|
626
665
|
mkdirSync(hermesHome, { recursive: true });
|
|
627
666
|
writeFileSync(path, doc.toString());
|
|
628
667
|
writeState("hermes", {
|
|
@@ -634,13 +673,147 @@ async function connectHermes(deps) {
|
|
|
634
673
|
deps.out(`Config: ${path}`);
|
|
635
674
|
deps.out(t("API key: env {env} only (via key_env; a plaintext key in config.yaml is never written).", { env: HERMES_ENV_ID }));
|
|
636
675
|
}
|
|
676
|
+
function shellQuote(value) {
|
|
677
|
+
return `'${value.replace(/'/g, `'"'"'`)}'`;
|
|
678
|
+
}
|
|
679
|
+
function modelCapabilitySet(entry) {
|
|
680
|
+
return new Set([...entry.capabilities ?? [], ...entry.input ?? []].map((value) => value.toLowerCase()));
|
|
681
|
+
}
|
|
682
|
+
function modelContextWindow(entry) {
|
|
683
|
+
return entry.contextWindow ?? entry.context_window ?? entry.context;
|
|
684
|
+
}
|
|
685
|
+
function modelOutputLimit(entry) {
|
|
686
|
+
return entry.maxTokens ?? entry.max_tokens;
|
|
687
|
+
}
|
|
688
|
+
var positiveInt = (value) => typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.floor(value) : void 0;
|
|
689
|
+
async function connectCrush(deps) {
|
|
690
|
+
if (readState("crush", deps.env)) disconnect("crush", deps);
|
|
691
|
+
const home = homeDir(deps.env);
|
|
692
|
+
const configRoot = deps.env.XDG_CONFIG_HOME || join(home, ".config");
|
|
693
|
+
const configPath = join(configRoot, "crush", "crushrc");
|
|
694
|
+
const backup = safeBackup(configPath, deps.env);
|
|
695
|
+
const secret = ensureSecret(deps.env);
|
|
696
|
+
const catalog = await botConnectorCatalog(deps);
|
|
697
|
+
const models = catalog.map((item) => item.id);
|
|
698
|
+
const model = externalAgentDefaultModel(models, deps);
|
|
699
|
+
let existing = existsSync(configPath) ? readFileSync(configPath, "utf8") : "";
|
|
700
|
+
existing = stripManagedBlock(existing);
|
|
701
|
+
if (/(^|\n)\s*provider\s+add\s+botconnector\b/.test(existing)) {
|
|
702
|
+
throw new ConfigError(t("Crush already has a botconnector provider outside the BCCLI block: {path}", { path: configPath }));
|
|
703
|
+
}
|
|
704
|
+
const managed = [
|
|
705
|
+
"# BEGIN BCCLI BOTCONNECTOR",
|
|
706
|
+
"provider add botconnector \\",
|
|
707
|
+
` --name ${shellQuote("BotConnector")} \\`,
|
|
708
|
+
" --type openai-compat \\",
|
|
709
|
+
` --base-url ${shellQuote(BASE_URL)} \\`,
|
|
710
|
+
` --api-key "$(cat ${shellQuote(secret.replace(/\\/g, "/"))})" \\`,
|
|
711
|
+
" --discover-models true"
|
|
712
|
+
];
|
|
713
|
+
for (const entry of catalog) {
|
|
714
|
+
const caps = modelCapabilitySet(entry);
|
|
715
|
+
const args = [`model add ${shellQuote(`botconnector/${entry.id}`)}`, `--name ${shellQuote(entry.name || entry.id)}`];
|
|
716
|
+
const context = positiveInt(modelContextWindow(entry));
|
|
717
|
+
const output = positiveInt(modelOutputLimit(entry));
|
|
718
|
+
if (context) args.push(`--context-window ${context}`);
|
|
719
|
+
if (output) args.push(`--default-max-tokens ${output}`);
|
|
720
|
+
if (caps.has("reasoning")) args.push("--can-reason true");
|
|
721
|
+
if (caps.has("vision") || caps.has("image")) args.push("--supports-images true");
|
|
722
|
+
managed.push(args.join(" "));
|
|
723
|
+
}
|
|
724
|
+
managed.push(`model large ${shellQuote(`botconnector/${model}`)}`, "# END BCCLI BOTCONNECTOR");
|
|
725
|
+
const merged = existing.trim() ? `${existing.trimEnd()}
|
|
726
|
+
|
|
727
|
+
${managed.join("\n")}
|
|
728
|
+
` : `${managed.join("\n")}
|
|
729
|
+
`;
|
|
730
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
731
|
+
writeFileSync(configPath, merged);
|
|
732
|
+
writeState("crush", {
|
|
733
|
+
target: "crush",
|
|
734
|
+
files: [{ path: configPath, ...backup }],
|
|
735
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
736
|
+
}, deps.env);
|
|
737
|
+
deps.out(t("Crush is connected to BotConnector ({n} models available; large model {model}).", { n: catalog.length, model }));
|
|
738
|
+
deps.out(`Config: ${configPath}`);
|
|
739
|
+
deps.out("Provider: botconnector (openai-compat, discover-models=true)");
|
|
740
|
+
}
|
|
741
|
+
function kiloModelRow(entry) {
|
|
742
|
+
const caps = modelCapabilitySet(entry);
|
|
743
|
+
const row = { name: entry.name || entry.id };
|
|
744
|
+
if (caps.has("tools") || caps.has("tool") || caps.has("tool_use")) row.tool_call = true;
|
|
745
|
+
if (caps.has("reasoning")) row.reasoning = true;
|
|
746
|
+
if (caps.has("vision") || caps.has("image")) row.modalities = { input: ["text", "image"], output: ["text"] };
|
|
747
|
+
const context = positiveInt(modelContextWindow(entry));
|
|
748
|
+
const output = positiveInt(modelOutputLimit(entry));
|
|
749
|
+
if (context || output) row.limit = { ...context ? { context } : {}, ...output ? { output } : {} };
|
|
750
|
+
return row;
|
|
751
|
+
}
|
|
752
|
+
async function connectKilo(deps) {
|
|
753
|
+
if (readState("kilo", deps.env)) disconnect("kilo", deps);
|
|
754
|
+
const home = homeDir(deps.env);
|
|
755
|
+
const configRoot = deps.env.XDG_CONFIG_HOME || join(home, ".config");
|
|
756
|
+
const configPath = join(configRoot, "kilo", "kilo.json");
|
|
757
|
+
const backup = safeBackup(configPath, deps.env);
|
|
758
|
+
const secret = ensureSecret(deps.env);
|
|
759
|
+
const catalog = await botConnectorCatalog(deps);
|
|
760
|
+
const model = externalAgentDefaultModel(catalog.map((item) => item.id), deps);
|
|
761
|
+
let doc = {};
|
|
762
|
+
if (existsSync(configPath)) {
|
|
763
|
+
try {
|
|
764
|
+
doc = JSON.parse(readFileSync(configPath, "utf8"));
|
|
765
|
+
} catch {
|
|
766
|
+
throw new ConfigError(t("The Kilo global kilo.json is not valid JSON: {path}", { path: configPath }));
|
|
767
|
+
}
|
|
768
|
+
}
|
|
769
|
+
const providers = doc.provider && typeof doc.provider === "object" && !Array.isArray(doc.provider) ? { ...doc.provider } : {};
|
|
770
|
+
const current = providers[PROVIDER_ID];
|
|
771
|
+
const currentBase = current?.options?.baseURL;
|
|
772
|
+
if (currentBase && currentBase.replace(/\/+$/, "") !== BASE_URL) {
|
|
773
|
+
throw new ConfigError(t('Kilo already has a provider "{id}" with a different endpoint.', { id: PROVIDER_ID }));
|
|
774
|
+
}
|
|
775
|
+
providers[PROVIDER_ID] = {
|
|
776
|
+
name: "BotConnector",
|
|
777
|
+
npm: "@ai-sdk/openai-compatible",
|
|
778
|
+
models: Object.fromEntries(catalog.map((entry) => [entry.id, kiloModelRow(entry)])),
|
|
779
|
+
options: {
|
|
780
|
+
apiKey: `{file:${secret.replace(/\\/g, "/")}}`,
|
|
781
|
+
baseURL: BASE_URL
|
|
782
|
+
}
|
|
783
|
+
};
|
|
784
|
+
if (!doc.$schema) doc.$schema = "https://app.kilo.ai/config.json";
|
|
785
|
+
doc.provider = providers;
|
|
786
|
+
if (!doc.model) doc.model = `botconnector/${model}`;
|
|
787
|
+
mkdirSync(dirname(configPath), { recursive: true });
|
|
788
|
+
writeFileSync(configPath, `${JSON.stringify(doc, null, 2)}
|
|
789
|
+
`);
|
|
790
|
+
writeState("kilo", {
|
|
791
|
+
target: "kilo",
|
|
792
|
+
files: [{ path: configPath, ...backup }],
|
|
793
|
+
createdAt: (/* @__PURE__ */ new Date()).toISOString()
|
|
794
|
+
}, deps.env);
|
|
795
|
+
deps.out(t("Kilo Code is connected to BotConnector ({n} models available; suggested model {model}).", { n: catalog.length, model }));
|
|
796
|
+
deps.out(`Config: ${configPath}`);
|
|
797
|
+
deps.out("Provider: botconnector (@ai-sdk/openai-compatible)");
|
|
798
|
+
}
|
|
637
799
|
function disconnect(target, deps) {
|
|
638
800
|
const state = readState(target, deps.env);
|
|
639
801
|
if (!state) {
|
|
640
802
|
deps.out(t("{target}: not managed by BCCLI yet.", { target }));
|
|
641
803
|
return;
|
|
642
804
|
}
|
|
805
|
+
let leftBehind = 0;
|
|
643
806
|
for (const file of [...state.files].reverse()) {
|
|
807
|
+
if (file.hash !== void 0 && hashFile(file.path) !== file.hash) {
|
|
808
|
+
leftBehind++;
|
|
809
|
+
deps.err(
|
|
810
|
+
t(
|
|
811
|
+
'{target}: {path} changed after BCCLI connected it, so the old backup was not copied over it. Remove the BCCLI part (provider "botconnector" or the marked block) from that file by hand.',
|
|
812
|
+
{ target, path: file.path }
|
|
813
|
+
)
|
|
814
|
+
);
|
|
815
|
+
continue;
|
|
816
|
+
}
|
|
644
817
|
if (file.backup && existsSync(file.backup)) {
|
|
645
818
|
mkdirSync(dirname(file.path), { recursive: true });
|
|
646
819
|
copyFileSync(file.backup, file.path);
|
|
@@ -649,10 +822,15 @@ function disconnect(target, deps) {
|
|
|
649
822
|
}
|
|
650
823
|
}
|
|
651
824
|
rmSync(statePath(target, deps.env), { force: true });
|
|
652
|
-
deps.out(
|
|
825
|
+
deps.out(
|
|
826
|
+
leftBehind ? t(
|
|
827
|
+
"{target}: the BotConnector integration was removed. {n} file(s) were left untouched (see above); delete the BCCLI entries in them by hand for a clean removal.",
|
|
828
|
+
{ target, n: String(leftBehind) }
|
|
829
|
+
) : t("{target}: the BotConnector integration was removed and the config restored.", { target })
|
|
830
|
+
);
|
|
653
831
|
}
|
|
654
832
|
function listIntegrations(deps) {
|
|
655
|
-
for (const target of ["opencode", "aider", "cline", "deepseek-harness", "cursor", "openai-cli", "openai-sdk", "openai-compatible", "codex", "claude-code", "openclaw", "hermes"]) {
|
|
833
|
+
for (const target of ["opencode", "aider", "cline", "deepseek-harness", "cursor", "openai-cli", "openai-sdk", "openai-compatible", "codex", "claude-code", "openclaw", "hermes", "crush", "kilo"]) {
|
|
656
834
|
deps.out(`${target} ${readState(target, deps.env) ? "connected" : "not connected"}`);
|
|
657
835
|
}
|
|
658
836
|
}
|
|
@@ -676,6 +854,8 @@ async function runIntegrationCommand(args, deps) {
|
|
|
676
854
|
else if (target === "openai-compatible") await connectOpenAiCompatible(deps);
|
|
677
855
|
else if (target === "codex") await connectCodex(deps);
|
|
678
856
|
else if (target === "openclaw") await connectOpenClaw(deps);
|
|
857
|
+
else if (target === "crush") await connectCrush(deps);
|
|
858
|
+
else if (target === "kilo") await connectKilo(deps);
|
|
679
859
|
else if (target === "hermes") await connectHermes(deps);
|
|
680
860
|
else await connectClaudeCode(deps);
|
|
681
861
|
return 0;
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
defaultLoginDeps,
|
|
4
|
+
echoFor,
|
|
4
5
|
readLine,
|
|
5
6
|
readSecret,
|
|
6
7
|
runLogin
|
|
7
|
-
} from "./chunk-
|
|
8
|
-
import "./chunk-
|
|
9
|
-
import "./chunk-
|
|
10
|
-
import "./chunk-
|
|
8
|
+
} from "./chunk-KJIXA6MP.js";
|
|
9
|
+
import "./chunk-3CYQYHPK.js";
|
|
10
|
+
import "./chunk-TLCL6DC7.js";
|
|
11
|
+
import "./chunk-R754XIBJ.js";
|
|
11
12
|
export {
|
|
12
13
|
defaultLoginDeps,
|
|
14
|
+
echoFor,
|
|
13
15
|
readLine,
|
|
14
16
|
readSecret,
|
|
15
17
|
runLogin
|
package/dist/login.d.ts
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
export declare function readSecret(prompt: string): Promise<string>;
|
|
2
|
+
/** What readLine writes back to the terminal: printable input is visible, control keys are not. */
|
|
3
|
+
export declare function echoFor(ch: string): string | undefined;
|
|
2
4
|
/** Prompt TANPA masking (kode otorisasi harus terlihat saat di-paste). Ctrl+C -> exit 130. */
|
|
3
5
|
export declare function readLine(prompt: string): Promise<string>;
|
|
4
6
|
import type { CliArgs } from './args';
|
|
@@ -2,30 +2,30 @@
|
|
|
2
2
|
import {
|
|
3
3
|
CATALOG,
|
|
4
4
|
fillTemplate
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-JUC3ZOCV.js";
|
|
6
6
|
import {
|
|
7
7
|
authorizeMcpServer,
|
|
8
8
|
clearTokens
|
|
9
|
-
} from "./chunk-
|
|
9
|
+
} from "./chunk-3CYQYHPK.js";
|
|
10
10
|
import {
|
|
11
11
|
addGlobalServer,
|
|
12
12
|
globalMcpPath,
|
|
13
13
|
readMcpFile,
|
|
14
14
|
removeGlobalServer
|
|
15
|
-
} from "./chunk-
|
|
15
|
+
} from "./chunk-Q42ZGVAQ.js";
|
|
16
16
|
import {
|
|
17
17
|
bccliHome
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-TLCL6DC7.js";
|
|
19
19
|
import {
|
|
20
20
|
t
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-R754XIBJ.js";
|
|
22
22
|
|
|
23
23
|
// src/mcpCli.ts
|
|
24
24
|
async function runMcpCommand(args, deps) {
|
|
25
25
|
const home = bccliHome(deps.env);
|
|
26
26
|
const [action = "list", name] = args.subArgs;
|
|
27
27
|
if (action === "serve") {
|
|
28
|
-
const { runMcpServe } = await import("./serve-
|
|
28
|
+
const { runMcpServe } = await import("./serve-V6YVZTNR.js");
|
|
29
29
|
return runMcpServe(args, deps);
|
|
30
30
|
}
|
|
31
31
|
const installed = readMcpFile(globalMcpPath(home));
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import {
|
|
3
3
|
listAllModels
|
|
4
|
-
} from "./chunk-
|
|
5
|
-
import "./chunk-
|
|
6
|
-
import "./chunk-
|
|
7
|
-
import "./chunk-
|
|
4
|
+
} from "./chunk-INMSTUB2.js";
|
|
5
|
+
import "./chunk-6SDRWEPN.js";
|
|
6
|
+
import "./chunk-6JK4IBGK.js";
|
|
7
|
+
import "./chunk-7XD47KN5.js";
|
|
8
8
|
import {
|
|
9
9
|
loadConfig,
|
|
10
10
|
resolveModel
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-TLCL6DC7.js";
|
|
12
12
|
import {
|
|
13
13
|
t
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-R754XIBJ.js";
|
|
15
15
|
|
|
16
16
|
// src/modelsCli.ts
|
|
17
17
|
async function runModelsCommand(args, deps) {
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
import {
|
|
3
3
|
bccliHome,
|
|
4
4
|
globalConfigPath
|
|
5
|
-
} from "./chunk-
|
|
5
|
+
} from "./chunk-TLCL6DC7.js";
|
|
6
6
|
import {
|
|
7
7
|
t
|
|
8
|
-
} from "./chunk-
|
|
8
|
+
} from "./chunk-R754XIBJ.js";
|
|
9
9
|
|
|
10
10
|
// src/pluginsCli.ts
|
|
11
11
|
import { existsSync, mkdirSync, readFileSync, statSync, writeFileSync } from "fs";
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
addProviderKey,
|
|
4
|
+
runProviderCommand
|
|
5
|
+
} from "./chunk-SWNRA3EW.js";
|
|
6
|
+
import "./chunk-INMSTUB2.js";
|
|
7
|
+
import "./chunk-6SDRWEPN.js";
|
|
8
|
+
import "./chunk-6JK4IBGK.js";
|
|
9
|
+
import "./chunk-7XD47KN5.js";
|
|
10
|
+
import "./chunk-TLCL6DC7.js";
|
|
11
|
+
import "./chunk-R754XIBJ.js";
|
|
12
|
+
export {
|
|
13
|
+
addProviderKey,
|
|
14
|
+
runProviderCommand
|
|
15
|
+
};
|