@vibeframe/cli 0.92.0 → 0.94.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.
- package/CONTEXT.md +1 -1
- package/dist/index.js +71 -44
- package/package.json +3 -3
package/CONTEXT.md
CHANGED
|
@@ -92,7 +92,7 @@ export GOOGLE_API_KEY="..." # Gemini (image, video, inspect)
|
|
|
92
92
|
export OPENAI_API_KEY="..." # Whisper, DALL-E, GPT
|
|
93
93
|
export ANTHROPIC_API_KEY="..." # Claude (storyboard, grading)
|
|
94
94
|
export XAI_API_KEY="..." # Grok
|
|
95
|
-
export
|
|
95
|
+
export FAL_API_KEY="..." # Seedance video (default)
|
|
96
96
|
export ELEVENLABS_API_KEY="..." # TTS, music, sound effects
|
|
97
97
|
export KLING_API_KEY="..." # Kling video
|
|
98
98
|
export RUNWAY_API_SECRET="..." # Runway video
|
package/dist/index.js
CHANGED
|
@@ -14270,6 +14270,9 @@ function getProvidersFor(kind) {
|
|
|
14270
14270
|
function getProviderEnvVars() {
|
|
14271
14271
|
return Object.fromEntries([...apiKeyRegistry.values()].map((k) => [k.configKey, k.envVar]));
|
|
14272
14272
|
}
|
|
14273
|
+
function getProviderEnvAliases() {
|
|
14274
|
+
return Object.fromEntries([...apiKeyRegistry.values()].filter((k) => k.envAliases && k.envAliases.length > 0).map((k) => [k.envVar, k.envAliases ?? []]));
|
|
14275
|
+
}
|
|
14273
14276
|
function getCommandKeyMap() {
|
|
14274
14277
|
const map = {};
|
|
14275
14278
|
for (const p of providerRegistry2.values()) {
|
|
@@ -14377,7 +14380,7 @@ var init_api_keys = __esm({
|
|
|
14377
14380
|
});
|
|
14378
14381
|
defineApiKey({
|
|
14379
14382
|
configKey: "fal",
|
|
14380
|
-
envVar: "
|
|
14383
|
+
envVar: "FAL_API_KEY",
|
|
14381
14384
|
label: "fal.ai",
|
|
14382
14385
|
showInSetup: true,
|
|
14383
14386
|
setupDescription: "Seedance 2.0 video gen ($$, default since v0.57)",
|
|
@@ -14394,7 +14397,7 @@ var init_api_keys = __esm({
|
|
|
14394
14397
|
label: "xAI",
|
|
14395
14398
|
showInSetup: true,
|
|
14396
14399
|
setupDescription: "Grok \u2014 video gen with audio ($$), image ($), Agent",
|
|
14397
|
-
envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no
|
|
14400
|
+
envExampleComment: "xAI API Key (Grok video generation \u2014 fallback when no FAL_API_KEY)",
|
|
14398
14401
|
envExampleUrl: "https://console.x.ai/",
|
|
14399
14402
|
keyFormat: { prefix: /^xai-/, example: "xai-..." }
|
|
14400
14403
|
});
|
|
@@ -24451,7 +24454,7 @@ var init_FalProvider = __esm({
|
|
|
24451
24454
|
return {
|
|
24452
24455
|
id: "",
|
|
24453
24456
|
status: "failed",
|
|
24454
|
-
error: "fal.ai API key not configured. Set
|
|
24457
|
+
error: "fal.ai API key not configured. Set FAL_API_KEY in .env."
|
|
24455
24458
|
};
|
|
24456
24459
|
}
|
|
24457
24460
|
const variant = options?.model ?? DEFAULT_VARIANT;
|
|
@@ -25228,6 +25231,7 @@ __export(dist_exports2, {
|
|
|
25228
25231
|
getCommandKeyMap: () => getCommandKeyMap,
|
|
25229
25232
|
getDisplayLabelForApiKey: () => getDisplayLabelForApiKey,
|
|
25230
25233
|
getKeyFormat: () => getKeyFormat,
|
|
25234
|
+
getProviderEnvAliases: () => getProviderEnvAliases,
|
|
25231
25235
|
getProviderEnvVars: () => getProviderEnvVars,
|
|
25232
25236
|
getProvidersFor: () => getProvidersFor,
|
|
25233
25237
|
getSetupProviders: () => getSetupProviders,
|
|
@@ -25687,7 +25691,7 @@ function createDefaultConfig() {
|
|
|
25687
25691
|
}
|
|
25688
25692
|
};
|
|
25689
25693
|
}
|
|
25690
|
-
var PROVIDER_NAMES, PROVIDER_ENV_VARS;
|
|
25694
|
+
var PROVIDER_NAMES, PROVIDER_ENV_VARS, PROVIDER_ENV_ALIASES;
|
|
25691
25695
|
var init_schema = __esm({
|
|
25692
25696
|
"src/config/schema.ts"() {
|
|
25693
25697
|
"use strict";
|
|
@@ -25701,6 +25705,7 @@ var init_schema = __esm({
|
|
|
25701
25705
|
openrouter: "OpenRouter"
|
|
25702
25706
|
};
|
|
25703
25707
|
PROVIDER_ENV_VARS = getProviderEnvVars();
|
|
25708
|
+
PROVIDER_ENV_ALIASES = getProviderEnvAliases();
|
|
25704
25709
|
}
|
|
25705
25710
|
});
|
|
25706
25711
|
|
|
@@ -25709,6 +25714,7 @@ var config_exports = {};
|
|
|
25709
25714
|
__export(config_exports, {
|
|
25710
25715
|
CONFIG_DIR: () => CONFIG_DIR,
|
|
25711
25716
|
CONFIG_PATH: () => CONFIG_PATH,
|
|
25717
|
+
PROVIDER_ENV_ALIASES: () => PROVIDER_ENV_ALIASES,
|
|
25712
25718
|
PROVIDER_ENV_VARS: () => PROVIDER_ENV_VARS,
|
|
25713
25719
|
PROVIDER_NAMES: () => PROVIDER_NAMES,
|
|
25714
25720
|
USER_CONFIG_DIR: () => USER_CONFIG_DIR,
|
|
@@ -25823,7 +25829,7 @@ async function isConfigured() {
|
|
|
25823
25829
|
return true;
|
|
25824
25830
|
}
|
|
25825
25831
|
const envVar = PROVIDER_ENV_VARS[providerKey];
|
|
25826
|
-
if (envVar &&
|
|
25832
|
+
if (envVar && getEnvValue(envVar)) {
|
|
25827
25833
|
return true;
|
|
25828
25834
|
}
|
|
25829
25835
|
return false;
|
|
@@ -25834,9 +25840,12 @@ async function getApiKeyFromConfig(providerKey) {
|
|
|
25834
25840
|
return config2.providers[providerKey];
|
|
25835
25841
|
}
|
|
25836
25842
|
const envVar = PROVIDER_ENV_VARS[providerKey];
|
|
25837
|
-
if (envVar) return
|
|
25843
|
+
if (envVar) return getEnvValue(envVar);
|
|
25838
25844
|
return void 0;
|
|
25839
25845
|
}
|
|
25846
|
+
function getEnvValue(envVar) {
|
|
25847
|
+
return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
25848
|
+
}
|
|
25840
25849
|
async function updateProviderKey(providerKey, apiKey, options = {}) {
|
|
25841
25850
|
const scope = options.scope ?? await getActiveScope(options.cwd);
|
|
25842
25851
|
let config2 = await loadConfig({ scope, cwd: options.cwd });
|
|
@@ -25862,6 +25871,12 @@ var init_config = __esm({
|
|
|
25862
25871
|
import { createInterface } from "node:readline";
|
|
25863
25872
|
import { readFile as readFile3, writeFile as writeFile3, access as access3 } from "node:fs/promises";
|
|
25864
25873
|
import { resolve as resolve5 } from "node:path";
|
|
25874
|
+
function providerKeyForEnvVar(envVar) {
|
|
25875
|
+
return PROVIDER_KEY_BY_ENV_VAR[envVar];
|
|
25876
|
+
}
|
|
25877
|
+
function getEnvValue2(envVar) {
|
|
25878
|
+
return process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
25879
|
+
}
|
|
25865
25880
|
function loadEnv() {
|
|
25866
25881
|
(0, import_dotenv.config)({ path: resolve5(process.cwd(), ".env"), debug: false, quiet: true });
|
|
25867
25882
|
const monorepoRoot = findMonorepoRoot();
|
|
@@ -25924,19 +25939,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25924
25939
|
if (optionValue) {
|
|
25925
25940
|
return optionValue;
|
|
25926
25941
|
}
|
|
25927
|
-
const
|
|
25928
|
-
ANTHROPIC_API_KEY: "anthropic",
|
|
25929
|
-
OPENAI_API_KEY: "openai",
|
|
25930
|
-
GOOGLE_API_KEY: "google",
|
|
25931
|
-
XAI_API_KEY: "xai",
|
|
25932
|
-
ELEVENLABS_API_KEY: "elevenlabs",
|
|
25933
|
-
RUNWAY_API_SECRET: "runway",
|
|
25934
|
-
KLING_API_KEY: "kling",
|
|
25935
|
-
OPENROUTER_API_KEY: "openrouter",
|
|
25936
|
-
IMGBB_API_KEY: "imgbb",
|
|
25937
|
-
REPLICATE_API_TOKEN: "replicate"
|
|
25938
|
-
};
|
|
25939
|
-
const providerKey = providerKeyMap[envVar];
|
|
25942
|
+
const providerKey = providerKeyForEnvVar(envVar);
|
|
25940
25943
|
if (providerKey) {
|
|
25941
25944
|
const configKey = await getApiKeyFromConfig(providerKey);
|
|
25942
25945
|
if (configKey) {
|
|
@@ -25944,7 +25947,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25944
25947
|
}
|
|
25945
25948
|
}
|
|
25946
25949
|
loadEnv();
|
|
25947
|
-
const envValue =
|
|
25950
|
+
const envValue = getEnvValue2(envVar);
|
|
25948
25951
|
if (envValue) {
|
|
25949
25952
|
return envValue;
|
|
25950
25953
|
}
|
|
@@ -25970,7 +25973,7 @@ async function getApiKey(envVar, providerName, optionValue) {
|
|
|
25970
25973
|
}
|
|
25971
25974
|
function hasApiKey(envVar) {
|
|
25972
25975
|
loadEnv();
|
|
25973
|
-
return !!
|
|
25976
|
+
return !!getEnvValue2(envVar);
|
|
25974
25977
|
}
|
|
25975
25978
|
async function requireApiKey(envVar, providerName, cliOverride) {
|
|
25976
25979
|
const key = await getApiKey(envVar, providerName, cliOverride);
|
|
@@ -25999,19 +26002,33 @@ async function saveApiKeyToEnv(envVar, apiKey) {
|
|
|
25999
26002
|
}
|
|
26000
26003
|
await writeFile3(envPath, content, "utf-8");
|
|
26001
26004
|
}
|
|
26002
|
-
var import_dotenv, API_KEY_URLS, ApiKeyError;
|
|
26005
|
+
var import_dotenv, PROVIDER_KEY_BY_ENV_VAR, API_KEY_URLS, ApiKeyError;
|
|
26003
26006
|
var init_api_key = __esm({
|
|
26004
26007
|
"src/utils/api-key.ts"() {
|
|
26005
26008
|
"use strict";
|
|
26006
26009
|
import_dotenv = __toESM(require_main(), 1);
|
|
26007
26010
|
init_source();
|
|
26008
26011
|
init_config();
|
|
26012
|
+
PROVIDER_KEY_BY_ENV_VAR = {
|
|
26013
|
+
ANTHROPIC_API_KEY: "anthropic",
|
|
26014
|
+
OPENAI_API_KEY: "openai",
|
|
26015
|
+
GOOGLE_API_KEY: "google",
|
|
26016
|
+
XAI_API_KEY: "xai",
|
|
26017
|
+
ELEVENLABS_API_KEY: "elevenlabs",
|
|
26018
|
+
FAL_API_KEY: "fal",
|
|
26019
|
+
RUNWAY_API_SECRET: "runway",
|
|
26020
|
+
KLING_API_KEY: "kling",
|
|
26021
|
+
OPENROUTER_API_KEY: "openrouter",
|
|
26022
|
+
IMGBB_API_KEY: "imgbb",
|
|
26023
|
+
REPLICATE_API_TOKEN: "replicate"
|
|
26024
|
+
};
|
|
26009
26025
|
API_KEY_URLS = {
|
|
26010
26026
|
GOOGLE_API_KEY: "https://aistudio.google.com/apikey",
|
|
26011
26027
|
OPENAI_API_KEY: "https://platform.openai.com/api-keys",
|
|
26012
26028
|
ANTHROPIC_API_KEY: "https://console.anthropic.com/settings/keys",
|
|
26013
26029
|
XAI_API_KEY: "https://console.x.ai",
|
|
26014
26030
|
ELEVENLABS_API_KEY: "https://elevenlabs.io/app/settings/api-keys",
|
|
26031
|
+
FAL_API_KEY: "https://fal.ai/dashboard/keys",
|
|
26015
26032
|
RUNWAY_API_SECRET: "https://app.runwayml.com/settings/api-keys",
|
|
26016
26033
|
KLING_API_KEY: "https://klingai.com/dev",
|
|
26017
26034
|
REPLICATE_API_TOKEN: "https://replicate.com/account/api-tokens",
|
|
@@ -33417,7 +33434,7 @@ async function loadProviderDefaults() {
|
|
|
33417
33434
|
configProviderKeys = null;
|
|
33418
33435
|
}
|
|
33419
33436
|
}
|
|
33420
|
-
function
|
|
33437
|
+
function providerKeyForEnvVar2(envVar) {
|
|
33421
33438
|
const envVars = getProviderEnvVars();
|
|
33422
33439
|
for (const [providerKey, candidateEnvVar] of Object.entries(envVars)) {
|
|
33423
33440
|
if (candidateEnvVar === envVar) return providerKey;
|
|
@@ -33427,7 +33444,7 @@ function providerKeyForEnvVar(envVar) {
|
|
|
33427
33444
|
function hasCandidateKey(candidate) {
|
|
33428
33445
|
if (candidate.envVar === null) return true;
|
|
33429
33446
|
if (hasApiKey(candidate.envVar)) return true;
|
|
33430
|
-
const providerKey =
|
|
33447
|
+
const providerKey = providerKeyForEnvVar2(candidate.envVar);
|
|
33431
33448
|
return providerKey ? Boolean(configProviderKeys?.has(providerKey)) : false;
|
|
33432
33449
|
}
|
|
33433
33450
|
function resolveProvider(category) {
|
|
@@ -35229,7 +35246,7 @@ function registerVideoCommand(parent) {
|
|
|
35229
35246
|
"Provider: seedance (ByteDance Seedance 2.0 via fal.ai), grok, kling, runway, veo. `fal` is a deprecated v0.x alias for seedance and will be removed in 1.0."
|
|
35230
35247
|
).option(
|
|
35231
35248
|
"-k, --api-key <key>",
|
|
35232
|
-
"API key (or set
|
|
35249
|
+
"API key (or set FAL_API_KEY / XAI_API_KEY / RUNWAY_API_SECRET / KLING_API_KEY / GOOGLE_API_KEY env)"
|
|
35233
35250
|
).option("-o, --output <path>", "Output file path (downloads video)").option("-i, --image <path>", "Reference image for image-to-video").option(
|
|
35234
35251
|
"-d, --duration <sec>",
|
|
35235
35252
|
"Duration in seconds. Seedance accepts 4-15; Kling accepts 5 or 10; Veo maps to 6 or 8.",
|
|
@@ -35252,7 +35269,7 @@ function registerVideoCommand(parent) {
|
|
|
35252
35269
|
"after",
|
|
35253
35270
|
`
|
|
35254
35271
|
Examples:
|
|
35255
|
-
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when
|
|
35272
|
+
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
|
|
35256
35273
|
$ vibe gen vid "cinematic city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
|
|
35257
35274
|
$ vibe gen vid "city timelapse" -o city.mp4 -p kling # Kling
|
|
35258
35275
|
$ vibe gen vid "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
|
|
@@ -35295,7 +35312,7 @@ Examples:
|
|
|
35295
35312
|
veo: "GOOGLE_API_KEY",
|
|
35296
35313
|
kling: "KLING_API_KEY",
|
|
35297
35314
|
runway: "RUNWAY_API_SECRET",
|
|
35298
|
-
seedance: "
|
|
35315
|
+
seedance: "FAL_API_KEY"
|
|
35299
35316
|
};
|
|
35300
35317
|
let provider;
|
|
35301
35318
|
if (options.provider) {
|
|
@@ -35398,7 +35415,7 @@ Examples:
|
|
|
35398
35415
|
kling: "KLING_API_KEY",
|
|
35399
35416
|
veo: "GOOGLE_API_KEY",
|
|
35400
35417
|
grok: "XAI_API_KEY",
|
|
35401
|
-
seedance: "
|
|
35418
|
+
seedance: "FAL_API_KEY"
|
|
35402
35419
|
};
|
|
35403
35420
|
const providerNameMap = {
|
|
35404
35421
|
runway: "Runway",
|
|
@@ -35777,7 +35794,7 @@ var init_generate = __esm({
|
|
|
35777
35794
|
Examples:
|
|
35778
35795
|
$ vibe generate image "a sunset over the ocean" -o sunset.png
|
|
35779
35796
|
$ vibe generate image "logo design" -o logo.png -p openai
|
|
35780
|
-
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when
|
|
35797
|
+
$ vibe generate video "dancing cat" -o cat.mp4 # Seedance when FAL_API_KEY is set
|
|
35781
35798
|
$ vibe generate video "city timelapse" -o city.mp4 -p seedance # Seedance via fal.ai
|
|
35782
35799
|
$ vibe generate video "city timelapse" -o city.mp4 -p kling # Kling
|
|
35783
35800
|
$ vibe generate video "epic scene" -i frame.png -o out.mp4 -p runway # Image-to-video
|
|
@@ -35788,7 +35805,7 @@ Examples:
|
|
|
35788
35805
|
API Keys (per provider):
|
|
35789
35806
|
GOOGLE_API_KEY Image (default), Veo video
|
|
35790
35807
|
OPENAI_API_KEY Image (-p openai)
|
|
35791
|
-
|
|
35808
|
+
FAL_API_KEY Seedance video (-p seedance, default video)
|
|
35792
35809
|
XAI_API_KEY Grok image/video
|
|
35793
35810
|
KLING_API_KEY Kling video (-p kling)
|
|
35794
35811
|
RUNWAY_API_SECRET Runway video (-p runway)
|
|
@@ -52806,10 +52823,11 @@ async function executeVideoGenerate(options) {
|
|
|
52806
52823
|
runway: "RUNWAY_API_SECRET",
|
|
52807
52824
|
kling: "KLING_API_KEY",
|
|
52808
52825
|
veo: "GOOGLE_API_KEY",
|
|
52809
|
-
seedance: "
|
|
52810
|
-
fal: "
|
|
52826
|
+
seedance: "FAL_API_KEY",
|
|
52827
|
+
fal: "FAL_API_KEY"
|
|
52811
52828
|
};
|
|
52812
|
-
const
|
|
52829
|
+
const envKey = envKeyMap[provider] || "";
|
|
52830
|
+
const key = apiKey || (hasApiKey(envKey) ? process.env[envKey] : void 0);
|
|
52813
52831
|
if (!key) return { success: false, error: `${envKeyMap[provider]} required for ${provider}` };
|
|
52814
52832
|
let referenceImage;
|
|
52815
52833
|
let referenceImageBuffer;
|
|
@@ -53206,6 +53224,7 @@ var init_ai_video = __esm({
|
|
|
53206
53224
|
init_dist2();
|
|
53207
53225
|
init_upload_host();
|
|
53208
53226
|
init_ai_helpers();
|
|
53227
|
+
init_api_key();
|
|
53209
53228
|
}
|
|
53210
53229
|
});
|
|
53211
53230
|
|
|
@@ -63425,7 +63444,7 @@ init_source();
|
|
|
63425
63444
|
// package.json
|
|
63426
63445
|
var package_default = {
|
|
63427
63446
|
name: "@vibeframe/cli",
|
|
63428
|
-
version: "0.
|
|
63447
|
+
version: "0.94.0",
|
|
63429
63448
|
description: "VibeFrame CLI - natural language video editing from the terminal",
|
|
63430
63449
|
private: false,
|
|
63431
63450
|
license: "MIT",
|
|
@@ -70423,6 +70442,12 @@ var VALID_LLM_PROVIDERS = [
|
|
|
70423
70442
|
"openrouter"
|
|
70424
70443
|
];
|
|
70425
70444
|
var VALID_SCOPES = ["user", "project"];
|
|
70445
|
+
function envValueFor(meta) {
|
|
70446
|
+
return process.env[meta.envVar] || meta.envAliases?.map((alias) => process.env[alias]).find(Boolean);
|
|
70447
|
+
}
|
|
70448
|
+
function envValueForName(envVar) {
|
|
70449
|
+
return process.env[envVar];
|
|
70450
|
+
}
|
|
70426
70451
|
function parseScope(raw) {
|
|
70427
70452
|
const v = String(raw ?? "user");
|
|
70428
70453
|
if (!VALID_SCOPES.includes(v)) {
|
|
@@ -70569,7 +70594,7 @@ var AI_FEATURES = [
|
|
|
70569
70594
|
keys: [
|
|
70570
70595
|
{
|
|
70571
70596
|
configKey: "fal",
|
|
70572
|
-
envVar: "
|
|
70597
|
+
envVar: "FAL_API_KEY",
|
|
70573
70598
|
name: "Seedance 2.0 (via fal.ai)",
|
|
70574
70599
|
url: "https://fal.ai/dashboard/keys",
|
|
70575
70600
|
what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
|
|
@@ -70581,7 +70606,7 @@ var AI_FEATURES = [
|
|
|
70581
70606
|
desc: "recommended default, text-to-video + image-to-video",
|
|
70582
70607
|
key: {
|
|
70583
70608
|
configKey: "fal",
|
|
70584
|
-
envVar: "
|
|
70609
|
+
envVar: "FAL_API_KEY",
|
|
70585
70610
|
name: "Seedance 2.0 (via fal.ai)",
|
|
70586
70611
|
url: "https://fal.ai/dashboard/keys",
|
|
70587
70612
|
what: "ByteDance Seedance 2.0 text-to-video and image-to-video"
|
|
@@ -70890,7 +70915,7 @@ async function runNonInteractiveSetup(opts) {
|
|
|
70890
70915
|
if (opts.importEnv) {
|
|
70891
70916
|
loadEnv();
|
|
70892
70917
|
for (const meta of getAllApiKeys()) {
|
|
70893
|
-
const envValue =
|
|
70918
|
+
const envValue = envValueFor(meta);
|
|
70894
70919
|
if (!envValue) continue;
|
|
70895
70920
|
const existing = config2.providers[meta.configKey];
|
|
70896
70921
|
if (existing === envValue) continue;
|
|
@@ -71020,7 +71045,7 @@ async function runSetupWizard(fullSetup = false, scope = "user") {
|
|
|
71020
71045
|
},
|
|
71021
71046
|
{
|
|
71022
71047
|
configKey: "fal",
|
|
71023
|
-
envVar: "
|
|
71048
|
+
envVar: "FAL_API_KEY",
|
|
71024
71049
|
name: "fal.ai",
|
|
71025
71050
|
url: "https://fal.ai/dashboard/keys",
|
|
71026
71051
|
what: "Seedance 2.0 \u2014 video generation, default since v0.57"
|
|
@@ -71231,7 +71256,7 @@ async function runAIFeaturesSetup(config2, _scope) {
|
|
|
71231
71256
|
}
|
|
71232
71257
|
loadEnv();
|
|
71233
71258
|
const configValue = config2.providers[keyDef.configKey];
|
|
71234
|
-
const envValue =
|
|
71259
|
+
const envValue = envValueForName(keyDef.envVar);
|
|
71235
71260
|
if (configValue || envValue) {
|
|
71236
71261
|
const value = configValue || envValue;
|
|
71237
71262
|
const source = configValue ? "config" : ".env";
|
|
@@ -71279,7 +71304,7 @@ async function collectKeys(config2, keys) {
|
|
|
71279
71304
|
loadEnv();
|
|
71280
71305
|
for (const keyDef of keys) {
|
|
71281
71306
|
const configValue = config2.providers[keyDef.configKey];
|
|
71282
|
-
const envValue =
|
|
71307
|
+
const envValue = envValueForName(keyDef.envVar);
|
|
71283
71308
|
if (configValue) {
|
|
71284
71309
|
console.log(
|
|
71285
71310
|
` ${source_default.green("\u2713")} ${keyDef.name.padEnd(14)} ${maskApiKey(configValue)} ${source_default.dim("(config)")}`
|
|
@@ -71540,7 +71565,7 @@ async function showConfig(opts = { verbose: false }) {
|
|
|
71540
71565
|
{ key: "openai", name: "OpenAI", env: "OPENAI_API_KEY" },
|
|
71541
71566
|
{ key: "google", name: "Google", env: "GOOGLE_API_KEY" },
|
|
71542
71567
|
{ key: "xai", name: "xAI", env: "XAI_API_KEY" },
|
|
71543
|
-
{ key: "fal", name: "fal.ai", env: "
|
|
71568
|
+
{ key: "fal", name: "fal.ai", env: "FAL_API_KEY" },
|
|
71544
71569
|
{ key: "elevenlabs", name: "ElevenLabs", env: "ELEVENLABS_API_KEY" },
|
|
71545
71570
|
{ key: "runway", name: "Runway", env: "RUNWAY_API_SECRET" },
|
|
71546
71571
|
{ key: "kling", name: "Kling", env: "KLING_API_KEY" },
|
|
@@ -71847,7 +71872,7 @@ OPENROUTER_API_KEY= # multiplexes any provider above
|
|
|
71847
71872
|
|
|
71848
71873
|
# \u2500\u2500 Media providers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500
|
|
71849
71874
|
ELEVENLABS_API_KEY= # paid TTS / SFX / music (Kokoro is the free fallback)
|
|
71850
|
-
|
|
71875
|
+
FAL_API_KEY= # Seedance 2.0 \u2014 default video provider since v0.57
|
|
71851
71876
|
IMGBB_API_KEY= # image hosting for Seedance/Kling image-to-video
|
|
71852
71877
|
RUNWAY_API_SECRET= # Runway Gen-4.5 video
|
|
71853
71878
|
KLING_API_KEY= # Kling video
|
|
@@ -72722,7 +72747,9 @@ async function runDiagnostics() {
|
|
|
72722
72747
|
let readyCount = FREE_COMMANDS.length;
|
|
72723
72748
|
let totalCount = FREE_COMMANDS.length;
|
|
72724
72749
|
for (const [envVar, commands] of Object.entries(COMMAND_KEY_MAP)) {
|
|
72725
|
-
const configured =
|
|
72750
|
+
const configured = Boolean(
|
|
72751
|
+
process.env[envVar] || PROVIDER_ENV_ALIASES[envVar]?.map((alias) => process.env[alias]).find(Boolean)
|
|
72752
|
+
);
|
|
72726
72753
|
const providerName = Object.entries(PROVIDER_ENV_VARS).find(([, v]) => v === envVar)?.[0] ?? envVar;
|
|
72727
72754
|
providers[providerName] = { envVar, configured, commands };
|
|
72728
72755
|
totalCount += commands.length;
|
|
@@ -73011,7 +73038,7 @@ async function runLiveKeyTests(results) {
|
|
|
73011
73038
|
}
|
|
73012
73039
|
const { testKey: testKey2 } = await Promise.resolve().then(() => (init_key_live_test(), key_live_test_exports));
|
|
73013
73040
|
for (const [name, info] of configured) {
|
|
73014
|
-
const value = process.env[info.envVar];
|
|
73041
|
+
const value = process.env[info.envVar] || PROVIDER_ENV_ALIASES[info.envVar]?.map((alias) => process.env[alias]).find(Boolean);
|
|
73015
73042
|
if (!value) continue;
|
|
73016
73043
|
process.stdout.write(` ${name.padEnd(12)} `);
|
|
73017
73044
|
const result = await testKey2(name, value);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vibeframe/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.94.0",
|
|
4
4
|
"description": "VibeFrame CLI - natural language video editing from the terminal",
|
|
5
5
|
"private": false,
|
|
6
6
|
"license": "MIT",
|
|
@@ -183,8 +183,8 @@
|
|
|
183
183
|
"tsx": "^4.21.0",
|
|
184
184
|
"typescript": "^5.3.3",
|
|
185
185
|
"vitest": "^1.2.2",
|
|
186
|
-
"@vibeframe/
|
|
187
|
-
"@vibeframe/
|
|
186
|
+
"@vibeframe/ai-providers": "0.94.0",
|
|
187
|
+
"@vibeframe/core": "0.94.0"
|
|
188
188
|
},
|
|
189
189
|
"engines": {
|
|
190
190
|
"node": ">=20"
|