@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.
- package/dist/__tests__/env-payload.test.js +53 -1
- package/dist/__tests__/env-payload.test.js.map +1 -1
- package/dist/bundle.mjs +353 -5
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/env-payload.d.ts +14 -5
- package/dist/env-payload.d.ts.map +1 -1
- package/dist/env-payload.js +32 -5
- package/dist/env-payload.js.map +1 -1
- package/package.json +11 -7
|
@@ -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;
|
|
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
|
|
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":";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;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/env-payload.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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;
|
|
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"}
|
package/dist/env-payload.js
CHANGED
|
@@ -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
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* `
|
|
11
|
-
*
|
|
12
|
-
*
|
|
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
|
package/dist/env-payload.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env-payload.js","sourceRoot":"","sources":["../src/env-payload.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;
|
|
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.
|
|
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-
|
|
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-
|
|
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",
|