@bunny-agent/runner-cli 0.9.43-beta.1 → 0.9.43-beta.2

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 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 existsSync6, unlinkSync as unlinkSync4 } from "node:fs";
1549
- import { join as join9 } from "node:path";
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 existsSync5 } from "node:fs";
1287
+ import { existsSync as existsSync4 } from "node:fs";
1555
1288
  import { homedir } from "node:os";
1556
- import { isAbsolute, join as join6, resolve as resolve2 } from "node:path";
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: ${existsSync5(abs) ? "yes" : "no"})`);
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 ?? join6(homedir(), ".bunny", "agent");
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 mkdirSync3, writeFileSync as writeFileSync4 } from "node:fs";
1644
- import { dirname as dirname3, extname, join as join7 } from "node:path";
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
- mkdirSync3(dirname3(filePath), { recursive: true });
1878
- writeFileSync4(filePath, Buffer.from(b64, "base64"));
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 = join7(cwd, filename.replace(/[^a-zA-Z0-9_\-./]/g, "_"));
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: readFileSync5, existsSync: existsSync9 } = await import("node:fs");
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 (!existsSync9(resolvedImage)) {
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 = join7(cwd, filename.replace(/[^a-zA-Z0-9_\-./]/g, "_"));
1811
+ const filePath = join6(cwd, filename.replace(/[^a-zA-Z0-9_\-./]/g, "_"));
2079
1812
  try {
2080
- const imageBuffer = readFileSync5(resolvedImage);
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 (existsSync9(resolvedMask)) {
1843
+ if (existsSync8(resolvedMask)) {
2111
1844
  files.push({
2112
1845
  name: "mask",
2113
1846
  filename: basename2(resolvedMask),
2114
- buffer: readFileSync5(resolvedMask),
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 join8 } from "node:path";
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 ? join8(sessionsDir, match) : void 0;
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(/&amp;/g, "&").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&quot;/g, '"').replace(/&#39;/g, "'").replace(/&nbsp;/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 = join9(debugCwd, "pi-message-stream-debug.json");
5659
- if (reset && existsSync6(file))
5660
- unlinkSync4(file);
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: false,
5427
+ reasoning: !!options.reasoningEffort,
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.reasoningEffort ? options.reasoningEffort : 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 existsSync7, mkdirSync as mkdirSync4, readFileSync as readFileSync4, writeFileSync as writeFileSync5 } from "node:fs";
5878
- import { join as join10 } from "node:path";
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 join10(cwd, DIR, FILE);
5605
+ return join9(cwd, DIR, FILE);
5883
5606
  }
5884
5607
  function readSessionId(cwd) {
5885
5608
  try {
5886
5609
  const p = sessionPath(cwd);
5887
- if (!existsSync7(p))
5610
+ if (!existsSync6(p))
5888
5611
  return void 0;
5889
- return readFileSync4(p, "utf8").trim() || void 0;
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
- mkdirSync4(join10(cwd, DIR), { recursive: true });
5897
- writeFileSync5(sessionPath(cwd), id, "utf8");
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 existsSync8, readdirSync as readdirSync3, statSync as statSync3 } from "node:fs";
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 join11 } from "node:path";
5628
+ import { join as join10 } from "node:path";
5906
5629
  function discoverSkillPaths(cwd) {
5907
5630
  const paths = [];
5908
5631
  for (const base of [
5909
- join11(cwd, "skills"),
5910
- join11(homedir2(), ".bunny-agent", "skills")
5632
+ join10(cwd, "skills"),
5633
+ join10(homedir2(), ".bunny-agent", "skills")
5911
5634
  ]) {
5912
- if (!existsSync8(base))
5635
+ if (!existsSync7(base))
5913
5636
  continue;
5914
5637
  try {
5915
5638
  for (const entry of readdirSync3(base)) {
5916
- const full = join11(base, entry);
5917
- if (statSync3(full).isDirectory() && existsSync8(join11(full, "SKILL.md"))) {
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
+ reasoningEffort: options.reasoningEffort
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
+ "reasoning-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
+ reasoningEffort: values["reasoning-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
+ reasoningEffort: args.reasoningEffort,
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
+ "reasoning-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
+ reasoningEffort: values["reasoning-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
+ reasoningEffort: args.reasoningEffort,
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":";AAEA;;;;;;GAMG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,4CAA4C;AAC5C,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,2DAA2D;AAC3D,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC;AACjD,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,EAAE,CAAC,CAAC;AACpD,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC;AAEvD,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAOvC;;;;;GAKG;AACH,SAAS,mBAAmB;IAC1B,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IACnD,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAE5B,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,OAAO,CAAC,KAAK,CACX,yEAAyE,CAC1E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,KAAK,CACX,6DAA6D,OAAO,EAAE,CACvE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,2DAA2D;AAC3D,SAAS,aAAa;IACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM;QACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACnC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,qFAAqF;AACrF,SAAS,gBAAgB;IACvB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC1B,IAAI,CAAC,KAAK,IAAI;YAAE,MAAM;QACtB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,sDAAsD;AACtD,SAAS,oBAAoB,CAAC,CAAS;IACrC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjE,KAAK,EAAE,CAAC;YACR,IAAI,KAAK,KAAK,CAAC;gBAAE,OAAO,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAoBD,SAAS,YAAY;IACnB,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,CAAC;QACxC,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC7B,OAAO,EAAE;YACP,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE;YACzD,KAAK,EAAE;gBACL,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,0BAA0B;aACpC;YACD,GAAG,EAAE;gBACH,IAAI,EAAE,QAAQ;gBACd,KAAK,EAAE,GAAG;gBACV,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,IAAI,OAAO,CAAC,GAAG,EAAE;aAC5D;YACD,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC/C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC3C,eAAe,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,EAAE;YAC/C,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE;YAChD,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC1B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE;YACzB,kBAAkB,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACtC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,IAAI;QACtB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,YAAY,EAAE,CAAC;QACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,IAAI,SAAS,GAAG,EAAE,CAAC;IACnB,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;SAAM,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAClC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,CAAC;IAED,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;QAC/C,OAAO,CAAC,KAAK,CAAC,oDAAoD,CAAC,CAAC;QACpE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAO,CAAC;IAC9B,IACE,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,EAC5E,CAAC;QACD,OAAO,CAAC,KAAK,CACX,0FAA0F,CAC3F,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,MAAM;QACN,KAAK,EAAE,MAAM,CAAC,KAAM;QACpB,GAAG,EAAE,MAAM,CAAC,GAAI;QAChB,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC;QACrC,QAAQ,EAAE,MAAM,CAAC,WAAW,CAAC;YAC3B,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,EAAE,CAAC;YAC1C,CAAC,CAAC,SAAS;QACb,YAAY,EAAE,MAAM,CAAC,eAAe,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACtE,UAAU,EAAE,MAAM,CAAC,YAAY,CAAyB;QACxD,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,eAAe,EAAE,MAAM,CAAC,kBAAkB,CAAC;QAC3C,SAAS;KACV,CAAC;AACJ,CAAC;AAeD,SAAS,mBAAmB;IAC1B,MAAM,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;QAC3B,IAAI,EAAE,oBAAoB,CAAC,CAAC,CAAC;QAC7B,OAAO,EAAE;YACP,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;YAChD,GAAG,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE;YAC1C,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;YACpD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC5B,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE;YACzC,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,EAAE;SACtC;QACD,gBAAgB,EAAE,KAAK;QACvB,MAAM,EAAE,IAAI;KACb,CAAC,CAAC;IAEH,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,mBAAmB,EAAE,CAAC;QACtB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAK;QAClB,GAAG,EAAE,MAAM,CAAC,GAAI;QAChB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,QAAQ,EAAE,MAAM,CAAC,QAAS;QAC1B,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,KAAK;KAC3B,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,SAAS,YAAY;IACnB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;CAyBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB;IAC1B,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;;;;;;;;;;;CAsBb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,cAAc;IACrB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;;CAYb,CAAC,CAAC;AACH,CAAC;AAED,SAAS,eAAe;IACtB,OAAO,CAAC,GAAG,CAAC;;;;;;;;;;;CAWb,CAAC,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,OAAO;AACP,8EAA8E;AAE9E,KAAK,UAAU,IAAI;IACjB,MAAM,GAAG,GAAG,aAAa,EAAE,CAAC;IAE5B,IAAI,CAAC,GAAG,IAAI,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC7C,eAAe,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,QAAQ,GAAG,EAAE,CAAC;QACZ,KAAK,KAAK,CAAC,CAAC,CAAC;YACX,MAAM,IAAI,GAAG,YAAY,EAAE,CAAC;YAC5B,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,MAAM,QAAQ,GAAG,mBAAmB,EAAE,CAAC;YACvC,MAAM,QAAQ,CAAC;gBACb,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,eAAe,EAAE,IAAI,CAAC,eAAe;gBACrC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClD,CAAC,CAAC;YACH,MAAM;QACR,CAAC;QACD,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;YAClC,IAAI,CAAC,MAAM,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACtD,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;gBACvB,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;gBACnC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,6BAA6B,MAAM,EAAE,CAAC,CAAC;gBACrD,cAAc,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YACD,MAAM;QACR,CAAC;QACD;YACE,OAAO,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YACzC,eAAe,EAAE,CAAC;YAClB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;AACH,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,OAAO,CAAC,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bunny-agent/runner-cli",
3
- "version": "0.9.43-beta.1",
3
+ "version": "0.9.43-beta.2",
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.74.0",
45
- "@earendil-works/pi-ai": "0.74.0",
46
- "@earendil-works/pi-coding-agent": "0.74.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"
@@ -53,12 +53,12 @@
53
53
  "esbuild": "^0.27.2",
54
54
  "typescript": "^5.3.0",
55
55
  "vitest": "^1.6.1",
56
- "@bunny-agent/runner-claude": "0.6.2",
57
56
  "@bunny-agent/runner-harness": "0.1.1-beta.0",
57
+ "@bunny-agent/runner-claude": "0.6.2",
58
58
  "@bunny-agent/runner-codex": "0.6.2",
59
59
  "@bunny-agent/runner-opencode": "0.6.2",
60
- "@bunny-agent/runner-gemini": "0.6.2",
61
- "@bunny-agent/runner-pi": "0.6.4-beta.0"
60
+ "@bunny-agent/runner-pi": "0.6.4-beta.0",
61
+ "@bunny-agent/runner-gemini": "0.6.2"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "tsc && pnpm bundle",