@bunny-agent/runner-cli 0.9.36 → 0.9.37-beta.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/bundle.mjs +0 -201
  2. package/package.json +4 -4
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.36",
3
+ "version": "0.9.37-beta.2",
4
4
  "description": "BunnyAgent Runner CLI - Like gemini-cli or claude-code, runs in your local terminal with AI SDK UI streaming",
5
5
  "type": "module",
6
6
  "bin": {
@@ -53,12 +53,12 @@
53
53
  "esbuild": "^0.27.2",
54
54
  "typescript": "^5.3.0",
55
55
  "vitest": "^1.6.1",
56
- "@bunny-agent/runner-claude": "0.6.2",
57
56
  "@bunny-agent/runner-harness": "0.1.1-beta.0",
58
57
  "@bunny-agent/runner-codex": "0.6.2",
59
- "@bunny-agent/runner-gemini": "0.6.2",
58
+ "@bunny-agent/runner-claude": "0.6.2",
60
59
  "@bunny-agent/runner-opencode": "0.6.2",
61
- "@bunny-agent/runner-pi": "0.6.4-beta.0"
60
+ "@bunny-agent/runner-pi": "0.6.4-beta.0",
61
+ "@bunny-agent/runner-gemini": "0.6.2"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "tsc && pnpm bundle",