hyperframes 0.8.87 → 0.8.89

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 (98) hide show
  1. package/dist/{add-U6IYWNEI.js → add-JDX7VHMM.js} +5 -5
  2. package/dist/{asset-IVVTJRJ3.js → asset-ZQU3ZAHZ.js} +2 -2
  3. package/dist/{auth-B52RVHDK.js → auth-ZI5X6SXG.js} +1 -1
  4. package/dist/{autoUpdate-JE4IONTI.js → autoUpdate-BDREI4XN.js} +2 -2
  5. package/dist/{backgroundChecks-CGYRZGOR.js → backgroundChecks-52MY7SIC.js} +3 -3
  6. package/dist/backgroundChecksWorker.js +3 -3
  7. package/dist/{beats-E5V4HEFQ.js → beats-77Z6UPMB.js} +4 -4
  8. package/dist/{benchmark-5OYJMUXY.js → benchmark-HR242B6Q.js} +5 -5
  9. package/dist/{browser-ZCYC2U3H.js → browser-CLQNZB5J.js} +3 -3
  10. package/dist/{catalog-Q4L4P7VV.js → catalog-OAJVYTXP.js} +5 -5
  11. package/dist/{check-HM46YAG7.js → check-AJB25CBI.js} +9 -9
  12. package/dist/{checkBrowser-GMHXULQC.js → checkBrowser-RTZFBO62.js} +7 -7
  13. package/dist/{chunk-UUMXWC2H.js → chunk-BEZ5LKUM.js} +2 -2
  14. package/dist/{chunk-BQ4N7ECC.js → chunk-C22UJWNH.js} +1 -1
  15. package/dist/{chunk-NETMPMSJ.js → chunk-CZXT2DRB.js} +2 -2
  16. package/dist/{chunk-V3RCZR7L.js → chunk-EAJNP7C7.js} +1 -1
  17. package/dist/{chunk-VP53XFPD.js → chunk-ELQAAO4F.js} +1 -1
  18. package/dist/{chunk-KGEVE5JJ.js → chunk-J4ZDN5N7.js} +2 -2
  19. package/dist/{chunk-GMEL3UDG.js → chunk-LTCGOUKZ.js} +2 -2
  20. package/dist/{chunk-4MLISXWH.js → chunk-PKK6QWAQ.js} +1 -1
  21. package/dist/{chunk-C4LRCQ7O.js → chunk-RLKPZQKI.js} +2 -2
  22. package/dist/{chunk-V5643PWM.js → chunk-ROFOQAPQ.js} +2 -2
  23. package/dist/{chunk-O24S2D45.js → chunk-S2F6QM6J.js} +1 -1
  24. package/dist/{chunk-RXHJRTDQ.js → chunk-SAYNFMCN.js} +1 -1
  25. package/dist/{chunk-4GPB7TYV.js → chunk-TQNLHVZB.js} +2 -2
  26. package/dist/{chunk-S4NITUIE.js → chunk-XMDQQAIB.js} +1 -1
  27. package/dist/{chunk-OAT3NROY.js → chunk-Z4LBLZ3I.js} +2 -2
  28. package/dist/{clean-LG7EU4Z6.js → clean-YNSDX62K.js} +3 -3
  29. package/dist/cli.js +44 -44
  30. package/dist/{cloud-DQSKLPJH.js → cloud-O6C6D2CC.js} +4 -4
  31. package/dist/{compare-QOEPDS3E.js → compare-32ZYX7EU.js} +4 -4
  32. package/dist/{component-ZVGX6SCH.js → component-OX6ODG5G.js} +3 -3
  33. package/dist/{compositions-JVJO7CKJ.js → compositions-IAWH2EMO.js} +5 -5
  34. package/dist/{delete-573HEO7D.js → delete-4AGDWC2T.js} +2 -2
  35. package/dist/{doctor-MB6A7TN7.js → doctor-AH7IX5Z6.js} +3 -3
  36. package/dist/{events-Z6DV7LT7.js → events-6M6FDQZZ.js} +3 -3
  37. package/dist/{events-7F6C7O2R.js → events-CJRCDPWV.js} +2 -2
  38. package/dist/{feedback-ELSUXCWM.js → feedback-C6DJ6XKA.js} +4 -4
  39. package/dist/{figma-4NL4EZCF.js → figma-L5RHNGY7.js} +3 -3
  40. package/dist/fontLocalizeCli.js +1 -1
  41. package/dist/{get-4W2IN7H3.js → get-TBBCYF5B.js} +2 -2
  42. package/dist/{grade-compare-744LENMN.js → grade-compare-FNPPD6UE.js} +4 -4
  43. package/dist/{help-VET2A2JX.js → help-L4V4PV7C.js} +1 -1
  44. package/dist/{history-BWJH4567.js → history-EEWE52BC.js} +5 -5
  45. package/dist/hyperframes-player.global.js +1 -1
  46. package/dist/{info-TZZU5K44.js → info-VQYR7VW6.js} +5 -5
  47. package/dist/{init-5QPBGFAP.js → init-L5BK5HGZ.js} +6 -6
  48. package/dist/{inspect-ZKM46DT2.js → inspect-4DSMPUHN.js} +6 -6
  49. package/dist/{keyframes-L4PTFVRB.js → keyframes-AXHMLOSU.js} +5 -5
  50. package/dist/{layout-RCQKNYDP.js → layout-ZV23GQU6.js} +6 -6
  51. package/dist/{lint-FDUB6APN.js → lint-HZIRYUSA.js} +6 -6
  52. package/dist/{list-D6NIQOEY.js → list-DLBDHWZ2.js} +2 -2
  53. package/dist/{login-M6AWHM6U.js → login-3PLQRQEP.js} +4 -4
  54. package/dist/{media-treatment-MRNN2DOS.js → media-treatment-7TZ7L7NU.js} +5 -5
  55. package/dist/{normalize-audio-WB76C7OQ.js → normalize-audio-SX64JNLW.js} +4 -4
  56. package/dist/{play-N5FZSNGF.js → play-VX2LSHXR.js} +4 -4
  57. package/dist/{present-N24VMIWP.js → present-F2DPEKZU.js} +4 -4
  58. package/dist/{preview-RO3INI3V.js → preview-ARITZNNL.js} +5 -5
  59. package/dist/{render-FQ7VV2TU.js → render-2VWTXUCT.js} +5 -5
  60. package/dist/{render-FULEBKUN.js → render-FT4NTFKZ.js} +5 -5
  61. package/dist/skills/media-use/audio/references/bgm.md +2 -0
  62. package/dist/skills/media-use/audio/references/sfx.md +2 -3
  63. package/dist/skills/media-use/audio/references/tts.md +1 -1
  64. package/dist/skills/media-use/audio/scripts/audio.mjs +5 -2
  65. package/dist/skills/media-use/audio/scripts/audio.test.mjs +61 -8
  66. package/dist/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +14 -3
  67. package/dist/skills/media-use/audio/scripts/lib/bgm.mjs +8 -4
  68. package/dist/skills/media-use/audio/scripts/lib/bgm.test.mjs +45 -1
  69. package/dist/skills/media-use/audio/scripts/lib/media-record.mjs +43 -2
  70. package/dist/skills/media-use/audio/scripts/lib/media-record.test.mjs +54 -2
  71. package/dist/skills/media-use/audio/scripts/lib/sfx.mjs +36 -17
  72. package/dist/skills/media-use/audio/scripts/lib/sfx.test.mjs +53 -1
  73. package/dist/skills/media-use/scripts/lib/manifest.mjs +3 -0
  74. package/dist/skills/media-use/scripts/resolve.mjs +4 -4
  75. package/dist/{skills-JPRPPT3N.js → skills-KDD7E5CB.js} +5 -5
  76. package/dist/{skillsUpdateCheck-PPLBLSII.js → skillsUpdateCheck-DXGEK4AH.js} +3 -3
  77. package/dist/{snapshot-HBS2KVJV.js → snapshot-BSOD5KKR.js} +4 -4
  78. package/dist/studio/assets/{hyperframes-player-CtNVImMi.js → hyperframes-player-CVoS7kv8.js} +1 -1
  79. package/dist/studio/assets/{index-DZKcDAtf.js → index-BM8PwYby.js} +187 -187
  80. package/dist/studio/assets/{index-DJ-Ol7YS.js → index-D35-L_yn.js} +1 -1
  81. package/dist/studio/assets/{index-B_MF86RE.js → index-DBub9qQY.js} +1 -1
  82. package/dist/studio/{chunk-7PLTC6SV.js → chunk-KU4F7QZ3.js} +9 -1
  83. package/dist/studio/chunk-KU4F7QZ3.js.map +1 -0
  84. package/dist/studio/index.d.ts +42 -5
  85. package/dist/studio/index.html +1 -1
  86. package/dist/studio/index.js +269 -94
  87. package/dist/studio/index.js.map +1 -1
  88. package/dist/studio/player.js +1 -1
  89. package/dist/{studioServer-HIKBLJCQ.js → studioServer-2IK5LLRR.js} +4 -4
  90. package/dist/{telemetry-ZJ6VMRWN.js → telemetry-6P5WHWYI.js} +3 -3
  91. package/dist/{timeline-NMCFP4IO.js → timeline-QZ4Q2LED.js} +5 -5
  92. package/dist/{tokens-ILHCMG2C.js → tokens-VXZYKHFV.js} +2 -2
  93. package/dist/{transcribe-TC7XR5IS.js → transcribe-RQ6RHU2V.js} +3 -3
  94. package/dist/{updateCheck-D7C3KAJT.js → updateCheck-RRWEIZY7.js} +2 -2
  95. package/dist/{upgrade-ZGAFWJLS.js → upgrade-LI5TVSQQ.js} +2 -2
  96. package/dist/{validate-T243OVX2.js → validate-I56RAOC6.js} +6 -6
  97. package/package.json +1 -1
  98. package/dist/studio/chunk-7PLTC6SV.js.map +0 -1
@@ -6,13 +6,13 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-BQ4N7ECC.js";
9
+ } from "./chunk-C22UJWNH.js";
10
10
  import "./chunk-IHFUKJOR.js";
11
11
  import {
12
12
  ensureDOMParser
13
13
  } from "./chunk-PFCFR3KZ.js";
14
- import "./chunk-O24S2D45.js";
15
- import "./chunk-V3RCZR7L.js";
14
+ import "./chunk-S2F6QM6J.js";
15
+ import "./chunk-EAJNP7C7.js";
16
16
  import "./chunk-VWG7OQKU.js";
17
17
  import {
18
18
  c
@@ -47,12 +47,12 @@ import {
47
47
  } from "./chunk-2PSPARWP.js";
48
48
  import {
49
49
  withMeta
50
- } from "./chunk-RXHJRTDQ.js";
50
+ } from "./chunk-SAYNFMCN.js";
51
51
  import "./chunk-K4WIOZFP.js";
52
52
  import "./chunk-XUXGIA7H.js";
53
53
  import "./chunk-WERLJGIC.js";
54
54
  import "./chunk-ISN5GRYI.js";
55
- import "./chunk-OAT3NROY.js";
55
+ import "./chunk-Z4LBLZ3I.js";
56
56
  import "./chunk-KNU5COPB.js";
57
57
  import "./chunk-3GXQPCJC.js";
58
58
  import "./chunk-RQVDTPGD.js";
@@ -10,7 +10,7 @@ import {
10
10
  layout_default,
11
11
  loadBrowserScript,
12
12
  parseAt
13
- } from "./chunk-V5643PWM.js";
13
+ } from "./chunk-ROFOQAPQ.js";
14
14
  import "./chunk-6BPWGLCF.js";
15
15
  import "./chunk-XUHOIDKG.js";
16
16
  import "./chunk-I7MD2PC7.js";
@@ -23,7 +23,7 @@ import "./chunk-YEIFI443.js";
23
23
  import "./chunk-MIYTJ6RX.js";
24
24
  import "./chunk-HMQ27CEJ.js";
25
25
  import "./chunk-JVYVKXTA.js";
26
- import "./chunk-BQ4N7ECC.js";
26
+ import "./chunk-C22UJWNH.js";
27
27
  import "./chunk-IHFUKJOR.js";
28
28
  import "./chunk-PFCFR3KZ.js";
29
29
  import "./chunk-MEIIOQNR.js";
@@ -37,8 +37,8 @@ import "./chunk-PWAWHXTQ.js";
37
37
  import "./chunk-AWDFDFI3.js";
38
38
  import "./chunk-VBXD76KN.js";
39
39
  import "./chunk-XMNWWURD.js";
40
- import "./chunk-O24S2D45.js";
41
- import "./chunk-V3RCZR7L.js";
40
+ import "./chunk-S2F6QM6J.js";
41
+ import "./chunk-EAJNP7C7.js";
42
42
  import "./chunk-VWG7OQKU.js";
43
43
  import "./chunk-ZTZA4UWZ.js";
44
44
  import "./chunk-AP2WIRY6.js";
@@ -62,12 +62,12 @@ import "./chunk-PJ3HDUCY.js";
62
62
  import "./chunk-TQFG7HTI.js";
63
63
  import "./chunk-GK4AIFIH.js";
64
64
  import "./chunk-2PSPARWP.js";
65
- import "./chunk-RXHJRTDQ.js";
65
+ import "./chunk-SAYNFMCN.js";
66
66
  import "./chunk-K4WIOZFP.js";
67
67
  import "./chunk-XUXGIA7H.js";
68
68
  import "./chunk-WERLJGIC.js";
69
69
  import "./chunk-ISN5GRYI.js";
70
- import "./chunk-OAT3NROY.js";
70
+ import "./chunk-Z4LBLZ3I.js";
71
71
  import "./chunk-KNU5COPB.js";
72
72
  import "./chunk-3GXQPCJC.js";
73
73
  import "./chunk-RQVDTPGD.js";
@@ -6,16 +6,16 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  trackLintRun
9
- } from "./chunk-4GPB7TYV.js";
9
+ } from "./chunk-TQNLHVZB.js";
10
10
  import {
11
11
  resolveProject
12
- } from "./chunk-BQ4N7ECC.js";
12
+ } from "./chunk-C22UJWNH.js";
13
13
  import {
14
14
  formatLintFindings
15
15
  } from "./chunk-6CSYCFQV.js";
16
16
  import "./chunk-IHFUKJOR.js";
17
- import "./chunk-O24S2D45.js";
18
- import "./chunk-V3RCZR7L.js";
17
+ import "./chunk-S2F6QM6J.js";
18
+ import "./chunk-EAJNP7C7.js";
19
19
  import "./chunk-VWG7OQKU.js";
20
20
  import {
21
21
  c
@@ -50,12 +50,12 @@ import "./chunk-GK4AIFIH.js";
50
50
  import "./chunk-2PSPARWP.js";
51
51
  import {
52
52
  withMeta
53
- } from "./chunk-RXHJRTDQ.js";
53
+ } from "./chunk-SAYNFMCN.js";
54
54
  import "./chunk-K4WIOZFP.js";
55
55
  import "./chunk-XUXGIA7H.js";
56
56
  import "./chunk-WERLJGIC.js";
57
57
  import "./chunk-ISN5GRYI.js";
58
- import "./chunk-OAT3NROY.js";
58
+ import "./chunk-Z4LBLZ3I.js";
59
59
  import "./chunk-KNU5COPB.js";
60
60
  import "./chunk-3GXQPCJC.js";
61
61
  import "./chunk-RQVDTPGD.js";
@@ -30,12 +30,12 @@ import {
30
30
  } from "./chunk-PBN6GBJE.js";
31
31
  import {
32
32
  withMeta
33
- } from "./chunk-RXHJRTDQ.js";
33
+ } from "./chunk-SAYNFMCN.js";
34
34
  import "./chunk-K4WIOZFP.js";
35
35
  import "./chunk-XUXGIA7H.js";
36
36
  import "./chunk-WERLJGIC.js";
37
37
  import "./chunk-ISN5GRYI.js";
38
- import "./chunk-OAT3NROY.js";
38
+ import "./chunk-Z4LBLZ3I.js";
39
39
  import "./chunk-KNU5COPB.js";
40
40
  import "./chunk-M2WBOQ2Q.js";
41
41
 
@@ -113,7 +113,7 @@ function assertAttendedDeviceFlow() {
113
113
  async function runDeviceLogin() {
114
114
  assertAttendedDeviceFlow();
115
115
  assertOAuthConfiguredOrExit();
116
- const { trackAuthLoginStarted, trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-ZJ6VMRWN.js");
116
+ const { trackAuthLoginStarted, trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-6P5WHWYI.js");
117
117
  trackAuthLoginStarted("device");
118
118
  let tokens;
119
119
  try {
@@ -178,7 +178,7 @@ async function revokeDeviceTokens(tokens) {
178
178
  }
179
179
  async function runOAuthLogin() {
180
180
  assertOAuthConfiguredOrExit();
181
- const { trackAuthLoginStarted, trackAuthLoginFailed } = await import("./telemetry-ZJ6VMRWN.js");
181
+ const { trackAuthLoginStarted, trackAuthLoginFailed } = await import("./telemetry-6P5WHWYI.js");
182
182
  trackAuthLoginStarted("oauth");
183
183
  try {
184
184
  await startAuthorizationCodeFlow();
@@ -191,7 +191,7 @@ async function runOAuthLogin() {
191
191
  await reportIdentity();
192
192
  }
193
193
  async function reportIdentity() {
194
- const { trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-ZJ6VMRWN.js");
194
+ const { trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-6P5WHWYI.js");
195
195
  const credential = await tryResolveCredential();
196
196
  if (!credential) {
197
197
  trackAuthLoginFailed("oauth", "no_credential");
@@ -248,7 +248,7 @@ async function clearUserInfoBestEffort() {
248
248
  }
249
249
  }
250
250
  async function runApiKeyLogin(inlineKey) {
251
- const { trackAuthLoginStarted, trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-ZJ6VMRWN.js");
251
+ const { trackAuthLoginStarted, trackAuthLoginCompleted, trackAuthLoginFailed, identifyUser } = await import("./telemetry-6P5WHWYI.js");
252
252
  trackAuthLoginStarted("api_key");
253
253
  let key;
254
254
  try {
@@ -12,15 +12,15 @@ import {
12
12
  } from "./chunk-HMQ27CEJ.js";
13
13
  import {
14
14
  resolveProject
15
- } from "./chunk-BQ4N7ECC.js";
15
+ } from "./chunk-C22UJWNH.js";
16
16
  import "./chunk-IHFUKJOR.js";
17
17
  import {
18
18
  findFFmpeg,
19
19
  findFFprobe,
20
20
  getFFmpegInstallHint
21
21
  } from "./chunk-TVCRUG2S.js";
22
- import "./chunk-O24S2D45.js";
23
- import "./chunk-V3RCZR7L.js";
22
+ import "./chunk-S2F6QM6J.js";
23
+ import "./chunk-EAJNP7C7.js";
24
24
  import "./chunk-VWG7OQKU.js";
25
25
  import {
26
26
  c
@@ -68,12 +68,12 @@ import {
68
68
  import "./chunk-2PSPARWP.js";
69
69
  import {
70
70
  withMeta
71
- } from "./chunk-RXHJRTDQ.js";
71
+ } from "./chunk-SAYNFMCN.js";
72
72
  import "./chunk-K4WIOZFP.js";
73
73
  import "./chunk-XUXGIA7H.js";
74
74
  import "./chunk-WERLJGIC.js";
75
75
  import "./chunk-ISN5GRYI.js";
76
- import "./chunk-OAT3NROY.js";
76
+ import "./chunk-Z4LBLZ3I.js";
77
77
  import {
78
78
  normalizeErrorMessage
79
79
  } from "./chunk-KNU5COPB.js";
@@ -6,10 +6,10 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  resolveProject
9
- } from "./chunk-BQ4N7ECC.js";
9
+ } from "./chunk-C22UJWNH.js";
10
10
  import "./chunk-IHFUKJOR.js";
11
- import "./chunk-O24S2D45.js";
12
- import "./chunk-V3RCZR7L.js";
11
+ import "./chunk-S2F6QM6J.js";
12
+ import "./chunk-EAJNP7C7.js";
13
13
  import "./chunk-VWG7OQKU.js";
14
14
  import {
15
15
  c
@@ -46,7 +46,7 @@ import "./chunk-K4WIOZFP.js";
46
46
  import "./chunk-XUXGIA7H.js";
47
47
  import "./chunk-WERLJGIC.js";
48
48
  import "./chunk-ISN5GRYI.js";
49
- import "./chunk-OAT3NROY.js";
49
+ import "./chunk-Z4LBLZ3I.js";
50
50
  import "./chunk-KNU5COPB.js";
51
51
  import "./chunk-3GXQPCJC.js";
52
52
  import "./chunk-RQVDTPGD.js";
@@ -37,7 +37,7 @@ import {
37
37
  } from "./chunk-LFGJWOVA.js";
38
38
  import {
39
39
  resolveProject
40
- } from "./chunk-BQ4N7ECC.js";
40
+ } from "./chunk-C22UJWNH.js";
41
41
  import "./chunk-IHFUKJOR.js";
42
42
  import {
43
43
  resolveAutoProxy
@@ -56,8 +56,8 @@ import "./chunk-PWAWHXTQ.js";
56
56
  import "./chunk-AWDFDFI3.js";
57
57
  import "./chunk-VBXD76KN.js";
58
58
  import "./chunk-XMNWWURD.js";
59
- import "./chunk-O24S2D45.js";
60
- import "./chunk-V3RCZR7L.js";
59
+ import "./chunk-S2F6QM6J.js";
60
+ import "./chunk-EAJNP7C7.js";
61
61
  import "./chunk-VWG7OQKU.js";
62
62
  import {
63
63
  c
@@ -91,7 +91,7 @@ import "./chunk-K4WIOZFP.js";
91
91
  import "./chunk-XUXGIA7H.js";
92
92
  import "./chunk-WERLJGIC.js";
93
93
  import "./chunk-ISN5GRYI.js";
94
- import "./chunk-OAT3NROY.js";
94
+ import "./chunk-Z4LBLZ3I.js";
95
95
  import "./chunk-KNU5COPB.js";
96
96
  import "./chunk-3GXQPCJC.js";
97
97
  import "./chunk-RQVDTPGD.js";
@@ -22,7 +22,7 @@ import {
22
22
  } from "./chunk-LFGJWOVA.js";
23
23
  import {
24
24
  resolveProject
25
- } from "./chunk-BQ4N7ECC.js";
25
+ } from "./chunk-C22UJWNH.js";
26
26
  import "./chunk-IHFUKJOR.js";
27
27
  import {
28
28
  R,
@@ -30,8 +30,8 @@ import {
30
30
  ge
31
31
  } from "./chunk-WMQNIQDJ.js";
32
32
  import "./chunk-XMNWWURD.js";
33
- import "./chunk-O24S2D45.js";
34
- import "./chunk-V3RCZR7L.js";
33
+ import "./chunk-S2F6QM6J.js";
34
+ import "./chunk-EAJNP7C7.js";
35
35
  import "./chunk-VWG7OQKU.js";
36
36
  import {
37
37
  c
@@ -65,7 +65,7 @@ import "./chunk-K4WIOZFP.js";
65
65
  import "./chunk-XUXGIA7H.js";
66
66
  import "./chunk-WERLJGIC.js";
67
67
  import "./chunk-ISN5GRYI.js";
68
- import "./chunk-OAT3NROY.js";
68
+ import "./chunk-Z4LBLZ3I.js";
69
69
  import "./chunk-KNU5COPB.js";
70
70
  import "./chunk-3GXQPCJC.js";
71
71
  import "./chunk-RQVDTPGD.js";
@@ -12,7 +12,7 @@ import {
12
12
  import {
13
13
  resolveProject,
14
14
  resolveProjectOrThrow
15
- } from "./chunk-BQ4N7ECC.js";
15
+ } from "./chunk-C22UJWNH.js";
16
16
  import {
17
17
  formatLintStartupMessage
18
18
  } from "./chunk-6CSYCFQV.js";
@@ -42,8 +42,8 @@ import "./chunk-FWDM3N34.js";
42
42
  import "./chunk-PWAWHXTQ.js";
43
43
  import "./chunk-AWDFDFI3.js";
44
44
  import "./chunk-VBXD76KN.js";
45
- import "./chunk-O24S2D45.js";
46
- import "./chunk-V3RCZR7L.js";
45
+ import "./chunk-S2F6QM6J.js";
46
+ import "./chunk-EAJNP7C7.js";
47
47
  import "./chunk-VWG7OQKU.js";
48
48
  import {
49
49
  c
@@ -88,7 +88,7 @@ import "./chunk-WERLJGIC.js";
88
88
  import {
89
89
  isDevMode
90
90
  } from "./chunk-ISN5GRYI.js";
91
- import "./chunk-OAT3NROY.js";
91
+ import "./chunk-Z4LBLZ3I.js";
92
92
  import {
93
93
  normalizeErrorMessage
94
94
  } from "./chunk-KNU5COPB.js";
@@ -1578,7 +1578,7 @@ async function runLocalStudioMode(dir, options) {
1578
1578
  return waitForStudioChildClose(child);
1579
1579
  }
1580
1580
  async function runEmbeddedMode(dir, startPort, options) {
1581
- const { createStudioServer, loadPreviewServerBuildSignature, resolveStudioBundle } = await import("./studioServer-HIKBLJCQ.js");
1581
+ const { createStudioServer, loadPreviewServerBuildSignature, resolveStudioBundle } = await import("./studioServer-2IK5LLRR.js");
1582
1582
  const pName = options?.projectName ?? basename(dir);
1583
1583
  const studioBundle = resolveStudioBundle();
1584
1584
  if (!options?.json) ge(c.bold("hyperframes preview"));
@@ -6,7 +6,7 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  maybePromptRenderFeedback
9
- } from "./chunk-C4LRCQ7O.js";
9
+ } from "./chunk-RLKPZQKI.js";
10
10
  import {
11
11
  reportVariableIssues,
12
12
  resolveVariablesArg,
@@ -32,7 +32,7 @@ import {
32
32
  import "./chunk-YEIFI443.js";
33
33
  import {
34
34
  resolveProject
35
- } from "./chunk-BQ4N7ECC.js";
35
+ } from "./chunk-C22UJWNH.js";
36
36
  import {
37
37
  formatLintStartupMessage
38
38
  } from "./chunk-6CSYCFQV.js";
@@ -79,8 +79,8 @@ import {
79
79
  trackRenderError,
80
80
  trackRenderObservation,
81
81
  trackRenderPreflightRejected
82
- } from "./chunk-O24S2D45.js";
83
- import "./chunk-V3RCZR7L.js";
82
+ } from "./chunk-S2F6QM6J.js";
83
+ import "./chunk-EAJNP7C7.js";
84
84
  import "./chunk-VWG7OQKU.js";
85
85
  import {
86
86
  c
@@ -160,7 +160,7 @@ import {
160
160
  } from "./chunk-ISN5GRYI.js";
161
161
  import {
162
162
  VERSION
163
- } from "./chunk-OAT3NROY.js";
163
+ } from "./chunk-Z4LBLZ3I.js";
164
164
  import {
165
165
  normalizeErrorMessage
166
166
  } from "./chunk-KNU5COPB.js";
@@ -37,15 +37,15 @@ import "./chunk-RZAXPDIT.js";
37
37
  import "./chunk-DNXD7TOA.js";
38
38
  import {
39
39
  resolveProject
40
- } from "./chunk-BQ4N7ECC.js";
40
+ } from "./chunk-C22UJWNH.js";
41
41
  import {
42
42
  errorBox,
43
43
  formatBytes,
44
44
  formatDuration
45
45
  } from "./chunk-IHFUKJOR.js";
46
46
  import "./chunk-PFCFR3KZ.js";
47
- import "./chunk-O24S2D45.js";
48
- import "./chunk-V3RCZR7L.js";
47
+ import "./chunk-S2F6QM6J.js";
48
+ import "./chunk-EAJNP7C7.js";
49
49
  import "./chunk-VWG7OQKU.js";
50
50
  import {
51
51
  c
@@ -75,12 +75,12 @@ import "./chunk-GK4AIFIH.js";
75
75
  import "./chunk-2PSPARWP.js";
76
76
  import {
77
77
  withMeta
78
- } from "./chunk-RXHJRTDQ.js";
78
+ } from "./chunk-SAYNFMCN.js";
79
79
  import "./chunk-K4WIOZFP.js";
80
80
  import "./chunk-XUXGIA7H.js";
81
81
  import "./chunk-WERLJGIC.js";
82
82
  import "./chunk-ISN5GRYI.js";
83
- import "./chunk-OAT3NROY.js";
83
+ import "./chunk-Z4LBLZ3I.js";
84
84
  import {
85
85
  normalizeErrorMessage
86
86
  } from "./chunk-KNU5COPB.js";
@@ -15,6 +15,8 @@ One music bed per composition, produced by the shared audio engine (`scripts/aud
15
15
  - **`query`** — the mood, used for retrieval and as a fallback prompt seed (e.g. a storyboard's `music:` field, falling back to `message` → `arc` → `"calm cinematic underscore"`).
16
16
  - **`prompt`** — an explicit full prompt for generation; omit and the engine infers one (see Mood inference). Optional `blob` / `archetype` / `arc` feed that inference.
17
17
 
18
+ Both routes keep a file of yours already at the output name: the engine writes the next free name (`track-2.mp3`), reports it as an anomaly, and `bgm.path` carries the real path.
19
+
18
20
  ## HeyGen retrieval (default)
19
21
 
20
22
  `searchSounds(query, "music", { limit: 5 })` → `GET /audio/sounds?query=<mood>&type=music&limit=5`. Take the top result (ranked by `score`), download its presigned `audio_url` → `assets/bgm/track.mp3`. Synchronous. No match → skip (BGM is optional; never fail the render over it). Cue written to `audio_meta.json`:
@@ -16,15 +16,14 @@ Each line names the effects it wants: `lines[].sfx: ["whoosh", "ui click"]`. The
16
16
  "id": "3", // joins the cue to the caller's model (frame / scene / segment)
17
17
  "name": "whoosh",
18
18
  "file": "assets/sfx/whoosh.mp3", // downloaded or copied, relative to project root
19
- "source": "heygen" | "local" | "project", // which route resolved it; "project": a file already
20
- // in assets/sfx under that name that is not the library's copy
19
+ "source": "heygen" | "local", // which route resolved it
21
20
  "offset_s": 0, // delay from the line's start
22
21
  "duration_s": 0.57,
23
22
  "volume": 0.35 // SFX sit UNDER voice + BGM
24
23
  }
25
24
  ```
26
25
 
27
- A cue that matches nothing is **skipped** (recorded as an anomaly); SFX never blocks a render.
26
+ A cue that matches nothing is **skipped** (recorded as an anomaly); SFX never blocks a render. Neither route replaces a file of yours already at the output name: the cue gets the next free name (`whoosh-2.mp3`), reported as an anomaly, and `file` carries the real path.
28
27
 
29
28
  ## HeyGen retrieval (credentialed)
30
29
 
@@ -135,7 +135,7 @@ node <SKILL_DIR>/audio/scripts/audio.mjs \
135
135
  --request ./audio_request.json --hyperframes . --out ./audio_meta.json --only tts
136
136
  ```
137
137
 
138
- The engine saves `assets/voice/intro.wav`, measures its duration, and transcribes
138
+ The engine saves `assets/voice/intro.wav` (or `intro-2.wav` when a file of yours already has that name; `voices[].path` says which), measures its duration, and transcribes
139
139
  it into `voices[].words` in `audio_meta.json`. Check that every requested line
140
140
  has audio and nonempty word timings before building a captioned video. Review
141
141
  the timings against the actual audio; transcription is estimated alignment,
@@ -55,7 +55,7 @@ import { generateBgmDetached, inferBgmPrompt, retrieveBgm } from "./lib/bgm.mjs"
55
55
  import { resolveSfx } from "./lib/sfx.mjs";
56
56
  import { mapWithConcurrency } from "./lib/concurrency.mjs";
57
57
  import { openAudioMeta } from "./lib/audio-meta.mjs";
58
- import { recordInManifest, writtenAssets } from "./lib/media-record.mjs";
58
+ import { recordInManifest, voicePaths, writtenAssets } from "./lib/media-record.mjs";
59
59
 
60
60
  const HERE = dirname(fileURLToPath(import.meta.url));
61
61
  const argv = process.argv.slice(2);
@@ -138,6 +138,7 @@ if (only.has("tts") && lines.length) {
138
138
  lang,
139
139
  });
140
140
  console.error(`· tts: ${ttsProvider} · voice ${voiceId} · ${lines.length} line(s)`);
141
+ const paths = voicePaths(hyperframesDir, lines, anomalies);
141
142
  const synthLine = async (line) => {
142
143
  const id = String(line.id);
143
144
  const text = String(line.text ?? "").trim();
@@ -145,7 +146,7 @@ if (only.has("tts") && lines.length) {
145
146
  anomalies.push(`line ${id}: empty text — skipped`);
146
147
  return null;
147
148
  }
148
- const rel = `assets/voice/${id}.wav`;
149
+ const rel = paths.get(id);
149
150
  const abs = join(hyperframesDir, rel);
150
151
  const { ok, words, error } = await synthesizeOne({
151
152
  provider: ttsProvider,
@@ -217,6 +218,7 @@ if (only.has("bgm")) {
217
218
  headers: heygenAuthHeaders(),
218
219
  hyperframesDir,
219
220
  hasVoice,
221
+ anomalies,
220
222
  });
221
223
  if (bgm) {
222
224
  bgmFields.bgm_provider = "heygen";
@@ -243,6 +245,7 @@ if (only.has("bgm")) {
243
245
  lyriaRecipe: existsSync(lyriaRecipe) ? lyriaRecipe : null,
244
246
  seedSeconds,
245
247
  hasVoice,
248
+ anomalies,
246
249
  });
247
250
  if (gen.disabled) {
248
251
  anomalies.push(`bgm: ${gen.reason}`);
@@ -1,9 +1,10 @@
1
1
  import { strict as assert } from "node:assert";
2
2
  import { test } from "node:test";
3
- import { mkdtempSync, rmSync, existsSync, writeFileSync } from "node:fs";
3
+ import { mkdtempSync, mkdirSync, readFileSync, rmSync, existsSync, writeFileSync } from "node:fs";
4
4
  import { join, dirname } from "node:path";
5
5
  import { tmpdir } from "node:os";
6
6
  import { fileURLToPath } from "node:url";
7
+ import { recordInManifest } from "./lib/media-record.mjs";
7
8
  import { resolveSfx } from "./lib/sfx.mjs";
8
9
 
9
10
  // Proves the relocated engine (skills/media-use/audio/) still resolves its
@@ -48,9 +49,12 @@ test("an unknown cue is reported, not fatal", async () => {
48
49
  }
49
50
  });
50
51
 
51
- test("a person's own file under a bundled name is not labelled as the library's", async () => {
52
+ test("a person's own file under a bundled name survives, and the cue gets the next free name", async () => {
52
53
  const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
53
54
  try {
55
+ const own = join(dir, "assets", "sfx", "whoosh.mp3");
56
+ mkdirSync(dirname(own), { recursive: true });
57
+ writeFileSync(own, "the person's own whoosh");
54
58
  const resolve = () =>
55
59
  resolveSfx({
56
60
  cues: [{ id: "1", name: "whoosh" }],
@@ -58,16 +62,65 @@ test("a person's own file under a bundled name is not labelled as the library's"
58
62
  hyperframesDir: dir,
59
63
  sfxLibDir,
60
64
  });
61
- const copied = await resolve();
62
- const reused = await resolve();
63
- writeFileSync(join(dir, copied.sfx[0].file), "the person's own whoosh");
64
- const own = await resolve();
65
65
 
66
+ const first = await resolve();
67
+ const second = await resolve();
68
+
69
+ assert.equal(readFileSync(own, "utf8"), "the person's own whoosh");
70
+ assert.deepEqual(
71
+ [first, second].map(({ sfx }) => [sfx[0].file, sfx[0].source]),
72
+ [
73
+ ["assets/sfx/whoosh-2.mp3", "local"],
74
+ ["assets/sfx/whoosh-2.mp3", "local"],
75
+ ],
76
+ );
66
77
  assert.deepEqual(
67
- [copied, reused, own].map(({ sfx }) => sfx[0].source),
68
- ["local", "local", "project"],
78
+ readFileSync(join(dir, "assets/sfx/whoosh-2.mp3")),
79
+ readFileSync(join(sfxLibDir, "whoosh.mp3")),
69
80
  );
70
81
  } finally {
71
82
  rmSync(dir, { recursive: true, force: true });
72
83
  }
73
84
  });
85
+
86
+ test("two effects never share a file when one's name is taken by the person, run after run", async () => {
87
+ const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
88
+ try {
89
+ mkdirSync(join(dir, "assets", "sfx"), { recursive: true });
90
+ writeFileSync(join(dir, "assets", "sfx", "glitch.mp3"), "the person's own glitch");
91
+ const realFetch = globalThis.fetch;
92
+ globalThis.fetch = async (url) => {
93
+ const query = new URL(url).searchParams.get("query");
94
+ if (query)
95
+ return Response.json({ data: [{ audio_url: `https://sound.test/${query}`, score: 0.6 }] });
96
+ return new Response(`bytes of ${new URL(url).pathname}`);
97
+ };
98
+ const run = async (names) => {
99
+ const { sfx } = await resolveSfx({
100
+ cues: names.map((name, index) => ({ id: String(index), name })),
101
+ heygenOK: true,
102
+ headers: {},
103
+ hyperframesDir: dir,
104
+ sfxLibDir,
105
+ });
106
+ const files = sfx.map(({ file }) => file);
107
+ recordInManifest(
108
+ dir,
109
+ [...new Set(files)].map((path) => ({ path, type: "sfx", source: "search" })),
110
+ );
111
+ return files;
112
+ };
113
+ try {
114
+ assert.deepEqual(await run(["glitch"]), ["assets/sfx/glitch-2.mp3"]);
115
+ assert.deepEqual(await run(["glitch", "glitch 2", "glitch"]), [
116
+ "assets/sfx/glitch-2.mp3",
117
+ "assets/sfx/glitch-2-2.mp3",
118
+ "assets/sfx/glitch-2.mp3",
119
+ ]);
120
+ } finally {
121
+ globalThis.fetch = realFetch;
122
+ }
123
+ } finally {
124
+ rmSync(dir, { recursive: true, force: true });
125
+ }
126
+ });
@@ -9,9 +9,15 @@ import { spawnSync } from "node:child_process";
9
9
  // external audio tools are fixtures. This is not a live synthesis/render test.
10
10
  for (const expired of [false, true]) {
11
11
  for (const only of ["tts", "tts,bgm,sfx"]) {
12
+ // With expired credentials the person already has an assets/voice/intro.wav, which the engine must keep.
13
+ const voicePath = expired ? "assets/voice/intro-2.wav" : "assets/voice/intro.wav";
12
14
  test(`Gemini engine returns caption metadata with ${expired ? "expired" : "absent"} HeyGen credentials (${only})`, (t) => {
13
15
  const dir = mkdtempSync(join(tmpdir(), "hf-gemini-pipeline-"));
14
16
  t.after(() => rmSync(dir, { recursive: true, force: true }));
17
+ if (expired) {
18
+ mkdirSync(join(dir, "assets/voice"), { recursive: true });
19
+ writeFileSync(join(dir, "assets/voice/intro.wav"), "the person's own intro");
20
+ }
15
21
  const config = join(dir, "heygen");
16
22
  mkdirSync(config);
17
23
  if (expired)
@@ -48,7 +54,7 @@ const assert = require('node:assert/strict');
48
54
  const fs = require('node:fs');
49
55
  const path = require('node:path');
50
56
  const args = process.argv.slice(2);
51
- assert.deepEqual(args.slice(0, 3), ['hyperframes', 'transcribe', 'assets/voice/intro.wav']);
57
+ assert.deepEqual(args.slice(0, 3), ['hyperframes', 'transcribe', '${voicePath}']);
52
58
  assert.ok(fs.existsSync(args[2]));
53
59
  assert.equal(args[args.indexOf('--model')+1], 'small.en');
54
60
  fs.writeFileSync(path.join(args[args.indexOf('--dir')+1], 'transcript.json'), JSON.stringify([
@@ -99,7 +105,7 @@ fs.writeFileSync(path.join(args[args.indexOf('--dir')+1], 'transcript.json'), JS
99
105
  assert.deepEqual(meta.voices, [
100
106
  {
101
107
  id: "intro",
102
- path: "assets/voice/intro.wav",
108
+ path: voicePath,
103
109
  duration_s: 1.25,
104
110
  words: [
105
111
  { id: "w0", text: "Hello", start: 0.1, end: 0.4 },
@@ -113,8 +119,13 @@ fs.writeFileSync(path.join(args[args.indexOf('--dir')+1], 'transcript.json'), JS
113
119
  manifest
114
120
  .map((line) => JSON.parse(line))
115
121
  .map(({ path, type, source }) => [path, type, source]),
116
- [["assets/voice/intro.wav", "voice", "generated"]],
122
+ [[voicePath, "voice", "generated"]],
117
123
  );
124
+ if (expired)
125
+ assert.equal(
126
+ readFileSync(join(dir, "assets/voice/intro.wav"), "utf8"),
127
+ "the person's own intro",
128
+ );
118
129
  });
119
130
  }
120
131
  }