@hyperframes/engine 0.8.145 → 0.8.146

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 (265) hide show
  1. package/dist/config.d.ts +0 -1
  2. package/dist/config.js +1 -2
  3. package/dist/index.d.ts +1 -2
  4. package/dist/index.js +1 -2
  5. package/dist/services/__fixtures__/jpeg.d.ts +0 -1
  6. package/dist/services/__fixtures__/jpeg.js +0 -1
  7. package/dist/services/audioFxRender.d.ts +0 -1
  8. package/dist/services/audioFxRender.js +0 -1
  9. package/dist/services/audioMixer.d.ts +0 -1
  10. package/dist/services/audioMixer.js +0 -1
  11. package/dist/services/audioMixer.types.d.ts +0 -1
  12. package/dist/services/audioMixer.types.js +0 -1
  13. package/dist/services/audioVolumeEnvelope.d.ts +0 -1
  14. package/dist/services/audioVolumeEnvelope.js +0 -1
  15. package/dist/services/browserLeasePool.d.ts +0 -1
  16. package/dist/services/browserLeasePool.js +0 -1
  17. package/dist/services/browserManager.d.ts +0 -1
  18. package/dist/services/browserManager.js +2 -3
  19. package/dist/services/captureFailure.d.ts +0 -1
  20. package/dist/services/captureFailure.js +0 -1
  21. package/dist/services/captureWarning.d.ts +0 -1
  22. package/dist/services/captureWarning.js +0 -1
  23. package/dist/services/chromeHostCeiling.d.ts +0 -1
  24. package/dist/services/chromeHostCeiling.js +0 -1
  25. package/dist/services/chromeMemorySampler.d.ts +0 -1
  26. package/dist/services/chromeMemorySampler.js +0 -1
  27. package/dist/services/chunkEncoder.d.ts +0 -1
  28. package/dist/services/chunkEncoder.js +0 -1
  29. package/dist/services/chunkEncoder.types.d.ts +0 -1
  30. package/dist/services/chunkEncoder.types.js +0 -1
  31. package/dist/services/drawElementCaptureError.d.ts +0 -1
  32. package/dist/services/drawElementCaptureError.js +0 -1
  33. package/dist/services/drawElementService.d.ts +0 -1
  34. package/dist/services/drawElementService.js +1 -2
  35. package/dist/services/extractedFrameIndex.d.ts +0 -1
  36. package/dist/services/extractedFrameIndex.js +0 -1
  37. package/dist/services/extractionCache.d.ts +3 -1
  38. package/dist/services/extractionCache.js +17 -4
  39. package/dist/services/fileServer.d.ts +0 -1
  40. package/dist/services/fileServer.js +0 -1
  41. package/dist/services/frameCapture.d.ts +2 -2
  42. package/dist/services/frameCapture.js +33 -33
  43. package/dist/services/hdrCapture.d.ts +0 -1
  44. package/dist/services/hdrCapture.js +0 -1
  45. package/dist/services/mediaHidden.d.ts +0 -1
  46. package/dist/services/mediaHidden.js +0 -1
  47. package/dist/services/mediaRenderIdBridge.d.ts +0 -1
  48. package/dist/services/mediaRenderIdBridge.js +0 -1
  49. package/dist/services/mediaTimelineWindow.d.ts +0 -1
  50. package/dist/services/mediaTimelineWindow.js +0 -1
  51. package/dist/services/motionBlur.d.ts +0 -1
  52. package/dist/services/motionBlur.js +0 -1
  53. package/dist/services/pageNavigationTimeoutErrorHint.d.ts +0 -1
  54. package/dist/services/pageNavigationTimeoutErrorHint.js +0 -1
  55. package/dist/services/parallelCoordinator.d.ts +0 -1
  56. package/dist/services/parallelCoordinator.js +2 -3
  57. package/dist/services/protocolTimeoutErrorHint.d.ts +0 -1
  58. package/dist/services/protocolTimeoutErrorHint.js +0 -1
  59. package/dist/services/referenceResolver.d.ts +0 -1
  60. package/dist/services/referenceResolver.js +0 -1
  61. package/dist/services/screenshotService.d.ts +0 -1
  62. package/dist/services/screenshotService.js +19 -20
  63. package/dist/services/streamingEncoder.d.ts +0 -1
  64. package/dist/services/streamingEncoder.js +0 -1
  65. package/dist/services/systemMemory.d.ts +0 -1
  66. package/dist/services/systemMemory.js +2 -3
  67. package/dist/services/threeDProjection.d.ts +0 -1
  68. package/dist/services/threeDProjection.js +2 -3
  69. package/dist/services/videoFrameExtractor.d.ts +3 -1
  70. package/dist/services/videoFrameExtractor.js +37 -7
  71. package/dist/services/videoFrameInjector.d.ts +0 -1
  72. package/dist/services/videoFrameInjector.js +0 -1
  73. package/dist/services/vp9Options.d.ts +0 -1
  74. package/dist/services/vp9Options.js +0 -1
  75. package/dist/services/wavChunks.d.ts +0 -1
  76. package/dist/services/wavChunks.js +0 -1
  77. package/dist/types.d.ts +0 -1
  78. package/dist/types.js +0 -1
  79. package/dist/utils/alphaBlit.d.ts +0 -1
  80. package/dist/utils/alphaBlit.js +0 -1
  81. package/dist/utils/alphaPlaneProbe.d.ts +0 -1
  82. package/dist/utils/alphaPlaneProbe.js +0 -1
  83. package/dist/utils/assertSwiftShader.d.ts +0 -1
  84. package/dist/utils/assertSwiftShader.js +0 -1
  85. package/dist/utils/concurrencyLimit.d.ts +0 -1
  86. package/dist/utils/concurrencyLimit.js +0 -1
  87. package/dist/utils/crc32.d.ts +0 -1
  88. package/dist/utils/crc32.js +0 -1
  89. package/dist/utils/evenDimensions.d.ts +0 -1
  90. package/dist/utils/evenDimensions.js +0 -1
  91. package/dist/utils/ffmpegBinaries.d.ts +0 -1
  92. package/dist/utils/ffmpegBinaries.js +0 -1
  93. package/dist/utils/ffprobe.d.ts +0 -1
  94. package/dist/utils/ffprobe.js +0 -1
  95. package/dist/utils/gpuEncoder.d.ts +0 -1
  96. package/dist/utils/gpuEncoder.js +0 -1
  97. package/dist/utils/gpuParityDiff.d.ts +0 -1
  98. package/dist/utils/gpuParityDiff.js +4 -5
  99. package/dist/utils/hdr.d.ts +0 -1
  100. package/dist/utils/hdr.js +1 -2
  101. package/dist/utils/htmlTemplate.d.ts +0 -1
  102. package/dist/utils/htmlTemplate.js +0 -1
  103. package/dist/utils/jpegInput.d.ts +0 -1
  104. package/dist/utils/jpegInput.js +0 -1
  105. package/dist/utils/layerCompositor.d.ts +0 -1
  106. package/dist/utils/layerCompositor.js +0 -1
  107. package/dist/utils/managedChildProcess.d.ts +0 -1
  108. package/dist/utils/managedChildProcess.js +0 -1
  109. package/dist/utils/notMediaPayload.d.ts +0 -1
  110. package/dist/utils/notMediaPayload.js +0 -1
  111. package/dist/utils/parityContract.d.ts +0 -1
  112. package/dist/utils/parityContract.js +0 -1
  113. package/dist/utils/processRss.d.ts +0 -1
  114. package/dist/utils/processRss.js +0 -1
  115. package/dist/utils/processTracker.d.ts +0 -1
  116. package/dist/utils/processTracker.js +0 -1
  117. package/dist/utils/psnr.d.ts +0 -1
  118. package/dist/utils/psnr.js +0 -1
  119. package/dist/utils/psnrFilterAvailability.d.ts +0 -1
  120. package/dist/utils/psnrFilterAvailability.js +0 -1
  121. package/dist/utils/readWebGlVendorInfoFromCanvas.d.ts +0 -1
  122. package/dist/utils/readWebGlVendorInfoFromCanvas.js +0 -1
  123. package/dist/utils/renderProvenance.d.ts +0 -1
  124. package/dist/utils/renderProvenance.js +0 -1
  125. package/dist/utils/runFfmpeg.d.ts +0 -1
  126. package/dist/utils/runFfmpeg.js +0 -1
  127. package/dist/utils/sdrCaptureColor.d.ts +0 -1
  128. package/dist/utils/sdrCaptureColor.js +0 -1
  129. package/dist/utils/shaderTransitions.d.ts +0 -1
  130. package/dist/utils/shaderTransitions.js +0 -1
  131. package/dist/utils/urlDownloader.d.ts +0 -1
  132. package/dist/utils/urlDownloader.js +0 -1
  133. package/package.json +3 -3
  134. package/dist/config.d.ts.map +0 -1
  135. package/dist/config.js.map +0 -1
  136. package/dist/index.d.ts.map +0 -1
  137. package/dist/index.js.map +0 -1
  138. package/dist/services/__fixtures__/jpeg.d.ts.map +0 -1
  139. package/dist/services/__fixtures__/jpeg.js.map +0 -1
  140. package/dist/services/audioFxRender.d.ts.map +0 -1
  141. package/dist/services/audioFxRender.js.map +0 -1
  142. package/dist/services/audioMixer.d.ts.map +0 -1
  143. package/dist/services/audioMixer.js.map +0 -1
  144. package/dist/services/audioMixer.types.d.ts.map +0 -1
  145. package/dist/services/audioMixer.types.js.map +0 -1
  146. package/dist/services/audioVolumeEnvelope.d.ts.map +0 -1
  147. package/dist/services/audioVolumeEnvelope.js.map +0 -1
  148. package/dist/services/browserLeasePool.d.ts.map +0 -1
  149. package/dist/services/browserLeasePool.js.map +0 -1
  150. package/dist/services/browserManager.d.ts.map +0 -1
  151. package/dist/services/browserManager.js.map +0 -1
  152. package/dist/services/captureFailure.d.ts.map +0 -1
  153. package/dist/services/captureFailure.js.map +0 -1
  154. package/dist/services/captureWarning.d.ts.map +0 -1
  155. package/dist/services/captureWarning.js.map +0 -1
  156. package/dist/services/chromeHostCeiling.d.ts.map +0 -1
  157. package/dist/services/chromeHostCeiling.js.map +0 -1
  158. package/dist/services/chromeMemorySampler.d.ts.map +0 -1
  159. package/dist/services/chromeMemorySampler.js.map +0 -1
  160. package/dist/services/chunkEncoder.d.ts.map +0 -1
  161. package/dist/services/chunkEncoder.js.map +0 -1
  162. package/dist/services/chunkEncoder.types.d.ts.map +0 -1
  163. package/dist/services/chunkEncoder.types.js.map +0 -1
  164. package/dist/services/drawElementCaptureError.d.ts.map +0 -1
  165. package/dist/services/drawElementCaptureError.js.map +0 -1
  166. package/dist/services/drawElementService.d.ts.map +0 -1
  167. package/dist/services/drawElementService.js.map +0 -1
  168. package/dist/services/extractedFrameIndex.d.ts.map +0 -1
  169. package/dist/services/extractedFrameIndex.js.map +0 -1
  170. package/dist/services/extractionCache.d.ts.map +0 -1
  171. package/dist/services/extractionCache.js.map +0 -1
  172. package/dist/services/fileServer.d.ts.map +0 -1
  173. package/dist/services/fileServer.js.map +0 -1
  174. package/dist/services/frameCapture.d.ts.map +0 -1
  175. package/dist/services/frameCapture.js.map +0 -1
  176. package/dist/services/hdrCapture.d.ts.map +0 -1
  177. package/dist/services/hdrCapture.js.map +0 -1
  178. package/dist/services/mediaHidden.d.ts.map +0 -1
  179. package/dist/services/mediaHidden.js.map +0 -1
  180. package/dist/services/mediaRenderIdBridge.d.ts.map +0 -1
  181. package/dist/services/mediaRenderIdBridge.js.map +0 -1
  182. package/dist/services/mediaTimelineWindow.d.ts.map +0 -1
  183. package/dist/services/mediaTimelineWindow.js.map +0 -1
  184. package/dist/services/motionBlur.d.ts.map +0 -1
  185. package/dist/services/motionBlur.js.map +0 -1
  186. package/dist/services/pageNavigationTimeoutErrorHint.d.ts.map +0 -1
  187. package/dist/services/pageNavigationTimeoutErrorHint.js.map +0 -1
  188. package/dist/services/parallelCoordinator.d.ts.map +0 -1
  189. package/dist/services/parallelCoordinator.js.map +0 -1
  190. package/dist/services/protocolTimeoutErrorHint.d.ts.map +0 -1
  191. package/dist/services/protocolTimeoutErrorHint.js.map +0 -1
  192. package/dist/services/referenceResolver.d.ts.map +0 -1
  193. package/dist/services/referenceResolver.js.map +0 -1
  194. package/dist/services/screenshotService.d.ts.map +0 -1
  195. package/dist/services/screenshotService.js.map +0 -1
  196. package/dist/services/streamingEncoder.d.ts.map +0 -1
  197. package/dist/services/streamingEncoder.js.map +0 -1
  198. package/dist/services/systemMemory.d.ts.map +0 -1
  199. package/dist/services/systemMemory.js.map +0 -1
  200. package/dist/services/threeDProjection.d.ts.map +0 -1
  201. package/dist/services/threeDProjection.js.map +0 -1
  202. package/dist/services/videoFrameExtractor.d.ts.map +0 -1
  203. package/dist/services/videoFrameExtractor.js.map +0 -1
  204. package/dist/services/videoFrameInjector.d.ts.map +0 -1
  205. package/dist/services/videoFrameInjector.js.map +0 -1
  206. package/dist/services/vp9Options.d.ts.map +0 -1
  207. package/dist/services/vp9Options.js.map +0 -1
  208. package/dist/services/wavChunks.d.ts.map +0 -1
  209. package/dist/services/wavChunks.js.map +0 -1
  210. package/dist/types.d.ts.map +0 -1
  211. package/dist/types.js.map +0 -1
  212. package/dist/utils/alphaBlit.d.ts.map +0 -1
  213. package/dist/utils/alphaBlit.js.map +0 -1
  214. package/dist/utils/alphaPlaneProbe.d.ts.map +0 -1
  215. package/dist/utils/alphaPlaneProbe.js.map +0 -1
  216. package/dist/utils/assertSwiftShader.d.ts.map +0 -1
  217. package/dist/utils/assertSwiftShader.js.map +0 -1
  218. package/dist/utils/concurrencyLimit.d.ts.map +0 -1
  219. package/dist/utils/concurrencyLimit.js.map +0 -1
  220. package/dist/utils/crc32.d.ts.map +0 -1
  221. package/dist/utils/crc32.js.map +0 -1
  222. package/dist/utils/evenDimensions.d.ts.map +0 -1
  223. package/dist/utils/evenDimensions.js.map +0 -1
  224. package/dist/utils/ffmpegBinaries.d.ts.map +0 -1
  225. package/dist/utils/ffmpegBinaries.js.map +0 -1
  226. package/dist/utils/ffprobe.d.ts.map +0 -1
  227. package/dist/utils/ffprobe.js.map +0 -1
  228. package/dist/utils/gpuEncoder.d.ts.map +0 -1
  229. package/dist/utils/gpuEncoder.js.map +0 -1
  230. package/dist/utils/gpuParityDiff.d.ts.map +0 -1
  231. package/dist/utils/gpuParityDiff.js.map +0 -1
  232. package/dist/utils/hdr.d.ts.map +0 -1
  233. package/dist/utils/hdr.js.map +0 -1
  234. package/dist/utils/htmlTemplate.d.ts.map +0 -1
  235. package/dist/utils/htmlTemplate.js.map +0 -1
  236. package/dist/utils/jpegInput.d.ts.map +0 -1
  237. package/dist/utils/jpegInput.js.map +0 -1
  238. package/dist/utils/layerCompositor.d.ts.map +0 -1
  239. package/dist/utils/layerCompositor.js.map +0 -1
  240. package/dist/utils/managedChildProcess.d.ts.map +0 -1
  241. package/dist/utils/managedChildProcess.js.map +0 -1
  242. package/dist/utils/notMediaPayload.d.ts.map +0 -1
  243. package/dist/utils/notMediaPayload.js.map +0 -1
  244. package/dist/utils/parityContract.d.ts.map +0 -1
  245. package/dist/utils/parityContract.js.map +0 -1
  246. package/dist/utils/processRss.d.ts.map +0 -1
  247. package/dist/utils/processRss.js.map +0 -1
  248. package/dist/utils/processTracker.d.ts.map +0 -1
  249. package/dist/utils/processTracker.js.map +0 -1
  250. package/dist/utils/psnr.d.ts.map +0 -1
  251. package/dist/utils/psnr.js.map +0 -1
  252. package/dist/utils/psnrFilterAvailability.d.ts.map +0 -1
  253. package/dist/utils/psnrFilterAvailability.js.map +0 -1
  254. package/dist/utils/readWebGlVendorInfoFromCanvas.d.ts.map +0 -1
  255. package/dist/utils/readWebGlVendorInfoFromCanvas.js.map +0 -1
  256. package/dist/utils/renderProvenance.d.ts.map +0 -1
  257. package/dist/utils/renderProvenance.js.map +0 -1
  258. package/dist/utils/runFfmpeg.d.ts.map +0 -1
  259. package/dist/utils/runFfmpeg.js.map +0 -1
  260. package/dist/utils/sdrCaptureColor.d.ts.map +0 -1
  261. package/dist/utils/sdrCaptureColor.js.map +0 -1
  262. package/dist/utils/shaderTransitions.d.ts.map +0 -1
  263. package/dist/utils/shaderTransitions.js.map +0 -1
  264. package/dist/utils/urlDownloader.d.ts.map +0 -1
  265. package/dist/utils/urlDownloader.js.map +0 -1
@@ -473,7 +473,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
473
473
  if ((session.config?.useDrawElement ?? false) && !supersampling && forceScreenshot) {
474
474
  session.deGateReason = "render_mode_hint";
475
475
  session.deFallbackTrigger = "render_mode_hint";
476
- console.log("[engine] fast capture: falling back to screenshot — render-mode compatibility " +
476
+ console.log("[engine] fast capture falls back to screenshot: render-mode compatibility " +
477
477
  "hint forced screenshot capture (e.g. raw requestAnimationFrame composition).");
478
478
  }
479
479
  if (useDrawElement) {
@@ -521,7 +521,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
521
521
  if (!supportsDrawElement) {
522
522
  session.deGateReason = "unsupported_chrome";
523
523
  session.deFallbackTrigger = "unsupported_chrome";
524
- console.log(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
524
+ console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
525
525
  "this Chrome build does not implement canvas.drawElementImage (Dev/Canary-only " +
526
526
  "feature); run `hyperframes browser ensure --force` to fetch a supported " +
527
527
  "build, or set HYPERFRAMES_BROWSER_PATH to one.");
@@ -540,7 +540,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
540
540
  if (!forceDE && !(await isPsnrFilterAvailable())) {
541
541
  session.deGateReason = "ffmpeg_no_psnr_filter";
542
542
  session.deFallbackTrigger = "ffmpeg_no_psnr_filter";
543
- console.warn(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
543
+ console.warn(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
544
544
  "host ffmpeg is missing or was built without the `psnr` filter " +
545
545
  "(libpostproc), so drawElement self-verification cannot run. Install " +
546
546
  "an ffmpeg build that includes libpostproc (or set HYPERFRAMES_FFMPEG_PATH " +
@@ -569,8 +569,8 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
569
569
  // "screenshot": on a BeginFrame-launched browser (Linux fast capture)
570
570
  // Page.captureScreenshot hangs for the full protocol timeout, while
571
571
  // beginFrameCapture is the platform's normal baseline path.
572
- console.log(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
573
- "SwiftShader (software rasterizer — no GPU egress to skip, drawElement is " +
572
+ console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
573
+ "SwiftShader (software rasterizer, no GPU egress to skip, drawElement is " +
574
574
  "parity-or-slower; see fast-capture-limitations.md)");
575
575
  await routeToFallback();
576
576
  }
@@ -584,12 +584,11 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
584
584
  const cssFx = await detectCssEffectRisk(page);
585
585
  if (cssFx) {
586
586
  session.deGateReason = `css_effect:${(cssFx.split(":")[0] ?? "").replace(/[^a-z-]/gi, "")}`;
587
- // Full specific effect ("filter:blur" / "filter:drop-shadow" /
588
- // "backdrop-filter" / "clip-path") — `deGateReason` sanitizes
589
- // this to the low-cardinality prefix; `deFallbackTrigger` keeps
590
- // the fine-grained value for the diagnostic profile emission.
587
+ // Full specific effect from `detectCssEffectRisk` (e.g. "filter:blur",
588
+ // "mix-blend-mode", "webgl-context") — `deGateReason` keeps its
589
+ // low-cardinality prefix, `deFallbackTrigger` the full value.
591
590
  session.deFallbackTrigger = cssFx;
592
- console.log(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
591
+ console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
593
592
  `${cssFx} detected (drawElementImage cannot reproduce it; see fast-capture-limitations.md)`);
594
593
  await routeToFallback();
595
594
  return;
@@ -620,7 +619,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
620
619
  if (atRisk.size > 0 && atRiskFraction > fractionFloor) {
621
620
  session.deGateReason = "at_risk_timeline";
622
621
  session.deFallbackTrigger = "at_risk_timeline";
623
- console.log(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
622
+ console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
624
623
  `${atRisk.size}/${totalFrames} frames animate a compositor-incompatible prop ` +
625
624
  `(blend/3D/clip/mask); drawElementImage drops these mid-animation ` +
626
625
  `(deterministic timeline gate; see fast-capture-limitations.md Lim 7)`);
@@ -636,7 +635,7 @@ async function initDrawElementOrTransparentBackground(session, page, logInitPhas
636
635
  if (!forceDE && !threeD.ok) {
637
636
  session.deGateReason = "3d_init_failed";
638
637
  session.deFallbackTrigger = "3d_init_failed";
639
- console.log(`[engine] fast capture: falling back to ${session.launchCaptureMode} capture — ` +
638
+ console.log(`[engine] fast capture falls back to ${session.launchCaptureMode} capture: ` +
640
639
  `3D projection init failed (${threeD.reason ?? "unknown"})`);
641
640
  await routeToFallback();
642
641
  return;
@@ -761,7 +760,7 @@ export async function createCaptureSession(serverUrl, outputDir, options, onBefo
761
760
  // passed both flags — warn once and treat page-side as disabled.
762
761
  if (useDrawElement &&
763
762
  (config?.enablePageSideCompositing ?? DEFAULT_CONFIG.enablePageSideCompositing)) {
764
- console.warn("[engine] useDrawElement is incompatible with page-side shader compositing — " +
763
+ console.warn("[engine] useDrawElement is incompatible with page-side shader compositing, " +
765
764
  "ignoring enablePageSideCompositing for this render. Prefer resolveConfig, " +
766
765
  "which disables page-side compositing automatically for fast-capture renders.");
767
766
  }
@@ -905,7 +904,7 @@ async function constructCaptureSession(input) {
905
904
  // measured ~28 dB of damage on comps whose fades it touched. Warn instead
906
905
  // of silently ignoring the old escape hatch.
907
906
  if (process.env.HF_FAST_CAPTURE_AUTOALPHA !== undefined) {
908
- console.warn("[engine] HF_FAST_CAPTURE_AUTOALPHA is retired and ignored — the requestPaint " +
907
+ console.warn("[engine] HF_FAST_CAPTURE_AUTOALPHA is retired and ignored: the requestPaint " +
909
908
  "paint contract captures animated opacity natively (see drawElementService.ts).");
910
909
  }
911
910
  // Re-apply the captured root's own compositor-applied props to the 2D
@@ -1061,7 +1060,7 @@ export const HF_READY_DIAGNOSTIC_EXPR = `(async function() {
1061
1060
  await new Promise(function(r) { setTimeout(r, 0); });
1062
1061
  }
1063
1062
  // A thenable resolving via its own setTimeout(0) can still misreport as
1064
- // pending here (macrotask registration order, not resolution order) — a
1063
+ // pending here (macrotask registration order, not resolution order), a
1065
1064
  // narrow case that self-corrects on the next ~1s diagnostic tick.
1066
1065
  var pendingBuildReadyKeys = keys.filter(function(key) { return !settled[key]; });
1067
1066
  var rejectedBuildReadyKeys = keys.filter(function(key) { return settled[key] === "rejected"; });
@@ -1082,20 +1081,20 @@ export function buildZeroDurationDiagnostic(diag) {
1082
1081
  const hints = [];
1083
1082
  if (diag.pendingBuildReadyKeys.length > 0) {
1084
1083
  hints.push(`window.__hf.buildReady never resolved for: ${diag.pendingBuildReadyKeys.join(", ")}. ` +
1085
- "The runtime holds render-ready until every registered buildReady promise settles — " +
1086
- "find where the composition registers that key and confirm it actually resolves.");
1084
+ "The runtime holds render-ready until every registered buildReady promise settles. " +
1085
+ "Find where the composition registers that key and confirm it actually resolves.");
1087
1086
  }
1088
1087
  if (diag.rejectedBuildReadyKeys.length > 0) {
1089
1088
  hints.push(`window.__hf.buildReady rejected for: ${diag.rejectedBuildReadyKeys.join(", ")}. ` +
1090
- "That key's build promise failed rather than hanging — find why it rejects.");
1089
+ "That key's build promise failed rather than hanging. Find why it rejects.");
1091
1090
  }
1092
1091
  if (!diag.hasPlayer) {
1093
- hints.push("window.__player was never set — the HyperFrames runtime did not initialize.");
1092
+ hints.push("window.__player was never set: the HyperFrames runtime did not initialize.");
1094
1093
  }
1095
1094
  if (!diag.hasTimeline) {
1096
1095
  hints.push("No GSAP timeline registered (window.__timelines is empty). " +
1097
1096
  "CSS/WAAPI/Lottie animations are usually auto-detected (the runtime infers " +
1098
- "duration from the longest running animation) — this composition's duration " +
1097
+ "duration from the longest running animation), but this composition's duration " +
1099
1098
  "could not be inferred, which usually means an infinite/unbounded animation " +
1100
1099
  "(e.g. animation-iteration-count: infinite, repeat: -1 WAAPI, or a looping Lottie " +
1101
1100
  "clip) or a Three.js scene with no discoverable AnimationClip.");
@@ -1104,7 +1103,7 @@ export function buildZeroDurationDiagnostic(diag) {
1104
1103
  hints.push('Fix: add data-duration="<seconds>" to your root <div data-composition-id="..."> element.');
1105
1104
  }
1106
1105
  if (diag.hasSeek && diag.duration === 0 && diag.renderReady) {
1107
- hints.push("The runtime finished initializing but reported zero duration — this is permanent.");
1106
+ hints.push("The runtime finished initializing but reported zero duration. This is permanent.");
1108
1107
  }
1109
1108
  return (`[FrameCapture] Composition has zero duration.\n` +
1110
1109
  ` Runtime ready: ${diag.renderReady}, __player: ${diag.hasPlayer}, ` +
@@ -1115,7 +1114,7 @@ export function buildZeroDurationDiagnostic(diag) {
1115
1114
  async function evaluateHfDiagnostic(page) {
1116
1115
  return (await page.evaluate(HF_READY_DIAGNOSTIC_EXPR));
1117
1116
  }
1118
- async function pollHfReady(page, timeoutMs, intervalMs = 100) {
1117
+ export async function pollHfReady(page, timeoutMs, intervalMs = 100) {
1119
1118
  const readyExpr = `!!(window.__hf && typeof window.__hf.seek === "function" && window.__hf.duration > 0)`;
1120
1119
  const FAST_FAIL_AFTER_MS = 10_000;
1121
1120
  // Throttle diagnostic CDP calls to ~1000ms — running evaluateHfDiagnostic on
@@ -1125,8 +1124,10 @@ async function pollHfReady(page, timeoutMs, intervalMs = 100) {
1125
1124
  const deadline = Date.now() + timeoutMs;
1126
1125
  let lastDiagnosticAt = 0;
1127
1126
  while (Date.now() < deadline) {
1128
- const ready = Boolean(await page.evaluate(readyExpr));
1129
- if (ready)
1127
+ const state = await page.evaluate(`typeof window.__hfStartupError === "string" ? window.__hfStartupError : ${readyExpr}`);
1128
+ if (typeof state === "string")
1129
+ throw new Error(state);
1130
+ if (state)
1130
1131
  return;
1131
1132
  const elapsed = timeoutMs - (deadline - Date.now());
1132
1133
  if (elapsed >= FAST_FAIL_AFTER_MS) {
@@ -1237,7 +1238,7 @@ export async function pollSubCompositionTimelines(page, timeoutMs, { intervalMs
1237
1238
  if (failures.length > 0 && now - start >= scriptFailureGraceMs) {
1238
1239
  scriptFailureBail = true;
1239
1240
  console.warn(`[FrameCapture] Sub-composition timeline wait cut short after ${now - start}ms: ` +
1240
- `script resource(s) failed to load (${failures.join(", ")}) — ` +
1241
+ `script resource(s) failed to load (${failures.join(", ")}), so ` +
1241
1242
  `the timeline registration they carry can never arrive. ` +
1242
1243
  `Fix the script reference; the render proceeds without those animations.`);
1243
1244
  break;
@@ -1469,7 +1470,7 @@ export function buildLiveMapWarning(libraries) {
1469
1470
  code: "live_map_detected",
1470
1471
  message: `Live map viewport(s) detected in the composition (${libraries.join(", ")}). ` +
1471
1472
  `Map tiles load over the network at render time, which the deterministic-render ` +
1472
- `contract forbids — frames captured before tiles arrive ship a blank or partial map ` +
1473
+ `contract forbids: frames captured before tiles arrive ship a blank or partial map ` +
1473
1474
  `with no error. Bake the map to a video first (see the motion-graphics maps skill / ` +
1474
1475
  `bake-basemap.mjs) and use the baked file as the imagery layer.`,
1475
1476
  details: { sources: [...libraries] },
@@ -1771,7 +1772,7 @@ export async function initializeSession(session) {
1771
1772
  .join(", ");
1772
1773
  });
1773
1774
  console.warn(`[FrameCapture] Some image elements did not load within ${pageReadyTimeout}ms: ${failedImages}. ` +
1774
- `Continuing render — affected images may appear blank/missing in early frames.`);
1775
+ `Continuing render. Affected images may appear blank/missing in early frames.`);
1775
1776
  }
1776
1777
  await decodeAllImages(page);
1777
1778
  return ready;
@@ -1790,7 +1791,7 @@ export async function initializeSession(session) {
1790
1791
  .join(", ");
1791
1792
  }, skipVideoIds);
1792
1793
  console.warn(`[FrameCapture] Some video elements did not decode within ${pageReadyTimeout}ms: ${failedVideos}. ` +
1793
- `Continuing render — affected videos will appear as blank/black frames.`);
1794
+ `Continuing render. Affected videos will appear as blank/black frames.`);
1794
1795
  }
1795
1796
  recordCaptureWarnings(session, await collectMediaReadinessWarnings(page, skipVideoIds, pageReadyTimeout));
1796
1797
  await recordLiveMapWarning(session, page);
@@ -1901,7 +1902,7 @@ export async function initializeSession(session) {
1901
1902
  .join(", ");
1902
1903
  });
1903
1904
  console.warn(`[FrameCapture] Some image elements did not load within ${pageReadyTimeout}ms: ${failedImages}. ` +
1904
- `Continuing render — affected images may appear blank/missing in early frames.`);
1905
+ `Continuing render. Affected images may appear blank/missing in early frames.`);
1905
1906
  }
1906
1907
  await decodeAllImages(page);
1907
1908
  return ready;
@@ -1920,7 +1921,7 @@ export async function initializeSession(session) {
1920
1921
  .join(", ");
1921
1922
  }, bfSkipVideoIds);
1922
1923
  console.warn(`[FrameCapture] Some video elements did not decode within ${pageReadyTimeout}ms: ${failedVideos}. ` +
1923
- `Continuing render — affected videos will appear as blank/black frames.`);
1924
+ `Continuing render. Affected videos will appear as blank/black frames.`);
1924
1925
  }
1925
1926
  recordCaptureWarnings(session, await collectMediaReadinessWarnings(page, bfSkipVideoIds, pageReadyTimeout));
1926
1927
  await recordLiveMapWarning(session, page);
@@ -2721,7 +2722,7 @@ async function armStaticDedup(session, page, logInitPhase) {
2721
2722
  * compositor-incompatible properties (blend-mode, 3D transforms, clip-path, mask).
2722
2723
  * drawElement cannot reproduce these effects mid-tween → capture those frames via
2723
2724
  * screenshot instead. opacity/filter fades were dropped from the set once Chrome 151
2724
- * fixed crbug 521861819. See docs/fast-capture-limitations.md Lim 7.
2725
+ * fixed crbug 521861819.
2725
2726
  *
2726
2727
  * Returns the union of at-risk frame indices (±1 margin around each tween interval)
2727
2728
  * and totalFrames (for fraction computation by the caller).
@@ -3235,7 +3236,7 @@ export async function captureFrameToBuffer(session, frameIndex, time) {
3235
3236
  // works. Counted here rather than in captureFrameCore's catch: the
3236
3237
  // deadline rejects from outside it, so that catch never runs.
3237
3238
  session.deFrameTimeouts = (session.deFrameTimeouts ?? 0) + 1;
3238
- console.log(`[engine] fast capture: frame ${frameIndex} — capture exceeded ` +
3239
+ console.log(`[engine] fast capture frame ${frameIndex}: capture exceeded ` +
3239
3240
  `${DE_FRAME_TIMEOUT_MS}ms; renderer stalled after drawElementImage ` +
3240
3241
  `(PRINFRA-488). Failing the drawElement attempt so the whole render ` +
3241
3242
  `retries via screenshot.`);
@@ -3809,4 +3810,3 @@ export function getCapturePerfSummary(session) {
3809
3810
  deFrameTimeouts: session.deFrameTimeouts ?? 0,
3810
3811
  };
3811
3812
  }
3812
- //# sourceMappingURL=frameCapture.js.map
@@ -45,4 +45,3 @@ export declare function launchHdrBrowser(width: number, height: number): Promise
45
45
  page: Page;
46
46
  }>;
47
47
  export declare function buildHdrChromeArgs(width: number, height: number): string[];
48
- //# sourceMappingURL=hdrCapture.d.ts.map
@@ -231,4 +231,3 @@ export function buildHdrChromeArgs(width, height) {
231
231
  "--autoplay-policy=no-user-gesture-required",
232
232
  ];
233
233
  }
234
- //# sourceMappingURL=hdrCapture.js.map
@@ -14,4 +14,3 @@ export type AudioGroupsById = ReadonlyMap<string, {
14
14
  export declare function audioGroupsById(document: Parameters<typeof resolveAudioGroups>[0]): AudioGroupsById;
15
15
  export declare function isMemberGroupHidden(groupsById: AudioGroupsById, el: GroupKeyEl): boolean;
16
16
  export {};
17
- //# sourceMappingURL=mediaHidden.d.ts.map
@@ -17,4 +17,3 @@ export function isMemberGroupHidden(groupsById, el) {
17
17
  const groupId = memberGroupKey(el);
18
18
  return groupId ? (groupsById.get(groupId)?.hidden ?? false) : false;
19
19
  }
20
- //# sourceMappingURL=mediaHidden.js.map
@@ -32,4 +32,3 @@ declare global {
32
32
  * mid-render navigation cannot leave a capture stage without them.
33
33
  */
34
34
  export declare function installMediaRenderIdBridge(page: Page): Promise<void>;
35
- //# sourceMappingURL=mediaRenderIdBridge.d.ts.map
@@ -34,4 +34,3 @@ export async function installMediaRenderIdBridge(page) {
34
34
  window.__hfMediaId = (el) => el.getAttribute(attr) || el.id;
35
35
  }, MEDIA_RENDER_ID_ATTR);
36
36
  }
37
- //# sourceMappingURL=mediaRenderIdBridge.js.map
@@ -4,4 +4,3 @@ interface TimelineAttributeReader {
4
4
  /** True only when authored timing explicitly declares an inactive window. */
5
5
  export declare function isKnownInactiveTimelineWindow(element: TimelineAttributeReader, resolvedStart: number): boolean;
6
6
  export {};
7
- //# sourceMappingURL=mediaTimelineWindow.d.ts.map
@@ -7,4 +7,3 @@ export function isKnownInactiveTimelineWindow(element, resolvedStart) {
7
7
  const end = parseStrictFiniteTimingNumber(element.getAttribute("data-end"));
8
8
  return end != null && end <= resolvedStart;
9
9
  }
10
- //# sourceMappingURL=mediaTimelineWindow.js.map
@@ -130,4 +130,3 @@ export declare class MotionBlurAccumulator {
130
130
  data: Uint8Array;
131
131
  };
132
132
  }
133
- //# sourceMappingURL=motionBlur.d.ts.map
@@ -272,4 +272,3 @@ export class MotionBlurAccumulator {
272
272
  return { width: this.width, height: this.height, data: out };
273
273
  }
274
274
  }
275
- //# sourceMappingURL=motionBlur.js.map
@@ -76,4 +76,3 @@ export declare function augmentPageNavigationTimeoutError(err: unknown, effectiv
76
76
  * drift.
77
77
  */
78
78
  export declare function isPageNavigationTimeoutError(err: unknown): boolean;
79
- //# sourceMappingURL=pageNavigationTimeoutErrorHint.d.ts.map
@@ -109,4 +109,3 @@ function buildDockerHintBlock() {
109
109
  `identically under Docker. Consider:\n` +
110
110
  ` hyperframes render ... --docker\n`);
111
111
  }
112
- //# sourceMappingURL=pageNavigationTimeoutErrorHint.js.map
@@ -261,4 +261,3 @@ export declare function getSystemResources(): {
261
261
  recommendedWorkers: number;
262
262
  };
263
263
  export {};
264
- //# sourceMappingURL=parallelCoordinator.d.ts.map
@@ -89,7 +89,7 @@ export function synthesizeSilentWorkerExitError(result, expectedFrames) {
89
89
  return (`worker ${result.workerId} exited without terminal error string ` +
90
90
  `(framesCaptured=${result.framesCaptured}, expected=${expectedFrames}, ` +
91
91
  `range=[${result.startFrame}, ${result.endFrame})). ` +
92
- `Field signal ts=1784042064 — this class of failure has been reported; ` +
92
+ `Field signal ts=1784042064: this class of failure has been reported; ` +
93
93
  `consider re-run with --workers=1 to isolate.`);
94
94
  }
95
95
  /**
@@ -508,7 +508,7 @@ async function psnrForDiskSample(framePath, truth, workerId, idx) {
508
508
  if (isFfmpegInfrastructureFailure(err)) {
509
509
  const detail = err instanceof Error ? err.message : String(err);
510
510
  throw new Error(`[Parallel] drawElement disk self-verify aborted (worker ${workerId}, frame ${idx}): ` +
511
- `ffmpeg or the \`psnr\` filter is unavailable — ${detail}. The preflight in ` +
511
+ `ffmpeg or the \`psnr\` filter is unavailable (${detail}). The preflight in ` +
512
512
  "initDrawElementOrTransparentBackground normally catches this at bootstrap; if you " +
513
513
  "hit this after a successful preflight, ffmpeg was replaced mid-render or " +
514
514
  "HYPERFRAMES_FFMPEG_PATH now points at a different binary.", { cause: err });
@@ -821,4 +821,3 @@ export function getSystemResources() {
821
821
  recommendedWorkers: calculateOptimalWorkers(1000),
822
822
  };
823
823
  }
824
- //# sourceMappingURL=parallelCoordinator.js.map
@@ -25,4 +25,3 @@ export declare function augmentProtocolTimeoutError(err: unknown, effectiveTimeo
25
25
  * the same matcher as the augmentation path so the two never drift.
26
26
  */
27
27
  export declare function isProtocolTimeoutError(err: unknown): boolean;
28
- //# sourceMappingURL=protocolTimeoutErrorHint.d.ts.map
@@ -42,4 +42,3 @@ export function isProtocolTimeoutError(err) {
42
42
  const message = err instanceof Error ? err.message : typeof err === "string" ? err : "";
43
43
  return PROTOCOL_TIMEOUT_MATCHER.test(message);
44
44
  }
45
- //# sourceMappingURL=protocolTimeoutErrorHint.js.map
@@ -36,4 +36,3 @@ export declare function resolveReferencedStart(doc: RefResolverDoc, el: RefResol
36
36
  * at parse time) — the caller then treats the reference as duration-0.
37
37
  */
38
38
  export declare function resolveReferencedDuration(doc: RefResolverDoc, el: RefResolverEl, startCache: Map<RefResolverEl, number>, visiting: Set<RefResolverEl>): number | null;
39
- //# sourceMappingURL=referenceResolver.d.ts.map
@@ -85,4 +85,3 @@ export function resolveReferencedDuration(doc, el, startCache, visiting) {
85
85
  }
86
86
  return null;
87
87
  }
88
- //# sourceMappingURL=referenceResolver.js.map
@@ -193,4 +193,3 @@ export declare function injectVideoFramesBatch(page: Page, updates: Array<{
193
193
  dataUri: string;
194
194
  }>): Promise<string[]>;
195
195
  export declare function syncVideoFrameVisibility(page: Page, activeVideoIds: string[]): Promise<void>;
196
- //# sourceMappingURL=screenshotService.d.ts.map
@@ -99,7 +99,7 @@ async function sendBeginFrame(client, params) {
99
99
  continue;
100
100
  }
101
101
  if (isPending) {
102
- throw new Error(`[BeginFrame] Frame still pending after ${PENDING_FRAME_RETRIES} retries — CPU overloaded by parallel renders. ` +
102
+ throw new Error(`[BeginFrame] Frame still pending after ${PENDING_FRAME_RETRIES} retries: CPU overloaded by parallel renders. ` +
103
103
  `Reduce concurrent renders or use --docker for isolation.`);
104
104
  }
105
105
  throw err;
@@ -632,6 +632,14 @@ export async function injectVideoFramesBatch(page, updates) {
632
632
  : Number.isNaN(opacityParsed)
633
633
  ? 1
634
634
  : opacityParsed;
635
+ // Measure first: an in-flow bordered <img> sibling would shrink the video's flex box.
636
+ const videoRect = video.getBoundingClientRect();
637
+ const videoBox = {
638
+ left: Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0,
639
+ top: Number.isFinite(video.offsetTop) ? video.offsetTop : 0,
640
+ width: video.offsetWidth > 0 ? video.offsetWidth : videoRect.width,
641
+ height: video.offsetHeight > 0 ? video.offsetHeight : videoRect.height,
642
+ };
635
643
  if (isNewImage) {
636
644
  img = document.createElement("img");
637
645
  img.classList.add("__render_frame__");
@@ -667,24 +675,16 @@ export async function injectVideoFramesBatch(page, updates) {
667
675
  // instead of flowing below it. With position:relative, both elements
668
676
  // stack vertically — the <img> lands below the video and gets clipped
669
677
  // by any overflow:hidden ancestor (e.g., border-radius wrappers).
670
- //
671
- // Apply this after visual style copying so the measured used box is
672
- // the final authority for replacement frame geometry.
673
- {
674
- const videoRect = video.getBoundingClientRect();
675
- const offsetLeft = Number.isFinite(video.offsetLeft) ? video.offsetLeft : 0;
676
- const offsetTop = Number.isFinite(video.offsetTop) ? video.offsetTop : 0;
677
- const offsetWidth = video.offsetWidth > 0 ? video.offsetWidth : videoRect.width;
678
- const offsetHeight = video.offsetHeight > 0 ? video.offsetHeight : videoRect.height;
679
- img.style.position = "absolute";
680
- img.style.inset = "auto";
681
- img.style.left = `${offsetLeft}px`;
682
- img.style.top = `${offsetTop}px`;
683
- img.style.right = "auto";
684
- img.style.bottom = "auto";
685
- img.style.width = `${offsetWidth}px`;
686
- img.style.height = `${offsetHeight}px`;
687
- }
678
+ img.style.position = "absolute";
679
+ img.style.inset = "auto";
680
+ img.style.left = `${videoBox.left}px`;
681
+ img.style.top = `${videoBox.top}px`;
682
+ img.style.right = "auto";
683
+ img.style.bottom = "auto";
684
+ img.style.width = `${videoBox.width}px`;
685
+ img.style.height = `${videoBox.height}px`;
686
+ // `videoBox` is a border-box even when the video is content-box.
687
+ img.style.boxSizing = "border-box";
688
688
  img.style.objectFit = computedStyle.objectFit;
689
689
  img.style.objectPosition = computedStyle.objectPosition;
690
690
  img.style.zIndex = computedStyle.zIndex;
@@ -782,4 +782,3 @@ export async function syncVideoFrameVisibility(page, activeVideoIds) {
782
782
  }
783
783
  }, activeVideoIds, COLOR_GRADING_SOURCE_HIDDEN_ATTR);
784
784
  }
785
- //# sourceMappingURL=screenshotService.js.map
@@ -102,4 +102,3 @@ export declare function buildStreamingArgs(options: StreamingEncoderOptions, out
102
102
  * Spawn a streaming FFmpeg encoder that accepts frame buffers on stdin.
103
103
  */
104
104
  export declare function spawnStreamingEncoder(outputPath: string, options: StreamingEncoderOptions, signal?: AbortSignal, config?: Partial<Pick<EngineConfig, "ffmpegStreamingTimeout">>): Promise<StreamingEncoder>;
105
- //# sourceMappingURL=streamingEncoder.d.ts.map
@@ -496,4 +496,3 @@ export async function spawnStreamingEncoder(outputPath, options, signal, config)
496
496
  };
497
497
  return encoder;
498
498
  }
499
- //# sourceMappingURL=streamingEncoder.js.map
@@ -49,4 +49,3 @@ export declare const LOW_MEMORY_TOTAL_MB_THRESHOLD = 8192;
49
49
  * small VMs, small Lambda tiers, small containers) are detected correctly.
50
50
  */
51
51
  export declare function isLowMemorySystem(totalMb?: number): boolean;
52
- //# sourceMappingURL=systemMemory.d.ts.map
@@ -80,8 +80,8 @@ export function getCgroupMemoryLimitMb() {
80
80
  // stderr, not stdout: this is a diagnostic notice, and commands like `check --json`
81
81
  // write their machine-readable payload to stdout. A banner on stdout corrupts that
82
82
  // payload for any JSON consumer (it broke the Video Agent's hyperframes check parse).
83
- console.warn(`[SystemMemory] cgroup memory limit detected: ${_cachedCgroupLimitMb} MiB — ` +
84
- `it governs memory-adaptive render behaviour instead of host RAM.`);
83
+ console.warn(`[SystemMemory] cgroup memory limit detected: ${_cachedCgroupLimitMb} MiB. ` +
84
+ `It governs memory-adaptive render behaviour instead of host RAM.`);
85
85
  }
86
86
  return _cachedCgroupLimitMb;
87
87
  }
@@ -154,4 +154,3 @@ export const LOW_MEMORY_TOTAL_MB_THRESHOLD = 8192;
154
154
  export function isLowMemorySystem(totalMb = getSystemTotalMb()) {
155
155
  return totalMb <= LOW_MEMORY_TOTAL_MB_THRESHOLD;
156
156
  }
157
- //# sourceMappingURL=systemMemory.js.map
@@ -77,4 +77,3 @@ export declare function initThreeDProjection(page: Page): Promise<ThreeDProjecti
77
77
  * Returns the first matched effect name (for logging) or null.
78
78
  */
79
79
  export declare function detectCssEffectRisk(page: Page): Promise<string | null>;
80
- //# sourceMappingURL=threeDProjection.d.ts.map
@@ -510,7 +510,7 @@ export async function initThreeDProjectionInPage() {
510
510
  ok: false,
511
511
  groups: 0,
512
512
  quads: 0,
513
- reason: "degenerate 3D geometry (zero-size or inline-box quad) — " +
513
+ reason: "degenerate 3D geometry (zero-size or inline-box quad): " +
514
514
  "quad projection cannot reproduce Blink's lenient rendering",
515
515
  };
516
516
  }
@@ -521,7 +521,7 @@ export async function initThreeDProjectionInPage() {
521
521
  ok: false,
522
522
  groups: 0,
523
523
  quads: 0,
524
- reason: "3D quad contains GSAP-animated descendants — static texture " +
524
+ reason: "3D quad contains GSAP-animated descendants, a static texture " +
525
525
  "would freeze them at init state",
526
526
  };
527
527
  }
@@ -977,4 +977,3 @@ export async function detectCssEffectRisk(page) {
977
977
  return null;
978
978
  }
979
979
  }
980
- //# sourceMappingURL=threeDProjection.js.map
@@ -105,6 +105,8 @@ export interface ExtractionOptions {
105
105
  * `totalFrames` so another process can extract just the frames it needs with `frameRanges`.
106
106
  */
107
107
  deferRangeExtraction?: boolean;
108
+ /** Directories the caller rewrites on every render (downloaded media); their sources are cached by content. */
109
+ contentKeyedDirs?: readonly string[];
108
110
  }
109
111
  export declare const EXTRACT_CACHE_MIN_AGE_MS: number;
110
112
  /**
@@ -280,6 +282,7 @@ export interface TimelineExtractionWindow {
280
282
  finalFrameOnly?: boolean;
281
283
  }
282
284
  type TimelineWindowVideo = Pick<VideoElement, "start" | "end" | "mediaStart"> & Partial<Pick<VideoElement, "playbackRate">> & Partial<Pick<VideoElement, "loop">>;
285
+ export declare function isVideoPastTimelineEnd(video: Pick<VideoElement, "start">, timelineEnd: number): boolean;
283
286
  /** Move a clip to its extraction window; a rate lane is shifted so it keeps integrating from the new origin. */
284
287
  export declare function rebaseVideoToWindow(video: VideoElement, window: TimelineExtractionWindow): void;
285
288
  /**
@@ -346,4 +349,3 @@ export declare class FrameLookupTable {
346
349
  cleanup(): void;
347
350
  }
348
351
  export declare function createFrameLookupTable(videos: VideoElement[], extracted: ExtractedFrames[], fps?: number): FrameLookupTable;
349
- //# sourceMappingURL=videoFrameExtractor.d.ts.map