@kolbo/mcp 1.98.0 → 1.99.0

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/README.md CHANGED
@@ -364,3 +364,5 @@ Both are optional — the local install logs in via the browser on first use.
364
364
  ### URL downloads
365
365
 
366
366
  `download_media_from_url` starts a server download for a public media page URL. Use `get_download_status` with the returned `job_id` (not `get_generation_status`) and wait for `completed` before using `resultUrl`. `cancel_download` cancels an active job. This produces a cloud file and saves it to the account library when library sync succeeds; it does not write to the caller's computer. Video returns a verified MP4, audio returns MP3; maximum 500 MB. Existing `upload_media` still handles local/direct-file uploads. SDK routes reuse the authenticated utility pipeline at `POST /v1/downloads`, `GET /v1/downloads/:jobId`, and `DELETE /v1/downloads/:jobId`.
367
+
368
+ Video-edit widgets keep source-video and mask-video previews, image references, and audio references through generation and completion. Click a video thumbnail to inspect the source. Local edit inputs preview through their uploaded CDN URLs.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.98.0",
3
+ "version": "1.99.0",
4
4
  "description": "Kolbo AI MCP Server - Generate images, videos, music, speech, and sound effects from Claude Code",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -1355,7 +1355,7 @@ function openPromptRow(placeholder, onSend) {
1355
1355
  var PRE_IMAGE_KEYS = ['source_images', 'reference_images', 'image_url', 'mask_image_url',
1356
1356
  'additional_images', 'first_frame', 'last_frame', 'seed_reference_image_url',
1357
1357
  'elements', 'files', 'keyframes', 'source'];
1358
- var PRE_VIDEO_KEYS = ['source_video', 'video_url', 'reference_videos'];
1358
+ var PRE_VIDEO_KEYS = ['source_video', 'video_url', 'mask_video_url', 'reference_videos'];
1359
1359
  var PRE_AUDIO_KEYS = ['audio', 'audio_url', 'reference_audio_urls', 'seed_reference_audio_urls'];
1360
1360
 
1361
1361
  // The card mounts the moment the tool is CALLED, so the only thing it knows is
@@ -10,7 +10,7 @@ const { resolveToBuffer, pollOrTimedOut, creditFields, projectIdField, sessionId
10
10
  const { ownedUrl } = require('./owned-url');
11
11
  const { UI, uiResult, canonicalModelId, assertModelSupportsType, modelInfo, voiceInfo, resolveCatalogAspectRatio } = require('../apps');
12
12
  const { modelTypeForEditOperation, assertExecutableEditModel } = require('./editModelCatalog');
13
- const { withLocalRehost } = require('./local-rehost');
13
+ const { withLocalRehost, rehostLocalPaths } = require('./local-rehost');
14
14
  const { validateVideoPrompt } = require('./video-prompt');
15
15
 
16
16
  // ─── Cinematic Dimensions schema (shared by generate_image + generate_image_edit) ───
@@ -2505,7 +2505,9 @@ function registerGenerateTools(server, client, options = {}) {
2505
2505
  if (operation === 'lipsync' && !audio_url && !text_prompt) throw new Error('audio_url or text_prompt is required for lipsync');
2506
2506
  if (operation === 'extend' && !duration) throw new Error('duration is required for extend');
2507
2507
 
2508
- const gen = await client.post('/v1/edit/video', {
2508
+ // Keep the resolved inputs so the widget can load local-file references
2509
+ // from the same CDN URLs submitted to the API.
2510
+ const editBody = await rehostLocalPaths(client, {
2509
2511
  video_url, operation, model, aspect_ratio, scale, prompt, enhancement_model,
2510
2512
  image_url, audio_url, duration, mode,
2511
2513
  target_fps, resolution,
@@ -2517,14 +2519,20 @@ function registerGenerateTools(server, client, options = {}) {
2517
2519
  mask_video_url, object_prompt, video_strength,
2518
2520
  start_time,
2519
2521
  project_id, session_id
2520
- });
2522
+ }, { allowLocalFiles: !options.remote });
2523
+ const gen = await client.post('/v1/edit/video', editBody);
2524
+ const editRefs = {
2525
+ reference_images: [editBody.image_url].filter(Boolean),
2526
+ reference_videos: [editBody.video_url, editBody.mask_video_url].filter(Boolean),
2527
+ reference_audio: [editBody.audio_url].filter(Boolean),
2528
+ };
2521
2529
 
2522
2530
  if (operation === 'draft_quote') return { content: [{ type: 'text', text: JSON.stringify(gen, null, 2) }] };
2523
2531
  if (returnsImmediately()) return submittedResult({
2524
2532
  tool: 'edit_video', kind: 'video', gen, client, model,
2525
2533
  prompt: prompt || operation,
2526
2534
  settings: { mode: operation, duration, aspect_ratio, resolution },
2527
- reference_images: image_url ? [image_url] : []
2535
+ ...editRefs
2528
2536
  });
2529
2537
 
2530
2538
  const poll = await pollOrTimedOut(client, gen.generation_id, {
@@ -2538,7 +2546,7 @@ function registerGenerateTools(server, client, options = {}) {
2538
2546
  tool: 'edit_video', kind: 'video', gen, client, model,
2539
2547
  prompt: prompt || operation,
2540
2548
  settings: { mode: operation, duration, aspect_ratio, resolution },
2541
- reference_images: image_url ? [image_url] : [],
2549
+ ...editRefs,
2542
2550
  urls: result.result?.urls || [],
2543
2551
  duration: result.result?.duration || null,
2544
2552
  credits_used: creditFields(result).credits_used,