@kolbo/mcp 1.112.4 → 1.113.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/skill/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.23
1
+ 0.9.24
@@ -21,7 +21,7 @@ Men: "calm, closed-mouth, contained expression, eyes just past the lens; a worki
21
21
 
22
22
  QA before showing: face matches the source, including small marks (a mole or scar in the same place; cheap edit models move them, and the video copies the sheet); front, back and close-up panels agree on neckline, straps, colours; body unchanged; no text. Write the wardrobe in the bible from the FRONT panel; Seedance copies the sheet, not the prompt.
23
23
 
24
- Then create a **Visual DNA** from the sheet (`visual-dna.md`) and record its `@tag` in the bible.
24
+ Then create a **Visual DNA** from the sheet (`references/workflows/visual-dna.md`) and record its `@tag` in the bible.
25
25
 
26
26
  ### 3. Looks and props
27
27
 
@@ -0,0 +1,29 @@
1
+ # Micro-Drama Studio in Kolbo Chat
2
+
3
+ Use this guide for planning, writing and revising a vertical drama series in a chat without production tools. Kobi Act and MCP agents use `references/workflows/micro-drama.md` and load its stage files as they work. These are two surfaces of the same workflow.
4
+
5
+ ## Start with the series
6
+
7
+ Carry forward decisions already made. Ask only for missing premise/genre, episode count and length, aspect ratio, language, visual style and budget. Suggested starting shape: six episodes of 45–90 seconds in 9:16. Never turn defaults into user requirements.
8
+
9
+ Build a series bible with logline, dramatic engine, world, cast, relationships, locations, visual style, wardrobe/prop continuity, season outline and house rules. Each episode needs an immediate hook, a character goal, an obstacle, a reversal and a consequence that pulls viewers into the next episode. Establish concrete actions and readable stakes rather than explanatory monologues. Preserve the user's creative direction and approved script lines through revisions.
10
+
11
+ ## Write and prepare
12
+
13
+ Write each episode as playable beats and dialogue before shot prompts. Track each character's look and emotional state by episode; changes of wardrobe, damage, time or location must be explicit. Keep recurring identities distinct from those states. Reuse approved project cast and Visual DNA names exactly, including non-English names.
14
+
15
+ Lock cast sheets, locations and voice samples before production. Main characters need enough face, wardrobe and expression coverage for close-ups. Use Kolbo's existing sheet presets and Visual DNA workflow when tools are available; do not claim a sheet, voice, DNA or project was created in a text-only chat.
16
+
17
+ Compile each part into self-contained shots with timing, visible action, blocking, framing, dialogue and sound. Match each line to its speaker. Keep screen direction, eyelines, props, lighting and acting continuous between shots. Shots must fit the selected model's live duration and prompt limits; never quote remembered identifiers or prices as current. Use the model's own prompt contract when writing a runnable generation prompt.
18
+
19
+ ## Produce with approvals
20
+
21
+ The production route blocks episodes in Seedance 2.5 Draft, reviews the first part before the remaining parts, then finalizes only approved keepers. Confirm current language, model, resolution and Draft support before generation. Explain any speech limitation and agree on native speech or an audio/lip-sync route before spending.
22
+
23
+ Approve the concept/season, each new character and voice, the credit cap, and each tight episode cut. A cap does not authorize finalization: quote each finalization from the live tool and obtain explicit approval for that amount. Preserve approval state on follow-ups. A content-policy refusal is not a technical failure to retry. Never claim render completion, QA, credits spent or saved files without tool receipts.
24
+
25
+ ## Edit and deliver
26
+
27
+ Review identity, physical action, dialogue, lip sync, continuity and pacing. Fix the smallest failed piece, with at most two retries before reporting the unresolved issue. Keep every approved line once and in order. Cut on shot boundaries, avoid flash frames and same-angle jumps, preserve meaningful reaction pauses, and smooth room-tone seams. Music is optional and must not obscure dialogue. Preserve source frame rate unless the user asks to change it.
28
+
29
+ Deliver the approved episode, then its trailer, social cuts and key art as requested. Put episode numbering and promotional calls to action in post captions. Record user corrections in the bible's house rules. In text-only Chat, deliver the bible, scripts, shot prompts and edit instructions; offer Kobi Act for execution. Publishing remains the user's decision.
@@ -26,7 +26,7 @@ Edit QA = all eleven, plus: no flash frames, every script line once and in order
26
26
 
27
27
  ## Kobi: build it in the Kolbo Video Editor
28
28
 
29
- Read `video-editor.md` and `get_video_editor_schema` first. One session per episode, in the series project, format from the kickoff.
29
+ Read `references/workflows/video-editor.md` and `get_video_editor_schema` first. One session per episode, in the series project, format from the kickoff.
30
30
 
31
31
  - **Picture:** one `video` item per kept piece on a mixed track, laid end to end (`reorder_items`). `trimStart` / `trimEnd` are milliseconds removed from the clip's head and tail. Punch-in = item `scale` + `position` (anchored on the face). Mirror = `flipX`.
32
32
  - **L-cuts and seams:** mute the video items and put each piece's sound as an `audio` item (same clip URL, its own trims) on an audio track; extend a line's audio item under the next picture for an L-cut, and give every seam a short `audioEffects` fade in/out. Never change `volume` or `gain` to "even out" levels.
@@ -1,6 +1,6 @@
1
1
  # Micro-drama — Draft renders, QA, finals
2
2
 
3
- Every part is blocked in **Seedance 2.5 Draft** (`draft: true`; see `models/seedance25.md`). Only parts the user keeps are finalized, at the resolution chosen at kickoff. Never regenerate a kept Draft to "upgrade" it.
3
+ Every part is blocked in **Seedance 2.5 Draft** (`draft: true`; see `references/models/seedance25.md`). Only parts the user keeps are finalized, at the resolution chosen at kickoff. Never regenerate a kept Draft to "upgrade" it.
4
4
 
5
5
  ## Estimate before the season (and before each episode)
6
6
 
@@ -38,7 +38,7 @@ Look at frames, not the prompt. Outside agents: `python scripts/micro-drama/shot
38
38
 
39
39
  ## Finals (only the keepers)
40
40
 
41
- 1. The user picks the keepers (or approves the tight cut built from Drafts; see `edit-deliver.md`).
41
+ 1. The user picks the keepers (or approves the tight cut built from Drafts; see `references/workflows/micro-drama/edit-deliver.md`).
42
42
  2. For each keeper: `edit_video` with `operation: "draft_quote"`, the Draft's `video_url`, `project_id` and a resolution from the catalog's `final_resolutions` (Drafts expire after `lifetime_seconds`, 7 days as of 2026-10, so finalize within that window). Sum the quotes and show them with the cap.
43
43
  3. Only after the user explicitly says yes to that exact quoted credit amount: `edit_video` with `operation: "draft_enhance"` and the same source, project and resolution. Never in the same turn as the quote, never covered by the credit cap or any autonomy setting, never as a default step. Finals are expensive (a 1080p finalization costs about 4.4x the Draft of the same length as of 2026-10); say so when quoting. This renders the same Draft at full quality; it is not a new generation.
44
44
  4. If a Draft has expired or cannot be finalized, say so before proposing any new paid render.
@@ -58,4 +58,4 @@ A character changes look only when the story says so (new day, new place, new si
58
58
 
59
59
  ## Release unit
60
60
 
61
- Each series goes out as trailer + Episode 1 together. The trailer is made right after Episode 1 is approved (`edit-deliver.md`). Number episodes in post captions ("Episode 2") and tease the next one; the call to action lives in the post caption, never in the video.
61
+ Each series goes out as trailer + Episode 1 together. The trailer is made right after Episode 1 is approved (`references/workflows/micro-drama/edit-deliver.md`). Number episodes in post captions ("Episode 2") and tease the next one; the call to action lives in the post caption, never in the video.
@@ -1,6 +1,6 @@
1
1
  # Micro-drama — shots and Seedance 2.5 prompts
2
2
 
3
- One prompt per part, compiled as the Locked Intro in `models/seedance25.md` (read it and `models/seedance.md` first). Acting and blocking depth: `filmmaking/acting-direction.md`, `filmmaking/blocking-continuity.md`. This file adds what micro-drama parts need.
3
+ One prompt per part, compiled as the Locked Intro in `references/models/seedance25.md` (read it and `references/models/seedance.md` first). Acting and blocking depth: `references/filmmaking/acting-direction.md`, `references/filmmaking/blocking-continuity.md`. This file adds what micro-drama parts need.
4
4
 
5
5
  ## Before writing a part
6
6
 
@@ -57,7 +57,7 @@ No music. No musical score. No stingers, no whooshes.
57
57
  - Name each speaker's accent in CAST and in every one of their lines; the voice sample alone does not hold it.
58
58
  - The part ends about 1 s after its last line. Between lines 0.5-1.2 s; one longer beat (≤2 s) only where a line must land.
59
59
  - AVOID adds: speaking the words of the reference audio, loud breathing, music.
60
- - Music is added in the edit only if the user asks (a montage beat can run on a track; see `edit-deliver.md`).
60
+ - Music is added in the edit only if the user asks (a montage beat can run on a track; see `references/workflows/micro-drama/edit-deliver.md`).
61
61
 
62
62
  ## The call
63
63
 
@@ -71,6 +71,6 @@ No music. No musical score. No stingers, no whooshes.
71
71
  - FLOOR PLAN + AXIS present; furniture named only if it is in the location frame or placed relative to it; each shot's start = previous end.
72
72
  - Every eye-line has a target off one side; lines to someone shot over that person's shoulder.
73
73
  - Wardrobe in CAST matches the sheet's front panel; no CAST sentence contradicts a reference image.
74
- - Timecodes sum to `duration`; Total lines and Multishot header present (`models/seedance25.md`).
74
+ - Timecodes sum to `duration`; Total lines and Multishot header present (`references/models/seedance25.md`).
75
75
  - Audio block lists lines in order with accents; timeline ends ≤1 s after the last line; "No music" present unless requested.
76
76
  - No famous names or IP; all ages 21+.
@@ -1,6 +1,6 @@
1
1
  # Micro-drama — writing (series, season, episode)
2
2
 
3
- Story craft comes from `filmmaking/scene-engine.md` (Goal → Obstacle → Tactic → Reversal → value shift). This file adds the micro-drama format and the anti-slop rules.
3
+ Story craft comes from `references/filmmaking/scene-engine.md` (Goal → Obstacle → Tactic → Reversal → value shift). This file adds the micro-drama format and the anti-slop rules.
4
4
 
5
5
  ## Format
6
6
 
@@ -7,25 +7,25 @@ This file is the router and the operating contract. Load the stage file when you
7
7
  | Stage | Read | Output |
8
8
  |---|---|---|
9
9
  | 0. Kickoff | this file | answers to the kickoff questions, Kolbo project, bible Doc |
10
- | 1. Bible + season | `micro-drama/series-bible.md`, `micro-drama/writing.md` | logline, world + look, characters, season outline with every Looks table |
11
- | 2. Episode script | `micro-drama/writing.md` | beats, dialogue, parts, trailer moments |
12
- | 3. Cast, looks, locations, voices | `micro-drama/cast-locations-voices.md` | character sheets + Visual DNAs, location frames, locked voice samples |
13
- | 4. Shots + prompts | `micro-drama/shots-prompts.md` + `models/seedance25.md` | one Seedance 2.5 prompt per part |
14
- | 5. Draft render, review, finals | `micro-drama/render-qa.md` | approved Draft parts, finalized keepers |
15
- | 6. Edit + delivery | `micro-drama/edit-deliver.md` | tight cut, platform episode, social cutdowns, trailer, key art |
10
+ | 1. Bible + season | `references/workflows/micro-drama/series-bible.md`, `references/workflows/micro-drama/writing.md` | logline, world + look, characters, season outline with every Looks table |
11
+ | 2. Episode script | `references/workflows/micro-drama/writing.md` | beats, dialogue, parts, trailer moments |
12
+ | 3. Cast, looks, locations, voices | `references/workflows/micro-drama/cast-locations-voices.md` | character sheets + Visual DNAs, location frames, locked voice samples |
13
+ | 4. Shots + prompts | `references/workflows/micro-drama/shots-prompts.md` + `references/models/seedance25.md` | one Seedance 2.5 prompt per part |
14
+ | 5. Draft render, review, finals | `references/workflows/micro-drama/render-qa.md` | approved Draft parts, finalized keepers |
15
+ | 6. Edit + delivery | `references/workflows/micro-drama/edit-deliver.md` | tight cut, platform episode, social cutdowns, trailer, key art |
16
16
 
17
- Craft depth lives in the filmmaking packs; reuse them, do not restate them: `filmmaking.md` (router), `filmmaking/scene-engine.md`, `filmmaking/acting-direction.md`, `filmmaking/blocking-continuity.md`, `filmmaking/audio-dialogue-music.md`, `visual-dna.md`, `video-editor.md`.
17
+ Craft depth lives in the filmmaking packs; reuse them, do not restate them: `references/workflows/filmmaking.md` (router), `references/filmmaking/scene-engine.md`, `references/filmmaking/acting-direction.md`, `references/filmmaking/blocking-continuity.md`, `references/filmmaking/audio-dialogue-music.md`, `references/workflows/visual-dna.md`, `references/workflows/video-editor.md`.
18
18
 
19
19
  ## Stage 0 — Kickoff (ask once, in one labeled question card)
20
20
 
21
21
  Ask these before any paid step, with the suggested default first. Store the answers at the top of the bible.
22
22
 
23
- 1. **Idea + genre**: the user's premise, and one of the genre templates in `micro-drama/writing.md` (romance/revenge, thriller/mystery, brand series, comedy) or "other".
23
+ 1. **Idea + genre**: the user's premise, and one of the genre templates in `references/workflows/micro-drama/writing.md` (romance/revenge, thriller/mystery, brand series, comedy) or "other".
24
24
  2. **Season shape**: number of episodes (suggest 6), episode length (suggest 45-90 s), aspect (suggest 9:16).
25
25
  3. **Language**: English is the reliable default. Seedance 2.5 performs English dialogue natively. For any other language, tell the user before anything is generated: Seedance 2.5 may not speak it (it does not speak Hebrew at all), and the route is either a model that speaks it natively (check `list_models`) or recorded/generated speech with a lip-sync model, both with their own cost and quality trade-offs. Let the user choose.
26
- 4. **Look route**: photoreal drama, or a stylized glamour / nostalgic look (Midjourney stills as the look source). See `cast-locations-voices.md`.
26
+ 4. **Look route**: photoreal drama, or a stylized glamour / nostalgic look (Midjourney stills as the look source). See `references/workflows/micro-drama/cast-locations-voices.md`.
27
27
  5. **Finals**: episodes are always blocked in Seedance 2.5 Draft. Read `draft_resolutions[].final_resolutions` for `seedance-2-5` in `list_models` (as of 2026-10 a Draft finalizes to 1080p only). If there is a choice, ask which tier; if not, tell the user the final tier and its cost per 30 s, and ask whether to finalize at all or deliver the Draft cut.
28
- 6. **Credit cap** for the season (and per episode), quoted against the estimate in `render-qa.md`.
28
+ 6. **Credit cap** for the season (and per episode), quoted against the estimate in `references/workflows/micro-drama/render-qa.md`.
29
29
 
30
30
  Then create one Kolbo project per series (`create_project`) and pass its `project_id` on every call. The bible is a Kolbo Doc in that project (`create_doc`), so Kobi, the user and outside agents read the same source of truth.
31
31
 
@@ -39,13 +39,17 @@ Then create one Kolbo project per series (`create_project`) and pass its `projec
39
39
 
40
40
  In Kobi Act, `submit_plan` is the approval card for each gate; do not add extra confirmation loops between gates. Outside Kobi, follow the Kolbo brief-and-cost confirmation rule at each gate.
41
41
 
42
+ ## Chat and discovery
43
+
44
+ Kolbo Chat exposes this workflow as **Micro-Drama Studio** (`micro_drama`). Chat uses `references/workflows/micro-drama/chat.md` for planning and prompt delivery; Kobi Act loads this router and the stage files from the bundled Kolbo skill. The public standalone command is `/kolbo:micro-drama`.
45
+
42
46
  ## Where it runs
43
47
 
44
48
  Any agent connected to the Kolbo MCP can run this workflow end to end: Kobi in the Kolbo app, Kolbo Code, Claude Code, Codex / ChatGPT agents, Cursor. Generation, references, project, bible Doc and transcription are all Kolbo tools. The only local part is the optional edit scripts, which need a shell, Python 3, numpy and ffmpeg; agents without a shell build the cut in the Kolbo Video Editor instead.
45
49
 
46
50
  ## Who edits
47
51
 
48
- - **Kobi** builds every cut in the Kolbo Video Editor (`video-editor.md`), so the user can open and tweak it.
52
+ - **Kobi** builds every cut in the Kolbo Video Editor (`references/workflows/video-editor.md`), so the user can open and tweak it.
49
53
  - **Outside agents** (Claude Code, Codex, Kolbo Code) with a shell edit locally with the bundled scripts in `scripts/micro-drama/` (Python 3 + numpy + ffmpeg). They may also hand the user a Video Editor session if asked.
50
54
 
51
55
  ## Hard rules
@@ -0,0 +1,37 @@
1
+ # Music operations, Trends, styles and project handoffs
2
+
3
+ Use these operations only when exposed by the connected MCP. Read its current schema and live catalog for supported inputs and prices. Existing creative brief, cost approval and project/session rules still apply. A listed tool is not proof that an operation ran.
4
+
5
+ ## Music planning and edits
6
+
7
+ - `create_music_composition_plan` creates a free plan from a prompt, optionally with duration in seconds. Pass its returned composition plan to `generate_music` only after the generation cost is approved.
8
+ - `create_music_reference_audio` converts owned uploaded Kolbo audio into a music reference. This operation is billed like a track of that length; it is not a free upload. Upload local files first and confirm the cost before conversion.
9
+ - `edit_music_section` creates a new paid generation from a supported ElevenLabs source with a song id. Supply the source generation, start/end milliseconds and replacement text/styles. The region is 3 to 120 seconds. Preserve the original and poll the returned generation id.
10
+ - `import_music_audio` imports a public audio URL for reuse by `extend_music` or `cover_music`. Upload local files first. Match the import type to the later operation. Set rights_confirmed only when the user has confirmed they hold the audio rights.
11
+ - `extend_music` continues from the source end or continue_at seconds. `cover_music` re-records its musical identity in a new style. Both accept an imported upload id or a public audio URL with rights confirmation. Neither accepts a target duration; do not promise one. Obtain cost approval before generation.
12
+
13
+ ## Trends and Motion Library
14
+
15
+ 1. Use `list_trends` to discover the requested look or effect, including the motion family. Do not substitute a guessed recipe.
16
+ 2. Read `get_trend` for the exact input keys, roles, choices, output and trial availability. A character input may accept a Visual DNA image URL; use the returned contract.
17
+ 3. Call `estimate_trend_run` with the actual inputs and settings. Confirm the quote unless the user already approved that scope.
18
+ 4. Call `run_trend` with the agreed credit ceiling and one stable idempotency key. Reuse that key after an uncertain response; a new key starts another chargeable run.
19
+ 5. Follow `get_trend_run` and recover existing jobs through `list_trend_runs`. A wait timeout is not failure. `cancel_trend_run` releases unspent credits; free trial runs cannot be cancelled.
20
+
21
+ ## Morphious Styles
22
+
23
+ `list_morphious_styles` returns catalog and personal styles. Pass the chosen id as style_id to `generate_video_from_video` with model `kolbo-morphious-motion` and the source video. This style route needs no reference image or prompt. Verify current video limits and price before execution.
24
+
25
+ `create_morphious_style` saves a named look from 1 to 8 uploaded image URLs. These define appearance, not subject identity. `delete_morphious_style` removes an owned custom style; catalog styles cannot be removed and past results remain.
26
+
27
+ ## Creative Director status
28
+
29
+ Use `get_creative_director_status` for a Creative Director generation id. Inspect every scene's status and result URL. The overall run remains processing until all scenes are terminal; an expired wait window does not mean failure or authorize rerunning the batch.
30
+
31
+ ## Project copies and transfers
32
+
33
+ `duplicate_project` makes a new owned project for a variant or a copy to prepare for sharing. Use its new project id for subsequent work and disclose stats.notCopied. Context files, the derived AI profile, chat sessions and in-flight generations do not travel; do not imply a complete backup. Duplication alone does not publish anything.
34
+
35
+ `list_project_transfers` lists incoming or outgoing requests, pending by default. `respond_project_transfer` accepts or declines an incoming request, or cancels an outgoing one. Confirm before acceptance: it immediately transfers ownership of the whole project. If blocked by in-flight generations, wait and retry rather than claiming acceptance succeeded.
36
+
37
+ For individual character/style handoffs, read `references/workflows/visual-dna.md` and use the dedicated Visual DNA transfer tools.
@@ -254,16 +254,15 @@ Tools: `list_visual_dna_folders`, `create_visual_dna_folder` (`name`, optional h
254
254
  - **Creating many characters for one production?** Create the folder FIRST, then `move_visual_dna_to_folder` each DNA right after `create_visual_dna` — don't leave a big cast unsorted at root.
255
255
  - To list a folder's contents: `list_visual_dnas` and filter by each profile's `folder_id` (there is no server-side folder filter).
256
256
 
257
- ## Transfer through Kolbo UI — send DNAs to another account
257
+ ## Transfer — send DNAs to another account
258
258
 
259
- Use the authenticated Kolbo UI for account transfers. Dedicated MCP transfer tools
260
- are not in the current published tool surface; do not invent or call them.
259
+ When exposed by the connected MCP, use `transfer_visual_dna` for 1 to 50 owned ready DNAs, `list_visual_dna_transfers` to inspect incoming/outgoing requests, and `respond_visual_dna_transfer` to accept/decline incoming requests or cancel outgoing ones. If absent from the connected tool surface, use the authenticated Kolbo UI instead.
261
260
 
262
261
  - Recipient must already have a Kolbo account; nothing changes until they accept (7-day expiry).
263
262
  - On accept the recipient gets their OWN copy — **new ids**, returned in `copies`. Use those ids and names for the recipient's generations, never the sender's ids. A name clash becomes "Name (1)".
264
263
  - `keep_sender_copy: false` is a move: the sender's originals go to trash on accept. Default keeps them.
265
264
  - Only the sender's personal, ready DNAs — not global, organization, or still-generating ones. Custom cloned/designed voices stay owned by the sender.
266
- - GATE: confirm recipient email, the DNA list and keep/move with the user before sending through the UI; confirm before accepting.
265
+ - GATE: confirm recipient email, the DNA list and keep/move with the user before sending; confirm before accepting.
267
266
  - Whole project instead (cast comes along as copies)? Use `transfer_project`.
268
267
 
269
268
  ## Character sheet — default for production assets (not a catalog preset)
package/src/apps/theme.js CHANGED
@@ -156,7 +156,7 @@ body {
156
156
  .k-input-section { flex-basis: 100%; min-width: 0; margin-top: 6px; }
157
157
  .k-input-label { display: block; color: var(--muted); font-size: 11px; margin-bottom: 6px; }
158
158
  .k-input-media { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; }
159
- .k-input-media .k-ref-thumb { width: 80px; height: 80px; object-fit: contain; background: var(--panel); }
159
+ .k-input-media .k-ref-thumb { width: 40px; height: 40px; object-fit: contain; background: var(--panel); }
160
160
  .k-ref-audio { display: flex; flex-direction: column; gap: 6px; max-width: 100%; font-size: 11px; }
161
161
  .k-ref-audio audio { width: 240px; max-width: 100%; height: 32px; }
162
162
  .k-template { display: flex; align-items: center; gap: 12px; font-size: 12px; }
@@ -27,7 +27,7 @@ const READ_ONLY = [
27
27
  'list_presets', 'list_cinematic_presets',
28
28
  'list_projects', 'get_project', 'list_sessions', 'list_project_context', 'get_project_profile',
29
29
  'list_project_assets',
30
- 'list_project_transfers',
30
+ 'list_project_transfers', 'list_visual_dna_transfers',
31
31
  'list_session_generations',
32
32
  'list_agents', 'list_skills', 'list_docs', 'get_doc',
33
33
  'get_review_storage_usage', 'list_review_assets', 'get_review_asset',
@@ -118,6 +118,8 @@ const DESTRUCTIVE_WRITE = [
118
118
  'update_project_asset',
119
119
  // Ownership hand-off: the sender loses the project (and maybe all access) on accept.
120
120
  'transfer_project', 'respond_project_transfer',
121
+ // A move (keep_sender_copy:false) trashes the sender's originals on accept.
122
+ 'transfer_visual_dna', 'respond_visual_dna_transfer',
121
123
  'update_agent', 'delete_agent', 'update_skill', 'delete_skill', 'update_doc', 'delete_doc',
122
124
  'delete_review_asset', 'delete_review_collection',
123
125
  'edit_review_comment', 'delete_review_comment',
@@ -463,6 +463,62 @@ function registerVisualDnaTools(server, client, options = {}) {
463
463
  return { content: [{ type: 'text', text: JSON.stringify(result, null, 2) }] };
464
464
  }
465
465
  );
466
+
467
+ registerVisualDnaTransferTools(server, client);
468
+ }
469
+
470
+ // ─── Visual DNA transfer (send DNAs to another account) ──────
471
+ function registerVisualDnaTransferTools(server, client) {
472
+ server.tool(
473
+ 'transfer_visual_dna',
474
+ 'Send one or more Visual DNAs you OWN to another Kolbo account (by email). Nothing changes until they accept (in the app, or via `respond_visual_dna_transfer`) within 7 days. On accept they get their OWN copy of each DNA (new ids, same references, description and voice settings; renamed "Name (1)" if they already have that name). `keep_sender_copy` (default true) keeps yours; false = a MOVE — your originals go to trash on accept. Global, organization and still-generating DNAs cannot be sent. Cloned/designed custom voices stay owned by you. ALWAYS confirm the recipient email, the DNA list and the keep-copy choice with the user before calling.',
475
+ {
476
+ visual_dna_ids: z.array(z.string()).min(1).max(50).describe('Visual DNA ids you own (from list_visual_dnas). 1-50.'),
477
+ email: z.string().describe('Email of the EXISTING Kolbo account that should receive them.'),
478
+ keep_sender_copy: z.boolean().optional().describe('Keep your own copy after they accept. Default: true. false = move (your originals are trashed on accept).'),
479
+ },
480
+ async ({ visual_dna_ids, email, keep_sender_copy }) => {
481
+ const result = await client.post('/v1/visual-dna-transfers', {
482
+ visual_dna_ids,
483
+ email,
484
+ ...(keep_sender_copy === undefined ? {} : { keep_sender_copy }),
485
+ });
486
+ return { content: [{ type: 'text', text: JSON.stringify(result.transfer, null, 2) }] };
487
+ }
488
+ );
489
+ server.tool(
490
+ 'list_visual_dna_transfers',
491
+ 'List Visual DNA transfer requests. `direction: incoming` (default) = DNAs other people want to send you; `outgoing` = ones you sent. Defaults to pending only. Use the `id` with `respond_visual_dna_transfer`.',
492
+ {
493
+ direction: z.enum(['incoming', 'outgoing']).optional().describe('Default: incoming.'),
494
+ status: z.enum(['pending', 'accepted', 'declined', 'cancelled', 'expired', 'failed']).optional().describe('Default: pending.'),
495
+ },
496
+ async ({ direction, status }) => {
497
+ const params = new URLSearchParams();
498
+ if (direction) params.set('direction', direction);
499
+ if (status) params.set('status', status);
500
+ const qs = params.toString();
501
+ const result = await client.get(`/v1/visual-dna-transfers${qs ? '?' + qs : ''}`);
502
+ return { content: [{ type: 'text', text: JSON.stringify(result.transfers || [], null, 2) }] };
503
+ }
504
+ );
505
+ server.tool(
506
+ 'respond_visual_dna_transfer',
507
+ 'Act on a Visual DNA transfer request. `accept` / `decline` = you are the recipient; `cancel` = you sent it. Accept adds copies to your library and returns their NEW ids in `copies` — use those ids (and their names as @Name tags) in generations. Confirm with the user before accepting.',
508
+ {
509
+ transfer_id: z.string().describe('Transfer id from list_visual_dna_transfers.'),
510
+ action: z.enum(['accept', 'decline', 'cancel']),
511
+ },
512
+ async ({ transfer_id, action }) => {
513
+ const id = encodeURIComponent(transfer_id);
514
+ // Explicit paths (not `/${action}`) so check-parity can see each route.
515
+ let result;
516
+ if (action === 'cancel') result = await client.delete(`/v1/visual-dna-transfers/${id}`);
517
+ else if (action === 'accept') result = await client.post(`/v1/visual-dna-transfers/${id}/accept`, {});
518
+ else result = await client.post(`/v1/visual-dna-transfers/${id}/decline`, {});
519
+ return { content: [{ type: 'text', text: JSON.stringify(result.transfer, null, 2) }] };
520
+ }
521
+ );
466
522
  }
467
523
 
468
524
  module.exports = { registerVisualDnaTools };