@bunny-agent/runner-cli 0.9.36 → 0.9.37-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/bundle.mjs +0 -201
- package/package.json +3 -3
package/dist/bundle.mjs
CHANGED
|
@@ -5313,203 +5313,6 @@ function serializeResult(result) {
|
|
|
5313
5313
|
return JSON.stringify(result);
|
|
5314
5314
|
}
|
|
5315
5315
|
|
|
5316
|
-
// ../../packages/runner-pi/dist/video-tools.js
|
|
5317
|
-
function resolveArkConfig(env) {
|
|
5318
|
-
const apiKey = env.ARK_API_KEY ?? process.env.ARK_API_KEY;
|
|
5319
|
-
const modelId = env.ARK_MODEL_ID ?? process.env.ARK_MODEL_ID ?? "dreamina-seedance-2-0";
|
|
5320
|
-
const baseUrl = env.ARK_BASE_URL ?? process.env.ARK_BASE_URL ?? "https://ark.ap-southeast.bytepluses.com/api/v3";
|
|
5321
|
-
if (!apiKey)
|
|
5322
|
-
throw new Error("Missing ARK_API_KEY");
|
|
5323
|
-
return { apiKey, modelId, baseUrl };
|
|
5324
|
-
}
|
|
5325
|
-
function mapArkStatus(raw) {
|
|
5326
|
-
switch (raw) {
|
|
5327
|
-
case "queued":
|
|
5328
|
-
return "queued";
|
|
5329
|
-
case "running":
|
|
5330
|
-
return "running";
|
|
5331
|
-
case "succeeded":
|
|
5332
|
-
return "succeeded";
|
|
5333
|
-
case "cancelled":
|
|
5334
|
-
return "cancelled";
|
|
5335
|
-
case "failed":
|
|
5336
|
-
case "unknown":
|
|
5337
|
-
default:
|
|
5338
|
-
return "failed";
|
|
5339
|
-
}
|
|
5340
|
-
}
|
|
5341
|
-
var byteplusProvider = {
|
|
5342
|
-
id: "byteplus",
|
|
5343
|
-
label: "BytePlus Ark",
|
|
5344
|
-
envKeys: ["ARK_API_KEY"],
|
|
5345
|
-
pollIntervalMs: 1e4,
|
|
5346
|
-
async create({ prompt, env, signal }) {
|
|
5347
|
-
const { apiKey, modelId, baseUrl } = resolveArkConfig(env);
|
|
5348
|
-
const res = await fetch(`${baseUrl}/contents/generations/tasks`, {
|
|
5349
|
-
method: "POST",
|
|
5350
|
-
headers: {
|
|
5351
|
-
"Content-Type": "application/json",
|
|
5352
|
-
Authorization: `Bearer ${apiKey}`
|
|
5353
|
-
},
|
|
5354
|
-
body: JSON.stringify({
|
|
5355
|
-
model: modelId,
|
|
5356
|
-
content: [{ type: "text", text: prompt }]
|
|
5357
|
-
}),
|
|
5358
|
-
signal
|
|
5359
|
-
});
|
|
5360
|
-
if (!res.ok) {
|
|
5361
|
-
const errorText = await res.text();
|
|
5362
|
-
throw new Error(`Failed to create video task: ${res.status} ${errorText}`);
|
|
5363
|
-
}
|
|
5364
|
-
const data = await res.json();
|
|
5365
|
-
if (!data.id) {
|
|
5366
|
-
throw new Error("No task ID returned from video generation API");
|
|
5367
|
-
}
|
|
5368
|
-
return { taskId: data.id };
|
|
5369
|
-
},
|
|
5370
|
-
async poll({ taskId, env, signal }) {
|
|
5371
|
-
const { apiKey, baseUrl } = resolveArkConfig(env);
|
|
5372
|
-
const res = await fetch(`${baseUrl}/contents/generations/tasks/${taskId}`, {
|
|
5373
|
-
method: "GET",
|
|
5374
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
5375
|
-
signal
|
|
5376
|
-
});
|
|
5377
|
-
if (!res.ok) {
|
|
5378
|
-
const errorText = await res.text();
|
|
5379
|
-
throw new Error(`Failed to check task status: ${res.status} ${errorText}`);
|
|
5380
|
-
}
|
|
5381
|
-
const data = await res.json();
|
|
5382
|
-
const status = mapArkStatus(data.status);
|
|
5383
|
-
const state = { status };
|
|
5384
|
-
if (status === "succeeded") {
|
|
5385
|
-
state.videoUrl = data.content?.[0]?.video?.url;
|
|
5386
|
-
} else if (status === "failed") {
|
|
5387
|
-
state.error = typeof data.error === "string" ? data.error : data.error?.message ?? `Task status: ${data.status}`;
|
|
5388
|
-
}
|
|
5389
|
-
return state;
|
|
5390
|
-
},
|
|
5391
|
-
async cancel({ taskId, env }) {
|
|
5392
|
-
const { apiKey, baseUrl } = resolveArkConfig(env);
|
|
5393
|
-
const ctl = new AbortController();
|
|
5394
|
-
const timer = setTimeout(() => ctl.abort(), 5e3);
|
|
5395
|
-
try {
|
|
5396
|
-
await fetch(`${baseUrl}/contents/generations/tasks/${taskId}`, {
|
|
5397
|
-
method: "DELETE",
|
|
5398
|
-
headers: { Authorization: `Bearer ${apiKey}` },
|
|
5399
|
-
signal: ctl.signal
|
|
5400
|
-
});
|
|
5401
|
-
} finally {
|
|
5402
|
-
clearTimeout(timer);
|
|
5403
|
-
}
|
|
5404
|
-
}
|
|
5405
|
-
};
|
|
5406
|
-
var PROVIDERS = [byteplusProvider];
|
|
5407
|
-
function getEnv2(env, key) {
|
|
5408
|
-
const v = env?.[key] ?? process.env[key];
|
|
5409
|
-
return v && v.length > 0 ? v : void 0;
|
|
5410
|
-
}
|
|
5411
|
-
function resolveVideoProvider(env) {
|
|
5412
|
-
for (const p of PROVIDERS) {
|
|
5413
|
-
const hasAllKeys = p.envKeys.every((key) => getEnv2(env, key) !== void 0);
|
|
5414
|
-
if (hasAllKeys)
|
|
5415
|
-
return p;
|
|
5416
|
-
}
|
|
5417
|
-
return null;
|
|
5418
|
-
}
|
|
5419
|
-
function sleepAbortable(ms, signal) {
|
|
5420
|
-
return new Promise((resolve4, reject) => {
|
|
5421
|
-
if (signal?.aborted)
|
|
5422
|
-
return reject(new Error("aborted"));
|
|
5423
|
-
const timer = setTimeout(() => {
|
|
5424
|
-
signal?.removeEventListener("abort", onAbort);
|
|
5425
|
-
resolve4();
|
|
5426
|
-
}, ms);
|
|
5427
|
-
const onAbort = () => {
|
|
5428
|
-
clearTimeout(timer);
|
|
5429
|
-
reject(new Error("aborted"));
|
|
5430
|
-
};
|
|
5431
|
-
signal?.addEventListener("abort", onAbort, { once: true });
|
|
5432
|
-
});
|
|
5433
|
-
}
|
|
5434
|
-
function buildVideoGenerateTool(env) {
|
|
5435
|
-
const provider = resolveVideoProvider(env);
|
|
5436
|
-
if (!provider)
|
|
5437
|
-
return null;
|
|
5438
|
-
return {
|
|
5439
|
-
name: "generate_video",
|
|
5440
|
-
label: `Video Generator (${provider.label})`,
|
|
5441
|
-
description: "Generate a video from a text prompt. Returns the video URL.",
|
|
5442
|
-
promptSnippet: "generate_video(prompt)",
|
|
5443
|
-
promptGuidelines: [
|
|
5444
|
-
"Use this when the user wants to generate, create, or render a video.",
|
|
5445
|
-
"Provide a highly descriptive prompt."
|
|
5446
|
-
],
|
|
5447
|
-
parameters: {
|
|
5448
|
-
type: "object",
|
|
5449
|
-
properties: {
|
|
5450
|
-
prompt: {
|
|
5451
|
-
type: "string",
|
|
5452
|
-
description: "Text description of the video to generate."
|
|
5453
|
-
}
|
|
5454
|
-
},
|
|
5455
|
-
required: ["prompt"]
|
|
5456
|
-
},
|
|
5457
|
-
async execute(_toolCallId, params, signal, onUpdate) {
|
|
5458
|
-
const { prompt } = params;
|
|
5459
|
-
const resolvedEnv = env ?? {};
|
|
5460
|
-
const report = (msg) => onUpdate?.({
|
|
5461
|
-
content: [{ type: "text", text: msg }],
|
|
5462
|
-
details: {}
|
|
5463
|
-
});
|
|
5464
|
-
report(`[${provider.label}] Submitting video generation task...`);
|
|
5465
|
-
const { taskId } = await provider.create({
|
|
5466
|
-
prompt,
|
|
5467
|
-
env: resolvedEnv,
|
|
5468
|
-
signal
|
|
5469
|
-
});
|
|
5470
|
-
report(`[${provider.label}] Task ${taskId} submitted. Polling for completion...`);
|
|
5471
|
-
const intervalMs = provider.pollIntervalMs ?? 1e4;
|
|
5472
|
-
let videoUrl;
|
|
5473
|
-
try {
|
|
5474
|
-
while (true) {
|
|
5475
|
-
await sleepAbortable(intervalMs, signal);
|
|
5476
|
-
const state = await provider.poll({
|
|
5477
|
-
taskId,
|
|
5478
|
-
env: resolvedEnv,
|
|
5479
|
-
signal
|
|
5480
|
-
});
|
|
5481
|
-
if (state.status === "succeeded") {
|
|
5482
|
-
videoUrl = state.videoUrl ?? "URL not found in response payload";
|
|
5483
|
-
break;
|
|
5484
|
-
}
|
|
5485
|
-
if (state.status === "failed" || state.status === "cancelled") {
|
|
5486
|
-
throw new Error(`Video task ended with status: ${state.status}${state.error ? `. ${state.error}` : ""}`);
|
|
5487
|
-
}
|
|
5488
|
-
const progress = state.progress != null ? ` (${state.progress}%)` : "";
|
|
5489
|
-
report(`[${provider.label}] Task status: ${state.status}${progress}`);
|
|
5490
|
-
}
|
|
5491
|
-
} catch (err) {
|
|
5492
|
-
if (signal?.aborted) {
|
|
5493
|
-
await provider.cancel({ taskId, env: resolvedEnv }).catch(() => void 0);
|
|
5494
|
-
}
|
|
5495
|
-
throw err;
|
|
5496
|
-
}
|
|
5497
|
-
const details = { usage: { raw: {} } };
|
|
5498
|
-
return {
|
|
5499
|
-
content: [
|
|
5500
|
-
{
|
|
5501
|
-
type: "text",
|
|
5502
|
-
text: `Video generated successfully via ${provider.label}!
|
|
5503
|
-
URL: ${videoUrl}
|
|
5504
|
-
(Task ID: ${taskId})`
|
|
5505
|
-
}
|
|
5506
|
-
],
|
|
5507
|
-
details
|
|
5508
|
-
};
|
|
5509
|
-
}
|
|
5510
|
-
};
|
|
5511
|
-
}
|
|
5512
|
-
|
|
5513
5316
|
// ../../packages/runner-pi/dist/pi-runner.js
|
|
5514
5317
|
var LOG_PREFIX3 = "[bunny-agent:pi]";
|
|
5515
5318
|
function applyAllowedTools(tools, allowedTools) {
|
|
@@ -5676,10 +5479,6 @@ function createPiRunner(options = {}) {
|
|
|
5676
5479
|
const apiKey = await modelRegistry.authStorage.getApiKey(provider) ?? "";
|
|
5677
5480
|
customTools.push(buildImageGenerateTool(cwd, imageModelName, model.baseUrl, apiKey), buildImageEditTool(cwd, imageModelName, model.baseUrl, apiKey));
|
|
5678
5481
|
}
|
|
5679
|
-
const videoTool = buildVideoGenerateTool(options.env ?? {});
|
|
5680
|
-
if (videoTool) {
|
|
5681
|
-
customTools.push(videoTool);
|
|
5682
|
-
}
|
|
5683
5482
|
const toolRefDefinitions = options.toolRefs && options.toolRefs.length > 0 ? buildToolDefinitionsFromRefs(options.toolRefs) : [];
|
|
5684
5483
|
const { session } = await createAgentSession({
|
|
5685
5484
|
cwd,
|
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.37-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": {
|
|
@@ -53,11 +53,11 @@
|
|
|
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",
|
|
58
|
-
"@bunny-agent/runner-
|
|
57
|
+
"@bunny-agent/runner-claude": "0.6.2",
|
|
59
58
|
"@bunny-agent/runner-gemini": "0.6.2",
|
|
60
59
|
"@bunny-agent/runner-opencode": "0.6.2",
|
|
60
|
+
"@bunny-agent/runner-codex": "0.6.2",
|
|
61
61
|
"@bunny-agent/runner-pi": "0.6.4-beta.0"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|