@vibeframe/cli 0.115.6 → 0.115.8

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 (49) hide show
  1. package/dist/commands/_shared/edit/jump-cut.d.ts +2 -2
  2. package/dist/commands/_shared/image-jobs.d.ts +21 -0
  3. package/dist/commands/_shared/openai-image.d.ts +3 -36
  4. package/dist/commands/_shared/scene-inspect.d.ts +0 -1
  5. package/dist/commands/_shared/scene-render.d.ts +3 -9
  6. package/dist/commands/_shared/transcription.d.ts +16 -0
  7. package/dist/commands/_shared/translate-texts.d.ts +30 -0
  8. package/dist/commands/_shared/tts-resolve.d.ts +7 -1
  9. package/dist/commands/ai-analyze.d.ts +1 -3
  10. package/dist/commands/ai-audio.d.ts +24 -0
  11. package/dist/commands/ai-helpers.d.ts +0 -8
  12. package/dist/commands/ai-image.d.ts +19 -7
  13. package/dist/commands/edit/lottie-overlay.d.ts +76 -0
  14. package/dist/commands/edit/lottie-overlay.test.d.ts +1 -0
  15. package/dist/commands/edit/motion-overlay.d.ts +6 -1
  16. package/dist/commands/generate/image.d.ts +4 -3
  17. package/dist/commands/generate/music.d.ts +5 -0
  18. package/dist/commands/generate/sound-effect.d.ts +7 -1
  19. package/dist/commands/generate/speech.d.ts +12 -3
  20. package/dist/commands/generate.d.ts +0 -2
  21. package/dist/commands/output.d.ts +0 -3
  22. package/dist/commands/sanitize.d.ts +0 -5
  23. package/dist/commands/validate.d.ts +0 -11
  24. package/dist/config/index.d.ts +0 -9
  25. package/dist/index.js +5487 -6932
  26. package/dist/pipeline/executor.d.ts +0 -1
  27. package/dist/pipeline/renderers/chrome.d.ts +3 -4
  28. package/dist/tools/manifest/audio.d.ts +4 -1
  29. package/dist/tools/manifest/edit.d.ts +20 -17
  30. package/dist/tools/manifest/generate.d.ts +15 -6
  31. package/dist/tools/manifest/index.js +6969 -8211
  32. package/dist/tools/manifest/inspect.d.ts +4 -4
  33. package/dist/tools/manifest/remix.d.ts +4 -4
  34. package/dist/tools/manifest/scene.d.ts +8 -8
  35. package/dist/tools/manifest/timeline.d.ts +2 -2
  36. package/dist/utils/audio-file.d.ts +7 -0
  37. package/dist/utils/audio.d.ts +0 -10
  38. package/dist/utils/input-validation.d.ts +0 -5
  39. package/dist/utils/remotion.d.ts +0 -14
  40. package/dist/utils/tty.d.ts +0 -8
  41. package/package.json +4 -6
  42. package/dist/pipeline/renderers/html-clips.d.ts +0 -19
  43. package/dist/pipeline/renderers/html-runtime.d.ts +0 -6
  44. package/dist/pipeline/renderers/html-template.d.ts +0 -2
  45. package/dist/pipeline/renderers/hyperframes.d.ts +0 -7
  46. package/dist/pipeline/renderers/project-builder.d.ts +0 -7
  47. package/dist/pipeline/renderers/types.d.ts +0 -39
  48. /package/dist/{pipeline/renderers/__tests__/html-template.test.d.ts → commands/_shared/translate-texts.test.d.ts} +0 -0
  49. /package/dist/{pipeline/renderers/__tests__/integration.test.d.ts → commands/edit/lottie-overlay.integration.test.d.ts} +0 -0
@@ -52,8 +52,8 @@ export interface JumpCutResult {
52
52
  /** Default set of filler words detected by jump-cut. */
53
53
  export declare const DEFAULT_FILLER_WORDS: string[];
54
54
  /**
55
- * Transcribe audio with word-level timestamps using Whisper API directly.
56
- * Uses timestamp_granularities[]=word for filler detection.
55
+ * Transcribe audio with word-level timestamps (Whisper through the
56
+ * transcription contract) for filler detection. Throws on failure.
57
57
  */
58
58
  export declare function transcribeWithWords(audioPath: string, apiKey: string, language?: string): Promise<{
59
59
  words: {
@@ -0,0 +1,21 @@
1
+ /**
2
+ * The CLI side of the image contract: open an image provider by name with
3
+ * the user's key, read input images, and save results. Image commands,
4
+ * tools, scenes, and builds go through here instead of branching on
5
+ * provider names.
6
+ */
7
+ import { type ImageGenerator, type ImageInput } from "@vibeframe/ai-providers";
8
+ /** Env var holding each image provider's key. */
9
+ export declare const IMAGE_PROVIDER_ENV: Readonly<Record<string, string>>;
10
+ /** Display names for spinners and messages. */
11
+ export declare const IMAGE_PROVIDER_LABELS: Readonly<Record<string, string>>;
12
+ /** An image generator for `provider`, with the given key or the configured one. */
13
+ export declare function openImageGenerator(provider: string, apiKey?: string): Promise<ImageGenerator>;
14
+ /** A local image file as contract input. */
15
+ export declare function readImageInput(path: string): Promise<ImageInput>;
16
+ /** Save image bytes to `output` (relative to cwd), converting to the extension's format. */
17
+ export declare function saveImage(output: string, bytes: Uint8Array): Promise<string>;
18
+ /** The catalog label for a model ID, for human output. */
19
+ export declare function imageModelLabel(provider: string, modelId: string): string;
20
+ /** CLI quality words to the contract's: `standard`/`hd` are the old OpenAI names. */
21
+ export declare function contractQuality(quality?: string): "low" | "medium" | "high" | undefined;
@@ -1,36 +1,10 @@
1
1
  /**
2
2
  * @module _shared/openai-image
3
3
  *
4
- * Shared OpenAI `generateImage` helper for `vibe ai image` and
5
- * `vibe generate image`. Both commands had their own near-identical
6
- * provider initialisation + model-alias parsing + result construction.
7
- * v0.52.0 added gpt-image-2 wiring to `ai-image.ts` only and
8
- * `vibe generate image -m 2` silently fell back to gpt-image-1.5 — the
9
- * duplication guarantees a recurrence next time the OpenAI image flow
10
- * is touched.
11
- *
12
- * Each top-level command keeps its own CLI wiring and output formatting;
13
- * this helper owns just the API call + label derivation.
14
- *
15
- * See issue #58.
4
+ * OpenAI image model alias resolution, used by image cost estimates.
5
+ * Generation itself goes through the image contract (`executeImageGenerate`).
16
6
  */
17
- import type { GPTImageModel, ImageResult } from "@vibeframe/ai-providers";
18
- /** Subset of CLI options consumed by the helper. */
19
- export interface OpenAIImageHelperOptions {
20
- model?: string;
21
- size?: string;
22
- quality?: string;
23
- style?: string;
24
- /** Stringified count from commander; parsed inside the helper. */
25
- count?: string;
26
- }
27
- export interface OpenAIImageHelperResult {
28
- result: ImageResult;
29
- /** Resolved model id passed to the API. */
30
- openaiModel: GPTImageModel;
31
- /** Human-friendly label for spinner / success output. */
32
- modelLabel: string;
33
- }
7
+ import type { GPTImageModel } from "@vibeframe/ai-providers";
34
8
  /**
35
9
  * Resolve the user-supplied model alias to the API id + display label, from
36
10
  * the model catalog. Unknown or empty aliases resolve to the default model.
@@ -41,10 +15,3 @@ export declare function resolveOpenAIImageModel(modelAlias?: string): {
41
15
  openaiModel: GPTImageModel;
42
16
  modelLabel: string;
43
17
  };
44
- /**
45
- * Run an OpenAI image generation. Caller owns: api-key acquisition,
46
- * spinner lifecycle, output formatting (JSON vs human), and file save.
47
- */
48
- export declare function executeOpenAIImageGenerate(prompt: string, options: OpenAIImageHelperOptions, ctx: {
49
- apiKey: string;
50
- }): Promise<OpenAIImageHelperResult>;
@@ -54,4 +54,3 @@ export interface ProjectInspectResult {
54
54
  reportPath?: string;
55
55
  }
56
56
  export declare function inspectProject(opts: ProjectInspectOptions): Promise<ProjectInspectResult>;
57
- export declare function displayIssue(issue: ReviewIssue): string;
@@ -2,11 +2,8 @@
2
2
  * @module _shared/scene-render
3
3
  *
4
4
  * Render a VibeFrame scene project to MP4/WebM/MOV using the Hyperframes
5
- * producer directly. Unlike the FFmpeg-bridge backend in
6
- * `pipeline/renderers/hyperframes.ts` which has to convert a `TimelineState`
7
- * into a temp Hyperframes project, scene projects already ARE Hyperframes
8
- * projects — so we hand the producer the user's project dir and entry file
9
- * verbatim.
5
+ * producer directly. Scene projects already ARE Hyperframes projects, so
6
+ * we hand the producer the user's project dir and entry file verbatim.
10
7
  *
11
8
  * `executeSceneRender()` is decoupled from CLI flags so that the C6 agent
12
9
  * tool and the C5 `--format scenes` pipeline can call it the same way. It
@@ -126,10 +123,7 @@ export declare function buildRenderConfig(opts: {
126
123
  };
127
124
  export declare function buildMediaOpenCommand(action: RenderOpenAction, filePath: string, platform?: NodeJS.Platform): MediaOpenCommand;
128
125
  /**
129
- * Render a scene project. Mirrors the contract of the existing Hyperframes
130
- * backend (preflight → execute → structured result), but skips the
131
- * `TimelineState` → temp project conversion because the user's project is
132
- * already a valid Hyperframes project.
126
+ * Render a scene project: preflight → execute → structured result.
133
127
  */
134
128
  export declare function executeSceneRender(opts?: SceneRenderOptions): Promise<SceneRenderResult>;
135
129
  export interface BeatRenderRootResult {
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The CLI side of the transcription contract: transcribe an audio file on
3
+ * disk and get the result shape the commands already use. Every command
4
+ * that needs a transcript (audio, captions, highlights, jump-cut, scene
5
+ * narration) goes through here.
6
+ */
7
+ import { type ProviderErrorKind, type TranscriptGranularity, type TranscriptResult } from "@vibeframe/ai-providers";
8
+ export interface TranscribeFileOptions {
9
+ apiKey: string;
10
+ language?: string;
11
+ granularity?: TranscriptGranularity;
12
+ }
13
+ /** Transcribe `path` with Whisper. Failures come back as `status: "failed"` with an error kind. */
14
+ export declare function transcribeAudioFile(path: string, options: TranscribeFileOptions): Promise<TranscriptResult & {
15
+ errorKind?: ProviderErrorKind;
16
+ }>;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Translate a list of short texts (subtitle cues, dub segments) with Claude
3
+ * or OpenAI, in batches, keeping each text's position. Lines come back
4
+ * tagged `[N]` and are matched by that index, so a skipped or merged line
5
+ * cannot shift every later translation; anything missing keeps its source
6
+ * text.
7
+ */
8
+ import { type ProviderErrorKind } from "@vibeframe/ai-providers";
9
+ export interface TranslateTextsOptions {
10
+ /** Target language name or code ("Korean", "ko"). */
11
+ targetLanguage: string;
12
+ sourceLanguage?: string;
13
+ /** Default: Claude when ANTHROPIC_API_KEY is set, else OpenAI. */
14
+ provider?: "claude" | "openai";
15
+ apiKey?: string;
16
+ /** Texts per request. Default 30. */
17
+ batchSize?: number;
18
+ }
19
+ export type TranslateTextsResult = {
20
+ success: true;
21
+ texts: string[];
22
+ provider: "claude" | "openai";
23
+ } | {
24
+ success: false;
25
+ error: string;
26
+ errorKind?: ProviderErrorKind;
27
+ };
28
+ /** "ko" → "Korean"; names pass through. */
29
+ export declare function languageName(code: string): string;
30
+ export declare function translateTexts(texts: string[], options: TranslateTextsOptions): Promise<TranslateTextsResult>;
@@ -18,7 +18,7 @@
18
18
  * to branch on provider id. All providers already return the same
19
19
  * `{ success, audioBuffer, error?, characterCount? }` result.
20
20
  */
21
- import type { KokoroLoadEvent } from "@vibeframe/ai-providers";
21
+ import type { KokoroLoadEvent, ProviderErrorKind } from "@vibeframe/ai-providers";
22
22
  /** TTS providers VibeFrame can route to. `"auto"` picks based on key availability. */
23
23
  export type TtsProviderName = "auto" | "elevenlabs" | "openai" | "kokoro";
24
24
  /** Concrete provider id surfaced in result metadata. Never `"auto"`. */
@@ -33,6 +33,8 @@ export interface TtsCallOptions {
33
33
  voice?: string;
34
34
  /** Speaking speed multiplier (Kokoro: 0.5–2; ElevenLabs: 0.7–1.2). */
35
35
  speed?: number;
36
+ /** Catalog model ID or alias for the resolved provider. */
37
+ model?: string;
36
38
  /** Cold-start progress callback (Kokoro only — fires on first ~330MB load). */
37
39
  onProgress?: (event: KokoroLoadEvent) => void;
38
40
  }
@@ -41,7 +43,11 @@ export interface TtsCallResult {
41
43
  success: boolean;
42
44
  audioBuffer?: Buffer;
43
45
  error?: string;
46
+ /** Why the provider failed (`auth`, `quota`, `invalid-request`, ...). */
47
+ errorKind?: ProviderErrorKind;
44
48
  characterCount?: number;
49
+ /** The catalog model that spoke it. */
50
+ model?: string;
45
51
  }
46
52
  /** Synthesise speech from text. Provider-specific implementation lives behind this. */
47
53
  export type TtsCallable = (text: string, options?: TtsCallOptions) => Promise<TtsCallResult>;
@@ -3,7 +3,7 @@
3
3
  *
4
4
  * Media analysis execute functions using Gemini multimodal AI.
5
5
  *
6
- * CLI commands: gemini-video, analyze
6
+ * Powers `vibe inspect media` and the matching agent/MCP tools.
7
7
  *
8
8
  * Execute functions:
9
9
  * executeGeminiVideo - Analyze video files or YouTube URLs with Gemini
@@ -11,7 +11,6 @@
11
11
  *
12
12
  * @dependencies Gemini (Google)
13
13
  */
14
- import { Command } from "commander";
15
14
  /** Options for {@link executeGeminiVideo}. */
16
15
  export interface GeminiVideoOptions {
17
16
  /** Video file path or YouTube URL */
@@ -102,4 +101,3 @@ export interface AnalyzeResult {
102
101
  * @returns Result with Gemini's response, detected source type, and token usage
103
102
  */
104
103
  export declare function executeAnalyze(options: AnalyzeOptions): Promise<AnalyzeResult>;
105
- export declare function registerAnalyzeCommands(aiCommand: Command): void;
@@ -12,6 +12,7 @@
12
12
  *
13
13
  * @see MODELS.md for AI model configuration
14
14
  */
15
+ import type { ProviderErrorKind } from "@vibeframe/ai-providers";
15
16
  export interface TranscribeOptions {
16
17
  audioPath: string;
17
18
  language?: string;
@@ -29,7 +30,10 @@ export interface TranscribeResult {
29
30
  }>;
30
31
  detectedLanguage?: string;
31
32
  outputPath?: string;
33
+ /** Subtitle format written to `outputPath` (json, srt, vtt). */
34
+ format?: string;
32
35
  error?: string;
36
+ errorKind?: ProviderErrorKind;
33
37
  }
34
38
  export declare function executeTranscribe(options: TranscribeOptions): Promise<TranscribeResult>;
35
39
  export interface IsolateOptions {
@@ -41,6 +45,7 @@ export interface IsolateResult {
41
45
  success: boolean;
42
46
  outputPath?: string;
43
47
  error?: string;
48
+ errorKind?: ProviderErrorKind;
44
49
  }
45
50
  export declare function executeIsolate(options: IsolateOptions): Promise<IsolateResult>;
46
51
  export interface VoiceCloneOptions {
@@ -56,13 +61,18 @@ export interface VoiceCloneResult {
56
61
  voiceId?: string;
57
62
  name?: string;
58
63
  error?: string;
64
+ errorKind?: ProviderErrorKind;
59
65
  }
60
66
  export declare function executeVoiceClone(options: VoiceCloneOptions): Promise<VoiceCloneResult>;
61
67
  export interface DubOptions {
62
68
  mediaPath: string;
69
+ /** Target language code or name ("ko", "Spanish"). */
63
70
  language: string;
64
71
  source?: string;
72
+ /** Voice for the chosen TTS provider. */
65
73
  voice?: string;
74
+ /** TTS provider: auto (default), elevenlabs, openai, kokoro. */
75
+ tts?: string;
66
76
  analyzeOnly?: boolean;
67
77
  output?: string;
68
78
  }
@@ -72,8 +82,22 @@ export interface DubResult {
72
82
  sourceLanguage?: string;
73
83
  targetLanguage?: string;
74
84
  segmentCount?: number;
85
+ /** Each segment's timing with its original and translated text. */
86
+ segments?: Array<{
87
+ startTime: number;
88
+ endTime: number;
89
+ original: string;
90
+ translated: string;
91
+ }>;
75
92
  error?: string;
93
+ errorKind?: ProviderErrorKind;
76
94
  }
95
+ /**
96
+ * Dub speech to another language: transcribe (Whisper), translate (Claude,
97
+ * or OpenAI without an Anthropic key), speak each segment (any TTS
98
+ * provider), and place each line at its segment's start time, speeding up
99
+ * lines that would overrun their slot.
100
+ */
77
101
  export declare function executeDub(options: DubOptions): Promise<DubResult>;
78
102
  export interface DuckOptions {
79
103
  musicPath: string;
@@ -12,14 +12,6 @@ import { Project } from "../engine/index.js";
12
12
  * `SuggestEditEntry`, which omits the optional `id`/`previewUrl`.
13
13
  */
14
14
  export type ApplicableSuggestion = Pick<EditSuggestion, "type" | "clipIds" | "params">;
15
- /**
16
- * Download a video from URL, handling Veo/Google API authentication.
17
- * Uses x-goog-api-key header (not query param) for Google API URLs.
18
- *
19
- * @param url - Video URL to download
20
- * @param apiKey - Google API key (caller should resolve from env/config)
21
- */
22
- export declare function downloadVideo(url: string, apiKey?: string): Promise<Buffer>;
23
15
  /** Format a duration in seconds to m:ss.s display format */
24
16
  export declare function formatTime(seconds: number): string;
25
17
  /** Apply a single AI edit suggestion to a project */
@@ -12,48 +12,60 @@
12
12
  *
13
13
  * @see MODELS.md for AI model configuration
14
14
  */
15
+ import { type ProviderErrorKind } from "@vibeframe/ai-providers";
15
16
  export interface ImageGenerateOptions {
16
17
  prompt: string;
18
+ /** Default: the configured or first available image provider. */
17
19
  provider?: string;
18
20
  output?: string;
21
+ /** Explicit OpenAI size; otherwise the ratio picks one. */
19
22
  size?: string;
20
23
  ratio?: string;
21
24
  quality?: string;
22
- style?: string;
25
+ /** Gemini "1K"/"2K"/"4K", Grok "1k"/"2k". */
26
+ resolution?: string;
23
27
  count?: number;
24
28
  model?: string;
25
29
  apiKey?: string;
26
30
  }
27
31
  export interface ImageGenerateResult {
28
32
  success: boolean;
33
+ /** Where the first image was saved. */
29
34
  outputPath?: string;
35
+ /** Every saved image: `out.png`, then `out-2.png`, `out-3.png`, ... */
36
+ outputPaths?: string[];
30
37
  images?: Array<{
31
- url?: string;
32
- base64?: string;
33
- mimeType?: string;
38
+ base64: string;
39
+ mimeType: string;
34
40
  revisedPrompt?: string;
35
41
  }>;
36
42
  provider?: string;
37
43
  model?: string;
38
44
  error?: string;
45
+ errorKind?: ProviderErrorKind;
39
46
  }
40
47
  export declare function executeImageGenerate(options: ImageGenerateOptions): Promise<ImageGenerateResult>;
41
- export interface GeminiEditOptions {
48
+ export interface ImageEditOptions {
42
49
  imagePaths: string[];
43
50
  prompt: string;
51
+ /** Default: gemini. */
52
+ provider?: string;
44
53
  output?: string;
45
54
  model?: string;
46
55
  ratio?: string;
47
56
  resolution?: string;
57
+ quality?: string;
48
58
  apiKey?: string;
49
59
  }
50
- export interface GeminiEditResult {
60
+ export interface ImageEditResult {
51
61
  success: boolean;
52
62
  outputPath?: string;
63
+ provider?: string;
53
64
  model?: string;
54
65
  error?: string;
66
+ errorKind?: ProviderErrorKind;
55
67
  }
56
- export declare function executeGeminiEdit(options: GeminiEditOptions): Promise<GeminiEditResult>;
68
+ export declare function executeImageEdit(options: ImageEditOptions): Promise<ImageEditResult>;
57
69
  export interface ThumbnailBestFrameOptions {
58
70
  videoPath: string;
59
71
  outputPath: string;
@@ -0,0 +1,76 @@
1
+ /**
2
+ * @module edit/lottie-overlay
3
+ *
4
+ * `vibe edit motion-overlay <video> --asset <file.lottie|file.json>`.
5
+ *
6
+ * Two passes, so the source video is never re-rendered through a browser:
7
+ *
8
+ * 1. Hyperframes renders only the Lottie layer, at the source's display
9
+ * size, to ProRes 4444 with alpha. The page drives a dotLottie player
10
+ * frame by frame from `window.__hf.seek`, so every frame is
11
+ * deterministic and nothing depends on wall-clock playback.
12
+ * 2. FFmpeg overlays that layer onto the original video at `start`,
13
+ * keeping the source resolution, frame rate, and audio.
14
+ */
15
+ export type LottiePosition = "full" | "center" | "top-left" | "top-right" | "bottom-left" | "bottom-right";
16
+ export interface LottieOverlayOptions {
17
+ videoPath: string;
18
+ assetPath: string;
19
+ outputPath: string;
20
+ /** Seconds into the video where the overlay appears. */
21
+ start: number;
22
+ /** Seconds the overlay stays on screen. */
23
+ duration: number;
24
+ position: LottiePosition;
25
+ /** Fraction of the frame the overlay box spans (ignored for `full`). */
26
+ scale: number;
27
+ opacity: number;
28
+ loop: boolean;
29
+ }
30
+ export interface LottieOverlayResult {
31
+ success: boolean;
32
+ outputPath?: string;
33
+ error?: string;
34
+ /** How to fix a failure that retrying will not fix. */
35
+ suggestion?: string;
36
+ }
37
+ export interface VideoStreamInfo {
38
+ /** Display size, after any rotation metadata is applied. */
39
+ width: number;
40
+ height: number;
41
+ fps: number;
42
+ duration: number;
43
+ }
44
+ /** Probe the first video stream. Width/height are swapped for 90/270 degree rotations, as FFmpeg autorotates on decode. */
45
+ export declare function probeVideoStream(path: string): Promise<VideoStreamInfo>;
46
+ /** Reject files dotLottie cannot open before spending a browser render on them. */
47
+ export declare function checkLottieAsset(path: string): Promise<string | undefined>;
48
+ /** CSS box for the overlay canvas, in pixels of the layer. */
49
+ export declare function overlayBox(layer: {
50
+ width: number;
51
+ height: number;
52
+ }, position: LottiePosition, scale: number): {
53
+ left: number;
54
+ top: number;
55
+ width: number;
56
+ height: number;
57
+ };
58
+ /**
59
+ * The layer page. `window.__hf` is published only after the animation has
60
+ * loaded, because the producer starts capturing once `__hf.duration > 0`.
61
+ */
62
+ export declare function lottieLayerHtml(opts: {
63
+ width: number;
64
+ height: number;
65
+ duration: number;
66
+ assetUrl: string;
67
+ box: {
68
+ left: number;
69
+ top: number;
70
+ width: number;
71
+ height: number;
72
+ };
73
+ opacity: number;
74
+ loop: boolean;
75
+ }): string;
76
+ export declare function renderLottieOverlay(options: LottieOverlayOptions): Promise<LottieOverlayResult>;
@@ -0,0 +1 @@
1
+ export {};
@@ -1,7 +1,8 @@
1
1
  import { Command } from "commander";
2
2
  import { type MotionCommandOptions } from "../ai-motion.js";
3
+ import { type LottiePosition } from "./lottie-overlay.js";
3
4
  export type MotionOverlayUnderstand = "auto" | "off" | "required";
4
- export type MotionOverlayPosition = "full" | "center" | "top-left" | "top-right" | "bottom-left" | "bottom-right";
5
+ export type MotionOverlayPosition = LottiePosition;
5
6
  export interface MotionOverlayOptions {
6
7
  videoPath: string;
7
8
  description?: string;
@@ -25,6 +26,10 @@ export interface MotionOverlayResult {
25
26
  renderedPath?: string;
26
27
  provider?: "remotion" | "lottie";
27
28
  error?: string;
29
+ /** How to fix a failure that a retry will not fix. */
30
+ suggestion?: string;
31
+ /** False for deterministic local failures (bad asset, missing Chrome/FFmpeg). */
32
+ retryable?: boolean;
28
33
  }
29
34
  export declare function executeMotionOverlay(options: MotionOverlayOptions): Promise<MotionOverlayResult>;
30
35
  export declare function registerMotionOverlayCommand(parent: Command): void;
@@ -1,8 +1,9 @@
1
1
  /**
2
2
  * @module generate/image
3
- * @description `vibe generate image` (alias `img`) — multi-provider image
4
- * generation. OpenAI gpt-image-2.5, Gemini Nano Banana, Grok, Runway. Split
5
- * out of `generate.ts` in v0.69 (Plan G Phase 2).
3
+ * @description `vibe generate image` (alias `img`) — image generation on
4
+ * OpenAI GPT Image, Gemini Nano Banana, or Grok Imagine. Validation,
5
+ * provider choice, and the dry run live here; generation is
6
+ * `executeImageGenerate`, the same executor the MCP tool and pipelines use.
6
7
  */
7
8
  import type { Command } from "commander";
8
9
  export declare function registerImageCommand(parent: Command): void;
@@ -5,6 +5,7 @@
5
5
  * conditioning). Split out of `generate.ts` in v0.69 (Plan G Phase 2).
6
6
  */
7
7
  import type { Command } from "commander";
8
+ import { type ProviderErrorKind } from "@vibeframe/ai-providers";
8
9
  export interface ExecuteMusicOptions {
9
10
  prompt: string;
10
11
  output?: string;
@@ -12,6 +13,9 @@ export interface ExecuteMusicOptions {
12
13
  provider?: "elevenlabs" | "replicate";
13
14
  instrumental?: boolean;
14
15
  wait?: boolean;
16
+ /** Replicate MusicGen variant: large, stereo-large, melody-large, stereo-melody-large. */
17
+ model?: string;
18
+ apiKey?: string;
15
19
  }
16
20
  export interface ExecuteMusicResult {
17
21
  success: boolean;
@@ -22,6 +26,7 @@ export interface ExecuteMusicResult {
22
26
  status?: string;
23
27
  audioUrl?: string;
24
28
  error?: string;
29
+ errorKind?: ProviderErrorKind;
25
30
  }
26
31
  export declare function executeMusic(options: ExecuteMusicOptions): Promise<ExecuteMusicResult>;
27
32
  export declare function registerMusicCommand(parent: Command): void;
@@ -1,19 +1,25 @@
1
1
  /**
2
2
  * @module generate/sound-effect
3
3
  * @description `vibe generate sound-effect` — ElevenLabs SFX generation.
4
- * Split out of `generate.ts` in v0.69 (Plan G Phase 2).
4
+ * The command validates and formats; `executeSoundEffect` (also used by
5
+ * pipelines and the MCP tool) does the work.
5
6
  */
6
7
  import type { Command } from "commander";
8
+ import { type ProviderErrorKind } from "@vibeframe/ai-providers";
7
9
  export interface ExecuteSoundEffectOptions {
8
10
  prompt: string;
9
11
  output?: string;
12
+ /** Seconds (0.5-30); the model picks when omitted. */
10
13
  duration?: number;
14
+ /** 0-1, default 0.3. */
11
15
  promptInfluence?: number;
16
+ apiKey?: string;
12
17
  }
13
18
  export interface ExecuteSoundEffectResult {
14
19
  success: boolean;
15
20
  outputPath?: string;
16
21
  error?: string;
22
+ errorKind?: ProviderErrorKind;
17
23
  }
18
24
  export declare function executeSoundEffect(options: ExecuteSoundEffectOptions): Promise<ExecuteSoundEffectResult>;
19
25
  export declare function registerSoundEffectCommand(parent: Command): void;
@@ -1,20 +1,29 @@
1
1
  /**
2
2
  * @module generate/speech
3
- * @description `vibe generate speech` (alias `tts`) — ElevenLabs text-to-
4
- * speech with optional duration-fit post-processing. Split out of
5
- * `generate.ts` in v0.69 (Plan G Phase 2).
3
+ * @description `vibe generate narration` (alias `voiceover`) — text to
4
+ * speech on ElevenLabs, OpenAI, or local Kokoro, through the same TTS
5
+ * resolver scenes and builds use.
6
6
  */
7
7
  import type { Command } from "commander";
8
+ import type { ProviderErrorKind } from "@vibeframe/ai-providers";
8
9
  export interface ExecuteSpeechOptions {
9
10
  text: string;
10
11
  output?: string;
11
12
  voice?: string;
13
+ /** auto (default): ElevenLabs if its key is set, else OpenAI, else local Kokoro. */
14
+ provider?: string;
15
+ /** Catalog model ID or alias for the chosen provider. */
16
+ model?: string;
17
+ speed?: number;
12
18
  }
13
19
  export interface ExecuteSpeechResult {
14
20
  success: boolean;
15
21
  outputPath?: string;
16
22
  characterCount?: number;
23
+ provider?: string;
24
+ model?: string;
17
25
  error?: string;
26
+ errorKind?: ProviderErrorKind;
18
27
  }
19
28
  export declare function executeSpeech(options: ExecuteSpeechOptions): Promise<ExecuteSpeechResult>;
20
29
  export declare function registerNarrationCommand(parent: Command): void;
@@ -18,8 +18,6 @@
18
18
  import { Command } from "commander";
19
19
  export { executeSoundEffect } from "./generate/sound-effect.js";
20
20
  export type { ExecuteSoundEffectOptions, ExecuteSoundEffectResult, } from "./generate/sound-effect.js";
21
- export { executeMusicStatus } from "./generate/music-status.js";
22
- export type { ExecuteMusicStatusOptions, ExecuteMusicStatusResult, } from "./generate/music-status.js";
23
21
  export { executeStoryboard } from "./generate/storyboard.js";
24
22
  export type { ExecuteStoryboardOptions, ExecuteStoryboardResult } from "./generate/storyboard.js";
25
23
  export { executeSpeech } from "./generate/speech.js";
@@ -40,7 +40,6 @@ export declare function apiError(msg: string, retryable?: boolean): StructuredEr
40
40
  */
41
41
  export declare function providerFailure(message: string, kind?: string): StructuredError;
42
42
  export declare function notFoundError(path: string): StructuredError;
43
- export declare function networkError(msg: string): StructuredError;
44
43
  export declare function generalError(msg: string, suggestion?: string): StructuredError;
45
44
  /**
46
45
  * The `--max-cost` refusal. A command that declines to spend is a failure, so
@@ -114,8 +113,6 @@ export declare function outputResult(result: Record<string, unknown>): void;
114
113
  export declare function log(...args: unknown[]): void;
115
114
  /** Create a spinner that is silent in JSON/quiet mode */
116
115
  export declare function spinner(text: string): ReturnType<typeof ora>;
117
- /** Suggest next steps - only in human interactive mode */
118
- export declare function suggestNext(tip: string): void;
119
116
  export declare function emitDeprecationWarning(oldName: string, newName: string, removeIn: string): void;
120
117
  /** Test-only: reset deduplication memory between cases. */
121
118
  export declare function _resetDeprecationMemoryForTesting(): void;
@@ -8,11 +8,6 @@
8
8
  * fake system prompts, and markdown-disguised commands.
9
9
  */
10
10
  export declare function sanitizeLLMResponse(text: string): string;
11
- /**
12
- * Sanitize a file path returned by an AI model.
13
- * Prevents path traversal and null byte injection.
14
- */
15
- export declare function sanitizeFilePath(path: string): string;
16
11
  /**
17
12
  * Sanitize structured data from AI responses (e.g., JSON parsed results).
18
13
  * Recursively sanitizes all string values.
@@ -20,14 +20,3 @@ export declare function validateResourceId(id: string): string;
20
20
  * Prevents terminal injection and other control-char exploits.
21
21
  */
22
22
  export declare function rejectControlChars(input: string): string;
23
- /**
24
- * Validate a media file path and check its extension against an allowlist.
25
- */
26
- export declare function validateMediaFile(path: string, allowedExts: string[]): string;
27
- /** Common media file extensions */
28
- export declare const MEDIA_EXTS: {
29
- video: string[];
30
- audio: string[];
31
- image: string[];
32
- subtitle: string[];
33
- };
@@ -21,10 +21,6 @@ export type Scope = "user" | "project";
21
21
  export declare const USER_CONFIG_DIR: string;
22
22
  /** User-scope config file (~/.vibeframe/config.yaml by default). */
23
23
  export declare const USER_CONFIG_PATH: string;
24
- /** User data directory (~/.local/share/vibeframe by default). */
25
- export declare const USER_DATA_DIR: string;
26
- /** User cache directory (~/.vibeframe/cache by default). */
27
- export declare const USER_CACHE_DIR: string;
28
24
  /** Legacy user-scope config directory used by pre-XDG installs. */
29
25
  export declare const LEGACY_USER_CONFIG_DIR: string;
30
26
  /** Legacy user-scope config file used by pre-XDG installs. */
@@ -101,10 +97,5 @@ export declare function isConfigured(options?: Pick<LoadConfigOptions, "cwd">):
101
97
  * the provider's environment variable if neither config has it.
102
98
  */
103
99
  export declare function getApiKeyFromConfig(providerKey: string, options?: Pick<LoadConfigOptions, "cwd">): Promise<string | undefined>;
104
- /**
105
- * Update a provider key in the active scope (project if present, else user).
106
- * Pass `{scope}` to force a specific destination.
107
- */
108
- export declare function updateProviderKey(providerKey: string, apiKey: string, options?: SaveConfigOptions): Promise<void>;
109
100
  export type { VibeConfig, LLMProvider } from "./schema.js";
110
101
  export { createDefaultConfig, PROVIDER_NAMES, PROVIDER_ENV_ALIASES, PROVIDER_ENV_VARS, } from "./schema.js";