@amg555/frameforge-mcp 2.4.3 → 2.4.5

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.
@@ -116,7 +116,8 @@ async function runAssets({
116
116
  camera: scene.camera_hint || scene.camera || 'static',
117
117
  focalPoint: scene.focal_point || null,
118
118
  narration: scene.narration || '',
119
- visualDescription: scene.visual_description || scene.narration || '',
119
+ prompt: scene.prompt || '',
120
+ visualDescription: scene.visual_description || scene.prompt || scene.narration || '',
120
121
  topic: scene.topic || topic || '',
121
122
  style: scene.style || style || '',
122
123
  theme: scene.theme || theme || '',
@@ -167,8 +167,11 @@ function normaliseIngestScene(raw, index, baseDir = process.cwd()) {
167
167
  schema_version: '1.0.0',
168
168
  narration,
169
169
  caption,
170
+ prompt: String(raw.prompt || '').trim(),
171
+ style: String(raw.style || '').trim(),
172
+ theme: String(raw.theme || '').trim(),
170
173
  // visual_description used by AI image generation — blank means no AI image needed
171
- visual_description: String(raw.visual_description || raw.description || narration || '').trim(),
174
+ visual_description: String(raw.visual_description || raw.description || raw.prompt || narration || '').trim(),
172
175
  video_path: videoPath,
173
176
  image_path: imagePath,
174
177
  audio_path: audioPath,
@@ -36,6 +36,7 @@ async function runRender({
36
36
  theme = '',
37
37
  title = '',
38
38
  language = '',
39
+ showCaptions = false,
39
40
  }) {
40
41
  const sm = new StateMachine({ mode: 'file', stateDir: STATE_DIR });
41
42
  const retryPol = new RetryPolicy({ maxAttempts: 2, baseDelayMs: 15000 });
@@ -77,6 +78,7 @@ async function runRender({
77
78
  speed: asset.speed,
78
79
  clipVolume: asset.clipVolume,
79
80
  colorGrade: asset.colorGrade,
81
+ showCaptions: asset.showCaptions !== undefined ? asset.showCaptions : showCaptions,
80
82
  renderWidth,
81
83
  renderHeight,
82
84
  });
@@ -116,9 +116,9 @@ async function runScript({
116
116
 
117
117
  const facts = claims.slice(0, 8).map(c => c.safe_wording || c.claim).join('; ');
118
118
 
119
- // If targetDuration is given, adjust scene count guidance (≈ 5s/scene).
120
- // No ceiling — long-form documentaries, lectures, and podcasts may need hundreds of scenes.
121
- const targetScenes = targetDuration ? Math.max(5, Math.round(targetDuration / 5)) : sceneCount;
119
+ // If targetDuration is given, adjust scene count guidance (≈ 4.5-5s per scene for high retention).
120
+ // No ceiling — long-form documentaries, lectures, and podcasts scale dynamically.
121
+ const targetScenes = targetDuration ? Math.max(8, Math.ceil(targetDuration / 4.5)) : Math.max(sceneCount, 55);
122
122
 
123
123
  const raw = await retryPol.executeStage('Script', async () => {
124
124
  const system = [
@@ -136,7 +136,7 @@ async function runScript({
136
136
  `STYLE: ${style}`,
137
137
  `LANGUAGE: ${language}`,
138
138
  '',
139
- `Write exactly ${targetScenes} scenes (schema_version "2.0.0"). Each scene must have:`,
139
+ `Write exactly ${targetScenes} scenes (schema_version "2.0.0"). High visual pacing: 4-6 seconds per scene (12-25 spoken words). Never write monolithic 30-50s static scenes. Each scene must have:`,
140
140
  'scene_id (integer), schema_version "2.0.0",',
141
141
  'narration (15-35 words in the specified language, spoken aloud),',
142
142
  'caption (3-6 words UPPERCASE, text overlay),',