hyperframes 0.8.107 → 0.8.109

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 (169) hide show
  1. package/dist/{add-DXZ3HNQI.js → add-7NAK3TQ6.js} +15 -15
  2. package/dist/{animatedGifPrep-2IQB4DGE.js → animatedGifPrep-NMGFOSIL.js} +6 -6
  3. package/dist/{asset-KZIG3MZN.js → asset-X7GUEAHC.js} +2 -2
  4. package/dist/{assetCataloger-4GE6PIUA.js → assetCataloger-FXEHOUA3.js} +2 -2
  5. package/dist/{auth-5IYF3H67.js → auth-EBWBTIGU.js} +2 -2
  6. package/dist/{autoUpdate-5C3FXM6Y.js → autoUpdate-DJBTMGAR.js} +2 -2
  7. package/dist/{backgroundChecks-75WGW4NB.js → backgroundChecks-QUMUVLYU.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-FKKS3YBX.js → batchRender-ZTHFMHZY.js} +3 -3
  10. package/dist/{beats-ISR36NSK.js → beats-XUYNHYGB.js} +18 -12
  11. package/dist/{benchmark-U6TQ6DS2.js → benchmark-L45UHXEE.js} +12 -12
  12. package/dist/{browser-VDS6QAVA.js → browser-EM76PRMN.js} +9 -9
  13. package/dist/{bundleWithLocalizedFonts-PMWWW5YG.js → bundleWithLocalizedFonts-4Q3ETTHW.js} +2 -2
  14. package/dist/{capture-BKA3UCZS.js → capture-4OPH4PMK.js} +7 -7
  15. package/dist/{capture-5KE34KCD.js → capture-OG6532RA.js} +2 -2
  16. package/dist/{catalog-ZXOSU27O.js → catalog-V42BPLQ4.js} +15 -15
  17. package/dist/{check-MZMZCXPN.js → check-3XQLHR2I.js} +30 -29
  18. package/dist/{checkBrowser-UIZJXYCQ.js → checkBrowser-56BV4TW3.js} +29 -28
  19. package/dist/{chunk-TI5Z4SWP.js → chunk-2IN77NP6.js} +3 -3
  20. package/dist/{chunk-WBVPQC7J.js → chunk-2JXJ5SGK.js} +1 -1
  21. package/dist/{chunk-QH6UFY2O.js → chunk-32P7FTFC.js} +4 -4
  22. package/dist/{chunk-7BI5BYMQ.js → chunk-3CPYTXZH.js} +5 -5
  23. package/dist/{chunk-OGTR33KN.js → chunk-3T4RQK6C.js} +2 -2
  24. package/dist/{chunk-HGL4WJDI.js → chunk-44UOKZIC.js} +9 -9
  25. package/dist/{chunk-KTPQ67TX.js → chunk-4PY6UPHN.js} +1 -1
  26. package/dist/{chunk-SGBOZ2HF.js → chunk-5ER3PYYP.js} +1 -1
  27. package/dist/{normalize-audio-J2PG6YXH.js → chunk-5ON5GH3X.js} +101 -209
  28. package/dist/{chunk-NHTRUAMD.js → chunk-AWUZ3AUD.js} +1 -1
  29. package/dist/{chunk-VMDEGITC.js → chunk-B25H4M4V.js} +1 -1
  30. package/dist/{chunk-QM2NUN2B.js → chunk-BAVM2XBR.js} +87 -3
  31. package/dist/{chunk-4W4UDPCH.js → chunk-C4TZBEHY.js} +2 -2
  32. package/dist/{chunk-FLUBCMNT.js → chunk-CFC3EEDQ.js} +1 -1
  33. package/dist/{chunk-3CYAZWF2.js → chunk-CPO5INJ5.js} +3 -3
  34. package/dist/{chunk-C3KEF3UA.js → chunk-CQRF7VU3.js} +1 -1
  35. package/dist/{chunk-6QWHIARJ.js → chunk-E4AYSXMS.js} +1 -1
  36. package/dist/{chunk-BRTGJ73L.js → chunk-HQGJLZB6.js} +2 -2
  37. package/dist/{chunk-HJCTKNXF.js → chunk-I5WWEBDG.js} +1 -1
  38. package/dist/{chunk-GLTHJJIF.js → chunk-ITBEN3QD.js} +2 -2
  39. package/dist/{chunk-3LBFLW7E.js → chunk-JTTAS7N6.js} +1 -1
  40. package/dist/{chunk-T4Z4UNSX.js → chunk-JWPSBANO.js} +3 -3
  41. package/dist/{chunk-P7XRDAWU.js → chunk-LAQEZHOH.js} +1 -1
  42. package/dist/{chunk-73VPF3SS.js → chunk-M224DAMG.js} +1 -1
  43. package/dist/{chunk-PU2IOWX4.js → chunk-MGFVNTIB.js} +2 -2
  44. package/dist/{chunk-NX6G66F4.js → chunk-MP25ID6H.js} +2 -2
  45. package/dist/{chunk-4DJXCVQJ.js → chunk-MR2LOG32.js} +577 -66
  46. package/dist/{chunk-3WG63KFW.js → chunk-N32ITJ7L.js} +25 -11
  47. package/dist/{chunk-D5EJCP26.js → chunk-OF3RKOPU.js} +79 -64
  48. package/dist/{chunk-J6CSEDK7.js → chunk-OORTZAJ7.js} +4 -4
  49. package/dist/{chunk-L7XDI3DT.js → chunk-RB7AHUOR.js} +1 -1
  50. package/dist/{chunk-YVEZT6WT.js → chunk-TBYUUOJG.js} +1 -1
  51. package/dist/{chunk-T3BOWXPX.js → chunk-TIZQC44K.js} +1 -1
  52. package/dist/{chunk-R4IB642V.js → chunk-U4TDAJZE.js} +2 -2
  53. package/dist/{chunk-TPPIERG3.js → chunk-WMN4NBJQ.js} +3 -3
  54. package/dist/{chunk-AO4PBESP.js → chunk-X2QJUTZL.js} +7 -7
  55. package/dist/{chunk-SKPL32FI.js → chunk-XKNYXDJN.js} +1 -1
  56. package/dist/{chunk-JNY3VJWB.js → chunk-XYVFPDNU.js} +1 -1
  57. package/dist/{chunk-Z4UAXNWV.js → chunk-YIXEH4TF.js} +2 -2
  58. package/dist/chunk-YLVI7VL5.js +3541 -0
  59. package/dist/{chunk-ADP6TMYP.js → chunk-YRTKK45P.js} +8 -8
  60. package/dist/{chunk-I73Z6OOE.js → chunk-ZKBSOLPY.js} +1 -1
  61. package/dist/{chunk-YY5J75H5.js → chunk-ZU54D6MI.js} +135 -5
  62. package/dist/{clean-46MZVA37.js → clean-45QMNXLN.js} +15 -14
  63. package/dist/cli.js +50 -50
  64. package/dist/{cloud-GAZQGPCW.js → cloud-YRYTNHMQ.js} +4 -4
  65. package/dist/{cloudrun-ZWL7SLDD.js → cloudrun-LVZ4OPPC.js} +3 -3
  66. package/dist/{compare-66AAJESM.js → compare-GODD3JD2.js} +24 -23
  67. package/dist/{compiler-3N7XQRH6.js → compiler-C32VXLE2.js} +3 -3
  68. package/dist/{component-3OCOHK2B.js → component-UMNTDLG3.js} +3 -3
  69. package/dist/{compositions-H2BP4N6F.js → compositions-EIRLTOYW.js} +11 -11
  70. package/dist/{delete-WNJLVPGO.js → delete-7P55EZOW.js} +2 -2
  71. package/dist/{dist-AY2RBEXL.js → dist-FMHQMEMX.js} +1 -1
  72. package/dist/{dist-HSEMXPG3.js → dist-YUIPB7OX.js} +8 -2
  73. package/dist/{doctor-IFOZS45N.js → doctor-UYSIF4PX.js} +10 -10
  74. package/dist/{events-6TH3FU3F.js → events-A2MYVK2Z.js} +9 -9
  75. package/dist/{events-5EKFJCCZ.js → events-LXYVOH3X.js} +8 -8
  76. package/dist/{feedback-QRQNMORT.js → feedback-46DWSEAZ.js} +10 -10
  77. package/dist/{figma-WONEPLUQ.js → figma-C5DHRI6P.js} +3 -3
  78. package/dist/fontLocalizeCli.js +8 -8
  79. package/dist/{get-C7FCYNI2.js → get-IRSUDICU.js} +2 -2
  80. package/dist/{gpuPolicy-BXXQF3VC.js → gpuPolicy-CA6KRFQQ.js} +6 -6
  81. package/dist/{grade-compare-SCCSZ5P3.js → grade-compare-BLHXB3UR.js} +24 -23
  82. package/dist/{help-FJOUNXVD.js → help-HMYF4Y3E.js} +1 -1
  83. package/dist/{history-OZY36NEC.js → history-K5BD64QP.js} +15 -14
  84. package/dist/hyperframe-runtime.js +54 -54
  85. package/dist/hyperframe.manifest.json +1 -1
  86. package/dist/hyperframe.runtime.iife.js +54 -54
  87. package/dist/hyperframes-player.global.js +3 -3
  88. package/dist/{info-RG4SZQ2C.js → info-QR2FYDJ7.js} +11 -11
  89. package/dist/{init-YGZCDKSS.js → init-L6BY7IV4.js} +22 -22
  90. package/dist/{inspect-X547EZ4I.js → inspect-D3MC4VH3.js} +25 -24
  91. package/dist/{installer-6J24NTIV.js → installer-NBEN3ZIP.js} +4 -4
  92. package/dist/{keyframes-EIWEION2.js → keyframes-TPMFVG6O.js} +12 -12
  93. package/dist/{lambda-DSZDMP7P.js → lambda-BFHJMMCG.js} +4 -4
  94. package/dist/{layout-B7KCBLBH.js → layout-AOYCSBIL.js} +25 -24
  95. package/dist/{lint-RBDG4ERJ.js → lint-L4MN7QPF.js} +12 -12
  96. package/dist/{lintProject-CMPAR7BS.js → lintProject-X7L7EZWZ.js} +1 -1
  97. package/dist/{list-BPHPHLDJ.js → list-LKXCKBRX.js} +2 -2
  98. package/dist/{login-HV7KBW2J.js → login-4WEDFAIY.js} +4 -4
  99. package/dist/{media-treatment-RS6BZSQC.js → media-treatment-H6YAFA3H.js} +12 -12
  100. package/dist/{models-K4U7GRXV.js → models-RILNQV3Z.js} +7 -7
  101. package/dist/{motionShot-5AI2DALY.js → motionShot-5F4DCMWC.js} +10 -10
  102. package/dist/normalize-audio-DFK5FTE5.js +276 -0
  103. package/dist/{pipeline-HIUESSET.js → pipeline-5UY45ELH.js} +6 -6
  104. package/dist/{play-TTLQXBAH.js → play-HFD4CPWF.js} +20 -19
  105. package/dist/{preflight-63ODQ625.js → preflight-3V5IHGWQ.js} +7 -7
  106. package/dist/{present-XKGZ26FQ.js → present-JGDYENOT.js} +16 -15
  107. package/dist/{preview-O2YEKMYJ.js → preview-GLI7KBCA.js} +17 -17
  108. package/dist/{producer-ZTQIJO7E.js → producer-7JGAPEAF.js} +1 -1
  109. package/dist/{projectConfig-VVFH7XW5.js → projectConfig-JHEWPAA5.js} +6 -6
  110. package/dist/{publication-NALPAHDC.js → publication-7XA2H7UB.js} +2 -2
  111. package/dist/{publish-G7OL45EL.js → publish-257VZMWI.js} +8 -8
  112. package/dist/{remove-background-LOLKFKLT.js → remove-background-EV6XVADN.js} +7 -7
  113. package/dist/{render-I65IU7RM.js → render-4C3YKVZI.js} +3 -3
  114. package/dist/{render-ULQLUIWD.js → render-K6YASB4G.js} +12 -12
  115. package/dist/{render-EXSRG666.js → render-Y6LOQDCD.js} +21 -21
  116. package/dist/{render-batch-RSNCREPB.js → render-batch-AFDBPDMM.js} +3 -3
  117. package/dist/{renderCancellation-2WB4SGXR.js → renderCancellation-VIZELWDD.js} +6 -6
  118. package/dist/renderSetupWorker.js +1 -1
  119. package/dist/{resolver-CVN2IM2R.js → resolver-S72XBTEQ.js} +4 -4
  120. package/dist/{sherpa-OJUI54HG.js → sherpa-BAADWCHB.js} +7 -7
  121. package/dist/{skills-CPS5E5YP.js → skills-TEVVW6TR.js} +11 -11
  122. package/dist/{skillsUpdateCheck-3IT5CJWU.js → skillsUpdateCheck-4Y3NJPB5.js} +3 -3
  123. package/dist/{snapshot-MSGC7HTA.js → snapshot-63X5B7GR.js} +25 -24
  124. package/dist/{src-SV7CNZXN.js → src-GD7RGV5U.js} +5 -5
  125. package/dist/{src-EZBJT4VH.js → src-GRC63B6L.js} +7 -7
  126. package/dist/{staticProjectServer-5JAGMYT7.js → staticProjectServer-SFINO3DE.js} +14 -13
  127. package/dist/{status-4W3EJYEH.js → status-LXQL3L3H.js} +6 -6
  128. package/dist/studio/assets/{hyperframes-player-h4mktSdm.js → hyperframes-player-CJYtikAy.js} +1 -1
  129. package/dist/studio/assets/{index-lrT-gfHa.css → index-BQZBDqMs.css} +1 -1
  130. package/dist/studio/assets/{index-zoqPmBF6.js → index-CMSgrT2F.js} +1 -1
  131. package/dist/studio/assets/{index-CM1xA_jD.js → index-CYP6dMd7.js} +212 -210
  132. package/dist/studio/assets/{index-D8GKc2D9.js → index-HTFVHUJ4.js} +1 -1
  133. package/dist/studio/{chunk-NCUBAVGK.js → chunk-5VSXRGIX.js} +4 -4
  134. package/dist/studio/chunk-5VSXRGIX.js.map +1 -0
  135. package/dist/studio/chunk-6LUNLTHR.js +611 -0
  136. package/dist/studio/chunk-6LUNLTHR.js.map +1 -0
  137. package/dist/studio/{chunk-46XP7J3B.js → chunk-PQFEBX32.js} +5 -3
  138. package/dist/studio/chunk-PQFEBX32.js.map +1 -0
  139. package/dist/studio/{chunk-4OZC426H.js → chunk-QUXZVHOJ.js} +10 -504
  140. package/dist/studio/chunk-QUXZVHOJ.js.map +1 -0
  141. package/dist/studio/{domEditingLayers-AQBDFNUC.js → domEditingLayers-JQPQGGT7.js} +3 -3
  142. package/dist/studio/index.d.ts +53 -4
  143. package/dist/studio/index.html +2 -2
  144. package/dist/studio/index.js +15746 -13173
  145. package/dist/studio/index.js.map +1 -1
  146. package/dist/studio/player.js +3 -3
  147. package/dist/studio/styles.css +1 -1
  148. package/dist/studio/ui.js +1 -1
  149. package/dist/{studio-api-L2TJ2JTK.js → studio-api-WRSCXPWS.js} +8 -7
  150. package/dist/{studioServer-UV7YRYWN.js → studioServer-HPG3FVTJ.js} +44 -38
  151. package/dist/{system-OL4MXRPK.js → system-EEWYEHYX.js} +6 -6
  152. package/dist/{telemetry-WRUU725E.js → telemetry-UIZ5O7NL.js} +9 -9
  153. package/dist/{timeline-P43A53BW.js → timeline-L56HML42.js} +41 -21
  154. package/dist/{tokens-NUHTJM2V.js → tokens-DLPYLGLW.js} +2 -2
  155. package/dist/{transcribe-FSVNIFGF.js → transcribe-FBPTYMVZ.js} +12 -12
  156. package/dist/{transcribe-TRLZJK73.js → transcribe-GCKJF5A6.js} +7 -7
  157. package/dist/{updateCheck-33TAG46I.js → updateCheck-GQBMZGU3.js} +2 -2
  158. package/dist/{upgrade-AJ6QBTH2.js → upgrade-6LR7ZK3Q.js} +2 -2
  159. package/dist/{urlDownloader-MP6GJIDV.js → urlDownloader-NYXPEBUN.js} +5 -5
  160. package/dist/{validate-VL3A6VTJ.js → validate-VY6RJRHE.js} +15 -15
  161. package/dist/{video-KO7VT63P.js → video-KWQ5TSVD.js} +6 -6
  162. package/package.json +1 -1
  163. package/dist/chunk-PMLZPNIB.js +0 -3431
  164. package/dist/studio/chunk-46XP7J3B.js.map +0 -1
  165. package/dist/studio/chunk-4OZC426H.js.map +0 -1
  166. package/dist/studio/chunk-DI4LCJHL.js +0 -102
  167. package/dist/studio/chunk-DI4LCJHL.js.map +0 -1
  168. package/dist/studio/chunk-NCUBAVGK.js.map +0 -1
  169. /package/dist/studio/{domEditingLayers-AQBDFNUC.js.map → domEditingLayers-JQPQGGT7.js.map} +0 -0
@@ -4,64 +4,21 @@ 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
- resolveProject
9
- } from "./chunk-I73Z6OOE.js";
10
- import "./chunk-IHFUKJOR.js";
11
- import "./chunk-TPPIERG3.js";
12
- import "./chunk-3CYAZWF2.js";
13
- import "./chunk-VWG7OQKU.js";
14
- import {
15
- c
16
- } from "./chunk-ZTZA4UWZ.js";
17
- import "./chunk-C3KEF3UA.js";
18
- import "./chunk-AMKC3AXA.js";
19
- import {
20
- defineCommand
21
- } from "./chunk-S3S4TGEH.js";
22
- import "./chunk-54HJ63Q2.js";
23
- import {
24
- failCommand
25
- } from "./chunk-PBN6GBJE.js";
26
- import "./chunk-D5EJCP26.js";
27
- import "./chunk-VMDEGITC.js";
28
- import "./chunk-UUDQD62L.js";
29
- import "./chunk-DPVXBVLL.js";
30
- import "./chunk-R4IB642V.js";
31
7
  import {
32
8
  MAX_AUDIO_GAIN_DB,
33
- formatAudioGain
34
- } from "./chunk-PMLZPNIB.js";
35
- import "./chunk-VC76R6W2.js";
36
- import "./chunk-OFQWTKPW.js";
37
- import "./chunk-TWWSYAKJ.js";
38
- import "./chunk-QM2NUN2B.js";
39
- import "./chunk-HBBJFK6I.js";
9
+ formatAudioGain,
10
+ isAudibleVideoElement
11
+ } from "./chunk-YLVI7VL5.js";
40
12
  import {
41
13
  findFfBinary
42
14
  } from "./chunk-PJ3HDUCY.js";
43
- import "./chunk-TQFG7HTI.js";
44
- import "./chunk-GK4AIFIH.js";
45
- import "./chunk-2PSPARWP.js";
46
- import "./chunk-K4WIOZFP.js";
47
- import "./chunk-XUXGIA7H.js";
48
- import "./chunk-WERLJGIC.js";
49
- import "./chunk-ISN5GRYI.js";
50
- import "./chunk-OGTR33KN.js";
51
- import "./chunk-KNU5COPB.js";
52
- import "./chunk-3GXQPCJC.js";
53
- import "./chunk-RQVDTPGD.js";
54
- import "./chunk-PMRBLBUP.js";
55
- import "./chunk-M2WBOQ2Q.js";
56
15
 
57
- // src/commands/normalize-audio.ts
16
+ // ../studio-server/dist/chunk-TEYDBVSK.js
58
17
  import { execFile } from "child_process";
59
- import { existsSync, readFileSync, renameSync, writeFileSync } from "fs";
60
18
  import { isAbsolute, relative, resolve } from "path";
61
19
  import { promisify } from "util";
62
20
  var execFileAsync = promisify(execFile);
63
21
  var FFMPEG_TIMEOUT_MS = 12e4;
64
- var DEFAULT_TOLERANCE_LU = 0.5;
65
22
  function authoredNumber(raw, fallback, attribute, id, strictlyPositive = false) {
66
23
  if (raw === void 0) return fallback;
67
24
  const value = Number(raw);
@@ -121,14 +78,28 @@ function commentEnd(html, start) {
121
78
  if (end < 0) throw new Error("Unterminated HTML comment");
122
79
  return end + 3;
123
80
  }
81
+ var isSpaceAt = (html, index) => /\s/.test(html.charAt(index));
82
+ var isWordAt = (html, index) => /\w/.test(html.charAt(index));
83
+ function skipSpaces(html, index) {
84
+ let cursor = index;
85
+ while (cursor < html.length && isSpaceAt(html, cursor)) cursor++;
86
+ return cursor;
87
+ }
124
88
  function parsedStartTag(html, start) {
125
- const match = html.slice(start).match(/^<\s*(\/?)\s*([a-z][a-z\d:-]*)\b/i);
126
- if (!match) return null;
89
+ let cursor = skipSpaces(html, start + 1);
90
+ const closing = html.charAt(cursor) === "/";
91
+ if (closing) cursor = skipSpaces(html, cursor + 1);
92
+ const nameStart = cursor;
93
+ if (!/[a-z]/i.test(html.charAt(cursor))) return null;
94
+ while (/[a-z\d:-]/i.test(html.charAt(cursor + 1))) cursor++;
95
+ let nameEnd = cursor + 1;
96
+ while (nameEnd > nameStart && isWordAt(html, nameEnd - 1) === isWordAt(html, nameEnd)) nameEnd--;
97
+ if (nameEnd === nameStart) return null;
127
98
  return {
128
99
  start,
129
100
  end: startTagEnd(html, start),
130
- closing: match[1] === "/",
131
- name: match[2]?.toLowerCase() ?? ""
101
+ closing,
102
+ name: html.slice(nameStart, nameEnd).toLowerCase()
132
103
  };
133
104
  }
134
105
  function rawTextElementEnd(html, lower, tag) {
@@ -139,20 +110,26 @@ function rawTextElementEnd(html, lower, tag) {
139
110
  }
140
111
  function scanMarkup(html, lower, start) {
141
112
  if (html.startsWith("<!--", start)) {
142
- return { cursor: commentEnd(html, start), audioRange: null };
113
+ return { cursor: commentEnd(html, start), mediaRange: null };
143
114
  }
144
115
  const tag = parsedStartTag(html, start);
145
116
  if (!tag) {
146
117
  const marker = html[start + 1];
147
118
  const cursor = marker === "!" || marker === "?" ? startTagEnd(html, start) : start + 1;
148
- return { cursor, audioRange: null };
119
+ return { cursor, mediaRange: null };
149
120
  }
150
121
  const rawTextEnd = rawTextElementEnd(html, lower, tag);
151
- if (rawTextEnd !== null) return { cursor: rawTextEnd, audioRange: null };
152
- const audioRange = !tag.closing && tag.name === "audio" ? { start, end: tag.end } : null;
153
- return { cursor: tag.end, audioRange };
122
+ if (rawTextEnd !== null) return { cursor: rawTextEnd, mediaRange: null };
123
+ return { cursor: tag.end, mediaRange: mediaRangeOf(tag) };
154
124
  }
155
- function audioTagRanges(html) {
125
+ function mediaRangeOf(tag) {
126
+ if (tag.closing) return null;
127
+ if (tag.name === "audio" || tag.name === "video") {
128
+ return { start: tag.start, end: tag.end, name: tag.name };
129
+ }
130
+ return null;
131
+ }
132
+ function mediaTagRanges(html) {
156
133
  const lower = html.toLowerCase();
157
134
  const ranges = [];
158
135
  let cursor = 0;
@@ -160,7 +137,7 @@ function audioTagRanges(html) {
160
137
  const start = html.indexOf("<", cursor);
161
138
  if (start < 0) break;
162
139
  const scanned = scanMarkup(html, lower, start);
163
- if (scanned.audioRange) ranges.push(scanned.audioRange);
140
+ if (scanned.mediaRange) ranges.push(scanned.mediaRange);
164
141
  cursor = scanned.cursor;
165
142
  }
166
143
  return ranges;
@@ -184,11 +161,27 @@ function requiredAudioIdentity(attributes) {
184
161
  if (!src) throw new Error(`Audio #${id} has no src`);
185
162
  return { id, src };
186
163
  }
187
- function audioTagFromRange(html, range) {
164
+ function hasBareAttribute(html, range, name) {
165
+ const unquoted = html.slice(range.start, range.end).replace(/"[^"]*"|'[^']*'/g, '""');
166
+ return new RegExp(`\\s${name}(?=[\\s/>=])`, "i").test(unquoted);
167
+ }
168
+ function isAudibleVideoTag(html, range, attributes) {
169
+ return isAudibleVideoElement({
170
+ tagName: "video",
171
+ hasAttribute: (name) => attributes.has(name) || hasBareAttribute(html, range, name),
172
+ getAttribute: (name) => attributes.get(name)?.value ?? null
173
+ });
174
+ }
175
+ function inScopeVideo(html, range, attributes) {
176
+ return isAudibleVideoTag(html, range, attributes) && trimmedAttribute(attributes, "id") !== "" && trimmedAttribute(attributes, "src") !== "";
177
+ }
178
+ function mediaTagFromRange(html, range) {
188
179
  const attributes = attributesInTag(html, range.start, range.end);
180
+ if (range.name === "video" && !inScopeVideo(html, range, attributes)) return null;
189
181
  const { id, src } = requiredAudioIdentity(attributes);
190
182
  const volumeAttribute = attributes.get("data-volume") ?? null;
191
183
  return {
184
+ tag: range.name,
192
185
  id,
193
186
  src,
194
187
  volume: authoredNumber(volumeAttribute?.value, 1, "data-volume", id),
@@ -199,6 +192,13 @@ function audioTagFromRange(html, range) {
199
192
  id
200
193
  ),
201
194
  duration: authoredDuration(attributes, id),
195
+ playbackRate: authoredNumber(
196
+ attributes.get("data-playback-rate")?.value,
197
+ 1,
198
+ "data-playback-rate",
199
+ id,
200
+ true
201
+ ),
202
202
  start: range.start,
203
203
  end: range.end,
204
204
  volumeAttribute
@@ -207,8 +207,9 @@ function audioTagFromRange(html, range) {
207
207
  function audioTags(html) {
208
208
  const seen = /* @__PURE__ */ new Set();
209
209
  const tags = [];
210
- for (const range of audioTagRanges(html)) {
211
- const tag = audioTagFromRange(html, range);
210
+ for (const range of mediaTagRanges(html)) {
211
+ const tag = mediaTagFromRange(html, range);
212
+ if (!tag) continue;
212
213
  if (seen.has(tag.id)) throw new Error(`Duplicate audio id "${tag.id}"`);
213
214
  seen.add(tag.id);
214
215
  tags.push(tag);
@@ -305,7 +306,8 @@ function updateAudioVolume(html, id, volume) {
305
306
  function loudnessMeasureArgs(file, tag) {
306
307
  const args = ["-hide_banner", "-nostats"];
307
308
  if (tag.mediaStart > 0) args.push("-ss", String(tag.mediaStart));
308
- if (tag.duration !== null && tag.duration > 0) args.push("-t", String(tag.duration));
309
+ const sourceSpan = tag.duration === null ? null : tag.duration * (tag.playbackRate ?? 1);
310
+ if (sourceSpan !== null && sourceSpan > 0) args.push("-t", String(sourceSpan));
309
311
  args.push("-i", file, "-map", "0:a:0", "-vn", "-af", "ebur128=peak=true", "-f", "null", "-");
310
312
  return args;
311
313
  }
@@ -317,162 +319,52 @@ async function measureAudio(ffmpegPath, file, tag) {
317
319
  });
318
320
  return parseEbur128Summary(result.stderr);
319
321
  }
320
- function fail(message, json, cause) {
321
- if (json) console.log(JSON.stringify({ ok: false, error: message }, null, 2));
322
- else console.error(c.error(message));
323
- failCommand(1, cause);
324
- }
325
- function byId(tags, rawId, role) {
326
- const id = rawId.trim().replace(/^#/, "");
327
- const tag = tags.find((candidate) => candidate.id === id);
328
- if (!tag) throw new Error(`${role} audio #${id} was not found`);
329
- return tag;
330
- }
331
- function selectedTags(html, referenceId, targetId) {
332
- const tags = audioTags(html);
333
- const referenceTag = byId(tags, referenceId, "Reference");
334
- const targetTag = byId(tags, targetId, "Target");
335
- if (referenceTag.id === targetTag.id) {
336
- throw new Error("Reference and target must be different audio elements");
337
- }
338
- return { referenceTag, targetTag };
339
- }
340
322
  function requiredFfmpeg() {
341
323
  const ffmpegPath = findFfBinary("ffmpeg", { configuredMustExist: true });
342
324
  if (!ffmpegPath) throw new Error("FFmpeg is required to measure integrated loudness");
343
325
  return ffmpegPath;
344
326
  }
345
- function existingAudioFile(projectDir, tag) {
346
- const file = resolveLocalAudioPath(projectDir, tag.src);
347
- if (!existsSync(file)) {
348
- throw new Error(`Audio #${tag.id} file was not found: ${relative(projectDir, file)}`);
349
- }
350
- return file;
351
- }
352
- async function measuredPlan(projectDir, referenceTag, targetTag) {
353
- const ffmpegPath = requiredFfmpeg();
354
- const referenceFile = existingAudioFile(projectDir, referenceTag);
355
- const targetFile = existingAudioFile(projectDir, targetTag);
356
- const [referenceMeasurement, targetMeasurement] = await Promise.all([
357
- measureAudio(ffmpegPath, referenceFile, referenceTag),
358
- measureAudio(ffmpegPath, targetFile, targetTag)
359
- ]);
360
- return audioNormalizationPlan(
361
- { id: referenceTag.id, volume: referenceTag.volume, ...referenceMeasurement },
362
- { id: targetTag.id, volume: targetTag.volume, ...targetMeasurement }
363
- );
364
- }
365
- function writeAtomically(path, contents) {
366
- const temporary = `${path}.hf-normalize-${process.pid}.tmp`;
367
- writeFileSync(temporary, contents);
368
- renameSync(temporary, path);
369
- }
370
- function parsedTolerance(raw) {
371
- const tolerance = Number(raw);
372
- if (!Number.isFinite(tolerance) || tolerance < 0) {
373
- throw new Error("--tolerance must be a non-negative number");
374
- }
375
- return tolerance;
376
- }
377
- async function normalizeAudio(options) {
378
- const project = resolveProject(options.dir);
379
- const html = readFileSync(project.indexPath, "utf8");
380
- const { referenceTag, targetTag } = selectedTags(html, options.reference, options.target);
381
- const tolerance = parsedTolerance(options.tolerance);
382
- const plan = await measuredPlan(project.dir, referenceTag, targetTag);
383
- const withinTolerance = Math.abs(plan.referenceLufs - plan.targetLufs) <= tolerance;
384
- const wrote = options.write && !withinTolerance;
385
- if (wrote) {
386
- writeAtomically(
387
- project.indexPath,
388
- updateAudioVolume(readFileSync(project.indexPath, "utf8"), targetTag.id, plan.volume)
389
- );
327
+ var DEFAULT_TARGET_LUFS = -16;
328
+ var NORMALIZE_TRUE_PEAK_CEILING_DBFS = -1.5;
329
+ var SILENCE_LUFS = -70;
330
+ function absoluteLoudnessPlan(track, targetLufs = DEFAULT_TARGET_LUFS) {
331
+ if (track.integratedLufs <= SILENCE_LUFS) {
332
+ throw new Error(`#${track.id} is silent in the played window; there is nothing to normalize`);
390
333
  }
391
- return { ok: true, wrote, withinTolerance, tolerance, indexPath: project.indexPath, ...plan };
392
- }
393
- function printHumanResult(result) {
394
- console.log(
395
- `${c.bold(`#${result.referenceId}`)} ${result.referenceLufs.toFixed(1)} LUFS \u2192 ${c.bold(`#${result.targetId}`)} ${result.targetLufs.toFixed(1)} LUFS`
396
- );
397
- if (result.withinTolerance) {
398
- console.log(
399
- c.success(`Already matched within ${result.tolerance.toFixed(1)} LU; no change needed.`)
400
- );
401
- return;
402
- }
403
- console.log(
404
- `Set #${result.targetId} data-volume ${result.previousVolume.toFixed(3)} \u2192 ${result.volume.toFixed(6)} (${result.changeDb >= 0 ? "+" : ""}${result.changeDb.toFixed(1)} dB).`
405
- );
406
- console.log(
407
- result.wrote ? c.success(`Updated ${relative(process.cwd(), result.indexPath) || "index.html"}.`) : c.dim("Dry run only. Pass --write to persist this gain.")
334
+ const wantedGainDb = targetLufs - track.integratedLufs;
335
+ const peakRoomDb = NORMALIZE_TRUE_PEAK_CEILING_DBFS - track.truePeakDbfs;
336
+ const limits = [
337
+ [null, wantedGainDb],
338
+ ["gain-ceiling", MAX_AUDIO_GAIN_DB],
339
+ ["true-peak", peakRoomDb]
340
+ ];
341
+ const [limitedBy, appliedGainDb] = limits.reduce(
342
+ (lowest, candidate) => candidate[1] < lowest[1] - 1e-9 ? candidate : lowest
408
343
  );
344
+ const previousGainDb = track.volume > 0 ? gainDb(track.volume) : 0;
345
+ return {
346
+ targetId: track.id,
347
+ targetLufs,
348
+ sourceLufs: track.integratedLufs,
349
+ previousVolume: track.volume,
350
+ volume: 10 ** (appliedGainDb / 20),
351
+ gainDb: appliedGainDb,
352
+ changeDb: appliedGainDb - previousGainDb,
353
+ projectedLufs: track.integratedLufs + appliedGainDb,
354
+ projectedTruePeakDbfs: track.truePeakDbfs + appliedGainDb,
355
+ limitedBy
356
+ };
409
357
  }
410
- var examples = [
411
- [
412
- "Measure two authored clips and preview the matching gain",
413
- "hyperframes normalize-audio --reference target-audio --target user-audio"
414
- ],
415
- [
416
- "Persist the measured gain into index.html",
417
- "hyperframes normalize-audio --reference target-audio --target user-audio --write"
418
- ]
419
- ];
420
- var normalize_audio_default = defineCommand({
421
- meta: {
422
- name: "normalize-audio",
423
- description: "Match one local audio clip to another using integrated LUFS"
424
- },
425
- args: {
426
- dir: { type: "positional", description: "Project directory", required: false },
427
- reference: {
428
- type: "string",
429
- description: "Audio element id whose effective loudness should be preserved",
430
- required: true
431
- },
432
- target: {
433
- type: "string",
434
- description: "Audio element id whose data-volume should be matched",
435
- required: true
436
- },
437
- write: {
438
- type: "boolean",
439
- description: "Persist the measured target gain into index.html",
440
- default: false
441
- },
442
- tolerance: {
443
- type: "string",
444
- description: `Skip writes within this many LU (default ${DEFAULT_TOLERANCE_LU})`,
445
- default: String(DEFAULT_TOLERANCE_LU)
446
- },
447
- json: { type: "boolean", description: "Print machine-readable output", default: false }
448
- },
449
- async run({ args }) {
450
- try {
451
- const result = await normalizeAudio({
452
- dir: args.dir,
453
- reference: args.reference,
454
- target: args.target,
455
- tolerance: args.tolerance,
456
- write: args.write
457
- });
458
- if (args.json) {
459
- const { indexPath: _, ...jsonResult } = result;
460
- console.log(JSON.stringify(jsonResult, null, 2));
461
- return;
462
- }
463
- printHumanResult(result);
464
- } catch (error) {
465
- fail(error instanceof Error ? error.message : String(error), Boolean(args.json), error);
466
- }
467
- }
468
- });
358
+
469
359
  export {
470
- audioNormalizationPlan,
471
360
  audioTags,
472
- normalize_audio_default as default,
473
- examples,
474
- loudnessMeasureArgs,
475
- parseEbur128Summary,
476
361
  resolveLocalAudioPath,
477
- updateAudioVolume
362
+ parseEbur128Summary,
363
+ audioNormalizationPlan,
364
+ updateAudioVolume,
365
+ loudnessMeasureArgs,
366
+ measureAudio,
367
+ requiredFfmpeg,
368
+ DEFAULT_TARGET_LUFS,
369
+ absoluteLoudnessPlan
478
370
  };
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-GMECXFAN.js";
13
13
  import {
14
14
  ITEM_TYPE_DIRS
15
- } from "./chunk-VMDEGITC.js";
15
+ } from "./chunk-B25H4M4V.js";
16
16
  import {
17
17
  realProjectRoot
18
18
  } from "./chunk-OFQWTKPW.js";
@@ -17,7 +17,7 @@ import {
17
17
  parseStrictFiniteTimingNumber,
18
18
  resolveNaturalMediaTimelineDuration,
19
19
  resolveTimedImageDurationSeconds
20
- } from "./chunk-PMLZPNIB.js";
20
+ } from "./chunk-YLVI7VL5.js";
21
21
  import {
22
22
  COMPOSITION_ATTRIBUTES,
23
23
  parseStartExpression
@@ -4015,7 +4015,7 @@ function isAudibleVideoTag(tagSource) {
4015
4015
  if (hasAttrName(tagSource, "muted")) return false;
4016
4016
  if (!hasAttrName(tagSource, "data-has-audio")) return true;
4017
4017
  const declared = readAttr(tagSource, "data-has-audio");
4018
- return declared !== null && declared.trim().toLowerCase() !== "false";
4018
+ return declared === "true";
4019
4019
  }
4020
4020
  function mediaTimeWindow(tagSource) {
4021
4021
  const start = Number(readAttr(tagSource, "data-start"));
@@ -5245,6 +5245,89 @@ function cssErrorOffset(source, error) {
5245
5245
  }
5246
5246
  return currentLine === line ? offset + column - 1 : void 0;
5247
5247
  }
5248
+ var SYNC_TOLERANCE_S = 1e-3;
5249
+ var LINKED_TIMING_FIELDS = [
5250
+ { field: "start", attrs: ["data-start"], fallback: 0 },
5251
+ { field: "duration", attrs: ["data-duration"], fallback: 0 },
5252
+ { field: "media-start", attrs: ["data-playback-start", "data-media-start"], fallback: 0 },
5253
+ { field: "playback-rate", attrs: ["data-playback-rate"], fallback: 1 }
5254
+ ];
5255
+ function readTimingField(tag, attrs, fallback) {
5256
+ for (const attr of attrs) {
5257
+ const raw = readAttr(tag.raw, attr);
5258
+ if (raw === null || raw.trim() === "") continue;
5259
+ const value = Number(raw);
5260
+ if (Number.isFinite(value)) return value;
5261
+ }
5262
+ return fallback;
5263
+ }
5264
+ function driftingFields(members) {
5265
+ return LINKED_TIMING_FIELDS.filter(({ attrs, fallback }) => {
5266
+ const values = members.map((tag) => readTimingField(tag, attrs, fallback));
5267
+ const first = values[0] ?? fallback;
5268
+ return values.some((value) => Math.abs(value - first) > SYNC_TOLERANCE_S);
5269
+ }).map(({ field }) => field);
5270
+ }
5271
+ function compositionScopeOf(tag, compositions) {
5272
+ let scope = -1;
5273
+ for (const composition of compositions) {
5274
+ const end = composition.endIndex ?? composition.closeIndex ?? Number.POSITIVE_INFINITY;
5275
+ const encloses = composition.index < tag.index && tag.index < end;
5276
+ if (composition !== tag && encloses && composition.index > scope) scope = composition.index;
5277
+ }
5278
+ return scope;
5279
+ }
5280
+ function groupByLink(tags) {
5281
+ const compositions = tags.filter(
5282
+ (tag) => ["data-composition-id", "data-composition-file"].some(
5283
+ (name) => readAttr(tag.raw, name) !== null
5284
+ )
5285
+ );
5286
+ const groups = /* @__PURE__ */ new Map();
5287
+ for (const tag of tags) {
5288
+ const link = readAttr(tag.raw, "data-link");
5289
+ if (!link) continue;
5290
+ const key = `${compositionScopeOf(tag, compositions)}\0${link}`;
5291
+ const group = groups.get(key) ?? { link, members: [] };
5292
+ group.members.push(tag);
5293
+ groups.set(key, group);
5294
+ }
5295
+ return groups;
5296
+ }
5297
+ var memberLabel = (tag) => {
5298
+ const id = readAttr(tag.raw, "id");
5299
+ return id ? `#${id}` : `<${tag.name}>`;
5300
+ };
5301
+ function findLinkedClipFindings(ctx) {
5302
+ const findings = [];
5303
+ for (const { link, members } of groupByLink(ctx.tags).values()) {
5304
+ const first = members[0];
5305
+ if (!first) continue;
5306
+ const elementId = readAttr(first.raw, "id") || void 0;
5307
+ if (members.length === 1) {
5308
+ findings.push({
5309
+ code: "linked_clip_orphan",
5310
+ severity: "warning",
5311
+ message: `${memberLabel(first)} is the only clip with data-link="${link}"; its linked partner is gone.`,
5312
+ elementId,
5313
+ fixHint: `Remove data-link="${link}" from ${memberLabel(first)}, or restore the partner clip.`,
5314
+ snippet: truncateSnippet(first.raw)
5315
+ });
5316
+ continue;
5317
+ }
5318
+ const drift = driftingFields(members);
5319
+ if (drift.length === 0) continue;
5320
+ findings.push({
5321
+ code: "linked_clips_out_of_sync",
5322
+ severity: "warning",
5323
+ message: `Linked clips ${members.map(memberLabel).join(", ")} (data-link="${link}") differ in ${drift.join(", ")}.`,
5324
+ elementId,
5325
+ fixHint: "Linked clips are edited as one: give every member the same data-start, data-duration, data-media-start and data-playback-rate, or remove data-link from all of them to unlink.",
5326
+ snippet: truncateSnippet(first.raw)
5327
+ });
5328
+ }
5329
+ return findings;
5330
+ }
5248
5331
  function tweensVolumeInSameCall(script, id) {
5249
5332
  const selector = new RegExp(`#${escapeRegExp(id)}(?![\\w-])`, "g");
5250
5333
  for (let hit = selector.exec(script); hit; hit = selector.exec(script)) {
@@ -5943,7 +6026,8 @@ var mediaRules = [
5943
6026
  // audio_group_timing_attrs
5944
6027
  findAudioGroupTimingAttrFindings,
5945
6028
  // audio_group_carve_attr
5946
- findAudioGroupCarveAttrFindings
6029
+ findAudioGroupCarveAttrFindings,
6030
+ findLinkedClipFindings
5947
6031
  ];
5948
6032
  function findVolumeTweenOverridesGainFindings(ctx) {
5949
6033
  const boosted = ctx.tags.filter((tag) => isMediaTag(tag.name)).map((tag) => ({ tag, volume: Number(readAttr(tag.raw, "data-volume") ?? "1") })).filter((entry) => Number.isFinite(entry.volume) && entry.volume !== 1).filter((entry) => !readDecodedAttr(entry.tag.raw, "data-automation")).map((entry) => ({ ...entry, id: readAttr(entry.tag.raw, "id") })).filter((entry) => Boolean(entry.id));
@@ -6032,7 +6116,7 @@ function findCarveUngroupedSourcesFindings(ctx) {
6032
6116
  var AUDIO_GROUP_TIMING_ATTRS = ["data-start", "data-duration", "data-track-index"];
6033
6117
  function findAudioGroupNoMembersFindings(ctx) {
6034
6118
  const memberGroupIds = new Set(
6035
- ctx.tags.filter((tag) => tag.name === "audio").map((tag) => readAttr(tag.raw, "data-audio-group")).filter((id) => Boolean(id))
6119
+ ctx.tags.filter((tag) => tag.name === "audio" || tag.name === "video" && isAudibleVideoTag(tag.raw)).map((tag) => readAttr(tag.raw, "data-audio-group")).filter((id) => Boolean(id))
6036
6120
  );
6037
6121
  if (memberGroupIds.size === 0) return [];
6038
6122
  const mayHaveCrossFileMembers = ctx.tags.some(
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  DEFAULT_VP9_CPU_USED,
18
18
  renderProvenanceArgs
19
- } from "./chunk-D5EJCP26.js";
19
+ } from "./chunk-OF3RKOPU.js";
20
20
  import {
21
21
  loadOptionalPackage
22
22
  } from "./chunk-XT5P4QMO.js";
@@ -202,7 +202,7 @@ function inferInputKind(inputPath) {
202
202
  }
203
203
  async function probeMedia(inputPath) {
204
204
  const isImage = inferInputKind(inputPath) === "image";
205
- const engine = await import("./src-SV7CNZXN.js");
205
+ const engine = await import("./src-GD7RGV5U.js");
206
206
  const meta = await engine.extractMediaMetadata(inputPath);
207
207
  if (isImage) {
208
208
  return { width: meta.width, height: meta.height, fps: 0, frameCount: 1 };
@@ -19,7 +19,7 @@ import {
19
19
  import {
20
20
  formatVariableValidationIssue,
21
21
  validateVariables
22
- } from "./chunk-VMDEGITC.js";
22
+ } from "./chunk-B25H4M4V.js";
23
23
  import {
24
24
  extractCompositionMetadata
25
25
  } from "./chunk-UUDQD62L.js";
@@ -12,7 +12,7 @@ import {
12
12
  } from "./chunk-ZTZA4UWZ.js";
13
13
  import {
14
14
  getSystemMeta
15
- } from "./chunk-C3KEF3UA.js";
15
+ } from "./chunk-CQRF7VU3.js";
16
16
  import {
17
17
  getInvocationId
18
18
  } from "./chunk-54HJ63Q2.js";
@@ -23,7 +23,7 @@ import {
23
23
  evaluateCanary,
24
24
  findCanary,
25
25
  parseCanaryOverride
26
- } from "./chunk-VMDEGITC.js";
26
+ } from "./chunk-B25H4M4V.js";
27
27
  import {
28
28
  hostAnswers
29
29
  } from "./chunk-K4WIOZFP.js";
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-XUXGIA7H.js";
38
38
  import {
39
39
  VERSION
40
- } from "./chunk-OGTR33KN.js";
40
+ } from "./chunk-3T4RQK6C.js";
41
41
 
42
42
  // src/telemetry/transport.ts
43
43
  import { spawn } from "child_process";
@@ -9,7 +9,7 @@ import {
9
9
  } from "./chunk-AMKC3AXA.js";
10
10
  import {
11
11
  getSystemTotalMb
12
- } from "./chunk-D5EJCP26.js";
12
+ } from "./chunk-OF3RKOPU.js";
13
13
 
14
14
  // src/telemetry/system.ts
15
15
  import { cpus, freemem, platform as platform2, release as release2 } from "os";
@@ -13,7 +13,7 @@ import {
13
13
  } from "./chunk-TVCRUG2S.js";
14
14
  import {
15
15
  getFreeDiskMb
16
- } from "./chunk-C3KEF3UA.js";
16
+ } from "./chunk-CQRF7VU3.js";
17
17
  import {
18
18
  ensureBrowser,
19
19
  findBrowser
@@ -8,14 +8,14 @@ import {
8
8
  DEFAULT_REGISTRY_URL,
9
9
  fetchItemFile,
10
10
  validRegistryItem
11
- } from "./chunk-NHTRUAMD.js";
11
+ } from "./chunk-AWUZ3AUD.js";
12
12
  import {
13
13
  publishRegistryFile,
14
14
  registryTargetPath
15
15
  } from "./chunk-GMECXFAN.js";
16
16
  import {
17
17
  validateVariables
18
- } from "./chunk-VMDEGITC.js";
18
+ } from "./chunk-B25H4M4V.js";
19
19
  import {
20
20
  realProjectRoot
21
21
  } from "./chunk-OFQWTKPW.js";
@@ -17,7 +17,7 @@ import {
17
17
  } from "./chunk-TVCRUG2S.js";
18
18
  import {
19
19
  stoppedByCancelSignal
20
- } from "./chunk-3LBFLW7E.js";
20
+ } from "./chunk-JTTAS7N6.js";
21
21
 
22
22
  // src/whisper/transcribe.ts
23
23
  import { execFileSync } from "child_process";
@@ -6,10 +6,10 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  getMimeType
9
- } from "./chunk-4DJXCVQJ.js";
9
+ } from "./chunk-MR2LOG32.js";
10
10
  import {
11
11
  injectTagsAtHeadStart
12
- } from "./chunk-PMLZPNIB.js";
12
+ } from "./chunk-YLVI7VL5.js";
13
13
 
14
14
  // src/utils/compositionServer.ts
15
15
  import { createHash } from "crypto";
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  setHostHandlesSigint
9
- } from "./chunk-D5EJCP26.js";
9
+ } from "./chunk-OF3RKOPU.js";
10
10
  import {
11
11
  processAncestorSnapshot,
12
12
  processIdentity,