@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.
- package/dist/index.js +36 -26
- 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
|
-
|
|
473802
|
+
const selectedStage = opts.stage ?? (opts.skipRender ? "sync" : "all");
|
|
473803
473803
|
const skipVideoStopsRender = (opts.skipVideo ?? false) && (selectedStage === "all" || selectedStage === "render");
|
|
473804
|
-
|
|
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" ||
|
|
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
|
|
474625
|
-
"
|
|
474626
|
-
"
|
|
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
|
|
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
|
|
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:
|
|
476638
|
-
await
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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:
|
|
477650
|
-
await
|
|
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
|
|
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: () =>
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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.
|
|
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.
|
|
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/
|
|
64
|
-
"@vibeframe/
|
|
63
|
+
"@vibeframe/core": "0.113.7",
|
|
64
|
+
"@vibeframe/cli": "0.113.7"
|
|
65
65
|
},
|
|
66
66
|
"engines": {
|
|
67
67
|
"node": ">=20"
|