@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.
Files changed (2) hide show
  1. package/dist/index.js +125 -15
  2. 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
- // Will be removed at the 1.0 cut (see docs/1.0-readiness.md).
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 = resolveComposer(params.composer);
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 r = await executeImageGenerate2({ prompt: params.prompt, provider: params.provider, output: output3, model: params.model, ratio: params.ratio });
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: params.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. The full audit lives in
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.0",
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.0",
61
- "@vibeframe/core": "0.96.0"
60
+ "@vibeframe/cli": "0.96.4",
61
+ "@vibeframe/core": "0.96.4"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"