hyperframes 0.8.181 → 0.8.183

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 (215) hide show
  1. package/bin/hyperframes.mjs +3 -1
  2. package/dist/{add-AWQ2EGBU.js → add-HW3ZGR36.js} +22 -22
  3. package/dist/{animatedGifPrep-SENXJ7TN.js → animatedGifPrep-EPLN37ZN.js} +13 -13
  4. package/dist/api.js +28 -28
  5. package/dist/{asset-XBH3MN3Y.js → asset-TOASKL3Z.js} +3 -3
  6. package/dist/{assetCataloger-KH4X2CRO.js → assetCataloger-PZN5HYG2.js} +15 -13
  7. package/dist/{audio-Q7I473UN.js → audio-F5OIQVJO.js} +29 -29
  8. package/dist/{auth-I7CBTEUS.js → auth-YVQLRS3T.js} +4 -4
  9. package/dist/{autoUpdate-KY5TLSN7.js → autoUpdate-EG4ZFW4D.js} +2 -2
  10. package/dist/{backgroundChecks-4Q3VVK5W.js → backgroundChecks-WINNQVR2.js} +3 -3
  11. package/dist/backgroundChecksWorker.js +3 -3
  12. package/dist/{batchRender-3AYDQRBI.js → batchRender-PASZTMEE.js} +7 -7
  13. package/dist/{beats-P4LENNVT.js → beats-KGIOEBLW.js} +12 -12
  14. package/dist/{benchmark-AXOAECN3.js → benchmark-ZNY2L7HN.js} +24 -24
  15. package/dist/{browser-XZKB5HGJ.js → browser-REAO7RU4.js} +20 -20
  16. package/dist/{bundleWithLocalizedFonts-2WCR57IN.js → bundleWithLocalizedFonts-OAYLYC4W.js} +2 -2
  17. package/dist/{capture-NWARHRHR.js → capture-IK6GWQDD.js} +8 -5
  18. package/dist/{capture-4RN4APDF.js → capture-WOSF276U.js} +49 -41
  19. package/dist/{captureCompositionFrame-QOF5BRF4.js → captureCompositionFrame-DDZNKYRE.js} +21 -20
  20. package/dist/{captureTimeout-K2JNVVCI.js → captureTimeout-RIMG6IYH.js} +1 -1
  21. package/dist/{catalog-CRPOPVD5.js → catalog-AKTXS7OJ.js} +42 -42
  22. package/dist/{catch-up-MHWGUQ42.js → catch-up-O3VZMPVE.js} +15 -15
  23. package/dist/check-6E46NIWI.js +116 -0
  24. package/dist/checkBrowser-UNZHQFNH.js +117 -0
  25. package/dist/{chunk-Y2RXRPL2.js → chunk-3BA2GP4H.js} +5 -5
  26. package/dist/{chunk-N5SXQCJL.js → chunk-3OLIGYWN.js} +3 -3
  27. package/dist/{chunk-OR5WCFWZ.js → chunk-3Q47QC46.js} +2 -2
  28. package/dist/{chunk-EOADENKV.js → chunk-4FQKS7BJ.js} +16 -14
  29. package/dist/{chunk-HODBPO4A.js → chunk-4UFJWRHG.js} +461 -275
  30. package/dist/{chunk-537IYAEE.js → chunk-4UMPIPCQ.js} +9 -1
  31. package/dist/{chunk-OJTDUF4W.js → chunk-5MBLWFLM.js} +1 -1
  32. package/dist/{chunk-UVEQLDKB.js → chunk-5OGDBU4G.js} +3 -2
  33. package/dist/{chunk-L3YOGIPG.js → chunk-66LREXGS.js} +1 -1
  34. package/dist/{chunk-YPBIAONI.js → chunk-73LTCCZI.js} +218 -150
  35. package/dist/{chunk-GZVP4TWN.js → chunk-7JAD4MEW.js} +1 -1
  36. package/dist/{chunk-NAMGMP3R.js → chunk-7KVVNF7B.js} +1 -1
  37. package/dist/{chunk-GK2FIKIQ.js → chunk-ADDHW2FS.js} +214 -37
  38. package/dist/{chunk-WUQUR33W.js → chunk-AKFADCMS.js} +1 -1
  39. package/dist/{chunk-VAJIPSN6.js → chunk-ANR6WOC3.js} +1 -1
  40. package/dist/{chunk-4USWWI2Y.js → chunk-ATMDOUNN.js} +2 -2
  41. package/dist/{chunk-XSRUVMXK.js → chunk-B2SZZFWW.js} +4 -4
  42. package/dist/{chunk-TO6JNTML.js → chunk-BP4VNTZL.js} +13 -8
  43. package/dist/{chunk-DJJ7SK4F.js → chunk-CAHTO62O.js} +8 -8
  44. package/dist/{chunk-GNE57O7U.js → chunk-CGK4XZ2J.js} +1 -1
  45. package/dist/{chunk-O5AE7HOP.js → chunk-CJYAJ3QM.js} +37 -33
  46. package/dist/{chunk-5JMZLQT6.js → chunk-COTLNID2.js} +16 -16
  47. package/dist/{chunk-E24HSMZV.js → chunk-CYBXXSC4.js} +65 -14
  48. package/dist/{chunk-NZZYJOMJ.js → chunk-CZUAX3BV.js} +6 -5
  49. package/dist/{chunk-K26FR4SM.js → chunk-DEORFAWP.js} +12 -12
  50. package/dist/{chunk-GV5R5B7Q.js → chunk-DGECWPTL.js} +1 -1
  51. package/dist/{chunk-BRHI7EIA.js → chunk-DKPNNYBZ.js} +4 -0
  52. package/dist/{chunk-5E5EYPZO.js → chunk-DLC2FICN.js} +7 -7
  53. package/dist/{chunk-D3ZWBHZP.js → chunk-DYAPHNV6.js} +3 -2
  54. package/dist/{chunk-RGHQID2E.js → chunk-EHSBBBR2.js} +5 -3
  55. package/dist/{chunk-IWTRHPTP.js → chunk-EVAQPW6O.js} +8 -8
  56. package/dist/{chunk-S3RYRF3W.js → chunk-F6WHPHLF.js} +1 -1
  57. package/dist/chunk-FG4BBFZI.js +122 -0
  58. package/dist/{chunk-WITHUCCB.js → chunk-GAGMLVCV.js} +2 -2
  59. package/dist/chunk-GMNHAOMJ.js +3805 -0
  60. package/dist/{chunk-KIO3R4QN.js → chunk-GPE3WWTO.js} +16 -6
  61. package/dist/{chunk-IL3GTCQY.js → chunk-GTE5WZAM.js} +72 -140
  62. package/dist/{chunk-55IG255C.js → chunk-HLBODNGW.js} +1 -1
  63. package/dist/{chunk-KMAAOHLO.js → chunk-HRPWRZGF.js} +1 -1
  64. package/dist/{chunk-UPFUC4DB.js → chunk-HTIUNMTP.js} +1 -1
  65. package/dist/{chunk-WUUCEFL5.js → chunk-IC2WYONA.js} +5 -5
  66. package/dist/{chunk-DUN63LHY.js → chunk-ITSLKUQM.js} +2 -2
  67. package/dist/{chunk-YJDB4FLT.js → chunk-JQYJXUJW.js} +1 -1
  68. package/dist/{chunk-PBN6GBJE.js → chunk-JVBRJMOP.js} +14 -1
  69. package/dist/{chunk-XH262OWN.js → chunk-K2Z5DZBS.js} +1 -1
  70. package/dist/{chunk-RHWJKSGH.js → chunk-KANNRHY7.js} +1 -1
  71. package/dist/{chunk-AOWDVB2T.js → chunk-KRFAX5JK.js} +1 -1
  72. package/dist/{chunk-UIDZRCBG.js → chunk-LBWRQ4XA.js} +1 -1
  73. package/dist/{chunk-T7UHTUUE.js → chunk-MIZDJVPZ.js} +9 -9
  74. package/dist/{chunk-32GKETR7.js → chunk-MMQ52NIZ.js} +74 -0
  75. package/dist/chunk-MOEGCMKI.js +180 -0
  76. package/dist/{chunk-E6RPWJVC.js → chunk-NAUKCKCJ.js} +5 -1
  77. package/dist/{chunk-JBCU6NR5.js → chunk-NZ3BE2QE.js} +56 -55
  78. package/dist/{chunk-JMFJI26U.js → chunk-O7N3A7PE.js} +2 -2
  79. package/dist/{chunk-3PULCIY5.js → chunk-OH56PXFH.js} +5 -5
  80. package/dist/{chunk-H4YZZ2VQ.js → chunk-PFD25NAC.js} +1 -1
  81. package/dist/{check-DJCUOUDI.js → chunk-Q6UYKWBG.js} +198 -142
  82. package/dist/{chunk-3DKN5WKL.js → chunk-QH3T4WI2.js} +77 -6
  83. package/dist/{chunk-Y5GY6Y7A.js → chunk-QX4GGPMY.js} +2 -2
  84. package/dist/{chunk-B6JLCPT3.js → chunk-R6OV4J4K.js} +6 -6
  85. package/dist/{chunk-XEWHUPFS.js → chunk-RZXUQR42.js} +2 -2
  86. package/dist/{chunk-YMS6CJCD.js → chunk-SAQYJLI6.js} +1 -1
  87. package/dist/{chunk-OJDXABUF.js → chunk-TJB4GAV6.js} +2 -2
  88. package/dist/{checkBrowser-VES2NF3K.js → chunk-TOHA5NAU.js} +187 -114
  89. package/dist/{chunk-RXQHSGAQ.js → chunk-TXGZZKDF.js} +2 -2
  90. package/dist/{chunk-3XDOGSRD.js → chunk-U5YVWG5W.js} +3 -3
  91. package/dist/{chunk-ICMXC3MI.js → chunk-U6RXZNZE.js} +31 -18
  92. package/dist/{chunk-PF7OWVTL.js → chunk-UNOSCGBG.js} +2 -2
  93. package/dist/{chunk-X7CCSMRR.js → chunk-VAK7A2N6.js} +16 -16
  94. package/dist/{chunk-OFY6JTZC.js → chunk-VDJO4DJ7.js} +2 -2
  95. package/dist/{chunk-LBQFLUIY.js → chunk-VFBAKPRC.js} +9 -49
  96. package/dist/{chunk-ZUOSILUE.js → chunk-VH5KESLX.js} +1 -1
  97. package/dist/{chunk-22QHO26F.js → chunk-W64L7IFS.js} +1 -1
  98. package/dist/{chunk-4IEH6EAC.js → chunk-WT4PYV2J.js} +4 -6
  99. package/dist/{chunk-XFCLWWL3.js → chunk-X3IA5RYH.js} +2 -2
  100. package/dist/{chunk-UZOZ2W2E.js → chunk-XAQDR5Y5.js} +2 -2
  101. package/dist/{chunk-6I7V6Q7F.js → chunk-XJHKJXT4.js} +103 -20
  102. package/dist/{chunk-V2UNZ7QP.js → chunk-XOVHO3TT.js} +25 -14
  103. package/dist/{chunk-65WIUIHL.js → chunk-XR5BSEUF.js} +7 -15
  104. package/dist/{chunk-IZM562YJ.js → chunk-Z4R35NJS.js} +4 -4
  105. package/dist/{chunk-4OT3FWVV.js → chunk-ZFO3A3QL.js} +2 -2
  106. package/dist/{clean-GJNDVVDI.js → clean-WNEIVBF3.js} +40 -40
  107. package/dist/cli.js +68 -64
  108. package/dist/{cloud-JCWNMKXC.js → cloud-6GSSDCJL.js} +4 -4
  109. package/dist/{cloudrun-2BKGY53X.js → cloudrun-4NEJRE4T.js} +8 -8
  110. package/dist/commands/layout-audit.browser.js +15 -4
  111. package/dist/commands/motion-signature.browser.js +52 -0
  112. package/dist/{compare-XWM7FAYM.js → compare-2JWQ5ABA.js} +50 -47
  113. package/dist/{compiler-U3W6CJW7.js → compiler-27KQD7KW.js} +6 -6
  114. package/dist/{component-CBRAE325.js → component-HCRET3MH.js} +4 -4
  115. package/dist/{compositions-EZYJEHQ3.js → compositions-HTSQ6SUJ.js} +28 -29
  116. package/dist/{contactSheet-27SRU7A4.js → contactSheet-CAGMKI3E.js} +3 -1
  117. package/dist/{delete-JWWMOITI.js → delete-GHQ5UYM7.js} +9 -9
  118. package/dist/{deploy-UGOV76OH.js → deploy-I3Z3NAVA.js} +11 -11
  119. package/dist/{destroy-QBLMYDBF.js → destroy-4B5HW5FH.js} +5 -5
  120. package/dist/{deterministicFonts-L7YEEFGI.js → deterministicFonts-JFLSSKRB.js} +2 -2
  121. package/dist/{dist-2FMTAVGL.js → dist-SENYPQGW.js} +4 -4
  122. package/dist/{dist-VO7OXOFK.js → dist-WRDLWRMS.js} +5 -5
  123. package/dist/{docs-MPOM3PHH.js → docs-UEWLIP6D.js} +1 -1
  124. package/dist/{doctor-XSKSZRR7.js → doctor-UGFVQZHI.js} +27 -27
  125. package/dist/{events-AIZODZMP.js → events-BLJGWMNP.js} +9 -9
  126. package/dist/{events-RGS4MAH4.js → events-YS4OVX3I.js} +6 -6
  127. package/dist/{feedback-GE3VDZOH.js → feedback-AZ3SJ5HF.js} +35 -35
  128. package/dist/{ffmpeg-SCXZTR6X.js → ffmpeg-2AECXG7V.js} +15 -15
  129. package/dist/{figma-3R4XST4Y.js → figma-DRYIJQHV.js} +3 -3
  130. package/dist/fontLocalizeCli.js +23 -23
  131. package/dist/{get-4FKJP6IM.js → get-DDEAOFPB.js} +9 -9
  132. package/dist/{gpuPolicy-4NNXESM7.js → gpuPolicy-UDJT2MQK.js} +13 -13
  133. package/dist/{grade-compare-FAYVPXUR.js → grade-compare-LJKK5NSY.js} +55 -50
  134. package/dist/{help-C3UQMYXK.js → help-TQBGYOID.js} +1 -1
  135. package/dist/{history-LDGQ2IZJ.js → history-5TOOCF2Y.js} +15 -15
  136. package/dist/hyperframe.manifest.json +1 -1
  137. package/dist/hyperframe.runtime.iife.js +17 -17
  138. package/dist/hyperframes-player.global.js +8 -3
  139. package/dist/{info-KMXFLD3Q.js → info-ENI5MP4W.js} +20 -20
  140. package/dist/{init-D7GYHSX5.js → init-JXPXWV3G.js} +68 -68
  141. package/dist/{inspect-CUKWHCGS.js → inspect-WZNYQ5AB.js} +45 -44
  142. package/dist/{installer-EPRSH6QI.js → installer-3SGRBLJW.js} +7 -7
  143. package/dist/{keyframes-XCUPHBW3.js → keyframes-HEOC4CT4.js} +16 -16
  144. package/dist/{lambda-IMORFJHN.js → lambda-2VHQ4AL2.js} +15 -15
  145. package/dist/{layout-JD2IOBMS.js → layout-7WEUNO6T.js} +45 -44
  146. package/dist/{lint-FHLER36Y.js → lint-5YMAF3L7.js} +23 -23
  147. package/dist/{lintProject-ARKJXDQF.js → lintProject-C2ONSH2U.js} +4 -4
  148. package/dist/{list-MGCFG5MA.js → list-BIE3X7CO.js} +10 -10
  149. package/dist/{login-QX6M4UTR.js → login-YDIGJWCG.js} +7 -7
  150. package/dist/{logout-DKJANASY.js → logout-DDC4QLVK.js} +3 -3
  151. package/dist/{manager-IETAVBZS.js → manager-D2UV6RDQ.js} +16 -16
  152. package/dist/{manager-V2QCCPOJ.js → manager-UHWEKPXC.js} +8 -3
  153. package/dist/{media-treatment-MDAQRITV.js → media-treatment-FSKHPMWA.js} +33 -33
  154. package/dist/{media-use-4XXGABIL.js → media-use-JBN57JE3.js} +1 -1
  155. package/dist/{models-NZAOSI5A.js → models-COEK6LXG.js} +24 -24
  156. package/dist/{motionShot-6ZDUM2K4.js → motionShot-HYZ2ZGJQ.js} +28 -26
  157. package/dist/{normalize-audio-7PRYX6QM.js → normalize-audio-UXR6WQ7Q.js} +12 -12
  158. package/dist/{open-I254NY5J.js → open-OFT2GIDG.js} +24 -24
  159. package/dist/{parakeetRunner-TL3TOGUS.js → parakeetRunner-4NZ3QXS3.js} +25 -25
  160. package/dist/{pipeline-YPERVOQM.js → pipeline-ZKE54JMG.js} +18 -18
  161. package/dist/{play-MYI7BYKS.js → play-2VG77FT6.js} +39 -38
  162. package/dist/{policies-5NTZOHJA.js → policies-XXNGXWHV.js} +1 -1
  163. package/dist/{preflight-HRCSZ52D.js → preflight-QTWDIM5C.js} +18 -18
  164. package/dist/{present-WYXQDV4Q.js → present-OONXQLJG.js} +33 -33
  165. package/dist/{preview-535HTWQO.js → preview-6RZJFU76.js} +49 -49
  166. package/dist/{producer-C76CRJ5O.js → producer-6YM3UH3B.js} +1 -1
  167. package/dist/{progress-I37JB7R4.js → progress-NHJIHAAG.js} +2 -2
  168. package/dist/{projectConfig-5QCNTGQT.js → projectConfig-YMW4P2X6.js} +9 -9
  169. package/dist/{publication-2QT7VVE2.js → publication-SEINUAPZ.js} +5 -5
  170. package/dist/{publish-53EBL7OO.js → publish-KZBTBWFO.js} +27 -27
  171. package/dist/{refresh-MGCVWX56.js → refresh-RXTOPRBB.js} +3 -3
  172. package/dist/{remove-background-OBYHMPD4.js → remove-background-BIQNMIR7.js} +31 -31
  173. package/dist/{render-5BXTEEG7.js → render-65K3K6SD.js} +31 -31
  174. package/dist/{render-3MELF6Y3.js → render-FIH37HJA.js} +101 -96
  175. package/dist/{render-75CRB3BW.js → render-LW76HOMJ.js} +8 -8
  176. package/dist/{render-batch-CEVWUYBP.js → render-batch-POLEEYD4.js} +8 -8
  177. package/dist/renderSetupWorker.js +12 -9
  178. package/dist/{resolver-4ICE2AT6.js → resolver-O2SED3XB.js} +7 -7
  179. package/dist/{screenshotCapture-HXEZ3TNJ.js → screenshotCapture-UBY6TT75.js} +33 -6
  180. package/dist/{sherpa-L4UACXT3.js → sherpa-HTFFFTVQ.js} +24 -24
  181. package/dist/{sites-3ZBYB5X4.js → sites-MAVH57MO.js} +2 -2
  182. package/dist/skills/hyperframes/references/review-loop.md +1 -1
  183. package/dist/{skills-DXTQPCAO.js → skills-J6MBGS5O.js} +17 -17
  184. package/dist/{skillsUpdateCheck-ULXRGLDU.js → skillsUpdateCheck-ZAXNLBF3.js} +3 -3
  185. package/dist/{snapshot-PWFHQU5E.js → snapshot-TL7TTFS6.js} +72 -71
  186. package/dist/{src-RDSWHMJS.js → src-EL6HGIS4.js} +33 -26
  187. package/dist/{src-S7NVL5VF.js → src-Z5H5N5T4.js} +19 -19
  188. package/dist/{state-KAXGHF77.js → state-ORRPOLMQ.js} +2 -2
  189. package/dist/{staticProjectServer-GYPUQGI7.js → staticProjectServer-EO7X7RAY.js} +20 -20
  190. package/dist/{status-BV7QAUQD.js → status-CM7IQTU2.js} +6 -6
  191. package/dist/studio/assets/{hyperframes-player-DcD3NXpX.js → hyperframes-player-hz_VqxBZ.js} +7 -2
  192. package/dist/studio/assets/{index-BIDKYk0h.js → index-CV_ojgp5.js} +1 -1
  193. package/dist/studio/assets/{index-CFrZAwKo.js → index-S1ceEagc.js} +4 -4
  194. package/dist/studio/index.html +1 -1
  195. package/dist/{studio-api-IXGX5ZFI.js → studio-api-CUZDC5B3.js} +17 -17
  196. package/dist/{studioServer-LA5Z7RSS.js → studioServer-EZPRV43Y.js} +90 -84
  197. package/dist/{telemetry-STEMAMAX.js → telemetry-LFUVHARP.js} +10 -10
  198. package/dist/{telemetry-CQYHCCPL.js → telemetry-QG5AANZ4.js} +1 -1
  199. package/dist/{timeline-KLD24EN6.js → timeline-GSH743JE.js} +41 -41
  200. package/dist/{tokens-ICLORAA4.js → tokens-3ZMPSH7B.js} +3 -3
  201. package/dist/{transcribe-A6IKK7VS.js → transcribe-4SHNDPWW.js} +47 -47
  202. package/dist/{transcribe-CTHZLRXF.js → transcribe-TV7JBZQS.js} +19 -19
  203. package/dist/{tts-EDK3QS7M.js → tts-A2WILYGN.js} +6 -6
  204. package/dist/{updateCheck-FHCAAAXA.js → updateCheck-W7FTFOQF.js} +2 -2
  205. package/dist/{upgrade-7EV4F2R7.js → upgrade-7YYYNAPF.js} +3 -3
  206. package/dist/{urlDownloader-MIMGVASJ.js → urlDownloader-PQSUS2CP.js} +12 -12
  207. package/dist/{validate-LZF46W3V.js → validate-GCHAEVXM.js} +39 -38
  208. package/dist/{video-ZC47NFOL.js → video-KGN7NJS5.js} +16 -14
  209. package/dist/warmCheck.js +227 -0
  210. package/dist/warmCheckClient.js +139 -0
  211. package/package.json +4 -2
  212. package/dist/chunk-BAZ5LCR3.js +0 -3805
  213. package/dist/hyperframe-runtime.js +0 -1125
  214. package/dist/{chunk-B4VT6YU2.js → chunk-QGOYNPQT.js} +3 -3
  215. package/dist/{synthesize-I2C24XJ5.js → synthesize-PKTB5ATG.js} +1 -1
@@ -9,17 +9,24 @@ import {
9
9
  reportArtifacts,
10
10
  withProjectLock
11
11
  } from "./chunk-57GN6KWT.js";
12
+ import {
13
+ captureArtifactRevision
14
+ } from "./chunk-UNOSCGBG.js";
15
+ import {
16
+ loadProducer
17
+ } from "./chunk-VH5KESLX.js";
12
18
  import {
13
19
  trackLintRun
14
- } from "./chunk-N5SXQCJL.js";
20
+ } from "./chunk-3OLIGYWN.js";
15
21
  import {
16
22
  beginCheckSnapshots,
17
23
  checkSnapshotDirectory,
18
24
  finishCheckSnapshots,
19
25
  rectToBbox
20
- } from "./chunk-RHWJKSGH.js";
26
+ } from "./chunk-KANNRHY7.js";
21
27
  import {
22
28
  CONTENT_OVERLAP_HELD_ERROR_MS,
29
+ DEFAULT_MAX_STATIC_SEC,
23
30
  assertionTargets,
24
31
  buildLayoutSampleTimes,
25
32
  buildTransitionSampleTimes,
@@ -31,77 +38,37 @@ import {
31
38
  findingElementKey,
32
39
  formatFindingTimes,
33
40
  formatLayoutIssue,
41
+ frozenSpans,
34
42
  groupSampledFindings,
35
43
  limitLayoutIssues,
36
44
  longestContiguousRunMs,
37
45
  mergeSampleTimes,
38
46
  parseAt,
39
47
  readMotionSpec
40
- } from "./chunk-O5AE7HOP.js";
41
- import {
42
- captureArtifactRevision
43
- } from "./chunk-PF7OWVTL.js";
44
- import "./chunk-JMFJI26U.js";
45
- import "./chunk-X7MTZ4T2.js";
46
- import {
47
- loadProducer
48
- } from "./chunk-ZUOSILUE.js";
48
+ } from "./chunk-CJYAJ3QM.js";
49
49
  import {
50
50
  resolveProject
51
- } from "./chunk-OJDXABUF.js";
52
- import "./chunk-IZM562YJ.js";
53
- import "./chunk-UVEQLDKB.js";
54
- import "./chunk-X7MTZ4T2.js";
55
- import "./chunk-XUHOIDKG.js";
56
- import "./chunk-JBCU6NR5.js";
57
- import "./chunk-IWTRHPTP.js";
58
- import "./chunk-TTVHYD5R.js";
59
- import "./chunk-6JR2XUEE.js";
60
- import "./chunk-KIO3R4QN.js";
51
+ } from "./chunk-TJB4GAV6.js";
61
52
  import {
62
53
  recordArtifacts
63
- } from "./chunk-ICMXC3MI.js";
64
- import "./chunk-ALVXFXUG.js";
65
- import "./chunk-V2UNZ7QP.js";
66
- import "./chunk-FH7WODJH.js";
54
+ } from "./chunk-U6RXZNZE.js";
67
55
  import {
68
56
  BrowserCleanupError,
69
57
  closeManagedBrowser
70
- } from "./chunk-IL3GTCQY.js";
71
- import "./chunk-XSRUVMXK.js";
72
- import "./chunk-BRHI7EIA.js";
73
- import "./chunk-S3RYRF3W.js";
74
- import "./chunk-K2FLNJVB.js";
75
- import "./chunk-DQBY7FRR.js";
76
- import {
77
- resolveLocalBrowserGpuMode
78
- } from "./chunk-4OT3FWVV.js";
79
- import "./chunk-442JNXRM.js";
58
+ } from "./chunk-GTE5WZAM.js";
80
59
  import {
81
60
  withRemainingBudget
82
- } from "./chunk-RGHQID2E.js";
83
- import "./chunk-XH262OWN.js";
84
- import "./chunk-XT7X6QCP.js";
85
- import "./chunk-4YYJOFKS.js";
86
- import "./chunk-HVW7ABXD.js";
87
- import "./chunk-WUQUR33W.js";
88
- import "./chunk-JHOCK3DG.js";
89
- import "./chunk-OFY6JTZC.js";
90
- import "./chunk-TO6JNTML.js";
91
- import "./chunk-AWDFDFI3.js";
92
- import "./chunk-P6LJ4Y32.js";
93
- import "./chunk-GMECXFAN.js";
94
- import "./chunk-5CS4T6C6.js";
61
+ } from "./chunk-EHSBBBR2.js";
62
+ import {
63
+ resolveLocalBrowserGpuMode
64
+ } from "./chunk-ZFO3A3QL.js";
95
65
  import {
96
66
  trackCheckReport,
97
67
  trackCommandFailure
98
- } from "./chunk-5E5EYPZO.js";
99
- import "./chunk-K26FR4SM.js";
100
- import "./chunk-VWG7OQKU.js";
101
- import "./chunk-T6AGUTZJ.js";
68
+ } from "./chunk-DLC2FICN.js";
102
69
  import {
103
70
  swallowedFlagUsageError
104
- } from "./chunk-UPFUC4DB.js";
71
+ } from "./chunk-HTIUNMTP.js";
105
72
  import {
106
73
  defineCommand,
107
74
  parseArgs
@@ -111,61 +78,27 @@ import {
111
78
  } from "./chunk-54HJ63Q2.js";
112
79
  import {
113
80
  setCommandExitCode
114
- } from "./chunk-PBN6GBJE.js";
81
+ } from "./chunk-JVBRJMOP.js";
115
82
  import {
116
83
  c
117
84
  } from "./chunk-ZTZA4UWZ.js";
118
- import "./chunk-KLIKCX6Q.js";
119
- import "./chunk-EVMY7IPL.js";
120
- import "./chunk-7FMUTGOH.js";
121
- import "./chunk-Q5X2B5WT.js";
122
- import {
123
- withMeta
124
- } from "./chunk-VAJIPSN6.js";
125
- import "./chunk-K4WIOZFP.js";
126
- import "./chunk-XUXGIA7H.js";
127
- import "./chunk-WERLJGIC.js";
128
- import "./chunk-ISN5GRYI.js";
129
- import "./chunk-XEWHUPFS.js";
130
- import "./chunk-EOVYQ3IG.js";
131
- import "./chunk-XT6MXC7A.js";
132
85
  import {
133
86
  extractMediaMetadata,
134
87
  findHdrAutoPromotion
135
- } from "./chunk-YPBIAONI.js";
136
- import "./chunk-4IEH6EAC.js";
137
- import "./chunk-W2LGJSEN.js";
138
- import "./chunk-LBQFLUIY.js";
139
- import "./chunk-BAZ5LCR3.js";
140
- import "./chunk-VC76R6W2.js";
141
- import "./chunk-UJKQWGFF.js";
142
- import "./chunk-YMS5FOMC.js";
143
- import "./chunk-OFQWTKPW.js";
144
- import "./chunk-DPVXBVLL.js";
145
- import "./chunk-634HSJ3J.js";
146
- import "./chunk-FXMKHHPO.js";
147
- import "./chunk-RQVDTPGD.js";
148
- import "./chunk-537IYAEE.js";
88
+ } from "./chunk-73LTCCZI.js";
149
89
  import {
150
90
  lintProject,
151
91
  shouldBlockRender
152
- } from "./chunk-GK2FIKIQ.js";
92
+ } from "./chunk-ADDHW2FS.js";
153
93
  import {
154
94
  resolveProjectRelativeSrc
155
95
  } from "./chunk-6BNTGNGD.js";
156
- import "./chunk-VAS6HQX3.js";
157
- import "./chunk-OYLO6TYK.js";
158
- import "./chunk-32GKETR7.js";
159
- import "./chunk-BSQ7XANM.js";
160
- import "./chunk-SDYDNHEE.js";
161
- import "./chunk-TYXH3EKP.js";
162
- import "./chunk-IXLUTE6N.js";
96
+ import {
97
+ withMeta
98
+ } from "./chunk-ANR6WOC3.js";
163
99
  import {
164
100
  normalizeErrorMessage
165
101
  } from "./chunk-KNU5COPB.js";
166
- import "./chunk-KGPLIH7B.js";
167
- import "./chunk-3GXQPCJC.js";
168
- import "./chunk-M2WBOQ2Q.js";
169
102
 
170
103
  // src/commands/check.ts
171
104
  import { randomUUID } from "crypto";
@@ -270,7 +203,7 @@ import { join, relative } from "path";
270
203
 
271
204
  // src/utils/hdrPromotion.ts
272
205
  async function bundleProjectHtml(projectDir) {
273
- const { bundleToSingleHtml } = await import("./compiler-U3W6CJW7.js");
206
+ const { bundleToSingleHtml } = await import("./compiler-27KQD7KW.js");
274
207
  return bundleToSingleHtml(projectDir);
275
208
  }
276
209
  async function collectBundledRenderMedia(html) {
@@ -576,13 +509,8 @@ async function collectGeometryAt(driver, options, grid, canvas, time) {
576
509
  }
577
510
  return issues;
578
511
  }
579
- async function collectGridSamples(driver, options, grid, motion) {
580
- const layoutSet = new Set(grid.layoutSamples);
581
- const motionSet = new Set(motion.times);
582
- const contrastSet = new Set(grid.contrastSamples);
583
- const geometryEnabled = grid.captionSamples.length > 0 || grid.frameSamples.length > 0;
584
- const canvas = geometryEnabled ? await driver.getCanvas() : null;
585
- const collected = {
512
+ function emptyGridSamples() {
513
+ return {
586
514
  layoutIssues: [],
587
515
  motionFrames: [],
588
516
  contrastEntries: [],
@@ -592,34 +520,91 @@ async function collectGridSamples(driver, options, grid, motion) {
592
520
  rotationSamples: [],
593
521
  indicatorFrames: []
594
522
  };
595
- for (const time of mergeSampleTimes(grid.layoutSamples, motion.times)) {
596
- await driver.seek(time, contrastSet.has(time));
597
- const issuesAtTime = [];
598
- if (layoutSet.has(time)) {
599
- const layoutIssues = await driver.collectLayout(time, options.tolerance, options.layout);
600
- collected.layoutIssues.push(...layoutIssues);
601
- issuesAtTime.push(...layoutIssues);
602
- collected.layoutStateSignatures.push({
603
- time,
604
- signature: await driver.collectLayoutGeometry(),
605
- clock: await driver.collectSeekClock()
606
- });
607
- collected.rotationSamples.push(...await driver.collectRotationSample(time));
608
- collected.indicatorFrames.push(await driver.collectOffPivotRotationSample(time));
609
- }
610
- if (canvas) {
611
- const geometryIssues = await collectGeometryAt(driver, options, grid, canvas, time);
612
- collected.layoutIssues.push(...geometryIssues);
613
- issuesAtTime.push(...geometryIssues);
523
+ }
524
+ function appendGridSamples(into, from) {
525
+ into.layoutIssues.push(...from.layoutIssues);
526
+ into.motionFrames.push(...from.motionFrames);
527
+ into.contrastEntries.push(...from.contrastEntries);
528
+ into.screenshots.push(...from.screenshots);
529
+ into.contrastMs += from.contrastMs;
530
+ into.layoutStateSignatures.push(...from.layoutStateSignatures);
531
+ into.rotationSamples.push(...from.rotationSamples);
532
+ into.indicatorFrames.push(...from.indicatorFrames);
533
+ }
534
+ async function collectSampleAt(driver, options, grid, motion, sets, time) {
535
+ const collected = emptyGridSamples();
536
+ await driver.seek(time, sets.contrast.has(time));
537
+ const issuesAtTime = [];
538
+ if (sets.layout.has(time)) {
539
+ const layoutIssues = await driver.collectLayout(time, options.tolerance, options.layout);
540
+ collected.layoutIssues.push(...layoutIssues);
541
+ issuesAtTime.push(...layoutIssues);
542
+ collected.layoutStateSignatures.push({
543
+ time,
544
+ signature: await driver.collectLayoutGeometry(),
545
+ clock: await driver.collectSeekClock()
546
+ });
547
+ collected.rotationSamples.push(...await driver.collectRotationSample(time));
548
+ collected.indicatorFrames.push(await driver.collectOffPivotRotationSample(time));
549
+ }
550
+ if (sets.canvas) {
551
+ const geometryIssues = await collectGeometryAt(driver, options, grid, sets.canvas, time);
552
+ collected.layoutIssues.push(...geometryIssues);
553
+ issuesAtTime.push(...geometryIssues);
554
+ }
555
+ if (sets.motion.has(time)) {
556
+ collected.motionFrames.push(
557
+ await driver.collectMotionFrame(time, motion.selectors, motion.livenessScopes)
558
+ );
559
+ }
560
+ if (sets.contrast.has(time))
561
+ await collectContrastAt(driver, options, time, issuesAtTime, collected);
562
+ return collected;
563
+ }
564
+ async function collectGridSamples(driver, options, grid, motion, helpers) {
565
+ const geometryEnabled = grid.captionSamples.length > 0 || grid.frameSamples.length > 0;
566
+ const sets = {
567
+ layout: new Set(grid.layoutSamples),
568
+ motion: new Set(motion.times),
569
+ contrast: new Set(grid.contrastSamples),
570
+ canvas: geometryEnabled ? await driver.getCanvas() : null
571
+ };
572
+ const times = mergeSampleTimes(grid.layoutSamples, motion.times);
573
+ const pending = times.map((_, index) => index);
574
+ const perTime = [];
575
+ const work = async (worker, taken = []) => {
576
+ for (let index = pending.shift(); index !== void 0; index = pending.shift()) {
577
+ taken.push(index);
578
+ const time = times[index] ?? 0;
579
+ perTime[index] = await collectSampleAt(worker, options, grid, motion, sets, time);
614
580
  }
615
- if (motionSet.has(time)) {
616
- collected.motionFrames.push(
617
- await driver.collectMotionFrame(time, motion.selectors, motion.livenessScopes)
618
- );
581
+ };
582
+ const helpWith = async (helper) => {
583
+ const taken = [];
584
+ try {
585
+ await helper.initialize(options.contrast);
586
+ helper.markSamples?.("start");
587
+ await work(helper, taken);
588
+ helper.markSamples?.("end");
589
+ } catch {
590
+ helper.markSamples?.("drop");
591
+ for (const index of taken) delete perTime[index];
592
+ pending.push(...taken);
619
593
  }
620
- if (contrastSet.has(time))
621
- await collectContrastAt(driver, options, time, issuesAtTime, collected);
622
- }
594
+ };
595
+ let firstPageDone = false;
596
+ const running = [];
597
+ void helpers.then((ready) => {
598
+ for (const helper of ready) if (!firstPageDone) running.push(helpWith(helper));
599
+ });
600
+ driver.markSamples?.("start");
601
+ await work(driver);
602
+ firstPageDone = true;
603
+ await Promise.all(running);
604
+ await work(driver);
605
+ driver.markSamples?.("end");
606
+ const collected = emptyGridSamples();
607
+ for (const samples of perTime) appendGridSamples(collected, samples);
623
608
  await collectMotionOverlapSamples(driver, grid, collected, options.range);
624
609
  return collected;
625
610
  }
@@ -731,6 +716,55 @@ function detectSweepStatic(duration, samples, motionIssues, hasNoTimelineDeclara
731
716
  if (allSame(signatures.map(seenPart))) return [sweepStaticIssue("audio")];
732
717
  return [];
733
718
  }
719
+ async function framesMoved(driver, times) {
720
+ const [firstTime, ...rest] = times;
721
+ if (firstTime === void 0) return false;
722
+ const first = await frameAt(driver, firstTime);
723
+ for (const time of rest) {
724
+ if (!await driver.framesDiffer(first, await frameAt(driver, time))) continue;
725
+ return !await driver.framesDiffer(first, await frameAt(driver, firstTime));
726
+ }
727
+ return false;
728
+ }
729
+ async function frameAt(driver, time, scope) {
730
+ await driver.seek(time, true);
731
+ return driver.captureFrame(scope);
732
+ }
733
+ async function withFrameMotion(driver, frames, assertions) {
734
+ const marked = frames.map((frame) => ({ ...frame, liveness: { ...frame.liveness } }));
735
+ for (const assertion of assertions) {
736
+ if (assertion.kind !== "keepsMoving") continue;
737
+ const scope = assertion.withinSelector ?? "*";
738
+ if (frames.every((frame) => !frame.liveness[scope])) continue;
739
+ const maxStaticSec = assertion.maxStaticSec ?? DEFAULT_MAX_STATIC_SEC;
740
+ for (const span of frozenSpans(frames, scope, maxStaticSec)) {
741
+ const held = frames.find((frame) => frame.time === span.start)?.liveness[scope];
742
+ const inSpan = marked.filter(
743
+ (frame, index) => frame.time >= span.start && frame.time <= span.end && frames[index]?.liveness[scope] === held
744
+ );
745
+ await markFrameChanges(driver, inSpan, assertion.withinSelector, maxStaticSec / 2);
746
+ }
747
+ }
748
+ return marked;
749
+ }
750
+ async function markFrameChanges(driver, frames, within, captureEverySec) {
751
+ const scope = within ?? "*";
752
+ let reference;
753
+ let mark = 0;
754
+ let nextCapture = Number.NEGATIVE_INFINITY;
755
+ for (const frame of frames) {
756
+ if (frame.time >= nextCapture) {
757
+ nextCapture = frame.time + captureEverySec;
758
+ const capture = await frameAt(driver, frame.time, within);
759
+ if (reference === void 0) reference = capture;
760
+ else if (await driver.framesDiffer(reference, capture)) {
761
+ reference = capture;
762
+ mark++;
763
+ }
764
+ }
765
+ frame.liveness[scope] = `${frame.liveness[scope] ?? ""}|frame${mark}`;
766
+ }
767
+ }
734
768
  function anAnimationIsStuck(samples) {
735
769
  const seenById = /* @__PURE__ */ new Map();
736
770
  for (const sample of samples) {
@@ -1097,7 +1131,7 @@ function detectOffPivotRotation(frames) {
1097
1131
  function annotationBoxesFrom(issues) {
1098
1132
  return issues.filter((issue) => issue.severity === "error" && issue.bbox.width > 0 && issue.bbox.height > 0).map((issue, index) => ({ label: `${index + 1} ${issue.code}`, bbox: issue.bbox }));
1099
1133
  }
1100
- async function runAuditGrid(driver, options, motion) {
1134
+ async function runAuditGrid(driver, options, motion, helpers = Promise.resolve([])) {
1101
1135
  await driver.initialize(options.contrast);
1102
1136
  const grid = await buildSampleGrid(driver, options);
1103
1137
  const plan = await planMotionSampling(
@@ -1106,24 +1140,32 @@ async function runAuditGrid(driver, options, motion) {
1106
1140
  grid.duration
1107
1141
  );
1108
1142
  const seekLoopStart = Date.now();
1109
- const collected = await collectGridSamples(driver, options, grid, plan);
1143
+ const collected = await collectGridSamples(driver, options, grid, plan, helpers);
1110
1144
  const seekLoopMs = Date.now() - seekLoopStart;
1111
1145
  let motionIssues = plan.preflightIssues;
1112
1146
  if (motion.kind === "valid" && plan.assertions.length > 0 && collected.motionFrames.length > 0) {
1113
- const evaluated = evaluateMotion(
1114
- collected.motionFrames,
1115
- plan.assertions,
1116
- await driver.getCanvas()
1117
- );
1147
+ const canvas = await driver.getCanvas();
1148
+ let evaluated = evaluateMotion(collected.motionFrames, plan.assertions, canvas);
1149
+ if (evaluated.some((issue) => issue.code === "motion_frozen")) {
1150
+ const frames = await withFrameMotion(driver, collected.motionFrames, plan.assertions);
1151
+ evaluated = evaluateMotion(frames, plan.assertions, canvas);
1152
+ }
1118
1153
  motionIssues = [...motionIssues, ...await driver.anchorMotionIssues(evaluated)];
1119
1154
  }
1120
1155
  const userPicked = new Set(grid.userPickedSamples);
1121
- const sweepFindings = options.range ? [] : detectSweepStatic(
1156
+ const sweepSamples = collected.layoutStateSignatures.filter(
1157
+ (sample) => !userPicked.has(sample.time)
1158
+ );
1159
+ const sweepVerdict = options.range ? [] : detectSweepStatic(
1122
1160
  grid.duration,
1123
- collected.layoutStateSignatures.filter((sample) => !userPicked.has(sample.time)),
1161
+ sweepSamples,
1124
1162
  motionIssues,
1125
1163
  await driver.hasNoTimelineDeclaration()
1126
1164
  );
1165
+ const sweepFindings = sweepVerdict.length > 0 && await framesMoved(
1166
+ driver,
1167
+ sweepSamples.map((sample) => sample.time)
1168
+ ) ? [] : sweepVerdict;
1127
1169
  const rotationFindings = detectRotationPivotDrift(
1128
1170
  collected.rotationSamples,
1129
1171
  await driver.getCanvas()
@@ -1620,13 +1662,21 @@ function resolveMotionSpec(projectDir) {
1620
1662
  };
1621
1663
  }
1622
1664
  async function runBrowserCheck(project, options, motion, deadline, prelaunched) {
1623
- const module = await import("./checkBrowser-VES2NF3K.js");
1665
+ const module = await import("./checkBrowser-UNZHQFNH.js");
1624
1666
  return module.runBrowserCheck(project, options, motion, runAuditGrid, deadline, prelaunched);
1625
1667
  }
1668
+ var adoptedBrowser;
1669
+ async function prelaunchBrowserForNextCheck(project, options) {
1670
+ adoptedBrowser = await prelaunchBrowser(project, options);
1671
+ return adoptedBrowser;
1672
+ }
1626
1673
  async function prelaunchBrowser(project, options) {
1674
+ const adopted = adoptedBrowser;
1675
+ adoptedBrowser = void 0;
1676
+ if (adopted) return adopted;
1627
1677
  const html = await readFile(project.indexPath, "utf8").catch(() => void 0);
1628
1678
  if (html === void 0) return void 0;
1629
- const { prelaunchCompositionBrowser } = await import("./captureCompositionFrame-QOF5BRF4.js");
1679
+ const { prelaunchCompositionBrowser } = await import("./captureCompositionFrame-DDZNKYRE.js");
1630
1680
  return prelaunchCompositionBrowser(html, options.browserGpuMode);
1631
1681
  }
1632
1682
  async function writeSnapshot(projectDir, index, time, pngBase64) {
@@ -1638,7 +1688,7 @@ async function writeSnapshot(projectDir, index, time, pngBase64) {
1638
1688
  return relative(projectDir, path);
1639
1689
  }
1640
1690
  async function captureFindingCrops(project, options, requests, deadline) {
1641
- const module = await import("./checkBrowser-VES2NF3K.js");
1691
+ const module = await import("./checkBrowser-UNZHQFNH.js");
1642
1692
  return module.captureFindingCrops(project, options, requests, deadline);
1643
1693
  }
1644
1694
  var DEFAULT_DEPENDENCIES2 = {
@@ -1898,6 +1948,10 @@ function parseCheckOptions(args) {
1898
1948
  browserGpuMode: resolveLocalBrowserGpuMode(args["browser-gpu"])
1899
1949
  };
1900
1950
  }
1951
+ function prelaunchBrowserForCheck(rawArgs) {
1952
+ const args = parseArgs(rawArgs, CHECK_COMMAND_ARGS);
1953
+ return prelaunchBrowserForNextCheck(resolveProject(args.dir), parseCheckOptions(args));
1954
+ }
1901
1955
  function parseCheckRange(value) {
1902
1956
  if (value === void 0) return void 0;
1903
1957
  const parts = String(value).split(/[,:]/);
@@ -2171,11 +2225,13 @@ function printCounts(section2) {
2171
2225
  );
2172
2226
  }
2173
2227
  var check_default = createCheckCommand();
2228
+
2174
2229
  export {
2175
- createCheckCommand,
2176
- check_default as default,
2177
2230
  examples,
2231
+ createCheckCommand,
2232
+ prelaunchBrowserForCheck,
2178
2233
  parseCheckRange,
2179
2234
  parseFrameCheck,
2180
- parseLayout
2235
+ parseLayout,
2236
+ check_default
2181
2237
  };
@@ -34,8 +34,12 @@ var PINNED_PACKAGES = {
34
34
  "sherpa-onnx-node": "1.13.8"
35
35
  };
36
36
  var CACHE_DIR = join(homedir(), ".cache", "hyperframes", "optional");
37
+ var SHARP_VERSION = "0.35.3";
37
38
  function optionalPackageDir(name, cacheDir = CACHE_DIR) {
38
- return join(cacheDir, `${name.replace("/", "__")}@${OPTIONAL_PACKAGES[name]}`);
39
+ return join(cacheDir, `${name.replace("/", "__")}@${versionOf(name)}`);
40
+ }
41
+ function versionOf(name) {
42
+ return name === "sharp" ? SHARP_VERSION : OPTIONAL_PACKAGES[name];
39
43
  }
40
44
  function installedOptionalPackageVersion(name, cacheDir = CACHE_DIR, cliUrl = import.meta.url) {
41
45
  if (pinnedPackageBesideCli(name, cliUrl)?.resolution === "entry") return OPTIONAL_PACKAGES[name];
@@ -44,14 +48,78 @@ function installedOptionalPackageVersion(name, cacheDir = CACHE_DIR, cliUrl = im
44
48
  return JSON.parse(readFileSync(manifestPath(dir, name), "utf-8")).version;
45
49
  }
46
50
  function loadInstalledOptionalPackage(name, deps = defaultDeps) {
47
- const found = deps.loadBesideCli(name) ?? deps.loadInstalled(optionalPackageDir(name, deps.cacheDir), name);
48
- return found;
51
+ return loadPresent(name, deps);
52
+ }
53
+ function loadPresent(name, deps) {
54
+ return deps.loadBesideCli(name) ?? deps.loadInstalled(optionalPackageDir(name, deps.cacheDir), name);
49
55
  }
50
56
  async function loadOptionalPackage(name, feature, deps = defaultDeps) {
51
- const present = loadInstalledOptionalPackage(name, deps);
57
+ return await loadOrInstall(name, feature, deps);
58
+ }
59
+ async function loadSharp(feature, deps = defaultDeps, besideCli = requireSharpBesideCli) {
60
+ return besideCli(feature) ?? sharpExport(await loadOrInstall("sharp", feature, deps));
61
+ }
62
+ var backgroundSharpInstall;
63
+ async function loadSharpInBackground(feature, deps = defaultDeps, besideCli = requireSharpBesideCli) {
64
+ const present = loadInstalledSharp(feature, deps, besideCli);
52
65
  if (present !== null) return present;
66
+ const install2 = loadOrInstall("sharp", feature, deps);
67
+ if (backgroundSharpInstall !== install2) {
68
+ backgroundSharpInstall = install2;
69
+ install2.catch((err) => deps.log(err.message));
70
+ }
71
+ const notYet = /* @__PURE__ */ Symbol("installing");
72
+ const settled = await Promise.race([install2, notYet]);
73
+ if (settled === notYet)
74
+ throw new Error(`sharp is not installed yet; installing it once for ${feature}`);
75
+ return sharpExport(settled);
76
+ }
77
+ function loadInstalledSharp(feature, deps = defaultDeps, besideCli = requireSharpBesideCli) {
78
+ const found = besideCli(feature) ?? loadPresent("sharp", deps);
79
+ return found === null ? null : sharpExport(found);
80
+ }
81
+ function requireSharpBesideCli(feature, cliUrl = import.meta.url) {
82
+ const req = createRequire(cliUrl);
83
+ let entry;
84
+ try {
85
+ entry = req.resolve("sharp");
86
+ } catch {
87
+ return null;
88
+ }
89
+ try {
90
+ return sharpExport(req(entry));
91
+ } catch (err) {
92
+ throw new Error(
93
+ `${feature} needs sharp, which is installed but could not load (${err.message}). Reinstall hyperframes with optional dependencies enabled, or run: npm i sharp`
94
+ );
95
+ }
96
+ }
97
+ function sharpExport(module) {
98
+ const m = module;
99
+ return m.default ?? m;
100
+ }
101
+ function installTurnedOff(name) {
102
+ const value = process.env["HYPERFRAMES_NO_OPTIONAL_INSTALL"]?.trim() ?? "";
103
+ return value === "1" || value.split(",").some((entry) => entry.trim() === name);
104
+ }
105
+ var installs = /* @__PURE__ */ new WeakMap();
106
+ function loadOrInstall(name, feature, deps) {
107
+ const present = loadPresent(name, deps);
108
+ if (present !== null) return Promise.resolve(present);
109
+ let pending = installs.get(deps);
110
+ if (!pending) installs.set(deps, pending = /* @__PURE__ */ new Map());
111
+ let install2 = pending.get(name);
112
+ if (!install2) pending.set(name, install2 = installAndLoad(name, feature, deps));
113
+ return install2;
114
+ }
115
+ async function installAndLoad(name, feature, deps) {
53
116
  const dir = optionalPackageDir(name, deps.cacheDir);
54
- const version = OPTIONAL_PACKAGES[name];
117
+ const version = versionOf(name);
118
+ if (installTurnedOff(name)) {
119
+ throw new Error(
120
+ `${name} is not installed, and HYPERFRAMES_NO_OPTIONAL_INSTALL turns off installing it; ${feature} needs it.`
121
+ );
122
+ }
55
123
  deps.log(`installing ${name} for ${feature}, once`);
56
124
  try {
57
125
  await deps.install(dir, name, version);
@@ -179,7 +247,7 @@ async function install(dir, name, version, run = runNpm) {
179
247
  }
180
248
  var defaultDeps = {
181
249
  cacheDir: CACHE_DIR,
182
- loadBesideCli: (name) => loadBesideCli(name),
250
+ loadBesideCli: (name) => name === "sharp" ? null : loadBesideCli(name),
183
251
  loadInstalled,
184
252
  install,
185
253
  log: (line) => console.error(line)
@@ -192,6 +260,9 @@ export {
192
260
  installedOptionalPackageVersion,
193
261
  loadInstalledOptionalPackage,
194
262
  loadOptionalPackage,
263
+ loadSharp,
264
+ loadSharpInBackground,
265
+ loadInstalledSharp,
195
266
  isInstalled,
196
267
  installedPackagePath,
197
268
  pinnedPackageBesideCli,
@@ -6,12 +6,12 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  setHostHandlesSigint
9
- } from "./chunk-YPBIAONI.js";
9
+ } from "./chunk-73LTCCZI.js";
10
10
  import {
11
11
  processAncestorSnapshot,
12
12
  processIdentity,
13
13
  processParentPid
14
- } from "./chunk-22QHO26F.js";
14
+ } from "./chunk-W64L7IFS.js";
15
15
  import {
16
16
  processIsAlive
17
17
  } from "./chunk-KGPLIH7B.js";
@@ -7,16 +7,16 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  parseFeedbackRating,
9
9
  trackRenderFeedback
10
- } from "./chunk-5E5EYPZO.js";
10
+ } from "./chunk-DLC2FICN.js";
11
11
  import {
12
12
  shouldTrack
13
- } from "./chunk-K26FR4SM.js";
14
- import {
15
- detectAgentRuntime
16
- } from "./chunk-T6AGUTZJ.js";
13
+ } from "./chunk-DEORFAWP.js";
17
14
  import {
18
15
  c
19
16
  } from "./chunk-ZTZA4UWZ.js";
17
+ import {
18
+ detectAgentRuntime
19
+ } from "./chunk-T6AGUTZJ.js";
20
20
  import {
21
21
  readConfig,
22
22
  writeConfig
@@ -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-SCXZTR6X.js")
87
+ import("./ffmpeg-2AECXG7V.js")
88
88
  ]);
89
89
  const sys = getSystemMeta();
90
90
  const parts = [
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/version.ts
9
- var VERSION = true ? "0.8.181" : "0.0.0-dev";
10
- var PRODUCER_VERSION = true ? "0.8.181" : "0.0.0-dev";
9
+ var VERSION = true ? "0.8.183" : "0.0.0-dev";
10
+ var PRODUCER_VERSION = true ? "0.8.183" : "0.0.0-dev";
11
11
 
12
12
  export {
13
13
  VERSION,
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-WQ6ZXHFQ.js";
10
10
  import {
11
11
  findFFmpeg
12
- } from "./chunk-3PULCIY5.js";
12
+ } from "./chunk-OH56PXFH.js";
13
13
  import {
14
14
  stoppableExecFile
15
15
  } from "./chunk-HU2SPFNG.js";