@vibeframe/mcp-server 0.82.0 → 0.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/dist/index.js +81 -1
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -452425,7 +452425,7 @@ var init_validate = __esm({
452425
452425
  import { resolve as resolve27, extname as extname7, basename as basename8 } from "node:path";
452426
452426
  import { existsSync as existsSync39 } from "node:fs";
452427
452427
  function registerEditCommands(aiCommand) {
452428
- aiCommand.command("silence-cut").alias("sc").description("Remove silent segments from video (FFmpeg default, or Gemini for smart detection)").argument("<video>", "Video file path").option("-o, --output <path>", "Output file path (default: <name>-cut.<ext>)").option("--noise <dB>", "Silence threshold in dB (default: -30)", "-30").option("-d, --min-duration <seconds>", "Minimum silence duration to cut (default: 0.5)", "0.5").option("--padding <seconds>", "Padding around non-silent segments (default: 0.1)", "0.1").option("--analyze-only", "Only detect silence, don't cut").option("--use-gemini", "Use Gemini Video Understanding for context-aware silence detection").option("-m, --model <model>", "Gemini model (default: flash)").option("--low-res", "Low resolution mode for longer videos (Gemini only)").option("-k, --api-key <key>", "Google API key override (or set GOOGLE_API_KEY env)").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
452428
+ aiCommand.command("silence-cut").alias("sc").description("Remove silent segments from video (FFmpeg default, or Gemini for smart detection)").argument("<video>", "Video file path").option("-o, --output <path>", "Output file path (default: <name>-cut.<ext>)").option("--noise <dB>", "Silence threshold in dB (default: -30)", "-30").option("-d, --min-duration <seconds>", "Minimum silence duration to cut (default: 0.5)", "0.5").option("--padding <seconds>", "Padding around non-silent segments (default: 0.1)", "0.1").option("--analyze-only", "(deprecated \u2014 use `vibe detect silence`) Only detect silence, don't cut").option("--use-gemini", "Use Gemini Video Understanding for context-aware silence detection").option("-m, --model <model>", "Gemini model (default: flash)").option("--low-res", "Low resolution mode for longer videos (Gemini only)").option("-k, --api-key <key>", "Google API key override (or set GOOGLE_API_KEY env)").option("--dry-run", "Preview parameters without executing").addHelpText("after", `
452429
452429
  Examples:
452430
452430
  $ vibe edit silence-cut interview.mp4 -o clean.mp4
452431
452431
  $ vibe ed sc podcast.mp4 -o trimmed.mp4 --noise -25 --min-duration 1.0
@@ -452450,6 +452450,13 @@ No API key needed (FFmpeg only). Use --use-gemini for smart detection (requires
452450
452450
  const name = basename8(videoPath, ext);
452451
452451
  const outputPath = options.output || `${name}-cut${ext}`;
452452
452452
  const useGemini = options.useGemini || false;
452453
+ if (options.analyzeOnly) {
452454
+ console.error(
452455
+ source_default.yellow(
452456
+ "\u26A0 --analyze-only is deprecated. Use `vibe detect silence` for read-only detection. Will be removed in v1.0."
452457
+ )
452458
+ );
452459
+ }
452453
452460
  if (options.dryRun) {
452454
452461
  outputSuccess({
452455
452462
  command: "edit silence-cut",
@@ -453863,6 +453870,34 @@ var init_ai_fill_gaps = __esm({
453863
453870
  }
453864
453871
  });
453865
453872
 
453873
+ // ../cli/src/commands/_shared/cost-tier.ts
453874
+ function applyTier(cmd, tier) {
453875
+ cmd[COST_TIER_KEY] = tier;
453876
+ cmd.addHelpText("after", `
453877
+ Cost: ${tier} (${TIER_DESCRIPTION[tier]})
453878
+ `);
453879
+ return cmd;
453880
+ }
453881
+ function applyTiers(parent, tiers) {
453882
+ for (const cmd of parent.commands) {
453883
+ const tier = tiers[cmd.name()];
453884
+ if (tier) applyTier(cmd, tier);
453885
+ }
453886
+ }
453887
+ var TIER_DESCRIPTION, COST_TIER_KEY;
453888
+ var init_cost_tier = __esm({
453889
+ "../cli/src/commands/_shared/cost-tier.ts"() {
453890
+ "use strict";
453891
+ TIER_DESCRIPTION = {
453892
+ "free": "FFmpeg only, no API call",
453893
+ "low": "$0.01\u2013$0.10 per call",
453894
+ "high": "$1\u2013$5 per call",
453895
+ "very-high": "$5\u2013$50+ per call"
453896
+ };
453897
+ COST_TIER_KEY = /* @__PURE__ */ Symbol.for("@vibeframe/cli.costTier");
453898
+ }
453899
+ });
453900
+
453866
453901
  // ../cli/src/commands/edit-cmd.ts
453867
453902
  var edit_cmd_exports = {};
453868
453903
  __export(edit_cmd_exports, {
@@ -454065,6 +454100,7 @@ var init_edit_cmd = __esm({
454065
454100
  init_ai_fill_gaps();
454066
454101
  init_output();
454067
454102
  init_validate();
454103
+ init_cost_tier();
454068
454104
  editCommand = new Command("edit").alias("ed").description(
454069
454105
  "Edit and post-process media (silence-cut, caption, grade, reframe, upscale...)"
454070
454106
  ).addHelpText(
@@ -454812,6 +454848,26 @@ Run 'vibe schema edit.<command>' for structured parameter info.
454812
454848
  exitWithError(generalError(`Video upscaling failed: ${msg}`));
454813
454849
  }
454814
454850
  });
454851
+ applyTiers(editCommand, {
454852
+ // free — FFmpeg only
454853
+ "noise-reduce": "free",
454854
+ "fade": "free",
454855
+ "text-overlay": "free",
454856
+ "interpolate": "free",
454857
+ // low — Whisper / single LLM call
454858
+ "silence-cut": "low",
454859
+ "caption": "low",
454860
+ "translate-srt": "low",
454861
+ "jump-cut": "low",
454862
+ "grade": "low",
454863
+ "speed-ramp": "low",
454864
+ // high — vision LLM or image gen
454865
+ "reframe": "high",
454866
+ "image": "high",
454867
+ "upscale": "high",
454868
+ // very-high — video gen per gap
454869
+ "fill-gaps": "very-high"
454870
+ });
454815
454871
  }
454816
454872
  });
454817
454873
 
@@ -460269,6 +460325,10 @@ __export(generate_exports, {
460269
460325
  executeStoryboard: () => executeStoryboard,
460270
460326
  generateCommand: () => generateCommand
460271
460327
  });
460328
+ function tierLast(parent, tier) {
460329
+ const newest = parent.commands[parent.commands.length - 1];
460330
+ if (newest) applyTier(newest, tier);
460331
+ }
460272
460332
  var generateCommand;
460273
460333
  var init_generate = __esm({
460274
460334
  "../cli/src/commands/generate.ts"() {
@@ -460287,6 +460347,7 @@ var init_generate = __esm({
460287
460347
  init_video_extend();
460288
460348
  init_image();
460289
460349
  init_video();
460350
+ init_cost_tier();
460290
460351
  init_sound_effect();
460291
460352
  init_music_status();
460292
460353
  init_background();
@@ -460324,18 +460385,31 @@ Run 'vibe schema generate.<command>' for structured parameter info.
460324
460385
  `
460325
460386
  );
460326
460387
  registerImageCommand(generateCommand);
460388
+ tierLast(generateCommand, "high");
460327
460389
  registerVideoCommand(generateCommand);
460390
+ tierLast(generateCommand, "very-high");
460328
460391
  registerSpeechCommand(generateCommand);
460392
+ tierLast(generateCommand, "low");
460329
460393
  registerSoundEffectCommand(generateCommand);
460394
+ tierLast(generateCommand, "low");
460330
460395
  registerMusicCommand(generateCommand);
460396
+ tierLast(generateCommand, "low");
460331
460397
  registerMusicStatusCommand(generateCommand);
460398
+ tierLast(generateCommand, "free");
460332
460399
  registerStoryboardCommand(generateCommand);
460400
+ tierLast(generateCommand, "high");
460333
460401
  registerMotionCommand(generateCommand);
460402
+ tierLast(generateCommand, "high");
460334
460403
  registerThumbnailCommand(generateCommand);
460404
+ tierLast(generateCommand, "free");
460335
460405
  registerBackgroundCommand(generateCommand);
460406
+ tierLast(generateCommand, "high");
460336
460407
  registerVideoStatusCommand(generateCommand);
460408
+ tierLast(generateCommand, "free");
460337
460409
  registerVideoCancelCommand(generateCommand);
460410
+ tierLast(generateCommand, "free");
460338
460411
  registerVideoExtendCommand(generateCommand);
460412
+ tierLast(generateCommand, "very-high");
460339
460413
  }
460340
460414
  });
460341
460415
 
@@ -460809,6 +460883,7 @@ var init_detect = __esm({
460809
460883
  init_exec_safe();
460810
460884
  init_output();
460811
460885
  init_validate();
460886
+ init_cost_tier();
460812
460887
  detectCommand = new Command("detect").description("Auto-detect scenes, beats, and silences in media");
460813
460888
  detectCommand.command("scenes").description("Detect scene changes in video").argument("<video>", "Video file path").option("--threshold <value>", "Scene change threshold (0-1)", "0.3").option("-o, --output <path>", "Output JSON file with timestamps").option("--project <path>", "Add scenes as clips to project").option("--dry-run", "Preview parameters without executing").action(async (videoPath, options) => {
460814
460889
  const startedAt = Date.now();
@@ -461100,6 +461175,11 @@ var init_detect = __esm({
461100
461175
  exitWithError(generalError(`Beat detection failed: ${msg}`));
461101
461176
  }
461102
461177
  });
461178
+ applyTiers(detectCommand, {
461179
+ "scenes": "free",
461180
+ "silence": "free",
461181
+ "beats": "free"
461182
+ });
461103
461183
  }
461104
461184
  });
461105
461185
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.82.0",
3
+ "version": "0.83.0",
4
4
  "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {
@@ -57,8 +57,8 @@
57
57
  "tsx": "^4.21.0",
58
58
  "typescript": "^5.3.3",
59
59
  "vitest": "^1.2.2",
60
- "@vibeframe/cli": "0.82.0",
61
- "@vibeframe/core": "0.82.0"
60
+ "@vibeframe/cli": "0.83.0",
61
+ "@vibeframe/core": "0.83.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"