@lightcone-ai/daemon 0.15.28 → 0.15.29

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.
@@ -1443,6 +1443,7 @@ export async function detailSections({
1443
1443
  const totalDurationMs = sections.reduce((sum, item) => sum + item.dwell_ms, 0);
1444
1444
 
1445
1445
  return {
1446
+ detail_sections_version: 1,
1446
1447
  sections,
1447
1448
  outro_video_id: toSafeString(strategy?.outro_video_id || strategy?.outroVideoId) || DEFAULT_OUTRO_VIDEO_ID,
1448
1449
  total_duration_ms: totalDurationMs,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lightcone-ai/daemon",
3
- "version": "0.15.28",
3
+ "version": "0.15.29",
4
4
  "type": "module",
5
5
  "main": "src/index.js",
6
6
  "bin": {
@@ -38,7 +38,14 @@ export async function launchChromiumMobile({
38
38
  hasTouch = true,
39
39
  headless = false,
40
40
  channel = 'chrome',
41
- launchArgs = ['--no-sandbox', '--disable-dev-shm-usage'],
41
+ launchArgs = [
42
+ '--no-sandbox',
43
+ '--disable-dev-shm-usage',
44
+ '--kiosk',
45
+ '--disable-infobars',
46
+ '--no-first-run',
47
+ '--no-default-browser-check',
48
+ ],
42
49
  playwrightModule = 'playwright',
43
50
  launchOptions = {},
44
51
  contextOptions = {},
@@ -1481,7 +1481,6 @@ server.tool('record_url_narration',
1481
1481
  }).optional().describe('Default 1080x1920 (mobile portrait). Override only if the plan requires a different shape.'),
1482
1482
  fps: z.number().optional().describe('Default 30. Do not change unless needed.'),
1483
1483
  settle_ms: z.number().optional().describe('Default 4000. Settle wait after navigation before recording starts.'),
1484
- page_zoom: z.number().optional().describe('Browser zoom factor applied before recording. Default 1.1 (10% zoom in). Set to 1.0 to disable. Plan Y coordinates are automatically scaled by this factor.'),
1485
1484
  },
1486
1485
  async (args) => {
1487
1486
  if (isBlockedCvmaxEditorVideoTool('record_url_narration')) {
@@ -48,6 +48,19 @@ function derivePhaseCount({ plan, recorderOutput }) {
48
48
  return null;
49
49
  }
50
50
 
51
+ const PIPELINE_SENTINEL_KEY = 'detail_sections_version';
52
+
53
+ function assertPipelineCompliance(plan) {
54
+ if (!isPlainObject(plan)) return;
55
+ if (!plan[PIPELINE_SENTINEL_KEY]) {
56
+ throw new Error(
57
+ 'pipeline_violation: plan must come from detail_sections output. '
58
+ + 'Required pipeline: analyze_page → plan_video → detail_sections → generate_voiceover → record_url_narration → compose_video → submit_to_library. '
59
+ + 'Do not hand-write phases or bypass detail_sections.'
60
+ );
61
+ }
62
+ }
63
+
51
64
  export function validateRecordUrlNarrationArgs(args = {}) {
52
65
  const normalizedUrl = normalizeText(args.url);
53
66
  if (!normalizedUrl) {
@@ -113,6 +126,12 @@ export async function runRecordUrlNarrationTool({
113
126
  return toolError(`Error: ${error.message}`);
114
127
  }
115
128
 
129
+ try {
130
+ assertPipelineCompliance(validatedInput.plan);
131
+ } catch (error) {
132
+ return toolError(`Error: ${error.message}`);
133
+ }
134
+
116
135
  try {
117
136
  const result = await runMandatoryLocalToolFn({
118
137
  toolName: 'record_url_narration',
@@ -141,7 +160,6 @@ export async function runRecordUrlNarrationTool({
141
160
  viewport: finalInput.viewport,
142
161
  fps: finalInput.fps,
143
162
  settle_ms: finalInput.settle_ms,
144
- page_zoom: finalInput.page_zoom,
145
163
  });
146
164
 
147
165
  return {