@vibeframe/mcp-server 0.96.0 → 0.96.4
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 +125 -15
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -24281,7 +24281,7 @@ var init_fal = __esm({
|
|
|
24281
24281
|
displayName: "Seedance 2.0",
|
|
24282
24282
|
gateway: "fal.ai",
|
|
24283
24283
|
// `fal` is a deprecated v0.x alias kept so existing scripts keep working.
|
|
24284
|
-
//
|
|
24284
|
+
// Review this alias at the 1.0 cut.
|
|
24285
24285
|
aliases: ["fal"],
|
|
24286
24286
|
models: ["seedance-2.0", "seedance-2.0-fast"],
|
|
24287
24287
|
capabilities: ["text-to-video", "image-to-video", "native-audio"],
|
|
@@ -25600,8 +25600,8 @@ async function isConfigured() {
|
|
|
25600
25600
|
}
|
|
25601
25601
|
return false;
|
|
25602
25602
|
}
|
|
25603
|
-
async function getApiKeyFromConfig(providerKey) {
|
|
25604
|
-
const config4 = await loadConfig();
|
|
25603
|
+
async function getApiKeyFromConfig(providerKey, options = {}) {
|
|
25604
|
+
const config4 = await loadConfig({ cwd: options.cwd });
|
|
25605
25605
|
if (config4?.providers[providerKey]) {
|
|
25606
25606
|
return config4.providers[providerKey];
|
|
25607
25607
|
}
|
|
@@ -448949,6 +448949,20 @@ Requirements (non-negotiable):
|
|
|
448949
448949
|
This is the #2 source of "text disappears mid-beat" bugs after \`.clip\` sizing.
|
|
448950
448950
|
- Timed children inside the composition have \`class="clip"\` plus
|
|
448951
448951
|
\`data-start\`, \`data-duration\`, \`data-track-index\`.
|
|
448952
|
+
- If the beat cues include \`backdrop\`, the build step has already generated
|
|
448953
|
+
\`assets/backdrop-${ctx.beat.id}.png\`. Use that local file as the full-frame
|
|
448954
|
+
visual backdrop. Do NOT replace it with abstract CSS, an external stock image,
|
|
448955
|
+
Unsplash, a CDN URL, or a remote placeholder.
|
|
448956
|
+
- The exact backdrop path string is \`assets/backdrop-${ctx.beat.id}.png\`.
|
|
448957
|
+
Do NOT prefix it with \`../\` or \`./\`: sub-composition fragments are mounted
|
|
448958
|
+
from the project root \`index.html\`, so \`../assets/...\` resolves outside the
|
|
448959
|
+
project and renders black.
|
|
448960
|
+
- Do not import external font or image URLs. Use the project DESIGN.md font
|
|
448961
|
+
choice when explicit; otherwise use \`Inter\`, which is available in the
|
|
448962
|
+
deterministic render font map.
|
|
448963
|
+
- If the beat cues include \`narration\`, do not embed an \`<audio>\` tag in the
|
|
448964
|
+
scene fragment. The root timeline wires \`assets/narration-${ctx.beat.id}.wav\`
|
|
448965
|
+
or \`assets/narration-${ctx.beat.id}.mp3\` separately.
|
|
448952
448966
|
- **\`.clip\` elements get visibility control from the framework but NO
|
|
448953
448967
|
sizing.** Always give \`.clip\` explicit fill via CSS:
|
|
448954
448968
|
\`{ position: absolute; inset: 0; }\` (or equivalent
|
|
@@ -449149,6 +449163,18 @@ async function composeBeatWithRetry(ctx, overrides) {
|
|
|
449149
449163
|
${formatLintFeedback(lint2.findings)}`
|
|
449150
449164
|
);
|
|
449151
449165
|
}
|
|
449166
|
+
async function resolveComposerConfigAware(explicit, cwd) {
|
|
449167
|
+
if (explicit) {
|
|
449168
|
+
const configKey = await getApiKeyFromConfig(CONFIG_PROVIDER_BY_COMPOSER[explicit], { cwd });
|
|
449169
|
+
if (configKey) return { provider: explicit, apiKey: configKey };
|
|
449170
|
+
return resolveComposer(explicit);
|
|
449171
|
+
}
|
|
449172
|
+
for (const candidate of ["claude", "gemini", "openai"]) {
|
|
449173
|
+
const configKey = await getApiKeyFromConfig(CONFIG_PROVIDER_BY_COMPOSER[candidate], { cwd });
|
|
449174
|
+
if (configKey) return { provider: candidate, apiKey: configKey };
|
|
449175
|
+
}
|
|
449176
|
+
return resolveComposer();
|
|
449177
|
+
}
|
|
449152
449178
|
async function executeComposeScenesWithSkills(params, outputDir, overrides) {
|
|
449153
449179
|
const projectRoot = params.project ? resolve15(outputDir, params.project) : resolve15(outputDir);
|
|
449154
449180
|
const designPath = resolve15(projectRoot, params.design ?? "DESIGN.md");
|
|
@@ -449173,7 +449199,7 @@ async function executeComposeScenesWithSkills(params, outputDir, overrides) {
|
|
|
449173
449199
|
let provider;
|
|
449174
449200
|
let apiKey;
|
|
449175
449201
|
try {
|
|
449176
|
-
const resolved =
|
|
449202
|
+
const resolved = await resolveComposerConfigAware(params.composer, projectRoot);
|
|
449177
449203
|
provider = resolved.provider;
|
|
449178
449204
|
apiKey = resolved.apiKey;
|
|
449179
449205
|
} catch {
|
|
@@ -449278,7 +449304,7 @@ ${failures.map((f) => ` - ${f.beatId}: ${f.error}`).join("\n")}`,
|
|
|
449278
449304
|
data: aggregateData
|
|
449279
449305
|
};
|
|
449280
449306
|
}
|
|
449281
|
-
var MODEL_SETTINGS_BY_PROVIDER, ComposeBeatError, defaultCallLLM;
|
|
449307
|
+
var MODEL_SETTINGS_BY_PROVIDER, ComposeBeatError, defaultCallLLM, CONFIG_PROVIDER_BY_COMPOSER;
|
|
449282
449308
|
var init_compose_scenes_skills = __esm({
|
|
449283
449309
|
"../cli/src/commands/_shared/compose-scenes-skills.ts"() {
|
|
449284
449310
|
"use strict";
|
|
@@ -449287,6 +449313,7 @@ var init_compose_scenes_skills = __esm({
|
|
|
449287
449313
|
init_scene_lint();
|
|
449288
449314
|
init_storyboard_parse();
|
|
449289
449315
|
init_composer_resolve();
|
|
449316
|
+
init_config();
|
|
449290
449317
|
MODEL_SETTINGS_BY_PROVIDER = {
|
|
449291
449318
|
// Anthropic Claude Sonnet 4.6 — v0.69 baseline. ~9 s/beat, $3/$15 per MTok.
|
|
449292
449319
|
claude: {
|
|
@@ -449377,6 +449404,11 @@ var init_compose_scenes_skills = __esm({
|
|
|
449377
449404
|
outputTokens: usage3?.candidatesTokenCount ?? 0
|
|
449378
449405
|
};
|
|
449379
449406
|
};
|
|
449407
|
+
CONFIG_PROVIDER_BY_COMPOSER = {
|
|
449408
|
+
claude: "anthropic",
|
|
449409
|
+
openai: "openai",
|
|
449410
|
+
gemini: "google"
|
|
449411
|
+
};
|
|
449380
449412
|
}
|
|
449381
449413
|
});
|
|
449382
449414
|
|
|
@@ -450132,7 +450164,7 @@ async function dispatchBackdrop(beat, ctx) {
|
|
|
450132
450164
|
return { status: "cached", path: rel };
|
|
450133
450165
|
}
|
|
450134
450166
|
loadSceneBuildEnv(ctx.projectDir);
|
|
450135
|
-
const apiKey = process.env.OPENAI_API_KEY ?? "";
|
|
450167
|
+
const apiKey = await getApiKeyFromConfig("openai", { cwd: ctx.projectDir }) ?? process.env.OPENAI_API_KEY ?? "";
|
|
450136
450168
|
if (!apiKey) {
|
|
450137
450169
|
const error = "OPENAI_API_KEY not set \u2014 cannot dispatch backdrop";
|
|
450138
450170
|
ctx.onProgress({ type: "backdrop-failed", beatId: beat.id, error });
|
|
@@ -450264,6 +450296,7 @@ var init_scene_build = __esm({
|
|
|
450264
450296
|
init_compose_scenes_skills();
|
|
450265
450297
|
init_compose_prompts();
|
|
450266
450298
|
init_agent_host_detect();
|
|
450299
|
+
init_config();
|
|
450267
450300
|
init_scene_render();
|
|
450268
450301
|
init_storyboard_parse();
|
|
450269
450302
|
init_scene_project();
|
|
@@ -466174,6 +466207,8 @@ function findUnresolvedRefs(params, availableStepIds) {
|
|
|
466174
466207
|
|
|
466175
466208
|
// ../cli/src/pipeline/executor.ts
|
|
466176
466209
|
init_output();
|
|
466210
|
+
init_config();
|
|
466211
|
+
init_provider_resolver();
|
|
466177
466212
|
var ACTION_METADATA = {
|
|
466178
466213
|
"generate-image": { id: "generate-image", title: "Generate image", category: "generate", command: "generate image", outputs: ["image"] },
|
|
466179
466214
|
"generate-video": { id: "generate-video", title: "Generate video", category: "generate", command: "generate video", outputs: ["video"], requiredKeys: ["provider-dependent"] },
|
|
@@ -466226,25 +466261,102 @@ function getOutput(params, outputDir, defaultName) {
|
|
|
466226
466261
|
}
|
|
466227
466262
|
return resolve57(outputDir, defaultName);
|
|
466228
466263
|
}
|
|
466264
|
+
function stringParam(value) {
|
|
466265
|
+
return typeof value === "string" && value.trim() !== "" ? value : void 0;
|
|
466266
|
+
}
|
|
466267
|
+
function numberParam2(value) {
|
|
466268
|
+
if (typeof value === "number") return Number.isFinite(value) ? value : void 0;
|
|
466269
|
+
if (typeof value === "string" && value.trim() !== "") {
|
|
466270
|
+
const n = Number(value);
|
|
466271
|
+
return Number.isFinite(n) ? n : void 0;
|
|
466272
|
+
}
|
|
466273
|
+
return void 0;
|
|
466274
|
+
}
|
|
466275
|
+
async function resolvePipelineImageProvider(provider) {
|
|
466276
|
+
const explicit = stringParam(provider)?.toLowerCase();
|
|
466277
|
+
if (explicit) return explicit;
|
|
466278
|
+
await loadProviderDefaults();
|
|
466279
|
+
return resolveProvider("image")?.name ?? "gemini";
|
|
466280
|
+
}
|
|
466281
|
+
async function resolvePipelineVideoProvider(provider) {
|
|
466282
|
+
const explicit = stringParam(provider)?.toLowerCase();
|
|
466283
|
+
if (explicit === "fal") return "seedance";
|
|
466284
|
+
if (explicit) return explicit;
|
|
466285
|
+
await loadProviderDefaults();
|
|
466286
|
+
return resolveProvider("video")?.name ?? "grok";
|
|
466287
|
+
}
|
|
466288
|
+
function providerKeyForImage(provider) {
|
|
466289
|
+
switch (provider) {
|
|
466290
|
+
case "openai":
|
|
466291
|
+
return "openai";
|
|
466292
|
+
case "gemini":
|
|
466293
|
+
return "google";
|
|
466294
|
+
case "grok":
|
|
466295
|
+
return "xai";
|
|
466296
|
+
default:
|
|
466297
|
+
return void 0;
|
|
466298
|
+
}
|
|
466299
|
+
}
|
|
466300
|
+
function providerKeyForVideo(provider) {
|
|
466301
|
+
switch (provider) {
|
|
466302
|
+
case "seedance":
|
|
466303
|
+
case "fal":
|
|
466304
|
+
return "fal";
|
|
466305
|
+
case "grok":
|
|
466306
|
+
return "xai";
|
|
466307
|
+
case "kling":
|
|
466308
|
+
return "kling";
|
|
466309
|
+
case "runway":
|
|
466310
|
+
return "runway";
|
|
466311
|
+
case "veo":
|
|
466312
|
+
return "google";
|
|
466313
|
+
default:
|
|
466314
|
+
return void 0;
|
|
466315
|
+
}
|
|
466316
|
+
}
|
|
466317
|
+
async function apiKeyForProvider(providerKey) {
|
|
466318
|
+
return providerKey ? getApiKeyFromConfig(providerKey) : void 0;
|
|
466319
|
+
}
|
|
466229
466320
|
async function ensureActionsRegistered() {
|
|
466230
466321
|
if (Object.keys(ACTION_HANDLERS).length > 0) return;
|
|
466231
466322
|
registerAction("generate-image", async (params, outputDir) => {
|
|
466232
466323
|
const { executeImageGenerate: executeImageGenerate2 } = await Promise.resolve().then(() => (init_ai_image(), ai_image_exports));
|
|
466233
466324
|
const output3 = getOutput(params, outputDir, "image.png");
|
|
466234
|
-
const
|
|
466325
|
+
const provider = await resolvePipelineImageProvider(params.provider);
|
|
466326
|
+
const r = await executeImageGenerate2({
|
|
466327
|
+
prompt: params.prompt,
|
|
466328
|
+
provider,
|
|
466329
|
+
output: output3,
|
|
466330
|
+
model: stringParam(params.model),
|
|
466331
|
+
ratio: stringParam(params.ratio),
|
|
466332
|
+
size: stringParam(params.size),
|
|
466333
|
+
quality: stringParam(params.quality),
|
|
466334
|
+
style: stringParam(params.style),
|
|
466335
|
+
count: numberParam2(params.count),
|
|
466336
|
+
apiKey: await apiKeyForProvider(providerKeyForImage(provider))
|
|
466337
|
+
});
|
|
466235
466338
|
return { id: "", action: "generate-image", success: r.success, output: r.outputPath, data: { provider: r.provider, model: r.model }, error: r.error };
|
|
466236
466339
|
});
|
|
466237
466340
|
registerAction("generate-video", async (params, outputDir) => {
|
|
466238
466341
|
const { executeVideoGenerate: executeVideoGenerate2 } = await Promise.resolve().then(() => (init_ai_video(), ai_video_exports));
|
|
466239
466342
|
const output3 = getOutput(params, outputDir, "video.mp4");
|
|
466343
|
+
const provider = await resolvePipelineVideoProvider(params.provider);
|
|
466240
466344
|
const r = await executeVideoGenerate2({
|
|
466241
466345
|
prompt: params.prompt,
|
|
466242
|
-
provider
|
|
466243
|
-
image: params.image,
|
|
466244
|
-
duration: params.duration,
|
|
466245
|
-
ratio: params.ratio,
|
|
466346
|
+
provider,
|
|
466347
|
+
image: stringParam(params.image),
|
|
466348
|
+
duration: numberParam2(params.duration),
|
|
466349
|
+
ratio: stringParam(params.ratio),
|
|
466350
|
+
seed: numberParam2(params.seed),
|
|
466351
|
+
mode: stringParam(params.mode),
|
|
466352
|
+
negative: stringParam(params.negative),
|
|
466353
|
+
resolution: stringParam(params.resolution),
|
|
466354
|
+
veoModel: stringParam(params.veoModel),
|
|
466355
|
+
runwayModel: stringParam(params.runwayModel),
|
|
466356
|
+
seedanceModel: stringParam(params.seedanceModel),
|
|
466246
466357
|
output: output3,
|
|
466247
|
-
wait: true
|
|
466358
|
+
wait: true,
|
|
466359
|
+
apiKey: await apiKeyForProvider(providerKeyForVideo(provider))
|
|
466248
466360
|
});
|
|
466249
466361
|
return { id: "", action: "generate-video", success: r.success, output: r.outputPath || r.videoUrl, data: { taskId: r.taskId, provider: r.provider, videoUrl: r.videoUrl }, error: r.error };
|
|
466250
466362
|
});
|
|
@@ -469278,9 +469390,7 @@ var ARCHITECTURE_WALKTHROUGH = `# vibe agent / build / run \u2014 when to pick w
|
|
|
469278
469390
|
|
|
469279
469391
|
The CLI has three orchestrating commands that coordinate other primitives:
|
|
469280
469392
|
\`vibe agent\`, \`vibe build\`, \`vibe run\`. New users routinely ask which one
|
|
469281
|
-
they want for a given task.
|
|
469282
|
-
[\`docs/cli-architecture.md\`](../../../docs/cli-architecture.md); this
|
|
469283
|
-
guide is the operator-facing summary.
|
|
469393
|
+
they want for a given task. This guide is the operator-facing summary.
|
|
469284
469394
|
|
|
469285
469395
|
If you already use Claude Code, Codex, Cursor, Aider, Gemini CLI, OpenCode,
|
|
469286
469396
|
or another coding agent, let that host drive \`vibe\` directly through shell
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/mcp-server",
|
|
3
|
-
"version": "0.96.
|
|
3
|
+
"version": "0.96.4",
|
|
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.96.
|
|
61
|
-
"@vibeframe/core": "0.96.
|
|
60
|
+
"@vibeframe/cli": "0.96.4",
|
|
61
|
+
"@vibeframe/core": "0.96.4"
|
|
62
62
|
},
|
|
63
63
|
"engines": {
|
|
64
64
|
"node": ">=20"
|