@vibeframe/mcp-server 0.111.1 → 0.111.3

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 +154 -78
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -35343,8 +35343,8 @@ var require_map_generator = __commonJS({
35343
35343
  if (this.mapOpts.absolute) return file;
35344
35344
  if (file.charCodeAt(0) === 60) return file;
35345
35345
  if (/^\w+:\/\//.test(file)) return file;
35346
- let cached = this.memoizedPaths.get(file);
35347
- if (cached) return cached;
35346
+ let cached2 = this.memoizedPaths.get(file);
35347
+ if (cached2) return cached2;
35348
35348
  let from3 = this.opts.to ? dirname33(this.opts.to) : ".";
35349
35349
  if (typeof this.mapOpts.annotation === "string") {
35350
35350
  from3 = dirname33(resolve79(from3, this.mapOpts.annotation));
@@ -35407,8 +35407,8 @@ var require_map_generator = __commonJS({
35407
35407
  }
35408
35408
  }
35409
35409
  toFileUrl(path14) {
35410
- let cached = this.memoizedFileURLs.get(path14);
35411
- if (cached) return cached;
35410
+ let cached2 = this.memoizedFileURLs.get(path14);
35411
+ if (cached2) return cached2;
35412
35412
  if (pathToFileURL) {
35413
35413
  let fileURL = pathToFileURL(path14).toString();
35414
35414
  this.memoizedFileURLs.set(path14, fileURL);
@@ -35420,8 +35420,8 @@ var require_map_generator = __commonJS({
35420
35420
  }
35421
35421
  }
35422
35422
  toUrl(path14) {
35423
- let cached = this.memoizedURLs.get(path14);
35424
- if (cached) return cached;
35423
+ let cached2 = this.memoizedURLs.get(path14);
35424
+ if (cached2) return cached2;
35425
35425
  if (sep2 === "\\") {
35426
35426
  path14 = path14.replace(/\\/g, "/");
35427
35427
  }
@@ -83010,9 +83010,9 @@ var require_range = __commonJS({
83010
83010
  parseRange(range) {
83011
83011
  const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
83012
83012
  const memoKey = memoOpts + ":" + range;
83013
- const cached = cache.get(memoKey);
83014
- if (cached) {
83015
- return cached;
83013
+ const cached2 = cache.get(memoKey);
83014
+ if (cached2) {
83015
+ return cached2;
83016
83016
  }
83017
83017
  const loose = this.options.loose;
83018
83018
  const hr2 = loose ? re2[t2.HYPHENRANGELOOSE] : re2[t2.HYPHENRANGE];
@@ -182151,8 +182151,8 @@ ${lanes.join("\n")}
182151
182151
  return emptyArray;
182152
182152
  }
182153
182153
  const cache = (_a9 = host.getModuleSpecifierCache) == null ? void 0 : _a9.call(host);
182154
- const cached = cache == null ? void 0 : cache.get(importingSourceFile.path, moduleSourceFile.path, userPreferences, options);
182155
- return [cached == null ? void 0 : cached.kind, cached == null ? void 0 : cached.moduleSpecifiers, moduleSourceFile, cached == null ? void 0 : cached.modulePaths, cache];
182154
+ const cached2 = cache == null ? void 0 : cache.get(importingSourceFile.path, moduleSourceFile.path, userPreferences, options);
182155
+ return [cached2 == null ? void 0 : cached2.kind, cached2 == null ? void 0 : cached2.moduleSpecifiers, moduleSourceFile, cached2 == null ? void 0 : cached2.modulePaths, cache];
182156
182156
  }
182157
182157
  function getModuleSpecifiers(moduleSymbol, checker, compilerOptions, importingSourceFile, host, userPreferences, options = {}) {
182158
182158
  return getModuleSpecifiersWithCacheInfo(
@@ -182431,8 +182431,8 @@ ${lanes.join("\n")}
182431
182431
  const importedFilePath = toPath(importedFileName, host.getCurrentDirectory(), hostGetCanonicalFileName(host));
182432
182432
  const cache = (_a9 = host.getModuleSpecifierCache) == null ? void 0 : _a9.call(host);
182433
182433
  if (cache) {
182434
- const cached = cache.get(importingFilePath, importedFilePath, preferences, options);
182435
- if (cached == null ? void 0 : cached.modulePaths) return cached.modulePaths;
182434
+ const cached2 = cache.get(importingFilePath, importedFilePath, preferences, options);
182435
+ if (cached2 == null ? void 0 : cached2.modulePaths) return cached2.modulePaths;
182436
182436
  }
182437
182437
  const modulePaths = getAllModulePathsWorker(info, importedFileName, host, compilerOptions, options);
182438
182438
  if (cache) {
@@ -190476,9 +190476,9 @@ ${lanes.join("\n")}
190476
190476
  function typeParameterToName(type, context3) {
190477
190477
  var _a9, _b3, _c3, _d;
190478
190478
  if (context3.flags & 4 && context3.typeParameterNames) {
190479
- const cached = context3.typeParameterNames.get(getTypeId(type));
190480
- if (cached) {
190481
- return cached;
190479
+ const cached2 = context3.typeParameterNames.get(getTypeId(type));
190480
+ if (cached2) {
190481
+ return cached2;
190482
190482
  }
190483
190483
  }
190484
190484
  let result = symbolToName(
@@ -198192,9 +198192,9 @@ ${lanes.join("\n")}
198192
198192
  }
198193
198193
  function getOrCreateSubstitutionType(baseType, constraint) {
198194
198194
  const id = `${getTypeId(baseType)}>${getTypeId(constraint)}`;
198195
- const cached = substitutionTypes.get(id);
198196
- if (cached) {
198197
- return cached;
198195
+ const cached2 = substitutionTypes.get(id);
198196
+ if (cached2) {
198197
+ return cached2;
198198
198198
  }
198199
198199
  const result = createType(
198200
198200
  33554432
@@ -201593,9 +201593,9 @@ ${lanes.join("\n")}
201593
201593
  }
201594
201594
  const key2 = type.id + getAliasId(aliasSymbol, aliasTypeArguments);
201595
201595
  const mapperCache = activeTypeMappersCaches[index !== -1 ? index : activeTypeMappersCount - 1];
201596
- const cached = mapperCache.get(key2);
201597
- if (cached) {
201598
- return cached;
201596
+ const cached2 = mapperCache.get(key2);
201597
+ if (cached2) {
201598
+ return cached2;
201599
201599
  }
201600
201600
  totalInstantiationCount++;
201601
201601
  instantiationCount++;
@@ -206101,9 +206101,9 @@ ${lanes.join("\n")}
206101
206101
  return widened === original ? prop2 : createSymbolWithType(prop2, widened);
206102
206102
  }
206103
206103
  function getUndefinedProperty(prop2) {
206104
- const cached = undefinedProperties.get(prop2.escapedName);
206105
- if (cached) {
206106
- return cached;
206104
+ const cached2 = undefinedProperties.get(prop2.escapedName);
206105
+ if (cached2) {
206106
+ return cached2;
206107
206107
  }
206108
206108
  const result = createSymbolWithType(prop2, undefinedOrMissingType);
206109
206109
  result.flags |= 16777216;
@@ -208964,9 +208964,9 @@ ${lanes.join("\n")}
208964
208964
  if (!key22) {
208965
208965
  return declaredType;
208966
208966
  }
208967
- const cached = cache.get(key22);
208968
- if (cached) {
208969
- return cached;
208967
+ const cached2 = cache.get(key22);
208968
+ if (cached2) {
208969
+ return cached2;
208970
208970
  }
208971
208971
  for (let i2 = flowLoopStart; i2 < flowLoopCount; i2++) {
208972
208972
  if (flowLoopNodes[i2] === flow && flowLoopKeys[i2] === key22 && flowLoopTypes[i2].length) {
@@ -208998,9 +208998,9 @@ ${lanes.join("\n")}
208998
208998
  flowType = getTypeAtFlowNode(antecedent);
208999
208999
  flowTypeCache = saveFlowTypeCache;
209000
209000
  flowLoopCount--;
209001
- const cached2 = cache.get(key22);
209002
- if (cached2) {
209003
- return cached2;
209001
+ const cached22 = cache.get(key22);
209002
+ if (cached22) {
209003
+ return cached22;
209004
209004
  }
209005
209005
  }
209006
209006
  const type = getTypeFromFlowType(flowType);
@@ -211175,10 +211175,10 @@ ${lanes.join("\n")}
211175
211175
  );
211176
211176
  }
211177
211177
  const links = getNodeLinks(iife);
211178
- const cached = links.resolvedSignature;
211178
+ const cached2 = links.resolvedSignature;
211179
211179
  links.resolvedSignature = anySignature;
211180
211180
  const type = indexOfParameter < args.length ? getWidenedLiteralType(checkExpression(args[indexOfParameter])) : parameter.initializer ? void 0 : undefinedWideningType;
211181
- links.resolvedSignature = cached;
211181
+ links.resolvedSignature = cached2;
211182
211182
  return type;
211183
211183
  }
211184
211184
  const contextualSignature = getContextualSignature(func);
@@ -211877,8 +211877,8 @@ ${lanes.join("\n")}
211877
211877
  }
211878
211878
  function discriminateContextualTypeByJSXAttributes(node, contextualType) {
211879
211879
  const key2 = `D${getNodeId(node)},${getTypeId(contextualType)}`;
211880
- const cached = getCachedType(key2);
211881
- if (cached) return cached;
211880
+ const cached2 = getCachedType(key2);
211881
+ if (cached2) return cached2;
211882
211882
  const jsxChildrenPropertyName = getJsxElementChildrenPropertyName(getJsxNamespaceAt(node));
211883
211883
  return setCachedType(
211884
211884
  key2,
@@ -216355,12 +216355,12 @@ ${lanes.join("\n")}
216355
216355
  }
216356
216356
  function getResolvedSignature(node, candidatesOutArray, checkMode) {
216357
216357
  const links = getNodeLinks(node);
216358
- const cached = links.resolvedSignature;
216359
- if (cached && cached !== resolvingSignature && !candidatesOutArray) {
216360
- return cached;
216358
+ const cached2 = links.resolvedSignature;
216359
+ if (cached2 && cached2 !== resolvingSignature && !candidatesOutArray) {
216360
+ return cached2;
216361
216361
  }
216362
216362
  const saveResolutionStart = resolutionStart;
216363
- if (!cached) {
216363
+ if (!cached2) {
216364
216364
  resolutionStart = resolutionTargets.length;
216365
216365
  }
216366
216366
  links.resolvedSignature = resolvingSignature;
@@ -216372,7 +216372,7 @@ ${lanes.join("\n")}
216372
216372
  );
216373
216373
  resolutionStart = saveResolutionStart;
216374
216374
  if (result !== resolvingSignature) {
216375
- links.resolvedSignature = flowLoopStart === flowLoopCount ? result : cached;
216375
+ links.resolvedSignature = flowLoopStart === flowLoopCount ? result : cached2;
216376
216376
  }
216377
216377
  return result;
216378
216378
  }
@@ -279842,9 +279842,9 @@ ${lanes.join("\n")}
279842
279842
  if (!ambientModuleCache) {
279843
279843
  ambientModuleCache = /* @__PURE__ */ new Map();
279844
279844
  } else {
279845
- const cached = ambientModuleCache.get(moduleSymbol);
279846
- if (cached !== void 0) {
279847
- return cached;
279845
+ const cached2 = ambientModuleCache.get(moduleSymbol);
279846
+ if (cached2 !== void 0) {
279847
+ return cached2;
279848
279848
  }
279849
279849
  }
279850
279850
  const declaredModuleSpecifier = stripQuotes3(moduleSymbol.getName());
@@ -279869,9 +279869,9 @@ ${lanes.join("\n")}
279869
279869
  if (!sourceFileCache) {
279870
279870
  sourceFileCache = /* @__PURE__ */ new Map();
279871
279871
  } else {
279872
- const cached = sourceFileCache.get(sourceFile);
279873
- if (cached !== void 0) {
279874
- return cached;
279872
+ const cached2 = sourceFileCache.get(sourceFile);
279873
+ if (cached2 !== void 0) {
279874
+ return cached2;
279875
279875
  }
279876
279876
  }
279877
279877
  const packageName = getNodeModulesPackageNameFromFileName(sourceFile.fileName, moduleSpecifierResolutionHost);
@@ -313192,9 +313192,9 @@ ${newComment.split("\n").map((c2) => ` * ${c2}`).join("\n")}
313192
313192
  return true;
313193
313193
  }
313194
313194
  const key2 = getSymbolId(symbol) + "," + getSymbolId(parent2);
313195
- const cached = cachedResults.get(key2);
313196
- if (cached !== void 0) {
313197
- return cached;
313195
+ const cached2 = cachedResults.get(key2);
313196
+ if (cached2 !== void 0) {
313197
+ return cached2;
313198
313198
  }
313199
313199
  cachedResults.set(key2, false);
313200
313200
  const inherits = !!symbol.declarations && symbol.declarations.some(
@@ -339627,9 +339627,9 @@ var require_util5 = __commonJS({
339627
339627
  exports.isDirectorySync = exports.isDirectory = exports.removeUndefinedValuesFromObject = exports.getPropertyByPath = exports.emplace = void 0;
339628
339628
  var fs_1 = __importStar3(__require("fs"));
339629
339629
  function emplace(map3, key2, fn) {
339630
- const cached = map3.get(key2);
339631
- if (cached !== void 0) {
339632
- return cached;
339630
+ const cached2 = map3.get(key2);
339631
+ if (cached2 !== void 0) {
339632
+ return cached2;
339633
339633
  }
339634
339634
  const result = fn();
339635
339635
  map3.set(key2, result);
@@ -349374,9 +349374,9 @@ async function beginFrameCapture(page, options, frameTimeTicks, interval) {
349374
349374
  buffer = Buffer.from(result.screenshotData, "base64");
349375
349375
  lastFrameCache.set(page, buffer);
349376
349376
  } else {
349377
- const cached = lastFrameCache.get(page);
349378
- if (cached) {
349379
- buffer = cached;
349377
+ const cached2 = lastFrameCache.get(page);
349378
+ if (cached2) {
349379
+ buffer = cached2;
349380
349380
  } else {
349381
349381
  const fallback2 = await sendBeginFrame(client, {
349382
349382
  frameTimeTicks: frameTimeTicks + 1e-3,
@@ -350739,8 +350739,8 @@ function parseFrameRate(frameRateStr) {
350739
350739
  return parseFloat(frameRateStr) || 0;
350740
350740
  }
350741
350741
  async function extractVideoMetadata(filePath) {
350742
- const cached = videoMetadataCache.get(filePath);
350743
- if (cached) return cached;
350742
+ const cached2 = videoMetadataCache.get(filePath);
350743
+ if (cached2) return cached2;
350744
350744
  const probePromise = (async () => {
350745
350745
  const stdout = await runFfprobe([
350746
350746
  "-v",
@@ -350782,8 +350782,8 @@ async function extractVideoMetadata(filePath) {
350782
350782
  return probePromise;
350783
350783
  }
350784
350784
  async function extractAudioMetadata(filePath) {
350785
- const cached = audioMetadataCache.get(filePath);
350786
- if (cached) return cached;
350785
+ const cached2 = audioMetadataCache.get(filePath);
350786
+ if (cached2) return cached2;
350787
350787
  const probePromise = (async () => {
350788
350788
  const stdout = await runFfprobe([
350789
350789
  "-v",
@@ -350815,8 +350815,8 @@ async function extractAudioMetadata(filePath) {
350815
350815
  return probePromise;
350816
350816
  }
350817
350817
  async function analyzeKeyframeIntervals(filePath) {
350818
- const cached = keyframeCache.get(filePath);
350819
- if (cached) return cached;
350818
+ const cached2 = keyframeCache.get(filePath);
350819
+ if (cached2) return cached2;
350820
350820
  const promise = analyzeKeyframeIntervalsUncached(filePath);
350821
350821
  keyframeCache.set(filePath, promise);
350822
350822
  promise.catch(() => {
@@ -351210,10 +351210,10 @@ function createFrameDataUriCache(cacheLimit) {
351210
351210
  return dataUri;
351211
351211
  }
351212
351212
  async function get(framePath) {
351213
- const cached = cache.get(framePath);
351214
- if (cached) {
351215
- remember(framePath, cached);
351216
- return cached;
351213
+ const cached2 = cache.get(framePath);
351214
+ if (cached2) {
351215
+ remember(framePath, cached2);
351216
+ return cached2;
351217
351217
  }
351218
351218
  const existing = inFlight.get(framePath);
351219
351219
  if (existing) {
@@ -353778,8 +353778,8 @@ async function safeCleanup(label, fn, log2 = defaultLogger) {
353778
353778
  }
353779
353779
  }
353780
353780
  function getMaxFrameIndex(frameDir) {
353781
- const cached = frameDirMaxIndexCache.get(frameDir);
353782
- if (cached !== void 0) return cached;
353781
+ const cached2 = frameDirMaxIndexCache.get(frameDir);
353782
+ if (cached2 !== void 0) return cached2;
353783
353783
  let max = 0;
353784
353784
  try {
353785
353785
  for (const name of readdirSync6(frameDir)) {
@@ -399712,9 +399712,9 @@ ${sourceUrlComment}
399712
399712
  parseRange(range) {
399713
399713
  const memoOpts = (this.options.includePrerelease && FLAG_INCLUDE_PRERELEASE) | (this.options.loose && FLAG_LOOSE);
399714
399714
  const memoKey = memoOpts + ":" + range;
399715
- const cached = cache.get(memoKey);
399716
- if (cached) {
399717
- return cached;
399715
+ const cached2 = cache.get(memoKey);
399716
+ if (cached2) {
399717
+ return cached2;
399718
399718
  }
399719
399719
  const loose = this.options.loose;
399720
399720
  const hr2 = loose ? re2[t2.HYPHENRANGELOOSE] : re2[t2.HYPHENRANGE];
@@ -469341,14 +469341,15 @@ async function expectedRootSync(opts) {
469341
469341
  return { block, totalDurationSec: Number(cursor.toFixed(2)), audioRefs };
469342
469342
  }
469343
469343
  async function resolveSyncedBeatDuration(opts) {
469344
- if (opts.sceneDurationSec !== void 0) return Number(opts.sceneDurationSec.toFixed(2));
469345
469344
  const storyboardMin = opts.beatDuration ?? 3;
469346
- if (!opts.narrationPath) return Number(storyboardMin.toFixed(2));
469345
+ const reported = opts.sceneDurationSec;
469346
+ if (!opts.narrationPath) return Number((reported ?? storyboardMin).toFixed(2));
469347
+ const probe = opts.probeAudioDuration ?? getAudioDuration;
469347
469348
  try {
469348
- const audioDuration = await getAudioDuration(join23(opts.projectDir, opts.narrationPath));
469349
- return Number(Math.max(storyboardMin, audioDuration + 0.5).toFixed(2));
469349
+ const audioDuration = await probe(join23(opts.projectDir, opts.narrationPath));
469350
+ return Number(Math.max(storyboardMin, reported ?? 0, audioDuration + 0.5).toFixed(2));
469350
469351
  } catch {
469351
- return Number(storyboardMin.toFixed(2));
469352
+ return Number(Math.max(storyboardMin, reported ?? 0).toFixed(2));
469352
469353
  }
469353
469354
  }
469354
469355
  async function resolveProjectBeatDurations(projectDir) {
@@ -470726,6 +470727,22 @@ var init_chrome3 = __esm({
470726
470727
  }
470727
470728
  });
470728
470729
 
470730
+ // ../cli/src/commands/_shared/ffmpeg-gate.ts
470731
+ function ffmpegToolsAvailable() {
470732
+ if (testOverride !== null) return testOverride;
470733
+ if (cached === null) cached = commandExists("ffmpeg") && commandExists("ffprobe");
470734
+ return cached;
470735
+ }
470736
+ var testOverride, cached;
470737
+ var init_ffmpeg_gate = __esm({
470738
+ "../cli/src/commands/_shared/ffmpeg-gate.ts"() {
470739
+ "use strict";
470740
+ init_exec_safe();
470741
+ testOverride = null;
470742
+ cached = null;
470743
+ }
470744
+ });
470745
+
470729
470746
  // ../cli/src/commands/_shared/scene-audio-scan.ts
470730
470747
  import { readFile as readFile15 } from "node:fs/promises";
470731
470748
  import { resolve as resolve25 } from "node:path";
@@ -471047,6 +471064,33 @@ async function executeSceneRender(opts = {}) {
471047
471064
  error: `Project directory not found: ${projectDir}`
471048
471065
  };
471049
471066
  }
471067
+ if (!ffmpegToolsAvailable()) {
471068
+ return {
471069
+ success: false,
471070
+ kind: "render",
471071
+ beat: opts.beatId ?? null,
471072
+ code: "FFMPEG_MISSING",
471073
+ error: "FFmpeg (ffmpeg/ffprobe) was not found on PATH; rendering needs it for audio mux and duration checks. Install it (macOS: `brew install ffmpeg`) and retry."
471074
+ };
471075
+ }
471076
+ let autoSyncApplied = false;
471077
+ let autoSyncWarning;
471078
+ if (!opts.beatId && existsSync30(join30(projectDir, "STORYBOARD.md"))) {
471079
+ try {
471080
+ const rootPlan = await createProjectRootSyncPlan({ projectDir });
471081
+ const subPlans = await createSubCompDurationSyncPlans({
471082
+ projectDir,
471083
+ beats: await loadProjectRootSyncBeats(projectDir)
471084
+ });
471085
+ if (rootPlan.changed || subPlans.some((plan) => plan.changed)) {
471086
+ await executeSceneRepair({ projectDir });
471087
+ autoSyncApplied = true;
471088
+ autoSyncWarning = "Narration-synced durations drifted from the composed timeline; root and scene durations were re-synced before rendering (same pass as `vibe build --stage sync`).";
471089
+ }
471090
+ } catch (error) {
471091
+ autoSyncWarning = `Narration drift check skipped: ${error instanceof Error ? error.message : String(error)}`;
471092
+ }
471093
+ }
471050
471094
  let root2 = opts.root ?? projectConfig.config.composition.entry;
471051
471095
  if (opts.beatId) {
471052
471096
  const prepared = await prepareBeatRenderRoot({
@@ -471163,7 +471207,9 @@ async function executeSceneRender(opts = {}) {
471163
471207
  format: config4.format,
471164
471208
  audioCount,
471165
471209
  audioMuxApplied,
471166
- audioMuxWarning
471210
+ audioMuxWarning,
471211
+ ...autoSyncApplied ? { autoSyncApplied } : {},
471212
+ ...autoSyncWarning ? { autoSyncWarning } : {}
471167
471213
  };
471168
471214
  if (opts.revealInFinder) {
471169
471215
  try {
@@ -471424,6 +471470,10 @@ var init_scene_render = __esm({
471424
471470
  "use strict";
471425
471471
  init_dist2();
471426
471472
  init_chrome3();
471473
+ init_ffmpeg_gate();
471474
+ init_root_sync();
471475
+ init_sub_comp_duration_sync();
471476
+ init_scene_repair();
471427
471477
  init_scene_lint();
471428
471478
  init_scene_audio_scan();
471429
471479
  init_scene_audio_mux();
@@ -472874,6 +472924,28 @@ async function executeSceneBuild(opts) {
472874
472924
  providerResolution: buildPlan.providerResolution,
472875
472925
  ...result
472876
472926
  });
472927
+ if (shouldRunStage(selectedStage, "assets") || shouldRunStage(selectedStage, "sync")) {
472928
+ if (!ffmpegToolsAvailable()) {
472929
+ return finishBuildResult({
472930
+ success: false,
472931
+ phase: "failed",
472932
+ mode,
472933
+ selectedStage,
472934
+ code: "FFMPEG_MISSING",
472935
+ error: "ffprobe (part of FFmpeg) was not found on PATH. Narration-synced durations cannot be computed without it.",
472936
+ message: "ffprobe not found on PATH.",
472937
+ suggestion: "Install FFmpeg (macOS: `brew install ffmpeg`), then re-run the build.",
472938
+ recoverable: true,
472939
+ beats: [],
472940
+ stageReports,
472941
+ warnings,
472942
+ retryWith,
472943
+ status: "failed",
472944
+ currentStage: "assets",
472945
+ totalLatencyMs: Date.now() - startedAt
472946
+ });
472947
+ }
472948
+ }
472877
472949
  if (!buildPlan.validation.ok) {
472878
472950
  let invalidBeats = [];
472879
472951
  if (existsSync35(storyboardPath)) {
@@ -474545,6 +474617,7 @@ var init_scene_build = __esm({
474545
474617
  import_dotenv3 = __toESM(require_main(), 1);
474546
474618
  init_dist();
474547
474619
  init_audio();
474620
+ init_ffmpeg_gate();
474548
474621
  init_concurrency();
474549
474622
  init_compose_scenes_skills();
474550
474623
  init_compose_prompts();
@@ -488653,10 +488726,13 @@ function mapRenderResultToToolResult(result, projectDir) {
488653
488726
  format: result.format,
488654
488727
  audioCount: result.audioCount,
488655
488728
  audioMuxApplied: result.audioMuxApplied,
488656
- audioMuxWarning: result.audioMuxWarning
488729
+ audioMuxWarning: result.audioMuxWarning,
488730
+ ...result.autoSyncApplied ? { autoSyncApplied: true } : {},
488731
+ ...result.autoSyncWarning ? { autoSyncWarning: result.autoSyncWarning } : {}
488657
488732
  },
488658
488733
  humanLines: [
488659
488734
  `\u2705 Render complete: ${result.absoluteOutputPath ?? result.outputPath}`,
488735
+ ...result.autoSyncApplied ? [` auto-sync: narration-synced durations were re-applied before render`] : [],
488660
488736
  ` duration: ${((result.durationMs ?? 0) / 1e3).toFixed(1)}s`,
488661
488737
  ` frames: ${result.framesRendered ?? "?"}${result.totalFrames ? ` / ${result.totalFrames}` : ""}`,
488662
488738
  ` config: ${result.fps}fps \xB7 ${result.quality} \xB7 ${result.format}`,
@@ -498097,7 +498173,7 @@ var server2 = new Server(
498097
498173
  {
498098
498174
  name: "vibeframe",
498099
498175
  // Stamped with the package version by build.js at bundle time.
498100
- version: "0.111.1"
498176
+ version: "0.111.3"
498101
498177
  },
498102
498178
  {
498103
498179
  capabilities: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.111.1",
3
+ "version": "0.111.3",
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.111.1",
64
- "@vibeframe/core": "0.111.1"
63
+ "@vibeframe/cli": "0.111.3",
64
+ "@vibeframe/core": "0.111.3"
65
65
  },
66
66
  "engines": {
67
67
  "node": ">=20"