hyperframes 0.8.138 → 0.8.140
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-IZQPSHT5.js → add-7SPPQB64.js} +20 -22
- package/dist/{animatedGifPrep-MQF3GRFW.js → animatedGifPrep-HN3CJSFX.js} +15 -8
- package/dist/{asset-RNZX4ISG.js → asset-AZMFUTRL.js} +3 -3
- package/dist/{assetCataloger-5YRUY3PJ.js → assetCataloger-TQUWYLHE.js} +6 -3
- package/dist/{auth-LUELYGJ4.js → auth-XGY74R4A.js} +7 -7
- package/dist/{autoUpdate-ECMQWUU5.js → autoUpdate-44NTJBQU.js} +2 -2
- package/dist/{backgroundChecks-PBEJMSA3.js → backgroundChecks-ET4DJEPG.js} +3 -3
- package/dist/backgroundChecksWorker.js +3 -3
- package/dist/{batchRender-2GXKBPFQ.js → batchRender-HTWWNF3P.js} +11 -8
- package/dist/beat-analyzer.global.js +5 -2
- package/dist/{beats-AAAZVDOY.js → beats-4GYTZUZG.js} +24 -17
- package/dist/{benchmark-EI767IB4.js → benchmark-CJQHE3QN.js} +20 -23
- package/dist/{browser-KAA2VXYH.js → browser-NXOVPGDG.js} +14 -28
- package/dist/{bundleWithLocalizedFonts-MWDYAPGB.js → bundleWithLocalizedFonts-6PJP54TC.js} +5 -5
- package/dist/{capture-IRRHK6BT.js → capture-5EHGRJZM.js} +2 -2
- package/dist/{capture-VYT5NQQI.js → capture-EHOMO4MP.js} +22 -15
- package/dist/{catalog-FYTZ2ET6.js → catalog-PTX5Z52R.js} +28 -30
- package/dist/{catch-up-XH3OAKQR.js → catch-up-I45SPSCU.js} +11 -25
- package/dist/{check-MUMIOK5K.js → check-LJ7LG7OI.js} +72 -54
- package/dist/{checkBrowser-LKSZFOU6.js → checkBrowser-6EK5E4PG.js} +81 -36
- package/dist/chunk-24OWOBQH.js +3656 -0
- package/dist/{chunk-3F6YLT72.js → chunk-2GMKWYEH.js} +12 -12
- package/dist/{chunk-KRLYIT22.js → chunk-5IKJONRY.js} +1 -1
- package/dist/chunk-6IHWCZ3W.js +54 -0
- package/dist/{chunk-P5WDMFBB.js → chunk-6U3MN4HW.js} +5 -106
- package/dist/chunk-A4KQZXZI.js +116 -0
- package/dist/{chunk-MKVKVMUH.js → chunk-ABJNXQUA.js} +10 -10
- package/dist/{chunk-YGXLBX3N.js → chunk-ASW6NWON.js} +1 -1
- package/dist/chunk-B3I3XJ47.js +3711 -0
- package/dist/{chunk-FSSMOTMS.js → chunk-BJ5JWOES.js} +1 -1
- package/dist/{chunk-OBC75KXL.js → chunk-BQKEGPPL.js} +1 -1
- package/dist/{chunk-SHB5VDMH.js → chunk-BRITLL56.js} +1 -1
- package/dist/{chunk-VR5UQWGV.js → chunk-C2JUHIG5.js} +6 -6
- package/dist/{chunk-YNBXJWSD.js → chunk-DDQ4LOML.js} +1 -1
- package/dist/{chunk-HUZYBV2Z.js → chunk-DQNOPYAG.js} +1 -1
- package/dist/{chunk-JH556Q42.js → chunk-EDYBFSPE.js} +2 -2
- package/dist/{chunk-SIMYRD5P.js → chunk-F3SPK6SO.js} +78 -20
- package/dist/chunk-FXMKHHPO.js +123 -0
- package/dist/chunk-G75ENCEZ.js +283 -0
- package/dist/{chunk-MIOBYUXT.js → chunk-GQJZORQP.js} +1 -1
- package/dist/{chunk-Y6W4DVPS.js → chunk-HKCNZITN.js} +1 -1
- package/dist/{chunk-APMG37MX.js → chunk-IFY57LUW.js} +1 -1
- package/dist/{chunk-JOUVZO7M.js → chunk-IRBESGJ7.js} +4 -4
- package/dist/chunk-JFKL3WAE.js +161 -0
- package/dist/{chunk-WH6PRFNX.js → chunk-JSGANFFH.js} +12 -3
- package/dist/{chunk-S3S2LSZX.js → chunk-KDPYVTEU.js} +2 -1
- package/dist/{chunk-PHXBLIKK.js → chunk-KECV5G4V.js} +165 -59
- package/dist/{chunk-SDRKEYZV.js → chunk-KFQNMY36.js} +8 -8
- package/dist/{chunk-QPOK6I32.js → chunk-KJLY2SDJ.js} +2 -2
- package/dist/{chunk-SZITAGRK.js → chunk-KMKWRIMC.js} +1 -1
- package/dist/{chunk-UUMK6VME.js → chunk-KOEWEFHK.js} +1 -1
- package/dist/{chunk-HXXX6N2G.js → chunk-L2H2L22P.js} +2 -2
- package/dist/{chunk-DJMXTKKK.js → chunk-LQG6GPVK.js} +1 -1
- package/dist/{chunk-GJGVYREG.js → chunk-MHK5DE2P.js} +268 -1964
- package/dist/{chunk-W3KQCJVP.js → chunk-MTVDXB6S.js} +18 -289
- package/dist/{chunk-IRYC5BRO.js → chunk-MU6C2VP6.js} +7 -7
- package/dist/{chunk-P75OFLZN.js → chunk-MUINFURL.js} +2 -2
- package/dist/{chunk-L5E5ZN6G.js → chunk-PB3P4MKP.js} +1 -1
- package/dist/{chunk-PHRWQQOJ.js → chunk-PE2I3AFA.js} +1 -1
- package/dist/{chunk-DXHYACUC.js → chunk-PFJFHNU3.js} +3 -3
- package/dist/{chunk-KBUUCAIZ.js → chunk-PPKFM5WE.js} +2 -2
- package/dist/{chunk-RH5VML6E.js → chunk-PUBKHEEA.js} +13 -13
- package/dist/{chunk-R6C6URKB.js → chunk-QBK7WKHT.js} +8 -8
- package/dist/{chunk-I3BRUEKD.js → chunk-QG3PDRSO.js} +1 -1
- package/dist/{chunk-RLNB3JCY.js → chunk-QP3BRKGF.js} +1 -163
- package/dist/chunk-QZ3AZTXI.js +1740 -0
- package/dist/{chunk-GNHJ4ONK.js → chunk-SLEPCESN.js} +2 -2
- package/dist/chunk-T76PLPD6.js +57 -0
- package/dist/{chunk-7Y5SMPRV.js → chunk-TPECLKPA.js} +168 -165
- package/dist/{chunk-IC5L6L7K.js → chunk-TYT2TLJR.js} +1 -1
- package/dist/{chunk-ASPTQ6DT.js → chunk-U7E736AJ.js} +1 -1
- package/dist/chunk-UOFAE5RF.js +42 -0
- package/dist/chunk-USDEMXXL.js +110 -0
- package/dist/{chunk-5K33TNUJ.js → chunk-VVJFZU6B.js} +2 -2
- package/dist/{chunk-XQODEVF3.js → chunk-WKTHUC2R.js} +1 -1
- package/dist/{chunk-7OLMGFDN.js → chunk-WQBA3MH4.js} +3 -3
- package/dist/{chunk-STA43FMY.js → chunk-WY5OODN5.js} +71 -3855
- package/dist/{chunk-JCRJBB4E.js → chunk-X3X3VETN.js} +8 -8
- package/dist/{chunk-ZTZ7NCJT.js → chunk-XTFJOR3K.js} +1 -1
- package/dist/chunk-YA62XGXS.js +45 -0
- package/dist/{clean-LZPDOAV4.js → clean-Y3AQITOX.js} +29 -20
- package/dist/cli.js +55 -55
- package/dist/{cloud-RVAH5NNL.js → cloud-TDPOMBZF.js} +7 -7
- package/dist/{cloudrun-NFGM6TRT.js → cloudrun-FPAVAVHP.js} +11 -8
- package/dist/commands/layout-audit.browser.js +37 -8
- package/dist/commands/motion-signature.browser.js +51 -2
- package/dist/{compare-S3M5OAL2.js → compare-LHL225ND.js} +40 -31
- package/dist/{compiler-SZ4GTYFB.js → compiler-RTU3KTLF.js} +7 -3
- package/dist/{component-PR2WZTQ4.js → component-L2YX7J56.js} +4 -4
- package/dist/{compositions-6RYXH2UA.js → compositions-V2UZKG7S.js} +23 -16
- package/dist/{delete-EO7C3LQ6.js → delete-OXZEXUQY.js} +8 -8
- package/dist/{dist-RVC3JTID.js → dist-N33CM63P.js} +21 -15
- package/dist/{dist-OJTEVNJR.js → dist-NZSQCYOF.js} +3 -1
- package/dist/{doctor-UTCCMN32.js → doctor-MWTPSIVD.js} +20 -13
- package/dist/{events-RE3OR6KY.js → events-4TZGQZWF.js} +6 -22
- package/dist/{events-RCGWL4LI.js → events-7VJJGC3D.js} +10 -23
- package/dist/{feedback-V7C64JIR.js → feedback-HSGAPVN7.js} +67 -45
- package/dist/{figma-26LOX5PV.js → figma-AMC6FAK3.js} +6 -6
- package/dist/fontLocalizeCli.js +17 -10
- package/dist/{get-E2K2JRTV.js → get-Y7DFEFYM.js} +8 -8
- package/dist/{gpuPolicy-Z3PQN6ZK.js → gpuPolicy-A45VSUKR.js} +15 -8
- package/dist/{grade-compare-OTZDU463.js → grade-compare-ERSA3OUI.js} +40 -31
- package/dist/{gsapParser-2OL54XZ5.js → gsapParser-UP3PNPC2.js} +3 -2
- package/dist/{help-IRSQLNI5.js → help-TW2AADLZ.js} +4 -4
- package/dist/{history-G44U6762.js → history-DKGDSVWF.js} +12 -30
- package/dist/hyperframe-runtime.js +59 -59
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +59 -59
- package/dist/hyperframes-player.global.js +3 -3
- package/dist/{info-KXQ2TAHX.js → info-I3NRRNX4.js} +17 -20
- package/dist/{init-7SXMLHJE.js → init-5Y3ZWZNF.js} +50 -41
- package/dist/{inspect-7JTINR25.js → inspect-BJQKBB3X.js} +39 -30
- package/dist/{installer-RH4E6WXT.js → installer-27K4JS2I.js} +8 -5
- package/dist/{keyframes-PIV573S6.js → keyframes-6V2NZO22.js} +14 -25
- package/dist/{lambda-GO5HAA4S.js → lambda-AIMF3K4A.js} +16 -13
- package/dist/{layout-N2736OO3.js → layout-YAPEBTU4.js} +39 -30
- package/dist/{lint-WUXZ5WWZ.js → lint-3LWWUIV7.js} +17 -23
- package/dist/{lintProject-ANMPLBIT.js → lintProject-LM3XZRPZ.js} +3 -1
- package/dist/{list-QF7AMX5F.js → list-NTSGEZJ6.js} +8 -8
- package/dist/{login-6RGSXHQJ.js → login-ZTDFGCCW.js} +9 -9
- package/dist/{logout-Q654A3SI.js → logout-GJXZQKOA.js} +5 -5
- package/dist/{media-treatment-T4KDEDYW.js → media-treatment-ARHX446F.js} +21 -20
- package/dist/{models-6JMNK3XI.js → models-VHNQVTHG.js} +20 -13
- package/dist/{motionShot-74WM7KF6.js → motionShot-35HCSNCI.js} +22 -15
- package/dist/{normalize-O76AC4HE.js → normalize-IGLHCWTF.js} +0 -4
- package/dist/{normalize-audio-ZZU36ZMD.js → normalize-audio-AUC73JH3.js} +13 -26
- package/dist/{open-G523K45B.js → open-C5LVNU3U.js} +11 -25
- package/dist/{pipeline-AKDGCWRE.js → pipeline-4GDTK54T.js} +15 -8
- package/dist/{play-SHIGXVON.js → play-U7UANF7Z.js} +38 -32
- package/dist/{preflight-6ERLORWK.js → preflight-Y5DN5D37.js} +3 -18
- package/dist/{present-QOYYNZCE.js → present-X6V6TX3E.js} +32 -26
- package/dist/{preview-KUXTDJL3.js → preview-K43RTRU2.js} +33 -26
- package/dist/{producer-CH33JXHK.js → producer-PVMFMW23.js} +1 -1
- package/dist/{projectConfig-NKIPRWAE.js → projectConfig-PI6MEN2T.js} +10 -7
- package/dist/{publication-4RBVVR5Z.js → publication-67C7KVTL.js} +6 -3
- package/dist/{publish-OLHR4Z4U.js → publish-RBV7EAMH.js} +27 -20
- package/dist/{refresh-K24ETHMA.js → refresh-MFITBIKV.js} +5 -5
- package/dist/{remove-background-NPKZSIPY.js → remove-background-Z2ECZX2Q.js} +22 -15
- package/dist/{render-UOKPAJNH.js → render-2GQMQBU3.js} +10 -7
- package/dist/{render-GYYGWYQC.js → render-EFU4BZRZ.js} +23 -26
- package/dist/{render-P4NWFUS7.js → render-YBS3XGRJ.js} +52 -32
- package/dist/{render-batch-ZDG3EXSD.js → render-batch-QC64OTB5.js} +11 -8
- package/dist/{renderCancellation-QYQLWHZY.js → renderCancellation-NTVU7IMB.js} +15 -8
- package/dist/renderSetupWorker.js +4 -2
- package/dist/{resolver-CWH3VVB7.js → resolver-GBWYG3EI.js} +8 -5
- package/dist/{sherpa-WEQE23S5.js → sherpa-ZW6PWJS4.js} +46 -14
- package/dist/sherpaWorker.js +11 -3
- package/dist/skills/hyperframes/references/capability-menu.md +1 -1
- package/dist/skills/hyperframes-cli/SKILL.md +5 -0
- package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +1 -1
- package/dist/skills/hyperframes-cli/references/preview-render.md +1 -1
- package/dist/skills/media-use/SKILL.md +6 -4
- package/dist/skills/media-use/audio/scripts/lib/host-audio.mjs +28 -0
- package/dist/skills/media-use/audio/scripts/lib/host-audio.test.mjs +106 -0
- package/dist/skills/media-use/references/setup-providers.md +3 -2
- package/dist/skills/media-use/scripts/lib/heygen-cli.mjs +21 -1
- package/dist/skills/media-use/scripts/lib/heygen-cli.test.mjs +14 -0
- package/dist/skills/media-use/scripts/resolve.mjs +11 -6
- package/dist/{skills-BVONI6TC.js → skills-VKZAX5AS.js} +15 -30
- package/dist/{skillsUpdateCheck-KKDPTFM7.js → skillsUpdateCheck-PAY2OPDE.js} +3 -3
- package/dist/{snapshot-PWZFJEDR.js → snapshot-SD5R3NWX.js} +41 -32
- package/dist/{src-YO7MAWGD.js → src-7SSERHNP.js} +19 -11
- package/dist/{src-HH4C5GZV.js → src-RXTXL3VL.js} +16 -9
- package/dist/{staticProjectServer-PR5INXSA.js → staticProjectServer-XELJXX4J.js} +24 -16
- package/dist/{status-AK67DTED.js → status-JA6SKQVH.js} +7 -24
- package/dist/studio/assets/{hyperframes-player-B30apksz.js → hyperframes-player-BLuyxnK7.js} +1 -1
- package/dist/studio/assets/{index-DXVvWfQG.js → index-CWfuDCoA.js} +1 -1
- package/dist/studio/assets/{index-DIJuIBwI.js → index-Dr3Bo9uH.js} +1 -1
- package/dist/studio/assets/{index-BdjA0CLD.js → index-VAHDM_zL.js} +210 -210
- package/dist/studio/{chunk-4S3AYCOG.js → chunk-H2DUOXTF.js} +3 -2
- package/dist/studio/{chunk-TDWGXBUT.js → chunk-TFLU2MGI.js} +1 -6
- package/dist/studio/chunk-TFLU2MGI.js.map +1 -0
- package/dist/studio/{chunk-7UQWVN52.js → chunk-UYWON5AX.js} +2 -2
- package/dist/studio/{domEditingLayers-IEVLO54Z.js → domEditingLayers-KBTPQKGA.js} +3 -3
- package/dist/studio/index.d.ts +20 -3
- package/dist/studio/index.html +1 -1
- package/dist/studio/index.js +7327 -6265
- package/dist/studio/index.js.map +1 -1
- package/dist/studio/player.js +2 -2
- package/dist/{studio-api-NFJMFAB7.js → studio-api-4FNUZPJ4.js} +40 -28
- package/dist/{studioServer-TQZVCIEL.js → studioServer-GHLL3F2M.js} +99 -68
- package/dist/{system-ZWIBWWE6.js → system-OQLOGGPJ.js} +2 -19
- package/dist/{telemetry-63L2ORO3.js → telemetry-7AO77PMH.js} +8 -23
- package/dist/{timeline-QKZQL5DJ.js → timeline-6LTHSRXM.js} +32 -22
- package/dist/{tokens-ELK62U4A.js → tokens-K6B46KNL.js} +3 -3
- package/dist/{transcribe-OSK7HEOJ.js → transcribe-CLLISRLZ.js} +18 -9
- package/dist/{transcribe-VKSXTM7K.js → transcribe-K2OU6FZF.js} +37 -78
- package/dist/{updateCheck-PM4FEI7P.js → updateCheck-X6UQBS6I.js} +2 -2
- package/dist/{upgrade-G635QCNO.js → upgrade-BZFKEADI.js} +5 -5
- package/dist/{urlDownloader-MVYQTP73.js → urlDownloader-VAVUXYEQ.js} +14 -7
- package/dist/{validate-AZTMI3HR.js → validate-VO5KEXWN.js} +26 -19
- package/dist/{video-H56FK33V.js → video-JV6Y4UJR.js} +18 -11
- package/package.json +1 -1
- package/dist/chunk-UINDCCO7.js +0 -3742
- package/dist/studio/chunk-TDWGXBUT.js.map +0 -1
- package/dist/{chunk-I465DBM6.js → chunk-246MOR5U.js} +3 -3
- package/dist/{deploy-MX76RZ36.js → deploy-5G4Z6LPA.js} +1 -1
- package/dist/{destroy-H2TZBYHH.js → destroy-GFQLTIY3.js} +1 -1
- package/dist/{docs-QAPJEGLS.js → docs-MPOM3PHH.js} +3 -3
- package/dist/{policies-FSDZVS2E.js → policies-4FEXMXPK.js} +3 -3
- package/dist/{progress-FBIEEB7Y.js → progress-5AM2MZ7V.js} +3 -3
- package/dist/{sites-TNVKZS73.js → sites-HZMADOA3.js} +1 -1
- package/dist/studio/{chunk-4S3AYCOG.js.map → chunk-H2DUOXTF.js.map} +0 -0
- package/dist/studio/{chunk-7UQWVN52.js.map → chunk-UYWON5AX.js.map} +0 -0
- package/dist/studio/{domEditingLayers-IEVLO54Z.js.map → domEditingLayers-KBTPQKGA.js.map} +0 -0
- package/dist/{telemetry-2YC4SGQU.js → telemetry-W5AKPI4R.js} +3 -3
- package/dist/{tts-FU35O6YB.js → tts-TOHSPWEG.js} +4 -4
|
@@ -21,42 +21,54 @@ import "./chunk-EOVYQ3IG.js";
|
|
|
21
21
|
import {
|
|
22
22
|
getPreparedWavDurationSeconds,
|
|
23
23
|
prepareWav
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-F3SPK6SO.js";
|
|
25
|
+
import {
|
|
26
|
+
emitWords
|
|
27
|
+
} from "./chunk-6IHWCZ3W.js";
|
|
25
28
|
import {
|
|
26
29
|
stoppedByCancelSignal
|
|
27
|
-
} from "./chunk-
|
|
30
|
+
} from "./chunk-LQG6GPVK.js";
|
|
28
31
|
import "./chunk-6BEFEWFB.js";
|
|
29
32
|
import "./chunk-PXSM4HPB.js";
|
|
30
33
|
import "./chunk-WCJGTLPF.js";
|
|
31
34
|
import "./chunk-TVCRUG2S.js";
|
|
32
35
|
import "./chunk-AMKC3AXA.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
36
|
+
import "./chunk-TPECLKPA.js";
|
|
37
|
+
import "./chunk-6U3MN4HW.js";
|
|
38
|
+
import "./chunk-A4KQZXZI.js";
|
|
39
|
+
import "./chunk-USDEMXXL.js";
|
|
40
|
+
import "./chunk-QP3BRKGF.js";
|
|
35
41
|
import "./chunk-OZUQF4NB.js";
|
|
36
42
|
import "./chunk-DPVXBVLL.js";
|
|
37
|
-
import "./chunk-
|
|
38
|
-
import "./chunk-UINDCCO7.js";
|
|
43
|
+
import "./chunk-B3I3XJ47.js";
|
|
39
44
|
import "./chunk-VC76R6W2.js";
|
|
45
|
+
import "./chunk-YA62XGXS.js";
|
|
40
46
|
import "./chunk-OFQWTKPW.js";
|
|
47
|
+
import "./chunk-T76PLPD6.js";
|
|
48
|
+
import "./chunk-FXMKHHPO.js";
|
|
49
|
+
import "./chunk-RQVDTPGD.js";
|
|
41
50
|
import "./chunk-LAOCA3MQ.js";
|
|
42
51
|
import "./chunk-LCSMOLGX.js";
|
|
43
52
|
import "./chunk-TWWSYAKJ.js";
|
|
44
|
-
import "./chunk-
|
|
53
|
+
import "./chunk-WY5OODN5.js";
|
|
54
|
+
import "./chunk-24OWOBQH.js";
|
|
55
|
+
import "./chunk-JFKL3WAE.js";
|
|
45
56
|
import "./chunk-HBBJFK6I.js";
|
|
46
57
|
import "./chunk-PJ3HDUCY.js";
|
|
47
58
|
import "./chunk-TQFG7HTI.js";
|
|
48
59
|
import "./chunk-GK4AIFIH.js";
|
|
49
60
|
import "./chunk-2PSPARWP.js";
|
|
61
|
+
import "./chunk-PMRBLBUP.js";
|
|
50
62
|
import {
|
|
51
63
|
PARAKEET_MODEL_LABEL,
|
|
52
64
|
SHERPA_ERROR_PREFIX,
|
|
53
65
|
SHERPA_RESULT_PREFIX,
|
|
66
|
+
SHERPA_WINDOW_PREFIX,
|
|
54
67
|
mergeWindowsToWords,
|
|
55
68
|
writeParakeetTranscript
|
|
56
|
-
} from "./chunk-
|
|
69
|
+
} from "./chunk-KDPYVTEU.js";
|
|
70
|
+
import "./chunk-UOFAE5RF.js";
|
|
57
71
|
import "./chunk-3GXQPCJC.js";
|
|
58
|
-
import "./chunk-RQVDTPGD.js";
|
|
59
|
-
import "./chunk-PMRBLBUP.js";
|
|
60
72
|
import "./chunk-M2WBOQ2Q.js";
|
|
61
73
|
|
|
62
74
|
// src/whisper/sherpa.ts
|
|
@@ -65,6 +77,7 @@ import { createHash, randomUUID } from "crypto";
|
|
|
65
77
|
import { createReadStream, mkdirSync, renameSync, rmSync, statSync } from "fs";
|
|
66
78
|
import { homedir } from "os";
|
|
67
79
|
import { join } from "path";
|
|
80
|
+
import { createInterface } from "readline";
|
|
68
81
|
import { fileURLToPath } from "url";
|
|
69
82
|
var RUNTIME = "sherpa-onnx-node";
|
|
70
83
|
var RUNTIME_VERSION = PINNED_PACKAGES[RUNTIME];
|
|
@@ -315,13 +328,13 @@ function failureReason(err, stderr) {
|
|
|
315
328
|
if (!why) return how;
|
|
316
329
|
return `${how}: ${bounded(why)}`;
|
|
317
330
|
}
|
|
318
|
-
function decode(wavPath, runtimePath, signal) {
|
|
331
|
+
function decode(wavPath, runtimePath, signal, onWindow) {
|
|
319
332
|
const sourceMode = import.meta.url.endsWith(".ts");
|
|
320
333
|
const worker = new URL(sourceMode ? "./sherpaWorker.ts" : "./sherpaWorker.js", import.meta.url);
|
|
321
334
|
const args = [...sourceMode ? ["--import", "tsx"] : [], fileURLToPath(worker)];
|
|
322
335
|
const input = { wavPath, runtimePath, config: recognizerConfig() };
|
|
323
336
|
return new Promise((resolve, reject) => {
|
|
324
|
-
execFile(
|
|
337
|
+
const child = execFile(
|
|
325
338
|
process.execPath,
|
|
326
339
|
args,
|
|
327
340
|
{
|
|
@@ -340,6 +353,18 @@ function decode(wavPath, runtimePath, signal) {
|
|
|
340
353
|
else reject(new Error(`Parakeet decoder ${failureReason(err, stderr)}`));
|
|
341
354
|
}
|
|
342
355
|
);
|
|
356
|
+
if (onWindow && child.stdout) {
|
|
357
|
+
createInterface({ input: child.stdout }).on("line", (l) => {
|
|
358
|
+
if (!l.startsWith(SHERPA_WINDOW_PREFIX)) return;
|
|
359
|
+
let streamed;
|
|
360
|
+
try {
|
|
361
|
+
streamed = JSON.parse(l.slice(SHERPA_WINDOW_PREFIX.length));
|
|
362
|
+
} catch {
|
|
363
|
+
return;
|
|
364
|
+
}
|
|
365
|
+
onWindow(streamed.window, streamed.through);
|
|
366
|
+
});
|
|
367
|
+
}
|
|
343
368
|
});
|
|
344
369
|
}
|
|
345
370
|
function prepareSherpaWav(inputPath, onProgress) {
|
|
@@ -358,7 +383,8 @@ async function transcribeWithSherpa(wavPath, dir, options) {
|
|
|
358
383
|
type: "progress",
|
|
359
384
|
phase: "transcription",
|
|
360
385
|
model: PARAKEET_MODEL_LABEL,
|
|
361
|
-
status: "started"
|
|
386
|
+
status: "started",
|
|
387
|
+
durationSeconds: getPreparedWavDurationSeconds(wavPath)
|
|
362
388
|
});
|
|
363
389
|
if (options.signal.aborted) throw new DecodeCancelled("Transcription cancelled");
|
|
364
390
|
const selected = await selectRuntime(
|
|
@@ -372,7 +398,13 @@ async function transcribeWithSherpa(wavPath, dir, options) {
|
|
|
372
398
|
`Parakeet runtime does not load (${selected.error}). Run hyperframes models install parakeet to repair it, or use --engine whisper.`
|
|
373
399
|
);
|
|
374
400
|
}
|
|
375
|
-
const
|
|
401
|
+
const onEvent = options.onEvent;
|
|
402
|
+
const windows = await decode(
|
|
403
|
+
wavPath,
|
|
404
|
+
selected.path,
|
|
405
|
+
options.signal,
|
|
406
|
+
onEvent && ((window, through) => emitWords(onEvent, PARAKEET_MODEL_LABEL, mergeWindowsToWords([window]), through))
|
|
407
|
+
);
|
|
376
408
|
const result = writeParakeetTranscript(dir, mergeWindowsToWords(windows));
|
|
377
409
|
options.onEvent?.({
|
|
378
410
|
type: "progress",
|
package/dist/sherpaWorker.js
CHANGED
|
@@ -7,10 +7,14 @@ var __dirname = __hf_dirname(__filename);
|
|
|
7
7
|
import {
|
|
8
8
|
SHERPA_ERROR_PREFIX,
|
|
9
9
|
SHERPA_RESULT_PREFIX,
|
|
10
|
+
SHERPA_WINDOW_PREFIX,
|
|
10
11
|
droppedSpeechGaps,
|
|
11
12
|
silenceCuts,
|
|
12
13
|
spliceGap
|
|
13
|
-
} from "./chunk-
|
|
14
|
+
} from "./chunk-KDPYVTEU.js";
|
|
15
|
+
import {
|
|
16
|
+
readWav
|
|
17
|
+
} from "./chunk-UOFAE5RF.js";
|
|
14
18
|
import "./chunk-M2WBOQ2Q.js";
|
|
15
19
|
|
|
16
20
|
// src/whisper/sherpaWorker.ts
|
|
@@ -32,7 +36,7 @@ function decodeWindow(recognizer, wave, padSeconds = 0) {
|
|
|
32
36
|
try {
|
|
33
37
|
const sherpa = createRequire(import.meta.url)(runtimePath);
|
|
34
38
|
const recognizer = new sherpa.OfflineRecognizer(config);
|
|
35
|
-
const wave =
|
|
39
|
+
const wave = readWav(wavPath);
|
|
36
40
|
const cuts = silenceCuts(wave.samples, wave.sampleRate);
|
|
37
41
|
const windows = [];
|
|
38
42
|
for (let k = 0; k + 1 < cuts.length; k++) {
|
|
@@ -60,7 +64,11 @@ try {
|
|
|
60
64
|
const retry = decodeWindow(recognizer, slice, RETRY_PAD_SECONDS);
|
|
61
65
|
if (retry.tokens.length > decoded.tokens.length) decoded = retry;
|
|
62
66
|
}
|
|
63
|
-
|
|
67
|
+
const window = { offset: cuts[k] / wave.sampleRate, ...decoded };
|
|
68
|
+
windows.push(window);
|
|
69
|
+
const through = cuts[k + 1] / wave.sampleRate;
|
|
70
|
+
process.stdout.write(`${SHERPA_WINDOW_PREFIX}${JSON.stringify({ window, through })}
|
|
71
|
+
`);
|
|
64
72
|
}
|
|
65
73
|
process.stdout.write(`${SHERPA_RESULT_PREFIX}${JSON.stringify(windows)}
|
|
66
74
|
`);
|
|
@@ -12,7 +12,7 @@ Each row's last column reads **home → entry → what you get**: the owning ski
|
|
|
12
12
|
| **Website capture** — headless-Chrome crawl of a real site: screenshots, brand tokens, assets | "I can capture your site and build from its real look" | CLI → `npx hyperframes capture <URL> -o ./capture` → `capture/` (screenshots, extracted tokens/text/assets); doctrine: `/product-launch-video` |
|
|
13
13
|
| **Beat analysis & audio-reactive motion** — a deterministic beat / energy map of a track; cuts land on the grid, elements pulse with the music | "if there's music, I can cut the video to its beat — and make elements move with it" | grid: `/music-to-video` → `scripts/analyze-beatgrid.py` → `audiomap.json` (beats, energy, sections); element reaction: `/hyperframes-creative` → `references/audio-reactive.md` + `scripts/extract-audio-data.py` |
|
|
14
14
|
| **Motion blueprints** — proven scene shapes (reveals, counters, charts, dioramas) picked per beat | "each scene gets a proven motion treatment, not improvised movement" | `/hyperframes-animation` → `blueprints-index.md` + `rules-index.md` → per-beat `blueprint:` ids the build reads |
|
|
15
|
-
| **Voice, music, SFX, images, logos, media treatments** — resolved media plus source-aware color, effects, privacy, reveals, and justified overlays | "narration, music, sound effects, real assets — and footage polished or stylized to fit the story" | `/media-use` → deterministic resolve/operate tools plus `references/media-treatments.md`; shader pixels persist through `hyperframes media-treatment`, optional overlays come from Registry, and finite motion uses the host GSAP timeline
|
|
15
|
+
| **Voice, music, SFX, images, logos, media treatments** — resolved media plus source-aware color, effects, privacy, reveals, and justified overlays | "narration, music, sound effects, real assets — and footage polished or stylized to fit the story" | `/media-use` (a host app's own music and sound-effect tools come first for those) → deterministic resolve/operate tools plus `references/media-treatments.md`; shader pixels persist through `hyperframes media-treatment`, optional overlays come from Registry, and finite motion uses the host GSAP timeline |
|
|
16
16
|
| **Generative video** — an AI presenter delivers the script; a still photo becomes a talking clip; a finished video gets dubbed into another language | "an AI presenter can read your script on camera; I can animate a photo into a talking clip, or dub the video" | `/media-use` → `references/operations.md` § Generate: video (`heygen video create` / `video-translate`; OAuth free allowance where eligible) → an mp4 clip adopted into `assets/` + manifest record |
|
|
17
17
|
| **Transcription & captions** — word-timed transcripts; styled caption skins on the finished video | "accurate captions, styled to match" | `/media-use` → `scripts/transcribe.mjs` → word-timed transcript; caption machinery `captions.mjs` (home: `/faceless-explainer`) → the caption track |
|
|
18
18
|
| **Cut footage by its transcript** — trim a clip by choosing sentences, not timecodes | "I can trim your clip by picking the sentences to keep" | `/media-use` → `scripts/transcript-cut.mjs` → the trimmed clip + updated transcript |
|
|
@@ -142,6 +142,11 @@ npx hyperframes feedback --rating <0-10> --comment "<specific result or friction
|
|
|
142
142
|
|
|
143
143
|
Keep clean-run feedback concise. For any bug or friction, capture a **reproduction packet** before submitting; do not send only a symptom summary. Include the rerunnable command (relative to the project directory — feedback is submitted to a public channel, so do **not** paste absolute paths, home-directory prefixes, or user/machine identifiers), expected versus actual behavior, exact error (also strip absolute paths from stack traces — keep basename + line, drop the leading directory), whether output completed/fell back/failed, workaround, and repro-project status. For a rating ≤ 7 that describes a visual defect (black frame, flicker, corrupt output, wrong frame, blank output, other visual anomaly), also include a `COMPOSITION_STRUCTURE:` block — a privacy-preserving structural anatomy (element census + attribute presence + timeline shape) so maintainers can pattern-match against known bug families without the composition ZIP. Agents auto-fill this via the composition-census helper; the human user does not fill it by hand. If the issue did not reproduce again, say so and still include the last failing command and logs. Use `--file-issue` only with consent: it publishes a minimal reproduction to a public URL. The required packet format and privacy warning live in `references/preview-render.md`.
|
|
144
144
|
|
|
145
|
+
Two more reports are a `--comment` with no `--rating`, so they never count in the rating metric. Send them unless telemetry is disabled or the user opted out, under the same privacy rules:
|
|
146
|
+
|
|
147
|
+
- **Missing feature.** Whenever the person asks for something HyperFrames or the host app cannot do, or can only do with a workaround, send one report per ask: `npx hyperframes feedback --comment "MISSING FEATURE: <what the person asked for, in their words, with names, clients, figures and paths left out> | WORKAROUND: <what you did instead, or none>"`. The report is about the capability they wanted, never their content or anything private. A catalog search that found nothing goes to `--search-miss` instead.
|
|
148
|
+
- **Host app.** When `HYPERFRAMES_CLIENT` is set, the CLI is running inside a host app. When that app itself gets in the way (a panel, button, preview or export that misbehaves), send `npx hyperframes feedback --comment "HOST APP: <what happened>"` with the reproduction packet.
|
|
149
|
+
|
|
145
150
|
## Read the matching reference before running a command
|
|
146
151
|
|
|
147
152
|
The following references and owning skills are mandatory command contracts, not optional background reading. Before running a command in the table, read its matching row.
|
|
@@ -50,7 +50,7 @@ One command, one Chrome boot. `check` runs the linter first and skips the browse
|
|
|
50
50
|
|
|
51
51
|
Every finding carries a selector, the element's `data-*` identity, the composition source file, a bbox, and the sample time: jump straight from the JSON to the HTML you must edit and re-run.
|
|
52
52
|
|
|
53
|
-
**Severity is persistence-aware.** A dynamic issue observed at a single grid sample (an entrance/exit transient) demotes to info and never gates. Issues held across samples gate the exit code, a held `content_overlap` is an error, and a held, partially-visible `canvas_overflow` breaching ≥5% of the canvas promotes to warning. Coordinate-frame findings (`escaped_container`, `panel_out_of_canvas`, `connector_detached`) flag geometry computed in one frame but rendered in another — an element far outside its offset parent, a painted panel stuck across the canvas edge, a connector line detached from every node. Text drawn into a `<canvas>` has no DOM box, so `canvas_overflow` cannot see it; `canvas_content_at_edge` warns when a canvas's pixels show sharp content (drawn text, hard shapes) along the frame edge — mark intentional full-bleed art (particles, photos) with `data-layout-allow-overflow`. If a 3s+ composition shows
|
|
53
|
+
**Severity is persistence-aware.** A dynamic issue observed at a single grid sample (an entrance/exit transient) demotes to info and never gates. Issues held across samples gate the exit code, a held `content_overlap` is an error, and a held, partially-visible `canvas_overflow` breaching ≥5% of the canvas promotes to warning. Coordinate-frame findings (`escaped_container`, `panel_out_of_canvas`, `connector_detached`) flag geometry computed in one frame but rendered in another — an element far outside its offset parent, a painted panel stuck across the canvas edge, a connector line detached from every node. Text drawn into a `<canvas>` has no DOM box, so `canvas_overflow` cannot see it; `canvas_content_at_edge` warns when a canvas's pixels show sharp content (drawn text, hard shapes) along the frame edge — mark intentional full-bleed art (particles, photos) with `data-layout-allow-overflow`. If a 3s+ composition shows no visible change across every sample, `check` fails with `sweep_static`: a frozen timeline makes every green verdict unreliable, so it refuses to pass. When only audio advanced, it warns instead; a composition meant to be still takes `data-no-timeline` on its root. The fingerprint includes per-element opacity, so opacity-only reveals (code typing, staggered fades) count as motion — but only while they're still in flight at the sampled times. The classic trap is a reveal that completes early and then holds a static frame for the rest of the duration: every sample lands on the settled state and the run fails. Spread the reveal across the timeline or keep one continuously animated element alive (a blinking caret is idiomatic for code typing) — don't bolt on a slow position drift just to appease the check.
|
|
54
54
|
|
|
55
55
|
**Escape hatches** (mark intent in the HTML, then re-run):
|
|
56
56
|
|
|
@@ -157,7 +157,7 @@ npx hyperframes feedback --rating 10 # clean run, n
|
|
|
157
157
|
npx hyperframes feedback --rating 6 --comment "bg <video> renders grey in multi-scene; worked around with --format png-sequence"
|
|
158
158
|
```
|
|
159
159
|
|
|
160
|
-
`--rating` is an integer from 0-10
|
|
160
|
+
`--rating` is an integer from 0-10; `--comment` is free text. A `--comment` with no `--rating` is a ratingless report (`MISSING FEATURE:` and `HOST APP:` in `SKILL.md`) that never counts in the rating metric. Feedback is anonymous and attaches a `doctorSummary` (OS/Node/CPU/mem/ffmpeg) automatically, so don't repeat those fields. A clean run needs only a short result. Before sending any bug, workaround, or confusing behavior, collect this compact reproduction packet:
|
|
161
161
|
|
|
162
162
|
```text
|
|
163
163
|
REPRO COMMAND: <HF_*/PRODUCER_* env> npx hyperframes <exact command> # run from the project directory; do NOT paste absolute paths
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: media-use
|
|
3
|
-
description: Agent Media OS
|
|
3
|
+
description: Agent Media OS for a HyperFrames project. Resolve BGM, SFX, image, icon, brand logo, voice, color grade, or LUT into a frozen local file or paste-ready block + ledger record (one verb, `resolve`); generate via TTS / music / image models when the catalog misses; produce voiceover, transcription, captions, and background removal through one shared audio engine; operate on media (cut / reframe / transform); and reuse assets across projects. Also use for vague feedback that real footage looks dark, flat, boring, should feel retro/camcorder/print/ASCII, needs privacy, or needs a media reveal. When the host app provides its own music or sound-effect tools, use those for music and sound effects; `resolve --type bgm|sfx` needs the heygen CLI.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
**Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
|
|
@@ -9,7 +9,9 @@ description: Agent Media OS, the single skill for every media need in a HyperFra
|
|
|
9
9
|
|
|
10
10
|
The media OS for HyperFrames: resolve · generate · operate · remember — every media type, one skill, zero context noise.
|
|
11
11
|
|
|
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`.
|
|
12
|
+
First run, when you will use HeyGen media (catalog search, TTS, avatar video): 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
|
+
|
|
14
|
+
Music and sound effects inside a host app: when the app you run in gives you its own music or sound-effect tools, use those. `resolve --type bgm` and `--type sfx` search the HeyGen catalog through the `heygen` CLI; without it they fail and say so (`sfx` still answers from its bundled library).
|
|
13
15
|
|
|
14
16
|
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
17
|
|
|
@@ -23,8 +25,8 @@ Returns one line: `resolved <id> → <path> (<type>, <metadata>)`. All search no
|
|
|
23
25
|
|
|
24
26
|
| Type | One-line intent |
|
|
25
27
|
| ------- | -------------------------------------------------------------------------------- |
|
|
26
|
-
| `bgm` | background music (HeyGen catalog, 10k+ tracks)
|
|
27
|
-
| `sfx` | sound effects (bundled 19-file library + catalog)
|
|
28
|
+
| `bgm` | background music (HeyGen catalog via the `heygen` CLI, 10k+ tracks) |
|
|
29
|
+
| `sfx` | sound effects (bundled 19-file library + catalog via the `heygen` CLI) |
|
|
28
30
|
| `image` | photos, backgrounds (HeyGen asset search, 75k+ vectors) |
|
|
29
31
|
| `icon` | icons, symbols (transparent) |
|
|
30
32
|
| `logo` | official brand marks (theSVG → GitHub avatar → favicon; never redrawn) |
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Audio the host app supplied survives every pass that rebuilds audio_meta.json from the storyboard: an entry
|
|
2
|
+
// marked "source": "host" whose file exists. A frame the host scored takes no looked-up cue sound.
|
|
3
|
+
/** The host's own entries in an earlier audio_meta.json, and why any other host-marked entry was dropped; `exists`
|
|
4
|
+
* resolves a path from the project root. A frame written as "1" is frame 1. */
|
|
5
|
+
export function hostAudio(previous, exists) {
|
|
6
|
+
const marked = [[previous?.bgm, "path"], ...(previous?.sfx ?? []).map((s) => [s, "file"])].filter(
|
|
7
|
+
([entry]) => entry?.source === "host",
|
|
8
|
+
);
|
|
9
|
+
const kept = new Set();
|
|
10
|
+
const dropped = [];
|
|
11
|
+
for (const [entry, key] of marked) {
|
|
12
|
+
const path = entry[key];
|
|
13
|
+
if (typeof path !== "string") dropped.push(`a host entry has no "${key}"`);
|
|
14
|
+
else if (!exists(path)) dropped.push(`${path} is not on disk`);
|
|
15
|
+
else kept.add(entry);
|
|
16
|
+
}
|
|
17
|
+
const bgm = kept.has(previous?.bgm) ? previous.bgm : null;
|
|
18
|
+
const sfx = (previous?.sfx ?? [])
|
|
19
|
+
.filter((s) => kept.has(s))
|
|
20
|
+
.map((s) => ({ ...s, frame: Number(s.frame) }));
|
|
21
|
+
return { bgm, sfx, frames: new Set(sfx.map((s) => s.frame)), dropped };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** `rebuilt` with the host's bed and sounds put back; the host's bed wins over a looked-up one. */
|
|
25
|
+
export function keepHostAudio(rebuilt, host) {
|
|
26
|
+
const looked = (rebuilt.sfx ?? []).filter((s) => !host.frames.has(s.frame));
|
|
27
|
+
return { ...rebuilt, bgm: host.bgm ?? rebuilt.bgm, sfx: [...host.sfx, ...looked] };
|
|
28
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { readFileSync } from "node:fs";
|
|
3
|
+
import test from "node:test";
|
|
4
|
+
import { hostAudio, keepHostAudio } from "./host-audio.mjs";
|
|
5
|
+
|
|
6
|
+
const onDisk = new Set([
|
|
7
|
+
"assets/bgm/host.mp3",
|
|
8
|
+
"assets/sfx/custom-whoosh.mp3",
|
|
9
|
+
"assets/sfx/whoosh.mp3",
|
|
10
|
+
]);
|
|
11
|
+
const exists = (path) => onDisk.has(path);
|
|
12
|
+
const hostWhoosh = {
|
|
13
|
+
frame: 1,
|
|
14
|
+
file: "assets/sfx/custom-whoosh.mp3",
|
|
15
|
+
offset_s: 0,
|
|
16
|
+
duration_s: 2,
|
|
17
|
+
source: "host",
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
test("a host sound and bed survive a rebuild, and the host's frame takes no looked-up sound", () => {
|
|
21
|
+
const previous = {
|
|
22
|
+
bgm: { path: "assets/bgm/host.mp3", source: "host" },
|
|
23
|
+
sfx: [hostWhoosh, { frame: 2, file: "assets/sfx/whoosh.mp3", offset_s: 0 }],
|
|
24
|
+
};
|
|
25
|
+
const rebuilt = {
|
|
26
|
+
bgm: null,
|
|
27
|
+
voices: [],
|
|
28
|
+
sfx: [
|
|
29
|
+
{ frame: 1, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
30
|
+
{ frame: 2, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
31
|
+
],
|
|
32
|
+
};
|
|
33
|
+
const kept = keepHostAudio(rebuilt, hostAudio(previous, exists));
|
|
34
|
+
assert.deepEqual(kept.bgm, previous.bgm);
|
|
35
|
+
assert.deepEqual(kept.sfx, [hostWhoosh, rebuilt.sfx[1]]);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("an unmarked entry or a missing file is not the host's", () => {
|
|
39
|
+
const previous = {
|
|
40
|
+
bgm: { path: "assets/bgm/gone.mp3", source: "host" },
|
|
41
|
+
sfx: [
|
|
42
|
+
{ frame: 1, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
43
|
+
{ frame: 3, file: "assets/sfx/gone.mp3", source: "host" },
|
|
44
|
+
],
|
|
45
|
+
};
|
|
46
|
+
const host = hostAudio(previous, exists);
|
|
47
|
+
assert.equal(host.bgm, null);
|
|
48
|
+
assert.deepEqual(host.sfx, []);
|
|
49
|
+
const rebuilt = { bgm: { path: "assets/bgm/looked.mp3" }, voices: [], sfx: [] };
|
|
50
|
+
assert.deepEqual(keepHostAudio(rebuilt, host), rebuilt);
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("no earlier audio_meta.json keeps the rebuild as it is", () => {
|
|
54
|
+
const rebuilt = { bgm: null, voices: [], sfx: [{ frame: 1, file: "assets/sfx/whoosh.mp3" }] };
|
|
55
|
+
assert.deepEqual(keepHostAudio(rebuilt, hostAudio(null, exists)), rebuilt);
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
// The narrated workflows tell the agent the same host-audio contract and the same meaning of silent.
|
|
59
|
+
const workflowText = (skill, file) =>
|
|
60
|
+
readFileSync(new URL(`../../../../${skill}/${file}`, import.meta.url), "utf8");
|
|
61
|
+
|
|
62
|
+
test("each narrated workflow tells a host app's music and sounds the way in, and when a film is silent", () => {
|
|
63
|
+
for (const skill of ["product-launch-video", "pr-to-video", "faceless-explainer"]) {
|
|
64
|
+
const steps = workflowText(skill, "SKILL.md");
|
|
65
|
+
assert.match(
|
|
66
|
+
steps,
|
|
67
|
+
/host app's own tools make the music or a sound effect[^\n]+"source": "host"/,
|
|
68
|
+
skill,
|
|
69
|
+
);
|
|
70
|
+
assert.match(steps, /"duration_s": <its length>[^\n]+Every audio pass keeps these/, skill);
|
|
71
|
+
assert.match(steps, /no `SCRIPT.md`, \*\*and\*\* no `sfx:` cues or host audio/, skill);
|
|
72
|
+
assert.match(
|
|
73
|
+
steps,
|
|
74
|
+
/marked silent \(`music: none`, no `SCRIPT.md`, no `sfx:` cues or host audio\)/,
|
|
75
|
+
skill,
|
|
76
|
+
);
|
|
77
|
+
assert.match(
|
|
78
|
+
workflowText(skill, "references/story-design.md"),
|
|
79
|
+
/no `SCRIPT.md` \+ no `sfx:` cues or host audio\*\* — the canonical/,
|
|
80
|
+
skill,
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("a frame written as a string is the same frame, and a gone host file is reported", () => {
|
|
86
|
+
const previous = {
|
|
87
|
+
bgm: { path: "assets/bgm/gone.mp3", source: "host" },
|
|
88
|
+
sfx: [{ ...hostWhoosh, frame: "1" }],
|
|
89
|
+
};
|
|
90
|
+
const host = hostAudio(previous, exists);
|
|
91
|
+
assert.deepEqual(host.sfx, [hostWhoosh]);
|
|
92
|
+
assert.ok(host.frames.has(1));
|
|
93
|
+
assert.deepEqual(host.dropped, ["assets/bgm/gone.mp3 is not on disk"]);
|
|
94
|
+
const rebuilt = { bgm: null, voices: [], sfx: [{ frame: 1, file: "assets/sfx/whoosh.mp3" }] };
|
|
95
|
+
assert.deepEqual(keepHostAudio(rebuilt, host).sfx, [hostWhoosh]);
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
test("a host entry with no path is reported, not thrown", () => {
|
|
99
|
+
const throwsOnNonString = (path) => {
|
|
100
|
+
if (typeof path !== "string") throw new TypeError("path must be a string");
|
|
101
|
+
return onDisk.has(path);
|
|
102
|
+
};
|
|
103
|
+
const host = hostAudio({ bgm: { src: "x.mp3", source: "host" }, sfx: [] }, throwsOnNonString);
|
|
104
|
+
assert.equal(host.bgm, null);
|
|
105
|
+
assert.deepEqual(host.dropped, ['a host entry has no "path"']);
|
|
106
|
+
});
|
|
@@ -19,7 +19,8 @@ npx hyperframes media-use resolve --doctor
|
|
|
19
19
|
|
|
20
20
|
media-use holds no keys; every external tool owns its auth. Generation is
|
|
21
21
|
centered on the HeyGen CLI free-usage path. Install and authenticate `heygen`
|
|
22
|
-
before resolving bgm/sfx/image/icon/voice/avatar-video
|
|
22
|
+
before resolving bgm/sfx/image/icon/voice/avatar-video; music and sound effects from
|
|
23
|
+
a host app's own tools need none of it. Local tools are opt-in
|
|
23
24
|
alternatives where they exist: mflux for image, Kokoro for voice, Parakeet for
|
|
24
25
|
transcription, and LTX for local video generation. `resolve` spec-checks
|
|
25
26
|
AVAILABLE RAM for those local ladders (`describeModelLadder`); the agent can
|
|
@@ -27,7 +28,7 @@ see the ladder and override.
|
|
|
27
28
|
|
|
28
29
|
| Type | Provider / path |
|
|
29
30
|
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
30
|
-
| bgm/sfx | heygen catalog free-usage path
|
|
31
|
+
| bgm/sfx | heygen catalog free-usage path; a host app's own music and sound tools come first |
|
|
31
32
|
| image | heygen search free-usage path; optional local mflux; codex `image_gen` upsell |
|
|
32
33
|
| voice | heygen tts free-usage path; optional local **Kokoro** (free, on-device) |
|
|
33
34
|
| icon | heygen asset search free-usage path |
|
|
@@ -68,7 +68,11 @@ function classifyHeygenErrorResult(err) {
|
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
const version = firstSemver(text);
|
|
71
|
-
|
|
71
|
+
// A CLI older than the --headers flag rejects it before printing any version.
|
|
72
|
+
if (
|
|
73
|
+
(version && versionLessThan(version, HEYGEN_MIN_VERSION)) ||
|
|
74
|
+
lower.includes("unknown flag: --headers")
|
|
75
|
+
) {
|
|
72
76
|
return { code: "outdated", message: HEYGEN_OUTDATED_MESSAGE };
|
|
73
77
|
}
|
|
74
78
|
|
|
@@ -98,6 +102,22 @@ const pendingFailureTracking = new Set();
|
|
|
98
102
|
// API, move this state into a per-resolve context before reusing that path.
|
|
99
103
|
let pendingRemediation = null;
|
|
100
104
|
|
|
105
|
+
const TOOL_WORDS = { bgm: "music", sfx: "sound-effect" };
|
|
106
|
+
|
|
107
|
+
/** A music or sound-effect resolve miss after the heygen CLI was missing or too old: what is missing, the host
|
|
108
|
+
* app's own tool, the fix. Other types keep the generic miss. */
|
|
109
|
+
export function heygenMiss(type, { code }) {
|
|
110
|
+
const tool = TOOL_WORDS[type];
|
|
111
|
+
if (!tool) return null;
|
|
112
|
+
const outdated = code === "outdated";
|
|
113
|
+
const state = outdated ? `older than v${HEYGEN_MIN_VERSION}` : "not installed";
|
|
114
|
+
return {
|
|
115
|
+
code: outdated ? "heygen_cli_outdated" : "heygen_cli_missing",
|
|
116
|
+
fix: outdated ? HEYGEN_UPDATE_COMMAND : HEYGEN_INSTALL_COMMAND,
|
|
117
|
+
error: `${type} needs the heygen CLI, which is ${state}: use your host app's own ${tool} tool if it has one, or ${outdated ? "update" : "install"} the CLI.`,
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
|
|
101
121
|
export function consumeHeygenRemediation() {
|
|
102
122
|
const remediation = pendingRemediation;
|
|
103
123
|
pendingRemediation = null;
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
HEYGEN_NOT_AUTHENTICATED_MESSAGE,
|
|
10
10
|
HEYGEN_NOT_FOUND_MESSAGE,
|
|
11
11
|
HEYGEN_OUTDATED_MESSAGE,
|
|
12
|
+
heygenMiss,
|
|
12
13
|
reportHeygenFailure,
|
|
13
14
|
} from "./heygen-cli.mjs";
|
|
14
15
|
|
|
@@ -299,3 +300,16 @@ test("flushHeygenFailureTracking waits for a pending report before resolving", a
|
|
|
299
300
|
test("flushHeygenFailureTracking resolves immediately when nothing is pending", async () => {
|
|
300
301
|
await flushHeygenFailureTracking();
|
|
301
302
|
});
|
|
303
|
+
|
|
304
|
+
test("only a music or sound-effect miss names the heygen CLI and the host app's own tool", () => {
|
|
305
|
+
for (const type of ["image", "icon", "voice", "video"])
|
|
306
|
+
assert.equal(heygenMiss(type, { code: "not_found" }), null, type);
|
|
307
|
+
assert.equal(heygenMiss("bgm", { code: "not_found" }).code, "heygen_cli_missing");
|
|
308
|
+
const sfx = heygenMiss("sfx", { code: "outdated" });
|
|
309
|
+
assert.equal(sfx.code, "heygen_cli_outdated");
|
|
310
|
+
assert.match(sfx.error, /host app's own sound-effect tool/);
|
|
311
|
+
});
|
|
312
|
+
|
|
313
|
+
test("a CLI that rejects --headers without printing a version is outdated", () => {
|
|
314
|
+
assert.equal(classifyHeygenErrorCode({ stderr: "Error: unknown flag: --headers" }), "outdated");
|
|
315
|
+
});
|
|
@@ -49,6 +49,7 @@ import {
|
|
|
49
49
|
HEYGEN_MIN_VERSION,
|
|
50
50
|
HEYGEN_UPDATE_COMMAND,
|
|
51
51
|
consumeHeygenRemediation,
|
|
52
|
+
heygenMiss,
|
|
52
53
|
firstSemver,
|
|
53
54
|
flushHeygenFailureTracking,
|
|
54
55
|
versionLessThan,
|
|
@@ -530,10 +531,16 @@ async function run() {
|
|
|
530
531
|
});
|
|
531
532
|
// brand stays local: no frame.md/design.md -> upsell the HyperFrames design
|
|
532
533
|
// flow rather than reporting a generic miss (B5).
|
|
533
|
-
const
|
|
534
|
+
const ownFailure =
|
|
534
535
|
providerFailure instanceof BundledSfxAssetsError ||
|
|
535
|
-
providerFailure instanceof FfBinarySettingError
|
|
536
|
-
|
|
536
|
+
providerFailure instanceof FfBinarySettingError;
|
|
537
|
+
const heygen = consumeHeygenRemediation();
|
|
538
|
+
const miss = heygen && !ownFailure ? heygenMiss(type, heygen) : null;
|
|
539
|
+
const typed = providerFailure instanceof BundledSfxAssetsError ? providerFailure : miss;
|
|
540
|
+
const msg = ownFailure
|
|
541
|
+
? providerFailure.message
|
|
542
|
+
: miss
|
|
543
|
+
? miss.error
|
|
537
544
|
: type === "brand"
|
|
538
545
|
? "no brand spec found — add a frame.md or design.md (colors/font/logo) to this project. Run the HyperFrames design flow to create one; brand tokens are read locally for deterministic rendering."
|
|
539
546
|
: args.provider
|
|
@@ -543,9 +550,7 @@ async function run() {
|
|
|
543
550
|
console.log(
|
|
544
551
|
JSON.stringify({
|
|
545
552
|
ok: false,
|
|
546
|
-
...(
|
|
547
|
-
? { code: providerFailure.code, fix: providerFailure.fix }
|
|
548
|
-
: {}),
|
|
553
|
+
...(typed ? { code: typed.code, fix: typed.fix } : {}),
|
|
549
554
|
error: msg,
|
|
550
555
|
}),
|
|
551
556
|
);
|
|
@@ -7,21 +7,18 @@ var __dirname = __hf_dirname(__filename);
|
|
|
7
7
|
import {
|
|
8
8
|
buildNpxCommand
|
|
9
9
|
} from "./chunk-6BEFEWFB.js";
|
|
10
|
-
import {
|
|
11
|
-
R
|
|
12
|
-
} from "./chunk-WMQNIQDJ.js";
|
|
13
10
|
import {
|
|
14
11
|
trackSkillsInstallSkipped
|
|
15
|
-
} from "./chunk-
|
|
16
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-JSGANFFH.js";
|
|
13
|
+
import "./chunk-C2JUHIG5.js";
|
|
17
14
|
import {
|
|
18
15
|
diag
|
|
19
16
|
} from "./chunk-VWG7OQKU.js";
|
|
20
|
-
import
|
|
21
|
-
c
|
|
22
|
-
} from "./chunk-ZTZA4UWZ.js";
|
|
23
|
-
import "./chunk-MIOBYUXT.js";
|
|
17
|
+
import "./chunk-GQJZORQP.js";
|
|
24
18
|
import "./chunk-AMKC3AXA.js";
|
|
19
|
+
import {
|
|
20
|
+
R
|
|
21
|
+
} from "./chunk-WMQNIQDJ.js";
|
|
25
22
|
import {
|
|
26
23
|
defineCommand
|
|
27
24
|
} from "./chunk-S3S4TGEH.js";
|
|
@@ -30,21 +27,9 @@ import {
|
|
|
30
27
|
CliResultSignal,
|
|
31
28
|
setCommandExitCode
|
|
32
29
|
} from "./chunk-PBN6GBJE.js";
|
|
33
|
-
import "./chunk-
|
|
34
|
-
import "./chunk-
|
|
35
|
-
import "./chunk-
|
|
36
|
-
import "./chunk-DPVXBVLL.js";
|
|
37
|
-
import "./chunk-P5WDMFBB.js";
|
|
38
|
-
import "./chunk-UINDCCO7.js";
|
|
39
|
-
import "./chunk-VC76R6W2.js";
|
|
40
|
-
import "./chunk-OFQWTKPW.js";
|
|
41
|
-
import "./chunk-TWWSYAKJ.js";
|
|
42
|
-
import "./chunk-STA43FMY.js";
|
|
43
|
-
import "./chunk-HBBJFK6I.js";
|
|
44
|
-
import "./chunk-PJ3HDUCY.js";
|
|
45
|
-
import "./chunk-TQFG7HTI.js";
|
|
46
|
-
import "./chunk-GK4AIFIH.js";
|
|
47
|
-
import "./chunk-2PSPARWP.js";
|
|
30
|
+
import "./chunk-USDEMXXL.js";
|
|
31
|
+
import "./chunk-T76PLPD6.js";
|
|
32
|
+
import "./chunk-FXMKHHPO.js";
|
|
48
33
|
import {
|
|
49
34
|
FALLBACK_CORE_SKILLS,
|
|
50
35
|
SKILLS_CLI_LOCK_PATHS_VERIFIED_AT,
|
|
@@ -54,19 +39,19 @@ import {
|
|
|
54
39
|
isCoreSkill,
|
|
55
40
|
presentSkills,
|
|
56
41
|
pruneOrphanedLockEntries
|
|
57
|
-
} from "./chunk-
|
|
42
|
+
} from "./chunk-IFY57LUW.js";
|
|
58
43
|
import {
|
|
59
44
|
withMeta
|
|
60
|
-
} from "./chunk-
|
|
45
|
+
} from "./chunk-DDQ4LOML.js";
|
|
61
46
|
import "./chunk-K4WIOZFP.js";
|
|
62
47
|
import "./chunk-XUXGIA7H.js";
|
|
63
48
|
import "./chunk-WERLJGIC.js";
|
|
64
49
|
import "./chunk-ISN5GRYI.js";
|
|
65
|
-
import "./chunk-
|
|
50
|
+
import "./chunk-MUINFURL.js";
|
|
66
51
|
import "./chunk-KNU5COPB.js";
|
|
67
|
-
import
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
import {
|
|
53
|
+
c
|
|
54
|
+
} from "./chunk-ZTZA4UWZ.js";
|
|
70
55
|
import "./chunk-M2WBOQ2Q.js";
|
|
71
56
|
|
|
72
57
|
// src/commands/skills.ts
|
|
@@ -9,13 +9,13 @@ import {
|
|
|
9
9
|
printSkillsUpdateNotice,
|
|
10
10
|
refreshSkillsCache,
|
|
11
11
|
skillsCheckDue
|
|
12
|
-
} from "./chunk-
|
|
13
|
-
import "./chunk-
|
|
12
|
+
} from "./chunk-IFY57LUW.js";
|
|
13
|
+
import "./chunk-DDQ4LOML.js";
|
|
14
14
|
import "./chunk-K4WIOZFP.js";
|
|
15
15
|
import "./chunk-XUXGIA7H.js";
|
|
16
16
|
import "./chunk-WERLJGIC.js";
|
|
17
17
|
import "./chunk-ISN5GRYI.js";
|
|
18
|
-
import "./chunk-
|
|
18
|
+
import "./chunk-MUINFURL.js";
|
|
19
19
|
import "./chunk-KNU5COPB.js";
|
|
20
20
|
import "./chunk-M2WBOQ2Q.js";
|
|
21
21
|
export {
|