@kolbo/mcp 1.87.2 → 1.87.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.87.2",
3
+ "version": "1.87.4",
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": {
@@ -1,6 +1,6 @@
1
1
  # AUTO-GENERATED — do not edit
2
2
 
3
- This tree is mirrored from kolbo-code@b38e38c, the single source of truth.
3
+ This tree is mirrored from kolbo-code@f666a9c, the single source of truth.
4
4
  Canonical source: packages/opencode/skills/kolbo/
5
5
  Distribution: .github/workflows/sync-skill-to-plugin.yml
6
6
 
@@ -15,7 +15,7 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
15
15
 
16
16
  - **NO MUSIC BY DEFAULT (HARD):** Unless the user explicitly asks for music, every final Seedance prompt—including every Elements/reference-driven prompt—must explicitly say `No music. No musical score.` Keep requested dialogue, synchronized production sound, ambience, and SFX; "no music" does not mean "no audio." If the user explicitly requests music, describe that music instead and omit the no-music lock. Never invent background music from cinematic tone alone.
17
17
  - **NO FAMOUS NAMES OR IP IN PROMPTS (HARD):** Never put celebrity/public-figure names, real directors or artists, copyrighted character/franchise/IP names, famous campaign names or slogans, or famous studio/company names into a final Seedance or Elements prompt. Translate user-supplied references into concrete visual traits—medium, shape language, palette, lighting, texture, camera behavior, pacing, and mood—without repeating the famous name. Preserve exact user-owned Visual DNA and asset tags.
18
- - **Visual DNA names are immutable anchors:** when `visual_dna_ids` is passed, every DNA MUST appear in the prompt as the exact literal `@DNA_name` (CAST + every shot it is in). Never "Zohar's", "the left man", "the man on the LEFT", a nickname, or a Visual DNA anchors paragraph without `@tags`.
18
+ - **Visual DNA names are immutable anchors:** when `visual_dna_ids` is passed, every DNA MUST appear in the prompt as the exact literal `@DNA_name` (CAST + every shot it is in). Never "Zohar's", "the left man", "the man on the LEFT", a nickname, or a Visual DNA anchors paragraph without `@tags`. English-only control-language and dialogue rules NEVER apply to asset identifiers: a stored Hebrew name such as `אביב` must remain `@אביב` literally in CAST and every applicable shot; never strip, translate, transliterate, or ASCII-normalize it.
19
19
  - **Rewrites never thin out or rename anchors.** "`@X anchors Odysseus`" is NOT a reference line, and `Odysseus` must never replace `@X` later. Every referenced asset keeps its exact literal tag plus a full role line on every rewrite. Re-use the exact DNA tag in every shot it participates in. A compile that dropped `@gal_suit` / `@yonatan` / `#Board` is a failed turn.
20
20
  - **DURATION + SHOT STRUCTURE (HARD — same as help widget):** every text-to-video / Elements prompt MUST open AND close with total duration, shot count, and aspect. Omit only for video-edit tasks (source duration is locked). Required first lines:
21
21
  1. `N connected cinematic shots, Xs total, AR, Multishot ON`
@@ -11,7 +11,7 @@ Load this file when the user wants a **Seedance 2.5** video (they said "2.5" / "
11
11
 
12
12
  **Audio:** Seedance 2.5 emits real synced audio. `list_models` shows `sound_generation_type: none` only because there is no in-app toggle (`sound_baked_in: true`) — it does NOT mean the model is silent, and it is never a reason to reach for TTS. Quoted dialogue is PERFORMED (synced voices, lip movement, room tone) alongside the SFX named in AUDIO, so scene dialogue never goes through `generate_speech` or `generate_lipsync`; write the lines in quotes inside their shot beats.
13
13
 
14
- **Dialogue language: English.** Other languages are not reliably performed, and Hebrew does not work — it returns accented gibberish or English-shaped mouth movement. Never offer a user "Hebrew dialogue directly". See `models/seedance.md` for the three honest alternatives.
14
+ **Dialogue language: English.** Other languages are not reliably performed, and Hebrew does not work — it returns accented gibberish or English-shaped mouth movement. Never offer a user "Hebrew dialogue directly". This restriction applies to rendered dialogue/prose only, never to binding identifiers: preserve an exact stored Hebrew Visual DNA or moodboard tag such as `@אביב` / `#ישראל` literally. See `models/seedance.md` for the three honest alternatives.
15
15
 
16
16
  **Draft at 480p.** Resolution is a credit MULTIPLIER, not a flat rate. Relative to 720p: 480p ×0.44, 1080p ×2.25. A 30s pass costs ~540cr at 480p against ~1230cr at 720p and ~2770cr at 1080p. Block the film at 480p, get the user's sign-off on staging, performance and timing, then re-run only the approved cut at delivery resolution.
17
17
 
@@ -808,10 +808,15 @@ function renderResult(sc) {
808
808
  // voice that actually ran, so the finished card must not keep the guess.
809
809
  renderChips(sc);
810
810
  setPhaseChip('', false);
811
- if (sc.kind === 'status' && Array.isArray(sc.items)) return renderStatusGrid(sc);
812
811
  if (sc.batch && sc.scenes && sc.scenes.length) return renderBatchGrid(sc);
813
812
  if (sc.kind === 'scenes' && sc.scenes && sc.scenes.length) return renderScenes(sc);
814
813
  var urls = preferKolbo(sc.urls || []);
814
+ // Key the per-item grid on items[], not on kind === 'status': a host bridge
815
+ // (Kolbo Code's shaped()) rewrites kind from the TOOL name before the payload
816
+ // reaches this iframe, so a finished prompts[] batch arrived as kind:'image'
817
+ // with eight completed items and no top-level urls — and painted
818
+ // "No output received / Failed" over generations that had completed and billed.
819
+ if (Array.isArray(sc.items) && sc.items.length && (sc.kind === 'status' || !urls.length)) return renderStatusGrid(sc);
815
820
  var kind = displayKind(Object.assign({}, sc, { urls: urls }));
816
821
  if (!urls.length) return renderError('No output received');
817
822
  if (kind === 'image') renderImages(sc, urls);
@@ -99,9 +99,12 @@ async function pollBatch(client, batch, { interval, timeout }, toolName) {
99
99
  generations,
100
100
  failed_submissions: batch.failed.length ? batch.failed : undefined
101
101
  }, null, 2);
102
+ // Name the model that actually ran — every id in one batch ran the same one.
103
+ const modelsRan = [...new Set(polls.filter((p) => !p.timedOut).map((p) => p.result.result && p.result.result.model).filter(Boolean))];
102
104
  return uiCompleted({
103
105
  tool: toolName, kind: 'status', client,
104
- model: 'Generations', gen: { generation_id: batch.ids[0], session_id: batch.ok[0].gen.session_id },
106
+ model: modelsRan.length === 1 ? modelsRan[0] : 'Generations',
107
+ gen: { generation_id: batch.ids[0], session_id: batch.ok[0].gen.session_id },
105
108
  settings: {},
106
109
  items: generations.map(g => ({
107
110
  id: g.generation_id,