@botconnector/bccli 0.4.0-beta.40 → 0.4.0-beta.42
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-5A7EXLCG.js → acp-PP7ZONVQ.js} +2 -2
- package/dist/{args-4SMOHFN5.js → args-3DGIMRTG.js} +4 -4
- package/dist/{chunk-ISCT3PN3.js → chunk-3P5N6UPF.js} +2 -2
- package/dist/{chunk-3HCOAJEQ.js → chunk-7F3IWBPQ.js} +1 -0
- package/dist/{chunk-JROUQ5YS.js → chunk-A2XKKKKU.js} +4 -4
- package/dist/{chunk-AS7VV7D3.js → chunk-ADS5FDWL.js} +12 -6
- package/dist/{chunk-M7LLJQ7M.js → chunk-AGIZBZ64.js} +64 -24
- package/dist/{chunk-NI5JZUZ3.js → chunk-AWNQDAOY.js} +1 -1
- package/dist/{chunk-ZMU7MXCH.js → chunk-DRK3XTVZ.js} +78 -19
- package/dist/{chunk-WH7XLDGZ.js → chunk-HQB227LD.js} +23 -21
- package/dist/{chunk-VM7HYAJS.js → chunk-HVGXCPDG.js} +1 -1
- package/dist/{chunk-SESBH44L.js → chunk-I422TPGX.js} +1 -1
- package/dist/chunk-I4THUZRD.js +145 -0
- package/dist/{chunk-LN32JIZR.js → chunk-LYFN6AEV.js} +4 -4
- package/dist/{chunk-GGNXHJL6.js → chunk-LYQHLA43.js} +2 -2
- package/dist/{chunk-AVB6M4JE.js → chunk-NFJPKNHL.js} +2 -2
- package/dist/{chunk-RV74TCEP.js → chunk-O74EQFYI.js} +3 -3
- package/dist/{chunk-PDVS4UWM.js → chunk-Q2ZBR4OU.js} +1 -1
- package/dist/{chunk-HE33XAPZ.js → chunk-QZM66F3A.js} +1 -1
- package/dist/{chunk-M23QBX3V.js → chunk-VBEX5YHF.js} +58 -2
- package/dist/cli.js +57 -37
- package/dist/{config-C4KLLDC6.js → config-LFT2FNSE.js} +3 -3
- package/dist/config-UKEKWMCG.js +30 -0
- package/dist/ghBotCli-DWQXAIKE.js +676 -0
- package/dist/{integrationCli-HR7CDUSI.js → integrationCli-RSJCJ3NW.js} +2 -2
- package/dist/login-L3SUO4H4.js +16 -0
- package/dist/{mcpCli-5QTXH7XJ.js → mcpCli-RSLEDQQ7.js} +6 -6
- package/dist/{modelsCli-DKTT3UZD.js → modelsCli-IKZLORLH.js} +6 -6
- package/dist/npmRunner-LU43GM3W.js +46 -0
- package/dist/oauthLogin-XHEMYL6L.js +210 -0
- package/dist/pluginsCli-MRS547WG.js +284 -0
- package/dist/providerCli-7GRUL3BS.js +15 -0
- package/dist/sdk.js +174 -51
- package/dist/{serve-I2VQUTHR.js → serve-A4E67R5E.js} +3 -3
- package/dist/{serve-JNQUP7CZ.js → serve-GFNJ5PSL.js} +18 -18
- package/dist/session-VKVBMGCC.js +12 -0
- package/dist/setup-XWX64X5Q.js +23 -0
- package/dist/{ui-GVIMUZNS.js → ui-STI6HSOR.js} +13 -13
- package/dist/{update-SZUG3YSB.js → update-KMWE2P2I.js} +2 -2
- package/package.json +1 -1
- package/dist/chunk-DSFHN5CH.js +0 -52
- package/dist/login-T5S6SPZA.js +0 -9
- package/dist/providerCli-DDH4ZZUY.js +0 -15
- package/dist/session-H2YL5RSB.js +0 -12
- package/dist/setup-I7UY7X7C.js +0 -23
package/dist/sdk.js
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import { parseArgs } from "util";
|
|
3
3
|
|
|
4
4
|
// src/config.ts
|
|
5
|
-
import { chmodSync, existsSync, mkdirSync, readFileSync, writeFileSync } from "fs";
|
|
5
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "fs";
|
|
6
6
|
import { homedir } from "os";
|
|
7
|
-
import { join } from "path";
|
|
7
|
+
import { dirname, join } from "path";
|
|
8
8
|
|
|
9
9
|
// src/presets.ts
|
|
10
10
|
var PRESETS = [
|
|
@@ -145,11 +145,13 @@ var ID = {
|
|
|
145
145
|
Usage:
|
|
146
146
|
bccli [task] interactive mode (optionally start with a task)
|
|
147
147
|
bccli -p "task" run one task without interaction (scripts/CI)
|
|
148
|
-
bccli login [provider]
|
|
148
|
+
bccli login [provider] OAuth login (or --key paste API key, --logout remove)
|
|
149
149
|
bccli models [provider] list models (default: the active provider)
|
|
150
150
|
bccli update install the newest bccli from npm
|
|
151
151
|
bccli acp run as an ACP agent for editors (Zed, ...)
|
|
152
152
|
bccli serve [--port N] serve sessions over HTTP+WS for IDEs/bots
|
|
153
|
+
bccli plugins list, install, remove, or update plugins
|
|
154
|
+
bccli gh-bot [serve] GitHub comment bot (off-by-default; needs config)
|
|
153
155
|
bccli provider list|add <id>|remove <id> manage providers (custom: --url <url> [--name N] [--key-env ENV])
|
|
154
156
|
bccli mcp list|add <name>|remove <name>|auth <name>|logout <name>|serve [--base-url <url>] manage MCP servers, or serve this account's tools over stdio
|
|
155
157
|
bccli integrations show the status of external agent integrations
|
|
@@ -173,11 +175,13 @@ Options:
|
|
|
173
175
|
Pemakaian:
|
|
174
176
|
bccli [tugas] mode interaktif (opsional langsung dengan tugas)
|
|
175
177
|
bccli -p "tugas" jalankan satu tugas tanpa interaksi (skrip/CI)
|
|
176
|
-
bccli login [provider]
|
|
178
|
+
bccli login [provider] login OAuth (atau --key tempel API key, --logout hapus)
|
|
177
179
|
bccli models [provider] daftar model (default: provider aktif)
|
|
178
180
|
bccli update pasang bccli terbaru dari npm
|
|
179
181
|
bccli acp jalankan sebagai agen ACP untuk editor (Zed, ...)
|
|
180
182
|
bccli serve [--port N] sajikan sesi lewat HTTP+WS untuk IDE/bot
|
|
183
|
+
bccli plugins daftar, install, remove, atau perbarui plugin
|
|
184
|
+
bccli gh-bot [serve] bot komentar GitHub (nonaktif default; butuh config)
|
|
181
185
|
bccli provider list|add <id>|remove <id> kelola provider (custom: --url <url> [--name N] [--key-env ENV])
|
|
182
186
|
bccli mcp list|add <nama>|remove <nama>|auth <nama>|logout <nama>|serve [--base-url <url>] kelola server MCP, atau layani tools akun ini lewat stdio
|
|
183
187
|
bccli integrations lihat status integrasi agent eksternal
|
|
@@ -221,6 +225,58 @@ Opsi:
|
|
|
221
225
|
"A new bccli is available: {latest} (you have {current}). Run: bccli update": "bccli versi baru tersedia: {latest} (kamu punya {current}). Jalankan: bccli update",
|
|
222
226
|
"Clipboard image saved to {path} \u2014 the path is inserted in the input; the model sees it when you send.": "Gambar clipboard disimpan ke {path} \u2014 path disisipkan ke input; model melihatnya saat kamu kirim.",
|
|
223
227
|
"No image on the clipboard.": "Tidak ada gambar di clipboard.",
|
|
228
|
+
"githubBot secret env {env} is empty \u2014 set it before enabling the bot.": "secret env githubBot {env} kosong \u2014 setel sebelum mengaktifkan bot.",
|
|
229
|
+
"githubBot.{name} must be an array of strings.": "githubBot.{name} harus berupa array of string.",
|
|
230
|
+
"githubBot.{name} must be a positive integer.": "githubBot.{name} harus bilangan bulat positif.",
|
|
231
|
+
"githubBot.enabled must be a boolean.": "githubBot.enabled harus boolean.",
|
|
232
|
+
"githubBot.path must be an absolute path like /github.": "githubBot.path harus path absolut seperti /github.",
|
|
233
|
+
"githubBot.secretEnv must be a non-empty string.": "githubBot.secretEnv harus string tidak kosong.",
|
|
234
|
+
"Ignored empty command in delivery {id}.": "Mengabaikan perintah kosong di delivery {id}.",
|
|
235
|
+
"Unknown action: {action}. Use serve.": "Aksi tidak dikenal: {action}. Gunakan serve.",
|
|
236
|
+
"gh CLI not found (exit {code}) \u2014 install GitHub CLI before enabling gh-bot.": "gh CLI tidak ditemukan (exit {code}) \u2014 pasang GitHub CLI sebelum mengaktifkan gh-bot.",
|
|
237
|
+
"Unknown action: {action}. Use list, install <spec>, remove <name>, or update [name].": "Aksi tidak dikenal: {action}. Gunakan list, install <spec>, remove <nama>, atau update [nama].",
|
|
238
|
+
"Cannot read the plugin config while running {action}: {reason} at {path} \u2014 no changes were made; fix the config, then retry.": "Tidak bisa membaca config plugin saat menjalankan {action}: {reason} di {path} \u2014 tidak ada perubahan; perbaiki config, lalu coba lagi.",
|
|
239
|
+
"npm install failed ({code}): {stderr}": "npm install gagal ({code}): {stderr}",
|
|
240
|
+
"install requires a package spec: bccli plugins install <spec>": "install butuh spesifikasi paket: bccli plugins install <spec>",
|
|
241
|
+
"Invalid npm package spec: {spec}. Use a name, @scope/name, name@version, or name@tag \u2014 URLs, git, paths, and flags are not accepted.": "Spesifikasi paket npm tidak valid: {spec}. Pakai nama, @scope/nama, nama@versi, atau nama@tag \u2014 URL, git, path, dan flag tidak diterima.",
|
|
242
|
+
"npm finished but the config could not be read: {reason} \u2014 the entry list is unchanged; fix {path}, then rerun the same command (safe to repeat).": "npm selesai tetapi config gagal dibaca: {reason} \u2014 daftar entry tidak berubah; perbaiki {path}, lalu jalankan ulang perintah yang sama (aman diulang).",
|
|
243
|
+
"npm finished but the config update failed: {reason}. {name} stays enabled through its existing entry {entry}; the package files may already be new. Fix the config error at {path} \u2014 no entry change was required.": "npm selesai tetapi pembaruan config gagal: {reason}. {name} tetap aktif lewat entry lama {entry}; file paket mungkin sudah baru. Perbaiki error config di {path} \u2014 tidak ada perubahan entry yang diperlukan.",
|
|
244
|
+
'npm finished but the config update failed: {reason}. {name} is installed but NOT enabled \u2014 fix the config error, then run "bccli plugins install {name}" again (safe to repeat), or add {entry} to {path} manually.': 'npm selesai tetapi pembaruan config gagal: {reason}. {name} terpasang tetapi TIDAK aktif \u2014 perbaiki error config, lalu jalankan lagi "bccli plugins install {name}" (aman diulang), atau tambahkan {entry} ke {path} secara manual.',
|
|
245
|
+
"{name} is already enabled.": "{name} sudah aktif.",
|
|
246
|
+
"{name} installed and enabled.": "{name} terpasang dan aktif.",
|
|
247
|
+
"Malformed managed entry: {entry} \u2014 fix it manually in {path}; bccli will not pass it to npm.": "Entry terelola rusak: {entry} \u2014 perbaiki manual di {path}; bccli tidak akan meneruskannya ke npm.",
|
|
248
|
+
"{entry} is a manual plugin entry \u2014 edit the global config.json directly to remove it.": "{entry} adalah entry plugin manual \u2014 edit config.json global langsung untuk menghapusnya.",
|
|
249
|
+
"{name} is not an installed managed plugin.": "{name} bukan plugin terelola yang terpasang.",
|
|
250
|
+
"Unknown plugin: {arg}.": "Plugin tidak dikenal: {arg}.",
|
|
251
|
+
"remove requires a plugin name: bccli plugins remove <name>": "remove butuh nama plugin: bccli plugins remove <nama>",
|
|
252
|
+
'npm removed the files of {name} but the plugin config could not be read: {reason} \u2014 the entry list is unchanged; fix {path}, then run "bccli plugins remove {name}" again (safe to repeat).': 'npm sudah menghapus file {name} tetapi config plugin gagal dibaca: {reason} \u2014 daftar entry tidak berubah; perbaiki {path}, lalu jalankan lagi "bccli plugins remove {name}" (aman diulang).',
|
|
253
|
+
'npm removed the files of {name} but the config entry {entry} remains: {reason}. bccli will refuse to start while that entry is listed \u2014 fix the config error at {path}, then run "bccli plugins remove {name}" again (safe to repeat), or delete the entry manually.': 'npm sudah menghapus file {name} tetapi entry config {entry} tertinggal: {reason}. bccli menolak start selama entry itu terdaftar \u2014 perbaiki error config di {path}, lalu jalankan lagi "bccli plugins remove {name}" (aman diulang), atau hapus entry secara manual.',
|
|
254
|
+
"Skipping malformed entry: {entry} \u2014 fix it manually in {path}.": "Melewatkan entry rusak: {entry} \u2014 perbaiki manual di {path}.",
|
|
255
|
+
"No managed plugins to update.": "Tidak ada plugin terelola untuk diperbarui.",
|
|
256
|
+
"update requires a plugin name or no argument: bccli plugins update [name]": "update butuh nama plugin atau tanpa argumen: bccli plugins update [nama]",
|
|
257
|
+
"{name} updated to latest.": "{name} diperbarui ke versi terbaru.",
|
|
258
|
+
"Use either --key or --logout, not both.": "Pakai --key atau --logout, jangan keduanya.",
|
|
259
|
+
"Logout is not supported for {id}; use bccli provider remove {id} to delete its stored key and config.": "Logout tidak didukung untuk {id}; pakai bccli provider remove {id} untuk menghapus key dan config tersimpan.",
|
|
260
|
+
"bccli login openrouter needs a terminal. Use --key to paste an API key instead.": "bccli login openrouter butuh terminal. Pakai --key untuk menempel API key.",
|
|
261
|
+
"Could not open the browser automatically \u2014 open this URL manually: {url}": "Tidak bisa membuka browser otomatis \u2014 buka URL ini manual: {url}",
|
|
262
|
+
"Paste the authorization code from the browser: ": "Tempel kode otorisasi dari browser: ",
|
|
263
|
+
"Failed to read the authorization code: {reason}. Your stored credential was not changed.": "Gagal membaca kode otorisasi: {reason}. Credential tersimpan tidak berubah.",
|
|
264
|
+
"Authorization code is empty. Run bccli login openrouter again.": "Kode otorisasi kosong. Jalankan bccli login openrouter lagi.",
|
|
265
|
+
"Login cancelled.": "Login dibatalkan.",
|
|
266
|
+
"The exchange with OpenRouter timed out after {seconds}s. Your stored credential was not changed.": "Pertukaran dengan OpenRouter habis waktu setelah {seconds} dtk. Credential tersimpan tidak berubah.",
|
|
267
|
+
"Could not reach OpenRouter: {reason}. Your stored credential was not changed.": "Tidak bisa menghubungi OpenRouter: {reason}. Credential tersimpan tidak berubah.",
|
|
268
|
+
"Authorization code expired \u2014 codes are valid for 10 minutes. Run bccli login openrouter again.": "Kode otorisasi kedaluwarsa \u2014 kode berlaku 10 menit. Jalankan bccli login openrouter lagi.",
|
|
269
|
+
"OpenRouter rejected the authorization code (403): {detail}. Run bccli login openrouter again.": "OpenRouter menolak kode otorisasi (403): {detail}. Jalankan bccli login openrouter lagi.",
|
|
270
|
+
"OpenRouter did not return an API key in the expected format. Your stored credential was not changed.": "OpenRouter tidak mengembalikan API key dengan format yang diharapkan. Credential tersimpan tidak berubah.",
|
|
271
|
+
"OpenRouter exchange failed ({status}): {detail}. Your stored credential was not changed.": "Pertukaran OpenRouter gagal ({status}): {detail}. Credential tersimpan tidak berubah.",
|
|
272
|
+
"The key was created on your OpenRouter account but could not be saved locally ({reason}). Manage it (copy or revoke) at {dashboard}, then run bccli login openrouter again.": "Key sudah dibuat di akun OpenRouter kamu tetapi gagal disimpan lokal ({reason}). Kelola (salin atau cabut) di {dashboard}, lalu jalankan bccli login openrouter lagi.",
|
|
273
|
+
"Logged in: openrouter credential saved.": "Login berhasil: credential openrouter tersimpan.",
|
|
274
|
+
"Note: {env} is set in the environment and takes priority over the stored credential.": "Catatan: {env} ter-set di environment dan lebih diutamakan daripada credential tersimpan.",
|
|
275
|
+
"Verify with: bccli models openrouter (your key is never printed).": "Verifikasi dengan: bccli models openrouter (key kamu tidak pernah dicetak).",
|
|
276
|
+
"openrouter credential removed.": "credential openrouter dihapus.",
|
|
277
|
+
"openrouter credential was not stored.": "credential openrouter tidak tersimpan.",
|
|
278
|
+
"Note: {env} is still set in the environment and will keep being used.": "Catatan: {env} masih ter-set di environment dan akan terus dipakai.",
|
|
279
|
+
"To revoke keys on your account, open {dashboard}.": "Untuk mencabut key akun kamu, buka {dashboard}.",
|
|
224
280
|
"Budget exceeded ({kind}): {used} of {limit}. Further model calls are blocked; raise usageCap in ~/.bccli/config.json.": "Anggaran terlampaui ({kind}): {used} dari {limit}. Panggilan model selanjutnya diblokir; naikkan usageCap di ~/.bccli/config.json.",
|
|
225
281
|
"Verifying edits: {cmds}": "Memverifikasi edit: {cmds}",
|
|
226
282
|
"Verification passed.": "Verifikasi lulus.",
|
|
@@ -820,6 +876,8 @@ function parseCliArgs(argv) {
|
|
|
820
876
|
name: { type: "string" },
|
|
821
877
|
"key-env": { type: "string" },
|
|
822
878
|
value: { type: "string", multiple: true },
|
|
879
|
+
key: { type: "boolean" },
|
|
880
|
+
logout: { type: "boolean" },
|
|
823
881
|
port: { type: "string" },
|
|
824
882
|
host: { type: "string" },
|
|
825
883
|
token: { type: "string" },
|
|
@@ -840,7 +898,7 @@ function parseCliArgs(argv) {
|
|
|
840
898
|
throw new ConfigError(t("--output-format must be one of: {formats}", { formats: "text, json, stream-json" }));
|
|
841
899
|
}
|
|
842
900
|
const [first, ...rest] = positionals;
|
|
843
|
-
const SUBCOMMANDS = ["login", "models", "update", "acp", "serve", "provider", "mcp", "connect", "disconnect", "integrations"];
|
|
901
|
+
const SUBCOMMANDS = ["login", "models", "update", "acp", "serve", "plugins", "gh-bot", "provider", "mcp", "connect", "disconnect", "integrations"];
|
|
844
902
|
const command = SUBCOMMANDS.includes(first) ? first : "run";
|
|
845
903
|
const words2 = command === "run" ? positionals : rest;
|
|
846
904
|
const port = values.port !== void 0 ? Number(values.port) : void 0;
|
|
@@ -867,7 +925,9 @@ function parseCliArgs(argv) {
|
|
|
867
925
|
help: !!values.help,
|
|
868
926
|
version: !!values.version,
|
|
869
927
|
loginProvider: command === "login" ? rest[0] ?? "bc-cloud" : void 0,
|
|
870
|
-
|
|
928
|
+
key: !!values.key,
|
|
929
|
+
logout: !!values.logout,
|
|
930
|
+
subArgs: ["models", "plugins", "gh-bot", "provider", "mcp", "connect", "disconnect", "integrations"].includes(command) ? rest : [],
|
|
871
931
|
url: values.url,
|
|
872
932
|
name: values.name,
|
|
873
933
|
keyEnv: values["key-env"],
|
|
@@ -1815,6 +1875,42 @@ function recoverTextToolCalls(text, tools) {
|
|
|
1815
1875
|
|
|
1816
1876
|
// src/hooks.ts
|
|
1817
1877
|
import { spawn } from "child_process";
|
|
1878
|
+
|
|
1879
|
+
// src/tools/shell.ts
|
|
1880
|
+
import { existsSync as existsSync2 } from "fs";
|
|
1881
|
+
import { win32 } from "path";
|
|
1882
|
+
var PS_PRELUDE = "[Console]::OutputEncoding=[Text.Encoding]::UTF8; $OutputEncoding=[Text.Encoding]::UTF8; ";
|
|
1883
|
+
var PS_EPILOGUE = "\nif ($LASTEXITCODE -ne $null) { exit $LASTEXITCODE } elseif (-not $?) { exit 1 }";
|
|
1884
|
+
function gitBashCandidates(env) {
|
|
1885
|
+
const roots = [env.ProgramW6432, env.ProgramFiles, env["ProgramFiles(x86)"], env.LOCALAPPDATA && win32.join(env.LOCALAPPDATA, "Programs")];
|
|
1886
|
+
const fromRoots = roots.filter((root) => !!root).map((root) => win32.join(root, "Git", "bin", "bash.exe"));
|
|
1887
|
+
const fromPath = (env.PATH ?? env.Path ?? "").split(";").filter(Boolean).map((dir) => win32.join(dir, "..", "bin", "bash.exe"));
|
|
1888
|
+
return [...fromRoots, ...fromPath];
|
|
1889
|
+
}
|
|
1890
|
+
function resolveShell(deps) {
|
|
1891
|
+
if (deps.platform !== "win32") return void 0;
|
|
1892
|
+
const bash = gitBashCandidates(deps.env).find((candidate) => deps.exists(candidate));
|
|
1893
|
+
if (bash) return { name: "bash", file: bash, args: (command) => ["-c", command] };
|
|
1894
|
+
return {
|
|
1895
|
+
name: "powershell",
|
|
1896
|
+
file: "powershell.exe",
|
|
1897
|
+
args: (command) => [
|
|
1898
|
+
"-NoProfile",
|
|
1899
|
+
"-NonInteractive",
|
|
1900
|
+
"-ExecutionPolicy",
|
|
1901
|
+
"Bypass",
|
|
1902
|
+
"-EncodedCommand",
|
|
1903
|
+
Buffer.from(PS_PRELUDE + command + PS_EPILOGUE, "utf16le").toString("base64")
|
|
1904
|
+
]
|
|
1905
|
+
};
|
|
1906
|
+
}
|
|
1907
|
+
var cachedDefault = null;
|
|
1908
|
+
function defaultShell() {
|
|
1909
|
+
if (cachedDefault === null) cachedDefault = resolveShell({ platform: process.platform, env: process.env, exists: existsSync2 });
|
|
1910
|
+
return cachedDefault;
|
|
1911
|
+
}
|
|
1912
|
+
|
|
1913
|
+
// src/hooks.ts
|
|
1818
1914
|
var DEFAULT_TIMEOUT_MS = 1e4;
|
|
1819
1915
|
var MAX_CAPTURE = 8192;
|
|
1820
1916
|
function globToRegExp(pattern) {
|
|
@@ -1842,8 +1938,18 @@ function runOne(command, event, payload, opts) {
|
|
|
1842
1938
|
resolve4(result);
|
|
1843
1939
|
};
|
|
1844
1940
|
let child;
|
|
1941
|
+
const shell = defaultShell();
|
|
1845
1942
|
try {
|
|
1846
|
-
|
|
1943
|
+
if (shell) {
|
|
1944
|
+
child = spawn(shell.file, shell.args(command), {
|
|
1945
|
+
shell: false,
|
|
1946
|
+
env,
|
|
1947
|
+
cwd: opts.cwd ?? process.cwd(),
|
|
1948
|
+
stdio: ["ignore", "pipe", "pipe"]
|
|
1949
|
+
});
|
|
1950
|
+
} else {
|
|
1951
|
+
child = spawn(command, { shell: true, env, cwd: opts.cwd ?? process.cwd(), stdio: ["ignore", "pipe", "pipe"] });
|
|
1952
|
+
}
|
|
1847
1953
|
} catch (error) {
|
|
1848
1954
|
resolve4({ failure: error.message });
|
|
1849
1955
|
return;
|
|
@@ -1900,6 +2006,7 @@ import { z as z8 } from "zod";
|
|
|
1900
2006
|
|
|
1901
2007
|
// src/tools/bash.ts
|
|
1902
2008
|
import { spawn as spawn2 } from "child_process";
|
|
2009
|
+
import { existsSync as existsSync3 } from "fs";
|
|
1903
2010
|
import { z } from "zod";
|
|
1904
2011
|
|
|
1905
2012
|
// src/tools/sandbox.ts
|
|
@@ -1984,8 +2091,8 @@ function killAllCommands() {
|
|
|
1984
2091
|
}
|
|
1985
2092
|
var backgrounds = /* @__PURE__ */ new Map();
|
|
1986
2093
|
var nextBackgroundId = 1;
|
|
1987
|
-
function startBackground(command, cwd, env) {
|
|
1988
|
-
const child = spawnChild(command, cwd, env);
|
|
2094
|
+
function startBackground(command, cwd, env, shell) {
|
|
2095
|
+
const child = spawnChild(command, cwd, env, shell);
|
|
1989
2096
|
const task = {
|
|
1990
2097
|
id: nextBackgroundId++,
|
|
1991
2098
|
command: Array.isArray(command) ? command.join(" ") : command,
|
|
@@ -2035,8 +2142,8 @@ function startBackground(command, cwd, env) {
|
|
|
2035
2142
|
return task;
|
|
2036
2143
|
}
|
|
2037
2144
|
function backgroundStatus(task) {
|
|
2038
|
-
if (task.status === "running") return `[running ${Math.round((Date.now() - task.startedAt) / 1e3)}s]`;
|
|
2039
2145
|
if (task.killed) return "[killed]";
|
|
2146
|
+
if (task.status === "running") return `[running ${Math.round((Date.now() - task.startedAt) / 1e3)}s]`;
|
|
2040
2147
|
return `[exit code ${task.exitCode}]`;
|
|
2041
2148
|
}
|
|
2042
2149
|
function backgroundOutput(task) {
|
|
@@ -2046,8 +2153,14 @@ ${task.tail}` : task.head + task.tail;
|
|
|
2046
2153
|
return `${body.trimEnd()}
|
|
2047
2154
|
${backgroundStatus(task)}`.trimStart();
|
|
2048
2155
|
}
|
|
2049
|
-
function spawnChild(command, cwd, env) {
|
|
2050
|
-
|
|
2156
|
+
function spawnChild(command, cwd, env, shell) {
|
|
2157
|
+
if (Array.isArray(command)) {
|
|
2158
|
+
return spawn2(command[0], command.slice(1), { cwd, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"], env });
|
|
2159
|
+
}
|
|
2160
|
+
if (shell) {
|
|
2161
|
+
return spawn2(shell.file, shell.args(command), { cwd, shell: false, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"], env });
|
|
2162
|
+
}
|
|
2163
|
+
return spawn2(command, { cwd, shell: true, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"], env });
|
|
2051
2164
|
}
|
|
2052
2165
|
var NETWORK_PATTERNS = [
|
|
2053
2166
|
/\b(curl|wget|ftp|scp|sftp|rsync|lynx|telnet)\b/i,
|
|
@@ -2083,7 +2196,7 @@ function offlineEnv(env = process.env) {
|
|
|
2083
2196
|
}
|
|
2084
2197
|
function runCommand(command, opts) {
|
|
2085
2198
|
return new Promise((resolve4) => {
|
|
2086
|
-
const child = spawnChild(command, opts.cwd, opts.env);
|
|
2199
|
+
const child = spawnChild(command, opts.cwd, opts.env, opts.shell ?? defaultShell());
|
|
2087
2200
|
if (!exitHookInstalled) {
|
|
2088
2201
|
process.on("exit", killAllCommands);
|
|
2089
2202
|
exitHookInstalled = true;
|
|
@@ -2151,13 +2264,20 @@ var BASH_SCHEMA = z.object({
|
|
|
2151
2264
|
task_id: z.number().int().optional().describe("Poll a background task started with background: true (omit command)"),
|
|
2152
2265
|
kill: z.boolean().optional().describe("With task_id: stop the background task")
|
|
2153
2266
|
});
|
|
2267
|
+
var SHELL_NOTE = {
|
|
2268
|
+
bash: "Shell: Git Bash. Unix tools such as tail, grep, ls, sed and head are available.",
|
|
2269
|
+
powershell: "Shell: Windows PowerShell 5.1. Unix tools such as tail, grep, ls, sed and head are NOT installed; use PowerShell equivalents (Select-Object -Last 40, Select-String, Get-ChildItem, Get-Content)."
|
|
2270
|
+
};
|
|
2154
2271
|
function createBashTool(options = {}) {
|
|
2155
2272
|
const offline = options.networkPolicy === "offline";
|
|
2156
2273
|
const sandbox = options.sandbox === true;
|
|
2157
2274
|
const platform = options.platform ?? process.platform;
|
|
2275
|
+
const shell = resolveShell({ platform, env: process.env, exists: existsSync3, ...options.shellDeps });
|
|
2158
2276
|
const childEnv = offline ? offlineEnv() : void 0;
|
|
2277
|
+
const shellNote = shell ? `
|
|
2278
|
+
${SHELL_NOTE[shell.name]}` : "";
|
|
2159
2279
|
const description = `${offline ? `${BASH_DESCRIPTION}
|
|
2160
|
-
Network access is off (networkPolicy "offline"): internet commands such as curl, wget, git fetch/push/clone, package installs (npm, pip, ...), gh, and docker pull are blocked.` : BASH_DESCRIPTION}${sandbox ? "\nCommands run inside an OS sandbox: file writes are limited to the working directory and temp areas." : ""}`;
|
|
2280
|
+
Network access is off (networkPolicy "offline"): internet commands such as curl, wget, git fetch/push/clone, package installs (npm, pip, ...), gh, and docker pull are blocked.` : BASH_DESCRIPTION}${sandbox ? "\nCommands run inside an OS sandbox: file writes are limited to the working directory and temp areas." : ""}${shellNote}`;
|
|
2161
2281
|
return defineTool({
|
|
2162
2282
|
name: "bash",
|
|
2163
2283
|
description,
|
|
@@ -2197,7 +2317,7 @@ Network access is off (networkPolicy "offline"): internet commands such as curl,
|
|
|
2197
2317
|
}
|
|
2198
2318
|
if (input.background) {
|
|
2199
2319
|
if (!input.command) return { output: 'The "command" argument is required to start a background task.', isError: true };
|
|
2200
|
-
const task = startBackground(exec, ctx.cwd, childEnv);
|
|
2320
|
+
const task = startBackground(exec, ctx.cwd, childEnv, shell);
|
|
2201
2321
|
return {
|
|
2202
2322
|
output: `Background task #${task.id} started: ${input.command}
|
|
2203
2323
|
Poll it with {task_id: ${task.id}}; stop it with {task_id: ${task.id}, kill: true}.`
|
|
@@ -2210,7 +2330,8 @@ Poll it with {task_id: ${task.id}}; stop it with {task_id: ${task.id}, kill: tru
|
|
|
2210
2330
|
cwd: ctx.cwd,
|
|
2211
2331
|
timeoutMs: input.timeout_ms ?? 12e4,
|
|
2212
2332
|
signal: ctx.signal,
|
|
2213
|
-
env: childEnv
|
|
2333
|
+
env: childEnv,
|
|
2334
|
+
shell
|
|
2214
2335
|
});
|
|
2215
2336
|
const status = r.timedOut ? `[stopped: timeout after ${Math.round((input.timeout_ms ?? 12e4) / 1e3)} seconds]` : r.aborted ? "[cancelled by the user]" : `[exit code ${r.exitCode}]`;
|
|
2216
2337
|
return { output: `${r.output.trimEnd()}
|
|
@@ -2926,9 +3047,9 @@ function createReadTool(options = {}) {
|
|
|
2926
3047
|
var readTool = createReadTool({ vision: true });
|
|
2927
3048
|
|
|
2928
3049
|
// src/tools/write.ts
|
|
2929
|
-
import { existsSync as
|
|
3050
|
+
import { existsSync as existsSync4 } from "fs";
|
|
2930
3051
|
import { mkdir, readFile as readFile4, writeFile as writeFile2 } from "fs/promises";
|
|
2931
|
-
import { dirname } from "path";
|
|
3052
|
+
import { dirname as dirname2 } from "path";
|
|
2932
3053
|
import { z as z7 } from "zod";
|
|
2933
3054
|
var writeTool = defineTool({
|
|
2934
3055
|
name: "write",
|
|
@@ -2941,21 +3062,21 @@ var writeTool = defineTool({
|
|
|
2941
3062
|
target: (input) => input.path,
|
|
2942
3063
|
async validate(input, ctx) {
|
|
2943
3064
|
const abs = resolvePath(ctx.cwd, input.path);
|
|
2944
|
-
return
|
|
3065
|
+
return existsSync4(abs) && !ctx.readFiles.has(abs) ? `${input.path} already exists. Read it with read before overwriting it.` : void 0;
|
|
2945
3066
|
},
|
|
2946
3067
|
async preview(input, ctx) {
|
|
2947
3068
|
const abs = resolvePath(ctx.cwd, input.path);
|
|
2948
|
-
const old =
|
|
3069
|
+
const old = existsSync4(abs) ? await readFile4(abs, "utf8") : "";
|
|
2949
3070
|
return formatDiff(diffLines(old, input.content));
|
|
2950
3071
|
},
|
|
2951
3072
|
async run(input, ctx) {
|
|
2952
3073
|
const abs = resolvePath(ctx.cwd, input.path);
|
|
2953
|
-
if (
|
|
3074
|
+
if (existsSync4(abs) && !ctx.readFiles.has(abs)) {
|
|
2954
3075
|
return { output: `${input.path} already exists. Read it with read before overwriting it.`, isError: true };
|
|
2955
3076
|
}
|
|
2956
3077
|
try {
|
|
2957
3078
|
await ctx.checkpoint?.(abs);
|
|
2958
|
-
await mkdir(
|
|
3079
|
+
await mkdir(dirname2(abs), { recursive: true });
|
|
2959
3080
|
await writeFile2(abs, input.content);
|
|
2960
3081
|
} catch (error) {
|
|
2961
3082
|
return { output: `Failed to write ${input.path}: ${errorCode(error)}`, isError: true };
|
|
@@ -3428,7 +3549,7 @@ ${t("This model may not support tool calling. Try another model with /model.")}`
|
|
|
3428
3549
|
};
|
|
3429
3550
|
|
|
3430
3551
|
// src/checkpoints.ts
|
|
3431
|
-
import { existsSync as
|
|
3552
|
+
import { existsSync as existsSync5, statSync } from "fs";
|
|
3432
3553
|
import { readFile as readFile5, rm, writeFile as writeFile3 } from "fs/promises";
|
|
3433
3554
|
var MAX_TURNS = 20;
|
|
3434
3555
|
var MAX_BYTES2 = 2 * 1024 * 1024;
|
|
@@ -3466,7 +3587,7 @@ var CheckpointStore = class {
|
|
|
3466
3587
|
if (!this.current) this.beginTurn();
|
|
3467
3588
|
const turn = this.current;
|
|
3468
3589
|
if (turn.has(path)) return;
|
|
3469
|
-
if (!
|
|
3590
|
+
if (!existsSync5(path)) turn.set(path, null);
|
|
3470
3591
|
else if (statSync(path).size > MAX_BYTES2) turn.set(path, "skipped");
|
|
3471
3592
|
else turn.set(path, await readFile5(path));
|
|
3472
3593
|
while (this.turns() > MAX_TURNS) this.history.shift();
|
|
@@ -3534,7 +3655,7 @@ var CheckpointStore = class {
|
|
|
3534
3655
|
continue;
|
|
3535
3656
|
}
|
|
3536
3657
|
try {
|
|
3537
|
-
if (!
|
|
3658
|
+
if (!existsSync5(path)) into.set(path, null);
|
|
3538
3659
|
else if (statSync(path).size > MAX_BYTES2) into.set(path, "skipped");
|
|
3539
3660
|
else into.set(path, await readFile5(path));
|
|
3540
3661
|
} catch {
|
|
@@ -3593,8 +3714,8 @@ import { z as z9 } from "zod";
|
|
|
3593
3714
|
|
|
3594
3715
|
// src/mcp/config.ts
|
|
3595
3716
|
import { createHash } from "crypto";
|
|
3596
|
-
import { chmodSync as chmodSync2, existsSync as
|
|
3597
|
-
import { dirname as
|
|
3717
|
+
import { chmodSync as chmodSync2, existsSync as existsSync6, mkdirSync as mkdirSync2, readFileSync as readFileSync3, writeFileSync as writeFileSync2 } from "fs";
|
|
3718
|
+
import { dirname as dirname3, join as join3, resolve as resolve3 } from "path";
|
|
3598
3719
|
var ENV_REF = /\$\{([A-Za-z_][A-Za-z0-9_]*)(?::-([^}]*))?\}/g;
|
|
3599
3720
|
function expandEnvVars(config, env) {
|
|
3600
3721
|
const expand = (value) => value.replace(ENV_REF, (match, name, fallback) => {
|
|
@@ -3616,14 +3737,14 @@ function expandEnvVars(config, env) {
|
|
|
3616
3737
|
|
|
3617
3738
|
// src/mcp/oauth.ts
|
|
3618
3739
|
import { spawn as spawn3 } from "child_process";
|
|
3619
|
-
import { chmodSync as chmodSync3, existsSync as
|
|
3740
|
+
import { chmodSync as chmodSync3, existsSync as existsSync7, mkdirSync as mkdirSync3, readFileSync as readFileSync4, writeFileSync as writeFileSync3 } from "fs";
|
|
3620
3741
|
import { createServer } from "http";
|
|
3621
|
-
import { dirname as
|
|
3742
|
+
import { dirname as dirname4, join as join4 } from "path";
|
|
3622
3743
|
import { auth } from "@modelcontextprotocol/sdk/client/auth.js";
|
|
3623
3744
|
var oauthStorePath = (home) => join4(home, "mcp-oauth.json");
|
|
3624
3745
|
function readStore(home) {
|
|
3625
3746
|
const path = oauthStorePath(home);
|
|
3626
|
-
if (!
|
|
3747
|
+
if (!existsSync7(path)) return {};
|
|
3627
3748
|
try {
|
|
3628
3749
|
return JSON.parse(readFileSync4(path, "utf8"));
|
|
3629
3750
|
} catch {
|
|
@@ -3632,7 +3753,7 @@ function readStore(home) {
|
|
|
3632
3753
|
}
|
|
3633
3754
|
function writeStore(home, store) {
|
|
3634
3755
|
const path = oauthStorePath(home);
|
|
3635
|
-
mkdirSync3(
|
|
3756
|
+
mkdirSync3(dirname4(path), { recursive: true });
|
|
3636
3757
|
writeFileSync3(path, `${JSON.stringify(store, null, 2)}
|
|
3637
3758
|
`, { mode: 384 });
|
|
3638
3759
|
chmodSync3(path, 384);
|
|
@@ -3887,21 +4008,21 @@ var McpManager = class {
|
|
|
3887
4008
|
import { homedir as homedir2 } from "os";
|
|
3888
4009
|
|
|
3889
4010
|
// src/context.ts
|
|
3890
|
-
import { existsSync as
|
|
3891
|
-
import { dirname as
|
|
4011
|
+
import { existsSync as existsSync8, readFileSync as readFileSync5 } from "fs";
|
|
4012
|
+
import { dirname as dirname5, join as join5 } from "path";
|
|
3892
4013
|
var FILES = ["AGENTS.md", "BCCLI.md"];
|
|
3893
4014
|
function readIf(path) {
|
|
3894
4015
|
try {
|
|
3895
|
-
return
|
|
4016
|
+
return existsSync8(path) ? readFileSync5(path, "utf8").trim() : void 0;
|
|
3896
4017
|
} catch {
|
|
3897
4018
|
return void 0;
|
|
3898
4019
|
}
|
|
3899
4020
|
}
|
|
3900
4021
|
function instructionPaths(cwd, home) {
|
|
3901
4022
|
const dirs2 = [];
|
|
3902
|
-
for (let dir = cwd; ; dir =
|
|
4023
|
+
for (let dir = cwd; ; dir = dirname5(dir)) {
|
|
3903
4024
|
dirs2.unshift(dir);
|
|
3904
|
-
if (
|
|
4025
|
+
if (dirname5(dir) === dir) break;
|
|
3905
4026
|
}
|
|
3906
4027
|
return [join5(home, "BCCLI.md"), ...dirs2.flatMap((dir) => FILES.map((name) => join5(dir, name)))];
|
|
3907
4028
|
}
|
|
@@ -3915,9 +4036,9 @@ ${text}`);
|
|
|
3915
4036
|
return parts.join("\n\n");
|
|
3916
4037
|
}
|
|
3917
4038
|
function isGitRepo(cwd) {
|
|
3918
|
-
for (let dir = cwd; ; dir =
|
|
3919
|
-
if (
|
|
3920
|
-
if (
|
|
4039
|
+
for (let dir = cwd; ; dir = dirname5(dir)) {
|
|
4040
|
+
if (existsSync8(join5(dir, ".git"))) return true;
|
|
4041
|
+
if (dirname5(dir) === dir) return false;
|
|
3921
4042
|
}
|
|
3922
4043
|
}
|
|
3923
4044
|
function buildSystemPrompt(opts) {
|
|
@@ -3960,7 +4081,7 @@ ${instructions}` : ""}`;
|
|
|
3960
4081
|
}
|
|
3961
4082
|
|
|
3962
4083
|
// src/extensions.ts
|
|
3963
|
-
import { existsSync as
|
|
4084
|
+
import { existsSync as existsSync9, readdirSync, readFileSync as readFileSync6, statSync as statSync2 } from "fs";
|
|
3964
4085
|
import { basename, join as join6 } from "path";
|
|
3965
4086
|
function parseFrontmatter(text) {
|
|
3966
4087
|
const match = /^---\r?\n([\s\S]*?)\r?\n---\r?\n?/.exec(text);
|
|
@@ -3995,7 +4116,7 @@ function loadSkills(r) {
|
|
|
3995
4116
|
for (const dir of dirs(r, "skills")) {
|
|
3996
4117
|
for (const entry of list(dir)) {
|
|
3997
4118
|
const file = join6(dir, entry, "SKILL.md");
|
|
3998
|
-
if (!
|
|
4119
|
+
if (!existsSync9(file)) continue;
|
|
3999
4120
|
const { data } = parseFrontmatter(readFileSync6(file, "utf8"));
|
|
4000
4121
|
const name = str(data.name) || entry;
|
|
4001
4122
|
byName.set(name, { name, description: str(data.description) ?? "", dir: join6(dir, entry), file });
|
|
@@ -4102,7 +4223,7 @@ async function addProviderKey(providerId, key, deps) {
|
|
|
4102
4223
|
|
|
4103
4224
|
// src/session.ts
|
|
4104
4225
|
import { randomBytes as randomBytes2 } from "crypto";
|
|
4105
|
-
import { appendFileSync, existsSync as
|
|
4226
|
+
import { appendFileSync, existsSync as existsSync10, mkdirSync as mkdirSync5, readdirSync as readdirSync2, readFileSync as readFileSync7, rmSync as rmSync2, statSync as statSync3 } from "fs";
|
|
4106
4227
|
import { join as join8 } from "path";
|
|
4107
4228
|
function projectDir(home, cwd) {
|
|
4108
4229
|
const slug = cwd.replace(/[^a-zA-Z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(-100) || "root";
|
|
@@ -4132,7 +4253,7 @@ var Session = class _Session {
|
|
|
4132
4253
|
}
|
|
4133
4254
|
static list(home, cwd) {
|
|
4134
4255
|
const dir = projectDir(home, cwd);
|
|
4135
|
-
if (!
|
|
4256
|
+
if (!existsSync10(dir)) return [];
|
|
4136
4257
|
return readdirSync2(dir).filter((f) => f.endsWith(".jsonl")).map((f) => {
|
|
4137
4258
|
const session = new _Session(join8(dir, f));
|
|
4138
4259
|
const first = session.load().find((m) => m.role === "user");
|
|
@@ -4153,7 +4274,7 @@ var Session = class _Session {
|
|
|
4153
4274
|
this.write({ t: "reset" });
|
|
4154
4275
|
}
|
|
4155
4276
|
load() {
|
|
4156
|
-
if (!
|
|
4277
|
+
if (!existsSync10(this.file)) return [];
|
|
4157
4278
|
let messages = [];
|
|
4158
4279
|
for (const line of readFileSync7(this.file, "utf8").split("\n")) {
|
|
4159
4280
|
if (!line.trim()) continue;
|
|
@@ -4403,14 +4524,14 @@ function createTodoTool(store) {
|
|
|
4403
4524
|
}
|
|
4404
4525
|
|
|
4405
4526
|
// src/tools/memory.ts
|
|
4406
|
-
import { existsSync as
|
|
4527
|
+
import { existsSync as existsSync12, readFileSync as readFileSync10 } from "fs";
|
|
4407
4528
|
import { join as join9 } from "path";
|
|
4408
4529
|
import { z as z15 } from "zod";
|
|
4409
4530
|
|
|
4410
4531
|
// src/slash/memory.ts
|
|
4411
|
-
import { appendFileSync as appendFileSync2, existsSync as
|
|
4532
|
+
import { appendFileSync as appendFileSync2, existsSync as existsSync11, readFileSync as readFileSync9 } from "fs";
|
|
4412
4533
|
function appendMemory(file, text) {
|
|
4413
|
-
const prefix =
|
|
4534
|
+
const prefix = existsSync11(file) && !readFileSync9(file, "utf8").endsWith("\n") ? "\n" : "";
|
|
4414
4535
|
appendFileSync2(file, `${prefix}- ${text.trim()}
|
|
4415
4536
|
`);
|
|
4416
4537
|
}
|
|
@@ -4430,7 +4551,7 @@ function createSaveMemoryTool(opts) {
|
|
|
4430
4551
|
const content = input.content.trim();
|
|
4431
4552
|
if (!content) return { output: "Memory content is empty.", isError: true };
|
|
4432
4553
|
const file = input.scope === "global" ? join9(opts.home, "BCCLI.md") : join9(ctx.cwd, "AGENTS.md");
|
|
4433
|
-
if (
|
|
4554
|
+
if (existsSync12(file)) {
|
|
4434
4555
|
const lines = readFileSync10(file, "utf8").split("\n");
|
|
4435
4556
|
if (lines.some((line) => line.trim() === `- ${content}`)) {
|
|
4436
4557
|
return { output: `Already saved to ${file}.` };
|
|
@@ -4711,7 +4832,7 @@ function createDiagnosticsTool(servers) {
|
|
|
4711
4832
|
}
|
|
4712
4833
|
|
|
4713
4834
|
// src/plugins.ts
|
|
4714
|
-
import { existsSync as
|
|
4835
|
+
import { existsSync as existsSync13 } from "fs";
|
|
4715
4836
|
import { createRequire } from "module";
|
|
4716
4837
|
import { isAbsolute as isAbsolute3, join as join11 } from "path";
|
|
4717
4838
|
import { z as z18 } from "zod";
|
|
@@ -4742,7 +4863,7 @@ function loadPlugins(specs, opts) {
|
|
|
4742
4863
|
} catch {
|
|
4743
4864
|
throw new ConfigError(t("Plugin not found: {spec}", { spec }));
|
|
4744
4865
|
}
|
|
4745
|
-
if (!
|
|
4866
|
+
if (!existsSync13(file)) throw new ConfigError(t("Plugin not found: {spec}", { spec }));
|
|
4746
4867
|
let mod;
|
|
4747
4868
|
try {
|
|
4748
4869
|
mod = require_(file);
|
|
@@ -4822,6 +4943,8 @@ function createRuntime(opts) {
|
|
|
4822
4943
|
apiKey: resolved.apiKey,
|
|
4823
4944
|
model: resolved.model,
|
|
4824
4945
|
providerId: resolved.providerId,
|
|
4946
|
+
fetch: opts.fetch,
|
|
4947
|
+
// diteruskan penuh (spec gh-bot §6.6 — juga memperbaiki sdk fetch-injection)
|
|
4825
4948
|
enableProgrammaticToolCalling: lunaPtcAutoEnabled(env)
|
|
4826
4949
|
});
|
|
4827
4950
|
};
|
|
@@ -4906,7 +5029,7 @@ function createRuntime(opts) {
|
|
|
4906
5029
|
cwd: opts.cwd,
|
|
4907
5030
|
history,
|
|
4908
5031
|
reasoning,
|
|
4909
|
-
maxSteps: config.maxSteps,
|
|
5032
|
+
maxSteps: opts.maxSteps ?? config.maxSteps,
|
|
4910
5033
|
hooks: config.hooks,
|
|
4911
5034
|
pluginEmit,
|
|
4912
5035
|
env,
|
|
@@ -3,15 +3,15 @@ import {
|
|
|
3
3
|
createFetchTool,
|
|
4
4
|
createWebSearchTool,
|
|
5
5
|
isPrivateHost
|
|
6
|
-
} from "./chunk-
|
|
6
|
+
} from "./chunk-QZM66F3A.js";
|
|
7
7
|
import "./chunk-PSO7R5AD.js";
|
|
8
8
|
import {
|
|
9
9
|
loadConfig,
|
|
10
10
|
readCredentials
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-AGIZBZ64.js";
|
|
12
12
|
import {
|
|
13
13
|
t
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-VBEX5YHF.js";
|
|
15
15
|
|
|
16
16
|
// src/mcpServer/serve.ts
|
|
17
17
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createRuntime
|
|
4
|
+
} from "./chunk-HQB227LD.js";
|
|
5
|
+
import "./chunk-DRK3XTVZ.js";
|
|
6
|
+
import "./chunk-QZM66F3A.js";
|
|
7
|
+
import "./chunk-PSO7R5AD.js";
|
|
2
8
|
import {
|
|
3
9
|
VERSION
|
|
4
|
-
} from "./chunk-
|
|
10
|
+
} from "./chunk-Q2ZBR4OU.js";
|
|
5
11
|
import {
|
|
6
12
|
LOOPBACK_BIND,
|
|
7
13
|
MAX_FRAME_BYTES,
|
|
@@ -10,31 +16,25 @@ import {
|
|
|
10
16
|
parseClientFrame,
|
|
11
17
|
randomToken,
|
|
12
18
|
trustFence
|
|
13
|
-
} from "./chunk-
|
|
14
|
-
import {
|
|
15
|
-
createRuntime
|
|
16
|
-
} from "./chunk-WH7XLDGZ.js";
|
|
17
|
-
import "./chunk-3HCOAJEQ.js";
|
|
18
|
-
import "./chunk-ZMU7MXCH.js";
|
|
19
|
+
} from "./chunk-ADS5FDWL.js";
|
|
19
20
|
import "./chunk-GAFJEQTJ.js";
|
|
20
|
-
import "./chunk-
|
|
21
|
+
import "./chunk-A2XKKKKU.js";
|
|
21
22
|
import {
|
|
22
23
|
listAllModels
|
|
23
|
-
} from "./chunk-
|
|
24
|
-
import "./chunk-
|
|
24
|
+
} from "./chunk-LYFN6AEV.js";
|
|
25
|
+
import "./chunk-I422TPGX.js";
|
|
26
|
+
import "./chunk-7F3IWBPQ.js";
|
|
25
27
|
import {
|
|
26
28
|
Session
|
|
27
|
-
} from "./chunk-
|
|
28
|
-
import "./chunk-
|
|
29
|
-
import "./chunk-
|
|
30
|
-
import "./chunk-
|
|
31
|
-
import "./chunk-HE33XAPZ.js";
|
|
32
|
-
import "./chunk-PSO7R5AD.js";
|
|
29
|
+
} from "./chunk-HVGXCPDG.js";
|
|
30
|
+
import "./chunk-LYQHLA43.js";
|
|
31
|
+
import "./chunk-AWNQDAOY.js";
|
|
32
|
+
import "./chunk-NFJPKNHL.js";
|
|
33
33
|
import {
|
|
34
34
|
bccliHome,
|
|
35
35
|
loadConfig
|
|
36
|
-
} from "./chunk-
|
|
37
|
-
import "./chunk-
|
|
36
|
+
} from "./chunk-AGIZBZ64.js";
|
|
37
|
+
import "./chunk-VBEX5YHF.js";
|
|
38
38
|
|
|
39
39
|
// src/serve.ts
|
|
40
40
|
import { randomBytes } from "crypto";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {
|
|
3
|
+
createRuntime,
|
|
4
|
+
lunaPtcAutoEnabled
|
|
5
|
+
} from "./chunk-HQB227LD.js";
|
|
6
|
+
import "./chunk-DRK3XTVZ.js";
|
|
7
|
+
import "./chunk-QZM66F3A.js";
|
|
8
|
+
import "./chunk-PSO7R5AD.js";
|
|
9
|
+
import "./chunk-GAFJEQTJ.js";
|
|
10
|
+
import "./chunk-A2XKKKKU.js";
|
|
11
|
+
import "./chunk-LYFN6AEV.js";
|
|
12
|
+
import "./chunk-I422TPGX.js";
|
|
13
|
+
import "./chunk-7F3IWBPQ.js";
|
|
14
|
+
import "./chunk-HVGXCPDG.js";
|
|
15
|
+
import "./chunk-LYQHLA43.js";
|
|
16
|
+
import "./chunk-AWNQDAOY.js";
|
|
17
|
+
import "./chunk-NFJPKNHL.js";
|
|
18
|
+
import "./chunk-AGIZBZ64.js";
|
|
19
|
+
import "./chunk-VBEX5YHF.js";
|
|
20
|
+
export {
|
|
21
|
+
createRuntime,
|
|
22
|
+
lunaPtcAutoEnabled
|
|
23
|
+
};
|