hyperframes 0.8.193 → 0.8.194

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 (187) hide show
  1. package/dist/{add-JC6DKZKC.js → add-47UAIWY4.js} +12 -12
  2. package/dist/{animatedGifPrep-S6KXJGEL.js → animatedGifPrep-TFSQZWK6.js} +8 -7
  3. package/dist/api.js +18 -17
  4. package/dist/{asset-XITFIFE6.js → asset-AU7PZHXA.js} +2 -2
  5. package/dist/{assetCataloger-K5FNKG35.js → assetCataloger-HC5N6WPT.js} +8 -7
  6. package/dist/{audio-364UHTY4.js → audio-7AWMZWBM.js} +14 -13
  7. package/dist/{auth-5JEESRE6.js → auth-GXH3QNDJ.js} +1 -1
  8. package/dist/{autoUpdate-RVVYEHAA.js → autoUpdate-GVGP5O2I.js} +2 -2
  9. package/dist/{backgroundChecks-DCBIYWIQ.js → backgroundChecks-IUJM2Q35.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-ZZ4QMBAA.js → batchRender-3XS2Y2Y4.js} +4 -4
  12. package/dist/{beats-YEL65M6G.js → beats-U64B4S7Z.js} +9 -9
  13. package/dist/{benchmark-RBTRPA76.js → benchmark-2YUPAI76.js} +9 -9
  14. package/dist/{browser-BVAYXT4R.js → browser-DBFH7KXM.js} +5 -5
  15. package/dist/{bundleWithLocalizedFonts-JLB2OYMT.js → bundleWithLocalizedFonts-XWL7KSQJ.js} +2 -2
  16. package/dist/{capture-NIFX6IRS.js → capture-E4VW75NM.js} +2 -2
  17. package/dist/{capture-GBXTMYLZ.js → capture-YWH7BPBI.js} +13 -12
  18. package/dist/{captureCompositionFrame-ATNNKUL5.js → captureCompositionFrame-IG6S2OHG.js} +13 -12
  19. package/dist/{catalog-AGIF5SM5.js → catalog-LZIZLZ34.js} +12 -12
  20. package/dist/{catch-up-SZ3ULDTI.js → catch-up-ZVNPIACY.js} +4 -4
  21. package/dist/{check-YLQS3TF4.js → check-EKEOD4UM.js} +38 -37
  22. package/dist/{checkBrowser-QH4FMCBO.js → checkBrowser-MYH6HPHH.js} +33 -32
  23. package/dist/{chunk-ZT45TCY3.js → chunk-2AJU7PZ6.js} +1 -1
  24. package/dist/chunk-2D5WP2NI.js +3901 -0
  25. package/dist/{chunk-FBVUAH7N.js → chunk-2OYYNKJ4.js} +1 -1
  26. package/dist/{chunk-DSQ72G5I.js → chunk-37IHQVNQ.js} +1 -1
  27. package/dist/{chunk-AR3DQYRR.js → chunk-3OSBSUN3.js} +18 -18
  28. package/dist/{chunk-2SFDWMSW.js → chunk-3S3CXF4W.js} +2 -2
  29. package/dist/{chunk-TY3LDJA3.js → chunk-452UK7E7.js} +2 -2
  30. package/dist/{chunk-OFYW4J7Y.js → chunk-4FVNEXSV.js} +3 -3
  31. package/dist/{chunk-CGTZOY53.js → chunk-4GMDL4N5.js} +1 -1
  32. package/dist/{chunk-4PPWAQYV.js → chunk-4PIPQPCW.js} +7 -7
  33. package/dist/{chunk-BP4EMEGH.js → chunk-4VSV56F2.js} +2 -2
  34. package/dist/{chunk-L4JB7LI4.js → chunk-52YJKWV3.js} +67 -60
  35. package/dist/{chunk-ZZPBXRYQ.js → chunk-54PZ2EQZ.js} +1 -1
  36. package/dist/{chunk-6XUJVEY2.js → chunk-B3GG3HJB.js} +1 -1
  37. package/dist/{chunk-2MCXIY4B.js → chunk-B7RJV74O.js} +28 -11
  38. package/dist/{chunk-MFUNDJEV.js → chunk-BK5YCT54.js} +3 -3
  39. package/dist/{chunk-RWGASWT7.js → chunk-BL4U6U52.js} +1 -0
  40. package/dist/{chunk-QKX7ITER.js → chunk-BYADARIC.js} +2 -2
  41. package/dist/{chunk-WIVOXGEP.js → chunk-CEUBYYVJ.js} +2 -2
  42. package/dist/{chunk-UIC7B5KW.js → chunk-CEZH4AQT.js} +12 -2
  43. package/dist/{chunk-BY6OQ6XP.js → chunk-CZNSLFYD.js} +3 -1
  44. package/dist/{chunk-E77ALFLW.js → chunk-DT3JESJ6.js} +1 -1
  45. package/dist/{chunk-ZTKFRXJB.js → chunk-DVQDBWQG.js} +4 -4
  46. package/dist/{chunk-L5YLA54L.js → chunk-EB3XXHNO.js} +2 -2
  47. package/dist/{chunk-LFUVTS6V.js → chunk-EY7GKVPS.js} +2 -2
  48. package/dist/{chunk-KU3UFQN7.js → chunk-F2ASNL2K.js} +1 -1
  49. package/dist/{chunk-ZH7J2ZUL.js → chunk-F3B7CE3Q.js} +14 -14
  50. package/dist/{chunk-E3P3LJG6.js → chunk-FLREUEHW.js} +28 -11
  51. package/dist/{chunk-VW63MHQU.js → chunk-FUA22HO4.js} +1 -1
  52. package/dist/{chunk-3W4B6G7Y.js → chunk-GAFEU6AB.js} +13 -10
  53. package/dist/{chunk-DIKAPMMF.js → chunk-GQVTTWZF.js} +144 -39
  54. package/dist/{chunk-2LSCYS2H.js → chunk-HCLBM2LQ.js} +2 -2
  55. package/dist/{chunk-GR5DQKDR.js → chunk-HG5ECUOR.js} +5 -5
  56. package/dist/{chunk-2NERNYCJ.js → chunk-HPGQPRHY.js} +3 -3
  57. package/dist/{chunk-SOY2FPOR.js → chunk-HQD7ODQB.js} +5 -5
  58. package/dist/{chunk-XQPA4W3M.js → chunk-JU4T4VAA.js} +4 -4
  59. package/dist/{chunk-7HTH5PFK.js → chunk-JVTWX5G3.js} +33 -8
  60. package/dist/{chunk-UNATIAOT.js → chunk-JXTPNUSO.js} +83 -51
  61. package/dist/{chunk-2VXY3PEF.js → chunk-K2VXPQKC.js} +107 -94
  62. package/dist/chunk-K4MJX7SR.js +17 -0
  63. package/dist/{chunk-BJAS2JLW.js → chunk-KDEV5RIE.js} +7 -3
  64. package/dist/{chunk-WFS6S65A.js → chunk-LMIDZIW2.js} +12 -12
  65. package/dist/{chunk-5J6TWLFG.js → chunk-LOGKDQ3G.js} +3 -3
  66. package/dist/{chunk-IW5G323T.js → chunk-LTGTN2TH.js} +8 -9
  67. package/dist/{chunk-F5LLORBP.js → chunk-LZ4WPR3B.js} +2 -2
  68. package/dist/{chunk-7QNIXBQD.js → chunk-M2VXARYK.js} +3 -2
  69. package/dist/{chunk-7YSFE4SZ.js → chunk-MCFPMUMT.js} +2 -2
  70. package/dist/{chunk-YS4JUGNI.js → chunk-MGSNFWGR.js} +2 -2
  71. package/dist/{chunk-V7ZA2BNW.js → chunk-MO6RTNYD.js} +1 -1
  72. package/dist/{chunk-OFV3WSOE.js → chunk-N33FO44R.js} +1 -1
  73. package/dist/{chunk-GKHMSSGY.js → chunk-N3M3IU6S.js} +1 -1
  74. package/dist/{chunk-6LWUPIKD.js → chunk-NVVIFW3C.js} +10 -10
  75. package/dist/{chunk-4LXZJIVY.js → chunk-O2ILONGK.js} +10 -10
  76. package/dist/{chunk-C4Y3ZREE.js → chunk-OJNNKHAZ.js} +75 -22
  77. package/dist/{chunk-UB7BIDBS.js → chunk-PEHST4UY.js} +3 -3
  78. package/dist/{chunk-RTLPWOO6.js → chunk-POFJH2IS.js} +1 -1
  79. package/dist/{chunk-7YKJF5JV.js → chunk-PXK3ICU6.js} +1 -1
  80. package/dist/{chunk-M3KZBDPB.js → chunk-Q4HKC3O7.js} +3 -3
  81. package/dist/{chunk-X5CECNCK.js → chunk-QJQTWTM7.js} +8 -3
  82. package/dist/{chunk-QFPBRZJD.js → chunk-ROEW726S.js} +1 -1
  83. package/dist/{chunk-D625D4TV.js → chunk-RUPGFW5B.js} +6 -6
  84. package/dist/{chunk-EFXMETRK.js → chunk-RZWJJCI7.js} +2 -2
  85. package/dist/{chunk-TZEKVLPV.js → chunk-SNECH6QA.js} +1 -1
  86. package/dist/{chunk-REUL2KH2.js → chunk-ST35C4K6.js} +1 -1
  87. package/dist/{chunk-LMNZLZMJ.js → chunk-ST4SHO3S.js} +1 -1
  88. package/dist/{chunk-6DLCOQR4.js → chunk-TDYKVJTU.js} +119 -34
  89. package/dist/{chunk-4TKJWWPL.js → chunk-VHIBBDEI.js} +1 -1
  90. package/dist/{chunk-VPC4XIVI.js → chunk-VPON6DF2.js} +5 -5
  91. package/dist/{chunk-DYNHVCBF.js → chunk-XYGULBFV.js} +2 -2
  92. package/dist/{chunk-VLLFORE2.js → chunk-Y3BT27Y7.js} +1 -1
  93. package/dist/{clean-5HGESK5A.js → clean-NS2SDRK7.js} +21 -20
  94. package/dist/cli.js +53 -53
  95. package/dist/{cloud-746PHS32.js → cloud-K4XQPWTY.js} +4 -4
  96. package/dist/{cloudrun-DO7WFLSM.js → cloudrun-BKOKXTXV.js} +6 -6
  97. package/dist/{compare-66YPRNG2.js → compare-ZAV773OL.js} +31 -30
  98. package/dist/{compiler-R4UYDWXO.js → compiler-CWHFCE3H.js} +5 -5
  99. package/dist/{component-EQ3H6RFP.js → component-OXA2ZWX3.js} +3 -3
  100. package/dist/{compositions-ZZ7P5HT2.js → compositions-NKRVWCPE.js} +12 -11
  101. package/dist/{contactSheet-SZBJDOMT.js → contactSheet-5APX35L3.js} +1 -1
  102. package/dist/{delete-Z5MSLJSR.js → delete-HZ2LBCLC.js} +2 -2
  103. package/dist/{deploy-RGSAC2K5.js → deploy-FNDTZFF7.js} +1 -1
  104. package/dist/{deterministicFonts-RO2TCMLZ.js → deterministicFonts-RADD3BSX.js} +2 -2
  105. package/dist/{dist-RKK4YLAD.js → dist-2YTN2UGY.js} +3 -3
  106. package/dist/{dist-QQ26RUDV.js → dist-7OCZHNLY.js} +1 -1
  107. package/dist/{doctor-W4ZZDRTU.js → doctor-6QWJGO5P.js} +14 -13
  108. package/dist/{events-UACT7PX3.js → events-HTHOBIUN.js} +3 -3
  109. package/dist/{events-BSSL4A4W.js → events-MBKHVGXX.js} +2 -2
  110. package/dist/{feedback-47ILDLQG.js → feedback-X5QWTLEX.js} +8 -8
  111. package/dist/{ffmpeg-IEHSUNUT.js → ffmpeg-7GESJCCT.js} +9 -8
  112. package/dist/{figma-PLFIIYRU.js → figma-SXOHFVJI.js} +3 -3
  113. package/dist/fontLocalizeCli.js +11 -10
  114. package/dist/{get-PDWGJYNL.js → get-T2HI5FCK.js} +2 -2
  115. package/dist/{gpuPolicy-6UBXO6ME.js → gpuPolicy-5FABKW5G.js} +8 -7
  116. package/dist/{grade-compare-5VWLQGM7.js → grade-compare-JATGHA6Q.js} +37 -35
  117. package/dist/{gsapParser-UP3PNPC2.js → gsapParser-IEUSLYDJ.js} +11 -11
  118. package/dist/{gsapParserAcorn-OOTY2MVN.js → gsapParserAcorn-LZJKCFQI.js} +1 -1
  119. package/dist/{help-DS3KMWYO.js → help-G6CIKCGS.js} +1 -1
  120. package/dist/{history-OC326NVZ.js → history-CSJUHYTD.js} +7 -7
  121. package/dist/hyperframe.manifest.json +1 -1
  122. package/dist/hyperframe.runtime.iife.js +69 -63
  123. package/dist/hyperframes-player.global.js +3 -3
  124. package/dist/hyperframes-slideshow.global.js +1 -1
  125. package/dist/{info-AUIFV6MX.js → info-MTTUMW2C.js} +8 -8
  126. package/dist/{init-MRTWWDFW.js → init-LJYNI5EK.js} +30 -29
  127. package/dist/{inspect-55NOAXI2.js → inspect-HGDM2VJE.js} +31 -30
  128. package/dist/{installer-YSFFGBBV.js → installer-3XHURUDG.js} +5 -5
  129. package/dist/{keyframes-OO2BX2IB.js → keyframes-MSU7N53X.js} +59 -33
  130. package/dist/{lambda-CXXY6QT3.js → lambda-2I2TIUSD.js} +8 -8
  131. package/dist/{layout-57GJXKDK.js → layout-KWOXZMN7.js} +31 -30
  132. package/dist/{lint-J4FK3Z6G.js → lint-N53TLHFG.js} +7 -7
  133. package/dist/{lintProject-52SLJPRC.js → lintProject-EOUZA4EG.js} +1 -1
  134. package/dist/{list-VDQUJ76B.js → list-SHYPQC7U.js} +2 -2
  135. package/dist/{login-TJSEALWW.js → login-TEB6PA3Y.js} +4 -4
  136. package/dist/{manager-MZIJY73J.js → manager-COSJVRAE.js} +2 -2
  137. package/dist/{manager-4PLYEEWP.js → manager-PLRSZH5G.js} +10 -9
  138. package/dist/{media-treatment-GXP4PMJH.js → media-treatment-XTUKMIGE.js} +15 -14
  139. package/dist/{models-HQQQKEEP.js → models-4WKAPP2L.js} +14 -13
  140. package/dist/{motionShot-2BT5D7DC.js → motionShot-PTKB4ILH.js} +17 -16
  141. package/dist/{normalize-audio-SOLFMHNP.js → normalize-audio-3NG326I2.js} +6 -6
  142. package/dist/{open-KHEUODFQ.js → open-6S2LMF7R.js} +12 -12
  143. package/dist/{parakeetRunner-BHU5NCAX.js → parakeetRunner-OEI35DVO.js} +15 -14
  144. package/dist/{pipeline-WFV5HDTD.js → pipeline-543FUKH4.js} +10 -9
  145. package/dist/{play-GB34CANJ.js → play-ETEGHP3B.js} +21 -21
  146. package/dist/{preflight-REF3VSJ7.js → preflight-Y5IYUF2T.js} +11 -10
  147. package/dist/{present-SIUTA7TD.js → present-ZRSLMJ6J.js} +17 -17
  148. package/dist/{preview-T2GE7Z4A.js → preview-CEJ3SVTY.js} +100 -65
  149. package/dist/{producer-23KVQZAB.js → producer-JFVFIV26.js} +1 -1
  150. package/dist/{projectConfig-DBSNBPNP.js → projectConfig-7EK3BS72.js} +7 -7
  151. package/dist/{publication-IXPUKYWJ.js → publication-Y54GYFMV.js} +3 -3
  152. package/dist/{publish-3BA5VHXJ.js → publish-S3UJTPCV.js} +10 -10
  153. package/dist/{remove-background-RMSCJVVQ.js → remove-background-YTATNQSI.js} +11 -10
  154. package/dist/{render-XGOZMMWX.js → render-IIPXMSBO.js} +35 -34
  155. package/dist/{render-6RNE2MLU.js → render-RN3W6YL4.js} +17 -16
  156. package/dist/{render-Y6CTQ3YW.js → render-WNIG4B3J.js} +6 -6
  157. package/dist/{render-batch-VUR6N6EY.js → render-batch-OYS3UQDB.js} +6 -6
  158. package/dist/renderSetupWorker.js +42 -4
  159. package/dist/{resolver-GJCUH57W.js → resolver-OVCXVEDX.js} +5 -5
  160. package/dist/{sherpa-VVAKRCPL.js → sherpa-NCSFD7S3.js} +14 -13
  161. package/dist/skills/media-use/scripts/lib/duck.mjs +18 -2
  162. package/dist/skills/media-use/scripts/lib/duck.test.mjs +79 -0
  163. package/dist/{skills-ZHBURVQG.js → skills-IUV3K3X7.js} +5 -5
  164. package/dist/{skillsUpdateCheck-VMDAL2O2.js → skillsUpdateCheck-NACBXMWW.js} +3 -3
  165. package/dist/{snapshot-KEOG56SL.js → snapshot-7S5USJ2I.js} +39 -38
  166. package/dist/{src-TZLGFRRX.js → src-CAR6PHI4.js} +10 -9
  167. package/dist/{src-BH5NICGQ.js → src-HITT6NWG.js} +9 -6
  168. package/dist/{staticProjectServer-BKXL5CXB.js → staticProjectServer-QR6VZBPT.js} +18 -18
  169. package/dist/studio/assets/{hyperframes-player-BMcUdmDb.js → hyperframes-player-DLOUZUct.js} +1 -1
  170. package/dist/studio/assets/{index-Ca-mgTnS.js → index-CAQ7OcNJ.js} +163 -163
  171. package/dist/studio/assets/{index-Ci6GuloR.js → index-D9kA6JUX.js} +1 -1
  172. package/dist/studio/index.html +1 -1
  173. package/dist/{studio-api-A5U6QAMC.js → studio-api-HVNOJILH.js} +11 -11
  174. package/dist/{studioServer-5EC5CP4W.js → studioServer-3BG5FRJL.js} +53 -52
  175. package/dist/{telemetry-BCKJXDSW.js → telemetry-PET2GFQG.js} +3 -3
  176. package/dist/{timeline-AZWAXTAY.js → timeline-PVIC2Z5K.js} +20 -19
  177. package/dist/{tokens-X7NC3V7C.js → tokens-4N46PWSF.js} +2 -2
  178. package/dist/{transcribe-SH26H755.js → transcribe-2DVBS7MH.js} +19 -18
  179. package/dist/{transcribe-7NCY7QZ2.js → transcribe-IDC7JTM4.js} +13 -12
  180. package/dist/{updateCheck-Y7FUWQM4.js → updateCheck-QRDVXU7I.js} +2 -2
  181. package/dist/{upgrade-ZHGEVL65.js → upgrade-5CNE3TBH.js} +2 -2
  182. package/dist/{urlDownloader-FPILIT7M.js → urlDownloader-P2I25DFC.js} +7 -6
  183. package/dist/{validate-KQOZR4F6.js → validate-CLR5PEOV.js} +25 -24
  184. package/dist/{video-N2QAETFB.js → video-3CKZZBOB.js} +8 -7
  185. package/dist/warmCheck.js +38 -37
  186. package/package.json +1 -1
  187. package/dist/chunk-USWPZXEA.js +0 -3897
@@ -8,7 +8,7 @@ import {
8
8
  EncoderInterruptedError,
9
9
  encoderFailureError,
10
10
  prepareAnimatedGifInputs
11
- } from "./chunk-TY3LDJA3.js";
11
+ } from "./chunk-452UK7E7.js";
12
12
  import {
13
13
  GENERIC_FAMILIES,
14
14
  collectFontFamilyCustomProperties,
@@ -16,7 +16,7 @@ import {
16
16
  iterateFontFamilyDeclarations,
17
17
  normalizeSystemFontPrimaryFamilies,
18
18
  resolveFontFamilyDeclarationFamilies
19
- } from "./chunk-QFPBRZJD.js";
19
+ } from "./chunk-ROEW726S.js";
20
20
  import {
21
21
  parseEncoderOptions
22
22
  } from "./chunk-KLIKCX6Q.js";
@@ -158,8 +158,9 @@ import {
158
158
  trackChildProcess,
159
159
  validateEngineConfigSnapshot,
160
160
  verifyDiskDrawElementSamples,
161
+ videoAudioId,
161
162
  writeCapturedFrame
162
- } from "./chunk-L4JB7LI4.js";
163
+ } from "./chunk-52YJKWV3.js";
163
164
  import {
164
165
  DISTRIBUTED_FPS,
165
166
  HF_VFX_ATTR,
@@ -174,7 +175,7 @@ import {
174
175
  parseVfxChain,
175
176
  resolveAuthoredTimingWindow,
176
177
  toFps
177
- } from "./chunk-7HTH5PFK.js";
178
+ } from "./chunk-JVTWX5G3.js";
178
179
  import {
179
180
  assignBundledRuntimeCompositionIds,
180
181
  buildVariablesByCompScript,
@@ -184,10 +185,9 @@ import {
184
185
  ensureExternalScriptTag,
185
186
  extractStandaloneEntryFromIndex,
186
187
  inlineSubCompositions,
187
- isTemplateEntry,
188
188
  parsesAsScript,
189
189
  prepareFlattenedInnerRoot
190
- } from "./chunk-3W4B6G7Y.js";
190
+ } from "./chunk-GAFEU6AB.js";
191
191
  import {
192
192
  COMPOSITION_SOURCE_URL,
193
193
  HF_COLOR_GRADING_ATTR,
@@ -205,17 +205,20 @@ import {
205
205
  insertBeforeCloseTag,
206
206
  isJavaScriptType,
207
207
  isRuntimeFileUrl,
208
+ isTemplateEntry,
208
209
  normalizeRateSpec,
209
210
  parseHostVariableValues,
210
211
  parseStrictFiniteTimingNumber,
211
212
  readDeclaredDefaults,
212
213
  readMediaStart,
213
214
  resolveNaturalMediaTimelineDurationFromValues,
215
+ resolveRateSpec,
214
216
  shiftRateLane,
215
217
  shouldClampResolvedMediaDuration,
216
218
  sourceTimeAt,
217
- styleElementsFor
218
- } from "./chunk-USWPZXEA.js";
219
+ styleElementsFor,
220
+ timeAtSourceTime
221
+ } from "./chunk-2D5WP2NI.js";
219
222
  import {
220
223
  MAX_AUDIO_GAIN
221
224
  } from "./chunk-X7HBSTCZ.js";
@@ -229,7 +232,7 @@ import {
229
232
  isAspectAgnosticResolutionAlias,
230
233
  normalizeResolutionFlag,
231
234
  suggestMatchingPreset
232
- } from "./chunk-2MCXIY4B.js";
235
+ } from "./chunk-B7RJV74O.js";
233
236
  import {
234
237
  TRANSITIONS,
235
238
  convertTransfer,
@@ -245,7 +248,7 @@ import {
245
248
  import {
246
249
  lintHyperframeHtml,
247
250
  resolveReferencedStart
248
- } from "./chunk-2VXY3PEF.js";
251
+ } from "./chunk-K2VXPQKC.js";
249
252
  import {
250
253
  isUnresolvedAssetPlaceholder,
251
254
  readProjectFile,
@@ -264,6 +267,7 @@ import {
264
267
  CSS_URL_RE,
265
268
  decodedUrlPath,
266
269
  isNonRelativeUrl,
270
+ readPlaybackRate,
267
271
  rewriteAssetPaths,
268
272
  rewriteCssAssetUrls,
269
273
  rewriteInlineStyleAssetUrls
@@ -1763,8 +1767,11 @@ function assertDurationWithinTolerance(expectedSeconds, probedSeconds, tolerance
1763
1767
  `Render artifact is truncated: expected ${expectedSeconds.toFixed(3)}s, probed ${probedSeconds.toFixed(3)}s (deficit ${deficit.toFixed(3)}s exceeds tolerance ${toleranceSeconds.toFixed(3)}s). Artifact: ${stagingPath}`
1764
1768
  );
1765
1769
  }
1770
+ function hasUsableFrameCount(frames) {
1771
+ return frames !== void 0 && Number.isFinite(frames) && frames > 0;
1772
+ }
1766
1773
  function assertFrameCountWithinTolerance(expectedFrames, probedFrames, stagingPath, toleranceFrames = 1) {
1767
- if (probedFrames === void 0 || !Number.isFinite(probedFrames) || probedFrames <= 0) {
1774
+ if (!hasUsableFrameCount(probedFrames)) {
1768
1775
  return;
1769
1776
  }
1770
1777
  const shortfall = expectedFrames - probedFrames;
@@ -1784,9 +1791,10 @@ function assertSizeMatches(expected, probed, stagingPath) {
1784
1791
  );
1785
1792
  }
1786
1793
  var ArtifactTransaction = class {
1787
- constructor(destinationPath, kind, fileSystem = defaultFileSystem, durationProbe = defaultArtifactDurationProbe) {
1794
+ constructor(destinationPath, kind, fileSystem = defaultFileSystem, durationProbe = defaultArtifactDurationProbe, logger = defaultLogger) {
1788
1795
  this.kind = kind;
1789
1796
  this.fileSystem = fileSystem;
1797
+ this.logger = logger;
1790
1798
  this.destinationPath = resolve4(destinationPath);
1791
1799
  this.transactionDirectory = createSiblingTransactionDirectory(this.destinationPath);
1792
1800
  this.stagingPath = join5(this.transactionDirectory, basename3(this.destinationPath));
@@ -1795,6 +1803,7 @@ var ArtifactTransaction = class {
1795
1803
  }
1796
1804
  kind;
1797
1805
  fileSystem;
1806
+ logger;
1798
1807
  destinationPath;
1799
1808
  stagingPath;
1800
1809
  transactionDirectory;
@@ -1871,6 +1880,19 @@ var ArtifactTransaction = class {
1871
1880
  probePath
1872
1881
  );
1873
1882
  if (expected.expectedFrames !== void 0) {
1883
+ if (!hasUsableFrameCount(probed.frames)) {
1884
+ try {
1885
+ this.logger.debug(
1886
+ "[Render] Frame-count validation skipped: no usable frame count was reported.",
1887
+ {
1888
+ event: "artifact_frame_count_unavailable",
1889
+ artifact: this.destinationPath,
1890
+ expectedFrames: expected.expectedFrames
1891
+ }
1892
+ );
1893
+ } catch {
1894
+ }
1895
+ }
1874
1896
  assertFrameCountWithinTolerance(expected.expectedFrames, probed.frames, probePath);
1875
1897
  }
1876
1898
  assertSizeMatches(expected, probed, probePath);
@@ -6651,7 +6673,7 @@ async function readLocalFont(absPath) {
6651
6673
  return { kind: "inline", buffer: Buffer.concat(chunks, totalBytes) };
6652
6674
  }
6653
6675
  async function embedLocalFontFaces(html, projectDir) {
6654
- const { fontToDataUri: toDataUri } = await import("./deterministicFonts-RO2TCMLZ.js");
6676
+ const { fontToDataUri: toDataUri } = await import("./deterministicFonts-RADD3BSX.js");
6655
6677
  const styleBlockRe = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
6656
6678
  const fontFaceRe = /@font-face\s*\{([^}]*)\}/gi;
6657
6679
  let result = html;
@@ -6932,6 +6954,9 @@ async function discoverMediaFromBrowser(page) {
6932
6954
  const intrinsicDuration = isImage ? 0 : htmlEl.duration;
6933
6955
  const playbackStartRaw = htmlEl.getAttribute("data-playback-start");
6934
6956
  const mediaStartRaw = htmlEl.getAttribute("data-media-start");
6957
+ const playbackRateRaw = htmlEl.getAttribute("data-playback-rate");
6958
+ const automationRaw = htmlEl.getAttribute("data-automation");
6959
+ const defaultPlaybackRate = isImage ? 1 : htmlEl.defaultPlaybackRate;
6935
6960
  const loop = htmlEl.hasAttribute("loop");
6936
6961
  const hasAudio = htmlEl.getAttribute("data-has-audio") === "true";
6937
6962
  const volume = parseFloat(htmlEl.getAttribute("data-volume") || "1");
@@ -6947,6 +6972,9 @@ async function discoverMediaFromBrowser(page) {
6947
6972
  durationInferred,
6948
6973
  playbackStartRaw,
6949
6974
  mediaStartRaw,
6975
+ playbackRateRaw,
6976
+ automationRaw,
6977
+ defaultPlaybackRate,
6950
6978
  loop,
6951
6979
  hasAudio,
6952
6980
  volume,
@@ -6956,7 +6984,17 @@ async function discoverMediaFromBrowser(page) {
6956
6984
  return results;
6957
6985
  });
6958
6986
  return elements.map(
6959
- ({ endRaw, durationRaw, intrinsicDuration, playbackStartRaw, mediaStartRaw, ...element }) => ({
6987
+ ({
6988
+ endRaw,
6989
+ durationRaw,
6990
+ intrinsicDuration,
6991
+ playbackStartRaw,
6992
+ mediaStartRaw,
6993
+ playbackRateRaw,
6994
+ automationRaw,
6995
+ defaultPlaybackRate,
6996
+ ...element
6997
+ }) => ({
6960
6998
  ...element,
6961
6999
  end: parseStrictFiniteTimingNumber(endRaw) ?? 0,
6962
7000
  duration: element.durationInferred && Number.isFinite(intrinsicDuration) && intrinsicDuration > 0 ? intrinsicDuration : parseStrictFiniteTimingNumber(durationRaw) ?? 0,
@@ -6966,7 +7004,14 @@ async function discoverMediaFromBrowser(page) {
6966
7004
  if (name === "data-media-start") return mediaStartRaw;
6967
7005
  return null;
6968
7006
  }
6969
- })
7007
+ }),
7008
+ playbackRate: resolveRateSpec(
7009
+ automationRaw,
7010
+ readPlaybackRate(
7011
+ (name) => name === "data-playback-rate" ? playbackRateRaw : null,
7012
+ defaultPlaybackRate
7013
+ )
7014
+ )
6970
7015
  })
6971
7016
  );
6972
7017
  }
@@ -7434,16 +7479,28 @@ function authoredMediaStarts(html) {
7434
7479
  }
7435
7480
  return starts;
7436
7481
  }
7437
- function adoptRuntimeMediaStart(composition, el, authored) {
7482
+ function isVideoAudio(audio, videoId) {
7483
+ return audio.type === "video" && audio.id === videoAudioId(videoId);
7484
+ }
7485
+ function adoptRuntimeMediaTiming(composition, el, authored) {
7438
7486
  const shift = el.mediaStart - authored;
7439
- if (el.mediaStart <= 0 || Math.abs(shift) <= BROWSER_MEDIA_EPSILON) return;
7440
7487
  const entries = el.tagName === "video" ? [
7441
7488
  ...composition.videos.filter((video) => video.id === el.id),
7442
- ...composition.audios.filter(
7443
- (audio) => audio.type === "video" && audio.id === `${el.id}-audio`
7444
- )
7489
+ ...composition.audios.filter((audio) => isVideoAudio(audio, el.id))
7445
7490
  ] : composition.audios.filter((audio) => audio.type !== "video" && audio.id === el.id);
7446
- for (const entry of entries) entry.mediaStart += shift;
7491
+ for (const entry of entries) {
7492
+ if (typeof entry.playbackRate !== "object") {
7493
+ if (typeof el.playbackRate === "object") {
7494
+ const consumed = Math.max(0, entry.mediaStart - authored);
7495
+ const head = timeAtSourceTime(normalizeRateSpec(entry.playbackRate), consumed);
7496
+ entry.mediaStart += sourceTimeAt(el.playbackRate, head) - consumed;
7497
+ entry.playbackRate = shiftRateLane(el.playbackRate, head);
7498
+ } else {
7499
+ entry.playbackRate = el.playbackRate;
7500
+ }
7501
+ }
7502
+ if (el.mediaStart > 0 && Math.abs(shift) > BROWSER_MEDIA_EPSILON) entry.mediaStart += shift;
7503
+ }
7447
7504
  }
7448
7505
  function reconcileBrowserMediaEnd(existingEnd, projectedEnd, sourceChanged, durationInferred) {
7449
7506
  if (projectedEnd <= 0) return existingEnd;
@@ -7727,7 +7784,7 @@ async function runProbeStage(input) {
7727
7784
  sourceChanged,
7728
7785
  el.durationInferred
7729
7786
  );
7730
- adoptRuntimeMediaStart(
7787
+ adoptRuntimeMediaTiming(
7731
7788
  composition,
7732
7789
  el,
7733
7790
  authoredStarts.get(el.id) ?? existing.mediaStart
@@ -7750,6 +7807,7 @@ async function runProbeStage(input) {
7750
7807
  start: el.start,
7751
7808
  end: resolveBrowserMediaEnd(el.start, el.end, el.duration),
7752
7809
  mediaStart: el.mediaStart,
7810
+ playbackRate: el.playbackRate,
7753
7811
  loop: el.loop,
7754
7812
  hasAudio: el.hasAudio && !el.muted
7755
7813
  });
@@ -7774,7 +7832,7 @@ async function runProbeStage(input) {
7774
7832
  sourceChanged,
7775
7833
  el.durationInferred
7776
7834
  );
7777
- adoptRuntimeMediaStart(
7835
+ adoptRuntimeMediaTiming(
7778
7836
  composition,
7779
7837
  el,
7780
7838
  authoredStarts.get(el.id) ?? existing.mediaStart
@@ -7792,6 +7850,7 @@ async function runProbeStage(input) {
7792
7850
  end: resolveBrowserMediaEnd(el.start, el.end, el.duration),
7793
7851
  mediaStart: el.mediaStart,
7794
7852
  loop: el.loop,
7853
+ playbackRate: el.playbackRate,
7795
7854
  layer: 0,
7796
7855
  volume: el.volume,
7797
7856
  type: "audio"
@@ -8389,7 +8448,7 @@ function appendAutoDetectedVideoAudio(composition, extracted) {
8389
8448
  const video = composition.videos.find((v) => v.id === ext.videoId);
8390
8449
  if (!video || !video.hasAudio || video.hidden || existingAudioSrcs.has(video.src)) continue;
8391
8450
  composition.audios.push({
8392
- id: `${video.id}-audio`,
8451
+ id: videoAudioId(video.id),
8393
8452
  src: video.src,
8394
8453
  start: video.start,
8395
8454
  end: video.end,
@@ -11340,13 +11399,36 @@ function colorGradingValueHasLut(rawAttributeValue) {
11340
11399
  return false;
11341
11400
  }
11342
11401
  }
11343
- async function resolveCompositionElementCount(probeSession, html) {
11402
+ var PROBE_READ_TIMEOUT_MS = 5e3;
11403
+ async function evaluateWithinBound(page, fn, what, log) {
11404
+ let timer;
11405
+ const timedOut = new Promise((_, reject) => {
11406
+ timer = setTimeout(
11407
+ () => reject(new Error(`no answer within ${PROBE_READ_TIMEOUT_MS} ms (page busy)`)),
11408
+ PROBE_READ_TIMEOUT_MS
11409
+ );
11410
+ });
11411
+ try {
11412
+ return await Promise.race([page.evaluate(fn), timedOut]);
11413
+ } catch (err) {
11414
+ log.warn(`[Render] live ${what} read skipped; using the static answer`, {
11415
+ error: err instanceof Error ? err.message : String(err)
11416
+ });
11417
+ throw err;
11418
+ } finally {
11419
+ clearTimeout(timer);
11420
+ }
11421
+ }
11422
+ async function resolveCompositionElementCount(probeSession, html, log = defaultLogger) {
11344
11423
  if (probeSession?.isInitialized) {
11345
11424
  try {
11346
- const liveCount = await probeSession.page.evaluate(
11425
+ const liveCount = await evaluateWithinBound(
11426
+ probeSession.page,
11347
11427
  // Live HTMLCollection length — avoids materializing a static NodeList
11348
11428
  // on the large-DOM comps this gate exists to catch (review nit).
11349
- () => document.getElementsByTagName("*").length
11429
+ () => document.getElementsByTagName("*").length,
11430
+ "element count",
11431
+ log
11350
11432
  );
11351
11433
  if (typeof liveCount === "number" && Number.isFinite(liveCount)) {
11352
11434
  return { count: liveCount, source: "live" };
@@ -11434,11 +11516,11 @@ function probeAdaptersUsed() {
11434
11516
  }
11435
11517
  return used;
11436
11518
  }
11437
- async function resolveAdaptersUsed(probeSession, html) {
11519
+ async function resolveAdaptersUsed(probeSession, html, log = defaultLogger) {
11438
11520
  const staticAdapters = detectAdaptersStatic(html);
11439
11521
  if (!probeSession?.isInitialized) return staticAdapters;
11440
11522
  try {
11441
- const live = await probeSession.page.evaluate(probeAdaptersUsed);
11523
+ const live = await evaluateWithinBound(probeSession.page, probeAdaptersUsed, "adapters", log);
11442
11524
  if (!Array.isArray(live)) return staticAdapters;
11443
11525
  const detected = /* @__PURE__ */ new Set([...staticAdapters, ...live]);
11444
11526
  return KNOWN_RUNTIME_ADAPTERS.filter((name) => detected.has(name));
@@ -11696,7 +11778,10 @@ async function executeRenderPipeline(input) {
11696
11778
  );
11697
11779
  const artifactTransaction = new ArtifactTransaction(
11698
11780
  outputPath,
11699
- isPngSequence || isHls ? "directory" : "file"
11781
+ isPngSequence || isHls ? "directory" : "file",
11782
+ void 0,
11783
+ void 0,
11784
+ log
11700
11785
  );
11701
11786
  const stagedOutputPath = artifactTransaction.stagingPath;
11702
11787
  const needsAlpha = outputNeedsAlpha(outputFormat);
@@ -12195,8 +12280,8 @@ async function executeRenderPipeline(input) {
12195
12280
  vfxHostCount,
12196
12281
  vfxCapture,
12197
12282
  vfxTypes
12198
- } = await resolveCompositionElementCount(probeSession, compiled.html);
12199
- const adaptersUsed = await resolveAdaptersUsed(probeSession, compiled.html);
12283
+ } = await resolveCompositionElementCount(probeSession, compiled.html, log);
12284
+ const adaptersUsed = await resolveAdaptersUsed(probeSession, compiled.html, log);
12200
12285
  const deShortBandEnabled = deShortBandMaxElements > 0;
12201
12286
  const deShortBandOpen = deShortBandEnabled && deShortBandMinFrames > 0 && compositionElementCountSource === "live" && compositionElementCount <= deShortBandMaxElements;
12202
12287
  const deShortBandRoute = process.env.HF_DE_SHORT_BAND_ROUTE === "true";
@@ -15560,7 +15645,7 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15560
15645
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15561
15646
  if (probeResult.probeSession) {
15562
15647
  try {
15563
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-BH5NICGQ.js");
15648
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-HITT6NWG.js");
15564
15649
  await closeCaptureSession2(probeResult.probeSession);
15565
15650
  } catch (err) {
15566
15651
  log.warn("[plan] probe session close failed", {
@@ -17213,7 +17298,7 @@ function startServer(options = {}) {
17213
17298
  });
17214
17299
  async function shutdown(signal) {
17215
17300
  log.info(`Received ${signal}, shutting down`);
17216
- const { drainBrowserPool } = await import("./src-BH5NICGQ.js");
17301
+ const { drainBrowserPool } = await import("./src-HITT6NWG.js");
17217
17302
  await drainBrowserPool().catch(() => {
17218
17303
  });
17219
17304
  const handle = await Promise.race([
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-442JNXRM.js";
10
10
  import {
11
11
  quantizePreviewProxyBox
12
- } from "./chunk-7HTH5PFK.js";
12
+ } from "./chunk-JVTWX5G3.js";
13
13
 
14
14
  // src/utils/compositionViewport.ts
15
15
  var DEFAULT_VIEWPORT = { width: 1920, height: 1080 };
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  getMimeType,
9
9
  injectMediaCodecMapIntoHtml
10
- } from "./chunk-UNATIAOT.js";
10
+ } from "./chunk-JXTPNUSO.js";
11
11
  import {
12
12
  PROXY_VARIANT_CONFIG,
13
13
  ProxyCapacityError,
@@ -18,17 +18,17 @@ import {
18
18
  recordProxyRequest,
19
19
  resolveProxy,
20
20
  resolveProxyVariantRequest
21
- } from "./chunk-7YSFE4SZ.js";
21
+ } from "./chunk-MCFPMUMT.js";
22
22
  import {
23
23
  findStageProxyBox
24
- } from "./chunk-4TKJWWPL.js";
24
+ } from "./chunk-VHIBBDEI.js";
25
25
  import {
26
26
  resolveAutoProxy
27
- } from "./chunk-6XUJVEY2.js";
27
+ } from "./chunk-B3GG3HJB.js";
28
28
  import {
29
29
  PREVIEW_PROXY_BOX_PARAM,
30
30
  parsePreviewProxyBox
31
- } from "./chunk-7HTH5PFK.js";
31
+ } from "./chunk-JVTWX5G3.js";
32
32
  import {
33
33
  decodeWellFormedEscapes
34
34
  } from "./chunk-BSQ7XANM.js";
@@ -6,10 +6,10 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  detectGpuEncoder
9
- } from "./chunk-L4JB7LI4.js";
9
+ } from "./chunk-52YJKWV3.js";
10
10
  import {
11
11
  runCancellableProcess
12
- } from "./chunk-RWGASWT7.js";
12
+ } from "./chunk-BL4U6U52.js";
13
13
  import {
14
14
  findFfBinary
15
15
  } from "./chunk-VAS6HQX3.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-WQ6ZXHFQ.js";
10
10
  import {
11
11
  findFFmpeg
12
- } from "./chunk-DYNHVCBF.js";
12
+ } from "./chunk-XYGULBFV.js";
13
13
  import {
14
14
  stoppableExecFile
15
15
  } from "./chunk-HU2SPFNG.js";
@@ -6,35 +6,35 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  redactHome
9
- } from "./chunk-GR5DQKDR.js";
9
+ } from "./chunk-HG5ECUOR.js";
10
10
  import "./chunk-Z27A7NUB.js";
11
11
  import "./chunk-5ETJX6WM.js";
12
- import "./chunk-2NERNYCJ.js";
12
+ import "./chunk-HPGQPRHY.js";
13
13
  import "./chunk-EXAX37XR.js";
14
14
  import "./chunk-6BEFEWFB.js";
15
- import "./chunk-DYNHVCBF.js";
15
+ import "./chunk-XYGULBFV.js";
16
16
  import {
17
17
  loadProducer
18
- } from "./chunk-CGTZOY53.js";
19
- import "./chunk-UNATIAOT.js";
20
- import "./chunk-XQPA4W3M.js";
18
+ } from "./chunk-4GMDL4N5.js";
19
+ import "./chunk-JXTPNUSO.js";
20
+ import "./chunk-JU4T4VAA.js";
21
21
  import "./chunk-6JR2XUEE.js";
22
- import "./chunk-FBVUAH7N.js";
22
+ import "./chunk-2OYYNKJ4.js";
23
23
  import {
24
24
  DEFAULT_HISTORY_ROOT,
25
25
  listProjectHistories,
26
26
  pruneGoneProjectHistories,
27
27
  reclaimUncopiedBlobs
28
- } from "./chunk-C4Y3ZREE.js";
28
+ } from "./chunk-OJNNKHAZ.js";
29
29
  import {
30
30
  CACHE_DIR_NAME,
31
31
  cleanupProxyCache
32
- } from "./chunk-7YSFE4SZ.js";
32
+ } from "./chunk-MCFPMUMT.js";
33
33
  import "./chunk-ALVXFXUG.js";
34
34
  import {
35
35
  formatBytes
36
36
  } from "./chunk-K2FLNJVB.js";
37
- import "./chunk-E3P3LJG6.js";
37
+ import "./chunk-FLREUEHW.js";
38
38
  import "./chunk-EOVYQ3IG.js";
39
39
  import {
40
40
  defineCommand
@@ -53,26 +53,27 @@ import {
53
53
  directorySizeBytes,
54
54
  gcExtractionCache,
55
55
  resolveExtractCacheDir
56
- } from "./chunk-L4JB7LI4.js";
56
+ } from "./chunk-52YJKWV3.js";
57
57
  import "./chunk-IZCW2NKT.js";
58
- import "./chunk-7HTH5PFK.js";
58
+ import "./chunk-JVTWX5G3.js";
59
59
  import "./chunk-RQVDTPGD.js";
60
- import "./chunk-3W4B6G7Y.js";
61
- import "./chunk-USWPZXEA.js";
60
+ import "./chunk-GAFEU6AB.js";
61
+ import "./chunk-2D5WP2NI.js";
62
62
  import "./chunk-VC76R6W2.js";
63
63
  import "./chunk-X7HBSTCZ.js";
64
- import "./chunk-2MCXIY4B.js";
64
+ import "./chunk-B7RJV74O.js";
65
65
  import "./chunk-OFQWTKPW.js";
66
66
  import "./chunk-DPVXBVLL.js";
67
67
  import "./chunk-3GXQPCJC.js";
68
68
  import "./chunk-634HSJ3J.js";
69
69
  import "./chunk-FXMKHHPO.js";
70
- import "./chunk-DIKAPMMF.js";
71
- import "./chunk-RWGASWT7.js";
70
+ import "./chunk-GQVTTWZF.js";
71
+ import "./chunk-BL4U6U52.js";
72
72
  import "./chunk-T6AGUTZJ.js";
73
73
  import "./chunk-XT6MXC7A.js";
74
+ import "./chunk-K4MJX7SR.js";
74
75
  import "./chunk-4UMPIPCQ.js";
75
- import "./chunk-2VXY3PEF.js";
76
+ import "./chunk-K2VXPQKC.js";
76
77
  import "./chunk-VAS6HQX3.js";
77
78
  import "./chunk-6BNTGNGD.js";
78
79
  import "./chunk-CZGHFATT.js";
@@ -85,12 +86,12 @@ import "./chunk-RXATE6FZ.js";
85
86
  import "./chunk-W2LGJSEN.js";
86
87
  import {
87
88
  withMeta
88
- } from "./chunk-TZEKVLPV.js";
89
+ } from "./chunk-SNECH6QA.js";
89
90
  import "./chunk-K4WIOZFP.js";
90
91
  import "./chunk-6NLPPKBO.js";
91
92
  import "./chunk-WERLJGIC.js";
92
93
  import "./chunk-ISN5GRYI.js";
93
- import "./chunk-LFUVTS6V.js";
94
+ import "./chunk-EY7GKVPS.js";
94
95
  import "./chunk-T2EUWCJE.js";
95
96
  import "./chunk-KGPLIH7B.js";
96
97
  import "./chunk-M2WBOQ2Q.js";