hyperframes 0.8.157 → 0.8.159

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 (155) hide show
  1. package/README.md +14 -0
  2. package/dist/{add-XKIJJAC6.js → add-7UMRT6IJ.js} +11 -11
  3. package/dist/{animatedGifPrep-MTJRHJ5G.js → animatedGifPrep-COFZMEVD.js} +5 -5
  4. package/dist/api.js +11 -11
  5. package/dist/{asset-TEWIJMG5.js → asset-N37XIJTB.js} +2 -2
  6. package/dist/{assetCataloger-DI7FC5KZ.js → assetCataloger-ZOQ67MGR.js} +2 -2
  7. package/dist/{auth-ERW6EOVW.js → auth-GKFS2PL6.js} +1 -1
  8. package/dist/{autoUpdate-IHYT5BQF.js → autoUpdate-V4PLREDQ.js} +2 -2
  9. package/dist/{backgroundChecks-DTKZTDHN.js → backgroundChecks-TVOKARY2.js} +3 -3
  10. package/dist/backgroundChecksWorker.js +3 -3
  11. package/dist/{batchRender-FTZ67377.js → batchRender-IARQXQHN.js} +3 -3
  12. package/dist/{beats-AE4ZKJ3I.js → beats-FY4UDXBL.js} +11 -10
  13. package/dist/{benchmark-Q3YSQVWW.js → benchmark-ZJYFRFYF.js} +8 -8
  14. package/dist/{browser-IRRLG5FG.js → browser-WRZOH4PD.js} +3 -3
  15. package/dist/{bundleWithLocalizedFonts-IVO43QBQ.js → bundleWithLocalizedFonts-SFHKZZAX.js} +2 -2
  16. package/dist/{capture-ANATPLOS.js → capture-KFYPMVTT.js} +18 -8
  17. package/dist/{capture-MVH3XNAE.js → capture-LLLIHYEF.js} +2 -2
  18. package/dist/{catalog-5BJJW3G4.js → catalog-QO762U7V.js} +11 -11
  19. package/dist/{catch-up-DU2O72RS.js → catch-up-MELHNTGB.js} +4 -4
  20. package/dist/{check-P5D3YU2H.js → check-RX3LTKYB.js} +38 -37
  21. package/dist/{checkBrowser-RNIDFQZZ.js → checkBrowser-EUUMEILI.js} +35 -34
  22. package/dist/{chunk-YBKIAQNU.js → chunk-24N3BB5M.js} +3 -3
  23. package/dist/{chunk-IRRRH66M.js → chunk-2CEH75X3.js} +115 -13
  24. package/dist/{chunk-LQXHRO6F.js → chunk-3W3MOLRL.js} +2 -2
  25. package/dist/{chunk-EYNN5DJG.js → chunk-4D5RBIX6.js} +30 -10
  26. package/dist/{chunk-4YDQQQY6.js → chunk-4DEBDQD4.js} +2 -2
  27. package/dist/{chunk-6B6G3QMQ.js → chunk-4IKI2RYR.js} +11 -11
  28. package/dist/{chunk-QAWCWGQG.js → chunk-5GPX4X4L.js} +2 -2
  29. package/dist/{chunk-WZBGU46C.js → chunk-5HNZQSO4.js} +1 -1
  30. package/dist/{chunk-OTG5H2VM.js → chunk-5O6I5ZV7.js} +2 -2
  31. package/dist/{chunk-ZFZNPLRJ.js → chunk-5RSV6DWB.js} +4 -3
  32. package/dist/{chunk-WK375PPO.js → chunk-5YCFHCD4.js} +2 -2
  33. package/dist/{chunk-SMPG26EL.js → chunk-6TDZJ43G.js} +1 -1
  34. package/dist/{chunk-7ZWOLEGS.js → chunk-76NO4ZRM.js} +1 -1
  35. package/dist/{chunk-3FRK53UC.js → chunk-7RTTPSXG.js} +1 -1
  36. package/dist/{chunk-ZY4A2R7C.js → chunk-7XEVZDKU.js} +7 -7
  37. package/dist/{chunk-56QTFOWH.js → chunk-A5RDOXZE.js} +1 -1
  38. package/dist/{chunk-GPUVPZRK.js → chunk-AEQWF7PE.js} +1 -1
  39. package/dist/{chunk-DRT6ZQI2.js → chunk-AFYZWHR7.js} +7 -7
  40. package/dist/{chunk-EGKIQS5J.js → chunk-AQXJC64X.js} +1 -1
  41. package/dist/{chunk-BPTKOTF2.js → chunk-BEW7RCCW.js} +1 -1
  42. package/dist/{chunk-O4ZB2LUC.js → chunk-DLQQA25O.js} +1 -1
  43. package/dist/{chunk-23VDPRQ3.js → chunk-DVAEX52Q.js} +1 -1
  44. package/dist/{chunk-J7WFHOCW.js → chunk-EGJVFPUX.js} +1 -1
  45. package/dist/{chunk-T76NSAXO.js → chunk-ESOAYGIT.js} +6 -4
  46. package/dist/{chunk-OGJFYVRC.js → chunk-EWAAH7AU.js} +1 -1
  47. package/dist/{chunk-QRPYTJBW.js → chunk-FEKRMXT6.js} +1 -1
  48. package/dist/{chunk-J6SJCYAQ.js → chunk-GGDCBVXK.js} +4 -4
  49. package/dist/{chunk-YB26LWR2.js → chunk-H6BKVVU4.js} +2 -2
  50. package/dist/{chunk-EEEUI3ON.js → chunk-HEEN6X6O.js} +15 -8
  51. package/dist/{chunk-HQG7B5ZE.js → chunk-HO3SITVT.js} +1 -1
  52. package/dist/{chunk-25IXEZXH.js → chunk-IJ7JPX4W.js} +2 -2
  53. package/dist/{chunk-UGIIDY6C.js → chunk-IKDBT5WT.js} +79 -4
  54. package/dist/{chunk-FJT35XBA.js → chunk-INNBWSZK.js} +1 -1
  55. package/dist/{chunk-SLUFA6UM.js → chunk-IWOEAWIP.js} +1 -1
  56. package/dist/{chunk-LZ7C6CXD.js → chunk-JZLFHF2M.js} +2 -2
  57. package/dist/{chunk-NIT2ZCNI.js → chunk-K5BMHQOU.js} +9 -9
  58. package/dist/{chunk-CA7IDB4Z.js → chunk-MMYY4KV3.js} +18 -3
  59. package/dist/{chunk-ZTUZDPHE.js → chunk-MTUC2Z32.js} +2 -2
  60. package/dist/{chunk-XRRZZFGI.js → chunk-NCVGBBWC.js} +1 -1
  61. package/dist/{chunk-NFX4K6OW.js → chunk-NIGOOCVS.js} +1 -1
  62. package/dist/{chunk-TQ62EMUI.js → chunk-ODE7HHNN.js} +20 -20
  63. package/dist/chunk-TWBTXEDZ.js +3795 -0
  64. package/dist/{chunk-T243WV6D.js → chunk-UK4KRTIX.js} +1 -1
  65. package/dist/{chunk-SGIZMTWO.js → chunk-V5J4XEBG.js} +1 -1
  66. package/dist/{chunk-ZZ3ZWTOI.js → chunk-WWMFR4SH.js} +1 -1
  67. package/dist/{chunk-SWRIMG46.js → chunk-YITZFHRJ.js} +1 -1
  68. package/dist/{clean-4WDZ3TFN.js → clean-RW7Z4XM6.js} +18 -18
  69. package/dist/cli.js +52 -52
  70. package/dist/{cloud-FL6VP6IU.js → cloud-EEOV7JKB.js} +4 -4
  71. package/dist/{cloudrun-STLNWUBW.js → cloudrun-EZAXYVXG.js} +3 -3
  72. package/dist/{compare-MXZ7QKBN.js → compare-5UARQFXX.js} +29 -28
  73. package/dist/{compiler-VFJVUZWR.js → compiler-THI7BXZU.js} +2 -2
  74. package/dist/{component-XKBA5ON2.js → component-AYOFPL33.js} +3 -3
  75. package/dist/{compositions-2LUY6RQW.js → compositions-XJNJBOMG.js} +9 -9
  76. package/dist/{delete-OBAOZCXI.js → delete-653AOR25.js} +2 -2
  77. package/dist/{dist-SVTSOG4Q.js → dist-DLR4X3KN.js} +2 -2
  78. package/dist/{doctor-BLXWRHAE.js → doctor-WA6VRRE7.js} +7 -7
  79. package/dist/{events-V4LYF3MW.js → events-U5COLUWT.js} +2 -2
  80. package/dist/{events-LSJDXTXK.js → events-XXBCP2I4.js} +3 -3
  81. package/dist/{feedback-LMDNGTYB.js → feedback-DX6Q3LN7.js} +8 -8
  82. package/dist/{figma-BXHFTYCT.js → figma-LCQVLBXF.js} +3 -3
  83. package/dist/fontLocalizeCli.js +8 -8
  84. package/dist/{get-2ZKWMYCG.js → get-UYNPFMHX.js} +2 -2
  85. package/dist/{gpuPolicy-VXNJ4UBN.js → gpuPolicy-YIW3HL3B.js} +5 -5
  86. package/dist/{grade-compare-F7JNDXGF.js → grade-compare-YQEYATJV.js} +28 -28
  87. package/dist/{help-WGANCPIE.js → help-FDURC7WR.js} +1 -1
  88. package/dist/{history-FILLGPWB.js → history-EU5UZLHT.js} +10 -10
  89. package/dist/hyperframe-runtime.js +55 -55
  90. package/dist/hyperframe.manifest.json +1 -1
  91. package/dist/hyperframe.runtime.iife.js +55 -55
  92. package/dist/hyperframes-player.global.js +1 -1
  93. package/dist/{info-QQJ7C6SO.js → info-7T6CK6CL.js} +7 -7
  94. package/dist/{init-BQYTOLTG.js → init-KQYSKFVU.js} +31 -26
  95. package/dist/{inspect-BTBKTW5W.js → inspect-HQBV7VHS.js} +28 -27
  96. package/dist/{installer-HF5BXXXM.js → installer-OKKPQNKS.js} +4 -4
  97. package/dist/{keyframes-Y5QDNXST.js → keyframes-SK74JHOA.js} +6 -6
  98. package/dist/{lambda-ZCX7KGTY.js → lambda-S2N4VTRO.js} +4 -4
  99. package/dist/{layout-HITFK2H5.js → layout-MTE5Y6DE.js} +28 -27
  100. package/dist/{lint-6HH5X4NJ.js → lint-FJGGJYB7.js} +8 -8
  101. package/dist/{list-KBERMLPP.js → list-MBPALK5U.js} +2 -2
  102. package/dist/{login-MZNDV73I.js → login-HDN4T5E4.js} +4 -4
  103. package/dist/{media-treatment-YACCPVXX.js → media-treatment-IP34DXWN.js} +11 -11
  104. package/dist/{models-WHDUQZQZ.js → models-W5TASRHD.js} +8 -8
  105. package/dist/{motionShot-CRQTWUJB.js → motionShot-2WYEMOPJ.js} +12 -11
  106. package/dist/{normalize-audio-Z7UQTZ5J.js → normalize-audio-F4NQPXII.js} +7 -7
  107. package/dist/{open-GM2J5QEA.js → open-DRXNALDE.js} +7 -7
  108. package/dist/{parakeetRunner-5PNBGCGH.js → parakeetRunner-VISBF2EA.js} +8 -8
  109. package/dist/{pipeline-QA2422UI.js → pipeline-A2XOVZOM.js} +5 -5
  110. package/dist/{play-JGMRZO6G.js → play-W2QELQX7.js} +26 -26
  111. package/dist/{present-SI7ZE6IB.js → present-NHYRS4F4.js} +20 -20
  112. package/dist/{preview-PZOQHOIO.js → preview-SMJVUPXE.js} +21 -21
  113. package/dist/{producer-PQMZ7OYH.js → producer-276O3CKW.js} +1 -1
  114. package/dist/{projectConfig-EYYDESVO.js → projectConfig-FXFUHFPZ.js} +6 -6
  115. package/dist/{publication-MJY3XYYV.js → publication-SSQO6ECV.js} +2 -2
  116. package/dist/{publish-UT3L777Q.js → publish-UHDKDXZI.js} +10 -10
  117. package/dist/{remove-background-HT73ZUIG.js → remove-background-IG6U56HC.js} +6 -6
  118. package/dist/{render-6CJXA7UA.js → render-6P5RSFS3.js} +12 -12
  119. package/dist/{render-YTJ3SMCD.js → render-XQONIJEJ.js} +3 -3
  120. package/dist/{render-SFIX3O3B.js → render-ZJPSLTKV.js} +49 -28
  121. package/dist/{render-batch-AFB2XK3I.js → render-batch-MH3Z6IPT.js} +3 -3
  122. package/dist/{resolver-F2D2YCSQ.js → resolver-JMSGO2JF.js} +4 -4
  123. package/dist/{sherpa-IBKSF6GX.js → sherpa-64JLV4YM.js} +7 -7
  124. package/dist/skills/hyperframes/SKILL.md +1 -1
  125. package/dist/skills/hyperframes/references/frame-worker-core.md +1 -1
  126. package/dist/skills/hyperframes/references/intent-interview.md +2 -2
  127. package/dist/skills/hyperframes/references/production-loop.md +11 -11
  128. package/dist/skills/hyperframes/references/review-loop.md +6 -6
  129. package/dist/skills/hyperframes/references/storyboard-format.md +1 -1
  130. package/dist/skills/hyperframes-cli/SKILL.md +1 -1
  131. package/dist/{skills-G26XO2BY.js → skills-UXOL62PY.js} +5 -5
  132. package/dist/{skillsUpdateCheck-ZNDQSDB4.js → skillsUpdateCheck-5Y6676K6.js} +3 -3
  133. package/dist/{snapshot-SN7I7O7I.js → snapshot-SQBPCXOV.js} +74 -48
  134. package/dist/{src-NDI4KNT3.js → src-N42CT3YR.js} +6 -4
  135. package/dist/{src-4GCHM2LX.js → src-RQMK5INS.js} +7 -7
  136. package/dist/{staticProjectServer-TTC3LYHO.js → staticProjectServer-AQXVWMLU.js} +15 -13
  137. package/dist/studio/assets/{hyperframes-player-D3ufdOJ_.js → hyperframes-player-kqB1psAJ.js} +1 -1
  138. package/dist/studio/assets/{index-7oKTFwYd.js → index-BrViH8hj.js} +1 -1
  139. package/dist/studio/assets/{index-CALVHgsJ.js → index-C3AZLr-0.js} +1 -1
  140. package/dist/studio/assets/{index-DYk4U8BS.js → index-X_d1b5vz.js} +4 -4
  141. package/dist/studio/index.html +1 -1
  142. package/dist/{studio-api-TVIDDUZG.js → studio-api-GY5D7RAP.js} +9 -9
  143. package/dist/{studioServer-WBV2Q3SH.js → studioServer-O3VONODG.js} +49 -49
  144. package/dist/{telemetry-RVFKZEOH.js → telemetry-V2K5P7CI.js} +3 -3
  145. package/dist/{timeline-BUYUBI5X.js → timeline-YU3YPLKB.js} +18 -18
  146. package/dist/{tokens-PUA5FQKP.js → tokens-NPSSSG2A.js} +2 -2
  147. package/dist/{transcribe-DZ6O6EG5.js → transcribe-BXJNS3RZ.js} +6 -6
  148. package/dist/{transcribe-L2QHSNHO.js → transcribe-FNBDG24U.js} +12 -12
  149. package/dist/{updateCheck-PULEO7CW.js → updateCheck-MB3RHSVK.js} +2 -2
  150. package/dist/{upgrade-UJJIVNHJ.js → upgrade-5VNRUR37.js} +2 -2
  151. package/dist/{urlDownloader-INLS5A6I.js → urlDownloader-WCT7FMLA.js} +4 -4
  152. package/dist/{validate-DJAZMEQB.js → validate-UXSXRCE6.js} +20 -19
  153. package/dist/{video-3GLT6U6Z.js → video-NRNQBZMV.js} +5 -5
  154. package/package.json +1 -1
  155. package/dist/chunk-LPOTN5GW.js +0 -3795
@@ -4,17 +4,17 @@ The stages between a plan the user has agreed to and a video in their hands, wri
4
4
 
5
5
  The shipped narrative workflows implement these stages with their own scripts; a freeform build follows this file directly, borrowing tools where the capability menu says they live (`hyperframes/references/capability-menu.md`).
6
6
 
7
- | Stage | Needs | Produces | Where the capability lives |
8
- | ------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
9
- | **Blocks & assets** | the approved plan | registry blocks installed **once, before any parallel work** (parallel workers race the registry); user assets staged; logos / images / grades resolved | `npx hyperframes add <block>` per block the plan names; staging, adoption, and `resolve` via the menu's media rows |
10
- | **Audio** | narration text (when narrated); the storyboard's `music:` mood | voice files + **word timings** + BGM + SFX → `audio_meta.json`; **when BGM plays under a voice, the bed is carved** (`hyperframes-audio/scripts/carve.mjs`) before Verify — a duck alone is not a finished mix | the one engine — `media-use/audio/scripts/audio.mjs`, run in the background; `wait-bgm.mjs` before render when BGM generates |
11
- | **Frames** | design spec + the plan (+ a confirmed sketch cell in `storyboard.html` when one exists — dress that layout, never redraw it: `review-loop.md` § 3) | each scene at `compositions/frames/NN-*.html`, marked `animated` in the storyboard as it lands | `frame.md` + `hyperframes-animation` blueprints / rules (+ the genre lens, menu § Genre lenses); parallel dispatch per `subagent-dispatch.md` |
12
- | **Duration sync** | word timings + frames | scene durations trued to real voice length — real duration wins, silent scenes keep estimates, synced values are never hand-edited | a mechanical rule; the narrative workflows' audio scripts apply it, a freeform build applies it by hand |
13
- | **Assembly** | frames | the index composition — scenes as sub-compositions on tracks | `sub-compositions.md` + `tracks-and-clips.md`; borrowable `assemble-index.mjs` (menu) |
14
- | **Transitions** | the assembled index | scene handoffs injected | `hyperframes-animation/transitions/overview.md` → `catalog.md`; borrowable `transitions.mjs` (menu) |
15
- | **Captions** | word timings + the index | the caption track | borrowable `captions.mjs` (menu); no script to time against → `media-use` `scripts/transcribe.mjs` first |
16
- | **Verify** | the index (+ captions / transitions when present) | `npx hyperframes lint` and `npx hyperframes check` **passing**; a contact-sheet glance (`snapshot --at <frame-midpoints>`) | `hyperframes-cli` |
17
- | **Deliver** | verify passing | the final-look pause → on approval `render` → optionally `publish` (a stable hosted link, private by default) → the recipe offer | final approval and recipe offer: `review-loop.md` § 4; render / publish: `hyperframes-cli` |
7
+ | Stage | Needs | Produces | Where the capability lives |
8
+ | ------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
9
+ | **Blocks & assets** | the approved plan | registry blocks installed **once, before any parallel work** (parallel workers race the registry); user assets staged; logos / images / grades resolved | `npx hyperframes add <block>` per block the plan names; staging, adoption, and `resolve` via the menu's media rows |
10
+ | **Audio** | narration text (when narrated); the storyboard's `music:` mood | voice files + **word timings** + BGM + SFX → `audio_meta.json`; **when BGM plays under a voice, the bed is carved** (`hyperframes-audio/scripts/carve.mjs`) before Verify — a duck alone is not a finished mix | the one engine — `media-use/audio/scripts/audio.mjs`, run in the background; `wait-bgm.mjs` before render when BGM generates |
11
+ | **Frames** | design spec + the plan (+ a confirmed still on the board (`boards/storyboard.html`, format in `hyperframes-creative/references/storyboard-recipe.md`) when one exists — dress that layout, never redraw it: `review-loop.md` § 3) | each scene at `compositions/frames/NN-*.html`, marked `animated` in the storyboard as it lands | `frame.md` + `hyperframes-animation` blueprints / rules (+ the genre lens, menu § Genre lenses); parallel dispatch per `subagent-dispatch.md` |
12
+ | **Duration sync** | word timings + frames | scene durations trued to real voice length — real duration wins, silent scenes keep estimates, synced values are never hand-edited | a mechanical rule; the narrative workflows' audio scripts apply it, a freeform build applies it by hand |
13
+ | **Assembly** | frames | the index composition — scenes as sub-compositions on tracks | `sub-compositions.md` + `tracks-and-clips.md`; borrowable `assemble-index.mjs` (menu) |
14
+ | **Transitions** | the assembled index | scene handoffs injected | `hyperframes-animation/transitions/overview.md` → `catalog.md`; borrowable `transitions.mjs` (menu) |
15
+ | **Captions** | word timings + the index | the caption track | borrowable `captions.mjs` (menu); no script to time against → `media-use` `scripts/transcribe.mjs` first |
16
+ | **Verify** | the index (+ captions / transitions when present) | `npx hyperframes lint` and `npx hyperframes check` **passing**; a contact-sheet glance (`snapshot --at <frame-midpoints>`) | `hyperframes-cli` |
17
+ | **Deliver** | verify passing | the final-look pause → on approval `render` → optionally `publish` (a stable hosted link, private by default) → the recipe offer | final approval and recipe offer: `review-loop.md` § 4; render / publish: `hyperframes-cli` |
18
18
 
19
19
  The Frames stage follows the plan's citations: a scene planned on a blueprint or on named rules is built by reading that recipe's body (`hyperframes-animation/blueprints/<id>.md`, `rules/<id>.md`) before its motion is written — names come from the indexes, never invented, and a scene the plan left uncited gets its citation at build time, not improvised motion.
20
20
 
@@ -1,6 +1,6 @@
1
1
  # The review loop — plan, sketch, build
2
2
 
3
- How a `storyboard: yes` run earns fidelity one pass at a time: the plan is reviewed as text in chat, the layouts as a sketched `storyboard.html` the user opens in a browser, and the finished piece as the assembled video. Collaborative mode waits at each checkpoint. Autonomous mode posts the same checkpoint summaries and continues, keeping exactly one question before render.
3
+ How a `storyboard: yes` run earns fidelity one pass at a time: the plan is reviewed as text in chat, the layouts as stills on the board (`boards/storyboard.html`), and the finished piece as the assembled video. Collaborative mode waits at each checkpoint. Autonomous mode posts the same checkpoint summaries and continues, keeping exactly one question before render.
4
4
 
5
5
  This is the shared process for any workflow that plans on a storyboard. The contracts it leans on live next door: interaction mode and gate types in `brief-contract.md`; the `STORYBOARD.md` format and the `outline → built → animated` statuses in `storyboard-format.md`. How to make the storyboard itself, and the page it is reviewed on, is `hyperframes-creative/references/storyboard-recipe.md`. A workflow's SKILL.md says **when** its steps hit each pass and supplies its **sketch stand-ins** (what the plain blocks represent); how the loop runs is defined here, once. The stage mechanics between the passes — audio, frames, assembly, transitions, captions, verify — live in `production-loop.md`; this file owns only the user-facing pauses.
6
6
 
@@ -16,19 +16,19 @@ This is a **checkpoint gate** (`brief-contract.md` § 1). A run that starts auto
16
16
 
17
17
  The moment the plan is approved, sketch every frame yourself — no sub-agents, no waiting on other steps (sketches don't use timings), straight from the approved frame table.
18
18
 
19
- A sketch is a **static frame, not an unstyled one**: the frame's layout at its key moment, drawn with the full `frame.md` treatment (real fonts, real colors, the actual headline / stat / label text placed where it will live) exactly as `storyboard-recipe.md` § 3 describes a cell, using plain blocks only for panels, charts, diagrams, and media the workflow hasn't produced yet (the workflow says what its blocks stand in for). **No motion** — that arrives with the build pass; the layout, copy and brand treatment are already locked here.
19
+ A sketch is a **static frame, not an unstyled one**: the frame's layout at its key moment, posed in the composition with the full `frame.md` treatment (real fonts, real colors, the actual headline / stat / label text placed where it will live) as `storyboard-recipe.md` § 1 describes, using plain blocks only for panels, charts, diagrams, and media the workflow hasn't produced yet (the workflow says what its blocks stand in for). **No motion** — that arrives with the build pass; the layout, copy and brand treatment are already locked here.
20
20
 
21
- Draw the sketches as the cells of `storyboard.html` (`storyboard-recipe.md` § 3) and hand the user the file path to open in a browser. Mark each frame `built` in `STORYBOARD.md` as its sketch lands. Run no CLI here — no `snapshot`, no `lint` / `check`, no rendering. When every frame is `built`, pause and ask one thing: does the sheet look right, or which frames change? This is a **checkpoint gate**; feedback arrives in chat: revise **only the sketches named**, bump the sheet's version, re-present, and loop until the layout is confirmed. Only then does the workflow's visual design get written onto the confirmed layouts.
21
+ Mount the posed frames in `index.html`, snapshot every still in one run into `boards/stills/` and write the board, `boards/storyboard.html` (`storyboard-recipe.md` § 1–2), then hand the user the board. Mark each frame `built` in `STORYBOARD.md` as its still lands. `snapshot` is the only CLI here — no `lint` / `check`, no rendering. When every frame is `built`, pause and ask one thing: does the board look right, or which frames change? This is a **checkpoint gate**; feedback arrives in chat: re-pose **only the frames named** and replace only their stills (`storyboard-recipe.md` § 1 step 4), rewrite the page, re-present, and loop until the layout is confirmed. Only then does the workflow's visual design get written onto the confirmed layouts.
22
22
 
23
- A confirmed sheet is also a valid place to **stop**. When the user asked for a storyboard rather than a finished video — a plan to pitch, review, or hand off — `storyboard.html` is the deliverable: confirm it, hand over the path, and go no further unless asked to build.
23
+ A confirmed board is also a valid place to **stop**. When the user asked for a storyboard rather than a finished video — a plan to pitch, review, or hand off — `boards/storyboard.html` is the deliverable: confirm it, hand over the path, and go no further unless asked to build.
24
24
 
25
25
  In autonomous mode, or when the user chose to skip sketches at § 1, skip this pass — frames go straight from `outline` to `animated` in the build.
26
26
 
27
27
  ## § 3 — Building on confirmed layouts
28
28
 
29
- However the workflow builds — sub-agent workers per frame, or inline scene by scene — a confirmed sketch's **composition is settled**: placement, hierarchy, and copy were approved on the sheet, so building means dressing that layout (full design treatment, real assets, motion), never redrawing it. Workflows that dispatch workers put "this frame has a **confirmed sketch** at `storyboard.html#frame-NN`" in the worker's context and carry the keep-the-layout rule in their worker prompt; a landed frame must still read as the approved wireframe, fully dressed.
29
+ However the workflow builds — sub-agent workers per frame, or inline scene by scene — a confirmed sketch's **composition is settled**: placement, hierarchy, and copy were approved on the board, so building means dressing that layout (full design treatment, real assets, motion), never redrawing it. Workflows that dispatch workers put "this frame has a **confirmed sketch** (its posed composition, still in `boards/stills/`)" in the worker's context and carry the keep-the-layout rule in their worker prompt; a landed frame must still read as the approved wireframe, fully dressed.
30
30
 
31
- Mark each frame `animated` as it lands. The build gate carries the loop's condition: in collaborative mode, the sketch sheet was confirmed at § 2.
31
+ Mark each frame `animated` as it lands. The build gate carries the loop's condition: in collaborative mode, the board was confirmed at § 2.
32
32
 
33
33
  ## § 4 — The final look
34
34
 
@@ -95,5 +95,5 @@ The old way: prompt, wait, get something that misses. Establish the pain we remo
95
95
 
96
96
  - A frame with `status: outline` and no built `src` renders as an outline placeholder.
97
97
  - `built` is the middle rung: the frame's HTML exists and its **layout is confirmed** (a wireframe sketch or better) — motion not yet added. Nothing is drawn yet beyond the approved layout.
98
- - The process that walks these statuses — plan, sketch, build, each pass reviewed in chat and in `storyboard.html` — is `review-loop.md`.
98
+ - The process that walks these statuses — plan, sketch, build, each pass reviewed in chat and on the board (`boards/storyboard.html`, format in `hyperframes-creative/references/storyboard-recipe.md`) — is `review-loop.md`.
99
99
  - Multi-line `voiceover` values collapse to one line on save.
@@ -71,7 +71,7 @@ ffprobe -v error -show_format -show_streams out.mp4
71
71
 
72
72
  ## Preview before render
73
73
 
74
- Open the final composition preview (`#project/<name>`) only after `check` passes, to review the assembled timeline. The plan in chat and the `storyboard.html` sketch sheet are not approval of the final video. Rendering always requires the final approval defined by `hyperframes/references/review-loop.md`.
74
+ Open the final composition preview (`#project/<name>`) only after `check` passes, to review the assembled timeline. The plan in chat and the storyboard board (`boards/storyboard.html`, format in `hyperframes-creative/references/storyboard-recipe.md`) are not approval of the final video. Rendering always requires the final approval defined by `hyperframes/references/review-loop.md`.
75
75
 
76
76
  ## Sub-composition smoke test
77
77
 
@@ -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-XRRZZFGI.js";
10
- import "./chunk-HQG7B5ZE.js";
9
+ } from "./chunk-NCVGBBWC.js";
10
+ import "./chunk-HO3SITVT.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-OGJFYVRC.js";
38
+ } from "./chunk-EWAAH7AU.js";
39
39
  import {
40
40
  withMeta
41
- } from "./chunk-O4ZB2LUC.js";
41
+ } from "./chunk-DLQQA25O.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-ZTUZDPHE.js";
46
+ import "./chunk-MTUC2Z32.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-OGJFYVRC.js";
13
- import "./chunk-O4ZB2LUC.js";
12
+ } from "./chunk-EWAAH7AU.js";
13
+ import "./chunk-DLQQA25O.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-ZTUZDPHE.js";
18
+ import "./chunk-MTUC2Z32.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,14 +17,8 @@ import {
14
17
  } from "./chunk-57GN6KWT.js";
15
18
  import {
16
19
  captureArtifactRevision
17
- } from "./chunk-BPTKOTF2.js";
18
- import "./chunk-DRT6ZQI2.js";
19
- import {
20
- serveStaticProjectHtml
21
- } from "./chunk-UGIIDY6C.js";
22
- import "./chunk-XUHOIDKG.js";
23
- import "./chunk-WK375PPO.js";
24
- import "./chunk-X7MTZ4T2.js";
20
+ } from "./chunk-BEW7RCCW.js";
21
+ import "./chunk-AFYZWHR7.js";
25
22
  import {
26
23
  DEFAULT_ZOOM_SCALE,
27
24
  captureRegionCrop,
@@ -30,46 +27,52 @@ import {
30
27
  resolveCropRegion,
31
28
  runFfmpegOnce,
32
29
  seekCompositionTimeline
33
- } from "./chunk-EYNN5DJG.js";
30
+ } from "./chunk-4D5RBIX6.js";
34
31
  import "./chunk-FH7WODJH.js";
35
- import "./chunk-CA7IDB4Z.js";
36
- import "./chunk-J7WFHOCW.js";
32
+ import "./chunk-MMYY4KV3.js";
33
+ import "./chunk-EGJVFPUX.js";
37
34
  import "./chunk-WPNE5NEP.js";
38
- import "./chunk-TQ62EMUI.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-ZFZNPLRJ.js";
47
- import "./chunk-FFDC5OWV.js";
48
- import {
49
- resolveProject
50
- } from "./chunk-WZBGU46C.js";
51
35
  import {
52
36
  formatLintFindings
53
37
  } from "./chunk-6CSYCFQV.js";
38
+ import {
39
+ resolveProject
40
+ } from "./chunk-5HNZQSO4.js";
54
41
  import "./chunk-K2FLNJVB.js";
42
+ import {
43
+ serveStaticProjectHtml
44
+ } from "./chunk-IKDBT5WT.js";
45
+ import "./chunk-X7MTZ4T2.js";
46
+ import "./chunk-5YCFHCD4.js";
55
47
  import "./chunk-DQBY7FRR.js";
56
48
  import {
57
49
  resolveLocalBrowserGpuMode
58
- } from "./chunk-YB26LWR2.js";
50
+ } from "./chunk-H6BKVVU4.js";
59
51
  import "./chunk-442JNXRM.js";
60
- import "./chunk-GPUVPZRK.js";
52
+ import "./chunk-XUHOIDKG.js";
53
+ import "./chunk-ODE7HHNN.js";
54
+ import "./chunk-A5RDOXZE.js";
55
+ import "./chunk-C6TPGUWD.js";
56
+ import "./chunk-5RSV6DWB.js";
57
+ import {
58
+ artifactDirectory,
59
+ forgetRecordedArtifacts,
60
+ recordArtifacts
61
+ } from "./chunk-6PIGOKTE.js";
62
+ import "./chunk-FFDC5OWV.js";
63
+ import "./chunk-AEQWF7PE.js";
61
64
  import "./chunk-XT7X6QCP.js";
62
65
  import "./chunk-4YYJOFKS.js";
63
66
  import "./chunk-HVW7ABXD.js";
64
- import "./chunk-3FRK53UC.js";
65
- import "./chunk-LQXHRO6F.js";
66
- import "./chunk-QRPYTJBW.js";
67
+ import "./chunk-7RTTPSXG.js";
68
+ import "./chunk-3W3MOLRL.js";
69
+ import "./chunk-FEKRMXT6.js";
67
70
  import "./chunk-AWDFDFI3.js";
68
71
  import "./chunk-P6LJ4Y32.js";
69
72
  import "./chunk-GMECXFAN.js";
70
73
  import "./chunk-5CS4T6C6.js";
71
- import "./chunk-XRRZZFGI.js";
72
- import "./chunk-HQG7B5ZE.js";
74
+ import "./chunk-NCVGBBWC.js";
75
+ import "./chunk-HO3SITVT.js";
73
76
  import "./chunk-VWG7OQKU.js";
74
77
  import "./chunk-QWQ6GQTI.js";
75
78
  import {
@@ -93,7 +96,7 @@ import "./chunk-K4WIOZFP.js";
93
96
  import "./chunk-XUXGIA7H.js";
94
97
  import "./chunk-WERLJGIC.js";
95
98
  import "./chunk-ISN5GRYI.js";
96
- import "./chunk-ZTUZDPHE.js";
99
+ import "./chunk-MTUC2Z32.js";
97
100
  import {
98
101
  loadOptionalPackage
99
102
  } from "./chunk-3DKN5WKL.js";
@@ -105,8 +108,8 @@ import {
105
108
  getFFmpegInstallHint
106
109
  } from "./chunk-KEGTYA7V.js";
107
110
  import "./chunk-XT6MXC7A.js";
108
- import "./chunk-IRRRH66M.js";
109
- import "./chunk-FJT35XBA.js";
111
+ import "./chunk-2CEH75X3.js";
112
+ import "./chunk-INNBWSZK.js";
110
113
  import "./chunk-KCF6GHJP.js";
111
114
  import "./chunk-JYVGYKXG.js";
112
115
  import "./chunk-7KDQAD2W.js";
@@ -114,12 +117,12 @@ import {
114
117
  createRuntimeStartTimeResolver,
115
118
  isClipVisibleAt,
116
119
  isInClipWindow
117
- } from "./chunk-SGIZMTWO.js";
120
+ } from "./chunk-V5J4XEBG.js";
118
121
  import {
119
122
  readElementRateSpec,
120
123
  sourceTimeAt,
121
124
  timeAtSourceTime
122
- } from "./chunk-LPOTN5GW.js";
125
+ } from "./chunk-TWBTXEDZ.js";
123
126
  import "./chunk-VC76R6W2.js";
124
127
  import "./chunk-UJKQWGFF.js";
125
128
  import "./chunk-ALLKNYC3.js";
@@ -231,6 +234,19 @@ var FFMPEG_EXTRACT_TIMEOUT_MS = 3e4;
231
234
  function formatSnapshotTimestamp(time) {
232
235
  return `${Number(time.toFixed(3))}s`;
233
236
  }
237
+ function assertDistinctKeepNames(times) {
238
+ const timeByLabel = /* @__PURE__ */ new Map();
239
+ for (const time of times) {
240
+ const label = formatSnapshotTimestamp(time);
241
+ const other = timeByLabel.get(label);
242
+ if (other !== void 0 && other !== time) {
243
+ throw new Error(
244
+ `--keep would name both ${other} and ${time} at-${label}.png; pass times at least 1 ms apart`
245
+ );
246
+ }
247
+ timeByLabel.set(label, time);
248
+ }
249
+ }
234
250
  function resolveSnapshotVideoFrameTime(input) {
235
251
  const { globalTime, clipStart, clipDuration, sourceDuration, compositionDuration } = input;
236
252
  const clipEnd = clipStart + clipDuration;
@@ -442,7 +458,7 @@ function computeSnapshotTimes(duration, opts) {
442
458
  return { times: times.map(round), appendedTail: false };
443
459
  }
444
460
  async function captureSnapshots(projectDir, opts) {
445
- const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-IVO43QBQ.js");
461
+ const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-SFHKZZAX.js");
446
462
  const capture = await captureArtifactRevision(projectDir).catch(warnSnapshotsNotRecorded);
447
463
  const invocation = randomUUID();
448
464
  const artifacts = [];
@@ -542,7 +558,7 @@ async function captureSnapshots(projectDir, opts) {
542
558
  mkdirSync(snapshotDir, { recursive: true });
543
559
  try {
544
560
  const { readdirSync } = await import("fs");
545
- for (const file of readdirSync(snapshotDir)) {
561
+ for (const file of opts.keep ? [] : readdirSync(snapshotDir)) {
546
562
  if (/\.(png|jpg|jpeg)$/i.test(file)) {
547
563
  const path = resolve(snapshotDir, file);
548
564
  replaced.push(path);
@@ -555,7 +571,7 @@ async function captureSnapshots(projectDir, opts) {
555
571
  let syncVideoFrameVisibility = null;
556
572
  let extractMediaMetadata = null;
557
573
  try {
558
- const engine = await import("./src-NDI4KNT3.js");
574
+ const engine = await import("./src-N42CT3YR.js");
559
575
  injectVideoFramesBatch = engine.injectVideoFramesBatch;
560
576
  syncVideoFrameVisibility = engine.syncVideoFrameVisibility;
561
577
  extractMediaMetadata = engine.extractMediaMetadata;
@@ -685,8 +701,8 @@ async function captureSnapshots(projectDir, opts) {
685
701
  }
686
702
  await recaptureSnapshotComposite(page);
687
703
  const timeLabel = formatSnapshotTimestamp(time);
688
- const index = String(i).padStart(2, "0");
689
- const filename = `frame-${index}-at-${timeLabel}.png`;
704
+ const slot = opts.keep ? `at-${timeLabel}` : `${String(i).padStart(2, "0")}-at-${timeLabel}`;
705
+ const filename = opts.keep ? `${slot}.png` : `frame-${slot}.png`;
690
706
  const framePath = join(snapshotDir, filename);
691
707
  let crop;
692
708
  if (opts.zoom) {
@@ -708,9 +724,12 @@ async function captureSnapshots(projectDir, opts) {
708
724
  region,
709
725
  opts.zoomScale ?? DEFAULT_ZOOM_SCALE
710
726
  );
711
- writeFileSync(framePath, buffer);
727
+ writeCaptureFileSync(framePath, buffer);
712
728
  } else {
713
- await page.screenshot({ path: framePath, type: "png", omitBackground: true });
729
+ writeCaptureFileSync(
730
+ framePath,
731
+ await page.screenshot({ type: "png", omitBackground: true })
732
+ );
714
733
  }
715
734
  artifacts.push({
716
735
  id: `${invocation}-${i}`,
@@ -732,9 +751,9 @@ async function captureSnapshots(projectDir, opts) {
732
751
  ` ${c.warn("\u26A0")} --against has no frame at ${timeLabel} \u2014 reference pair skipped`
733
752
  );
734
753
  } 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`);
754
+ const refPath = join(snapshotDir, `ref-${slot}.png`);
755
+ writeCaptureFileSync(refPath, refPng);
756
+ const pairPath = join(snapshotDir, `pair-${slot}.jpg`);
738
757
  const { createContactSheet } = await import("./contactSheet-27SRU7A4.js");
739
758
  await createContactSheet([framePath, refPath], pairPath, {
740
759
  cols: 2,
@@ -837,6 +856,11 @@ var snapshot_default = defineCommand({
837
856
  description: "Always include a readable end-of-timeline frame (default: true). Pass --no-end to capture only your exact --at times.",
838
857
  default: true
839
858
  },
859
+ keep: {
860
+ type: "boolean",
861
+ 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.",
862
+ default: false
863
+ },
840
864
  zoom: {
841
865
  type: "string",
842
866
  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 +926,7 @@ var snapshot_default = defineCommand({
902
926
  }
903
927
  const timeout = parseInt(args.timeout, 10) || 5e3;
904
928
  const atTimestamps = args.at ? String(args.at).split(",").map((s) => parseFloat(s.trim())).filter((n) => !isNaN(n)) : void 0;
929
+ if (args.keep === true && atTimestamps) assertDistinctKeepNames(atTimestamps);
905
930
  const describeArg = args.describe === void 0 ? "true" : String(args.describe) === "false" ? null : String(args.describe);
906
931
  const camera = args.angle ? parseAngle(String(args.angle)) : void 0;
907
932
  const zoomTarget = args.zoom ? parseZoomTarget(String(args.zoom)) : void 0;
@@ -930,7 +955,8 @@ var snapshot_default = defineCommand({
930
955
  zoomScale,
931
956
  autoProxy: args.proxy,
932
957
  browserGpuMode: resolveLocalBrowserGpuMode(args["browser-gpu"]),
933
- against
958
+ against,
959
+ keep: args.keep === true
934
960
  });
935
961
  reportArtifacts(
936
962
  "snapshot",
@@ -956,7 +982,7 @@ ${c.success("\u25C7")} ${paths.length} snapshots saved to ${snapshotDir}`);
956
982
  }
957
983
  try {
958
984
  const { createSnapshotContactSheet } = await import("./contactSheet-27SRU7A4.js");
959
- const sheets = await createSnapshotContactSheet(
985
+ const sheets = args.keep === true ? [] : await createSnapshotContactSheet(
960
986
  snapshotDir,
961
987
  join(snapshotDir, "contact-sheet.jpg")
962
988
  );
@@ -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-2CEH75X3.js";
221
+ import "./chunk-INNBWSZK.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-V5J4XEBG.js";
234
+ import "./chunk-TWBTXEDZ.js";
234
235
  import "./chunk-VC76R6W2.js";
235
236
  import "./chunk-UJKQWGFF.js";
236
237
  import "./chunk-ALLKNYC3.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-HEEN6X6O.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-ESOAYGIT.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-2CEH75X3.js";
100
+ import "./chunk-INNBWSZK.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-V5J4XEBG.js";
107
+ import "./chunk-TWBTXEDZ.js";
108
108
  import "./chunk-VC76R6W2.js";
109
109
  import "./chunk-UJKQWGFF.js";
110
110
  import "./chunk-ALLKNYC3.js";
@@ -5,24 +5,25 @@ 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-UGIIDY6C.js";
10
- import "./chunk-XUHOIDKG.js";
11
- import "./chunk-WK375PPO.js";
10
+ } from "./chunk-IKDBT5WT.js";
12
11
  import "./chunk-X7MTZ4T2.js";
13
- import "./chunk-TQ62EMUI.js";
14
- import "./chunk-56QTFOWH.js";
12
+ import "./chunk-5YCFHCD4.js";
13
+ import "./chunk-XUHOIDKG.js";
14
+ import "./chunk-ODE7HHNN.js";
15
+ import "./chunk-A5RDOXZE.js";
15
16
  import "./chunk-C6TPGUWD.js";
17
+ import "./chunk-5RSV6DWB.js";
16
18
  import "./chunk-6PIGOKTE.js";
17
- import "./chunk-ZFZNPLRJ.js";
18
19
  import "./chunk-FFDC5OWV.js";
19
- import "./chunk-GPUVPZRK.js";
20
+ import "./chunk-AEQWF7PE.js";
20
21
  import "./chunk-XT7X6QCP.js";
21
22
  import "./chunk-4YYJOFKS.js";
22
23
  import "./chunk-HVW7ABXD.js";
23
- import "./chunk-3FRK53UC.js";
24
- import "./chunk-LQXHRO6F.js";
25
- import "./chunk-QRPYTJBW.js";
24
+ import "./chunk-7RTTPSXG.js";
25
+ import "./chunk-3W3MOLRL.js";
26
+ import "./chunk-FEKRMXT6.js";
26
27
  import "./chunk-AWDFDFI3.js";
27
28
  import "./chunk-P6LJ4Y32.js";
28
29
  import "./chunk-GMECXFAN.js";
@@ -31,10 +32,10 @@ import "./chunk-KLIKCX6Q.js";
31
32
  import "./chunk-EOOEC32M.js";
32
33
  import "./chunk-TJSTGSAW.js";
33
34
  import "./chunk-EOVYQ3IG.js";
34
- import "./chunk-FJT35XBA.js";
35
+ import "./chunk-INNBWSZK.js";
35
36
  import "./chunk-KCF6GHJP.js";
36
- import "./chunk-SGIZMTWO.js";
37
- import "./chunk-LPOTN5GW.js";
37
+ import "./chunk-V5J4XEBG.js";
38
+ import "./chunk-TWBTXEDZ.js";
38
39
  import "./chunk-VC76R6W2.js";
39
40
  import "./chunk-UJKQWGFF.js";
40
41
  import "./chunk-ALLKNYC3.js";
@@ -54,5 +55,6 @@ import "./chunk-TYXH3EKP.js";
54
55
  import "./chunk-IXLUTE6N.js";
55
56
  import "./chunk-M2WBOQ2Q.js";
56
57
  export {
58
+ inProcessAnswer,
57
59
  serveStaticProjectHtml
58
60
  };
@@ -1,4 +1,4 @@
1
- var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as We,s as ze,g as ge,F as ye}from"./index-DYk4U8BS.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const W=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}if(e){this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result);return}i>=40&&(this.stop(),this._failure={document:this._iframe.contentDocument},this._callbacks.onError("Composition timeline not found after 8s"))},200)}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??W,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
1
+ var xe=Object.defineProperty;var Ie=(r,i,e)=>i in r?xe(r,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):r[i]=e;var l=(r,i,e)=>Ie(r,typeof i!="symbol"?i+"":i,e);import{S as Oe,r as Ne,a as fe,i as Fe,b as w,c as _e,p as Ve,d as Ue,e as He,f as We,s as ze,g as ge,F as ye}from"./index-X_d1b5vz.js";function $e(r){return r.hasRuntime||r.runtimeInjected?!1:!!(r.hasNestedCompositions||r.hasTimelines&&r.attempts>=5)}function x(r){return typeof r=="object"&&r!==null}function je(r){return x(r)&&typeof r.getDuration=="function"}function Be(r){return x(r)&&typeof r.duration=="function"&&typeof r.time=="function"&&typeof r.seek=="function"&&typeof r.play=="function"&&typeof r.pause=="function"}function qe(r){if(!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/.test(r))throw new Error(`Invalid HyperFrames runtime version: ${r}`);return`https://cdn.jsdelivr.net/npm/@hyperframes/core@${r}/dist/hyperframe.runtime.iife.js`}const W=typeof __HYPERFRAMES_RUNTIME_CDN_URL__=="string"?__HYPERFRAMES_RUNTIME_CDN_URL__:qe("0.0.0-dev");function $(r){if(r===null)return null;const i=Number.parseInt(r,10);return Number.isFinite(i)&&i>0?i:null}function Ge(r){const i=(r==null?void 0:r.querySelector("[data-composition-id][data-width][data-height]"))??(r==null?void 0:r.querySelector("[data-width][data-height]"));if(!i)return null;const e=$(i.getAttribute("data-width")),t=$(i.getAttribute("data-height"));return e!==null&&t!==null?{width:e,height:t}:null}function Ye(r){return Array.isArray(r)?r.find(i=>typeof i=="string"&&i.trim()!==""&&i!=="[object Event]")??null:null}class Xe{constructor(i,e){l(this,"_interval",null);l(this,"_runtimeInjected",!1);l(this,"_runtimeScript",null);l(this,"_failure",null);this._iframe=i,this._callbacks=e}get failed(){return this._failure!==null&&this._failure.document===this._iframe.contentDocument}get runtimeInjected(){return this._runtimeInjected}start(){this.stop(),this._failure=null,this._runtimeInjected=!1;let i=0;this._interval=setInterval(()=>{i++;let e=null;try{e=this._poll(i)}catch(t){t instanceof DOMException&&t.name==="SecurityError"||(e={kind:"error",message:t instanceof Error?t.message:String(t)})}if(e){this.stop(),e.kind==="error"?(this._failure={document:this._iframe.contentDocument},this._callbacks.onError(e.message)):this._callbacks.onReady(e.result);return}i>=40&&(this.stop(),this._failure={document:this._iframe.contentDocument},this._callbacks.onError("Composition timeline not found after 8s"))},200)}_poll(i){const e=this._iframe.contentWindow;if(!e)return null;const t=Ye(Reflect.get(e,Oe));if(t!==null)return{kind:"error",message:t};const s=this._iframe.contentDocument,n=Reflect.get(e,"__timelines"),o=this.hasRuntimeBridge(e);if($e({hasRuntime:o,hasTimelines:x(n)&&Object.keys(n).length>0,hasNestedCompositions:!!(s!=null&&s.querySelector("[data-composition-src]")),runtimeInjected:this._runtimeInjected,attempts:i}))return this._injectRuntime(),null;if(this._runtimeInjected&&!o)return null;const a=this._resolveReadyResult(e,s);return a?{kind:"ready",result:a}:null}_resolveReadyResult(i,e){var n;const t=this._resolvePlaybackDurationAdapter(i)??{kind:"document",getDuration:()=>0};let s=t.getDuration();if(!Number.isFinite(s)||s<=0){if(t.kind==="direct-timeline")return null;s=e?((n=Ne(e))==null?void 0:n.durationSeconds)??0:0}return s<=0?null:{duration:s,adapter:{...t,getDuration:()=>s},compositionSize:Ge(e)}}stop(){this._runtimeScript&&(this._runtimeScript.onerror=null,this._runtimeScript=null),this.failed||(this._failure=null),this._interval!==null&&(clearInterval(this._interval),this._interval=null)}resolveDirectTimelineAdapter(){try{const i=this._iframe.contentWindow;return i?this._resolveDirectTimelineAdapterFromWindow(i):null}catch{return null}}resolveDirectTimelineAdapterFromWindow(i){return this._resolveDirectTimelineAdapterFromWindow(i)}hasRuntimeBridge(i){return x(Reflect.get(i,"__player"))}_injectRuntime(){var i,e,t,s;this._runtimeInjected=!0;try{const n=this._iframe.contentDocument;if(!n)return;const o=n.createElement("script");o.src=((e=(i=this._callbacks).resolveRuntimeUrl)==null?void 0:e.call(i))??W,this._runtimeScript=o,o.onerror=()=>{this._runtimeScript!==o||this._iframe.contentDocument!==n||(this.stop(),this._failure={document:n},this._callbacks.onError("HyperFrames runtime failed to load from "+o.src))},(n.head||n.documentElement).appendChild(o),(s=(t=this._callbacks).onRuntimeInjected)==null||s.call(t)}catch{}}_resolveDirectTimelineAdapterFromWindow(i){var a,c;if(this.hasRuntimeBridge(i))return null;const e=Reflect.get(i,"__timelines");if(!x(e))return null;const t=Object.keys(e);if(t.length===0)return null;const s=(c=(a=this._iframe.contentDocument)==null?void 0:a.querySelector("[data-composition-id]"))==null?void 0:c.getAttribute("data-composition-id"),n=s&&s in e?s:t[t.length-1],o=e[n];return Be(o)?o:null}_resolvePlaybackDurationAdapter(i){const e=Reflect.get(i,"__player");if(je(e))return{kind:"runtime",getDuration:()=>e.getDuration()};const t=this._resolveDirectTimelineAdapterFromWindow(i);return t?{kind:"direct-timeline",timeline:t,getDuration:()=>t.duration()}:null}}const Ze=`
2
2
  :host {
3
3
  display: block;
4
4
  position: relative;
@@ -1,4 +1,4 @@
1
- import{n as Qi}from"./index-DYk4U8BS.js";/*!
1
+ import{n as Qi}from"./index-X_d1b5vz.js";/*!
2
2
  * Copyright (c) 2026-present, Vanilagy and contributors
3
3
  *
4
4
  * This Source Code Form is subject to the terms of the Mozilla Public
@@ -1 +1 @@
1
- import{h as P}from"./index-DYk4U8BS.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var h=e[o+x]-t,_=r.some(function(g){if(g.interval===h)return g.count+=1});_||r.push({interval:h,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};
1
+ import{h as P}from"./index-X_d1b5vz.js";function j(c,d){for(var s=0;s<d.length;s++){const a=d[s];if(typeof a!="string"&&!Array.isArray(a)){for(const i in a)if(i!=="default"&&!(i in c)){const l=Object.getOwnPropertyDescriptor(a,i);l&&Object.defineProperty(c,i,l.get?l:{enumerable:!0,get:()=>a[i]})}}}return Object.freeze(Object.defineProperty(c,Symbol.toStringTag,{value:"Module"}))}var v={},w;function k(){if(w)return v;w=1,Object.defineProperty(v,"__esModule",{value:!0}),v.default=d;var c=window.OfflineAudioContext||window.webkitOfflineAudioContext;function d(e){var r=a(e);return r.start(0),[i,y,O(e.sampleRate),s].reduce(function(t,o){return o(t)},r.buffer.getChannelData(0))}function s(e){return e.sort(function(r,t){return t.count-r.count}).splice(0,5)[0].tempo}function a(e){var r=e.length,t=e.numberOfChannels,o=e.sampleRate,n=new c(t,r,o),u=n.createBufferSource();u.buffer=e;var f=n.createBiquadFilter();return f.type="lowpass",u.connect(f),f.connect(n.destination),u}function i(e){for(var r=[],t=.9,o=.3,n=15;r.length<n&&t>=o;)r=l(e,t),t-=.05;if(r.length<n)throw new Error("Could not find enough samples for a reliable detection.");return r}function l(e,r){for(var t=[],o=0,n=e.length;o<n;o+=1)e[o]>r&&(t.push(o),o+=1e4);return t}function y(e){var r=[];return e.forEach(function(t,o){for(var n=function(x){var h=e[o+x]-t,_=r.some(function(g){if(g.interval===h)return g.count+=1});_||r.push({interval:h,count:1})},u=0;u<10;u+=1)n(u)}),r}function O(e){return function(r){var t=[];return r.forEach(function(o){if(o.interval!==0){for(var n=60/(o.interval/e);n<90;)n*=2;for(;n>180;)n/=2;n=Math.round(n);var u=t.some(function(f){if(f.tempo===n)return f.count+=o.count});u||t.push({tempo:n,count:o.count})}}),t}}return v}var p,b;function q(){return b||(b=1,p=k().default),p}var m=q();const A=P(m),D=j({__proto__:null,default:A},[m]);export{D as i};