hyperframes 0.8.186 → 0.8.189

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-UGK7AZI6.js → add-TIKUM2YX.js} +12 -12
  2. package/dist/{animatedGifPrep-HPZPSB43.js → animatedGifPrep-25X4G5IE.js} +7 -7
  3. package/dist/api.js +15 -15
  4. package/dist/{asset-X2GTFWOY.js → asset-TPKLIP4R.js} +2 -2
  5. package/dist/{assetCataloger-5NWEG4IU.js → assetCataloger-PQAIV3FI.js} +7 -7
  6. package/dist/{audio-7PBM5F3H.js → audio-6RLPKB5X.js} +15 -15
  7. package/dist/{auth-WABSMO46.js → auth-O7QSTP6Y.js} +1 -1
  8. package/dist/{autoUpdate-6SCMLTSC.js → autoUpdate-TIEJODP7.js} +2 -2
  9. package/dist/{backgroundChecks-XOGPAAR3.js → backgroundChecks-K2AXYDYG.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-VR6IA77K.js → batchRender-ORVWYJAH.js} +4 -4
  12. package/dist/{beats-3IWXLMSC.js → beats-2VTB2ATR.js} +4 -4
  13. package/dist/{benchmark-2SSYATCX.js → benchmark-NLNBL6YR.js} +9 -9
  14. package/dist/{browser-PMRN345D.js → browser-M5UV6VJB.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-TT32MZBO.js → bundleWithLocalizedFonts-EDD2XDS2.js} +2 -2
  16. package/dist/{capture-4VD6AKUJ.js → capture-JSYVNFKO.js} +10 -10
  17. package/dist/{capture-BDGYTE57.js → capture-WHWEE5FE.js} +2 -2
  18. package/dist/{captureCompositionFrame-5FVLAETA.js → captureCompositionFrame-JANGQCIA.js} +13 -13
  19. package/dist/{catalog-HUYZO5D7.js → catalog-MPOOKNSZ.js} +12 -12
  20. package/dist/{catch-up-SSGTR2ZT.js → catch-up-6KZV3UMZ.js} +4 -4
  21. package/dist/{check-JWUWHGM2.js → check-G273NWK7.js} +37 -36
  22. package/dist/{checkBrowser-X7G6YNR7.js → checkBrowser-G53E2ZQI.js} +32 -33
  23. package/dist/{chunk-WHMFW5ET.js → chunk-2CYM34M7.js} +3 -3
  24. package/dist/{chunk-HZ7M2MZA.js → chunk-37EPEFXM.js} +1 -1
  25. package/dist/{chunk-4XFFJAWS.js → chunk-3OLOVRWS.js} +1 -1
  26. package/dist/{chunk-ZIRIDSDB.js → chunk-3X6LH25W.js} +1 -1
  27. package/dist/{chunk-TH7J3JZ5.js → chunk-44TJOEH5.js} +92 -25
  28. package/dist/{chunk-K6KBOORN.js → chunk-4DZ3HBKF.js} +2 -2
  29. package/dist/{chunk-U7QTMRLW.js → chunk-4QFKGRTB.js} +2 -2
  30. package/dist/{chunk-7MVODWQF.js → chunk-5544QB3U.js} +1 -1
  31. package/dist/{chunk-7AUMTARQ.js → chunk-565X6Q4X.js} +3 -3
  32. package/dist/{chunk-J36JVBLR.js → chunk-5C7R55BJ.js} +1 -1
  33. package/dist/{chunk-YRAJDFIN.js → chunk-5HJJEHGE.js} +1 -1
  34. package/dist/{chunk-5UBZPG74.js → chunk-6A45RKAK.js} +1 -1
  35. package/dist/{chunk-ROWEDRVX.js → chunk-6RA4TWGV.js} +1 -1
  36. package/dist/{chunk-3YHGQJI6.js → chunk-74Y43RJZ.js} +3 -3
  37. package/dist/{chunk-4AFNEKU7.js → chunk-ANYBRVPF.js} +1 -1
  38. package/dist/{chunk-R6IGQ5NO.js → chunk-AQ3L7DVB.js} +2 -2
  39. package/dist/{chunk-LDW3KVGK.js → chunk-ASZ4IQB4.js} +2 -2
  40. package/dist/{chunk-DQZMJS2P.js → chunk-AYBKDHYD.js} +2 -2
  41. package/dist/{chunk-RVZNSKRH.js → chunk-B52BJM5K.js} +2 -2
  42. package/dist/{chunk-GTMBII7X.js → chunk-B634ZCY2.js} +1 -1
  43. package/dist/chunk-BPX7LZG6.js +3896 -0
  44. package/dist/{chunk-5ZMIVTHN.js → chunk-BZQLTNMB.js} +219 -79
  45. package/dist/{chunk-MY6CVBDD.js → chunk-CE7EQUBV.js} +1 -1
  46. package/dist/{chunk-ZVBEGBII.js → chunk-CSYSEPWL.js} +31 -7
  47. package/dist/{chunk-EZINX6HH.js → chunk-CTF7BYCV.js} +3 -3
  48. package/dist/{chunk-2II34JPM.js → chunk-E676Y7AY.js} +82 -29
  49. package/dist/{chunk-YQICCAVA.js → chunk-E7TI5PAQ.js} +1 -1
  50. package/dist/{chunk-TTVHYD5R.js → chunk-EI7FP7F3.js} +1 -1
  51. package/dist/{chunk-UJZT6HNN.js → chunk-F45HHA3M.js} +1 -1
  52. package/dist/{chunk-TQ2RRB5V.js → chunk-FJF5JBYU.js} +1 -1
  53. package/dist/{chunk-Z5233OAN.js → chunk-GBT7P3OQ.js} +5 -5
  54. package/dist/{chunk-NPDPDEPP.js → chunk-GWYMAII7.js} +1 -1
  55. package/dist/{chunk-UAJCTEK2.js → chunk-HNMDLKA4.js} +1 -1
  56. package/dist/{chunk-FCWFV4P7.js → chunk-HQIFMCQN.js} +2278 -2273
  57. package/dist/{chunk-DTXDQ6OP.js → chunk-HUG47UEE.js} +1 -1
  58. package/dist/{chunk-7M7TMM4S.js → chunk-HXM2ISEK.js} +264 -124
  59. package/dist/{chunk-WLHNIIXU.js → chunk-IFXOMIBP.js} +3 -3
  60. package/dist/{chunk-77QM6YRQ.js → chunk-IPEP346Y.js} +1 -1
  61. package/dist/{chunk-22QKQDEE.js → chunk-JIPUWKLA.js} +14 -14
  62. package/dist/{chunk-YNH6ERDL.js → chunk-JZDVIDFH.js} +2 -2
  63. package/dist/{chunk-KNLSYCI5.js → chunk-KLWUB37U.js} +7 -7
  64. package/dist/{chunk-PEIV2SOG.js → chunk-KS4HMJJD.js} +1 -1
  65. package/dist/{chunk-4NTW45W5.js → chunk-M6FHSQZ3.js} +3 -3
  66. package/dist/{chunk-RFJ6SX4U.js → chunk-NDBWI7OA.js} +5 -5
  67. package/dist/{chunk-ACLABKEF.js → chunk-NSJ5HD6A.js} +5 -5
  68. package/dist/{chunk-FRLTKTOR.js → chunk-OHXHBMF4.js} +1 -1
  69. package/dist/{chunk-7MLFYMFB.js → chunk-QMFI4N7J.js} +1 -1
  70. package/dist/{chunk-HOFX63F2.js → chunk-QYQ2EYOI.js} +3 -3
  71. package/dist/{chunk-27H2363S.js → chunk-R5FS7GFU.js} +1 -1
  72. package/dist/{chunk-PFD25NAC.js → chunk-RIJHDTM5.js} +4 -0
  73. package/dist/{chunk-FH7WODJH.js → chunk-SGFMCNLY.js} +8 -0
  74. package/dist/{chunk-BRTDLVK3.js → chunk-SMF6YAUL.js} +9 -11
  75. package/dist/{chunk-6IOBAOU7.js → chunk-T37XXYRK.js} +1 -1
  76. package/dist/{chunk-T4RP55P2.js → chunk-TFUAKV6O.js} +1 -1
  77. package/dist/{chunk-U6RXZNZE.js → chunk-TMBUBLZB.js} +55 -23
  78. package/dist/{chunk-5ZMXGNGC.js → chunk-TPTQHOXU.js} +9 -9
  79. package/dist/{chunk-U4BMRIE6.js → chunk-TREMHDWT.js} +12 -10
  80. package/dist/{chunk-Q447CX26.js → chunk-TSFA2Y5C.js} +60 -47
  81. package/dist/{chunk-Y2M6XSNK.js → chunk-VRQU564T.js} +1 -1
  82. package/dist/{chunk-ID5AJ4L3.js → chunk-WMJJCHVQ.js} +2 -2
  83. package/dist/{chunk-RNZEQTWZ.js → chunk-WYCFMNU3.js} +15 -2
  84. package/dist/{chunk-UJKQWGFF.js → chunk-X7HBSTCZ.js} +8 -0
  85. package/dist/{chunk-ZKBW7NU2.js → chunk-XJVXROOL.js} +2 -2
  86. package/dist/{chunk-CML25PAF.js → chunk-XNFDDVJS.js} +27 -3
  87. package/dist/{chunk-RPUIMFHF.js → chunk-Z2BW2WJS.js} +1 -1
  88. package/dist/{chunk-2PZZMAME.js → chunk-ZPMF6GAQ.js} +17 -12
  89. package/dist/{clean-IM2JIAUT.js → clean-PS4VYGQ6.js} +17 -17
  90. package/dist/cli.js +53 -53
  91. package/dist/{cloud-6IPBCJSX.js → cloud-E47CE5VQ.js} +4 -4
  92. package/dist/{cloudrun-MWZ6S2I2.js → cloudrun-3J4SQBXE.js} +5 -5
  93. package/dist/{compare-WD7A2TV5.js → compare-EAKHXBDO.js} +29 -29
  94. package/dist/{compiler-2EKSMC3I.js → compiler-23MT6CX6.js} +4 -4
  95. package/dist/{component-JKALWH36.js → component-QBOXYJJS.js} +3 -3
  96. package/dist/{compositions-643NAG4A.js → compositions-QC3EO3MJ.js} +11 -11
  97. package/dist/{delete-EASPXKHQ.js → delete-TXEOLPC6.js} +4 -4
  98. package/dist/deploy-3B3WJ6PM.js +300 -0
  99. package/dist/{destroy-4B5HW5FH.js → destroy-SSPAKADI.js} +13 -3
  100. package/dist/{dist-F6FOKRSU.js → dist-F4UJFK4S.js} +5 -3
  101. package/dist/{dist-LM7AVHOU.js → dist-JH32CBQL.js} +1 -1
  102. package/dist/{doctor-7XUVYDJQ.js → doctor-2CRFH4B3.js} +11 -11
  103. package/dist/{events-TULV6D3G.js → events-GUIOSBIB.js} +3 -3
  104. package/dist/{events-5TTPYBKG.js → events-KVTX3QFV.js} +2 -2
  105. package/dist/{feedback-4FTPWM6P.js → feedback-VQIOSTIB.js} +7 -7
  106. package/dist/{ffmpeg-MP7ZVYLZ.js → ffmpeg-BPCZGXFW.js} +7 -7
  107. package/dist/{figma-B7LFWYKO.js → figma-QIOKCH26.js} +3 -3
  108. package/dist/fontLocalizeCli.js +9 -9
  109. package/dist/{get-F7W4AQ2V.js → get-TU45SNXF.js} +4 -4
  110. package/dist/{gpuPolicy-NSNVDFXC.js → gpuPolicy-AWAJBGYY.js} +7 -7
  111. package/dist/{grade-compare-6QXDTLS2.js → grade-compare-LDNUXX3Q.js} +30 -30
  112. package/dist/{help-RJAA4O74.js → help-YUCHJKKL.js} +1 -1
  113. package/dist/{history-OOQBDVV5.js → history-MMHFUMIG.js} +7 -7
  114. package/dist/hyperframe.manifest.json +1 -1
  115. package/dist/hyperframe.runtime.iife.js +65 -64
  116. package/dist/hyperframes-player.global.js +3 -3
  117. package/dist/{info-5OGGYYLO.js → info-HBHOFSC2.js} +8 -8
  118. package/dist/{init-DM3TJKW2.js → init-3E4GUXIZ.js} +27 -27
  119. package/dist/{inspect-FECQCLS5.js → inspect-YNUPJVIH.js} +30 -30
  120. package/dist/{installer-WOG4VORV.js → installer-WLCRP33K.js} +5 -5
  121. package/dist/{keyframes-SZHWUF5Y.js → keyframes-Z47GHCGO.js} +6 -6
  122. package/dist/{lambda-JG2ZRGMC.js → lambda-CA4PEUO2.js} +20 -13
  123. package/dist/{layout-7ACF7ZKC.js → layout-YPV6PIKF.js} +30 -30
  124. package/dist/{lint-ZCQGMILV.js → lint-3AVVQ74A.js} +7 -7
  125. package/dist/{lintProject-JATQKR64.js → lintProject-XM3DLUKG.js} +1 -1
  126. package/dist/{list-MH2X3Y2T.js → list-JH52Y735.js} +7 -7
  127. package/dist/{login-CK46WX5U.js → login-G7NPJUAW.js} +4 -4
  128. package/dist/{manager-GXTPNJVW.js → manager-2LSMMZY4.js} +8 -8
  129. package/dist/{media-treatment-EH2AT34Z.js → media-treatment-BVMMD5EN.js} +13 -13
  130. package/dist/{models-D5XP2UK6.js → models-P3TNRVRV.js} +11 -11
  131. package/dist/{motionShot-UR7D3SRQ.js → motionShot-LK62QHNE.js} +18 -18
  132. package/dist/{normalize-audio-635JOR5W.js → normalize-audio-Y7BAQ7AR.js} +6 -6
  133. package/dist/{open-6WE5WFVM.js → open-CCFFLAT7.js} +12 -12
  134. package/dist/{parakeetRunner-STHZPG32.js → parakeetRunner-N2BWSOSD.js} +12 -12
  135. package/dist/{pipeline-LVEKRETU.js → pipeline-3VT2DQGU.js} +8 -8
  136. package/dist/{play-W6TDW4FE.js → play-G4I5IFHO.js} +20 -20
  137. package/dist/{policies-XXNGXWHV.js → policies-MBWGLMWB.js} +17 -0
  138. package/dist/{preflight-LIMQXLR7.js → preflight-2KU2QLCZ.js} +8 -8
  139. package/dist/{present-RX5QX6UR.js → present-EJ7XHGQO.js} +16 -16
  140. package/dist/{preview-KIWTWK63.js → preview-O23BYFAY.js} +18 -18
  141. package/dist/{producer-TSNKSCUM.js → producer-UJQVLKLP.js} +1 -1
  142. package/dist/{progress-NHJIHAAG.js → progress-PX3PVAIM.js} +5 -3
  143. package/dist/{projectConfig-NCP7JRH4.js → projectConfig-QFVIBT37.js} +7 -7
  144. package/dist/{publication-5W5UZWGC.js → publication-4UYGFB2X.js} +3 -3
  145. package/dist/{publish-7WR4XJ6I.js → publish-MHLVJLCR.js} +9 -9
  146. package/dist/{remove-background-43JGBRWQ.js → remove-background-N7AHTZWP.js} +9 -9
  147. package/dist/{render-7T44HIM6.js → render-6HQV4LZJ.js} +11 -9
  148. package/dist/{render-WHMLYIOI.js → render-CDATEVDJ.js} +31 -22
  149. package/dist/{render-456HCO6O.js → render-EI2ODKOP.js} +45 -29
  150. package/dist/{render-batch-LURBJTBV.js → render-batch-F7HMC7XH.js} +7 -7
  151. package/dist/renderSetupWorker.js +1 -1
  152. package/dist/{resolver-MBIW4VC4.js → resolver-63DB5JCY.js} +5 -5
  153. package/dist/{sam-MC24SZHC.js → sam-FHJ7IL7T.js} +3 -1
  154. package/dist/{sherpa-5J2AALED.js → sherpa-AK3MTPL3.js} +11 -11
  155. package/dist/{sites-MAVH57MO.js → sites-5PWHAMEG.js} +1 -1
  156. package/dist/skills/hyperframes/references/motion.md +1 -0
  157. package/dist/{skills-UHOXOGGF.js → skills-EVIDL7PV.js} +5 -5
  158. package/dist/{skillsUpdateCheck-PDZIFUJE.js → skillsUpdateCheck-YCNJYDJO.js} +3 -3
  159. package/dist/{snapshot-PFV7ALLH.js → snapshot-WSYZKR3C.js} +35 -35
  160. package/dist/{src-XK5YIR6L.js → src-KTD6WTEV.js} +8 -8
  161. package/dist/{src-DCVSEODX.js → src-YNXBU4ZQ.js} +12 -6
  162. package/dist/{state-ORRPOLMQ.js → state-JPNCCXAV.js} +3 -1
  163. package/dist/{staticProjectServer-4IE4G4JO.js → staticProjectServer-D2D3BKBP.js} +18 -16
  164. package/dist/studio/assets/{hyperframes-player-B_skzvYC.js → hyperframes-player-CkK8Zijf.js} +1 -1
  165. package/dist/studio/assets/{index-CgLbvCUo.js → index-ATnRoBug.js} +1 -1
  166. package/dist/studio/assets/{index-Dn5FAk2e.js → index-B2JcCaRF.js} +130 -130
  167. package/dist/studio/index.html +1 -1
  168. package/dist/{studio-api-JMWYU7KF.js → studio-api-3ZGQPE5J.js} +10 -10
  169. package/dist/{studioServer-BWLSTGIG.js → studioServer-VWM4J7ZP.js} +48 -48
  170. package/dist/{telemetry-JCU3AV7W.js → telemetry-BEVI64BB.js} +3 -3
  171. package/dist/templates/_shared/AGENTS.md +5 -0
  172. package/dist/templates/_shared/CLAUDE.md +5 -0
  173. package/dist/{timeline-BCIFQYOM.js → timeline-P57FUXJQ.js} +18 -18
  174. package/dist/{tokens-7IXKALMQ.js → tokens-OUQY6LPD.js} +2 -2
  175. package/dist/{transcribe-ZUQD3B32.js → transcribe-CK66VIU4.js} +10 -10
  176. package/dist/{transcribe-HW7HGJ4V.js → transcribe-QUPX67KC.js} +16 -16
  177. package/dist/{updateCheck-Z6LNEK7B.js → updateCheck-XZ43CH3L.js} +2 -2
  178. package/dist/{upgrade-JYH72JGL.js → upgrade-7QQNGI7I.js} +2 -2
  179. package/dist/{urlDownloader-WKLFHSUH.js → urlDownloader-ESAEL6YX.js} +6 -6
  180. package/dist/{validate-QCC27YYI.js → validate-5GZ6KFRU.js} +24 -24
  181. package/dist/{video-EZ7ONY6L.js → video-AQNVR6PE.js} +7 -7
  182. package/dist/warmCheck.js +37 -38
  183. package/package.json +18 -2
  184. package/dist/chunk-KANNRHY7.js +0 -53
  185. package/dist/chunk-UOZX5W5T.js +0 -3852
  186. package/dist/deploy-CDKCQ5MX.js +0 -196
@@ -21,13 +21,13 @@ import {
21
21
  mkdirWithinProject
22
22
  } from "./chunk-OFQWTKPW.js";
23
23
 
24
- // ../studio-server/dist/chunk-XM2TJIF5.js
24
+ // ../studio-server/dist/chunk-YIMSBQIO.js
25
25
  import { randomUUID as randomUUID7 } from "crypto";
26
26
  import { mkdir as mkdir2, readdir as readdir3, rm as rm3, rmdir, writeFile } from "fs/promises";
27
27
  import {
28
28
  existsSync as existsSync3,
29
29
  lstatSync as lstatSync4,
30
- statSync as statSync4,
30
+ statSync as statSync5,
31
31
  mkdirSync as mkdirSync5,
32
32
  readdirSync as readdirSync4,
33
33
  readFileSync as readFileSync10,
@@ -40,7 +40,15 @@ import { createHash, randomUUID } from "crypto";
40
40
  import { readFileSync as readFileSync2 } from "fs";
41
41
  import { isAbsolute, relative, resolve, sep } from "path";
42
42
  import { randomUUID as randomUUID2 } from "crypto";
43
- import { linkSync, mkdirSync, readFileSync, renameSync, rmSync, writeFileSync } from "fs";
43
+ import {
44
+ linkSync,
45
+ mkdirSync,
46
+ readFileSync,
47
+ renameSync,
48
+ rmSync,
49
+ statSync,
50
+ writeFileSync
51
+ } from "fs";
44
52
  import { join } from "path";
45
53
  import { createHash as createHash2 } from "crypto";
46
54
  import { lstatSync, readFileSync as readFileSync3, readdirSync } from "fs";
@@ -51,15 +59,15 @@ import { copyFile, mkdir, readdir, readFile, rename, rm, stat } from "fs/promise
51
59
  import { dirname, join as join2 } from "path";
52
60
  import { pipeline } from "stream/promises";
53
61
  import { randomUUID as randomUUID5 } from "crypto";
54
- import { readdirSync as readdirSync2, readFileSync as readFileSync5, renameSync as renameSync3, statSync as statSync2, writeFileSync as writeFileSync3 } from "fs";
62
+ import { readdirSync as readdirSync2, readFileSync as readFileSync5, renameSync as renameSync3, statSync as statSync3, writeFileSync as writeFileSync3 } from "fs";
55
63
  import { lstat, readdir as readdir2, rm as rm2 } from "fs/promises";
56
64
  import { tmpdir } from "os";
57
65
  import { dirname as dirname2, join as join4 } from "path";
58
66
  import { randomUUID as randomUUID4 } from "crypto";
59
- import { existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync4, statSync, writeFileSync as writeFileSync2 } from "fs";
67
+ import { existsSync, mkdirSync as mkdirSync2, readFileSync as readFileSync4, statSync as statSync2, writeFileSync as writeFileSync2 } from "fs";
60
68
  import { basename, join as join3, resolve as resolve3 } from "path";
61
69
  import { createHash as createHash5, randomUUID as randomUUID6 } from "crypto";
62
- import { createReadStream as createReadStream2, existsSync as existsSync2, readFileSync as readFileSync8, renameSync as renameSync4, statSync as statSync3 } from "fs";
70
+ import { createReadStream as createReadStream2, existsSync as existsSync2, readFileSync as readFileSync8, renameSync as renameSync4, statSync as statSync4 } from "fs";
63
71
  import { isAbsolute as isAbsolute4, join as join7, resolve as resolve6 } from "path";
64
72
  import { createHash as createHash4 } from "crypto";
65
73
  import {
@@ -175,6 +183,8 @@ var HistoryBusyError = class extends Error {
175
183
  url;
176
184
  };
177
185
  var WINDOWS_BUSY = /* @__PURE__ */ new Set(["EPERM", "EBUSY", "EACCES"]);
186
+ var NO_HARD_LINKS = /* @__PURE__ */ new Set(["ENOTSUP", "EOPNOTSUPP", "ENOSYS", "EPERM"]);
187
+ var TAKING_MS = 2e3;
178
188
  function busyOnWindows(error) {
179
189
  return process.platform === "win32" && WINDOWS_BUSY.has(error.code ?? "");
180
190
  }
@@ -196,6 +206,17 @@ function ownerOf(file) {
196
206
  throw error;
197
207
  }
198
208
  }
209
+ function beingTaken(file) {
210
+ try {
211
+ const { size, mtimeMs } = statSync(file);
212
+ return size === 0 && Date.now() - mtimeMs < TAKING_MS;
213
+ } catch {
214
+ return false;
215
+ }
216
+ }
217
+ function deadHolder(file, pid) {
218
+ return !alive(pid) && !beingTaken(file);
219
+ }
199
220
  function claim(file) {
200
221
  const draft = `${file}-${process.pid}-${randomUUID2()}.tmp`;
201
222
  writeFileSync(draft, String(process.pid));
@@ -203,12 +224,23 @@ function claim(file) {
203
224
  linkSync(draft, file);
204
225
  return true;
205
226
  } catch (error) {
206
- if (error.code !== "EEXIST") throw error;
207
- return false;
227
+ const code = error.code ?? "";
228
+ if (code === "EEXIST") return false;
229
+ if (!NO_HARD_LINKS.has(code)) throw error;
230
+ return createExclusively(file);
208
231
  } finally {
209
232
  rmSync(draft, { force: true });
210
233
  }
211
234
  }
235
+ function createExclusively(file) {
236
+ try {
237
+ writeFileSync(file, String(process.pid), { flag: "wx" });
238
+ return true;
239
+ } catch (error) {
240
+ if (error.code !== "EEXIST") throw error;
241
+ return false;
242
+ }
243
+ }
212
244
  function releaseOwn(file) {
213
245
  if (ownerOf(file) === process.pid) rmSync(file, { force: true });
214
246
  }
@@ -216,12 +248,12 @@ function evictDeadOwner(file) {
216
248
  const evictor = `${file}.evict`;
217
249
  if (!claim(evictor)) {
218
250
  const holder = ownerOf(evictor);
219
- if (holder !== null && !alive(holder)) rmSync(evictor, { force: true });
251
+ if (holder !== null && deadHolder(evictor, holder)) rmSync(evictor, { force: true });
220
252
  return false;
221
253
  }
222
254
  try {
223
255
  const pid = ownerOf(file);
224
- if (pid !== null && !alive(pid)) rmSync(file, { force: true });
256
+ if (pid !== null && deadHolder(file, pid)) rmSync(file, { force: true });
225
257
  return true;
226
258
  } finally {
227
259
  releaseOwn(evictor);
@@ -246,7 +278,7 @@ function attemptClaim(file, urlFile, deadline) {
246
278
  if (claim(file)) return "claimed";
247
279
  const pid = ownerOf(file);
248
280
  if (pid === null) return "retry";
249
- if (!alive(pid) && evictDeadOwner(file)) return "retry";
281
+ if (deadHolder(file, pid) && evictDeadOwner(file)) return "retry";
250
282
  if (Date.now() >= deadline) throw new HistoryBusyError(pid, servedBy(file, urlFile, pid));
251
283
  return "wait";
252
284
  }
@@ -591,7 +623,7 @@ function readRecord(historyDir) {
591
623
  function isCopyOf0878Folder(recordedDir, id, folder) {
592
624
  let there;
593
625
  try {
594
- there = statSync(recordedDir, { throwIfNoEntry: false });
626
+ there = statSync2(recordedDir, { throwIfNoEntry: false });
595
627
  } catch {
596
628
  return false;
597
629
  }
@@ -599,7 +631,7 @@ function isCopyOf0878Folder(recordedDir, id, folder) {
599
631
  }
600
632
  function projectHistoryId(projectDir, historyRoot) {
601
633
  const dir = resolve3(projectDir);
602
- const folder = statSync(dir);
634
+ const folder = statSync2(dir);
603
635
  let id = readId(dir);
604
636
  if (!id && existsSync(join3(dir, ID_PATH)))
605
637
  throw new HistoryIdError(
@@ -724,24 +756,24 @@ function abandonedProject(home, id, now, tempDir) {
724
756
  return projectGone(dir, id, record?.dev, tempDir) ? dir : null;
725
757
  }
726
758
  function projectGone(dir, id, dev, tempDir) {
727
- if (!statSync2(join4(dir, ID_PATH), { throwIfNoEntry: false }))
759
+ if (!statSync3(join4(dir, ID_PATH), { throwIfNoEntry: false }))
728
760
  return diskStillHere(dir, dev, tempDir);
729
761
  const there = readId(dir);
730
762
  return there !== null && there !== id;
731
763
  }
732
764
  function diskStillHere(dir, dev, tempDir) {
733
765
  let at = dir;
734
- let stat2 = statSync2(at, { throwIfNoEntry: false });
766
+ let stat2 = statSync3(at, { throwIfNoEntry: false });
735
767
  while (!stat2) {
736
768
  if (dirname2(at) === at) return false;
737
769
  at = dirname2(at);
738
- stat2 = statSync2(at, { throwIfNoEntry: false });
770
+ stat2 = statSync3(at, { throwIfNoEntry: false });
739
771
  }
740
772
  if (typeof dev === "number") return stat2.dev === dev;
741
773
  return at === dir || isSafePath(tempDir, at);
742
774
  }
743
775
  function lastUsed(home) {
744
- const mtime = (file) => statSync2(join4(home, file), { throwIfNoEntry: false })?.mtimeMs ?? 0;
776
+ const mtime = (file) => statSync3(join4(home, file), { throwIfNoEntry: false })?.mtimeMs ?? 0;
745
777
  return Math.max(mtime("project.json"), mtime("log.jsonl"));
746
778
  }
747
779
  async function bytesIn(dir) {
@@ -1305,7 +1337,7 @@ function retainRevision(retained, revision) {
1305
1337
  return [revision, ...retained.filter((id) => id !== revision)].slice(0, 2);
1306
1338
  }
1307
1339
  async function recordRenderSuccess(projectDir, output, status = "completed", capture) {
1308
- const outputFile = statSync3(output);
1340
+ const outputFile = statSync4(output);
1309
1341
  if (!outputFile.isFile() && !outputFile.isDirectory() || outputFile.isFile() && outputFile.size === 0)
1310
1342
  throw new Error("Render output is missing or empty.");
1311
1343
  const after = capture ? await beginArtifactCapture(projectDir) : null;
@@ -1534,8 +1566,8 @@ function fileLeftIn(dir, at, deleted) {
1534
1566
  return void 0;
1535
1567
  }
1536
1568
  function ignoresCase(dir) {
1537
- const self = statSync4(join8(dir, ID_PATH), { throwIfNoEntry: false });
1538
- const other = statSync4(join8(dir, ID_PATH.toUpperCase()), { throwIfNoEntry: false });
1569
+ const self = statSync5(join8(dir, ID_PATH), { throwIfNoEntry: false });
1570
+ const other = statSync5(join8(dir, ID_PATH.toUpperCase()), { throwIfNoEntry: false });
1539
1571
  return self !== void 0 && other?.ino === self.ino && other.dev === self.dev;
1540
1572
  }
1541
1573
  var blocks = (removed, added) => added.startsWith(`${removed}/`) || removed.startsWith(`${added}/`);
@@ -1575,7 +1607,7 @@ var Engine = class {
1575
1607
  this.dir = resolve7(options.projectDir);
1576
1608
  this.home = join8(options.historyRoot, projectId);
1577
1609
  this.foldsCase = ignoresCase(this.dir);
1578
- const folder = statSync4(this.dir, { throwIfNoEntry: false });
1610
+ const folder = statSync5(this.dir, { throwIfNoEntry: false });
1579
1611
  if (!folder || readId(this.dir) !== projectId || !isRecordedFolder(this.home, folder))
1580
1612
  throw this.replaced();
1581
1613
  this.folder = { dev: folder.dev, ino: folder.ino, birthtimeMs: folder.birthtimeMs };
@@ -1640,7 +1672,7 @@ var Engine = class {
1640
1672
  }
1641
1673
  /** Another project if the folder or its id changed, or the id is gone: a recreated folder may reuse the inode. */
1642
1674
  whereFolder() {
1643
- const now = statSync4(this.dir, { throwIfNoEntry: false });
1675
+ const now = statSync5(this.dir, { throwIfNoEntry: false });
1644
1676
  if (!now) return "gone";
1645
1677
  const same = now.dev === this.folder.dev && sameFolder(now, this.folder);
1646
1678
  return same && readId(this.dir) === this.projectId ? "here" : "replaced";
@@ -2445,7 +2477,7 @@ async function openProjectHistory(options) {
2445
2477
  function readProjectHistory(options) {
2446
2478
  const dir = resolve7(options.projectDir);
2447
2479
  const id = readId(dir);
2448
- const home = id && isRecordedFolder(join8(options.historyRoot, id), statSync4(dir)) ? join8(options.historyRoot, id) : null;
2480
+ const home = id && isRecordedFolder(join8(options.historyRoot, id), statSync5(dir)) ? join8(options.historyRoot, id) : null;
2449
2481
  const read = home && readLog(logFileIn(home), () => {
2450
2482
  });
2451
2483
  const log = withoutHiddenPaths(read || { baseline: /* @__PURE__ */ new Map(), entries: [], pins: /* @__PURE__ */ new Set() });
@@ -6,27 +6,27 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-HZ7M2MZA.js";
9
+ } from "./chunk-37EPEFXM.js";
10
10
  import {
11
11
  serveStaticProjectHtml
12
- } from "./chunk-ZVBEGBII.js";
12
+ } from "./chunk-CSYSEPWL.js";
13
13
  import {
14
14
  AUDIT_SEEK_OPTIONS,
15
15
  installPageFunctionGuard,
16
16
  seekCompositionTimeline,
17
17
  waitForCompositionFonts,
18
18
  waitForRuntimeReady
19
- } from "./chunk-U4BMRIE6.js";
19
+ } from "./chunk-TREMHDWT.js";
20
20
  import {
21
21
  launchManagedBrowser,
22
22
  resolveManagedGpuMode
23
- } from "./chunk-UAJCTEK2.js";
23
+ } from "./chunk-HNMDLKA4.js";
24
24
  import {
25
25
  gotoWhenSent
26
26
  } from "./chunk-MOEGCMKI.js";
27
27
  import {
28
28
  pageNavigationTimeoutMs
29
- } from "./chunk-7AUMTARQ.js";
29
+ } from "./chunk-565X6Q4X.js";
30
30
  import {
31
31
  defineCommand
32
32
  } from "./chunk-S3S4TGEH.js";
@@ -40,7 +40,7 @@ import {
40
40
  import {
41
41
  printDeprecationNotice,
42
42
  withMeta
43
- } from "./chunk-FRLTKTOR.js";
43
+ } from "./chunk-OHXHBMF4.js";
44
44
  import {
45
45
  normalizeErrorMessage
46
46
  } from "./chunk-KNU5COPB.js";
@@ -715,7 +715,7 @@ async function collectTweenBoundaries(page) {
715
715
  });
716
716
  }
717
717
  async function bundleProjectHtml(projectDir) {
718
- const { bundleToSingleHtml } = await import("./compiler-2EKSMC3I.js");
718
+ const { bundleToSingleHtml } = await import("./compiler-23MT6CX6.js");
719
719
  return bundleToSingleHtml(projectDir);
720
720
  }
721
721
  async function alignViewportToComposition(page, url) {
@@ -734,13 +734,13 @@ async function alignViewportToComposition(page, url) {
734
734
  async function runLayoutAudit(projectDir, opts) {
735
735
  const { ensureBrowser } = await import("./manager-UHWEKPXC.js");
736
736
  const puppeteer = await import("puppeteer-core");
737
- const { buildChromeArgs } = await import("./src-DCVSEODX.js");
737
+ const { buildChromeArgs } = await import("./src-YNXBU4ZQ.js");
738
738
  const {
739
739
  assertWebGpuAdapterAvailable,
740
740
  compositionRequiresWebGpu,
741
741
  resolveLocalBrowserGpuMode,
742
742
  resolveLocalWebGpu
743
- } = await import("./gpuPolicy-NSNVDFXC.js");
743
+ } = await import("./gpuPolicy-AWAJBGYY.js");
744
744
  const html = await bundleProjectHtml(projectDir);
745
745
  const server = await serveStaticProjectHtml(
746
746
  projectDir,
@@ -4,35 +4,35 @@ import { dirname as __hf_dirname } from "node:path";
4
4
  var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
- import {
8
- resolveCompositionViewportFromHtml
9
- } from "./chunk-FH7WODJH.js";
10
7
  import {
11
8
  launchManagedBrowser,
12
9
  resolveManagedGpuMode,
13
10
  rethrowAfterBrowserCleanup
14
- } from "./chunk-UAJCTEK2.js";
11
+ } from "./chunk-HNMDLKA4.js";
15
12
  import {
16
13
  gotoWhenSent
17
14
  } from "./chunk-MOEGCMKI.js";
18
15
  import {
19
16
  pageNavigationTimeoutMs,
20
17
  windowsChromeCrashRemediation
21
- } from "./chunk-7AUMTARQ.js";
18
+ } from "./chunk-565X6Q4X.js";
22
19
  import {
23
20
  oneProcessOverPipe
24
21
  } from "./chunk-DKPNNYBZ.js";
22
+ import {
23
+ resolveCompositionViewportFromHtml
24
+ } from "./chunk-SGFMCNLY.js";
25
25
  import {
26
26
  resolveLocalBrowserGpuMode,
27
27
  resolveLocalWebGpu
28
- } from "./chunk-RVZNSKRH.js";
28
+ } from "./chunk-B52BJM5K.js";
29
29
  import {
30
30
  c
31
31
  } from "./chunk-ZTZA4UWZ.js";
32
32
  import {
33
33
  assertWebGpuAdapterAvailable,
34
34
  compositionRequiresWebGpu
35
- } from "./chunk-7M7TMM4S.js";
35
+ } from "./chunk-HXM2ISEK.js";
36
36
  import {
37
37
  normalizeErrorMessage
38
38
  } from "./chunk-KNU5COPB.js";
@@ -138,7 +138,7 @@ async function waitForCompositionSettle(page, options) {
138
138
  console.warn(` ${c.warn("\u26A0")} Shader transitions did not finish pre-rendering`);
139
139
  });
140
140
  await waitForLateSubresources(page, options.lateSubresourceTimeoutMs ?? CAPTURE_SETTLE_MS);
141
- const { resolveConfig, waitForImagesReady } = await import("./src-DCVSEODX.js");
141
+ const { resolveConfig, waitForImagesReady } = await import("./src-YNXBU4ZQ.js");
142
142
  const imageTimeoutMs = resolveConfig().playerReadyTimeout;
143
143
  await waitForImagesReady(
144
144
  page,
@@ -187,7 +187,7 @@ async function installPageFunctionGuard(page) {
187
187
  async function openSettledCompositionPage(html, url, options) {
188
188
  const viewport = resolveCompositionViewportFromHtml(html);
189
189
  const requiresWebGpu = compositionRequiresWebGpu(html);
190
- const answer = (await import("./staticProjectServer-4IE4G4JO.js")).inProcessAnswer(url);
190
+ const answer = (await import("./staticProjectServer-D2D3BKBP.js")).inProcessAnswer(url);
191
191
  const noListen = answer !== void 0;
192
192
  let chromeBrowser;
193
193
  try {
@@ -198,6 +198,8 @@ async function openSettledCompositionPage(html, url, options) {
198
198
  options.onBrowserReady?.();
199
199
  const page = await chromeBrowser.newPage();
200
200
  await installPageFunctionGuard(page);
201
+ const { installMediaRenderIdBridge } = await import("./src-YNXBU4ZQ.js");
202
+ await installMediaRenderIdBridge(page);
201
203
  await page.setViewport(viewport);
202
204
  if (answer) await answerPageInProcess(page, url, answer);
203
205
  await options.beforeNavigate?.(page);
@@ -215,7 +217,7 @@ async function launchCompositionBrowser(html, noListen, options) {
215
217
  const { ensureBrowser, findSystemBrowser } = await import("./manager-UHWEKPXC.js");
216
218
  const browser = await ensureBrowser({ signal: options.signal });
217
219
  const puppeteer = await import("puppeteer-core");
218
- const { buildChromeArgs } = await import("./src-DCVSEODX.js");
220
+ const { buildChromeArgs } = await import("./src-YNXBU4ZQ.js");
219
221
  const requestedGpuMode = options.browserGpuMode ?? resolveCliChromeGpuMode();
220
222
  const requiresWebGpu = compositionRequiresWebGpu(html);
221
223
  let softwareWebGpu = false;
@@ -5897,6 +5897,53 @@ function findRuntimeMediaSrcMutationFindings(ctx) {
5897
5897
  }
5898
5898
  return findings;
5899
5899
  }
5900
+ var VOID_ELEMENTS = /* @__PURE__ */ new Set([
5901
+ "area",
5902
+ "base",
5903
+ "br",
5904
+ "col",
5905
+ "embed",
5906
+ "hr",
5907
+ "img",
5908
+ "input",
5909
+ "link",
5910
+ "meta",
5911
+ "source",
5912
+ "track",
5913
+ "wbr"
5914
+ ]);
5915
+ var closeTag = (name) => new RegExp(`</${name}>`, "gi");
5916
+ function innermostTimedWrapper(source, tags, media) {
5917
+ let found = null;
5918
+ for (const parent of tags) {
5919
+ if (parent.index >= media.index) break;
5920
+ if (parent.name === "video" || parent.name === "audio" || VOID_ELEMENTS.has(parent.name))
5921
+ continue;
5922
+ if (readDecodedAttr(parent.raw, "data-composition-id")) continue;
5923
+ const start = readAttr(parent.raw, "data-start");
5924
+ if (!start) continue;
5925
+ const events = [
5926
+ ...tags.filter((t) => t.name === parent.name && t.index > parent.index && t.index < media.index).map((t) => [t.index, 1]),
5927
+ ...[...source.substring(parent.index, media.index).matchAll(closeTag(parent.name))].map(
5928
+ (m) => [parent.index + m.index, -1]
5929
+ )
5930
+ ];
5931
+ let depth = 1;
5932
+ for (const [, delta] of events.sort((x, y) => x[0] - y[0])) {
5933
+ depth += delta;
5934
+ if (depth === 0) break;
5935
+ }
5936
+ if (depth > 0) {
5937
+ found = {
5938
+ name: parent.name,
5939
+ id: readAttr(parent.raw, "id") || void 0,
5940
+ start,
5941
+ duration: readAttr(parent.raw, "data-duration")
5942
+ };
5943
+ }
5944
+ }
5945
+ return found;
5946
+ }
5900
5947
  var mediaRules = [
5901
5948
  findNestedMediaStartBasisFindings,
5902
5949
  findSpeedRampOnNonMediaFindings,
@@ -6033,54 +6080,19 @@ var mediaRules = [
6033
6080
  // video_nested_in_timed_element
6034
6081
  ({ source, tags }) => {
6035
6082
  const findings = [];
6036
- const voidElements = /* @__PURE__ */ new Set([
6037
- "area",
6038
- "base",
6039
- "br",
6040
- "col",
6041
- "embed",
6042
- "hr",
6043
- "img",
6044
- "input",
6045
- "link",
6046
- "meta",
6047
- "source",
6048
- "track",
6049
- "wbr"
6050
- ]);
6051
- const timedTagPositions = [];
6052
- for (const tag of tags) {
6053
- if (tag.name === "video" || tag.name === "audio") continue;
6054
- if (voidElements.has(tag.name)) continue;
6055
- if (readDecodedAttr(tag.raw, "data-composition-id")) continue;
6056
- if (readAttr(tag.raw, "data-start")) {
6057
- timedTagPositions.push({
6058
- name: tag.name,
6059
- start: tag.index,
6060
- id: readAttr(tag.raw, "id") || void 0
6061
- });
6062
- }
6063
- }
6064
6083
  for (const tag of tags) {
6065
6084
  if (tag.name !== "video") continue;
6066
6085
  if (!readAttr(tag.raw, "data-start")) continue;
6067
- for (const parent of timedTagPositions) {
6068
- if (parent.start < tag.index) {
6069
- const parentClosePattern = new RegExp(`</${parent.name}>`, "gi");
6070
- const between = source.substring(parent.start, tag.index);
6071
- if (!parentClosePattern.test(between)) {
6072
- findings.push({
6073
- code: "video_nested_in_timed_element",
6074
- severity: "error",
6075
- message: `<video> with data-start is nested inside <${parent.name}${parent.id ? ` id="${parent.id}"` : ""}> which also has data-start. The frame extractor resolves the video's start from its own data-start without the wrapper's offset, while visibility uses the wrapper's window, so the two disagree: the clip shows the wrong source frames and then disappears partway through its slot.`,
6076
- elementId: readAttr(tag.raw, "id") || void 0,
6077
- fixHint: "Time the wrapper OR the video, never both: remove data-start from the wrapper (use it as a non-timed visual container), or move the <video> up to be a direct child of the stage.",
6078
- snippet: truncateSnippet(tag.raw)
6079
- });
6080
- break;
6081
- }
6082
- }
6083
- }
6086
+ const parent = innermostTimedWrapper(source, tags, tag);
6087
+ if (!parent) continue;
6088
+ findings.push({
6089
+ code: "video_nested_in_timed_element",
6090
+ severity: "error",
6091
+ message: `<video> with data-start is nested inside <${parent.name}${parent.id ? ` id="${parent.id}"` : ""}> which also has data-start. The frame extractor resolves the video's start from its own data-start without the wrapper's offset, while visibility uses the wrapper's window, so the two disagree: the clip shows the wrong source frames and then disappears partway through its slot.`,
6092
+ elementId: readAttr(tag.raw, "id") || void 0,
6093
+ fixHint: "Time the wrapper OR the video, never both: remove data-start from the wrapper (use it as a non-timed visual container), or move the <video> up to be a direct child of the stage.",
6094
+ snippet: truncateSnippet(tag.raw)
6095
+ });
6084
6096
  }
6085
6097
  return findings;
6086
6098
  },
@@ -6148,7 +6160,7 @@ var mediaRules = [
6148
6160
  return findings;
6149
6161
  },
6150
6162
  // media_missing_data_start + media_missing_id + media_missing_src + media_preload_none
6151
- ({ tags }) => {
6163
+ ({ source, tags }) => {
6152
6164
  const findings = [];
6153
6165
  for (const tag of tags) {
6154
6166
  if (tag.name !== "video" && tag.name !== "audio") continue;
@@ -6156,12 +6168,13 @@ var mediaRules = [
6156
6168
  const hasId = readAttr(tag.raw, "id");
6157
6169
  const hasSrc = mediaHasResolvableSrc(tag, tags);
6158
6170
  if (hasSrc && !hasDataStart) {
6171
+ const wrapper = tag.name === "video" ? innermostTimedWrapper(source, tags, tag) : null;
6159
6172
  findings.push({
6160
6173
  code: "media_missing_data_start",
6161
6174
  severity: "error",
6162
6175
  message: `<${tag.name}${hasId ? ` id="${hasId}"` : ""}> has src but no data-start. HyperFrames cannot own playback for untimed media, so preview and render behavior can diverge.`,
6163
6176
  elementId: hasId || void 0,
6164
- fixHint: `Add data-start="0" (or the intended start time) and data-duration if the clip should stop before the source ends.`,
6177
+ fixHint: wrapper ? `This <${tag.name}> sits inside the timed <${wrapper.name}${wrapper.id ? ` id="${wrapper.id}"` : ""}> (data-start="${wrapper.start}"), and the wrapper's data-start would then clash. Move the <${tag.name}> out as a direct child of the stage and give it that wrapper's data-start="${wrapper.start}"${wrapper.duration ? ` and data-duration="${wrapper.duration}"` : ""}.` : `Add data-start="0" (or the intended start time) and data-duration if the clip should stop before the source ends.`,
6165
6178
  snippet: truncateSnippet(tag.raw)
6166
6179
  });
6167
6180
  }
@@ -11,7 +11,7 @@ import {
11
11
  DEFAULT_REGISTRY_URL,
12
12
  fetchItemManifest,
13
13
  fetchRegistryManifest
14
- } from "./chunk-YRAJDFIN.js";
14
+ } from "./chunk-5HJJEHGE.js";
15
15
 
16
16
  // src/registry/resolver.ts
17
17
  function defaultWarn(message) {
@@ -8,14 +8,14 @@ import {
8
8
  DEFAULT_REGISTRY_URL,
9
9
  fetchItemFile,
10
10
  validRegistryItem
11
- } from "./chunk-YRAJDFIN.js";
11
+ } from "./chunk-5HJJEHGE.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-RNZEQTWZ.js";
18
+ } from "./chunk-WYCFMNU3.js";
19
19
  import {
20
20
  realProjectRoot
21
21
  } from "./chunk-OFQWTKPW.js";
@@ -9,7 +9,7 @@ import {
9
9
  parseStrictFiniteTimingNumber,
10
10
  resolveNaturalMediaTimelineDuration,
11
11
  resolveTimedImageDurationSeconds
12
- } from "./chunk-UOZX5W5T.js";
12
+ } from "./chunk-BPX7LZG6.js";
13
13
  import {
14
14
  CANVAS_DIMENSIONS,
15
15
  isCompositionElement,
@@ -1188,6 +1188,16 @@ function parseFirstFrameColour(stderr) {
1188
1188
  // ../core/dist/previewProxyBox.js
1189
1189
  var PREVIEW_PROXY_BOX_PARAM = "hf-proxy-box";
1190
1190
  var RUNGS = [256, 362, 512, 724, 1024, 1448, 2048, 2896, 4096, 5792, 8192];
1191
+ function rungAtLeast(pixels) {
1192
+ if (!(pixels > 0))
1193
+ return null;
1194
+ return RUNGS.find((rung) => rung >= pixels) ?? null;
1195
+ }
1196
+ function quantizePreviewProxyBox(width, height) {
1197
+ const w = rungAtLeast(width);
1198
+ const h = rungAtLeast(height);
1199
+ return w && h ? { width: w, height: h } : null;
1200
+ }
1191
1201
  function formatPreviewProxyBox(box) {
1192
1202
  return `${box.width}x${box.height}`;
1193
1203
  }
@@ -1205,6 +1215,7 @@ import { existsSync } from "fs";
1205
1215
  import { createRequire } from "module";
1206
1216
  import { dirname, resolve } from "path";
1207
1217
  import { fileURLToPath } from "url";
1218
+ var RUNTIME_ESBUILD_DEFINE = { console: "globalThis.console" };
1208
1219
  function applyDefaultParityMode(script, enabled) {
1209
1220
  const parityFlagPattern = /var\s+_parityModeEnabled\s*=\s*(?:true|false)\s*;/;
1210
1221
  if (!parityFlagPattern.test(script))
@@ -1224,7 +1235,8 @@ function buildHyperframesRuntimeScript(options = {}) {
1224
1235
  format: "iife",
1225
1236
  target: ["es2020"],
1226
1237
  minify: options.minify ?? true,
1227
- legalComments: "none"
1238
+ legalComments: "none",
1239
+ define: RUNTIME_ESBUILD_DEFINE
1228
1240
  });
1229
1241
  let script = result.outputFiles[0]?.text ?? "";
1230
1242
  if (typeof options.defaultParityMode === "boolean") {
@@ -5543,6 +5555,7 @@ export {
5543
5555
  firstFrameColourArgs,
5544
5556
  parseFirstFrameColour,
5545
5557
  PREVIEW_PROXY_BOX_PARAM,
5558
+ quantizePreviewProxyBox,
5546
5559
  formatPreviewProxyBox,
5547
5560
  parsePreviewProxyBox,
5548
5561
  buildHyperframesRuntimeScript,
@@ -29,6 +29,12 @@ function clampAudioGain(value) {
29
29
  return 1;
30
30
  return Math.max(0, Math.min(MAX_AUDIO_GAIN, value));
31
31
  }
32
+ function gainTimesLane(gain, lane) {
33
+ return clampAudioGain(gain * lane);
34
+ }
35
+ function clipGain(volume, tweened) {
36
+ return tweened ? 1 : clampAudioGain(volume);
37
+ }
32
38
  function formatAudioGain(gain) {
33
39
  return clampAudioGain(gain).toFixed(6).replace(/\.?0+$/, "");
34
40
  }
@@ -37,6 +43,8 @@ export {
37
43
  MAX_AUDIO_GAIN_DB,
38
44
  MAX_AUDIO_GAIN,
39
45
  clampAudioGain,
46
+ gainTimesLane,
47
+ clipGain,
40
48
  formatAudioGain,
41
49
  AUDIBLE_VIDEO_QUALIFIER,
42
50
  AUDIBLE_MEDIA_SELECTOR,
@@ -8,10 +8,10 @@ import {
8
8
  DEFAULT_VP9_CPU_USED,
9
9
  isHttpUrl,
10
10
  runFfmpeg
11
- } from "./chunk-7M7TMM4S.js";
11
+ } from "./chunk-HXM2ISEK.js";
12
12
  import {
13
13
  parseAnimatedGifMetadata
14
- } from "./chunk-RNZEQTWZ.js";
14
+ } from "./chunk-WYCFMNU3.js";
15
15
  import {
16
16
  parseHTML
17
17
  } from "./chunk-SDYDNHEE.js";
@@ -49,7 +49,11 @@ function parseReservedConcurrency(raw) {
49
49
  }
50
50
  function samDeploy(opts) {
51
51
  assertSamAvailable();
52
- const paramOverrides = [`ChromeSource=${opts.chromeSource ?? "sparticuz"}`];
52
+ const paramOverrides = [
53
+ `ChromeSource=${opts.chromeSource ?? "sparticuz"}`,
54
+ // Always sent: omitted, SAM's UsePreviousValue would keep a video function the user dropped.
55
+ `VideoImageUri=${opts.videoImageUri ?? '""'}`
56
+ ];
53
57
  if (opts.reservedConcurrency !== void 0) {
54
58
  paramOverrides.push(`ReservedConcurrency=${opts.reservedConcurrency}`);
55
59
  }
@@ -133,14 +137,34 @@ function fetchStackOutputs(opts) {
133
137
  // for cost math + CloudWatch lookups.
134
138
  functionName: functionName.split(":").pop() ?? functionName,
135
139
  stateMachineArn,
136
- reservedConcurrency: reserved > 0 ? reserved : void 0
140
+ reservedConcurrency: reserved > 0 ? reserved : void 0,
141
+ videoFunctionName: byKey.get("VideoFunctionArn")?.split(":").pop()
137
142
  };
138
143
  }
144
+ function deleteEcrRepository(opts) {
145
+ assertAwsCliAvailable();
146
+ const args = [
147
+ "ecr",
148
+ "delete-repository",
149
+ "--repository-name",
150
+ opts.repositoryName,
151
+ "--force",
152
+ "--region",
153
+ opts.region
154
+ ];
155
+ if (opts.awsProfile) args.push("--profile", opts.awsProfile);
156
+ const result = spawnSync("aws", args, { encoding: "utf-8" });
157
+ if (result.status === 0 || result.stderr?.includes("RepositoryNotFoundException")) return;
158
+ throw new Error(
159
+ `[lambda] aws ecr delete-repository ${opts.repositoryName} exited with code ${result.status ?? "unknown"}: ${result.stderr ?? ""}`
160
+ );
161
+ }
139
162
 
140
163
  export {
141
164
  locateSamTemplate,
142
165
  parseReservedConcurrency,
143
166
  samDeploy,
144
167
  samDelete,
145
- fetchStackOutputs
168
+ fetchStackOutputs,
169
+ deleteEcrRepository
146
170
  };