hyperframes 0.8.158 → 0.8.160

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 (171) hide show
  1. package/README.md +24 -0
  2. package/dist/{add-VBBOJ3RB.js → add-OGBTJCU4.js} +11 -11
  3. package/dist/{animatedGifPrep-MTJRHJ5G.js → animatedGifPrep-YAJTDXB7.js} +6 -6
  4. package/dist/api.js +16 -16
  5. package/dist/{asset-3MLXYJCT.js → asset-DKQFFGPP.js} +2 -2
  6. package/dist/{assetCataloger-DI7FC5KZ.js → assetCataloger-BIDQA34M.js} +2 -2
  7. package/dist/audio-GK4OVVTH.js +2086 -0
  8. package/dist/{auth-RJCTHSMH.js → auth-AQMRAFXN.js} +1 -1
  9. package/dist/{autoUpdate-VD6R34HF.js → autoUpdate-NFQB7V2X.js} +2 -2
  10. package/dist/{backgroundChecks-CWWIZDTW.js → backgroundChecks-7JKE2FIU.js} +3 -3
  11. package/dist/backgroundChecksWorker.js +3 -3
  12. package/dist/{batchRender-FTZ67377.js → batchRender-C2JCG5EK.js} +3 -3
  13. package/dist/{beats-6CN4BEXJ.js → beats-C3ZSK2R2.js} +12 -12
  14. package/dist/{benchmark-4QSNJZXI.js → benchmark-RRU67WEY.js} +8 -8
  15. package/dist/{browser-H7PRFBJV.js → browser-K4TP4ZM2.js} +5 -5
  16. package/dist/{bundleWithLocalizedFonts-IVO43QBQ.js → bundleWithLocalizedFonts-SLBVWQ7O.js} +2 -2
  17. package/dist/{capture-GZSY7LZJ.js → capture-T2TBROMS.js} +2 -2
  18. package/dist/{capture-IEEQTPAS.js → capture-ZPRK3TOZ.js} +10 -10
  19. package/dist/{catalog-PD25CVG3.js → catalog-IMIHQ4KX.js} +11 -11
  20. package/dist/{catch-up-2TGBK342.js → catch-up-UY5MJWOG.js} +4 -4
  21. package/dist/{check-HFNJEV3O.js → check-6NAJSJHQ.js} +135 -124
  22. package/dist/{checkBrowser-767LAZKF.js → checkBrowser-JWNQFYTY.js} +38 -36
  23. package/dist/{chunk-YIJMVFEJ.js → chunk-22QHO26F.js} +1 -1
  24. package/dist/{chunk-7F3B5YYT.js → chunk-2742O5DO.js} +178 -23
  25. package/dist/{chunk-EEEUI3ON.js → chunk-2ZLYSXZC.js} +16 -9
  26. package/dist/{chunk-L6AJC7UQ.js → chunk-37LNY2EC.js} +1 -1
  27. package/dist/{chunk-EY6ISRP3.js → chunk-3XPVZLAR.js} +1 -1
  28. package/dist/{chunk-DISITOR6.js → chunk-4ID635FL.js} +1 -1
  29. package/dist/{chunk-EDEFAJI5.js → chunk-4VYNMVMC.js} +12 -12
  30. package/dist/chunk-6JR2XUEE.js +127 -0
  31. package/dist/{chunk-7FGHFHWD.js → chunk-6MCASYIS.js} +31 -11
  32. package/dist/{chunk-3MQBIZHG.js → chunk-7OFNPEKR.js} +7 -7
  33. package/dist/{chunk-BB2SFTMY.js → chunk-A2DMF2Q6.js} +6 -5
  34. package/dist/{chunk-LAAGHMRC.js → chunk-B5FZ2CQM.js} +6 -2
  35. package/dist/{chunk-SLUFA6UM.js → chunk-B7RUGHBT.js} +1 -1
  36. package/dist/{chunk-3UMNI4XZ.js → chunk-D2WGLWIK.js} +3 -3
  37. package/dist/{chunk-3FRK53UC.js → chunk-D33YJZOH.js} +1 -1
  38. package/dist/{chunk-54DMWFQZ.js → chunk-D3ZWBHZP.js} +2 -15
  39. package/dist/{chunk-PKHDQELW.js → chunk-D46G5IQH.js} +11 -11
  40. package/dist/{chunk-ZZ3ZWTOI.js → chunk-DJZEIVAP.js} +3 -3
  41. package/dist/{chunk-J7WFHOCW.js → chunk-ERTJPFCH.js} +1 -1
  42. package/dist/{chunk-QRPYTJBW.js → chunk-EVRUR7DW.js} +1 -1
  43. package/dist/{chunk-QH2PL6J4.js → chunk-FRGYHRP6.js} +1 -1
  44. package/dist/{chunk-T243WV6D.js → chunk-G642IIVK.js} +2 -2
  45. package/dist/{chunk-GPUVPZRK.js → chunk-GG37I7B3.js} +1 -1
  46. package/dist/chunk-GJQHHAAX.js +336 -0
  47. package/dist/{chunk-Y6E2PW7Z.js → chunk-GOASXWDD.js} +2 -2
  48. package/dist/{chunk-4R6OZQGX.js → chunk-GOTCGKX6.js} +79 -4
  49. package/dist/{chunk-H6BWNY56.js → chunk-ICZVCVD3.js} +1 -1
  50. package/dist/{chunk-YVD5M26L.js → chunk-IGTGLGML.js} +2 -2
  51. package/dist/{chunk-KEGTYA7V.js → chunk-IK3SOMZ4.js} +5 -3
  52. package/dist/{chunk-6PIGOKTE.js → chunk-JGYHWVXQ.js} +339 -67
  53. package/dist/{chunk-2XUQPJ3W.js → chunk-KRE55WLI.js} +1 -1
  54. package/dist/{chunk-NNQP5TNO.js → chunk-KWRBEDJI.js} +3 -3
  55. package/dist/{chunk-FJT35XBA.js → chunk-LYIG2GZ5.js} +2 -2
  56. package/dist/{chunk-T76NSAXO.js → chunk-MMV6IY6U.js} +6 -4
  57. package/dist/{chunk-4YDQQQY6.js → chunk-MP676E4B.js} +2 -2
  58. package/dist/{chunk-LAPUMJOC.js → chunk-MYGXKD7A.js} +5 -5
  59. package/dist/{chunk-LQXHRO6F.js → chunk-N2NDDTYW.js} +2 -2
  60. package/dist/{chunk-J6SJCYAQ.js → chunk-OMJA7JP6.js} +5 -5
  61. package/dist/chunk-P47XYVEQ.js +3795 -0
  62. package/dist/{chunk-NFX4K6OW.js → chunk-P4QE7SSN.js} +1 -1
  63. package/dist/{chunk-EGKIQS5J.js → chunk-PBNV5V5G.js} +1 -1
  64. package/dist/{chunk-56QTFOWH.js → chunk-PINFPWRV.js} +5 -119
  65. package/dist/{chunk-IRRRH66M.js → chunk-PLEMSN3E.js} +115 -13
  66. package/dist/{chunk-23VDPRQ3.js → chunk-PPF65XAF.js} +1 -1
  67. package/dist/{chunk-SGIZMTWO.js → chunk-Q3TFX4OZ.js} +1 -1
  68. package/dist/{chunk-XSEGMQYA.js → chunk-QABAVWEX.js} +26 -3
  69. package/dist/{chunk-7ZWOLEGS.js → chunk-RTS7BGEC.js} +1 -1
  70. package/dist/{chunk-YB26LWR2.js → chunk-SB5DX6AD.js} +2 -2
  71. package/dist/{chunk-J4SSEVRU.js → chunk-SHVDJON6.js} +2 -2
  72. package/dist/{chunk-W2SNLHKF.js → chunk-TTFDAWCS.js} +1 -1
  73. package/dist/{chunk-RU6AIVON.js → chunk-TU2CQJO3.js} +2 -2
  74. package/dist/{chunk-Z347DFOL.js → chunk-V2FQQILJ.js} +8 -8
  75. package/dist/{chunk-DCQCGE2W.js → chunk-VD7WQYTO.js} +22 -20
  76. package/dist/{chunk-SHEVPNUR.js → chunk-VZ6LCTOZ.js} +1 -1
  77. package/dist/{chunk-SQHWDFTV.js → chunk-X3SCQP2A.js} +1 -1
  78. package/dist/{chunk-LBT4AMSF.js → chunk-XRKMITSS.js} +1 -1
  79. package/dist/{chunk-OTG5H2VM.js → chunk-XTLV6UVP.js} +3 -3
  80. package/dist/{clean-FQUVFH6H.js → clean-RRE6PMKZ.js} +24 -23
  81. package/dist/cli.js +54 -53
  82. package/dist/{cloud-BHAYVT6F.js → cloud-OIR6K7TS.js} +4 -4
  83. package/dist/{cloudrun-STLNWUBW.js → cloudrun-BIQXBUDO.js} +3 -3
  84. package/dist/{compare-2FRBIK5Z.js → compare-E57W737I.js} +31 -30
  85. package/dist/{compiler-VFJVUZWR.js → compiler-57M6W5WY.js} +3 -3
  86. package/dist/{component-DRKXJVXB.js → component-I2O4AX56.js} +3 -3
  87. package/dist/{compositions-D3SN64J3.js → compositions-B6NKZHIN.js} +10 -10
  88. package/dist/{delete-NA5WC2IR.js → delete-DTUNBC6K.js} +2 -2
  89. package/dist/{dist-SVTSOG4Q.js → dist-4JFB3WAR.js} +2 -2
  90. package/dist/{dist-2VXSQLXO.js → dist-ROVMAL74.js} +1 -1
  91. package/dist/{doctor-VXCMPOY3.js → doctor-SCNB73Z3.js} +12 -12
  92. package/dist/{events-ZJEPMUWT.js → events-6LQNRKHZ.js} +3 -3
  93. package/dist/{events-QAHWXFFG.js → events-Q37UJL36.js} +2 -2
  94. package/dist/{feedback-UGOQ57TU.js → feedback-FOEBE2OW.js} +9 -9
  95. package/dist/{ffmpeg-2ROTISBL.js → ffmpeg-7BYARPLM.js} +4 -2
  96. package/dist/{figma-YO2MJZDP.js → figma-54MRTBKH.js} +3 -3
  97. package/dist/fontLocalizeCli.js +9 -9
  98. package/dist/{get-WMJAYRNF.js → get-EPGHM2SA.js} +2 -2
  99. package/dist/{gpuPolicy-VXNJ4UBN.js → gpuPolicy-VGE3I5J4.js} +6 -6
  100. package/dist/{grade-compare-QZ7BG2AP.js → grade-compare-LOJWX6SK.js} +33 -32
  101. package/dist/{help-AR4MX2AH.js → help-6FPZI3WP.js} +2 -1
  102. package/dist/{history-NF764OFQ.js → history-GRXSUA5R.js} +12 -11
  103. package/dist/hyperframe-runtime.js +56 -56
  104. package/dist/hyperframe.manifest.json +1 -1
  105. package/dist/hyperframe.runtime.iife.js +56 -56
  106. package/dist/hyperframes-player.global.js +3 -3
  107. package/dist/{info-476ERK4G.js → info-LV7DFCLD.js} +7 -7
  108. package/dist/{init-M6YUOBBZ.js → init-3J7BSAC3.js} +29 -29
  109. package/dist/{inspect-QYPUG3UZ.js → inspect-5RON554C.js} +30 -29
  110. package/dist/{installer-HF5BXXXM.js → installer-T3STEB4U.js} +4 -4
  111. package/dist/{keyframes-MTZRE34W.js → keyframes-KHXTHI5C.js} +6 -6
  112. package/dist/{lambda-ZCX7KGTY.js → lambda-4KCSMIM6.js} +4 -4
  113. package/dist/{layout-DLX4HQFL.js → layout-DVWWT2TR.js} +30 -29
  114. package/dist/{lint-OQ5QWCHZ.js → lint-Q5WFB5ST.js} +9 -9
  115. package/dist/{lintProject-JGHKRO5L.js → lintProject-BGDYHF3F.js} +1 -1
  116. package/dist/{list-AZ6OIOIK.js → list-RFEUTW6N.js} +2 -2
  117. package/dist/{login-DJPYT4YZ.js → login-WBHWA4M2.js} +4 -4
  118. package/dist/{manager-JNJE54OQ.js → manager-B6MVBM2E.js} +3 -3
  119. package/dist/{manager-ZLJD3EAY.js → manager-HEUPD2YB.js} +2 -2
  120. package/dist/{media-treatment-4YKC4LGB.js → media-treatment-WRHVNWLS.js} +15 -14
  121. package/dist/{models-WHDUQZQZ.js → models-OA4MXEYG.js} +12 -12
  122. package/dist/{motionShot-KEHC5AMK.js → motionShot-BZLRN3SS.js} +13 -13
  123. package/dist/{normalize-audio-ATAQGUPX.js → normalize-audio-4YXE3RIF.js} +7 -7
  124. package/dist/{open-4DXBEX2U.js → open-MCGYEFML.js} +7 -7
  125. package/dist/{parakeetRunner-5PNBGCGH.js → parakeetRunner-DBLHMD5T.js} +13 -13
  126. package/dist/{pipeline-QA2422UI.js → pipeline-FSY65OQ4.js} +8 -8
  127. package/dist/{play-SKTSHZM5.js → play-WXOV3BD7.js} +28 -27
  128. package/dist/{preflight-BH2XUQBS.js → preflight-G5KP7ZKA.js} +4 -4
  129. package/dist/{present-KSQ5GASH.js → present-RVG4J6CJ.js} +23 -22
  130. package/dist/{preview-TDD3QDR3.js → preview-PDUQR2JQ.js} +24 -24
  131. package/dist/{producer-PQMZ7OYH.js → producer-C5V2A3YL.js} +1 -1
  132. package/dist/{projectConfig-EYYDESVO.js → projectConfig-X2IEHCSK.js} +6 -6
  133. package/dist/{publication-MJY3XYYV.js → publication-JEANCWBW.js} +2 -2
  134. package/dist/{publish-5TZIKVLW.js → publish-VX5OH4ST.js} +12 -12
  135. package/dist/{remove-background-HT73ZUIG.js → remove-background-IXCISD26.js} +9 -9
  136. package/dist/{render-ADBL3C7S.js → render-5BGU3FXU.js} +57 -35
  137. package/dist/{render-YTJ3SMCD.js → render-ISUT7Q3X.js} +3 -3
  138. package/dist/{render-KJCDJEGI.js → render-JNJVFBFF.js} +13 -13
  139. package/dist/{render-batch-AFB2XK3I.js → render-batch-2C6RUP3F.js} +3 -3
  140. package/dist/renderSetupWorker.js +4 -4
  141. package/dist/{resolver-F2D2YCSQ.js → resolver-KTNKZVIB.js} +4 -4
  142. package/dist/{sherpa-IBKSF6GX.js → sherpa-GFRG3TMM.js} +12 -12
  143. package/dist/skills/hyperframes-cli/SKILL.md +5 -4
  144. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +8 -0
  145. package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +1 -1
  146. package/dist/{skills-E75DFHGG.js → skills-LKJA27ZN.js} +5 -5
  147. package/dist/{skillsUpdateCheck-EPTKOBR6.js → skillsUpdateCheck-RFZJKZC4.js} +3 -3
  148. package/dist/{snapshot-Z6T4I5TE.js → snapshot-EOYA4MLG.js} +86 -50
  149. package/dist/{src-NDI4KNT3.js → src-GPUDUKY6.js} +7 -5
  150. package/dist/{src-4GCHM2LX.js → src-IMCQRH4P.js} +8 -8
  151. package/dist/{staticProjectServer-ITNEQNQ7.js → staticProjectServer-S3NK3V4S.js} +18 -15
  152. package/dist/studio/assets/{hyperframes-player-DX8LgKgb.js → hyperframes-player-CXL23NEv.js} +1 -1
  153. package/dist/studio/assets/{index-BdnuQ7ta.js → index-Bl_xrA5T.js} +1 -1
  154. package/dist/studio/assets/{index-DB0YwjiT.js → index-CejKvBNw.js} +1 -1
  155. package/dist/studio/assets/{index-7Ljcoa9s.js → index-D7BvLHtZ.js} +7 -7
  156. package/dist/studio/index.html +1 -1
  157. package/dist/{studio-api-JMWUSAG7.js → studio-api-YM5HLXUS.js} +16 -11
  158. package/dist/{studioServer-MWZNMAVJ.js → studioServer-CEXJK5TC.js} +60 -59
  159. package/dist/{telemetry-D6A2TRK6.js → telemetry-7AWYECPL.js} +3 -3
  160. package/dist/{timeline-VIF4G3IT.js → timeline-G7H373XX.js} +48 -353
  161. package/dist/{tokens-ORS6MFMG.js → tokens-GYH7NXXA.js} +2 -2
  162. package/dist/{transcribe-DNRG7OGE.js → transcribe-CIC7WAT5.js} +17 -17
  163. package/dist/{transcribe-DZ6O6EG5.js → transcribe-FL6NGWHF.js} +11 -11
  164. package/dist/{updateCheck-YY4BPYNT.js → updateCheck-MQ44KGUR.js} +2 -2
  165. package/dist/{upgrade-CUDVTTF5.js → upgrade-OL47SID3.js} +2 -2
  166. package/dist/{urlDownloader-INLS5A6I.js → urlDownloader-KDJGLR2Y.js} +5 -5
  167. package/dist/{usage-EC3KFUIJ.js → usage-HG4WMM7A.js} +33 -5
  168. package/dist/{validate-CQCQVHUX.js → validate-TDCH6X3C.js} +22 -21
  169. package/dist/{video-3GLT6U6Z.js → video-AHO4CDCK.js} +6 -6
  170. package/package.json +1 -1
  171. package/dist/chunk-LPOTN5GW.js +0 -3795
@@ -16,24 +16,24 @@ import {
16
16
  sherpaRuntimeLoadError,
17
17
  sherpaUnsupportedReason,
18
18
  transcribeWithSherpa
19
- } from "./chunk-4YDQQQY6.js";
19
+ } from "./chunk-MP676E4B.js";
20
20
  import "./chunk-BXCMXMJQ.js";
21
21
  import "./chunk-3DKN5WKL.js";
22
22
  import "./chunk-EOVYQ3IG.js";
23
- import "./chunk-ZZ3ZWTOI.js";
24
- import "./chunk-T243WV6D.js";
23
+ import "./chunk-DJZEIVAP.js";
24
+ import "./chunk-G642IIVK.js";
25
25
  import "./chunk-6BEFEWFB.js";
26
- import "./chunk-SQHWDFTV.js";
26
+ import "./chunk-X3SCQP2A.js";
27
27
  import "./chunk-PO2SDVQA.js";
28
- import "./chunk-KEGTYA7V.js";
28
+ import "./chunk-IK3SOMZ4.js";
29
29
  import "./chunk-XT6MXC7A.js";
30
- import "./chunk-IRRRH66M.js";
31
- import "./chunk-FJT35XBA.js";
30
+ import "./chunk-PLEMSN3E.js";
31
+ import "./chunk-LYIG2GZ5.js";
32
32
  import "./chunk-KCF6GHJP.js";
33
33
  import "./chunk-JYVGYKXG.js";
34
34
  import "./chunk-7KDQAD2W.js";
35
- import "./chunk-SGIZMTWO.js";
36
- import "./chunk-LPOTN5GW.js";
35
+ import "./chunk-Q3TFX4OZ.js";
36
+ import "./chunk-P47XYVEQ.js";
37
37
  import "./chunk-VC76R6W2.js";
38
38
  import "./chunk-UJKQWGFF.js";
39
39
  import "./chunk-ALLKNYC3.js";
@@ -42,10 +42,10 @@ import "./chunk-DPVXBVLL.js";
42
42
  import "./chunk-T76PLPD6.js";
43
43
  import "./chunk-FXMKHHPO.js";
44
44
  import "./chunk-RQVDTPGD.js";
45
- import "./chunk-YIJMVFEJ.js";
46
- import "./chunk-54DMWFQZ.js";
45
+ import "./chunk-22QHO26F.js";
46
+ import "./chunk-D3ZWBHZP.js";
47
47
  import "./chunk-TWWSYAKJ.js";
48
- import "./chunk-7F3B5YYT.js";
48
+ import "./chunk-2742O5DO.js";
49
49
  import "./chunk-IWFLMU2N.js";
50
50
  import "./chunk-3VGU2SH7.js";
51
51
  import "./chunk-VAS6HQX3.js";
@@ -22,11 +22,11 @@ Run commands as `npx hyperframes ...` unless project instructions provide a wrap
22
22
  3. **Author:** write the composition using `/hyperframes-core`. To know what is on a project's timeline (tracks, clips, starts, ends, what plays), run `npx hyperframes timeline --json` instead of reading `index.html` and every sub-composition file: nested rows carry absolute main-timeline `absStart`/`absEnd` and their owning `file`, not just their local, per-sub-composition time. Prefer `--json` over the text form; it costs fewer tokens for the same or better correctness. See `references/upgrade-info-misc.md` for one-liners that answer common questions without reading the whole output.
23
23
  4. **Get fast feedback while editing:** run `npx hyperframes lint` after the first HTML pass and after structural changes.
24
24
  5. **Run the final gate:** run `npx hyperframes check`; it reruns lint before opening the browser. Do not prepend a redundant standalone lint invocation. Add `--snapshots` for annotated overview frames and finding crops.
25
- 6. **Inspect sub-compositions:** when `index.html` mounts `data-composition-src`, capture midpoint snapshots and inspect each mounted scene.
25
+ 6. **Inspect sub-compositions:** when `index.html` mounts `data-composition-src`, capture midpoint snapshots and inspect each mounted scene. Inspect the opening 30 seconds and reported problem times at full resolution; zoom into fine geometry, text, and WebGL edges rather than judging a contact sheet alone.
26
26
  7. **Open the final Studio preview:** run `npx hyperframes preview --background`, verify the URL returns HTTP 200, hand the timeline project URL to the user, and ask whether to revise or render. Keep it alive until review ends.
27
27
  8. **Render only after approval:** use `--quality draft` while iterating, `--quality looks` for the first real encode (the CLI default), and `--quality delivery` for final delivery.
28
28
  9. **Hand the project to the desktop app (on offer):** when the render's Framey line ends in `hyperframes open …`, offer `npx hyperframes open [dir]`. It opens the project in the HyperFrames desktop app and adds it to Home; under Claude Code, Codex or Grok its chat picks up this conversation. Without the app it exits 1 and prints the download link. `--json` for agents. When `open` says to run `catch-up` once the person is back, or any command ends with a line naming it, run `npx hyperframes catch-up [dir]` before your next change: it lists what was asked and changed in the app since the hand-off. An older CLI has no `catch-up`.
29
- 10. **Verify the output:** confirm the file exists and is non-empty. Read the render summary's second line (`beginframe` vs `screenshot`, GPU, stage timings). `screenshot` + `software gpu` on Linux is the slow path. `ffprobe -v error -show_format -show_streams` and compare duration (and fps if the brief set it) to the root `data-duration`.
29
+ 10. **Verify the output:** confirm the file exists and is non-empty. Read the render summary's second line (`beginframe` vs `screenshot`, GPU, stage timings). `screenshot` + `software gpu` on Linux is the slow path. `ffprobe -v error -show_format -show_streams` and compare duration (and fps if the brief set it) to the root `data-duration`. Visually inspect decoded output frames at the same times as the preview, including close-ups; a successful check or encode does not certify the pixels inside a canvas.
30
30
 
31
31
  <!-- history (trial): remove this block together with the command -->
32
32
 
@@ -104,8 +104,9 @@ Treat tiny unstyled content, canvas-sized icons, missing hero elements, or timel
104
104
 
105
105
  - Non-TTY mode is automatic and scaffolds the centered blank. Pass `--example` only to start from a named example. Use `--non-interactive` to force flag-only mode on a TTY.
106
106
  - Use one `HYPERFRAMES_RUN_ID` for all commands in the same verification loop.
107
- - When disk is tight, run `npx hyperframes clean` (`--dry-run` to list first); it removes what dead renders left and idle caches that rebuild themselves, never outputs, sources or anything a running render uses. Write QC frames to a temp dir, not the project.
107
+ - When disk is tight, run `npx hyperframes clean` (`--dry-run` to list first); it removes what dead renders left and idle caches that rebuild themselves, never outputs, sources or anything a running render uses. Write disposable QC frames to a temp dir, then remove only that owned directory. Managed snapshot runs retain the newest 10 plus current/latest/rendered evidence; active captures and runs younger than 24 hours are protected. Copy intentional before/after evidence outside managed storage before it ages out. Never delete `.hyperframes` wholesale: it also holds project history.
108
108
  - Use `--strict`, `--strict-all`, and `--strict-variables` when the corresponding warnings, variables, or CI conditions must gate the render.
109
+ - For `shader_unbounded_cosine_pow`, clamp the cosine to `[0, 1]` before `pow(1 - cosine, exponent)`; a lower-only `max` is insufficient. Follow `/hyperframes-animation` → `adapters/three.md` for the source fix and affected-GPU preview/export verification. Lint only recognizes static shader expressions, and software rendering can miss hardware-specific invalid pixels.
109
110
  - JSON paths redact the home directory as `$HOME`; do not try to reverse the redaction.
110
111
  - When a hosted cloud project approaches or exceeds the 200 MB upload limit, use `cloud render --dry-run --json` and follow the `.hyperframesignore` investigation in `references/cloud.md`. Never ignore an asset merely because it is large.
111
112
  - Never render merely because checks pass. Pause at the final preview and wait for approval.
@@ -194,6 +195,6 @@ Two entries in `hyperframes --help` are not part of the authoring loop, and reac
194
195
 
195
196
  Run `npx hyperframes usage --json` at the start of a video workflow and again at milestones such as after drafting and before rendering. A fresh read at handoff can serve as the start read. Use `--harness claude-code`, `--harness codex`, or `--harness grok` to select explicitly.
196
197
 
197
- Known results contain `status: "known"`, `harness`, `planTier`, `session`, and `weekly`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`.
198
+ Known results contain `status: "known"`, `harness`, `planTier`, `session`, `weekly`, and `spend`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows; a spend-metered plan (such as Enterprise) has neither and reports `spend`, the share of its billing-period spend limit already used, with `resetsAt: null`. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`. Only Claude Code reports `spend`; it is `null` elsewhere. When no window is available the result is `status: "unknown"` with `reason: "no_usage_windows"`.
198
199
 
199
200
  Unknown results contain `status: "unknown"` and a token-free `reason`. Missing, expired, unsupported, ambiguous, or unreadable logins and unavailable provider responses return unknown. Report the unknown state without guessing allowance. The command reads existing credentials without refreshing or rewriting them and emits no tokens or telemetry. Usage is a snapshot; it does not reserve allowance or estimate the next video's cost. Keep scope and workflow choices with the user.
@@ -112,6 +112,14 @@ Still PNGs. Each run writes `.hyperframes/artifacts/snapshots/<id>/` unless `--o
112
112
 
113
113
  One of `--at`, `--range START:END` (seconds), or `--composition <data-composition-id>` (not a CSS selector). `--frames` defaults to 5. Range and composition sample just before the end and add no extra end frame; `--at` adds one unless `--no-end`.
114
114
 
115
+ ### Keep verification clean and inspect the actual pixels
116
+
117
+ Inspect full-resolution frames in the opening 30 seconds, each mounted scene, and every reported problem interval. Contact sheets locate moments; use close-ups to judge thin edges, glass, particles, and WebGL geometry. Check the live preview and decoded render at matching times. Canvas shader defects can survive a successful DOM/layout audit. Record the browser/GPU and capture path when results differ across machines; isolate the failing material or pass before changing rendering defaults.
118
+
119
+ Managed snapshot storage keeps the newest 10 run folders, the newest evidence for the current revision and retained rendered revisions, and the latest snapshot. Live captures and folders younger than 24 hours are also preserved. Automatic cleanup removes whole eligible old UUID folders, including contact sheets and descriptions; arbitrary `--output` folders are untouched. Save intentional before/after evidence outside this managed storage.
120
+
121
+ For disposable checks, allocate a temporary output folder and remove that folder after inspecting it. Use `hyperframes clean --dry-run` to inspect broader cleanup. `clean --snapshots` explicitly discards snapshot evidence; use it only when that evidence is no longer needed. Never recommend removing all of `.hyperframes`, which also contains project history and other state.
122
+
115
123
  ### Zooming into a reported finding
116
124
 
117
125
  `hyperframes check --snapshots` already writes a `finding-NN-<code>.png` crop for every error finding that carries a bbox, but the same zoom is available standalone once you know what to look at:
@@ -129,6 +129,6 @@ For voice selection, Whisper model rules, output format choice, and the TTS →
129
129
 
130
130
  Run `npx hyperframes usage --json` at the start of a video workflow and again at milestones such as after drafting and before rendering. A fresh read at handoff can serve as the start read. Use `--harness claude-code`, `--harness codex`, or `--harness grok` to select explicitly.
131
131
 
132
- Known results contain `status: "known"`, `harness`, `planTier`, `session`, and `weekly`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`.
132
+ Known results contain `status: "known"`, `harness`, `planTier`, `session`, `weekly`, and `spend`. Each available window contains `usedPercent`, `remainingPercent`, and `resetsAt`; an unavailable window is `null`. `planTier` is the readable subscription tier when available, otherwise `null`. Claude Code reports its shared five-hour and weekly windows; a spend-metered plan (such as Enterprise) has neither and reports `spend`, the share of its billing-period spend limit already used, with `resetsAt: null`. Codex reports its shared session and weekly windows when available. Grok reports its included weekly allowance with `session: null`. Only Claude Code reports `spend`; it is `null` elsewhere. When no window is available the result is `status: "unknown"` with `reason: "no_usage_windows"`.
133
133
 
134
134
  Unknown results contain `status: "unknown"` and a token-free `reason`. Missing, expired, unsupported, ambiguous, or unreadable logins and unavailable provider responses return unknown. Report the unknown state without guessing allowance. The command reads existing credentials without refreshing or rewriting them and emits no tokens or telemetry. Usage is a snapshot; it does not reserve allowance or estimate the next video's cost. Keep scope and workflow choices with the user.
@@ -6,8 +6,8 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  trackSkillsInstallSkipped
9
- } from "./chunk-2XUQPJ3W.js";
10
- import "./chunk-H6BWNY56.js";
9
+ } from "./chunk-KRE55WLI.js";
10
+ import "./chunk-ICZVCVD3.js";
11
11
  import {
12
12
  diag
13
13
  } from "./chunk-VWG7OQKU.js";
@@ -35,15 +35,15 @@ import {
35
35
  isCoreSkill,
36
36
  presentSkills,
37
37
  pruneOrphanedLockEntries
38
- } from "./chunk-W2SNLHKF.js";
38
+ } from "./chunk-TTFDAWCS.js";
39
39
  import {
40
40
  withMeta
41
- } from "./chunk-QH2PL6J4.js";
41
+ } from "./chunk-FRGYHRP6.js";
42
42
  import "./chunk-K4WIOZFP.js";
43
43
  import "./chunk-XUXGIA7H.js";
44
44
  import "./chunk-WERLJGIC.js";
45
45
  import "./chunk-ISN5GRYI.js";
46
- import "./chunk-RU6AIVON.js";
46
+ import "./chunk-TU2CQJO3.js";
47
47
  import {
48
48
  buildNpxCommand
49
49
  } from "./chunk-6BEFEWFB.js";
@@ -9,13 +9,13 @@ import {
9
9
  printSkillsUpdateNotice,
10
10
  refreshSkillsCache,
11
11
  skillsCheckDue
12
- } from "./chunk-W2SNLHKF.js";
13
- import "./chunk-QH2PL6J4.js";
12
+ } from "./chunk-TTFDAWCS.js";
13
+ import "./chunk-FRGYHRP6.js";
14
14
  import "./chunk-K4WIOZFP.js";
15
15
  import "./chunk-XUXGIA7H.js";
16
16
  import "./chunk-WERLJGIC.js";
17
17
  import "./chunk-ISN5GRYI.js";
18
- import "./chunk-RU6AIVON.js";
18
+ import "./chunk-TU2CQJO3.js";
19
19
  import "./chunk-KNU5COPB.js";
20
20
  import "./chunk-M2WBOQ2Q.js";
21
21
  export {
@@ -4,6 +4,9 @@ import { dirname as __hf_dirname } from "node:path";
4
4
  var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ writeCaptureFileSync
9
+ } from "./chunk-MRF4AMKD.js";
7
10
  import {
8
11
  parseAngle
9
12
  } from "./chunk-KZI44OPA.js";
@@ -14,13 +17,8 @@ import {
14
17
  } from "./chunk-57GN6KWT.js";
15
18
  import {
16
19
  captureArtifactRevision
17
- } from "./chunk-Y6E2PW7Z.js";
18
- import "./chunk-Z347DFOL.js";
19
- import {
20
- serveStaticProjectHtml
21
- } from "./chunk-4R6OZQGX.js";
22
- import "./chunk-XUHOIDKG.js";
23
- import "./chunk-J4SSEVRU.js";
20
+ } from "./chunk-GOASXWDD.js";
21
+ import "./chunk-V2FQQILJ.js";
24
22
  import "./chunk-X7MTZ4T2.js";
25
23
  import {
26
24
  DEFAULT_ZOOM_SCALE,
@@ -30,46 +28,55 @@ import {
30
28
  resolveCropRegion,
31
29
  runFfmpegOnce,
32
30
  seekCompositionTimeline
33
- } from "./chunk-7FGHFHWD.js";
31
+ } from "./chunk-6MCASYIS.js";
34
32
  import "./chunk-FH7WODJH.js";
35
- import "./chunk-LAAGHMRC.js";
36
- import "./chunk-J7WFHOCW.js";
33
+ import "./chunk-B5FZ2CQM.js";
34
+ import "./chunk-ERTJPFCH.js";
37
35
  import "./chunk-WPNE5NEP.js";
38
- import "./chunk-DCQCGE2W.js";
39
- import "./chunk-56QTFOWH.js";
40
- import "./chunk-C6TPGUWD.js";
41
- import {
42
- artifactDirectory,
43
- forgetRecordedArtifacts,
44
- recordArtifacts
45
- } from "./chunk-6PIGOKTE.js";
46
- import "./chunk-DISITOR6.js";
47
- import "./chunk-FFDC5OWV.js";
48
- import {
49
- resolveProject
50
- } from "./chunk-L6AJC7UQ.js";
51
36
  import {
52
37
  formatLintFindings
53
38
  } from "./chunk-6CSYCFQV.js";
39
+ import {
40
+ resolveProject
41
+ } from "./chunk-37LNY2EC.js";
54
42
  import "./chunk-K2FLNJVB.js";
43
+ import {
44
+ serveStaticProjectHtml
45
+ } from "./chunk-GOTCGKX6.js";
46
+ import "./chunk-X7MTZ4T2.js";
47
+ import "./chunk-SHVDJON6.js";
55
48
  import "./chunk-DQBY7FRR.js";
56
49
  import {
57
50
  resolveLocalBrowserGpuMode
58
- } from "./chunk-YB26LWR2.js";
51
+ } from "./chunk-SB5DX6AD.js";
59
52
  import "./chunk-442JNXRM.js";
60
- import "./chunk-GPUVPZRK.js";
53
+ import "./chunk-XUHOIDKG.js";
54
+ import "./chunk-VD7WQYTO.js";
55
+ import "./chunk-PINFPWRV.js";
56
+ import "./chunk-C6TPGUWD.js";
57
+ import "./chunk-6JR2XUEE.js";
58
+ import "./chunk-4ID635FL.js";
59
+ import {
60
+ artifactDirectory,
61
+ finishSnapshotRun,
62
+ forgetRecordedArtifacts,
63
+ recordArtifacts,
64
+ retainSnapshotOutput
65
+ } from "./chunk-JGYHWVXQ.js";
66
+ import "./chunk-FFDC5OWV.js";
67
+ import "./chunk-GG37I7B3.js";
61
68
  import "./chunk-XT7X6QCP.js";
62
69
  import "./chunk-4YYJOFKS.js";
63
70
  import "./chunk-HVW7ABXD.js";
64
- import "./chunk-3FRK53UC.js";
65
- import "./chunk-LQXHRO6F.js";
66
- import "./chunk-QRPYTJBW.js";
71
+ import "./chunk-D33YJZOH.js";
72
+ import "./chunk-N2NDDTYW.js";
73
+ import "./chunk-EVRUR7DW.js";
67
74
  import "./chunk-AWDFDFI3.js";
68
75
  import "./chunk-P6LJ4Y32.js";
69
76
  import "./chunk-GMECXFAN.js";
70
77
  import "./chunk-5CS4T6C6.js";
71
- import "./chunk-2XUQPJ3W.js";
72
- import "./chunk-H6BWNY56.js";
78
+ import "./chunk-KRE55WLI.js";
79
+ import "./chunk-ICZVCVD3.js";
73
80
  import "./chunk-VWG7OQKU.js";
74
81
  import "./chunk-QWQ6GQTI.js";
75
82
  import {
@@ -93,7 +100,7 @@ import "./chunk-K4WIOZFP.js";
93
100
  import "./chunk-XUXGIA7H.js";
94
101
  import "./chunk-WERLJGIC.js";
95
102
  import "./chunk-ISN5GRYI.js";
96
- import "./chunk-RU6AIVON.js";
103
+ import "./chunk-TU2CQJO3.js";
97
104
  import {
98
105
  loadOptionalPackage
99
106
  } from "./chunk-3DKN5WKL.js";
@@ -103,10 +110,10 @@ import {
103
110
  findFFmpeg,
104
111
  findFFprobe,
105
112
  getFFmpegInstallHint
106
- } from "./chunk-KEGTYA7V.js";
113
+ } from "./chunk-IK3SOMZ4.js";
107
114
  import "./chunk-XT6MXC7A.js";
108
- import "./chunk-IRRRH66M.js";
109
- import "./chunk-FJT35XBA.js";
115
+ import "./chunk-PLEMSN3E.js";
116
+ import "./chunk-LYIG2GZ5.js";
110
117
  import "./chunk-KCF6GHJP.js";
111
118
  import "./chunk-JYVGYKXG.js";
112
119
  import "./chunk-7KDQAD2W.js";
@@ -114,12 +121,12 @@ import {
114
121
  createRuntimeStartTimeResolver,
115
122
  isClipVisibleAt,
116
123
  isInClipWindow
117
- } from "./chunk-SGIZMTWO.js";
124
+ } from "./chunk-Q3TFX4OZ.js";
118
125
  import {
119
126
  readElementRateSpec,
120
127
  sourceTimeAt,
121
128
  timeAtSourceTime
122
- } from "./chunk-LPOTN5GW.js";
129
+ } from "./chunk-P47XYVEQ.js";
123
130
  import "./chunk-VC76R6W2.js";
124
131
  import "./chunk-UJKQWGFF.js";
125
132
  import "./chunk-ALLKNYC3.js";
@@ -130,11 +137,11 @@ import "./chunk-FXMKHHPO.js";
130
137
  import "./chunk-RQVDTPGD.js";
131
138
  import {
132
139
  runCancellableProcess
133
- } from "./chunk-54DMWFQZ.js";
140
+ } from "./chunk-D3ZWBHZP.js";
134
141
  import "./chunk-TWWSYAKJ.js";
135
142
  import {
136
143
  lintProject
137
- } from "./chunk-7F3B5YYT.js";
144
+ } from "./chunk-2742O5DO.js";
138
145
  import "./chunk-IWFLMU2N.js";
139
146
  import "./chunk-3VGU2SH7.js";
140
147
  import "./chunk-VAS6HQX3.js";
@@ -231,6 +238,19 @@ var FFMPEG_EXTRACT_TIMEOUT_MS = 3e4;
231
238
  function formatSnapshotTimestamp(time) {
232
239
  return `${Number(time.toFixed(3))}s`;
233
240
  }
241
+ function assertDistinctKeepNames(times) {
242
+ const timeByLabel = /* @__PURE__ */ new Map();
243
+ for (const time of times) {
244
+ const label = formatSnapshotTimestamp(time);
245
+ const other = timeByLabel.get(label);
246
+ if (other !== void 0 && other !== time) {
247
+ throw new Error(
248
+ `--keep would name both ${other} and ${time} at-${label}.png; pass times at least 1 ms apart`
249
+ );
250
+ }
251
+ timeByLabel.set(label, time);
252
+ }
253
+ }
234
254
  function resolveSnapshotVideoFrameTime(input) {
235
255
  const { globalTime, clipStart, clipDuration, sourceDuration, compositionDuration } = input;
236
256
  const clipEnd = clipStart + clipDuration;
@@ -442,7 +462,7 @@ function computeSnapshotTimes(duration, opts) {
442
462
  return { times: times.map(round), appendedTail: false };
443
463
  }
444
464
  async function captureSnapshots(projectDir, opts) {
445
- const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-IVO43QBQ.js");
465
+ const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-SLBVWQ7O.js");
446
466
  const capture = await captureArtifactRevision(projectDir).catch(warnSnapshotsNotRecorded);
447
467
  const invocation = randomUUID();
448
468
  const artifacts = [];
@@ -542,7 +562,7 @@ async function captureSnapshots(projectDir, opts) {
542
562
  mkdirSync(snapshotDir, { recursive: true });
543
563
  try {
544
564
  const { readdirSync } = await import("fs");
545
- for (const file of readdirSync(snapshotDir)) {
565
+ for (const file of opts.keep ? [] : readdirSync(snapshotDir)) {
546
566
  if (/\.(png|jpg|jpeg)$/i.test(file)) {
547
567
  const path = resolve(snapshotDir, file);
548
568
  replaced.push(path);
@@ -555,7 +575,7 @@ async function captureSnapshots(projectDir, opts) {
555
575
  let syncVideoFrameVisibility = null;
556
576
  let extractMediaMetadata = null;
557
577
  try {
558
- const engine = await import("./src-NDI4KNT3.js");
578
+ const engine = await import("./src-GPUDUKY6.js");
559
579
  injectVideoFramesBatch = engine.injectVideoFramesBatch;
560
580
  syncVideoFrameVisibility = engine.syncVideoFrameVisibility;
561
581
  extractMediaMetadata = engine.extractMediaMetadata;
@@ -685,8 +705,8 @@ async function captureSnapshots(projectDir, opts) {
685
705
  }
686
706
  await recaptureSnapshotComposite(page);
687
707
  const timeLabel = formatSnapshotTimestamp(time);
688
- const index = String(i).padStart(2, "0");
689
- const filename = `frame-${index}-at-${timeLabel}.png`;
708
+ const slot = opts.keep ? `at-${timeLabel}` : `${String(i).padStart(2, "0")}-at-${timeLabel}`;
709
+ const filename = opts.keep ? `${slot}.png` : `frame-${slot}.png`;
690
710
  const framePath = join(snapshotDir, filename);
691
711
  let crop;
692
712
  if (opts.zoom) {
@@ -708,9 +728,12 @@ async function captureSnapshots(projectDir, opts) {
708
728
  region,
709
729
  opts.zoomScale ?? DEFAULT_ZOOM_SCALE
710
730
  );
711
- writeFileSync(framePath, buffer);
731
+ writeCaptureFileSync(framePath, buffer);
712
732
  } else {
713
- await page.screenshot({ path: framePath, type: "png", omitBackground: true });
733
+ writeCaptureFileSync(
734
+ framePath,
735
+ await page.screenshot({ type: "png", omitBackground: true })
736
+ );
714
737
  }
715
738
  artifacts.push({
716
739
  id: `${invocation}-${i}`,
@@ -732,9 +755,9 @@ async function captureSnapshots(projectDir, opts) {
732
755
  ` ${c.warn("\u26A0")} --against has no frame at ${timeLabel} \u2014 reference pair skipped`
733
756
  );
734
757
  } else {
735
- const refPath = join(snapshotDir, `ref-${index}-at-${timeLabel}.png`);
736
- writeFileSync(refPath, refPng);
737
- const pairPath = join(snapshotDir, `pair-${index}-at-${timeLabel}.jpg`);
758
+ const refPath = join(snapshotDir, `ref-${slot}.png`);
759
+ writeCaptureFileSync(refPath, refPng);
760
+ const pairPath = join(snapshotDir, `pair-${slot}.jpg`);
738
761
  const { createContactSheet } = await import("./contactSheet-27SRU7A4.js");
739
762
  await createContactSheet([framePath, refPath], pairPath, {
740
763
  cols: 2,
@@ -837,6 +860,11 @@ var snapshot_default = defineCommand({
837
860
  description: "Always include a readable end-of-timeline frame (default: true). Pass --no-end to capture only your exact --at times.",
838
861
  default: true
839
862
  },
863
+ keep: {
864
+ type: "boolean",
865
+ description: "Add to --output instead of clearing it, naming each still at-<seconds>s.png (at-0s, at-1.5s, at-12.25s: no trailing zeros), so snapshotting one moment again replaces only that still. Times less than 1 ms apart share a name, so one run may not pass two of them. No contact sheet.",
866
+ default: false
867
+ },
840
868
  zoom: {
841
869
  type: "string",
842
870
  description: "Zoom into a CSS selector or an exact pixel region 'x,y,w,h'. Crops a high-density screenshot instead of the full frame \u2014 a raised deviceScaleFactor, never CSS zoom or viewport resizing, so layout stays identical. A selector matching nothing is an error, not a silent full-frame shot."
@@ -902,6 +930,7 @@ var snapshot_default = defineCommand({
902
930
  }
903
931
  const timeout = parseInt(args.timeout, 10) || 5e3;
904
932
  const atTimestamps = args.at ? String(args.at).split(",").map((s) => parseFloat(s.trim())).filter((n) => !isNaN(n)) : void 0;
933
+ if (args.keep === true && atTimestamps) assertDistinctKeepNames(atTimestamps);
905
934
  const describeArg = args.describe === void 0 ? "true" : String(args.describe) === "false" ? null : String(args.describe);
906
935
  const camera = args.angle ? parseAngle(String(args.angle)) : void 0;
907
936
  const zoomTarget = args.zoom ? parseZoomTarget(String(args.zoom)) : void 0;
@@ -914,8 +943,11 @@ var snapshot_default = defineCommand({
914
943
  const label = atTimestamps ? `${atTimestamps.length} frames at [${atTimestamps.map(formatSnapshotTimestamp).join(", ")}]` : `${frames} frames`;
915
944
  const angleLabel = camera && (camera.yaw !== 0 || camera.pitch !== 0) ? ` ${c.dim(`(angle yaw ${camera.yaw}\xB0 pitch ${camera.pitch}\xB0)`)}` : "";
916
945
  console.log(`${c.accent("\u25C6")} Capturing ${label} from ${c.accent(project.name)}${angleLabel}`);
946
+ let managedSnapshotDir;
917
947
  try {
918
948
  const snapshotDir = args.output ? resolve(String(args.output)) : artifactDirectory(project.dir, "snapshots");
949
+ if (!args.output) managedSnapshotDir = snapshotDir;
950
+ if (args.output) retainSnapshotOutput(project.dir, snapshotDir);
919
951
  await withProjectLock(project.dir, "snapshot", async () => {
920
952
  const paths = await captureSnapshots(project.dir, {
921
953
  frames,
@@ -930,7 +962,8 @@ var snapshot_default = defineCommand({
930
962
  zoomScale,
931
963
  autoProxy: args.proxy,
932
964
  browserGpuMode: resolveLocalBrowserGpuMode(args["browser-gpu"]),
933
- against
965
+ against,
966
+ keep: args.keep === true
934
967
  });
935
968
  reportArtifacts(
936
969
  "snapshot",
@@ -956,7 +989,7 @@ ${c.success("\u25C7")} ${paths.length} snapshots saved to ${snapshotDir}`);
956
989
  }
957
990
  try {
958
991
  const { createSnapshotContactSheet } = await import("./contactSheet-27SRU7A4.js");
959
- const sheets = await createSnapshotContactSheet(
992
+ const sheets = args.keep === true ? [] : await createSnapshotContactSheet(
960
993
  snapshotDir,
961
994
  join(snapshotDir, "contact-sheet.jpg")
962
995
  );
@@ -1058,6 +1091,9 @@ ${c.success("\u25C7")} ${paths.length} snapshots saved to ${snapshotDir}`);
1058
1091
  console.error(`
1059
1092
  ${c.error("\u2717")} Snapshot failed: ${msg}`);
1060
1093
  failCommand();
1094
+ } finally {
1095
+ if (managedSnapshotDir)
1096
+ await finishSnapshotRun(project.dir, managedSnapshotDir).catch(warnSnapshotsNotRecorded);
1061
1097
  }
1062
1098
  }
1063
1099
  });
@@ -53,6 +53,7 @@ import {
53
53
  assertPublicHttpsUrl,
54
54
  assertSwiftShader,
55
55
  assertWebGpuAdapterAvailable,
56
+ audioFailureDiagnostics,
56
57
  augmentPageNavigationTimeoutError,
57
58
  augmentProtocolTimeoutError,
58
59
  beginFrameCapture,
@@ -216,8 +217,8 @@ import {
216
217
  verifyGpuParity,
217
218
  writeCapturedFrame,
218
219
  writeUrlDownloadTelemetry
219
- } from "./chunk-IRRRH66M.js";
220
- import "./chunk-FJT35XBA.js";
220
+ } from "./chunk-PLEMSN3E.js";
221
+ import "./chunk-LYIG2GZ5.js";
221
222
  import "./chunk-KCF6GHJP.js";
222
223
  import {
223
224
  LOW_MEMORY_TOTAL_MB_THRESHOLD,
@@ -229,8 +230,8 @@ import "./chunk-7KDQAD2W.js";
229
230
  import {
230
231
  MEDIA_VISUAL_STYLE_PROPERTIES,
231
232
  quantizeTimeToFrame
232
- } from "./chunk-SGIZMTWO.js";
233
- import "./chunk-LPOTN5GW.js";
233
+ } from "./chunk-Q3TFX4OZ.js";
234
+ import "./chunk-P47XYVEQ.js";
234
235
  import "./chunk-VC76R6W2.js";
235
236
  import "./chunk-UJKQWGFF.js";
236
237
  import "./chunk-ALLKNYC3.js";
@@ -242,7 +243,7 @@ import "./chunk-RQVDTPGD.js";
242
243
  import {
243
244
  chromeMajorCeiling
244
245
  } from "./chunk-TWWSYAKJ.js";
245
- import "./chunk-7F3B5YYT.js";
246
+ import "./chunk-2742O5DO.js";
246
247
  import {
247
248
  resolveProjectRelativeSrc
248
249
  } from "./chunk-IWFLMU2N.js";
@@ -319,6 +320,7 @@ export {
319
320
  assertPublicHttpsUrl,
320
321
  assertSwiftShader,
321
322
  assertWebGpuAdapterAvailable,
323
+ audioFailureDiagnostics,
322
324
  augmentPageNavigationTimeoutError,
323
325
  augmentProtocolTimeoutError,
324
326
  beginFrameCapture,
@@ -69,7 +69,7 @@ import {
69
69
  serializeRenderRequest,
70
70
  startServer,
71
71
  validatePlanV2MaterializedTarget
72
- } from "./chunk-EEEUI3ON.js";
72
+ } from "./chunk-2ZLYSXZC.js";
73
73
  import {
74
74
  FONT_FETCH_FAILED,
75
75
  FONT_FETCH_UNAVAILABLE,
@@ -78,11 +78,11 @@ import {
78
78
  injectDeterministicFontFaces
79
79
  } from "./chunk-3QATT3QF.js";
80
80
  import "./chunk-FI4I7CME.js";
81
- import "./chunk-T76NSAXO.js";
81
+ import "./chunk-MMV6IY6U.js";
82
+ import "./chunk-BZ56MTDX.js";
82
83
  import "./chunk-KLIKCX6Q.js";
83
84
  import "./chunk-EOOEC32M.js";
84
85
  import "./chunk-TJSTGSAW.js";
85
- import "./chunk-BZ56MTDX.js";
86
86
  import {
87
87
  DEFAULT_CONFIG,
88
88
  captureFrame,
@@ -96,15 +96,15 @@ import {
96
96
  isTransientBrowserError,
97
97
  prepareCaptureSessionForReuse,
98
98
  resolveConfig
99
- } from "./chunk-IRRRH66M.js";
100
- import "./chunk-FJT35XBA.js";
99
+ } from "./chunk-PLEMSN3E.js";
100
+ import "./chunk-LYIG2GZ5.js";
101
101
  import "./chunk-KCF6GHJP.js";
102
102
  import "./chunk-JYVGYKXG.js";
103
103
  import "./chunk-7KDQAD2W.js";
104
104
  import {
105
105
  quantizeTimeToFrame
106
- } from "./chunk-SGIZMTWO.js";
107
- import "./chunk-LPOTN5GW.js";
106
+ } from "./chunk-Q3TFX4OZ.js";
107
+ import "./chunk-P47XYVEQ.js";
108
108
  import "./chunk-VC76R6W2.js";
109
109
  import "./chunk-UJKQWGFF.js";
110
110
  import "./chunk-ALLKNYC3.js";
@@ -114,7 +114,7 @@ import "./chunk-T76PLPD6.js";
114
114
  import "./chunk-FXMKHHPO.js";
115
115
  import "./chunk-RQVDTPGD.js";
116
116
  import "./chunk-TWWSYAKJ.js";
117
- import "./chunk-7F3B5YYT.js";
117
+ import "./chunk-2742O5DO.js";
118
118
  import "./chunk-IWFLMU2N.js";
119
119
  import "./chunk-3VGU2SH7.js";
120
120
  import "./chunk-VAS6HQX3.js";
@@ -5,24 +5,26 @@ var require = __hf_createRequire(import.meta.url);
5
5
  var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
+ inProcessAnswer,
8
9
  serveStaticProjectHtml
9
- } from "./chunk-4R6OZQGX.js";
10
- import "./chunk-XUHOIDKG.js";
11
- import "./chunk-J4SSEVRU.js";
10
+ } from "./chunk-GOTCGKX6.js";
12
11
  import "./chunk-X7MTZ4T2.js";
13
- import "./chunk-DCQCGE2W.js";
14
- import "./chunk-56QTFOWH.js";
12
+ import "./chunk-SHVDJON6.js";
13
+ import "./chunk-XUHOIDKG.js";
14
+ import "./chunk-VD7WQYTO.js";
15
+ import "./chunk-PINFPWRV.js";
15
16
  import "./chunk-C6TPGUWD.js";
16
- import "./chunk-6PIGOKTE.js";
17
- import "./chunk-DISITOR6.js";
17
+ import "./chunk-6JR2XUEE.js";
18
+ import "./chunk-4ID635FL.js";
19
+ import "./chunk-JGYHWVXQ.js";
18
20
  import "./chunk-FFDC5OWV.js";
19
- import "./chunk-GPUVPZRK.js";
21
+ import "./chunk-GG37I7B3.js";
20
22
  import "./chunk-XT7X6QCP.js";
21
23
  import "./chunk-4YYJOFKS.js";
22
24
  import "./chunk-HVW7ABXD.js";
23
- import "./chunk-3FRK53UC.js";
24
- import "./chunk-LQXHRO6F.js";
25
- import "./chunk-QRPYTJBW.js";
25
+ import "./chunk-D33YJZOH.js";
26
+ import "./chunk-N2NDDTYW.js";
27
+ import "./chunk-EVRUR7DW.js";
26
28
  import "./chunk-AWDFDFI3.js";
27
29
  import "./chunk-P6LJ4Y32.js";
28
30
  import "./chunk-GMECXFAN.js";
@@ -31,10 +33,10 @@ import "./chunk-KLIKCX6Q.js";
31
33
  import "./chunk-EOOEC32M.js";
32
34
  import "./chunk-TJSTGSAW.js";
33
35
  import "./chunk-EOVYQ3IG.js";
34
- import "./chunk-FJT35XBA.js";
36
+ import "./chunk-LYIG2GZ5.js";
35
37
  import "./chunk-KCF6GHJP.js";
36
- import "./chunk-SGIZMTWO.js";
37
- import "./chunk-LPOTN5GW.js";
38
+ import "./chunk-Q3TFX4OZ.js";
39
+ import "./chunk-P47XYVEQ.js";
38
40
  import "./chunk-VC76R6W2.js";
39
41
  import "./chunk-UJKQWGFF.js";
40
42
  import "./chunk-ALLKNYC3.js";
@@ -43,7 +45,7 @@ import "./chunk-DPVXBVLL.js";
43
45
  import "./chunk-T76PLPD6.js";
44
46
  import "./chunk-FXMKHHPO.js";
45
47
  import "./chunk-RQVDTPGD.js";
46
- import "./chunk-7F3B5YYT.js";
48
+ import "./chunk-2742O5DO.js";
47
49
  import "./chunk-IWFLMU2N.js";
48
50
  import "./chunk-3VGU2SH7.js";
49
51
  import "./chunk-VAS6HQX3.js";
@@ -54,5 +56,6 @@ import "./chunk-TYXH3EKP.js";
54
56
  import "./chunk-IXLUTE6N.js";
55
57
  import "./chunk-M2WBOQ2Q.js";
56
58
  export {
59
+ inProcessAnswer,
57
60
  serveStaticProjectHtml
58
61
  };