@remixmate/cli 0.9.16 → 0.9.17

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.
@@ -6,30 +6,86 @@
6
6
  "title": "AI Video Generation",
7
7
  "description": "AI video generation: produce a short video clip from a text prompt. Supports Seedance and Veo models, plus first/last frame and reference images.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "AGENT_NAME", "MM_VIDEO_MODEL"],
10
- "entry": { "type": "http", "handler": "gen-video" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "AGENT_NAME",
14
+ "MM_VIDEO_MODEL"
15
+ ],
16
+ "entry": {
17
+ "type": "http",
18
+ "handler": "gen-video"
19
+ },
11
20
  "parameters": {
12
21
  "type": "object",
13
22
  "properties": {
14
- "prompt": { "type": "string", "description": "Video description" },
15
- "model": { "type": "string", "description": "Model: 'seedance' (default; 4-12s, adaptive/21:9 ratios, fixed camera), 'veo' (4/6/8s, native audio, up to 4k, reference images), or 'veo-fast' (faster Veo variant for iteration)" },
16
- "duration": { "type": "number", "description": "Duration in seconds" },
17
- "ratio": { "type": "string", "description": "Aspect ratio" },
18
- "resolution": { "type": "string", "description": "Resolution" },
19
- "first_frame": { "type": "string", "description": "First-frame image path or URL" },
20
- "last_frame": { "type": "string", "description": "Last-frame image path or URL" },
23
+ "prompt": {
24
+ "type": "string",
25
+ "description": "Video description"
26
+ },
27
+ "model": {
28
+ "type": "string",
29
+ "description": "Model: 'seedance' (default; 4-12s, adaptive/21:9 ratios, fixed camera), 'veo' (4/6/8s, native audio, up to 4k, reference images), or 'veo-fast' (faster Veo variant for iteration)"
30
+ },
31
+ "duration": {
32
+ "type": "number",
33
+ "description": "Duration in seconds"
34
+ },
35
+ "ratio": {
36
+ "type": "string",
37
+ "description": "Aspect ratio"
38
+ },
39
+ "resolution": {
40
+ "type": "string",
41
+ "description": "Resolution"
42
+ },
43
+ "first_frame": {
44
+ "type": "string",
45
+ "description": "First-frame image path or URL"
46
+ },
47
+ "last_frame": {
48
+ "type": "string",
49
+ "description": "Last-frame image path or URL"
50
+ },
21
51
  "reference": {
22
52
  "type": "array",
23
- "items": { "type": "string" },
53
+ "items": {
54
+ "type": "string"
55
+ },
24
56
  "description": "Reference images: local file path, https URL, or data URI. Veo only, max 3 — Seedance rejects them, use first_frame / last_frame instead."
25
57
  },
26
- "generate_audio": { "type": "boolean", "description": "Generate native audio" },
27
- "camera_fixed": { "type": "boolean", "description": "Lock the camera in place (Seedance)" },
28
- "negative_prompt": { "type": "string", "description": "Content to steer away from (Veo)" },
29
- "seed": { "type": "number", "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible." },
30
- "person_generation": { "type": "string", "enum": ["allow_all", "dont_allow"], "description": "Whether the model may render people (Veo). Omit to use the backend default." },
31
- "json_output": { "type": "boolean", "description": "Emit a JSON result ({ url }) instead of human-readable output" }
58
+ "generate_audio": {
59
+ "type": "boolean",
60
+ "description": "Generate native audio"
61
+ },
62
+ "camera_fixed": {
63
+ "type": "boolean",
64
+ "description": "Lock the camera in place (Seedance)"
65
+ },
66
+ "negative_prompt": {
67
+ "type": "string",
68
+ "description": "Content to steer away from (Veo)"
69
+ },
70
+ "seed": {
71
+ "type": "number",
72
+ "description": "Random seed. Pass the same seed with the same prompt and model to make a run reproducible."
73
+ },
74
+ "person_generation": {
75
+ "type": "string",
76
+ "enum": [
77
+ "allow_all",
78
+ "dont_allow"
79
+ ],
80
+ "description": "Whether the model may render people (Veo). Omit to use the backend default."
81
+ },
82
+ "json_output": {
83
+ "type": "boolean",
84
+ "description": "Emit a JSON result ({ url }) instead of human-readable output"
85
+ }
32
86
  },
33
- "required": ["prompt"]
87
+ "required": [
88
+ "prompt"
89
+ ]
34
90
  }
35
91
  }
@@ -6,17 +6,43 @@
6
6
  "title": "Text-to-Speech (Minimax)",
7
7
  "description": "Text-to-speech (TTS): synthesize narration audio from text via the Minimax TTS model. Returns the persisted audio URL — no download needed.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "AGENT_NAME"],
10
- "entry": { "type": "http", "handler": "gen-voice" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "AGENT_NAME"
14
+ ],
15
+ "entry": {
16
+ "type": "http",
17
+ "handler": "gen-voice"
18
+ },
11
19
  "parameters": {
12
20
  "type": "object",
13
21
  "properties": {
14
- "text": { "type": "string", "description": "Text to synthesize (required)" },
15
- "voice_id": { "type": "string", "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." },
16
- "speed": { "type": "number", "description": "Speech rate, 0.5-2.0" },
17
- "list_voices": { "type": "boolean", "description": "List available voices and exit" },
18
- "local": { "type": "boolean", "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." },
19
- "json_output": { "type": "boolean", "description": "Emit a JSON result (url, audio_length_ms, subtitles)" }
22
+ "text": {
23
+ "type": "string",
24
+ "description": "Text to synthesize (required)"
25
+ },
26
+ "voice_id": {
27
+ "type": "string",
28
+ "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."
29
+ },
30
+ "speed": {
31
+ "type": "number",
32
+ "description": "Speech rate, 0.5-2.0"
33
+ },
34
+ "list_voices": {
35
+ "type": "boolean",
36
+ "description": "List available voices and exit"
37
+ },
38
+ "local": {
39
+ "type": "boolean",
40
+ "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."
41
+ },
42
+ "json_output": {
43
+ "type": "boolean",
44
+ "description": "Emit a JSON result (url, audio_length_ms, subtitles)"
45
+ }
20
46
  },
21
47
  "required": []
22
48
  }
@@ -6,19 +6,53 @@
6
6
  "title": "Video Asset Preparation",
7
7
  "description": "Resolves and generates every asset (image / audio / video) referenced by a Video DSL, persists a RenderPlan to the database, and returns a job_id for the subsequent render_video call. This is Phase 1 of the two-phase video pipeline; Phase 3 (Remotion render) lives in render_video.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "MM_BACKEND_API_URL", "AGENT_NAME", "REMOTION_RENDER_API_URL", "REMOTION_RENDER_MODE", "REMOTION_OUTPUT_DIR", "ASSET_CACHE_DIR"],
9
+ "createsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "MM_BACKEND_API_URL",
14
+ "AGENT_NAME",
15
+ "REMOTION_RENDER_API_URL",
16
+ "REMOTION_RENDER_MODE",
17
+ "REMOTION_OUTPUT_DIR",
18
+ "ASSET_CACHE_DIR"
19
+ ],
10
20
  "scriptPath": "scripts/prepare_video_assets.py",
11
21
  "parameters": {
12
22
  "type": "object",
13
23
  "properties": {
14
- "dsl_json": { "type": "string", "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)." },
15
- "dsl": { "type": "string", "description": "DSL file path (legacy fallback; prefer dsl_json inline)." },
16
- "template_id": { "type": "string", "description": "Template id. When provided, the script invokes template-registry internally; no separate binding step is needed." },
17
- "binding_json": { "type": "string", "description": "TemplateBinding JSON as an inline string (alternative to template_id; no file needed)." },
18
- "binding": { "type": "string", "description": "TemplateBinding file path (optional; auto-generated when template_id is provided)." },
19
- "save_job": { "type": "boolean", "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." },
20
- "stub_image_url": { "type": "string", "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." },
21
- "stub_video_url": { "type": "string", "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." }
24
+ "dsl_json": {
25
+ "type": "string",
26
+ "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)."
27
+ },
28
+ "dsl": {
29
+ "type": "string",
30
+ "description": "DSL file path (legacy fallback; prefer dsl_json inline)."
31
+ },
32
+ "template_id": {
33
+ "type": "string",
34
+ "description": "Template id. When provided, the script invokes template-registry internally; no separate binding step is needed."
35
+ },
36
+ "binding_json": {
37
+ "type": "string",
38
+ "description": "TemplateBinding JSON as an inline string (alternative to template_id; no file needed)."
39
+ },
40
+ "binding": {
41
+ "type": "string",
42
+ "description": "TemplateBinding file path (optional; auto-generated when template_id is provided)."
43
+ },
44
+ "save_job": {
45
+ "type": "boolean",
46
+ "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."
47
+ },
48
+ "stub_image_url": {
49
+ "type": "string",
50
+ "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."
51
+ },
52
+ "stub_video_url": {
53
+ "type": "string",
54
+ "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."
55
+ }
22
56
  },
23
57
  "required": []
24
58
  }
@@ -6,18 +6,53 @@
6
6
  "title": "Remotion Video Renderer",
7
7
  "description": "Loads a persisted RenderPlan by job_id and drives the Remotion engine to produce the final video. Assets must already be generated via prepare_video_assets — this skill never resolves or regenerates assets.",
8
8
  "auth": "required",
9
- "envVars": ["PRIV_TOKEN", "MM_API_BASE_URL", "MM_BACKEND_API_URL", "AGENT_NAME", "REMOTION_RENDER_API_URL", "REMOTION_RENDER_MODE", "REMOTION_OUTPUT_DIR", "ASSET_CACHE_DIR"],
9
+ "createsTake": true,
10
+ "envVars": [
11
+ "PRIV_TOKEN",
12
+ "MM_API_BASE_URL",
13
+ "MM_BACKEND_API_URL",
14
+ "AGENT_NAME",
15
+ "REMOTION_RENDER_API_URL",
16
+ "REMOTION_RENDER_MODE",
17
+ "REMOTION_OUTPUT_DIR",
18
+ "ASSET_CACHE_DIR"
19
+ ],
10
20
  "scriptPath": "scripts/render_video.py",
11
21
  "parameters": {
12
22
  "type": "object",
13
23
  "properties": {
14
- "job_id": { "type": "number", "minimum": 1, "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." },
15
- "save_job": { "type": "boolean", "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." },
16
- "upload_title": { "type": "string", "description": "Upload title for the resulting video file. Defaults to the local output filename." },
17
- "no_upload": { "type": "boolean", "description": "Skip the upload step. Only effective for local rendering; remote rendering uploads server-side." },
18
- "renderer": { "type": "string", "enum": ["local", "remote"], "description": "Render mode: local runs the Remotion CLI on this host; remote calls the standalone remotion-renderer service. Defaults to REMOTION_RENDER_MODE." },
19
- "render_plan": { "type": "string", "description": "Existing RenderPlan file path. Local / single-user fallback used only when job_id is unavailable; prefer job_id." }
24
+ "job_id": {
25
+ "type": "number",
26
+ "minimum": 1,
27
+ "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."
28
+ },
29
+ "save_job": {
30
+ "type": "boolean",
31
+ "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."
32
+ },
33
+ "upload_title": {
34
+ "type": "string",
35
+ "description": "Upload title for the resulting video file. Defaults to the local output filename."
36
+ },
37
+ "no_upload": {
38
+ "type": "boolean",
39
+ "description": "Skip the upload step. Only effective for local rendering; remote rendering uploads server-side."
40
+ },
41
+ "renderer": {
42
+ "type": "string",
43
+ "enum": [
44
+ "local",
45
+ "remote"
46
+ ],
47
+ "description": "Render mode: local runs the Remotion CLI on this host; remote calls the standalone remotion-renderer service. Defaults to REMOTION_RENDER_MODE."
48
+ },
49
+ "render_plan": {
50
+ "type": "string",
51
+ "description": "Existing RenderPlan file path. Local / single-user fallback used only when job_id is unavailable; prefer job_id."
52
+ }
20
53
  },
21
- "required": ["job_id"]
54
+ "required": [
55
+ "job_id"
56
+ ]
22
57
  }
23
58
  }
@@ -6,17 +6,39 @@
6
6
  "title": "Video Deconstruction",
7
7
  "description": "Video deconstruction: split a video into reusable assets (audio extraction, ASR transcript, keyframe extraction, scene segmentation).",
8
8
  "auth": "required",
9
- "envVars": ["RENDER_API_URL", "PRIV_TOKEN", "CONVERSATION_ID"],
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "RENDER_API_URL",
12
+ "PRIV_TOKEN",
13
+ "CONVERSATION_ID"
14
+ ],
10
15
  "scriptPath": "scripts/parse_via_render.py",
11
16
  "parameters": {
12
17
  "type": "object",
13
18
  "properties": {
14
- "url": { "type": "string", "description": "Direct remote video URL (required). Share/page links are not supported." },
15
- "scene_threshold": { "type": "number", "description": "Scene-cut detection threshold 0.0-1.0 (default 0.3)" },
16
- "skip_asr": { "type": "boolean", "description": "Skip the ASR step" },
17
- "skip_keyframes": { "type": "boolean", "description": "Skip the keyframe-extraction step" },
18
- "json_output": { "type": "boolean", "description": "Pipeline mode — emit JSON only on stdout" }
19
+ "url": {
20
+ "type": "string",
21
+ "description": "Direct remote video URL (required). Share/page links are not supported."
22
+ },
23
+ "scene_threshold": {
24
+ "type": "number",
25
+ "description": "Scene-cut detection threshold 0.0-1.0 (default 0.3)"
26
+ },
27
+ "skip_asr": {
28
+ "type": "boolean",
29
+ "description": "Skip the ASR step"
30
+ },
31
+ "skip_keyframes": {
32
+ "type": "boolean",
33
+ "description": "Skip the keyframe-extraction step"
34
+ },
35
+ "json_output": {
36
+ "type": "boolean",
37
+ "description": "Pipeline mode — emit JSON only on stdout"
38
+ }
19
39
  },
20
- "required": ["url"]
40
+ "required": [
41
+ "url"
42
+ ]
21
43
  }
22
44
  }
@@ -6,42 +6,146 @@
6
6
  "title": "Web Page Recording",
7
7
  "description": "Drive a headless browser (Playwright Python) to RECORD any URL to a video, then (by default) transcode to mp4, grab a cover frame, upload to VOD and return a playable CDN URL. Modes: fixed-duration recording, condition-triggered stop (element appears / disappears), auto-scroll from top to bottom, custom storyboards, and parameterized templates. Storyboard scenes: highlight / focus / zoom / scroll / virtual-cursor click / type / hover / caption / title-card / arrow / numbered sequence / redact / code-line highlight. For still images (png/jpg) use the web_screenshot tool instead. Use this tool whenever the user wants a video / recording / screencast of a web page: record a page, scroll-through video, page-from-top-to-bottom clip, demo of clicks/typing/hover, storyboard / multi-scene intro video, or a template-based clip.",
8
8
  "auth": "optional",
9
- "envVars": ["WEB_CAPTURE_BROWSER", "WEB_CAPTURE_OUTPUT_BASE", "WEB_CAPTURE_NO_SANDBOX", "WEB_CAPTURE_ALLOW_PRIVATE_HOSTS", "PLAYWRIGHT_BROWSERS_PATH", "REMOTION_RENDER_API_URL", "PRIV_TOKEN"],
10
- "entry": { "type": "python", "scriptPath": "../web-screenshot/scripts/record.py" },
9
+ "joinsTake": true,
10
+ "envVars": [
11
+ "WEB_CAPTURE_BROWSER",
12
+ "WEB_CAPTURE_OUTPUT_BASE",
13
+ "WEB_CAPTURE_NO_SANDBOX",
14
+ "WEB_CAPTURE_ALLOW_PRIVATE_HOSTS",
15
+ "PLAYWRIGHT_BROWSERS_PATH",
16
+ "REMOTION_RENDER_API_URL",
17
+ "PRIV_TOKEN"
18
+ ],
19
+ "entry": {
20
+ "type": "python",
21
+ "scriptPath": "../web-screenshot/scripts/record.py"
22
+ },
11
23
  "parameters": {
12
24
  "type": "object",
13
25
  "properties": {
14
- "url": { "type": "string", "description": "Target page URL (http/https). May be omitted only when a template or storyboard JSON supplies its own url." },
15
- "output": { "type": "string", "description": "Local output path, must end in .webm (default recording.webm)" },
16
- "browser": { "type": "string", "description": "chromium | firefox | webkit (default chromium; chromium recommended for recording)" },
17
- "device": { "type": "string", "description": "Device emulation name, e.g. 'iPhone 15 Pro'" },
18
- "viewport": { "type": "string", "description": "Viewport as 'width,height', e.g. '1280,720'" },
19
- "duration": { "type": "number", "description": "Fixed recording length in ms" },
20
- "stop_when_selector": { "type": "string", "description": "Stop recording once this CSS selector appears" },
21
- "stop_when_hidden": { "type": "string", "description": "Stop recording once this CSS selector disappears" },
22
- "max_duration": { "type": "number", "description": "Safety cap (ms) for condition-based stop modes (default 60000)" },
23
- "scroll_through": { "type": "boolean", "description": "Auto-scroll smoothly from top to bottom while recording" },
24
- "scroll_step": { "type": "number", "description": "Pixels per scroll step (default 60)" },
25
- "scroll_interval": { "type": "number", "description": "Interval between scroll steps in ms (default 50)" },
26
- "scroll_pause_top": { "type": "number", "description": "Pause at the top before scrolling, ms (default 800)" },
27
- "scroll_pause_bottom": { "type": "number", "description": "Pause at the bottom after scrolling, ms (default 1200)" },
28
- "storyboard": { "type": "string", "description": "Path to a storyboard JSON file describing scenes (mutually exclusive with template)" },
29
- "template": { "type": "string", "description": "Template name under templates/ (e.g. github-repo-intro); combine with param (mutually exclusive with storyboard)" },
30
- "param": { "type": "array", "description": "Template params as 'key=value' strings; repeatable" },
31
- "list_templates": { "type": "boolean", "description": "List available templates and exit" },
32
- "wait_for_selector": { "type": "string", "description": "Wait for this CSS selector before recording" },
33
- "wait_for_timeout": { "type": "number", "description": "Fixed wait (ms) before recording" },
34
- "color_scheme": { "type": "string", "description": "light | dark | no-preference (emulate prefers-color-scheme)" },
35
- "user_agent": { "type": "string", "description": "Override User-Agent" },
36
- "timeout": { "type": "number", "description": "Playwright global action timeout in ms" },
37
- "ignore_https_errors": { "type": "boolean", "description": "Ignore HTTPS certificate errors" },
38
- "storage_state": { "type": "string", "description": "storageState JSON file path (logged-in recording)" },
39
- "cookies": { "type": "string", "description": "Playwright cookies JSON string or file (top-level array)" },
40
- "no_upload": { "type": "boolean", "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." },
41
- "vod_title": { "type": "string", "description": "Title for the uploaded VOD asset (defaults to the output file name)" },
42
- "cover_at_sec": { "type": "number", "description": "Cover frame timestamp in seconds (default 0.5)" },
43
- "keep_webm": { "type": "boolean", "description": "Keep the local webm after a successful upload (default: delete it since VOD holds the copy)" }
26
+ "url": {
27
+ "type": "string",
28
+ "description": "Target page URL (http/https). May be omitted only when a template or storyboard JSON supplies its own url."
29
+ },
30
+ "output": {
31
+ "type": "string",
32
+ "description": "Local output path, must end in .webm (default recording.webm)"
33
+ },
34
+ "browser": {
35
+ "type": "string",
36
+ "description": "chromium | firefox | webkit (default chromium; chromium recommended for recording)"
37
+ },
38
+ "device": {
39
+ "type": "string",
40
+ "description": "Device emulation name, e.g. 'iPhone 15 Pro'"
41
+ },
42
+ "viewport": {
43
+ "type": "string",
44
+ "description": "Viewport as 'width,height', e.g. '1280,720'"
45
+ },
46
+ "duration": {
47
+ "type": "number",
48
+ "description": "Fixed recording length in ms"
49
+ },
50
+ "stop_when_selector": {
51
+ "type": "string",
52
+ "description": "Stop recording once this CSS selector appears"
53
+ },
54
+ "stop_when_hidden": {
55
+ "type": "string",
56
+ "description": "Stop recording once this CSS selector disappears"
57
+ },
58
+ "max_duration": {
59
+ "type": "number",
60
+ "description": "Safety cap (ms) for condition-based stop modes (default 60000)"
61
+ },
62
+ "scroll_through": {
63
+ "type": "boolean",
64
+ "description": "Auto-scroll smoothly from top to bottom while recording"
65
+ },
66
+ "scroll_step": {
67
+ "type": "number",
68
+ "description": "Pixels per scroll step (default 60)"
69
+ },
70
+ "scroll_interval": {
71
+ "type": "number",
72
+ "description": "Interval between scroll steps in ms (default 50)"
73
+ },
74
+ "scroll_pause_top": {
75
+ "type": "number",
76
+ "description": "Pause at the top before scrolling, ms (default 800)"
77
+ },
78
+ "scroll_pause_bottom": {
79
+ "type": "number",
80
+ "description": "Pause at the bottom after scrolling, ms (default 1200)"
81
+ },
82
+ "storyboard": {
83
+ "type": "string",
84
+ "description": "Path to a storyboard JSON file describing scenes (mutually exclusive with template)"
85
+ },
86
+ "template": {
87
+ "type": "string",
88
+ "description": "Template name under templates/ (e.g. github-repo-intro); combine with param (mutually exclusive with storyboard)"
89
+ },
90
+ "param": {
91
+ "type": "array",
92
+ "description": "Template params as 'key=value' strings; repeatable"
93
+ },
94
+ "list_templates": {
95
+ "type": "boolean",
96
+ "description": "List available templates and exit"
97
+ },
98
+ "wait_for_selector": {
99
+ "type": "string",
100
+ "description": "Wait for this CSS selector before recording"
101
+ },
102
+ "wait_for_timeout": {
103
+ "type": "number",
104
+ "description": "Fixed wait (ms) before recording"
105
+ },
106
+ "color_scheme": {
107
+ "type": "string",
108
+ "description": "light | dark | no-preference (emulate prefers-color-scheme)"
109
+ },
110
+ "user_agent": {
111
+ "type": "string",
112
+ "description": "Override User-Agent"
113
+ },
114
+ "timeout": {
115
+ "type": "number",
116
+ "description": "Playwright global action timeout in ms"
117
+ },
118
+ "ignore_https_errors": {
119
+ "type": "boolean",
120
+ "description": "Ignore HTTPS certificate errors"
121
+ },
122
+ "storage_state": {
123
+ "type": "string",
124
+ "description": "storageState JSON file path (logged-in recording)"
125
+ },
126
+ "cookies": {
127
+ "type": "string",
128
+ "description": "Playwright cookies JSON string or file (top-level array)"
129
+ },
130
+ "no_upload": {
131
+ "type": "boolean",
132
+ "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."
133
+ },
134
+ "vod_title": {
135
+ "type": "string",
136
+ "description": "Title for the uploaded VOD asset (defaults to the output file name)"
137
+ },
138
+ "cover_at_sec": {
139
+ "type": "number",
140
+ "description": "Cover frame timestamp in seconds (default 0.5)"
141
+ },
142
+ "keep_webm": {
143
+ "type": "boolean",
144
+ "description": "Keep the local webm after a successful upload (default: delete it since VOD holds the copy)"
145
+ }
44
146
  },
45
- "required": ["url"]
147
+ "required": [
148
+ "url"
149
+ ]
46
150
  }
47
151
  }
@@ -6,25 +6,75 @@
6
6
  "title": "Web Page Screenshot",
7
7
  "description": "Drive a headless browser (Playwright Python) to capture any URL to a local STILL IMAGE (png/jpg): full-page / viewport / element / region screenshots, with device emulation, waiting, hide/mask/redact, and static annotations (highlight / arrow / caption / numbered sequence / redact). Images only — for video / recording / scroll-through / storyboard clips (webm) use the web_record tool instead.",
8
8
  "auth": "none",
9
- "envVars": ["WEB_CAPTURE_BROWSER", "WEB_CAPTURE_OUTPUT_BASE", "WEB_CAPTURE_NO_SANDBOX", "WEB_CAPTURE_ALLOW_PRIVATE_HOSTS", "PLAYWRIGHT_BROWSERS_PATH"],
10
- "entry": { "type": "python", "scriptPath": "scripts/screenshot.py" },
9
+ "envVars": [
10
+ "WEB_CAPTURE_BROWSER",
11
+ "WEB_CAPTURE_OUTPUT_BASE",
12
+ "WEB_CAPTURE_NO_SANDBOX",
13
+ "WEB_CAPTURE_ALLOW_PRIVATE_HOSTS",
14
+ "PLAYWRIGHT_BROWSERS_PATH"
15
+ ],
16
+ "entry": {
17
+ "type": "python",
18
+ "scriptPath": "scripts/screenshot.py"
19
+ },
11
20
  "parameters": {
12
21
  "type": "object",
13
22
  "properties": {
14
- "url": { "type": "string", "description": "Target page URL (http/https)" },
15
- "output": { "type": "string", "description": "Local output path, must be an image (*.png / *.jpg, default screenshot.png). For .webm video use the web_record tool." },
16
- "browser": { "type": "string", "description": "chromium | firefox | webkit (default chromium)" },
17
- "device": { "type": "string", "description": "Device emulation name, e.g. 'iPhone 15 Pro'" },
18
- "viewport": { "type": "string", "description": "Viewport as 'width,height', e.g. '1280,800'" },
19
- "full_page": { "type": "boolean", "description": "screenshot.py: capture the whole scrollable page" },
20
- "selector": { "type": "string", "description": "screenshot.py: capture only the element matching this CSS selector" },
21
- "clip": { "type": "string", "description": "screenshot.py: region clip 'x,y,w,h' (combined with selector = offset from element box)" },
22
- "wait_for_selector": { "type": "string", "description": "Wait for this CSS selector before acting" },
23
- "wait_for_timeout": { "type": "number", "description": "Fixed wait (ms) before acting" },
24
- "annotate": { "type": "string", "description": "screenshot.py: annotation JSON file or string (array or {annotations, settleMs})" },
25
- "storage_state": { "type": "string", "description": "storageState JSON file path (logged-in capture)" },
26
- "cookies": { "type": "string", "description": "Playwright cookies JSON string or file (top-level array)" }
23
+ "url": {
24
+ "type": "string",
25
+ "description": "Target page URL (http/https)"
26
+ },
27
+ "output": {
28
+ "type": "string",
29
+ "description": "Local output path, must be an image (*.png / *.jpg, default screenshot.png). For .webm video use the web_record tool."
30
+ },
31
+ "browser": {
32
+ "type": "string",
33
+ "description": "chromium | firefox | webkit (default chromium)"
34
+ },
35
+ "device": {
36
+ "type": "string",
37
+ "description": "Device emulation name, e.g. 'iPhone 15 Pro'"
38
+ },
39
+ "viewport": {
40
+ "type": "string",
41
+ "description": "Viewport as 'width,height', e.g. '1280,800'"
42
+ },
43
+ "full_page": {
44
+ "type": "boolean",
45
+ "description": "screenshot.py: capture the whole scrollable page"
46
+ },
47
+ "selector": {
48
+ "type": "string",
49
+ "description": "screenshot.py: capture only the element matching this CSS selector"
50
+ },
51
+ "clip": {
52
+ "type": "string",
53
+ "description": "screenshot.py: region clip 'x,y,w,h' (combined with selector = offset from element box)"
54
+ },
55
+ "wait_for_selector": {
56
+ "type": "string",
57
+ "description": "Wait for this CSS selector before acting"
58
+ },
59
+ "wait_for_timeout": {
60
+ "type": "number",
61
+ "description": "Fixed wait (ms) before acting"
62
+ },
63
+ "annotate": {
64
+ "type": "string",
65
+ "description": "screenshot.py: annotation JSON file or string (array or {annotations, settleMs})"
66
+ },
67
+ "storage_state": {
68
+ "type": "string",
69
+ "description": "storageState JSON file path (logged-in capture)"
70
+ },
71
+ "cookies": {
72
+ "type": "string",
73
+ "description": "Playwright cookies JSON string or file (top-level array)"
74
+ }
27
75
  },
28
- "required": ["url"]
76
+ "required": [
77
+ "url"
78
+ ]
29
79
  }
30
80
  }