@bunny-agent/runner-cli 0.9.60-beta.2 → 0.9.60-beta.5

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.
@@ -106,6 +106,42 @@ describe("runner-cli Integration Tests", () => {
106
106
  expect(typeof result.responses[1].result.sessionId).toBe("string");
107
107
  expect(result.exitCode).toBe(0);
108
108
  }, TIMEOUT);
109
+ it("reports an unknown runner from _meta as invalid params, not an internal error", async () => {
110
+ // Fully unmocked, and credential-free: dispatch rejects the runner name
111
+ // before any agent SDK is constructed.
112
+ const result = await runAcpHandshake([
113
+ {
114
+ jsonrpc: "2.0",
115
+ id: 1,
116
+ method: "initialize",
117
+ params: { protocolVersion: 1, clientCapabilities: {} },
118
+ },
119
+ {
120
+ jsonrpc: "2.0",
121
+ id: 2,
122
+ method: "session/new",
123
+ params: {
124
+ cwd: process.cwd(),
125
+ mcpServers: [],
126
+ _meta: { "bunny-agent": { runner: "claude-code" } },
127
+ },
128
+ },
129
+ (prior) => ({
130
+ jsonrpc: "2.0",
131
+ id: 3,
132
+ method: "session/prompt",
133
+ params: {
134
+ sessionId: prior[1].result.sessionId,
135
+ prompt: [{ type: "text", text: "hi" }],
136
+ },
137
+ }),
138
+ ]);
139
+ const promptResponse = result.responses[2];
140
+ expect(promptResponse.error).toBeDefined();
141
+ // -32602 invalid params, not -32603 internal error.
142
+ expect(promptResponse.error?.code).toBe(-32602);
143
+ expect(promptResponse.error?.message).toMatch(/Unknown runner: claude-code/);
144
+ }, TIMEOUT);
109
145
  });
110
146
  /**
111
147
  * Helper to run CLI and capture output
@@ -140,21 +176,32 @@ function runCLI(args, options = {}) {
140
176
  });
141
177
  }
142
178
  /**
143
- * Drives `bunny-agent acp` as a real subprocess: writes newline-delimited
144
- * JSON-RPC requests to its stdin, collects matching responses from stdout by
145
- * id, then closes stdin (how a disconnecting editor looks on the wire) and
146
- * waits for the process to exit cleanly.
179
+ * Drives `bunny-agent acp` as a real subprocess over its actual stdin/stdout:
180
+ * sends each step, waits for the matching response before sending the next
181
+ * (so a step can depend on an earlier `sessionId`), then closes stdin — how a
182
+ * disconnecting editor looks on the wire — and waits for a clean exit.
147
183
  */
148
- function runAcpHandshake(requests) {
184
+ function runAcpHandshake(steps) {
149
185
  return new Promise((resolve, reject) => {
150
186
  const proc = spawn("node", [CLI_PATH, "acp", "--runner", "claude"], {
151
187
  env: process.env,
152
188
  stdio: "pipe",
153
189
  });
154
- const pendingIds = new Set(requests.map((r) => r.id));
155
190
  const responses = [];
156
191
  let buffer = "";
157
192
  let stderr = "";
193
+ let stepIndex = 0;
194
+ let awaitingId = null;
195
+ const sendNext = () => {
196
+ if (stepIndex >= steps.length) {
197
+ proc.stdin?.end();
198
+ return;
199
+ }
200
+ const step = steps[stepIndex++];
201
+ const req = typeof step === "function" ? step(responses) : step;
202
+ awaitingId = req.id;
203
+ proc.stdin?.write(`${JSON.stringify(req)}\n`);
204
+ };
158
205
  proc.stdout?.on("data", (chunk) => {
159
206
  buffer += chunk.toString();
160
207
  const lines = buffer.split("\n");
@@ -170,29 +217,25 @@ function runAcpHandshake(requests) {
170
217
  reject(new Error(`acp stdout emitted a non-JSON line, which would corrupt real ACP framing: ${line}`));
171
218
  return;
172
219
  }
173
- if (typeof msg.id === "number" && pendingIds.has(msg.id)) {
220
+ if (msg.id === awaitingId) {
174
221
  responses.push(msg);
175
- pendingIds.delete(msg.id);
222
+ awaitingId = null;
223
+ sendNext();
176
224
  }
177
225
  }
178
- if (pendingIds.size === 0) {
179
- proc.stdin?.end();
180
- }
181
226
  });
182
227
  proc.stderr?.on("data", (chunk) => {
183
228
  stderr += chunk.toString();
184
229
  });
185
230
  proc.on("close", (code) => {
186
- if (pendingIds.size > 0) {
187
- reject(new Error(`acp process exited before answering all requests (missing ids: ${[...pendingIds].join(",")}). stderr: ${stderr}`));
231
+ if (responses.length < steps.length) {
232
+ reject(new Error(`acp process exited after ${responses.length}/${steps.length} responses. stderr: ${stderr}`));
188
233
  return;
189
234
  }
190
235
  resolve({ responses, exitCode: code ?? 0 });
191
236
  });
192
237
  proc.on("error", reject);
193
- for (const req of requests) {
194
- proc.stdin?.write(`${JSON.stringify(req)}\n`);
195
- }
238
+ sendNext();
196
239
  setTimeout(() => {
197
240
  proc.kill();
198
241
  reject(new Error("acp handshake timed out"));
@@ -1 +1 @@
1
- {"version":3,"file":"runner-cli.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/runner-cli.integration.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"runner-cli.integration.test.js","sourceRoot":"","sources":["../../src/__tests__/runner-cli.integration.test.ts"],"names":[],"mappings":"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"}
package/dist/bundle.mjs CHANGED
@@ -25144,6 +25144,9 @@ var AcpSessionUpdateSerializer = class {
25144
25144
  toolTitles = /* @__PURE__ */ new Map();
25145
25145
  stopReasonValue = "end_turn";
25146
25146
  errorTextValue;
25147
+ sessionIdValue;
25148
+ inputTokensValue = 0;
25149
+ outputTokensValue = 0;
25147
25150
  /** Stop reason for the prompt turn; valid once `serialize()` completes. */
25148
25151
  get stopReason() {
25149
25152
  return this.stopReasonValue;
@@ -25152,6 +25155,19 @@ var AcpSessionUpdateSerializer = class {
25152
25155
  get errorText() {
25153
25156
  return this.errorTextValue;
25154
25157
  }
25158
+ get sessionId() {
25159
+ return this.sessionIdValue;
25160
+ }
25161
+ get usage() {
25162
+ const totalTokens = this.inputTokensValue + this.outputTokensValue;
25163
+ if (totalTokens === 0)
25164
+ return void 0;
25165
+ return {
25166
+ inputTokens: this.inputTokensValue,
25167
+ outputTokens: this.outputTokensValue,
25168
+ totalTokens
25169
+ };
25170
+ }
25155
25171
  async *serialize(chunks) {
25156
25172
  for await (const chunk of chunks) {
25157
25173
  yield* this.convert(chunk);
@@ -25230,18 +25246,48 @@ var AcpSessionUpdateSerializer = class {
25230
25246
  return;
25231
25247
  }
25232
25248
  case "finish": {
25233
- const { finishReason: finishReason2 } = chunk;
25249
+ const { finishReason: finishReason2, messageMetadata } = chunk;
25250
+ this.captureMetadata(messageMetadata);
25234
25251
  if (this.errorTextValue === void 0) {
25235
25252
  this.stopReasonValue = mapFinishReason2(finishReason2);
25236
25253
  }
25237
25254
  return;
25238
25255
  }
25256
+ case "step-finish": {
25257
+ const usage = chunk.usage;
25258
+ this.inputTokensValue += usage?.inputTokens ?? 0;
25259
+ this.outputTokensValue += usage?.outputTokens ?? 0;
25260
+ return;
25261
+ }
25262
+ case "message-metadata": {
25263
+ this.captureMetadata(chunk.messageMetadata);
25264
+ return;
25265
+ }
25239
25266
  // text-start/text-end have no ACP equivalent (agent_message_chunk carries
25240
25267
  // messageId), and tool-input-delta has no incremental-input counterpart.
25241
25268
  default:
25242
25269
  return;
25243
25270
  }
25244
25271
  }
25272
+ captureMetadata(metadata) {
25273
+ if (!metadata || typeof metadata !== "object")
25274
+ return;
25275
+ const value = metadata;
25276
+ const sessionId = value.sessionId ?? value.session_id ?? value.sessionFile;
25277
+ if (typeof sessionId === "string" && sessionId.length > 0) {
25278
+ this.sessionIdValue = sessionId;
25279
+ }
25280
+ const usage = value.usage;
25281
+ if (!usage || typeof usage !== "object")
25282
+ return;
25283
+ const usageValue = usage;
25284
+ if (typeof usageValue.inputTokens === "number") {
25285
+ this.inputTokensValue = Math.max(this.inputTokensValue, usageValue.inputTokens);
25286
+ }
25287
+ if (typeof usageValue.outputTokens === "number") {
25288
+ this.outputTokensValue = Math.max(this.outputTokensValue, usageValue.outputTokens);
25289
+ }
25290
+ }
25245
25291
  *openToolCall(toolCallId, toolName) {
25246
25292
  if (this.startedTools.has(toolCallId))
25247
25293
  return;
@@ -25274,6 +25320,21 @@ function mapFinishReason2(finishReason2) {
25274
25320
  var BUNNY_META_KEY = "bunny-agent";
25275
25321
  var DEFAULT_MODEL = "claude-sonnet-4-20250514";
25276
25322
  var asString = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
25323
+ var asStringArray = (value) => {
25324
+ if (!Array.isArray(value))
25325
+ return void 0;
25326
+ const strings = value.filter((item) => typeof item === "string");
25327
+ return strings.length === value.length ? strings : void 0;
25328
+ };
25329
+ var asStringRecord = (value) => {
25330
+ if (!value || typeof value !== "object" || Array.isArray(value))
25331
+ return void 0;
25332
+ const entries = Object.entries(value);
25333
+ if (!entries.every(([, item]) => typeof item === "string"))
25334
+ return void 0;
25335
+ return Object.fromEntries(entries);
25336
+ };
25337
+ var asObject = (value) => value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
25277
25338
  function readBunnyMeta(meta3) {
25278
25339
  const scoped = meta3?.[BUNNY_META_KEY];
25279
25340
  if (scoped === null || typeof scoped !== "object")
@@ -25283,9 +25344,24 @@ function readBunnyMeta(meta3) {
25283
25344
  runner: asString(value.runner),
25284
25345
  model: asString(value.model),
25285
25346
  systemPrompt: asString(value.systemPrompt),
25286
- yolo: typeof value.yolo === "boolean" ? value.yolo : void 0
25287
- };
25288
- }
25347
+ yolo: typeof value.yolo === "boolean" ? value.yolo : void 0,
25348
+ allowedTools: asStringArray(value.allowedTools),
25349
+ resume: asString(value.resume),
25350
+ forkFrom: asString(value.forkFrom),
25351
+ skillPaths: asStringArray(value.skillPaths),
25352
+ env: asStringRecord(value.env),
25353
+ systemEnv: asStringRecord(value.systemEnv),
25354
+ toolRefs: Array.isArray(value.toolRefs) ? value.toolRefs : void 0,
25355
+ mcpConfig: asObject(value.mcpConfig),
25356
+ effort: asString(value.effort),
25357
+ askUserQuestionTimeoutMs: typeof value.askUserQuestionTimeoutMs === "number" && Number.isFinite(value.askUserQuestionTimeoutMs) ? value.askUserQuestionTimeoutMs : void 0,
25358
+ input: asObject(value.input)
25359
+ };
25360
+ }
25361
+ var mergeEnv = (...sources) => {
25362
+ const merged = Object.assign({}, ...sources.filter(Boolean));
25363
+ return Object.keys(merged).length > 0 ? merged : void 0;
25364
+ };
25289
25365
  var promptToText = (prompt) => prompt.map((block) => block.type === "text" ? block.text : "").filter((text) => text.length > 0).join("\n");
25290
25366
  function createBunnyAgentAcpApp(options = {}) {
25291
25367
  const sessions = /* @__PURE__ */ new Map();
@@ -25300,27 +25376,47 @@ function createBunnyAgentAcpApp(options = {}) {
25300
25376
  ...readBunnyMeta(params._meta)
25301
25377
  });
25302
25378
  return { sessionId };
25303
- }).onRequest(methods.agent.session.prompt, async ({ params, client: client2 }) => {
25379
+ }).onRequest(methods.agent.session.prompt, async ({ params, client: client2, signal }) => {
25304
25380
  const session = sessions.get(params.sessionId);
25305
25381
  if (!session) {
25306
25382
  throw RequestError.invalidParams(void 0, `Unknown session: ${params.sessionId}`);
25307
25383
  }
25308
25384
  const abort = new AbortController();
25309
25385
  session.abort = abort;
25386
+ const turn = readBunnyMeta(params._meta);
25387
+ const onTransportAbort = () => abort.abort();
25388
+ if (signal.aborted)
25389
+ abort.abort();
25390
+ else
25391
+ signal.addEventListener("abort", onTransportAbort, { once: true });
25310
25392
  const serializer = new AcpSessionUpdateSerializer();
25311
- const chunks = parseRunnerStream(createRunner({
25312
- runner: session.runner ?? options.defaultRunner ?? "claude",
25313
- model: session.model ?? options.defaultModel ?? DEFAULT_MODEL,
25314
- userInput: promptToText(params.prompt),
25315
- systemPrompt: session.systemPrompt,
25316
- cwd: session.cwd,
25317
- yolo: session.yolo ?? options.yolo,
25318
- env: options.env,
25319
- abortController: abort,
25320
- // Caller owns session/resume; don't touch cwd/.bunny-agent state.
25321
- autoInject: false
25322
- }));
25323
25393
  try {
25394
+ let chunks;
25395
+ try {
25396
+ chunks = parseRunnerStream(createRunner({
25397
+ runner: turn.runner ?? session.runner ?? options.defaultRunner ?? "claude",
25398
+ model: turn.model ?? session.model ?? options.defaultModel ?? DEFAULT_MODEL,
25399
+ ...turn.input ? { input: turn.input } : { userInput: promptToText(params.prompt) },
25400
+ systemPrompt: turn.systemPrompt ?? session.systemPrompt,
25401
+ cwd: session.cwd,
25402
+ yolo: turn.yolo ?? session.yolo ?? options.yolo,
25403
+ allowedTools: turn.allowedTools ?? session.allowedTools,
25404
+ resume: turn.resume ?? session.resume,
25405
+ forkFrom: turn.forkFrom ?? session.forkFrom,
25406
+ skillPaths: turn.skillPaths ?? session.skillPaths,
25407
+ env: mergeEnv(options.env, session.env, turn.env),
25408
+ systemEnv: mergeEnv(session.systemEnv, turn.systemEnv),
25409
+ toolRefs: turn.toolRefs ?? session.toolRefs,
25410
+ mcpConfig: turn.mcpConfig ?? session.mcpConfig,
25411
+ effort: turn.effort ?? session.effort,
25412
+ askUserQuestionTimeoutMs: turn.askUserQuestionTimeoutMs ?? session.askUserQuestionTimeoutMs,
25413
+ abortController: abort,
25414
+ // Caller owns session/resume; don't touch cwd/.bunny-agent.
25415
+ autoInject: false
25416
+ }));
25417
+ } catch (error48) {
25418
+ throw RequestError.invalidParams(void 0, error48 instanceof Error ? error48.message : String(error48));
25419
+ }
25324
25420
  for await (const update of serializer.serialize(chunks)) {
25325
25421
  await client2.notify(methods.client.session.update, {
25326
25422
  sessionId: params.sessionId,
@@ -25328,9 +25424,18 @@ function createBunnyAgentAcpApp(options = {}) {
25328
25424
  });
25329
25425
  }
25330
25426
  } finally {
25427
+ signal.removeEventListener("abort", onTransportAbort);
25331
25428
  session.abort = void 0;
25332
25429
  }
25333
- return { stopReason: serializer.stopReason };
25430
+ const runnerMeta = {
25431
+ ...serializer.sessionId ? { sessionId: serializer.sessionId } : {},
25432
+ ...serializer.errorText ? { errorText: serializer.errorText } : {}
25433
+ };
25434
+ return {
25435
+ stopReason: serializer.stopReason,
25436
+ ...serializer.usage ? { usage: serializer.usage } : {},
25437
+ ...Object.keys(runnerMeta).length > 0 ? { _meta: { [BUNNY_META_KEY]: runnerMeta } } : {}
25438
+ };
25334
25439
  }).onNotification(methods.agent.session.cancel, ({ params }) => {
25335
25440
  sessions.get(params.sessionId)?.abort?.abort();
25336
25441
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bunny-agent/runner-cli",
3
- "version": "0.9.60-beta.2",
3
+ "version": "0.9.60-beta.5",
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": {
@@ -59,16 +59,16 @@
59
59
  "esbuild": "^0.27.2",
60
60
  "typescript": "^5.3.0",
61
61
  "vitest": "^1.6.1",
62
- "@bunny-agent/manager": "0.9.60-beta.2",
62
+ "@bunny-agent/manager": "0.9.60-beta.5",
63
63
  "@bunny-agent/runner-codex": "0.6.2",
64
- "@bunny-agent/apply-patch": "0.1.0",
65
64
  "@bunny-agent/runner-copilot": "0.1.0",
66
- "@bunny-agent/runner-harness": "0.1.1-beta.0",
67
- "@bunny-agent/runner-claude": "0.6.2",
68
65
  "@bunny-agent/runner-gemini": "0.6.2",
66
+ "@bunny-agent/runner-harness": "0.1.1-beta.0",
69
67
  "@bunny-agent/runner-opencode": "0.6.2",
68
+ "@bunny-agent/runner-pi": "0.6.4-beta.0",
70
69
  "@bunny-agent/server-acp": "0.1.0",
71
- "@bunny-agent/runner-pi": "0.6.4-beta.0"
70
+ "@bunny-agent/runner-claude": "0.6.2",
71
+ "@bunny-agent/apply-patch": "0.1.0"
72
72
  },
73
73
  "scripts": {
74
74
  "build": "tsc && pnpm bundle",