@vibeframe/mcp-server 0.113.5 → 0.113.6

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 +32 -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);
@@ -476634,8 +476640,8 @@ async function executeJumpCut(options) {
476634
476640
  };
476635
476641
  } finally {
476636
476642
  try {
476637
- const { rm: rm6 } = await import("node:fs/promises");
476638
- await rm6(tmpDir, { recursive: true, force: true });
476643
+ const { rm: rm7 } = await import("node:fs/promises");
476644
+ await rm7(tmpDir, { recursive: true, force: true });
476639
476645
  } catch {
476640
476646
  }
476641
476647
  }
@@ -476712,7 +476718,7 @@ __export(remotion_exports, {
476712
476718
  wrapComponentWithImage: () => wrapComponentWithImage,
476713
476719
  wrapComponentWithVideo: () => wrapComponentWithVideo
476714
476720
  });
476715
- import { writeFile as writeFile23, mkdir as mkdir15, rm as rm3, copyFile as copyFile5 } from "node:fs/promises";
476721
+ import { writeFile as writeFile23, mkdir as mkdir15, rm as rm4, copyFile as copyFile5 } from "node:fs/promises";
476716
476722
  import { existsSync as existsSync39 } from "node:fs";
476717
476723
  import { join as join34 } from "node:path";
476718
476724
  import { tmpdir as tmpdir3 } from "node:os";
@@ -476906,7 +476912,7 @@ async function renderMotion(options) {
476906
476912
  stderr: ${stderr}` : ""}`);
476907
476913
  return { success: false, error: `Remotion render failed: ${msg}` };
476908
476914
  } finally {
476909
- await rm3(dir, { recursive: true, force: true }).catch(() => {
476915
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
476910
476916
  });
476911
476917
  }
476912
476918
  }
@@ -476998,7 +477004,7 @@ async function renderWithEmbeddedImage(options) {
476998
477004
  const msg = error instanceof Error ? error.message : String(error);
476999
477005
  return { success: false, error: `Remotion image embed render failed: ${msg}` };
477000
477006
  } finally {
477001
- await rm3(dir, { recursive: true, force: true }).catch(() => {
477007
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
477002
477008
  });
477003
477009
  }
477004
477010
  }
@@ -477075,14 +477081,14 @@ async function renderWithEmbeddedVideo(options) {
477075
477081
  "-shortest",
477076
477082
  mp4Out
477077
477083
  ], { timeout: 12e4 });
477078
- await rm3(mp4VideoOnly, { force: true }).catch(() => {
477084
+ await rm4(mp4VideoOnly, { force: true }).catch(() => {
477079
477085
  });
477080
477086
  return { success: true, outputPath: mp4Out };
477081
477087
  } catch (error) {
477082
477088
  const msg = error instanceof Error ? error.message : String(error);
477083
477089
  return { success: false, error: `Remotion video embed render failed: ${msg}` };
477084
477090
  } finally {
477085
- await rm3(dir, { recursive: true, force: true }).catch(() => {
477091
+ await rm4(dir, { recursive: true, force: true }).catch(() => {
477086
477092
  });
477087
477093
  }
477088
477094
  }
@@ -477646,8 +477652,8 @@ SRT saved to: ${outputSrtPath2}`
477646
477652
  };
477647
477653
  } finally {
477648
477654
  try {
477649
- const { rm: rm6 } = await import("node:fs/promises");
477650
- await rm6(tmpDir, { recursive: true, force: true });
477655
+ const { rm: rm7 } = await import("node:fs/promises");
477656
+ await rm7(tmpDir, { recursive: true, force: true });
477651
477657
  } catch {
477652
477658
  }
477653
477659
  }
@@ -480265,7 +480271,7 @@ __export(project_builder_exports, {
480265
480271
  buildTempProject: () => buildTempProject,
480266
480272
  resolveSourceUrl: () => resolveSourceUrl
480267
480273
  });
480268
- import { mkdtemp as mkdtemp4, mkdir as mkdir18, copyFile as copyFile6, writeFile as writeFile28, rm as rm4, readdir as readdir5 } from "node:fs/promises";
480274
+ import { mkdtemp as mkdtemp4, mkdir as mkdir18, copyFile as copyFile6, writeFile as writeFile28, rm as rm5, readdir as readdir5 } from "node:fs/promises";
480269
480275
  import { existsSync as existsSync49 } from "node:fs";
480270
480276
  import { tmpdir as tmpdir4 } from "node:os";
480271
480277
  import { createRequire } from "node:module";
@@ -480292,7 +480298,7 @@ async function buildTempProject(state, projectFileDir) {
480292
480298
  await writeFile28(path13.join(dir, "index.html"), html, "utf-8");
480293
480299
  return {
480294
480300
  dir,
480295
- cleanup: () => rm4(dir, { recursive: true, force: true })
480301
+ cleanup: () => rm5(dir, { recursive: true, force: true })
480296
480302
  };
480297
480303
  }
480298
480304
  async function copyLottieRuntime(tempDir) {
@@ -490570,7 +490576,7 @@ init_api_key();
490570
490576
  init_exec_safe();
490571
490577
  init_remotion();
490572
490578
  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";
490579
+ import { writeFile as writeFile30, mkdir as mkdir21, rm as rm6 } from "node:fs/promises";
490574
490580
  import { existsSync as existsSync51 } from "node:fs";
490575
490581
  import { tmpdir as tmpdir5 } from "node:os";
490576
490582
  var ASS_STYLES = ["karaoke-sweep", "typewriter"];
@@ -490739,13 +490745,13 @@ async function executeAnimatedCaption(options) {
490739
490745
  ], { timeout: 12e4 });
490740
490746
  const apiKey = await getApiKey("OPENAI_API_KEY", "OpenAI");
490741
490747
  if (!apiKey) {
490742
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490748
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490743
490749
  });
490744
490750
  return { success: false, error: "OPENAI_API_KEY required for Whisper transcription. Run 'vibe setup' or set OPENAI_API_KEY in .env" };
490745
490751
  }
490746
490752
  const transcript = await transcribeWithWords(audioPath, apiKey, language);
490747
490753
  if (!transcript.words || transcript.words.length === 0) {
490748
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490754
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490749
490755
  });
490750
490756
  return { success: false, error: "No words detected in transcription" };
490751
490757
  }
@@ -490799,12 +490805,12 @@ async function executeAnimatedCaption(options) {
490799
490805
  outputPath: absOutputPath
490800
490806
  });
490801
490807
  if (!renderResult.success) {
490802
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490808
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490803
490809
  });
490804
490810
  return { success: false, error: renderResult.error };
490805
490811
  }
490806
490812
  }
490807
- await rm5(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490813
+ await rm6(tmpAudioDir, { recursive: true, force: true }).catch(() => {
490808
490814
  });
490809
490815
  return {
490810
490816
  success: true,
@@ -499731,7 +499737,7 @@ var server2 = new Server(
499731
499737
  {
499732
499738
  name: "vibeframe",
499733
499739
  // Stamped with the package version by build.js at bundle time.
499734
- version: "0.113.5"
499740
+ version: "0.113.6"
499735
499741
  },
499736
499742
  {
499737
499743
  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.6",
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/cli": "0.113.6",
64
+ "@vibeframe/core": "0.113.6"
65
65
  },
66
66
  "engines": {
67
67
  "node": ">=20"