hyperframes 0.8.189 → 0.8.191

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 (181) hide show
  1. package/dist/{add-TIKUM2YX.js → add-S2ZQYG52.js} +11 -11
  2. package/dist/{animatedGifPrep-25X4G5IE.js → animatedGifPrep-3JA2CQ3U.js} +6 -6
  3. package/dist/api.js +14 -14
  4. package/dist/{asset-TPKLIP4R.js → asset-2CNTAPOC.js} +2 -2
  5. package/dist/{assetCataloger-PQAIV3FI.js → assetCataloger-5HXLXL7C.js} +6 -6
  6. package/dist/{audio-6RLPKB5X.js → audio-DZTSYHXS.js} +12 -12
  7. package/dist/{auth-O7QSTP6Y.js → auth-GX3M6TJ4.js} +1 -1
  8. package/dist/{autoUpdate-TIEJODP7.js → autoUpdate-EDIWE4Z5.js} +2 -2
  9. package/dist/{backgroundChecks-K2AXYDYG.js → backgroundChecks-VPUPJ7UI.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-ORVWYJAH.js → batchRender-JHIIDBJR.js} +3 -3
  12. package/dist/{beats-2VTB2ATR.js → beats-PZRVTRYW.js} +4 -4
  13. package/dist/{benchmark-NLNBL6YR.js → benchmark-22UFDW2N.js} +8 -8
  14. package/dist/{browser-M5UV6VJB.js → browser-VRDWYIUM.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-EDD2XDS2.js → bundleWithLocalizedFonts-23QDKFSN.js} +2 -2
  16. package/dist/{capture-WHWEE5FE.js → capture-NFCBXHDE.js} +2 -2
  17. package/dist/{capture-JSYVNFKO.js → capture-TOCLXYMJ.js} +9 -9
  18. package/dist/{captureCompositionFrame-JANGQCIA.js → captureCompositionFrame-BEM6MF7F.js} +13 -11
  19. package/dist/{catalog-MPOOKNSZ.js → catalog-NXS35KM7.js} +11 -11
  20. package/dist/{catch-up-6KZV3UMZ.js → catch-up-6WJBUI2C.js} +4 -4
  21. package/dist/{check-G273NWK7.js → check-WVEBMWN5.js} +33 -33
  22. package/dist/{checkBrowser-G53E2ZQI.js → checkBrowser-RT45HJ36.js} +28 -28
  23. package/dist/{chunk-ZPMF6GAQ.js → chunk-2WNVHZHA.js} +11 -7
  24. package/dist/{chunk-TSFA2Y5C.js → chunk-3NRB7YXW.js} +3 -2
  25. package/dist/{chunk-44TJOEH5.js → chunk-3WJT2JCX.js} +32 -25
  26. package/dist/{chunk-VRQU564T.js → chunk-3XI7MIZB.js} +1 -1
  27. package/dist/{chunk-AYBKDHYD.js → chunk-7A65UCMI.js} +1 -1
  28. package/dist/{chunk-HUG47UEE.js → chunk-7FF36MAD.js} +1 -1
  29. package/dist/{chunk-6RA4TWGV.js → chunk-7LUJE3II.js} +1 -1
  30. package/dist/{chunk-GWYMAII7.js → chunk-7NKJS5KM.js} +1 -1
  31. package/dist/{chunk-37EPEFXM.js → chunk-7ZJEQY7Q.js} +1 -1
  32. package/dist/{chunk-AQ3L7DVB.js → chunk-ALEF2F5N.js} +2 -2
  33. package/dist/{chunk-74Y43RJZ.js → chunk-AQB5M53R.js} +3 -3
  34. package/dist/{chunk-M6FHSQZ3.js → chunk-BFFLKQVB.js} +3 -3
  35. package/dist/{chunk-CTF7BYCV.js → chunk-CINKQY6M.js} +3 -3
  36. package/dist/{chunk-BZQLTNMB.js → chunk-COETAXRN.js} +1 -1
  37. package/dist/{chunk-SGFMCNLY.js → chunk-COWQITWP.js} +1 -1
  38. package/dist/{chunk-3X6LH25W.js → chunk-CXMXJEVY.js} +1 -1
  39. package/dist/{chunk-NDBWI7OA.js → chunk-DOOSC34Z.js} +5 -5
  40. package/dist/{chunk-F45HHA3M.js → chunk-EFCKV7MY.js} +1 -1
  41. package/dist/{chunk-R5FS7GFU.js → chunk-FBDOHH3Q.js} +1 -1
  42. package/dist/{chunk-3OLOVRWS.js → chunk-GLG5JWLI.js} +1 -1
  43. package/dist/{chunk-WYCFMNU3.js → chunk-GM3WIOO6.js} +1 -1
  44. package/dist/{chunk-FJF5JBYU.js → chunk-HYW6HTAK.js} +1 -1
  45. package/dist/{chunk-KS4HMJJD.js → chunk-JGTRVG32.js} +1 -1
  46. package/dist/{chunk-Z2BW2WJS.js → chunk-JJJCFKMF.js} +1 -1
  47. package/dist/{chunk-4DZ3HBKF.js → chunk-JOLZ3BSL.js} +1 -1
  48. package/dist/{chunk-IFXOMIBP.js → chunk-JTPHFYZI.js} +3 -3
  49. package/dist/{chunk-TREMHDWT.js → chunk-JYSSPQDT.js} +56 -21
  50. package/dist/{chunk-OHXHBMF4.js → chunk-KAC2WR7P.js} +1 -1
  51. package/dist/{chunk-JZDVIDFH.js → chunk-KGMHMYWI.js} +2 -2
  52. package/dist/{chunk-2CYM34M7.js → chunk-KHCTBZGJ.js} +3 -3
  53. package/dist/{chunk-TPTQHOXU.js → chunk-KV72BP7O.js} +9 -9
  54. package/dist/{chunk-5HJJEHGE.js → chunk-LBNEH6IQ.js} +1 -1
  55. package/dist/chunk-LM265QNK.js +3896 -0
  56. package/dist/{chunk-ASZ4IQB4.js → chunk-MSM6VRQ4.js} +2 -2
  57. package/dist/{chunk-GBT7P3OQ.js → chunk-NJGTNWQY.js} +5 -5
  58. package/dist/{chunk-HXM2ISEK.js → chunk-NMDUSCCE.js} +377 -233
  59. package/dist/{chunk-5544QB3U.js → chunk-OV6KHXLX.js} +1 -1
  60. package/dist/{chunk-QYQ2EYOI.js → chunk-RE3EEBWC.js} +3 -3
  61. package/dist/{chunk-XJVXROOL.js → chunk-RQBB7PYT.js} +2 -2
  62. package/dist/{chunk-TFUAKV6O.js → chunk-RWYUK7LM.js} +1 -1
  63. package/dist/{chunk-JIPUWKLA.js → chunk-SMEF3TRJ.js} +26 -14
  64. package/dist/{chunk-CSYSEPWL.js → chunk-T5YF32WV.js} +5 -5
  65. package/dist/{chunk-B634ZCY2.js → chunk-TADJOIFW.js} +1 -1
  66. package/dist/{chunk-IPEP346Y.js → chunk-TFGO5YMI.js} +1 -1
  67. package/dist/{chunk-HQIFMCQN.js → chunk-TFMZ4RKM.js} +85 -38
  68. package/dist/{chunk-565X6Q4X.js → chunk-TJKE4EYX.js} +16 -8
  69. package/dist/{chunk-WMJJCHVQ.js → chunk-TRZVS6TL.js} +2 -2
  70. package/dist/{chunk-NSJ5HD6A.js → chunk-U5GTDAQL.js} +5 -5
  71. package/dist/{chunk-4QFKGRTB.js → chunk-UNR3P7IF.js} +2 -2
  72. package/dist/{chunk-SMF6YAUL.js → chunk-VYQYVYQ5.js} +2 -2
  73. package/dist/{chunk-T37XXYRK.js → chunk-W3CS2KFV.js} +1 -1
  74. package/dist/{chunk-KLWUB37U.js → chunk-WHAEJX26.js} +7 -7
  75. package/dist/{chunk-ANYBRVPF.js → chunk-WJEVUPVD.js} +1 -1
  76. package/dist/{chunk-QMFI4N7J.js → chunk-WQ3X5OH4.js} +1 -1
  77. package/dist/{chunk-HNMDLKA4.js → chunk-WY3TQ2PT.js} +1 -1
  78. package/dist/{chunk-B52BJM5K.js → chunk-XMSQRDAK.js} +2 -2
  79. package/dist/{chunk-E7TI5PAQ.js → chunk-XWOCXIKR.js} +1 -1
  80. package/dist/{chunk-E676Y7AY.js → chunk-ZHKUIC7X.js} +42 -14
  81. package/dist/{clean-PS4VYGQ6.js → clean-3VIU2BSK.js} +14 -14
  82. package/dist/cli.js +53 -53
  83. package/dist/{cloud-E47CE5VQ.js → cloud-NA3J4XW2.js} +4 -4
  84. package/dist/{cloudrun-3J4SQBXE.js → cloudrun-4MHOF7UT.js} +4 -4
  85. package/dist/commands/layout-audit.browser.js +64 -3
  86. package/dist/{compare-EAKHXBDO.js → compare-ZR7XRPPT.js} +29 -26
  87. package/dist/{compiler-23MT6CX6.js → compiler-MA2ELZPG.js} +3 -3
  88. package/dist/{component-QBOXYJJS.js → component-ZJSOPUAM.js} +3 -3
  89. package/dist/{compositions-QC3EO3MJ.js → compositions-WA5V2SHF.js} +10 -10
  90. package/dist/{delete-TXEOLPC6.js → delete-UC427UEA.js} +2 -2
  91. package/dist/{deploy-3B3WJ6PM.js → deploy-B5UO4UIK.js} +1 -1
  92. package/dist/{dist-F4UJFK4S.js → dist-BPK37SAB.js} +2 -2
  93. package/dist/{dist-JH32CBQL.js → dist-XGPSPKKP.js} +1 -1
  94. package/dist/docs/rendering.md +2 -2
  95. package/dist/{doctor-2CRFH4B3.js → doctor-ZERCTKEK.js} +10 -10
  96. package/dist/{events-GUIOSBIB.js → events-CNIXB2QK.js} +3 -3
  97. package/dist/{events-KVTX3QFV.js → events-DCOZQERS.js} +2 -2
  98. package/dist/{feedback-VQIOSTIB.js → feedback-YBD5ITTY.js} +6 -6
  99. package/dist/{ffmpeg-BPCZGXFW.js → ffmpeg-V4BBFDTG.js} +6 -6
  100. package/dist/{figma-QIOKCH26.js → figma-Z45ZYVGE.js} +3 -3
  101. package/dist/fontLocalizeCli.js +8 -8
  102. package/dist/{get-TU45SNXF.js → get-23NXQWCD.js} +2 -2
  103. package/dist/{gpuPolicy-AWAJBGYY.js → gpuPolicy-H6ABHVEB.js} +6 -6
  104. package/dist/{grade-compare-LDNUXX3Q.js → grade-compare-ZPX2G3UV.js} +26 -26
  105. package/dist/{help-YUCHJKKL.js → help-EP4CDPLO.js} +1 -1
  106. package/dist/{history-MMHFUMIG.js → history-E5OSXO74.js} +6 -6
  107. package/dist/hyperframe.manifest.json +1 -1
  108. package/dist/hyperframe.runtime.iife.js +61 -61
  109. package/dist/hyperframes-player.global.js +3 -3
  110. package/dist/{info-HBHOFSC2.js → info-2HHGSW5H.js} +7 -7
  111. package/dist/{init-3E4GUXIZ.js → init-ENEG6RZT.js} +26 -26
  112. package/dist/{inspect-YNUPJVIH.js → inspect-PVQK4E2A.js} +26 -26
  113. package/dist/{installer-WLCRP33K.js → installer-YGGLEOSF.js} +4 -4
  114. package/dist/{keyframes-Z47GHCGO.js → keyframes-UWSYS2SL.js} +6 -6
  115. package/dist/{lambda-CA4PEUO2.js → lambda-L3LPXC2M.js} +7 -7
  116. package/dist/{layout-YPV6PIKF.js → layout-JVL4QREC.js} +26 -26
  117. package/dist/{lint-3AVVQ74A.js → lint-JXQ72DDB.js} +7 -7
  118. package/dist/{lintProject-XM3DLUKG.js → lintProject-F7IC7WY4.js} +1 -1
  119. package/dist/{list-JH52Y735.js → list-UFMLM3VV.js} +2 -2
  120. package/dist/{login-G7NPJUAW.js → login-CKGMWQJN.js} +4 -4
  121. package/dist/{manager-2LSMMZY4.js → manager-U6OP3EXB.js} +7 -7
  122. package/dist/{media-treatment-BVMMD5EN.js → media-treatment-MFMEWCDY.js} +12 -12
  123. package/dist/{models-P3TNRVRV.js → models-QA3TJ75Y.js} +10 -10
  124. package/dist/{motionShot-LK62QHNE.js → motionShot-NV2OPJHD.js} +14 -14
  125. package/dist/{normalize-audio-Y7BAQ7AR.js → normalize-audio-JWJRUKK2.js} +4 -4
  126. package/dist/{open-CCFFLAT7.js → open-PTJNDRER.js} +11 -11
  127. package/dist/{parakeetRunner-N2BWSOSD.js → parakeetRunner-B5FCWWOO.js} +11 -11
  128. package/dist/{pipeline-3VT2DQGU.js → pipeline-N26NA6ZG.js} +7 -7
  129. package/dist/{play-G4I5IFHO.js → play-45D6X6TV.js} +17 -17
  130. package/dist/{preflight-2KU2QLCZ.js → preflight-MFOHPUOI.js} +7 -7
  131. package/dist/{present-EJ7XHGQO.js → present-IFBUDI4D.js} +13 -13
  132. package/dist/{preview-O23BYFAY.js → preview-MQRLXQOV.js} +18 -17
  133. package/dist/{producer-UJQVLKLP.js → producer-2QG7HLAW.js} +1 -1
  134. package/dist/{projectConfig-QFVIBT37.js → projectConfig-I4FTZXHB.js} +6 -6
  135. package/dist/{publication-4UYGFB2X.js → publication-3GOFXCGU.js} +2 -2
  136. package/dist/{publish-MHLVJLCR.js → publish-3B2TZCFH.js} +8 -8
  137. package/dist/{remove-background-N7AHTZWP.js → remove-background-RK4BJDBF.js} +8 -8
  138. package/dist/{render-6HQV4LZJ.js → render-BV6FWFX3.js} +7 -6
  139. package/dist/{render-EI2ODKOP.js → render-PW3XGS7B.js} +28 -28
  140. package/dist/{render-CDATEVDJ.js → render-SJ4HFPFU.js} +13 -13
  141. package/dist/{render-batch-F7HMC7XH.js → render-batch-GKX54O6N.js} +7 -6
  142. package/dist/renderSetupWorker.js +1 -1
  143. package/dist/{resolver-63DB5JCY.js → resolver-RQJ7CNXD.js} +4 -4
  144. package/dist/{sherpa-AK3MTPL3.js → sherpa-XZPG7QFF.js} +10 -10
  145. package/dist/{sites-5PWHAMEG.js → sites-Q2S3DZY4.js} +2 -1
  146. package/dist/skills/hyperframes/references/captions.md +1 -1
  147. package/dist/skills/hyperframes/references/motion.md +1 -1
  148. package/dist/skills/hyperframes-cli/references/cloudrun.md +1 -1
  149. package/dist/skills/hyperframes-cli/references/lambda.md +1 -1
  150. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +2 -2
  151. package/dist/skills/hyperframes-cli/references/preview-render.md +1 -1
  152. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +0 -8
  153. package/dist/skills/media-use/audio/references/transcribe.md +2 -2
  154. package/dist/skills/media-use/references/audio.md +1 -1
  155. package/dist/{skills-EVIDL7PV.js → skills-EYLB2V6F.js} +5 -5
  156. package/dist/{skillsUpdateCheck-YCNJYDJO.js → skillsUpdateCheck-TE6K5ROM.js} +3 -3
  157. package/dist/{snapshot-WSYZKR3C.js → snapshot-FE4T3SCN.js} +48 -33
  158. package/dist/{src-KTD6WTEV.js → src-SEJ7LNNB.js} +7 -7
  159. package/dist/{src-YNXBU4ZQ.js → src-ZOXSEJCD.js} +5 -5
  160. package/dist/{staticProjectServer-D2D3BKBP.js → staticProjectServer-LSVIRDRO.js} +14 -14
  161. package/dist/studio/assets/{hyperframes-player-CkK8Zijf.js → hyperframes-player-Bv9hQ3v7.js} +1 -1
  162. package/dist/studio/assets/index-CBO8uz7-.css +1 -0
  163. package/dist/studio/assets/{index-B2JcCaRF.js → index-D_QqfWhx.js} +133 -132
  164. package/dist/studio/assets/{index-ATnRoBug.js → index-Df14bh-L.js} +1 -1
  165. package/dist/studio/index.html +2 -2
  166. package/dist/{studio-api-3ZGQPE5J.js → studio-api-SL2Z76NU.js} +7 -7
  167. package/dist/{studioServer-VWM4J7ZP.js → studioServer-BADWVIHU.js} +44 -44
  168. package/dist/{telemetry-BEVI64BB.js → telemetry-RN6VYEID.js} +3 -3
  169. package/dist/{timeline-P57FUXJQ.js → timeline-JBTCIPLU.js} +15 -15
  170. package/dist/{tokens-OUQY6LPD.js → tokens-A7V7UHNK.js} +2 -2
  171. package/dist/{transcribe-CK66VIU4.js → transcribe-E4BOSNM4.js} +9 -9
  172. package/dist/{transcribe-QUPX67KC.js → transcribe-NTUCJGFI.js} +16 -16
  173. package/dist/{updateCheck-XZ43CH3L.js → updateCheck-M7UAYLUR.js} +2 -2
  174. package/dist/{upgrade-7QQNGI7I.js → upgrade-A2COSIMB.js} +2 -2
  175. package/dist/{urlDownloader-ESAEL6YX.js → urlDownloader-MBSQYART.js} +5 -5
  176. package/dist/{validate-5GZ6KFRU.js → validate-NODZYBHY.js} +20 -20
  177. package/dist/{video-AQNVR6PE.js → video-LBCUUYK7.js} +6 -6
  178. package/dist/warmCheck.js +33 -33
  179. package/package.json +1 -1
  180. package/dist/chunk-BPX7LZG6.js +0 -3896
  181. package/dist/studio/assets/index-CESvLzz0.css +0 -1
@@ -10,7 +10,7 @@ import {
10
10
  isDevice,
11
11
  isQuality,
12
12
  render
13
- } from "./chunk-IFXOMIBP.js";
13
+ } from "./chunk-JTPHFYZI.js";
14
14
 
15
15
  // src/api/removeBackground.ts
16
16
  import { resolve } from "path";
@@ -7,10 +7,10 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  parseFeedbackRating,
9
9
  trackRenderFeedback
10
- } from "./chunk-IPEP346Y.js";
10
+ } from "./chunk-TFGO5YMI.js";
11
11
  import {
12
12
  shouldTrack
13
- } from "./chunk-T37XXYRK.js";
13
+ } from "./chunk-W3CS2KFV.js";
14
14
  import {
15
15
  c
16
16
  } from "./chunk-ZTZA4UWZ.js";
@@ -84,7 +84,7 @@ async function getDoctorSummary() {
84
84
  try {
85
85
  const [{ getSystemMeta }, { findFFmpeg }] = await Promise.all([
86
86
  import("./system-7F3UEHQT.js"),
87
- import("./ffmpeg-BPCZGXFW.js")
87
+ import("./ffmpeg-V4BBFDTG.js")
88
88
  ]);
89
89
  const sys = getSystemMeta();
90
90
  const parts = [
@@ -8,10 +8,10 @@ import {
8
8
  DEFAULT_VP9_CPU_USED,
9
9
  isHttpUrl,
10
10
  runFfmpeg
11
- } from "./chunk-HXM2ISEK.js";
11
+ } from "./chunk-NMDUSCCE.js";
12
12
  import {
13
13
  parseAnimatedGifMetadata
14
- } from "./chunk-WYCFMNU3.js";
14
+ } from "./chunk-GM3WIOO6.js";
15
15
  import {
16
16
  parseHTML
17
17
  } from "./chunk-SDYDNHEE.js";
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  setHostHandlesSigint
9
- } from "./chunk-HXM2ISEK.js";
9
+ } from "./chunk-NMDUSCCE.js";
10
10
  import {
11
11
  processAncestorSnapshot,
12
12
  processIdentity,
@@ -6,23 +6,23 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-37EPEFXM.js";
9
+ } from "./chunk-7ZJEQY7Q.js";
10
10
  import {
11
11
  installPageFunctionGuard,
12
12
  resolveCliChromeGpuMode,
13
13
  seekCompositionTimeline,
14
14
  waitForRuntimeReady
15
- } from "./chunk-TREMHDWT.js";
15
+ } from "./chunk-JYSSPQDT.js";
16
16
  import {
17
17
  launchManagedBrowser,
18
18
  resolveManagedGpuMode
19
- } from "./chunk-HNMDLKA4.js";
19
+ } from "./chunk-WY3TQ2PT.js";
20
20
  import {
21
21
  pageNavigationTimeoutMs
22
- } from "./chunk-565X6Q4X.js";
22
+ } from "./chunk-TJKE4EYX.js";
23
23
  import {
24
24
  resolveCompositionViewportFromHtml
25
- } from "./chunk-SGFMCNLY.js";
25
+ } from "./chunk-COWQITWP.js";
26
26
  import {
27
27
  defineCommand
28
28
  } from "./chunk-S3S4TGEH.js";
@@ -33,13 +33,16 @@ import {
33
33
  import {
34
34
  c
35
35
  } from "./chunk-ZTZA4UWZ.js";
36
+ import {
37
+ resolveNaturalMediaTimelineDuration
38
+ } from "./chunk-LM265QNK.js";
36
39
  import {
37
40
  decodeWellFormedEscapes
38
41
  } from "./chunk-BSQ7XANM.js";
39
42
  import {
40
43
  printDeprecationNotice,
41
44
  withMeta
42
- } from "./chunk-OHXHBMF4.js";
45
+ } from "./chunk-KAC2WR7P.js";
43
46
  import {
44
47
  normalizeErrorMessage
45
48
  } from "./chunk-KNU5COPB.js";
@@ -139,7 +142,12 @@ async function auditClipDurations(page, analyzeClipMediaFit, extraWaitMs) {
139
142
  id: el.id || el.getAttribute("src") || `(${el.tagName.toLowerCase()})`,
140
143
  kind: el.tagName === "AUDIO" ? "Audio" : "Video",
141
144
  slot,
142
- mediaStart: parseFloat(el.getAttribute("data-media-start") ?? "0") || 0,
145
+ attributes: {
146
+ "data-media-start": el.getAttribute("data-media-start"),
147
+ "data-playback-start": el.getAttribute("data-playback-start"),
148
+ "data-playback-rate": el.getAttribute("data-playback-rate"),
149
+ "data-automation": el.getAttribute("data-automation")
150
+ },
143
151
  duration: el.duration,
144
152
  loop: el.loop || el.getAttribute("data-loop") === "true"
145
153
  });
@@ -153,7 +161,11 @@ async function auditClipDurations(page, analyzeClipMediaFit, extraWaitMs) {
153
161
  unreadable.push(clip.id);
154
162
  continue;
155
163
  }
156
- const mediaSeconds = Math.max(0, clip.duration - clip.mediaStart);
164
+ const mediaSeconds = resolveNaturalMediaTimelineDuration(
165
+ { getAttribute: (name) => clip.attributes[name] ?? null },
166
+ clip.duration
167
+ );
168
+ if (mediaSeconds === null) continue;
157
169
  const fit = analyzeClipMediaFit({ slotSeconds: clip.slot, mediaSeconds, loop: clip.loop });
158
170
  if (!fit) continue;
159
171
  warnings.push({
@@ -227,7 +239,7 @@ function extractCompositionErrorsFromLint(lintResult) {
227
239
  async function localizeRemoteAssets(html) {
228
240
  let dir;
229
241
  try {
230
- const { loadProducer } = await import("./producer-UJQVLKLP.js");
242
+ const { loadProducer } = await import("./producer-2QG7HLAW.js");
231
243
  const { localizeRemoteMediaSources, localizeRemoteImageSources, localizeRemoteFontFaces } = await loadProducer();
232
244
  dir = mkdtempSync(join(tmpdir(), "hf-validate-assets-"));
233
245
  const assetDir = dir;
@@ -248,10 +260,10 @@ async function localizeRemoteAssets(html) {
248
260
  }
249
261
  async function validateInBrowser(project, opts) {
250
262
  const projectDir = project.dir;
251
- const { bundleToSingleHtml } = await import("./compiler-23MT6CX6.js");
263
+ const { bundleToSingleHtml } = await import("./compiler-MA2ELZPG.js");
252
264
  const { ensureBrowser } = await import("./manager-UHWEKPXC.js");
253
- const { serveStaticProjectHtml } = await import("./staticProjectServer-D2D3BKBP.js");
254
- const { lintProject } = await import("./lintProject-XM3DLUKG.js");
265
+ const { serveStaticProjectHtml } = await import("./staticProjectServer-LSVIRDRO.js");
266
+ const { lintProject } = await import("./lintProject-F7IC7WY4.js");
255
267
  const lintResult = await lintProject(projectDir);
256
268
  const compositionErrors = extractCompositionErrorsFromLint(lintResult);
257
269
  const html = await bundleToSingleHtml(projectDir);
@@ -272,9 +284,9 @@ async function validateInBrowser(project, opts) {
272
284
  try {
273
285
  const browser = await ensureBrowser();
274
286
  const puppeteer = await import("puppeteer-core");
275
- const { buildChromeArgs, analyzeClipMediaFit } = await import("./src-YNXBU4ZQ.js");
287
+ const { buildChromeArgs, analyzeClipMediaFit } = await import("./src-ZOXSEJCD.js");
276
288
  const requestedGpuMode = resolveCliChromeGpuMode();
277
- const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalWebGpu } = await import("./gpuPolicy-AWAJBGYY.js");
289
+ const { assertWebGpuAdapterAvailable, compositionRequiresWebGpu, resolveLocalWebGpu } = await import("./gpuPolicy-H6ABHVEB.js");
278
290
  const resolvedGpuMode = await resolveManagedGpuMode(requestedGpuMode, browser.executablePath);
279
291
  const requiresWebGpu = compositionRequiresWebGpu(html);
280
292
  const { gpuConfig, softwareWebGpu } = resolveLocalWebGpu(resolvedGpuMode, requiresWebGpu);
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  getMimeType,
9
9
  injectMediaCodecMapIntoHtml
10
- } from "./chunk-ZPMF6GAQ.js";
10
+ } from "./chunk-2WNVHZHA.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-BZQLTNMB.js";
21
+ } from "./chunk-COETAXRN.js";
22
22
  import {
23
23
  findStageProxyBox
24
- } from "./chunk-SGFMCNLY.js";
24
+ } from "./chunk-COWQITWP.js";
25
25
  import {
26
26
  resolveAutoProxy
27
- } from "./chunk-Z2BW2WJS.js";
27
+ } from "./chunk-JJJCFKMF.js";
28
28
  import {
29
29
  PREVIEW_PROXY_BOX_PARAM,
30
30
  parsePreviewProxyBox
31
- } from "./chunk-WYCFMNU3.js";
31
+ } from "./chunk-GM3WIOO6.js";
32
32
  import {
33
33
  decodeWellFormedEscapes
34
34
  } from "./chunk-BSQ7XANM.js";
@@ -11,7 +11,7 @@ import {
11
11
  distroLabel,
12
12
  getFFmpegInstallHint,
13
13
  parseLddMissingLibs
14
- } from "./chunk-3OLOVRWS.js";
14
+ } from "./chunk-GLG5JWLI.js";
15
15
  import {
16
16
  ensureBrowser,
17
17
  findBrowser
@@ -8,7 +8,7 @@ import {
8
8
  flush,
9
9
  shouldTrack,
10
10
  trackEvent
11
- } from "./chunk-T37XXYRK.js";
11
+ } from "./chunk-W3CS2KFV.js";
12
12
  import {
13
13
  CliRuntimeError
14
14
  } from "./chunk-JVBRJMOP.js";
@@ -8,7 +8,7 @@ import {
8
8
  EncoderInterruptedError,
9
9
  encoderFailureError,
10
10
  prepareAnimatedGifInputs
11
- } from "./chunk-XJVXROOL.js";
11
+ } from "./chunk-RQBB7PYT.js";
12
12
  import {
13
13
  GENERIC_FAMILIES,
14
14
  collectFontFamilyCustomProperties,
@@ -156,7 +156,7 @@ import {
156
156
  validateEngineConfigSnapshot,
157
157
  verifyDiskDrawElementSamples,
158
158
  writeCapturedFrame
159
- } from "./chunk-HXM2ISEK.js";
159
+ } from "./chunk-NMDUSCCE.js";
160
160
  import {
161
161
  DISTRIBUTED_FPS,
162
162
  HF_VFX_ATTR,
@@ -171,7 +171,7 @@ import {
171
171
  parseVfxChain,
172
172
  resolveAuthoredTimingWindow,
173
173
  toFps
174
- } from "./chunk-WYCFMNU3.js";
174
+ } from "./chunk-GM3WIOO6.js";
175
175
  import {
176
176
  assignBundledRuntimeCompositionIds,
177
177
  buildVariablesByCompScript,
@@ -184,7 +184,7 @@ import {
184
184
  isTemplateEntry,
185
185
  parsesAsScript,
186
186
  prepareFlattenedInnerRoot
187
- } from "./chunk-SMF6YAUL.js";
187
+ } from "./chunk-VYQYVYQ5.js";
188
188
  import {
189
189
  COMPOSITION_SOURCE_URL,
190
190
  HF_COLOR_GRADING_ATTR,
@@ -212,7 +212,7 @@ import {
212
212
  shouldClampResolvedMediaDuration,
213
213
  sourceTimeAt,
214
214
  styleElementsFor
215
- } from "./chunk-BPX7LZG6.js";
215
+ } from "./chunk-LM265QNK.js";
216
216
  import {
217
217
  MAX_AUDIO_GAIN
218
218
  } from "./chunk-X7HBSTCZ.js";
@@ -242,7 +242,7 @@ import {
242
242
  import {
243
243
  lintHyperframeHtml,
244
244
  resolveReferencedStart
245
- } from "./chunk-TSFA2Y5C.js";
245
+ } from "./chunk-3NRB7YXW.js";
246
246
  import {
247
247
  isUnresolvedAssetPlaceholder,
248
248
  readProjectFile,
@@ -1413,6 +1413,14 @@ function materializeExtractedFramesForCompiledDir(extracted, compiledDir, option
1413
1413
  }
1414
1414
  }
1415
1415
 
1416
+ // ../producer/src/services/render/frameCacheBudget.ts
1417
+ function frameCacheOptions(cfg, workers) {
1418
+ return {
1419
+ frameDataUriCacheLimit: cfg.frameDataUriCacheLimit,
1420
+ frameDataUriCacheBytesLimitMb: Math.floor(cfg.frameDataUriCacheBytesLimitMb / (workers || 1))
1421
+ };
1422
+ }
1423
+
1416
1424
  // ../producer/src/services/render/cleanup.ts
1417
1425
  import { freemem } from "os";
1418
1426
 
@@ -1696,7 +1704,7 @@ async function defaultArtifactDurationProbe(path) {
1696
1704
  };
1697
1705
  }
1698
1706
  function buildArtifactExpectation(input) {
1699
- if (input.outputFormat === "png-sequence" || input.outputFormat === "gif") return void 0;
1707
+ if (input.outputFormat === "gif") return void 0;
1700
1708
  if (!Number.isFinite(input.durationSeconds) || input.durationSeconds <= 0) return void 0;
1701
1709
  const expectation = {
1702
1710
  expectedDurationSeconds: input.durationSeconds,
@@ -1761,12 +1769,12 @@ function assertDurationWithinTolerance(expectedSeconds, probedSeconds, tolerance
1761
1769
  `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}`
1762
1770
  );
1763
1771
  }
1764
- function assertFrameCountWithinTolerance(expectedFrames, probedFrames, stagingPath) {
1772
+ function assertFrameCountWithinTolerance(expectedFrames, probedFrames, stagingPath, toleranceFrames = 1) {
1765
1773
  if (probedFrames === void 0 || !Number.isFinite(probedFrames) || probedFrames <= 0) {
1766
1774
  return;
1767
1775
  }
1768
1776
  const shortfall = expectedFrames - probedFrames;
1769
- if (shortfall <= 1) return;
1777
+ if (shortfall <= toleranceFrames) return;
1770
1778
  throw new Error(
1771
1779
  `Render artifact is truncated: expected ${expectedFrames} frames, probed ${probedFrames} frames (shortfall ${shortfall} frames). Artifact: ${stagingPath}`
1772
1780
  );
@@ -1805,8 +1813,8 @@ var ArtifactTransaction = class {
1805
1813
  if (expected) await this.assertArtifactDuration(expected);
1806
1814
  return;
1807
1815
  }
1808
- this.assertReadableNonEmptyDirectory();
1809
- if (expected) await this.assertDirectoryExpectation(expected);
1816
+ const files = this.assertReadableNonEmptyDirectory();
1817
+ if (expected) await this.assertDirectoryExpectation(expected, files);
1810
1818
  }
1811
1819
  assertReadableNonEmptyDirectory() {
1812
1820
  let files;
@@ -1821,13 +1829,14 @@ var ArtifactTransaction = class {
1821
1829
  throw new Error(`Render artifact directory is empty: ${this.stagingPath}`);
1822
1830
  }
1823
1831
  for (const file of files) assertReadableNonEmptyFile(file);
1832
+ return files;
1824
1833
  }
1825
1834
  /**
1826
1835
  * The named-entry and duration gates a directory artifact opts into. A
1827
- * directory has no single probe target, so an expectation without
1828
- * `probeTarget` (png-sequence) keeps the historical behavior: structure only.
1836
+ * directory with a probe target checks duration; one without a probe target
1837
+ * checks the exported PNG frame count when the caller supplied it.
1829
1838
  */
1830
- async assertDirectoryExpectation(expected) {
1839
+ async assertDirectoryExpectation(expected, files) {
1831
1840
  for (const required of expected.requiredFiles ?? []) {
1832
1841
  const path = join5(this.stagingPath, required);
1833
1842
  if (!existsSync5(path)) {
@@ -1835,8 +1844,25 @@ var ArtifactTransaction = class {
1835
1844
  }
1836
1845
  assertReadableNonEmptyFile(path);
1837
1846
  }
1838
- if (expected.probeTarget === void 0) return;
1839
- await this.assertArtifactDuration(expected, join5(this.stagingPath, expected.probeTarget));
1847
+ if (expected.probeTarget !== void 0) {
1848
+ await this.assertArtifactDuration(expected, join5(this.stagingPath, expected.probeTarget));
1849
+ return;
1850
+ }
1851
+ if (expected.expectedFrames === void 0) return;
1852
+ const frameCount = files.filter(
1853
+ (file) => dirname4(file) === this.stagingPath && /^frame_\d+\.png$/.test(basename3(file))
1854
+ ).length;
1855
+ if (frameCount === 0) {
1856
+ throw new Error(
1857
+ `Render artifact is truncated: expected ${expected.expectedFrames} frames, probed 0 frames. Artifact: ${this.stagingPath}`
1858
+ );
1859
+ }
1860
+ assertFrameCountWithinTolerance(
1861
+ expected.expectedFrames,
1862
+ frameCount,
1863
+ this.stagingPath,
1864
+ Math.max(1, Math.ceil(expected.expectedFrames * 2e-3))
1865
+ );
1840
1866
  }
1841
1867
  async assertArtifactDuration(expected, probePath = this.stagingPath) {
1842
1868
  const expectedSeconds = expected.expectedDurationSeconds;
@@ -6829,7 +6855,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir, options = {})
6829
6855
  );
6830
6856
  if (analysis.isProblematic) {
6831
6857
  defaultLogger.warn(
6832
- `[Compiler] WARNING: Video "${video.id}" has sparse keyframes (max interval: ${analysis.maxIntervalSeconds}s). This causes seek failures and frame freezing. Re-encode with: ${reencode}`
6858
+ `[Compiler] WARNING: Video "${video.id}" has sparse keyframes (max interval: ${analysis.maxIntervalSeconds}s). Long GOPs can make preview seeking slower; rendering is unaffected. If preview seeking is slow, re-encode with: ${reencode}`
6833
6859
  );
6834
6860
  }
6835
6861
  if (metadata.isVFR) {
@@ -8828,6 +8854,7 @@ async function mixAudioForDelivery(input, duration, pcmSourcePath) {
8828
8854
  audios,
8829
8855
  masterFxChain,
8830
8856
  urlByAbsentLocalPath,
8857
+ audioSidecarUrlByLocalPath,
8831
8858
  abortSignal,
8832
8859
  assertNotAborted,
8833
8860
  log
@@ -8851,6 +8878,7 @@ async function mixAudioForDelivery(input, duration, pcmSourcePath) {
8851
8878
  audioGain,
8852
8879
  masterFxChain,
8853
8880
  urlByAbsentLocalPath,
8881
+ audioSidecarUrlByLocalPath,
8854
8882
  keepEncoderInputAt: pcmSourcePath
8855
8883
  },
8856
8884
  compiledDir
@@ -12103,10 +12131,7 @@ async function executeRenderPipeline(input) {
12103
12131
  });
12104
12132
  }
12105
12133
  });
12106
- const createRenderVideoFrameInjector = () => createVideoFrameInjector(frameLookup, {
12107
- frameDataUriCacheLimit: cfg.frameDataUriCacheLimit,
12108
- frameDataUriCacheBytesLimitMb: cfg.frameDataUriCacheBytesLimitMb
12109
- });
12134
+ const createRenderVideoFrameInjector = () => createVideoFrameInjector(frameLookup, frameCacheOptions(cfg, workerCount));
12110
12135
  let captureCalibration;
12111
12136
  const htmlInCanvasDetected = compiled.renderModeHints.reasons.some(
12112
12137
  (r) => r.code === "htmlInCanvas"
@@ -13715,12 +13740,13 @@ var RenderChunkValidationError = class extends Error {
13715
13740
  this.code = code;
13716
13741
  }
13717
13742
  };
13718
- function createChunkVideoFrameInjectorFactory(frameLookup) {
13719
- if (!(frameLookup instanceof Promise)) return () => createVideoFrameInjector(frameLookup);
13743
+ function createChunkVideoFrameInjectorFactory(frameLookup, options) {
13744
+ if (!(frameLookup instanceof Promise))
13745
+ return () => createVideoFrameInjector(frameLookup, options);
13720
13746
  return () => {
13721
13747
  let hook;
13722
13748
  return async (page, time, heldVideoTime) => {
13723
- hook ??= createVideoFrameInjector(await frameLookup);
13749
+ hook ??= createVideoFrameInjector(await frameLookup, options);
13724
13750
  await hook?.(page, time, heldVideoTime);
13725
13751
  };
13726
13752
  };
@@ -15437,6 +15463,11 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15437
15463
  const localPathByUrl = new Map(
15438
15464
  remoteFiles.map(([rel, file]) => [file.url, remoteLocalPath(rel)])
15439
15465
  );
15466
+ const audioSidecarUrlByLocalPath = new Map(
15467
+ remoteFiles.flatMap(
15468
+ ([rel, file]) => file.audioSidecarUrl ? [[remoteLocalPath(rel), file.audioSidecarUrl]] : []
15469
+ )
15470
+ );
15440
15471
  stageStarted = Date.now();
15441
15472
  const compileResult = await runCompileStage({
15442
15473
  urlByAbsentLocalPath,
@@ -15500,7 +15531,7 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15500
15531
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15501
15532
  if (probeResult.probeSession) {
15502
15533
  try {
15503
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-YNXBU4ZQ.js");
15534
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-ZOXSEJCD.js");
15504
15535
  await closeCaptureSession2(probeResult.probeSession);
15505
15536
  } catch (err) {
15506
15537
  log.warn("[plan] probe session close failed", {
@@ -15521,6 +15552,7 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15521
15552
  finalCompiledDir,
15522
15553
  remoteFiles,
15523
15554
  urlByAbsentLocalPath,
15555
+ audioSidecarUrlByLocalPath,
15524
15556
  localPathByUrl,
15525
15557
  compileResult,
15526
15558
  compiled,
@@ -15538,6 +15570,7 @@ function mixPlanAudio(c, compiledDir) {
15538
15570
  workDir: c.workDir,
15539
15571
  compiledDir,
15540
15572
  urlByAbsentLocalPath: c.urlByAbsentLocalPath,
15573
+ audioSidecarUrlByLocalPath: c.audioSidecarUrlByLocalPath,
15541
15574
  totalFrames: c.totalFrames,
15542
15575
  fps: c.job.config.fps,
15543
15576
  ffmpegProcessTimeout: c.cfg.ffmpegProcessTimeout,
@@ -17149,7 +17182,7 @@ function startServer(options = {}) {
17149
17182
  });
17150
17183
  async function shutdown(signal) {
17151
17184
  log.info(`Received ${signal}, shutting down`);
17152
- const { drainBrowserPool } = await import("./src-YNXBU4ZQ.js");
17185
+ const { drainBrowserPool } = await import("./src-ZOXSEJCD.js");
17153
17186
  await drainBrowserPool().catch(() => {
17154
17187
  });
17155
17188
  const handle = await Promise.race([
@@ -18446,6 +18479,23 @@ async function createVerifiedDistributedCaptureSession(serverUrl, framesDir, cap
18446
18479
  function isCaptureMode(value) {
18447
18480
  return value === "beginframe" || value === "screenshot" || value === "drawelement";
18448
18481
  }
18482
+ var MixedCaptureModesError = class extends Error {
18483
+ constructor(modes) {
18484
+ super(`[renderChunk] capture workers reported inconsistent modes: ${modes.join(",")}`);
18485
+ this.modes = modes;
18486
+ this.name = "MixedCaptureModesError";
18487
+ }
18488
+ modes;
18489
+ };
18490
+ function observedChunkCaptureMode(perfs) {
18491
+ const modes = [...new Set(perfs.map((perf) => perf.captureMode))];
18492
+ if (modes.length > 1) throw new MixedCaptureModesError(modes);
18493
+ const [mode] = modes;
18494
+ if (!mode || !isCaptureMode(mode)) {
18495
+ throw new Error(`[renderChunk] capture workers reported an invalid mode: ${mode ?? "<none>"}`);
18496
+ }
18497
+ return mode;
18498
+ }
18449
18499
  function shouldRetryChunkCaptureWithScreenshot(error) {
18450
18500
  const failure = classifyCaptureFailure(error);
18451
18501
  if (failure.kind === "cancelled" || failure.kind === "memory_exhaustion") return false;
@@ -18743,7 +18793,10 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath, options) {
18743
18793
  ) : null;
18744
18794
  videoFrameLookup?.catch(() => {
18745
18795
  });
18746
- const createChunkVideoFrameInjector = createChunkVideoFrameInjectorFactory(videoFrameLookup);
18796
+ const createChunkVideoFrameInjector = createChunkVideoFrameInjectorFactory(
18797
+ videoFrameLookup,
18798
+ frameCacheOptions(cfg, chunkWorkerCount)
18799
+ );
18747
18800
  const captureStarted = Date.now();
18748
18801
  captureMode = await runCaptureWithScreenshotFallback({
18749
18802
  forceScreenshot: forceScreenshotForChunk,
@@ -18797,17 +18850,7 @@ async function renderChunk(planDir, chunkIndex, outputChunkPath, options) {
18797
18850
  },
18798
18851
  frameRange: range
18799
18852
  });
18800
- const observedModes = new Set(capturePerfs.map((perf) => perf.captureMode));
18801
- if (observedModes.size !== 1 || ![...observedModes].every(isCaptureMode)) {
18802
- throw new Error(
18803
- `[renderChunk] capture workers reported invalid or inconsistent modes: ${[...observedModes].join(",") || "<none>"}`
18804
- );
18805
- }
18806
- const [observedMode] = observedModes;
18807
- if (!observedMode || !isCaptureMode(observedMode)) {
18808
- throw new Error("[renderChunk] capture completed without an observed mode");
18809
- }
18810
- return observedMode;
18853
+ return observedChunkCaptureMode(capturePerfs);
18811
18854
  },
18812
18855
  resetForScreenshotRetry: () => {
18813
18856
  rmSync16(workDir, { recursive: true, force: true, maxRetries: 3, retryDelay: 100 });
@@ -19016,6 +19059,10 @@ import { createHash as createHash7 } from "crypto";
19016
19059
  import { join as join42 } from "path";
19017
19060
  var READ_CHUNK_BYTES = 256 * 1024;
19018
19061
 
19062
+ // ../producer/src/services/distributed/audioSidecar.ts
19063
+ import { extname as extname7 } from "path";
19064
+ var AUDIO_SIDECAR_MIN_BYTES = 32 * 1024 * 1024;
19065
+
19019
19066
  export {
19020
19067
  createConsoleLogger,
19021
19068
  defaultLogger,
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  readCompositionFps
9
- } from "./chunk-HUG47UEE.js";
9
+ } from "./chunk-7FF36MAD.js";
10
10
  import {
11
11
  errorBox
12
12
  } from "./chunk-K2FLNJVB.js";
@@ -16,10 +16,10 @@ import {
16
16
  import {
17
17
  DEFAULT_CONFIG,
18
18
  resolvePageNavigationTimeout
19
- } from "./chunk-HXM2ISEK.js";
19
+ } from "./chunk-NMDUSCCE.js";
20
20
  import {
21
21
  parseFps
22
- } from "./chunk-WYCFMNU3.js";
22
+ } from "./chunk-GM3WIOO6.js";
23
23
 
24
24
  // src/browser/windowsCrash.ts
25
25
  var STATUS_STACK_BUFFER_OVERRUN_DEC = "3221225595";
@@ -43,8 +43,8 @@ function windowsChromeCrashRemediation(errorMessage) {
43
43
  }
44
44
 
45
45
  // src/utils/renderArgs.ts
46
- import { readFileSync } from "fs";
47
- import { resolve, sep } from "path";
46
+ import { readFileSync, realpathSync } from "fs";
47
+ import { isAbsolute, relative, resolve, sep } from "path";
48
48
  var MIN_PAGE_NAVIGATION_TIMEOUT_MS = 1;
49
49
  var MAX_PAGE_NAVIGATION_TIMEOUT_SECONDS = 86400;
50
50
  function parseBrowserTimeoutMsArg(raw) {
@@ -113,12 +113,13 @@ function normalizeCompositionEntryArg(raw) {
113
113
  function hasExplicitCompositionArg(raw) {
114
114
  return normalizeCompositionEntryArg(raw) !== void 0;
115
115
  }
116
- function parseCompositionEntryArg(raw, projectDir, stat) {
116
+ function parseCompositionEntryArg(raw, projectDir, stat, real = realpathOrSame) {
117
117
  const trimmed = normalizeCompositionEntryArg(raw);
118
118
  if (!trimmed) return { ok: true, value: void 0 };
119
119
  const absProjectDir = resolve(projectDir);
120
120
  const entryPath = resolve(absProjectDir, trimmed);
121
- if (entryPath !== absProjectDir && !entryPath.startsWith(absProjectDir + sep)) {
121
+ const relativeEntry = [absProjectDir, real(absProjectDir)].flatMap((root) => [entryPath, real(entryPath)].map((path) => relative(root, path))).find((rel) => rel !== ".." && !rel.startsWith(`..${sep}`) && !isAbsolute(rel));
122
+ if (relativeEntry === void 0) {
122
123
  return { ok: false, error: { kind: "outside-project", entryFile: trimmed } };
123
124
  }
124
125
  let entryStat;
@@ -130,7 +131,14 @@ function parseCompositionEntryArg(raw, projectDir, stat) {
130
131
  if (!entryStat.isFile()) {
131
132
  return { ok: false, error: { kind: "not-a-file", entryFile: trimmed } };
132
133
  }
133
- return { ok: true, value: trimmed };
134
+ return { ok: true, value: relativeEntry.split(sep).join("/") };
135
+ }
136
+ function realpathOrSame(path) {
137
+ try {
138
+ return realpathSync(path);
139
+ } catch {
140
+ return path;
141
+ }
134
142
  }
135
143
  function compositionEntryErrorMessage(error) {
136
144
  switch (error.kind) {
@@ -8,14 +8,14 @@ import {
8
8
  DEFAULT_REGISTRY_URL,
9
9
  fetchItemFile,
10
10
  validRegistryItem
11
- } from "./chunk-5HJJEHGE.js";
11
+ } from "./chunk-LBNEH6IQ.js";
12
12
  import {
13
13
  publishRegistryFile,
14
14
  registryTargetPath
15
15
  } from "./chunk-GMECXFAN.js";
16
16
  import {
17
17
  validateVariables
18
- } from "./chunk-WYCFMNU3.js";
18
+ } from "./chunk-GM3WIOO6.js";
19
19
  import {
20
20
  realProjectRoot
21
21
  } from "./chunk-OFQWTKPW.js";
@@ -6,26 +6,26 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  parakeetRunner
9
- } from "./chunk-GWYMAII7.js";
9
+ } from "./chunk-7NKJS5KM.js";
10
10
  import {
11
11
  DecodeCancelled,
12
12
  prepareSherpaWav,
13
13
  sherpaUnsupportedReason,
14
14
  transcribeWithSherpa
15
- } from "./chunk-M6FHSQZ3.js";
15
+ } from "./chunk-BFFLKQVB.js";
16
16
  import {
17
17
  initialModelForLanguage,
18
18
  transcribe
19
- } from "./chunk-74Y43RJZ.js";
19
+ } from "./chunk-AQB5M53R.js";
20
20
  import {
21
21
  createRenderCancellationScope,
22
22
  stoppedByCancelSignal
23
- } from "./chunk-TFUAKV6O.js";
23
+ } from "./chunk-RWYUK7LM.js";
24
24
  import {
25
25
  DEFAULT_MODEL,
26
26
  findWhisper,
27
27
  isWhisperUnavailable
28
- } from "./chunk-6RA4TWGV.js";
28
+ } from "./chunk-7LUJE3II.js";
29
29
  import {
30
30
  formatSrt,
31
31
  formatVtt,
@@ -12,10 +12,10 @@ import {
12
12
  } from "./chunk-DCAI5DBR.js";
13
13
  import {
14
14
  createProjectConfig
15
- } from "./chunk-Z2BW2WJS.js";
15
+ } from "./chunk-JJJCFKMF.js";
16
16
  import {
17
17
  isHyperframesProject
18
- } from "./chunk-WYCFMNU3.js";
18
+ } from "./chunk-GM3WIOO6.js";
19
19
 
20
20
  // src/utils/desktopApp.ts
21
21
  import { spawn, spawnSync } from "child_process";
@@ -38,7 +38,7 @@ import {
38
38
  stripEmbeddedRuntimeScripts,
39
39
  styleElementsFor,
40
40
  warnUnknownEnumValues
41
- } from "./chunk-BPX7LZG6.js";
41
+ } from "./chunk-LM265QNK.js";
42
42
  import {
43
43
  cssVariableName
44
44
  } from "./chunk-VC76R6W2.js";
@@ -48,7 +48,7 @@ import {
48
48
  } from "./chunk-OFQWTKPW.js";
49
49
  import {
50
50
  lintHyperframeHtml
51
- } from "./chunk-TSFA2Y5C.js";
51
+ } from "./chunk-3NRB7YXW.js";
52
52
  import {
53
53
  checkSubCompositionUsability,
54
54
  resolveSubCompositionContent