@vibeframe/mcp-server 0.67.0 → 0.68.0

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 +366 -57
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -13874,6 +13874,197 @@ var init_interface = __esm({
13874
13874
  }
13875
13875
  });
13876
13876
 
13877
+ // ../ai-providers/dist/define-provider.js
13878
+ function defineApiKey(meta) {
13879
+ if (apiKeyRegistry.has(meta.configKey)) {
13880
+ throw new Error(`defineApiKey: duplicate configKey "${meta.configKey}". Each API key must be declared once.`);
13881
+ }
13882
+ apiKeyRegistry.set(meta.configKey, meta);
13883
+ }
13884
+ function defineProvider(meta) {
13885
+ if (providerRegistry2.has(meta.id)) {
13886
+ throw new Error(`defineProvider: duplicate id "${meta.id}". Each provider must be declared once.`);
13887
+ }
13888
+ if (meta.apiKey !== null && !apiKeyRegistry.has(meta.apiKey)) {
13889
+ throw new Error(`defineProvider: provider "${meta.id}" references apiKey "${meta.apiKey}" but no defineApiKey call has registered it. Order issue? api-keys.ts must be imported before provider modules.`);
13890
+ }
13891
+ providerRegistry2.set(meta.id, meta);
13892
+ }
13893
+ function getProvidersFor(kind) {
13894
+ return [...providerRegistry2.values()].filter((p) => p.kinds.includes(kind)).sort((a, b) => (a.resolverPriority?.[kind] ?? 999) - (b.resolverPriority?.[kind] ?? 999)).map((p) => ({
13895
+ name: p.id,
13896
+ envVar: p.apiKey ? apiKeyRegistry.get(p.apiKey)?.envVar ?? null : null,
13897
+ label: p.label
13898
+ }));
13899
+ }
13900
+ function getProviderEnvVars() {
13901
+ return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
13902
+ }
13903
+ function getCommandKeyMap() {
13904
+ const map3 = {};
13905
+ for (const p of providerRegistry2.values()) {
13906
+ if (!p.apiKey)
13907
+ continue;
13908
+ if (!p.commandsUnlocked || p.commandsUnlocked.length === 0)
13909
+ continue;
13910
+ const envVar = apiKeyRegistry.get(p.apiKey)?.envVar;
13911
+ if (!envVar)
13912
+ continue;
13913
+ if (!map3[envVar])
13914
+ map3[envVar] = [];
13915
+ map3[envVar].push(...p.commandsUnlocked);
13916
+ }
13917
+ for (const k of apiKeyRegistry.values()) {
13918
+ if (!k.commandsUnlocked || k.commandsUnlocked.length === 0)
13919
+ continue;
13920
+ if (!map3[k.envVar])
13921
+ map3[k.envVar] = [];
13922
+ map3[k.envVar].push(...k.commandsUnlocked);
13923
+ }
13924
+ return map3;
13925
+ }
13926
+ function getSetupProviders() {
13927
+ return [...apiKeyRegistry.values()].filter((k) => k.showInSetup).map((k) => ({
13928
+ key: k.configKey,
13929
+ name: k.label,
13930
+ env: k.envVar,
13931
+ desc: k.setupDescription ?? ""
13932
+ }));
13933
+ }
13934
+ function getAllApiKeys() {
13935
+ return [...apiKeyRegistry.values()];
13936
+ }
13937
+ function getAllProviders() {
13938
+ return [...providerRegistry2.values()];
13939
+ }
13940
+ var apiKeyRegistry, providerRegistry2;
13941
+ var init_define_provider = __esm({
13942
+ "../ai-providers/dist/define-provider.js"() {
13943
+ "use strict";
13944
+ apiKeyRegistry = /* @__PURE__ */ new Map();
13945
+ providerRegistry2 = /* @__PURE__ */ new Map();
13946
+ }
13947
+ });
13948
+
13949
+ // ../ai-providers/dist/api-keys.js
13950
+ var init_api_keys = __esm({
13951
+ "../ai-providers/dist/api-keys.js"() {
13952
+ "use strict";
13953
+ init_define_provider();
13954
+ defineApiKey({
13955
+ configKey: "openai",
13956
+ envVar: "OPENAI_API_KEY",
13957
+ label: "OpenAI",
13958
+ showInSetup: true,
13959
+ setupDescription: "gpt-image-2 image gen ($, default since v0.56), Whisper transcribe, Agent",
13960
+ envExampleComment: "OpenAI API Key (Whisper transcription, gpt-image-2 \u2014 default text-to-image since v0.56)",
13961
+ envExampleUrl: "https://platform.openai.com/api-keys"
13962
+ });
13963
+ defineApiKey({
13964
+ configKey: "google",
13965
+ envVar: "GOOGLE_API_KEY",
13966
+ label: "Google",
13967
+ showInSetup: true,
13968
+ setupDescription: "Gemini \u2014 image gen (free tier), video analysis ($), Veo ($$)",
13969
+ envExampleComment: "Google API Key (Gemini auto-edit suggestions, image gen, Veo video)",
13970
+ envExampleUrl: "https://aistudio.google.com/apikey"
13971
+ });
13972
+ defineApiKey({
13973
+ configKey: "anthropic",
13974
+ envVar: "ANTHROPIC_API_KEY",
13975
+ label: "Anthropic",
13976
+ showInSetup: true,
13977
+ setupDescription: "Claude \u2014 storyboard, color grade, reframe, Agent ($)",
13978
+ envExampleComment: "Anthropic API Key (Claude motion graphics & storyboarding)",
13979
+ envExampleUrl: "https://console.anthropic.com/"
13980
+ });
13981
+ defineApiKey({
13982
+ configKey: "elevenlabs",
13983
+ envVar: "ELEVENLABS_API_KEY",
13984
+ label: "ElevenLabs",
13985
+ showInSetup: true,
13986
+ setupDescription: "TTS ($), SFX, music, voice clone, dubbing \u2014 skip to use local Kokoro",
13987
+ envExampleComment: "ElevenLabs API Key (text-to-speech \u2014 Kokoro local fallback runs when this is unset, since v0.54)",
13988
+ envExampleUrl: "https://elevenlabs.io/api"
13989
+ });
13990
+ defineApiKey({
13991
+ configKey: "fal",
13992
+ envVar: "FAL_KEY",
13993
+ label: "fal.ai",
13994
+ showInSetup: true,
13995
+ setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
13996
+ envExampleComment: "fal.ai API Key (Seedance 2.0 video \u2014 default text/image-to-video since v0.57, Artificial Analysis ELO #2)",
13997
+ envExampleUrl: "https://fal.ai/dashboard/keys"
13998
+ });
13999
+ defineApiKey({
14000
+ configKey: "xai",
14001
+ envVar: "XAI_API_KEY",
14002
+ label: "xAI",
14003
+ showInSetup: true,
14004
+ setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14005
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14006
+ envExampleUrl: "https://console.x.ai/"
14007
+ });
14008
+ defineApiKey({
14009
+ configKey: "runway",
14010
+ envVar: "RUNWAY_API_SECRET",
14011
+ label: "Runway",
14012
+ showInSetup: true,
14013
+ setupDescription: "Gen-4.5 video generation ($$)",
14014
+ envExampleComment: "Runway API Secret (Runway Gen-4.5 video generation)",
14015
+ envExampleUrl: "https://app.runwayml.com/settings/api-keys"
14016
+ });
14017
+ defineApiKey({
14018
+ configKey: "kling",
14019
+ envVar: "KLING_API_KEY",
14020
+ label: "Kling",
14021
+ showInSetup: true,
14022
+ setupDescription: "v2.5/v3 video \u2014 std ($$) and pro ($$$) modes",
14023
+ envExampleComment: "Kling API Key (Kling video generation)",
14024
+ envExampleUrl: "https://platform.klingai.com/",
14025
+ envExampleExtraLines: ["Format: ACCESS_KEY:SECRET_KEY"]
14026
+ });
14027
+ defineApiKey({
14028
+ configKey: "replicate",
14029
+ envVar: "REPLICATE_API_TOKEN",
14030
+ label: "Replicate",
14031
+ showInSetup: true,
14032
+ setupDescription: "MusicGen background music ($, max 30s)",
14033
+ envExampleComment: "Replicate API Token (music generation, video upscale, audio restoration)",
14034
+ envExampleUrl: "https://replicate.com/account/api-tokens"
14035
+ });
14036
+ defineApiKey({
14037
+ configKey: "openrouter",
14038
+ envVar: "OPENROUTER_API_KEY",
14039
+ label: "OpenRouter",
14040
+ showInSetup: true,
14041
+ setupDescription: "300+ models via one key \u2014 Agent only (pay per model)",
14042
+ envExampleComment: "OpenRouter API Key (300+ AI models via unified API, used by `vibe agent`)",
14043
+ envExampleUrl: "https://openrouter.ai/keys"
14044
+ });
14045
+ defineApiKey({
14046
+ configKey: "imgbb",
14047
+ envVar: "IMGBB_API_KEY",
14048
+ label: "ImgBB",
14049
+ showInSetup: false,
14050
+ // not prompted in setup wizard — internal upload host
14051
+ envExampleComment: "ImgBB API Key (image hosting \u2014 used by Kling and fal.ai for image-to-video uploads)",
14052
+ envExampleUrl: "https://api.imgbb.com/",
14053
+ // ImgBB has no provider class (envvar-only); doctor still shows what it
14054
+ // unlocks at the apiKey level.
14055
+ commandsUnlocked: [
14056
+ "generate video -p kling/fal (image-to-video upload host)"
14057
+ ]
14058
+ });
14059
+ defineProvider({
14060
+ id: "openrouter",
14061
+ label: "OpenRouter",
14062
+ apiKey: "openrouter",
14063
+ kinds: ["llm"]
14064
+ });
14065
+ }
14066
+ });
14067
+
13877
14068
  // ../ai-providers/dist/whisper/WhisperProvider.js
13878
14069
  var WhisperProvider, whisperProvider;
13879
14070
  var init_WhisperProvider = __esm({
@@ -15350,6 +15541,29 @@ var init_gemini = __esm({
15350
15541
  "use strict";
15351
15542
  init_GeminiProvider();
15352
15543
  init_gemini_motion();
15544
+ init_define_provider();
15545
+ defineProvider({
15546
+ id: "gemini",
15547
+ label: "Gemini",
15548
+ apiKey: "google",
15549
+ kinds: ["image", "llm"],
15550
+ resolverPriority: { image: 2 },
15551
+ commandsUnlocked: [
15552
+ "generate image",
15553
+ "edit image",
15554
+ "analyze media",
15555
+ "analyze video",
15556
+ "analyze review"
15557
+ ]
15558
+ });
15559
+ defineProvider({
15560
+ id: "veo",
15561
+ label: "Veo",
15562
+ apiKey: "google",
15563
+ kinds: ["video"],
15564
+ resolverPriority: { video: 3 },
15565
+ commandsUnlocked: ["generate video -p veo"]
15566
+ });
15353
15567
  }
15354
15568
  });
15355
15569
 
@@ -15788,6 +16002,22 @@ var init_openai = __esm({
15788
16002
  "../ai-providers/dist/openai/index.js"() {
15789
16003
  "use strict";
15790
16004
  init_OpenAIProvider();
16005
+ init_define_provider();
16006
+ defineProvider({
16007
+ id: "openai",
16008
+ label: "OpenAI",
16009
+ apiKey: "openai",
16010
+ kinds: ["llm", "image", "transcription"],
16011
+ resolverPriority: { image: 1 },
16012
+ commandsUnlocked: [
16013
+ "agent -p openai",
16014
+ "generate image -p openai",
16015
+ "edit image -p openai",
16016
+ "audio transcribe",
16017
+ "edit caption",
16018
+ "edit jump-cut"
16019
+ ]
16020
+ });
15791
16021
  }
15792
16022
  });
15793
16023
 
@@ -17429,6 +17659,22 @@ var init_claude = __esm({
17429
17659
  "../ai-providers/dist/claude/index.js"() {
17430
17660
  "use strict";
17431
17661
  init_ClaudeProvider();
17662
+ init_define_provider();
17663
+ defineProvider({
17664
+ id: "claude",
17665
+ label: "Claude (Anthropic)",
17666
+ apiKey: "anthropic",
17667
+ kinds: ["llm"],
17668
+ commandsUnlocked: [
17669
+ "agent -p claude",
17670
+ "generate storyboard",
17671
+ "generate motion",
17672
+ "edit grade",
17673
+ "edit reframe",
17674
+ "edit speed-ramp",
17675
+ "pipeline script-to-video"
17676
+ ]
17677
+ });
17432
17678
  }
17433
17679
  });
17434
17680
 
@@ -17715,6 +17961,13 @@ var init_ollama = __esm({
17715
17961
  "../ai-providers/dist/ollama/index.js"() {
17716
17962
  "use strict";
17717
17963
  init_OllamaProvider();
17964
+ init_define_provider();
17965
+ defineProvider({
17966
+ id: "ollama",
17967
+ label: "Ollama (Local)",
17968
+ apiKey: null,
17969
+ kinds: ["llm"]
17970
+ });
17718
17971
  }
17719
17972
  });
17720
17973
 
@@ -18148,6 +18401,22 @@ var init_elevenlabs = __esm({
18148
18401
  "../ai-providers/dist/elevenlabs/index.js"() {
18149
18402
  "use strict";
18150
18403
  init_ElevenLabsProvider();
18404
+ init_define_provider();
18405
+ defineProvider({
18406
+ id: "elevenlabs",
18407
+ label: "ElevenLabs",
18408
+ apiKey: "elevenlabs",
18409
+ kinds: ["speech", "music"],
18410
+ resolverPriority: { speech: 1 },
18411
+ commandsUnlocked: [
18412
+ "generate speech",
18413
+ "generate sound-effect",
18414
+ "generate music",
18415
+ "audio voices",
18416
+ "audio voice-clone",
18417
+ "audio dub"
18418
+ ]
18419
+ });
18151
18420
  }
18152
18421
  });
18153
18422
 
@@ -18243,6 +18512,14 @@ var init_kokoro = __esm({
18243
18512
  "../ai-providers/dist/kokoro/index.js"() {
18244
18513
  "use strict";
18245
18514
  init_KokoroProvider();
18515
+ init_define_provider();
18516
+ defineProvider({
18517
+ id: "kokoro",
18518
+ label: "Kokoro (local)",
18519
+ apiKey: null,
18520
+ kinds: ["speech"],
18521
+ resolverPriority: { speech: 2 }
18522
+ });
18246
18523
  }
18247
18524
  });
18248
18525
 
@@ -18809,6 +19086,15 @@ var init_runway = __esm({
18809
19086
  "../ai-providers/dist/runway/index.js"() {
18810
19087
  "use strict";
18811
19088
  init_RunwayProvider();
19089
+ init_define_provider();
19090
+ defineProvider({
19091
+ id: "runway",
19092
+ label: "Runway",
19093
+ apiKey: "runway",
19094
+ kinds: ["video"],
19095
+ resolverPriority: { video: 5 },
19096
+ commandsUnlocked: ["generate video -p runway"]
19097
+ });
18812
19098
  }
18813
19099
  });
18814
19100
 
@@ -19239,6 +19525,15 @@ var init_kling = __esm({
19239
19525
  "../ai-providers/dist/kling/index.js"() {
19240
19526
  "use strict";
19241
19527
  init_KlingProvider();
19528
+ init_define_provider();
19529
+ defineProvider({
19530
+ id: "kling",
19531
+ label: "Kling",
19532
+ apiKey: "kling",
19533
+ kinds: ["video"],
19534
+ resolverPriority: { video: 4 },
19535
+ commandsUnlocked: ["generate video -p kling"]
19536
+ });
19242
19537
  }
19243
19538
  });
19244
19539
 
@@ -19548,6 +19843,20 @@ var init_grok = __esm({
19548
19843
  "../ai-providers/dist/grok/index.js"() {
19549
19844
  "use strict";
19550
19845
  init_GrokProvider();
19846
+ init_define_provider();
19847
+ defineProvider({
19848
+ id: "grok",
19849
+ label: "Grok",
19850
+ apiKey: "xai",
19851
+ kinds: ["image", "video", "llm"],
19852
+ resolverPriority: { image: 3, video: 2 },
19853
+ commandsUnlocked: [
19854
+ "agent -p xai",
19855
+ "generate image -p grok",
19856
+ "generate video -p grok",
19857
+ "edit image -p grok"
19858
+ ]
19859
+ });
19551
19860
  }
19552
19861
  });
19553
19862
 
@@ -23810,6 +24119,19 @@ var init_fal = __esm({
23810
24119
  "../ai-providers/dist/fal/index.js"() {
23811
24120
  "use strict";
23812
24121
  init_FalProvider();
24122
+ init_define_provider();
24123
+ defineProvider({
24124
+ id: "fal",
24125
+ label: "fal.ai (Seedance 2.0)",
24126
+ apiKey: "fal",
24127
+ kinds: ["video"],
24128
+ resolverPriority: { video: 1 },
24129
+ commandsUnlocked: [
24130
+ "generate video -p fal (Seedance 2.0 \u2014 default since v0.57)",
24131
+ "generate video -p fal -m fast (lower-latency variant)",
24132
+ "generate video -p fal -i <image> (image-to-video)"
24133
+ ]
24134
+ });
23813
24135
  }
23814
24136
  });
23815
24137
 
@@ -24459,6 +24781,14 @@ var init_replicate = __esm({
24459
24781
  "../ai-providers/dist/replicate/index.js"() {
24460
24782
  "use strict";
24461
24783
  init_ReplicateProvider();
24784
+ init_define_provider();
24785
+ defineProvider({
24786
+ id: "replicate",
24787
+ label: "Replicate",
24788
+ apiKey: "replicate",
24789
+ kinds: ["music"],
24790
+ commandsUnlocked: ["generate music -p replicate"]
24791
+ });
24462
24792
  }
24463
24793
  });
24464
24794
 
@@ -24482,10 +24812,18 @@ __export(dist_exports, {
24482
24812
  RunwayProvider: () => RunwayProvider,
24483
24813
  WhisperProvider: () => WhisperProvider,
24484
24814
  claudeProvider: () => claudeProvider,
24815
+ defineApiKey: () => defineApiKey,
24816
+ defineProvider: () => defineProvider,
24485
24817
  elevenLabsProvider: () => elevenLabsProvider,
24486
24818
  falProvider: () => falProvider,
24487
24819
  geminiProvider: () => geminiProvider,
24820
+ getAllApiKeys: () => getAllApiKeys,
24821
+ getAllProviders: () => getAllProviders,
24488
24822
  getBestProviderForCapability: () => getBestProviderForCapability,
24823
+ getCommandKeyMap: () => getCommandKeyMap,
24824
+ getProviderEnvVars: () => getProviderEnvVars,
24825
+ getProvidersFor: () => getProvidersFor,
24826
+ getSetupProviders: () => getSetupProviders,
24489
24827
  grokProvider: () => grokProvider,
24490
24828
  klingProvider: () => klingProvider,
24491
24829
  kokoroProvider: () => kokoroProvider,
@@ -24503,6 +24841,8 @@ var init_dist = __esm({
24503
24841
  "use strict";
24504
24842
  init_interface();
24505
24843
  init_registry();
24844
+ init_api_keys();
24845
+ init_define_provider();
24506
24846
  init_whisper();
24507
24847
  init_gemini();
24508
24848
  init_openai();
@@ -24937,19 +25277,8 @@ var PROVIDER_ENV_VARS;
24937
25277
  var init_schema = __esm({
24938
25278
  "../cli/src/config/schema.ts"() {
24939
25279
  "use strict";
24940
- PROVIDER_ENV_VARS = {
24941
- anthropic: "ANTHROPIC_API_KEY",
24942
- openai: "OPENAI_API_KEY",
24943
- google: "GOOGLE_API_KEY",
24944
- elevenlabs: "ELEVENLABS_API_KEY",
24945
- runway: "RUNWAY_API_SECRET",
24946
- kling: "KLING_API_KEY",
24947
- fal: "FAL_KEY",
24948
- imgbb: "IMGBB_API_KEY",
24949
- replicate: "REPLICATE_API_TOKEN",
24950
- xai: "XAI_API_KEY",
24951
- openrouter: "OPENROUTER_API_KEY"
24952
- };
25280
+ init_dist();
25281
+ PROVIDER_ENV_VARS = getProviderEnvVars();
24953
25282
  }
24954
25283
  });
24955
25284
 
@@ -458534,8 +458863,8 @@ var init_ai_script_pipeline = __esm({
458534
458863
 
458535
458864
  // ../cli/src/utils/provider-resolver.ts
458536
458865
  function resolveProvider(category) {
458537
- const candidates = PROVIDER_MAP[category];
458538
- if (!candidates) return null;
458866
+ const candidates = getProvidersFor(category);
458867
+ if (candidates.length === 0) return null;
458539
458868
  if (configDefaults?.[category]) {
458540
458869
  const preferred = candidates.find((c) => c.name === configDefaults[category]);
458541
458870
  if (preferred && (preferred.envVar === null || hasApiKey(preferred.envVar))) {
@@ -458549,32 +458878,12 @@ function resolveProvider(category) {
458549
458878
  }
458550
458879
  return null;
458551
458880
  }
458552
- var IMAGE_PROVIDERS, VIDEO_PROVIDERS, SPEECH_PROVIDERS, PROVIDER_MAP, configDefaults;
458881
+ var configDefaults;
458553
458882
  var init_provider_resolver = __esm({
458554
458883
  "../cli/src/utils/provider-resolver.ts"() {
458555
458884
  "use strict";
458885
+ init_dist();
458556
458886
  init_api_key();
458557
- IMAGE_PROVIDERS = [
458558
- { name: "openai", envVar: "OPENAI_API_KEY", label: "OpenAI" },
458559
- { name: "gemini", envVar: "GOOGLE_API_KEY", label: "Gemini" },
458560
- { name: "grok", envVar: "XAI_API_KEY", label: "Grok" }
458561
- ];
458562
- VIDEO_PROVIDERS = [
458563
- { name: "fal", envVar: "FAL_KEY", label: "fal.ai (Seedance 2.0)" },
458564
- { name: "grok", envVar: "XAI_API_KEY", label: "Grok" },
458565
- { name: "veo", envVar: "GOOGLE_API_KEY", label: "Veo" },
458566
- { name: "kling", envVar: "KLING_API_KEY", label: "Kling" },
458567
- { name: "runway", envVar: "RUNWAY_API_SECRET", label: "Runway" }
458568
- ];
458569
- SPEECH_PROVIDERS = [
458570
- { name: "elevenlabs", envVar: "ELEVENLABS_API_KEY", label: "ElevenLabs" },
458571
- { name: "kokoro", envVar: null, label: "Kokoro (local)" }
458572
- ];
458573
- PROVIDER_MAP = {
458574
- image: IMAGE_PROVIDERS,
458575
- video: VIDEO_PROVIDERS,
458576
- speech: SPEECH_PROVIDERS
458577
- };
458578
458887
  configDefaults = null;
458579
458888
  }
458580
458889
  });
@@ -458791,6 +459100,7 @@ var init_generate = __esm({
458791
459100
  init_ai_helpers();
458792
459101
  init_validate();
458793
459102
  init_provider_resolver();
459103
+ init_dist();
458794
459104
  init_ai_image();
458795
459105
  init_ai_motion();
458796
459106
  init_openai_image2();
@@ -458844,17 +459154,30 @@ Examples:
458844
459154
  if (options.output) {
458845
459155
  validateOutputPath(options.output);
458846
459156
  }
458847
- const validProviders = ["openai", "dalle", "gemini", "grok", "runway"];
458848
- const providerEnvMap = {
458849
- gemini: "GOOGLE_API_KEY",
458850
- openai: "OPENAI_API_KEY",
458851
- grok: "XAI_API_KEY"
459157
+ const imageRegistry = getProvidersFor("image");
459158
+ const validProviders = [...imageRegistry.map((p) => p.name), "dalle", "runway"];
459159
+ const providerEnvMap = Object.fromEntries(
459160
+ imageRegistry.filter((p) => p.envVar !== null).map((p) => [p.name, p.envVar])
459161
+ );
459162
+ const envKeyMap = {
459163
+ ...providerEnvMap,
459164
+ dalle: "OPENAI_API_KEY",
459165
+ runway: "RUNWAY_API_SECRET"
459166
+ };
459167
+ const providerNameMap = {
459168
+ ...Object.fromEntries(imageRegistry.map((p) => [p.name, p.label])),
459169
+ // Override Gemini's resolver label "Gemini" with the more specific
459170
+ // "Google" used in error messages, and add aliases.
459171
+ gemini: "Google",
459172
+ grok: "xAI Grok",
459173
+ dalle: "OpenAI",
459174
+ runway: "Runway"
458852
459175
  };
458853
459176
  let provider;
458854
459177
  if (options.provider) {
458855
459178
  provider = options.provider.toLowerCase();
458856
459179
  if (!validProviders.includes(provider)) {
458857
- exitWithError(usageError(`Invalid provider: ${provider}`, `Available providers: openai, gemini, grok, runway`));
459180
+ exitWithError(usageError(`Invalid provider: ${provider}`, `Available providers: ${imageRegistry.map((p) => p.name).join(", ")}, runway`));
458858
459181
  }
458859
459182
  if (providerEnvMap[provider] && !hasApiKey(providerEnvMap[provider]) && !options.apiKey) {
458860
459183
  const resolved = resolveProvider("image");
@@ -458874,20 +459197,6 @@ Examples:
458874
459197
  outputResult({ dryRun: true, command: "generate image", params: { prompt: prompt3, provider, model: options.model, ratio: options.ratio, size: options.size, quality: options.quality, count: options.count, output: options.output } });
458875
459198
  return;
458876
459199
  }
458877
- const envKeyMap = {
458878
- openai: "OPENAI_API_KEY",
458879
- dalle: "OPENAI_API_KEY",
458880
- gemini: "GOOGLE_API_KEY",
458881
- grok: "XAI_API_KEY",
458882
- runway: "RUNWAY_API_SECRET"
458883
- };
458884
- const providerNameMap = {
458885
- openai: "OpenAI",
458886
- dalle: "OpenAI",
458887
- gemini: "Google",
458888
- grok: "xAI Grok",
458889
- runway: "Runway"
458890
- };
458891
459200
  const envKey = envKeyMap[provider];
458892
459201
  const providerName = providerNameMap[provider];
458893
459202
  const apiKey = await requireApiKey(envKey, providerName, options.apiKey);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/mcp-server",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
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.67.0",
61
- "@vibeframe/core": "0.67.0"
60
+ "@vibeframe/cli": "0.68.0",
61
+ "@vibeframe/core": "0.68.0"
62
62
  },
63
63
  "engines": {
64
64
  "node": ">=20"