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
@@ -8,7 +8,7 @@ import {
8
8
  EncoderInterruptedError,
9
9
  encoderFailureError,
10
10
  prepareAnimatedGifInputs
11
- } from "./chunk-A5YHWTSP.js";
11
+ } from "./chunk-YMQQXPD5.js";
12
12
  import {
13
13
  GENERIC_FAMILIES,
14
14
  collectFontFamilyCustomProperties,
@@ -16,7 +16,7 @@ import {
16
16
  iterateFontFamilyDeclarations,
17
17
  normalizeSystemFontPrimaryFamilies,
18
18
  resolveFontFamilyDeclarationFamilies
19
- } from "./chunk-LLFQA7XF.js";
19
+ } from "./chunk-QFPBRZJD.js";
20
20
  import {
21
21
  parseEncoderOptions
22
22
  } from "./chunk-KLIKCX6Q.js";
@@ -73,6 +73,7 @@ import {
73
73
  createFrameLookupTable,
74
74
  createFrameReorderBuffer,
75
75
  createVideoFrameInjector,
76
+ declareContentAddressedUrl,
76
77
  decodePng,
77
78
  decodePngToRgb48le,
78
79
  deriveBeginFrameProbeTimeTicks,
@@ -156,7 +157,7 @@ import {
156
157
  validateEngineConfigSnapshot,
157
158
  verifyDiskDrawElementSamples,
158
159
  writeCapturedFrame
159
- } from "./chunk-OAPYPSEB.js";
160
+ } from "./chunk-QX4TB4NH.js";
160
161
  import {
161
162
  DISTRIBUTED_FPS,
162
163
  HF_VFX_ATTR,
@@ -171,7 +172,7 @@ import {
171
172
  parseVfxChain,
172
173
  resolveAuthoredTimingWindow,
173
174
  toFps
174
- } from "./chunk-56IOFIYB.js";
175
+ } from "./chunk-MGBUWPXX.js";
175
176
  import {
176
177
  assignBundledRuntimeCompositionIds,
177
178
  buildVariablesByCompScript,
@@ -184,7 +185,7 @@ import {
184
185
  isTemplateEntry,
185
186
  parsesAsScript,
186
187
  prepareFlattenedInnerRoot
187
- } from "./chunk-TSQAPPRS.js";
188
+ } from "./chunk-AEXVVABM.js";
188
189
  import {
189
190
  COMPOSITION_SOURCE_URL,
190
191
  HF_COLOR_GRADING_ATTR,
@@ -212,7 +213,7 @@ import {
212
213
  shouldClampResolvedMediaDuration,
213
214
  sourceTimeAt,
214
215
  styleElementsFor
215
- } from "./chunk-DIV37NUE.js";
216
+ } from "./chunk-B2XLXD7V.js";
216
217
  import {
217
218
  MAX_AUDIO_GAIN
218
219
  } from "./chunk-X7HBSTCZ.js";
@@ -226,7 +227,7 @@ import {
226
227
  isAspectAgnosticResolutionAlias,
227
228
  normalizeResolutionFlag,
228
229
  suggestMatchingPreset
229
- } from "./chunk-B2A56S5C.js";
230
+ } from "./chunk-2MCXIY4B.js";
230
231
  import {
231
232
  TRANSITIONS,
232
233
  convertTransfer,
@@ -242,7 +243,7 @@ import {
242
243
  import {
243
244
  lintHyperframeHtml,
244
245
  resolveReferencedStart
245
- } from "./chunk-TSFA2Y5C.js";
246
+ } from "./chunk-2VXY3PEF.js";
246
247
  import {
247
248
  isUnresolvedAssetPlaceholder,
248
249
  readProjectFile,
@@ -1704,7 +1705,7 @@ async function defaultArtifactDurationProbe(path) {
1704
1705
  };
1705
1706
  }
1706
1707
  function buildArtifactExpectation(input) {
1707
- if (input.outputFormat === "png-sequence" || input.outputFormat === "gif") return void 0;
1708
+ if (input.outputFormat === "gif") return void 0;
1708
1709
  if (!Number.isFinite(input.durationSeconds) || input.durationSeconds <= 0) return void 0;
1709
1710
  const expectation = {
1710
1711
  expectedDurationSeconds: input.durationSeconds,
@@ -1769,12 +1770,12 @@ function assertDurationWithinTolerance(expectedSeconds, probedSeconds, tolerance
1769
1770
  `Render artifact is truncated: expected ${expectedSeconds.toFixed(3)}s, probed ${probedSeconds.toFixed(3)}s (deficit ${deficit.toFixed(3)}s exceeds tolerance ${toleranceSeconds.toFixed(3)}s). Artifact: ${stagingPath}`
1770
1771
  );
1771
1772
  }
1772
- function assertFrameCountWithinTolerance(expectedFrames, probedFrames, stagingPath) {
1773
+ function assertFrameCountWithinTolerance(expectedFrames, probedFrames, stagingPath, toleranceFrames = 1) {
1773
1774
  if (probedFrames === void 0 || !Number.isFinite(probedFrames) || probedFrames <= 0) {
1774
1775
  return;
1775
1776
  }
1776
1777
  const shortfall = expectedFrames - probedFrames;
1777
- if (shortfall <= 1) return;
1778
+ if (shortfall <= toleranceFrames) return;
1778
1779
  throw new Error(
1779
1780
  `Render artifact is truncated: expected ${expectedFrames} frames, probed ${probedFrames} frames (shortfall ${shortfall} frames). Artifact: ${stagingPath}`
1780
1781
  );
@@ -1813,8 +1814,8 @@ var ArtifactTransaction = class {
1813
1814
  if (expected) await this.assertArtifactDuration(expected);
1814
1815
  return;
1815
1816
  }
1816
- this.assertReadableNonEmptyDirectory();
1817
- if (expected) await this.assertDirectoryExpectation(expected);
1817
+ const files = this.assertReadableNonEmptyDirectory();
1818
+ if (expected) await this.assertDirectoryExpectation(expected, files);
1818
1819
  }
1819
1820
  assertReadableNonEmptyDirectory() {
1820
1821
  let files;
@@ -1829,13 +1830,14 @@ var ArtifactTransaction = class {
1829
1830
  throw new Error(`Render artifact directory is empty: ${this.stagingPath}`);
1830
1831
  }
1831
1832
  for (const file of files) assertReadableNonEmptyFile(file);
1833
+ return files;
1832
1834
  }
1833
1835
  /**
1834
1836
  * The named-entry and duration gates a directory artifact opts into. A
1835
- * directory has no single probe target, so an expectation without
1836
- * `probeTarget` (png-sequence) keeps the historical behavior: structure only.
1837
+ * directory with a probe target checks duration; one without a probe target
1838
+ * checks the exported PNG frame count when the caller supplied it.
1837
1839
  */
1838
- async assertDirectoryExpectation(expected) {
1840
+ async assertDirectoryExpectation(expected, files) {
1839
1841
  for (const required of expected.requiredFiles ?? []) {
1840
1842
  const path = join5(this.stagingPath, required);
1841
1843
  if (!existsSync5(path)) {
@@ -1843,8 +1845,25 @@ var ArtifactTransaction = class {
1843
1845
  }
1844
1846
  assertReadableNonEmptyFile(path);
1845
1847
  }
1846
- if (expected.probeTarget === void 0) return;
1847
- await this.assertArtifactDuration(expected, join5(this.stagingPath, expected.probeTarget));
1848
+ if (expected.probeTarget !== void 0) {
1849
+ await this.assertArtifactDuration(expected, join5(this.stagingPath, expected.probeTarget));
1850
+ return;
1851
+ }
1852
+ if (expected.expectedFrames === void 0) return;
1853
+ const frameCount = files.filter(
1854
+ (file) => dirname4(file) === this.stagingPath && /^frame_\d+\.png$/.test(basename3(file))
1855
+ ).length;
1856
+ if (frameCount === 0) {
1857
+ throw new Error(
1858
+ `Render artifact is truncated: expected ${expected.expectedFrames} frames, probed 0 frames. Artifact: ${this.stagingPath}`
1859
+ );
1860
+ }
1861
+ assertFrameCountWithinTolerance(
1862
+ expected.expectedFrames,
1863
+ frameCount,
1864
+ this.stagingPath,
1865
+ Math.max(1, Math.ceil(expected.expectedFrames * 2e-3))
1866
+ );
1848
1867
  }
1849
1868
  async assertArtifactDuration(expected, probePath = this.stagingPath) {
1850
1869
  const expectedSeconds = expected.expectedDurationSeconds;
@@ -6623,7 +6642,7 @@ async function readLocalFont(absPath) {
6623
6642
  return { kind: "inline", buffer: Buffer.concat(chunks, totalBytes) };
6624
6643
  }
6625
6644
  async function embedLocalFontFaces(html, projectDir) {
6626
- const { fontToDataUri: toDataUri } = await import("./deterministicFonts-EGAAE7QL.js");
6645
+ const { fontToDataUri: toDataUri } = await import("./deterministicFonts-RO2TCMLZ.js");
6627
6646
  const styleBlockRe = /<style\b[^>]*>([\s\S]*?)<\/style>/gi;
6628
6647
  const fontFaceRe = /@font-face\s*\{([^}]*)\}/gi;
6629
6648
  let result = html;
@@ -6837,7 +6856,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir, options = {})
6837
6856
  );
6838
6857
  if (analysis.isProblematic) {
6839
6858
  defaultLogger.warn(
6840
- `[Compiler] WARNING: Video "${video.id}" has sparse keyframes (max interval: ${analysis.maxIntervalSeconds}s). This causes seek failures and frame freezing. Re-encode with: ${reencode}`
6859
+ `[Compiler] WARNING: Video "${video.id}" has sparse keyframes (max interval: ${analysis.maxIntervalSeconds}s). Long GOPs can make preview seeking slower; rendering is unaffected. If preview seeking is slow, re-encode with: ${reencode}`
6841
6860
  );
6842
6861
  }
6843
6862
  if (metadata.isVFR) {
@@ -7710,6 +7729,10 @@ async function runProbeStage(input) {
7710
7729
  if (el.loop && !existing.loop) {
7711
7730
  existing.loop = true;
7712
7731
  }
7732
+ const audio = composition.audios.find(
7733
+ (audio2) => audio2.type === "video" && audio2.id === `${el.id}-audio`
7734
+ );
7735
+ if (audio) audio.loop = existing.loop;
7713
7736
  }
7714
7737
  } else if (!compiled.droppedMediaIds.has(el.id)) {
7715
7738
  composition.videos.push({
@@ -7747,6 +7770,7 @@ async function runProbeStage(input) {
7747
7770
  el,
7748
7771
  authoredStarts.get(el.id) ?? existing.mediaStart
7749
7772
  );
7773
+ existing.loop = el.loop;
7750
7774
  if (el.volume > 0 && Math.abs((existing.volume ?? 1) - el.volume) > BROWSER_MEDIA_EPSILON) {
7751
7775
  existing.volume = el.volume;
7752
7776
  }
@@ -7758,6 +7782,7 @@ async function runProbeStage(input) {
7758
7782
  start: el.start,
7759
7783
  end: resolveBrowserMediaEnd(el.start, el.end, el.duration),
7760
7784
  mediaStart: el.mediaStart,
7785
+ loop: el.loop,
7761
7786
  layer: 0,
7762
7787
  volume: el.volume,
7763
7788
  type: "audio"
@@ -8360,6 +8385,8 @@ function appendAutoDetectedVideoAudio(composition, extracted) {
8360
8385
  start: video.start,
8361
8386
  end: video.end,
8362
8387
  mediaStart: video.mediaStart,
8388
+ playbackRate: video.playbackRate,
8389
+ loop: video.loop,
8363
8390
  layer: 0,
8364
8391
  volume: 1,
8365
8392
  type: "video"
@@ -8836,6 +8863,7 @@ async function mixAudioForDelivery(input, duration, pcmSourcePath) {
8836
8863
  audios,
8837
8864
  masterFxChain,
8838
8865
  urlByAbsentLocalPath,
8866
+ audioSidecarUrlByLocalPath,
8839
8867
  abortSignal,
8840
8868
  assertNotAborted,
8841
8869
  log
@@ -8859,6 +8887,7 @@ async function mixAudioForDelivery(input, duration, pcmSourcePath) {
8859
8887
  audioGain,
8860
8888
  masterFxChain,
8861
8889
  urlByAbsentLocalPath,
8890
+ audioSidecarUrlByLocalPath,
8862
8891
  keepEncoderInputAt: pcmSourcePath
8863
8892
  },
8864
8893
  compiledDir
@@ -10005,6 +10034,7 @@ async function runCaptureHdrStage(input) {
10005
10034
  width,
10006
10035
  height,
10007
10036
  codec: preset.codec,
10037
+ useGpu: job.config.useGpu,
10008
10038
  preset: preset.preset,
10009
10039
  quality: effectiveQuality,
10010
10040
  bitrate: effectiveBitrate,
@@ -15437,12 +15467,18 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15437
15467
  const needsAlpha = outputNeedsAlpha(config.format);
15438
15468
  const remoteFiles = Object.entries(options.remoteFiles ?? {});
15439
15469
  const remoteLocalPath = (rel) => join32(projectDir, ...rel.split("/"));
15470
+ for (const [, file] of remoteFiles) declareContentAddressedUrl(file.url, file.sha256);
15440
15471
  const urlByAbsentLocalPath = new Map(
15441
15472
  remoteFiles.map(([rel, file]) => [remoteLocalPath(rel), file.url])
15442
15473
  );
15443
15474
  const localPathByUrl = new Map(
15444
15475
  remoteFiles.map(([rel, file]) => [file.url, remoteLocalPath(rel)])
15445
15476
  );
15477
+ const audioSidecarUrlByLocalPath = new Map(
15478
+ remoteFiles.flatMap(
15479
+ ([rel, file]) => file.audioSidecarUrl ? [[remoteLocalPath(rel), file.audioSidecarUrl]] : []
15480
+ )
15481
+ );
15446
15482
  stageStarted = Date.now();
15447
15483
  const compileResult = await runCompileStage({
15448
15484
  urlByAbsentLocalPath,
@@ -15506,7 +15542,7 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15506
15542
  if (probeResult.fileServer) closeFileServerSafely(probeResult.fileServer, "plan", log);
15507
15543
  if (probeResult.probeSession) {
15508
15544
  try {
15509
- const { closeCaptureSession: closeCaptureSession2 } = await import("./src-XSDYRKLG.js");
15545
+ const { closeCaptureSession: closeCaptureSession2 } = await import("./src-SSV66L3F.js");
15510
15546
  await closeCaptureSession2(probeResult.probeSession);
15511
15547
  } catch (err) {
15512
15548
  log.warn("[plan] probe session close failed", {
@@ -15527,6 +15563,7 @@ async function compilePlanComposition(projectDir, config, planDir, options) {
15527
15563
  finalCompiledDir,
15528
15564
  remoteFiles,
15529
15565
  urlByAbsentLocalPath,
15566
+ audioSidecarUrlByLocalPath,
15530
15567
  localPathByUrl,
15531
15568
  compileResult,
15532
15569
  compiled,
@@ -15544,6 +15581,7 @@ function mixPlanAudio(c, compiledDir) {
15544
15581
  workDir: c.workDir,
15545
15582
  compiledDir,
15546
15583
  urlByAbsentLocalPath: c.urlByAbsentLocalPath,
15584
+ audioSidecarUrlByLocalPath: c.audioSidecarUrlByLocalPath,
15547
15585
  totalFrames: c.totalFrames,
15548
15586
  fps: c.job.config.fps,
15549
15587
  ffmpegProcessTimeout: c.cfg.ffmpegProcessTimeout,
@@ -17155,7 +17193,7 @@ function startServer(options = {}) {
17155
17193
  });
17156
17194
  async function shutdown(signal) {
17157
17195
  log.info(`Received ${signal}, shutting down`);
17158
- const { drainBrowserPool } = await import("./src-XSDYRKLG.js");
17196
+ const { drainBrowserPool } = await import("./src-SSV66L3F.js");
17159
17197
  await drainBrowserPool().catch(() => {
17160
17198
  });
17161
17199
  const handle = await Promise.race([
@@ -18213,7 +18251,7 @@ function cfrEncodeArgs(inputArgs, encoder, fpsArg) {
18213
18251
  "-r",
18214
18252
  fpsArg
18215
18253
  ];
18216
- appendSoftwareEncoderThreadsArg(args);
18254
+ appendSoftwareEncoderThreadsArg(args, "libx264");
18217
18255
  return args;
18218
18256
  }
18219
18257
  async function reencodeCfr(ctx, chunkPaths, encoder) {
@@ -19032,6 +19070,10 @@ import { createHash as createHash7 } from "crypto";
19032
19070
  import { join as join42 } from "path";
19033
19071
  var READ_CHUNK_BYTES = 256 * 1024;
19034
19072
 
19073
+ // ../producer/src/services/distributed/audioSidecar.ts
19074
+ import { extname as extname7 } from "path";
19075
+ var AUDIO_SIDECAR_MIN_BYTES = 32 * 1024 * 1024;
19076
+
19035
19077
  export {
19036
19078
  createConsoleLogger,
19037
19079
  defaultLogger,
@@ -9,13 +9,13 @@ import {
9
9
  markSeen,
10
10
  readSeen,
11
11
  writeRecord
12
- } from "./chunk-DCAI5DBR.js";
12
+ } from "./chunk-2ST4WAFY.js";
13
13
  import {
14
14
  createProjectConfig
15
- } from "./chunk-UZ7RJDEC.js";
15
+ } from "./chunk-5IPKQHOL.js";
16
16
  import {
17
17
  isHyperframesProject
18
- } from "./chunk-56IOFIYB.js";
18
+ } from "./chunk-MGBUWPXX.js";
19
19
 
20
20
  // src/utils/desktopApp.ts
21
21
  import { spawn, spawnSync } from "child_process";
@@ -16,18 +16,18 @@ import {
16
16
  pinnedPackageBesideCli,
17
17
  runNpm,
18
18
  sweepStaleStaging
19
- } from "./chunk-QH3T4WI2.js";
19
+ } from "./chunk-EXAX37XR.js";
20
20
  import {
21
21
  emitWords,
22
22
  getPreparedWavDurationSeconds,
23
23
  prepareWav
24
- } from "./chunk-2FFOLLU2.js";
24
+ } from "./chunk-LOKCBZYF.js";
25
25
  import {
26
26
  stoppedByCancelSignal
27
- } from "./chunk-RBGNU7VD.js";
27
+ } from "./chunk-J2ASTCU6.js";
28
28
  import {
29
29
  verifies
30
- } from "./chunk-S7C6EM7N.js";
30
+ } from "./chunk-PFRG5P32.js";
31
31
  import {
32
32
  PARAKEET_MODEL_LABEL,
33
33
  SHERPA_ERROR_PREFIX,
@@ -6,10 +6,10 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  detectGpuEncoder
9
- } from "./chunk-OAPYPSEB.js";
9
+ } from "./chunk-QX4TB4NH.js";
10
10
  import {
11
11
  runCancellableProcess
12
- } from "./chunk-DYAPHNV6.js";
12
+ } from "./chunk-RWGASWT7.js";
13
13
  import {
14
14
  findFfBinary
15
15
  } from "./chunk-VAS6HQX3.js";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-MRF4AMKD.js";
10
10
  import {
11
11
  loadSharp
12
- } from "./chunk-QH3T4WI2.js";
12
+ } from "./chunk-EXAX37XR.js";
13
13
 
14
14
  // src/capture/contactSheet.ts
15
15
  import { readdirSync, readFileSync, unlinkSync, existsSync } from "fs";
@@ -29,8 +29,8 @@ async function createContactSheet(imagePaths, outputPath, opts = {}) {
29
29
  if (files.length === 0) return null;
30
30
  const sharp = await loadSharp("contact sheets");
31
31
  const firstMeta = await sharp(files[0]).metadata();
32
- const srcW = firstMeta.width || 1920;
33
- const srcH = firstMeta.height || 1080;
32
+ const srcW = firstMeta.autoOrient.width || 1920;
33
+ const srcH = firstMeta.autoOrient.height || 1080;
34
34
  const scale = cellWidth / srcW;
35
35
  const cellW = cellWidth;
36
36
  const cellH = Math.round(srcH * scale);
@@ -44,7 +44,7 @@ async function createContactSheet(imagePaths, outputPath, opts = {}) {
44
44
  const row = Math.floor(i / cols);
45
45
  const x = padding + col * (cellW + padding);
46
46
  const y = padding + row * (cellH + labelH + padding);
47
- const resized = await sharp(files[i]).resize(cellW, cellH, { fit: "contain", background: { r: 26, g: 26, b: 26 } }).toBuffer();
47
+ const resized = await sharp(files[i]).autoOrient().resize(cellW, cellH, { fit: "contain", background: { r: 26, g: 26, b: 26 } }).toBuffer();
48
48
  overlays.push({ input: resized, left: x, top: y + labelH });
49
49
  let labelText = `${i + 1}`;
50
50
  if (labelMode === "filename") {
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-442JNXRM.js";
10
10
  import {
11
11
  quantizePreviewProxyBox
12
- } from "./chunk-56IOFIYB.js";
12
+ } from "./chunk-MGBUWPXX.js";
13
13
 
14
14
  // src/utils/compositionViewport.ts
15
15
  var DEFAULT_VIEWPORT = { width: 1920, height: 1080 };
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  VERSION
9
- } from "./chunk-F6DNM676.js";
9
+ } from "./chunk-3FV5BVWS.js";
10
10
 
11
11
  // src/registry/compatibility.ts
12
12
  import { compareVersions } from "compare-versions";
@@ -10,14 +10,14 @@ import {
10
10
  } from "./chunk-MRF4AMKD.js";
11
11
  import {
12
12
  loadSharp
13
- } from "./chunk-QH3T4WI2.js";
13
+ } from "./chunk-EXAX37XR.js";
14
14
  import {
15
15
  createCaptureDownloadBudget,
16
16
  readBoundedResponse
17
17
  } from "./chunk-AWDFDFI3.js";
18
18
  import {
19
19
  isBlockedNetworkHost
20
- } from "./chunk-OAPYPSEB.js";
20
+ } from "./chunk-QX4TB4NH.js";
21
21
  import {
22
22
  DOMParser,
23
23
  parseHTML
@@ -8,10 +8,10 @@ import {
8
8
  DEFAULT_VP9_CPU_USED,
9
9
  isHttpUrl,
10
10
  runFfmpeg
11
- } from "./chunk-OAPYPSEB.js";
11
+ } from "./chunk-QX4TB4NH.js";
12
12
  import {
13
13
  parseAnimatedGifMetadata
14
- } from "./chunk-56IOFIYB.js";
14
+ } from "./chunk-MGBUWPXX.js";
15
15
  import {
16
16
  parseHTML
17
17
  } from "./chunk-SDYDNHEE.js";
@@ -7,29 +7,29 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  RegistryCompatibilityError,
9
9
  gateRegistryItemsCompatibility
10
- } from "./chunk-WLG4OYH7.js";
10
+ } from "./chunk-XF77MK3J.js";
11
11
  import {
12
12
  DEFAULT_PROJECT_CONFIG,
13
13
  createProjectConfig,
14
14
  loadProjectConfig,
15
15
  projectConfigPath,
16
16
  recordProjectRegistryItems
17
- } from "./chunk-UZ7RJDEC.js";
17
+ } from "./chunk-5IPKQHOL.js";
18
18
  import {
19
19
  resolveItemWithDependencies,
20
20
  resolveItemsByTag
21
- } from "./chunk-SUSSMCWL.js";
21
+ } from "./chunk-J2BSUF6X.js";
22
22
  import {
23
23
  InvalidVariableValuesError,
24
24
  prepareItem,
25
25
  publishItem
26
- } from "./chunk-6HYHHMX3.js";
26
+ } from "./chunk-T6O5OLN2.js";
27
27
  import {
28
28
  DEFAULT_REGISTRY_URL
29
- } from "./chunk-AYFF3GX6.js";
29
+ } from "./chunk-32NB4VMH.js";
30
30
  import {
31
31
  trackRegistryItemAdded
32
- } from "./chunk-OOAVKK2W.js";
32
+ } from "./chunk-BV6YE455.js";
33
33
  import {
34
34
  defineCommand
35
35
  } from "./chunk-S3S4TGEH.js";
@@ -41,7 +41,7 @@ import {
41
41
  } from "./chunk-ZTZA4UWZ.js";
42
42
  import {
43
43
  ITEM_TYPE_DIRS
44
- } from "./chunk-56IOFIYB.js";
44
+ } from "./chunk-MGBUWPXX.js";
45
45
  import {
46
46
  isProjectRootMissing,
47
47
  realpath
@@ -143,12 +143,13 @@ function buildSnippet(item, relativeTarget, values = null, compositionId) {
143
143
  }
144
144
  return "";
145
145
  }
146
- function tagAddJson(tag, results) {
146
+ function tagAddJson(tag, results, errors = []) {
147
147
  return {
148
- ok: true,
148
+ ok: errors.length === 0,
149
149
  tag,
150
150
  installed: results.map((r) => r.name),
151
- warnings: results.flatMap((r) => r.warnings.map((w) => `${r.name}: ${w}`))
151
+ warnings: results.flatMap((r) => r.warnings.map((w) => `${r.name}: ${w}`)),
152
+ errors
152
153
  };
153
154
  }
154
155
  function parseVariableValues(raw) {
@@ -434,6 +435,7 @@ var add_default = defineCommand({
434
435
  );
435
436
  }
436
437
  const results = [];
438
+ const errors = [];
437
439
  for (const item of items) {
438
440
  try {
439
441
  const result = await runAdd({
@@ -450,15 +452,18 @@ var add_default = defineCommand({
450
452
  if (!json) console.log(` ${c.success("\u2713")} ${result.name}`);
451
453
  } catch (err) {
452
454
  const reason = err instanceof Error ? err.message : String(err);
455
+ errors.push({ name: item.name, error: reason });
453
456
  if (!json) console.log(` ${c.error("\u2717")} ${item.name} (skipped: ${reason})`);
454
457
  }
455
458
  }
456
459
  if (json) {
457
- console.log(JSON.stringify(tagAddJson(args.name, results)));
460
+ console.log(JSON.stringify(tagAddJson(args.name, results, errors)));
458
461
  } else {
459
462
  console.log("");
460
- console.log(`${c.success("\u2713")} Installed ${results.length}/${items.length} blocks`);
463
+ const summary = `Installed ${results.length}/${items.length} blocks`;
464
+ console.log(`${errors.length > 0 ? c.error("\u2717") : c.success("\u2713")} ${summary}`);
461
465
  }
466
+ if (errors.length > 0) failCommand();
462
467
  }
463
468
  }
464
469
  });