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.
- package/dist/{add-CGDIT7CT.js → add-CJXLRVWK.js} +16 -16
- package/dist/{animatedGifPrep-KPT5VB5Q.js → animatedGifPrep-VHXPTSJL.js} +7 -7
- package/dist/{asset-6ZAZIWA7.js → asset-KTRZSJ5R.js} +2 -2
- package/dist/{assetCataloger-FWWCXIEX.js → assetCataloger-NH6UQG4Y.js} +3 -3
- package/dist/{auth-W4WZ5KT2.js → auth-T52MOHC7.js} +2 -2
- package/dist/{autoUpdate-2KRUUCM2.js → autoUpdate-EI6JX53V.js} +2 -2
- package/dist/{backgroundChecks-M7YRL5G3.js → backgroundChecks-7N3FFYIV.js} +3 -3
- package/dist/backgroundChecksWorker.js +3 -3
- package/dist/{batchRender-2HXYPO62.js → batchRender-JDH4PXPD.js} +4 -4
- package/dist/{beats-KXLHRYXV.js → beats-TG2TOST6.js} +13 -13
- package/dist/{benchmark-TZRC6JEE.js → benchmark-WGXMGPUI.js} +13 -13
- package/dist/{browser-KFCZEHSG.js → browser-VMEADLNK.js} +10 -10
- package/dist/{bundleWithLocalizedFonts-3RRACCEV.js → bundleWithLocalizedFonts-EDBQ5EME.js} +2 -2
- package/dist/{capture-N25LJPGM.js → capture-22IWCYV2.js} +2 -2
- package/dist/{capture-3L7VTWDG.js → capture-UZFI2G65.js} +10 -10
- package/dist/{catalog-OJK3RAMA.js → catalog-3V4SSSYE.js} +16 -16
- package/dist/{check-DUQ2OHRX.js → check-LTKOTPFI.js} +33 -34
- package/dist/{checkBrowser-XHNFT3DB.js → checkBrowser-LTZPCRBO.js} +36 -37
- package/dist/{chunk-YJMQLWG4.js → chunk-24AS45UQ.js} +58 -38
- package/dist/{chunk-E5XIJTMU.js → chunk-2FH6HOQ2.js} +1 -1
- package/dist/{chunk-5OS5XIWZ.js → chunk-2QAAOW5T.js} +23 -1
- package/dist/{chunk-44EFU366.js → chunk-3SHYUYXR.js} +12 -14
- package/dist/{chunk-IVLJE3VX.js → chunk-3V6V66SZ.js} +2 -2
- package/dist/{chunk-XLG5C3XA.js → chunk-4EZKLNMD.js} +1 -1
- package/dist/{chunk-DISNXEWU.js → chunk-4TIUZ6Z7.js} +2 -2
- package/dist/{chunk-6Z4E4GBX.js → chunk-4XAAOWFC.js} +1 -1
- package/dist/chunk-53IO4HLZ.js +3541 -0
- package/dist/{chunk-2C6UJPQS.js → chunk-73KPBRCO.js} +1 -1
- package/dist/{chunk-NPHNGWJH.js → chunk-7NWNDQID.js} +3 -3
- package/dist/{chunk-WW7V2GQJ.js → chunk-AICUP6TU.js} +2 -2
- package/dist/chunk-AMV2OPXR.js +82 -0
- package/dist/{chunk-JACPHNUK.js → chunk-BET5FXMM.js} +1 -1
- package/dist/{chunk-7VXU7E5S.js → chunk-CZRQH5SP.js} +1 -1
- package/dist/{chunk-2LWWIDPZ.js → chunk-DR7F77AN.js} +1 -1
- package/dist/{chunk-KYDM3W7A.js → chunk-E26WHQFM.js} +2 -2
- package/dist/{chunk-AA4KEZGW.js → chunk-EJF6CESB.js} +1 -1
- package/dist/{chunk-JWHQKTVG.js → chunk-ELHC6CLH.js} +3 -3
- package/dist/{chunk-5PTKFXAS.js → chunk-EYNWMEWX.js} +13 -11
- package/dist/{chunk-FSLYPQ5Z.js → chunk-F7MXHGU3.js} +6 -5
- package/dist/{chunk-NRTZ2JPC.js → chunk-GA46NF76.js} +1 -1
- package/dist/{chunk-SJ64QY5Z.js → chunk-GPUM6BRL.js} +2 -2
- package/dist/{chunk-ZUVO6Q5Q.js → chunk-HISVSZH7.js} +2 -2
- package/dist/{chunk-BN5KOC5O.js → chunk-ILOJE2TE.js} +1 -1
- package/dist/{chunk-GF4MOYGU.js → chunk-IML47HIH.js} +20 -12
- package/dist/{chunk-JREV7WVY.js → chunk-IOMMM4AX.js} +1 -1
- package/dist/{chunk-4JC7LDBQ.js → chunk-KQ7BAEVP.js} +3 -3
- package/dist/{chunk-3WXWL7AY.js → chunk-MBSCHJQZ.js} +1 -1
- package/dist/{chunk-RYSHGEZL.js → chunk-MUAFAG77.js} +4 -4
- package/dist/{chunk-NITBGIHR.js → chunk-N4RVOW43.js} +2 -2
- package/dist/{chunk-TRLP3CSL.js → chunk-NSVHO5LZ.js} +6 -5
- package/dist/{chunk-2GKO3X7F.js → chunk-NSY245QZ.js} +1 -1
- package/dist/{chunk-3DCZIHXE.js → chunk-OCH6V4FB.js} +4 -4
- package/dist/{chunk-JWGYWJ5F.js → chunk-PQQZNS5K.js} +1 -1
- package/dist/{chunk-VU4KRDRL.js → chunk-PUFPAYTJ.js} +1 -1
- package/dist/{chunk-YE5UC4XH.js → chunk-QLKCB3NY.js} +7 -7
- package/dist/{chunk-LZN67SFR.js → chunk-RTINVJNS.js} +1 -1
- package/dist/{chunk-GPGWCFIA.js → chunk-RYP46ARK.js} +53 -2
- package/dist/{chunk-6WIWCYD5.js → chunk-S3JOM6L4.js} +3 -3
- package/dist/{chunk-S6Y2LOTE.js → chunk-SKZ6H3JT.js} +1 -1
- package/dist/{chunk-RCNDZEBU.js → chunk-TLA5RBEB.js} +2 -2
- package/dist/{chunk-WBRDOH4A.js → chunk-UI2I6ZQE.js} +1 -1
- package/dist/{chunk-OWPHLEDI.js → chunk-UMMVYWDI.js} +5 -5
- package/dist/{chunk-2XV3S6TA.js → chunk-VEGNMQZI.js} +2 -2
- package/dist/{chunk-MNMD6XLG.js → chunk-WAD4ACBZ.js} +3 -3
- package/dist/{chunk-ZBMQOBQK.js → chunk-XIJTGR4O.js} +1 -1
- package/dist/{chunk-WG4IZWEH.js → chunk-XQSMY5HF.js} +2 -2
- package/dist/{chunk-2CGUG4XK.js → chunk-Z3SUEG2T.js} +11 -9
- package/dist/{clean-NH5JTTXP.js → clean-YZQXCSXZ.js} +17 -17
- package/dist/cli.js +52 -51
- package/dist/{cloud-QKM43VWA.js → cloud-TYUXSEGA.js} +4 -4
- package/dist/{cloudrun-JQCGTNFP.js → cloudrun-MA2JVRHV.js} +5 -5
- package/dist/{compare-2ZOO6GRL.js → compare-6DSDY2IF.js} +27 -28
- package/dist/{compiler-WNWCQTI6.js → compiler-4FHYKPNR.js} +7 -3
- package/dist/{component-Q5AECWP4.js → component-NY4JERQ5.js} +3 -3
- package/dist/{compositions-KEMPAOSU.js → compositions-SI2SKZAF.js} +12 -12
- package/dist/{delete-TWGIIVHU.js → delete-YU7XRF6M.js} +2 -2
- package/dist/{deterministicFonts-ITMUXWD2.js → deterministicFonts-HHGHYN6V.js} +2 -2
- package/dist/{dist-JGUAVYZS.js → dist-AMQZTIJP.js} +3 -3
- package/dist/{dist-JAOG6MYW.js → dist-RUZFIHUD.js} +1 -1
- package/dist/{doctor-COVUXJ2H.js → doctor-MXX7AHXT.js} +11 -11
- package/dist/{events-6K4KG2RC.js → events-LLCZN2LK.js} +10 -10
- package/dist/{events-PNRVEJOH.js → events-R5N3EVAF.js} +9 -9
- package/dist/{feedback-YACZS7R7.js → feedback-MIZ3HJT4.js} +11 -11
- package/dist/{figma-LEEL7JF7.js → figma-4ESVBLHH.js} +3 -3
- package/dist/fontLocalizeCli.js +10 -10
- package/dist/{get-FX23HBPC.js → get-OF3I77OW.js} +2 -2
- package/dist/{gpuPolicy-TCSAVM2S.js → gpuPolicy-KDI7HVOA.js} +7 -7
- package/dist/{grade-compare-ENNPIMZX.js → grade-compare-QXE4ZEZU.js} +27 -28
- package/dist/{gsapParserAcorn-FLWABPQM.js → gsapParserAcorn-3Z742FXU.js} +1 -1
- package/dist/{help-HNY5LMYR.js → help-NFHZFSQN.js} +3 -2
- package/dist/{history-325KQTJM.js → history-DTRCFREW.js} +17 -17
- package/dist/hyperframe-runtime.js +56 -56
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +56 -56
- package/dist/hyperframes-player.global.js +1 -1
- package/dist/{info-GKPHG3QO.js → info-KRDLMYKB.js} +12 -12
- package/dist/{init-UYF6SWL7.js → init-XTXSP6IU.js} +23 -23
- package/dist/{inspect-A6DZG7KU.js → inspect-KH3CTX62.js} +28 -29
- package/dist/{installer-EY3AB44Q.js → installer-M5OHZ3QU.js} +5 -5
- package/dist/{keyframes-P62TMLKQ.js → keyframes-K5UWQDSW.js} +19 -18
- package/dist/{lambda-HWU6V36S.js → lambda-PXGK25LH.js} +6 -6
- package/dist/{layout-GWF2HD5Z.js → layout-SYWCNF2S.js} +28 -29
- package/dist/{lint-OBGOECOL.js → lint-A5W6BCKC.js} +13 -13
- package/dist/{lintProject-FDJYTOVM.js → lintProject-MXUZEBDH.js} +1 -1
- package/dist/{list-ZOUMRWXQ.js → list-CXWE53HJ.js} +2 -2
- package/dist/{login-4H6ZVI6D.js → login-WUPTUIG2.js} +4 -4
- package/dist/{media-treatment-GRBN3MG5.js → media-treatment-INJWEP6H.js} +13 -13
- package/dist/{models-YFTLSJEG.js → models-D5CMY6VB.js} +8 -8
- package/dist/{motionShot-7VLC2ULG.js → motionShot-HS4M4WOQ.js} +17 -16
- package/dist/{normalize-audio-SLBARKVY.js → normalize-audio-ILF3IDZC.js} +12 -12
- package/dist/open-4V3RXCR6.js +115 -0
- package/dist/{pipeline-WRNKPJZH.js → pipeline-CPGRA375.js} +7 -7
- package/dist/{play-PDEXRHV6.js → play-IFATKPFL.js} +22 -22
- package/dist/{preflight-6TUK6Z7A.js → preflight-IQEYFD33.js} +8 -8
- package/dist/{present-UXWOO2YL.js → present-A3EXMPEB.js} +18 -18
- package/dist/{preview-CWHCNYYZ.js → preview-6OFPNSRQ.js} +29 -24
- package/dist/{producer-WDTJSNXK.js → producer-T4HGO327.js} +1 -1
- package/dist/{projectConfig-DBP5POAQ.js → projectConfig-VKUAJTKN.js} +7 -7
- package/dist/{publication-SUAGUL5G.js → publication-EYW5DW5Q.js} +3 -3
- package/dist/{publish-CDKO6FSQ.js → publish-7N3KAN23.js} +9 -9
- package/dist/{remove-background-QFMDODZ4.js → remove-background-76NDLWX2.js} +8 -8
- package/dist/{render-XTI7E22A.js → render-FVVTP6IC.js} +13 -13
- package/dist/{render-BYD7ZASF.js → render-SGKRP4OI.js} +45 -29
- package/dist/{render-NRNF56OV.js → render-WWSM5VDX.js} +4 -4
- package/dist/{render-batch-L2AIXYA3.js → render-batch-UHVLIDQ6.js} +4 -4
- package/dist/{renderCancellation-XR3W2AQT.js → renderCancellation-TZ2YQXLI.js} +7 -7
- package/dist/renderSetupWorker.js +1 -1
- package/dist/{resolver-RYPIAEGU.js → resolver-BERTN5TY.js} +5 -5
- package/dist/{sherpa-MXQ34FFS.js → sherpa-WAI3BU35.js} +8 -8
- package/dist/skills/media-use/SKILL.md +2 -0
- package/dist/skills/media-use/audio/scripts/lib/heygen.mjs +16 -6
- package/dist/skills/media-use/audio/scripts/lib/heygen.test.mjs +26 -1
- package/dist/skills/media-use/audio/scripts/lib/tts.mjs +2 -4
- package/dist/skills/media-use/audio/scripts/lib/tts.test.mjs +31 -1
- package/dist/skills/media-use/scripts/lib/manifest.d.mts +19 -0
- package/dist/skills/media-use/scripts/lib/manifest.mjs +17 -13
- package/dist/skills/media-use/scripts/lib/manifest.test.mjs +3 -2
- package/dist/{skills-MZQUKPEY.js → skills-4J56N4BF.js} +12 -12
- package/dist/{skillsUpdateCheck-B5F5UR7U.js → skillsUpdateCheck-GPLLGZTN.js} +3 -3
- package/dist/{snapshot-HPBNWSSK.js → snapshot-XPPNHMIG.js} +28 -29
- package/dist/{src-RNEWLAP6.js → src-6ZDBAHYH.js} +9 -9
- package/dist/{src-BS6B2UWS.js → src-K6L2URKG.js} +6 -6
- package/dist/{staticProjectServer-B44OD7QD.js → staticProjectServer-ETIXS3GJ.js} +16 -16
- package/dist/{status-RYS52BAQ.js → status-P2I66DU7.js} +7 -7
- package/dist/studio/assets/{hyperframes-player-GkN9yzzq.js → hyperframes-player-yABdb6yk.js} +1 -1
- package/dist/studio/assets/{index-ByV72rWx.js → index-D77MIjSJ.js} +1 -1
- package/dist/studio/assets/{index-BpKhiuzT.js → index-DWjF2Kxw.js} +1 -1
- package/dist/studio/assets/{index-CyFqMHGS.js → index-Dt7lWtY7.js} +184 -184
- package/dist/studio/assets/{index-t1LH6H5H.css → index-LrNlT5Tg.css} +1 -1
- package/dist/studio/{chunk-J6Q572FA.js → chunk-246VB2G3.js} +3 -1
- package/dist/studio/chunk-246VB2G3.js.map +1 -0
- package/dist/studio/index.d.ts +10 -2
- package/dist/studio/index.html +2 -2
- package/dist/studio/index.js +1611 -1310
- package/dist/studio/index.js.map +1 -1
- package/dist/studio/player.js +1 -1
- package/dist/studio/styles.css +1 -1
- package/dist/{studio-api-YCS6DZMR.js → studio-api-PTVN2GZ5.js} +10 -10
- package/dist/{studioServer-AEXETXZ2.js → studioServer-55366NG4.js} +77 -43
- package/dist/{system-TD2HPCOA.js → system-M44QRAAZ.js} +7 -7
- package/dist/{telemetry-7KDXFPTK.js → telemetry-6GQL3BIP.js} +10 -10
- package/dist/{timeline-P4IMRDIN.js → timeline-NMG3JG3V.js} +17 -17
- package/dist/{tokens-HKYWL774.js → tokens-5LYIBBEF.js} +2 -2
- package/dist/{transcribe-2E4QY24M.js → transcribe-3SONDYLT.js} +8 -8
- package/dist/{transcribe-UIQMMHXI.js → transcribe-4DGPFZTU.js} +13 -13
- package/dist/{tts-P3LIPIL5.js → tts-CGUXR7R4.js} +1 -1
- package/dist/{updateCheck-KWLMTR35.js → updateCheck-CXNND3CL.js} +2 -2
- package/dist/{upgrade-E4TMMCGK.js → upgrade-RFTKDIVZ.js} +2 -2
- package/dist/{urlDownloader-P2EJDWLH.js → urlDownloader-VRZX26OK.js} +6 -6
- package/dist/{validate-IX47WBNJ.js → validate-3BFHVVZH.js} +17 -18
- package/dist/{video-56EQZA6M.js → video-ECPRKRRP.js} +7 -7
- package/package.json +1 -1
- package/dist/chunk-262C25DQ.js +0 -31
- package/dist/chunk-PATLRNZA.js +0 -3541
- package/dist/studio/chunk-J6Q572FA.js.map +0 -1
- 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-
|
|
9
|
+
} from "./chunk-MUAFAG77.js";
|
|
10
10
|
import {
|
|
11
11
|
reportVariableIssues,
|
|
12
12
|
resolveVariablesArg,
|
|
13
13
|
validateVariablesAgainstProject
|
|
14
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-AICUP6TU.js";
|
|
15
15
|
import {
|
|
16
16
|
loadProducer
|
|
17
|
-
} from "./chunk-
|
|
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-
|
|
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
|
-
|
|
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-
|
|
50
|
+
} from "./chunk-PUFPAYTJ.js";
|
|
50
51
|
import "./chunk-PFCFR3KZ.js";
|
|
51
52
|
import {
|
|
52
53
|
createRenderCancellationScope
|
|
53
|
-
} from "./chunk-
|
|
54
|
+
} from "./chunk-RTINVJNS.js";
|
|
54
55
|
import {
|
|
55
56
|
loadProjectConfig,
|
|
56
57
|
readProjectConfigWithStatus,
|
|
57
58
|
seedProjectAuthoringSkill
|
|
58
|
-
} from "./chunk-
|
|
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-
|
|
65
|
-
import "./chunk-
|
|
66
|
-
import "./chunk-
|
|
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-
|
|
84
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
114
|
+
} from "./chunk-WAD4ACBZ.js";
|
|
114
115
|
import {
|
|
115
116
|
formatRenderOutputTimestamp,
|
|
116
117
|
fpsToFfmpegArg,
|
|
117
118
|
fpsToNumber,
|
|
118
119
|
parseFps
|
|
119
|
-
} from "./chunk-
|
|
120
|
+
} from "./chunk-TLA5RBEB.js";
|
|
120
121
|
import {
|
|
121
122
|
checkOutputResolutionCompatibility,
|
|
122
123
|
isAspectAgnosticResolutionAlias,
|
|
123
124
|
normalizeResolutionFlag,
|
|
124
125
|
suggestMatchingPreset
|
|
125
|
-
} from "./chunk-
|
|
126
|
+
} from "./chunk-F7MXHGU3.js";
|
|
126
127
|
import "./chunk-DPVXBVLL.js";
|
|
127
|
-
import "./chunk-
|
|
128
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
854
|
+
function batchRowRenderOptions(plan, browserPath) {
|
|
854
855
|
const batchQuiet = plan.quiet || plan.batchJson;
|
|
855
|
-
|
|
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-
|
|
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-
|
|
29
|
-
import "./chunk-
|
|
28
|
+
import "./chunk-TLA5RBEB.js";
|
|
29
|
+
import "./chunk-F7MXHGU3.js";
|
|
30
30
|
import "./chunk-DPVXBVLL.js";
|
|
31
|
-
import "./chunk-
|
|
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-
|
|
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-
|
|
31
|
-
import "./chunk-
|
|
30
|
+
import "./chunk-TLA5RBEB.js";
|
|
31
|
+
import "./chunk-F7MXHGU3.js";
|
|
32
32
|
import "./chunk-DPVXBVLL.js";
|
|
33
|
-
import "./chunk-
|
|
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-
|
|
11
|
-
import "./chunk-
|
|
12
|
-
import "./chunk-
|
|
13
|
-
import "./chunk-
|
|
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-
|
|
16
|
-
import "./chunk-
|
|
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-
|
|
22
|
+
import "./chunk-N4RVOW43.js";
|
|
23
23
|
import "./chunk-HBBJFK6I.js";
|
|
24
24
|
import "./chunk-PJ3HDUCY.js";
|
|
25
25
|
import "./chunk-TQFG7HTI.js";
|
|
@@ -11,15 +11,15 @@ import {
|
|
|
11
11
|
resolveItemWithDependencies,
|
|
12
12
|
resolveItemsByTag,
|
|
13
13
|
unreachableRegistryMessage
|
|
14
|
-
} from "./chunk-
|
|
15
|
-
import "./chunk-
|
|
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-
|
|
20
|
-
import "./chunk-
|
|
19
|
+
import "./chunk-TLA5RBEB.js";
|
|
20
|
+
import "./chunk-F7MXHGU3.js";
|
|
21
21
|
import "./chunk-DPVXBVLL.js";
|
|
22
|
-
import "./chunk-
|
|
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-
|
|
14
|
+
} from "./chunk-EJF6CESB.js";
|
|
15
15
|
import {
|
|
16
16
|
stoppedByCancelSignal
|
|
17
|
-
} from "./chunk-
|
|
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-
|
|
23
|
-
import "./chunk-
|
|
24
|
-
import "./chunk-
|
|
22
|
+
import "./chunk-WAD4ACBZ.js";
|
|
23
|
+
import "./chunk-TLA5RBEB.js";
|
|
24
|
+
import "./chunk-F7MXHGU3.js";
|
|
25
25
|
import "./chunk-DPVXBVLL.js";
|
|
26
|
-
import "./chunk-
|
|
27
|
-
import "./chunk-
|
|
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-
|
|
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
|
|
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 =
|
|
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 {
|
|
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
|
-
|
|
49
|
-
|
|
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 {
|
|
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
|
|
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
|
|
210
|
-
//
|
|
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
|
-
|
|
219
|
-
|
|
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
|
|
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
|
|
252
|
-
// prevents
|
|
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
|
-
|
|
261
|
+
releaseReservation(reservation, result != null);
|
|
258
262
|
return result;
|
|
259
263
|
} catch (error) {
|
|
260
|
-
|
|
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
|
-
|
|
273
|
+
releaseReservation(reservation, result != null);
|
|
270
274
|
return result;
|
|
271
275
|
} catch (error) {
|
|
272
|
-
|
|
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(
|
|
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(
|
|
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");
|