@bunny-agent/runner-cli 0.9.43-beta.1 → 0.9.43-beta.3
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/bundle.mjs +54 -327
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/package.json +7 -7
package/dist/bundle.mjs
CHANGED
|
@@ -1277,283 +1277,16 @@ function createOpenCodeRunner(options = {}) {
|
|
|
1277
1277
|
};
|
|
1278
1278
|
}
|
|
1279
1279
|
|
|
1280
|
-
// ../../packages/runner-pi/dist/ask-user-question-tool.js
|
|
1281
|
-
import { createHash } from "node:crypto";
|
|
1282
|
-
import { existsSync as existsSync4, mkdirSync as mkdirSync2, readFileSync as readFileSync3, unlinkSync as unlinkSync3, writeFileSync as writeFileSync3 } from "node:fs";
|
|
1283
|
-
import { join as join5 } from "node:path";
|
|
1284
|
-
var TOOL_NAME = "ask_user_question";
|
|
1285
|
-
var APPROVAL_DIR = join5(".bunny-agent", "approvals");
|
|
1286
|
-
var ASK_USER_QUESTION_TIMEOUT_MS = 12e4;
|
|
1287
|
-
var ASK_USER_QUESTION_POLL_MS = 500;
|
|
1288
|
-
var MAX_QUESTIONS = 4;
|
|
1289
|
-
var MIN_OPTIONS = 2;
|
|
1290
|
-
var MAX_OPTIONS = 4;
|
|
1291
|
-
var MAX_HEADER_LEN = 12;
|
|
1292
|
-
var MAX_QUESTION_LEN = 500;
|
|
1293
|
-
var MAX_OPTION_LABEL_LEN = 80;
|
|
1294
|
-
var MAX_OPTION_DESCRIPTION_LEN = 240;
|
|
1295
|
-
var ESC = String.fromCharCode(27);
|
|
1296
|
-
var CSI = String.fromCharCode(155);
|
|
1297
|
-
var ST = String.fromCharCode(156);
|
|
1298
|
-
var OSC = String.fromCharCode(157);
|
|
1299
|
-
var BEL = String.fromCharCode(7);
|
|
1300
|
-
var ANSI_OSC_RE = new RegExp(`(?:${ESC}\\]|${OSC})[^${ESC}${ST}${BEL}]*(?:${BEL}|${ESC}\\\\|${ST})`, "g");
|
|
1301
|
-
var ANSI_CTL_RE = new RegExp(`(?:${ESC}\\[[0-?]*[ -/]*[@-~]|${CSI}[0-?]*[ -/]*[@-~]|${ESC}[@-Z\\\\\\-_])`, "g");
|
|
1302
|
-
var CTL_CHAR_RE = new RegExp(`[${String.fromCharCode(0)}-${String.fromCharCode(31)}${String.fromCharCode(127)}-${String.fromCharCode(159)}]+`, "g");
|
|
1303
|
-
var askUserQuestionSchema = {
|
|
1304
|
-
type: "object",
|
|
1305
|
-
required: ["questions"],
|
|
1306
|
-
properties: {
|
|
1307
|
-
questions: {
|
|
1308
|
-
type: "array",
|
|
1309
|
-
minItems: 1,
|
|
1310
|
-
maxItems: MAX_QUESTIONS,
|
|
1311
|
-
description: `Between 1 and ${MAX_QUESTIONS} questions to ask the user.`,
|
|
1312
|
-
items: {
|
|
1313
|
-
type: "object",
|
|
1314
|
-
required: ["question", "header", "multiSelect", "options"],
|
|
1315
|
-
properties: {
|
|
1316
|
-
question: {
|
|
1317
|
-
type: "string",
|
|
1318
|
-
description: "The full question to ask the user. Should be specific, end with a question mark, and avoid jargon the user has not used."
|
|
1319
|
-
},
|
|
1320
|
-
header: {
|
|
1321
|
-
type: "string",
|
|
1322
|
-
description: `Short label (max ${MAX_HEADER_LEN} chars) shown as a chip/tag in the UI. Examples: "Library", "Auth method", "Approach".`
|
|
1323
|
-
},
|
|
1324
|
-
multiSelect: {
|
|
1325
|
-
type: "boolean",
|
|
1326
|
-
description: "Set true when the choices are not mutually exclusive and the user may select more than one."
|
|
1327
|
-
},
|
|
1328
|
-
options: {
|
|
1329
|
-
type: "array",
|
|
1330
|
-
minItems: MIN_OPTIONS,
|
|
1331
|
-
maxItems: MAX_OPTIONS,
|
|
1332
|
-
description: `Between ${MIN_OPTIONS} and ${MAX_OPTIONS} mutually exclusive options. Do not add an "Other" option \u2014 the host adds one automatically.`,
|
|
1333
|
-
items: {
|
|
1334
|
-
type: "object",
|
|
1335
|
-
required: ["label", "description"],
|
|
1336
|
-
properties: {
|
|
1337
|
-
label: {
|
|
1338
|
-
type: "string",
|
|
1339
|
-
description: "Display text for the option (1-5 words). Should clearly describe the choice."
|
|
1340
|
-
},
|
|
1341
|
-
description: {
|
|
1342
|
-
type: "string",
|
|
1343
|
-
description: "What this option means or what happens if chosen \u2014 call out trade-offs."
|
|
1344
|
-
}
|
|
1345
|
-
}
|
|
1346
|
-
}
|
|
1347
|
-
}
|
|
1348
|
-
}
|
|
1349
|
-
}
|
|
1350
|
-
}
|
|
1351
|
-
}
|
|
1352
|
-
};
|
|
1353
|
-
var TOOL_DESCRIPTION = `Ask the user one or more multiple-choice questions when the task is genuinely ambiguous and you need user input to proceed (choosing between libraries, design approaches, trade-offs, etc.). Each question carries 2-${MAX_OPTIONS} options; up to ${MAX_QUESTIONS} questions per call. The user can also select an automatically-provided "Other" option to give free-form input. Use sparingly \u2014 prefer making a sensible default choice when the task is clear.`;
|
|
1354
|
-
function sanitizeText(value) {
|
|
1355
|
-
if (typeof value !== "string")
|
|
1356
|
-
return "";
|
|
1357
|
-
return value.replace(ANSI_OSC_RE, "").replace(ANSI_CTL_RE, "").replace(CTL_CHAR_RE, " ").replace(/\s+/g, " ").trim();
|
|
1358
|
-
}
|
|
1359
|
-
function truncate(value, max) {
|
|
1360
|
-
return value.length <= max ? value : `${value.slice(0, Math.max(0, max - 3))}...`;
|
|
1361
|
-
}
|
|
1362
|
-
function sanitizeQuestions(questions) {
|
|
1363
|
-
return questions.map((q) => ({
|
|
1364
|
-
question: truncate(sanitizeText(q.question), MAX_QUESTION_LEN),
|
|
1365
|
-
header: truncate(sanitizeText(q.header), MAX_HEADER_LEN),
|
|
1366
|
-
multiSelect: !!q.multiSelect,
|
|
1367
|
-
options: q.options.map((o) => ({
|
|
1368
|
-
label: truncate(sanitizeText(o.label), MAX_OPTION_LABEL_LEN),
|
|
1369
|
-
description: truncate(sanitizeText(o.description), MAX_OPTION_DESCRIPTION_LEN)
|
|
1370
|
-
}))
|
|
1371
|
-
}));
|
|
1372
|
-
}
|
|
1373
|
-
function readApproval(file) {
|
|
1374
|
-
try {
|
|
1375
|
-
const raw = readFileSync3(file, "utf-8");
|
|
1376
|
-
return JSON.parse(raw);
|
|
1377
|
-
} catch {
|
|
1378
|
-
return void 0;
|
|
1379
|
-
}
|
|
1380
|
-
}
|
|
1381
|
-
var TOOL_CALL_ID_PREFIX_LEN = 32;
|
|
1382
|
-
var TOOL_CALL_ID_HASH_LEN = 16;
|
|
1383
|
-
function sanitizeToolCallId(toolCallId) {
|
|
1384
|
-
const safePrefix = toolCallId.replace(/[^A-Za-z0-9_-]/g, "_").slice(0, TOOL_CALL_ID_PREFIX_LEN);
|
|
1385
|
-
const hash = createHash("sha1").update(toolCallId).digest("hex").slice(0, TOOL_CALL_ID_HASH_LEN);
|
|
1386
|
-
return `${safePrefix}-${hash}`;
|
|
1387
|
-
}
|
|
1388
|
-
function safeUnlink(file) {
|
|
1389
|
-
try {
|
|
1390
|
-
if (existsSync4(file))
|
|
1391
|
-
unlinkSync3(file);
|
|
1392
|
-
} catch {
|
|
1393
|
-
}
|
|
1394
|
-
}
|
|
1395
|
-
async function pollApprovalFile(approvalFile, signal, options = {}) {
|
|
1396
|
-
const timeoutMs = options.timeoutMs ?? ASK_USER_QUESTION_TIMEOUT_MS;
|
|
1397
|
-
const pollMs = options.pollMs ?? ASK_USER_QUESTION_POLL_MS;
|
|
1398
|
-
const deadline = Date.now() + timeoutMs;
|
|
1399
|
-
let lastApproval;
|
|
1400
|
-
while (true) {
|
|
1401
|
-
if (signal?.aborted) {
|
|
1402
|
-
return { kind: "aborted", answers: lastApproval?.answers ?? {} };
|
|
1403
|
-
}
|
|
1404
|
-
const approval = readApproval(approvalFile);
|
|
1405
|
-
if (approval)
|
|
1406
|
-
lastApproval = approval;
|
|
1407
|
-
if (approval && approval.status !== "pending") {
|
|
1408
|
-
const answers = approval.answers ?? {};
|
|
1409
|
-
if (approval.status === "completed" && Object.keys(answers).length > 0) {
|
|
1410
|
-
return { kind: "answered", answers };
|
|
1411
|
-
}
|
|
1412
|
-
if (approval.status === "declined") {
|
|
1413
|
-
return { kind: "declined", answers, reason: approval.reason };
|
|
1414
|
-
}
|
|
1415
|
-
if (approval.status === "cancelled") {
|
|
1416
|
-
return { kind: "cancelled", answers, reason: approval.reason };
|
|
1417
|
-
}
|
|
1418
|
-
return {
|
|
1419
|
-
kind: "declined",
|
|
1420
|
-
answers,
|
|
1421
|
-
reason: approval.reason ?? "no_answer_provided"
|
|
1422
|
-
};
|
|
1423
|
-
}
|
|
1424
|
-
if (Date.now() >= deadline) {
|
|
1425
|
-
const partial = lastApproval?.answers ?? {};
|
|
1426
|
-
return {
|
|
1427
|
-
kind: Object.keys(partial).length > 0 ? "answered" : "timeout",
|
|
1428
|
-
answers: partial
|
|
1429
|
-
};
|
|
1430
|
-
}
|
|
1431
|
-
await sleepWithAbort(Math.min(pollMs, Math.max(0, deadline - Date.now())), signal);
|
|
1432
|
-
}
|
|
1433
|
-
}
|
|
1434
|
-
function sleepWithAbort(ms, signal) {
|
|
1435
|
-
return new Promise((resolve4) => {
|
|
1436
|
-
if (ms <= 0) {
|
|
1437
|
-
resolve4();
|
|
1438
|
-
return;
|
|
1439
|
-
}
|
|
1440
|
-
if (signal?.aborted) {
|
|
1441
|
-
resolve4();
|
|
1442
|
-
return;
|
|
1443
|
-
}
|
|
1444
|
-
const onAbort = () => {
|
|
1445
|
-
clearTimeout(timer);
|
|
1446
|
-
resolve4();
|
|
1447
|
-
};
|
|
1448
|
-
const timer = setTimeout(() => {
|
|
1449
|
-
signal?.removeEventListener("abort", onAbort);
|
|
1450
|
-
resolve4();
|
|
1451
|
-
}, ms);
|
|
1452
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
1453
|
-
});
|
|
1454
|
-
}
|
|
1455
|
-
function formatAcceptedText(questions, answers) {
|
|
1456
|
-
const lines = ["User answered:"];
|
|
1457
|
-
for (const q of questions) {
|
|
1458
|
-
const raw = answers[q.question];
|
|
1459
|
-
const formatted = Array.isArray(raw) ? raw.join(", ") : typeof raw === "string" && raw.length > 0 ? raw : "(no answer)";
|
|
1460
|
-
lines.push(`Q: ${q.question}`);
|
|
1461
|
-
lines.push(`A: ${formatted}`);
|
|
1462
|
-
}
|
|
1463
|
-
return lines.join("\n");
|
|
1464
|
-
}
|
|
1465
|
-
function formatDeclinedText(reason, partial) {
|
|
1466
|
-
const partialNote = Object.keys(partial).length > 0 ? ` Partial answers received: ${JSON.stringify(partial)}.` : "";
|
|
1467
|
-
return `User did not answer the questions (reason: ${reason}). Make a sensible default choice and continue, or ask again if the choice is genuinely required.${partialNote}`;
|
|
1468
|
-
}
|
|
1469
|
-
function buildAskUserQuestionTool(opts) {
|
|
1470
|
-
const { cwd, timeoutMs, pollMs } = opts;
|
|
1471
|
-
return {
|
|
1472
|
-
name: TOOL_NAME,
|
|
1473
|
-
label: "ask_user_question",
|
|
1474
|
-
description: TOOL_DESCRIPTION,
|
|
1475
|
-
promptSnippet: "ask_user_question: ask the user 1-4 multiple-choice questions when the task is genuinely ambiguous.",
|
|
1476
|
-
promptGuidelines: [
|
|
1477
|
-
"Use ask_user_question only when the task is genuinely ambiguous and a user choice is required to proceed; otherwise pick a sensible default.",
|
|
1478
|
-
"Each question must carry 2-4 mutually exclusive options. Do not add an 'Other' option \u2014 the host adds one automatically."
|
|
1479
|
-
],
|
|
1480
|
-
// Pause other tool calls while a user prompt is open; otherwise pi may
|
|
1481
|
-
// surface output the user has not yet had a chance to react to.
|
|
1482
|
-
executionMode: "sequential",
|
|
1483
|
-
// biome-ignore lint/suspicious/noExplicitAny: TypeBox accepts plain JSON Schema literals here, see image-tools.ts.
|
|
1484
|
-
parameters: askUserQuestionSchema,
|
|
1485
|
-
async execute(toolCallId, params, signal) {
|
|
1486
|
-
const raw = params.questions ?? [];
|
|
1487
|
-
const sanitized = sanitizeQuestions(raw);
|
|
1488
|
-
const sanitizedInput = { questions: sanitized };
|
|
1489
|
-
const approvalDir = join5(cwd, APPROVAL_DIR);
|
|
1490
|
-
const approvalFile = join5(approvalDir, `${sanitizeToolCallId(toolCallId)}.json`);
|
|
1491
|
-
try {
|
|
1492
|
-
mkdirSync2(approvalDir, { recursive: true });
|
|
1493
|
-
const pending = {
|
|
1494
|
-
status: "pending",
|
|
1495
|
-
toolName: TOOL_NAME,
|
|
1496
|
-
input: sanitizedInput,
|
|
1497
|
-
questions: sanitized,
|
|
1498
|
-
answers: {}
|
|
1499
|
-
};
|
|
1500
|
-
writeFileSync3(approvalFile, JSON.stringify(pending));
|
|
1501
|
-
} catch (error) {
|
|
1502
|
-
const message = error instanceof Error ? error.message : "Unknown error";
|
|
1503
|
-
return {
|
|
1504
|
-
content: [
|
|
1505
|
-
{
|
|
1506
|
-
type: "text",
|
|
1507
|
-
text: `ask_user_question failed to create approval file: ${message}`
|
|
1508
|
-
}
|
|
1509
|
-
],
|
|
1510
|
-
details: void 0
|
|
1511
|
-
};
|
|
1512
|
-
}
|
|
1513
|
-
let outcome;
|
|
1514
|
-
try {
|
|
1515
|
-
outcome = await pollApprovalFile(approvalFile, signal, {
|
|
1516
|
-
timeoutMs,
|
|
1517
|
-
pollMs
|
|
1518
|
-
});
|
|
1519
|
-
} finally {
|
|
1520
|
-
safeUnlink(approvalFile);
|
|
1521
|
-
}
|
|
1522
|
-
if (outcome.kind === "answered") {
|
|
1523
|
-
return {
|
|
1524
|
-
content: [
|
|
1525
|
-
{
|
|
1526
|
-
type: "text",
|
|
1527
|
-
text: formatAcceptedText(sanitized, outcome.answers)
|
|
1528
|
-
}
|
|
1529
|
-
],
|
|
1530
|
-
details: void 0
|
|
1531
|
-
};
|
|
1532
|
-
}
|
|
1533
|
-
const reason = outcome.kind === "timeout" ? "timeout" : outcome.kind === "aborted" ? "run_aborted" : outcome.reason ?? outcome.kind;
|
|
1534
|
-
return {
|
|
1535
|
-
content: [
|
|
1536
|
-
{
|
|
1537
|
-
type: "text",
|
|
1538
|
-
text: formatDeclinedText(reason, outcome.answers)
|
|
1539
|
-
}
|
|
1540
|
-
],
|
|
1541
|
-
details: void 0
|
|
1542
|
-
};
|
|
1543
|
-
}
|
|
1544
|
-
};
|
|
1545
|
-
}
|
|
1546
|
-
|
|
1547
1280
|
// ../../packages/runner-pi/dist/pi-runner.js
|
|
1548
|
-
import { appendFileSync as appendFileSync2, existsSync as
|
|
1549
|
-
import { join as
|
|
1281
|
+
import { appendFileSync as appendFileSync2, existsSync as existsSync5, unlinkSync as unlinkSync3 } from "node:fs";
|
|
1282
|
+
import { join as join8 } from "node:path";
|
|
1550
1283
|
import { getModel } from "@earendil-works/pi-ai";
|
|
1551
1284
|
import { AuthStorage, createAgentSession, ModelRegistry, SessionManager as SessionManager2 } from "@earendil-works/pi-coding-agent";
|
|
1552
1285
|
|
|
1553
1286
|
// ../../packages/runner-pi/dist/bunny-agent-resource-loader.js
|
|
1554
|
-
import { existsSync as
|
|
1287
|
+
import { existsSync as existsSync4 } from "node:fs";
|
|
1555
1288
|
import { homedir } from "node:os";
|
|
1556
|
-
import { isAbsolute, join as
|
|
1289
|
+
import { isAbsolute, join as join5, resolve as resolve2 } from "node:path";
|
|
1557
1290
|
import { DefaultResourceLoader, loadSkills } from "@earendil-works/pi-coding-agent";
|
|
1558
1291
|
var LOG_PREFIX = "[bunny-agent:pi]";
|
|
1559
1292
|
function logSkillLoad(cwd, agentDir, skillPaths, result) {
|
|
@@ -1565,7 +1298,7 @@ function logSkillLoad(cwd, agentDir, skillPaths, result) {
|
|
|
1565
1298
|
];
|
|
1566
1299
|
for (const raw of skillPaths) {
|
|
1567
1300
|
const abs = isAbsolute(raw) ? raw : resolve2(cwd, raw);
|
|
1568
|
-
lines.push(` ${raw} -> ${abs} (exists: ${
|
|
1301
|
+
lines.push(` ${raw} -> ${abs} (exists: ${existsSync4(abs) ? "yes" : "no"})`);
|
|
1569
1302
|
}
|
|
1570
1303
|
lines.push(` loaded skills: ${result.skills.length}`);
|
|
1571
1304
|
if (result.skills.length > 0) {
|
|
@@ -1583,7 +1316,7 @@ function logSkillLoad(cwd, agentDir, skillPaths, result) {
|
|
|
1583
1316
|
var BunnyAgentResourceLoader = class {
|
|
1584
1317
|
constructor(options = {}) {
|
|
1585
1318
|
this.cwd = options.cwd ?? process.cwd();
|
|
1586
|
-
this.agentDir = options.agentDir ??
|
|
1319
|
+
this.agentDir = options.agentDir ?? join5(homedir(), ".bunny", "agent");
|
|
1587
1320
|
this.skillPaths = options.skillPaths ?? [];
|
|
1588
1321
|
this.extraAppendPrompt = options.appendSystemPrompt;
|
|
1589
1322
|
this.delegate = new DefaultResourceLoader({
|
|
@@ -1640,8 +1373,8 @@ var BunnyAgentResourceLoader = class {
|
|
|
1640
1373
|
};
|
|
1641
1374
|
|
|
1642
1375
|
// ../../packages/runner-pi/dist/image-tools.js
|
|
1643
|
-
import { mkdirSync as
|
|
1644
|
-
import { dirname as dirname3, extname, join as
|
|
1376
|
+
import { mkdirSync as mkdirSync2, writeFileSync as writeFileSync3 } from "node:fs";
|
|
1377
|
+
import { dirname as dirname3, extname, join as join6 } from "node:path";
|
|
1645
1378
|
var generateImageSchema = {
|
|
1646
1379
|
type: "object",
|
|
1647
1380
|
properties: {
|
|
@@ -1874,8 +1607,8 @@ async function saveImageItem(item, filePath, apiKey) {
|
|
|
1874
1607
|
const b64 = await resolveB64(item, apiKey);
|
|
1875
1608
|
if (!b64)
|
|
1876
1609
|
return void 0;
|
|
1877
|
-
|
|
1878
|
-
|
|
1610
|
+
mkdirSync2(dirname3(filePath), { recursive: true });
|
|
1611
|
+
writeFileSync3(filePath, Buffer.from(b64, "base64"));
|
|
1879
1612
|
return filePath;
|
|
1880
1613
|
}
|
|
1881
1614
|
function buildImageGenerateTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
@@ -1902,7 +1635,7 @@ function buildImageGenerateTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
1902
1635
|
const imageSize = p.imageSize;
|
|
1903
1636
|
const rawFilename = p.filename;
|
|
1904
1637
|
const filename = rawFilename ? extname(rawFilename) ? rawFilename : `${rawFilename}.png` : `image_${Date.now()}.png`;
|
|
1905
|
-
const filePath =
|
|
1638
|
+
const filePath = join6(cwd, filename.replace(/[^a-zA-Z0-9_\-./]/g, "_"));
|
|
1906
1639
|
try {
|
|
1907
1640
|
const url = `${baseUrl.replace(/\/$/, "")}/v1/images/generations`;
|
|
1908
1641
|
const res = await fetch(url, {
|
|
@@ -2050,7 +1783,7 @@ function buildImageEditTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
2050
1783
|
// biome-ignore lint/suspicious/noExplicitAny: plain JSON Schema compatible with TypeBox TSchema
|
|
2051
1784
|
parameters: editImageSchema,
|
|
2052
1785
|
async execute(_toolCallId, params, signal, _onUpdate) {
|
|
2053
|
-
const { readFileSync:
|
|
1786
|
+
const { readFileSync: readFileSync4, existsSync: existsSync8 } = await import("node:fs");
|
|
2054
1787
|
const { resolve: resolve4, basename: basename2 } = await import("node:path");
|
|
2055
1788
|
const p = params;
|
|
2056
1789
|
const imagePath = p.image;
|
|
@@ -2063,7 +1796,7 @@ function buildImageEditTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
2063
1796
|
const rawFilename = p.filename;
|
|
2064
1797
|
const safePrompt = buildPolicySafeEditPrompt(prompt);
|
|
2065
1798
|
const resolvedImage = resolve4(cwd, imagePath);
|
|
2066
|
-
if (!
|
|
1799
|
+
if (!existsSync8(resolvedImage)) {
|
|
2067
1800
|
return {
|
|
2068
1801
|
content: [
|
|
2069
1802
|
{
|
|
@@ -2075,9 +1808,9 @@ function buildImageEditTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
2075
1808
|
};
|
|
2076
1809
|
}
|
|
2077
1810
|
const filename = rawFilename ? extname(rawFilename) ? rawFilename : `${rawFilename}.png` : `edited_${Date.now()}.png`;
|
|
2078
|
-
const filePath =
|
|
1811
|
+
const filePath = join6(cwd, filename.replace(/[^a-zA-Z0-9_\-./]/g, "_"));
|
|
2079
1812
|
try {
|
|
2080
|
-
const imageBuffer =
|
|
1813
|
+
const imageBuffer = readFileSync4(resolvedImage);
|
|
2081
1814
|
const fields = [
|
|
2082
1815
|
{ name: "model", value: imageModelId },
|
|
2083
1816
|
{ name: "prompt", value: safePrompt.prompt },
|
|
@@ -2107,11 +1840,11 @@ function buildImageEditTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
2107
1840
|
];
|
|
2108
1841
|
if (maskPath) {
|
|
2109
1842
|
const resolvedMask = resolve4(cwd, maskPath);
|
|
2110
|
-
if (
|
|
1843
|
+
if (existsSync8(resolvedMask)) {
|
|
2111
1844
|
files.push({
|
|
2112
1845
|
name: "mask",
|
|
2113
1846
|
filename: basename2(resolvedMask),
|
|
2114
|
-
buffer:
|
|
1847
|
+
buffer: readFileSync4(resolvedMask),
|
|
2115
1848
|
mime: detectImageMime(resolvedMask)
|
|
2116
1849
|
});
|
|
2117
1850
|
}
|
|
@@ -2174,7 +1907,7 @@ function buildImageEditTool(cwd, imageModelId, baseUrl, apiKey) {
|
|
|
2174
1907
|
|
|
2175
1908
|
// ../../packages/runner-pi/dist/session-utils.js
|
|
2176
1909
|
import { closeSync, fstatSync, openSync, readdirSync as readdirSync2, readSync, statSync as statSync2 } from "node:fs";
|
|
2177
|
-
import { join as
|
|
1910
|
+
import { join as join7 } from "node:path";
|
|
2178
1911
|
import { SessionManager } from "@earendil-works/pi-coding-agent";
|
|
2179
1912
|
var MAX_SESSION_FILE_BYTES = Number(process.env.SANDAGENT_MAX_SESSION_BYTES) || 10 * 1024 * 1024;
|
|
2180
1913
|
function resolveSessionPathById(cwd, sessionId) {
|
|
@@ -2183,7 +1916,7 @@ function resolveSessionPathById(cwd, sessionId) {
|
|
|
2183
1916
|
try {
|
|
2184
1917
|
const suffix = `_${sessionId}.jsonl`;
|
|
2185
1918
|
const match = readdirSync2(sessionsDir).find((f) => f.endsWith(suffix));
|
|
2186
|
-
return match ?
|
|
1919
|
+
return match ? join7(sessionsDir, match) : void 0;
|
|
2187
1920
|
} catch {
|
|
2188
1921
|
return void 0;
|
|
2189
1922
|
}
|
|
@@ -2363,16 +2096,15 @@ var PiAISDKStreamConverter = class {
|
|
|
2363
2096
|
}
|
|
2364
2097
|
if (event.type === "tool_execution_start") {
|
|
2365
2098
|
chunks.push(...this.endTextStreamIfOpen());
|
|
2366
|
-
const toolCallId = sanitizeToolCallId(event.toolCallId);
|
|
2367
2099
|
chunks.push(sseData({
|
|
2368
2100
|
type: "tool-input-start",
|
|
2369
|
-
toolCallId,
|
|
2101
|
+
toolCallId: event.toolCallId,
|
|
2370
2102
|
toolName: event.toolName,
|
|
2371
2103
|
dynamic: true,
|
|
2372
2104
|
providerExecuted: true
|
|
2373
2105
|
}), sseData({
|
|
2374
2106
|
type: "tool-input-available",
|
|
2375
|
-
toolCallId,
|
|
2107
|
+
toolCallId: event.toolCallId,
|
|
2376
2108
|
toolName: event.toolName,
|
|
2377
2109
|
input: event.args,
|
|
2378
2110
|
dynamic: true,
|
|
@@ -2385,11 +2117,10 @@ var PiAISDKStreamConverter = class {
|
|
|
2385
2117
|
const raw = event.result?.details?.usage?.raw;
|
|
2386
2118
|
if (raw != null)
|
|
2387
2119
|
accumulateToolUsage(this.toolUsageTally, raw);
|
|
2388
|
-
const toolCallId = sanitizeToolCallId(event.toolCallId);
|
|
2389
2120
|
if (event.isError) {
|
|
2390
2121
|
chunks.push(sseData({
|
|
2391
2122
|
type: "tool-output-error",
|
|
2392
|
-
toolCallId,
|
|
2123
|
+
toolCallId: event.toolCallId,
|
|
2393
2124
|
errorText: output,
|
|
2394
2125
|
dynamic: true,
|
|
2395
2126
|
providerExecuted: true
|
|
@@ -2397,7 +2128,7 @@ var PiAISDKStreamConverter = class {
|
|
|
2397
2128
|
} else {
|
|
2398
2129
|
chunks.push(sseData({
|
|
2399
2130
|
type: "tool-output-available",
|
|
2400
|
-
toolCallId,
|
|
2131
|
+
toolCallId: event.toolCallId,
|
|
2401
2132
|
output,
|
|
2402
2133
|
dynamic: true,
|
|
2403
2134
|
providerExecuted: true
|
|
@@ -2601,6 +2332,9 @@ function isRateLimitError(err) {
|
|
|
2601
2332
|
return msg.includes("429") || msg.includes("rate") || msg.includes("quota") || msg.includes("limit");
|
|
2602
2333
|
}
|
|
2603
2334
|
var BROWSER_UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36";
|
|
2335
|
+
function stripNullBytes(s) {
|
|
2336
|
+
return s.replace(/\0/g, "");
|
|
2337
|
+
}
|
|
2604
2338
|
function htmlToText(html) {
|
|
2605
2339
|
return html.replace(/<(script|style|noscript)[^>]*>[\s\S]*?<\/\1>/gi, "").replace(/<br\s*\/?>/gi, "\n").replace(/<\/(p|div|h[1-6]|li|tr)>/gi, "\n").replace(/<(p|div|h[1-6]|li|tr)[^>]*>/gi, "\n").replace(/<[^>]+>/g, "").replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, '"').replace(/'/g, "'").replace(/ /g, " ").replace(/[ \t]+/g, " ").replace(/\n{3,}/g, "\n\n").trim();
|
|
2606
2340
|
}
|
|
@@ -2622,7 +2356,7 @@ async function fetchPageContent(url, externalSignal) {
|
|
|
2622
2356
|
if (!res.ok)
|
|
2623
2357
|
return `(HTTP ${res.status}: ${res.statusText})`;
|
|
2624
2358
|
const html = await res.text();
|
|
2625
|
-
const text = htmlToText(html);
|
|
2359
|
+
const text = stripNullBytes(htmlToText(html));
|
|
2626
2360
|
return text.length > 5e4 ? `${text.slice(0, 5e4)}
|
|
2627
2361
|
|
|
2628
2362
|
[Truncated]` : text;
|
|
@@ -2641,15 +2375,15 @@ function formatSearchResults(results, providerLabel) {
|
|
|
2641
2375
|
return header + results.map((r, i) => {
|
|
2642
2376
|
const lines = [
|
|
2643
2377
|
`--- Result ${i + 1} ---`,
|
|
2644
|
-
`Title: ${r.title}`,
|
|
2378
|
+
`Title: ${stripNullBytes(r.title)}`,
|
|
2645
2379
|
`Link: ${r.link}`
|
|
2646
2380
|
];
|
|
2647
2381
|
if (r.age)
|
|
2648
2382
|
lines.push(`Age: ${r.age}`);
|
|
2649
|
-
lines.push(`Snippet: ${r.snippet}`);
|
|
2383
|
+
lines.push(`Snippet: ${stripNullBytes(r.snippet)}`);
|
|
2650
2384
|
if (r.content)
|
|
2651
2385
|
lines.push(`Content:
|
|
2652
|
-
${r.content}`);
|
|
2386
|
+
${stripNullBytes(r.content)}`);
|
|
2653
2387
|
return lines.join("\n");
|
|
2654
2388
|
}).join("\n\n");
|
|
2655
2389
|
}
|
|
@@ -5620,12 +5354,6 @@ function resolveImageModelName(chatProvider, env) {
|
|
|
5620
5354
|
function getEnvValue(optionsEnv, name) {
|
|
5621
5355
|
return optionsEnv?.[name] ?? process.env[name];
|
|
5622
5356
|
}
|
|
5623
|
-
function parsePositiveInt(value) {
|
|
5624
|
-
if (value === void 0 || value === "")
|
|
5625
|
-
return void 0;
|
|
5626
|
-
const n = Number(value);
|
|
5627
|
-
return Number.isFinite(n) && n > 0 ? Math.floor(n) : void 0;
|
|
5628
|
-
}
|
|
5629
5357
|
function applyModelOverrides(model, provider, optionsEnv) {
|
|
5630
5358
|
if (model == null)
|
|
5631
5359
|
return;
|
|
@@ -5655,9 +5383,9 @@ function traceRawMessage(debugCwd, data, reset = false, optionsEnv) {
|
|
|
5655
5383
|
if (!enabled)
|
|
5656
5384
|
return;
|
|
5657
5385
|
try {
|
|
5658
|
-
const file =
|
|
5659
|
-
if (reset &&
|
|
5660
|
-
|
|
5386
|
+
const file = join8(debugCwd, "pi-message-stream-debug.json");
|
|
5387
|
+
if (reset && existsSync5(file))
|
|
5388
|
+
unlinkSync3(file);
|
|
5661
5389
|
const type = data !== null && typeof data === "object" ? data.type : void 0;
|
|
5662
5390
|
let payload = data;
|
|
5663
5391
|
try {
|
|
@@ -5696,7 +5424,7 @@ function createPiRunner(options = {}) {
|
|
|
5696
5424
|
{
|
|
5697
5425
|
id: modelName,
|
|
5698
5426
|
name: modelName,
|
|
5699
|
-
reasoning:
|
|
5427
|
+
reasoning: !!options.effort,
|
|
5700
5428
|
input: ["text", "image"],
|
|
5701
5429
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
5702
5430
|
contextWindow: 128e3,
|
|
@@ -5760,18 +5488,13 @@ function createPiRunner(options = {}) {
|
|
|
5760
5488
|
customTools.push(buildImageGenerateTool(cwd, imageModelName, model.baseUrl, apiKey), buildImageEditTool(cwd, imageModelName, model.baseUrl, apiKey));
|
|
5761
5489
|
}
|
|
5762
5490
|
const toolRefDefinitions = options.toolRefs && options.toolRefs.length > 0 ? buildToolDefinitionsFromRefs(options.toolRefs) : [];
|
|
5763
|
-
const askTimeoutSeconds = parsePositiveInt(getEnvValue(options.env, "ASK_USER_QUESTION_TOOL_TIMEOUT"));
|
|
5764
|
-
const askUserQuestionTool = buildAskUserQuestionTool({
|
|
5765
|
-
cwd,
|
|
5766
|
-
timeoutMs: askTimeoutSeconds !== void 0 ? askTimeoutSeconds * 1e3 : void 0
|
|
5767
|
-
});
|
|
5768
|
-
customTools.push(askUserQuestionTool);
|
|
5769
5491
|
const { session } = await createAgentSession({
|
|
5770
5492
|
cwd,
|
|
5771
5493
|
model,
|
|
5772
5494
|
sessionManager,
|
|
5773
5495
|
modelRegistry,
|
|
5774
5496
|
resourceLoader,
|
|
5497
|
+
thinkingLevel: options.effort ? options.effort : void 0,
|
|
5775
5498
|
tools: options.allowedTools,
|
|
5776
5499
|
customTools: [
|
|
5777
5500
|
...applyAllowedTools(customTools, options.allowedTools),
|
|
@@ -5874,47 +5597,47 @@ function createPiRunner(options = {}) {
|
|
|
5874
5597
|
}
|
|
5875
5598
|
|
|
5876
5599
|
// ../../packages/runner-harness/dist/session.js
|
|
5877
|
-
import { existsSync as
|
|
5878
|
-
import { join as
|
|
5600
|
+
import { existsSync as existsSync6, mkdirSync as mkdirSync3, readFileSync as readFileSync3, writeFileSync as writeFileSync4 } from "node:fs";
|
|
5601
|
+
import { join as join9 } from "node:path";
|
|
5879
5602
|
var DIR = ".bunny-agent";
|
|
5880
5603
|
var FILE = "session-id";
|
|
5881
5604
|
function sessionPath(cwd) {
|
|
5882
|
-
return
|
|
5605
|
+
return join9(cwd, DIR, FILE);
|
|
5883
5606
|
}
|
|
5884
5607
|
function readSessionId(cwd) {
|
|
5885
5608
|
try {
|
|
5886
5609
|
const p = sessionPath(cwd);
|
|
5887
|
-
if (!
|
|
5610
|
+
if (!existsSync6(p))
|
|
5888
5611
|
return void 0;
|
|
5889
|
-
return
|
|
5612
|
+
return readFileSync3(p, "utf8").trim() || void 0;
|
|
5890
5613
|
} catch {
|
|
5891
5614
|
return void 0;
|
|
5892
5615
|
}
|
|
5893
5616
|
}
|
|
5894
5617
|
function writeSessionId(cwd, id) {
|
|
5895
5618
|
try {
|
|
5896
|
-
|
|
5897
|
-
|
|
5619
|
+
mkdirSync3(join9(cwd, DIR), { recursive: true });
|
|
5620
|
+
writeFileSync4(sessionPath(cwd), id, "utf8");
|
|
5898
5621
|
} catch {
|
|
5899
5622
|
}
|
|
5900
5623
|
}
|
|
5901
5624
|
|
|
5902
5625
|
// ../../packages/runner-harness/dist/skills.js
|
|
5903
|
-
import { existsSync as
|
|
5626
|
+
import { existsSync as existsSync7, readdirSync as readdirSync3, statSync as statSync3 } from "node:fs";
|
|
5904
5627
|
import { homedir as homedir2 } from "node:os";
|
|
5905
|
-
import { join as
|
|
5628
|
+
import { join as join10 } from "node:path";
|
|
5906
5629
|
function discoverSkillPaths(cwd) {
|
|
5907
5630
|
const paths = [];
|
|
5908
5631
|
for (const base of [
|
|
5909
|
-
|
|
5910
|
-
|
|
5632
|
+
join10(cwd, "skills"),
|
|
5633
|
+
join10(homedir2(), ".bunny-agent", "skills")
|
|
5911
5634
|
]) {
|
|
5912
|
-
if (!
|
|
5635
|
+
if (!existsSync7(base))
|
|
5913
5636
|
continue;
|
|
5914
5637
|
try {
|
|
5915
5638
|
for (const entry of readdirSync3(base)) {
|
|
5916
|
-
const full =
|
|
5917
|
-
if (statSync3(full).isDirectory() &&
|
|
5639
|
+
const full = join10(base, entry);
|
|
5640
|
+
if (statSync3(full).isDirectory() && existsSync7(join10(full, "SKILL.md"))) {
|
|
5918
5641
|
paths.push(full);
|
|
5919
5642
|
}
|
|
5920
5643
|
}
|
|
@@ -5967,7 +5690,8 @@ function dispatchRunner(runner, base, cwd, options) {
|
|
|
5967
5690
|
cwd,
|
|
5968
5691
|
sessionId: base.resume,
|
|
5969
5692
|
skillPaths: options.skillPaths ?? discoverSkillPaths(cwd),
|
|
5970
|
-
toolRefs: options.toolRefs
|
|
5693
|
+
toolRefs: options.toolRefs,
|
|
5694
|
+
effort: options.effort
|
|
5971
5695
|
}).run(options.userInput);
|
|
5972
5696
|
}
|
|
5973
5697
|
case "opencode":
|
|
@@ -6101,6 +5825,7 @@ function parseRunArgs() {
|
|
|
6101
5825
|
"skill-path": { type: "string", multiple: true },
|
|
6102
5826
|
resume: { type: "string" },
|
|
6103
5827
|
yolo: { type: "boolean" },
|
|
5828
|
+
effort: { type: "string" },
|
|
6104
5829
|
help: { type: "boolean", short: "h" }
|
|
6105
5830
|
},
|
|
6106
5831
|
allowPositionals: true,
|
|
@@ -6139,6 +5864,7 @@ function parseRunArgs() {
|
|
|
6139
5864
|
skillPaths: values["skill-path"],
|
|
6140
5865
|
resume: values.resume,
|
|
6141
5866
|
yolo: values["yolo"],
|
|
5867
|
+
effort: values["effort"],
|
|
6142
5868
|
userInput
|
|
6143
5869
|
};
|
|
6144
5870
|
}
|
|
@@ -6273,6 +5999,7 @@ async function main() {
|
|
|
6273
5999
|
skillPaths: args.skillPaths,
|
|
6274
6000
|
resume: args.resume,
|
|
6275
6001
|
yolo: args.yolo,
|
|
6002
|
+
effort: args.effort,
|
|
6276
6003
|
...toolRefs ? { toolRefs: toolRefs.tools } : {}
|
|
6277
6004
|
});
|
|
6278
6005
|
break;
|
package/dist/cli.js
CHANGED
|
@@ -105,6 +105,7 @@ function parseRunArgs() {
|
|
|
105
105
|
"skill-path": { type: "string", multiple: true },
|
|
106
106
|
resume: { type: "string" },
|
|
107
107
|
yolo: { type: "boolean" },
|
|
108
|
+
effort: { type: "string" },
|
|
108
109
|
help: { type: "boolean", short: "h" },
|
|
109
110
|
},
|
|
110
111
|
allowPositionals: true,
|
|
@@ -144,6 +145,7 @@ function parseRunArgs() {
|
|
|
144
145
|
skillPaths: values["skill-path"],
|
|
145
146
|
resume: values.resume,
|
|
146
147
|
yolo: values["yolo"],
|
|
148
|
+
effort: values["effort"],
|
|
147
149
|
userInput,
|
|
148
150
|
};
|
|
149
151
|
}
|
|
@@ -284,6 +286,7 @@ async function main() {
|
|
|
284
286
|
skillPaths: args.skillPaths,
|
|
285
287
|
resume: args.resume,
|
|
286
288
|
yolo: args.yolo,
|
|
289
|
+
effort: args.effort,
|
|
287
290
|
...(toolRefs ? { toolRefs: toolRefs.tools } : {}),
|
|
288
291
|
});
|
|
289
292
|
break;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bunny-agent/runner-cli",
|
|
3
|
-
"version": "0.9.43-beta.
|
|
3
|
+
"version": "0.9.43-beta.3",
|
|
4
4
|
"description": "BunnyAgent Runner CLI - Like gemini-cli or claude-code, runs in your local terminal with AI SDK UI streaming",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
],
|
|
42
42
|
"dependencies": {
|
|
43
43
|
"@anthropic-ai/claude-agent-sdk": "0.2.70",
|
|
44
|
-
"@earendil-works/pi-agent-core": "0.
|
|
45
|
-
"@earendil-works/pi-ai": "0.
|
|
46
|
-
"@earendil-works/pi-coding-agent": "0.
|
|
44
|
+
"@earendil-works/pi-agent-core": "0.78.0",
|
|
45
|
+
"@earendil-works/pi-ai": "0.78.0",
|
|
46
|
+
"@earendil-works/pi-coding-agent": "0.78.0",
|
|
47
47
|
"@openai/codex-sdk": "^0.110.0",
|
|
48
48
|
"dotenv": "^17.3.1",
|
|
49
49
|
"zod": "^4.0.0"
|
|
@@ -54,11 +54,11 @@
|
|
|
54
54
|
"typescript": "^5.3.0",
|
|
55
55
|
"vitest": "^1.6.1",
|
|
56
56
|
"@bunny-agent/runner-claude": "0.6.2",
|
|
57
|
-
"@bunny-agent/runner-harness": "0.1.1-beta.0",
|
|
58
57
|
"@bunny-agent/runner-codex": "0.6.2",
|
|
58
|
+
"@bunny-agent/runner-pi": "0.6.4-beta.0",
|
|
59
59
|
"@bunny-agent/runner-opencode": "0.6.2",
|
|
60
|
-
"@bunny-agent/runner-
|
|
61
|
-
"@bunny-agent/runner-
|
|
60
|
+
"@bunny-agent/runner-harness": "0.1.1-beta.0",
|
|
61
|
+
"@bunny-agent/runner-gemini": "0.6.2"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"build": "tsc && pnpm bundle",
|