@vibeframe/cli 0.110.0 → 0.111.1

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.
@@ -53173,6 +53173,8 @@ var sceneStylesTool = defineTool({
53173
53173
  name: "scene_list_styles",
53174
53174
  category: "scene",
53175
53175
  cost: "free",
53176
+ title: "List Visual Styles",
53177
+ annotations: { readOnly: true, openWorld: false },
53176
53178
  description: "List the 8 vendored visual identities available for `init --visual-style` (Swiss Pulse, Data Drift, \u2026) or, when `name` is provided, return the full DESIGN.md hard-gate body for one style. The DESIGN.md content is what the LLM uses as a non-negotiable visual rulebook during compose-scenes-with-skills.",
53177
53179
  schema: sceneStylesSchema,
53178
53180
  async execute(args) {
@@ -53234,6 +53236,8 @@ var sceneInitTool = defineTool({
53234
53236
  name: "init",
53235
53237
  category: "scene",
53236
53238
  cost: "free",
53239
+ title: "Initialize Video Project",
53240
+ annotations: { readOnly: false, destructive: false, idempotent: true, openWorld: false },
53237
53241
  description: "Scaffold a new VibeFrame video scene project. Supports minimal, agent, and full profiles; full includes the current HTML render backend metadata. Idempotent: re-running keeps user-authored files and merges backend config instead of overwriting. No API keys required.",
53238
53242
  schema: sceneInitSchema,
53239
53243
  async execute(args, ctx) {
@@ -53284,6 +53288,8 @@ var sceneAddTool = defineTool({
53284
53288
  name: "scene_add",
53285
53289
  category: "scene",
53286
53290
  cost: "low",
53291
+ title: "Add Scene from Preset",
53292
+ annotations: { readOnly: false, openWorld: true },
53287
53293
  description: "Add a single scene to an existing scene project. Optionally generates narration audio (ElevenLabs) and/or a backdrop image (Gemini/OpenAI), then emits compositions/scene-<id>.html with a paused GSAP timeline and splices a clip reference into the root index.html. Use skipAudio:true and skipImage:true for text-only scenes that need no API calls.",
53288
53294
  schema: sceneAddSchema,
53289
53295
  async execute(args, ctx) {
@@ -53362,6 +53368,8 @@ var sceneLintTool = defineTool({
53362
53368
  name: "scene_lint",
53363
53369
  category: "scene",
53364
53370
  cost: "free",
53371
+ title: "Lint Scene Compositions",
53372
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
53365
53373
  description: "Validate every scene file in a project against the public Hyperframes lint rules (in-process, no Chrome required). Returns errors, warnings, and info findings per file. Optional fix:true mechanically repairs `timed_element_missing_clip_class` only \u2014 other issues surface with fixHints.",
53366
53374
  schema: sceneLintSchema,
53367
53375
  async execute(args, ctx) {
@@ -53399,6 +53407,8 @@ var sceneRepairTool = defineTool({
53399
53407
  name: "scene_repair",
53400
53408
  category: "scene",
53401
53409
  cost: "free",
53410
+ title: "Repair Scene Compositions",
53411
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
53402
53412
  description: "Apply deterministic mechanical scene repairs. Currently uses the safe lint auto-fix allow-list and never performs semantic creative rewrites.",
53403
53413
  schema: sceneRepairSchema,
53404
53414
  async execute(args, ctx) {
@@ -53479,6 +53489,8 @@ var sceneRenderTool = defineTool({
53479
53489
  name: "render",
53480
53490
  category: "scene",
53481
53491
  cost: "free",
53492
+ title: "Render Video to MP4",
53493
+ annotations: { readOnly: false, openWorld: false },
53482
53494
  description: "Render a scene project to MP4/WebM/MOV via the Hyperframes producer. Requires Chrome installed locally. Output defaults to renders/<projectName>-<isoStamp>.<format>. Long runs: over MCP, calls exceeding ~45s return immediately with { promoted: true, jobId, status: 'running' } \u2014 poll status_job every 15-30s until completed/failed instead of re-invoking render. Emits MCP progress notifications when the client supplies a progressToken.",
53483
53495
  schema: sceneRenderSchema,
53484
53496
  async execute(args, ctx) {
@@ -53608,6 +53620,8 @@ var sceneBuildTool = defineTool({
53608
53620
  name: "build",
53609
53621
  category: "scene",
53610
53622
  cost: "high",
53623
+ title: "Build Video from Storyboard",
53624
+ annotations: { readOnly: false, openWorld: true },
53611
53625
  description: "v0.60 one-shot orchestrator: read STORYBOARD.md per-beat YAML cues (narration / backdrop / duration), dispatch TTS + image generation per beat, compose scene HTML via the compose-scenes-with-skills pipeline, then render to MP4. Use this instead of chaining init + scene_add + render manually. Caches by SHA256 of (DESIGN.md + cue body) so re-runs are idempotent and cheap. Long runs: over MCP, calls exceeding ~45s return immediately with { promoted: true, jobId, status: 'running' } \u2014 poll status_job every 15-30s until completed/failed instead of re-invoking build. Emits MCP progress notifications when the client supplies a progressToken. When the MCP host supports elicitation, unspecified asset choices (narration provider, backdrop images, cost cap) are confirmed with the user via a form before the build starts.",
53612
53626
  schema: sceneBuildSchema,
53613
53627
  async execute(args, ctx) {
@@ -53690,6 +53704,8 @@ var sceneInstallSkillTool = defineTool({
53690
53704
  name: "scene_install_skill",
53691
53705
  category: "scene",
53692
53706
  cost: "free",
53707
+ title: "Install Hyperframes Skill",
53708
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
53693
53709
  description: "Install the vendored Hyperframes skill bundle into a scene project so the host agent (Claude Code, Cursor, Codex, Aider) can read framework rules + house style directly. Writes a universal SKILL.md + references/ at the project root, plus per-host layouts (.claude/skills/hyperframes/ for Claude Code, .cursor/rules/hyperframes.mdc for Cursor) when those hosts are detected. Phase H1 of the agentic-native composer plan \u2014 once installed, the host agent itself can author scene HTML using the rules instead of relying on vibe's internal LLM call.",
53694
53710
  schema: sceneInstallSkillSchema,
53695
53711
  async execute(args, ctx) {
@@ -53736,6 +53752,8 @@ var sceneComposePromptsTool = defineTool({
53736
53752
  name: "scene_compose_prompts",
53737
53753
  category: "scene",
53738
53754
  cost: "free",
53755
+ title: "Get Scene Authoring Prompts",
53756
+ annotations: { readOnly: true, openWorld: false },
53739
53757
  description: "Emit the per-beat compose plan for the host agent to author scene HTML itself. Reads STORYBOARD.md + DESIGN.md and returns each beat's outputPath + userPrompt + cues + body, plus references to the project's SKILL.md (Hyperframes rules) and DESIGN.md (visual identity). The host agent writes each compositions/scene-<id>.html file directly \u2014 VibeFrame makes NO LLM call here. Hosts that cannot write files (e.g. Claude Desktop) submit each authored beat with scene_submit instead. Pairs with scene_install_skill (Phase H1). Phase H2 of the agentic-native composer plan; the internal-LLM batch path (build) remains as a fallback for non-agent contexts.",
53740
53758
  schema: sceneComposePromptsSchema,
53741
53759
  async execute(args, ctx) {
@@ -53778,6 +53796,8 @@ var sceneSubmitTool = defineTool({
53778
53796
  name: "scene_submit",
53779
53797
  category: "scene",
53780
53798
  cost: "free",
53799
+ title: "Submit Scene HTML",
53800
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
53781
53801
  description: "Submit host-authored Hyperframes scene HTML for one beat. Validates with the same lint as the batch composer and writes compositions/scene-<id>.html on pass; on lint errors it returns the findings WITHOUT writing so you can fix and resubmit. This completes agent-mode compose for hosts that cannot write files (e.g. Claude Desktop): build (mode agent) \u2192 needs-author plan \u2192 author each beat from its composePrompts userPrompt \u2192 scene_submit per beat \u2192 build (stage sync) \u2192 render. No internal LLM call \u2014 the submitting agent is the composer.",
53782
53802
  schema: sceneSubmitSchema,
53783
53803
  async execute(args, ctx) {
@@ -53819,6 +53839,8 @@ var audioTranscribeTool = defineTool({
53819
53839
  name: "audio_transcribe",
53820
53840
  category: "audio",
53821
53841
  cost: "low",
53842
+ title: "Transcribe Audio",
53843
+ annotations: { readOnly: false, openWorld: true },
53822
53844
  description: "Transcribe audio using OpenAI Whisper. Outputs text, SRT, or VTT. Requires OPENAI_API_KEY.",
53823
53845
  schema: external_exports.object({
53824
53846
  audioPath: external_exports.string().describe("Input audio file path"),
@@ -53848,6 +53870,8 @@ var audioIsolateTool = defineTool({
53848
53870
  name: "audio_isolate",
53849
53871
  category: "audio",
53850
53872
  cost: "low",
53873
+ title: "Isolate Vocals from Audio",
53874
+ annotations: { readOnly: false, openWorld: true },
53851
53875
  description: "Isolate vocals from audio using ElevenLabs. Requires ELEVENLABS_API_KEY.",
53852
53876
  schema: external_exports.object({
53853
53877
  audioPath: external_exports.string().describe("Input audio file path"),
@@ -53867,6 +53891,8 @@ var audioVoiceCloneTool = defineTool({
53867
53891
  name: "audio_clone_voice",
53868
53892
  category: "audio",
53869
53893
  cost: "low",
53894
+ title: "Clone Voice from Samples",
53895
+ annotations: { readOnly: false, destructive: false, openWorld: true },
53870
53896
  description: "Clone a voice from audio samples using ElevenLabs. Requires ELEVENLABS_API_KEY.",
53871
53897
  schema: external_exports.object({
53872
53898
  samplePaths: external_exports.array(external_exports.string()).describe("Audio sample file paths (1-25 files)"),
@@ -53888,6 +53914,8 @@ var audioDubTool = defineTool({
53888
53914
  name: "audio_dub",
53889
53915
  category: "audio",
53890
53916
  cost: "high",
53917
+ title: "Dub Audio to Another Language",
53918
+ annotations: { readOnly: false, openWorld: true },
53891
53919
  description: "Dub audio/video to another language (transcribe + translate + TTS). Requires OPENAI_API_KEY, ANTHROPIC_API_KEY, ELEVENLABS_API_KEY.",
53892
53920
  schema: external_exports.object({
53893
53921
  mediaPath: external_exports.string().describe("Input media file (video or audio)"),
@@ -53918,6 +53946,8 @@ var audioDuckTool = defineTool({
53918
53946
  name: "audio_duck",
53919
53947
  category: "audio",
53920
53948
  cost: "free",
53949
+ title: "Duck Background Music",
53950
+ annotations: { readOnly: false, openWorld: false },
53921
53951
  description: "Auto-duck background music when voice is present using FFmpeg sidechain compression. Free, no API key needed.",
53922
53952
  schema: external_exports.object({
53923
53953
  musicPath: external_exports.string().describe("Background music file path"),
@@ -54214,6 +54244,8 @@ var editSilenceCutTool = defineTool({
54214
54244
  name: "edit_silence_cut",
54215
54245
  category: "edit",
54216
54246
  cost: "free",
54247
+ title: "Cut Silence from Video",
54248
+ annotations: { readOnly: false, openWorld: true },
54217
54249
  description: "Remove silent segments from a video using FFmpeg or Gemini AI detection. No API key needed for FFmpeg mode.",
54218
54250
  schema: external_exports.object({
54219
54251
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54244,6 +54276,8 @@ var editCaptionTool = defineTool({
54244
54276
  name: "edit_caption",
54245
54277
  category: "edit",
54246
54278
  cost: "low",
54279
+ title: "Burn Captions into Video",
54280
+ annotations: { readOnly: false, openWorld: true },
54247
54281
  description: "Transcribe audio and burn styled captions into video. Requires OPENAI_API_KEY for Whisper transcription.",
54248
54282
  schema: external_exports.object({
54249
54283
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54268,6 +54302,8 @@ var editFadeTool = defineTool({
54268
54302
  name: "edit_fade",
54269
54303
  category: "edit",
54270
54304
  cost: "free",
54305
+ title: "Apply Fade Effects",
54306
+ annotations: { readOnly: false, openWorld: false },
54271
54307
  description: "Apply fade in/out effects to video and/or audio. No API key needed.",
54272
54308
  schema: external_exports.object({
54273
54309
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54291,6 +54327,8 @@ var editNoiseReduceTool = defineTool({
54291
54327
  name: "edit_noise_reduce",
54292
54328
  category: "edit",
54293
54329
  cost: "free",
54330
+ title: "Reduce Audio Noise",
54331
+ annotations: { readOnly: false, openWorld: false },
54294
54332
  description: "Reduce audio/video noise using FFmpeg filters. No API key needed.",
54295
54333
  schema: external_exports.object({
54296
54334
  inputPath: external_exports.string().describe("Path to the input media file"),
@@ -54312,6 +54350,8 @@ var editJumpCutTool = defineTool({
54312
54350
  name: "edit_jump_cut",
54313
54351
  category: "edit",
54314
54352
  cost: "low",
54353
+ title: "Remove Filler Words",
54354
+ annotations: { readOnly: false, openWorld: true },
54315
54355
  description: "Remove filler words (um, uh, like, etc.) from video using Whisper transcription. Requires OPENAI_API_KEY.",
54316
54356
  schema: external_exports.object({
54317
54357
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54335,6 +54375,8 @@ var editTextOverlayTool = defineTool({
54335
54375
  name: "edit_text_overlay",
54336
54376
  category: "edit",
54337
54377
  cost: "free",
54378
+ title: "Overlay Static Text",
54379
+ annotations: { readOnly: false, openWorld: false },
54338
54380
  description: "Apply simple static text burn-in on video using FFmpeg drawtext. No API key needed. For designed or animated overlays, use edit_motion_overlay.",
54339
54381
  schema: external_exports.object({
54340
54382
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54361,6 +54403,8 @@ var editMotionOverlayTool = defineTool({
54361
54403
  name: "edit_motion_overlay",
54362
54404
  category: "edit",
54363
54405
  cost: "low",
54406
+ title: "Apply Motion Graphics Overlay",
54407
+ annotations: { readOnly: false, openWorld: true },
54364
54408
  description: "Apply designed motion graphics overlays to an existing video. Generates Remotion overlays from a prompt, or overlays a user-provided .json/.lottie animation via the Hyperframes renderer.",
54365
54409
  schema: external_exports.object({
54366
54410
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54397,6 +54441,8 @@ var editTranslateSrtTool = defineTool({
54397
54441
  name: "edit_translate_srt",
54398
54442
  category: "edit",
54399
54443
  cost: "low",
54444
+ title: "Translate SRT Subtitles",
54445
+ annotations: { readOnly: false, openWorld: true },
54400
54446
  description: "Translate SRT subtitle files using Claude or OpenAI. Requires ANTHROPIC_API_KEY or OPENAI_API_KEY.",
54401
54447
  schema: external_exports.object({
54402
54448
  srtPath: external_exports.string().describe("Path to the input SRT file"),
@@ -54419,6 +54465,8 @@ var editGradeTool = defineTool({
54419
54465
  name: "edit_grade",
54420
54466
  category: "edit",
54421
54467
  cost: "low",
54468
+ title: "Apply Color Grading",
54469
+ annotations: { readOnly: false, openWorld: true },
54422
54470
  description: "Apply AI-generated color grading using Claude + FFmpeg. Use preset for free built-in grades, or style for custom AI-generated grades (needs ANTHROPIC_API_KEY).",
54423
54471
  schema: external_exports.object({
54424
54472
  videoPath: external_exports.string().describe("Input video file path"),
@@ -54441,6 +54489,8 @@ var editSpeedRampTool = defineTool({
54441
54489
  name: "edit_speed_ramp",
54442
54490
  category: "edit",
54443
54491
  cost: "low",
54492
+ title: "Apply Content-Aware Speed Ramping",
54493
+ annotations: { readOnly: false, openWorld: true },
54444
54494
  description: "Apply content-aware speed ramping. Analyzes speech with Whisper, plans speed changes with Claude, applies with FFmpeg. Requires OPENAI_API_KEY + ANTHROPIC_API_KEY.",
54445
54495
  schema: external_exports.object({
54446
54496
  videoPath: external_exports.string().describe("Input video file path (must have audio)"),
@@ -54465,6 +54515,8 @@ var editReframeTool = defineTool({
54465
54515
  name: "edit_reframe",
54466
54516
  category: "edit",
54467
54517
  cost: "free",
54518
+ title: "Reframe Video Aspect Ratio",
54519
+ annotations: { readOnly: false, openWorld: false },
54468
54520
  description: "Auto-reframe video to a different aspect ratio using smart cropping. Free (FFmpeg only).",
54469
54521
  schema: external_exports.object({
54470
54522
  videoPath: external_exports.string().describe("Input video file path"),
@@ -54487,6 +54539,8 @@ var editInterpolateTool = defineTool({
54487
54539
  name: "edit_interpolate",
54488
54540
  category: "edit",
54489
54541
  cost: "free",
54542
+ title: "Create Slow Motion with Frame Interpolation",
54543
+ annotations: { readOnly: false, openWorld: false },
54490
54544
  description: "Create slow motion with AI frame interpolation using FFmpeg minterpolate. Free, no API key needed.",
54491
54545
  schema: external_exports.object({
54492
54546
  videoPath: external_exports.string().describe("Input video file path"),
@@ -54509,6 +54563,8 @@ var editUpscaleTool = defineTool({
54509
54563
  name: "edit_upscale",
54510
54564
  category: "edit",
54511
54565
  cost: "free",
54566
+ title: "Upscale Video Resolution",
54567
+ annotations: { readOnly: false, openWorld: false },
54512
54568
  description: "Upscale video resolution using FFmpeg (Lanczos scaling). Free, no API key needed.",
54513
54569
  schema: external_exports.object({
54514
54570
  videoPath: external_exports.string().describe("Input video file path"),
@@ -54530,6 +54586,8 @@ var editAnimatedCaptionTool = defineTool({
54530
54586
  name: "edit_animated_caption",
54531
54587
  category: "edit",
54532
54588
  cost: "low",
54589
+ title: "Add Animated Captions",
54590
+ annotations: { readOnly: false, openWorld: true },
54533
54591
  description: "Add animated word-by-word captions (TikTok/Reels style). Supports highlight, bounce, pop-in, neon, karaoke-sweep, typewriter styles. Requires OPENAI_API_KEY for Whisper.",
54534
54592
  schema: external_exports.object({
54535
54593
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -54562,6 +54620,8 @@ var editImageTool = defineTool({
54562
54620
  name: "edit_image",
54563
54621
  category: "edit",
54564
54622
  cost: "low",
54623
+ title: "Edit Image with AI",
54624
+ annotations: { readOnly: false, openWorld: true },
54565
54625
  description: "Edit image(s) using Gemini (Nano Banana). Provide image paths and an edit prompt. Requires GOOGLE_API_KEY.",
54566
54626
  schema: external_exports.object({
54567
54627
  imagePaths: external_exports.array(external_exports.string()).describe("Input image file path(s)"),
@@ -54585,6 +54645,8 @@ var editFillGapsTool = defineTool({
54585
54645
  name: "edit_fill_gaps",
54586
54646
  category: "edit",
54587
54647
  cost: "high",
54648
+ title: "Fill Timeline Gaps with AI Video",
54649
+ annotations: { readOnly: false, openWorld: true },
54588
54650
  description: "Fill timeline gaps with AI-generated video using Kling image-to-video. Detects empty regions in a project's timeline, extracts the last frame of the preceding clip, and generates a continuation video. Requires KLING_API_KEY and IMGBB_API_KEY (image hosting for Kling).",
54589
54651
  schema: external_exports.object({
54590
54652
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -56067,6 +56129,8 @@ var inspectProjectTool = defineTool({
56067
56129
  name: "inspect_project",
56068
56130
  category: "analyze",
56069
56131
  cost: "free",
56132
+ title: "Inspect Project",
56133
+ annotations: { readOnly: false, openWorld: false },
56070
56134
  description: "Local project inspection: checks STORYBOARD.md, DESIGN.md, config, build-report, scene lint, composition files, and referenced assets. Writes review-report.json by default.",
56071
56135
  schema: external_exports.object({
56072
56136
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
@@ -56101,6 +56165,8 @@ var inspectRenderTool = defineTool({
56101
56165
  name: "inspect_render",
56102
56166
  category: "analyze",
56103
56167
  cost: "low",
56168
+ title: "Inspect Render",
56169
+ annotations: { readOnly: false, openWorld: false },
56104
56170
  description: "Render inspection: runs cheap local video checks by default, optionally adds Gemini AI review with ai: true, and writes review-report.json by default.",
56105
56171
  schema: external_exports.object({
56106
56172
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION2),
@@ -56165,6 +56231,8 @@ var analyzeMediaTool = defineTool({
56165
56231
  name: "inspect_media",
56166
56232
  category: "analyze",
56167
56233
  cost: "low",
56234
+ title: "Inspect Media with AI",
56235
+ annotations: { readOnly: true, openWorld: true },
56168
56236
  description: "Analyze media (image, video, or YouTube URL) using Gemini AI. Requires GOOGLE_API_KEY.",
56169
56237
  schema: external_exports.object({
56170
56238
  source: external_exports.string().describe("Path to image/video or YouTube URL"),
@@ -56193,6 +56261,8 @@ var analyzeVideoTool = defineTool({
56193
56261
  name: "inspect_video",
56194
56262
  category: "analyze",
56195
56263
  cost: "low",
56264
+ title: "Inspect Video with AI",
56265
+ annotations: { readOnly: true, openWorld: true },
56196
56266
  description: "Analyze video content using Gemini AI with temporal understanding. Requires GOOGLE_API_KEY.",
56197
56267
  schema: external_exports.object({
56198
56268
  source: external_exports.string().describe("Path to video file"),
@@ -56221,6 +56291,8 @@ var analyzeReviewTool = defineTool({
56221
56291
  name: "inspect_review",
56222
56292
  category: "analyze",
56223
56293
  cost: "low",
56294
+ title: "Review Video with AI",
56295
+ annotations: { readOnly: false, openWorld: true },
56224
56296
  description: "AI video review: analyzes quality, suggests fixes, and optionally auto-applies them. Requires GOOGLE_API_KEY.",
56225
56297
  schema: external_exports.object({
56226
56298
  videoPath: external_exports.string().describe("Path to the video file to review"),
@@ -56249,6 +56321,8 @@ var analyzeSuggestTool = defineTool({
56249
56321
  name: "inspect_suggest",
56250
56322
  category: "analyze",
56251
56323
  cost: "low",
56324
+ title: "Suggest Edits with AI",
56325
+ annotations: { readOnly: false, openWorld: true },
56252
56326
  description: "Get natural-language edit suggestions for a project from Gemini. Returns suggestions array with type/confidence/clipIds. With `apply: true`, applies the first suggestion in place. Requires GOOGLE_API_KEY.",
56253
56327
  schema: external_exports.object({
56254
56328
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -56296,6 +56370,8 @@ var generateMotionTool = defineTool({
56296
56370
  name: "generate_motion",
56297
56371
  category: "generate",
56298
56372
  cost: "low",
56373
+ title: "Generate Motion Graphics",
56374
+ annotations: { readOnly: false, openWorld: true },
56299
56375
  description: "Generate standalone motion graphics using Claude or Gemini + Remotion. For overlays on an existing video, prefer edit_motion_overlay. Requires ANTHROPIC_API_KEY (Claude) or GOOGLE_API_KEY (Gemini).",
56300
56376
  schema: external_exports.object({
56301
56377
  description: external_exports.string().describe("Description of the motion graphic to generate"),
@@ -56335,6 +56411,8 @@ var generateSpeechTool = defineTool({
56335
56411
  name: "generate_speech",
56336
56412
  category: "generate",
56337
56413
  cost: "low",
56414
+ title: "Generate Speech Audio",
56415
+ annotations: { readOnly: false, openWorld: true },
56338
56416
  description: "Generate speech from text using ElevenLabs TTS. Requires ELEVENLABS_API_KEY.",
56339
56417
  schema: external_exports.object({
56340
56418
  text: external_exports.string().describe("Text to convert to speech"),
@@ -56355,6 +56433,8 @@ var generateNarrationTool = defineTool({
56355
56433
  name: "generate_narration",
56356
56434
  category: "generate",
56357
56435
  cost: "low",
56436
+ title: "Generate Narration Audio",
56437
+ annotations: { readOnly: false, openWorld: true },
56358
56438
  description: "Generate narration from text using ElevenLabs TTS. Product-facing alias for generate_speech. Requires ELEVENLABS_API_KEY.",
56359
56439
  schema: external_exports.object({
56360
56440
  text: external_exports.string().describe("Narration text to convert to speech"),
@@ -56379,6 +56459,8 @@ var generateSoundEffectTool = defineTool({
56379
56459
  name: "generate_sound_effect",
56380
56460
  category: "generate",
56381
56461
  cost: "low",
56462
+ title: "Generate Sound Effect",
56463
+ annotations: { readOnly: false, openWorld: true },
56382
56464
  description: "Generate sound effects using ElevenLabs. Requires ELEVENLABS_API_KEY.",
56383
56465
  schema: external_exports.object({
56384
56466
  prompt: external_exports.string().describe("Description of the sound effect"),
@@ -56400,6 +56482,8 @@ var generateMusicTool = defineTool({
56400
56482
  name: "generate_music",
56401
56483
  category: "generate",
56402
56484
  cost: "low",
56485
+ title: "Generate Music",
56486
+ annotations: { readOnly: false, openWorld: true },
56403
56487
  description: "Generate background music from text prompt. ElevenLabs (default, up to 10min) or Replicate MusicGen (max 30s). Requires ELEVENLABS_API_KEY or REPLICATE_API_TOKEN.",
56404
56488
  schema: external_exports.object({
56405
56489
  prompt: external_exports.string().describe("Description of the music to generate"),
@@ -56445,6 +56529,8 @@ var generateMusicStatusTool = defineTool({
56445
56529
  name: "generate_music_status",
56446
56530
  category: "generate",
56447
56531
  cost: "free",
56532
+ title: "Check Music Generation Status",
56533
+ annotations: { readOnly: true, openWorld: true },
56448
56534
  description: "Check Replicate music generation task status. `generate_music` returns a task id; this tool polls it until the audio URL is ready. Requires REPLICATE_API_TOKEN.",
56449
56535
  schema: external_exports.object({
56450
56536
  taskId: external_exports.string().describe("Task ID returned from generate_music")
@@ -56468,6 +56554,8 @@ var generateImageTool = defineTool({
56468
56554
  name: "generate_image",
56469
56555
  category: "generate",
56470
56556
  cost: "low",
56557
+ title: "Generate Image",
56558
+ annotations: { readOnly: false, openWorld: true },
56471
56559
  description: "Generate an image using AI. Supports Gemini (free), OpenAI GPT Image, or Grok Imagine. Requires GOOGLE_API_KEY (Gemini), OPENAI_API_KEY (OpenAI), or XAI_API_KEY (Grok).",
56472
56560
  schema: external_exports.object({
56473
56561
  prompt: external_exports.string().describe("Image description prompt"),
@@ -56501,6 +56589,8 @@ var generateStoryboardTool = defineTool({
56501
56589
  name: "generate_storyboard",
56502
56590
  category: "generate",
56503
56591
  cost: "low",
56592
+ title: "Generate Storyboard",
56593
+ annotations: { readOnly: false, openWorld: true },
56504
56594
  description: "Generate a video storyboard from text content using Claude. Returns scene segments with descriptions, visuals, and narration. Requires ANTHROPIC_API_KEY.",
56505
56595
  schema: external_exports.object({
56506
56596
  content: external_exports.string().describe("Text content to analyze (script, article, etc.)"),
@@ -56524,6 +56614,8 @@ var generateBackgroundTool = defineTool({
56524
56614
  name: "generate_background",
56525
56615
  category: "generate",
56526
56616
  cost: "low",
56617
+ title: "Generate Background Image",
56618
+ annotations: { readOnly: false, openWorld: true },
56527
56619
  description: "Generate a cinematic backdrop image (OpenAI gpt-image-2 / DALL\xB7E variant tuned for video backgrounds). Returns the image URL and, when `output` is provided, downloads the PNG to disk. Requires OPENAI_API_KEY.",
56528
56620
  schema: external_exports.object({
56529
56621
  description: external_exports.string().describe("Background description / image prompt."),
@@ -56548,6 +56640,8 @@ var generateThumbnailTool = defineTool({
56548
56640
  name: "generate_thumbnail",
56549
56641
  category: "generate",
56550
56642
  cost: "low",
56643
+ title: "Generate Thumbnail",
56644
+ annotations: { readOnly: false, openWorld: true },
56551
56645
  description: "Extract the best thumbnail frame from a video using Gemini AI analysis. Requires GOOGLE_API_KEY.",
56552
56646
  schema: external_exports.object({
56553
56647
  videoPath: external_exports.string().describe("Path to the video file"),
@@ -56569,6 +56663,8 @@ var generateVideoTool = defineTool({
56569
56663
  name: "generate_video",
56570
56664
  category: "generate",
56571
56665
  cost: "high",
56666
+ title: "Generate Video",
56667
+ annotations: { readOnly: false, openWorld: true },
56572
56668
  description: "Generate video using AI. Supports Seedance 2.0 via fal.ai, Grok, Kling, Runway, and Veo. Requires FAL_API_KEY, XAI_API_KEY, KLING_API_KEY, RUNWAY_API_SECRET, or GOOGLE_API_KEY.",
56573
56669
  schema: external_exports.object({
56574
56670
  prompt: external_exports.string().describe("Text prompt describing the video"),
@@ -56630,6 +56726,8 @@ var generateVideoStatusTool = defineTool({
56630
56726
  name: "generate_video_status",
56631
56727
  category: "generate",
56632
56728
  cost: "free",
56729
+ title: "Check Video Generation Status",
56730
+ annotations: { readOnly: false, openWorld: true },
56633
56731
  description: "Check video generation status for Grok, Runway, Kling, or Veo tasks.",
56634
56732
  schema: external_exports.object({
56635
56733
  taskId: external_exports.string().describe("Task ID from video generation"),
@@ -56660,6 +56758,8 @@ var generateVideoCancelTool = defineTool({
56660
56758
  name: "generate_video_cancel",
56661
56759
  category: "generate",
56662
56760
  cost: "free",
56761
+ title: "Cancel Video Generation",
56762
+ annotations: { readOnly: false, openWorld: true },
56663
56763
  description: "Cancel a Runway video generation task.",
56664
56764
  schema: external_exports.object({
56665
56765
  taskId: external_exports.string().describe("Task ID to cancel")
@@ -56678,6 +56778,8 @@ var generateVideoExtendTool = defineTool({
56678
56778
  name: "generate_video_extend",
56679
56779
  category: "generate",
56680
56780
  cost: "high",
56781
+ title: "Extend Generated Video",
56782
+ annotations: { readOnly: false, openWorld: true },
56681
56783
  description: "Extend video duration using Kling or Veo. Requires the video/operation ID from a previous generation.",
56682
56784
  schema: external_exports.object({
56683
56785
  videoId: external_exports.string().describe("Video ID (Kling) or operation name (Veo)"),
@@ -57079,6 +57181,8 @@ var storyboardListTool = defineTool({
57079
57181
  name: "storyboard_list",
57080
57182
  category: "storyboard",
57081
57183
  cost: "free",
57184
+ title: "List Storyboard Beats",
57185
+ annotations: { readOnly: true, openWorld: false },
57082
57186
  description: "List beats, ids, durations, and cue blocks from a project's STORYBOARD.md.",
57083
57187
  schema: projectDirSchema,
57084
57188
  async execute(args, ctx) {
@@ -57105,6 +57209,8 @@ var storyboardValidateTool = defineTool({
57105
57209
  name: "storyboard_validate",
57106
57210
  category: "storyboard",
57107
57211
  cost: "free",
57212
+ title: "Validate Storyboard",
57213
+ annotations: { readOnly: true, openWorld: false },
57108
57214
  description: "Validate STORYBOARD.md beat ids and cue blocks.",
57109
57215
  schema: projectDirSchema,
57110
57216
  async execute(args, ctx) {
@@ -57135,6 +57241,8 @@ var storyboardGetTool = defineTool({
57135
57241
  name: "storyboard_get",
57136
57242
  category: "storyboard",
57137
57243
  cost: "free",
57244
+ title: "Get Storyboard Beat",
57245
+ annotations: { readOnly: true, openWorld: false },
57138
57246
  description: "Return one STORYBOARD.md beat as structured data.",
57139
57247
  schema: external_exports.object({
57140
57248
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -57157,6 +57265,8 @@ var storyboardSetTool = defineTool({
57157
57265
  name: "storyboard_set",
57158
57266
  category: "storyboard",
57159
57267
  cost: "free",
57268
+ title: "Set Storyboard Cue",
57269
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
57160
57270
  description: "Set or unset one cue on one beat in STORYBOARD.md.",
57161
57271
  schema: external_exports.object({
57162
57272
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -57193,6 +57303,8 @@ var storyboardMoveTool = defineTool({
57193
57303
  name: "storyboard_move",
57194
57304
  category: "storyboard",
57195
57305
  cost: "free",
57306
+ title: "Reorder Storyboard Beat",
57307
+ annotations: { readOnly: false, openWorld: false },
57196
57308
  description: "Move one beat after another beat in STORYBOARD.md.",
57197
57309
  schema: external_exports.object({
57198
57310
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -57223,6 +57335,8 @@ var storyboardReviseTool = defineTool({
57223
57335
  name: "storyboard_revise",
57224
57336
  category: "storyboard",
57225
57337
  cost: "low",
57338
+ title: "Revise Storyboard with AI",
57339
+ annotations: { readOnly: false, openWorld: true },
57226
57340
  description: "Revise an existing STORYBOARD.md from a natural-language request. Reads project context, validates the revised storyboard, and writes unless dryRun is true.",
57227
57341
  schema: external_exports.object({
57228
57342
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -57254,6 +57368,8 @@ var planTool = defineTool({
57254
57368
  name: "plan",
57255
57369
  category: "storyboard",
57256
57370
  cost: "free",
57371
+ title: "Plan Build Cost and Stages",
57372
+ annotations: { readOnly: true, openWorld: false },
57257
57373
  description: "Read STORYBOARD.md and return the build plan, missing artifacts, provider needs, and estimated cost.",
57258
57374
  schema: external_exports.object({
57259
57375
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION3),
@@ -58951,6 +59067,8 @@ var pipelineHighlightsTool = defineTool({
58951
59067
  name: "remix_highlights",
58952
59068
  category: "pipeline",
58953
59069
  cost: "low",
59070
+ title: "Extract Video Highlights",
59071
+ annotations: { readOnly: false, openWorld: true },
58954
59072
  description: "Extract highlight clips from a longer video using AI analysis. Requires OPENAI_API_KEY+ANTHROPIC_API_KEY or GOOGLE_API_KEY (with --use-gemini).",
58955
59073
  schema: external_exports.object({
58956
59074
  media: external_exports.string().describe("Path to the input video file"),
@@ -58984,6 +59102,8 @@ var pipelineAutoShortsTool = defineTool({
58984
59102
  name: "remix_auto_shorts",
58985
59103
  category: "pipeline",
58986
59104
  cost: "medium",
59105
+ title: "Generate Auto Shorts",
59106
+ annotations: { readOnly: false, openWorld: true },
58987
59107
  description: "Automatically generate short-form content (Reels/TikTok/Shorts) from a longer video. Same API key requirements as remix_highlights.",
58988
59108
  schema: external_exports.object({
58989
59109
  video: external_exports.string().describe("Path to the input video file"),
@@ -59021,6 +59141,8 @@ var pipelineRunTool = defineTool({
59021
59141
  name: "run",
59022
59142
  category: "pipeline",
59023
59143
  cost: "very-high",
59144
+ title: "Run YAML Pipeline",
59145
+ annotations: { readOnly: false, openWorld: true },
59024
59146
  surfaces: ["mcp"],
59025
59147
  description: "Execute a declarative YAML pipeline (Video as Code). Accepts either a file path or inline YAML. Supports dry-run, resume-from-checkpoint, and budget limits. Cost depends on the steps \u2014 use dryRun: true first to preview.",
59026
59148
  schema: external_exports.object({
@@ -59100,6 +59222,8 @@ var pipelineRegenerateSceneTool = defineTool({
59100
59222
  name: "remix_regenerate_scene",
59101
59223
  category: "pipeline",
59102
59224
  cost: "high",
59225
+ title: "Regenerate Storyboard Scenes",
59226
+ annotations: { readOnly: false, openWorld: true },
59103
59227
  description: "Regenerate specific scenes against an existing storyboard.{yaml,json} on disk. Can regenerate video, image, or narration independently.",
59104
59228
  schema: external_exports.object({
59105
59229
  projectDir: external_exports.string().describe("Path to the project output directory containing storyboard.json"),
@@ -59136,6 +59260,8 @@ var detectScenesTool = defineTool({
59136
59260
  name: "detect_scenes",
59137
59261
  category: "detect",
59138
59262
  cost: "free",
59263
+ title: "Detect Scene Cuts",
59264
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
59139
59265
  description: "Detect scene changes in video using FFmpeg. No API key needed.",
59140
59266
  schema: external_exports.object({
59141
59267
  videoPath: external_exports.string().describe("Path to the input video file"),
@@ -59160,6 +59286,8 @@ var detectSilenceTool = defineTool({
59160
59286
  name: "detect_silence",
59161
59287
  category: "detect",
59162
59288
  cost: "free",
59289
+ title: "Detect Silence Periods",
59290
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
59163
59291
  description: "Detect silence periods in audio/video using FFmpeg. No API key needed.",
59164
59292
  schema: external_exports.object({
59165
59293
  mediaPath: external_exports.string().describe("Path to the audio/video file"),
@@ -59181,6 +59309,8 @@ var detectBeatsTool = defineTool({
59181
59309
  name: "detect_beats",
59182
59310
  category: "detect",
59183
59311
  cost: "free",
59312
+ title: "Detect Audio Beats",
59313
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
59184
59314
  description: "Detect beats in audio for music sync using FFmpeg loudness analysis. No API key needed.",
59185
59315
  schema: external_exports.object({
59186
59316
  audioPath: external_exports.string().describe("Path to the audio file"),
@@ -59242,6 +59372,8 @@ var timelineCreateTool = defineTool({
59242
59372
  name: "timeline_create",
59243
59373
  category: "timeline",
59244
59374
  cost: "free",
59375
+ title: "Create Timeline",
59376
+ annotations: { readOnly: false, openWorld: false },
59245
59377
  description: "Create a low-level timeline JSON file for FFmpeg-style editing",
59246
59378
  schema: external_exports.object({
59247
59379
  name: external_exports.string().describe("Timeline name or directory path"),
@@ -59272,6 +59404,8 @@ var timelineInfoTool = defineTool({
59272
59404
  name: "timeline_info",
59273
59405
  category: "timeline",
59274
59406
  cost: "free",
59407
+ title: "Get Timeline Info",
59408
+ annotations: { readOnly: true, openWorld: false },
59275
59409
  description: "Get information about a timeline JSON file. Legacy *.vibe.json files are supported.",
59276
59410
  schema: external_exports.object({
59277
59411
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -59299,6 +59433,8 @@ var timelineAddSourceTool = defineTool({
59299
59433
  name: "timeline_add_source",
59300
59434
  category: "timeline",
59301
59435
  cost: "free",
59436
+ title: "Add Source to Timeline",
59437
+ annotations: { readOnly: false, openWorld: false },
59302
59438
  description: "Add a media source (video, audio, image) to the timeline",
59303
59439
  schema: external_exports.object({
59304
59440
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59324,6 +59460,8 @@ var timelineAddClipTool = defineTool({
59324
59460
  name: "timeline_add_clip",
59325
59461
  category: "timeline",
59326
59462
  cost: "free",
59463
+ title: "Add Clip to Timeline",
59464
+ annotations: { readOnly: false, openWorld: false },
59327
59465
  description: "Add a clip to the timeline from an existing source",
59328
59466
  schema: external_exports.object({
59329
59467
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59355,6 +59493,8 @@ var timelineSplitClipTool = defineTool({
59355
59493
  name: "timeline_split_clip",
59356
59494
  category: "timeline",
59357
59495
  cost: "free",
59496
+ title: "Split Clip",
59497
+ annotations: { readOnly: false, openWorld: false },
59358
59498
  description: "Split a clip at a specific time",
59359
59499
  schema: external_exports.object({
59360
59500
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59373,6 +59513,8 @@ var timelineTrimClipTool = defineTool({
59373
59513
  name: "timeline_trim_clip",
59374
59514
  category: "timeline",
59375
59515
  cost: "free",
59516
+ title: "Trim Clip",
59517
+ annotations: { readOnly: false, openWorld: false },
59376
59518
  description: "Trim a clip by adjusting its start or end",
59377
59519
  schema: external_exports.object({
59378
59520
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59392,6 +59534,8 @@ var timelineMoveClipTool = defineTool({
59392
59534
  name: "timeline_move_clip",
59393
59535
  category: "timeline",
59394
59536
  cost: "free",
59537
+ title: "Move Clip",
59538
+ annotations: { readOnly: false, openWorld: false },
59395
59539
  description: "Move a clip to a new position or track",
59396
59540
  schema: external_exports.object({
59397
59541
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59414,6 +59558,8 @@ var timelineDeleteClipTool = defineTool({
59414
59558
  name: "timeline_delete_clip",
59415
59559
  category: "timeline",
59416
59560
  cost: "free",
59561
+ title: "Delete Clip",
59562
+ annotations: { readOnly: false, openWorld: false },
59417
59563
  description: "Delete a clip from the timeline",
59418
59564
  schema: external_exports.object({
59419
59565
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59430,6 +59576,8 @@ var timelineDuplicateClipTool = defineTool({
59430
59576
  name: "timeline_duplicate_clip",
59431
59577
  category: "timeline",
59432
59578
  cost: "free",
59579
+ title: "Duplicate Clip",
59580
+ annotations: { readOnly: false, openWorld: false },
59433
59581
  description: "Duplicate a clip on the timeline (optionally at a new start time)",
59434
59582
  schema: external_exports.object({
59435
59583
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59448,6 +59596,8 @@ var timelineAddEffectTool = defineTool({
59448
59596
  name: "timeline_add_effect",
59449
59597
  category: "timeline",
59450
59598
  cost: "free",
59599
+ title: "Add Effect to Clip",
59600
+ annotations: { readOnly: false, openWorld: false },
59451
59601
  description: "Add an effect to a clip",
59452
59602
  schema: external_exports.object({
59453
59603
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59474,6 +59624,8 @@ var timelineAddTrackTool = defineTool({
59474
59624
  name: "timeline_add_track",
59475
59625
  category: "timeline",
59476
59626
  cost: "free",
59627
+ title: "Add Track to Timeline",
59628
+ annotations: { readOnly: false, openWorld: false },
59477
59629
  description: "Add a new track to the timeline",
59478
59630
  schema: external_exports.object({
59479
59631
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -59500,6 +59652,8 @@ var timelineListTool = defineTool({
59500
59652
  name: "timeline_list",
59501
59653
  category: "timeline",
59502
59654
  cost: "free",
59655
+ title: "List Timeline Contents",
59656
+ annotations: { readOnly: true, openWorld: false },
59503
59657
  description: "List all sources, tracks, and clips in a project",
59504
59658
  schema: external_exports.object({
59505
59659
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -59541,6 +59695,8 @@ var projectCreateTool = defineTool({
59541
59695
  name: "project_create",
59542
59696
  category: "project",
59543
59697
  cost: "free",
59698
+ title: "Create Project",
59699
+ annotations: { readOnly: false, openWorld: false },
59544
59700
  description: "Deprecated alias for creating low-level timeline state. Prefer timeline_create.",
59545
59701
  schema: external_exports.object({
59546
59702
  name: external_exports.string().describe("Project name"),
@@ -59565,6 +59721,8 @@ var projectInfoTool = defineTool({
59565
59721
  name: "project_info",
59566
59722
  category: "project",
59567
59723
  cost: "free",
59724
+ title: "Get Project Info",
59725
+ annotations: { readOnly: true, openWorld: false },
59568
59726
  description: "Deprecated alias for timeline_info. Legacy *.vibe.json files remain supported.",
59569
59727
  schema: external_exports.object({
59570
59728
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file")
@@ -60451,6 +60609,8 @@ var exportVideoTool = defineTool({
60451
60609
  name: "export_video",
60452
60610
  category: "export",
60453
60611
  cost: "free",
60612
+ title: "Export Timeline to Video",
60613
+ annotations: { readOnly: false, openWorld: false },
60454
60614
  description: "Export a VibeFrame timeline to a video file (MP4, WebM, or MOV). Requires FFmpeg.",
60455
60615
  schema: external_exports.object({
60456
60616
  projectPath: external_exports.string().describe("Path to timeline.json, a timeline directory, or a legacy *.vibe.json file"),
@@ -60541,6 +60701,8 @@ var fsListTool = defineTool({
60541
60701
  name: "fs_list",
60542
60702
  category: "agent-only",
60543
60703
  cost: "free",
60704
+ title: "List Files",
60705
+ annotations: { readOnly: true, openWorld: false },
60544
60706
  surfaces: ["agent"],
60545
60707
  description: "List files and directories in a path",
60546
60708
  schema: external_exports.object({
@@ -60574,6 +60736,8 @@ var fsReadTool = defineTool({
60574
60736
  name: "fs_read",
60575
60737
  category: "agent-only",
60576
60738
  cost: "free",
60739
+ title: "Read File",
60740
+ annotations: { readOnly: true, openWorld: false },
60577
60741
  surfaces: ["agent"],
60578
60742
  description: "Read contents of a text file",
60579
60743
  schema: external_exports.object({
@@ -60596,6 +60760,8 @@ var fsWriteTool = defineTool({
60596
60760
  name: "fs_write",
60597
60761
  category: "agent-only",
60598
60762
  cost: "free",
60763
+ title: "Write File",
60764
+ annotations: { readOnly: false, openWorld: false },
60599
60765
  surfaces: ["agent"],
60600
60766
  description: "Write content to a file",
60601
60767
  schema: external_exports.object({
@@ -60616,6 +60782,8 @@ var fsExistsTool = defineTool({
60616
60782
  name: "fs_exists",
60617
60783
  category: "agent-only",
60618
60784
  cost: "free",
60785
+ title: "Check Path Exists",
60786
+ annotations: { readOnly: true, openWorld: false },
60619
60787
  surfaces: ["agent"],
60620
60788
  description: "Check if a file or directory exists",
60621
60789
  schema: external_exports.object({
@@ -60637,6 +60805,8 @@ var batchImportTool = defineTool({
60637
60805
  name: "batch_import",
60638
60806
  category: "agent-only",
60639
60807
  cost: "free",
60808
+ title: "Batch Import Media",
60809
+ annotations: { readOnly: false, openWorld: false },
60640
60810
  surfaces: ["agent"],
60641
60811
  description: "Import multiple media files from a directory into a project. Scans directory for video, audio, and image files.",
60642
60812
  schema: external_exports.object({
@@ -60706,6 +60876,8 @@ var batchConcatTool = defineTool({
60706
60876
  name: "batch_concat",
60707
60877
  category: "agent-only",
60708
60878
  cost: "free",
60879
+ title: "Batch Concatenate Sources",
60880
+ annotations: { readOnly: false, openWorld: false },
60709
60881
  surfaces: ["agent"],
60710
60882
  description: "Concatenate multiple sources into sequential clips on the timeline",
60711
60883
  schema: external_exports.object({
@@ -60775,6 +60947,8 @@ var batchApplyEffectTool = defineTool({
60775
60947
  name: "batch_apply_effect",
60776
60948
  category: "agent-only",
60777
60949
  cost: "free",
60950
+ title: "Batch Apply Effect",
60951
+ annotations: { readOnly: false, openWorld: false },
60778
60952
  surfaces: ["agent"],
60779
60953
  description: "Apply an effect to multiple clips at once",
60780
60954
  schema: external_exports.object({
@@ -60831,6 +61005,8 @@ var timelineClearTool = defineTool({
60831
61005
  name: "timeline_clear",
60832
61006
  category: "agent-only",
60833
61007
  cost: "free",
61008
+ title: "Clear Timeline",
61009
+ annotations: { readOnly: false, openWorld: false },
60834
61010
  surfaces: ["agent"],
60835
61011
  description: "Clear timeline contents (remove clips, tracks, or sources)",
60836
61012
  schema: external_exports.object({
@@ -60905,6 +61081,8 @@ var projectSetTool = defineTool({
60905
61081
  name: "project_set",
60906
61082
  category: "agent-only",
60907
61083
  cost: "free",
61084
+ title: "Update Project Settings",
61085
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
60908
61086
  surfaces: ["agent"],
60909
61087
  description: "Update timeline settings (name, aspect ratio, frame rate)",
60910
61088
  schema: external_exports.object({
@@ -60950,6 +61128,8 @@ var projectOpenTool = defineTool({
60950
61128
  name: "project_open",
60951
61129
  category: "agent-only",
60952
61130
  cost: "free",
61131
+ title: "Open Project",
61132
+ annotations: { readOnly: false, idempotent: true, openWorld: false },
60953
61133
  surfaces: ["agent"],
60954
61134
  description: "Open an existing project and set it as the current context",
60955
61135
  schema: external_exports.object({
@@ -60988,6 +61168,8 @@ var projectSaveTool = defineTool({
60988
61168
  name: "project_save",
60989
61169
  category: "agent-only",
60990
61170
  cost: "free",
61171
+ title: "Save Project",
61172
+ annotations: { readOnly: false, openWorld: false },
60991
61173
  surfaces: ["agent"],
60992
61174
  description: "Save the current project (uses ctx.agent.projectPath if no path given)",
60993
61175
  schema: external_exports.object({
@@ -61022,6 +61204,8 @@ var exportAudioTool = defineTool({
61022
61204
  name: "export_audio",
61023
61205
  category: "agent-only",
61024
61206
  cost: "free",
61207
+ title: "Export Audio",
61208
+ annotations: { readOnly: false, openWorld: false },
61025
61209
  surfaces: ["agent"],
61026
61210
  description: "Export audio track from a project. Not implemented \u2014 use export_video then strip audio with FFmpeg.",
61027
61211
  schema: external_exports.object({
@@ -61040,6 +61224,8 @@ var exportSubtitlesTool = defineTool({
61040
61224
  name: "export_subtitles",
61041
61225
  category: "agent-only",
61042
61226
  cost: "free",
61227
+ title: "Export Subtitles",
61228
+ annotations: { readOnly: false, openWorld: false },
61043
61229
  surfaces: ["agent"],
61044
61230
  description: "Export subtitles from transcription. Not implemented \u2014 use audio_transcribe to generate subtitles from audio.",
61045
61231
  schema: external_exports.object({
@@ -61058,6 +61244,8 @@ var mediaInfoTool = defineTool({
61058
61244
  name: "media_info",
61059
61245
  category: "agent-only",
61060
61246
  cost: "free",
61247
+ title: "Get Media Info",
61248
+ annotations: { readOnly: true, openWorld: false },
61061
61249
  surfaces: ["agent"],
61062
61250
  description: "Get information about a media file (duration, resolution, codec, etc.)",
61063
61251
  schema: external_exports.object({
@@ -61142,6 +61330,8 @@ var mediaCompressTool = defineTool({
61142
61330
  name: "media_compress",
61143
61331
  category: "agent-only",
61144
61332
  cost: "free",
61333
+ title: "Compress Media",
61334
+ annotations: { readOnly: false, openWorld: false },
61145
61335
  surfaces: ["agent"],
61146
61336
  description: "Compress a video or audio file using FFmpeg",
61147
61337
  schema: external_exports.object({
@@ -61203,6 +61393,8 @@ var mediaConvertTool = defineTool({
61203
61393
  name: "media_convert",
61204
61394
  category: "agent-only",
61205
61395
  cost: "free",
61396
+ title: "Convert Media",
61397
+ annotations: { readOnly: false, openWorld: false },
61206
61398
  surfaces: ["agent"],
61207
61399
  description: "Convert media file to a different format using FFmpeg",
61208
61400
  schema: external_exports.object({
@@ -61250,6 +61442,8 @@ var mediaConcatTool = defineTool({
61250
61442
  name: "media_concat",
61251
61443
  category: "agent-only",
61252
61444
  cost: "free",
61445
+ title: "Concatenate Media Files",
61446
+ annotations: { readOnly: false, openWorld: false },
61253
61447
  surfaces: ["agent"],
61254
61448
  description: "Concatenate multiple media files into one using FFmpeg",
61255
61449
  schema: external_exports.object({
@@ -61786,6 +61980,8 @@ var guideTool = defineTool({
61786
61980
  name: "guide",
61787
61981
  category: "agent",
61788
61982
  cost: "free",
61983
+ title: "Load Workflow Guide",
61984
+ annotations: { readOnly: true, openWorld: false },
61789
61985
  description: "Load the step-by-step guide for a vibe workflow (motion overlays, BUILD scene authoring, YAML pipeline authoring, architecture choices). Universal CLI-equivalent of `vibe guide <topic>` and Claude Code's /vibe-* slash commands. Without a topic, returns the guide catalog for discovery.",
61790
61986
  schema: guideSchema,
61791
61987
  async execute(args) {
@@ -61821,6 +62017,8 @@ var statusJobTool = defineTool({
61821
62017
  name: "status_job",
61822
62018
  category: "status",
61823
62019
  cost: "free",
62020
+ title: "Check Job Status",
62021
+ annotations: { readOnly: false, destructive: false, openWorld: true },
61824
62022
  description: "Read one local async job record and optionally refresh supported provider status. Supports Runway/Kling video and Replicate music live checks. Also tracks long-running MCP build/render jobs (jobType build/render, provider local): their records are updated in-process \u2014 on completion result.payload carries the full tool result; status 'unknown' means the MCP server restarted mid-job (check build-report.json / render-report.json on disk).",
61825
62023
  schema: external_exports.object({
61826
62024
  jobId: external_exports.string().describe("Local job id returned by a no-wait command."),
@@ -61856,6 +62054,8 @@ var statusProjectTool = defineTool({
61856
62054
  name: "status_project",
61857
62055
  category: "status",
61858
62056
  cost: "free",
62057
+ title: "Check Project Status",
62058
+ annotations: { readOnly: false, destructive: false, openWorld: true },
61859
62059
  description: "Summarize build-report.json, review-report.json, and local async job records for a VibeFrame project.",
61860
62060
  schema: external_exports.object({
61861
62061
  projectDir: external_exports.string().optional().describe(PROJECT_DIR_DESCRIPTION4),