@bunny-agent/runner-cli 0.9.58 → 0.9.59-beta.1

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.
@@ -1,5 +1,5 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
2
- import { takeToolRefsFromEnv } from "../env-payload.js";
2
+ import { takeMcpConfigFromEnv, takeToolRefsFromEnv } from "../env-payload.js";
3
3
  describe("takeToolRefsFromEnv", () => {
4
4
  beforeEach(() => {
5
5
  vi.spyOn(console, "error").mockImplementation(() => { });
@@ -51,4 +51,56 @@ describe("takeToolRefsFromEnv", () => {
51
51
  expect(takeToolRefsFromEnv(env)).toBeNull();
52
52
  });
53
53
  });
54
+ describe("takeMcpConfigFromEnv", () => {
55
+ beforeEach(() => {
56
+ vi.spyOn(console, "error").mockImplementation(() => { });
57
+ });
58
+ afterEach(() => {
59
+ vi.restoreAllMocks();
60
+ });
61
+ it("parses and removes a request-scoped MCP config", () => {
62
+ const env = {
63
+ BUNNY_AGENT_MCP_CONFIG_JSON: JSON.stringify({
64
+ config: {
65
+ mcpServers: {
66
+ remote: {
67
+ url: "https://mcp.example.com",
68
+ auth: "bearer",
69
+ bearerToken: "secret",
70
+ },
71
+ },
72
+ },
73
+ }),
74
+ };
75
+ expect(takeMcpConfigFromEnv(env)?.config).toMatchObject({
76
+ mcpServers: {
77
+ remote: { bearerToken: "secret" },
78
+ },
79
+ });
80
+ expect(env.BUNNY_AGENT_MCP_CONFIG_JSON).toBeUndefined();
81
+ });
82
+ it("removes malformed payloads before returning", () => {
83
+ const env = {
84
+ BUNNY_AGENT_MCP_CONFIG_JSON: "{not-json",
85
+ };
86
+ expect(takeMcpConfigFromEnv(env)).toBeNull();
87
+ expect(env.BUNNY_AGENT_MCP_CONFIG_JSON).toBeUndefined();
88
+ });
89
+ it("removes an empty payload before returning", () => {
90
+ const env = {
91
+ BUNNY_AGENT_MCP_CONFIG_JSON: "",
92
+ };
93
+ expect(takeMcpConfigFromEnv(env)).toBeNull();
94
+ expect(env.BUNNY_AGENT_MCP_CONFIG_JSON).toBeUndefined();
95
+ });
96
+ it("is one-shot", () => {
97
+ const env = {
98
+ BUNNY_AGENT_MCP_CONFIG_JSON: JSON.stringify({
99
+ config: { mcpServers: {} },
100
+ }),
101
+ };
102
+ expect(takeMcpConfigFromEnv(env)).not.toBeNull();
103
+ expect(takeMcpConfigFromEnv(env)).toBeNull();
104
+ });
105
+ });
54
106
  //# sourceMappingURL=env-payload.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-payload.test.js","sourceRoot":"","sources":["../../src/__tests__/env-payload.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD,QAAQ,CAAC,qBAAqB,EAAE,GAAG,EAAE;IACnC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IACH,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,eAAe,EAAE,CAAC;IACvB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0DAA0D,EAAE,GAAG,EAAE;QAClE,MAAM,GAAG,GAAG,EAAuB,CAAC;QACpC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,4DAA4D,EAAE,GAAG,EAAE;QACpE,MAAM,GAAG,GAAG;YACV,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC;gBACzC,KAAK,EAAE;oBACL;wBACE,IAAI,EAAE,GAAG;wBACT,WAAW,EAAE,EAAE;wBACf,WAAW,EAAE,EAAE;wBACf,OAAO,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,UAAU,EAAE;qBAC3C;iBACF;aACF,CAAC;SACkB,CAAC;QAEvB,MAAM,MAAM,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wEAAwE,EAAE,GAAG,EAAE;QAChF,MAAM,GAAG,GAAG;YACV,0BAA0B,EAAE,WAAW;SACnB,CAAC;QAEvB,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;QAChE,MAAM,GAAG,GAAG;YACV,0BAA0B,EAAE,0BAA0B;SAClC,CAAC;QAEvB,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,aAAa,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kDAAkD,EAAE,GAAG,EAAE;QAC1D,MAAM,GAAG,GAAG;YACV,0BAA0B,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;SACrC,CAAC;QAEvB,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC;QACxD,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IAC9C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"env-payload.test.js","sourceRoot":"","sources":["../../src/__tests__/env-payload.test.ts"],"names":[],"mappings":"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"}
package/dist/bundle.mjs CHANGED
@@ -167,6 +167,28 @@ function takeToolRefsFromEnv(env = process.env) {
167
167
  return null;
168
168
  }
169
169
  }
170
+ function takeMcpConfigFromEnv(env = process.env) {
171
+ const raw = env.BUNNY_AGENT_MCP_CONFIG_JSON;
172
+ if (raw === void 0) return null;
173
+ delete env.BUNNY_AGENT_MCP_CONFIG_JSON;
174
+ if (raw.length === 0) return null;
175
+ try {
176
+ const parsed = JSON.parse(raw);
177
+ if (parsed.config == null || typeof parsed.config !== "object" || Array.isArray(parsed.config)) {
178
+ console.error(
179
+ "[bunny-agent] BUNNY_AGENT_MCP_CONFIG_JSON missing config object; ignoring."
180
+ );
181
+ return null;
182
+ }
183
+ return { config: parsed.config };
184
+ } catch (err) {
185
+ const message = err instanceof Error ? err.message : String(err);
186
+ console.error(
187
+ `[bunny-agent] Failed to parse BUNNY_AGENT_MCP_CONFIG_JSON: ${message}`
188
+ );
189
+ return null;
190
+ }
191
+ }
170
192
 
171
193
  // ../../packages/runner-harness/dist/agent-context.js
172
194
  var BUNNY_AGENT_SYSTEM_PROMPT = [
@@ -19078,6 +19100,308 @@ function createOpenCodeRunner(options = {}) {
19078
19100
  });
19079
19101
  }
19080
19102
 
19103
+ // ../../packages/runner-pi/dist/mcp-config.js
19104
+ import { createJiti } from "jiti";
19105
+ var MAX_SERVERS = 50;
19106
+ var MAX_MAP_ENTRIES = 100;
19107
+ var MAX_ARRAY_ENTRIES = 100;
19108
+ var MAX_NAME_LENGTH = 128;
19109
+ var MAX_STRING_LENGTH = 32768;
19110
+ var MAX_URL_LENGTH = 4096;
19111
+ var MAX_TIMEOUT_MS = 3e5;
19112
+ var McpConfigValidationError = class extends Error {
19113
+ constructor(message) {
19114
+ super(`Invalid MCP config: ${message}`);
19115
+ this.name = "McpConfigValidationError";
19116
+ }
19117
+ };
19118
+ var mcpAdapterModule;
19119
+ function getMcpAdapterModule() {
19120
+ if (!mcpAdapterModule) {
19121
+ const jiti = createJiti(import.meta.url, {
19122
+ fsCache: false,
19123
+ moduleCache: true
19124
+ });
19125
+ mcpAdapterModule = jiti("pi-mcp-adapter");
19126
+ }
19127
+ return mcpAdapterModule;
19128
+ }
19129
+ function fail(message) {
19130
+ throw new McpConfigValidationError(message);
19131
+ }
19132
+ function hasControlCharacter(value) {
19133
+ for (let index = 0; index < value.length; index += 1) {
19134
+ const code = value.charCodeAt(index);
19135
+ if (code <= 31 || code === 127)
19136
+ return true;
19137
+ }
19138
+ return false;
19139
+ }
19140
+ function isPlainRecord(value) {
19141
+ if (value == null || typeof value !== "object" || Array.isArray(value)) {
19142
+ return false;
19143
+ }
19144
+ const prototype = Object.getPrototypeOf(value);
19145
+ return prototype === Object.prototype || prototype === null;
19146
+ }
19147
+ function assertAllowedKeys(value, allowed, path2) {
19148
+ for (const key of Object.keys(value)) {
19149
+ if (!allowed.has(key)) {
19150
+ fail(`${path2}.${key} is not supported`);
19151
+ }
19152
+ }
19153
+ }
19154
+ function assertOptionalBoolean(value, key, path2) {
19155
+ const candidate = value[key];
19156
+ if (candidate !== void 0 && typeof candidate !== "boolean") {
19157
+ fail(`${path2}.${key} must be a boolean`);
19158
+ }
19159
+ }
19160
+ function assertOptionalNumber(value, key, path2, options = {}) {
19161
+ const candidate = value[key];
19162
+ if (candidate === void 0)
19163
+ return;
19164
+ if (typeof candidate !== "number" || !Number.isFinite(candidate) || candidate < (options.min ?? 0) || candidate > (options.max ?? Number.MAX_SAFE_INTEGER)) {
19165
+ fail(`${path2}.${key} is outside the supported range`);
19166
+ }
19167
+ }
19168
+ function assertOptionalString(value, key, path2, options = {}) {
19169
+ const candidate = value[key];
19170
+ if (candidate === void 0)
19171
+ return;
19172
+ if (typeof candidate !== "string" || candidate.length < (options.min ?? 0) || candidate.length > (options.max ?? MAX_STRING_LENGTH)) {
19173
+ fail(`${path2}.${key} must be a bounded string`);
19174
+ }
19175
+ }
19176
+ function assertStringArray(candidate, path2) {
19177
+ if (!Array.isArray(candidate) || candidate.length > MAX_ARRAY_ENTRIES) {
19178
+ fail(`${path2} must be an array with at most ${MAX_ARRAY_ENTRIES} entries`);
19179
+ }
19180
+ for (const [index, entry] of candidate.entries()) {
19181
+ if (typeof entry !== "string" || entry.length === 0 || entry.length > MAX_STRING_LENGTH) {
19182
+ fail(`${path2}[${index}] must be a non-empty bounded string`);
19183
+ }
19184
+ }
19185
+ }
19186
+ function assertOptionalStringArray(value, key, path2) {
19187
+ const candidate = value[key];
19188
+ if (candidate !== void 0) {
19189
+ assertStringArray(candidate, `${path2}.${key}`);
19190
+ }
19191
+ }
19192
+ function assertStringMap(candidate, path2) {
19193
+ if (!isPlainRecord(candidate)) {
19194
+ fail(`${path2} must be an object`);
19195
+ }
19196
+ const entries = Object.entries(candidate);
19197
+ if (entries.length > MAX_MAP_ENTRIES) {
19198
+ fail(`${path2} must have at most ${MAX_MAP_ENTRIES} entries`);
19199
+ }
19200
+ for (const [key, value] of entries) {
19201
+ if (key.length === 0 || key.length > MAX_NAME_LENGTH || typeof value !== "string" || value.length > MAX_STRING_LENGTH) {
19202
+ fail(`${path2} contains an invalid key or value`);
19203
+ }
19204
+ }
19205
+ }
19206
+ var COMMON_SERVER_KEYS = /* @__PURE__ */ new Set([
19207
+ "lifecycle",
19208
+ "requestTimeoutMs",
19209
+ "directTools",
19210
+ "includeTools",
19211
+ "excludeTools",
19212
+ "exposeResources",
19213
+ "disabled"
19214
+ ]);
19215
+ var HTTP_SERVER_KEYS = /* @__PURE__ */ new Set([
19216
+ ...COMMON_SERVER_KEYS,
19217
+ "url",
19218
+ "headers",
19219
+ "auth",
19220
+ "bearerToken"
19221
+ ]);
19222
+ var STDIO_SERVER_KEYS = /* @__PURE__ */ new Set([
19223
+ ...COMMON_SERVER_KEYS,
19224
+ "command",
19225
+ "args",
19226
+ "env",
19227
+ "cwd"
19228
+ ]);
19229
+ function validateCommonServerOptions(server, path2) {
19230
+ const lifecycle = server.lifecycle;
19231
+ if (lifecycle !== void 0 && lifecycle !== "lazy" && lifecycle !== "eager" && lifecycle !== "keep-alive") {
19232
+ fail(`${path2}.lifecycle is not supported`);
19233
+ }
19234
+ assertOptionalNumber(server, "requestTimeoutMs", path2, {
19235
+ min: 1,
19236
+ max: MAX_TIMEOUT_MS
19237
+ });
19238
+ assertOptionalBoolean(server, "exposeResources", path2);
19239
+ assertOptionalBoolean(server, "disabled", path2);
19240
+ assertOptionalStringArray(server, "includeTools", path2);
19241
+ assertOptionalStringArray(server, "excludeTools", path2);
19242
+ const directTools = server.directTools;
19243
+ if (directTools !== void 0 && typeof directTools !== "boolean" && !Array.isArray(directTools)) {
19244
+ fail(`${path2}.directTools must be a boolean or string array`);
19245
+ }
19246
+ if (Array.isArray(directTools)) {
19247
+ assertStringArray(directTools, `${path2}.directTools`);
19248
+ }
19249
+ }
19250
+ function validateHttpServer(server, path2) {
19251
+ assertAllowedKeys(server, HTTP_SERVER_KEYS, path2);
19252
+ assertOptionalString(server, "url", path2, {
19253
+ min: 1,
19254
+ max: MAX_URL_LENGTH
19255
+ });
19256
+ let url2;
19257
+ try {
19258
+ url2 = new URL(server.url);
19259
+ } catch {
19260
+ fail(`${path2}.url must be an absolute URL`);
19261
+ }
19262
+ if (url2.protocol !== "http:" && url2.protocol !== "https:") {
19263
+ fail(`${path2}.url must use HTTP or HTTPS`);
19264
+ }
19265
+ if (url2.username || url2.password) {
19266
+ fail(`${path2}.url must not contain embedded credentials`);
19267
+ }
19268
+ if (server.headers !== void 0) {
19269
+ assertStringMap(server.headers, `${path2}.headers`);
19270
+ }
19271
+ const auth = server.auth;
19272
+ if (auth !== void 0 && auth !== false && auth !== "bearer") {
19273
+ fail(`${path2}.auth must be "bearer" or false`);
19274
+ }
19275
+ assertOptionalString(server, "bearerToken", path2, {
19276
+ min: 1,
19277
+ max: MAX_STRING_LENGTH
19278
+ });
19279
+ if (auth === "bearer" && typeof server.bearerToken !== "string") {
19280
+ fail(`${path2}.bearerToken is required for bearer auth`);
19281
+ }
19282
+ if (server.bearerToken !== void 0 && auth !== "bearer") {
19283
+ fail(`${path2}.bearerToken requires auth to be "bearer"`);
19284
+ }
19285
+ }
19286
+ function validateStdioServer(server, path2) {
19287
+ assertAllowedKeys(server, STDIO_SERVER_KEYS, path2);
19288
+ if (typeof server.command !== "string") {
19289
+ fail(`${path2}.command must be a non-empty bounded string`);
19290
+ }
19291
+ assertOptionalString(server, "command", path2, {
19292
+ min: 1,
19293
+ max: MAX_STRING_LENGTH
19294
+ });
19295
+ assertOptionalString(server, "cwd", path2, {
19296
+ min: 1,
19297
+ max: MAX_STRING_LENGTH
19298
+ });
19299
+ if (server.args !== void 0) {
19300
+ assertStringArray(server.args, `${path2}.args`);
19301
+ }
19302
+ if (server.env !== void 0) {
19303
+ assertStringMap(server.env, `${path2}.env`);
19304
+ }
19305
+ }
19306
+ function validateServer(server, serverName) {
19307
+ const path2 = `mcpServers.${serverName}`;
19308
+ if (!isPlainRecord(server)) {
19309
+ fail(`${path2} must be an object`);
19310
+ }
19311
+ const serverKeys = Object.keys(server);
19312
+ const hasUrl = serverKeys.includes("url");
19313
+ const hasCommand = serverKeys.includes("command");
19314
+ if (hasUrl === hasCommand) {
19315
+ fail(`${path2} must define exactly one of url or command`);
19316
+ }
19317
+ validateCommonServerOptions(server, path2);
19318
+ if (hasUrl) {
19319
+ validateHttpServer(server, path2);
19320
+ } else {
19321
+ validateStdioServer(server, path2);
19322
+ }
19323
+ }
19324
+ var SETTINGS_KEYS = /* @__PURE__ */ new Set([
19325
+ "toolPrefix",
19326
+ "hostConfigDiscovery",
19327
+ "idleTimeout",
19328
+ "requestTimeoutMs",
19329
+ "directTools",
19330
+ "disableProxyTool",
19331
+ "autoAuth",
19332
+ "sampling",
19333
+ "samplingAutoApprove",
19334
+ "elicitation",
19335
+ "outputGuard"
19336
+ ]);
19337
+ function validateSettings(settings) {
19338
+ if (!isPlainRecord(settings)) {
19339
+ fail("settings must be an object");
19340
+ }
19341
+ assertAllowedKeys(settings, SETTINGS_KEYS, "settings");
19342
+ const toolPrefix = settings.toolPrefix;
19343
+ if (toolPrefix !== void 0 && toolPrefix !== "server" && toolPrefix !== "none" && toolPrefix !== "short" && toolPrefix !== "mcp") {
19344
+ fail("settings.toolPrefix is not supported");
19345
+ }
19346
+ const hostConfigDiscovery = settings.hostConfigDiscovery;
19347
+ if (hostConfigDiscovery !== void 0 && hostConfigDiscovery !== "off" && hostConfigDiscovery !== "prompt" && hostConfigDiscovery !== "on") {
19348
+ fail("settings.hostConfigDiscovery is not supported");
19349
+ }
19350
+ assertOptionalNumber(settings, "idleTimeout", "settings", {
19351
+ min: 0,
19352
+ max: 1440
19353
+ });
19354
+ assertOptionalNumber(settings, "requestTimeoutMs", "settings", {
19355
+ min: 1,
19356
+ max: MAX_TIMEOUT_MS
19357
+ });
19358
+ for (const key of [
19359
+ "directTools",
19360
+ "disableProxyTool",
19361
+ "autoAuth",
19362
+ "sampling",
19363
+ "samplingAutoApprove",
19364
+ "elicitation",
19365
+ "outputGuard"
19366
+ ]) {
19367
+ assertOptionalBoolean(settings, key, "settings");
19368
+ }
19369
+ }
19370
+ function validateMcpConfig(config3) {
19371
+ if (!isPlainRecord(config3)) {
19372
+ fail("root value must be an object");
19373
+ }
19374
+ assertAllowedKeys(config3, /* @__PURE__ */ new Set(["mcpServers", "settings"]), "config");
19375
+ if (!isPlainRecord(config3.mcpServers)) {
19376
+ fail("mcpServers must be an object");
19377
+ }
19378
+ const servers = Object.entries(config3.mcpServers);
19379
+ if (servers.length > MAX_SERVERS) {
19380
+ fail(`mcpServers must have at most ${MAX_SERVERS} entries`);
19381
+ }
19382
+ for (const [name, server] of servers) {
19383
+ if (name.length === 0 || name.length > MAX_NAME_LENGTH || hasControlCharacter(name)) {
19384
+ fail("mcpServers contains an invalid server name");
19385
+ }
19386
+ validateServer(server, name);
19387
+ }
19388
+ if (config3.settings !== void 0) {
19389
+ validateSettings(config3.settings);
19390
+ }
19391
+ return structuredClone(config3);
19392
+ }
19393
+ function shouldEnableMcp(config3, allowedTools) {
19394
+ return config3 !== void 0 && (!allowedTools || allowedTools.includes("mcp"));
19395
+ }
19396
+ function createMcpExtension(config3) {
19397
+ const validated = validateMcpConfig(config3);
19398
+ const { createMcpAdapter } = getMcpAdapterModule();
19399
+ return {
19400
+ name: "bunny-agent-mcp",
19401
+ factory: createMcpAdapter({ config: validated })
19402
+ };
19403
+ }
19404
+
19081
19405
  // ../../packages/runner-pi/dist/pi-runner.js
19082
19406
  import { appendFileSync as appendFileSync2, existsSync as existsSync9, unlinkSync as unlinkSync6 } from "node:fs";
19083
19407
  import { join as join11 } from "node:path";
@@ -19415,7 +19739,8 @@ var BunnyAgentResourceLoader = class {
19415
19739
  this.delegate = new DefaultResourceLoader({
19416
19740
  cwd: this.cwd,
19417
19741
  agentDir: this.agentDir,
19418
- settingsManager: options.settingsManager
19742
+ settingsManager: options.settingsManager,
19743
+ extensionFactories: options.extensionFactories
19419
19744
  });
19420
19745
  }
19421
19746
  async reload() {
@@ -23534,6 +23859,18 @@ function serializeResult(result) {
23534
23859
  // ../../packages/runner-pi/dist/pi-runner.js
23535
23860
  var LOG_PREFIX2 = "[bunny-agent:pi]";
23536
23861
  var LLM_THOUGHT_SIGNATURE_SEPARATOR = "__thought__";
23862
+ async function disposePiSession(session) {
23863
+ try {
23864
+ if (session.hasExtensionHandlers("session_shutdown")) {
23865
+ await session.extensionRunner.emit({
23866
+ type: "session_shutdown",
23867
+ reason: "quit"
23868
+ });
23869
+ }
23870
+ } finally {
23871
+ session.dispose();
23872
+ }
23873
+ }
23537
23874
  function applyAllowedTools(tools, allowedTools) {
23538
23875
  if (!allowedTools)
23539
23876
  return tools;
@@ -23685,6 +24022,7 @@ function createPiRunner(options = {}) {
23685
24022
  const apiKeyEnvKey = `${provider.toUpperCase().replace(/-/g, "_")}_API_KEY`;
23686
24023
  const inlineApiKey = typeof options.env?.[apiKeyEnvKey] === "string" && options.env[apiKeyEnvKey].length > 0 ? options.env[apiKeyEnvKey] : void 0;
23687
24024
  const imageModelName = resolveImageModelName(provider, options.env);
24025
+ const mcpExtension = shouldEnableMcp(options.mcpConfig, options.allowedTools) ? createMcpExtension(options.mcpConfig) : void 0;
23688
24026
  return {
23689
24027
  async *run(userInput) {
23690
24028
  const modelRuntime = await ModelRuntime.create({
@@ -23759,10 +24097,11 @@ function createPiRunner(options = {}) {
23759
24097
  return SessionManager2.create(cwd);
23760
24098
  })();
23761
24099
  stripLLMThoughtSignaturesFromSessionManager(sessionManager, model);
23762
- const resourceLoader = options.skillPaths || options.systemPrompt ? new BunnyAgentResourceLoader({
24100
+ const resourceLoader = options.skillPaths || options.systemPrompt || mcpExtension ? new BunnyAgentResourceLoader({
23763
24101
  cwd,
23764
24102
  skillPaths: options.skillPaths,
23765
- appendSystemPrompt: options.systemPrompt
24103
+ appendSystemPrompt: options.systemPrompt,
24104
+ extensionFactories: mcpExtension ? [mcpExtension] : void 0
23766
24105
  }) : void 0;
23767
24106
  if (options.skillPaths && options.skillPaths.length > 0) {
23768
24107
  console.error(`${LOG_PREFIX2} runner: cwd=${cwd} skillPaths=${JSON.stringify(options.skillPaths)}`);
@@ -23802,6 +24141,12 @@ function createPiRunner(options = {}) {
23802
24141
  ...toolRefDefinitions
23803
24142
  ]
23804
24143
  });
24144
+ try {
24145
+ await session.bindExtensions({ mode: "print" });
24146
+ } catch (error48) {
24147
+ await disposePiSession(session);
24148
+ throw error48;
24149
+ }
23805
24150
  const eventQueue = [];
23806
24151
  let promptSettled = false;
23807
24152
  let promptError;
@@ -23901,7 +24246,7 @@ function createPiRunner(options = {}) {
23901
24246
  abortSignal.removeEventListener("abort", abortHandler);
23902
24247
  }
23903
24248
  unsubscribe();
23904
- session.dispose();
24249
+ await disposePiSession(session);
23905
24250
  }
23906
24251
  } finally {
23907
24252
  if (inlineApiKey !== void 0) {
@@ -24021,6 +24366,7 @@ function dispatchRunner(runner, base, cwd, options) {
24021
24366
  forkFrom: options.forkFrom,
24022
24367
  skillPaths: options.skillPaths ?? discoverSkillPaths(cwd),
24023
24368
  toolRefs: options.toolRefs,
24369
+ mcpConfig: options.mcpConfig,
24024
24370
  effort: options.effort,
24025
24371
  systemEnv: options.systemEnv
24026
24372
  }).run(options.userInput);
@@ -24323,6 +24669,7 @@ async function main() {
24323
24669
  const args = parseRunArgs();
24324
24670
  process.chdir(args.cwd);
24325
24671
  const toolRefs = takeToolRefsFromEnv();
24672
+ const mcpConfig = takeMcpConfigFromEnv();
24326
24673
  await runAgent({
24327
24674
  runner: args.runner,
24328
24675
  model: args.model,
@@ -24335,7 +24682,8 @@ async function main() {
24335
24682
  forkFrom: args.forkFrom,
24336
24683
  yolo: args.yolo,
24337
24684
  effort: args.effort,
24338
- ...toolRefs ? { toolRefs: toolRefs.tools } : {}
24685
+ ...toolRefs ? { toolRefs: toolRefs.tools } : {},
24686
+ ...mcpConfig ? { mcpConfig: mcpConfig.config } : {}
24339
24687
  });
24340
24688
  break;
24341
24689
  }
package/dist/cli.js CHANGED
@@ -15,7 +15,7 @@ config({ path: resolve(process.cwd(), "../.env") });
15
15
  config({ path: resolve(process.cwd(), "../../.env") });
16
16
  import { parseArgs } from "node:util";
17
17
  import { buildImage } from "./build-image.js";
18
- import { takeToolRefsFromEnv } from "./env-payload.js";
18
+ import { takeMcpConfigFromEnv, takeToolRefsFromEnv } from "./env-payload.js";
19
19
  import { runAgent } from "./runner.js";
20
20
  // ---------------------------------------------------------------------------
21
21
  // Shared helpers
@@ -259,6 +259,7 @@ async function main() {
259
259
  const args = parseRunArgs();
260
260
  process.chdir(args.cwd);
261
261
  const toolRefs = takeToolRefsFromEnv();
262
+ const mcpConfig = takeMcpConfigFromEnv();
262
263
  await runAgent({
263
264
  runner: args.runner,
264
265
  model: args.model,
@@ -272,6 +273,7 @@ async function main() {
272
273
  yolo: args.yolo,
273
274
  effort: args.effort,
274
275
  ...(toolRefs ? { toolRefs: toolRefs.tools } : {}),
276
+ ...(mcpConfig ? { mcpConfig: mcpConfig.config } : {}),
275
277
  });
276
278
  break;
277
279
  }
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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"}
@@ -5,22 +5,31 @@
5
5
  * processes (notably the pi runner's bash tool) cannot inherit it via
6
6
  * `process.env`.
7
7
  *
8
- * Currently only `BUNNY_AGENT_TOOL_REFS_JSON` lives here — toolRefs may
9
- * carry Bearer tokens / HTTP headers that must never reach bash. Plain
10
- * `env` / `systemEnv` go through normal `sandbox.exec({env})` because in
11
- * CLI mode each runner-cli invocation is single-request, and pi's default
12
- * `ctx.env` (= the runner's `process.env`) is the expected bash environment.
8
+ * Tool refs and MCP configuration may carry bearer tokens or HTTP headers
9
+ * that must never reach bash. Plain `env` / `systemEnv` go through normal
10
+ * `sandbox.exec({env})` because in CLI mode each runner-cli invocation is
11
+ * single-request, and pi's default `ctx.env` (= the runner's `process.env`)
12
+ * is the expected bash environment.
13
13
  */
14
14
  import type { PiRunnerOptions } from "@bunny-agent/runner-pi";
15
15
  type RunnerToolRefs = NonNullable<PiRunnerOptions["toolRefs"]>;
16
16
  export type RunnerToolRefsPayload = {
17
17
  tools: RunnerToolRefs;
18
18
  };
19
+ type RunnerMcpConfig = NonNullable<PiRunnerOptions["mcpConfig"]>;
20
+ export type RunnerMcpConfigPayload = {
21
+ config: RunnerMcpConfig;
22
+ };
19
23
  /**
20
24
  * Take `BUNNY_AGENT_TOOL_REFS_JSON`. Returns null when the var is absent or
21
25
  * malformed. The var is deleted before parsing so even malformed payloads
22
26
  * don't linger in `process.env` for subsequent spawns.
23
27
  */
24
28
  export declare function takeToolRefsFromEnv(env?: NodeJS.ProcessEnv): RunnerToolRefsPayload | null;
29
+ /**
30
+ * Take `BUNNY_AGENT_MCP_CONFIG_JSON`. The variable is deleted before parsing
31
+ * so malformed or secret-bearing payloads cannot reach runner child processes.
32
+ */
33
+ export declare function takeMcpConfigFromEnv(env?: NodeJS.ProcessEnv): RunnerMcpConfigPayload | null;
25
34
  export {};
26
35
  //# sourceMappingURL=env-payload.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-payload.d.ts","sourceRoot":"","sources":["../src/env-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,KAAK,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAE9D;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,qBAAqB,GAAG,IAAI,CAoB9B"}
1
+ {"version":3,"file":"env-payload.d.ts","sourceRoot":"","sources":["../src/env-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAE9D,KAAK,cAAc,GAAG,WAAW,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,CAAC;AAC/D,MAAM,MAAM,qBAAqB,GAAG;IAAE,KAAK,EAAE,cAAc,CAAA;CAAE,CAAC;AAC9D,KAAK,eAAe,GAAG,WAAW,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;AACjE,MAAM,MAAM,sBAAsB,GAAG;IAAE,MAAM,EAAE,eAAe,CAAA;CAAE,CAAC;AAEjE;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,qBAAqB,GAAG,IAAI,CAoB9B;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,sBAAsB,GAAG,IAAI,CA0B/B"}
@@ -5,11 +5,11 @@
5
5
  * processes (notably the pi runner's bash tool) cannot inherit it via
6
6
  * `process.env`.
7
7
  *
8
- * Currently only `BUNNY_AGENT_TOOL_REFS_JSON` lives here — toolRefs may
9
- * carry Bearer tokens / HTTP headers that must never reach bash. Plain
10
- * `env` / `systemEnv` go through normal `sandbox.exec({env})` because in
11
- * CLI mode each runner-cli invocation is single-request, and pi's default
12
- * `ctx.env` (= the runner's `process.env`) is the expected bash environment.
8
+ * Tool refs and MCP configuration may carry bearer tokens or HTTP headers
9
+ * that must never reach bash. Plain `env` / `systemEnv` go through normal
10
+ * `sandbox.exec({env})` because in CLI mode each runner-cli invocation is
11
+ * single-request, and pi's default `ctx.env` (= the runner's `process.env`)
12
+ * is the expected bash environment.
13
13
  */
14
14
  /**
15
15
  * Take `BUNNY_AGENT_TOOL_REFS_JSON`. Returns null when the var is absent or
@@ -35,4 +35,31 @@ export function takeToolRefsFromEnv(env = process.env) {
35
35
  return null;
36
36
  }
37
37
  }
38
+ /**
39
+ * Take `BUNNY_AGENT_MCP_CONFIG_JSON`. The variable is deleted before parsing
40
+ * so malformed or secret-bearing payloads cannot reach runner child processes.
41
+ */
42
+ export function takeMcpConfigFromEnv(env = process.env) {
43
+ const raw = env.BUNNY_AGENT_MCP_CONFIG_JSON;
44
+ if (raw === undefined)
45
+ return null;
46
+ delete env.BUNNY_AGENT_MCP_CONFIG_JSON;
47
+ if (raw.length === 0)
48
+ return null;
49
+ try {
50
+ const parsed = JSON.parse(raw);
51
+ if (parsed.config == null ||
52
+ typeof parsed.config !== "object" ||
53
+ Array.isArray(parsed.config)) {
54
+ console.error("[bunny-agent] BUNNY_AGENT_MCP_CONFIG_JSON missing config object; ignoring.");
55
+ return null;
56
+ }
57
+ return { config: parsed.config };
58
+ }
59
+ catch (err) {
60
+ const message = err instanceof Error ? err.message : String(err);
61
+ console.error(`[bunny-agent] Failed to parse BUNNY_AGENT_MCP_CONFIG_JSON: ${message}`);
62
+ return null;
63
+ }
64
+ }
38
65
  //# sourceMappingURL=env-payload.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"env-payload.js","sourceRoot":"","sources":["../src/env-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAOH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,0BAA0B,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,GAAG,CAAC,0BAA0B,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC;QAC7D,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,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,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"}
1
+ {"version":3,"file":"env-payload.js","sourceRoot":"","sources":["../src/env-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,0BAA0B,CAAC;IAC3C,IAAI,CAAC,GAAG;QAAE,OAAO,IAAI,CAAC;IACtB,OAAO,GAAG,CAAC,0BAA0B,CAAC;IACtC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA+B,CAAC;QAC7D,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,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;IACjC,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;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,GAAG,GAAG,GAAG,CAAC,2BAA2B,CAAC;IAC5C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,GAAG,CAAC,2BAA2B,CAAC;IACvC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,IACE,MAAM,CAAC,MAAM,IAAI,IAAI;YACrB,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ;YACjC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAC5B,CAAC;YACD,OAAO,CAAC,KAAK,CACX,4EAA4E,CAC7E,CAAC;YACF,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAyB,EAAE,CAAC;IACtD,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,8DAA8D,OAAO,EAAE,CACxE,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bunny-agent/runner-cli",
3
- "version": "0.9.58",
3
+ "version": "0.9.59-beta.1",
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": {
@@ -45,9 +45,13 @@
45
45
  "@earendil-works/pi-agent-core": "0.80.10",
46
46
  "@earendil-works/pi-ai": "0.80.10",
47
47
  "@earendil-works/pi-coding-agent": "0.80.10",
48
+ "@earendil-works/pi-tui": "0.80.10",
48
49
  "@github/copilot-sdk": "1.0.7",
49
50
  "@openai/codex-sdk": "^0.144.6",
50
51
  "dotenv": "^17.3.1",
52
+ "jiti": "2.7.0",
53
+ "pi-mcp-adapter": "2.15.0",
54
+ "typebox": "1.1.38",
51
55
  "zod": "^4.0.0"
52
56
  },
53
57
  "devDependencies": {
@@ -55,19 +59,19 @@
55
59
  "esbuild": "^0.27.2",
56
60
  "typescript": "^5.3.0",
57
61
  "vitest": "^1.6.1",
58
- "@bunny-agent/apply-patch": "0.1.0",
59
- "@bunny-agent/runner-copilot": "0.1.0",
60
62
  "@bunny-agent/runner-claude": "0.6.2",
63
+ "@bunny-agent/apply-patch": "0.1.0",
61
64
  "@bunny-agent/runner-codex": "0.6.2",
62
- "@bunny-agent/runner-pi": "0.6.4-beta.0",
63
- "@bunny-agent/runner-harness": "0.1.1-beta.0",
65
+ "@bunny-agent/runner-copilot": "0.1.0",
64
66
  "@bunny-agent/runner-gemini": "0.6.2",
65
- "@bunny-agent/runner-opencode": "0.6.2"
67
+ "@bunny-agent/runner-pi": "0.6.4-beta.0",
68
+ "@bunny-agent/runner-opencode": "0.6.2",
69
+ "@bunny-agent/runner-harness": "0.1.1-beta.0"
66
70
  },
67
71
  "scripts": {
68
72
  "build": "tsc && pnpm bundle",
69
73
  "build:bundle": "tsc && pnpm bundle",
70
- "bundle": "esbuild src/cli.ts --bundle --platform=node --format=esm --external:dotenv --external:@anthropic-ai/claude-agent-sdk --external:@github/copilot-sdk --external:@openai/codex-sdk --external:@earendil-works/pi-agent-core --external:@earendil-works/pi-ai --external:@earendil-works/pi-coding-agent --outfile=dist/bundle.mjs && esbuild src/apply-patch-bin.ts --bundle --platform=node --format=esm --outfile=dist/apply-patch-bin.js --allow-overwrite",
74
+ "bundle": "esbuild src/cli.ts --bundle --platform=node --format=esm --external:dotenv --external:jiti --external:@anthropic-ai/claude-agent-sdk --external:@github/copilot-sdk --external:@openai/codex-sdk --external:@earendil-works/pi-agent-core --external:@earendil-works/pi-ai --external:@earendil-works/pi-coding-agent --outfile=dist/bundle.mjs && esbuild src/apply-patch-bin.ts --bundle --platform=node --format=esm --outfile=dist/apply-patch-bin.js --allow-overwrite",
71
75
  "dev": "tsc --watch",
72
76
  "clean": "rm -rf dist",
73
77
  "typecheck": "tsc --noEmit",