@kolbo/mcp 1.81.1 → 1.81.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kolbo/mcp",
3
- "version": "1.81.1",
3
+ "version": "1.81.2",
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@00aade6, the single source of truth.
3
+ This tree is mirrored from kolbo-code@6836af5, 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
 
package/skill/SKILL.md CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- version: 0.9.3
2
+ version: 0.9.6
3
3
  name: kolbo
4
4
  description: |
5
5
  Generate, edit, analyze, and direct creative media through Kolbo AI: images,
@@ -20,7 +20,29 @@ allowed-tools: Bash, Read, Write, Edit
20
20
 
21
21
  You have direct access to the Kolbo AI creative platform via MCP tools (auto-configured by `kolbo auth login`). Use them to generate and deliver real content — do NOT just describe what you would create.
22
22
 
23
- > 🚫 **Don't dump generated URLs as bare text or markdown links in chat** — the UI already renders artifacts as a gallery tile + canvas. Refer by description ("the rainy scene"), store URLs in `.kolbo/production.md`. INLINE `![](url)` images ARE allowed for catalog-style replies (per-item thumbs in numbered lists).
23
+ > 🚫 **Don't dump generated URLs as bare text or markdown links in chat** — the UI already shows results in **Library** (right panel) and on the generation card. Refer by description ("the rainy scene"), store URLs in `.kolbo/production.md`. INLINE `![](url)` images ARE allowed for catalog-style replies (per-item thumbs in numbered lists).
24
+
25
+ ## ⚠️ Source of truth for generations (HARD RULE — read this)
26
+
27
+ Agents keep getting confused because three UIs show the same job. Use this map — never invent a fourth:
28
+
29
+ | Surface | What it is | Trust it for |
30
+ |---|---|---|
31
+ | **Library** (right panel — "This session" / "All media") | User-facing gallery of **completed** media | "Is the user's output there?" Point humans here. Finished clips/images land automatically — do **not** `list_media` / `get_media` just to verify a `generate_*` you just ran. |
32
+ | **Chat generation card** | Progress chrome while a job is in flight | Status badge only (`Generating` / done). A **black / empty preview while Generating is NORMAL** — the iframe has nothing to paint yet. It is **not** failure, not "lost", not a reason to re-fire. |
33
+ | **`get_generation_status`** (MCP) | Agent API for job state | Whether the server job is `completed` / `failed` / still running, and the final `urls`. This is your SoT for in-flight work — **not** the card pixels. |
34
+ | **`.kolbo/production.md`** | Your private log across turns | Ids + URLs after success. Compaction-safe memory — not the user gallery. |
35
+
36
+ **Do NOT:**
37
+ - Treat an empty/black chat card as "generation failed" or "nothing produced".
38
+ - Re-call `generate_*` because Library still shows a K/logo spinner tile while the job is running — that tile **is** the in-progress placeholder for the same job.
39
+ - Call `list_media` / `get_media` / `list_session_generations` to "check if it worked" after a generate you already submitted — that burns credits/context and can pollute the session.
40
+ - Tell the user to look at chat history for finals — tell them **Library → This session**.
41
+
42
+ **Do:**
43
+ - After `submitted` / `_timed_out`: end the turn, or one `get_generation_status(..., wait=true)`.
44
+ - When done: say the result is in Library; log URLs to `.kolbo/production.md`.
45
+ - If the user asks "where is it?" → Library (This session). If they ask "is it done?" and you don't have urls yet → `get_generation_status` once.
24
46
 
25
47
  This file is the **always-loaded core**: tool inventory + universal hard rules + routing index. For any model-specific prompt rules, Visual DNA workflow, production log format, marketing workflow, cost validation, etc., **Read the matching `references/` file from the index below**. Don't try to remember the rules — load the file when you need them.
26
48
 
@@ -218,7 +240,7 @@ Do **not** call `generate_*` / `generate_elements` / `generate_image_edit` until
218
240
 
219
241
  `generate_elements`, Seedance 2 / 2.5, WAN, MiniMax H3, Gemini, and any Visual DNA video share **one** compile shape — the Locked Intro in `references/models/seedance.md`. Load `elements-prompting` first (craft, `@Image N` mapping, eight elements), then compile:
220
242
 
221
- `Total: Xs / N shots / AR` → `[GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]` → `[CAST – IDENTICAL IN EVERY SHOT]` (each person is `@DNAName`) → `[LOCATION]` → `SHOT N — 0:00–0:02 — …`
243
+ `N connected cinematic shots, Xs total, AR, Multishot ON` → `Total: Xs / N shots / AR` → `[GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]` → `[CAST – IDENTICAL IN EVERY SHOT]` (each person is `@DNAName`) → `[LOCATION]` → LOCATION MAP / CONTINUITY / PHYSICS → `SHOT N — 0:00–0:02 — …` (ranges sum to Xs) → closing `Total: Xs / N shots / AR`. Pass MCP `duration: X` matching that Total. Omitting Total / Multishot is a failed compile — same contract as the Kolbo help widget.
222
244
 
223
245
  Write the beats at FULL DEPTH. The cap is 15,000 characters on Seedance 2.5 (10,000 on 2.0) — a 30s / 8+ shot compile should land around 4k–9k, and every beat carries its own camera move, a performance task for the speaker AND the listeners, prop/hand state, and the sound in that beat. A one-line shot beat is under-written; the structure alone is not the craft. Read `references/models/seedance25.md` before compiling.
224
246
 
@@ -268,9 +290,13 @@ A user-named tool — in any language — overrides every other rule. Recognized
268
290
  - Auto-select → **only when no model was named on this task**. Then pick from "Auto-selectable" (models with a `summary`). Cheapest fit. Prefer `[RECOMMENDED]` when cost is similar.
269
291
  - Never auto-select from "Named-only" section.
270
292
  5. **Validate inputs** against model caps — see `references/workflows/cost-and-validation.md`.
271
- 6. **How calls work**: each tool blocks until generation is fully complete. Images: seconds. Video: minutes. Multiple tool calls in one response run concurrently. On hosts with live widgets the tool instead returns `submitted` instantly — the card updates on its own; you only need `get_generation_status` when a follow-up step needs the output URLs.
272
- 7. **Checking status — NEVER poll in a loop**: `get_generation_status` takes `wait=true` (blocks server-side until done, ~3 min) and `generation_ids` (check MANY generations in ONE call returns `all_done` + which are still running). One `wait=true` call replaces any polling loop. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
273
- 8. **Share the URL** after success. Never fabricate URLs.
293
+ 6. **How calls work**: each tool blocks until generation is fully complete. Images: seconds. Video: minutes. Multiple tool calls in one response run concurrently. On hosts with live widgets the tool instead returns `submitted` (or `_timed_out`) instantly — the card updates on its own.
294
+ 7. **🛑 After `submitted` / `_timed_out` END THE TURN (credit guard)**: Do **not** keep thinking, writing skills, editing files, or planning "next steps" while a generation is still running. That burns the user's coding/chat credits for nothing. Either:
295
+ - **Stop immediately** after telling the user it's generating in Library / the card above (preferred when you do not need the output URLs yet), OR
296
+ - If the **next** required step needs those URLs, call `get_generation_status` **once** with `wait=true` (and `generation_ids` for a batch) as the **only** follow-up — no parallel Write/Edit/Think while it waits.
297
+ - A black preview on the chat card is expected until URLs exist — not a signal to retry.
298
+ 8. **Checking status — NEVER poll in a loop**: `get_generation_status` takes `wait=true` (blocks server-side until done, ~3 min) and `generation_ids` (check MANY generations in ONE call — returns `all_done` + which are still running). One `wait=true` call replaces any polling loop. If it comes back with some still processing, call it ONCE more with `wait=true` and the remaining ids.
299
+ 9. **Share the URL** after success. Never fabricate URLs.
274
300
 
275
301
  Model types for `list_models`: `text_to_img`, `image_editing`, `text_to_video`, `img_to_video`, `draw_to_video`, `video_to_video`, `elements`, `firstlastgenerations`, `lipsync-image`, `lipsync-video`, `music_gen`, `text_to_speech`, `text_to_sound`, `stt`, `text`, `3d_text_to_model`, `3d_image_to_model`, `3d_multi_image_to_model`, `3d_world`.
276
302
 
@@ -318,7 +344,8 @@ Full tables + formulas in `references/workflows/cost-and-validation.md`. Quick r
318
344
  ## Rate Limiting & Batch Generation
319
345
 
320
346
  - `generate_image`: 30/min. All other generation tools: 10/min per type. 300/min global. `upload_media`: 300/min, no credit cost.
321
- - **⚠️ NEVER re-fire a generation you already called.** Aborted / timed-out calls still process server-side. Run `get_generation_status` (with `wait=true`) before retrying.
347
+ - **⚠️ NEVER re-fire a generation you already called.** Aborted / timed-out / `submitted` calls still process server-side. Finish with `get_generation_status` (`wait=true`) never a second `generate_*`. A black chat card or Library K-tile is not a missing job.
348
+ - **⚠️ NEVER keep working while a generation is in flight.** After `submitted` / `_timed_out`, end the turn or block on one `wait=true` status call. Writing production.md / skills / "merge decisions" while the card spins wastes coding credits.
322
349
  - **Tracking a batch**: check ALL in-flight ids in ONE `get_generation_status` call with `generation_ids` + `wait=true`. Read `all_done` / `still_processing` from the response — do not check ids one by one, and never re-call without `wait`.
323
350
  - **Batch ≤10 items**: output ALL tool calls in one response — they run concurrently.
324
351
  - **Bulk >10 items**: real-world ceilings — `generate_image` 8–10 in-flight, image-edit 5–8, video tools 3–5, `generate_video_from_video` 3, music/speech/sound 5–8. Fire one batch → wait → fire next. Persist every `generation_id` in `.kolbo/production.md`.
@@ -387,9 +414,9 @@ A generation can fail three ways. Treat ALL as failure:
387
414
  Chat renders markdown natively. `![alt](url)` = inline image. `[label](url)` = labeled link with preview.
388
415
 
389
416
  - **Catalog-style replies** (numbered lists of characters / scenes / products): embed `![alt](url)` so each item shows inline.
390
- - **Conversational replies** ("4 shots ready"): keep prose short; canvas chip already shows gallery.
417
+ - **Conversational replies** ("4 shots ready"): keep prose short; Library already shows the gallery.
391
418
 
392
- Avoid bare URL dumps and HTML `<table>` grids — canvas already provides a gallery.
419
+ Avoid bare URL dumps and HTML `<table>` grids — Library already provides a gallery.
393
420
 
394
421
  **After `generate_creative_director` completes** — share results as individual URLs, one per scene. Do NOT create an HTML grid artifact.
395
422
 
package/skill/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.3
1
+ 0.9.6
@@ -15,8 +15,15 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
15
15
 
16
16
  - **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`.
17
17
  - **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.
18
- - **First line ALWAYS declares shot structure**: total duration, shot count, aspect ratio. Example: `Total: 15s / 6 shots / 16:9`. Put it at the BOTTOM of the prompt too. For connected narrative sequences the proven phrasing is `N connected cinematic shots, 15 seconds total, 16:9, Multishot ON` — use it and keep `Multishot ON` for any multi-shot story.
19
- - **Then the Locked Intro** — `[GLOBAL LOOK]` / `[CAST]` / `[LOCATION]` before any shot. A one-liner `same character throughout` is not a character lock.
18
+ - **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:
19
+ 1. `N connected cinematic shots, Xs total, AR, Multishot ON`
20
+ 2. `Total: Xs / N shots / AR`
21
+ Then Locked Intro, then `SHOT N — 0:00–0:02 — Size / camera` beats whose ranges **sum exactly to Xs**. Last line repeats `Total: Xs / N shots / AR`.
22
+ - Example (15s / 6 shots): `6 connected cinematic shots, 15 seconds total, 16:9, Multishot ON` + `Total: 15s / 6 shots / 16:9`
23
+ - UGC / phone vertical: `N connected phone shots, Xs total, 9:16, Multishot ON` (never the word "cinematic").
24
+ - A prompt with only shot body and no Total / Multishot header is a **failed turn** — rewrite before calling `generate_*`.
25
+ - **MCP `duration` must match the Total line.** Pass `duration: X` (whole seconds) on `generate_video` / `generate_elements` / `generate_video_from_image` equal to the `Xs` in `Total: Xs / …`. Mismatch = wrong-length clip.
26
+ - **Then the Locked Intro** — `[GLOBAL LOOK]` / `[CAST]` / `[LOCATION]` (+ LOCATION MAP / CONTINUITY / PHYSICS for multi-shot) — before any shot. A one-liner `same character throughout` is not a character lock.
20
27
  - **Order inside each shot**: Subject → Action → Camera → Constraints → (Audio/SFX if relevant). Do NOT restack GLOBAL LOOK style inside the shot.
21
28
  - **Prompt length**: simple single-idea pieces ~120–280 words. Locked-intro cinematic typically 400–900 words. Shorter than ~120 words = random output. The 8000-char cap below always wins.
22
29
  - **Shot count is user-directed.** If the user asks for N shots, deliver exactly N in one prompt unless they ask to split.
@@ -32,11 +39,11 @@ Load this file when the user wants a **Seedance 2 / Seedance 2.0** (ByteDance) v
32
39
 
33
40
  ## Locked Intro (DEFAULT for any multi-shot cinematic — including Elements)
34
41
 
35
- After the Total line, every multi-shot prompt — and any piece with recurring people or a recurring place — opens with three locked blocks. Skip only for: true single-shot POV/orb, 3×3 grid-panel mode, or video-edit tasks.
42
+ After the Total lines, every multi-shot prompt — and any piece with recurring people or a recurring place — opens with the locked blocks. Skip only for: true single-shot POV/orb, 3×3 grid-panel mode, or video-edit tasks.
36
43
 
37
44
  ```
38
- Total: Xs / N shots / AR
39
45
  N connected cinematic shots, Xs total, AR, Multishot ON
46
+ Total: Xs / N shots / AR
40
47
 
41
48
  [GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]
42
49
  <body>, <lens family>, <film stock>, <aspect> spherical, <stop>. <DoF, grain, grade as law>. <movement grammar>. <performance + audio law>.
@@ -48,14 +55,37 @@ PROP: recurring object.
48
55
  [LOCATION]
49
56
  Place in materials + light + color field. Blocking. Background LIFE.
50
57
 
58
+ [LOCATION MAP]
59
+ Named seats / sides in SCREEN language (screen-left armchair, center couch, door camera-left).
60
+
61
+ [CONTINUITY – LOCKED ACROSS EVERY CUT]
62
+ Axis / camera side of the line. Screen direction. Eyelines. Floor props stay. Which hand holds what. No teleport.
63
+
64
+ [PHYSICS]
65
+ Weight into furniture, props resting, cloth/hair settle, no float.
66
+
51
67
  SHOT 1 — 0:00–0:02 — Medium / camera position
52
68
  (physical verbs, timed acting, quoted dialogue)
53
-
69
+ SHOT 2 — 0:02–0:05 —
70
+ … (ranges MUST sum to Xs)
54
71
  Total: Xs / N shots / AR
72
+ POSITIVE LOCKS: <2–4 sentences restating positions / mouth / optical signature>
55
73
  ```
56
74
 
57
75
  When a Visual DNA exists, its exact `@DNA_name` IS the cast name — never place a nickname before it or substitute one later. For plain image refs use `@ImageN`.
58
76
 
77
+ ## OUTPUT CONTRACT (WINS — same as help widget)
78
+
79
+ ONE fenced prompt. Required shape or the turn failed:
80
+ 1. `N connected cinematic shots, Xs total, AR, Multishot ON`
81
+ 2. `Total: Xs / N shots / AR`
82
+ 3. GLOBAL LOOK → CAST → LOCATION → LOCATION MAP → CONTINUITY → PHYSICS (dense, before any shot)
83
+ 4. `SHOT 1 — 0:00–0:02 — …` through SHOT N; timecodes sum to Xs; continuity bridge after SHOT 1
84
+ 5. Closing `Total: Xs / N shots / AR` + short POSITIVE LOCKS
85
+ 6. Tool call `duration` = Xs
86
+
87
+ FORBIDDEN: omitting Total / Multishot; "same character throughout" as the only lock; one fence per shot; `[0s]`/`[3s]` stubs; splitting a ≤15s story into multiple generations unless the user asks.
88
+
59
89
  ## The 5 Formats
60
90
 
61
91
  ### 1. Transformations (highest-performing format)
@@ -23,21 +23,45 @@ Load this file when the user wants a **Seedance 2.5** video (they said "2.5" / "
23
23
  - **Up to 50 reference medias / Visual DNA mentions** (`@Name`, `@ImageN`, `#Moodboard`). Every referenced asset must be tagged in the prompt text. A rewrite that drops or renames a tag ( `@doron_fauda_1` → `DORON` / `the hero` ) is a failed turn — put the exact tag back.
24
24
  - **Multimodal refs:** images + video clips + audio can all anchor one generation.
25
25
 
26
- ## Locked Intro (DEFAULT — same shape as Seedance 2)
26
+ ## Universal Rules (HARD — same as help widget OUTPUT CONTRACT)
27
+
28
+ - **First lines ALWAYS declare shot structure** (text-to-video / Elements / reference gen — NOT video-edit):
29
+ 1. `N connected cinematic shots, Xs total, AR, Multishot ON`
30
+ 2. `Total: Xs / N shots / AR`
31
+ Example: `12 connected cinematic shots, 30 seconds total, 16:9, Multishot ON` + `Total: 30s / 12 shots / 16:9`
32
+ UGC phone: `N connected phone shots, Xs total, 9:16, Multishot ON` — never the word "cinematic"; restate `9:16 vertical phone frame` in every shot.
33
+ - **Last line repeats** `Total: Xs / N shots / AR` + short POSITIVE LOCKS.
34
+ - **Shot timecodes MUST sum to Xs.** `SHOT 1 — 0:00–0:02` … through SHOT N ending at Xs. Never `[0s]` / `[3s]` stubs.
35
+ - **MCP `duration` = Xs** on the generate call. Mismatch is a failed turn.
36
+ - Duration range **4–30s**; shot count **≤30** in one generation. Do not split a ≤30s story into multiple 10s clips unless the user asks.
37
+ - Omit Total / Multishot / shot-count headers only for **video editing** (source duration locked) — use Edit Goal blocks instead.
27
38
 
28
- After the Total line, every multi-shot cinematic opens with:
39
+ ## Locked Intro (DEFAULT same shape as Seedance 2)
29
40
 
30
41
  ```
42
+ N connected cinematic shots, Xs total, AR, Multishot ON
43
+ Total: Xs / N shots / AR
44
+
31
45
  [GLOBAL LOOK – LOCKED, APPLIES TO EVERY SHOT]
32
46
  [CAST – IDENTICAL IN EVERY SHOT]
33
47
  [LOCATION]
48
+ [LOCATION MAP]
49
+ [CONTINUITY – LOCKED ACROSS EVERY CUT]
50
+ [PHYSICS]
51
+
52
+ SHOT 1 — 0:00–0:02 — Medium / camera position
53
+
54
+ Total: Xs / N shots / AR
34
55
  ```
35
56
 
36
- then timecoded `SHOT N 0:00–0:02 Medium / camera position` beats. Full skeleton, acting rules, and optical craft: `models/seedance.md`.
57
+ Full acting / continuity craft: `models/seedance.md`. Do not skip the Total lines or the three look/cast/location blocks. Do not restack GLOBAL LOOK inside shots.
58
+
59
+ 2.5 is where this format earns its keep: 15 shots timed to 30s, ~5k characters, one locked look so every cut matches camera / grade / cast.
37
60
 
38
- 2.5 is where this format earns its keep: 15 shots timed to 30s, ~5k characters, one locked look so every cut matches camera / grade / cast. Do not skip the three blocks. Do not restack GLOBAL LOOK inside shots.
61
+ ## OUTPUT CONTRACT (WINS mirror of help widget)
39
62
 
40
- UGC / phone vertical (full craft: `workflows/ugc-smartphone.md`): NEVER write "cinematic". GLOBAL LOOK is phone-native. Use `N connected phone shots, Xs total, 9:16, Multishot ON` and restate `9:16 vertical phone frame` inside every shot.
63
+ ONE fenced prompt. Missing Total / Multishot / summing timecodes / matching `duration` = failed skill turn.
64
+ FORBIDDEN: "same character throughout" as the only lock; one fence per shot; claiming you followed the skill while omitting GLOBAL LOOK / CAST / LOCATION / Multishot ON.
41
65
 
42
66
  ## Prompt length
43
67
 
@@ -4,7 +4,9 @@ Load this file when starting a multi-step production, or before any continuation
4
4
 
5
5
  ## Why It Exists
6
6
 
7
- Every URL, id, and brief produced by a Kolbo MCP tool MUST be recorded in `.kolbo/production.md` in the user's workspace. This file — not chat history is your source of truth for prior artifacts: URLs scattered across `tool_result` blobs are unreliable to re-scan and disappear entirely on context compaction. If the user named a model, write that name into `## 🎯 Now` and keep using that family on every follow-up — compaction is not permission to cheapest-swap.
7
+ Every URL, id, and brief produced by a Kolbo MCP tool MUST be recorded in `.kolbo/production.md` in the user's workspace. This file is **your** (agent) source of truth for prior artifacts across turns — not chat history (unreliable / compacted) and not a substitute for the user's **Library** gallery. URLs scattered across `tool_result` blobs are unreliable to re-scan and disappear entirely on context compaction. If the user named a model, write that name into `## 🎯 Now` and keep using that family on every follow-up — compaction is not permission to cheapest-swap.
8
+
9
+ **User vs agent SoT:** finished media for the human → **Library → This session**. Job state while in flight → `get_generation_status`. Your memory → this file. Chat cards are progress UI only.
8
10
 
9
11
  ## When to READ it
10
12
 
@@ -26,6 +26,10 @@ If Kolbo tools timeout or aren't listed, the MCP server may not be wired. Tell t
26
26
  ```
27
27
  This re-wires the MCP configuration automatically. Then restart the session.
28
28
 
29
+ ## Black / empty chat card while "Generating"
30
+
31
+ **Not a bug and not a failure.** The chat generation card's preview stays dark until the job has media. Library shows a K/logo placeholder tile for the same in-flight job. Do **not** re-fire `generate_*`, do **not** `list_media` to "find" it. Wait, or call `get_generation_status` once with `wait=true`. When complete, the result appears in Library (This session) — that is the user-facing source of truth.
32
+
29
33
  ## "Rate limited" (429 errors)
30
34
 
31
35
  Wait 60s for the window to reset, retry only the failed calls. For batch image work prefer `generate_creative_director` over multiple `generate_image` calls. Full rate-limit details + retry sequence: see SKILL.md "Rate Limiting & Batch Generation".
@@ -47,6 +51,8 @@ prompt loses.
47
51
 
48
52
  `get_generation_status` supports `wait=true` (blocks server-side until the generation reaches a final state, up to ~3 min) and `generation_ids` (many ids in one call → returns `all_done`, `still_processing`, and per-generation results). **Never call it repeatedly in a loop** — one `wait=true` call replaces the loop. If some generations are still running after the wait window, call it ONCE more with `wait=true` and only the `still_processing` ids.
49
53
 
54
+ **Credit guard:** after a generate tool returns `submitted` / `_timed_out`, do not keep thinking or editing files while the card spins — that burns coding credits. End the turn, or make **one** `wait=true` status call if you need the URLs next.
55
+
50
56
  ## Failure envelope from `get_generation_status`
51
57
 
52
58
  When a generation fails, `get_generation_status` returns a structured `failure` field alongside `error`:
@@ -63,11 +63,12 @@ When the user says "use the model אסתר" but you've only created a DNA for "
63
63
 
64
64
  ## ⚠️ Don't re-fetch / re-list your own outputs (CRITICAL)
65
65
 
66
- After a generation tool returns its URLs, those URLs are **already** in the canvas (the desktop app's gallery panel) and in `.kolbo/production.md`. Do **NOT** call `list_media`, `get_media`, `get_media_stats`, `list_visual_dnas`, or `chat_send_message` with `media_urls` on those URLs just to "verify" or "fetch thumbnails of the results":
66
+ After a generation tool returns its URLs, those URLs are **already** in **Library** (right panel This session) and in `.kolbo/production.md`. Do **NOT** call `list_media`, `get_media`, `get_media_stats`, `list_visual_dnas`, or `chat_send_message` with `media_urls` on those URLs just to "verify" or "fetch thumbnails of the results":
67
67
 
68
68
  - It burns credits and time for zero new information.
69
- - Every such tool call streams partial output into the session, which forces the desktop canvas to re-evaluate (visible flicker on the gallery tiles).
69
+ - Every such tool call streams partial output into the session, which forces Library to re-evaluate (visible flicker on the gallery tiles).
70
70
  - The thumbnails returned by `list_media` / `get_media` are the SAME asset you just generated.
71
+ - A black chat generation card while `Generating` is normal — do not treat it as missing output.
71
72
 
72
73
  **Only call list/get media tools when:**
73
74
  - The user explicitly asks ("what do I have in my library?", "show me my old DNAs").