@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,367 @@
|
|
|
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 {
|
|
7
|
+
freezeRecipe,
|
|
8
|
+
listRecipes,
|
|
9
|
+
skeletonizeBrief,
|
|
10
|
+
skeletonizeStoryboard,
|
|
11
|
+
slugifyRecipeName,
|
|
12
|
+
useRecipe,
|
|
13
|
+
} from "./recipe-store.mjs";
|
|
14
|
+
import { recordPreference } from "./prefs-store.mjs";
|
|
15
|
+
|
|
16
|
+
const STORYBOARD = `---
|
|
17
|
+
format: 1080x1080
|
|
18
|
+
message: "Ship a launch video in an afternoon"
|
|
19
|
+
arc: Hook → Problem → Solution
|
|
20
|
+
audience: indie devs on X
|
|
21
|
+
mode: collaborative
|
|
22
|
+
music: upbeat tech
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Frame 1 — Hook
|
|
26
|
+
|
|
27
|
+
- scene: Big type punches in
|
|
28
|
+
- duration: 3s
|
|
29
|
+
- transition_in: cut
|
|
30
|
+
- status: animated
|
|
31
|
+
- voiceover: "Ship a launch video in an afternoon."
|
|
32
|
+
- src: compositions/frames/01-hook.html
|
|
33
|
+
|
|
34
|
+
Open cold on the promise. This is the thesis.
|
|
35
|
+
|
|
36
|
+
## Frame 2 — Proof
|
|
37
|
+
|
|
38
|
+
- duration: 4s
|
|
39
|
+
- transition_in: crossfade
|
|
40
|
+
- status: animated
|
|
41
|
+
- asset_candidates: dashboard.png
|
|
42
|
+
- src: compositions/frames/02-proof.html
|
|
43
|
+
|
|
44
|
+
Real dashboard, real numbers.
|
|
45
|
+
Second prose line to collapse.
|
|
46
|
+
|
|
47
|
+
## Video direction
|
|
48
|
+
|
|
49
|
+
Punchy, one accent color, hard cuts on the beat.
|
|
50
|
+
`;
|
|
51
|
+
|
|
52
|
+
const BRIEF = `---
|
|
53
|
+
workflow: product-launch-video
|
|
54
|
+
flow: automation
|
|
55
|
+
storyboard: yes
|
|
56
|
+
message: "Ship a launch video in an afternoon"
|
|
57
|
+
audience: indie devs on X
|
|
58
|
+
destination: x-feed
|
|
59
|
+
aspect: 1080x1080
|
|
60
|
+
language: en
|
|
61
|
+
length: 60s
|
|
62
|
+
angle: feature-reveal
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## Intent
|
|
66
|
+
|
|
67
|
+
Sell the afternoon-launch promise to indie devs.
|
|
68
|
+
|
|
69
|
+
## Assets
|
|
70
|
+
|
|
71
|
+
- public/dashboard.png — the real dashboard, proof beat.
|
|
72
|
+
|
|
73
|
+
## Notes
|
|
74
|
+
|
|
75
|
+
- No stock-photo aesthetics.
|
|
76
|
+
`;
|
|
77
|
+
|
|
78
|
+
function sandbox() {
|
|
79
|
+
const root = mkdtempSync(join(tmpdir(), "mu-recipes-"));
|
|
80
|
+
const home = join(root, "home");
|
|
81
|
+
const project = join(root, "my-launch");
|
|
82
|
+
mkdirSync(home, { recursive: true });
|
|
83
|
+
mkdirSync(project, { recursive: true });
|
|
84
|
+
writeFileSync(join(project, "frame.md"), "# Frame spec\nbackground: #101014\n");
|
|
85
|
+
writeFileSync(join(project, "STORYBOARD.md"), STORYBOARD);
|
|
86
|
+
process.env.HYPERFRAMES_MEDIA_HOME = home;
|
|
87
|
+
return { root, home, project };
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
function restoreEnv(saved) {
|
|
91
|
+
for (const k of Object.keys(process.env)) if (!(k in saved)) delete process.env[k];
|
|
92
|
+
Object.assign(process.env, saved);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
function withSandbox(fn) {
|
|
96
|
+
const savedEnv = { ...process.env };
|
|
97
|
+
const box = sandbox();
|
|
98
|
+
try {
|
|
99
|
+
fn(box);
|
|
100
|
+
} finally {
|
|
101
|
+
restoreEnv(savedEnv);
|
|
102
|
+
rmSync(box.root, { recursive: true, force: true });
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
test("slugifyRecipeName normalizes and rejects empty", () => {
|
|
107
|
+
assert.equal(slugifyRecipeName("Weekly Changelog!"), "weekly-changelog");
|
|
108
|
+
assert.equal(slugifyRecipeName(" pr_reveal "), "pr-reveal");
|
|
109
|
+
assert.throws(() => slugifyRecipeName("!!!"));
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
test("skeletonize keeps structure, resets status, blanks content", () => {
|
|
113
|
+
const skeleton = skeletonizeStoryboard(STORYBOARD);
|
|
114
|
+
// Structure kept.
|
|
115
|
+
assert.match(skeleton, /format: 1080x1080/);
|
|
116
|
+
assert.match(skeleton, /arc: Hook → Problem → Solution/);
|
|
117
|
+
assert.match(skeleton, /music: upbeat tech/);
|
|
118
|
+
assert.match(skeleton, /- duration: 3s/);
|
|
119
|
+
assert.match(skeleton, /- src: compositions\/frames\/01-hook\.html/);
|
|
120
|
+
assert.match(skeleton, /## Video direction/);
|
|
121
|
+
assert.match(skeleton, /hard cuts on the beat/);
|
|
122
|
+
// Statuses reset.
|
|
123
|
+
assert.equal((skeleton.match(/- status: outline/g) ?? []).length, 2);
|
|
124
|
+
assert.doesNotMatch(skeleton, /animated/);
|
|
125
|
+
// Content blanked.
|
|
126
|
+
assert.doesNotMatch(skeleton, /message:/);
|
|
127
|
+
assert.doesNotMatch(skeleton, /audience:/);
|
|
128
|
+
assert.doesNotMatch(skeleton, /mode:/);
|
|
129
|
+
assert.doesNotMatch(skeleton, /voiceover/);
|
|
130
|
+
assert.doesNotMatch(skeleton, /asset_candidates/);
|
|
131
|
+
assert.doesNotMatch(skeleton, /thesis/);
|
|
132
|
+
assert.doesNotMatch(skeleton, /Real dashboard/);
|
|
133
|
+
assert.match(skeleton, /<fill in: this video's content for the "Hook" beat/);
|
|
134
|
+
assert.match(skeleton, /<fill in: this video's content for the "Proof" beat/);
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
test("skeletonizeBrief keeps reusable keys, drops run-shape, blanks body sections", () => {
|
|
138
|
+
const skeleton = skeletonizeBrief(BRIEF);
|
|
139
|
+
// Reusable frontmatter kept.
|
|
140
|
+
assert.match(skeleton, /workflow: product-launch-video/);
|
|
141
|
+
assert.match(skeleton, /destination: x-feed/);
|
|
142
|
+
assert.match(skeleton, /aspect: 1080x1080/);
|
|
143
|
+
assert.match(skeleton, /length: 60s/);
|
|
144
|
+
assert.match(skeleton, /angle: feature-reveal/);
|
|
145
|
+
// Run-shape and content keys dropped.
|
|
146
|
+
assert.doesNotMatch(skeleton, /^flow:/m);
|
|
147
|
+
assert.doesNotMatch(skeleton, /^storyboard:/m);
|
|
148
|
+
assert.doesNotMatch(skeleton, /^message:/m);
|
|
149
|
+
assert.doesNotMatch(skeleton, /^audience:/m);
|
|
150
|
+
// Body sections kept as headings, prose blanked to placeholders.
|
|
151
|
+
assert.match(skeleton, /## Intent/);
|
|
152
|
+
assert.match(skeleton, /## Assets/);
|
|
153
|
+
assert.match(skeleton, /<fill in: this video's intent/);
|
|
154
|
+
assert.match(skeleton, /<fill in: this video's assets/);
|
|
155
|
+
assert.doesNotMatch(skeleton, /afternoon-launch promise/);
|
|
156
|
+
assert.doesNotMatch(skeleton, /dashboard\.png/);
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
test("freeze writes the folder, manifest record, and user-tier copy", () => {
|
|
160
|
+
withSandbox(({ project, home }) => {
|
|
161
|
+
recordPreference({ projectDir: project, key: "destination", value: "x-feed" });
|
|
162
|
+
recordPreference({
|
|
163
|
+
projectDir: project,
|
|
164
|
+
key: "style_preset",
|
|
165
|
+
value: "pin-and-paper",
|
|
166
|
+
workflow: "product-launch-video",
|
|
167
|
+
});
|
|
168
|
+
const frozen = freezeRecipe({
|
|
169
|
+
projectDir: project,
|
|
170
|
+
name: "Weekly Launch",
|
|
171
|
+
workflow: "product-launch-video",
|
|
172
|
+
blocks: ["data-chart"],
|
|
173
|
+
});
|
|
174
|
+
assert.equal(frozen.slug, "weekly-launch");
|
|
175
|
+
assert.equal(frozen.version, 1);
|
|
176
|
+
|
|
177
|
+
const dir = join(project, ".media/recipes/weekly-launch");
|
|
178
|
+
const recipe = JSON.parse(readFileSync(join(dir, "recipe.json"), "utf8"));
|
|
179
|
+
assert.equal(recipe.workflow, "product-launch-video");
|
|
180
|
+
assert.equal(recipe.destination, "x-feed");
|
|
181
|
+
assert.equal(recipe.style_preset, "pin-and-paper");
|
|
182
|
+
assert.deepEqual(recipe.blocks, ["data-chart"]);
|
|
183
|
+
assert.ok(existsSync(join(dir, "frame.md")));
|
|
184
|
+
assert.match(readFileSync(join(dir, "storyboard-skeleton.md"), "utf8"), /- status: outline/);
|
|
185
|
+
|
|
186
|
+
const manifest = readFileSync(join(project, ".media/manifest.jsonl"), "utf8");
|
|
187
|
+
assert.match(manifest, /"type":"recipe"/);
|
|
188
|
+
assert.match(manifest, /"entity":"weekly-launch"/);
|
|
189
|
+
|
|
190
|
+
assert.ok(existsSync(join(home, ".media/recipes/weekly-launch/recipe.json")));
|
|
191
|
+
});
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("freeze with a BRIEF.md carries the brief skeleton; use hands its path back", () => {
|
|
195
|
+
withSandbox(({ project, root }) => {
|
|
196
|
+
writeFileSync(join(project, "BRIEF.md"), BRIEF);
|
|
197
|
+
const frozen = freezeRecipe({
|
|
198
|
+
projectDir: project,
|
|
199
|
+
name: "promo",
|
|
200
|
+
workflow: "product-launch-video",
|
|
201
|
+
});
|
|
202
|
+
assert.equal(frozen.briefSkeleton, true);
|
|
203
|
+
const skeleton = readFileSync(join(project, ".media/recipes/promo/brief-skeleton.md"), "utf8");
|
|
204
|
+
assert.match(skeleton, /destination: x-feed/);
|
|
205
|
+
assert.doesNotMatch(skeleton, /^flow:/m);
|
|
206
|
+
|
|
207
|
+
const fresh = join(root, "fresh-project");
|
|
208
|
+
mkdirSync(fresh, { recursive: true });
|
|
209
|
+
const used = useRecipe({ projectDir: fresh, name: "promo" });
|
|
210
|
+
assert.equal(used.briefSkeletonPath, ".media/recipes/promo/brief-skeleton.md");
|
|
211
|
+
assert.ok(existsSync(join(fresh, ".media/recipes/promo/brief-skeleton.md")));
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
|
|
215
|
+
test("freeze without a BRIEF.md degrades: no skeleton, use returns no path", () => {
|
|
216
|
+
withSandbox(({ project, root }) => {
|
|
217
|
+
const frozen = freezeRecipe({
|
|
218
|
+
projectDir: project,
|
|
219
|
+
name: "promo",
|
|
220
|
+
workflow: "product-launch-video",
|
|
221
|
+
});
|
|
222
|
+
assert.equal(frozen.briefSkeleton, false);
|
|
223
|
+
assert.ok(!existsSync(join(project, ".media/recipes/promo/brief-skeleton.md")));
|
|
224
|
+
|
|
225
|
+
const fresh = join(root, "fresh-project");
|
|
226
|
+
mkdirSync(fresh, { recursive: true });
|
|
227
|
+
const used = useRecipe({ projectDir: fresh, name: "promo" });
|
|
228
|
+
assert.equal(used.briefSkeletonPath, undefined);
|
|
229
|
+
});
|
|
230
|
+
});
|
|
231
|
+
|
|
232
|
+
test("freeze takes the workflow from BRIEF.md over a contradicting flag", () => {
|
|
233
|
+
withSandbox(({ project }) => {
|
|
234
|
+
writeFileSync(
|
|
235
|
+
join(project, "BRIEF.md"),
|
|
236
|
+
BRIEF.replace("workflow: product-launch-video", "workflow: general-video"),
|
|
237
|
+
);
|
|
238
|
+
const frozen = freezeRecipe({
|
|
239
|
+
projectDir: project,
|
|
240
|
+
name: "promo",
|
|
241
|
+
workflow: "faceless-explainer",
|
|
242
|
+
});
|
|
243
|
+
assert.equal(frozen.workflow, "general-video");
|
|
244
|
+
assert.equal(frozen.workflowOverridden, true);
|
|
245
|
+
const recipe = JSON.parse(
|
|
246
|
+
readFileSync(join(project, ".media/recipes/promo/recipe.json"), "utf8"),
|
|
247
|
+
);
|
|
248
|
+
assert.equal(recipe.workflow, "general-video");
|
|
249
|
+
});
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
test("freeze without BRIEF.md falls back to --workflow; with neither it refuses", () => {
|
|
253
|
+
withSandbox(({ project }) => {
|
|
254
|
+
const frozen = freezeRecipe({
|
|
255
|
+
projectDir: project,
|
|
256
|
+
name: "promo",
|
|
257
|
+
workflow: "product-launch-video",
|
|
258
|
+
});
|
|
259
|
+
assert.equal(frozen.workflow, "product-launch-video");
|
|
260
|
+
assert.equal(frozen.workflowOverridden, false);
|
|
261
|
+
assert.throws(() => freezeRecipe({ projectDir: project, name: "other" }), /no workflow found/);
|
|
262
|
+
});
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
test("freeze finds a legacy bare style_preset record; the scoped key wins over it", () => {
|
|
266
|
+
withSandbox(({ project }) => {
|
|
267
|
+
writeFileSync(join(project, "BRIEF.md"), BRIEF);
|
|
268
|
+
// A record made before the store required workflow scoping.
|
|
269
|
+
mkdirSync(join(project, ".media"), { recursive: true });
|
|
270
|
+
writeFileSync(
|
|
271
|
+
join(project, ".media/preferences.json"),
|
|
272
|
+
JSON.stringify({
|
|
273
|
+
version: 1,
|
|
274
|
+
preferences: {
|
|
275
|
+
style_preset: {
|
|
276
|
+
value: "source-paper-flowchart",
|
|
277
|
+
confirmed_in: ["my-launch"],
|
|
278
|
+
updated_at: "2026-07-15T00:00:00.000Z",
|
|
279
|
+
},
|
|
280
|
+
},
|
|
281
|
+
sightings: {},
|
|
282
|
+
}),
|
|
283
|
+
);
|
|
284
|
+
freezeRecipe({ projectDir: project, name: "promo" });
|
|
285
|
+
const legacy = JSON.parse(
|
|
286
|
+
readFileSync(join(project, ".media/recipes/promo/recipe.json"), "utf8"),
|
|
287
|
+
);
|
|
288
|
+
assert.equal(legacy.style_preset, "source-paper-flowchart");
|
|
289
|
+
|
|
290
|
+
recordPreference({
|
|
291
|
+
projectDir: project,
|
|
292
|
+
key: "style_preset",
|
|
293
|
+
value: "pin-and-paper",
|
|
294
|
+
workflow: "product-launch-video",
|
|
295
|
+
});
|
|
296
|
+
freezeRecipe({ projectDir: project, name: "promo" });
|
|
297
|
+
const scoped = JSON.parse(
|
|
298
|
+
readFileSync(join(project, ".media/recipes/promo/recipe.json"), "utf8"),
|
|
299
|
+
);
|
|
300
|
+
assert.equal(scoped.style_preset, "pin-and-paper");
|
|
301
|
+
});
|
|
302
|
+
});
|
|
303
|
+
|
|
304
|
+
test("re-freezing bumps the version and archives the old folder", () => {
|
|
305
|
+
withSandbox(({ project }) => {
|
|
306
|
+
freezeRecipe({ projectDir: project, name: "promo", workflow: "product-launch-video" });
|
|
307
|
+
const again = freezeRecipe({
|
|
308
|
+
projectDir: project,
|
|
309
|
+
name: "promo",
|
|
310
|
+
workflow: "product-launch-video",
|
|
311
|
+
});
|
|
312
|
+
assert.equal(again.version, 2);
|
|
313
|
+
assert.ok(existsSync(join(project, ".media/recipes/promo@v1/recipe.json")));
|
|
314
|
+
const current = JSON.parse(
|
|
315
|
+
readFileSync(join(project, ".media/recipes/promo/recipe.json"), "utf8"),
|
|
316
|
+
);
|
|
317
|
+
assert.equal(current.version, 2);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
|
|
321
|
+
test("list merges tiers (project wins), filters by workflow, skips archives", () => {
|
|
322
|
+
withSandbox(({ project, root }) => {
|
|
323
|
+
freezeRecipe({ projectDir: project, name: "promo", workflow: "product-launch-video" });
|
|
324
|
+
freezeRecipe({ projectDir: project, name: "promo", workflow: "product-launch-video" });
|
|
325
|
+
freezeRecipe({ projectDir: project, name: "explainer", workflow: "faceless-explainer" });
|
|
326
|
+
|
|
327
|
+
const fresh = join(root, "fresh-project");
|
|
328
|
+
mkdirSync(fresh, { recursive: true });
|
|
329
|
+
const all = listRecipes({ projectDir: fresh });
|
|
330
|
+
assert.deepEqual(all.map((r) => r.source).sort(), ["user", "user"]);
|
|
331
|
+
assert.equal(all.find((r) => r.name === "promo").version, 2);
|
|
332
|
+
|
|
333
|
+
const filtered = listRecipes({ projectDir: fresh, workflow: "faceless-explainer" });
|
|
334
|
+
assert.deepEqual(
|
|
335
|
+
filtered.map((r) => r.name),
|
|
336
|
+
["explainer"],
|
|
337
|
+
);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
|
|
341
|
+
test("use imports from the user tier into a fresh project and copies frame.md", () => {
|
|
342
|
+
withSandbox(({ project, root }) => {
|
|
343
|
+
freezeRecipe({ projectDir: project, name: "promo", workflow: "product-launch-video" });
|
|
344
|
+
|
|
345
|
+
const fresh = join(root, "fresh-project");
|
|
346
|
+
mkdirSync(fresh, { recursive: true });
|
|
347
|
+
const used = useRecipe({ projectDir: fresh, name: "Promo" });
|
|
348
|
+
assert.equal(used.recipe.name, "promo");
|
|
349
|
+
assert.equal(used.skeletonPath, ".media/recipes/promo/storyboard-skeleton.md");
|
|
350
|
+
assert.ok(existsSync(join(fresh, "frame.md")));
|
|
351
|
+
assert.ok(existsSync(join(fresh, ".media/recipes/promo/storyboard-skeleton.md")));
|
|
352
|
+
assert.match(
|
|
353
|
+
readFileSync(join(fresh, ".media/manifest.jsonl"), "utf8"),
|
|
354
|
+
/"imported_from":"user-tier"/,
|
|
355
|
+
);
|
|
356
|
+
});
|
|
357
|
+
});
|
|
358
|
+
|
|
359
|
+
test("use with an unknown name lists what exists", () => {
|
|
360
|
+
withSandbox(({ project }) => {
|
|
361
|
+
freezeRecipe({ projectDir: project, name: "promo", workflow: "product-launch-video" });
|
|
362
|
+
assert.throws(
|
|
363
|
+
() => useRecipe({ projectDir: project, name: "nope" }),
|
|
364
|
+
/no recipe named "nope" \(known: promo\)/,
|
|
365
|
+
);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
// Provider registry — the v2 contract.
|
|
2
|
+
//
|
|
3
|
+
// Each media type maps to an ORDERED list of provider entries. Providers are
|
|
4
|
+
// tried in order; the first to return a non-null result wins, which keeps
|
|
5
|
+
// resolution deterministic (same request -> same provider -> same file ->
|
|
6
|
+
// reproducible renders). heygen-CLI is always first for the types it serves.
|
|
7
|
+
//
|
|
8
|
+
// An entry exposes any of three capability methods — search / generate /
|
|
9
|
+
// process — plus { name }. media-use holds no keys; each external tool owns its
|
|
10
|
+
// own auth. Providers, by type:
|
|
11
|
+
// - heygen CLI: catalog + TTS, first for every type it serves (OAuth free
|
|
12
|
+
// allowance first, then the user's HeyGen billing path)
|
|
13
|
+
// - mflux: local FLUX-class image gen, spec-selected to the machine's RAM
|
|
14
|
+
// (free, private, offline once cached)
|
|
15
|
+
// - codex CLI: image gen on the user's ChatGPT sub — the better-quality upsell
|
|
16
|
+
// and the fallback when no local model fits
|
|
17
|
+
// - Kokoro (via the hyperframes CLI): local voiceover, free/private fallback
|
|
18
|
+
// when HeyGen credentials are absent or --local-only is requested
|
|
19
|
+
//
|
|
20
|
+
// Generation is local-first, cloud-upsell. `ctx.provider` forces one provider
|
|
21
|
+
// (e.g. "make an image with codex").
|
|
22
|
+
|
|
23
|
+
import { bgmProvider } from "./bgm-provider.mjs";
|
|
24
|
+
import { sfxProvider } from "./sfx-provider.mjs";
|
|
25
|
+
import { bundledSfxProvider } from "./bundled-sfx-provider.mjs";
|
|
26
|
+
import { imageProvider, iconProvider } from "./image-provider.mjs";
|
|
27
|
+
import { brandProvider } from "./brand-provider.mjs";
|
|
28
|
+
import { thesvgSearch, githubAvatarSearch, faviconSearch } from "./logo-provider.mjs";
|
|
29
|
+
import { heygenTtsGenerate } from "./voice-provider.mjs";
|
|
30
|
+
import { heygenVideoGenerate } from "./heygen-video-provider.mjs";
|
|
31
|
+
import { ltxVideoGenerate } from "./ltx-video-provider.mjs";
|
|
32
|
+
import { localTtsGenerate } from "./tts-local-provider.mjs";
|
|
33
|
+
import { codexImageGenerate } from "./codex-provider.mjs";
|
|
34
|
+
import { mfluxImageGenerate } from "./mflux-provider.mjs";
|
|
35
|
+
|
|
36
|
+
// Provider markers: `network` = hits a remote service (skipped by --local-only).
|
|
37
|
+
// `paid` = may cost wallet credits after any OAuth/web-plan free allowance
|
|
38
|
+
// (documentation for the agent's cost judgment, X4: agent-initiated paid should
|
|
39
|
+
// confirm). HeyGen catalog SEARCH is free; HeyGen TTS is free for eligible
|
|
40
|
+
// OAuth CLI users up to the monthly allowance, then follows the user's billing.
|
|
41
|
+
const A = (name, caps) => ({ name, ...caps }); // local, free
|
|
42
|
+
const N = (name, caps) => ({ name, network: true, ...caps }); // remote, free
|
|
43
|
+
const P = (name, caps) => ({ name, network: true, paid: true, ...caps }); // remote, paid
|
|
44
|
+
|
|
45
|
+
// heygen-CLI first. All remote providers are skipped by --local-only.
|
|
46
|
+
const REGISTRY = {
|
|
47
|
+
bgm: [N("heygen.audio.sounds", { search: bgmProvider.search })],
|
|
48
|
+
sfx: [
|
|
49
|
+
A("bundled.sfx", { search: bundledSfxProvider.search }),
|
|
50
|
+
N("heygen.audio.sounds", { search: sfxProvider.search }),
|
|
51
|
+
],
|
|
52
|
+
image: [
|
|
53
|
+
N("heygen.asset.search", { search: imageProvider.search }),
|
|
54
|
+
// Catalog miss -> generate. Local first (best FLUX-class model the machine's
|
|
55
|
+
// RAM can run, spec-selected; free, private, kept under --local-only), then
|
|
56
|
+
// the codex CLI on the user's ChatGPT sub as the better-quality upsell and
|
|
57
|
+
// the fallback when no local model fits.
|
|
58
|
+
A("mflux.local", { generate: mfluxImageGenerate }),
|
|
59
|
+
N("codex.image_gen", { generate: codexImageGenerate }),
|
|
60
|
+
],
|
|
61
|
+
icon: [N("heygen.asset.search", { search: iconProvider.search })],
|
|
62
|
+
logo: [
|
|
63
|
+
// Official brand marks: theSVG first, then GitHub org avatar and favicon
|
|
64
|
+
// for the brands it lacks. HeyGen asset search is deliberately absent — it
|
|
65
|
+
// returns generic look-alike icons for brand queries. All free, all
|
|
66
|
+
// network → --local-only leaves only the cache rungs.
|
|
67
|
+
N("thesvg", { search: thesvgSearch }),
|
|
68
|
+
N("github.avatar", { search: githubAvatarSearch }),
|
|
69
|
+
N("favicon.ddg", { search: faviconSearch }),
|
|
70
|
+
],
|
|
71
|
+
voice: [
|
|
72
|
+
// HeyGen TTS first when credentialed so CLI/OAuth users consume the free
|
|
73
|
+
// web-plan allowance (10 min/month) before any paid path. --local-only skips
|
|
74
|
+
// it and keeps Kokoro as the private/offline fallback.
|
|
75
|
+
// Deliberately kept `paid` (X4 confirm-before-call) even though the first
|
|
76
|
+
// 10 min/month are free: the client can't know the remaining allowance, so
|
|
77
|
+
// confirming is safer than risking a silent charge once it's spent. (A
|
|
78
|
+
// tri-state "quota-first, paid after" would need backend quota state.)
|
|
79
|
+
P("heygen.tts", { generate: heygenTtsGenerate }),
|
|
80
|
+
A("kokoro.local", { generate: localTtsGenerate }),
|
|
81
|
+
],
|
|
82
|
+
video: [
|
|
83
|
+
// HeyGen avatar video first when credentialed; --local-only skips it and
|
|
84
|
+
// keeps LTX as the local fallback.
|
|
85
|
+
P("heygen.video", { generate: heygenVideoGenerate }),
|
|
86
|
+
A("ltx.local", { generate: ltxVideoGenerate }),
|
|
87
|
+
],
|
|
88
|
+
brand: [
|
|
89
|
+
// Local design spec, not heygen — reads frame.md / design.md tokens.
|
|
90
|
+
A("design_spec", { search: brandProvider.search }),
|
|
91
|
+
],
|
|
92
|
+
grade: [
|
|
93
|
+
// Local deterministic cascade handled by resolve.mjs so grade records can
|
|
94
|
+
// carry an inline block as well as an optional frozen .cube file.
|
|
95
|
+
A("color_grade.local", { search: async () => null, generate: async () => null }),
|
|
96
|
+
],
|
|
97
|
+
lut: [
|
|
98
|
+
// Lower-level local LUT generation/freezing path handled by resolve.mjs.
|
|
99
|
+
A("cube_lut.local", { search: async () => null, generate: async () => null }),
|
|
100
|
+
],
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
function listFor(type) {
|
|
104
|
+
const list = REGISTRY[type];
|
|
105
|
+
if (!list) throw new Error(`unknown media type: ${type}`);
|
|
106
|
+
return list;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Ordered providers for a type. */
|
|
110
|
+
export function getProviders(type) {
|
|
111
|
+
return listFor(type);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** All declared media types. */
|
|
115
|
+
export function listTypes() {
|
|
116
|
+
return Object.keys(REGISTRY);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/** Provider names available for a type, in cascade order (for --provider validation). */
|
|
120
|
+
export function providerNamesFor(type) {
|
|
121
|
+
return listFor(type).map((p) => p.name);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* name -> cost tier ("local" | "network_free" | "network_paid") over a collection
|
|
126
|
+
* of ordered provider lists, i.e. the A / N / P distinction the constructors above
|
|
127
|
+
* already declare. Exported so the conflict rule below is testable against a
|
|
128
|
+
* fixture; production reads the REGISTRY-wide index built from it.
|
|
129
|
+
*
|
|
130
|
+
* A name declared under two media types must carry the same tier in both. If it
|
|
131
|
+
* didn't, "did this resolve cost credit" would depend on which type happened to
|
|
132
|
+
* serve it, and the telemetry property would mean nothing — so this throws at
|
|
133
|
+
* import rather than silently picking one.
|
|
134
|
+
*/
|
|
135
|
+
export function buildProviderTierIndex(providerLists) {
|
|
136
|
+
const tiers = new Map();
|
|
137
|
+
for (const list of providerLists) {
|
|
138
|
+
for (const p of list) {
|
|
139
|
+
const tier = p.paid ? "network_paid" : p.network ? "network_free" : "local";
|
|
140
|
+
const prior = tiers.get(p.name);
|
|
141
|
+
if (prior && prior !== tier)
|
|
142
|
+
throw new Error(
|
|
143
|
+
`provider "${p.name}" is declared ${prior} under one media type and ${tier} under another`,
|
|
144
|
+
);
|
|
145
|
+
tiers.set(p.name, tier);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return tiers;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const PROVIDER_TIERS = buildProviderTierIndex(Object.values(REGISTRY));
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Cost tier of a provider by name, or undefined for a name the registry doesn't
|
|
155
|
+
* declare. The registry stays the single owner of "does this cost credit", so
|
|
156
|
+
* dashboards and callers never re-derive it from provider-name string matching.
|
|
157
|
+
*/
|
|
158
|
+
export function providerTierFor(name) {
|
|
159
|
+
return PROVIDER_TIERS.get(name);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Does an override token (full name like "codex.image_gen" or a prefix like
|
|
164
|
+
* "codex") match any provider declared for the type? Same match rule as
|
|
165
|
+
* runProviders, so validation and dispatch never disagree.
|
|
166
|
+
*/
|
|
167
|
+
export function providerMatches(type, want) {
|
|
168
|
+
return providerNamesFor(type).some((n) => n === want || n.startsWith(`${want}.`));
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Back-compat shim for the v1 single-provider API. Returns the first declared
|
|
173
|
+
* provider for the type (tagged with `type`); throws for an unknown type.
|
|
174
|
+
* Kept for v1 callers only — new code should use getProviders/runCapability.
|
|
175
|
+
*/
|
|
176
|
+
export function getProvider(type) {
|
|
177
|
+
const first = listFor(type)[0] || {};
|
|
178
|
+
return { ...first, type };
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/**
|
|
182
|
+
* Run a capability across an explicit ordered provider list. Tries each in
|
|
183
|
+
* order, returns the first non-null result, skips providers that don't expose
|
|
184
|
+
* the capability. Pure over its input — the unit-testable core of the cascade.
|
|
185
|
+
*
|
|
186
|
+
* Offline guard: a `network` provider is skipped when `ctx.localOnly` is set —
|
|
187
|
+
* unconditionally, even under a `ctx.provider` override. --local-only is a hard
|
|
188
|
+
* safety flag: it must never make a network call. Forcing a network provider
|
|
189
|
+
* while offline yields a clean miss (the caller explains the conflict), never a
|
|
190
|
+
* silent network request.
|
|
191
|
+
* Provider override: `ctx.provider` (a full name like "codex.image_gen" or a
|
|
192
|
+
* prefix like "codex") pins resolution to matching providers only — this is how
|
|
193
|
+
* a user "make an image WITH codex" forces the upsell instead of taking the
|
|
194
|
+
* free-first default.
|
|
195
|
+
*/
|
|
196
|
+
export async function runProviders(providers, capability, intent, ctx) {
|
|
197
|
+
const want = ctx?.provider;
|
|
198
|
+
for (const p of providers) {
|
|
199
|
+
if (want && p.name !== want && !p.name.startsWith(`${want}.`)) continue;
|
|
200
|
+
if (p.network && ctx?.localOnly) continue; // --local-only wins, even over --provider
|
|
201
|
+
const fn = p[capability];
|
|
202
|
+
if (typeof fn !== "function") continue;
|
|
203
|
+
const res = await fn(intent, ctx);
|
|
204
|
+
if (res) return res;
|
|
205
|
+
}
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** Run a capability over the providers for a type (deterministic, heygen-first). */
|
|
210
|
+
export async function runCapability(type, capability, intent, ctx) {
|
|
211
|
+
return runProviders(getProviders(type), capability, intent, ctx);
|
|
212
|
+
}
|