@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,174 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { mfluxImageGenerate } from "./mflux-provider.mjs";
|
|
4
|
+
|
|
5
|
+
// 40GB clears the 32GB klein tier and the 8GB schnell tier below it; the 64GB
|
|
6
|
+
// qwen tier stays out of reach. Two rungs is what makes demotion observable.
|
|
7
|
+
const bothTiersSpecs = { availableRamMB: 40000, gpu: { present: true } };
|
|
8
|
+
const SNAPSHOT = "/tmp/hf-snapshot";
|
|
9
|
+
|
|
10
|
+
// exec stub covering all three shells-out mflux does: the PATH probe, the
|
|
11
|
+
// idempotent `hf download`, and the generate itself.
|
|
12
|
+
function stubExec({ failGenerateFor = [], failWhichFor = [] } = {}) {
|
|
13
|
+
const calls = [];
|
|
14
|
+
const exec = (...call) => {
|
|
15
|
+
calls.push(call);
|
|
16
|
+
const [bin, argv] = call;
|
|
17
|
+
if (bin === "which") {
|
|
18
|
+
if (failWhichFor.includes(argv[0])) throw new Error("not found");
|
|
19
|
+
return "";
|
|
20
|
+
}
|
|
21
|
+
if (bin === "hf") return `Fetching 6 files...\n${SNAPSHOT}\n`;
|
|
22
|
+
if (failGenerateFor.some((id) => argv.join(" ").includes(id))) {
|
|
23
|
+
const err = new Error("exit 1");
|
|
24
|
+
err.stderr = "mlx.core.metal: out of memory";
|
|
25
|
+
throw err;
|
|
26
|
+
}
|
|
27
|
+
return "";
|
|
28
|
+
};
|
|
29
|
+
return { calls, exec };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const generateCalls = (calls) =>
|
|
33
|
+
calls.filter(([bin]) => bin !== "which" && bin !== "hf").map(([, argv]) => argv.join(" "));
|
|
34
|
+
|
|
35
|
+
test("no local model fits: falls through to the upsell without shelling out", async () => {
|
|
36
|
+
const { calls, exec } = stubExec();
|
|
37
|
+
|
|
38
|
+
const result = await mfluxImageGenerate(
|
|
39
|
+
"a red bicycle",
|
|
40
|
+
{ specs: { availableRamMB: 100, gpu: { present: true } } },
|
|
41
|
+
exec,
|
|
42
|
+
() => true,
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
assert.equal(result, null);
|
|
46
|
+
assert.deepEqual(calls, []);
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
test("a top tier that cannot run demotes to the next fitting tier", async (t) => {
|
|
50
|
+
const errors = [];
|
|
51
|
+
t.mock.method(console, "error", (message) => errors.push(message));
|
|
52
|
+
const { calls, exec } = stubExec({ failGenerateFor: ["flux2-klein-4b"] });
|
|
53
|
+
|
|
54
|
+
const result = await mfluxImageGenerate(
|
|
55
|
+
"a red bicycle",
|
|
56
|
+
{ specs: bothTiersSpecs },
|
|
57
|
+
exec,
|
|
58
|
+
() => true,
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
assert.ok(result, "the schnell tier still produced an image");
|
|
62
|
+
assert.equal(result.metadata.provider, "mflux.flux-schnell-mflux-q4");
|
|
63
|
+
const generated = generateCalls(calls);
|
|
64
|
+
assert.equal(generated.length, 2, "klein attempted first, then schnell");
|
|
65
|
+
assert.match(generated[0], /flux2-klein-4b/);
|
|
66
|
+
assert.match(generated[1], /--model schnell/);
|
|
67
|
+
assert.equal(errors.length, 1, "the demotion is reported, not silent");
|
|
68
|
+
assert.match(errors[0], /flux2-klein-mflux-q4\) failed/);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
test("a snapshot that will not resolve demotes rather than failing outright", async (t) => {
|
|
72
|
+
const errors = [];
|
|
73
|
+
t.mock.method(console, "error", (message) => errors.push(message));
|
|
74
|
+
const calls = [];
|
|
75
|
+
const exec = (...call) => {
|
|
76
|
+
calls.push(call);
|
|
77
|
+
const [bin, argv] = call;
|
|
78
|
+
if (bin === "which") return "";
|
|
79
|
+
// klein's weights won't download; schnell's do
|
|
80
|
+
if (bin === "hf") {
|
|
81
|
+
if (argv[1].includes("FLUX.2-klein")) throw new Error("403 Forbidden");
|
|
82
|
+
return `${SNAPSHOT}\n`;
|
|
83
|
+
}
|
|
84
|
+
return "";
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const result = await mfluxImageGenerate(
|
|
88
|
+
"a red bicycle",
|
|
89
|
+
{ specs: bothTiersSpecs },
|
|
90
|
+
exec,
|
|
91
|
+
() => true,
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
assert.ok(result, "demoted past the ungettable weights");
|
|
95
|
+
assert.equal(result.metadata.provider, "mflux.flux-schnell-mflux-q4");
|
|
96
|
+
assert.equal(errors.length, 1);
|
|
97
|
+
assert.match(errors[0], /hf download failed/);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
test("runner missing from PATH reports the install hint per tier and returns null", async (t) => {
|
|
101
|
+
const errors = [];
|
|
102
|
+
t.mock.method(console, "error", (message) => errors.push(message));
|
|
103
|
+
const { exec } = stubExec({ failWhichFor: ["mflux-generate"] });
|
|
104
|
+
|
|
105
|
+
const result = await mfluxImageGenerate(
|
|
106
|
+
"a red bicycle",
|
|
107
|
+
{ specs: bothTiersSpecs },
|
|
108
|
+
exec,
|
|
109
|
+
() => true,
|
|
110
|
+
);
|
|
111
|
+
|
|
112
|
+
assert.equal(result, null);
|
|
113
|
+
assert.equal(errors.length, 2, "both fitting tiers reported");
|
|
114
|
+
assert.match(errors[0], /uv pip install mflux/);
|
|
115
|
+
// each hint states that tier's download cost before the user commits
|
|
116
|
+
assert.match(errors[0], /GB of weights to/);
|
|
117
|
+
assert.match(errors[1], /GB of weights to/);
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
// Same per-attempt temp path, same orphaning risk as the LTX provider: a
|
|
121
|
+
// partial png from a failed tier must not survive a lower tier succeeding.
|
|
122
|
+
const outputOf = (argv) => argv[argv.indexOf("--output") + 1];
|
|
123
|
+
const attemptedOutputs = (calls) =>
|
|
124
|
+
calls.filter(([bin]) => bin !== "which" && bin !== "hf").map(([, argv]) => outputOf(argv));
|
|
125
|
+
|
|
126
|
+
test("a failed attempt's partial output is discarded before demoting", async (t) => {
|
|
127
|
+
t.mock.method(console, "error", () => {});
|
|
128
|
+
const unlinked = [];
|
|
129
|
+
const { calls, exec } = stubExec({ failGenerateFor: ["flux2-klein-4b"] });
|
|
130
|
+
|
|
131
|
+
const result = await mfluxImageGenerate(
|
|
132
|
+
"a red bicycle",
|
|
133
|
+
{ specs: bothTiersSpecs },
|
|
134
|
+
exec,
|
|
135
|
+
() => true,
|
|
136
|
+
(path) => unlinked.push(path),
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
assert.ok(result, "the schnell tier still produced an image");
|
|
140
|
+
assert.deepEqual(unlinked, [attemptedOutputs(calls)[0]], "the failed klein partial is removed");
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
test("every tier failing discards every partial, one per attempt", async (t) => {
|
|
144
|
+
t.mock.method(console, "error", () => {});
|
|
145
|
+
const unlinked = [];
|
|
146
|
+
const { calls, exec } = stubExec({ failGenerateFor: ["flux2-klein-4b", "schnell"] });
|
|
147
|
+
|
|
148
|
+
const result = await mfluxImageGenerate(
|
|
149
|
+
"a red bicycle",
|
|
150
|
+
{ specs: bothTiersSpecs },
|
|
151
|
+
exec,
|
|
152
|
+
() => true,
|
|
153
|
+
(path) => unlinked.push(path),
|
|
154
|
+
);
|
|
155
|
+
|
|
156
|
+
assert.equal(result, null);
|
|
157
|
+
assert.deepEqual(unlinked, attemptedOutputs(calls), "nothing is left behind");
|
|
158
|
+
});
|
|
159
|
+
|
|
160
|
+
test("a successful generation is never discarded", async () => {
|
|
161
|
+
const unlinked = [];
|
|
162
|
+
const { exec } = stubExec();
|
|
163
|
+
|
|
164
|
+
const result = await mfluxImageGenerate(
|
|
165
|
+
"a red bicycle",
|
|
166
|
+
{ specs: bothTiersSpecs },
|
|
167
|
+
exec,
|
|
168
|
+
() => true,
|
|
169
|
+
(path) => unlinked.push(path),
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
assert.ok(result);
|
|
173
|
+
assert.deepEqual(unlinked, [], "the returned artifact must survive");
|
|
174
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { appendFileSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { globalMediaDir } from "./media-home.mjs";
|
|
4
|
+
|
|
5
|
+
const MISSES_FILE = "misses.jsonl";
|
|
6
|
+
|
|
7
|
+
function missesPath() {
|
|
8
|
+
return join(globalMediaDir(), MISSES_FILE);
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export function recordMiss({ type, intent, provider_override, local_only }) {
|
|
12
|
+
try {
|
|
13
|
+
const path = missesPath();
|
|
14
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
15
|
+
appendFileSync(
|
|
16
|
+
path,
|
|
17
|
+
JSON.stringify({
|
|
18
|
+
ts: new Date().toISOString(),
|
|
19
|
+
type,
|
|
20
|
+
intent,
|
|
21
|
+
provider_override: !!provider_override,
|
|
22
|
+
local_only: !!local_only,
|
|
23
|
+
}) + "\n",
|
|
24
|
+
);
|
|
25
|
+
} catch {
|
|
26
|
+
// local miss logging is best-effort; never surface into resolve
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
export function readMisses() {
|
|
31
|
+
const p = missesPath();
|
|
32
|
+
try {
|
|
33
|
+
if (!existsSync(p)) return [];
|
|
34
|
+
const raw = readFileSync(p, "utf8");
|
|
35
|
+
const records = [];
|
|
36
|
+
for (const line of raw.split(/\r?\n/)) {
|
|
37
|
+
const trimmed = line.trim();
|
|
38
|
+
if (!trimmed) continue;
|
|
39
|
+
try {
|
|
40
|
+
records.push(JSON.parse(trimmed));
|
|
41
|
+
} catch {
|
|
42
|
+
// skip malformed local lines, don't crash stats
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return records;
|
|
46
|
+
} catch {
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
4
|
+
import { tmpdir } from "node:os";
|
|
5
|
+
import { join } from "node:path";
|
|
6
|
+
import { readMisses, recordMiss } from "./misses.mjs";
|
|
7
|
+
|
|
8
|
+
function sandbox() {
|
|
9
|
+
const root = mkdtempSync(join(tmpdir(), "mu-misses-"));
|
|
10
|
+
const home = join(root, "home");
|
|
11
|
+
mkdirSync(home, { recursive: true });
|
|
12
|
+
process.env.HYPERFRAMES_MEDIA_HOME = home;
|
|
13
|
+
return { root, home };
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function restoreEnv(saved) {
|
|
17
|
+
for (const k of Object.keys(process.env)) if (!(k in saved)) delete process.env[k];
|
|
18
|
+
Object.assign(process.env, saved);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
test("recordMiss appends a well-formed local miss", () => {
|
|
22
|
+
const savedEnv = { ...process.env };
|
|
23
|
+
const { root, home } = sandbox();
|
|
24
|
+
try {
|
|
25
|
+
recordMiss({ type: "bgm", intent: "moody synth pulse", provider_override: true });
|
|
26
|
+
const misses = readMisses();
|
|
27
|
+
assert.equal(misses.length, 1);
|
|
28
|
+
assert.equal(misses[0].type, "bgm");
|
|
29
|
+
assert.equal(misses[0].intent, "moody synth pulse");
|
|
30
|
+
assert.equal(misses[0].provider_override, true);
|
|
31
|
+
assert.equal(misses[0].local_only, false);
|
|
32
|
+
assert.ok(!Number.isNaN(Date.parse(misses[0].ts)));
|
|
33
|
+
|
|
34
|
+
const raw = readFileSync(join(home, ".media/misses.jsonl"), "utf8");
|
|
35
|
+
assert.match(raw, /moody synth pulse/);
|
|
36
|
+
} finally {
|
|
37
|
+
restoreEnv(savedEnv);
|
|
38
|
+
rmSync(root, { recursive: true, force: true });
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
test("recordMiss swallows filesystem failures", () => {
|
|
43
|
+
const savedEnv = { ...process.env };
|
|
44
|
+
const { root, home } = sandbox();
|
|
45
|
+
try {
|
|
46
|
+
writeFileSync(join(home, ".media"), "not a directory");
|
|
47
|
+
assert.doesNotThrow(() =>
|
|
48
|
+
recordMiss({ type: "image", intent: "unwritable", local_only: true }),
|
|
49
|
+
);
|
|
50
|
+
assert.equal(existsSync(join(home, ".media/misses.jsonl")), false);
|
|
51
|
+
} finally {
|
|
52
|
+
restoreEnv(savedEnv);
|
|
53
|
+
rmSync(root, { recursive: true, force: true });
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
test("recordMiss stays best-effort when the media home cannot be resolved", () => {
|
|
58
|
+
const savedEnv = { ...process.env };
|
|
59
|
+
delete process.env.HYPERFRAMES_MEDIA_HOME;
|
|
60
|
+
process.env.HYPERFRAMES_MEDIA_HOME_REQUIRED = "1";
|
|
61
|
+
try {
|
|
62
|
+
assert.doesNotThrow(() => recordMiss({ type: "sfx", intent: "no home", local_only: true }));
|
|
63
|
+
} finally {
|
|
64
|
+
restoreEnv(savedEnv);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
test("readMisses skips corrupt lines", () => {
|
|
69
|
+
const savedEnv = { ...process.env };
|
|
70
|
+
const { root, home } = sandbox();
|
|
71
|
+
try {
|
|
72
|
+
mkdirSync(join(home, ".media"), { recursive: true });
|
|
73
|
+
writeFileSync(
|
|
74
|
+
join(home, ".media/misses.jsonl"),
|
|
75
|
+
[
|
|
76
|
+
JSON.stringify({ ts: "2026-07-09T00:00:00.000Z", type: "bgm", intent: "one" }),
|
|
77
|
+
"{not json",
|
|
78
|
+
JSON.stringify({ ts: "2026-07-09T00:00:01.000Z", type: "sfx", intent: "two" }),
|
|
79
|
+
].join("\n"),
|
|
80
|
+
);
|
|
81
|
+
assert.deepEqual(
|
|
82
|
+
readMisses().map((miss) => miss.intent),
|
|
83
|
+
["one", "two"],
|
|
84
|
+
);
|
|
85
|
+
} finally {
|
|
86
|
+
restoreEnv(savedEnv);
|
|
87
|
+
rmSync(root, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { existsSync } from "node:fs";
|
|
2
|
+
import { resolveSpawnCommand } from "../../audio/scripts/lib/tts.mjs";
|
|
3
|
+
|
|
4
|
+
// Sync-spawn analog of the audio engine's spawnP, for execFileSync call sites
|
|
5
|
+
// that must hard-fail (rather than fall through to another provider) when npx
|
|
6
|
+
// cannot be resolved. On Windows a bare "npx" is npx.cmd, which
|
|
7
|
+
// execFileSync/spawnSync cannot exec (spawnSync npx ENOENT) —
|
|
8
|
+
// resolveSpawnCommand reroutes it through node + npx-cli.js, no shell:true.
|
|
9
|
+
//
|
|
10
|
+
// `platform`/`env`/`pathExists` params (defaulting to the real values) exist
|
|
11
|
+
// so tests can exercise the win32 branch without mocking node:child_process
|
|
12
|
+
// (its ESM exports are non-configurable) — same idiom as spawnP and
|
|
13
|
+
// localTtsGenerate.
|
|
14
|
+
export function resolveNpxInvocation(
|
|
15
|
+
argv,
|
|
16
|
+
opts,
|
|
17
|
+
platform = process.platform,
|
|
18
|
+
env = process.env,
|
|
19
|
+
pathExists = existsSync,
|
|
20
|
+
) {
|
|
21
|
+
const resolved = resolveSpawnCommand("npx", argv, opts, platform, env, pathExists);
|
|
22
|
+
if (!resolved) {
|
|
23
|
+
// npx-on-win32 with no resolvable npx-cli.js — same terminal condition
|
|
24
|
+
// spawnP warns about, surfaced as a throw for callers with no fallback.
|
|
25
|
+
throw new Error(
|
|
26
|
+
"cannot run npx on Windows: npm's npx-cli.js was not found " +
|
|
27
|
+
"(install npm with Node, or run via npx/npm run so npm_execpath is set)",
|
|
28
|
+
);
|
|
29
|
+
}
|
|
30
|
+
return resolved;
|
|
31
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { resolveNpxInvocation } from "./npx-sync.mjs";
|
|
4
|
+
|
|
5
|
+
// Coverage parity with tts-local-provider.test.mjs, for the whisper.cpp
|
|
6
|
+
// fallback's call-site shape (transcribe.mjs runWhisper): the same three
|
|
7
|
+
// branches, but with the hard-fail contract — no fallback provider exists,
|
|
8
|
+
// so an unresolvable npx must throw actionably instead of returning null.
|
|
9
|
+
|
|
10
|
+
const envWithNpxCli = {
|
|
11
|
+
npm_execpath: "C:/Program Files/nodejs/node_modules/npm/bin/npm-cli.js",
|
|
12
|
+
npm_node_execpath: "C:/Program Files/nodejs/node.exe",
|
|
13
|
+
};
|
|
14
|
+
const npxCliPath = "C:/Program Files/nodejs/node_modules/npm/bin/npx-cli.js";
|
|
15
|
+
const pathExists = (path) => path === npxCliPath;
|
|
16
|
+
|
|
17
|
+
const WHISPER_ARGV = ["hyperframes", "transcribe", "C:\\media\\input.wav", "--dir", "C:\\work"];
|
|
18
|
+
const WHISPER_OPTS = { stdio: ["ignore", "pipe", "pipe"], timeout: 1_800_000 };
|
|
19
|
+
|
|
20
|
+
test("win32: routes the whisper fallback through node + npx-cli, never bare npx", () => {
|
|
21
|
+
const resolved = resolveNpxInvocation(
|
|
22
|
+
WHISPER_ARGV,
|
|
23
|
+
WHISPER_OPTS,
|
|
24
|
+
"win32",
|
|
25
|
+
envWithNpxCli,
|
|
26
|
+
pathExists,
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
assert.equal(resolved.cmd, envWithNpxCli.npm_node_execpath);
|
|
30
|
+
assert.equal(resolved.args[0], npxCliPath);
|
|
31
|
+
assert.deepEqual(resolved.args.slice(1, 3), ["hyperframes", "transcribe"]);
|
|
32
|
+
// execFileSync options survive the rerouting (the timeout bounds the
|
|
33
|
+
// whisper build/model download; the pipes surface its errors).
|
|
34
|
+
assert.deepEqual(resolved.opts.stdio, ["ignore", "pipe", "pipe"]);
|
|
35
|
+
assert.equal(resolved.opts.timeout, 1_800_000);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
test("win32 without a resolvable npx-cli: throws the actionable install hint", () => {
|
|
39
|
+
assert.throws(
|
|
40
|
+
() => resolveNpxInvocation(WHISPER_ARGV, WHISPER_OPTS, "win32", {}, () => false),
|
|
41
|
+
/npx-cli\.js was not found/,
|
|
42
|
+
);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
test("non-win32: spawns plain npx unchanged", () => {
|
|
46
|
+
const resolved = resolveNpxInvocation(WHISPER_ARGV, WHISPER_OPTS, "darwin", {}, () => false);
|
|
47
|
+
|
|
48
|
+
assert.equal(resolved.cmd, "npx");
|
|
49
|
+
assert.deepEqual(resolved.args, WHISPER_ARGV);
|
|
50
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
// Merge Parakeet-MLX token timestamps into word timestamps.
|
|
2
|
+
//
|
|
3
|
+
// parakeet-mlx JSON emits SUB-WORD tokens (" H", "ello", ...) with per-token
|
|
4
|
+
// start/end. Captions + transcript-cut need WORD timestamps, so join tokens
|
|
5
|
+
// into words on the space boundary: a token whose text starts with a space
|
|
6
|
+
// (or the very first token) begins a new word; the rest append. Output matches
|
|
7
|
+
// the { words: [{ text, start, end }] } shape the rest of media-use consumes
|
|
8
|
+
// (see words.mjs / cutlist.mjs).
|
|
9
|
+
|
|
10
|
+
export function mergeTokensToWords(parakeet) {
|
|
11
|
+
const sentences = Array.isArray(parakeet?.sentences) ? parakeet.sentences : [];
|
|
12
|
+
const words = [];
|
|
13
|
+
for (const s of sentences) {
|
|
14
|
+
for (const t of s.tokens ?? []) {
|
|
15
|
+
const raw = typeof t.text === "string" ? t.text : "";
|
|
16
|
+
const startsWord = raw.startsWith(" ") || words.length === 0;
|
|
17
|
+
if (startsWord) {
|
|
18
|
+
words.push({ text: raw.trim(), start: t.start, end: t.end });
|
|
19
|
+
} else {
|
|
20
|
+
const w = words[words.length - 1];
|
|
21
|
+
w.text += raw;
|
|
22
|
+
w.end = t.end;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return { text: (parakeet?.text ?? "").trim(), words: words.filter((w) => w.text.length > 0) };
|
|
27
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { mergeTokensToWords } from "./parakeet-words.mjs";
|
|
4
|
+
|
|
5
|
+
test("mergeTokensToWords joins sub-word tokens on the space boundary", () => {
|
|
6
|
+
const parakeet = {
|
|
7
|
+
text: "Hello everyone. Um,",
|
|
8
|
+
sentences: [
|
|
9
|
+
{
|
|
10
|
+
tokens: [
|
|
11
|
+
{ text: " H", start: 0.0, end: 0.24 },
|
|
12
|
+
{ text: "ello", start: 0.24, end: 0.48 },
|
|
13
|
+
{ text: " everyone.", start: 0.48, end: 1.28 },
|
|
14
|
+
{ text: " Um,", start: 1.28, end: 1.92 },
|
|
15
|
+
],
|
|
16
|
+
},
|
|
17
|
+
],
|
|
18
|
+
};
|
|
19
|
+
const { words } = mergeTokensToWords(parakeet);
|
|
20
|
+
assert.deepEqual(words, [
|
|
21
|
+
{ text: "Hello", start: 0.0, end: 0.48 },
|
|
22
|
+
{ text: "everyone.", start: 0.48, end: 1.28 },
|
|
23
|
+
{ text: "Um,", start: 1.28, end: 1.92 },
|
|
24
|
+
]);
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("mergeTokensToWords spans multiple sentences and drops empties", () => {
|
|
28
|
+
const parakeet = {
|
|
29
|
+
text: "Hi there",
|
|
30
|
+
sentences: [
|
|
31
|
+
{ tokens: [{ text: "Hi", start: 0, end: 0.2 }] },
|
|
32
|
+
{ tokens: [{ text: " there", start: 0.5, end: 0.9 }] },
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
const { words } = mergeTokensToWords(parakeet);
|
|
36
|
+
assert.equal(words.length, 2);
|
|
37
|
+
assert.equal(words[1].text, "there");
|
|
38
|
+
assert.equal(words[1].start, 0.5);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
test("mergeTokensToWords tolerates missing sentences/tokens", () => {
|
|
42
|
+
assert.deepEqual(mergeTokensToWords({}).words, []);
|
|
43
|
+
assert.deepEqual(mergeTokensToWords({ sentences: [{}] }).words, []);
|
|
44
|
+
});
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
2
|
+
import { basename, dirname, join, resolve } from "node:path";
|
|
3
|
+
import { globalMediaDir } from "./media-home.mjs";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Remembered defaults — the lightweight tier of HyperFrames user memory.
|
|
7
|
+
*
|
|
8
|
+
* Two files, same shape as the rest of media-use's storage split:
|
|
9
|
+
* - project `.media/preferences.json` — committed with the repo, so the whole
|
|
10
|
+
* team inherits it; written every time a brief answer is confirmed.
|
|
11
|
+
* - user `~/.media/preferences.json` — personal, cross-repo. A key is promoted
|
|
12
|
+
* here only once the same value has been confirmed in two different projects
|
|
13
|
+
* (`PROMOTE_AT`), so a one-off choice never pollutes the global defaults.
|
|
14
|
+
* Pre-promotion evidence accumulates in the user file's `sightings` ledger —
|
|
15
|
+
* project files can't see each other, so the cross-project count has to live
|
|
16
|
+
* user-side.
|
|
17
|
+
*
|
|
18
|
+
* Consumption contract (brief-contract § 2, Remembered defaults): a remembered
|
|
19
|
+
* value becomes the recommended option with a receipt naming its source — it
|
|
20
|
+
* never skips a question, and explicit request content always wins.
|
|
21
|
+
*/
|
|
22
|
+
|
|
23
|
+
const PREFS_FILE = "preferences.json";
|
|
24
|
+
|
|
25
|
+
/** Keys the brief contract records; `style_preset` is stored per workflow. */
|
|
26
|
+
export const PREFERENCE_KEYS = [
|
|
27
|
+
"destination",
|
|
28
|
+
"aspect",
|
|
29
|
+
"language",
|
|
30
|
+
"flow",
|
|
31
|
+
"storyboard",
|
|
32
|
+
"voice",
|
|
33
|
+
"style_preset",
|
|
34
|
+
];
|
|
35
|
+
|
|
36
|
+
/** A value must be confirmed in this many distinct projects to go user-tier. */
|
|
37
|
+
export const PROMOTE_AT = 2;
|
|
38
|
+
|
|
39
|
+
export function projectPrefsPath(projectDir) {
|
|
40
|
+
return join(resolve(projectDir), ".media", PREFS_FILE);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
export function userPrefsPath() {
|
|
44
|
+
return join(globalMediaDir(), PREFS_FILE);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function emptyFile() {
|
|
48
|
+
return { version: 1, preferences: {}, sightings: {} };
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function isRecord(value) {
|
|
52
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Tolerant read — a missing or malformed file counts as empty. */
|
|
56
|
+
function readPrefsFile(path) {
|
|
57
|
+
try {
|
|
58
|
+
if (!existsSync(path)) return emptyFile();
|
|
59
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
60
|
+
if (!isRecord(parsed)) return emptyFile();
|
|
61
|
+
return {
|
|
62
|
+
version: 1,
|
|
63
|
+
preferences: isRecord(parsed.preferences) ? parsed.preferences : {},
|
|
64
|
+
sightings: isRecord(parsed.sightings) ? parsed.sightings : {},
|
|
65
|
+
};
|
|
66
|
+
} catch {
|
|
67
|
+
return emptyFile();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
/** Atomic write (tmp + rename) so a crash never leaves a torn file. */
|
|
72
|
+
function writePrefsFile(path, file) {
|
|
73
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
74
|
+
const tmp = `${path}.tmp`;
|
|
75
|
+
writeFileSync(tmp, `${JSON.stringify(file, null, 2)}\n`);
|
|
76
|
+
renameSync(tmp, path);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/** `style_preset` entries are stored per workflow as `style_preset.<workflow>`. */
|
|
80
|
+
export function preferenceKeyFor(key, workflow) {
|
|
81
|
+
return key === "style_preset" && workflow ? `style_preset.${workflow}` : key;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function validEntry(entry) {
|
|
85
|
+
return isRecord(entry) && typeof entry.value === "string" && entry.value.length > 0;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The merged view the brief reads: user-tier promoted entries first, project
|
|
90
|
+
* entries on top (project wins). Each entry carries `source` plus the receipt
|
|
91
|
+
* material (`confirmed_in`, `updated_at`).
|
|
92
|
+
*/
|
|
93
|
+
export function mergedPreferences(projectDir) {
|
|
94
|
+
const user = readPrefsFile(userPrefsPath());
|
|
95
|
+
const project = readPrefsFile(projectPrefsPath(projectDir));
|
|
96
|
+
const merged = {};
|
|
97
|
+
for (const [key, entry] of Object.entries(user.preferences)) {
|
|
98
|
+
if (validEntry(entry)) merged[key] = { ...entry, source: "user" };
|
|
99
|
+
}
|
|
100
|
+
for (const [key, entry] of Object.entries(project.preferences)) {
|
|
101
|
+
if (validEntry(entry)) merged[key] = { ...entry, source: "project" };
|
|
102
|
+
}
|
|
103
|
+
return merged;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
function dedupe(list) {
|
|
107
|
+
return [...new Set(list)];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Project tier: same value accumulates confirmations; a changed value starts
|
|
112
|
+
* provenance over (the old confirmations vouched for the old value).
|
|
113
|
+
*/
|
|
114
|
+
function recordProjectTier(projectDir, fullKey, value, projectName, now) {
|
|
115
|
+
const path = projectPrefsPath(projectDir);
|
|
116
|
+
const file = readPrefsFile(path);
|
|
117
|
+
const previous = file.preferences[fullKey];
|
|
118
|
+
const keepProvenance = validEntry(previous) && previous.value === value;
|
|
119
|
+
const confirmedIn = keepProvenance
|
|
120
|
+
? dedupe([...(Array.isArray(previous.confirmed_in) ? previous.confirmed_in : []), projectName])
|
|
121
|
+
: [projectName];
|
|
122
|
+
file.preferences[fullKey] = { value, confirmed_in: confirmedIn, updated_at: now };
|
|
123
|
+
writePrefsFile(path, file);
|
|
124
|
+
return confirmedIn;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* User tier: accumulate this sighting in the ledger, and promote the key once
|
|
129
|
+
* the same value has been confirmed in PROMOTE_AT distinct projects.
|
|
130
|
+
*/
|
|
131
|
+
function recordUserSighting(fullKey, value, projectName, now) {
|
|
132
|
+
const path = userPrefsPath();
|
|
133
|
+
const file = readPrefsFile(path);
|
|
134
|
+
const keySightings = isRecord(file.sightings[fullKey]) ? file.sightings[fullKey] : {};
|
|
135
|
+
const seenIn = dedupe([
|
|
136
|
+
...(Array.isArray(keySightings[value]) ? keySightings[value] : []),
|
|
137
|
+
projectName,
|
|
138
|
+
]);
|
|
139
|
+
keySightings[value] = seenIn;
|
|
140
|
+
file.sightings[fullKey] = keySightings;
|
|
141
|
+
const promoted = seenIn.length >= PROMOTE_AT;
|
|
142
|
+
if (promoted) {
|
|
143
|
+
file.preferences[fullKey] = { value, confirmed_in: seenIn, updated_at: now };
|
|
144
|
+
}
|
|
145
|
+
writePrefsFile(path, file);
|
|
146
|
+
return promoted;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Record one confirmed brief answer. Always writes the project tier; feeds the
|
|
151
|
+
* user tier's sightings ledger and promotes once the same value has been
|
|
152
|
+
* confirmed in PROMOTE_AT distinct projects. Idempotent per project.
|
|
153
|
+
*/
|
|
154
|
+
export function recordPreference({ projectDir, key, value, workflow }) {
|
|
155
|
+
if (!PREFERENCE_KEYS.includes(key)) {
|
|
156
|
+
throw new Error(`unknown preference key: "${key}" (known: ${PREFERENCE_KEYS.join(", ")})`);
|
|
157
|
+
}
|
|
158
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
159
|
+
throw new Error("a preference needs a non-empty string value");
|
|
160
|
+
}
|
|
161
|
+
if (key === "style_preset" && (!workflow || !String(workflow).trim())) {
|
|
162
|
+
throw new Error("style_preset is stored per workflow — pass --workflow <w>");
|
|
163
|
+
}
|
|
164
|
+
const fullKey = preferenceKeyFor(key, workflow);
|
|
165
|
+
const projectName = basename(resolve(projectDir));
|
|
166
|
+
const trimmed = value.trim();
|
|
167
|
+
const now = new Date().toISOString();
|
|
168
|
+
|
|
169
|
+
const confirmedIn = recordProjectTier(projectDir, fullKey, trimmed, projectName, now);
|
|
170
|
+
|
|
171
|
+
// Best-effort — a read-only home directory must never fail a brief.
|
|
172
|
+
let promoted = false;
|
|
173
|
+
try {
|
|
174
|
+
promoted = recordUserSighting(fullKey, trimmed, projectName, now);
|
|
175
|
+
} catch {
|
|
176
|
+
// The project record already landed; promotion just waits for next time.
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return { key: fullKey, value: trimmed, confirmed_in: confirmedIn, promoted };
|
|
180
|
+
}
|