@vibeframe/mcp-server 0.113.5 → 0.113.7

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 +36 -26
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -473791,7 +473791,7 @@ __export(scene_build_exports, {
473791
473791
  resolveSceneBuildMode: () => resolveSceneBuildMode
473792
473792
  });
473793
473793
  import { existsSync as existsSync35, readFileSync as readFileSync12 } from "node:fs";
473794
- import { copyFile as copyFile4, mkdir as mkdir13, readFile as readFile18, writeFile as writeFile20 } from "node:fs/promises";
473794
+ import { copyFile as copyFile4, mkdir as mkdir13, readFile as readFile18, rm as rm3, writeFile as writeFile20 } from "node:fs/promises";
473795
473795
  import { dirname as dirname18, join as join31, resolve as resolve33 } from "node:path";
473796
473796
  async function executeSceneBuild(opts) {
473797
473797
  const startedAt = Date.now();
@@ -473799,9 +473799,9 @@ async function executeSceneBuild(opts) {
473799
473799
  const onProgress = opts.onProgress ?? (() => {
473800
473800
  });
473801
473801
  const mode = resolveSceneBuildMode(opts);
473802
- let selectedStage = opts.stage ?? (opts.skipRender ? "sync" : "all");
473802
+ const selectedStage = opts.stage ?? (opts.skipRender ? "sync" : "all");
473803
473803
  const skipVideoStopsRender = (opts.skipVideo ?? false) && (selectedStage === "all" || selectedStage === "render");
473804
- if (skipVideoStopsRender) selectedStage = "sync";
473804
+ const effectiveSkipRender = (opts.skipRender ?? false) || skipVideoStopsRender;
473805
473805
  const stageReports = createEmptyStageReports();
473806
473806
  const warnings = [];
473807
473807
  const retryWith = [];
@@ -474297,7 +474297,7 @@ async function executeSceneBuild(opts) {
474297
474297
  });
474298
474298
  }
474299
474299
  }
474300
- if (selectedStage === "sync" || opts.skipRender) {
474300
+ if (selectedStage === "sync" || effectiveSkipRender) {
474301
474301
  return finishBuildResult({
474302
474302
  success: true,
474303
474303
  phase: "sync-only",
@@ -474589,6 +474589,10 @@ async function dispatchNarration(beat, ctx) {
474589
474589
  }
474590
474590
  await mkdir13(dirname18(abs), { recursive: true });
474591
474591
  await writeFile20(abs, result.audioBuffer);
474592
+ for (const otherExt of ["mp3", "wav"]) {
474593
+ const sibling = join31(ctx.projectDir, `assets/narration-${beat.id}.${otherExt}`);
474594
+ if (sibling !== abs && existsSync35(sibling)) await rm3(sibling, { force: true });
474595
+ }
474592
474596
  await mkdir13(dirname18(cacheAbs), { recursive: true });
474593
474597
  await writeFile20(cacheAbs, result.audioBuffer);
474594
474598
  await writeAssetMetadata({
@@ -474621,11 +474625,12 @@ async function dispatchNarration(beat, ctx) {
474621
474625
  }
474622
474626
  function characterSheetPrompt(name, description) {
474623
474627
  return [
474624
- `Character turnaround reference sheet of an original fictional character named ${name}: ${description}.`,
474625
- "Show three full-body views side by side on one clean canvas \u2014 front view, side profile, and back view \u2014",
474626
- "with identical outfit, hairstyle, hair color, and body proportions across all three views.",
474628
+ `Character reference sheet of an original fictional character named ${name}: ${description}.`,
474629
+ "Top row: ONE large, sharp, evenly-lit frontal close-up of the FACE (head and shoulders) as the primary identity anchor \u2014 clear eyes, nose, jawline, and skin detail.",
474630
+ "Bottom row: three full-body views side by side \u2014 front, side profile, and back.",
474631
+ "The face, facial features, hairstyle, hair color, outfit, and body proportions must be IDENTICAL across the close-up and all three views.",
474627
474632
  "Plain light-grey studio background, even neutral lighting, no props.",
474628
- "Photorealistic digital character, professional concept-art character sheet layout."
474633
+ "Photorealistic, professional concept-art character sheet layout."
474629
474634
  ].join(" ");
474630
474635
  }
474631
474636
  async function buildCharacters(characters, ctx) {
@@ -474964,7 +474969,8 @@ async function ensureKeyframe(beat, ctx, keyframeCue, characterRefsRel) {
474964
474969
  imageSize: size,
474965
474970
  imageQuality: ctx.imageQuality
474966
474971
  };
474967
- const generated = sheetBuffers.length > 0 ? await editKeyframeImage(keyframeCue, sheetBuffers, imgCtx, ratio) : await generateBackdropImage(keyframeCue, imgCtx, ratio);
474972
+ const identityLock = "Keep the EXACT same person and face as the reference image(s): identical facial features (eyes, nose shape, jawline), skin tone and complexion, hairstyle, hair color, and wardrobe. Do not restyle or change the face. Change only the scene, pose, framing, and lighting. ";
474973
+ const generated = sheetBuffers.length > 0 ? await editKeyframeImage(`${identityLock}${keyframeCue}`, sheetBuffers, imgCtx, ratio) : await generateBackdropImage(keyframeCue, imgCtx, ratio);
474968
474974
  if (!generated.success) return { status: "failed", error: generated.error };
474969
474975
  await mkdir13(dirname18(abs), { recursive: true });
474970
474976
  await writeFile20(abs, generated.buffer);
@@ -475106,6 +475112,10 @@ async function dispatchVideo(beat, ctx, keyframe) {
475106
475112
  // reference-to-video.
475107
475113
  image: keyframeImageAbs,
475108
475114
  refImages: keyframeImageAbs ? void 0 : characterRefsAbs.length > 0 ? characterRefsAbs : void 0,
475115
+ // Build clips are always muted in the composition (a separate narration/music
475116
+ // track carries audio), so the model's generated audio is never used. Disable
475117
+ // it: it's wasted, and Seedance's audio moderation can spuriously fail a beat.
475118
+ generateAudio: false,
475109
475119
  apiKey: await apiKeyForVideoProvider(ctx.videoProvider, ctx.projectDir)
475110
475120
  });
475111
475121
  if (!result.success || !result.taskId) {
@@ -476634,8 +476644,8 @@ async function executeJumpCut(options) {
476634
476644
  };
476635
476645
  } finally {
476636
476646
  try {
476637
- const { rm: rm6 } = await import("node:fs/promises");
476638
- await rm6(tmpDir, { recursive: true, force: true });
476647
+ const { rm: rm7 } = await import("node:fs/promises");
476648
+ await rm7(tmpDir, { recursive: true, force: true });
476639
476649
  } catch {
476640
476650
  }
476641
476651
  }
@@ -476712,7 +476722,7 @@ __export(remotion_exports, {
476712
476722
  wrapComponentWithImage: () => wrapComponentWithImage,
476713
476723
  wrapComponentWithVideo: () => wrapComponentWithVideo
476714
476724
  });
476715
- import { writeFile as writeFile23, mkdir as mkdir15, rm as rm3, copyFile as copyFile5 } from "node:fs/promises";
476725
+ import { writeFile as writeFile23, mkdir as mkdir15, rm as rm4, copyFile as copyFile5 } from "node:fs/promises";
476716
476726
  import { existsSync as existsSync39 } from "node:fs";
476717
476727
  import { join as join34 } from "node:path";
476718
476728
  import { tmpdir as tmpdir3 } from "node:os";
@@ -476906,7 +476916,7 @@ async function renderMotion(options) {
476906
476916
  stderr: ${stderr}` : ""}`);
476907
476917
  return { success: false, error: `Remotion render failed: ${msg}` };
476908
476918
  } finally {
476909
- await rm3(dir, { recursive: true, force: true }).catch(() => {
476919
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
476910
476920
  });
476911
476921
  }
476912
476922
  }
@@ -476998,7 +477008,7 @@ async function renderWithEmbeddedImage(options) {
476998
477008
  const msg = error instanceof Error ? error.message : String(error);
476999
477009
  return { success: false, error: `Remotion image embed render failed: ${msg}` };
477000
477010
  } finally {
477001
- await rm3(dir, { recursive: true, force: true }).catch(() => {
477011
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
477002
477012
  });
477003
477013
  }
477004
477014
  }
@@ -477075,14 +477085,14 @@ async function renderWithEmbeddedVideo(options) {
477075
477085
  "-shortest",
477076
477086
  mp4Out
477077
477087
  ], { timeout: 12e4 });
477078
- await rm3(mp4VideoOnly, { force: true }).catch(() => {
477088
+ await rm4(mp4VideoOnly, { force: true }).catch(() => {
477079
477089
  });
477080
477090
  return { success: true, outputPath: mp4Out };
477081
477091
  } catch (error) {
477082
477092
  const msg = error instanceof Error ? error.message : String(error);
477083
477093
  return { success: false, error: `Remotion video embed render failed: ${msg}` };
477084
477094
  } finally {
477085
- await rm3(dir, { recursive: true, force: true }).catch(() => {
477095
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
477086
477096
  });
477087
477097
  }
477088
477098
  }
@@ -477646,8 +477656,8 @@ SRT saved to: ${outputSrtPath2}`
477646
477656
  };
477647
477657
  } finally {
477648
477658
  try {
477649
- const { rm: rm6 } = await import("node:fs/promises");
477650
- await rm6(tmpDir, { recursive: true, force: true });
477659
+ const { rm: rm7 } = await import("node:fs/promises");
477660
+ await rm7(tmpDir, { recursive: true, force: true });
477651
477661
  } catch {
477652
477662
  }
477653
477663
  }
@@ -480265,7 +480275,7 @@ __export(project_builder_exports, {
480265
480275
  buildTempProject: () => buildTempProject,
480266
480276
  resolveSourceUrl: () => resolveSourceUrl
480267
480277
  });
480268
- import { mkdtemp as mkdtemp4, mkdir as mkdir18, copyFile as copyFile6, writeFile as writeFile28, rm as rm4, readdir as readdir5 } from "node:fs/promises";
480278
+ import { mkdtemp as mkdtemp4, mkdir as mkdir18, copyFile as copyFile6, writeFile as writeFile28, rm as rm5, readdir as readdir5 } from "node:fs/promises";
480269
480279
  import { existsSync as existsSync49 } from "node:fs";
480270
480280
  import { tmpdir as tmpdir4 } from "node:os";
480271
480281
  import { createRequire } from "node:module";
@@ -480292,7 +480302,7 @@ async function buildTempProject(state, projectFileDir) {
480292
480302
  await writeFile28(path13.join(dir, "index.html"), html, "utf-8");
480293
480303
  return {
480294
480304
  dir,
480295
- cleanup: () => rm4(dir, { recursive: true, force: true })
480305
+ cleanup: () => rm5(dir, { recursive: true, force: true })
480296
480306
  };
480297
480307
  }
480298
480308
  async function copyLottieRuntime(tempDir) {
@@ -490570,7 +490580,7 @@ init_api_key();
490570
490580
  init_exec_safe();
490571
490581
  init_remotion();
490572
490582
  import { resolve as resolve45, dirname as dirname26, basename as basename13 } from "node:path";
490573
- import { writeFile as writeFile30, mkdir as mkdir21, rm as rm5 } from "node:fs/promises";
490583
+ import { writeFile as writeFile30, mkdir as mkdir21, rm as rm6 } from "node:fs/promises";
490574
490584
  import { existsSync as existsSync51 } from "node:fs";
490575
490585
  import { tmpdir as tmpdir5 } from "node:os";
490576
490586
  var ASS_STYLES = ["karaoke-sweep", "typewriter"];
@@ -490739,13 +490749,13 @@ async function executeAnimatedCaption(options) {
490739
490749
  ], { timeout: 12e4 });
490740
490750
  const apiKey = await getApiKey("OPENAI_API_KEY", "OpenAI");
490741
490751
  if (!apiKey) {
490742
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490752
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490743
490753
  });
490744
490754
  return { success: false, error: "OPENAI_API_KEY required for Whisper transcription. Run 'vibe setup' or set OPENAI_API_KEY in .env" };
490745
490755
  }
490746
490756
  const transcript = await transcribeWithWords(audioPath, apiKey, language);
490747
490757
  if (!transcript.words || transcript.words.length === 0) {
490748
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490758
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490749
490759
  });
490750
490760
  return { success: false, error: "No words detected in transcription" };
490751
490761
  }
@@ -490799,12 +490809,12 @@ async function executeAnimatedCaption(options) {
490799
490809
  outputPath: absOutputPath
490800
490810
  });
490801
490811
  if (!renderResult.success) {
490802
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490812
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490803
490813
  });
490804
490814
  return { success: false, error: renderResult.error };
490805
490815
  }
490806
490816
  }
490807
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490817
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490808
490818
  });
490809
490819
  return {
490810
490820
  success: true,
@@ -499731,7 +499741,7 @@ var server2 = new Server(
499731
499741
  {
499732
499742
  name: "vibeframe",
499733
499743
  // Stamped with the package version by build.js at bundle time.
499734
- version: "0.113.5"
499744
+ version: "0.113.7"
499735
499745
  },
499736
499746
  {
499737
499747
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.113.5",
3
+ "version": "0.113.7",
4
4
  "description": "VibeFrame MCP Server - AI-native video editing via Model Context Protocol",
5
5
  "type": "module",
6
6
  "bin": {
@@ -60,8 +60,8 @@
60
60
  "tsx": "^4.21.0",
61
61
  "typescript": "^5.3.3",
62
62
  "vitest": "^1.2.2",
63
- "@vibeframe/cli": "0.113.5",
64
- "@vibeframe/core": "0.113.5"
63
+ "@vibeframe/core": "0.113.7",
64
+ "@vibeframe/cli": "0.113.7"
65
65
  },
66
66
  "engines": {
67
67
  "node": ">=20"