hyperframes 0.8.145 → 0.8.147

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 (186) hide show
  1. package/dist/{add-B6OUH46W.js → add-5CNUY3EW.js} +15 -15
  2. package/dist/{animatedGifPrep-MIWRDJIO.js → animatedGifPrep-ZID2XJRQ.js} +10 -10
  3. package/dist/{asset-XJ2B2PU3.js → asset-TFEENZ7K.js} +2 -2
  4. package/dist/{assetCataloger-A5ZLSCMZ.js → assetCataloger-GX4B55VB.js} +4 -4
  5. package/dist/{auth-5HOVCZMV.js → auth-EJVZW6C3.js} +2 -2
  6. package/dist/{autoUpdate-WVNL5K3D.js → autoUpdate-MBNEZ2U4.js} +2 -2
  7. package/dist/{backgroundChecks-IGF54SFH.js → backgroundChecks-DNW5NPTY.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-T6JEGCQV.js → batchRender-T7S2CGJE.js} +5 -5
  10. package/dist/{beats-37T6Y6QP.js → beats-STXBGN6Z.js} +16 -16
  11. package/dist/{benchmark-ZVVLOWPP.js → benchmark-AC6IGEQP.js} +12 -12
  12. package/dist/{browser-4SSJOLH4.js → browser-FB5AK32T.js} +5 -5
  13. package/dist/{bundleWithLocalizedFonts-XWK423QP.js → bundleWithLocalizedFonts-HSCWGCFO.js} +2 -2
  14. package/dist/{capture-KZXOPBMO.js → capture-I24MXH3Y.js} +13 -13
  15. package/dist/{capture-2SF7YP57.js → capture-VEIVUHWB.js} +2 -2
  16. package/dist/{catalog-NLD4A2C6.js → catalog-JRC4VTTI.js} +15 -15
  17. package/dist/{catch-up-4BSRN6IR.js → catch-up-NTCK7Z3G.js} +6 -6
  18. package/dist/{check-IA44QQWM.js → check-7M7W4LPN.js} +38 -38
  19. package/dist/{checkBrowser-VM35KZMW.js → checkBrowser-2YRVCAYB.js} +118 -61
  20. package/dist/{chunk-OTHDVXOJ.js → chunk-2IDHEEAN.js} +3 -3
  21. package/dist/{chunk-VHFEMFYL.js → chunk-3BETQ4XI.js} +3 -3
  22. package/dist/{chunk-3KU3PFDW.js → chunk-3BYMCR4O.js} +85 -75
  23. package/dist/{chunk-FXJJCPPB.js → chunk-3HSWLZ6S.js} +1 -1
  24. package/dist/{chunk-ZF7SXQJ7.js → chunk-3PPO64IB.js} +2 -2
  25. package/dist/{chunk-PLR7Z6TC.js → chunk-3YUFN37G.js} +1 -1
  26. package/dist/{chunk-GRY3PN3K.js → chunk-4YVMMRHR.js} +2 -2
  27. package/dist/{chunk-ICKDMTLA.js → chunk-55RZG5SQ.js} +2 -2
  28. package/dist/{chunk-3IBMBNYY.js → chunk-5OKZLMQK.js} +10 -10
  29. package/dist/{chunk-DIRJ322I.js → chunk-66SAATRI.js} +3 -3
  30. package/dist/{chunk-GMAJB2P6.js → chunk-6BSIQJPW.js} +1 -1
  31. package/dist/{chunk-4QWD6JYN.js → chunk-6WD636E5.js} +3 -3
  32. package/dist/{chunk-5WVW7P23.js → chunk-A72OAGNB.js} +6 -6
  33. package/dist/{chunk-XBX4QJP7.js → chunk-AFIATIKS.js} +1 -1
  34. package/dist/{chunk-G75ENCEZ.js → chunk-AIJS74LG.js} +3 -3
  35. package/dist/{chunk-FBCULCAL.js → chunk-AL2YEVOT.js} +1 -1
  36. package/dist/{chunk-GEMJYBRU.js → chunk-B45OFFOQ.js} +2 -2
  37. package/dist/{chunk-VRW6EBHV.js → chunk-BAKPN2D2.js} +101 -94
  38. package/dist/{chunk-HB7FJOY4.js → chunk-BPUFVVSH.js} +1 -1
  39. package/dist/{chunk-BIAC7IJT.js → chunk-DDNS2674.js} +1 -1
  40. package/dist/{chunk-QFSCCQIR.js → chunk-DMKI64EZ.js} +1 -1
  41. package/dist/{chunk-EPE2HRJK.js → chunk-DYWSCPCR.js} +69 -64
  42. package/dist/{chunk-ZIYZ77MR.js → chunk-EGO6Z24R.js} +3 -3
  43. package/dist/{chunk-KC5XXX3X.js → chunk-EOOEC32M.js} +1 -1
  44. package/dist/{chunk-XIHCMVMG.js → chunk-FDL4HV44.js} +2 -2
  45. package/dist/{chunk-QZ3AZTXI.js → chunk-FJWEYVEM.js} +42 -16
  46. package/dist/{chunk-PUGIRFPX.js → chunk-FMNVTKX2.js} +4 -4
  47. package/dist/{chunk-IHTRYDFN.js → chunk-H7B6JSHI.js} +1 -1
  48. package/dist/{chunk-T42U2W2R.js → chunk-IXLUTE6N.js} +1 -1
  49. package/dist/{chunk-FDT6KQV4.js → chunk-JBQJKC23.js} +2 -2
  50. package/dist/{chunk-IEIJRMLZ.js → chunk-JDB65PPT.js} +62 -63
  51. package/dist/{chunk-UXO2L7HJ.js → chunk-JF5L5SQ6.js} +278 -65
  52. package/dist/{chunk-USDEMXXL.js → chunk-JYVGYKXG.js} +1 -1
  53. package/dist/{chunk-R42WWQVB.js → chunk-KPJMBC4K.js} +2 -2
  54. package/dist/{chunk-MAYCCGMQ.js → chunk-KVGDFUVO.js} +1 -1
  55. package/dist/{chunk-CFUXNBWH.js → chunk-LE7T4ML7.js} +1 -1
  56. package/dist/{chunk-MQZVBHEY.js → chunk-LFNQDTSH.js} +1 -1
  57. package/dist/{chunk-KIFHYXPB.js → chunk-MOL32UKR.js} +45 -11
  58. package/dist/{chunk-6LGNTUZN.js → chunk-N53FLAMZ.js} +7 -7
  59. package/dist/{chunk-ADF3X6GM.js → chunk-P6HELLPU.js} +2 -2
  60. package/dist/{chunk-5NRXZGKK.js → chunk-POKK6XXU.js} +9 -9
  61. package/dist/{chunk-GBGJ7A3D.js → chunk-QHRPB2JQ.js} +6 -6
  62. package/dist/{chunk-BFACGEII.js → chunk-QTTDKWSM.js} +2 -2
  63. package/dist/{chunk-U5QY7KTN.js → chunk-SEABQTBP.js} +11 -8
  64. package/dist/{chunk-ZEUONDQG.js → chunk-SYUGVPYH.js} +1 -1
  65. package/dist/{chunk-PJ3HDUCY.js → chunk-VAS6HQX3.js} +39 -9
  66. package/dist/{chunk-GQJZORQP.js → chunk-XBSPQ52S.js} +1 -1
  67. package/dist/{chunk-4ORLNTET.js → chunk-XOJDBRNF.js} +1 -1
  68. package/dist/{chunk-LAFJSYDL.js → chunk-XVIYZU3D.js} +1 -1
  69. package/dist/{chunk-OB5MJR4W.js → chunk-YCGU3UNU.js} +1 -1
  70. package/dist/{chunk-GXJEGZL2.js → chunk-Z5C4LEAD.js} +17 -18
  71. package/dist/chunk-Z6FLHIDV.js +3795 -0
  72. package/dist/{chunk-DDIVWXN7.js → chunk-ZFN6GQU4.js} +4 -4
  73. package/dist/{chunk-QLSM7K5S.js → chunk-ZLL72U3I.js} +2 -2
  74. package/dist/{chunk-ZSVUAVMT.js → chunk-ZQXNL5DL.js} +5 -5
  75. package/dist/{chunk-DWUKJQTO.js → chunk-ZVZSFDW3.js} +2 -2
  76. package/dist/{clean-RDKJB5FK.js → clean-3RY3Y2GX.js} +23 -23
  77. package/dist/cli.js +52 -52
  78. package/dist/{cloud-QVPVVNCW.js → cloud-MLPBFCVE.js} +4 -4
  79. package/dist/{cloudrun-3RE2UCQG.js → cloudrun-NQF5KFQI.js} +6 -6
  80. package/dist/{compare-LEDOY7MO.js → compare-6EZX2754.js} +32 -32
  81. package/dist/{compiler-F54OZZPM.js → compiler-ACCPOZMQ.js} +6 -6
  82. package/dist/{component-N42M67WY.js → component-F5PQHP6A.js} +3 -3
  83. package/dist/{compositions-VB2J2LZI.js → compositions-AUHWSI2H.js} +15 -15
  84. package/dist/{delete-Q6RWMJ4Z.js → delete-VUF4SHHJ.js} +2 -2
  85. package/dist/{deterministicFonts-U2BIMGPG.js → deterministicFonts-C5JQLCTS.js} +2 -2
  86. package/dist/{dist-Q4BI5A73.js → dist-GPDOV3IQ.js} +4 -4
  87. package/dist/{dist-KDJTFJHA.js → dist-HUMFCJ6T.js} +3 -3
  88. package/dist/{doctor-JMMUHDRV.js → doctor-3XHCA5JM.js} +15 -15
  89. package/dist/{events-RGUAHIBW.js → events-FKOIB3R3.js} +5 -5
  90. package/dist/{events-6ZBSIBE5.js → events-TIU72LZM.js} +4 -4
  91. package/dist/{feedback-FIID6MZW.js → feedback-V6VATYBE.js} +10 -10
  92. package/dist/{ffmpeg-T5SH2EFJ.js → ffmpeg-5V4FP3R6.js} +2 -2
  93. package/dist/{figma-BL3JJC36.js → figma-YBJM2VGE.js} +3 -3
  94. package/dist/fontLocalizeCli.js +14 -14
  95. package/dist/{get-P46GS7S6.js → get-3YVCGZBX.js} +2 -2
  96. package/dist/{gpuPolicy-AQ2BPLBK.js → gpuPolicy-ZOUG66M7.js} +10 -10
  97. package/dist/{grade-compare-GDCWU7ZZ.js → grade-compare-MYXIRKQI.js} +33 -33
  98. package/dist/{help-HJR3RWFG.js → help-WFZ2SUUR.js} +2 -2
  99. package/dist/{history-GGO5AWJB.js → history-HWPRJFR5.js} +49 -22
  100. package/dist/hyperframe-runtime.js +214 -68
  101. package/dist/hyperframe.manifest.json +1 -1
  102. package/dist/hyperframe.runtime.iife.js +214 -68
  103. package/dist/hyperframes-player.global.js +4 -5
  104. package/dist/hyperframes-slideshow.global.js +3 -4
  105. package/dist/{info-3GFWUBJC.js → info-WJDTQ4OZ.js} +11 -11
  106. package/dist/{init-36OPU2ZG.js → init-EXHDN7RO.js} +31 -31
  107. package/dist/{inspect-F2HEL5ON.js → inspect-EAOLZOMQ.js} +33 -33
  108. package/dist/{installer-NI6P6GC4.js → installer-LZ4X5TZZ.js} +6 -6
  109. package/dist/{keyframes-7OY3LMAZ.js → keyframes-FSZYNEDN.js} +8 -8
  110. package/dist/{lambda-6GJIWNJ3.js → lambda-3GAKHMC3.js} +7 -7
  111. package/dist/{layout-FTMLNL5A.js → layout-M2TQ2CIX.js} +33 -33
  112. package/dist/{lint-U6POHUON.js → lint-7C5UPTNQ.js} +11 -11
  113. package/dist/{lintProject-UBZ3TDHU.js → lintProject-SSEXWCH6.js} +3 -3
  114. package/dist/{list-IP5KI5Q2.js → list-GU5KBZ73.js} +2 -2
  115. package/dist/{login-4VWTVPHG.js → login-ZL2NYBIZ.js} +4 -4
  116. package/dist/{manager-YKMHR6LN.js → manager-5ORDVWJB.js} +3 -3
  117. package/dist/{media-treatment-XGV44AGV.js → media-treatment-QC3TAHVU.js} +82 -54
  118. package/dist/{models-UCXB6UR5.js → models-A54I4QR5.js} +14 -14
  119. package/dist/{motionShot-WPVNBXKA.js → motionShot-ZXPK562F.js} +35 -29
  120. package/dist/{normalize-audio-TYJ3UEHO.js → normalize-audio-CAP3DAE6.js} +10 -10
  121. package/dist/{open-HENOLVB2.js → open-GUSBNMDB.js} +6 -6
  122. package/dist/{parakeetRunner-VFQ6WFTD.js → parakeetRunner-GCCH72CO.js} +14 -14
  123. package/dist/{pipeline-6WPSC3H4.js → pipeline-SCJ2MWYH.js} +11 -11
  124. package/dist/{play-OI53WNUM.js → play-FP2QLMGM.js} +26 -26
  125. package/dist/{preflight-B4AFK3RG.js → preflight-ONF5AJNO.js} +5 -5
  126. package/dist/{present-NGMEQ4NO.js → present-H5SA4APW.js} +23 -23
  127. package/dist/{preview-VT2HWRWZ.js → preview-ATPVKA6K.js} +57 -26
  128. package/dist/{producer-7TYEAUF7.js → producer-VBYUC27R.js} +1 -1
  129. package/dist/{projectConfig-B2AF5DXY.js → projectConfig-SBRMQZGG.js} +8 -8
  130. package/dist/{publication-2PANQVC6.js → publication-5BQICRZO.js} +4 -4
  131. package/dist/{publish-O5OL42BG.js → publish-XDUZA3E3.js} +27 -26
  132. package/dist/{remove-background-T2JM6UVP.js → remove-background-GA6F7JZW.js} +12 -12
  133. package/dist/{render-Z253WHBK.js → render-KUVZFNQD.js} +27 -27
  134. package/dist/{render-W7OFXDOJ.js → render-PCFO45RK.js} +5 -5
  135. package/dist/{render-OLPKOJRU.js → render-XCYXFZTL.js} +12 -12
  136. package/dist/{render-batch-46IIBFKL.js → render-batch-7R2NRNVJ.js} +5 -5
  137. package/dist/{renderCancellation-QTZOCDJ2.js → renderCancellation-NIXEWRAO.js} +10 -10
  138. package/dist/renderSetupWorker.js +3 -3
  139. package/dist/{resolver-J2PL5FVJ.js → resolver-C4FPX72I.js} +6 -6
  140. package/dist/{sherpa-ZF42V3RN.js → sherpa-IQY52XU6.js} +14 -14
  141. package/dist/skills/media-use/references/media-treatments.md +5 -1
  142. package/dist/{skills-ACDOO3PX.js → skills-JSSAEKUW.js} +7 -7
  143. package/dist/{skillsUpdateCheck-L5OXVVPU.js → skillsUpdateCheck-XE5E2K2F.js} +3 -3
  144. package/dist/{slideshow-4OJEPWNZ.js → slideshow-YTWATJRT.js} +1 -1
  145. package/dist/{snapshot-UUVNZOW5.js → snapshot-QMQOE2DD.js} +34 -34
  146. package/dist/{src-BSLKXEGX.js → src-2GMPFYHL.js} +11 -9
  147. package/dist/{src-KS3AWFGT.js → src-R55QLGWI.js} +13 -13
  148. package/dist/{staticProjectServer-2TTVGPQH.js → staticProjectServer-YH2RHYKW.js} +20 -20
  149. package/dist/{status-LXPGSSKY.js → status-PTKNQD2E.js} +2 -2
  150. package/dist/studio/assets/{hyperframes-player-DZ5JrMDg.js → hyperframes-player-_eMxRXF_.js} +3 -3
  151. package/dist/studio/assets/{index-BqFRhNZa.js → index-6okhHdnH.js} +1 -1
  152. package/dist/studio/assets/{index-BOs6C0aZ.js → index-CEq9KmY2.js} +1 -1
  153. package/dist/studio/assets/{index-D8W0a0Z9.js → index-bXzd7tvF.js} +135 -135
  154. package/dist/studio/index.html +1 -1
  155. package/dist/{studio-api-WYWF7XRC.js → studio-api-T2TS2CHL.js} +16 -14
  156. package/dist/{studioServer-3FG4YTP7.js → studioServer-Q4MT44LT.js} +50 -50
  157. package/dist/{system-OQLOGGPJ.js → system-OXRG57F2.js} +2 -2
  158. package/dist/{telemetry-PAOOB4T4.js → telemetry-V5JYZDS4.js} +5 -5
  159. package/dist/{timeline-JIIJKKPC.js → timeline-KTCTOKF5.js} +34 -25
  160. package/dist/{tokens-3QRAM75Z.js → tokens-ZHREZPK6.js} +2 -2
  161. package/dist/{transcribe-QSBP5MUG.js → transcribe-4QDEWCE6.js} +12 -12
  162. package/dist/{transcribe-SZB6UMXE.js → transcribe-CRAV4FU3.js} +13 -13
  163. package/dist/{updateCheck-V3DSB26K.js → updateCheck-E7RMSK3E.js} +2 -2
  164. package/dist/{upgrade-L5GISOEV.js → upgrade-27PFTDCV.js} +2 -2
  165. package/dist/{urlDownloader-52FERT4X.js → urlDownloader-EAF6PLUP.js} +9 -9
  166. package/dist/{validate-HVVLX7KO.js → validate-OKNFDBMG.js} +27 -27
  167. package/dist/{video-MEOWRMFG.js → video-IEVS4FIH.js} +10 -10
  168. package/package.json +3 -2
  169. package/dist/chunk-AUWHD7RA.js +0 -3753
  170. package/dist/studio/chunk-6JY3MTIX.js +0 -1204
  171. package/dist/studio/chunk-EEXSYY5F.js +0 -190
  172. package/dist/studio/chunk-NZPJUZKT.js +0 -1538
  173. package/dist/studio/chunk-PZ5AY32C.js +0 -10
  174. package/dist/studio/chunk-TP6D3U37.js +0 -845
  175. package/dist/studio/chunk-Y2OHHNM2.js +0 -970
  176. package/dist/studio/domEditingLayers-PTP2ICGM.js +0 -47
  177. package/dist/studio/index.css +0 -165
  178. package/dist/studio/index.d.ts +0 -4318
  179. package/dist/studio/index.js +0 -100952
  180. package/dist/studio/player.d.ts +0 -30
  181. package/dist/studio/player.js +0 -10
  182. package/dist/studio/styles/tailwind-preset.d.ts +0 -39
  183. package/dist/studio/styles/tailwind-preset.js +0 -50
  184. package/dist/studio/styles.css +0 -1
  185. package/dist/studio/ui.d.ts +0 -297
  186. package/dist/studio/ui.js +0 -66
@@ -11,15 +11,15 @@ import {
11
11
  iterateFontFamilyDeclarations,
12
12
  normalizeSystemFontPrimaryFamilies,
13
13
  resolveFontFamilyDeclarationFamilies
14
- } from "./chunk-PUGIRFPX.js";
14
+ } from "./chunk-FMNVTKX2.js";
15
15
  import {
16
16
  EncoderInterruptedError,
17
17
  encoderFailureError,
18
18
  prepareAnimatedGifInputs
19
- } from "./chunk-GRY3PN3K.js";
19
+ } from "./chunk-4YVMMRHR.js";
20
20
  import {
21
21
  createStudioPositionSeekReapplyScript
22
- } from "./chunk-KC5XXX3X.js";
22
+ } from "./chunk-EOOEC32M.js";
23
23
  import {
24
24
  BROWSER_GPU_NOT_SOFTWARE,
25
25
  CaptureFailure,
@@ -105,6 +105,7 @@ import {
105
105
  isNotMediaPayload,
106
106
  isTransientBrowserError,
107
107
  isVideoFrameFormat,
108
+ isVideoPastTimelineEnd,
108
109
  mergeWorkerFrames,
109
110
  muxVideoWithAudio,
110
111
  normalizeObjectFit,
@@ -144,7 +145,7 @@ import {
144
145
  validateEngineConfigSnapshot,
145
146
  verifyDiskDrawElementSamples,
146
147
  writeCapturedFrame
147
- } from "./chunk-UXO2L7HJ.js";
148
+ } from "./chunk-JF5L5SQ6.js";
148
149
  import {
149
150
  assignBundledRuntimeCompositionIds,
150
151
  buildVariablesByCompScript,
@@ -157,12 +158,12 @@ import {
157
158
  isTemplateEntry,
158
159
  parsesAsScript,
159
160
  prepareFlattenedInnerRoot
160
- } from "./chunk-FDT6KQV4.js";
161
+ } from "./chunk-JBQJKC23.js";
161
162
  import {
162
163
  LOW_MEMORY_TOTAL_MB_THRESHOLD,
163
164
  getCgroupMemoryLimitMb,
164
165
  getSystemTotalMb
165
- } from "./chunk-USDEMXXL.js";
166
+ } from "./chunk-JYVGYKXG.js";
166
167
  import {
167
168
  HF_VFX_ATTR,
168
169
  MEDIA_START_BASIS_ATTR,
@@ -178,7 +179,7 @@ import {
178
179
  resolveAbsoluteMediaStartSeconds,
179
180
  resolveAuthoredTimingWindow,
180
181
  toFps
181
- } from "./chunk-VRW6EBHV.js";
182
+ } from "./chunk-BAKPN2D2.js";
182
183
  import {
183
184
  COMPOSITION_SOURCE_URL,
184
185
  HF_COLOR_GRADING_ATTR,
@@ -205,7 +206,7 @@ import {
205
206
  shouldClampResolvedMediaDuration,
206
207
  sourceTimeAt,
207
208
  styleElementsFor
208
- } from "./chunk-AUWHD7RA.js";
209
+ } from "./chunk-Z6FLHIDV.js";
209
210
  import {
210
211
  MAX_AUDIO_GAIN
211
212
  } from "./chunk-YA62XGXS.js";
@@ -219,7 +220,7 @@ import {
219
220
  isAspectAgnosticResolutionAlias,
220
221
  normalizeResolutionFlag,
221
222
  suggestMatchingPreset
222
- } from "./chunk-MQZVBHEY.js";
223
+ } from "./chunk-LFNQDTSH.js";
223
224
  import {
224
225
  redactKnownPaths,
225
226
  redactTelemetryString
@@ -229,7 +230,7 @@ import {
229
230
  } from "./chunk-TWWSYAKJ.js";
230
231
  import {
231
232
  lintHyperframeHtml
232
- } from "./chunk-IEIJRMLZ.js";
233
+ } from "./chunk-JDB65PPT.js";
233
234
  import {
234
235
  isUnresolvedAssetPlaceholder,
235
236
  readProjectFile,
@@ -486,7 +487,7 @@ function buildVirtualTimeShim(options) {
486
487
  const seedRandomFromFrame = options.seedRandomFromFrame === true;
487
488
  const seededRandomBlock = seedRandomFromFrame ? String.raw`
488
489
  // Seeded Math.random / crypto.getRandomValues, keyed by virtual time.
489
- // Mulberry32 — single uint32 state, deterministic, fast.
490
+ // Mulberry32: single uint32 state, deterministic, fast.
490
491
  var rngState = 0;
491
492
  function mulberry32() {
492
493
  rngState |= 0; rngState = (rngState + 0x6D2B79F5) | 0;
@@ -497,7 +498,7 @@ function buildVirtualTimeShim(options) {
497
498
  }
498
499
  function reseedRngFromTime(ms) {
499
500
  var ms32 = Math.max(0, Math.floor(Number(ms) || 0)) | 0;
500
- // Knuth's multiplicative hash + golden-ratio offset — gives a well-
501
+ // Knuth's multiplicative hash + golden-ratio offset gives a well-
501
502
  // distributed seed even for frame 0 (otherwise rngState=0 degenerates
502
503
  // the PRNG's first few outputs).
503
504
  rngState = (Math.imul(ms32, -1640531527) + 0x9E3779B9) | 0;
@@ -739,7 +740,7 @@ function buildRenderModeScript(fps) {
739
740
  };
740
741
  window.__playerReady = true;
741
742
  // Media-fallback player has no timeline to bind, so render-ready is immediate.
742
- // init.ts defers __renderReady until the timeline is bound \u2014 different runtime.
743
+ // init.ts defers __renderReady until the timeline is bound (a different runtime).
743
744
  window.__renderReady = true;
744
745
  return true;
745
746
  }
@@ -2266,7 +2267,7 @@ function blitHdrVideoLayer(canvas, el, time, fps, hdrVideoFrameSources, hdrStart
2266
2267
  if (matrix && !isTranslationOnly) {
2267
2268
  if (clipped && log) {
2268
2269
  log.debug(
2269
- `HDR clip rect on affine-transformed element ${el.id} \u2014 clip not applied (affine scissor not yet supported)`
2270
+ `HDR clip rect on affine-transformed element ${el.id}: clip not applied (affine scissor not yet supported)`
2270
2271
  );
2271
2272
  }
2272
2273
  blitRgb48leAffine(
@@ -2323,7 +2324,7 @@ function blitHdrImageLayer(canvas, el, hdrImageBuffers, hdrImageTransferCache, w
2323
2324
  return;
2324
2325
  }
2325
2326
  if (el.clipRect && log) {
2326
- log.debug(`HDR clip rect on image element ${el.id} \u2014 clip not yet supported for images`);
2327
+ log.debug(`HDR clip rect on image element ${el.id}: clip not yet supported for images`);
2327
2328
  }
2328
2329
  try {
2329
2330
  if (hdrPerf) hdrPerf.hdrImageLayerBlits += 1;
@@ -3475,12 +3476,13 @@ function buildRenderPerfSummary(input) {
3475
3476
  // ../producer/src/services/render/stages/captureStreamingStage.ts
3476
3477
  var DEFAULT_CAPTURE_STALL_MS = 6e4;
3477
3478
  var DE_STALL_POLL_MS = 5e3;
3479
+ var STALL_ADVICE = "Chrome stopped answering. If another app is keeping the GPU or CPU busy (a 3D render, a game, another export), let it finish or render one job at a time, then retry.";
3478
3480
  var ParallelCaptureStallError = class extends Error {
3479
3481
  variant;
3480
3482
  constructor(args) {
3481
3483
  const phases = args.phaseSummary ? ` Last worker phases: ${args.phaseSummary}.` : "";
3482
3484
  super(
3483
- args.variant === "drain" ? `[Render] Parallel ${args.captureLabel} capture stalled: no frame progress for ${args.stallTimeoutMs}ms (stuck at ${args.lastCapturedFrames}/${args.totalFrames}).${phases}` : `[Render] Parallel ${args.captureLabel} capture stalled after ${args.stallTimeoutMs}ms with no frame progress (last frame ${args.lastCapturedFrames}/${args.totalFrames}); retrying on a fresh screenshot session.${phases}`
3485
+ (args.variant === "drain" ? `[Render] Parallel ${args.captureLabel} capture stalled: no frame progress for ${args.stallTimeoutMs}ms (stuck at ${args.lastCapturedFrames}/${args.totalFrames}).${phases}` : `[Render] Parallel ${args.captureLabel} capture stalled after ${args.stallTimeoutMs}ms with no frame progress (last frame ${args.lastCapturedFrames}/${args.totalFrames}); retrying on a fresh screenshot session.${phases}`) + ` ${STALL_ADVICE}`
3484
3486
  );
3485
3487
  this.name = "ParallelCaptureStallError";
3486
3488
  this.variant = args.variant;
@@ -3498,12 +3500,13 @@ function captureModeLabel(mode) {
3498
3500
  }
3499
3501
  var SequentialCaptureStallError = class extends Error {
3500
3502
  captureMode;
3501
- constructor(captureMode, stallTimeoutMs, frameIndex, totalFrames) {
3503
+ constructor(session, stallTimeoutMs, frameIndex, totalFrames) {
3504
+ const step = session.captureStep ? ` while ${session.captureStep}` : "";
3502
3505
  super(
3503
- `[Render] Sequential ${captureModeLabel(captureMode)} capture stalled: no frame progress for ${stallTimeoutMs}ms (stuck at frame ${frameIndex}/${totalFrames}).`
3506
+ `[Render] Sequential ${captureModeLabel(session.captureMode)} capture stalled: no frame progress for ${stallTimeoutMs}ms (stuck at frame ${frameIndex}/${totalFrames}${step}). ` + STALL_ADVICE
3504
3507
  );
3505
3508
  this.name = "SequentialCaptureStallError";
3506
- this.captureMode = captureMode;
3509
+ this.captureMode = session.captureMode;
3507
3510
  }
3508
3511
  };
3509
3512
  function raceAgainstStall(promise, deadlineMs, input, signal) {
@@ -3512,9 +3515,9 @@ function raceAgainstStall(promise, deadlineMs, input, signal) {
3512
3515
  () => {
3513
3516
  reject(
3514
3517
  signal?.aborted ? new Error(
3515
- `[Render] Sequential ${captureModeLabel(input.captureMode)} capture aborted while a capture call was in flight (frame ${input.frameIndex}/${input.totalFrames}).`
3518
+ `[Render] Sequential ${captureModeLabel(input.session.captureMode)} capture aborted while a capture call was in flight (frame ${input.frameIndex}/${input.totalFrames}).`
3516
3519
  ) : new SequentialCaptureStallError(
3517
- input.captureMode,
3520
+ input.session,
3518
3521
  input.stallTimeoutMs,
3519
3522
  input.frameIndex,
3520
3523
  input.totalFrames
@@ -3642,7 +3645,7 @@ async function runWorkerEncodePipelineLoop(session, totalFrames, job, currentEnc
3642
3645
  const captureWithStallGuard = (idx, promise) => raceAgainstStall(
3643
3646
  promise,
3644
3647
  stallTimeoutMs - (Date.now() - lastProgressAt),
3645
- { captureMode: session.captureMode, frameIndex: idx, totalFrames, stallTimeoutMs },
3648
+ { session, frameIndex: idx, totalFrames, stallTimeoutMs },
3646
3649
  abortSignal
3647
3650
  );
3648
3651
  const drainPrev = async () => {
@@ -3996,7 +3999,7 @@ async function runCaptureStreamingStage(input) {
3996
3999
  const { buffer } = await raceAgainstStall(
3997
4000
  captureFrameToBuffer(session, i, time),
3998
4001
  stallTimeoutMs - (Date.now() - lastProgressAt),
3999
- { captureMode: session.captureMode, frameIndex: i, totalFrames, stallTimeoutMs },
4002
+ { session, frameIndex: i, totalFrames, stallTimeoutMs },
4000
4003
  abortSignal
4001
4004
  );
4002
4005
  await reorderBuffer.waitForFrame(i);
@@ -4085,7 +4088,7 @@ async function captureSegmentFrames(ctx, segment, encoder) {
4085
4088
  ctx.captureFrame(ctx.session, i, time),
4086
4089
  ctx.stallTimeoutMs - (Date.now() - lastProgressAt),
4087
4090
  {
4088
- captureMode: ctx.session.captureMode,
4091
+ session: ctx.session,
4089
4092
  frameIndex: i,
4090
4093
  totalFrames: ctx.totalFrames,
4091
4094
  stallTimeoutMs: ctx.stallTimeoutMs
@@ -4474,7 +4477,7 @@ async function validateCompletedSegments(manifest, expectedHash, probeFrames) {
4474
4477
  function formatDowngradeWarning(outputFormat, forcedHdrWithoutSources) {
4475
4478
  const hdrSourceReason = forcedHdrWithoutSources ? "HDR was forced without detected HDR sources" : "HDR source detected";
4476
4479
  const formatReason = outputFormat === "hls" ? "HLS output is SDR-only (H.264 in MPEG-TS)" : "HDR + alpha is not supported";
4477
- return `[Render] ${hdrSourceReason}, but format is "${outputFormat}" \u2014 falling back to SDR. ${formatReason}. Use --format mp4 for HDR10 output.`;
4480
+ return `[Render] ${hdrSourceReason}, but format is "${outputFormat}", so falling back to SDR. ${formatReason}. Use --format mp4 for HDR10 output.`;
4478
4481
  }
4479
4482
  function findRenderHdrAutoPromotionTrigger(input) {
4480
4483
  for (const extracted of input.extractionResult?.extracted ?? []) {
@@ -4487,12 +4490,12 @@ function findRenderHdrAutoPromotionTrigger(input) {
4487
4490
  function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources) {
4488
4491
  if (forcedHdrWithoutSources) {
4489
4492
  input.log.warn(
4490
- "[Render] HDR forced by --hdr flag, but no HDR sources were detected \u2014 defaulting to HLG. SDR-only compositions may look perceptually wrong on HDR displays."
4493
+ "[Render] HDR forced by --hdr flag, but no HDR sources were detected, defaulting to HLG. SDR-only compositions may look perceptually wrong on HDR displays."
4491
4494
  );
4492
4495
  }
4493
4496
  if (!effectiveHdr) {
4494
4497
  input.log.info(
4495
- hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected \u2014 rendering SDR"
4498
+ hdrMode === "force-sdr" ? "[Render] SDR forced by --sdr flag" : "[Render] No HDR sources detected, rendering SDR"
4496
4499
  );
4497
4500
  return;
4498
4501
  }
@@ -4507,9 +4510,9 @@ function logHdrResolution(input, hdrMode, effectiveHdr, forcedHdrWithoutSources)
4507
4510
  );
4508
4511
  return;
4509
4512
  }
4510
- const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected \u2014 defaulting to HLG)" : "forced by --hdr flag";
4513
+ const reason = forcedHdrWithoutSources ? "forced by --hdr flag (no HDR sources detected, defaulting to HLG)" : "forced by --hdr flag";
4511
4514
  input.log.info(
4512
- `[Render] HDR ${reason} \u2014 output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
4515
+ `[Render] HDR ${reason}, output: ${effectiveHdr.transfer.toUpperCase()} (BT.2020, 10-bit H.265)`
4513
4516
  );
4514
4517
  }
4515
4518
  function resolveEffectiveHdrMode(input) {
@@ -4596,14 +4599,14 @@ function resolveRenderWorkerCount(totalFrames, requestedWorkers, cfg, compiled,
4596
4599
  const reasonCodes = new Set(compiled.renderModeHints.reasons.map((r) => r.code));
4597
4600
  if (reasonCodes.has("htmlInCanvas")) {
4598
4601
  log.warn(
4599
- "[Render] html-in-canvas (drawElementImage) detected \u2014 pinning to 1 worker (Chrome concurrency limitation).",
4602
+ "[Render] html-in-canvas (drawElementImage) detected, pinning to 1 worker (Chrome concurrency limitation).",
4600
4603
  { requestedWorkers }
4601
4604
  );
4602
4605
  return 1;
4603
4606
  }
4604
4607
  if (cfg.lowMemoryMode && requestedWorkers === void 0) {
4605
4608
  log.info(
4606
- "[Render] Low-memory profile \u2014 pinning to 1 capture worker (auto-worker calibration skipped)."
4609
+ "[Render] Low-memory profile, pinning to 1 capture worker (auto-worker calibration skipped)."
4607
4610
  );
4608
4611
  return 1;
4609
4612
  }
@@ -5227,7 +5230,7 @@ function assertVideoFrameCoverage(reports, threshold) {
5227
5230
  const thresholdPct = (threshold * 100).toFixed(1);
5228
5231
  const suffix = sorted.length > 1 ? ` (+${sorted.length - 1} more clip(s) below threshold)` : "";
5229
5232
  throw new VideoFrameCoverageError(
5230
- `Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank \u2014 aborting render to prevent shipping a wrong MP4.${suffix} Set HF_VIDEO_COVERAGE_THRESHOLD=0 to disable this gate.`,
5233
+ `Video "${worst.videoId}" captured ${worst.capturedFrames} of expected ${worst.expectedFrames} frames (coverage ${pct}%, threshold ${thresholdPct}%). check/snapshot may pass while the encoded MP4 renders this clip blank, so the render is aborted to prevent shipping a wrong MP4.${suffix} Set HF_VIDEO_COVERAGE_THRESHOLD=0 to disable this gate.`,
5231
5234
  { threshold, worst, failedReports: sorted }
5232
5235
  );
5233
5236
  }
@@ -5334,7 +5337,7 @@ function collectRenderMedia(html) {
5334
5337
  }
5335
5338
 
5336
5339
  // ../core/dist/generated/position-edits-render-inline.js
5337
- var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function _(e){return N(e)&&(e.namespaceURI===W||e.namespaceURI==="http://www.w3.org/2000/svg")}var w="data-hf-edit-base-x",y="data-hf-edit-base-y",m="data-hf-edit-original-translate",k=e=>{let t=parseFloat(e??"");return Number.isFinite(t)?t:0},O=e=>{let t=[],o=0,r="";for(let s of e.trim())s==="("&&(o+=1),s===")"&&(o=Math.max(0,o-1)),/\\s/.test(s)&&o===0?(r&&t.push(r),r=""):r+=s;return r&&t.push(r),t},L=/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/,E=(e,t)=>L.test(e)&&L.test(t)?`${parseFloat(e)+parseFloat(t)}px`:`calc(${e} + ${t})`,V=(e,t,o)=>{if(!e||e==="none")return`${t} ${o}`;let[r,s,a]=O(e);if(r===void 0)return`${t} ${o}`;if(s===void 0)return`${E(r,t)} ${o}`;let i=a===void 0?"":` ${a}`;return`${E(r,t)} ${E(s,o)}${i}`},j=e=>{try{e.ownerDocument.defaultView?.gsap?.getProperty?.(e,"x")}catch{}},G=e=>{let t=e.style.getPropertyValue("translate").trim();if(t)return t==="none"?"":t;try{let o=e.ownerDocument.defaultView,r=o?o.getComputedStyle(e).getPropertyValue("translate").trim():"";return r==="none"?"":r}catch{return""}},b=new WeakMap;function B(e,t){let o=b.get(e);if(!t?.force&&o!==void 0&&e.style.getPropertyValue("translate")!==o){R("position_edit_fold_skipped",{hfId:e.getAttribute("data-hf-id")});return}let r=k(e.getAttribute("data-x"))-k(e.getAttribute(w)),s=k(e.getAttribute("data-y"))-k(e.getAttribute(y));e.hasAttribute(m)||e.setAttribute(m,G(e)),o===void 0&&j(e);let a=e.getAttribute(m)??"",i=V(a,`${r}px`,`${s}px`);e.style.setProperty("translate",i),b.set(e,e.style.getPropertyValue("translate"))}function S(e,t){let o=e.querySelectorAll(`[${m}]:not([${w}]):not([${y}])`);for(let a=0;a<o.length;a++){let i=o[a];if(i===void 0||!_(i))continue;let g=i.getAttribute(m)??"";g===""?i.style.removeProperty("translate"):i.style.setProperty("translate",g),i.removeAttribute(m),b.delete(i)}let r=e.querySelectorAll(`[${w}], [${y}]`),s=0;for(let a=0;a<r.length;a++){let i=r[a];i===void 0||!_(i)||(B(i,t),s+=1)}return s}var $="__hfPositionEditsSeekReapplyWrapped",D=new WeakSet,M=new WeakMap,H=new WeakMap;function F(e){let t=e,o=()=>{try{S(t.document)}catch{}},r=n=>typeof n=="function"&&(D.has(n)||!!n[$]),s=n=>{D.add(n);try{Object.defineProperty(n,$,{value:!0})}catch{}},a=n=>{if(typeof n!="function"||r(n))return n;let l=function(...u){let d=n.apply(this,u);return o(),d};return s(l),l},i=(n,l)=>{let u=M.get(n);if(u?.has(l))return!0;let d=Object.getOwnPropertyDescriptor(n,l);if(d?.configurable===!1){let c=n[l];return typeof c=="function"&&(n[l]=a(c),o()),!1}let p=n[l],f=d?.set;return Object.defineProperty(n,l,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>p,set:c=>{p=a(c),f?.call(n,c)}}),p=a(p),u??(u=new Set),u.add(l),M.set(n,u),o(),!0},g=(n,l)=>{let u=H.get(t),d=Object.getOwnPropertyDescriptor(t,n);if(!u?.has(n)){if(d?.configurable===!1){let c=t[n];return c?i(c,l):!1}let f=t[n];Object.defineProperty(t,n,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>f,set:c=>{f=c,f&&i(f,l)}}),u??(u=new Set),u.add(n),H.set(t,u)}let p=t[n];return p?i(p,l):!1},v=()=>{let n=g("__hf","seek"),l=g("__player","renderSeek");return n&&l};if(v())return;let h=120,A=t.setInterval(()=>{if(v()){t.clearInterval(A);return}h-=1,h<=0&&t.clearInterval(A)},50)}function I(){document.querySelector(`[${w}], [${y}]`)&&(S(document),F(window))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I,{once:!0}):I();})();\n';
5340
+ var POSITION_EDITS_RENDER_IIFE = '"use strict";(()=>{function T(){return globalThis}function P(e,t){if(typeof window>"u")return;let o=T(),r=o.__hf?.onSwallowed;if(r)try{r({label:e,error:t})}catch(s){}(o.__hfDebug||o.__HYPERFRAMES_DEBUG)&&console.debug(`[hyperframes] ${e} swallowed:`,t)}var x=null;function R(e,t){if(x)try{x({source:"hf-preview",type:"analytics",event:e,properties:t??{}})}catch(o){P("runtime.analytics.site1",o)}}var W="http://www.w3.org/1999/xhtml";function N(e){return e!=null&&e.nodeType===1}function k(e){return N(e)&&(e.namespaceURI===W||e.namespaceURI==="http://www.w3.org/2000/svg")}var w="data-hf-edit-base-x",y="data-hf-edit-base-y",m="data-hf-edit-original-translate",_=e=>{let t=parseFloat(e??"");return Number.isFinite(t)?t:0},O=e=>{let t=[],o=0,r="";for(let s of e.trim())s==="("&&(o+=1),s===")"&&(o=Math.max(0,o-1)),/\\s/.test(s)&&o===0?(r&&t.push(r),r=""):r+=s;return r&&t.push(r),t},L=/^-?(?:\\d+(?:\\.\\d+)?|\\.\\d+)px$/,E=(e,t)=>L.test(e)&&L.test(t)?`${parseFloat(e)+parseFloat(t)}px`:`calc(${e} + ${t})`,V=(e,t,o)=>{if(!e||e==="none")return`${t} ${o}`;let[r,s,a]=O(e);if(r===void 0)return`${t} ${o}`;if(s===void 0)return`${E(r,t)} ${o}`;let i=a===void 0?"":` ${a}`;return`${E(r,t)} ${E(s,o)}${i}`},j=e=>{try{e.ownerDocument.defaultView?.gsap?.getProperty?.(e,"x")}catch{}},C=e=>{let t=e.style.getPropertyValue("translate").trim();if(t)return t==="none"?"":t;try{let o=e.ownerDocument.defaultView,r=o?o.getComputedStyle(e).getPropertyValue("translate").trim():"";return r==="none"?"":r}catch{return""}},b=new WeakMap;function G(e,t){let o=b.get(e);if(!t?.force&&o!==void 0&&e.style.getPropertyValue("translate")!==o){R("position_edit_fold_skipped",{hfId:e.getAttribute("data-hf-id")});return}let r=_(e.getAttribute("data-x"))-_(e.getAttribute(w)),s=_(e.getAttribute("data-y"))-_(e.getAttribute(y));e.hasAttribute(m)||e.setAttribute(m,C(e)),o===void 0&&j(e);let a=e.getAttribute(m)??"",i=V(a,`${r}px`,`${s}px`);e.style.setProperty("translate",i),b.set(e,e.style.getPropertyValue("translate"))}function S(e,t){let o=e.querySelectorAll(`[${m}]:not([${w}]):not([${y}])`);for(let a=0;a<o.length;a++){let i=o[a];if(i===void 0||!k(i))continue;let g=i.getAttribute(m)??"";g===""?i.style.removeProperty("translate"):i.style.setProperty("translate",g),i.removeAttribute(m),b.delete(i)}let r=e.querySelectorAll(`[${w}], [${y}]`),s=0;for(let a=0;a<r.length;a++){let i=r[a];i===void 0||!k(i)||(G(i,t),s+=1)}return s}var $="__hfPositionEditsSeekReapplyWrapped",D=new WeakSet,M=new WeakMap,H=new WeakMap;function F(e){let t=e,o=()=>{try{S(t.document)}catch{}},r=n=>typeof n=="function"&&(D.has(n)||!!n[$]),s=n=>{D.add(n);try{Object.defineProperty(n,$,{value:!0})}catch{}},a=n=>{if(typeof n!="function"||r(n))return n;let l=function(...u){let d=n.apply(this,u);return o(),d};return s(l),l},i=(n,l)=>{let u=M.get(n);if(u?.has(l))return!0;let d=Object.getOwnPropertyDescriptor(n,l);if(d?.configurable===!1){let c=n[l];return typeof c=="function"&&(n[l]=a(c),o()),!1}let p=n[l],f=d?.set;return Object.defineProperty(n,l,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>p,set:c=>{p=a(c),f?.call(n,c)}}),p=a(p),u??(u=new Set),u.add(l),M.set(n,u),o(),!0},g=(n,l)=>{let u=H.get(t),d=Object.getOwnPropertyDescriptor(t,n);if(!u?.has(n)){if(d?.configurable===!1){let c=t[n];return c?i(c,l):!1}let f=t[n];Object.defineProperty(t,n,{configurable:!0,enumerable:d?.enumerable??!0,get:()=>f,set:c=>{f=c,f&&i(f,l)}}),u??(u=new Set),u.add(n),H.set(t,u)}let p=t[n];return p?i(p,l):!1},h=()=>{let n=g("__hf","seek"),l=g("__player","renderSeek");return n&&l};if(h())return;let v=120,A=t.setInterval(()=>{if(h()){t.clearInterval(A);return}v-=1,v<=0&&t.clearInterval(A)},50)}function I(){document.querySelector(`[${w}], [${y}]`)&&(S(document),F(window))}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",I,{once:!0}):I();})();\n';
5338
5341
  function getPositionEditsRenderScript() {
5339
5342
  return POSITION_EDITS_RENDER_IIFE;
5340
5343
  }
@@ -5724,7 +5727,7 @@ async function resolveMediaDuration(src, mediaStart, playbackRate, baseDir, down
5724
5727
  if (tagName !== "video") {
5725
5728
  if (error instanceof NotMediaPayloadError) {
5726
5729
  log?.warn(
5727
- `[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file \u2014 the element is dropped from the render. Point it at a rendered media file.`
5730
+ `[compile] Audio "${elementIdentity}" (${src}) is a text document, not a media file, so the element is dropped from the render. Point it at a rendered media file.`
5728
5731
  );
5729
5732
  }
5730
5733
  return { duration: null, resolvedPath: filePath };
@@ -5813,7 +5816,7 @@ async function compileHtmlFile(html, baseDir, downloadDir, log) {
5813
5816
  if (r.maxDuration != null && shouldClampResolvedMediaDuration(r.tagName, r.duration, r.maxDuration)) {
5814
5817
  clampList.push({ id: r.id, duration: r.maxDuration });
5815
5818
  log?.warn(
5816
- `[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s \u2014 the slot is shortened to the media length. Set data-duration to ~${r.maxDuration.toFixed(2)}s, trim data-media-start, or use a longer/looping source if that isn't intended.`
5819
+ `[compile] Audio "${r.id}" (${r.src}) is ${r.maxDuration.toFixed(2)}s but its data-duration is ${r.duration.toFixed(2)}s, so the slot is shortened to the media length. Set data-duration to ~${r.maxDuration.toFixed(2)}s, trim data-media-start, or use a longer/looping source if that isn't intended.`
5817
5820
  );
5818
5821
  }
5819
5822
  }
@@ -6202,7 +6205,7 @@ ${safeText}
6202
6205
  } else {
6203
6206
  if (download.reason instanceof ScriptIntegrityError) throw download.reason;
6204
6207
  defaultLogger.warn(
6205
- `[Compiler] WARNING: Failed to download CDN script: ${src} \u2014 ${download.reason}. The render may fail if this script is required (e.g. GSAP). Consider bundling it locally in your project.`
6208
+ `[Compiler] WARNING: Failed to download CDN script: ${src} (${download.reason}). The render may fail if this script is required (e.g. GSAP). Consider bundling it locally in your project.`
6206
6209
  );
6207
6210
  }
6208
6211
  }
@@ -6254,7 +6257,7 @@ function collectExternalAssets(html, projectDir) {
6254
6257
  }
6255
6258
  if (externalAssets.size > 0) {
6256
6259
  defaultLogger.info(
6257
- `[Compiler] Found ${externalAssets.size} asset(s) outside project directory \u2014 will copy to render output`
6260
+ `[Compiler] Found ${externalAssets.size} asset(s) outside project directory, will copy to render output`
6258
6261
  );
6259
6262
  }
6260
6263
  return {
@@ -6279,7 +6282,7 @@ async function downloadAndRewriteUrls(urlSet, html, remoteDir, warnLabel, logLab
6279
6282
  urlToLocal.set(url, localPath);
6280
6283
  } catch (err) {
6281
6284
  const identity = safeDownloadUrlIdentity(url);
6282
- defaultLogger.warn(`[Compiler] ${warnLabel} \u2014 using original URL as fallback.`, {
6285
+ defaultLogger.warn(`[Compiler] ${warnLabel}, using original URL as fallback.`, {
6283
6286
  urlFingerprint: identity.urlFingerprint,
6284
6287
  host: identity.host,
6285
6288
  error: err instanceof Error ? err.message : String(err)
@@ -6372,7 +6375,7 @@ async function fetchExternalStylesheetCss(href) {
6372
6375
  timeoutMs: 15e3
6373
6376
  });
6374
6377
  } catch (err) {
6375
- defaultLogger.warn("[Compiler] External stylesheet fetch failed \u2014 preserving link tag.", {
6378
+ defaultLogger.warn("[Compiler] External stylesheet fetch failed, preserving link tag.", {
6376
6379
  urlFingerprint: identity.urlFingerprint,
6377
6380
  host: identity.host,
6378
6381
  error: err instanceof Error ? err.message : String(err)
@@ -6507,7 +6510,7 @@ async function readLocalFont(absPath) {
6507
6510
  return { kind: "inline", buffer: Buffer.concat(chunks, totalBytes) };
6508
6511
  }
6509
6512
  async function embedLocalFontFaces(html, projectDir) {
6510
- const { fontToDataUri: toDataUri } = await import("./deterministicFonts-U2BIMGPG.js");
6513
+ const { fontToDataUri: toDataUri } = await import("./deterministicFonts-C5JQLCTS.js");
6511
6514
  const styleBlockRe = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
6512
6515
  const fontFaceRe = /@font-face\s*\{([^}]*)\}/gi;
6513
6516
  let result = html;
@@ -7016,12 +7019,15 @@ async function resolveCompositionDurations(page, unresolved) {
7016
7019
  const resolved = [];
7017
7020
  for (const id of compIds) {
7018
7021
  const tl = timelines[id];
7019
- if (tl && typeof tl.duration === "function") {
7020
- const dur = tl.duration();
7021
- if (dur > 0) {
7022
- resolved.push({ id, duration: dur, source: "__timelines" });
7023
- continue;
7024
- }
7022
+ let dur = 0;
7023
+ try {
7024
+ dur = typeof tl?.duration === "function" ? Number(tl.duration()) : 0;
7025
+ } catch {
7026
+ dur = 0;
7027
+ }
7028
+ if (dur > 0) {
7029
+ resolved.push({ id, duration: dur, source: "__timelines" });
7030
+ continue;
7025
7031
  }
7026
7032
  const el = document.getElementById(id);
7027
7033
  if (el) {
@@ -7117,28 +7123,28 @@ async function runCompileStage(input) {
7117
7123
  cfg.useDrawElement = false;
7118
7124
  deCompileGate = "3d";
7119
7125
  log.info(
7120
- "[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility) \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7126
+ "[Render] Fast capture: composition uses a CSS 3D rendering context (perspective / preserve-3d / backface-visibility), so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7121
7127
  );
7122
7128
  }
7123
7129
  if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_BLEND !== "true" && compiled.usesMixBlendMode) {
7124
7130
  cfg.useDrawElement = false;
7125
7131
  deCompileGate = "mix_blend_mode";
7126
7132
  log.info(
7127
- "[Render] Fast capture: composition uses mix-blend-mode \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7133
+ "[Render] Fast capture: composition uses mix-blend-mode, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7128
7134
  );
7129
7135
  }
7130
7136
  if (cfg.useDrawElement && process.env.HF_FAST_CAPTURE_ANCESTOR_BG !== "true" && compiled.hasAncestorBackgroundImage) {
7131
7137
  cfg.useDrawElement = false;
7132
7138
  deCompileGate = "ancestor_background_image";
7133
7139
  log.info(
7134
- "[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image \u2014 disabling drawElementImage for this render. Capture uses the platform's baseline route."
7140
+ "[Render] Fast capture: composition root's ancestors (body/html/wrapper) carry a background-image, so disabling drawElementImage for this render. Capture uses the platform's baseline route."
7135
7141
  );
7136
7142
  }
7137
7143
  if (cfg.useDrawElement && process.env.PRODUCER_EXPERIMENTAL_FAST_CAPTURE !== "true" && compiled.hasShaderTransitions) {
7138
7144
  cfg.useDrawElement = false;
7139
7145
  deCompileGate = "shader_transitions";
7140
7146
  log.info(
7141
- "[Render] Fast capture: composition uses shader transitions \u2014 disabling drawElementImage so page-side compositing stays available."
7147
+ "[Render] Fast capture: composition uses shader transitions, so disabling drawElementImage so page-side compositing stays available."
7142
7148
  );
7143
7149
  }
7144
7150
  if (!cfg.useDrawElement && cfg.pageSideCompositingAutoDisabled) {
@@ -7453,7 +7459,7 @@ async function runProbeStage(input) {
7453
7459
  } else {
7454
7460
  beginFrameStalled = true;
7455
7461
  log.warn(
7456
- "[Render] BeginFrame liveness probe timed out \u2014 this composition stalls BeginFrame on this host (SwiftShader heavy-layer pattern). Relaunching the probe browser in screenshot capture mode; the render will use screenshot capture throughout.",
7462
+ "[Render] BeginFrame liveness probe timed out: this composition stalls BeginFrame on this host (SwiftShader heavy-layer pattern). Relaunching the probe browser in screenshot capture mode; the render will use screenshot capture throughout.",
7457
7463
  { probeTimeoutMs }
7458
7464
  );
7459
7465
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -7667,7 +7673,7 @@ async function runProbeStage(input) {
7667
7673
  video.start = win.visibleStart;
7668
7674
  video.end = win.visibleEnd;
7669
7675
  log.info(
7670
- `[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s\u2013${win.visibleEnd.toFixed(2)}s`
7676
+ `[Probe] Runtime video discovery: ${video.id} visible ${win.visibleStart.toFixed(2)}s to ${win.visibleEnd.toFixed(2)}s`
7671
7677
  );
7672
7678
  }
7673
7679
  }
@@ -7715,7 +7721,7 @@ async function runProbeStage(input) {
7715
7721
  });
7716
7722
  if (!timelinesInfo.gsapLoaded) {
7717
7723
  diagnostics.push(
7718
- "GSAP is not loaded \u2014 CDN script may have failed to download. Bundle GSAP locally in your project instead of using a CDN <script src>."
7724
+ "GSAP is not loaded. The CDN script may have failed to download. Bundle GSAP locally in your project instead of using a CDN <script src>."
7719
7725
  );
7720
7726
  } else if (timelinesInfo.timelineKeys.length === 0) {
7721
7727
  diagnostics.push(
@@ -7732,10 +7738,10 @@ async function runProbeStage(input) {
7732
7738
  log.warn("Failed to gather browser diagnostics for zero-duration composition", {
7733
7739
  error: err instanceof Error ? err.message : String(err)
7734
7740
  });
7735
- diagnostics.push("(Could not gather browser diagnostics \u2014 page may have crashed)");
7741
+ diagnostics.push("(Could not gather browser diagnostics. The page may have crashed.)");
7736
7742
  }
7737
7743
  const hint = diagnostics.length > 0 ? "\n\nDiagnostics:\n - " + diagnostics.join("\n - ") : "\n\nCheck that GSAP timelines are registered on window.__timelines.";
7738
- throw new Error("Composition duration is 0 \u2014 this would produce a black video." + hint);
7744
+ throw new Error("Composition duration is 0, so this would produce a black video." + hint);
7739
7745
  }
7740
7746
  if (probeSession) {
7741
7747
  const failedRequests = probeSession.browserConsoleBuffer.filter(isActionableProbeFailure);
@@ -7791,7 +7797,7 @@ function validateNoGpuEncode(config) {
7791
7797
  if (config.useGpu === true) {
7792
7798
  throw new PlanValidationError(
7793
7799
  BROWSER_GPU_NOT_SOFTWARE,
7794
- "[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default) \u2014 software libx264/libx265 is the only supported encoder in distributed mode."
7800
+ "[planValidation] GPU encode is banned in distributed mode: config.useGpu === true. Distributed retries must be byte-identical, but NVENC/QSV/VAAPI produce different output across machines. Set useGpu=false (the default): software libx264/libx265 is the only supported encoder in distributed mode."
7795
7801
  );
7796
7802
  }
7797
7803
  if (config.browserGpuMode !== void 0 && config.browserGpuMode !== "software") {
@@ -8050,6 +8056,9 @@ async function runExtractVideosStage(input) {
8050
8056
  } = input;
8051
8057
  const stage2Start = Date.now();
8052
8058
  const extractionPolicy = resolveVideoExtractionPolicy();
8059
+ composition.videos = composition.videos.filter(
8060
+ (video) => !isVideoPastTimelineEnd(video, composition.duration)
8061
+ );
8053
8062
  let frameLookup = null;
8054
8063
  let extractionResult = null;
8055
8064
  let failureToEnforce = null;
@@ -8136,7 +8145,8 @@ async function runExtractVideosStage(input) {
8136
8145
  timelineEnd: composition.duration,
8137
8146
  maxTransientRetries: extractionPolicy.maxTransientRetries,
8138
8147
  collectProbeFailures: extractionPolicy.failureMode === "enforce",
8139
- deferRangeExtraction
8148
+ deferRangeExtraction,
8149
+ contentKeyedDirs: [join15(compiledDir, REMOTE_MEDIA_SUBDIR)]
8140
8150
  },
8141
8151
  abortSignal,
8142
8152
  cfg,
@@ -10698,7 +10708,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
10698
10708
  const madeProgress = captureAttemptMadeProgress(frameCount, remainingCount);
10699
10709
  if (!madeProgress) {
10700
10710
  options.log.warn(
10701
- "[Render] Capture attempt made no forward progress; composition is likely structurally broken \u2014 not retrying.",
10711
+ "[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
10702
10712
  { attempt, frameCount, remainingCount, workers: currentWorkers }
10703
10713
  );
10704
10714
  }
@@ -10767,7 +10777,7 @@ async function executeDiskCaptureWithAdaptiveRetry(options) {
10767
10777
  }
10768
10778
  if (!madeProgress) {
10769
10779
  options.log.warn(
10770
- "[Render] Capture attempt made no forward progress; composition is likely structurally broken \u2014 not retrying.",
10780
+ "[Render] Capture attempt made no forward progress; composition is likely structurally broken, not retrying.",
10771
10781
  { attempt, frameCount, remainingCount, workers: currentWorkers }
10772
10782
  );
10773
10783
  }
@@ -11230,7 +11240,7 @@ async function executeRenderJob(job, projectDir, outputPath, progressSink, abort
11230
11240
  execution.defer("remove workDir", () => {
11231
11241
  if (job.config.debug) return;
11232
11242
  if (job.status === "complete" && process.env.KEEP_TEMP === "1") {
11233
- log.info("KEEP_TEMP=1 \u2014 leaving workDir on disk for inspection", { workDir });
11243
+ log.info("KEEP_TEMP=1, leaving workDir on disk for inspection", { workDir });
11234
11244
  return;
11235
11245
  }
11236
11246
  rmSync8(workDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
@@ -11467,7 +11477,7 @@ async function executeRenderPipeline(input) {
11467
11477
  captureForceScreenshot = true;
11468
11478
  updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
11469
11479
  log.info(
11470
- "[Render] Low-memory render profile active \u2014 screenshot capture, auto-worker calibration skipped" + (job.config.workers === void 0 ? ", pinned to 1 worker" : "") + ". Override with --no-low-memory-mode or PRODUCER_LOW_MEMORY_MODE=false.",
11480
+ "[Render] Low-memory render profile active: screenshot capture, auto-worker calibration skipped" + (job.config.workers === void 0 ? ", pinned to 1 worker" : "") + ". Override with --no-low-memory-mode or PRODUCER_LOW_MEMORY_MODE=false.",
11471
11481
  { totalMemMb: getSystemTotalMb(), thresholdMb: LOW_MEMORY_TOTAL_MB_THRESHOLD }
11472
11482
  );
11473
11483
  }
@@ -12035,7 +12045,7 @@ async function executeRenderPipeline(input) {
12035
12045
  cfg.useDrawElement = false;
12036
12046
  deClampReason = workerCount > 1 ? "parallel" : "disk_path";
12037
12047
  log.info(
12038
- "[Render] Fast capture: default-on drawElement disabled for this render \u2014 " + (workerCount > 1 ? "parallel capture" : "the disk capture path") + " has no runtime self-verification. Set PRODUCER_EXPERIMENTAL_FAST_CAPTURE=true to override."
12048
+ "[Render] Fast capture: default-on drawElement disabled for this render: " + (workerCount > 1 ? "parallel capture" : "the disk capture path") + " has no runtime self-verification. Set PRODUCER_EXPERIMENTAL_FAST_CAPTURE=true to override."
12039
12049
  );
12040
12050
  if (probeSession && probeSession.captureMode === "drawelement") {
12041
12051
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -12131,7 +12141,7 @@ async function executeRenderPipeline(input) {
12131
12141
  });
12132
12142
  updateCaptureObservability({ forceScreenshot: captureForceScreenshot });
12133
12143
  log.info(
12134
- `[Render] Page-side compositing enabled \u2014 bypassing Node-side layered shader-blend path. Engine will capture one ${needsAlpha ? "RGBA PNG" : "opaque RGB"} screenshot per output frame.`
12144
+ `[Render] Page-side compositing enabled, bypassing Node-side layered shader-blend path. Engine will capture one ${needsAlpha ? "RGBA PNG" : "opaque RGB"} screenshot per output frame.`
12135
12145
  );
12136
12146
  }
12137
12147
  const useLayeredComposite = !usePageSideCompositingForTransitions && shouldUseLayeredComposite({
@@ -12628,7 +12638,7 @@ async function executeRenderPipeline(input) {
12628
12638
  cfg.useDrawElement = false;
12629
12639
  deClampReason = deClampReason ?? "disk_path";
12630
12640
  log.info(
12631
- "[Render] Fast capture: drawElement disabled for the disk fallback \u2014 streaming encoder spawn failed and the disk path has no runtime self-verification."
12641
+ "[Render] Fast capture: drawElement disabled for the disk fallback: streaming encoder spawn failed and the disk path has no runtime self-verification."
12632
12642
  );
12633
12643
  if (probeSession && probeSession.captureMode === "drawelement") {
12634
12644
  lastBrowserConsole = probeSession.browserConsoleBuffer;
@@ -13167,10 +13177,10 @@ function validateJsonSafeValue(value, field) {
13167
13177
  walkVariables(value, field, /* @__PURE__ */ new WeakSet());
13168
13178
  }
13169
13179
  var LEAF_REJECTIONS = {
13170
- undefined: "undefined leaves are silently dropped by JSON.stringify \u2014 use null if you mean an absent value",
13180
+ undefined: "undefined leaves are silently dropped by JSON.stringify. Use null if you mean an absent value",
13171
13181
  function: "functions are not JSON-serializable",
13172
13182
  symbol: "Symbols are not JSON-serializable",
13173
- bigint: "BigInt values throw at JSON.stringify \u2014 encode as a string if you need 64-bit integers"
13183
+ bigint: "BigInt values throw at JSON.stringify. Encode as a string if you need 64-bit integers"
13174
13184
  };
13175
13185
  function walkVariables(value, path, seen) {
13176
13186
  const t = typeof value;
@@ -13191,7 +13201,7 @@ function walkVariables(value, path, seen) {
13191
13201
  if (seen.has(value)) {
13192
13202
  throw new InvalidConfigError(
13193
13203
  path,
13194
- "circular reference detected \u2014 JSON.stringify cannot serialize cycles"
13204
+ "circular reference detected: JSON.stringify cannot serialize cycles"
13195
13205
  );
13196
13206
  }
13197
13207
  seen.add(value);
@@ -13853,7 +13863,7 @@ function validateOutputResolutionOverride(body) {
13853
13863
  return `Invalid outputResolution "${body.outputResolution}". Must be one of: landscape, portrait, landscape-4k, portrait-4k, square, square-4k (aliases: 1080p, 4k, \u2026).`;
13854
13864
  }
13855
13865
  if (normalized !== void 0 && (body.format === "webm" || body.format === "mov")) {
13856
- return `outputResolution is not supported with format "${body.format}" \u2014 the alpha (webm/mov) capture path can't supersample. Use format "mp4", or omit outputResolution to render at the composition's native dimensions.`;
13866
+ return `outputResolution is not supported with format "${body.format}": the alpha (webm/mov) capture path can't supersample. Use format "mp4", or omit outputResolution to render at the composition's native dimensions.`;
13857
13867
  }
13858
13868
  return void 0;
13859
13869
  }
@@ -14300,7 +14310,7 @@ function startServer(options = {}) {
14300
14310
  });
14301
14311
  async function shutdown(signal) {
14302
14312
  log.info(`Received ${signal}, shutting down`);
14303
- const { drainBrowserPool } = await import("./src-BSLKXEGX.js");
14313
+ const { drainBrowserPool } = await import("./src-2GMPFYHL.js");
14304
14314
  await drainBrowserPool().catch(() => {
14305
14315
  });
14306
14316
  const handle = await Promise.race([
@@ -14560,7 +14570,7 @@ function collectPlanAssetShas(planDir) {
14560
14570
  }
14561
14571
  if (compositionHtml === null) {
14562
14572
  throw new Error(
14563
- `[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH} \u2014 upstream compile stage did not materialize the expected file.`
14573
+ `[freezePlan] compiled HTML missing at ${COMPILED_INDEX_RELATIVE_PATH} (upstream compile stage did not materialize the expected file).`
14564
14574
  );
14565
14575
  }
14566
14576
  return { compositionHtml, assets };
@@ -15139,7 +15149,7 @@ var PlanTooLargeError = class extends Error {
15139
15149
  const breakdownSuffix = breakdown ? ` Breakdown: video-frames=${formatBytes(breakdown.videoFramesBytes)}, compiled=${formatBytes(breakdown.compiledBytes)} (source-media=${formatBytes(breakdown.sourceMediaBytes)}), audio=${formatBytes(breakdown.audioBytes)}, metadata=${formatBytes(breakdown.metadataBytes)}, other=${formatBytes(breakdown.otherBytes)}, files=${breakdown.fileCount}.` : "";
15140
15150
  const observationSuffix = observedAt ? ` Observed at ${observedAt}.` : "";
15141
15151
  super(
15142
- `[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`) \u2014 it has no planDir size cap.` + observationSuffix + breakdownSuffix
15152
+ `[plan] planDir size ${formatBytes(sizeBytes)} exceeds the configured ceiling ${formatBytes(limitBytes)} (PLAN_TOO_LARGE). The default 2 GB cap fits inside AWS Lambda's 10 GB /tmp budget alongside the chunk worker's frame buffer and ffmpeg's working set. To unblock: use the content-addressed \`planV2()\` transport, shorten the composition, lower the framerate, or use the in-process renderer (\`executeRenderJob\`), which has no planDir size cap.` + observationSuffix + breakdownSuffix
15143
15153
  );
15144
15154
  this.name = "PlanTooLargeError";
15145
15155
  this.sizeBytes = sizeBytes;
@@ -15156,7 +15166,7 @@ var FormatNotSupportedInDistributedError = class extends Error {
15156
15166
  reason;
15157
15167
  constructor(format, reason) {
15158
15168
  super(
15159
- `[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`) \u2014 it has full format support \u2014 or pick a distributed-supported format: mp4 SDR, mov ProRes 4444, png-sequence, or webm VP9.`
15169
+ `[plan] format ${JSON.stringify(format)} is not supported in distributed mode: ${reason}. Render with the in-process renderer (\`executeRenderJob\`), which has full format support, or pick a distributed-supported format: mp4 SDR, mov ProRes 4444, png-sequence, or webm VP9.`
15160
15170
  );
15161
15171
  this.name = "FormatNotSupportedInDistributedError";
15162
15172
  this.format = format;
@@ -15245,7 +15255,7 @@ async function readFontSnapshotSha() {
15245
15255
  const data = module.EMBEDDED_FONT_DATA;
15246
15256
  if (!data || typeof data !== "object") {
15247
15257
  throw new Error(
15248
- "[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data \u2014 was `bun run build:fonts` run?"
15258
+ "[plan] EMBEDDED_FONT_DATA missing from @hyperframes/core/fonts/embedded-data. Was `bun run build:fonts` run?"
15249
15259
  );
15250
15260
  }
15251
15261
  const dataObj = data;
@@ -15295,7 +15305,7 @@ function resolveEncoderTriple(config) {
15295
15305
  }
15296
15306
  if (config.codec !== void 0) {
15297
15307
  throw new Error(
15298
- `[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats \u2014 mov is always ProRes 4444, webm is always libvpx-vp9, and png-sequence has no encoder.`
15308
+ `[plan] DistributedRenderConfig.codec is only valid for format="mp4"; received codec=${JSON.stringify(config.codec)} with format=${JSON.stringify(config.format)}. Omit codec for non-mp4 formats: mov is always ProRes 4444, webm is always libvpx-vp9, and png-sequence has no encoder.`
15299
15309
  );
15300
15310
  }
15301
15311
  return resolveNonMp4EncoderTriple(config.format, config.quality ?? "standard");
@@ -15485,7 +15495,7 @@ async function buildLocalExecutionPlan(projectDir, config, executionPlanDir, opt
15485
15495
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15486
15496
  if (probeResult.probeSession) {
15487
15497
  try {
15488
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-BSLKXEGX.js");
15498
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-2GMPFYHL.js");
15489
15499
  await closeCaptureSession2(probeResult.probeSession);
15490
15500
  } catch (err) {
15491
15501
  log.warn("[plan] probe session close failed", {
@@ -15,7 +15,7 @@ import {
15
15
  } from "./chunk-PBN6GBJE.js";
16
16
  import {
17
17
  parseFps
18
- } from "./chunk-VRW6EBHV.js";
18
+ } from "./chunk-BAKPN2D2.js";
19
19
 
20
20
  // src/browser/windowsCrash.ts
21
21
  var STATUS_STACK_BUFFER_OVERRUN_DEC = "3221225595";