makaron-cli 0.14.0 → 0.14.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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Give Claude Code a creative agent. Pass complete creative requests and source media to Makaron Chat.",
5
5
  "author": {
6
6
  "name": "Versa AI",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Give Codex a creative agent. Pass complete creative requests and source media to Makaron Chat.",
5
5
  "author": {
6
6
  "name": "Versa AI",
package/README.md CHANGED
@@ -98,11 +98,12 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
98
98
  npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
99
99
  ```
100
100
 
101
- `chat` routes image and video models automatically, but you may select the Agent LLM with `--agent-model`. Accepted values are exactly `auto`, `gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.5`, and `deepseek-v4-pro`; `auto` currently resolves to `gpt-5.6-terra`. This flag changes only the reasoning/tool-calling Agent LLM. The CLI still rejects `--image-model`, `--video-model`, and the legacy `--model` flag before starting a chat run, so image/video model names cannot be mistaken for Agent models.
101
+ `chat` routes image and video models automatically, but you may select the Agent LLM with `--agent-model`. Accepted values are `auto`, the base model IDs (`gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.6`, `deepseek-v4-pro`), and the personal-plan routes (`gpt-5.6-terra-codex-subscription`, `gpt-5.6-sol-codex-subscription`, `gpt-5.6-luna-codex-subscription`). For the configured owner, `auto` resolves to GPT-5.6 Terra through the personal Codex plan. Base GPT-5.6 IDs select Azure API; the suffixed IDs select the personal plan explicitly. This flag changes only the reasoning/tool-calling Agent LLM.
102
102
 
103
103
  ```bash
104
104
  # Explicit lower-cost Agent LLM for a controlled comparison
105
105
  npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
106
+ npx makaron-cli chat --project auto --agent-model gpt-5.6-sol-codex-subscription --json -b "reply with the active model"
106
107
  ```
107
108
 
108
109
  Returns immediately:
@@ -368,18 +369,21 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
368
369
  # 2. Analyze a video (standalone, no timeline write)
369
370
  npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
370
371
 
371
- # 3a. Submit image-to-video rendering (images must be public URLs from step 1 or uploaded)
372
+ # 3a. Submit reference-to-video rendering (images must be public URLs from step 1 or uploaded)
372
373
  npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
373
374
  npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> slow cinematic push-in with native ambience" --image https://...jpg --duration 5 --video-model grok
375
+ npx makaron-cli video create --script "Keep both subjects recognizable as they enter the same studio" --image https://...jpg --image https://...webp --duration 5 --video-model grok --video-resolution 720p
374
376
  npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --video-model seedance-mini --video-resolution 480p --aspect 9:16
375
377
 
376
- # 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
378
+ # 3b. Native SeeDance, Wan 3.0, or MiniMax H3 text-to-video (no image required)
377
379
  npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
378
380
  npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
379
381
 
380
382
  # 3c. Edit a video from a local file or public URL
381
383
  npx makaron-cli video create --script "make it funny" --video input.mp4 --duration 5 --video-model seedance-fast
382
384
  npx makaron-cli video create --script "make it warmer and cinematic" --video https://example.com/input.mp4 --duration 5 --video-model seedance --video-resolution 1080p
385
+ npx makaron-cli video create --script "turn the light warm gold but preserve the action" --video input.mp4 --video-model grok --operation edit
386
+ npx makaron-cli video create --script "continue the camera move into the next beat" --video input.mp4 --video-model grok --operation extend --duration 4
383
387
 
384
388
  # 4. Check status
385
389
  npx makaron-cli video status <taskId>
@@ -391,11 +395,13 @@ For project/timeline video editing, use:
391
395
  npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
392
396
  ```
393
397
 
394
- Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
398
+ Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--voice <xai-preset-id>` (repeatable, Grok only), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); every Seedance image input is submitted through reference-to-video, including one image. `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests. Wan 3.0 Standard supports 480p/720p/1080p and Wan 3.0 Pro supports 1080p/2K/4K through MuleRouter. MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio feature references through Makaron Agent/chat; a single image keeps the `reference_image` role. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s. Grok generation uses `grok-imagine-video-1.5`: text-only generation supports 480p/720p/1080p, while any 1-7 image or preset voice input uses reference-to-video and is capped at 720p. Grok edit/extend uses `grok-imagine-video` internally under the same `grok` selector. Gemini Omni supports 3-10s fast image/video generation and editing with native generated audio; every image-only generation request uses `reference_to_video`, including a single image, with up to 6 images when no video reference is provided.
395
399
 
396
400
  Seedance 2.5: use `--video-model seedance-2.5` for 4-30 second output at 480p/720p. `--image` accepts local files or URLs (up to 30), while repeatable `--video` and `--audio` accept up to 10 each. Use `--video-operation generate|edit|extend`, `--extend-direction forward|backward`, `--output-format mp4|mov`, `--web-search`, `--generated-audio` / `--no-generated-audio`, and `--relaxed-content-filter`. Edit/extend require a video reference. The Evolink route does not currently expose 4K output.
397
401
 
398
- Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
402
+ Wan 3.0: use `--video-model wan-3.0` for MuleRouter Standard at 480p/720p/1080p, or `--video-model wan-3.0-pro` for MuleRouter Pro super-resolution at 1080p/2K/4K. Both support 2-30 second generation with up to 10 images, 5 videos, and 5 audio references. Use generation mode with feature references; typed edit/extend and `--relaxed-content-filter` are not supported.
403
+
404
+ Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. `--video-model grok --video --operation edit` accepts one MP4 up to 8.7s, retains duration/aspect, and caps output at 720p. `--operation extend` accepts one 2-15s MP4 and adds 2-10s (default 6s); the returned result includes the original plus extension.
399
405
 
400
406
  ### `music` — Music generation
401
407
 
@@ -511,7 +517,7 @@ send_message "All done!"
511
517
  - One project = one conversation thread. All history is preserved.
512
518
  - One active Agent Run at a time per project. A new message received while it is active is appended to that same Agent Run and processed at a durable work-unit boundary; it does not interrupt the execution or create a second owner for an in-progress Studio workflow.
513
519
  - Multi-image: `create --image a.jpg --image b.jpg` or `chat --image ref.jpg`.
514
- - Provider-generated videos can take 3-5 minutes; Grok is usually around 30-40 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
520
+ - Provider-generated videos can take 3-5 minutes; current Grok generation/edit probes are usually around 15-60 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
515
521
  - Music takes ~60 seconds. Appears in output when done.
516
522
  - Images are typically ready in 15-30 seconds.
517
523
  - stdout is always machine-readable JSON/text. Human-friendly logs go to stderr.
package/bin/makaron.mjs CHANGED
@@ -33,7 +33,10 @@ const CHAT_AGENT_MODELS = [
33
33
  'gpt-5.6-terra',
34
34
  'gpt-5.6-sol',
35
35
  'gpt-5.6-luna',
36
- 'grok-4.5',
36
+ 'gpt-5.6-terra-codex-subscription',
37
+ 'gpt-5.6-sol-codex-subscription',
38
+ 'gpt-5.6-luna-codex-subscription',
39
+ 'grok-4.6',
37
40
  'deepseek-v4-pro',
38
41
  ];
39
42
 
@@ -62,6 +65,8 @@ const SEEDANCE_MIN_VIDEO_ASPECT = 0.4;
62
65
  const SEEDANCE_MAX_VIDEO_ASPECT = 2.5;
63
66
  const MINIMAX_H3_MIN_VIDEO_SIDE = 256;
64
67
  const MINIMAX_H3_MAX_VIDEO_SIDE = 5760;
68
+ const MULEROUTER_WAN_MAX_VIDEO_SIDE = 4096;
69
+ const MULEROUTER_WAN_MAX_VIDEO_FILE_SIZE = 100 * 1024 * 1024;
65
70
 
66
71
  function warnLegacyModelFlag(replacement) {
67
72
  process.stderr.write(`⚠️ --model is deprecated here; use ${replacement}.\n`);
@@ -456,14 +461,16 @@ Options:
456
461
  --media-manifest <file|-> Import typed image/video media before this run.
457
462
  --skill <id|label|name> Use an installed skill or auto-install a matched marketplace skill.
458
463
  --agent-model <id> Agent LLM only: auto, gpt-5.6-terra, gpt-5.6-sol,
459
- gpt-5.6-luna, grok-4.5, or deepseek-v4-pro.
464
+ gpt-5.6-luna, grok-4.6, deepseek-v4-pro, or a
465
+ gpt-5.6-*-codex-subscription personal-plan route.
460
466
  --background, -b Submit and print a runId.
461
467
  --json Output structured JSON.
462
468
  --stream Legacy live SSE stream.
463
469
  --help, -h Show this help.
464
470
 
465
- Agent LLM defaults to auto (currently gpt-5.6-terra). Image/video model routing
466
- stays automatic in chat; --image-model, --video-model, and --model are rejected.
471
+ Agent LLM defaults to auto (GPT-5.6 Terra; the account owner uses the personal
472
+ Codex plan). Base GPT-5.6 ids select Azure API; append -codex-subscription to
473
+ select the personal plan explicitly. Image/video model routing stays automatic in chat.
467
474
 
468
475
  What you can ask:
469
476
  Image edit
@@ -495,6 +502,9 @@ What you can ask:
495
502
  Compare Agent LLMs with identical inputs
496
503
  makaron chat --project auto --agent-model deepseek-v4-pro -b --json "make a 20s badminton video"
497
504
 
505
+ Force the personal Codex plan
506
+ makaron chat --project auto --agent-model gpt-5.6-sol-codex-subscription -b --json "reply with the active model"
507
+
498
508
  Music
499
509
  makaron chat --project <id> "add calm piano background music"
500
510
 
@@ -2037,14 +2047,16 @@ Not sure which built-in skill to use? Start with:
2037
2047
  console.log('Usage: makaron analyze --video <file|url> ["question"]');
2038
2048
  } else if (topic === 'video') {
2039
2049
  if (subtopic === 'script') console.log('Usage: makaron video script --image <file> [--image <file>] [--lang en|zh] "direction"');
2040
- else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." [--image <url> ...] [--video <url> ...] [--audio <url> ...] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3] [--operation generate|edit|extend] [--video-resolution auto|480p|720p|768p|1080p|2k|4k] [--keep-original-sound]');
2050
+ else if (subtopic === 'create') console.log('Usage: makaron video create --script "..." [--image <url> ...] [--video <url> ...] [--audio <url> ...] [--voice <xai-preset-id> ...] [--duration 10] [--aspect 9:16] [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3] [--operation generate|edit|extend] [--video-resolution auto|480p|720p|768p|1080p|2k|4k] [--keep-original-sound]');
2041
2051
  else if (subtopic === 'status') console.log('Usage: makaron video status <taskId> | --snapshot <snapshotId> [--wait]');
2042
2052
  else console.log(`Video commands:
2043
2053
  video script --image <file> [--image <file>] "direction" Write video script
2044
2054
  video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
2055
+ video create --script "..." --video-model wan-3.0 Wan 3.0 Standard via MuleRouter
2056
+ video create --script "..." --video-model wan-3.0-pro Wan 3.0 Pro super-resolution via MuleRouter
2045
2057
  video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
2046
2058
  video create --script "..." --image <url> [--duration 10] Submit video task
2047
- video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|google-omni|minimax-h3] Edit/reference a video (Grok does not support video refs)
2059
+ video create --script "..." --video <file|url> --video-model grok [--operation edit|extend] Edit or extend one MP4 with Grok
2048
2060
  video create --script "Use the supplied audio" --video <url> --audio <url> --video-model sync-lipsync-v3 Lip-sync exact replacement audio
2049
2061
  video status <taskId> Check video status
2050
2062
  video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
@@ -2851,9 +2863,10 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2851
2863
  if (text) console.log(text);
2852
2864
 
2853
2865
  } else if (sub === 'create') {
2854
- const images = [];
2866
+ let images = [];
2855
2867
  const videos = [];
2856
2868
  const audios = [];
2869
+ const referenceVoices = [];
2857
2870
  let script = '', duration = undefined, aspectRatio = undefined, videoModel = undefined, videoResolution = undefined, wait = false;
2858
2871
  let keepOriginalSound = false, videoOperation = undefined, extendDirection = undefined, outputFormat = undefined;
2859
2872
  let generateAudio = undefined, contentFilter = undefined, webSearch = false;
@@ -2861,6 +2874,7 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2861
2874
  if (args[i] === '--image' && args[i + 1]) images.push(args[++i]);
2862
2875
  else if (args[i] === '--video' && args[i + 1]) videos.push(args[++i]);
2863
2876
  else if (args[i] === '--audio' && args[i + 1]) audios.push(args[++i]);
2877
+ else if (args[i] === '--voice' && args[i + 1]) referenceVoices.push(args[++i]);
2864
2878
  else if (args[i] === '--script' && args[i + 1]) script = args[++i];
2865
2879
  else if (args[i] === '--script-file' && args[i + 1]) script = fs.readFileSync(args[++i], 'utf-8');
2866
2880
  else if (args[i] === '--duration' && args[i + 1]) duration = Number(args[++i]);
@@ -2886,27 +2900,43 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2886
2900
  }
2887
2901
  else if (args[i] === '--wait') wait = true;
2888
2902
  }
2889
- const selectedVideoModel = videoModel || 'seedance-fast';
2903
+ const selectedVideoModel = ['wan3', 'wan3.0', 'wan30', 'wan-3'].includes(videoModel)
2904
+ ? 'wan-3.0'
2905
+ : ['wan3-pro', 'wan3.0-pro', 'wan30-pro', 'wan-3-pro', 'berry-1.0-pro'].includes(videoModel)
2906
+ ? 'wan-3.0-pro'
2907
+ : (videoModel || 'seedance-fast');
2890
2908
  const isSeedance25 = selectedVideoModel === 'seedance-2.5';
2909
+ const isWan30 = selectedVideoModel === 'wan-3.0' || selectedVideoModel === 'wan-3.0-pro';
2891
2910
  const isSeedanceModel = selectedVideoModel === 'seedance-fast' || selectedVideoModel === 'seedance-mini' || selectedVideoModel === 'seedance' || isSeedance25;
2892
2911
  const isMinimaxH3 = selectedVideoModel === 'minimax-h3';
2912
+ const isGrok = selectedVideoModel === 'grok';
2913
+ const isGoogleOmni = selectedVideoModel === 'google-omni';
2893
2914
  const isSyncLipsync = selectedVideoModel === 'sync-lipsync-v3';
2894
- const supportsNativeTextToVideo = isSeedanceModel || isMinimaxH3;
2895
- if (!script || (!images.length && !videos.length && !audios.length && !supportsNativeTextToVideo)) {
2896
- console.error('Usage: makaron video create --script "..." [--image <url>] [--video <file|url>] [--audio <file|url>] [--duration 30] [--video-model seedance-2.5|minimax-h3]');
2915
+ const supportsNativeTextToVideo = isSeedanceModel || isWan30 || isMinimaxH3 || isGrok || isGoogleOmni;
2916
+ if (!script || (!images.length && !videos.length && !audios.length && !referenceVoices.length && !supportsNativeTextToVideo)) {
2917
+ console.error('Usage: makaron video create --script "..." [--image <url>] [--video <file|url>] [--audio <file|url>] [--duration 30] [--video-model seedance-2.5|wan-3.0|wan-3.0-pro|minimax-h3]');
2897
2918
  process.exit(1);
2898
2919
  }
2899
2920
  if (isSeedance25 && images.length > 30) { console.error('Seedance 2.5 supports at most 30 image references.'); process.exit(1); }
2900
2921
  if (isSeedance25 && videos.length > 10) { console.error('Seedance 2.5 supports at most 10 video references.'); process.exit(1); }
2901
2922
  if (isSeedance25 && audios.length > 10) { console.error('Seedance 2.5 supports at most 10 audio references.'); process.exit(1); }
2923
+ if (isWan30 && images.length > 10) { console.error('Wan 3.0 supports at most 10 image references.'); process.exit(1); }
2924
+ if (isWan30 && videos.length > 5) { console.error('Wan 3.0 supports at most 5 video references.'); process.exit(1); }
2925
+ if (isWan30 && audios.length > 5) { console.error('Wan 3.0 supports at most 5 audio references.'); process.exit(1); }
2902
2926
  if (isMinimaxH3 && images.length > 9) { console.error('MiniMax H3 supports at most 9 image references.'); process.exit(1); }
2903
2927
  if (isMinimaxH3 && videos.length > 3) { console.error('MiniMax H3 supports at most 3 video references.'); process.exit(1); }
2904
2928
  if (isMinimaxH3 && audios.length > 3) { console.error('MiniMax H3 supports at most 3 audio references.'); process.exit(1); }
2929
+ if (isGrok && images.length > 7) { console.error('Grok Imagine Video 1.5 supports at most 7 image references.'); process.exit(1); }
2930
+ if (isGrok && videos.length > 1) { console.error('Grok video edit/extend accepts exactly one source video.'); process.exit(1); }
2931
+ if (isGrok && referenceVoices.length > 3) { console.error('Grok Imagine Video 1.5 supports at most 3 preset voices.'); process.exit(1); }
2932
+ if (!isGrok && referenceVoices.length) { console.error('--voice is currently supported only with --video-model grok.'); process.exit(1); }
2905
2933
  if (isSyncLipsync && (images.length !== 0 || videos.length !== 1 || audios.length !== 1)) { console.error('Sync Lipsync v3 requires exactly one --video and one --audio, with no --image.'); process.exit(1); }
2906
2934
  if (isSyncLipsync && !/<<<audio_1>>>/i.test(script)) {
2907
2935
  script += '\nUse <<<audio_1>>> as the exact replacement soundtrack.';
2908
2936
  }
2909
2937
  if (videoOperation && !['generate', 'edit', 'extend'].includes(videoOperation)) { console.error('--video-operation must be generate, edit, or extend.'); process.exit(1); }
2938
+ if (isWan30 && videoOperation && videoOperation !== 'generate') { console.error('Wan 3.0 supports generation with feature references, not typed edit or extend.'); process.exit(1); }
2939
+ if (!isSeedance25 && contentFilter === false) { console.error('--relaxed-content-filter is only supported with --video-model seedance-2.5.'); process.exit(1); }
2910
2940
  if (extendDirection && !['forward', 'backward'].includes(extendDirection)) { console.error('--extend-direction must be forward or backward.'); process.exit(1); }
2911
2941
  if (outputFormat && !['mp4', 'mov'].includes(outputFormat)) { console.error('--output-format must be mp4 or mov.'); process.exit(1); }
2912
2942
 
@@ -2915,9 +2945,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2915
2945
  process.exit(1);
2916
2946
  }
2917
2947
 
2948
+ const inferredOperation = videoOperation || ((isSeedance25 || isGrok) && videos.length ? 'edit' : 'generate');
2918
2949
  let providerMaxDuration = isSeedance25 ? SEEDANCE25_MAX_VIDEO_REFERENCE_DURATION : MAX_VIDEO_PROVIDER_REFERENCE_DURATION;
2950
+ if (isGrok) providerMaxDuration = inferredOperation === 'edit' ? 8.7 : 15;
2919
2951
  if (isSyncLipsync) providerMaxDuration = 60;
2920
- const providerMaxPixels = isSyncLipsync || isMinimaxH3 ? Infinity : isSeedance25 ? SEEDANCE25_MAX_VIDEO_FRAME_PIXELS : MAX_VIDEO_FRAME_PIXELS;
2952
+ const providerMaxPixels = isSyncLipsync || isMinimaxH3 || isWan30 ? Infinity : isSeedance25 ? SEEDANCE25_MAX_VIDEO_FRAME_PIXELS : MAX_VIDEO_FRAME_PIXELS;
2921
2953
  const localImages = images.filter(image => !isHttpUrl(image));
2922
2954
  if (localImages.length) {
2923
2955
  const uploadedImages = await uploadImageFilesViaSignedUrl(baseUrl, headers, undefined, localImages);
@@ -2932,13 +2964,21 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2932
2964
  maxDuration: providerMaxDuration,
2933
2965
  durationTolerance: MAX_VIDEO_PROVIDER_REFERENCE_DURATION_TOLERANCE,
2934
2966
  maxFramePixels: providerMaxPixels,
2935
- maxFileSize: isSeedance25 || isSyncLipsync ? 200 * 1024 * 1024 : MAX_VIDEO_UPLOAD_FILE_SIZE,
2936
- ...(selectedVideoModel === 'minimax-h3' ? {
2967
+ maxFileSize: isWan30 ? MULEROUTER_WAN_MAX_VIDEO_FILE_SIZE : isSeedance25 || isSyncLipsync ? 200 * 1024 * 1024 : MAX_VIDEO_UPLOAD_FILE_SIZE,
2968
+ ...(isGrok ? {
2969
+ allowedExtensions: ['mp4'],
2970
+ } : selectedVideoModel === 'minimax-h3' ? {
2937
2971
  allowedExtensions: ['mp4', 'mov'],
2938
2972
  minSide: MINIMAX_H3_MIN_VIDEO_SIDE,
2939
2973
  maxSide: MINIMAX_H3_MAX_VIDEO_SIDE,
2940
2974
  minAspect: SEEDANCE_MIN_VIDEO_ASPECT,
2941
2975
  maxAspect: SEEDANCE_MAX_VIDEO_ASPECT,
2976
+ } : isWan30 ? {
2977
+ minSide: 240,
2978
+ maxSide: MULEROUTER_WAN_MAX_VIDEO_SIDE,
2979
+ minAspect: 0.125,
2980
+ maxAspect: 8,
2981
+ allowedExtensions: ['mp4', 'mov'],
2942
2982
  } : isSeedanceModel ? {
2943
2983
  minFramePixels: SEEDANCE_MIN_VIDEO_FRAME_PIXELS,
2944
2984
  minSide: SEEDANCE_MIN_VIDEO_SIDE,
@@ -2967,21 +3007,22 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
2967
3007
  }
2968
3008
  // Standalone MCP tool (no project timeline write)
2969
3009
  process.stderr.write('🎬 Submitting video...\n');
2970
- const resolvedOperation = videoOperation || (isSeedance25 && videoUrls.length ? 'edit' : 'generate');
3010
+ const resolvedOperation = inferredOperation;
2971
3011
  const vArgs = isSyncLipsync
2972
3012
  ? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution }
2973
- : isSeedance25
2974
- ? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution, operation: resolvedOperation, extendDirection, outputFormat, generateAudio, contentFilter, webSearch }
3013
+ : isSeedance25 || isWan30 || isGrok
3014
+ ? { script, images, videoUrls, audioUrls, referenceVoiceIds: referenceVoices, videoModel: selectedVideoModel, videoResolution, operation: resolvedOperation, extendDirection, outputFormat, generateAudio, contentFilter, webSearch }
2975
3015
  : isMinimaxH3
2976
3016
  ? { script, images, videoUrls, audioUrls, videoModel: selectedVideoModel, videoResolution }
2977
3017
  : videoUrls[0]
2978
3018
  ? { videoUrl: videoUrls[0], editPrompt: script, images, videoModel: selectedVideoModel, videoResolution, referType: isSeedanceModel ? 'feature' : 'base' }
2979
3019
  : { script, images, videoModel: selectedVideoModel, videoResolution };
3020
+ if (inputVideoMeta?.duration) vArgs.referenceVideoDuration = inputVideoMeta.duration;
2980
3021
  const effectiveDuration = resolvedOperation === 'edit' ? undefined : duration || (inputVideoMeta?.duration ? Math.min(providerMaxDuration, Math.round(inputVideoMeta.duration)) : undefined);
2981
3022
  if (effectiveDuration) vArgs.duration = effectiveDuration;
2982
3023
  if (aspectRatio) vArgs.aspectRatio = aspectRatio;
2983
3024
  if (keepOriginalSound && videoUrls.length && !isSeedance25) vArgs.keepOriginalSound = true;
2984
- const result = await callMcpTool(baseUrl, headers, videoUrls.length && !isSeedance25 && !isMinimaxH3 && !isSyncLipsync ? 'makaron_edit_video' : 'makaron_create_video', vArgs);
3025
+ const result = await callMcpTool(baseUrl, headers, videoUrls.length && !isSeedance25 && !isWan30 && !isGrok && !isMinimaxH3 && !isSyncLipsync ? 'makaron_edit_video' : 'makaron_create_video', vArgs);
2985
3026
  const text = result?.content?.find(c => c.type === 'text')?.text;
2986
3027
  if (text) {
2987
3028
  console.log(text);
@@ -3025,9 +3066,11 @@ if (!command || command === '--help' || command === '-h' || command === 'help')
3025
3066
  console.log(`Video commands:
3026
3067
  video script --image <file> [--image <file>] "direction" Write video script
3027
3068
  video create --script "..." --video-model seedance-fast Native text-to-video (no image required)
3069
+ video create --script "..." --video-model wan-3.0 Wan 3.0 Standard via MuleRouter
3070
+ video create --script "..." --video-model wan-3.0-pro Wan 3.0 Pro super-resolution via MuleRouter
3028
3071
  video create --script "..." --video-model minimax-h3 MiniMax H3 text-to-video (default 768P)
3029
3072
  video create --script "..." --image <url> [--duration 10] Submit video task
3030
- video create --script "..." --video <public-url> [--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|google-omni|minimax-h3] Edit/reference a video (Grok does not support video refs)
3073
+ video create --script "..." --video <file|url> --video-model grok [--operation edit|extend] Edit or extend one MP4 with Grok
3031
3074
  video create --script "Use the supplied audio" --video <url> --audio <url> --video-model sync-lipsync-v3 Lip-sync exact replacement audio
3032
3075
  video status <taskId> Check video status
3033
3076
  video status --snapshot <snapshotId> [--wait] Check v2 video snapshot
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "makaron-cli",
3
- "version": "0.14.0",
3
+ "version": "0.14.2",
4
4
  "description": "Talk to Makaron Agent from the terminal — create projects, edit images, generate videos",
5
5
  "type": "module",
6
6
  "scripts": {
@@ -70,6 +70,11 @@ npx makaron-cli responses get $RUN_ID --wait --json
70
70
 
71
71
  Use `chat` for all creative tasks. Makaron Agent decides how to execute — it can edit images, generate videos, compose music, and create designs in a single conversation.
72
72
 
73
+ For clearly adult, erotic, or NSFW requests, read `references/nsfw.md`
74
+ ([public copy](https://www.makaron.app/.well-known/agent-skills/makaron/references/nsfw.md))
75
+ before submitting the job. It adds per-job routing exceptions only; do not load
76
+ or apply it to ordinary SFW work.
77
+
73
78
  ```bash
74
79
  npx makaron-cli chat --help
75
80
  ```
@@ -85,10 +90,11 @@ npx makaron-cli chat --project auto --image photo.jpg --json -b "make it cinemat
85
90
  npx makaron-cli chat --project auto --image img1.jpg --image img2.jpg --json -b "combine these"
86
91
  ```
87
92
 
88
- `chat` routes image and video models automatically. Use `--agent-model` only when the user explicitly asks to select or compare the reasoning/tool-calling Agent LLM. Accepted values are exactly `auto`, `gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.5`, and `deepseek-v4-pro`; `auto` currently resolves to `gpt-5.6-terra`. Never put an image or video model ID in `--agent-model`. The CLI rejects unknown Agent IDs plus `--image-model`, `--video-model`, and legacy `--model` before starting a chat run.
93
+ `chat` routes image and video models automatically. Use `--agent-model` only when the user explicitly asks to select or compare the reasoning/tool-calling Agent LLM. Accepted values are `auto`, the base model IDs (`gpt-5.6-terra`, `gpt-5.6-sol`, `gpt-5.6-luna`, `grok-4.6`, `deepseek-v4-pro`), and the personal-plan routes (`gpt-5.6-terra-codex-subscription`, `gpt-5.6-sol-codex-subscription`, `gpt-5.6-luna-codex-subscription`). For the configured owner, `auto` uses GPT-5.6 Terra through the personal Codex plan; base GPT-5.6 IDs select Azure API, while suffixed IDs explicitly select the personal plan. Never put an image or video model ID in `--agent-model`.
89
94
 
90
95
  ```bash
91
96
  npx makaron-cli chat --project auto --agent-model deepseek-v4-pro --json -b "make a 20s badminton video"
97
+ npx makaron-cli chat --project auto --agent-model gpt-5.6-sol-codex-subscription --json -b "reply with the active model"
92
98
  ```
93
99
 
94
100
  Returns immediately:
@@ -309,11 +315,11 @@ npx makaron-cli video script --image img1.jpg "cinematic story"
309
315
  # 2. Analyze a video (standalone, no timeline write)
310
316
  npx makaron-cli analyze --video input.mp4 "describe the key actions and pacing"
311
317
 
312
- # 3a. Submit image-to-video rendering (images must be public URLs from step 1 or uploaded)
318
+ # 3a. Submit reference-to-video rendering (images must be public URLs from step 1 or uploaded)
313
319
  npx makaron-cli video create --script "Shot 1 (5s): <<<image_1>>> ..." --image https://...jpg --duration 5 --video-model kling
314
320
  npx makaron-cli video create --script "Shot 1 (15s): <<<image_1>>> and <<<image_2>>> build a neon one-person studio" --image https://...jpg --image https://...webp --duration 15 --video-model seedance-mini --video-resolution 480p --aspect 9:16
315
321
 
316
- # 3b. Native SeeDance or MiniMax H3 text-to-video (no image required)
322
+ # 3b. Native SeeDance, Wan 3.0, or MiniMax H3 text-to-video (no image required)
317
323
  npx makaron-cli video create --script "Shot 1 (5s): A neon one-person studio wakes at dawn" --duration 5 --video-model seedance-fast --aspect 16:9
318
324
  npx makaron-cli video create --script "Shot 1 (15s): A premium creative editor comes alive" --duration 15 --video-model minimax-h3 --aspect 16:9
319
325
 
@@ -331,11 +337,15 @@ npx makaron-cli video status <taskId>
331
337
  npx makaron-cli chat --project <id|auto> --video input.mp4 -b "make it funny"
332
338
  ```
333
339
 
334
- Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests; MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio references through Makaron Agent/chat. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s; Grok 1.5 supports 1-15s single-image-to-video only; Gemini Omni supports 3-10s fast 720p image/video generation and editing with native generated audio, including up to 6 image references when no video reference is provided. For `--video-model grok`, forced `--aspect` is ignored to avoid xAI stretching the source image; pad/create the image at the target shape first or use another model.
340
+ Options for `video create`: `--script "..."`, `--script-file <path>`, `--image <url>` (repeatable, up to the selected model limit), `--video <file|url>` and `--audio <file|url>` (repeatable where supported), `--voice <xai-preset-id>` (repeatable, Grok only), `--duration <seconds>`, `--aspect 9:16|16:9|1:1`, `--video-model seedance-fast|seedance-mini|seedance|seedance-2.5|wan-3.0|wan-3.0-pro|kling|grok|google-omni|minimax-h3|sync-lipsync-v3`, `--video-resolution auto|480p|720p|768p|1080p|2k|4k`. Default model is `seedance-fast`. SeeDance accepts native text-to-video with no image and integer output duration 4-15s (default 5s); every Seedance image input uses reference-to-video, including one image. `seedance-mini` supports 480p/720p and is best for cheaper drafts/multi-size tests. Wan 3.0 Standard supports 480p/720p/1080p and Wan 3.0 Pro supports 1080p/2K/4K through MuleRouter. MiniMax H3 accepts native text-to-video, 4-15s output, public 768p/2k resolution, and up to 9 image, up to 3 video, and up to 3 audio feature references through Makaron Agent/chat; a single image keeps the `reference_image` role. `sync-lipsync-v3` requires exactly one video plus one MP3/WAV and preserves that replacement audio while aligning the mouth. H3 defaults to 768p; request 2k explicitly for maximum/final quality. Kling supports 5-15s. Grok text-only generation supports 480p/720p/1080p; any 1-7 image or preset voice input uses reference-to-video and is capped at 720p. Grok edit/extend uses `grok-imagine-video` internally. Gemini Omni image-only generation always uses `reference_to_video`, including one image, with up to 6 images when no video reference is provided.
341
+
342
+ Provider integration contract: every image passed to video generation is a feature reference by default, even when there is exactly one image. Never infer image-to-video/first-frame mode from image count. A first-frame workflow may be added only as a separately declared model capability and an explicit caller request.
335
343
 
336
344
  Seedance 2.5 uses `--video-model seedance-2.5` and supports 4-30s at 480p/720p, up to 30 images + 10 videos + 10 audios, repeatable local/URL references, `--video-operation generate|edit|extend`, `--extend-direction`, `--output-format mp4|mov`, and `--web-search`. The Evolink route does not currently expose 4K output.
337
345
 
338
- Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. Output duration is clamped to 3-10s. Grok does not support video references.
346
+ Wan 3.0 uses `--video-model wan-3.0` for MuleRouter Standard at 480p/720p/1080p, or `--video-model wan-3.0-pro` for MuleRouter Pro super-resolution at 1080p/2K/4K. Both support 2-30s generation, up to 10 images + 5 videos + 5 audios, and native audio. Use generation mode with feature references; typed edit/extend and the relaxed content-filter flag are not supported.
347
+
348
+ Video edit model behavior: `--video-model kling --video` uses Kling base/direct edit internally; `--video-model seedance-fast --video`, `--video-model seedance-mini --video`, or `--video-model seedance --video` uses the SeeDance video-reference path and requires target <=15s, <=50MB, width/height 300-6000px, aspect ratio 0.4-2.5, and frame pixels 409,600-2,086,876. `--video-model minimax-h3 --video` uses H3 feature/reference mode: up to 3 video references totaling <=15s, each <=50MB with width/height 256-5760px and aspect ratio 0.4-2.5. `--video-model google-omni --video` uses Gemini Omni direct video editing and accepts one reference video in Makaron. `--video-model grok --video --operation edit` accepts one MP4 up to 8.7s and caps output at 720p; `--operation extend` accepts one 2-15s MP4 and adds 2-10s.
339
349
 
340
350
  ### `music` — Music generation
341
351
 
@@ -469,7 +479,7 @@ send_message "All done!"
469
479
  - One project = one conversation thread. All history is preserved.
470
480
  - One active Agent Run at a time per project. A new message received while it is active is appended to that same Agent Run and processed at a durable work-unit boundary; it does not interrupt the execution or create a second owner for an in-progress Studio workflow.
471
481
  - Multi-image: `create --image a.jpg --image b.jpg` or `chat --image ref.jpg`.
472
- - Provider-generated videos can take 3-5 minutes; Grok is usually around 30-40 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
482
+ - Provider-generated videos can take 3-5 minutes; current Grok generation/edit probes are usually around 15-60 seconds; Gemini Omni is usually around 30-70 seconds plus Storage handoff. Remotion compositions should be converted with `materialize` / `responses get --materialize`, and timing should be read from `duration_seconds`, `render_seconds`, and `realtime_ratio`.
473
483
  - Music takes ~60 seconds. Appears in output when done.
474
484
  - Images are typically ready in 15-30 seconds.
475
485
  - stdout is always machine-readable JSON/text. Human-friendly logs go to stderr.
@@ -0,0 +1,44 @@
1
+ # Adult and NSFW routing
2
+
3
+ Read this reference only when the current request is clearly adult, erotic, or
4
+ NSFW. It supplements the official Makaron workflow; it does not change the
5
+ default route for SFW work.
6
+
7
+ If adult intent is ambiguous, ask one short question before choosing this lane.
8
+
9
+ ## Route the job
10
+
11
+ | Adult request | Route |
12
+ |---|---|
13
+ | Agent-driven work or a persistent Makaron project | `makaron chat` with Agent model `grok-4.6` |
14
+ | Standalone image generation or editing | `makaron edit` with image model `qwen` |
15
+ | Standalone video generation | `makaron video create` with video model `wan-3.0` |
16
+
17
+ For project-based work, keep the complete request in one `chat` job. Because
18
+ `chat` accepts only the Agent-model flag, put the image/video preferences in the
19
+ brief:
20
+
21
+ ```bash
22
+ npx makaron-cli chat --project <id|auto> --agent-model grok-4.6 --json \
23
+ -b "<complete adult request; use qwen for still images and wan-3.0 for video>"
24
+ ```
25
+
26
+ For explicit raw-tool work without a project timeline:
27
+
28
+ ```bash
29
+ npx makaron-cli edit --image-model qwen --image <file-or-url> --out <path> "<prompt>"
30
+ npx makaron-cli video create --video-model wan-3.0 --script "<shot script>" --duration <seconds>
31
+ ```
32
+
33
+ ## Keep the exception scoped
34
+
35
+ - Do not force SFW jobs onto Grok, Qwen, or Wan 3.0.
36
+ - Never put `qwen` or `wan-3.0` in `--agent-model`.
37
+ - Do not pass `--image-model` or `--video-model` to `makaron chat`; it rejects
38
+ those flags. State those preferences in the chat brief or use the standalone
39
+ commands.
40
+ - Keep this routing for adult follow-ups and rerolls in the same job.
41
+ - Use `wan-3.0-pro` only when the user explicitly asks for Pro,
42
+ super-resolution, 2K, or 4K output.
43
+ - If a selected provider rejects the request, surface the rejection. Do not
44
+ silently remove the adult intent or switch to an unspecified model.