@remixmate/cli 0.9.18 → 0.9.20

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.
@@ -1,10 +1,11 @@
1
1
  {
2
2
  "schemaVersion": 1,
3
- "version": "0.9.18",
4
- "generatedAt": "2026-08-30T03:02:58.749Z",
3
+ "version": "0.9.20",
4
+ "generatedAt": "2026-09-05T03:37:29.567Z",
5
5
  "skills": [
6
6
  {
7
7
  "id": "export-jianying",
8
+ "toolName": "export_jianying",
8
9
  "tier": "orchestration",
9
10
  "category": "consuming",
10
11
  "title": "Jianying (CapCut) Draft Export",
@@ -24,10 +25,74 @@
24
25
  "PRIV_TOKEN",
25
26
  "MM_API_BASE_URL",
26
27
  "AGENT_NAME"
27
- ]
28
+ ],
29
+ "parameters": {
30
+ "type": "object",
31
+ "properties": {
32
+ "from_render_plan": {
33
+ "type": "string",
34
+ "description": "Build the draft from a RenderPlan JSON (replaces --scenes)"
35
+ },
36
+ "scenes": {
37
+ "type": "string",
38
+ "description": "Scene array as JSON (inline string or file path)"
39
+ },
40
+ "title": {
41
+ "type": "string",
42
+ "description": "Draft title"
43
+ },
44
+ "width": {
45
+ "type": "number",
46
+ "description": "Canvas width in pixels (default 1080)"
47
+ },
48
+ "height": {
49
+ "type": "number",
50
+ "description": "Canvas height in pixels (default 1920)"
51
+ },
52
+ "system": {
53
+ "type": "string",
54
+ "enum": [
55
+ "mac",
56
+ "windows"
57
+ ],
58
+ "description": "Draft-root preset"
59
+ },
60
+ "draft_root_path": {
61
+ "type": "string",
62
+ "description": "Explicit Jianying draft root path (overrides --system)"
63
+ },
64
+ "no_download": {
65
+ "type": "boolean",
66
+ "description": "Do not download the ZIP; print the URL only"
67
+ },
68
+ "output": {
69
+ "type": "string",
70
+ "description": "Local download path"
71
+ }
72
+ },
73
+ "required": []
74
+ },
75
+ "ui": {
76
+ "primary": [
77
+ "title"
78
+ ],
79
+ "advanced": [
80
+ "system",
81
+ "width",
82
+ "height",
83
+ "output"
84
+ ],
85
+ "hidden": [
86
+ "from_render_plan",
87
+ "scenes",
88
+ "draft_root_path",
89
+ "no_download"
90
+ ]
91
+ }
28
92
  },
29
93
  {
30
94
  "id": "gen-digital-human",
95
+ "toolName": "gen_digital_human",
31
96
  "tier": "atomic",
32
97
  "category": "asset",
33
98
  "title": "Digital-Human Talking-Head",
@@ -47,18 +112,116 @@
47
112
  "PRIV_TOKEN",
48
113
  "MM_API_BASE_URL",
49
114
  "AGENT_NAME"
50
- ]
115
+ ],
116
+ "parameters": {
117
+ "type": "object",
118
+ "properties": {
119
+ "list_avatars": {
120
+ "type": "boolean",
121
+ "description": "List available digital-human avatars"
122
+ },
123
+ "mine": {
124
+ "type": "boolean",
125
+ "description": "With list_avatars=true: list the caller's own custom avatars instead of the public catalog. Custom avatars do not appear without this."
126
+ },
127
+ "name": {
128
+ "type": "string",
129
+ "description": "With list_avatars=true: fuzzy-filter avatars by name"
130
+ },
131
+ "source": {
132
+ "type": "string",
133
+ "enum": [
134
+ "jimeng",
135
+ "hifly"
136
+ ],
137
+ "description": "Provider: jimeng is image-driven, hifly is video-driven. Usually inferred from the avatar; pass it explicitly when the avatar declares no source."
138
+ },
139
+ "gender": {
140
+ "type": "string",
141
+ "enum": [
142
+ "male",
143
+ "female"
144
+ ],
145
+ "description": "Filter by gender"
146
+ },
147
+ "avatar_id": {
148
+ "type": "number",
149
+ "description": "Avatar id"
150
+ },
151
+ "text": {
152
+ "type": "string",
153
+ "description": "Narration text (TTS mode)"
154
+ },
155
+ "audio_url": {
156
+ "type": "string",
157
+ "description": "Audio URL (audio-driven mode)"
158
+ },
159
+ "voice_id": {
160
+ "type": "string",
161
+ "description": "Voice id (TTS mode). Shares the Minimax catalog with gen-voice — call gen_voice with list_voices=true to see available ids rather than inventing one."
162
+ },
163
+ "voice_name": {
164
+ "type": "string",
165
+ "description": "Voice display name, recorded alongside voice_id for bookkeeping. Does not affect synthesis."
166
+ },
167
+ "aspect_ratio": {
168
+ "type": "string",
169
+ "description": "Aspect ratio: 9:16 / 16:9 / 3:4 / 1:1. Defaults to the avatar's own ratio."
170
+ },
171
+ "prompt": {
172
+ "type": "string",
173
+ "description": "Action prompt describing how the avatar should perform, e.g. 'more hand gestures'"
174
+ },
175
+ "check_status": {
176
+ "type": "boolean",
177
+ "description": "Status-check mode: poll an earlier job instead of starting a new one. Requires generation_id. Use this when a generate call timed out."
178
+ },
179
+ "generation_id": {
180
+ "type": "number",
181
+ "description": "Job id to poll (required when check_status=true)"
182
+ },
183
+ "json_output": {
184
+ "type": "boolean",
185
+ "description": "Emit a JSON result (generate: { url, generationId }; list: { avatars }; check-status: { status, url }) instead of human-readable output"
186
+ }
187
+ },
188
+ "required": []
189
+ },
190
+ "ui": {
191
+ "primary": [
192
+ "avatar_id",
193
+ "text"
194
+ ],
195
+ "advanced": [
196
+ "source",
197
+ "voice_id",
198
+ "aspect_ratio",
199
+ "prompt",
200
+ "audio_url"
201
+ ],
202
+ "hidden": [
203
+ "json_output",
204
+ "list_avatars",
205
+ "mine",
206
+ "name",
207
+ "gender",
208
+ "check_status",
209
+ "generation_id",
210
+ "voice_name"
211
+ ]
212
+ }
51
213
  },
52
214
  {
53
215
  "id": "gen-image",
216
+ "toolName": "gen_image",
54
217
  "tier": "atomic",
55
218
  "category": "asset",
56
219
  "title": "AI Image Generation",
57
- "summary": "AI image generation: produce an image from a text prompt. Supports the Seedream family (including a high-fidelity 'pro' variant) and Gemini, plus image-to-image with reference images.",
220
+ "summary": "AI image generation: produce an image from a text prompt. Supports the Seedream 5.0 family (Lite and a high-fidelity 'pro' variant), plus image-to-image with reference images.",
58
221
  "triggers": [
59
222
  "AI image generation, text-to-image, \"draw me ...\", \"generate an image of ...\"",
60
223
  "Image-to-image, reference image, style transfer, image variation",
61
- "Generate an image with Doubao / Seedream / Gemini",
224
+ "Generate an image with Doubao / Seedream",
62
225
  "Provide a prompt and ask for an image"
63
226
  ],
64
227
  "entry": {
@@ -71,10 +234,95 @@
71
234
  "MM_API_BASE_URL",
72
235
  "AGENT_NAME",
73
236
  "MM_IMAGE_MODEL"
74
- ]
237
+ ],
238
+ "parameters": {
239
+ "type": "object",
240
+ "properties": {
241
+ "prompt": {
242
+ "type": "string",
243
+ "description": "Image description (required)"
244
+ },
245
+ "model": {
246
+ "type": "string",
247
+ "description": "Model: 'seedream' (default, Seedream 5.0 Lite) or 'seedream-pro' (high fidelity, precise placement and on-image text; costs more per image)"
248
+ },
249
+ "size": {
250
+ "type": "string",
251
+ "description": "Aspect ratio or WxH, e.g. 1:1, 9:16"
252
+ },
253
+ "resolution": {
254
+ "type": "string",
255
+ "enum": [
256
+ "1K",
257
+ "2K",
258
+ "4K"
259
+ ],
260
+ "description": "Output resolution tier. Currently inert: the only backend model that read it (Gemini) is not wired up, so this is ignored — use `size` for image dimensions."
261
+ },
262
+ "n": {
263
+ "type": "number",
264
+ "description": "Number of images, 1-4"
265
+ },
266
+ "reference": {
267
+ "type": "array",
268
+ "items": {
269
+ "type": "string"
270
+ },
271
+ "description": "Reference images for image-to-image: local file path, https URL, or data URI. Pass multiple to blend several references (seedream: max 14, seedream-pro: max 10 — over the limit fails before spending credits)."
272
+ },
273
+ "image_strength": {
274
+ "type": "number",
275
+ "description": "How strongly the reference images influence the result, 0-1 (Seedream family only). Omit to use the backend default."
276
+ },
277
+ "guidance_scale": {
278
+ "type": "number",
279
+ "description": "Prompt-adherence strength, where supported. Omit to use the backend default."
280
+ },
281
+ "negative_prompt": {
282
+ "type": "string",
283
+ "description": "Negative prompt — content to avoid"
284
+ },
285
+ "seed": {
286
+ "type": "number",
287
+ "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
288
+ },
289
+ "watermark": {
290
+ "type": "boolean",
291
+ "description": "Add a watermark to the output. Only true has an effect; there is no opt-out override of the backend default."
292
+ },
293
+ "json_output": {
294
+ "type": "boolean",
295
+ "description": "Emit a JSON result ({ urls: [...] }) instead of human-readable output"
296
+ }
297
+ },
298
+ "required": [
299
+ "prompt"
300
+ ]
301
+ },
302
+ "ui": {
303
+ "primary": [
304
+ "prompt",
305
+ "model",
306
+ "size"
307
+ ],
308
+ "advanced": [
309
+ "n",
310
+ "reference",
311
+ "negative_prompt",
312
+ "image_strength"
313
+ ],
314
+ "hidden": [
315
+ "json_output",
316
+ "seed",
317
+ "guidance_scale",
318
+ "watermark",
319
+ "resolution"
320
+ ]
321
+ }
75
322
  },
76
323
  {
77
324
  "id": "gen-script",
325
+ "toolName": "gen_script",
78
326
  "tier": "orchestration",
79
327
  "category": "authoring",
80
328
  "title": "Video Script Generation",
@@ -94,17 +342,123 @@
94
342
  "DEFAULT_VIDEO_MODEL",
95
343
  "STUB_IMAGE_URL",
96
344
  "STUB_VIDEO_URL"
97
- ]
345
+ ],
346
+ "parameters": {
347
+ "type": "object",
348
+ "properties": {
349
+ "topic": {
350
+ "type": "string",
351
+ "description": "Video topic (required)"
352
+ },
353
+ "platform": {
354
+ "type": "string",
355
+ "enum": [
356
+ "douyin",
357
+ "xiaohongshu",
358
+ "bilibili",
359
+ "wechat",
360
+ "youtube",
361
+ "generic"
362
+ ],
363
+ "description": "Target platform"
364
+ },
365
+ "duration": {
366
+ "type": "number",
367
+ "description": "Target duration in seconds"
368
+ },
369
+ "style": {
370
+ "type": "string",
371
+ "description": "Style tag"
372
+ },
373
+ "ratio": {
374
+ "type": "string",
375
+ "description": "Aspect ratio, e.g. 16:9 or 9:16"
376
+ },
377
+ "scenes": {
378
+ "type": "number",
379
+ "description": "Scene count"
380
+ },
381
+ "voice_id": {
382
+ "type": "string",
383
+ "description": "Narration voice id. Default depends on the bound template's outputLanguage; query gen_voice with list_voices=true to see available ids."
384
+ },
385
+ "template_id": {
386
+ "type": "string",
387
+ "description": "Template id (e.g. html-slide). The template owns outputLanguage and may also declare a defaultVoiceId; both flow into the produced DSL."
388
+ },
389
+ "headline": {
390
+ "type": "string",
391
+ "description": "On-screen headline (recommended 4-12 chars / ~3 words). Stored at meta.headline and pushed into every scene's textLayers[role=headline] so the template can render it as the top big-text. **Must** be set when the user explicitly provided a headline / main title; without it, headline falls back to the long-form topic and overflows the top text layer."
392
+ },
393
+ "subheadline": {
394
+ "type": "string",
395
+ "description": "On-screen subheadline (project name / slogan / source, e.g. 'Pixelle-Video'). Stored at meta.subheadline and pushed into every scene's textLayers[role=subheadline] so the template can render it as the top small-text. **Must** be set when the user explicitly provided a subtitle / project name. Note: this is the on-screen subheadline, not the CC subtitle (global.subtitle) — they are independent."
396
+ },
397
+ "carousel_items": {
398
+ "type": "array",
399
+ "items": {
400
+ "type": "string"
401
+ },
402
+ "description": "Media URLs for the template's image/video carousel (e.g. spotlight-card's middle carousel). When provided together with a template_id whose capabilities.payloadStyle=carousel-caption, these URLs are placed directly into customPayload.carousel.items as existing assets — NO AI image generation is triggered. **Must** pass when the user explicitly provides image/video URLs for carousel-style templates (spotlight-card, etc.). Each element is a full URL string."
403
+ },
404
+ "caption_lines": {
405
+ "type": "array",
406
+ "items": {
407
+ "type": "string"
408
+ },
409
+ "description": "Bottom typewriter text lines for templates that support a caption/typewriter area (e.g. spotlight-card). Each element is one line of text, max 10 lines. Supports **emphasis** syntax (rendered with accent color). **Must** pass when the user explicitly provides bullet-point text / bottom copy. **Also must pass — written by you — when the user did NOT provide any copy but the template is typewriter-driven** (capabilities.durationStrategy=fit-caption, e.g. spotlight-card): such templates have no narration, so these lines are both the video's content and the thing that decides its duration. Draft them from the material you researched (repo README, page screenshots, the topic). Leaving this empty for a fit-caption template is rejected: nothing auto-generates caption text, and an empty caption renders a titled carousel with no words at all."
410
+ },
411
+ "stub_image_url": {
412
+ "type": "string",
413
+ "description": "Test-mode image stub URL. Only pass when the user explicitly says things like 'just testing / don't actually generate / use a placeholder image / stub URL / save credits' AND provides a concrete URL. With this set, every image AssetRef in the produced DSL is written as source=existing, status=generated, url=<this URL> — no gen-image call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
414
+ },
415
+ "stub_video_url": {
416
+ "type": "string",
417
+ "description": "Test-mode video stub URL. Only pass when the user explicitly says things like 'just testing / don't actually generate the video / placeholder clip / save credits' AND provides a concrete URL. With this set, every video AssetRef in the produced DSL is written as source=existing, status=generated, url=<this URL> — no gen-video call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
418
+ },
419
+ "skip_asset_generation": {
420
+ "type": "boolean",
421
+ "description": "All-in-one switch for downstream agents (e.g. template-creator) that only want the DSL shape: every produced AssetRef is marked as already generated with placeholder URLs (image: https://placeholder.local/stub.png, video: stub.mp4, audio: stub.mp3). Implies the equivalent of --stub-image-url + --stub-video-url with sentinel defaults plus the same rewrite for gen-voice / gen-digital-human assets. Useful when the agent only needs to inspect DSL structure or feed it into try_render_local with all assets pre-stubbed."
422
+ }
423
+ },
424
+ "required": [
425
+ "topic"
426
+ ]
427
+ },
428
+ "ui": {
429
+ "primary": [
430
+ "topic",
431
+ "platform",
432
+ "duration"
433
+ ],
434
+ "advanced": [
435
+ "style",
436
+ "ratio",
437
+ "scenes",
438
+ "voice_id",
439
+ "template_id",
440
+ "headline",
441
+ "subheadline",
442
+ "carousel_items",
443
+ "caption_lines"
444
+ ],
445
+ "hidden": [
446
+ "stub_image_url",
447
+ "stub_video_url",
448
+ "skip_asset_generation"
449
+ ]
450
+ }
98
451
  },
99
452
  {
100
453
  "id": "gen-video",
454
+ "toolName": "gen_video",
101
455
  "tier": "atomic",
102
456
  "category": "asset",
103
457
  "title": "AI Video Generation",
104
- "summary": "AI video generation: produce a short video clip from a text prompt. Supports Seedance and Veo models, plus first/last frame and reference images.",
458
+ "summary": "AI video generation: produce a short video clip from a text prompt. Three Seedance 2.0 tiers (mini / fast / standard), plus first/last frame and reference images.",
105
459
  "triggers": [
106
460
  "Text-to-video, AI-generated clip, \"make a short video of ...\"",
107
- "Generate video with Doubao / Seedance / Veo / Google",
461
+ "Generate video with Doubao / Seedance",
108
462
  "Image-to-video, first-frame / last-frame, reference-image-to-video"
109
463
  ],
110
464
  "entry": {
@@ -117,10 +471,104 @@
117
471
  "MM_API_BASE_URL",
118
472
  "AGENT_NAME",
119
473
  "MM_VIDEO_MODEL"
120
- ]
474
+ ],
475
+ "parameters": {
476
+ "type": "object",
477
+ "properties": {
478
+ "prompt": {
479
+ "type": "string",
480
+ "description": "Video description"
481
+ },
482
+ "model": {
483
+ "type": "string",
484
+ "description": "Model: 'seedance-mini' (default; cheapest, 480p/720p), 'seedance-fast' (480p/720p), or 'seedance' (Seedance 2.0, adds 1080p). All are 4-15s and share the same features"
485
+ },
486
+ "duration": {
487
+ "type": "number",
488
+ "description": "Duration in seconds"
489
+ },
490
+ "ratio": {
491
+ "type": "string",
492
+ "description": "Aspect ratio"
493
+ },
494
+ "resolution": {
495
+ "type": "string",
496
+ "description": "Resolution"
497
+ },
498
+ "first_frame": {
499
+ "type": "string",
500
+ "description": "First-frame image path or URL"
501
+ },
502
+ "last_frame": {
503
+ "type": "string",
504
+ "description": "Last-frame image path or URL"
505
+ },
506
+ "reference": {
507
+ "type": "array",
508
+ "items": {
509
+ "type": "string"
510
+ },
511
+ "description": "Reference images: local file path, https URL, or data URI. Up to 9; combinable with first_frame / last_frame."
512
+ },
513
+ "generate_audio": {
514
+ "type": "boolean",
515
+ "description": "Generate native audio"
516
+ },
517
+ "camera_fixed": {
518
+ "type": "boolean",
519
+ "description": "Lock the camera in place (Seedance)"
520
+ },
521
+ "negative_prompt": {
522
+ "type": "string",
523
+ "description": "Content to steer away from. Veo only — Seedance ignores it (kept for when a Veo channel is available again)"
524
+ },
525
+ "seed": {
526
+ "type": "number",
527
+ "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
528
+ },
529
+ "person_generation": {
530
+ "type": "string",
531
+ "enum": [
532
+ "allow_all",
533
+ "dont_allow"
534
+ ],
535
+ "description": "Whether the model may render people (Veo). Omit to use the backend default."
536
+ },
537
+ "json_output": {
538
+ "type": "boolean",
539
+ "description": "Emit a JSON result ({ url }) instead of human-readable output"
540
+ }
541
+ },
542
+ "required": [
543
+ "prompt"
544
+ ]
545
+ },
546
+ "ui": {
547
+ "primary": [
548
+ "prompt",
549
+ "model",
550
+ "duration",
551
+ "ratio"
552
+ ],
553
+ "advanced": [
554
+ "resolution",
555
+ "first_frame",
556
+ "last_frame",
557
+ "reference",
558
+ "generate_audio",
559
+ "camera_fixed"
560
+ ],
561
+ "hidden": [
562
+ "json_output",
563
+ "seed",
564
+ "negative_prompt",
565
+ "person_generation"
566
+ ]
567
+ }
121
568
  },
122
569
  {
123
570
  "id": "gen-voice",
571
+ "toolName": "gen_voice",
124
572
  "tier": "atomic",
125
573
  "category": "asset",
126
574
  "title": "Text-to-Speech (Minimax)",
@@ -139,10 +587,55 @@
139
587
  "PRIV_TOKEN",
140
588
  "MM_API_BASE_URL",
141
589
  "AGENT_NAME"
142
- ]
590
+ ],
591
+ "parameters": {
592
+ "type": "object",
593
+ "properties": {
594
+ "text": {
595
+ "type": "string",
596
+ "description": "Text to synthesize (required)"
597
+ },
598
+ "voice_id": {
599
+ "type": "string",
600
+ "description": "Voice id. Default 'Chinese (Mandarin)_Male_Announcer'. When unsure, call with list_voices=true first to see what's available — do not invent ids."
601
+ },
602
+ "speed": {
603
+ "type": "number",
604
+ "description": "Speech rate, 0.5-2.0"
605
+ },
606
+ "list_voices": {
607
+ "type": "boolean",
608
+ "description": "List available voices and exit"
609
+ },
610
+ "local": {
611
+ "type": "boolean",
612
+ "description": "Used together with list_voices=true: print the voice-resolver fallback catalog with language tags (no remote /voice/page call). Output is one '<id>\\t<lang>\\t<name>' line per voice."
613
+ },
614
+ "json_output": {
615
+ "type": "boolean",
616
+ "description": "Emit a JSON result (url, audio_length_ms, subtitles)"
617
+ }
618
+ },
619
+ "required": []
620
+ },
621
+ "ui": {
622
+ "primary": [
623
+ "text",
624
+ "voice_id"
625
+ ],
626
+ "advanced": [
627
+ "speed"
628
+ ],
629
+ "hidden": [
630
+ "json_output",
631
+ "list_voices",
632
+ "local"
633
+ ]
634
+ }
143
635
  },
144
636
  {
145
637
  "id": "prepare-video-assets",
638
+ "toolName": "prepare_video_assets",
146
639
  "tier": "orchestration",
147
640
  "category": "authoring",
148
641
  "title": "Video Asset Preparation",
@@ -167,10 +660,63 @@
167
660
  "REMOTION_RENDER_MODE",
168
661
  "REMOTION_OUTPUT_DIR",
169
662
  "ASSET_CACHE_DIR"
170
- ]
663
+ ],
664
+ "parameters": {
665
+ "type": "object",
666
+ "properties": {
667
+ "dsl_json": {
668
+ "type": "string",
669
+ "description": "DSL JSON as an inline string (preferred — no disk write needed; required for multi-user concurrent flows). Pass the full DSL JSON, or — when a gen_script skeleton is cached in the session — a minimal JSON with only scenes[].audio.narration.text overrides (the agent layer merges narration onto the cached skeleton)."
670
+ },
671
+ "dsl": {
672
+ "type": "string",
673
+ "description": "DSL file path (legacy fallback; prefer dsl_json inline)."
674
+ },
675
+ "template_id": {
676
+ "type": "string",
677
+ "description": "Template id. When provided, the script invokes template-registry internally; no separate binding step is needed."
678
+ },
679
+ "binding_json": {
680
+ "type": "string",
681
+ "description": "TemplateBinding JSON as an inline string (alternative to template_id; no file needed)."
682
+ },
683
+ "binding": {
684
+ "type": "string",
685
+ "description": "TemplateBinding file path (optional; auto-generated when template_id is provided)."
686
+ },
687
+ "save_job": {
688
+ "type": "boolean",
689
+ "description": "Persist the RenderPlan to the database (default true). On success the stdout contains '📦 render job jobId: N'. Auto-degrades to false when PRIV_TOKEN is missing, falling back to file mode. Pass false to opt out explicitly."
690
+ },
691
+ "stub_image_url": {
692
+ "type": "string",
693
+ "description": "Test-mode image stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate / use a placeholder image / save credits' AND provides a concrete URL. With this set, every image+source=gen-image AssetRef is short-circuited to that URL with no gen-image call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
694
+ },
695
+ "stub_video_url": {
696
+ "type": "string",
697
+ "description": "Test-mode video stub URL (renderer-side short-circuit). Only pass when the user explicitly says things like 'just testing / don't actually generate the video / use a placeholder clip / save credits' AND provides a concrete URL. With this set, every video+source=gen-video AssetRef is short-circuited to that URL with no gen-video call. Do not pass otherwise; if the user expressed the intent without a URL, ask for one — do not invent one."
698
+ }
699
+ },
700
+ "required": []
701
+ },
702
+ "ui": {
703
+ "primary": [],
704
+ "advanced": [
705
+ "dsl_json",
706
+ "dsl",
707
+ "template_id",
708
+ "binding_json",
709
+ "binding",
710
+ "save_job",
711
+ "stub_image_url",
712
+ "stub_video_url"
713
+ ],
714
+ "hidden": []
715
+ }
171
716
  },
172
717
  {
173
718
  "id": "render-video",
719
+ "toolName": "render_video",
174
720
  "tier": "orchestration",
175
721
  "category": "authoring",
176
722
  "title": "Remotion Video Renderer",
@@ -195,10 +741,61 @@
195
741
  "REMOTION_RENDER_MODE",
196
742
  "REMOTION_OUTPUT_DIR",
197
743
  "ASSET_CACHE_DIR"
198
- ]
744
+ ],
745
+ "parameters": {
746
+ "type": "object",
747
+ "properties": {
748
+ "job_id": {
749
+ "type": "number",
750
+ "minimum": 1,
751
+ "description": "Render job id (positive integer, e.g. 8). This is the integer N parsed from prepare_video_assets's stdout line '📦 render job jobId: N' (also tolerated: legacy zh '📦 渲染任务 jobId: N'). Never pass 0, a placeholder string, or descriptive text."
752
+ },
753
+ "save_job": {
754
+ "type": "boolean",
755
+ "description": "Persist the render Manifest back to the database under the same jobId (default true). Auto-degrades to false when PRIV_TOKEN is missing. Pass false to opt out explicitly."
756
+ },
757
+ "upload_title": {
758
+ "type": "string",
759
+ "description": "Upload title for the resulting video file. Defaults to the local output filename."
760
+ },
761
+ "no_upload": {
762
+ "type": "boolean",
763
+ "description": "Skip the upload step. Only effective for local rendering; remote rendering uploads server-side."
764
+ },
765
+ "renderer": {
766
+ "type": "string",
767
+ "enum": [
768
+ "local",
769
+ "remote"
770
+ ],
771
+ "description": "Render mode: local runs the Remotion CLI on this host; remote calls the standalone remotion-renderer service. Defaults to REMOTION_RENDER_MODE."
772
+ },
773
+ "render_plan": {
774
+ "type": "string",
775
+ "description": "Existing RenderPlan file path. Local / single-user fallback used only when job_id is unavailable; prefer job_id."
776
+ }
777
+ },
778
+ "required": [
779
+ "job_id"
780
+ ]
781
+ },
782
+ "ui": {
783
+ "primary": [
784
+ "job_id"
785
+ ],
786
+ "advanced": [
787
+ "save_job",
788
+ "upload_title",
789
+ "no_upload",
790
+ "renderer",
791
+ "render_plan"
792
+ ],
793
+ "hidden": []
794
+ }
199
795
  },
200
796
  {
201
797
  "id": "template-registry",
798
+ "toolName": "template_registry",
202
799
  "tier": "orchestration",
203
800
  "category": "authoring",
204
801
  "title": "Video Template Registry",
@@ -216,10 +813,58 @@
216
813
  "VIDEO_TEMPLATE_REGISTRY_URL",
217
814
  "MM_API_BASE_URL",
218
815
  "VIDEO_TEMPLATE_REGISTRY_HTTP_METHOD"
219
- ]
816
+ ],
817
+ "parameters": {
818
+ "type": "object",
819
+ "properties": {
820
+ "list_templates": {
821
+ "type": "boolean",
822
+ "description": "List available templates (default behavior; also implied when other flags are passed)."
823
+ },
824
+ "list_examples": {
825
+ "type": "boolean",
826
+ "description": "List the *.dsl.json / *.binding.json reference examples shipped under template-registry/video_dsl/schema/examples/, grouped by templateId. Useful for downstream agents (e.g. a creation agent) that want to read a template's reference shape before producing new DSL."
827
+ },
828
+ "filter_tag": {
829
+ "type": "string",
830
+ "description": "Show only templates whose styleTags contain (or are contained in) this string. Case-insensitive. E.g. 'tech' / '科普' / 'walkthrough'."
831
+ },
832
+ "filter_aspect": {
833
+ "type": "string",
834
+ "description": "Show only templates that declare this aspect ratio. E.g. '9:16' / '16:9' / '1:1'."
835
+ },
836
+ "filter_language": {
837
+ "type": "string",
838
+ "description": "Show only templates whose contentLanguage includes this code ('zh' or 'en'). Templates with no declared language are always shown (treated as language-agnostic)."
839
+ },
840
+ "include_beta": {
841
+ "type": "boolean",
842
+ "description": "Also list templates with status='beta'. Default off (only 'stable' shows). The ENABLE_BETA_TEMPLATES env var has the same effect process-wide."
843
+ },
844
+ "json_output": {
845
+ "type": "boolean",
846
+ "description": "Emit a JSON result ({ templates: [...] } or { examples: [...] }) instead of the human-readable table."
847
+ }
848
+ },
849
+ "required": []
850
+ },
851
+ "ui": {
852
+ "primary": [],
853
+ "advanced": [
854
+ "list_templates",
855
+ "list_examples",
856
+ "filter_tag",
857
+ "filter_aspect",
858
+ "filter_language",
859
+ "include_beta",
860
+ "json_output"
861
+ ],
862
+ "hidden": []
863
+ }
220
864
  },
221
865
  {
222
866
  "id": "video-parser",
867
+ "toolName": "video_parser",
223
868
  "tier": "tool",
224
869
  "category": "consuming",
225
870
  "title": "Video Deconstruction",
@@ -238,10 +883,52 @@
238
883
  "RENDER_API_URL",
239
884
  "PRIV_TOKEN",
240
885
  "CONVERSATION_ID"
241
- ]
886
+ ],
887
+ "parameters": {
888
+ "type": "object",
889
+ "properties": {
890
+ "url": {
891
+ "type": "string",
892
+ "description": "Direct remote video URL (required). Share/page links are not supported."
893
+ },
894
+ "scene_threshold": {
895
+ "type": "number",
896
+ "description": "Scene-cut detection threshold 0.0-1.0 (default 0.3)"
897
+ },
898
+ "skip_asr": {
899
+ "type": "boolean",
900
+ "description": "Skip the ASR step"
901
+ },
902
+ "skip_keyframes": {
903
+ "type": "boolean",
904
+ "description": "Skip the keyframe-extraction step"
905
+ },
906
+ "json_output": {
907
+ "type": "boolean",
908
+ "description": "Pipeline mode — emit JSON only on stdout"
909
+ }
910
+ },
911
+ "required": [
912
+ "url"
913
+ ]
914
+ },
915
+ "ui": {
916
+ "primary": [
917
+ "url"
918
+ ],
919
+ "advanced": [
920
+ "scene_threshold",
921
+ "skip_asr",
922
+ "skip_keyframes"
923
+ ],
924
+ "hidden": [
925
+ "json_output"
926
+ ]
927
+ }
242
928
  },
243
929
  {
244
930
  "id": "web-record",
931
+ "toolName": "web_record",
245
932
  "tier": "tool",
246
933
  "category": "consuming",
247
934
  "title": "Web Page Recording",
@@ -266,10 +953,177 @@
266
953
  "PLAYWRIGHT_BROWSERS_PATH",
267
954
  "REMOTION_RENDER_API_URL",
268
955
  "PRIV_TOKEN"
269
- ]
956
+ ],
957
+ "parameters": {
958
+ "type": "object",
959
+ "properties": {
960
+ "url": {
961
+ "type": "string",
962
+ "description": "Target page URL (http/https). May be omitted only when a template or storyboard JSON supplies its own url."
963
+ },
964
+ "output": {
965
+ "type": "string",
966
+ "description": "Local output path, must end in .webm (default recording.webm)"
967
+ },
968
+ "browser": {
969
+ "type": "string",
970
+ "description": "chromium | firefox | webkit (default chromium; chromium recommended for recording)"
971
+ },
972
+ "device": {
973
+ "type": "string",
974
+ "description": "Device emulation name, e.g. 'iPhone 15 Pro'"
975
+ },
976
+ "viewport": {
977
+ "type": "string",
978
+ "description": "Viewport as 'width,height', e.g. '1280,720'"
979
+ },
980
+ "duration": {
981
+ "type": "number",
982
+ "description": "Fixed recording length in ms"
983
+ },
984
+ "stop_when_selector": {
985
+ "type": "string",
986
+ "description": "Stop recording once this CSS selector appears"
987
+ },
988
+ "stop_when_hidden": {
989
+ "type": "string",
990
+ "description": "Stop recording once this CSS selector disappears"
991
+ },
992
+ "max_duration": {
993
+ "type": "number",
994
+ "description": "Safety cap (ms) for condition-based stop modes (default 60000)"
995
+ },
996
+ "scroll_through": {
997
+ "type": "boolean",
998
+ "description": "Auto-scroll smoothly from top to bottom while recording"
999
+ },
1000
+ "scroll_step": {
1001
+ "type": "number",
1002
+ "description": "Pixels per scroll step (default 60)"
1003
+ },
1004
+ "scroll_interval": {
1005
+ "type": "number",
1006
+ "description": "Interval between scroll steps in ms (default 50)"
1007
+ },
1008
+ "scroll_pause_top": {
1009
+ "type": "number",
1010
+ "description": "Pause at the top before scrolling, ms (default 800)"
1011
+ },
1012
+ "scroll_pause_bottom": {
1013
+ "type": "number",
1014
+ "description": "Pause at the bottom after scrolling, ms (default 1200)"
1015
+ },
1016
+ "storyboard": {
1017
+ "type": "string",
1018
+ "description": "Path to a storyboard JSON file describing scenes (mutually exclusive with template)"
1019
+ },
1020
+ "template": {
1021
+ "type": "string",
1022
+ "description": "Template name under templates/ (e.g. github-repo-intro); combine with param (mutually exclusive with storyboard)"
1023
+ },
1024
+ "param": {
1025
+ "type": "array",
1026
+ "description": "Template params as 'key=value' strings; repeatable"
1027
+ },
1028
+ "list_templates": {
1029
+ "type": "boolean",
1030
+ "description": "List available templates and exit"
1031
+ },
1032
+ "wait_for_selector": {
1033
+ "type": "string",
1034
+ "description": "Wait for this CSS selector before recording"
1035
+ },
1036
+ "wait_for_timeout": {
1037
+ "type": "number",
1038
+ "description": "Fixed wait (ms) before recording"
1039
+ },
1040
+ "color_scheme": {
1041
+ "type": "string",
1042
+ "description": "light | dark | no-preference (emulate prefers-color-scheme)"
1043
+ },
1044
+ "user_agent": {
1045
+ "type": "string",
1046
+ "description": "Override User-Agent"
1047
+ },
1048
+ "timeout": {
1049
+ "type": "number",
1050
+ "description": "Playwright global action timeout in ms"
1051
+ },
1052
+ "ignore_https_errors": {
1053
+ "type": "boolean",
1054
+ "description": "Ignore HTTPS certificate errors"
1055
+ },
1056
+ "storage_state": {
1057
+ "type": "string",
1058
+ "description": "storageState JSON file path (logged-in recording)"
1059
+ },
1060
+ "cookies": {
1061
+ "type": "string",
1062
+ "description": "Playwright cookies JSON string or file (top-level array)"
1063
+ },
1064
+ "no_upload": {
1065
+ "type": "boolean",
1066
+ "description": "Skip VOD upload; keep only the local webm. By default the recording is transcoded to mp4, a cover frame is grabbed, uploaded to VOD, and a playable CDN URL is returned."
1067
+ },
1068
+ "vod_title": {
1069
+ "type": "string",
1070
+ "description": "Title for the uploaded VOD asset (defaults to the output file name)"
1071
+ },
1072
+ "cover_at_sec": {
1073
+ "type": "number",
1074
+ "description": "Cover frame timestamp in seconds (default 0.5)"
1075
+ },
1076
+ "keep_webm": {
1077
+ "type": "boolean",
1078
+ "description": "Keep the local webm after a successful upload (default: delete it since VOD holds the copy)"
1079
+ }
1080
+ },
1081
+ "required": [
1082
+ "url"
1083
+ ]
1084
+ },
1085
+ "ui": {
1086
+ "primary": [
1087
+ "url",
1088
+ "duration",
1089
+ "scroll_through"
1090
+ ],
1091
+ "advanced": [
1092
+ "device",
1093
+ "viewport",
1094
+ "max_duration",
1095
+ "stop_when_selector",
1096
+ "stop_when_hidden",
1097
+ "scroll_step",
1098
+ "scroll_interval",
1099
+ "scroll_pause_top",
1100
+ "scroll_pause_bottom",
1101
+ "color_scheme",
1102
+ "wait_for_selector",
1103
+ "wait_for_timeout",
1104
+ "vod_title",
1105
+ "cover_at_sec",
1106
+ "browser"
1107
+ ],
1108
+ "hidden": [
1109
+ "output",
1110
+ "storyboard",
1111
+ "template",
1112
+ "param",
1113
+ "list_templates",
1114
+ "user_agent",
1115
+ "timeout",
1116
+ "ignore_https_errors",
1117
+ "storage_state",
1118
+ "cookies",
1119
+ "no_upload",
1120
+ "keep_webm"
1121
+ ]
1122
+ }
270
1123
  },
271
1124
  {
272
1125
  "id": "web-screenshot",
1126
+ "toolName": "web_screenshot",
273
1127
  "tier": "tool",
274
1128
  "category": "consuming",
275
1129
  "title": "Web Page Screenshot",
@@ -292,7 +1146,88 @@
292
1146
  "WEB_CAPTURE_NO_SANDBOX",
293
1147
  "WEB_CAPTURE_ALLOW_PRIVATE_HOSTS",
294
1148
  "PLAYWRIGHT_BROWSERS_PATH"
295
- ]
1149
+ ],
1150
+ "parameters": {
1151
+ "type": "object",
1152
+ "properties": {
1153
+ "url": {
1154
+ "type": "string",
1155
+ "description": "Target page URL (http/https)"
1156
+ },
1157
+ "output": {
1158
+ "type": "string",
1159
+ "description": "Local output path, must be an image (*.png / *.jpg, default screenshot.png). For .webm video use the web_record tool."
1160
+ },
1161
+ "browser": {
1162
+ "type": "string",
1163
+ "description": "chromium | firefox | webkit (default chromium)"
1164
+ },
1165
+ "device": {
1166
+ "type": "string",
1167
+ "description": "Device emulation name, e.g. 'iPhone 15 Pro'"
1168
+ },
1169
+ "viewport": {
1170
+ "type": "string",
1171
+ "description": "Viewport as 'width,height', e.g. '1280,800'"
1172
+ },
1173
+ "full_page": {
1174
+ "type": "boolean",
1175
+ "description": "screenshot.py: capture the whole scrollable page"
1176
+ },
1177
+ "selector": {
1178
+ "type": "string",
1179
+ "description": "screenshot.py: capture only the element matching this CSS selector"
1180
+ },
1181
+ "clip": {
1182
+ "type": "string",
1183
+ "description": "screenshot.py: region clip 'x,y,w,h' (combined with selector = offset from element box)"
1184
+ },
1185
+ "wait_for_selector": {
1186
+ "type": "string",
1187
+ "description": "Wait for this CSS selector before acting"
1188
+ },
1189
+ "wait_for_timeout": {
1190
+ "type": "number",
1191
+ "description": "Fixed wait (ms) before acting"
1192
+ },
1193
+ "annotate": {
1194
+ "type": "string",
1195
+ "description": "screenshot.py: annotation JSON file or string (array or {annotations, settleMs})"
1196
+ },
1197
+ "storage_state": {
1198
+ "type": "string",
1199
+ "description": "storageState JSON file path (logged-in capture)"
1200
+ },
1201
+ "cookies": {
1202
+ "type": "string",
1203
+ "description": "Playwright cookies JSON string or file (top-level array)"
1204
+ }
1205
+ },
1206
+ "required": [
1207
+ "url"
1208
+ ]
1209
+ },
1210
+ "ui": {
1211
+ "primary": [
1212
+ "url",
1213
+ "full_page"
1214
+ ],
1215
+ "advanced": [
1216
+ "selector",
1217
+ "device",
1218
+ "viewport",
1219
+ "wait_for_selector",
1220
+ "wait_for_timeout",
1221
+ "browser",
1222
+ "clip",
1223
+ "annotate",
1224
+ "output"
1225
+ ],
1226
+ "hidden": [
1227
+ "storage_state",
1228
+ "cookies"
1229
+ ]
1230
+ }
296
1231
  }
297
1232
  ]
298
1233
  }