hyperframes 0.8.121 → 0.8.123

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 (176) hide show
  1. package/dist/{add-CGDIT7CT.js → add-CJXLRVWK.js} +16 -16
  2. package/dist/{animatedGifPrep-KPT5VB5Q.js → animatedGifPrep-VHXPTSJL.js} +7 -7
  3. package/dist/{asset-6ZAZIWA7.js → asset-KTRZSJ5R.js} +2 -2
  4. package/dist/{assetCataloger-FWWCXIEX.js → assetCataloger-NH6UQG4Y.js} +3 -3
  5. package/dist/{auth-W4WZ5KT2.js → auth-T52MOHC7.js} +2 -2
  6. package/dist/{autoUpdate-2KRUUCM2.js → autoUpdate-EI6JX53V.js} +2 -2
  7. package/dist/{backgroundChecks-M7YRL5G3.js → backgroundChecks-7N3FFYIV.js} +3 -3
  8. package/dist/backgroundChecksWorker.js +3 -3
  9. package/dist/{batchRender-2HXYPO62.js → batchRender-JDH4PXPD.js} +4 -4
  10. package/dist/{beats-KXLHRYXV.js → beats-TG2TOST6.js} +13 -13
  11. package/dist/{benchmark-TZRC6JEE.js → benchmark-WGXMGPUI.js} +13 -13
  12. package/dist/{browser-KFCZEHSG.js → browser-VMEADLNK.js} +10 -10
  13. package/dist/{bundleWithLocalizedFonts-3RRACCEV.js → bundleWithLocalizedFonts-EDBQ5EME.js} +2 -2
  14. package/dist/{capture-N25LJPGM.js → capture-22IWCYV2.js} +2 -2
  15. package/dist/{capture-3L7VTWDG.js → capture-UZFI2G65.js} +10 -10
  16. package/dist/{catalog-OJK3RAMA.js → catalog-3V4SSSYE.js} +16 -16
  17. package/dist/{check-DUQ2OHRX.js → check-LTKOTPFI.js} +33 -34
  18. package/dist/{checkBrowser-XHNFT3DB.js → checkBrowser-LTZPCRBO.js} +36 -37
  19. package/dist/{chunk-YJMQLWG4.js → chunk-24AS45UQ.js} +58 -38
  20. package/dist/{chunk-E5XIJTMU.js → chunk-2FH6HOQ2.js} +1 -1
  21. package/dist/{chunk-5OS5XIWZ.js → chunk-2QAAOW5T.js} +23 -1
  22. package/dist/{chunk-44EFU366.js → chunk-3SHYUYXR.js} +12 -14
  23. package/dist/{chunk-IVLJE3VX.js → chunk-3V6V66SZ.js} +2 -2
  24. package/dist/{chunk-XLG5C3XA.js → chunk-4EZKLNMD.js} +1 -1
  25. package/dist/{chunk-DISNXEWU.js → chunk-4TIUZ6Z7.js} +2 -2
  26. package/dist/{chunk-6Z4E4GBX.js → chunk-4XAAOWFC.js} +1 -1
  27. package/dist/chunk-53IO4HLZ.js +3541 -0
  28. package/dist/{chunk-2C6UJPQS.js → chunk-73KPBRCO.js} +1 -1
  29. package/dist/{chunk-NPHNGWJH.js → chunk-7NWNDQID.js} +3 -3
  30. package/dist/{chunk-WW7V2GQJ.js → chunk-AICUP6TU.js} +2 -2
  31. package/dist/chunk-AMV2OPXR.js +82 -0
  32. package/dist/{chunk-JACPHNUK.js → chunk-BET5FXMM.js} +1 -1
  33. package/dist/{chunk-7VXU7E5S.js → chunk-CZRQH5SP.js} +1 -1
  34. package/dist/{chunk-2LWWIDPZ.js → chunk-DR7F77AN.js} +1 -1
  35. package/dist/{chunk-KYDM3W7A.js → chunk-E26WHQFM.js} +2 -2
  36. package/dist/{chunk-AA4KEZGW.js → chunk-EJF6CESB.js} +1 -1
  37. package/dist/{chunk-JWHQKTVG.js → chunk-ELHC6CLH.js} +3 -3
  38. package/dist/{chunk-5PTKFXAS.js → chunk-EYNWMEWX.js} +13 -11
  39. package/dist/{chunk-FSLYPQ5Z.js → chunk-F7MXHGU3.js} +6 -5
  40. package/dist/{chunk-NRTZ2JPC.js → chunk-GA46NF76.js} +1 -1
  41. package/dist/{chunk-SJ64QY5Z.js → chunk-GPUM6BRL.js} +2 -2
  42. package/dist/{chunk-ZUVO6Q5Q.js → chunk-HISVSZH7.js} +2 -2
  43. package/dist/{chunk-BN5KOC5O.js → chunk-ILOJE2TE.js} +1 -1
  44. package/dist/{chunk-GF4MOYGU.js → chunk-IML47HIH.js} +20 -12
  45. package/dist/{chunk-JREV7WVY.js → chunk-IOMMM4AX.js} +1 -1
  46. package/dist/{chunk-4JC7LDBQ.js → chunk-KQ7BAEVP.js} +3 -3
  47. package/dist/{chunk-3WXWL7AY.js → chunk-MBSCHJQZ.js} +1 -1
  48. package/dist/{chunk-RYSHGEZL.js → chunk-MUAFAG77.js} +4 -4
  49. package/dist/{chunk-NITBGIHR.js → chunk-N4RVOW43.js} +2 -2
  50. package/dist/{chunk-TRLP3CSL.js → chunk-NSVHO5LZ.js} +6 -5
  51. package/dist/{chunk-2GKO3X7F.js → chunk-NSY245QZ.js} +1 -1
  52. package/dist/{chunk-3DCZIHXE.js → chunk-OCH6V4FB.js} +4 -4
  53. package/dist/{chunk-JWGYWJ5F.js → chunk-PQQZNS5K.js} +1 -1
  54. package/dist/{chunk-VU4KRDRL.js → chunk-PUFPAYTJ.js} +1 -1
  55. package/dist/{chunk-YE5UC4XH.js → chunk-QLKCB3NY.js} +7 -7
  56. package/dist/{chunk-LZN67SFR.js → chunk-RTINVJNS.js} +1 -1
  57. package/dist/{chunk-GPGWCFIA.js → chunk-RYP46ARK.js} +53 -2
  58. package/dist/{chunk-6WIWCYD5.js → chunk-S3JOM6L4.js} +3 -3
  59. package/dist/{chunk-S6Y2LOTE.js → chunk-SKZ6H3JT.js} +1 -1
  60. package/dist/{chunk-RCNDZEBU.js → chunk-TLA5RBEB.js} +2 -2
  61. package/dist/{chunk-WBRDOH4A.js → chunk-UI2I6ZQE.js} +1 -1
  62. package/dist/{chunk-OWPHLEDI.js → chunk-UMMVYWDI.js} +5 -5
  63. package/dist/{chunk-2XV3S6TA.js → chunk-VEGNMQZI.js} +2 -2
  64. package/dist/{chunk-MNMD6XLG.js → chunk-WAD4ACBZ.js} +3 -3
  65. package/dist/{chunk-ZBMQOBQK.js → chunk-XIJTGR4O.js} +1 -1
  66. package/dist/{chunk-WG4IZWEH.js → chunk-XQSMY5HF.js} +2 -2
  67. package/dist/{chunk-2CGUG4XK.js → chunk-Z3SUEG2T.js} +11 -9
  68. package/dist/{clean-NH5JTTXP.js → clean-YZQXCSXZ.js} +17 -17
  69. package/dist/cli.js +52 -51
  70. package/dist/{cloud-QKM43VWA.js → cloud-TYUXSEGA.js} +4 -4
  71. package/dist/{cloudrun-JQCGTNFP.js → cloudrun-MA2JVRHV.js} +5 -5
  72. package/dist/{compare-2ZOO6GRL.js → compare-6DSDY2IF.js} +27 -28
  73. package/dist/{compiler-WNWCQTI6.js → compiler-4FHYKPNR.js} +7 -3
  74. package/dist/{component-Q5AECWP4.js → component-NY4JERQ5.js} +3 -3
  75. package/dist/{compositions-KEMPAOSU.js → compositions-SI2SKZAF.js} +12 -12
  76. package/dist/{delete-TWGIIVHU.js → delete-YU7XRF6M.js} +2 -2
  77. package/dist/{deterministicFonts-ITMUXWD2.js → deterministicFonts-HHGHYN6V.js} +2 -2
  78. package/dist/{dist-JGUAVYZS.js → dist-AMQZTIJP.js} +3 -3
  79. package/dist/{dist-JAOG6MYW.js → dist-RUZFIHUD.js} +1 -1
  80. package/dist/{doctor-COVUXJ2H.js → doctor-MXX7AHXT.js} +11 -11
  81. package/dist/{events-6K4KG2RC.js → events-LLCZN2LK.js} +10 -10
  82. package/dist/{events-PNRVEJOH.js → events-R5N3EVAF.js} +9 -9
  83. package/dist/{feedback-YACZS7R7.js → feedback-MIZ3HJT4.js} +11 -11
  84. package/dist/{figma-LEEL7JF7.js → figma-4ESVBLHH.js} +3 -3
  85. package/dist/fontLocalizeCli.js +10 -10
  86. package/dist/{get-FX23HBPC.js → get-OF3I77OW.js} +2 -2
  87. package/dist/{gpuPolicy-TCSAVM2S.js → gpuPolicy-KDI7HVOA.js} +7 -7
  88. package/dist/{grade-compare-ENNPIMZX.js → grade-compare-QXE4ZEZU.js} +27 -28
  89. package/dist/{gsapParserAcorn-FLWABPQM.js → gsapParserAcorn-3Z742FXU.js} +1 -1
  90. package/dist/{help-HNY5LMYR.js → help-NFHZFSQN.js} +3 -2
  91. package/dist/{history-325KQTJM.js → history-DTRCFREW.js} +17 -17
  92. package/dist/hyperframe-runtime.js +56 -56
  93. package/dist/hyperframe.manifest.json +1 -1
  94. package/dist/hyperframe.runtime.iife.js +56 -56
  95. package/dist/hyperframes-player.global.js +1 -1
  96. package/dist/{info-GKPHG3QO.js → info-KRDLMYKB.js} +12 -12
  97. package/dist/{init-UYF6SWL7.js → init-XTXSP6IU.js} +23 -23
  98. package/dist/{inspect-A6DZG7KU.js → inspect-KH3CTX62.js} +28 -29
  99. package/dist/{installer-EY3AB44Q.js → installer-M5OHZ3QU.js} +5 -5
  100. package/dist/{keyframes-P62TMLKQ.js → keyframes-K5UWQDSW.js} +19 -18
  101. package/dist/{lambda-HWU6V36S.js → lambda-PXGK25LH.js} +6 -6
  102. package/dist/{layout-GWF2HD5Z.js → layout-SYWCNF2S.js} +28 -29
  103. package/dist/{lint-OBGOECOL.js → lint-A5W6BCKC.js} +13 -13
  104. package/dist/{lintProject-FDJYTOVM.js → lintProject-MXUZEBDH.js} +1 -1
  105. package/dist/{list-ZOUMRWXQ.js → list-CXWE53HJ.js} +2 -2
  106. package/dist/{login-4H6ZVI6D.js → login-WUPTUIG2.js} +4 -4
  107. package/dist/{media-treatment-GRBN3MG5.js → media-treatment-INJWEP6H.js} +13 -13
  108. package/dist/{models-YFTLSJEG.js → models-D5CMY6VB.js} +8 -8
  109. package/dist/{motionShot-7VLC2ULG.js → motionShot-HS4M4WOQ.js} +17 -16
  110. package/dist/{normalize-audio-SLBARKVY.js → normalize-audio-ILF3IDZC.js} +12 -12
  111. package/dist/open-4V3RXCR6.js +115 -0
  112. package/dist/{pipeline-WRNKPJZH.js → pipeline-CPGRA375.js} +7 -7
  113. package/dist/{play-PDEXRHV6.js → play-IFATKPFL.js} +22 -22
  114. package/dist/{preflight-6TUK6Z7A.js → preflight-IQEYFD33.js} +8 -8
  115. package/dist/{present-UXWOO2YL.js → present-A3EXMPEB.js} +18 -18
  116. package/dist/{preview-CWHCNYYZ.js → preview-6OFPNSRQ.js} +29 -24
  117. package/dist/{producer-WDTJSNXK.js → producer-T4HGO327.js} +1 -1
  118. package/dist/{projectConfig-DBP5POAQ.js → projectConfig-VKUAJTKN.js} +7 -7
  119. package/dist/{publication-SUAGUL5G.js → publication-EYW5DW5Q.js} +3 -3
  120. package/dist/{publish-CDKO6FSQ.js → publish-7N3KAN23.js} +9 -9
  121. package/dist/{remove-background-QFMDODZ4.js → remove-background-76NDLWX2.js} +8 -8
  122. package/dist/{render-XTI7E22A.js → render-FVVTP6IC.js} +13 -13
  123. package/dist/{render-BYD7ZASF.js → render-SGKRP4OI.js} +45 -29
  124. package/dist/{render-NRNF56OV.js → render-WWSM5VDX.js} +4 -4
  125. package/dist/{render-batch-L2AIXYA3.js → render-batch-UHVLIDQ6.js} +4 -4
  126. package/dist/{renderCancellation-XR3W2AQT.js → renderCancellation-TZ2YQXLI.js} +7 -7
  127. package/dist/renderSetupWorker.js +1 -1
  128. package/dist/{resolver-RYPIAEGU.js → resolver-BERTN5TY.js} +5 -5
  129. package/dist/{sherpa-MXQ34FFS.js → sherpa-WAI3BU35.js} +8 -8
  130. package/dist/skills/media-use/SKILL.md +2 -0
  131. package/dist/skills/media-use/audio/scripts/lib/heygen.mjs +16 -6
  132. package/dist/skills/media-use/audio/scripts/lib/heygen.test.mjs +26 -1
  133. package/dist/skills/media-use/audio/scripts/lib/tts.mjs +2 -4
  134. package/dist/skills/media-use/audio/scripts/lib/tts.test.mjs +31 -1
  135. package/dist/skills/media-use/scripts/lib/manifest.d.mts +19 -0
  136. package/dist/skills/media-use/scripts/lib/manifest.mjs +17 -13
  137. package/dist/skills/media-use/scripts/lib/manifest.test.mjs +3 -2
  138. package/dist/{skills-MZQUKPEY.js → skills-4J56N4BF.js} +12 -12
  139. package/dist/{skillsUpdateCheck-B5F5UR7U.js → skillsUpdateCheck-GPLLGZTN.js} +3 -3
  140. package/dist/{snapshot-HPBNWSSK.js → snapshot-XPPNHMIG.js} +28 -29
  141. package/dist/{src-RNEWLAP6.js → src-6ZDBAHYH.js} +9 -9
  142. package/dist/{src-BS6B2UWS.js → src-K6L2URKG.js} +6 -6
  143. package/dist/{staticProjectServer-B44OD7QD.js → staticProjectServer-ETIXS3GJ.js} +16 -16
  144. package/dist/{status-RYS52BAQ.js → status-P2I66DU7.js} +7 -7
  145. package/dist/studio/assets/{hyperframes-player-GkN9yzzq.js → hyperframes-player-yABdb6yk.js} +1 -1
  146. package/dist/studio/assets/{index-ByV72rWx.js → index-D77MIjSJ.js} +1 -1
  147. package/dist/studio/assets/{index-BpKhiuzT.js → index-DWjF2Kxw.js} +1 -1
  148. package/dist/studio/assets/{index-CyFqMHGS.js → index-Dt7lWtY7.js} +184 -184
  149. package/dist/studio/assets/{index-t1LH6H5H.css → index-LrNlT5Tg.css} +1 -1
  150. package/dist/studio/{chunk-J6Q572FA.js → chunk-246VB2G3.js} +3 -1
  151. package/dist/studio/chunk-246VB2G3.js.map +1 -0
  152. package/dist/studio/index.d.ts +10 -2
  153. package/dist/studio/index.html +2 -2
  154. package/dist/studio/index.js +1611 -1310
  155. package/dist/studio/index.js.map +1 -1
  156. package/dist/studio/player.js +1 -1
  157. package/dist/studio/styles.css +1 -1
  158. package/dist/{studio-api-YCS6DZMR.js → studio-api-PTVN2GZ5.js} +10 -10
  159. package/dist/{studioServer-AEXETXZ2.js → studioServer-55366NG4.js} +77 -43
  160. package/dist/{system-TD2HPCOA.js → system-M44QRAAZ.js} +7 -7
  161. package/dist/{telemetry-7KDXFPTK.js → telemetry-6GQL3BIP.js} +10 -10
  162. package/dist/{timeline-P4IMRDIN.js → timeline-NMG3JG3V.js} +17 -17
  163. package/dist/{tokens-HKYWL774.js → tokens-5LYIBBEF.js} +2 -2
  164. package/dist/{transcribe-2E4QY24M.js → transcribe-3SONDYLT.js} +8 -8
  165. package/dist/{transcribe-UIQMMHXI.js → transcribe-4DGPFZTU.js} +13 -13
  166. package/dist/{tts-P3LIPIL5.js → tts-CGUXR7R4.js} +1 -1
  167. package/dist/{updateCheck-KWLMTR35.js → updateCheck-CXNND3CL.js} +2 -2
  168. package/dist/{upgrade-E4TMMCGK.js → upgrade-RFTKDIVZ.js} +2 -2
  169. package/dist/{urlDownloader-P2EJDWLH.js → urlDownloader-VRZX26OK.js} +6 -6
  170. package/dist/{validate-IX47WBNJ.js → validate-3BFHVVZH.js} +17 -18
  171. package/dist/{video-56EQZA6M.js → video-ECPRKRRP.js} +7 -7
  172. package/package.json +1 -1
  173. package/dist/chunk-262C25DQ.js +0 -31
  174. package/dist/chunk-PATLRNZA.js +0 -3541
  175. package/dist/studio/chunk-J6Q572FA.js.map +0 -1
  176. package/dist/{synthesize-K62TIZWI.js → synthesize-BDXNRYZN.js} +4 -4
@@ -6,36 +6,37 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  maybePromptRenderFeedback
9
- } from "./chunk-RYSHGEZL.js";
9
+ } from "./chunk-MUAFAG77.js";
10
10
  import {
11
11
  reportVariableIssues,
12
12
  resolveVariablesArg,
13
13
  validateVariablesAgainstProject
14
- } from "./chunk-WW7V2GQJ.js";
14
+ } from "./chunk-AICUP6TU.js";
15
15
  import {
16
16
  loadProducer
17
- } from "./chunk-XLG5C3XA.js";
17
+ } from "./chunk-4EZKLNMD.js";
18
18
  import {
19
19
  formatLintStartupMessage
20
20
  } from "./chunk-6CSYCFQV.js";
21
21
  import {
22
22
  resolveProject
23
- } from "./chunk-WBRDOH4A.js";
23
+ } from "./chunk-UI2I6ZQE.js";
24
24
  import {
25
25
  renderJobObservabilityTelemetryPayload
26
26
  } from "./chunk-VXVRPIJA.js";
27
- import {
28
- windowsChromeCrashRemediation
29
- } from "./chunk-262C25DQ.js";
30
27
  import {
31
28
  hasExplicitCompositionArg,
32
29
  parseGifLoopArg,
33
30
  parseHlsSegmentSecondsArg,
34
31
  resolveBrowserTimeoutMsArg,
35
32
  resolveCompositionEntryArg,
36
- resolveDefaultFpsArg
37
- } from "./chunk-5OS5XIWZ.js";
33
+ resolveDefaultFpsArg,
34
+ windowsChromeCrashRemediation
35
+ } from "./chunk-2QAAOW5T.js";
38
36
  import "./chunk-YEIFI443.js";
37
+ import {
38
+ desktopHint
39
+ } from "./chunk-AMV2OPXR.js";
39
40
  import {
40
41
  errorBox,
41
42
  formatBytes,
@@ -46,24 +47,24 @@ import {
46
47
  } from "./chunk-IHFUKJOR.js";
47
48
  import {
48
49
  runEnvironmentChecks
49
- } from "./chunk-VU4KRDRL.js";
50
+ } from "./chunk-PUFPAYTJ.js";
50
51
  import "./chunk-PFCFR3KZ.js";
51
52
  import {
52
53
  createRenderCancellationScope
53
- } from "./chunk-LZN67SFR.js";
54
+ } from "./chunk-RTINVJNS.js";
54
55
  import {
55
56
  loadProjectConfig,
56
57
  readProjectConfigWithStatus,
57
58
  seedProjectAuthoringSkill
58
- } from "./chunk-3WXWL7AY.js";
59
+ } from "./chunk-MBSCHJQZ.js";
59
60
  import "./chunk-XT7X6QCP.js";
60
61
  import "./chunk-4YYJOFKS.js";
61
62
  import {
62
63
  normalizeSkillSlug
63
64
  } from "./chunk-HVW7ABXD.js";
64
- import "./chunk-JACPHNUK.js";
65
- import "./chunk-KYDM3W7A.js";
66
- import "./chunk-ZBMQOBQK.js";
65
+ import "./chunk-BET5FXMM.js";
66
+ import "./chunk-E26WHQFM.js";
67
+ import "./chunk-XIJTGR4O.js";
67
68
  import "./chunk-AWDFDFI3.js";
68
69
  import "./chunk-P6LJ4Y32.js";
69
70
  import "./chunk-GMECXFAN.js";
@@ -80,15 +81,15 @@ import {
80
81
  trackRenderError,
81
82
  trackRenderObservation,
82
83
  trackRenderPreflightRejected
83
- } from "./chunk-NPHNGWJH.js";
84
- import "./chunk-6WIWCYD5.js";
84
+ } from "./chunk-7NWNDQID.js";
85
+ import "./chunk-S3JOM6L4.js";
85
86
  import "./chunk-VWG7OQKU.js";
86
87
  import {
87
88
  c
88
89
  } from "./chunk-ZTZA4UWZ.js";
89
90
  import {
90
91
  bytesToMb
91
- } from "./chunk-BN5KOC5O.js";
92
+ } from "./chunk-ILOJE2TE.js";
92
93
  import "./chunk-AMKC3AXA.js";
93
94
  import {
94
95
  markRenderSucceeded,
@@ -110,22 +111,22 @@ import {
110
111
  MAX_VP9_CPU_USED,
111
112
  MIN_VP9_CPU_USED,
112
113
  isVideoFrameFormat
113
- } from "./chunk-MNMD6XLG.js";
114
+ } from "./chunk-WAD4ACBZ.js";
114
115
  import {
115
116
  formatRenderOutputTimestamp,
116
117
  fpsToFfmpegArg,
117
118
  fpsToNumber,
118
119
  parseFps
119
- } from "./chunk-RCNDZEBU.js";
120
+ } from "./chunk-TLA5RBEB.js";
120
121
  import {
121
122
  checkOutputResolutionCompatibility,
122
123
  isAspectAgnosticResolutionAlias,
123
124
  normalizeResolutionFlag,
124
125
  suggestMatchingPreset
125
- } from "./chunk-FSLYPQ5Z.js";
126
+ } from "./chunk-F7MXHGU3.js";
126
127
  import "./chunk-DPVXBVLL.js";
127
- import "./chunk-GPGWCFIA.js";
128
- import "./chunk-PATLRNZA.js";
128
+ import "./chunk-RYP46ARK.js";
129
+ import "./chunk-53IO4HLZ.js";
129
130
  import "./chunk-VC76R6W2.js";
130
131
  import "./chunk-OFQWTKPW.js";
131
132
  import {
@@ -143,7 +144,7 @@ import {
143
144
  collectSubCompositionSrcs,
144
145
  lintProject,
145
146
  shouldBlockRender
146
- } from "./chunk-NITBGIHR.js";
147
+ } from "./chunk-N4RVOW43.js";
147
148
  import "./chunk-HBBJFK6I.js";
148
149
  import "./chunk-PJ3HDUCY.js";
149
150
  import "./chunk-TQFG7HTI.js";
@@ -162,7 +163,7 @@ import {
162
163
  } from "./chunk-ISN5GRYI.js";
163
164
  import {
164
165
  VERSION
165
- } from "./chunk-WG4IZWEH.js";
166
+ } from "./chunk-XQSMY5HF.js";
166
167
  import {
167
168
  normalizeErrorMessage
168
169
  } from "./chunk-KNU5COPB.js";
@@ -660,7 +661,7 @@ async function executeRenderPlan(plan, dependencies, cancellation) {
660
661
  let batchModule;
661
662
  let preparedBatch;
662
663
  if (plan.batchPath) {
663
- batchModule = await import("./batchRender-2HXYPO62.js");
664
+ batchModule = await import("./batchRender-JDH4PXPD.js");
664
665
  try {
665
666
  preparedBatch = batchModule.prepareBatchRender({
666
667
  batchPath: plan.batchPath,
@@ -850,9 +851,9 @@ async function runResolutionPreflight(plan, checkResolution) {
850
851
  errorBox("Output resolution incompatible", issue.message);
851
852
  failCommand();
852
853
  }
853
- async function executeBatchRender(plan, browserPath, batchModule, preparedBatch, dependencies, cancellation) {
854
+ function batchRowRenderOptions(plan, browserPath) {
854
855
  const batchQuiet = plan.quiet || plan.batchJson;
855
- const renderOptionsBase = {
856
+ return {
856
857
  fps: plan.fps,
857
858
  quality: plan.quality,
858
859
  authoringSkill: plan.authoringSkill,
@@ -888,8 +889,13 @@ async function executeBatchRender(plan, browserPath, batchModule, preparedBatch,
888
889
  exitAfterComplete: false,
889
890
  throwOnError: true,
890
891
  skipFeedback: true,
892
+ desktopHint: false,
891
893
  manageDeParallelRouterBreaker: plan.batchConcurrency <= 1
892
894
  };
895
+ }
896
+ async function executeBatchRender(plan, browserPath, batchModule, preparedBatch, dependencies, cancellation) {
897
+ const batchQuiet = plan.quiet || plan.batchJson;
898
+ const renderOptionsBase = batchRowRenderOptions(plan, browserPath);
893
899
  const manifest = await batchModule.runBatchRender({
894
900
  prepared: preparedBatch,
895
901
  concurrency: plan.batchConcurrency,
@@ -1653,6 +1659,8 @@ async function renderDocker(projectDir, outputPath, options) {
1653
1659
  "printRenderComplete",
1654
1660
  () => printRenderComplete({
1655
1661
  outputPath,
1662
+ projectDir,
1663
+ desktopHint: wantsDesktopHint(options),
1656
1664
  elapsedMs: elapsed,
1657
1665
  quiet: options.quiet,
1658
1666
  format: options.format
@@ -1855,6 +1863,8 @@ async function executeLocalRender(projectDir, outputPath, options, cancellation)
1855
1863
  "printRenderComplete",
1856
1864
  () => printRenderComplete({
1857
1865
  outputPath,
1866
+ projectDir,
1867
+ desktopHint: wantsDesktopHint(options),
1858
1868
  elapsedMs: elapsed,
1859
1869
  quiet: options.quiet,
1860
1870
  format: options.format,
@@ -2301,6 +2311,9 @@ function readOutputFootprint(outputPath) {
2301
2311
  return { fileSize: "unknown", isDirectory: false };
2302
2312
  }
2303
2313
  }
2314
+ function wantsDesktopHint(options) {
2315
+ return options.desktopHint !== false && options.quality !== "draft";
2316
+ }
2304
2317
  function printRenderComplete(input) {
2305
2318
  if (input.quiet) return;
2306
2319
  const { outputPath, elapsedMs, perf } = input;
@@ -2316,6 +2329,8 @@ function printRenderComplete(input) {
2316
2329
  console.log(c.success("\u25C7") + " " + c.accent(outputPath));
2317
2330
  console.log(" " + c.bold(fileSize) + c.dim(" \xB7 " + detail));
2318
2331
  if (perf) printRenderPipeline(perf, input.requestedGpuMode);
2332
+ const hint = input.desktopHint ? desktopHint(input.projectDir) : null;
2333
+ if (hint) console.log(" " + c.dim(hint));
2319
2334
  }
2320
2335
  function printRenderPipeline(perf, requestedGpuMode) {
2321
2336
  const capture = {
@@ -2347,5 +2362,6 @@ export {
2347
2362
  renderLintContinuationHint,
2348
2363
  renderLocal,
2349
2364
  resolveBrowserGpuForCli,
2350
- runRenderLint
2365
+ runRenderLint,
2366
+ wantsDesktopHint
2351
2367
  };
@@ -15,7 +15,7 @@ import {
15
15
  reportVariableIssues,
16
16
  resolveVariablesArg,
17
17
  validateVariablesAgainstProject
18
- } from "./chunk-WW7V2GQJ.js";
18
+ } from "./chunk-AICUP6TU.js";
19
19
  import "./chunk-5Z63TBTX.js";
20
20
  import "./chunk-IHFUKJOR.js";
21
21
  import "./chunk-PFCFR3KZ.js";
@@ -25,10 +25,10 @@ import {
25
25
  import {
26
26
  setCommandExitCode
27
27
  } from "./chunk-PBN6GBJE.js";
28
- import "./chunk-RCNDZEBU.js";
29
- import "./chunk-FSLYPQ5Z.js";
28
+ import "./chunk-TLA5RBEB.js";
29
+ import "./chunk-F7MXHGU3.js";
30
30
  import "./chunk-DPVXBVLL.js";
31
- import "./chunk-PATLRNZA.js";
31
+ import "./chunk-53IO4HLZ.js";
32
32
  import "./chunk-VC76R6W2.js";
33
33
  import "./chunk-OFQWTKPW.js";
34
34
  import "./chunk-TQFG7HTI.js";
@@ -14,7 +14,7 @@ import {
14
14
  loadProjectVariableSchema,
15
15
  reportVariableIssues,
16
16
  validateVariablesAgainstSchema
17
- } from "./chunk-WW7V2GQJ.js";
17
+ } from "./chunk-AICUP6TU.js";
18
18
  import "./chunk-5Z63TBTX.js";
19
19
  import {
20
20
  errorBox
@@ -27,10 +27,10 @@ import {
27
27
  failCommand,
28
28
  setCommandExitCode
29
29
  } from "./chunk-PBN6GBJE.js";
30
- import "./chunk-RCNDZEBU.js";
31
- import "./chunk-FSLYPQ5Z.js";
30
+ import "./chunk-TLA5RBEB.js";
31
+ import "./chunk-F7MXHGU3.js";
32
32
  import "./chunk-DPVXBVLL.js";
33
- import "./chunk-PATLRNZA.js";
33
+ import "./chunk-53IO4HLZ.js";
34
34
  import "./chunk-VC76R6W2.js";
35
35
  import "./chunk-OFQWTKPW.js";
36
36
  import "./chunk-TQFG7HTI.js";
@@ -7,19 +7,19 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  createRenderCancellationScope,
9
9
  stoppedByCancelSignal
10
- } from "./chunk-LZN67SFR.js";
11
- import "./chunk-MNMD6XLG.js";
12
- import "./chunk-RCNDZEBU.js";
13
- import "./chunk-FSLYPQ5Z.js";
10
+ } from "./chunk-RTINVJNS.js";
11
+ import "./chunk-WAD4ACBZ.js";
12
+ import "./chunk-TLA5RBEB.js";
13
+ import "./chunk-F7MXHGU3.js";
14
14
  import "./chunk-DPVXBVLL.js";
15
- import "./chunk-GPGWCFIA.js";
16
- import "./chunk-PATLRNZA.js";
15
+ import "./chunk-RYP46ARK.js";
16
+ import "./chunk-53IO4HLZ.js";
17
17
  import "./chunk-VC76R6W2.js";
18
18
  import "./chunk-OFQWTKPW.js";
19
19
  import "./chunk-LAOCA3MQ.js";
20
20
  import "./chunk-LCSMOLGX.js";
21
21
  import "./chunk-TWWSYAKJ.js";
22
- import "./chunk-NITBGIHR.js";
22
+ import "./chunk-N4RVOW43.js";
23
23
  import "./chunk-HBBJFK6I.js";
24
24
  import "./chunk-PJ3HDUCY.js";
25
25
  import "./chunk-TQFG7HTI.js";
@@ -16,7 +16,7 @@ import "./chunk-LCSMOLGX.js";
16
16
  import "./chunk-TWWSYAKJ.js";
17
17
  import {
18
18
  lintProject
19
- } from "./chunk-NITBGIHR.js";
19
+ } from "./chunk-N4RVOW43.js";
20
20
  import "./chunk-HBBJFK6I.js";
21
21
  import "./chunk-PJ3HDUCY.js";
22
22
  import "./chunk-TQFG7HTI.js";
@@ -11,15 +11,15 @@ import {
11
11
  resolveItemWithDependencies,
12
12
  resolveItemsByTag,
13
13
  unreachableRegistryMessage
14
- } from "./chunk-JACPHNUK.js";
15
- import "./chunk-ZBMQOBQK.js";
14
+ } from "./chunk-BET5FXMM.js";
15
+ import "./chunk-XIJTGR4O.js";
16
16
  import "./chunk-AWDFDFI3.js";
17
17
  import "./chunk-P6LJ4Y32.js";
18
18
  import "./chunk-GMECXFAN.js";
19
- import "./chunk-RCNDZEBU.js";
20
- import "./chunk-FSLYPQ5Z.js";
19
+ import "./chunk-TLA5RBEB.js";
20
+ import "./chunk-F7MXHGU3.js";
21
21
  import "./chunk-DPVXBVLL.js";
22
- import "./chunk-PATLRNZA.js";
22
+ import "./chunk-53IO4HLZ.js";
23
23
  import "./chunk-VC76R6W2.js";
24
24
  import "./chunk-OFQWTKPW.js";
25
25
  import "./chunk-TQFG7HTI.js";
@@ -11,26 +11,26 @@ import "./chunk-EOVYQ3IG.js";
11
11
  import {
12
12
  getPreparedWavDurationSeconds,
13
13
  prepareWav
14
- } from "./chunk-AA4KEZGW.js";
14
+ } from "./chunk-EJF6CESB.js";
15
15
  import {
16
16
  stoppedByCancelSignal
17
- } from "./chunk-LZN67SFR.js";
17
+ } from "./chunk-RTINVJNS.js";
18
18
  import "./chunk-OAF4XJOW.js";
19
19
  import "./chunk-X5HWXQPU.js";
20
20
  import "./chunk-TVCRUG2S.js";
21
21
  import "./chunk-AMKC3AXA.js";
22
- import "./chunk-MNMD6XLG.js";
23
- import "./chunk-RCNDZEBU.js";
24
- import "./chunk-FSLYPQ5Z.js";
22
+ import "./chunk-WAD4ACBZ.js";
23
+ import "./chunk-TLA5RBEB.js";
24
+ import "./chunk-F7MXHGU3.js";
25
25
  import "./chunk-DPVXBVLL.js";
26
- import "./chunk-GPGWCFIA.js";
27
- import "./chunk-PATLRNZA.js";
26
+ import "./chunk-RYP46ARK.js";
27
+ import "./chunk-53IO4HLZ.js";
28
28
  import "./chunk-VC76R6W2.js";
29
29
  import "./chunk-OFQWTKPW.js";
30
30
  import "./chunk-LAOCA3MQ.js";
31
31
  import "./chunk-LCSMOLGX.js";
32
32
  import "./chunk-TWWSYAKJ.js";
33
- import "./chunk-NITBGIHR.js";
33
+ import "./chunk-N4RVOW43.js";
34
34
  import "./chunk-HBBJFK6I.js";
35
35
  import "./chunk-PJ3HDUCY.js";
36
36
  import "./chunk-TQFG7HTI.js";
@@ -11,6 +11,8 @@ The media OS for HyperFrames: resolve · generate · operate · remember — eve
11
11
 
12
12
  First run: install and sign in to the `heygen` CLI (the free-usage path), then verify with `npx hyperframes media-use resolve --doctor`. Setup and providers: `references/setup-providers.md`.
13
13
 
14
+ Before generating a voiceover or an avatar video, tell the person: signing in to the heygen CLI with OAuth (`heygen auth login --oauth`) gives a free allowance for TTS voiceover and avatar videos, while an API key bills API credits.
15
+
14
16
  ## Resolve — the one verb
15
17
 
16
18
  ```bash
@@ -59,23 +59,29 @@ export function loadEnvFromDir(startDir) {
59
59
 
60
60
  // → { headers } | { expired: true } | null. Never throws.
61
61
  export function heygenCredential() {
62
+ const cred = resolveCredential();
63
+ return cred?.unreadable ? null : cred;
64
+ }
65
+
66
+ // heygenCredential's answer, or { unreadable: { file, code } } when the credentials path exists but cannot be read
67
+ // (a folder, a locked ~/.heygen), so heygenAuthHeaders can say to fix that path: logging in again would fail there too.
68
+ // Read without checking first, so the file cannot change between a check and the read.
69
+ function resolveCredential() {
62
70
  const envKey = process.env.HEYGEN_API_KEY || process.env.HYPERFRAMES_API_KEY;
63
71
  if (envKey) return { headers: { "X-Api-Key": envKey } };
64
72
 
65
73
  const file = join(process.env.HEYGEN_CONFIG_DIR || join(homedir(), ".heygen"), "credentials");
66
- // Callers only probe for a credential, so any path that cannot be read (missing, a folder, a locked ~/.heygen)
67
- // is none. Read without checking first, so the file cannot change between a check and the read.
68
74
  let raw;
69
75
  try {
70
76
  raw = readFileSync(file, "utf8").trim();
71
- } catch {
72
- return null;
77
+ } catch (error) {
78
+ return error.code === "ENOENT" ? null : { unreadable: { file, code: error.code } };
73
79
  }
74
80
  if (!raw) return null;
75
81
  if (!raw.startsWith("{")) return { headers: { "X-Api-Key": raw } };
76
82
 
77
83
  // A malformed credentials file (partial write / wrong shape) must degrade to
78
- // "no credential", not crash the engine at startup — this function never throws.
84
+ // "no credential", not crash the engine at startup.
79
85
  let cred;
80
86
  try {
81
87
  cred = JSON.parse(raw);
@@ -105,7 +111,7 @@ export function heygenAuthMethod() {
105
111
 
106
112
  // → auth headers object, or throw with a fix hint.
107
113
  export function heygenAuthHeaders() {
108
- const cred = heygenCredential();
114
+ const cred = resolveCredential();
109
115
  if (cred?.headers) {
110
116
  // Only tag OAuth (Bearer) traffic as cli-source — the backend uses it to
111
117
  // grant the free allowance for OAuth requests and ignores it for API-key
@@ -115,6 +121,10 @@ export function heygenAuthHeaders() {
115
121
  ? { ...cred.headers, ...HEYGEN_CLI_SOURCE_HEADERS, ...HEYGEN_CLIENT_SOURCE_HEADERS }
116
122
  : { ...cred.headers, ...HEYGEN_CLIENT_SOURCE_HEADERS };
117
123
  }
124
+ if (cred?.unreadable)
125
+ throw new Error(
126
+ `HeyGen credentials at ${cred.unreadable.file} can't be read (${cred.unreadable.code}) — fix or remove that path, then run \`npx hyperframes auth login\``,
127
+ );
118
128
  if (cred?.expired)
119
129
  throw new Error(
120
130
  "HeyGen OAuth token expired — run `npx hyperframes auth refresh` (or `npx hyperframes auth login`)",
@@ -3,7 +3,12 @@ import assert from "node:assert/strict";
3
3
  import { mkdirSync, mkdtempSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
4
4
  import { tmpdir } from "node:os";
5
5
  import { join } from "node:path";
6
- import { heygenAuthHeaders, heygenAuthMethod, loadEnvFromDir } from "./heygen.mjs";
6
+ import {
7
+ heygenAuthHeaders,
8
+ heygenAuthMethod,
9
+ heygenCredential,
10
+ loadEnvFromDir,
11
+ } from "./heygen.mjs";
7
12
 
8
13
  function withCleanHeygenEnv(fn) {
9
14
  const previousApiKey = process.env.HEYGEN_API_KEY;
@@ -141,3 +146,23 @@ test("heygenAuthMethod returns null when the credentials path is a symlink loop"
141
146
  }
142
147
  });
143
148
  });
149
+
150
+ test("heygenAuthHeaders says to fix an unreadable credentials path, and to log in when there is none", () => {
151
+ withCleanHeygenEnv(() => {
152
+ const dir = mkdtempSync(join(tmpdir(), "heygen-cred-"));
153
+ try {
154
+ process.env.HEYGEN_CONFIG_DIR = dir;
155
+ assert.throws(() => heygenAuthHeaders(), /no HeyGen credentials/);
156
+ mkdirSync(join(dir, "credentials"));
157
+ assert.equal(heygenCredential(), null);
158
+ assert.throws(
159
+ () => heygenAuthHeaders(),
160
+ (error) =>
161
+ error.message.includes(join(dir, "credentials")) &&
162
+ /fix or remove that path/.test(error.message),
163
+ );
164
+ } finally {
165
+ rmSync(dir, { recursive: true, force: true });
166
+ }
167
+ });
168
+ });
@@ -45,10 +45,8 @@ export function pickProvider(userProvider) {
45
45
  throw new Error(
46
46
  "provider=gemini needs GEMINI_API_KEY or GOOGLE_API_KEY, or service-account credentials (GOOGLE_APPLICATION_CREDENTIALS or GCS_CREDS)",
47
47
  );
48
- if (userProvider === "heygen" && !heygenAvailable())
49
- throw new Error(
50
- "provider=heygen but no HeyGen credentials (set $HEYGEN_API_KEY or run `npx hyperframes auth login`)",
51
- );
48
+ // heygenAuthHeaders owns the reason and its fix: no credential, or a credentials path that cannot be read.
49
+ if (userProvider === "heygen" && !heygenAvailable()) heygenAuthHeaders();
52
50
  if (userProvider === "elevenlabs" && !process.env.ELEVENLABS_API_KEY)
53
51
  throw new Error("provider=elevenlabs but $ELEVENLABS_API_KEY is not set");
54
52
  return userProvider;
@@ -1,6 +1,14 @@
1
1
  import { test } from "node:test";
2
2
  import assert from "node:assert/strict";
3
- import { mkdtempSync, readFileSync, writeFileSync, chmodSync, rmSync, existsSync } from "node:fs";
3
+ import {
4
+ mkdirSync,
5
+ mkdtempSync,
6
+ readFileSync,
7
+ writeFileSync,
8
+ chmodSync,
9
+ rmSync,
10
+ existsSync,
11
+ } from "node:fs";
4
12
  import { join, dirname } from "node:path";
5
13
  import { tmpdir } from "node:os";
6
14
  import {
@@ -9,6 +17,7 @@ import {
9
17
  synthesizeOne,
10
18
  synthesizeHeygen,
11
19
  synthResult,
20
+ pickProvider,
12
21
  } from "./tts.mjs";
13
22
 
14
23
  test("parseFfmpegDurationBanner reads ffmpeg's stderr Duration line", () => {
@@ -198,3 +207,24 @@ test(
198
207
  assert.ok(!(await kokoroArgv({})).includes("--speed"));
199
208
  },
200
209
  );
210
+
211
+ test("pickProvider heygen with an unreadable credentials path says to fix that path", () => {
212
+ const saved = ["HEYGEN_API_KEY", "HYPERFRAMES_API_KEY", "HEYGEN_CONFIG_DIR"].map((k) => [
213
+ k,
214
+ process.env[k],
215
+ ]);
216
+ const dir = mkdtempSync(join(tmpdir(), "tts-cred-"));
217
+ try {
218
+ delete process.env.HEYGEN_API_KEY;
219
+ delete process.env.HYPERFRAMES_API_KEY;
220
+ process.env.HEYGEN_CONFIG_DIR = dir;
221
+ mkdirSync(join(dir, "credentials"));
222
+ assert.throws(() => pickProvider("heygen"), /fix or remove that path/);
223
+ } finally {
224
+ for (const [k, v] of saved) {
225
+ if (v === undefined) delete process.env[k];
226
+ else process.env[k] = v;
227
+ }
228
+ rmSync(dir, { recursive: true, force: true });
229
+ }
230
+ });
@@ -0,0 +1,19 @@
1
+ export interface Reservation {
2
+ id: string;
3
+ localPath: string;
4
+ markerPath: string;
5
+ fullPath: string;
6
+ }
7
+
8
+ export function typeDirPath(projectDir: string, type: string): string;
9
+ export function allocateId(
10
+ projectDir: string,
11
+ type: string,
12
+ ext: string,
13
+ ): Omit<Reservation, "fullPath">;
14
+ export function withReservedFileSync<T>(
15
+ projectDir: string,
16
+ type: string,
17
+ ext: string,
18
+ populate: (reservation: Reservation) => T,
19
+ ): T;
@@ -10,6 +10,7 @@ import {
10
10
  rmSync,
11
11
  statSync,
12
12
  } from "node:fs";
13
+ import { randomBytes } from "node:crypto";
13
14
  import { basename, join } from "node:path";
14
15
 
15
16
  const MANIFEST_FILE = "manifest.jsonl";
@@ -202,12 +203,12 @@ function withLock(dir, fn) {
202
203
  }
203
204
  }
204
205
 
205
- // Atomically allocate the next free id for `type` AND reserve its file, so a
206
+ // Atomically allocate the next free id for `type` AND reserve it on disk, so a
206
207
  // slow download/copy between allocation and appendRecord can't let a concurrent
207
208
  // caller grab the same id (the MU-23 clobber). Under the lock we take the max id
208
209
  // across BOTH the manifest and any already-reserved files in the type dir, then
209
- // O_EXCL-create an empty placeholder at the target path; freeze/copy overwrites
210
- // it. Returns { id, localPath }.
210
+ // O_EXCL-create an empty marker under core's atomic temp name, which Studio's
211
+ // project history skips. Returns { id, localPath, markerPath }.
211
212
  export function allocateId(projectDir, type, ext) {
212
213
  mkdirSync(mediaDir(projectDir), { recursive: true });
213
214
  const typeDir = typeDirPath(projectDir, type);
@@ -215,8 +216,10 @@ export function allocateId(projectDir, type, ext) {
215
216
  return withLock(mediaDir(projectDir), () => {
216
217
  const id = nextFreeId(projectDir, type);
217
218
  const localPath = `.media/${typeSubdir(type)}/${id}${ext}`;
218
- writeFileSync(join(projectDir, localPath), "", { flag: "wx" }); // durable reservation
219
- return { id, localPath };
219
+ // Same shape as core atomicTempPath: an empty file at the final name would be committed.
220
+ const markerPath = `${join(projectDir, localPath)}.hf${randomBytes(3).toString("hex")}.tmp`;
221
+ writeFileSync(markerPath, "", { flag: "wx" }); // durable reservation
222
+ return { id, localPath, markerPath };
220
223
  });
221
224
  }
222
225
 
@@ -242,22 +245,23 @@ function reservedFile(projectDir, type, ext) {
242
245
  return { ...allocation, fullPath: join(projectDir, allocation.localPath) };
243
246
  }
244
247
 
245
- function rollbackReservation(reservation) {
246
- rmSync(reservation.fullPath, { force: true });
248
+ function releaseReservation(reservation, committed) {
249
+ if (!committed) rmSync(reservation.fullPath, { force: true });
250
+ rmSync(reservation.markerPath, { force: true });
247
251
  }
248
252
 
249
253
  // A reservation is committed only when populate returns a non-null value.
250
254
  // Throwing/rejecting or returning null means no usable asset was produced, so
251
- // the placeholder must be released. Keeping this transaction beside allocateId
252
- // prevents individual provider/cache/LUT paths from forgetting the rollback.
255
+ // the reservation and any partial asset are released. Keeping this transaction
256
+ // beside allocateId prevents provider/cache/LUT paths from forgetting the rollback.
253
257
  export function withReservedFileSync(projectDir, type, ext, populate) {
254
258
  const reservation = reservedFile(projectDir, type, ext);
255
259
  try {
256
260
  const result = populate(reservation);
257
- if (result == null) rollbackReservation(reservation);
261
+ releaseReservation(reservation, result != null);
258
262
  return result;
259
263
  } catch (error) {
260
- rollbackReservation(reservation);
264
+ releaseReservation(reservation, false);
261
265
  throw error;
262
266
  }
263
267
  }
@@ -266,10 +270,10 @@ export async function withReservedFile(projectDir, type, ext, populate) {
266
270
  const reservation = reservedFile(projectDir, type, ext);
267
271
  try {
268
272
  const result = await populate(reservation);
269
- if (result == null) rollbackReservation(reservation);
273
+ releaseReservation(reservation, result != null);
270
274
  return result;
271
275
  } catch (error) {
272
- rollbackReservation(reservation);
276
+ releaseReservation(reservation, false);
273
277
  throw error;
274
278
  }
275
279
  }
@@ -100,7 +100,7 @@ function runTests() {
100
100
  setup();
101
101
  const allocated = allocateId(tmp, "lut", ".cube");
102
102
  assert.equal(allocated.localPath, ".media/luts/lut_001.cube");
103
- assert.ok(existsSync(join(tmp, allocated.localPath)));
103
+ assert.ok(existsSync(allocated.markerPath));
104
104
  cleanup();
105
105
  });
106
106
 
@@ -157,7 +157,8 @@ function runTests() {
157
157
  setup();
158
158
  const a = allocateId(tmp, "bgm", ".wav");
159
159
  assert.equal(a.id, "bgm_001");
160
- assert.ok(existsSync(join(tmp, a.localPath)), "placeholder reserved on disk");
160
+ assert.ok(existsSync(a.markerPath), "id reserved on disk");
161
+ assert.ok(!existsSync(join(tmp, a.localPath)), "no empty asset at the final name");
161
162
  // Second allocation BEFORE any manifest append (the download window) must not
162
163
  // hand back bgm_001 again, even with a different extension.
163
164
  const b = allocateId(tmp, "bgm", ".mp3");