@vibeframe/cli 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 +371 -120
  2. package/package.json +3 -3
package/dist/index.js CHANGED
@@ -14135,6 +14135,197 @@ var init_interface = __esm({
14135
14135
  }
14136
14136
  });
14137
14137
 
14138
+ // ../ai-providers/dist/define-provider.js
14139
+ function defineApiKey(meta) {
14140
+ if (apiKeyRegistry.has(meta.configKey)) {
14141
+ throw new Error(`defineApiKey: duplicate configKey "${meta.configKey}". Each API key must be declared once.`);
14142
+ }
14143
+ apiKeyRegistry.set(meta.configKey, meta);
14144
+ }
14145
+ function defineProvider(meta) {
14146
+ if (providerRegistry2.has(meta.id)) {
14147
+ throw new Error(`defineProvider: duplicate id "${meta.id}". Each provider must be declared once.`);
14148
+ }
14149
+ if (meta.apiKey !== null && !apiKeyRegistry.has(meta.apiKey)) {
14150
+ 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.`);
14151
+ }
14152
+ providerRegistry2.set(meta.id, meta);
14153
+ }
14154
+ function getProvidersFor(kind) {
14155
+ return [...providerRegistry2.values()].filter((p) => p.kinds.includes(kind)).sort((a, b) => (a.resolverPriority?.[kind] ?? 999) - (b.resolverPriority?.[kind] ?? 999)).map((p) => ({
14156
+ name: p.id,
14157
+ envVar: p.apiKey ? apiKeyRegistry.get(p.apiKey)?.envVar ?? null : null,
14158
+ label: p.label
14159
+ }));
14160
+ }
14161
+ function getProviderEnvVars() {
14162
+ return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
14163
+ }
14164
+ function getCommandKeyMap() {
14165
+ const map = {};
14166
+ for (const p of providerRegistry2.values()) {
14167
+ if (!p.apiKey)
14168
+ continue;
14169
+ if (!p.commandsUnlocked || p.commandsUnlocked.length === 0)
14170
+ continue;
14171
+ const envVar = apiKeyRegistry.get(p.apiKey)?.envVar;
14172
+ if (!envVar)
14173
+ continue;
14174
+ if (!map[envVar])
14175
+ map[envVar] = [];
14176
+ map[envVar].push(...p.commandsUnlocked);
14177
+ }
14178
+ for (const k of apiKeyRegistry.values()) {
14179
+ if (!k.commandsUnlocked || k.commandsUnlocked.length === 0)
14180
+ continue;
14181
+ if (!map[k.envVar])
14182
+ map[k.envVar] = [];
14183
+ map[k.envVar].push(...k.commandsUnlocked);
14184
+ }
14185
+ return map;
14186
+ }
14187
+ function getSetupProviders() {
14188
+ return [...apiKeyRegistry.values()].filter((k) => k.showInSetup).map((k) => ({
14189
+ key: k.configKey,
14190
+ name: k.label,
14191
+ env: k.envVar,
14192
+ desc: k.setupDescription ?? ""
14193
+ }));
14194
+ }
14195
+ function getAllApiKeys() {
14196
+ return [...apiKeyRegistry.values()];
14197
+ }
14198
+ function getAllProviders() {
14199
+ return [...providerRegistry2.values()];
14200
+ }
14201
+ var apiKeyRegistry, providerRegistry2;
14202
+ var init_define_provider = __esm({
14203
+ "../ai-providers/dist/define-provider.js"() {
14204
+ "use strict";
14205
+ apiKeyRegistry = /* @__PURE__ */ new Map();
14206
+ providerRegistry2 = /* @__PURE__ */ new Map();
14207
+ }
14208
+ });
14209
+
14210
+ // ../ai-providers/dist/api-keys.js
14211
+ var init_api_keys = __esm({
14212
+ "../ai-providers/dist/api-keys.js"() {
14213
+ "use strict";
14214
+ init_define_provider();
14215
+ defineApiKey({
14216
+ configKey: "openai",
14217
+ envVar: "OPENAI_API_KEY",
14218
+ label: "OpenAI",
14219
+ showInSetup: true,
14220
+ setupDescription: "gpt-image-2 image gen ($, default since v0.56), Whisper transcribe, Agent",
14221
+ envExampleComment: "OpenAI API Key (Whisper transcription, gpt-image-2 \u2014 default text-to-image since v0.56)",
14222
+ envExampleUrl: "https://platform.openai.com/api-keys"
14223
+ });
14224
+ defineApiKey({
14225
+ configKey: "google",
14226
+ envVar: "GOOGLE_API_KEY",
14227
+ label: "Google",
14228
+ showInSetup: true,
14229
+ setupDescription: "Gemini \u2014 image gen (free tier), video analysis ($), Veo ($$)",
14230
+ envExampleComment: "Google API Key (Gemini auto-edit suggestions, image gen, Veo video)",
14231
+ envExampleUrl: "https://aistudio.google.com/apikey"
14232
+ });
14233
+ defineApiKey({
14234
+ configKey: "anthropic",
14235
+ envVar: "ANTHROPIC_API_KEY",
14236
+ label: "Anthropic",
14237
+ showInSetup: true,
14238
+ setupDescription: "Claude \u2014 storyboard, color grade, reframe, Agent ($)",
14239
+ envExampleComment: "Anthropic API Key (Claude motion graphics & storyboarding)",
14240
+ envExampleUrl: "https://console.anthropic.com/"
14241
+ });
14242
+ defineApiKey({
14243
+ configKey: "elevenlabs",
14244
+ envVar: "ELEVENLABS_API_KEY",
14245
+ label: "ElevenLabs",
14246
+ showInSetup: true,
14247
+ setupDescription: "TTS ($), SFX, music, voice clone, dubbing \u2014 skip to use local Kokoro",
14248
+ envExampleComment: "ElevenLabs API Key (text-to-speech \u2014 Kokoro local fallback runs when this is unset, since v0.54)",
14249
+ envExampleUrl: "https://elevenlabs.io/api"
14250
+ });
14251
+ defineApiKey({
14252
+ configKey: "fal",
14253
+ envVar: "FAL_KEY",
14254
+ label: "fal.ai",
14255
+ showInSetup: true,
14256
+ setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
14257
+ envExampleComment: "fal.ai API Key (Seedance 2.0 video \u2014 default text/image-to-video since v0.57, Artificial Analysis ELO #2)",
14258
+ envExampleUrl: "https://fal.ai/dashboard/keys"
14259
+ });
14260
+ defineApiKey({
14261
+ configKey: "xai",
14262
+ envVar: "XAI_API_KEY",
14263
+ label: "xAI",
14264
+ showInSetup: true,
14265
+ setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
14266
+ envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_KEY)",
14267
+ envExampleUrl: "https://console.x.ai/"
14268
+ });
14269
+ defineApiKey({
14270
+ configKey: "runway",
14271
+ envVar: "RUNWAY_API_SECRET",
14272
+ label: "Runway",
14273
+ showInSetup: true,
14274
+ setupDescription: "Gen-4.5 video generation ($$)",
14275
+ envExampleComment: "Runway API Secret (Runway Gen-4.5 video generation)",
14276
+ envExampleUrl: "https://app.runwayml.com/settings/api-keys"
14277
+ });
14278
+ defineApiKey({
14279
+ configKey: "kling",
14280
+ envVar: "KLING_API_KEY",
14281
+ label: "Kling",
14282
+ showInSetup: true,
14283
+ setupDescription: "v2.5/v3 video \u2014 std ($$) and pro ($$$) modes",
14284
+ envExampleComment: "Kling API Key (Kling video generation)",
14285
+ envExampleUrl: "https://platform.klingai.com/",
14286
+ envExampleExtraLines: ["Format: ACCESS_KEY:SECRET_KEY"]
14287
+ });
14288
+ defineApiKey({
14289
+ configKey: "replicate",
14290
+ envVar: "REPLICATE_API_TOKEN",
14291
+ label: "Replicate",
14292
+ showInSetup: true,
14293
+ setupDescription: "MusicGen background music ($, max 30s)",
14294
+ envExampleComment: "Replicate API Token (music generation, video upscale, audio restoration)",
14295
+ envExampleUrl: "https://replicate.com/account/api-tokens"
14296
+ });
14297
+ defineApiKey({
14298
+ configKey: "openrouter",
14299
+ envVar: "OPENROUTER_API_KEY",
14300
+ label: "OpenRouter",
14301
+ showInSetup: true,
14302
+ setupDescription: "300+ models via one key \u2014 Agent only (pay per model)",
14303
+ envExampleComment: "OpenRouter API Key (300+ AI models via unified API, used by `vibe agent`)",
14304
+ envExampleUrl: "https://openrouter.ai/keys"
14305
+ });
14306
+ defineApiKey({
14307
+ configKey: "imgbb",
14308
+ envVar: "IMGBB_API_KEY",
14309
+ label: "ImgBB",
14310
+ showInSetup: false,
14311
+ // not prompted in setup wizard — internal upload host
14312
+ envExampleComment: "ImgBB API Key (image hosting \u2014 used by Kling and fal.ai for image-to-video uploads)",
14313
+ envExampleUrl: "https://api.imgbb.com/",
14314
+ // ImgBB has no provider class (envvar-only); doctor still shows what it
14315
+ // unlocks at the apiKey level.
14316
+ commandsUnlocked: [
14317
+ "generate video -p kling/fal (image-to-video upload host)"
14318
+ ]
14319
+ });
14320
+ defineProvider({
14321
+ id: "openrouter",
14322
+ label: "OpenRouter",
14323
+ apiKey: "openrouter",
14324
+ kinds: ["llm"]
14325
+ });
14326
+ }
14327
+ });
14328
+
14138
14329
  // ../ai-providers/dist/whisper/WhisperProvider.js
14139
14330
  var WhisperProvider, whisperProvider;
14140
14331
  var init_WhisperProvider = __esm({
@@ -15611,6 +15802,29 @@ var init_gemini = __esm({
15611
15802
  "use strict";
15612
15803
  init_GeminiProvider();
15613
15804
  init_gemini_motion();
15805
+ init_define_provider();
15806
+ defineProvider({
15807
+ id: "gemini",
15808
+ label: "Gemini",
15809
+ apiKey: "google",
15810
+ kinds: ["image", "llm"],
15811
+ resolverPriority: { image: 2 },
15812
+ commandsUnlocked: [
15813
+ "generate image",
15814
+ "edit image",
15815
+ "analyze media",
15816
+ "analyze video",
15817
+ "analyze review"
15818
+ ]
15819
+ });
15820
+ defineProvider({
15821
+ id: "veo",
15822
+ label: "Veo",
15823
+ apiKey: "google",
15824
+ kinds: ["video"],
15825
+ resolverPriority: { video: 3 },
15826
+ commandsUnlocked: ["generate video -p veo"]
15827
+ });
15614
15828
  }
15615
15829
  });
15616
15830
 
@@ -16049,6 +16263,22 @@ var init_openai = __esm({
16049
16263
  "../ai-providers/dist/openai/index.js"() {
16050
16264
  "use strict";
16051
16265
  init_OpenAIProvider();
16266
+ init_define_provider();
16267
+ defineProvider({
16268
+ id: "openai",
16269
+ label: "OpenAI",
16270
+ apiKey: "openai",
16271
+ kinds: ["llm", "image", "transcription"],
16272
+ resolverPriority: { image: 1 },
16273
+ commandsUnlocked: [
16274
+ "agent -p openai",
16275
+ "generate image -p openai",
16276
+ "edit image -p openai",
16277
+ "audio transcribe",
16278
+ "edit caption",
16279
+ "edit jump-cut"
16280
+ ]
16281
+ });
16052
16282
  }
16053
16283
  });
16054
16284
 
@@ -17690,6 +17920,22 @@ var init_claude = __esm({
17690
17920
  "../ai-providers/dist/claude/index.js"() {
17691
17921
  "use strict";
17692
17922
  init_ClaudeProvider();
17923
+ init_define_provider();
17924
+ defineProvider({
17925
+ id: "claude",
17926
+ label: "Claude (Anthropic)",
17927
+ apiKey: "anthropic",
17928
+ kinds: ["llm"],
17929
+ commandsUnlocked: [
17930
+ "agent -p claude",
17931
+ "generate storyboard",
17932
+ "generate motion",
17933
+ "edit grade",
17934
+ "edit reframe",
17935
+ "edit speed-ramp",
17936
+ "pipeline script-to-video"
17937
+ ]
17938
+ });
17693
17939
  }
17694
17940
  });
17695
17941
 
@@ -17976,6 +18222,13 @@ var init_ollama = __esm({
17976
18222
  "../ai-providers/dist/ollama/index.js"() {
17977
18223
  "use strict";
17978
18224
  init_OllamaProvider();
18225
+ init_define_provider();
18226
+ defineProvider({
18227
+ id: "ollama",
18228
+ label: "Ollama (Local)",
18229
+ apiKey: null,
18230
+ kinds: ["llm"]
18231
+ });
17979
18232
  }
17980
18233
  });
17981
18234
 
@@ -18409,6 +18662,22 @@ var init_elevenlabs = __esm({
18409
18662
  "../ai-providers/dist/elevenlabs/index.js"() {
18410
18663
  "use strict";
18411
18664
  init_ElevenLabsProvider();
18665
+ init_define_provider();
18666
+ defineProvider({
18667
+ id: "elevenlabs",
18668
+ label: "ElevenLabs",
18669
+ apiKey: "elevenlabs",
18670
+ kinds: ["speech", "music"],
18671
+ resolverPriority: { speech: 1 },
18672
+ commandsUnlocked: [
18673
+ "generate speech",
18674
+ "generate sound-effect",
18675
+ "generate music",
18676
+ "audio voices",
18677
+ "audio voice-clone",
18678
+ "audio dub"
18679
+ ]
18680
+ });
18412
18681
  }
18413
18682
  });
18414
18683
 
@@ -18504,6 +18773,14 @@ var init_kokoro = __esm({
18504
18773
  "../ai-providers/dist/kokoro/index.js"() {
18505
18774
  "use strict";
18506
18775
  init_KokoroProvider();
18776
+ init_define_provider();
18777
+ defineProvider({
18778
+ id: "kokoro",
18779
+ label: "Kokoro (local)",
18780
+ apiKey: null,
18781
+ kinds: ["speech"],
18782
+ resolverPriority: { speech: 2 }
18783
+ });
18507
18784
  }
18508
18785
  });
18509
18786
 
@@ -19070,6 +19347,15 @@ var init_runway = __esm({
19070
19347
  "../ai-providers/dist/runway/index.js"() {
19071
19348
  "use strict";
19072
19349
  init_RunwayProvider();
19350
+ init_define_provider();
19351
+ defineProvider({
19352
+ id: "runway",
19353
+ label: "Runway",
19354
+ apiKey: "runway",
19355
+ kinds: ["video"],
19356
+ resolverPriority: { video: 5 },
19357
+ commandsUnlocked: ["generate video -p runway"]
19358
+ });
19073
19359
  }
19074
19360
  });
19075
19361
 
@@ -19500,6 +19786,15 @@ var init_kling = __esm({
19500
19786
  "../ai-providers/dist/kling/index.js"() {
19501
19787
  "use strict";
19502
19788
  init_KlingProvider();
19789
+ init_define_provider();
19790
+ defineProvider({
19791
+ id: "kling",
19792
+ label: "Kling",
19793
+ apiKey: "kling",
19794
+ kinds: ["video"],
19795
+ resolverPriority: { video: 4 },
19796
+ commandsUnlocked: ["generate video -p kling"]
19797
+ });
19503
19798
  }
19504
19799
  });
19505
19800
 
@@ -19809,6 +20104,20 @@ var init_grok = __esm({
19809
20104
  "../ai-providers/dist/grok/index.js"() {
19810
20105
  "use strict";
19811
20106
  init_GrokProvider();
20107
+ init_define_provider();
20108
+ defineProvider({
20109
+ id: "grok",
20110
+ label: "Grok",
20111
+ apiKey: "xai",
20112
+ kinds: ["image", "video", "llm"],
20113
+ resolverPriority: { image: 3, video: 2 },
20114
+ commandsUnlocked: [
20115
+ "agent -p xai",
20116
+ "generate image -p grok",
20117
+ "generate video -p grok",
20118
+ "edit image -p grok"
20119
+ ]
20120
+ });
19812
20121
  }
19813
20122
  });
19814
20123
 
@@ -24071,6 +24380,19 @@ var init_fal = __esm({
24071
24380
  "../ai-providers/dist/fal/index.js"() {
24072
24381
  "use strict";
24073
24382
  init_FalProvider();
24383
+ init_define_provider();
24384
+ defineProvider({
24385
+ id: "fal",
24386
+ label: "fal.ai (Seedance 2.0)",
24387
+ apiKey: "fal",
24388
+ kinds: ["video"],
24389
+ resolverPriority: { video: 1 },
24390
+ commandsUnlocked: [
24391
+ "generate video -p fal (Seedance 2.0 \u2014 default since v0.57)",
24392
+ "generate video -p fal -m fast (lower-latency variant)",
24393
+ "generate video -p fal -i <image> (image-to-video)"
24394
+ ]
24395
+ });
24074
24396
  }
24075
24397
  });
24076
24398
 
@@ -24720,6 +25042,14 @@ var init_replicate = __esm({
24720
25042
  "../ai-providers/dist/replicate/index.js"() {
24721
25043
  "use strict";
24722
25044
  init_ReplicateProvider();
25045
+ init_define_provider();
25046
+ defineProvider({
25047
+ id: "replicate",
25048
+ label: "Replicate",
25049
+ apiKey: "replicate",
25050
+ kinds: ["music"],
25051
+ commandsUnlocked: ["generate music -p replicate"]
25052
+ });
24723
25053
  }
24724
25054
  });
24725
25055
 
@@ -24743,10 +25073,18 @@ __export(dist_exports2, {
24743
25073
  RunwayProvider: () => RunwayProvider,
24744
25074
  WhisperProvider: () => WhisperProvider,
24745
25075
  claudeProvider: () => claudeProvider,
25076
+ defineApiKey: () => defineApiKey,
25077
+ defineProvider: () => defineProvider,
24746
25078
  elevenLabsProvider: () => elevenLabsProvider,
24747
25079
  falProvider: () => falProvider,
24748
25080
  geminiProvider: () => geminiProvider,
25081
+ getAllApiKeys: () => getAllApiKeys,
25082
+ getAllProviders: () => getAllProviders,
24749
25083
  getBestProviderForCapability: () => getBestProviderForCapability,
25084
+ getCommandKeyMap: () => getCommandKeyMap,
25085
+ getProviderEnvVars: () => getProviderEnvVars,
25086
+ getProvidersFor: () => getProvidersFor,
25087
+ getSetupProviders: () => getSetupProviders,
24750
25088
  grokProvider: () => grokProvider,
24751
25089
  klingProvider: () => klingProvider,
24752
25090
  kokoroProvider: () => kokoroProvider,
@@ -24764,6 +25102,8 @@ var init_dist2 = __esm({
24764
25102
  "use strict";
24765
25103
  init_interface();
24766
25104
  init_registry();
25105
+ init_api_keys();
25106
+ init_define_provider();
24767
25107
  init_whisper();
24768
25108
  init_gemini();
24769
25109
  init_openai();
@@ -25198,6 +25538,7 @@ var PROVIDER_NAMES, PROVIDER_ENV_VARS;
25198
25538
  var init_schema = __esm({
25199
25539
  "src/config/schema.ts"() {
25200
25540
  "use strict";
25541
+ init_dist2();
25201
25542
  PROVIDER_NAMES = {
25202
25543
  claude: "Claude (Anthropic)",
25203
25544
  openai: "GPT-4 (OpenAI)",
@@ -25206,19 +25547,7 @@ var init_schema = __esm({
25206
25547
  xai: "Grok (xAI)",
25207
25548
  openrouter: "OpenRouter"
25208
25549
  };
25209
- PROVIDER_ENV_VARS = {
25210
- anthropic: "ANTHROPIC_API_KEY",
25211
- openai: "OPENAI_API_KEY",
25212
- google: "GOOGLE_API_KEY",
25213
- elevenlabs: "ELEVENLABS_API_KEY",
25214
- runway: "RUNWAY_API_SECRET",
25215
- kling: "KLING_API_KEY",
25216
- fal: "FAL_KEY",
25217
- imgbb: "IMGBB_API_KEY",
25218
- replicate: "REPLICATE_API_TOKEN",
25219
- xai: "XAI_API_KEY",
25220
- openrouter: "OPENROUTER_API_KEY"
25221
- };
25550
+ PROVIDER_ENV_VARS = getProviderEnvVars();
25222
25551
  }
25223
25552
  });
25224
25553
 
@@ -34411,8 +34740,8 @@ var init_ai_script_pipeline = __esm({
34411
34740
 
34412
34741
  // src/utils/provider-resolver.ts
34413
34742
  function resolveProvider(category) {
34414
- const candidates = PROVIDER_MAP[category];
34415
- if (!candidates) return null;
34743
+ const candidates = getProvidersFor(category);
34744
+ if (candidates.length === 0) return null;
34416
34745
  if (configDefaults?.[category]) {
34417
34746
  const preferred = candidates.find((c) => c.name === configDefaults[category]);
34418
34747
  if (preferred && (preferred.envVar === null || hasApiKey(preferred.envVar))) {
@@ -34426,32 +34755,12 @@ function resolveProvider(category) {
34426
34755
  }
34427
34756
  return null;
34428
34757
  }
34429
- var IMAGE_PROVIDERS, VIDEO_PROVIDERS, SPEECH_PROVIDERS, PROVIDER_MAP, configDefaults;
34758
+ var configDefaults;
34430
34759
  var init_provider_resolver = __esm({
34431
34760
  "src/utils/provider-resolver.ts"() {
34432
34761
  "use strict";
34762
+ init_dist2();
34433
34763
  init_api_key();
34434
- IMAGE_PROVIDERS = [
34435
- { name: "openai", envVar: "OPENAI_API_KEY", label: "OpenAI" },
34436
- { name: "gemini", envVar: "GOOGLE_API_KEY", label: "Gemini" },
34437
- { name: "grok", envVar: "XAI_API_KEY", label: "Grok" }
34438
- ];
34439
- VIDEO_PROVIDERS = [
34440
- { name: "fal", envVar: "FAL_KEY", label: "fal.ai (Seedance 2.0)" },
34441
- { name: "grok", envVar: "XAI_API_KEY", label: "Grok" },
34442
- { name: "veo", envVar: "GOOGLE_API_KEY", label: "Veo" },
34443
- { name: "kling", envVar: "KLING_API_KEY", label: "Kling" },
34444
- { name: "runway", envVar: "RUNWAY_API_SECRET", label: "Runway" }
34445
- ];
34446
- SPEECH_PROVIDERS = [
34447
- { name: "elevenlabs", envVar: "ELEVENLABS_API_KEY", label: "ElevenLabs" },
34448
- { name: "kokoro", envVar: null, label: "Kokoro (local)" }
34449
- ];
34450
- PROVIDER_MAP = {
34451
- image: IMAGE_PROVIDERS,
34452
- video: VIDEO_PROVIDERS,
34453
- speech: SPEECH_PROVIDERS
34454
- };
34455
34764
  configDefaults = null;
34456
34765
  }
34457
34766
  });
@@ -35724,6 +36033,7 @@ var init_generate = __esm({
35724
36033
  init_ai_helpers();
35725
36034
  init_validate();
35726
36035
  init_provider_resolver();
36036
+ init_dist2();
35727
36037
  init_ai_image();
35728
36038
  init_ai_motion();
35729
36039
  init_openai_image2();
@@ -35777,17 +36087,30 @@ Examples:
35777
36087
  if (options.output) {
35778
36088
  validateOutputPath(options.output);
35779
36089
  }
35780
- const validProviders = ["openai", "dalle", "gemini", "grok", "runway"];
35781
- const providerEnvMap = {
35782
- gemini: "GOOGLE_API_KEY",
35783
- openai: "OPENAI_API_KEY",
35784
- grok: "XAI_API_KEY"
36090
+ const imageRegistry = getProvidersFor("image");
36091
+ const validProviders = [...imageRegistry.map((p) => p.name), "dalle", "runway"];
36092
+ const providerEnvMap = Object.fromEntries(
36093
+ imageRegistry.filter((p) => p.envVar !== null).map((p) => [p.name, p.envVar])
36094
+ );
36095
+ const envKeyMap = {
36096
+ ...providerEnvMap,
36097
+ dalle: "OPENAI_API_KEY",
36098
+ runway: "RUNWAY_API_SECRET"
36099
+ };
36100
+ const providerNameMap = {
36101
+ ...Object.fromEntries(imageRegistry.map((p) => [p.name, p.label])),
36102
+ // Override Gemini's resolver label "Gemini" with the more specific
36103
+ // "Google" used in error messages, and add aliases.
36104
+ gemini: "Google",
36105
+ grok: "xAI Grok",
36106
+ dalle: "OpenAI",
36107
+ runway: "Runway"
35785
36108
  };
35786
36109
  let provider;
35787
36110
  if (options.provider) {
35788
36111
  provider = options.provider.toLowerCase();
35789
36112
  if (!validProviders.includes(provider)) {
35790
- exitWithError(usageError(`Invalid provider: ${provider}`, `Available providers: openai, gemini, grok, runway`));
36113
+ exitWithError(usageError(`Invalid provider: ${provider}`, `Available providers: ${imageRegistry.map((p) => p.name).join(", ")}, runway`));
35791
36114
  }
35792
36115
  if (providerEnvMap[provider] && !hasApiKey(providerEnvMap[provider]) && !options.apiKey) {
35793
36116
  const resolved = resolveProvider("image");
@@ -35807,20 +36130,6 @@ Examples:
35807
36130
  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 } });
35808
36131
  return;
35809
36132
  }
35810
- const envKeyMap = {
35811
- openai: "OPENAI_API_KEY",
35812
- dalle: "OPENAI_API_KEY",
35813
- gemini: "GOOGLE_API_KEY",
35814
- grok: "XAI_API_KEY",
35815
- runway: "RUNWAY_API_SECRET"
35816
- };
35817
- const providerNameMap = {
35818
- openai: "OpenAI",
35819
- dalle: "OpenAI",
35820
- gemini: "Google",
35821
- grok: "xAI Grok",
35822
- runway: "Runway"
35823
- };
35824
36133
  const envKey = envKeyMap[provider];
35825
36134
  const providerName = providerNameMap[provider];
35826
36135
  const apiKey = await requireApiKey(envKey, providerName, options.apiKey);
@@ -62611,7 +62920,7 @@ init_source();
62611
62920
  // package.json
62612
62921
  var package_default = {
62613
62922
  name: "@vibeframe/cli",
62614
- version: "0.67.0",
62923
+ version: "0.68.0",
62615
62924
  description: "VibeFrame CLI - natural language video editing from the terminal",
62616
62925
  private: false,
62617
62926
  license: "MIT",
@@ -68936,6 +69245,7 @@ function isOnPath(binary, env2) {
68936
69245
  }
68937
69246
 
68938
69247
  // src/commands/setup.ts
69248
+ init_dist2();
68939
69249
  var setupCommand = new Command("setup").description("Configure VibeFrame (LLM provider, API keys)").option("--reset", "Reset configuration to defaults").option("--full", "Run full setup with all optional providers").option("--show", "Show current configuration (for debugging)").option("--claude-code", "Show Claude Code integration guide").action(async (options) => {
68940
69250
  if (options.claudeCode) {
68941
69251
  await setupClaudeCode();
@@ -69173,18 +69483,7 @@ async function runCustomSetup(config2) {
69173
69483
  console.log(source_default.bold("2. API Keys"));
69174
69484
  console.log(source_default.dim(" Press Enter to skip any provider you don't need."));
69175
69485
  console.log();
69176
- const allProviders = [
69177
- { key: "openai", name: "OpenAI", env: "OPENAI_API_KEY", desc: "gpt-image-2 image gen ($, default since v0.56), Whisper transcribe, Agent" },
69178
- { key: "anthropic", name: "Anthropic", env: "ANTHROPIC_API_KEY", desc: "Claude \u2014 storyboard, color grade, reframe, Agent ($)" },
69179
- { key: "fal", name: "fal.ai", env: "FAL_KEY", desc: "Seedance 2.0 video gen ($$, default since v0.57)" },
69180
- { key: "google", name: "Google", env: "GOOGLE_API_KEY", desc: "Gemini \u2014 image gen (free tier), video analysis ($), Veo ($$)" },
69181
- { key: "xai", name: "xAI", env: "XAI_API_KEY", desc: "Grok \u2014 video gen with audio ($$), image ($), Agent" },
69182
- { key: "elevenlabs", name: "ElevenLabs", env: "ELEVENLABS_API_KEY", desc: "TTS ($), SFX, music, voice clone, dubbing \u2014 skip to use local Kokoro" },
69183
- { key: "runway", name: "Runway", env: "RUNWAY_API_SECRET", desc: "Gen-4.5 video generation ($$)" },
69184
- { key: "kling", name: "Kling", env: "KLING_API_KEY", desc: "v2.5/v3 video \u2014 std ($$) and pro ($$$) modes" },
69185
- { key: "openrouter", name: "OpenRouter", env: "OPENROUTER_API_KEY", desc: "300+ models via one key \u2014 Agent only (pay per model)" },
69186
- { key: "replicate", name: "Replicate", env: "REPLICATE_API_TOKEN", desc: "MusicGen background music ($, max 30s)" }
69187
- ];
69486
+ const allProviders = getSetupProviders();
69188
69487
  for (const p of allProviders) {
69189
69488
  const existing = config2.providers[p.key];
69190
69489
  if (existing) {
@@ -69695,6 +69994,7 @@ init_esm();
69695
69994
  init_source();
69696
69995
  init_config();
69697
69996
  init_schema();
69997
+ init_dist2();
69698
69998
  init_exec_safe();
69699
69999
  init_exec_safe();
69700
70000
  init_api_key();
@@ -69702,56 +70002,7 @@ import { access as access7 } from "node:fs/promises";
69702
70002
  import { existsSync as existsSync27 } from "node:fs";
69703
70003
  import { resolve as resolve38 } from "node:path";
69704
70004
  init_output();
69705
- var COMMAND_KEY_MAP = {
69706
- GOOGLE_API_KEY: [
69707
- "generate image",
69708
- "generate video -p veo",
69709
- "edit image",
69710
- "analyze media",
69711
- "analyze video",
69712
- "analyze review"
69713
- ],
69714
- OPENAI_API_KEY: [
69715
- "agent -p openai",
69716
- "generate image -p openai",
69717
- "edit image -p openai",
69718
- "audio transcribe",
69719
- "edit caption",
69720
- "edit jump-cut"
69721
- ],
69722
- ANTHROPIC_API_KEY: [
69723
- "agent -p claude",
69724
- "generate storyboard",
69725
- "generate motion",
69726
- "edit grade",
69727
- "edit reframe",
69728
- "edit speed-ramp",
69729
- "pipeline script-to-video"
69730
- ],
69731
- XAI_API_KEY: [
69732
- "agent -p xai",
69733
- "generate image -p grok",
69734
- "generate video -p grok",
69735
- "edit image -p grok"
69736
- ],
69737
- FAL_KEY: [
69738
- "generate video -p fal (Seedance 2.0 \u2014 default since v0.57)",
69739
- "generate video -p fal -m fast (lower-latency variant)",
69740
- "generate video -p fal -i <image> (image-to-video)"
69741
- ],
69742
- ELEVENLABS_API_KEY: [
69743
- "generate speech",
69744
- "generate sound-effect",
69745
- "generate music",
69746
- "audio voices",
69747
- "audio voice-clone",
69748
- "audio dub"
69749
- ],
69750
- KLING_API_KEY: ["generate video -p kling"],
69751
- RUNWAY_API_SECRET: ["generate video -p runway"],
69752
- REPLICATE_API_TOKEN: ["generate music -p replicate"],
69753
- IMGBB_API_KEY: ["generate video -p kling/fal (image-to-video upload host)"]
69754
- };
70005
+ var COMMAND_KEY_MAP = getCommandKeyMap();
69755
70006
  var FREE_COMMANDS = [
69756
70007
  "edit silence-cut",
69757
70008
  "edit noise-reduce",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibeframe/cli",
3
- "version": "0.67.0",
3
+ "version": "0.68.0",
4
4
  "description": "VibeFrame CLI - natural language video editing from the terminal",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -182,8 +182,8 @@
182
182
  "tsx": "^4.21.0",
183
183
  "typescript": "^5.3.3",
184
184
  "vitest": "^1.2.2",
185
- "@vibeframe/ai-providers": "0.67.0",
186
- "@vibeframe/core": "0.67.0"
185
+ "@vibeframe/ai-providers": "0.68.0",
186
+ "@vibeframe/core": "0.68.0"
187
187
  },
188
188
  "engines": {
189
189
  "node": ">=20"