@amg555/frameforge-mcp 2.3.5 → 2.3.6
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/CHANGELOG.md +24 -0
- package/README.md +1 -1
- package/package.json +1 -1
- package/plugins/video-pipeline/skills/video-pipeline/SKILL.md +25 -12
- package/scripts/deep-validate.js +2 -2
- package/src/cli/make.js +6 -0
- package/src/mcp-server/server.js +57 -7
- package/src/video-renderer/renderer.js +67 -21
- package/src/video-renderer/scene-animator.js +1033 -251
- package/src/workflows/assets.js +20 -3
- package/src/workflows/render.js +21 -3
- package/src/workflows/script.js +2 -0
package/src/workflows/assets.js
CHANGED
|
@@ -21,10 +21,21 @@ const VDIR = `${FILES_DIR}/video_tmp`;
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Prepare all scene visuals (user media or code animation) and TTS audio in parallel batches.
|
|
24
|
-
* @param {{ productionId: string, scenes: object[], parallelism?: number, skipTts?: boolean, voice?: string }} opts
|
|
24
|
+
* @param {{ productionId: string, scenes: object[], parallelism?: number, skipTts?: boolean, voice?: string, topic?: string, style?: string, theme?: string, title?: string, language?: string }} opts
|
|
25
25
|
* @returns {Promise<AssetsResult>}
|
|
26
26
|
*/
|
|
27
|
-
async function runAssets({
|
|
27
|
+
async function runAssets({
|
|
28
|
+
productionId,
|
|
29
|
+
scenes,
|
|
30
|
+
parallelism = 1,
|
|
31
|
+
skipTts = false,
|
|
32
|
+
voice = null,
|
|
33
|
+
topic = '',
|
|
34
|
+
style = '',
|
|
35
|
+
theme = '',
|
|
36
|
+
title = '',
|
|
37
|
+
language = '',
|
|
38
|
+
}) {
|
|
28
39
|
const ttsGen = new TTSProvider();
|
|
29
40
|
const sm = new StateMachine({ mode: 'file', stateDir: STATE_DIR });
|
|
30
41
|
const retryPol = new RetryPolicy({ maxAttempts: 3, baseDelayMs: 8000 });
|
|
@@ -90,8 +101,14 @@ async function runAssets({ productionId, scenes, parallelism = 1, skipTts = fals
|
|
|
90
101
|
focalPoint: scene.focal_point || null,
|
|
91
102
|
narration: scene.narration || '',
|
|
92
103
|
visualDescription: scene.visual_description || scene.narration || '',
|
|
104
|
+
topic: scene.topic || topic || '',
|
|
105
|
+
style: scene.style || style || '',
|
|
106
|
+
theme: scene.theme || theme || '',
|
|
107
|
+
title: scene.title || title || '',
|
|
93
108
|
musicMood: scene.music_mood || 'neutral',
|
|
94
|
-
language: scene.language || '',
|
|
109
|
+
language: scene.language || language || '',
|
|
110
|
+
html: scene.html || null,
|
|
111
|
+
code: scene.code || scene.animation_code || null,
|
|
95
112
|
};
|
|
96
113
|
}));
|
|
97
114
|
results.push(...batchResults);
|
package/src/workflows/render.js
CHANGED
|
@@ -21,10 +21,22 @@ const STATE_DIR = `${FILES_DIR}/state`;
|
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Render all scene assets into a final master video.
|
|
24
|
-
* @param {{ productionId: string, sceneAssets: object[], withMusic?: boolean, musicVolume?: number }} opts
|
|
24
|
+
* @param {{ productionId: string, sceneAssets: object[], withMusic?: boolean, musicVolume?: number, renderWidth?: number, renderHeight?: number, topic?: string, style?: string, theme?: string, title?: string, language?: string }} opts
|
|
25
25
|
* @returns {Promise<RenderResult>}
|
|
26
26
|
*/
|
|
27
|
-
async function runRender({
|
|
27
|
+
async function runRender({
|
|
28
|
+
productionId,
|
|
29
|
+
sceneAssets,
|
|
30
|
+
withMusic = true,
|
|
31
|
+
musicVolume = 0.07,
|
|
32
|
+
renderWidth = 1920,
|
|
33
|
+
renderHeight = 1080,
|
|
34
|
+
topic = '',
|
|
35
|
+
style = '',
|
|
36
|
+
theme = '',
|
|
37
|
+
title = '',
|
|
38
|
+
language = '',
|
|
39
|
+
}) {
|
|
28
40
|
const sm = new StateMachine({ mode: 'file', stateDir: STATE_DIR });
|
|
29
41
|
const retryPol = new RetryPolicy({ maxAttempts: 2, baseDelayMs: 15000 });
|
|
30
42
|
const telemetry = new Telemetry({ mode: 'file', logPath: `${FILES_DIR}/usage.ndjson` });
|
|
@@ -50,10 +62,16 @@ async function runRender({ productionId, sceneAssets, withMusic = true, musicVol
|
|
|
50
62
|
narration: asset.narration || '',
|
|
51
63
|
visualDescription: asset.visualDescription || '',
|
|
52
64
|
visualType: asset.visualType || 'code_animation',
|
|
65
|
+
topic: asset.topic || topic || '',
|
|
66
|
+
style: asset.style || style || '',
|
|
67
|
+
theme: asset.theme || theme || '',
|
|
68
|
+
title: asset.title || title || '',
|
|
53
69
|
musicMood: asset.musicMood || 'neutral',
|
|
54
|
-
language: asset.language || '',
|
|
70
|
+
language: asset.language || language || '',
|
|
55
71
|
camera: asset.camera || 'static',
|
|
56
72
|
focalPoint: asset.focalPoint || null,
|
|
73
|
+
html: asset.html || null,
|
|
74
|
+
code: asset.code || null,
|
|
57
75
|
renderWidth,
|
|
58
76
|
renderHeight,
|
|
59
77
|
});
|
package/src/workflows/script.js
CHANGED
|
@@ -67,6 +67,8 @@ function normaliseScene(raw, index) {
|
|
|
67
67
|
image_path: raw.image_path || null,
|
|
68
68
|
video_path: raw.video_path || null,
|
|
69
69
|
audio_path: raw.audio_path || null,
|
|
70
|
+
html: raw.html || null,
|
|
71
|
+
code: raw.code || raw.animation_code || null,
|
|
70
72
|
metadata: {
|
|
71
73
|
importance: meta.importance || 'medium',
|
|
72
74
|
hook_potential: typeof meta.hook_potential === 'number' ? meta.hook_potential : 0.5,
|