hyperframes 0.8.190 → 0.8.192

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 (222) hide show
  1. package/dist/{add-DBKN5H7H.js → add-TZU2UW7A.js} +17 -17
  2. package/dist/{animatedGifPrep-YVBKKLQY.js → animatedGifPrep-NLAXC3VV.js} +11 -10
  3. package/dist/api.js +24 -23
  4. package/dist/{appHistory-TH3TL6N6.js → appHistory-QVCSAOI4.js} +1 -1
  5. package/dist/{asset-2OHQKUMQ.js → asset-JAJXA6LB.js} +2 -2
  6. package/dist/{assetCataloger-O3QAUWIK.js → assetCataloger-4WTX3J4I.js} +13 -12
  7. package/dist/{audio-IR3JGCMM.js → audio-XLWC7JKS.js} +22 -21
  8. package/dist/{auth-J6TAJLGD.js → auth-5K6X3NPJ.js} +4 -4
  9. package/dist/{autoUpdate-D7BJJUT2.js → autoUpdate-RNV7SKGB.js} +4 -4
  10. package/dist/{backgroundChecks-AILHY2YZ.js → backgroundChecks-QXLVZVGX.js} +5 -5
  11. package/dist/backgroundChecksWorker.js +5 -5
  12. package/dist/{batchRender-QZKFVWEI.js → batchRender-THKSPDZR.js} +14 -7
  13. package/dist/{beats-6LOEKZPB.js → beats-K7CGCFVL.js} +53 -15
  14. package/dist/{benchmark-RJMHI3YW.js → benchmark-PHRDIXNL.js} +18 -14
  15. package/dist/{browser-Q3Q36FE3.js → browser-GN6R5ZSK.js} +7 -7
  16. package/dist/{bundleWithLocalizedFonts-RWHFMSFL.js → bundleWithLocalizedFonts-C325UNR4.js} +3 -3
  17. package/dist/{capture-2PNTGVYV.js → capture-6UBQFHZQ.js} +76 -68
  18. package/dist/{capture-FO3ZZCT4.js → capture-BZ7APOGQ.js} +3 -3
  19. package/dist/{captureCompositionFrame-WTMLWVEJ.js → captureCompositionFrame-VORSCTWC.js} +19 -16
  20. package/dist/{catalog-LUZYPUYT.js → catalog-PHU2RUZ3.js} +18 -18
  21. package/dist/{catch-up-TUTLUTFP.js → catch-up-HCNRM46J.js} +7 -7
  22. package/dist/{check-K2TBTJZS.js → check-TJ5ZLB4I.js} +43 -42
  23. package/dist/{checkBrowser-JT7CXDT6.js → checkBrowser-DWP7ZXJ7.js} +38 -37
  24. package/dist/{chunk-STJ2ANMF.js → chunk-2HP5GIQ3.js} +3 -3
  25. package/dist/{chunk-L34DPWY4.js → chunk-2J3NA3OB.js} +13 -13
  26. package/dist/{chunk-B2A56S5C.js → chunk-2MCXIY4B.js} +13 -10
  27. package/dist/{chunk-DCAI5DBR.js → chunk-2ST4WAFY.js} +9 -1
  28. package/dist/{chunk-TSFA2Y5C.js → chunk-2VXY3PEF.js} +99 -69
  29. package/dist/{chunk-AYFF3GX6.js → chunk-32NB4VMH.js} +1 -1
  30. package/dist/{chunk-IXLUTE6N.js → chunk-3422KMTD.js} +5 -1
  31. package/dist/{chunk-JB7LML5B.js → chunk-3CXIX6XS.js} +68 -7
  32. package/dist/{chunk-F6DNM676.js → chunk-3FV5BVWS.js} +2 -2
  33. package/dist/{chunk-OTQXYTQZ.js → chunk-4E75LHAL.js} +23 -3
  34. package/dist/{chunk-TMBUBLZB.js → chunk-4HCJOFMB.js} +166 -46
  35. package/dist/{chunk-UZ7RJDEC.js → chunk-5IPKQHOL.js} +17 -6
  36. package/dist/{chunk-WBUO6WH6.js → chunk-5TRFLZ5Z.js} +2 -2
  37. package/dist/{chunk-HRPWRZGF.js → chunk-6N65ZMC5.js} +1 -1
  38. package/dist/{chunk-XUXGIA7H.js → chunk-6NLPPKBO.js} +1 -2
  39. package/dist/{chunk-3QLT727N.js → chunk-6WNLQI63.js} +4 -4
  40. package/dist/{chunk-XNLYMHX2.js → chunk-6XVKMBUA.js} +9 -6
  41. package/dist/{chunk-JLSXXMRU.js → chunk-7JJMT6LN.js} +1 -1
  42. package/dist/{chunk-7JHTNUF2.js → chunk-7LLRMYP6.js} +2 -2
  43. package/dist/{chunk-BT64TTSE.js → chunk-7RSY7SZN.js} +2 -2
  44. package/dist/{chunk-DX7VEUBO.js → chunk-7UZC4N62.js} +1 -1
  45. package/dist/{chunk-YT5VLUHM.js → chunk-A4OI5ZNX.js} +1 -1
  46. package/dist/{chunk-TSQAPPRS.js → chunk-AEXVVABM.js} +83 -45
  47. package/dist/{chunk-Y5L5I4US.js → chunk-AMZJFCOX.js} +8 -8
  48. package/dist/{chunk-WCT6KGGT.js → chunk-AR46ND2Q.js} +1 -1
  49. package/dist/chunk-B2XLXD7V.js +3897 -0
  50. package/dist/{chunk-KNQQZRB2.js → chunk-BEOK6F26.js} +2 -2
  51. package/dist/{chunk-76ITJYXX.js → chunk-BPKLUHFT.js} +7 -7
  52. package/dist/{chunk-OOAVKK2W.js → chunk-BV6YE455.js} +2 -2
  53. package/dist/{chunk-XGHHVYC7.js → chunk-BY6OQ6XP.js} +2 -2
  54. package/dist/{chunk-JQYJXUJW.js → chunk-C6KE4AFW.js} +1 -1
  55. package/dist/{chunk-TMK4Q7JA.js → chunk-CFUCHO4T.js} +20 -5
  56. package/dist/{chunk-FANFO5HI.js → chunk-CXRZBWSH.js} +11 -11
  57. package/dist/chunk-CZGHFATT.js +31 -0
  58. package/dist/{chunk-CYBXXSC4.js → chunk-DIKAPMMF.js} +2 -2
  59. package/dist/{chunk-7L37AB57.js → chunk-E3P3LJG6.js} +9 -9
  60. package/dist/{chunk-EU5HTY3E.js → chunk-E5V6WEMK.js} +58 -23
  61. package/dist/{chunk-HJZ5CPZA.js → chunk-EKGGSAWR.js} +6 -5
  62. package/dist/{chunk-7KVVNF7B.js → chunk-ELP5QZWL.js} +1 -1
  63. package/dist/{chunk-QH3T4WI2.js → chunk-EXAX37XR.js} +8 -2
  64. package/dist/{chunk-EI7FP7F3.js → chunk-FBVUAH7N.js} +12 -2
  65. package/dist/{chunk-TTZTGXKG.js → chunk-GANST5K3.js} +2 -2
  66. package/dist/{chunk-EQF6TVWB.js → chunk-IMSI7IFW.js} +65 -29
  67. package/dist/{chunk-W64L7IFS.js → chunk-IW5G323T.js} +1 -1
  68. package/dist/{chunk-RBGNU7VD.js → chunk-J2ASTCU6.js} +2 -2
  69. package/dist/{chunk-SUSSMCWL.js → chunk-J2BSUF6X.js} +1 -1
  70. package/dist/{chunk-GGVGOY6M.js → chunk-JCDYDF54.js} +2 -2
  71. package/dist/{chunk-EPOYPP36.js → chunk-K2AKVYNR.js} +2 -2
  72. package/dist/{chunk-XBGEWNGQ.js → chunk-KZOZN4PI.js} +4 -4
  73. package/dist/{chunk-E7DXKMKU.js → chunk-L2YGSAOL.js} +3 -3
  74. package/dist/{chunk-2FFOLLU2.js → chunk-LOKCBZYF.js} +3 -3
  75. package/dist/{chunk-56IDMP37.js → chunk-MEE4NTPZ.js} +2 -2
  76. package/dist/{chunk-56IOFIYB.js → chunk-MGBUWPXX.js} +2 -2
  77. package/dist/{chunk-K4664CDS.js → chunk-MVIJTXN5.js} +35 -14
  78. package/dist/{chunk-S2IEO6TH.js → chunk-ODBYZIOH.js} +28 -16
  79. package/dist/{chunk-45U3KY7Z.js → chunk-OQL4AJ4X.js} +6 -6
  80. package/dist/{chunk-5C7R55BJ.js → chunk-P2I4RLJE.js} +1 -1
  81. package/dist/{chunk-S7C6EM7N.js → chunk-PFRG5P32.js} +1 -1
  82. package/dist/{chunk-RUOG4VB7.js → chunk-PKZ7RK5N.js} +5 -4
  83. package/dist/{chunk-LLFQA7XF.js → chunk-QFPBRZJD.js} +1 -1
  84. package/dist/{chunk-CWVSJA52.js → chunk-QWLES6YV.js} +3 -3
  85. package/dist/{chunk-OAPYPSEB.js → chunk-QX4TB4NH.js} +292 -79
  86. package/dist/{chunk-BWPY64WA.js → chunk-R2U2G4OS.js} +1 -1
  87. package/dist/{chunk-46HEFGXJ.js → chunk-REUL2KH2.js} +1 -1
  88. package/dist/{chunk-R4QASDTN.js → chunk-RHYOWDI6.js} +2 -2
  89. package/dist/{chunk-DYAPHNV6.js → chunk-RWGASWT7.js} +1 -1
  90. package/dist/chunk-RXATE6FZ.js +385 -0
  91. package/dist/{chunk-CWYS2UNQ.js → chunk-SBBQFPCJ.js} +1 -1
  92. package/dist/{chunk-RDHEG7RX.js → chunk-SK7TR7BL.js} +4 -4
  93. package/dist/{chunk-KNU5COPB.js → chunk-T2EUWCJE.js} +1 -1
  94. package/dist/{chunk-6HYHHMX3.js → chunk-T6O5OLN2.js} +3 -3
  95. package/dist/{chunk-FVD44EQX.js → chunk-ULTKB5FC.js} +65 -23
  96. package/dist/{chunk-B7JFAXDP.js → chunk-VNPADTDD.js} +3 -3
  97. package/dist/{chunk-FUHI34T4.js → chunk-VOM2HLUI.js} +4 -4
  98. package/dist/{chunk-IARWN467.js → chunk-VRAXIQ6I.js} +2 -2
  99. package/dist/{chunk-NAUKCKCJ.js → chunk-W24SZ5FL.js} +4 -4
  100. package/dist/{chunk-ZFFKWHXN.js → chunk-WOKVXK4J.js} +1 -1
  101. package/dist/{chunk-WLG4OYH7.js → chunk-XF77MK3J.js} +1 -1
  102. package/dist/{chunk-DRTIIAIZ.js → chunk-XX2PA4L3.js} +2 -2
  103. package/dist/{chunk-A5YHWTSP.js → chunk-YMQQXPD5.js} +2 -2
  104. package/dist/{chunk-KUMUK6QS.js → chunk-YWRQHRDY.js} +17 -12
  105. package/dist/{chunk-EUUHVDMN.js → chunk-ZEMDV6W2.js} +29 -59
  106. package/dist/{clean-UVTWBPXK.js → clean-2RNCTDBT.js} +40 -27
  107. package/dist/cli.js +69 -67
  108. package/dist/{cloud-M42IPKFD.js → cloud-NFIKESNZ.js} +4 -4
  109. package/dist/{cloudrun-CTNX64R6.js → cloudrun-7224BCX3.js} +9 -9
  110. package/dist/commands/contrast-audit.browser.js +1 -1
  111. package/dist/commands/layout-audit.browser.js +64 -3
  112. package/dist/{compare-MQI7TG5M.js → compare-HL44MXVX.js} +80 -48
  113. package/dist/{compiler-EJE3HLCS.js → compiler-WF5QTXV7.js} +8 -7
  114. package/dist/{component-QSYOSFVV.js → component-ZBZXSJBR.js} +3 -3
  115. package/dist/{compositions-ITDFE7K4.js → compositions-76P7LDDX.js} +19 -17
  116. package/dist/{contactSheet-CAGMKI3E.js → contactSheet-43ISAESM.js} +2 -2
  117. package/dist/{delete-NTGTENKJ.js → delete-4YZBYOHJ.js} +7 -7
  118. package/dist/{deploy-AOJOXEYX.js → deploy-UGUUGYLF.js} +1 -1
  119. package/dist/{deterministicFonts-EGAAE7QL.js → deterministicFonts-RO2TCMLZ.js} +3 -3
  120. package/dist/{dist-NHW2JQCA.js → dist-5KKCRFPT.js} +5 -5
  121. package/dist/{dist-JH32CBQL.js → dist-QQ26RUDV.js} +5 -4
  122. package/dist/docs/rendering.md +2 -2
  123. package/dist/{doctor-Q6DAYVSQ.js → doctor-GGVUK4NB.js} +20 -19
  124. package/dist/{events-BQIBYPCF.js → events-OXPTHVDB.js} +4 -4
  125. package/dist/{events-PV3CDO4A.js → events-V2VU4J3B.js} +5 -5
  126. package/dist/{feedback-BZH26JQE.js → feedback-HFZ5SCUK.js} +16 -16
  127. package/dist/{ffmpeg-KU7RNT3U.js → ffmpeg-3VHY7GO3.js} +13 -12
  128. package/dist/{figma-PBGZUEIL.js → figma-7SEZTLBJ.js} +3 -3
  129. package/dist/fontLocalizeCli.js +14 -13
  130. package/dist/{get-MM2JZ5ET.js → get-Y2S2PXCM.js} +7 -7
  131. package/dist/{gpuPolicy-DQE2CD5T.js → gpuPolicy-UHPOWRV5.js} +11 -10
  132. package/dist/{grade-compare-YTDQ7YXW.js → grade-compare-4VTXSQM5.js} +38 -37
  133. package/dist/{gsapParserAcorn-SKODXC2N.js → gsapParserAcorn-OOTY2MVN.js} +2 -2
  134. package/dist/{help-M4B2DN7E.js → help-HXNOACHI.js} +1 -1
  135. package/dist/{history-ZW4UYKAJ.js → history-XDJUI4LC.js} +39 -16
  136. package/dist/hyperframe.manifest.json +1 -1
  137. package/dist/hyperframe.runtime.iife.js +64 -64
  138. package/dist/hyperframes-player.global.js +3 -3
  139. package/dist/hyperframes-slideshow.global.js +1 -1
  140. package/dist/{info-L7LQAXLK.js → info-KYRI3EZV.js} +56 -22
  141. package/dist/{init-HTSQ535A.js → init-IL7EWMT5.js} +38 -45
  142. package/dist/{inspect-EWF2THRR.js → inspect-TBNH23UC.js} +36 -35
  143. package/dist/{installer-PQKH2S7C.js → installer-O2YMFSI4.js} +8 -8
  144. package/dist/{keyframes-X2QKJ4DP.js → keyframes-4GF62KAJ.js} +13 -14
  145. package/dist/{lambda-BURM66GP.js → lambda-JFL6M4XZ.js} +12 -12
  146. package/dist/{layout-3Z3SJGZZ.js → layout-7MAEFR65.js} +36 -35
  147. package/dist/{lint-OMNZ2K5J.js → lint-4AYHKYAM.js} +23 -16
  148. package/dist/{lintProject-XM3DLUKG.js → lintProject-52SLJPRC.js} +5 -4
  149. package/dist/{list-5ZSQEH6N.js → list-3DP3D3MW.js} +7 -7
  150. package/dist/{login-YNCQPHLA.js → login-T54WQYRQ.js} +7 -7
  151. package/dist/{logout-DDC4QLVK.js → logout-JYFWWUGK.js} +3 -3
  152. package/dist/{manager-UHWEKPXC.js → manager-MZIJY73J.js} +3 -3
  153. package/dist/{manager-N6XXRQN3.js → manager-QROK2IH3.js} +14 -13
  154. package/dist/{media-treatment-EOKBRJPY.js → media-treatment-4CXF7MSG.js} +20 -19
  155. package/dist/{models-6T4CCKUV.js → models-IS3I6JKU.js} +18 -17
  156. package/dist/{motionShot-KXKMYZ3A.js → motionShot-DVYJZOTQ.js} +21 -20
  157. package/dist/{normalize-3AYFSN2F.js → normalize-FASIPBUM.js} +1 -1
  158. package/dist/{normalize-audio-VWB7RHHA.js → normalize-audio-4527JIK4.js} +12 -8
  159. package/dist/{open-32SQCNUP.js → open-5JE46SAX.js} +18 -18
  160. package/dist/{parakeetRunner-BXW2WX6Q.js → parakeetRunner-7JIJGJJ7.js} +20 -19
  161. package/dist/{pipeline-V5ONFRCY.js → pipeline-YEN3WFD2.js} +15 -14
  162. package/dist/{play-BBL262JE.js → play-WFX67I7M.js} +27 -26
  163. package/dist/{policies-MBWGLMWB.js → policies-GHVXA5PE.js} +1 -1
  164. package/dist/{preflight-LCNGQFNY.js → preflight-D377HVUZ.js} +15 -14
  165. package/dist/{present-RY4HO4ZQ.js → present-XTSEKAC7.js} +24 -23
  166. package/dist/{preview-BLLPCCLG.js → preview-5XH7EK6O.js} +28 -26
  167. package/dist/{producer-QG4AQ35S.js → producer-TFFYF4ZM.js} +1 -1
  168. package/dist/{projectConfig-LN3NR5OM.js → projectConfig-6YUJHMCL.js} +10 -10
  169. package/dist/{publication-TXMCS4KM.js → publication-JK33Y55E.js} +5 -5
  170. package/dist/{publish-57VURD7Z.js → publish-JHDGXWXU.js} +18 -17
  171. package/dist/{refresh-RXTOPRBB.js → refresh-USSFPJAU.js} +3 -3
  172. package/dist/{remove-background-VEWVIO3A.js → remove-background-P44MYAPJ.js} +16 -15
  173. package/dist/{render-SP7WAUB4.js → render-HJ34EGMN.js} +10 -9
  174. package/dist/{render-XMN3NJIQ.js → render-RBINWWP5.js} +43 -42
  175. package/dist/{render-4E7QDVOI.js → render-RJ3I4E3A.js} +26 -25
  176. package/dist/{render-batch-7ULP5RIJ.js → render-batch-3D6XQYUC.js} +11 -10
  177. package/dist/renderSetupWorker.js +9 -8
  178. package/dist/{resolver-D3XERO6U.js → resolver-HCLTFZUW.js} +7 -7
  179. package/dist/{screenshotCapture-UBY6TT75.js → screenshotCapture-I5EDCITF.js} +6 -3
  180. package/dist/{sherpa-5B5G426W.js → sherpa-IPOUJM6Q.js} +19 -18
  181. package/dist/{sites-5PWHAMEG.js → sites-Q2S3DZY4.js} +2 -1
  182. package/dist/skills/hyperframes/references/captions.md +1 -1
  183. package/dist/skills/hyperframes/references/skill-lifecycle.md +8 -4
  184. package/dist/skills/hyperframes-cli/references/cloudrun.md +1 -1
  185. package/dist/skills/hyperframes-cli/references/init-and-scaffold.md +1 -1
  186. package/dist/skills/hyperframes-cli/references/lambda.md +1 -1
  187. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +2 -2
  188. package/dist/skills/hyperframes-cli/references/preview-render.md +1 -1
  189. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +0 -8
  190. package/dist/skills/media-use/audio/references/transcribe.md +2 -2
  191. package/dist/skills/media-use/references/audio.md +1 -1
  192. package/dist/{skills-RXHRF7O7.js → skills-P67QEERC.js} +13 -75
  193. package/dist/{skillsUpdateCheck-JOTDZJAE.js → skillsUpdateCheck-IFMLRVIF.js} +5 -5
  194. package/dist/{slideshow-YTWATJRT.js → slideshow-SJGK4RQS.js} +1 -1
  195. package/dist/{snapshot-DN4MP4VN.js → snapshot-4YM4NNWJ.js} +66 -48
  196. package/dist/{src-W6Y5ZYRQ.js → src-DCD3YMXX.js} +13 -12
  197. package/dist/{src-XSDYRKLG.js → src-SSV66L3F.js} +14 -9
  198. package/dist/{staticProjectServer-JMFGTPMX.js → staticProjectServer-C7PPGLEQ.js} +22 -21
  199. package/dist/{status-CM7IQTU2.js → status-H5WLKQDS.js} +3 -3
  200. package/dist/studio/assets/{hyperframes-player-0HXJPmYC.js → hyperframes-player-ChN3cOr0.js} +3 -3
  201. package/dist/studio/assets/{index-DsSfhjUS.js → index-BYbFcRR0.js} +1 -1
  202. package/dist/studio/assets/{index-BYw97F07.js → index-CHu83hHM.js} +126 -125
  203. package/dist/studio/assets/{index-B3vk3hfU.css → index-CYbvOVp-.css} +1 -1
  204. package/dist/studio/index.html +2 -2
  205. package/dist/{studio-api-SZ4OMFPN.js → studio-api-6YZ7PIQR.js} +17 -14
  206. package/dist/{studioServer-LWO33H7D.js → studioServer-EWHSE4GC.js} +60 -59
  207. package/dist/{telemetry-QG5AANZ4.js → telemetry-4K6CPMNT.js} +2 -2
  208. package/dist/{telemetry-K3AFDKOP.js → telemetry-GGLBHZRZ.js} +5 -5
  209. package/dist/{timeline-NYQOAQDH.js → timeline-NKHQJXJ2.js} +65 -43
  210. package/dist/{tokens-K7YWUVOK.js → tokens-FWNNDJ6R.js} +2 -2
  211. package/dist/{transcribe-QAUMODXM.js → transcribe-TRPKXZ7L.js} +27 -26
  212. package/dist/{transcribe-ANPUQDZD.js → transcribe-VD2TMMC2.js} +17 -16
  213. package/dist/{tts-A2WILYGN.js → tts-5I2AJNLM.js} +1 -1
  214. package/dist/{updateCheck-RNR4HMDI.js → updateCheck-CUPS6LU3.js} +4 -4
  215. package/dist/{upgrade-MKUGZZPA.js → upgrade-23XO6MEX.js} +4 -4
  216. package/dist/{urlDownloader-5USPXLCS.js → urlDownloader-YOAOONCK.js} +10 -9
  217. package/dist/{validate-OJHPDLC5.js → validate-BWIW24G5.js} +30 -29
  218. package/dist/{video-BCKRR6LU.js → video-XRXJS4GC.js} +12 -11
  219. package/dist/warmCheck.js +43 -42
  220. package/package.json +2 -1
  221. package/dist/chunk-DIV37NUE.js +0 -3896
  222. package/dist/chunk-I5JRXMCV.js +0 -6077
@@ -21,9 +21,9 @@ import {
21
21
  mkdirWithinProject
22
22
  } from "./chunk-OFQWTKPW.js";
23
23
 
24
- // ../studio-server/dist/chunk-YIMSBQIO.js
24
+ // ../studio-server/dist/chunk-B4NDV4NM.js
25
25
  import { randomUUID as randomUUID7 } from "crypto";
26
- import { mkdir as mkdir2, readdir as readdir3, rm as rm3, rmdir, writeFile } from "fs/promises";
26
+ import { mkdir as mkdir2, readdir as readdir3, rm as rm3, rmdir, stat as stat2, writeFile } from "fs/promises";
27
27
  import {
28
28
  existsSync as existsSync3,
29
29
  lstatSync as lstatSync4,
@@ -58,6 +58,7 @@ import { constants, createReadStream, createWriteStream, renameSync as renameSyn
58
58
  import { copyFile, mkdir, readdir, readFile, rename, rm, stat } from "fs/promises";
59
59
  import { dirname, join as join2 } from "path";
60
60
  import { pipeline } from "stream/promises";
61
+ import { extname as extname2 } from "path";
61
62
  import { randomUUID as randomUUID5 } from "crypto";
62
63
  import { readdirSync as readdirSync2, readFileSync as readFileSync5, renameSync as renameSync3, statSync as statSync3, writeFileSync as writeFileSync3 } from "fs";
63
64
  import { lstat, readdir as readdir2, rm as rm2 } from "fs/promises";
@@ -97,6 +98,9 @@ import {
97
98
  import { dirname as dirname3, join as join6, relative as relative4, resolve as resolve5, sep as sep4 } from "path";
98
99
  import { closeSync as closeSync3, constants as constants4, mkdirSync as mkdirSync4, openSync as openSync3, readFileSync as readFileSync9, writeSync as writeSync2 } from "fs";
99
100
  import { dirname as dirname4 } from "path";
101
+ import { readdirSync as readdirSync5 } from "fs";
102
+ import { rm as rm4, stat as stat3 } from "fs/promises";
103
+ import { join as join9 } from "path";
100
104
  var RECEIPT_TTL_MS = 1e4;
101
105
  var receipts = /* @__PURE__ */ new Map();
102
106
  var overwriteListeners = /* @__PURE__ */ new Set();
@@ -110,9 +114,9 @@ function hashVersion(hex) {
110
114
  function hashOfVersion(version) {
111
115
  return /^"sha256:([0-9a-f]{64})"$/.exec(version)?.[1];
112
116
  }
113
- function settledFileTag(stat2, now = Date.now()) {
114
- if (now - stat2.ctimeMs < 3e3) return null;
115
- return [stat2.ino, stat2.ctimeMs, stat2.size].map((n) => n.toString(36)).join("-");
117
+ function settledFileTag(stat4, now = Date.now()) {
118
+ if (now - stat4.ctimeMs < 3e3) return null;
119
+ return [stat4.ino, stat4.ctimeMs, stat4.size].map((n) => n.toString(36)).join("-");
116
120
  }
117
121
  function createWriteToken(requestToken) {
118
122
  const token = requestToken?.trim();
@@ -391,8 +395,8 @@ function signatureEntryStat(projectDir, entry, file, outputs) {
391
395
  if (isSkippedEntry(entry) || !isPathWithin(projectDir, file)) return null;
392
396
  if (isRenderOutput(projectDir, file, outputs)) return null;
393
397
  try {
394
- const stat2 = lstatSync(file);
395
- return stat2.isSymbolicLink() ? null : stat2;
398
+ const stat4 = lstatSync(file);
399
+ return stat4.isSymbolicLink() ? null : stat4;
396
400
  } catch {
397
401
  return null;
398
402
  }
@@ -406,17 +410,17 @@ function collectProjectSignatureFiles(projectDir, dir, files, outputs = readRend
406
410
  }
407
411
  for (const entry of entries) {
408
412
  const file = resolve2(dir, entry);
409
- const stat2 = signatureEntryStat(projectDir, entry, file, outputs);
410
- if (!stat2) continue;
411
- if (stat2.isDirectory()) {
413
+ const stat4 = signatureEntryStat(projectDir, entry, file, outputs);
414
+ if (!stat4) continue;
415
+ if (stat4.isDirectory()) {
412
416
  collectProjectSignatureFiles(projectDir, file, files, outputs);
413
- } else if (stat2.isFile()) {
417
+ } else if (stat4.isFile()) {
414
418
  files.push({
415
419
  file,
416
- mtimeMs: stat2.mtimeMs,
417
- ctimeMs: stat2.ctimeMs,
418
- size: stat2.size,
419
- textContentEligible: isTextContentEligible(file, stat2.size)
420
+ mtimeMs: stat4.mtimeMs,
421
+ ctimeMs: stat4.ctimeMs,
422
+ size: stat4.size,
423
+ textContentEligible: isTextContentEligible(file, stat4.size)
420
424
  });
421
425
  }
422
426
  }
@@ -426,19 +430,19 @@ function collectProjectSignatureManifestFiles(projectDir, files) {
426
430
  for (const manifestPath of STUDIO_SIGNATURE_MANIFEST_PATHS) {
427
431
  const file = resolve2(projectDir, manifestPath);
428
432
  if (seen.has(file) || !isPathWithin(projectDir, file)) continue;
429
- let stat2;
433
+ let stat4;
430
434
  try {
431
- stat2 = lstatSync(file);
435
+ stat4 = lstatSync(file);
432
436
  } catch {
433
437
  continue;
434
438
  }
435
- if (stat2.isSymbolicLink() || !stat2.isFile()) continue;
439
+ if (stat4.isSymbolicLink() || !stat4.isFile()) continue;
436
440
  files.push({
437
441
  file,
438
- mtimeMs: stat2.mtimeMs,
439
- ctimeMs: stat2.ctimeMs,
440
- size: stat2.size,
441
- textContentEligible: isTextContentEligible(file, stat2.size)
442
+ mtimeMs: stat4.mtimeMs,
443
+ ctimeMs: stat4.ctimeMs,
444
+ size: stat4.size,
445
+ textContentEligible: isTextContentEligible(file, stat4.size)
442
446
  });
443
447
  seen.add(file);
444
448
  }
@@ -578,11 +582,21 @@ async function openBlobStore(dir) {
578
582
  total += size;
579
583
  return hash;
580
584
  },
585
+ reference: (absPath) => hashFile(absPath),
581
586
  has: (hash) => sizes.has(hash),
582
587
  read: async (hash) => readBlob(dir, hash),
583
588
  writeTo: async (hash, absPath, beforeReplace) => cloneOrCopy(pathOf(hash), absPath, beforeReplace),
584
589
  bytes: () => total,
585
590
  size: (hash) => sizes.get(hash) ?? 0,
591
+ async drop(hashes) {
592
+ for (const hash of hashes) {
593
+ const size = sizes.get(hash);
594
+ if (size === void 0) continue;
595
+ await rm(pathOf(hash), { force: true });
596
+ sizes.delete(hash);
597
+ total -= size;
598
+ }
599
+ },
586
600
  async prune(keep) {
587
601
  for (const [hash, size] of sizes) {
588
602
  if (keep.has(hash)) continue;
@@ -593,6 +607,39 @@ async function openBlobStore(dir) {
593
607
  }
594
608
  };
595
609
  }
610
+ var MEDIA_EXTENSIONS = /* @__PURE__ */ new Set([
611
+ ".mp4",
612
+ ".mov",
613
+ ".m4v",
614
+ ".webm",
615
+ ".mkv",
616
+ ".avi",
617
+ ".mxf",
618
+ ".m2ts",
619
+ ".mp3",
620
+ ".wav",
621
+ ".aac",
622
+ ".m4a",
623
+ ".flac",
624
+ ".ogg",
625
+ ".opus"
626
+ ]);
627
+ var COPY_NOTHING_ABOVE_BYTES = 64 * 1024 ** 2;
628
+ var isUncopied = (path, size) => size > COPY_NOTHING_ABOVE_BYTES || MEDIA_EXTENSIONS.has(extname2(path).toLowerCase());
629
+ function uncopiedOnlyHashes(log, sizeOf) {
630
+ const copied = /* @__PURE__ */ new Set();
631
+ const uncopied = /* @__PURE__ */ new Set();
632
+ const note = (path, hash) => {
633
+ if (hash) (isUncopied(path, sizeOf(hash)) ? uncopied : copied).add(hash);
634
+ };
635
+ for (const [path, hash] of log.baseline) note(path, hash);
636
+ for (const entry of log.entries)
637
+ for (const file of entry.files) {
638
+ note(file.path, file.before);
639
+ note(file.path, file.after);
640
+ }
641
+ return [...uncopied].filter((hash) => !copied.has(hash));
642
+ }
596
643
  var ID_PATH = join3(".hyperframes", "history-id");
597
644
  var ID_SHAPE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
598
645
  var isHistoryId = (name) => ID_SHAPE.test(name);
@@ -763,13 +810,13 @@ function projectGone(dir, id, dev, tempDir) {
763
810
  }
764
811
  function diskStillHere(dir, dev, tempDir) {
765
812
  let at = dir;
766
- let stat2 = statSync3(at, { throwIfNoEntry: false });
767
- while (!stat2) {
813
+ let stat4 = statSync3(at, { throwIfNoEntry: false });
814
+ while (!stat4) {
768
815
  if (dirname2(at) === at) return false;
769
816
  at = dirname2(at);
770
- stat2 = statSync3(at, { throwIfNoEntry: false });
817
+ stat4 = statSync3(at, { throwIfNoEntry: false });
771
818
  }
772
- if (typeof dev === "number") return stat2.dev === dev;
819
+ if (typeof dev === "number") return stat4.dev === dev;
773
820
  return at === dir || isSafePath(tempDir, at);
774
821
  }
775
822
  function lastUsed(home) {
@@ -870,12 +917,12 @@ function stillPendingAfterUnlink(item) {
870
917
  let descriptor;
871
918
  try {
872
919
  descriptor = openSync(item.path, constants2.O_RDONLY | constants2.O_NOFOLLOW);
873
- const stat2 = fstatSync(descriptor);
874
- if (!stat2.isFile() || stat2.isSymbolicLink()) return false;
920
+ const stat4 = fstatSync(descriptor);
921
+ if (!stat4.isFile() || stat4.isSymbolicLink()) return false;
875
922
  const hash = createHash4("sha256").update(readFileSync6(descriptor)).digest("hex");
876
923
  if (hash !== item.hash) return false;
877
924
  const current = lstatSync2(item.path);
878
- if (current.dev !== stat2.dev || current.ino !== stat2.ino) return false;
925
+ if (current.dev !== stat4.dev || current.ino !== stat4.ino) return false;
879
926
  unlinkSync(item.path);
880
927
  return false;
881
928
  } catch (error) {
@@ -975,8 +1022,8 @@ function ownerPid(owner) {
975
1022
  const pid = owner.pid;
976
1023
  return typeof pid === "number" && Number.isSafeInteger(pid) && pid > 0 ? pid : null;
977
1024
  }
978
- function ordinaryOwner(stat2) {
979
- return stat2.isFile() && stat2.nlink === 1;
1025
+ function ordinaryOwner(stat4) {
1026
+ return stat4.isFile() && stat4.nlink === 1;
980
1027
  }
981
1028
  function sameOwnerFile(before, current) {
982
1029
  return current.dev === before.dev && current.ino === before.ino;
@@ -1050,8 +1097,8 @@ function runsOnDisk(root) {
1050
1097
  return entries.filter((entry) => entry.isDirectory() && UUID.test(entry.name)).flatMap((entry) => {
1051
1098
  const path = join6(root, entry.name);
1052
1099
  try {
1053
- const stat2 = lstatSync3(path);
1054
- return [{ path, stat: stat2 }];
1100
+ const stat4 = lstatSync3(path);
1101
+ return [{ path, stat: stat4 }];
1055
1102
  } catch {
1056
1103
  return [];
1057
1104
  }
@@ -1065,10 +1112,10 @@ function planSnapshotCleanup(project, state, now = Date.now()) {
1065
1112
  const runs = runsOnDisk(root);
1066
1113
  for (const run of runs.slice(0, SNAPSHOT_RUNS_TO_KEEP)) keep.add(run.path);
1067
1114
  const pending = [];
1068
- for (const { path, stat: stat2 } of runs) {
1069
- if (keep.has(path) || now - stat2.mtimeMs < SNAPSHOT_GRACE_MS || liveOwner(path)) continue;
1115
+ for (const { path, stat: stat4 } of runs) {
1116
+ if (keep.has(path) || now - stat4.mtimeMs < SNAPSHOT_GRACE_MS || liveOwner(path)) continue;
1070
1117
  try {
1071
- const run = { path, dev: stat2.dev, ino: stat2.ino, mtimeMs: stat2.mtimeMs };
1118
+ const run = { path, dev: stat4.dev, ino: stat4.ino, mtimeMs: stat4.mtimeMs };
1072
1119
  if (!unchangedRun(project, run)) continue;
1073
1120
  pending.push(run);
1074
1121
  retireReferences(records2, root, path);
@@ -1704,6 +1751,7 @@ var Engine = class {
1704
1751
  );
1705
1752
  if (!log) return this.firstOpen();
1706
1753
  this.log = withoutHiddenPaths(log);
1754
+ await this.reclaimUncopied();
1707
1755
  if (!this.log.keepsLedger) await this.takeInUnnamedLedger();
1708
1756
  const cache = this.readStatCache();
1709
1757
  const last = this.log.entries.at(-1)?.id ?? START;
@@ -1717,6 +1765,10 @@ var Engine = class {
1717
1765
  this.reopenClosedWindow();
1718
1766
  await this.settleAll();
1719
1767
  }
1768
+ /** Copies an older version took of files that are no longer copied; text and small files are never touched. */
1769
+ async reclaimUncopied() {
1770
+ await this.blobs.drop(uncopiedOnlyHashes(this.log, (hash) => this.blobs.size(hash)));
1771
+ }
1720
1772
  hearWrites() {
1721
1773
  const realDir = realFilePath(this.dir);
1722
1774
  this.stopHearing = onFileOverwritten((absPath, version, bytes) => {
@@ -1731,7 +1783,8 @@ var Engine = class {
1731
1783
  chainBackFrom(this.overwritten.get(path), replaced).set(after, replaced)
1732
1784
  );
1733
1785
  this.queue(async () => {
1734
- if (!this.blobs.has(replaced)) await this.storeBytes(bytes);
1786
+ if (!this.blobs.has(replaced) && !isUncopied(path, bytes.length))
1787
+ await this.storeBytes(bytes);
1735
1788
  }).catch((error) => this.options.onError?.(error));
1736
1789
  });
1737
1790
  }
@@ -1810,7 +1863,8 @@ var Engine = class {
1810
1863
  }
1811
1864
  async recordAdopted(file, sweptAt, stored) {
1812
1865
  if (stored === null || this.whereFolder() !== "here") return;
1813
- const hash = this.blobs.has(stored) ? stored : await this.storeIfPresent(file.path);
1866
+ const kept = this.blobs.has(stored) || isUncopied(file.path, file.size);
1867
+ const hash = kept ? stored : await this.storeIfPresent(file.path);
1814
1868
  if (hash === null) return;
1815
1869
  const change = { path: file.path, before: null, after: hash };
1816
1870
  const found = this.overwrittenBy(change, void 0, /* @__PURE__ */ new Set());
@@ -1886,22 +1940,24 @@ var Engine = class {
1886
1940
  /** The file's hash once copied in; null when it was removed before the copy (the next sweep records that). */
1887
1941
  async storeIfPresent(path) {
1888
1942
  try {
1889
- return await this.blobs.put(join8(this.dir, path));
1943
+ const abs = join8(this.dir, path);
1944
+ const { size } = await stat2(abs);
1945
+ return await (isUncopied(path, size) ? this.blobs.reference(abs) : this.blobs.put(abs));
1890
1946
  } catch (error) {
1891
1947
  if (error.code === "ENOENT") return null;
1892
1948
  throw error;
1893
1949
  }
1894
1950
  }
1895
- async observe(path, stat2, at) {
1951
+ async observe(path, stat4, at) {
1896
1952
  const known = this.tracked.get(path) ?? { hash: null, stat: null };
1897
- if (stat2 && known.stat === stat2) return false;
1953
+ if (stat4 && known.stat === stat4) return false;
1898
1954
  const heard = this.overwritten.get(path);
1899
1955
  const hash = await this.storeIfPresent(path);
1900
1956
  if (hash === null || this.whereFolder() !== "here") return false;
1901
- this.tracked.set(path, { hash, stat: stat2 });
1957
+ this.tracked.set(path, { hash, stat: stat4 });
1902
1958
  this.forgetWritesBefore(path, hash, heard);
1903
1959
  if (known.hash !== hash) await this.record(path, known.hash, hash, at);
1904
- return known.hash !== hash || known.stat !== stat2;
1960
+ return known.hash !== hash || known.stat !== stat4;
1905
1961
  }
1906
1962
  async record(path, before, after, at) {
1907
1963
  const endedBeforeThisWrite = this.windows.filter((open) => !takesWrite(open, at));
@@ -2199,9 +2255,9 @@ var Engine = class {
2199
2255
  const parts = path.split("/");
2200
2256
  for (let depth = 1; depth <= parts.length; depth += 1) {
2201
2257
  const at = parts.slice(0, depth).join("/");
2202
- const stat2 = lstatSync4(join8(this.dir, at), { throwIfNoEntry: false });
2203
- if (!stat2) return void 0;
2204
- if (at === path || !stat2.isDirectory()) return { at, stat: stat2 };
2258
+ const stat4 = lstatSync4(join8(this.dir, at), { throwIfNoEntry: false });
2259
+ if (!stat4) return void 0;
2260
+ if (at === path || !stat4.isDirectory()) return { at, stat: stat4 };
2205
2261
  }
2206
2262
  return void 0;
2207
2263
  }
@@ -2220,6 +2276,11 @@ var Engine = class {
2220
2276
  async writeAs(who, label, target, extra) {
2221
2277
  this.assertWritable();
2222
2278
  const changes = [...target].filter(([path, hash]) => (this.tracked.get(path)?.hash ?? null) !== hash).sort(([, a], [, b]) => Number(a !== null) - Number(b !== null));
2279
+ const gone = changes.find(([, hash]) => hash !== null && !this.blobs.has(hash));
2280
+ if (gone)
2281
+ throw new Error(
2282
+ `An earlier version of ${gone[0]} is not kept, so this cannot be brought back.`
2283
+ );
2223
2284
  const deleted = new Set(changes.filter(([, hash]) => hash === null).map(([path]) => path));
2224
2285
  const blocked = changes.filter(([, hash]) => hash !== null).map(([path]) => this.inTheWay(path, deleted)).find(Boolean);
2225
2286
  if (blocked) throw new Error(`${blocked} is in the way; move or delete it, then try again.`);
@@ -2386,6 +2447,9 @@ var Engine = class {
2386
2447
  if ((await readdir3(dest).catch(missingIsEmpty)).length > 0)
2387
2448
  throw new Error(`Checkout writes into an empty folder only: ${dest}`);
2388
2449
  const files = manifestAround(this.log, entryId, side);
2450
+ for (const [path, hash] of files)
2451
+ if (!this.blobs.has(hash))
2452
+ throw new Error(`The version of ${path} from then is not kept.`);
2389
2453
  try {
2390
2454
  for (const [path, hash] of files) await this.blobs.writeTo(hash, join8(dest, path));
2391
2455
  } catch (error) {
@@ -2490,6 +2554,61 @@ function readProjectHistory(options) {
2490
2554
  }
2491
2555
  };
2492
2556
  }
2557
+ function historyIds(historyRoot) {
2558
+ try {
2559
+ return readdirSync5(historyRoot).filter(isHistoryId);
2560
+ } catch {
2561
+ return [];
2562
+ }
2563
+ }
2564
+ function namedHashes(log) {
2565
+ const hashes = new Set(log.baseline.values());
2566
+ for (const entry of log.entries) {
2567
+ for (const file of entry.files) {
2568
+ if (file.before) hashes.add(file.before);
2569
+ if (file.after) hashes.add(file.after);
2570
+ }
2571
+ }
2572
+ return hashes;
2573
+ }
2574
+ async function blobSizes(blobs, hashes) {
2575
+ const sizes = /* @__PURE__ */ new Map();
2576
+ for (const hash of hashes)
2577
+ sizes.set(hash, (await stat3(blobPath(blobs, hash)).catch(() => null))?.size ?? 0);
2578
+ return sizes;
2579
+ }
2580
+ async function reclaimOne(home, dryRun) {
2581
+ const log = readLog(join9(home, "log.jsonl"), () => {
2582
+ });
2583
+ if (!log) return 0;
2584
+ const blobs = join9(home, "blobs");
2585
+ const sizes = await blobSizes(blobs, namedHashes(log));
2586
+ let bytes = 0;
2587
+ for (const hash of uncopiedOnlyHashes(log, (known) => sizes.get(known) ?? 0)) {
2588
+ const size = sizes.get(hash) ?? 0;
2589
+ if (size === 0) continue;
2590
+ bytes += size;
2591
+ if (!dryRun) await rm4(blobPath(blobs, hash), { force: true });
2592
+ }
2593
+ return bytes;
2594
+ }
2595
+ async function reclaimUncopiedBlobs(historyRoot, { dryRun = false, onError } = {}) {
2596
+ const reclaimed = [];
2597
+ for (const id of historyIds(historyRoot)) {
2598
+ const home = join9(historyRoot, id);
2599
+ let release;
2600
+ try {
2601
+ release = await takeHistoryOwnership(home, 0);
2602
+ const bytes = await reclaimOne(home, dryRun);
2603
+ if (bytes > 0) reclaimed.push({ id, bytes });
2604
+ } catch (error) {
2605
+ if (!(error instanceof HistoryBusyError)) onError?.(error);
2606
+ } finally {
2607
+ release?.();
2608
+ }
2609
+ }
2610
+ return reclaimed;
2611
+ }
2493
2612
  function historyCache(open) {
2494
2613
  const histories = /* @__PURE__ */ new Map();
2495
2614
  const get = async (projectDir) => {
@@ -2547,5 +2666,6 @@ export {
2547
2666
  HistoryClosedError,
2548
2667
  openProjectHistory,
2549
2668
  readProjectHistory,
2669
+ reclaimUncopiedBlobs,
2550
2670
  historyCache
2551
2671
  };
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-HVW7ABXD.js";
13
13
  import {
14
14
  DEFAULT_REGISTRY_URL
15
- } from "./chunk-AYFF3GX6.js";
15
+ } from "./chunk-32NB4VMH.js";
16
16
 
17
17
  // src/utils/projectConfig.ts
18
18
  import { readFileSync, writeFileSync } from "fs";
@@ -43,7 +43,10 @@ function readProjectConfigWithStatus(projectDir) {
43
43
  return { status: isFileNotFound(error) ? "missing" : "unreadable" };
44
44
  }
45
45
  try {
46
- return { status: "ok", config: normalizeConfig(JSON.parse(text)) };
46
+ return {
47
+ status: "ok",
48
+ config: normalizeConfig(JSON.parse(text.replace(/^\uFEFF/, "")))
49
+ };
47
50
  } catch {
48
51
  return { status: "unreadable" };
49
52
  }
@@ -118,12 +121,16 @@ function seedProjectAuthoringSkill(projectDir, rawSkill) {
118
121
  return;
119
122
  }
120
123
  try {
121
- const parsed = JSON.parse(text);
124
+ const parsed = JSON.parse(text.replace(/^\uFEFF/, ""));
122
125
  if (!isJsonObject(parsed)) return;
123
126
  if (normalizeSkillSlug(parsed.authoringSkill)) return;
124
127
  parsed.authoringSkill = skill;
125
128
  const indent = /\n([ \t]+)"/.exec(text)?.[1] ?? " ";
126
- writeFileSync(path, JSON.stringify(parsed, null, indent) + "\n", "utf-8");
129
+ writeFileSync(
130
+ path,
131
+ (text.startsWith("\uFEFF") ? "\uFEFF" : "") + JSON.stringify(parsed, null, indent) + "\n",
132
+ "utf-8"
133
+ );
127
134
  } catch {
128
135
  }
129
136
  }
@@ -137,7 +144,7 @@ function recordProjectRegistryItems(projectDir, items) {
137
144
  return;
138
145
  }
139
146
  try {
140
- const parsed = JSON.parse(text);
147
+ const parsed = JSON.parse(text.replace(/^\uFEFF/, ""));
141
148
  if (!isJsonObject(parsed)) return;
142
149
  const existing = normalizeRegistryItems(parsed.registryItems) ?? [];
143
150
  const byName = new Map(existing.map((item) => [item.name, item]));
@@ -150,7 +157,11 @@ function recordProjectRegistryItems(projectDir, items) {
150
157
  if (unchanged) return;
151
158
  parsed.registryItems = merged;
152
159
  const indent = /\n([ \t]+)"/.exec(text)?.[1] ?? " ";
153
- writeFileSync(path, JSON.stringify(parsed, null, indent) + "\n", "utf-8");
160
+ writeFileSync(
161
+ path,
162
+ (text.startsWith("\uFEFF") ? "\uFEFF" : "") + JSON.stringify(parsed, null, indent) + "\n",
163
+ "utf-8"
164
+ );
154
165
  } catch {
155
166
  }
156
167
  }
@@ -19,10 +19,10 @@ import {
19
19
  import {
20
20
  formatVariableValidationIssue,
21
21
  validateVariables
22
- } from "./chunk-56IOFIYB.js";
22
+ } from "./chunk-MGBUWPXX.js";
23
23
  import {
24
24
  extractCompositionMetadata
25
- } from "./chunk-B2A56S5C.js";
25
+ } from "./chunk-2MCXIY4B.js";
26
26
 
27
27
  // src/utils/variables.ts
28
28
  import { readFileSync } from "fs";
@@ -9,7 +9,7 @@ import {
9
9
  buildAuthHeaders,
10
10
  refreshTokens,
11
11
  resolveCredential
12
- } from "./chunk-7KVVNF7B.js";
12
+ } from "./chunk-ELP5QZWL.js";
13
13
 
14
14
  // src/cloud/auth.ts
15
15
  async function resolveCloudAuthHeaders() {
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-ISN5GRYI.js";
13
13
  import {
14
14
  normalizeErrorMessage
15
- } from "./chunk-KNU5COPB.js";
15
+ } from "./chunk-T2EUWCJE.js";
16
16
 
17
17
  // src/telemetry/posthogKey.ts
18
18
  var POSTHOG_API_KEY = "phc_zjjbX0PnWxERXrMHhkEJWj9A9BhGVLRReICgsfTMmpx";
@@ -305,7 +305,6 @@ function passthroughFields(parsed) {
305
305
  skillsUpdateAvailable: parsed.skillsUpdateAvailable,
306
306
  skillsOutdatedCount: parsed.skillsOutdatedCount,
307
307
  skillsMissingCount: parsed.skillsMissingCount,
308
- skillsRemovedCount: parsed.skillsRemovedCount,
309
308
  localEmbeddingEnabled: consentFrom(parsed.localEmbeddingEnabled)
310
309
  };
311
310
  }
@@ -7,10 +7,10 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  parseFeedbackRating,
9
9
  trackRenderFeedback
10
- } from "./chunk-OOAVKK2W.js";
10
+ } from "./chunk-BV6YE455.js";
11
11
  import {
12
12
  shouldTrack
13
- } from "./chunk-TTZTGXKG.js";
13
+ } from "./chunk-GANST5K3.js";
14
14
  import {
15
15
  c
16
16
  } from "./chunk-ZTZA4UWZ.js";
@@ -20,7 +20,7 @@ import {
20
20
  import {
21
21
  readConfig,
22
22
  writeConfig
23
- } from "./chunk-XUXGIA7H.js";
23
+ } from "./chunk-6NLPPKBO.js";
24
24
 
25
25
  // src/telemetry/feedback.ts
26
26
  import * as readline from "readline";
@@ -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-KU7RNT3U.js")
87
+ import("./ffmpeg-3VHY7GO3.js")
88
88
  ]);
89
89
  const sys = getSystemMeta();
90
90
  const parts = [
@@ -10,7 +10,7 @@ import {
10
10
  import {
11
11
  DISTRIBUTED_FPS,
12
12
  isDistributedFps
13
- } from "./chunk-56IOFIYB.js";
13
+ } from "./chunk-MGBUWPXX.js";
14
14
  import {
15
15
  parseHTML
16
16
  } from "./chunk-SDYDNHEE.js";
@@ -18,6 +18,9 @@ import {
18
18
  // src/utils/compositionFps.ts
19
19
  import { readFileSync } from "fs";
20
20
  import { join } from "path";
21
+ function getHtmlAttribute(element, name) {
22
+ return Array.from(element.attributes).find((attribute) => attribute.name.toLowerCase() === name)?.value ?? null;
23
+ }
21
24
  function readCompositionFps(html) {
22
25
  let doc;
23
26
  try {
@@ -25,11 +28,11 @@ function readCompositionFps(html) {
25
28
  } catch {
26
29
  return null;
27
30
  }
28
- const explicitRoot = doc.querySelector('[data-composition-id][data-root="true"]');
29
- const root = explicitRoot ?? Array.from(doc.querySelectorAll("[data-composition-id]")).find(
30
- (el) => !el.parentElement?.closest("[data-composition-id]")
31
- ) ?? null;
32
- const raw = root?.getAttribute("data-fps")?.trim();
31
+ const compositions = Array.from(doc.querySelectorAll("*")).filter(
32
+ (element) => getHtmlAttribute(element, "data-composition-id") !== null
33
+ );
34
+ const root = compositions.find((element) => getHtmlAttribute(element, "data-root") === "true") ?? compositions[0];
35
+ const raw = root ? getHtmlAttribute(root, "data-fps")?.trim() : void 0;
33
36
  return raw ? raw : null;
34
37
  }
35
38
  var DEFAULT_CLOUD_FPS = 30;
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  sherpaParakeetInstalled,
9
9
  sherpaUnsupportedReason
10
- } from "./chunk-FUHI34T4.js";
10
+ } from "./chunk-VOM2HLUI.js";
11
11
  import {
12
12
  findParakeet
13
13
  } from "./chunk-JZIEZCQM.js";
@@ -6,14 +6,14 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-OTQXYTQZ.js";
9
+ } from "./chunk-4E75LHAL.js";
10
10
  import {
11
11
  DEFAULT_HISTORY_ROOT,
12
12
  HistoryBusyError,
13
13
  MAX_WINDOW_IDLE_MS,
14
14
  openProjectHistory,
15
15
  readProjectHistory
16
- } from "./chunk-TMBUBLZB.js";
16
+ } from "./chunk-4HCJOFMB.js";
17
17
  import {
18
18
  findPreviewServerForProject,
19
19
  studioApiUrl
@@ -13,11 +13,11 @@ import {
13
13
  formatPreviewProxyBox,
14
14
  hdrToSdrToneMapFilter,
15
15
  parseFirstFrameColour
16
- } from "./chunk-56IOFIYB.js";
16
+ } from "./chunk-MGBUWPXX.js";
17
17
  import {
18
18
  decodeAuthoredAttribute,
19
19
  scanHtmlOpeningTags
20
- } from "./chunk-B2A56S5C.js";
20
+ } from "./chunk-2MCXIY4B.js";
21
21
  import {
22
22
  mkdirWithinProject,
23
23
  realProjectRoot,
@@ -7,7 +7,7 @@ var __dirname = __hf_dirname(__filename);
7
7
 
8
8
  // src/utils/producer.ts
9
9
  async function loadProducer() {
10
- return await import("./src-W6Y5ZYRQ.js");
10
+ return await import("./src-DCD3YMXX.js");
11
11
  }
12
12
 
13
13
  export {
@@ -1278,7 +1278,7 @@ async function withFigmaErrors(command, fn) {
1278
1278
  } catch (err) {
1279
1279
  if (err instanceof Error) {
1280
1280
  try {
1281
- const { trackCommandFailure } = await import("./events-PV3CDO4A.js");
1281
+ const { trackCommandFailure } = await import("./events-V2VU4J3B.js");
1282
1282
  trackCommandFailure(
1283
1283
  command,
1284
1284
  err,