@ignix-social/editor 0.1.0
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/LICENSE +190 -0
- package/NOTICE +54 -0
- package/README.md +23 -0
- package/bin/ignix-editor.mjs +8 -0
- package/package.json +53 -0
- package/patches/index.mjs +53 -0
- package/scripts/build-ffmpeg-macos.sh +35 -0
- package/scripts/build-whisper-macos.sh +21 -0
- package/scripts/vendor.mjs +41 -0
- package/skills/ignix-editor/SKILL.md +132 -0
- package/src/audio.mjs +31 -0
- package/src/binaries.json +46 -0
- package/src/binaries.mjs +83 -0
- package/src/cli.mjs +254 -0
- package/src/prepare.mjs +74 -0
- package/src/runtime/ignix-frame.js +92 -0
- package/src/transcribe.mjs +71 -0
- package/src/validate.mjs +71 -0
- package/templates/blank/index.html +41 -0
- package/vendor/hyperframes/README.md +181 -0
- package/vendor/hyperframes/UPSTREAM.json +12 -0
- package/vendor/hyperframes/bin/hyperframes-localize-fonts.mjs +12 -0
- package/vendor/hyperframes/bin/hyperframes.mjs +11 -0
- package/vendor/hyperframes/dist/add-LR3ZR2A5.js +79 -0
- package/vendor/hyperframes/dist/agentPromptGenerator-VIIPZCJ3.js +143 -0
- package/vendor/hyperframes/dist/animatedGifPrep-P2T6YM7Z.js +34 -0
- package/vendor/hyperframes/dist/asset-BE2DOV72.js +26 -0
- package/vendor/hyperframes/dist/assetCataloger-VBLPHX24.js +340 -0
- package/vendor/hyperframes/dist/auth-RCQB2ZT7.js +60 -0
- package/vendor/hyperframes/dist/autoUpdate-RJAX3DAZ.js +268 -0
- package/vendor/hyperframes/dist/backgroundChecks-H2LCUIMJ.js +61 -0
- package/vendor/hyperframes/dist/backgroundChecksWorker.js +26 -0
- package/vendor/hyperframes/dist/batchRender-FT7AP7XH.js +355 -0
- package/vendor/hyperframes/dist/beat-analyzer.global.js +338 -0
- package/vendor/hyperframes/dist/beats-Y2EOP72P.js +309 -0
- package/vendor/hyperframes/dist/benchmark-MZ7GY3JW.js +231 -0
- package/vendor/hyperframes/dist/browser-HUTAMRQE.js +237 -0
- package/vendor/hyperframes/dist/bundleWithLocalizedFonts-5QOPOB5D.js +52 -0
- package/vendor/hyperframes/dist/capture-RLZA6EMR.js +4079 -0
- package/vendor/hyperframes/dist/capture-SZZ4IYJK.js +290 -0
- package/vendor/hyperframes/dist/captureFile-LYOJOUIE.js +15 -0
- package/vendor/hyperframes/dist/captureTimeout-PA4FYWT5.js +27 -0
- package/vendor/hyperframes/dist/catalog-KYU55EWR.js +1001 -0
- package/vendor/hyperframes/dist/check-TCG4PXLR.js +1697 -0
- package/vendor/hyperframes/dist/checkBrowser-RPMO4OW5.js +1032 -0
- package/vendor/hyperframes/dist/chunk-2EAXUCCE.js +88 -0
- package/vendor/hyperframes/dist/chunk-2EGFTPWD.js +1077 -0
- package/vendor/hyperframes/dist/chunk-2PSPARWP.js +6058 -0
- package/vendor/hyperframes/dist/chunk-2YN64IN5.js +5747 -0
- package/vendor/hyperframes/dist/chunk-3GXQPCJC.js +682 -0
- package/vendor/hyperframes/dist/chunk-3ZP5DXE7.js +15 -0
- package/vendor/hyperframes/dist/chunk-4NWOGZZS.js +1990 -0
- package/vendor/hyperframes/dist/chunk-4PFZPP2N.js +587 -0
- package/vendor/hyperframes/dist/chunk-4THIAPBL.js +128 -0
- package/vendor/hyperframes/dist/chunk-4YYJOFKS.js +28 -0
- package/vendor/hyperframes/dist/chunk-54HJ63Q2.js +29 -0
- package/vendor/hyperframes/dist/chunk-5ETJX6WM.js +89 -0
- package/vendor/hyperframes/dist/chunk-5IAKAQA7.js +389 -0
- package/vendor/hyperframes/dist/chunk-5Z63TBTX.js +37 -0
- package/vendor/hyperframes/dist/chunk-6BEFEWFB.js +25 -0
- package/vendor/hyperframes/dist/chunk-6CSYCFQV.js +68 -0
- package/vendor/hyperframes/dist/chunk-6CTIGJY7.js +154 -0
- package/vendor/hyperframes/dist/chunk-7HG4BFIN.js +93 -0
- package/vendor/hyperframes/dist/chunk-7JZ4FXP2.js +118 -0
- package/vendor/hyperframes/dist/chunk-A2Z4Z4VL.js +2961 -0
- package/vendor/hyperframes/dist/chunk-AMKC3AXA.js +25 -0
- package/vendor/hyperframes/dist/chunk-AVUUN2XD.js +4847 -0
- package/vendor/hyperframes/dist/chunk-AWDFDFI3.js +46 -0
- package/vendor/hyperframes/dist/chunk-AWNBM3MZ.js +94 -0
- package/vendor/hyperframes/dist/chunk-BXCMXMJQ.js +73 -0
- package/vendor/hyperframes/dist/chunk-BZ56MTDX.js +6 -0
- package/vendor/hyperframes/dist/chunk-CFKU7HTK.js +171 -0
- package/vendor/hyperframes/dist/chunk-CWPVM2QV.js +308 -0
- package/vendor/hyperframes/dist/chunk-DPVXBVLL.js +31292 -0
- package/vendor/hyperframes/dist/chunk-DQBY7FRR.js +397 -0
- package/vendor/hyperframes/dist/chunk-E6RPWJVC.js +213 -0
- package/vendor/hyperframes/dist/chunk-EISRN4E6.js +294 -0
- package/vendor/hyperframes/dist/chunk-EOVYQ3IG.js +143 -0
- package/vendor/hyperframes/dist/chunk-F3WZGU7C.js +479 -0
- package/vendor/hyperframes/dist/chunk-FCSIGXXP.js +366 -0
- package/vendor/hyperframes/dist/chunk-FI4I7CME.js +56 -0
- package/vendor/hyperframes/dist/chunk-FLWXXDNS.js +15 -0
- package/vendor/hyperframes/dist/chunk-GK4AIFIH.js +11171 -0
- package/vendor/hyperframes/dist/chunk-GMECXFAN.js +57 -0
- package/vendor/hyperframes/dist/chunk-GULOKZLI.js +155 -0
- package/vendor/hyperframes/dist/chunk-H4YZZ2VQ.js +68 -0
- package/vendor/hyperframes/dist/chunk-H6QMKUYA.js +477 -0
- package/vendor/hyperframes/dist/chunk-HBBJFK6I.js +273 -0
- package/vendor/hyperframes/dist/chunk-HRUGC23L.js +212 -0
- package/vendor/hyperframes/dist/chunk-HVW7ABXD.js +19 -0
- package/vendor/hyperframes/dist/chunk-HW6OYASV.js +344 -0
- package/vendor/hyperframes/dist/chunk-HWKCIWQT.js +3578 -0
- package/vendor/hyperframes/dist/chunk-I465DBM6.js +1214 -0
- package/vendor/hyperframes/dist/chunk-IGLEPPTN.js +24 -0
- package/vendor/hyperframes/dist/chunk-IGNAAHS3.js +433 -0
- package/vendor/hyperframes/dist/chunk-IHFUKJOR.js +85 -0
- package/vendor/hyperframes/dist/chunk-IQ3OUQ5Z.js +213 -0
- package/vendor/hyperframes/dist/chunk-ISN5GRYI.js +20 -0
- package/vendor/hyperframes/dist/chunk-IUZFXWSV.js +446 -0
- package/vendor/hyperframes/dist/chunk-JH556Q42.js +647 -0
- package/vendor/hyperframes/dist/chunk-JTHMTOMQ.js +601 -0
- package/vendor/hyperframes/dist/chunk-K2EQN4VU.js +405 -0
- package/vendor/hyperframes/dist/chunk-K2FTXJYH.js +16044 -0
- package/vendor/hyperframes/dist/chunk-K4WIOZFP.js +32 -0
- package/vendor/hyperframes/dist/chunk-K4WKGXRC.js +18 -0
- package/vendor/hyperframes/dist/chunk-KBJUXVOJ.js +172 -0
- package/vendor/hyperframes/dist/chunk-KC5XXX3X.js +590 -0
- package/vendor/hyperframes/dist/chunk-KNU5COPB.js +29 -0
- package/vendor/hyperframes/dist/chunk-KZI44OPA.js +185 -0
- package/vendor/hyperframes/dist/chunk-L3YOGIPG.js +48 -0
- package/vendor/hyperframes/dist/chunk-LAOCA3MQ.js +189 -0
- package/vendor/hyperframes/dist/chunk-LCSMOLGX.js +312 -0
- package/vendor/hyperframes/dist/chunk-LFGJWOVA.js +61 -0
- package/vendor/hyperframes/dist/chunk-LHSR3M4M.js +498 -0
- package/vendor/hyperframes/dist/chunk-LYNI3FOL.js +123 -0
- package/vendor/hyperframes/dist/chunk-M2WBOQ2Q.js +54 -0
- package/vendor/hyperframes/dist/chunk-MRF4AMKD.js +104 -0
- package/vendor/hyperframes/dist/chunk-MWB3ZIFM.js +852 -0
- package/vendor/hyperframes/dist/chunk-NGKM64BP.js +39 -0
- package/vendor/hyperframes/dist/chunk-NXMYHJAL.js +43 -0
- package/vendor/hyperframes/dist/chunk-OAF4XJOW.js +192 -0
- package/vendor/hyperframes/dist/chunk-OFQWTKPW.js +117 -0
- package/vendor/hyperframes/dist/chunk-P6LJ4Y32.js +4662 -0
- package/vendor/hyperframes/dist/chunk-PBN6GBJE.js +108 -0
- package/vendor/hyperframes/dist/chunk-PDAMK4Q5.js +28 -0
- package/vendor/hyperframes/dist/chunk-PFCFR3KZ.js +20 -0
- package/vendor/hyperframes/dist/chunk-PJ3HDUCY.js +108 -0
- package/vendor/hyperframes/dist/chunk-PMRBLBUP.js +152 -0
- package/vendor/hyperframes/dist/chunk-PPQUYWTW.js +240 -0
- package/vendor/hyperframes/dist/chunk-Q5X2B5WT.js +29 -0
- package/vendor/hyperframes/dist/chunk-Q7IU7MOR.js +351 -0
- package/vendor/hyperframes/dist/chunk-QC4FJVLM.js +371 -0
- package/vendor/hyperframes/dist/chunk-QNYYOUU3.js +1318 -0
- package/vendor/hyperframes/dist/chunk-RDNNAKEP.js +161 -0
- package/vendor/hyperframes/dist/chunk-RMHUQGRK.js +657 -0
- package/vendor/hyperframes/dist/chunk-RQVDTPGD.js +6 -0
- package/vendor/hyperframes/dist/chunk-RVCWIIZ7.js +68 -0
- package/vendor/hyperframes/dist/chunk-S3D6GE5W.js +72 -0
- package/vendor/hyperframes/dist/chunk-S3S4TGEH.js +424 -0
- package/vendor/hyperframes/dist/chunk-S7NPLFWV.js +11395 -0
- package/vendor/hyperframes/dist/chunk-SHB5VDMH.js +51 -0
- package/vendor/hyperframes/dist/chunk-TCLGPL65.js +860 -0
- package/vendor/hyperframes/dist/chunk-THXFSPLV.js +40 -0
- package/vendor/hyperframes/dist/chunk-TJSTGSAW.js +354 -0
- package/vendor/hyperframes/dist/chunk-TQFG7HTI.js +1024 -0
- package/vendor/hyperframes/dist/chunk-TVCRUG2S.js +265 -0
- package/vendor/hyperframes/dist/chunk-TWWSYAKJ.js +24 -0
- package/vendor/hyperframes/dist/chunk-U7CZBDMV.js +27 -0
- package/vendor/hyperframes/dist/chunk-UEZXMWG3.js +139 -0
- package/vendor/hyperframes/dist/chunk-UYEZTK4U.js +61 -0
- package/vendor/hyperframes/dist/chunk-VC76R6W2.js +27 -0
- package/vendor/hyperframes/dist/chunk-VFCKXTBB.js +159 -0
- package/vendor/hyperframes/dist/chunk-VWG7OQKU.js +22 -0
- package/vendor/hyperframes/dist/chunk-VXVRPIJA.js +105 -0
- package/vendor/hyperframes/dist/chunk-WBLXWOYK.js +15 -0
- package/vendor/hyperframes/dist/chunk-WERLJGIC.js +20 -0
- package/vendor/hyperframes/dist/chunk-WMQNIQDJ.js +2057 -0
- package/vendor/hyperframes/dist/chunk-WPHMNO44.js +4528 -0
- package/vendor/hyperframes/dist/chunk-X5HWXQPU.js +113 -0
- package/vendor/hyperframes/dist/chunk-X7MTZ4T2.js +6 -0
- package/vendor/hyperframes/dist/chunk-XH4DSOS5.js +59 -0
- package/vendor/hyperframes/dist/chunk-XS4EJSKU.js +23 -0
- package/vendor/hyperframes/dist/chunk-XT5P4QMO.js +181 -0
- package/vendor/hyperframes/dist/chunk-XT7X6QCP.js +6 -0
- package/vendor/hyperframes/dist/chunk-XUHOIDKG.js +6 -0
- package/vendor/hyperframes/dist/chunk-XUXGIA7H.js +485 -0
- package/vendor/hyperframes/dist/chunk-XZABUQTX.js +113 -0
- package/vendor/hyperframes/dist/chunk-Y6W4DVPS.js +356 -0
- package/vendor/hyperframes/dist/chunk-YEIFI443.js +44 -0
- package/vendor/hyperframes/dist/chunk-YQZNILVH.js +375 -0
- package/vendor/hyperframes/dist/chunk-Z27A7NUB.js +65 -0
- package/vendor/hyperframes/dist/chunk-Z6B37SNM.js +3081 -0
- package/vendor/hyperframes/dist/chunk-ZJUKFZ2P.js +10954 -0
- package/vendor/hyperframes/dist/chunk-ZKDMAOFU.js +32 -0
- package/vendor/hyperframes/dist/chunk-ZMXUQLI2.js +17219 -0
- package/vendor/hyperframes/dist/chunk-ZTZ7NCJT.js +58 -0
- package/vendor/hyperframes/dist/chunk-ZTZA4UWZ.js +108 -0
- package/vendor/hyperframes/dist/clean-W57E5YQ3.js +293 -0
- package/vendor/hyperframes/dist/cli.js +495 -0
- package/vendor/hyperframes/dist/cloud-FFTJGZ24.js +70 -0
- package/vendor/hyperframes/dist/cloudrun-AJUTHUEA.js +763 -0
- package/vendor/hyperframes/dist/colors-HKWSZCGK.js +15 -0
- package/vendor/hyperframes/dist/commands/contrast-audit.browser.js +459 -0
- package/vendor/hyperframes/dist/commands/layout-audit.browser.js +2102 -0
- package/vendor/hyperframes/dist/commands/motion-sample.browser.js +74 -0
- package/vendor/hyperframes/dist/commands/motion-signature.browser.js +374 -0
- package/vendor/hyperframes/dist/compare-AYCTT55F.js +421 -0
- package/vendor/hyperframes/dist/compiler-QO36EXLS.js +121 -0
- package/vendor/hyperframes/dist/component-VFFR2O7T.js +176 -0
- package/vendor/hyperframes/dist/compositions-QTVN3U2A.js +228 -0
- package/vendor/hyperframes/dist/contactSheet-27SRU7A4.js +22 -0
- package/vendor/hyperframes/dist/delete-ZAKYCB7I.js +114 -0
- package/vendor/hyperframes/dist/deploy-MX76RZ36.js +101 -0
- package/vendor/hyperframes/dist/destroy-H2TZBYHH.js +42 -0
- package/vendor/hyperframes/dist/deterministicFonts-HAEMV4TM.js +50 -0
- package/vendor/hyperframes/dist/dist-EWXJGN63.js +129 -0
- package/vendor/hyperframes/dist/dist-FNNGCKFS.js +29 -0
- package/vendor/hyperframes/dist/dist-S3PJNPXQ.js +392 -0
- package/vendor/hyperframes/dist/docker/Dockerfile.render +65 -0
- package/vendor/hyperframes/dist/docs/compositions.md +67 -0
- package/vendor/hyperframes/dist/docs/data-attributes.md +27 -0
- package/vendor/hyperframes/dist/docs/examples.md +19 -0
- package/vendor/hyperframes/dist/docs/gsap.md +26 -0
- package/vendor/hyperframes/dist/docs/rendering.md +35 -0
- package/vendor/hyperframes/dist/docs/troubleshooting.md +29 -0
- package/vendor/hyperframes/dist/docs-QAPJEGLS.js +131 -0
- package/vendor/hyperframes/dist/doctor-AI7C3FON.js +67 -0
- package/vendor/hyperframes/dist/dom-IROKGVJI.js +14 -0
- package/vendor/hyperframes/dist/dotEnv-AECLXQSO.js +14 -0
- package/vendor/hyperframes/dist/events-7LALYNKZ.js +92 -0
- package/vendor/hyperframes/dist/events-FQY3HGKZ.js +88 -0
- package/vendor/hyperframes/dist/feedback-WCMDMSTK.js +472 -0
- package/vendor/hyperframes/dist/ffmpeg-QIUFEFTY.js +35 -0
- package/vendor/hyperframes/dist/figma-64WY462P.js +63 -0
- package/vendor/hyperframes/dist/fontData.generated-NXAOI4GH.js +13 -0
- package/vendor/hyperframes/dist/fontLocalizeCli.js +132 -0
- package/vendor/hyperframes/dist/get-FPOMJMZB.js +103 -0
- package/vendor/hyperframes/dist/gpuPolicy-2ZUZE5D6.js +38 -0
- package/vendor/hyperframes/dist/grade-compare-E2CKPST4.js +647 -0
- package/vendor/hyperframes/dist/gsapParser-DIYYX6JT.js +2846 -0
- package/vendor/hyperframes/dist/gsapParserAcorn-E3GEIRZB.js +28 -0
- package/vendor/hyperframes/dist/help-YRQIDDML.js +197 -0
- package/vendor/hyperframes/dist/history-PP5NDRV3.js +571 -0
- package/vendor/hyperframes/dist/hyperframe-runtime.js +1081 -0
- package/vendor/hyperframes/dist/hyperframe.manifest.json +22 -0
- package/vendor/hyperframes/dist/hyperframe.runtime.iife.js +1081 -0
- package/vendor/hyperframes/dist/hyperframes-player.global.js +474 -0
- package/vendor/hyperframes/dist/hyperframes-slideshow.global.js +149 -0
- package/vendor/hyperframes/dist/info-SEX3B7JL.js +153 -0
- package/vendor/hyperframes/dist/init-U3AKHO5B.js +1147 -0
- package/vendor/hyperframes/dist/inspect-Q3K6EDEK.js +97 -0
- package/vendor/hyperframes/dist/installer-K6O5WF44.js +37 -0
- package/vendor/hyperframes/dist/keyframes-DC64JCI3.js +2602 -0
- package/vendor/hyperframes/dist/lambda-D7UMN4DJ.js +451 -0
- package/vendor/hyperframes/dist/layout-XSPPDHOO.js +86 -0
- package/vendor/hyperframes/dist/lib-TPG2ZMAX.js +128 -0
- package/vendor/hyperframes/dist/lint-7DQZE7L3.js +164 -0
- package/vendor/hyperframes/dist/lintProject-OHBBM3DJ.js +27 -0
- package/vendor/hyperframes/dist/list-4K5MVDQX.js +162 -0
- package/vendor/hyperframes/dist/login-NTX4OWXL.js +377 -0
- package/vendor/hyperframes/dist/logout-Q654A3SI.js +100 -0
- package/vendor/hyperframes/dist/manager-67P2XFXQ.js +34 -0
- package/vendor/hyperframes/dist/manager-CT3D67CG.js +38 -0
- package/vendor/hyperframes/dist/manager-GFN75DM4.js +30 -0
- package/vendor/hyperframes/dist/media-treatment-5FYAOPNL.js +972 -0
- package/vendor/hyperframes/dist/media-use-4XXGABIL.js +113 -0
- package/vendor/hyperframes/dist/models-C4E4IWJD.js +137 -0
- package/vendor/hyperframes/dist/motionShot-S4MIGMT5.js +614 -0
- package/vendor/hyperframes/dist/normalize-O76AC4HE.js +333 -0
- package/vendor/hyperframes/dist/normalize-audio-CSFTXLXD.js +276 -0
- package/vendor/hyperframes/dist/open-2ZD6BHZG.js +115 -0
- package/vendor/hyperframes/dist/pipeline-TNGWUZQC.js +54 -0
- package/vendor/hyperframes/dist/play-CTMUXX6E.js +349 -0
- package/vendor/hyperframes/dist/policies-FSDZVS2E.js +292 -0
- package/vendor/hyperframes/dist/preflight-SMNV6RW2.js +45 -0
- package/vendor/hyperframes/dist/present-WQVHV5CR.js +350 -0
- package/vendor/hyperframes/dist/preview-JOJXTH75.js +1820 -0
- package/vendor/hyperframes/dist/producer-ECLEN5RP.js +13 -0
- package/vendor/hyperframes/dist/progress-FBIEEB7Y.js +73 -0
- package/vendor/hyperframes/dist/projectConfig-HYJMJ5BY.js +56 -0
- package/vendor/hyperframes/dist/publication-HQ5Y3KBM.js +29 -0
- package/vendor/hyperframes/dist/publish-VHDYQASC.js +430 -0
- package/vendor/hyperframes/dist/refresh-K24ETHMA.js +53 -0
- package/vendor/hyperframes/dist/remove-background-W2YX2NVH.js +253 -0
- package/vendor/hyperframes/dist/render-AO5VX3YI.js +177 -0
- package/vendor/hyperframes/dist/render-LNO62LEL.js +2367 -0
- package/vendor/hyperframes/dist/render-TTQI7TGN.js +796 -0
- package/vendor/hyperframes/dist/render-batch-YH7CTWNY.js +284 -0
- package/vendor/hyperframes/dist/renderCancellation-JPIHE47X.js +35 -0
- package/vendor/hyperframes/dist/renderSetupWorker.js +79 -0
- package/vendor/hyperframes/dist/resolver-IZ647GBZ.js +38 -0
- package/vendor/hyperframes/dist/runtimeVersion.js +18 -0
- package/vendor/hyperframes/dist/screenshotCapture-ECBTLCU6.js +179 -0
- package/vendor/hyperframes/dist/shaderTransitionWorker.js +44 -0
- package/vendor/hyperframes/dist/sherpa-KKLNW6U2.js +314 -0
- package/vendor/hyperframes/dist/sherpaWorker.js +77 -0
- package/vendor/hyperframes/dist/sites-TNVKZS73.js +52 -0
- package/vendor/hyperframes/dist/skill-ZHVLH7KX.js +15 -0
- package/vendor/hyperframes/dist/skills/hyperframes/SKILL.md +152 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/brief-contract.md +108 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/brief-format.md +72 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/capability-menu.md +47 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/frame-worker-core.md +80 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/intent-interview.md +73 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/pitch-round.md +40 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/plugin-installation.md +43 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/production-loop.md +26 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/review-loop.md +37 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/route-briefs.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/embedded-captions.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/general-video.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/motion-graphics.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/music-to-video.md +12 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/pr-to-video.md +28 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/product-launch-video.md +13 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/slideshow.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/script-format.md +52 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/skill-lifecycle.md +35 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/storyboard-format.md +99 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/subagent-dispatch.md +35 -0
- package/vendor/hyperframes/dist/skills/hyperframes/references/workflow-catalog.md +10 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
- package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/SKILL.md +189 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/beats.md +19 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloud.md +163 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloudrun.md +62 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/compare-and-batch.md +105 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/doctor-browser.md +57 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/init-and-scaffold.md +74 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lambda.md +185 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +132 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/preview-render.md +193 -0
- package/vendor/hyperframes/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +134 -0
- package/vendor/hyperframes/dist/skills/media-use/SKILL.md +100 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/CREDITS.md +35 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/chime.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click-soft.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/error.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-1.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-2.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-3.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-1.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-2.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/key-press.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/manifest.json +97 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/notification.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/ping.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/pop.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/riser.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/sparkle.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/typing.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-cinematic.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-short.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh.mp3 +0 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/bgm.md +76 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/authoring.md +163 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/motion.md +87 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/transcript-handling.md +97 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/remove-background.md +143 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/requirements.md +29 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/sfx.md +42 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/transcribe.md +52 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/tts-to-captions.md +35 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/references/tts.md +260 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.mjs +311 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.test.mjs +159 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +131 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.mjs +122 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.test.mjs +38 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.mjs +98 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.test.mjs +233 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.mjs +257 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.test.mjs +74 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.mjs +14 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.test.mjs +41 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.mjs +197 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.test.mjs +185 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.mjs +114 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.test.mjs +205 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.mjs +77 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.mjs +165 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.test.mjs +121 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.mjs +389 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.spawn.test.mjs +158 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.test.mjs +230 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lyria-recipe.py +136 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.mjs +175 -0
- package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.test.mjs +108 -0
- package/vendor/hyperframes/dist/skills/media-use/luts/README.md +28 -0
- package/vendor/hyperframes/dist/skills/media-use/luts/index.json +57 -0
- package/vendor/hyperframes/dist/skills/media-use/references/audio.md +20 -0
- package/vendor/hyperframes/dist/skills/media-use/references/grading.md +160 -0
- package/vendor/hyperframes/dist/skills/media-use/references/media-treatment-recipes.md +929 -0
- package/vendor/hyperframes/dist/skills/media-use/references/media-treatments.md +202 -0
- package/vendor/hyperframes/dist/skills/media-use/references/memory.md +37 -0
- package/vendor/hyperframes/dist/skills/media-use/references/meta.md +61 -0
- package/vendor/hyperframes/dist/skills/media-use/references/operations.md +327 -0
- package/vendor/hyperframes/dist/skills/media-use/references/resolve.md +150 -0
- package/vendor/hyperframes/dist/skills/media-use/references/setup-providers.md +80 -0
- package/vendor/hyperframes/dist/skills/media-use/references/telemetry-dashboard.md +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/audio-duck.mjs +113 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/compatibility.test.mjs +96 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/dither.mjs +328 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/dither.test.mjs +176 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/eval.mjs +369 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.mjs +128 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.test.mjs +95 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bgm-provider.mjs +20 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/brand-provider.mjs +59 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +119 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +139 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cache.mjs +148 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.mjs +91 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.test.mjs +155 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.mjs +161 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.test.mjs +34 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.d.mts +3 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.mjs +45 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.test.mjs +79 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/coverage.test.mjs +136 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.mjs +181 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.test.mjs +80 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.mjs +198 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.test.mjs +125 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.mjs +184 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.test.mjs +162 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.mjs +95 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.test.mjs +153 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.mjs +230 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.test.mjs +102 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.mjs +72 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.test.mjs +138 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.mjs +265 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.test.mjs +285 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.mjs +191 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.test.mjs +301 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.mjs +45 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.test.mjs +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.mjs +138 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +435 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/image-provider.mjs +44 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/index-gen.mjs +63 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-media-search.mjs +32 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.mjs +318 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.test.mjs +220 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.mjs +78 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.test.mjs +121 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.mjs +244 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.test.mjs +298 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.mjs +94 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +316 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.mjs +271 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +199 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.d.mts +19 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.mjs +279 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.test.mjs +397 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/match.mjs +47 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.test.mjs +197 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.mjs +20 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.test.mjs +61 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.d.mts +9 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.mjs +107 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.mjs +128 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.test.mjs +174 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.mjs +49 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.test.mjs +89 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.mjs +31 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.test.mjs +50 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.mjs +27 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.test.mjs +44 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.mjs +180 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.test.mjs +189 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.mjs +41 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.test.mjs +148 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/providers.mjs +5 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.mjs +367 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.test.mjs +367 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.mjs +212 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.test.mjs +262 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.mjs +24 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.test.mjs +32 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/sfx-provider.mjs +23 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.mjs +132 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.test.mjs +157 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.mjs +117 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.test.mjs +165 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/svg-sanitize.mjs +21 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.mjs +210 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.test.mjs +437 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/test-home.test.mjs +10 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.test.mjs +33 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.mjs +94 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.test.mjs +72 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.mjs +57 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.test.mjs +54 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.mjs +57 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.test.mjs +46 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/lib/words.mjs +18 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/prefs.mjs +70 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/recipe.mjs +103 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/resolve.mjs +1369 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.mjs +194 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.test.mjs +112 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.mjs +270 -0
- package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
- package/vendor/hyperframes/dist/skills-MJ2J4GEM.js +808 -0
- package/vendor/hyperframes/dist/skillsUpdateCheck-TKTYQN5R.js +26 -0
- package/vendor/hyperframes/dist/slideshow-EJ4IMY6P.js +24 -0
- package/vendor/hyperframes/dist/snapshot-KIVDUUMN.js +875 -0
- package/vendor/hyperframes/dist/src-6YQBJGWR.js +202 -0
- package/vendor/hyperframes/dist/src-PVYUYV3M.js +471 -0
- package/vendor/hyperframes/dist/state-KAXGHF77.js +26 -0
- package/vendor/hyperframes/dist/staticProjectServer-7EU666GS.js +49 -0
- package/vendor/hyperframes/dist/status-YM52BQ6S.js +311 -0
- package/vendor/hyperframes/dist/studio/assets/hyperframes-player-Cp8e_Zst.js +473 -0
- package/vendor/hyperframes/dist/studio/assets/index-BX3KHhGX.js +71 -0
- package/vendor/hyperframes/dist/studio/assets/index-CASEBNy2.js +1 -0
- package/vendor/hyperframes/dist/studio/assets/index-D11atkBt.css +1 -0
- package/vendor/hyperframes/dist/studio/assets/index-DMTt9nTf.js +531 -0
- package/vendor/hyperframes/dist/studio/assets/index-oE1pOdAy.js +399 -0
- package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js +948 -0
- package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js +938 -0
- package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js +190 -0
- package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js +1441 -0
- package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js +10 -0
- package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js.map +1 -0
- package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js +1103 -0
- package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js.map +1 -0
- package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js +47 -0
- package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js.map +1 -0
- package/vendor/hyperframes/dist/studio/favicon.svg +14 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/audio.svg +7 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/captions.svg +5 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/composition.svg +12 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/image.svg +18 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/music.svg +10 -0
- package/vendor/hyperframes/dist/studio/icons/timeline/text.svg +3 -0
- package/vendor/hyperframes/dist/studio/index.css +165 -0
- package/vendor/hyperframes/dist/studio/index.css.map +1 -0
- package/vendor/hyperframes/dist/studio/index.d.ts +4296 -0
- package/vendor/hyperframes/dist/studio/index.html +23 -0
- package/vendor/hyperframes/dist/studio/index.js +99693 -0
- package/vendor/hyperframes/dist/studio/index.js.map +1 -0
- package/vendor/hyperframes/dist/studio/player.d.ts +30 -0
- package/vendor/hyperframes/dist/studio/player.js +10 -0
- package/vendor/hyperframes/dist/studio/player.js.map +1 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.d.ts +39 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js +50 -0
- package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js.map +1 -0
- package/vendor/hyperframes/dist/studio/styles.css +1 -0
- package/vendor/hyperframes/dist/studio/ui.d.ts +296 -0
- package/vendor/hyperframes/dist/studio/ui.js +66 -0
- package/vendor/hyperframes/dist/studio/ui.js.map +1 -0
- package/vendor/hyperframes/dist/studio-api-PNQZRPX5.js +136 -0
- package/vendor/hyperframes/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
- package/vendor/hyperframes/dist/studioServer-UWRBPIOJ.js +1457 -0
- package/vendor/hyperframes/dist/synthesize-K62TIZWI.js +182 -0
- package/vendor/hyperframes/dist/system-EZYZNUFD.js +44 -0
- package/vendor/hyperframes/dist/telemetry-2YC4SGQU.js +144 -0
- package/vendor/hyperframes/dist/telemetry-QMYM4WME.js +95 -0
- package/vendor/hyperframes/dist/templates/_shared/AGENTS.md +107 -0
- package/vendor/hyperframes/dist/templates/_shared/CLAUDE.md +107 -0
- package/vendor/hyperframes/dist/templates/blank/index.html +55 -0
- package/vendor/hyperframes/dist/templates/from-file/index.html +75 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/captions.html +154 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/graphics.html +162 -0
- package/vendor/hyperframes/dist/templates/warm-grain/compositions/intro.html +87 -0
- package/vendor/hyperframes/dist/templates/warm-grain/index.html +264 -0
- package/vendor/hyperframes/dist/templates/warm-grain/registry-item.json +34 -0
- package/vendor/hyperframes/dist/timeline-77Z3BBQM.js +1377 -0
- package/vendor/hyperframes/dist/tokens-OBGTYE4Z.js +92 -0
- package/vendor/hyperframes/dist/transcribe-7NVFHCGA.js +387 -0
- package/vendor/hyperframes/dist/transcribe-BNSJRR4M.js +62 -0
- package/vendor/hyperframes/dist/tts-P3LIPIL5.js +234 -0
- package/vendor/hyperframes/dist/updateCheck-UDWIJ4ZQ.js +39 -0
- package/vendor/hyperframes/dist/upgrade-CT3CPO3E.js +231 -0
- package/vendor/hyperframes/dist/urlDownloader-H6WRI2UE.js +39 -0
- package/vendor/hyperframes/dist/usage-EC3KFUIJ.js +2139 -0
- package/vendor/hyperframes/dist/validate-65QDZJWZ.js +70 -0
- package/vendor/hyperframes/dist/video-FGSGKRSV.js +261 -0
- package/vendor/hyperframes/dist/workspaceBuildCheck-TOLGAI4T.js +133 -0
- package/vendor/hyperframes/package.json +80 -0
|
@@ -0,0 +1,311 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// audio.mjs — the shared HyperFrames audio engine. ONE implementation of TTS +
|
|
3
|
+
// BGM + SFX for every video workflow (product-launch, general-video, pr-to-video,
|
|
4
|
+
// …). Workflows do NOT vendor a copy: they write a neutral `audio_request.json`
|
|
5
|
+
// (a tiny per-workflow adapter maps their storyboard/scenes into it) and call:
|
|
6
|
+
//
|
|
7
|
+
// node <MEDIA_DIR>/scripts/audio.mjs --request ./audio_request.json --hyperframes . --out ./audio_meta.json
|
|
8
|
+
//
|
|
9
|
+
// The three capabilities degrade on ONE switch — whether HeyGen is configured
|
|
10
|
+
// (credential present, NOT the CLI). This mirrors the table in ../SKILL.md:
|
|
11
|
+
//
|
|
12
|
+
// TTS : HeyGen REST → ElevenLabs → Kokoro (CLI)
|
|
13
|
+
// BGM : HeyGen retrieve → (no credential) Lyria/MusicGen generate
|
|
14
|
+
// SFX : HeyGen retrieve → (no credential) bundled 19-file library
|
|
15
|
+
//
|
|
16
|
+
// ── audio_request.json (input) ────────────────────────────────────────────────
|
|
17
|
+
// {
|
|
18
|
+
// "provider": "auto", // auto|heygen|elevenlabs|kokoro|gemini (override: --provider)
|
|
19
|
+
// "lang": "en", "speed": 1.0,
|
|
20
|
+
// "lines": [ // one TTS unit each; id joins back to the caller's model
|
|
21
|
+
// { "id": "01", "text": "...", "sfx": ["whoosh", "ui click"] }
|
|
22
|
+
// ],
|
|
23
|
+
// "bgm": { "mode": "retrieve", // retrieve|generate|none (override: --bgm-mode / --no-bgm)
|
|
24
|
+
// "query": "calm cinematic underscore", // mood for retrieval
|
|
25
|
+
// "prompt": null, // full prompt for generation (else inferred)
|
|
26
|
+
// "blob": "...", "archetype": "...", "arc": "..." } // optional mood-inference hints
|
|
27
|
+
// }
|
|
28
|
+
//
|
|
29
|
+
// ── audio_meta.json (output, id-keyed) ───────────────────────────────────────
|
|
30
|
+
// { tts_provider, voice_id,
|
|
31
|
+
// bgm: { path, volume, mode, query?, duration_s? } | null,
|
|
32
|
+
// bgm_pending, bgm_provider, bgm_pid, bgm_log, bgm_mode, bgm_target_duration_s, …,
|
|
33
|
+
// voices: [ { id, path, duration_s, words: [{id,text,start,end}] } ],
|
|
34
|
+
// sfx: [ { id, name, file, source, offset_s, duration_s, volume } ],
|
|
35
|
+
// total_duration_s }
|
|
36
|
+
//
|
|
37
|
+
// --only tts,bgm,sfx runs a subset and MERGES into an existing --out (so a
|
|
38
|
+
// workflow can do TTS+BGM early, then SFX later once cues exist). When BGM uses
|
|
39
|
+
// the generate path it is spawned detached (bgm_pending:true) — run wait-bgm.mjs
|
|
40
|
+
// before assembling.
|
|
41
|
+
|
|
42
|
+
import { existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
43
|
+
import { dirname, join, resolve } from "node:path";
|
|
44
|
+
import { fileURLToPath } from "node:url";
|
|
45
|
+
import { heygenAuthHeaders, heygenCredential, loadEnvFromDir } from "./lib/heygen.mjs";
|
|
46
|
+
import {
|
|
47
|
+
ffprobeDuration,
|
|
48
|
+
pickProvider,
|
|
49
|
+
resolveVoiceId,
|
|
50
|
+
synthesizeOne,
|
|
51
|
+
transcribeWav,
|
|
52
|
+
withWordIds,
|
|
53
|
+
} from "./lib/tts.mjs";
|
|
54
|
+
import { generateBgmDetached, inferBgmPrompt, retrieveBgm } from "./lib/bgm.mjs";
|
|
55
|
+
import { resolveSfx } from "./lib/sfx.mjs";
|
|
56
|
+
import { mapWithConcurrency } from "./lib/concurrency.mjs";
|
|
57
|
+
import { openAudioMeta } from "./lib/audio-meta.mjs";
|
|
58
|
+
import { recordInManifest, voicePaths, writtenAssets } from "./lib/media-record.mjs";
|
|
59
|
+
|
|
60
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
61
|
+
const argv = process.argv.slice(2);
|
|
62
|
+
const flag = (name, def) => {
|
|
63
|
+
const i = argv.indexOf(`--${name}`);
|
|
64
|
+
return i >= 0 && i + 1 < argv.length ? argv[i + 1] : def;
|
|
65
|
+
};
|
|
66
|
+
const has = (name) => argv.includes(`--${name}`);
|
|
67
|
+
const die = (m) => {
|
|
68
|
+
console.error(`✗ audio engine: ${m}`);
|
|
69
|
+
process.exit(1);
|
|
70
|
+
};
|
|
71
|
+
const r3 = (x) => Number(x.toFixed(3));
|
|
72
|
+
|
|
73
|
+
// Two independent reports of an unbounded Promise.all over TTS lines
|
|
74
|
+
// overwhelming a machine: one OOM'd 12/13 concurrent Kokoro TTS +
|
|
75
|
+
// whisper-transcribe lines on a resource-constrained laptop, the other saw
|
|
76
|
+
// 7/8 lines fail on first run (concurrent cold-start model loads) and pass on
|
|
77
|
+
// retry once the model was cached. Kokoro/Whisper each load their own local
|
|
78
|
+
// model per subprocess, so firing every line at once multiplies that cost by
|
|
79
|
+
// the line count. mapWithConcurrency caps how many run at once — still
|
|
80
|
+
// parallel, just bounded.
|
|
81
|
+
const ttsConcurrency = Math.max(1, Number(process.env.HYPERFRAMES_TTS_CONCURRENCY) || 4);
|
|
82
|
+
|
|
83
|
+
const hyperframesDir = resolve(flag("hyperframes", "."));
|
|
84
|
+
const requestPath = resolve(flag("request", join(hyperframesDir, "audio_request.json")));
|
|
85
|
+
const outPath = resolve(flag("out", join(hyperframesDir, "audio_meta.json")));
|
|
86
|
+
const sfxLibDir = resolve(flag("sfx-lib", join(HERE, "..", "assets", "sfx")));
|
|
87
|
+
const lyriaRecipe = resolve(flag("lyria-recipe", join(HERE, "lyria-recipe.py")));
|
|
88
|
+
const onlyArg = flag("only", "tts,bgm,sfx");
|
|
89
|
+
const only = new Set(
|
|
90
|
+
onlyArg
|
|
91
|
+
.split(",")
|
|
92
|
+
.map((s) => s.trim())
|
|
93
|
+
.filter(Boolean),
|
|
94
|
+
);
|
|
95
|
+
const providerOverride = flag("provider", null);
|
|
96
|
+
const bgmModeOverride = flag("bgm-mode", null);
|
|
97
|
+
const noBgm = has("no-bgm");
|
|
98
|
+
const voiceOverride = flag("voice", null);
|
|
99
|
+
const speedOverride = flag("speed", null);
|
|
100
|
+
const langOverride = flag("lang", null);
|
|
101
|
+
const seedSeconds = Number(flag("seed-seconds", "28")) || 28;
|
|
102
|
+
|
|
103
|
+
if (!existsSync(requestPath)) die(`audio_request.json not found at ${requestPath}`);
|
|
104
|
+
let request;
|
|
105
|
+
try {
|
|
106
|
+
request = JSON.parse(readFileSync(requestPath, "utf8"));
|
|
107
|
+
} catch (e) {
|
|
108
|
+
die(`audio_request.json parse: ${e.message}`);
|
|
109
|
+
}
|
|
110
|
+
const lines = Array.isArray(request.lines) ? request.lines : [];
|
|
111
|
+
const lang = langOverride || request.lang || "en";
|
|
112
|
+
const speedInput = speedOverride ?? request.speed ?? 1;
|
|
113
|
+
const speed = Number(speedInput);
|
|
114
|
+
if (!(speed > 0 && speed <= 3))
|
|
115
|
+
die(`speed must be above 0 and at most 3, got ${JSON.stringify(speedInput)}`);
|
|
116
|
+
|
|
117
|
+
// ── env + HeyGen availability (the single switch) ─────────────────────────────
|
|
118
|
+
loadEnvFromDir(hyperframesDir);
|
|
119
|
+
const heygenOK = heygenCredential() !== null;
|
|
120
|
+
|
|
121
|
+
// ── merge base: preserve sections not selected by --only ──────────────────────
|
|
122
|
+
const audioMeta = openAudioMeta(outPath);
|
|
123
|
+
const prev = audioMeta.value;
|
|
124
|
+
const anomalies = [];
|
|
125
|
+
|
|
126
|
+
// ── TTS ───────────────────────────────────────────────────────────────────────
|
|
127
|
+
let voices = prev.voices ?? [];
|
|
128
|
+
let ttsProvider = prev.tts_provider ?? null;
|
|
129
|
+
let voiceId = prev.voice_id ?? null;
|
|
130
|
+
if (only.has("tts") && lines.length) {
|
|
131
|
+
try {
|
|
132
|
+
ttsProvider = pickProvider(
|
|
133
|
+
providerOverride || (request.provider === "auto" ? null : request.provider),
|
|
134
|
+
);
|
|
135
|
+
} catch (e) {
|
|
136
|
+
die(e.message);
|
|
137
|
+
}
|
|
138
|
+
voiceId = await resolveVoiceId({
|
|
139
|
+
provider: ttsProvider,
|
|
140
|
+
userVoice: voiceOverride || request.voice,
|
|
141
|
+
lang,
|
|
142
|
+
});
|
|
143
|
+
console.error(`· tts: ${ttsProvider} · voice ${voiceId} · ${lines.length} line(s)`);
|
|
144
|
+
const paths = voicePaths(hyperframesDir, lines, anomalies);
|
|
145
|
+
const synthLine = async (line) => {
|
|
146
|
+
const id = String(line.id);
|
|
147
|
+
const text = String(line.text ?? "").trim();
|
|
148
|
+
if (!text) {
|
|
149
|
+
anomalies.push(`line ${id}: empty text — skipped`);
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const rel = paths.get(id);
|
|
153
|
+
const abs = join(hyperframesDir, rel);
|
|
154
|
+
const { ok, words, error } = await synthesizeOne({
|
|
155
|
+
provider: ttsProvider,
|
|
156
|
+
text,
|
|
157
|
+
voiceId,
|
|
158
|
+
lang,
|
|
159
|
+
speed,
|
|
160
|
+
model: flag("tts-model", request.tts_model),
|
|
161
|
+
style: flag("style", line.style ?? request.style),
|
|
162
|
+
wavAbs: abs,
|
|
163
|
+
hyperframesDir,
|
|
164
|
+
});
|
|
165
|
+
if (!ok) {
|
|
166
|
+
anomalies.push(`line ${id}: TTS failed — omitted${error ? ` (${error})` : ""}`);
|
|
167
|
+
return null;
|
|
168
|
+
}
|
|
169
|
+
let wordArr = words; // heygen: native; else transcribe
|
|
170
|
+
if (!wordArr) wordArr = await transcribeWav({ wavRel: rel, lang, hyperframesDir });
|
|
171
|
+
const dur = ffprobeDuration(abs);
|
|
172
|
+
if (!isFinite(dur) || dur <= 0) {
|
|
173
|
+
anomalies.push(`line ${id}: bad voice duration — omitted`);
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return { id, path: rel, duration_s: r3(dur), words: withWordIds(wordArr) };
|
|
177
|
+
};
|
|
178
|
+
const results = await mapWithConcurrency(lines, ttsConcurrency, synthLine);
|
|
179
|
+
voices = results.filter(Boolean);
|
|
180
|
+
for (const v of voices)
|
|
181
|
+
console.error(` voice ${v.id}: ${v.path} (${v.duration_s}s, ${v.words.length} words)`);
|
|
182
|
+
}
|
|
183
|
+
const hasVoice = voices.length > 0;
|
|
184
|
+
const totalDuration = r3(voices.reduce((a, v) => a + (v.duration_s || 0), 0));
|
|
185
|
+
|
|
186
|
+
// ── BGM ─────────────────────────────────────────────────────────────────────
|
|
187
|
+
let bgm = prev.bgm ?? null;
|
|
188
|
+
const bgmFields = {
|
|
189
|
+
bgm_pending: prev.bgm_pending ?? false,
|
|
190
|
+
bgm_provider: prev.bgm_provider ?? null,
|
|
191
|
+
bgm_pid: prev.bgm_pid ?? null,
|
|
192
|
+
bgm_log: prev.bgm_log ?? null,
|
|
193
|
+
bgm_mode: prev.bgm_mode ?? null,
|
|
194
|
+
bgm_target_duration_s: prev.bgm_target_duration_s ?? null,
|
|
195
|
+
bgm_seed_duration_s: prev.bgm_seed_duration_s ?? null,
|
|
196
|
+
bgm_loop_count: prev.bgm_loop_count ?? null,
|
|
197
|
+
};
|
|
198
|
+
if (only.has("bgm")) {
|
|
199
|
+
bgm = null;
|
|
200
|
+
Object.keys(bgmFields).forEach((k) => (bgmFields[k] = k === "bgm_pending" ? false : null));
|
|
201
|
+
// Mode resolution. An EXPLICIT mode (flag or request.bgm.mode) is strict:
|
|
202
|
+
// "retrieve" means retrieve-or-nothing — it never silently starts a detached
|
|
203
|
+
// generate (a caller with no wait-bgm step, e.g. product-launch, must not get
|
|
204
|
+
// a pending job it can't await). Only the UNSET/auto default picks generate
|
|
205
|
+
// when HeyGen is absent.
|
|
206
|
+
const explicitMode = bgmModeOverride || request.bgm?.mode || null;
|
|
207
|
+
let mode = noBgm ? "none" : explicitMode || (heygenOK ? "retrieve" : "generate");
|
|
208
|
+
if (mode === "retrieve" && !heygenOK) {
|
|
209
|
+
anomalies.push(
|
|
210
|
+
"bgm: retrieve requires a HeyGen credential — skipped (no generate fallback for an explicit retrieve)",
|
|
211
|
+
);
|
|
212
|
+
mode = "none";
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
if (mode === "none") {
|
|
216
|
+
console.error(`· bgm: disabled`);
|
|
217
|
+
} else if (mode === "retrieve") {
|
|
218
|
+
try {
|
|
219
|
+
bgm = await retrieveBgm({
|
|
220
|
+
query: request.bgm?.query,
|
|
221
|
+
headers: heygenAuthHeaders(),
|
|
222
|
+
hyperframesDir,
|
|
223
|
+
hasVoice,
|
|
224
|
+
anomalies,
|
|
225
|
+
});
|
|
226
|
+
if (bgm) {
|
|
227
|
+
bgmFields.bgm_provider = "heygen";
|
|
228
|
+
bgmFields.bgm_mode = "retrieve";
|
|
229
|
+
console.error(` bgm: ${bgm.path} (retrieve "${bgm.query}")`);
|
|
230
|
+
} else {
|
|
231
|
+
anomalies.push(`bgm: no music match for "${request.bgm?.query ?? ""}" — skipped`);
|
|
232
|
+
}
|
|
233
|
+
} catch (e) {
|
|
234
|
+
anomalies.push(`bgm retrieve failed: ${e.message} — skipped`);
|
|
235
|
+
}
|
|
236
|
+
} else {
|
|
237
|
+
// generate
|
|
238
|
+
const prompt = inferBgmPrompt({
|
|
239
|
+
userPrompt: request.bgm?.prompt,
|
|
240
|
+
blob: request.bgm?.blob || request.bgm?.query,
|
|
241
|
+
archetype: request.bgm?.archetype,
|
|
242
|
+
arc: request.bgm?.arc,
|
|
243
|
+
});
|
|
244
|
+
const gen = generateBgmDetached({
|
|
245
|
+
prompt,
|
|
246
|
+
durationS: totalDuration || 30,
|
|
247
|
+
hyperframesDir,
|
|
248
|
+
lyriaRecipe: existsSync(lyriaRecipe) ? lyriaRecipe : null,
|
|
249
|
+
seedSeconds,
|
|
250
|
+
hasVoice,
|
|
251
|
+
anomalies,
|
|
252
|
+
});
|
|
253
|
+
if (gen.disabled) {
|
|
254
|
+
anomalies.push(`bgm: ${gen.reason}`);
|
|
255
|
+
} else {
|
|
256
|
+
bgm = { path: gen.path, volume: gen.volume, mode: gen.mode, duration_s: null };
|
|
257
|
+
bgmFields.bgm_pending = true;
|
|
258
|
+
bgmFields.bgm_provider = gen.provider;
|
|
259
|
+
bgmFields.bgm_pid = gen.pid;
|
|
260
|
+
bgmFields.bgm_log = gen.log;
|
|
261
|
+
bgmFields.bgm_mode = gen.mode;
|
|
262
|
+
bgmFields.bgm_target_duration_s = gen.target_duration_s ?? null;
|
|
263
|
+
bgmFields.bgm_seed_duration_s = gen.seed_duration_s ?? null;
|
|
264
|
+
bgmFields.bgm_loop_count = gen.loop_count ?? null;
|
|
265
|
+
console.error(` bgm: launched ${gen.provider} (detached, pid ${gen.pid}) → ${gen.path}`);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// ── SFX ─────────────────────────────────────────────────────────────────────
|
|
271
|
+
let sfx = prev.sfx ?? [];
|
|
272
|
+
if (only.has("sfx")) {
|
|
273
|
+
const cues = lines.flatMap((l) =>
|
|
274
|
+
(Array.isArray(l.sfx) ? l.sfx : [])
|
|
275
|
+
.map((name) => ({ id: String(l.id), name: String(name).trim() }))
|
|
276
|
+
.filter((c) => c.name),
|
|
277
|
+
);
|
|
278
|
+
const headers = heygenOK && cues.length ? heygenAuthHeaders() : null;
|
|
279
|
+
const res = await resolveSfx({ cues, heygenOK, headers, hyperframesDir, sfxLibDir });
|
|
280
|
+
sfx = res.sfx;
|
|
281
|
+
anomalies.push(...res.anomalies);
|
|
282
|
+
console.error(
|
|
283
|
+
`· sfx: ${sfx.length} cue(s) resolved (${heygenOK ? "heygen retrieval" : "bundled library"})`,
|
|
284
|
+
);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
// ── write audio_meta.json ─────────────────────────────────────────────────────
|
|
288
|
+
const meta = {
|
|
289
|
+
tts_provider: ttsProvider,
|
|
290
|
+
voice_id: voiceId,
|
|
291
|
+
bgm,
|
|
292
|
+
...bgmFields,
|
|
293
|
+
voices,
|
|
294
|
+
sfx,
|
|
295
|
+
total_duration_s: totalDuration,
|
|
296
|
+
};
|
|
297
|
+
mkdirSync(dirname(outPath), { recursive: true });
|
|
298
|
+
audioMeta.write(meta);
|
|
299
|
+
const written = writtenAssets({ only, lines, voices, ttsProvider, bgm, bgmFields, sfx });
|
|
300
|
+
anomalies.push(...recordInManifest(hyperframesDir, written));
|
|
301
|
+
|
|
302
|
+
console.log(`✓ audio engine → ${outPath}`);
|
|
303
|
+
console.log(` heygen: ${heygenOK ? "yes" : "no"} · ran: ${[...only].join(",")}`);
|
|
304
|
+
console.log(
|
|
305
|
+
` voices: ${voices.length} · bgm: ${bgm ? `${bgmFields.bgm_provider}${bgmFields.bgm_pending ? " (pending)" : ""}` : "none"} · sfx: ${sfx.length}`,
|
|
306
|
+
);
|
|
307
|
+
console.log(` total voice duration: ${totalDuration}s`);
|
|
308
|
+
if (anomalies.length) {
|
|
309
|
+
console.log(`\nanomalies (non-fatal):`);
|
|
310
|
+
for (const a of anomalies) console.log(` - ${a}`);
|
|
311
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { mkdtempSync, mkdirSync, readFileSync, rmSync, existsSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { spawnSync } from "node:child_process";
|
|
5
|
+
import { join, dirname } from "node:path";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { recordInManifest } from "./lib/media-record.mjs";
|
|
9
|
+
import { resolveSfx } from "./lib/sfx.mjs";
|
|
10
|
+
|
|
11
|
+
// Proves the relocated engine (skills/media-use/audio/) still resolves its
|
|
12
|
+
// bundled SFX library from the moved location — the path most likely to break
|
|
13
|
+
// on a subtree move. Offline (heygenOK:false), no network.
|
|
14
|
+
|
|
15
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
16
|
+
const sfxLibDir = join(HERE, "..", "assets", "sfx"); // same offset the engine uses
|
|
17
|
+
|
|
18
|
+
test("bundled SFX library resolves from the relocated path", async () => {
|
|
19
|
+
assert.ok(existsSync(join(sfxLibDir, "manifest.json")), "moved manifest is present");
|
|
20
|
+
const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
|
|
21
|
+
try {
|
|
22
|
+
const { sfx, anomalies } = await resolveSfx({
|
|
23
|
+
cues: [{ id: "1", name: "whoosh" }],
|
|
24
|
+
heygenOK: false,
|
|
25
|
+
hyperframesDir: dir,
|
|
26
|
+
sfxLibDir,
|
|
27
|
+
});
|
|
28
|
+
assert.equal(sfx.length, 1, `expected 1 resolved cue, got anomalies: ${anomalies.join("; ")}`);
|
|
29
|
+
assert.equal(sfx[0].source, "local");
|
|
30
|
+
assert.match(sfx[0].file, /assets\/sfx\//);
|
|
31
|
+
assert.ok(existsSync(join(dir, sfx[0].file)), "matched SFX copied into the project");
|
|
32
|
+
} finally {
|
|
33
|
+
rmSync(dir, { recursive: true, force: true });
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
|
|
37
|
+
test("an unknown cue is reported, not fatal", async () => {
|
|
38
|
+
const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
|
|
39
|
+
try {
|
|
40
|
+
const { sfx, anomalies } = await resolveSfx({
|
|
41
|
+
cues: [{ id: "1", name: "definitely-not-a-real-sfx" }],
|
|
42
|
+
heygenOK: false,
|
|
43
|
+
hyperframesDir: dir,
|
|
44
|
+
sfxLibDir,
|
|
45
|
+
});
|
|
46
|
+
assert.equal(sfx.length, 0);
|
|
47
|
+
assert.ok(anomalies.some((a) => /not in bundled library/.test(a)));
|
|
48
|
+
} finally {
|
|
49
|
+
rmSync(dir, { recursive: true, force: true });
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
test("a person's own file under a bundled name survives, and the cue gets the next free name", async () => {
|
|
54
|
+
const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
|
|
55
|
+
try {
|
|
56
|
+
const own = join(dir, "assets", "sfx", "whoosh.mp3");
|
|
57
|
+
mkdirSync(dirname(own), { recursive: true });
|
|
58
|
+
writeFileSync(own, "the person's own whoosh");
|
|
59
|
+
const resolve = () =>
|
|
60
|
+
resolveSfx({
|
|
61
|
+
cues: [{ id: "1", name: "whoosh" }],
|
|
62
|
+
heygenOK: false,
|
|
63
|
+
hyperframesDir: dir,
|
|
64
|
+
sfxLibDir,
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const first = await resolve();
|
|
68
|
+
const second = await resolve();
|
|
69
|
+
|
|
70
|
+
assert.equal(readFileSync(own, "utf8"), "the person's own whoosh");
|
|
71
|
+
assert.deepEqual(
|
|
72
|
+
[first, second].map(({ sfx }) => [sfx[0].file, sfx[0].source]),
|
|
73
|
+
[
|
|
74
|
+
["assets/sfx/whoosh-2.mp3", "local"],
|
|
75
|
+
["assets/sfx/whoosh-2.mp3", "local"],
|
|
76
|
+
],
|
|
77
|
+
);
|
|
78
|
+
assert.deepEqual(
|
|
79
|
+
readFileSync(join(dir, "assets/sfx/whoosh-2.mp3")),
|
|
80
|
+
readFileSync(join(sfxLibDir, "whoosh.mp3")),
|
|
81
|
+
);
|
|
82
|
+
} finally {
|
|
83
|
+
rmSync(dir, { recursive: true, force: true });
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
test("two effects never share a file when one's name is taken by the person, run after run", async () => {
|
|
88
|
+
const dir = mkdtempSync(join(tmpdir(), "mu-audio-"));
|
|
89
|
+
try {
|
|
90
|
+
mkdirSync(join(dir, "assets", "sfx"), { recursive: true });
|
|
91
|
+
writeFileSync(join(dir, "assets", "sfx", "glitch.mp3"), "the person's own glitch");
|
|
92
|
+
const realFetch = globalThis.fetch;
|
|
93
|
+
globalThis.fetch = async (url) => {
|
|
94
|
+
const query = new URL(url).searchParams.get("query");
|
|
95
|
+
if (query)
|
|
96
|
+
return Response.json({ data: [{ audio_url: `https://sound.test/${query}`, score: 0.6 }] });
|
|
97
|
+
return new Response(`bytes of ${new URL(url).pathname}`);
|
|
98
|
+
};
|
|
99
|
+
const run = async (names) => {
|
|
100
|
+
const { sfx } = await resolveSfx({
|
|
101
|
+
cues: names.map((name, index) => ({ id: String(index), name })),
|
|
102
|
+
heygenOK: true,
|
|
103
|
+
headers: {},
|
|
104
|
+
hyperframesDir: dir,
|
|
105
|
+
sfxLibDir,
|
|
106
|
+
});
|
|
107
|
+
const files = sfx.map(({ file }) => file);
|
|
108
|
+
recordInManifest(
|
|
109
|
+
dir,
|
|
110
|
+
[...new Set(files)].map((path) => ({ path, type: "sfx", source: "search" })),
|
|
111
|
+
);
|
|
112
|
+
return files;
|
|
113
|
+
};
|
|
114
|
+
try {
|
|
115
|
+
assert.deepEqual(await run(["glitch"]), ["assets/sfx/glitch-2.mp3"]);
|
|
116
|
+
assert.deepEqual(await run(["glitch", "glitch 2", "glitch"]), [
|
|
117
|
+
"assets/sfx/glitch-2.mp3",
|
|
118
|
+
"assets/sfx/glitch-2-2.mp3",
|
|
119
|
+
"assets/sfx/glitch-2.mp3",
|
|
120
|
+
]);
|
|
121
|
+
} finally {
|
|
122
|
+
globalThis.fetch = realFetch;
|
|
123
|
+
}
|
|
124
|
+
} finally {
|
|
125
|
+
rmSync(dir, { recursive: true, force: true });
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
// The engine owns speed parsing; a fallback before the check would turn 0 or junk into 1.
|
|
130
|
+
function runEngineWith(request, ...args) {
|
|
131
|
+
const dir = mkdtempSync(join(tmpdir(), "audio-speed-range-"));
|
|
132
|
+
try {
|
|
133
|
+
writeFileSync(join(dir, "audio_request.json"), JSON.stringify({ lines: [], ...request }));
|
|
134
|
+
return spawnSync(process.execPath, [join(HERE, "audio.mjs"), "--hyperframes", dir, ...args], {
|
|
135
|
+
encoding: "utf8",
|
|
136
|
+
});
|
|
137
|
+
} finally {
|
|
138
|
+
rmSync(dir, { recursive: true, force: true });
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
for (const [label, request, args, shown] of [
|
|
143
|
+
["request speed 5", { speed: 5 }, [], "5"],
|
|
144
|
+
["request speed 0", { speed: 0 }, [], "0"],
|
|
145
|
+
["request speed -1", { speed: -1 }, [], "-1"],
|
|
146
|
+
["request speed text", { speed: "fast" }, [], '"fast"'],
|
|
147
|
+
["--speed 0", {}, ["--speed", "0"], '"0"'],
|
|
148
|
+
["--speed text", { speed: 1 }, ["--speed", "abc"], '"abc"'],
|
|
149
|
+
]) {
|
|
150
|
+
test(`${label} stops the engine before any TTS runs`, () => {
|
|
151
|
+
const r = runEngineWith(request, ...args);
|
|
152
|
+
assert.equal(r.status, 1);
|
|
153
|
+
assert.ok(r.stderr.includes(`speed must be above 0 and at most 3, got ${shown}`), r.stderr);
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
test("a numeric string speed, as the adapters forward it, passes the check", () => {
|
|
158
|
+
assert.doesNotMatch(runEngineWith({ speed: "0.8" }, "--only", "tts").stderr, /speed must/);
|
|
159
|
+
});
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { mkdtempSync, writeFileSync, readFileSync, mkdirSync, rmSync } from "node:fs";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { tmpdir } from "node:os";
|
|
6
|
+
import { spawnSync } from "node:child_process";
|
|
7
|
+
|
|
8
|
+
// Exercise the actual engine and provider together; only the paid API and
|
|
9
|
+
// external audio tools are fixtures. This is not a live synthesis/render test.
|
|
10
|
+
for (const expired of [false, true]) {
|
|
11
|
+
for (const only of ["tts", "tts,bgm,sfx"]) {
|
|
12
|
+
// With expired credentials the person already has an assets/voice/intro.wav, which the engine must keep.
|
|
13
|
+
const voicePath = expired ? "assets/voice/intro-2.wav" : "assets/voice/intro.wav";
|
|
14
|
+
test(`Gemini engine returns caption metadata with ${expired ? "expired" : "absent"} HeyGen credentials (${only})`, (t) => {
|
|
15
|
+
const dir = mkdtempSync(join(tmpdir(), "hf-gemini-pipeline-"));
|
|
16
|
+
t.after(() => rmSync(dir, { recursive: true, force: true }));
|
|
17
|
+
if (expired) {
|
|
18
|
+
mkdirSync(join(dir, "assets/voice"), { recursive: true });
|
|
19
|
+
writeFileSync(join(dir, "assets/voice/intro.wav"), "the person's own intro");
|
|
20
|
+
}
|
|
21
|
+
const config = join(dir, "heygen");
|
|
22
|
+
mkdirSync(config);
|
|
23
|
+
if (expired)
|
|
24
|
+
writeFileSync(
|
|
25
|
+
join(config, "credentials"),
|
|
26
|
+
JSON.stringify({
|
|
27
|
+
oauth: { access_token: "expired-fixture", expires_at: "2000-01-01T00:00:00Z" },
|
|
28
|
+
}),
|
|
29
|
+
);
|
|
30
|
+
const bin = join(dir, "bin");
|
|
31
|
+
mkdirSync(bin);
|
|
32
|
+
const preload = join(dir, "fetch.mjs");
|
|
33
|
+
writeFileSync(
|
|
34
|
+
preload,
|
|
35
|
+
`
|
|
36
|
+
import assert from 'node:assert/strict';
|
|
37
|
+
globalThis.fetch = async (url, options) => {
|
|
38
|
+
assert.equal(url, 'https://generativelanguage.googleapis.com/v1beta/interactions');
|
|
39
|
+
const body = JSON.parse(options.body);
|
|
40
|
+
assert.equal(body.model, 'gemini-3.8-flash-lite-tts');
|
|
41
|
+
assert.equal(body.input[0].content[0].annotations[0].style, 'Line direction');
|
|
42
|
+
const bytes = Buffer.alloc(48);
|
|
43
|
+
bytes.write('RIFF'); bytes.write('WAVE', 8);
|
|
44
|
+
return Response.json({status:'completed', steps:[{type:'model_output', content:[
|
|
45
|
+
{type:'audio', mime_type:'audio/wav', data:bytes.toString('base64')}
|
|
46
|
+
]}]});
|
|
47
|
+
};
|
|
48
|
+
`,
|
|
49
|
+
);
|
|
50
|
+
writeFileSync(
|
|
51
|
+
join(bin, "npx"),
|
|
52
|
+
`#!${process.execPath}
|
|
53
|
+
const assert = require('node:assert/strict');
|
|
54
|
+
const fs = require('node:fs');
|
|
55
|
+
const path = require('node:path');
|
|
56
|
+
const args = process.argv.slice(2);
|
|
57
|
+
assert.deepEqual(args.slice(0, 3), ['hyperframes', 'transcribe', '${voicePath}']);
|
|
58
|
+
assert.ok(fs.existsSync(args[2]));
|
|
59
|
+
assert.equal(args[args.indexOf('--model')+1], 'small.en');
|
|
60
|
+
fs.writeFileSync(path.join(args[args.indexOf('--dir')+1], 'transcript.json'), JSON.stringify([
|
|
61
|
+
{text:'Hello',start:0.1,end:0.4}, {text:'there.',start:0.5,end:0.9}
|
|
62
|
+
]));
|
|
63
|
+
`,
|
|
64
|
+
{ mode: 0o755 },
|
|
65
|
+
);
|
|
66
|
+
writeFileSync(join(bin, "ffprobe"), "#!/bin/sh\necho 1.25\n", { mode: 0o755 });
|
|
67
|
+
writeFileSync(join(dir, ".env"), "");
|
|
68
|
+
writeFileSync(
|
|
69
|
+
join(dir, "audio_request.json"),
|
|
70
|
+
JSON.stringify({
|
|
71
|
+
provider: "gemini",
|
|
72
|
+
tts_model: "gemini-3.8-flash-lite-tts",
|
|
73
|
+
style: "Global direction",
|
|
74
|
+
lines: [{ id: "intro", text: "Hello there.", style: "Line direction" }],
|
|
75
|
+
bgm: { mode: "none" },
|
|
76
|
+
}),
|
|
77
|
+
);
|
|
78
|
+
const result = spawnSync(
|
|
79
|
+
process.execPath,
|
|
80
|
+
[
|
|
81
|
+
"--import",
|
|
82
|
+
preload,
|
|
83
|
+
new URL("./audio.mjs", import.meta.url).pathname,
|
|
84
|
+
"--hyperframes",
|
|
85
|
+
dir,
|
|
86
|
+
"--only",
|
|
87
|
+
only,
|
|
88
|
+
],
|
|
89
|
+
{
|
|
90
|
+
encoding: "utf8",
|
|
91
|
+
env: {
|
|
92
|
+
...process.env,
|
|
93
|
+
HEYGEN_CONFIG_DIR: config,
|
|
94
|
+
HEYGEN_API_KEY: "",
|
|
95
|
+
HYPERFRAMES_API_KEY: "",
|
|
96
|
+
GEMINI_API_KEY: "fixture-key",
|
|
97
|
+
PATH: `${bin}:${process.env.PATH}`,
|
|
98
|
+
},
|
|
99
|
+
},
|
|
100
|
+
);
|
|
101
|
+
assert.equal(result.status, 0, result.stderr);
|
|
102
|
+
const meta = JSON.parse(readFileSync(join(dir, "audio_meta.json"), "utf8"));
|
|
103
|
+
assert.equal(meta.tts_provider, "gemini");
|
|
104
|
+
assert.equal(meta.voice_id, "Kore");
|
|
105
|
+
assert.deepEqual(meta.voices, [
|
|
106
|
+
{
|
|
107
|
+
id: "intro",
|
|
108
|
+
path: voicePath,
|
|
109
|
+
duration_s: 1.25,
|
|
110
|
+
words: [
|
|
111
|
+
{ id: "w0", text: "Hello", start: 0.1, end: 0.4 },
|
|
112
|
+
{ id: "w1", text: "there.", start: 0.5, end: 0.9 },
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
]);
|
|
116
|
+
assert.equal(meta.total_duration_s, 1.25);
|
|
117
|
+
const manifest = readFileSync(join(dir, ".media/manifest.jsonl"), "utf8").trim().split("\n");
|
|
118
|
+
assert.deepEqual(
|
|
119
|
+
manifest
|
|
120
|
+
.map((line) => JSON.parse(line))
|
|
121
|
+
.map(({ path, type, source }) => [path, type, source]),
|
|
122
|
+
[[voicePath, "voice", "generated"]],
|
|
123
|
+
);
|
|
124
|
+
if (expired)
|
|
125
|
+
assert.equal(
|
|
126
|
+
readFileSync(join(dir, "assets/voice/intro.wav"), "utf8"),
|
|
127
|
+
"the person's own intro",
|
|
128
|
+
);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|