@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,875 @@
|
|
|
1
|
+
import { createRequire as __hf_createRequire } from "node:module";
|
|
2
|
+
import { fileURLToPath as __hf_fileURLToPath } from "node:url";
|
|
3
|
+
import { dirname as __hf_dirname } from "node:path";
|
|
4
|
+
var require = __hf_createRequire(import.meta.url);
|
|
5
|
+
var __filename = __hf_fileURLToPath(import.meta.url);
|
|
6
|
+
var __dirname = __hf_dirname(__filename);
|
|
7
|
+
import {
|
|
8
|
+
parseAngle
|
|
9
|
+
} from "./chunk-KZI44OPA.js";
|
|
10
|
+
import {
|
|
11
|
+
serveStaticProjectHtml
|
|
12
|
+
} from "./chunk-KBJUXVOJ.js";
|
|
13
|
+
import "./chunk-XUHOIDKG.js";
|
|
14
|
+
import "./chunk-UEZXMWG3.js";
|
|
15
|
+
import "./chunk-X7MTZ4T2.js";
|
|
16
|
+
import {
|
|
17
|
+
DEFAULT_ZOOM_SCALE,
|
|
18
|
+
captureRegionCrop,
|
|
19
|
+
openSettledCompositionPage,
|
|
20
|
+
parseZoomTarget,
|
|
21
|
+
resolveCropRegion,
|
|
22
|
+
runFfmpegOnce,
|
|
23
|
+
seekCompositionTimeline
|
|
24
|
+
} from "./chunk-YQZNILVH.js";
|
|
25
|
+
import "./chunk-5Z63TBTX.js";
|
|
26
|
+
import "./chunk-7HG4BFIN.js";
|
|
27
|
+
import "./chunk-HRUGC23L.js";
|
|
28
|
+
import "./chunk-YEIFI443.js";
|
|
29
|
+
import "./chunk-S7NPLFWV.js";
|
|
30
|
+
import "./chunk-RMHUQGRK.js";
|
|
31
|
+
import "./chunk-EOVYQ3IG.js";
|
|
32
|
+
import "./chunk-QC4FJVLM.js";
|
|
33
|
+
import "./chunk-TCLGPL65.js";
|
|
34
|
+
import {
|
|
35
|
+
resolveProject
|
|
36
|
+
} from "./chunk-S3D6GE5W.js";
|
|
37
|
+
import {
|
|
38
|
+
formatLintFindings
|
|
39
|
+
} from "./chunk-6CSYCFQV.js";
|
|
40
|
+
import "./chunk-IHFUKJOR.js";
|
|
41
|
+
import {
|
|
42
|
+
resolveLocalBrowserGpuMode
|
|
43
|
+
} from "./chunk-XS4EJSKU.js";
|
|
44
|
+
import "./chunk-PFCFR3KZ.js";
|
|
45
|
+
import "./chunk-CFKU7HTK.js";
|
|
46
|
+
import "./chunk-XT7X6QCP.js";
|
|
47
|
+
import "./chunk-4YYJOFKS.js";
|
|
48
|
+
import "./chunk-HVW7ABXD.js";
|
|
49
|
+
import "./chunk-LYNI3FOL.js";
|
|
50
|
+
import "./chunk-CWPVM2QV.js";
|
|
51
|
+
import "./chunk-A2Z4Z4VL.js";
|
|
52
|
+
import "./chunk-AWDFDFI3.js";
|
|
53
|
+
import "./chunk-P6LJ4Y32.js";
|
|
54
|
+
import "./chunk-GMECXFAN.js";
|
|
55
|
+
import {
|
|
56
|
+
findFFmpeg,
|
|
57
|
+
findFFprobe,
|
|
58
|
+
getFFmpegInstallHint
|
|
59
|
+
} from "./chunk-TVCRUG2S.js";
|
|
60
|
+
import "./chunk-4NWOGZZS.js";
|
|
61
|
+
import "./chunk-JTHMTOMQ.js";
|
|
62
|
+
import "./chunk-EISRN4E6.js";
|
|
63
|
+
import "./chunk-VWG7OQKU.js";
|
|
64
|
+
import {
|
|
65
|
+
c
|
|
66
|
+
} from "./chunk-ZTZA4UWZ.js";
|
|
67
|
+
import "./chunk-IUZFXWSV.js";
|
|
68
|
+
import "./chunk-AMKC3AXA.js";
|
|
69
|
+
import {
|
|
70
|
+
defineCommand
|
|
71
|
+
} from "./chunk-S3S4TGEH.js";
|
|
72
|
+
import "./chunk-54HJ63Q2.js";
|
|
73
|
+
import {
|
|
74
|
+
failCommand
|
|
75
|
+
} from "./chunk-PBN6GBJE.js";
|
|
76
|
+
import "./chunk-KC5XXX3X.js";
|
|
77
|
+
import "./chunk-TJSTGSAW.js";
|
|
78
|
+
import "./chunk-K2FTXJYH.js";
|
|
79
|
+
import {
|
|
80
|
+
isClipVisibleAt,
|
|
81
|
+
isInClipWindow
|
|
82
|
+
} from "./chunk-2YN64IN5.js";
|
|
83
|
+
import "./chunk-AVUUN2XD.js";
|
|
84
|
+
import "./chunk-DPVXBVLL.js";
|
|
85
|
+
import "./chunk-Z6B37SNM.js";
|
|
86
|
+
import {
|
|
87
|
+
readElementRateSpec,
|
|
88
|
+
sourceTimeAt,
|
|
89
|
+
timeAtSourceTime
|
|
90
|
+
} from "./chunk-HWKCIWQT.js";
|
|
91
|
+
import "./chunk-VC76R6W2.js";
|
|
92
|
+
import "./chunk-OFQWTKPW.js";
|
|
93
|
+
import {
|
|
94
|
+
definitiveEntryMismatchComposition,
|
|
95
|
+
hasDefinitiveEntryMismatch
|
|
96
|
+
} from "./chunk-Q5X2B5WT.js";
|
|
97
|
+
import {
|
|
98
|
+
runCancellableProcess
|
|
99
|
+
} from "./chunk-LCSMOLGX.js";
|
|
100
|
+
import "./chunk-TWWSYAKJ.js";
|
|
101
|
+
import {
|
|
102
|
+
lintProject
|
|
103
|
+
} from "./chunk-ZJUKFZ2P.js";
|
|
104
|
+
import "./chunk-HBBJFK6I.js";
|
|
105
|
+
import "./chunk-PJ3HDUCY.js";
|
|
106
|
+
import "./chunk-TQFG7HTI.js";
|
|
107
|
+
import "./chunk-GK4AIFIH.js";
|
|
108
|
+
import "./chunk-2PSPARWP.js";
|
|
109
|
+
import "./chunk-K4WIOZFP.js";
|
|
110
|
+
import "./chunk-XUXGIA7H.js";
|
|
111
|
+
import "./chunk-WERLJGIC.js";
|
|
112
|
+
import "./chunk-ISN5GRYI.js";
|
|
113
|
+
import "./chunk-FLWXXDNS.js";
|
|
114
|
+
import {
|
|
115
|
+
normalizeErrorMessage
|
|
116
|
+
} from "./chunk-KNU5COPB.js";
|
|
117
|
+
import {
|
|
118
|
+
loadOptionalPackage
|
|
119
|
+
} from "./chunk-XT5P4QMO.js";
|
|
120
|
+
import "./chunk-6BEFEWFB.js";
|
|
121
|
+
import "./chunk-3GXQPCJC.js";
|
|
122
|
+
import "./chunk-RQVDTPGD.js";
|
|
123
|
+
import "./chunk-PMRBLBUP.js";
|
|
124
|
+
import "./chunk-M2WBOQ2Q.js";
|
|
125
|
+
|
|
126
|
+
// src/commands/snapshot.ts
|
|
127
|
+
import { existsSync, mkdtempSync, readFileSync, mkdirSync, rmSync, writeFileSync } from "fs";
|
|
128
|
+
import { tmpdir } from "os";
|
|
129
|
+
import { resolve, join, relative, isAbsolute, basename, posix } from "path";
|
|
130
|
+
function orbitStageSource() {
|
|
131
|
+
return `function(cam) {
|
|
132
|
+
var root = document.querySelector("[data-composition-id]")
|
|
133
|
+
|| document.querySelector("#stage")
|
|
134
|
+
|| document.body.firstElementChild
|
|
135
|
+
|| document.body;
|
|
136
|
+
var n = root;
|
|
137
|
+
while (n && n !== document.body) {
|
|
138
|
+
n.style.transformStyle = "preserve-3d";
|
|
139
|
+
n.style.perspective = "none";
|
|
140
|
+
n = n.parentElement;
|
|
141
|
+
}
|
|
142
|
+
root.style.transformStyle = "preserve-3d";
|
|
143
|
+
root.style.perspective = "none";
|
|
144
|
+
root.style.transformOrigin = "50% 50%";
|
|
145
|
+
root.style.transform = "rotateX(" + cam.pitch + "deg) rotateY(" + cam.yaw + "deg)";
|
|
146
|
+
var lens = root.parentElement || document.body;
|
|
147
|
+
lens.style.perspective = "1600px";
|
|
148
|
+
lens.style.perspectiveOrigin = "50% 50%";
|
|
149
|
+
}`;
|
|
150
|
+
}
|
|
151
|
+
var FFMPEG_EXTRACT_TIMEOUT_MS = 3e4;
|
|
152
|
+
function formatSnapshotTimestamp(time) {
|
|
153
|
+
return `${Number(time.toFixed(3))}s`;
|
|
154
|
+
}
|
|
155
|
+
function resolveSnapshotVideoFrameTime(input) {
|
|
156
|
+
const { globalTime, clipStart, clipDuration, sourceDuration, compositionDuration } = input;
|
|
157
|
+
const clipEnd = clipStart + clipDuration;
|
|
158
|
+
if (!isClipVisibleAt(globalTime, clipStart, clipEnd, compositionDuration)) return null;
|
|
159
|
+
const relativeTime = globalTime < clipStart ? Math.max(0, input.relativeTime) : input.relativeTime;
|
|
160
|
+
if (relativeTime < 0) return null;
|
|
161
|
+
const pastSource = sourceDuration > 0 && relativeTime >= sourceDuration;
|
|
162
|
+
if (isInClipWindow(globalTime, clipStart, clipEnd) && !pastSource) return relativeTime;
|
|
163
|
+
const sourceEnd = sourceDuration > 0 ? sourceDuration : relativeTime;
|
|
164
|
+
return Math.max(0, Math.min(relativeTime, sourceEnd - 1 / 30));
|
|
165
|
+
}
|
|
166
|
+
function resolveSnapshotVideoClipStart(input) {
|
|
167
|
+
return input.runtimeResolvedStart ?? input.authoredStart;
|
|
168
|
+
}
|
|
169
|
+
function resolveSnapshotVideoRateSpec(input) {
|
|
170
|
+
const authoredRate = Number.parseFloat(input.authoredRate ?? "");
|
|
171
|
+
const attrs = {
|
|
172
|
+
"data-playback-rate": Number.isFinite(authoredRate) && authoredRate > 0 ? input.authoredRate : String(input.defaultRate),
|
|
173
|
+
"data-automation": input.authoredAutomation
|
|
174
|
+
};
|
|
175
|
+
return readElementRateSpec({ getAttribute: (name) => attrs[name] ?? null });
|
|
176
|
+
}
|
|
177
|
+
function requireSnapshotFfmpeg(ffmpegPath) {
|
|
178
|
+
if (ffmpegPath) return ffmpegPath;
|
|
179
|
+
throw new Error(
|
|
180
|
+
`FFmpeg is required to extract video frames for snapshots. ${getFFmpegInstallHint()}`
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
async function recaptureSnapshotComposite(page) {
|
|
184
|
+
const hasPageComposite = await page.evaluate(async () => {
|
|
185
|
+
const runtimeWindow = window;
|
|
186
|
+
if (typeof runtimeWindow.__hf_page_composite_resolve !== "function") return false;
|
|
187
|
+
await runtimeWindow.__hf_page_composite_prepare?.();
|
|
188
|
+
return true;
|
|
189
|
+
});
|
|
190
|
+
if (hasPageComposite) {
|
|
191
|
+
await page.screenshot({
|
|
192
|
+
type: "jpeg",
|
|
193
|
+
quality: 1,
|
|
194
|
+
clip: { x: 0, y: 0, width: 1, height: 1 }
|
|
195
|
+
});
|
|
196
|
+
await page.evaluate(() => {
|
|
197
|
+
const runtimeWindow = window;
|
|
198
|
+
runtimeWindow.__hf_page_composite_resolve?.();
|
|
199
|
+
});
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
function containingSourceFrameIndex(timestamps, time) {
|
|
203
|
+
if (!Number.isFinite(time)) return -1;
|
|
204
|
+
const tolerance = 16 * Number.EPSILON * Math.max(1, Math.abs(time));
|
|
205
|
+
let index = -1;
|
|
206
|
+
for (const [i, timestamp] of timestamps.entries()) {
|
|
207
|
+
if (timestamp > time + tolerance) break;
|
|
208
|
+
index = i;
|
|
209
|
+
}
|
|
210
|
+
return index;
|
|
211
|
+
}
|
|
212
|
+
async function probeContainingSourceFrameSeek(videoPath, time, holdLastFrame) {
|
|
213
|
+
const ffprobe = findFFprobe();
|
|
214
|
+
if (!ffprobe) return { seek: time };
|
|
215
|
+
const probe = async (readIntervals, entries) => {
|
|
216
|
+
try {
|
|
217
|
+
const { stdout } = await runCancellableProcess(
|
|
218
|
+
ffprobe,
|
|
219
|
+
[
|
|
220
|
+
...["-v", "error", "-select_streams", "v:0", "-read_intervals", readIntervals],
|
|
221
|
+
...["-show_entries", entries, "-of", "json", "--", videoPath]
|
|
222
|
+
],
|
|
223
|
+
{ timeoutMs: FFMPEG_EXTRACT_TIMEOUT_MS, maxBufferBytes: 32 * 1024 * 1024 }
|
|
224
|
+
);
|
|
225
|
+
const parsed = JSON.parse(stdout);
|
|
226
|
+
return typeof parsed === "object" && parsed !== null ? parsed : null;
|
|
227
|
+
} catch {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
};
|
|
231
|
+
const data = await probe("%+#1", "stream=time_base,start_pts:format=start_time,duration");
|
|
232
|
+
if (data === null || !Array.isArray(data.streams)) return null;
|
|
233
|
+
const stream = data.streams[0];
|
|
234
|
+
if (typeof stream !== "object" || stream === null || !("time_base" in stream) || typeof stream.time_base !== "string")
|
|
235
|
+
return null;
|
|
236
|
+
const [numerator, denominator] = stream.time_base.split("/");
|
|
237
|
+
const timeBase = Number(numerator) / Number(denominator);
|
|
238
|
+
if (!Number.isFinite(timeBase) || timeBase <= 0) return null;
|
|
239
|
+
const format = "format" in data ? data.format : null;
|
|
240
|
+
const start = typeof format === "object" && format !== null && "start_time" in format ? Number(format.start_time) : 0;
|
|
241
|
+
const duration = typeof format === "object" && format !== null && "duration" in format ? Number(format.duration) : NaN;
|
|
242
|
+
if (!holdLastFrame && Number.isFinite(duration) && time >= duration) return null;
|
|
243
|
+
const formatStart = Number.isFinite(start) ? start : 0;
|
|
244
|
+
const startPts = "start_pts" in stream && typeof stream.start_pts === "number" ? stream.start_pts : NaN;
|
|
245
|
+
const startTicks = Math.abs(startPts * timeBase - formatStart) <= 1e-6 ? startPts : formatStart / timeBase;
|
|
246
|
+
const packetData = await probe(`%${startTicks * timeBase + time + 1}`, "packet=pts,dts,flags");
|
|
247
|
+
if (packetData === null || !Array.isArray(packetData.packets)) return null;
|
|
248
|
+
const packets = [];
|
|
249
|
+
for (const packet of packetData.packets) {
|
|
250
|
+
if (typeof packet !== "object" || packet === null) return null;
|
|
251
|
+
const pts = "pts" in packet ? packet.pts : "dts" in packet ? packet.dts : void 0;
|
|
252
|
+
if (typeof pts !== "number") return null;
|
|
253
|
+
const dts = "dts" in packet && typeof packet.dts === "number" ? packet.dts : pts;
|
|
254
|
+
const key = "flags" in packet && typeof packet.flags === "string" && packet.flags.includes("K");
|
|
255
|
+
packets.push({ pts: (pts - startTicks) * timeBase, dts: (dts - startTicks) * timeBase, key });
|
|
256
|
+
}
|
|
257
|
+
const timestamps = packets.map((packet) => packet.pts).sort((a, b) => a - b);
|
|
258
|
+
const index = Math.max(0, containingSourceFrameIndex(timestamps, time));
|
|
259
|
+
if (timestamps.length === 0 || !Number.isFinite(time)) return null;
|
|
260
|
+
const frame = timestamps[index];
|
|
261
|
+
const previous = timestamps[index - 1] ?? frame - 1e-3;
|
|
262
|
+
const mid = (previous + frame) / 2;
|
|
263
|
+
const ffmpeg = findFFmpeg();
|
|
264
|
+
const landing = async (seek) => {
|
|
265
|
+
const raw = ffmpeg ? await probeSeekLanding(ffmpeg, videoPath, seek) : null;
|
|
266
|
+
return raw === null ? null : raw - startTicks * timeBase;
|
|
267
|
+
};
|
|
268
|
+
const candidates = packets.filter(
|
|
269
|
+
(packet) => packet.key && packet.pts > 0 && packet.pts <= frame
|
|
270
|
+
);
|
|
271
|
+
for (const candidate of candidates.reverse().slice(0, 3)) {
|
|
272
|
+
const landed = await landing(candidate.pts);
|
|
273
|
+
if (landed === null) break;
|
|
274
|
+
if (landed <= 0 || landed > frame) continue;
|
|
275
|
+
const again = Math.abs(landed - candidate.pts) < 1e-6 ? landed : await landing(landed);
|
|
276
|
+
if (again !== null && Math.abs(again - landed) < 1e-6)
|
|
277
|
+
return { seek: landed, select: mid - landed };
|
|
278
|
+
}
|
|
279
|
+
return { select: mid - (timestamps.find((t) => t >= 0) ?? frame) };
|
|
280
|
+
}
|
|
281
|
+
async function probeSeekLanding(ffmpeg, videoPath, seek) {
|
|
282
|
+
try {
|
|
283
|
+
const { stdout } = await runCancellableProcess(
|
|
284
|
+
ffmpeg,
|
|
285
|
+
[
|
|
286
|
+
...["-v", "error", "-copyts", "-noaccurate_seek", "-ss", String(seek), "-i", videoPath],
|
|
287
|
+
...["-map", "0:v:0", "-c", "copy", "-frames:v", "1", "-f", "framecrc", "-"]
|
|
288
|
+
],
|
|
289
|
+
{ timeoutMs: FFMPEG_EXTRACT_TIMEOUT_MS, maxBufferBytes: 1024 * 1024 }
|
|
290
|
+
);
|
|
291
|
+
const base = /^#tb 0: (\d+)\/(\d+)/m.exec(stdout);
|
|
292
|
+
const row = /^0,\s*-?\d+,\s*(-?\d+),/m.exec(stdout);
|
|
293
|
+
if (!base || !row) return null;
|
|
294
|
+
return Number(row[1]) * Number(base[1]) / Number(base[2]);
|
|
295
|
+
} catch {
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
async function extractVideoFrameToBuffer(videoPath, timeSeconds, useVp9AlphaDecoder = false, holdLastFrame = false) {
|
|
300
|
+
const tmp = mkdtempSync(join(tmpdir(), "hf-snapshot-frame-"));
|
|
301
|
+
const outPath = join(tmp, "frame.png");
|
|
302
|
+
try {
|
|
303
|
+
const ffmpegPath = requireSnapshotFfmpeg(findFFmpeg());
|
|
304
|
+
const seek = await probeContainingSourceFrameSeek(
|
|
305
|
+
videoPath,
|
|
306
|
+
Math.max(0, timeSeconds),
|
|
307
|
+
holdLastFrame
|
|
308
|
+
);
|
|
309
|
+
if (seek === null) return null;
|
|
310
|
+
const args = ["-hide_banner", "-loglevel", "error"];
|
|
311
|
+
if (useVp9AlphaDecoder) args.push("-c:v", "libvpx-vp9");
|
|
312
|
+
if (seek.seek !== void 0) args.push("-ss", String(seek.seek));
|
|
313
|
+
args.push("-i", videoPath, "-map", "0:v:0");
|
|
314
|
+
if (seek.select !== void 0) args.push("-vf", `select=gte(t-start_t\\,${seek.select})`);
|
|
315
|
+
args.push("-frames:v", "1", "-q:v", "2", "-y", outPath);
|
|
316
|
+
const result = await runFfmpegOnce(ffmpegPath, args, FFMPEG_EXTRACT_TIMEOUT_MS);
|
|
317
|
+
if (result.code !== 0 || result.timedOut || !existsSync(outPath)) return null;
|
|
318
|
+
return readFileSync(outPath);
|
|
319
|
+
} finally {
|
|
320
|
+
try {
|
|
321
|
+
rmSync(tmp, { recursive: true, force: true });
|
|
322
|
+
} catch {
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
var examples = [
|
|
327
|
+
["Capture 5 key frames from a composition", "snapshot capture"],
|
|
328
|
+
["Capture 10 evenly-spaced frames", "snapshot capture --frames 10"],
|
|
329
|
+
["View the 3D stage from an isometric angle", "snapshot capture --angle iso"],
|
|
330
|
+
["Zoom into an element for a high-density crop", "snapshot --zoom '#headline'"],
|
|
331
|
+
[
|
|
332
|
+
"Zoom into an exact pixel region at 2x density",
|
|
333
|
+
"snapshot --zoom 100,50,400,300 --zoom-scale 2"
|
|
334
|
+
],
|
|
335
|
+
[
|
|
336
|
+
"Pair each frame with the reference footage at the same time",
|
|
337
|
+
"snapshot --at 1.5,4.3,8.1 --against ref.mp4"
|
|
338
|
+
]
|
|
339
|
+
];
|
|
340
|
+
function parseZoomScale(value) {
|
|
341
|
+
const parsed = parseFloat(String(value ?? ""));
|
|
342
|
+
return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_ZOOM_SCALE;
|
|
343
|
+
}
|
|
344
|
+
function tailFrameTime(duration) {
|
|
345
|
+
return Math.max(0, duration - Math.max(0.05, duration * 0.03));
|
|
346
|
+
}
|
|
347
|
+
function computeSnapshotTimes(duration, opts) {
|
|
348
|
+
const includeEnd = opts.includeEnd !== false;
|
|
349
|
+
const tail = tailFrameTime(duration);
|
|
350
|
+
const round = (t) => Math.round(t * 1e3) / 1e3;
|
|
351
|
+
if (opts.at?.length) {
|
|
352
|
+
const times2 = [...opts.at];
|
|
353
|
+
const hasTail = times2.some((t) => Math.abs(t - tail) < 0.05 || t >= duration);
|
|
354
|
+
if (includeEnd && duration > 0 && !hasTail) {
|
|
355
|
+
return { times: [...times2, round(tail)], appendedTail: true };
|
|
356
|
+
}
|
|
357
|
+
return { times: times2, appendedTail: false };
|
|
358
|
+
}
|
|
359
|
+
const n = opts.frames;
|
|
360
|
+
if (n <= 1) return { times: [round(duration / 2)], appendedTail: false };
|
|
361
|
+
const times = Array.from({ length: n }, (_, i) => i / (n - 1) * duration);
|
|
362
|
+
if (includeEnd) times[times.length - 1] = tail;
|
|
363
|
+
return { times: times.map(round), appendedTail: false };
|
|
364
|
+
}
|
|
365
|
+
async function captureSnapshots(projectDir, opts) {
|
|
366
|
+
const { bundleWithLocalizedFonts } = await import("./bundleWithLocalizedFonts-5QOPOB5D.js");
|
|
367
|
+
const numFrames = opts.frames ?? 5;
|
|
368
|
+
const html = await bundleWithLocalizedFonts(projectDir);
|
|
369
|
+
const server = await serveStaticProjectHtml(projectDir, html, void 0, [], opts.autoProxy);
|
|
370
|
+
const savedPaths = [];
|
|
371
|
+
try {
|
|
372
|
+
const { browser: chromeBrowser, page } = await openSettledCompositionPage(html, server.url, {
|
|
373
|
+
renderReadyTimeoutMs: opts.timeout ?? 5e3,
|
|
374
|
+
renderReadyWarningSuffix: "snapshots may be inaccurate",
|
|
375
|
+
browserGpuMode: opts.browserGpuMode
|
|
376
|
+
});
|
|
377
|
+
try {
|
|
378
|
+
const fontReport = await page.evaluate(() => {
|
|
379
|
+
const loaded = [];
|
|
380
|
+
const errored = [];
|
|
381
|
+
const unused = [];
|
|
382
|
+
document.fonts.forEach((f) => {
|
|
383
|
+
const entry = `${f.family} (${f.weight} ${f.style})`;
|
|
384
|
+
if (f.status === "loaded") loaded.push(entry);
|
|
385
|
+
else if (f.status === "error") errored.push(entry);
|
|
386
|
+
else unused.push(entry);
|
|
387
|
+
});
|
|
388
|
+
return { loaded, errored, unused };
|
|
389
|
+
}).catch(() => ({ loaded: [], errored: [], unused: [] }));
|
|
390
|
+
if (fontReport.loaded.length > 0 || fontReport.errored.length > 0 || fontReport.unused.length > 0) {
|
|
391
|
+
const parts = [`${fontReport.loaded.length} loaded`];
|
|
392
|
+
if (fontReport.errored.length > 0) parts.push(`${fontReport.errored.length} failed`);
|
|
393
|
+
if (fontReport.unused.length > 0) parts.push(`${fontReport.unused.length} unused`);
|
|
394
|
+
console.log(`
|
|
395
|
+
${c.dim("Fonts:")} ${parts.join(", ")}`);
|
|
396
|
+
if (fontReport.errored.length > 0) {
|
|
397
|
+
console.log(` ${c.error("Fonts FAILED:")} ${fontReport.errored.join(", ")}`);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
const duration = await page.evaluate(() => {
|
|
401
|
+
const win = window;
|
|
402
|
+
if (typeof win.__player?.getDuration === "function") {
|
|
403
|
+
const d = win.__player.getDuration();
|
|
404
|
+
if (Number.isFinite(d) && d > 0) return d;
|
|
405
|
+
}
|
|
406
|
+
const root = document.querySelector("[data-composition-id][data-duration]");
|
|
407
|
+
if (root) return parseFloat(root.getAttribute("data-duration") ?? "0");
|
|
408
|
+
return 0;
|
|
409
|
+
});
|
|
410
|
+
if (duration <= 0 && !opts.at?.length) {
|
|
411
|
+
return [];
|
|
412
|
+
}
|
|
413
|
+
const { times: positions, appendedTail } = computeSnapshotTimes(duration, {
|
|
414
|
+
frames: numFrames,
|
|
415
|
+
at: opts.at,
|
|
416
|
+
includeEnd: opts.includeEnd
|
|
417
|
+
});
|
|
418
|
+
if (appendedTail) {
|
|
419
|
+
console.log(
|
|
420
|
+
` ${c.dim(`Note: added an end-of-timeline frame at ${positions[positions.length - 1].toFixed(2)}s. Short beats between your --at times may still be skipped \u2014 pass them explicitly.`)}`
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
const cameraExpr = opts.angle && (opts.angle.yaw !== 0 || opts.angle.pitch !== 0) ? `(${orbitStageSource()})(${JSON.stringify(opts.angle)})` : null;
|
|
424
|
+
const snapshotDir = opts.outputDir ?? join(projectDir, "snapshots");
|
|
425
|
+
mkdirSync(snapshotDir, { recursive: true });
|
|
426
|
+
try {
|
|
427
|
+
const { readdirSync } = await import("fs");
|
|
428
|
+
for (const file of readdirSync(snapshotDir)) {
|
|
429
|
+
if (/\.(png|jpg|jpeg)$/i.test(file)) {
|
|
430
|
+
rmSync(join(snapshotDir, file), { force: true });
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
} catch {
|
|
434
|
+
}
|
|
435
|
+
let injectVideoFramesBatch = null;
|
|
436
|
+
let syncVideoFrameVisibility = null;
|
|
437
|
+
let extractMediaMetadata = null;
|
|
438
|
+
try {
|
|
439
|
+
const engine = await import("./src-PVYUYV3M.js");
|
|
440
|
+
injectVideoFramesBatch = engine.injectVideoFramesBatch;
|
|
441
|
+
syncVideoFrameVisibility = engine.syncVideoFrameVisibility;
|
|
442
|
+
extractMediaMetadata = engine.extractMediaMetadata;
|
|
443
|
+
} catch {
|
|
444
|
+
console.warn(
|
|
445
|
+
` ${c.warn("\u26A0")} @hyperframes/engine unavailable \u2014 <video> elements will appear black in snapshots. Verify media via a draft render's extracted frames instead.`
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
const alphaDecoderCache = /* @__PURE__ */ new Map();
|
|
449
|
+
const shouldUseVp9AlphaDecoder = (filePath) => {
|
|
450
|
+
if (!extractMediaMetadata) return Promise.resolve(false);
|
|
451
|
+
const cached = alphaDecoderCache.get(filePath);
|
|
452
|
+
if (cached) return cached;
|
|
453
|
+
const pending = extractMediaMetadata(filePath).then((meta) => meta.hasAlpha && meta.videoCodec === "vp9").catch(() => false);
|
|
454
|
+
alphaDecoderCache.set(filePath, pending);
|
|
455
|
+
return pending;
|
|
456
|
+
};
|
|
457
|
+
const hasPlayer = await page.evaluate(() => !!window.__player);
|
|
458
|
+
if (!hasPlayer) {
|
|
459
|
+
console.warn(` ${c.warn("\u26A0")} No player API \u2014 seeks will be skipped`);
|
|
460
|
+
}
|
|
461
|
+
for (let i = 0; i < positions.length; i++) {
|
|
462
|
+
const time = positions[i];
|
|
463
|
+
await seekCompositionTimeline(page, time, { exactTime: true });
|
|
464
|
+
if (cameraExpr) await page.evaluate(cameraExpr);
|
|
465
|
+
if (injectVideoFramesBatch && syncVideoFrameVisibility) {
|
|
466
|
+
const candidates = await page.evaluate(() => {
|
|
467
|
+
const runtimeWindow = window;
|
|
468
|
+
return Array.from(document.querySelectorAll("video")).map((el) => {
|
|
469
|
+
const v = el;
|
|
470
|
+
const authoredStart = parseFloat(v.dataset.start ?? "0") || 0;
|
|
471
|
+
const runtimeResolvedStart = runtimeWindow.__hfResolveMediaStartSeconds?.(v);
|
|
472
|
+
const mediaStart = parseFloat(v.dataset.playbackStart ?? v.dataset.mediaStart ?? "0") || 0;
|
|
473
|
+
const rawDuration = parseFloat(v.dataset.duration ?? "");
|
|
474
|
+
const srcDur = Number.isFinite(v.duration) && v.duration > 0 ? v.duration : 0;
|
|
475
|
+
return {
|
|
476
|
+
id: v.id,
|
|
477
|
+
src: v.currentSrc || v.src,
|
|
478
|
+
authoredStart,
|
|
479
|
+
authoredRate: v.dataset.playbackRate,
|
|
480
|
+
authoredAutomation: v.dataset.automation,
|
|
481
|
+
defaultRate: v.defaultPlaybackRate,
|
|
482
|
+
runtimeResolvedStart: runtimeResolvedStart !== void 0 && Number.isFinite(runtimeResolvedStart) ? runtimeResolvedStart : null,
|
|
483
|
+
authoredDuration: Number.isFinite(rawDuration) && rawDuration > 0 ? rawDuration : null,
|
|
484
|
+
srcDuration: srcDur,
|
|
485
|
+
mediaStart,
|
|
486
|
+
loop: v.loop
|
|
487
|
+
};
|
|
488
|
+
});
|
|
489
|
+
});
|
|
490
|
+
const compositionDuration = duration;
|
|
491
|
+
const active = candidates.flatMap((candidate) => {
|
|
492
|
+
const start = resolveSnapshotVideoClipStart(candidate);
|
|
493
|
+
const playbackRate = resolveSnapshotVideoRateSpec(candidate);
|
|
494
|
+
const duration2 = candidate.authoredDuration ?? (candidate.srcDuration > 0 ? Math.max(
|
|
495
|
+
0,
|
|
496
|
+
timeAtSourceTime(playbackRate, candidate.srcDuration - candidate.mediaStart)
|
|
497
|
+
) : Number.POSITIVE_INFINITY);
|
|
498
|
+
let relTime = sourceTimeAt(playbackRate, time - start) + candidate.mediaStart;
|
|
499
|
+
if (candidate.loop && candidate.srcDuration > candidate.mediaStart && relTime >= candidate.srcDuration) {
|
|
500
|
+
relTime = candidate.mediaStart + (relTime - candidate.mediaStart) % (candidate.srcDuration - candidate.mediaStart);
|
|
501
|
+
}
|
|
502
|
+
if (!candidate.id || !candidate.src) return [];
|
|
503
|
+
const frameTime = resolveSnapshotVideoFrameTime({
|
|
504
|
+
globalTime: time,
|
|
505
|
+
clipStart: start,
|
|
506
|
+
clipDuration: duration2,
|
|
507
|
+
relativeTime: relTime,
|
|
508
|
+
sourceDuration: candidate.srcDuration,
|
|
509
|
+
compositionDuration
|
|
510
|
+
});
|
|
511
|
+
return frameTime === null ? [] : [{ ...candidate, start, playbackRate, duration: duration2, relTime: frameTime }];
|
|
512
|
+
});
|
|
513
|
+
const updates = [];
|
|
514
|
+
for (const v of active) {
|
|
515
|
+
let ffmpegInput = null;
|
|
516
|
+
let inputIsLocal = false;
|
|
517
|
+
try {
|
|
518
|
+
const url = new URL(v.src);
|
|
519
|
+
const decodedPath = decodeURIComponent(url.pathname).replace(/^\//, "");
|
|
520
|
+
const candidate = resolve(projectDir, decodedPath);
|
|
521
|
+
const rel2 = relative(projectDir, candidate);
|
|
522
|
+
if (!rel2.startsWith("..") && !isAbsolute(rel2) && existsSync(candidate)) {
|
|
523
|
+
ffmpegInput = candidate;
|
|
524
|
+
inputIsLocal = true;
|
|
525
|
+
} else if (url.protocol === "http:" || url.protocol === "https:") {
|
|
526
|
+
ffmpegInput = url.href;
|
|
527
|
+
}
|
|
528
|
+
} catch {
|
|
529
|
+
}
|
|
530
|
+
if (!ffmpegInput) continue;
|
|
531
|
+
const useVp9AlphaDecoder = inputIsLocal ? await shouldUseVp9AlphaDecoder(ffmpegInput) : false;
|
|
532
|
+
const png = await extractVideoFrameToBuffer(
|
|
533
|
+
ffmpegInput,
|
|
534
|
+
Math.max(0, v.relTime),
|
|
535
|
+
useVp9AlphaDecoder,
|
|
536
|
+
v.srcDuration > 0 && v.relTime >= v.srcDuration - 1
|
|
537
|
+
);
|
|
538
|
+
if (!png) continue;
|
|
539
|
+
updates.push({
|
|
540
|
+
videoId: v.id,
|
|
541
|
+
dataUri: `data:image/png;base64,${png.toString("base64")}`
|
|
542
|
+
});
|
|
543
|
+
}
|
|
544
|
+
if (active.length > 0 && updates.length < active.length) {
|
|
545
|
+
const missed = active.length - updates.length;
|
|
546
|
+
console.warn(
|
|
547
|
+
` ${c.warn("\u26A0")} ${missed}/${active.length} active <video> frame(s) could not be extracted at ${time.toFixed(1)}s \u2014 those videos will appear black/stale in this snapshot`
|
|
548
|
+
);
|
|
549
|
+
}
|
|
550
|
+
try {
|
|
551
|
+
if (updates.length > 0) {
|
|
552
|
+
await injectVideoFramesBatch(page, updates);
|
|
553
|
+
}
|
|
554
|
+
await syncVideoFrameVisibility(
|
|
555
|
+
page,
|
|
556
|
+
active.map((a) => a.id)
|
|
557
|
+
);
|
|
558
|
+
} catch {
|
|
559
|
+
console.warn(
|
|
560
|
+
` ${c.warn("\u26A0")} video frame injection failed at ${time.toFixed(1)}s \u2014 <video> elements will appear black/stale in this snapshot`
|
|
561
|
+
);
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
await recaptureSnapshotComposite(page);
|
|
565
|
+
const timeLabel = formatSnapshotTimestamp(time);
|
|
566
|
+
const index = String(i).padStart(2, "0");
|
|
567
|
+
const filename = `frame-${index}-at-${timeLabel}.png`;
|
|
568
|
+
const framePath = join(snapshotDir, filename);
|
|
569
|
+
if (opts.zoom) {
|
|
570
|
+
const canvas = await page.evaluate(() => ({
|
|
571
|
+
width: window.innerWidth,
|
|
572
|
+
height: window.innerHeight
|
|
573
|
+
}));
|
|
574
|
+
const region = await resolveCropRegion(page, opts.zoom, canvas);
|
|
575
|
+
if (!region) {
|
|
576
|
+
console.error(
|
|
577
|
+
` ${c.warn("\u26A0")} --zoom target has no visible box at ${time.toFixed(1)}s \u2014 frame skipped`
|
|
578
|
+
);
|
|
579
|
+
continue;
|
|
580
|
+
}
|
|
581
|
+
const buffer = await captureRegionCrop(
|
|
582
|
+
page,
|
|
583
|
+
region,
|
|
584
|
+
opts.zoomScale ?? DEFAULT_ZOOM_SCALE
|
|
585
|
+
);
|
|
586
|
+
writeFileSync(framePath, buffer);
|
|
587
|
+
} else {
|
|
588
|
+
await page.screenshot({ path: framePath, type: "png", omitBackground: true });
|
|
589
|
+
}
|
|
590
|
+
if (opts.against) {
|
|
591
|
+
const refPng = await extractVideoFrameToBuffer(opts.against, time);
|
|
592
|
+
if (!refPng) {
|
|
593
|
+
console.error(
|
|
594
|
+
` ${c.warn("\u26A0")} --against has no frame at ${timeLabel} \u2014 reference pair skipped`
|
|
595
|
+
);
|
|
596
|
+
} else {
|
|
597
|
+
const refPath = join(snapshotDir, `ref-${index}-at-${timeLabel}.png`);
|
|
598
|
+
writeFileSync(refPath, refPng);
|
|
599
|
+
const pairPath = join(snapshotDir, `pair-${index}-at-${timeLabel}.jpg`);
|
|
600
|
+
const { createContactSheet } = await import("./contactSheet-27SRU7A4.js");
|
|
601
|
+
await createContactSheet([framePath, refPath], pairPath, {
|
|
602
|
+
cols: 2,
|
|
603
|
+
maxImages: 2,
|
|
604
|
+
cellWidth: 960,
|
|
605
|
+
labelMode: "custom",
|
|
606
|
+
labels: ["render", "reference"]
|
|
607
|
+
});
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
const rel = relative(projectDir, framePath);
|
|
611
|
+
savedPaths.push(rel.startsWith("..") || isAbsolute(rel) ? framePath : rel);
|
|
612
|
+
}
|
|
613
|
+
} finally {
|
|
614
|
+
await chromeBrowser.close();
|
|
615
|
+
}
|
|
616
|
+
} finally {
|
|
617
|
+
await server.close();
|
|
618
|
+
}
|
|
619
|
+
return savedPaths;
|
|
620
|
+
}
|
|
621
|
+
var snapshot_default = defineCommand({
|
|
622
|
+
meta: {
|
|
623
|
+
name: "snapshot",
|
|
624
|
+
description: "Capture key frames from a composition as PNG screenshots for visual verification"
|
|
625
|
+
},
|
|
626
|
+
args: {
|
|
627
|
+
dir: {
|
|
628
|
+
type: "positional",
|
|
629
|
+
description: "Project directory",
|
|
630
|
+
required: false
|
|
631
|
+
},
|
|
632
|
+
output: {
|
|
633
|
+
type: "string",
|
|
634
|
+
alias: "o",
|
|
635
|
+
description: "Directory to write snapshots into (default: <project>/snapshots)"
|
|
636
|
+
},
|
|
637
|
+
frames: {
|
|
638
|
+
type: "string",
|
|
639
|
+
description: "Number of evenly-spaced frames to capture (default: 5)",
|
|
640
|
+
default: "5"
|
|
641
|
+
},
|
|
642
|
+
at: {
|
|
643
|
+
type: "string",
|
|
644
|
+
description: "Comma-separated timestamps in seconds (e.g., --at 3.0,10.5,18.0). Each is captured at that exact instant, not snapped to a frame."
|
|
645
|
+
},
|
|
646
|
+
timeout: {
|
|
647
|
+
type: "string",
|
|
648
|
+
description: "Ms to wait for runtime to initialize (default: 5000)",
|
|
649
|
+
default: "5000"
|
|
650
|
+
},
|
|
651
|
+
angle: {
|
|
652
|
+
type: "string",
|
|
653
|
+
description: "Orthogonal 3D camera for depth/occlusion checks: a preset (front|iso|top|side) or 'yaw,pitch' degrees. Tilts the whole stage before screenshotting (real pixels, not bbox markers)."
|
|
654
|
+
},
|
|
655
|
+
end: {
|
|
656
|
+
type: "boolean",
|
|
657
|
+
description: "Always include a readable end-of-timeline frame (default: true). Pass --no-end to capture only your exact --at times.",
|
|
658
|
+
default: true
|
|
659
|
+
},
|
|
660
|
+
zoom: {
|
|
661
|
+
type: "string",
|
|
662
|
+
description: "Zoom into a CSS selector or an exact pixel region 'x,y,w,h'. Crops a high-density screenshot instead of the full frame \u2014 a raised deviceScaleFactor, never CSS zoom or viewport resizing, so layout stays identical. A selector matching nothing is an error, not a silent full-frame shot."
|
|
663
|
+
},
|
|
664
|
+
"zoom-scale": {
|
|
665
|
+
type: "string",
|
|
666
|
+
description: "Device-scale-factor density for --zoom crops (default: 3)",
|
|
667
|
+
default: "3"
|
|
668
|
+
},
|
|
669
|
+
against: {
|
|
670
|
+
type: "string",
|
|
671
|
+
description: "Reference video (e.g. footage being rebuilt): also save its frame at each captured time and a render|reference pair sheet"
|
|
672
|
+
},
|
|
673
|
+
describe: {
|
|
674
|
+
type: "string",
|
|
675
|
+
description: "Gemini vision frame analysis. Runs by default when GEMINI_API_KEY is set. Pass a custom question (e.g. --describe 'Is the logo visible in every beat?') to override the default prompt, or --describe false to opt out."
|
|
676
|
+
},
|
|
677
|
+
proxy: {
|
|
678
|
+
type: "boolean",
|
|
679
|
+
description: "Auto-transcode browser-hostile video codecs for snapshots (default: on; overrides hyperframes.json media.autoProxy)",
|
|
680
|
+
default: void 0
|
|
681
|
+
},
|
|
682
|
+
"browser-gpu": {
|
|
683
|
+
type: "boolean",
|
|
684
|
+
description: "Use hardware browser GPU capture; pass --no-browser-gpu for deterministic SwiftShader (default: auto-detect, PRODUCER_BROWSER_GPU_MODE overrides)",
|
|
685
|
+
default: void 0
|
|
686
|
+
}
|
|
687
|
+
},
|
|
688
|
+
async run({ args }) {
|
|
689
|
+
const project = resolveProject(args.dir);
|
|
690
|
+
const lintResult = await lintProject(project.dir);
|
|
691
|
+
if (hasDefinitiveEntryMismatch(lintResult)) {
|
|
692
|
+
const candidate = definitiveEntryMismatchComposition(lintResult);
|
|
693
|
+
console.log("");
|
|
694
|
+
for (const line of formatLintFindings(lintResult, { errorsFirst: true })) {
|
|
695
|
+
console.log(line);
|
|
696
|
+
}
|
|
697
|
+
console.log("");
|
|
698
|
+
console.log(c.error(" Aborting snapshot because the default index.html entry is blank."));
|
|
699
|
+
if (candidate && posix.basename(candidate) === "index.html") {
|
|
700
|
+
const candidateDir = posix.dirname(candidate);
|
|
701
|
+
const target = `<project>/${candidateDir}`;
|
|
702
|
+
console.log(
|
|
703
|
+
c.dim(
|
|
704
|
+
` Move or mount the authored file, or snapshot its directory directly: hyperframes snapshot ${target}. Only use the directory form when its assets are self-contained under that directory; otherwise mount it from the project root.`
|
|
705
|
+
)
|
|
706
|
+
);
|
|
707
|
+
} else if (candidate) {
|
|
708
|
+
console.log(
|
|
709
|
+
c.dim(
|
|
710
|
+
` Move or mount ${candidate} as a project index.html before snapshotting; snapshot accepts project directories, not individual HTML files.`
|
|
711
|
+
)
|
|
712
|
+
);
|
|
713
|
+
}
|
|
714
|
+
console.log("");
|
|
715
|
+
failCommand();
|
|
716
|
+
}
|
|
717
|
+
const frames = parseInt(args.frames, 10) || 5;
|
|
718
|
+
const timeout = parseInt(args.timeout, 10) || 5e3;
|
|
719
|
+
const atTimestamps = args.at ? String(args.at).split(",").map((s) => parseFloat(s.trim())).filter((n) => !isNaN(n)) : void 0;
|
|
720
|
+
const describeArg = args.describe === void 0 ? "true" : String(args.describe) === "false" ? null : String(args.describe);
|
|
721
|
+
const camera = args.angle ? parseAngle(String(args.angle)) : void 0;
|
|
722
|
+
const zoomTarget = args.zoom ? parseZoomTarget(String(args.zoom)) : void 0;
|
|
723
|
+
const zoomScale = parseZoomScale(args["zoom-scale"]);
|
|
724
|
+
const against = args.against ? resolve(String(args.against)) : void 0;
|
|
725
|
+
if (against && !existsSync(against)) {
|
|
726
|
+
console.log(`${c.error("\u2717")} --against video not found: ${against}`);
|
|
727
|
+
failCommand();
|
|
728
|
+
}
|
|
729
|
+
const label = atTimestamps ? `${atTimestamps.length} frames at [${atTimestamps.map(formatSnapshotTimestamp).join(", ")}]` : `${frames} frames`;
|
|
730
|
+
const angleLabel = camera && (camera.yaw !== 0 || camera.pitch !== 0) ? ` ${c.dim(`(angle yaw ${camera.yaw}\xB0 pitch ${camera.pitch}\xB0)`)}` : "";
|
|
731
|
+
console.log(`${c.accent("\u25C6")} Capturing ${label} from ${c.accent(project.name)}${angleLabel}`);
|
|
732
|
+
try {
|
|
733
|
+
const snapshotDir = args.output ? resolve(String(args.output)) : join(project.dir, "snapshots");
|
|
734
|
+
const paths = await captureSnapshots(project.dir, {
|
|
735
|
+
frames,
|
|
736
|
+
timeout,
|
|
737
|
+
at: atTimestamps,
|
|
738
|
+
outputDir: snapshotDir,
|
|
739
|
+
angle: camera,
|
|
740
|
+
includeEnd: args.end !== false,
|
|
741
|
+
zoom: zoomTarget,
|
|
742
|
+
zoomScale,
|
|
743
|
+
autoProxy: args.proxy,
|
|
744
|
+
browserGpuMode: resolveLocalBrowserGpuMode(args["browser-gpu"]),
|
|
745
|
+
against
|
|
746
|
+
});
|
|
747
|
+
if (paths.length === 0) {
|
|
748
|
+
console.log(
|
|
749
|
+
`
|
|
750
|
+
${c.error("\u2717")} Could not determine composition duration \u2014 no frames captured`
|
|
751
|
+
);
|
|
752
|
+
failCommand();
|
|
753
|
+
}
|
|
754
|
+
console.log(
|
|
755
|
+
`
|
|
756
|
+
${c.success("\u25C7")} ${paths.length} snapshots saved to ${args.output ? snapshotDir : "snapshots/"}`
|
|
757
|
+
);
|
|
758
|
+
for (const p of paths) {
|
|
759
|
+
console.log(` ${p}`);
|
|
760
|
+
}
|
|
761
|
+
if (against) {
|
|
762
|
+
console.log(
|
|
763
|
+
` ${c.dim("ref-*.png + pair-*.jpg")} beside each frame (reference frame, render | reference sheet)`
|
|
764
|
+
);
|
|
765
|
+
}
|
|
766
|
+
try {
|
|
767
|
+
const { createSnapshotContactSheet } = await import("./contactSheet-27SRU7A4.js");
|
|
768
|
+
const sheets = await createSnapshotContactSheet(
|
|
769
|
+
snapshotDir,
|
|
770
|
+
join(snapshotDir, "contact-sheet.jpg")
|
|
771
|
+
);
|
|
772
|
+
if (sheets.length > 0) {
|
|
773
|
+
const label2 = sheets.length === 1 ? "contact-sheet.jpg" : `contact-sheet-1..${sheets.length}.jpg`;
|
|
774
|
+
console.log(` ${c.dim(label2)} (grid view for AI review)`);
|
|
775
|
+
}
|
|
776
|
+
} catch {
|
|
777
|
+
}
|
|
778
|
+
if (describeArg !== null) {
|
|
779
|
+
try {
|
|
780
|
+
const geminiKey = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
|
|
781
|
+
if (!geminiKey) {
|
|
782
|
+
console.log(` ${c.dim("--describe: GEMINI_API_KEY not set, skipping")}`);
|
|
783
|
+
} else if (paths.length > 0) {
|
|
784
|
+
console.log(` ${c.dim("Describing frames with Gemini vision...")}`);
|
|
785
|
+
const { GoogleGenAI } = await loadOptionalPackage("@google/genai", "--describe");
|
|
786
|
+
const ai = new GoogleGenAI({ apiKey: geminiKey });
|
|
787
|
+
const model = process.env.HYPERFRAMES_GEMINI_MODEL || "gemini-3.1-flash-lite-preview";
|
|
788
|
+
const customQuestion = describeArg === "true" ? "Describe this video composition frame in 1-2 sentences. Be specific and factual: what elements are visible, what text appears, is the frame blank/black/loading, what is the composition. Flag any obvious problems." : describeArg;
|
|
789
|
+
const descriptions = [
|
|
790
|
+
`# Snapshot Frame Descriptions`,
|
|
791
|
+
``,
|
|
792
|
+
`**Question asked:** ${customQuestion}`,
|
|
793
|
+
``,
|
|
794
|
+
`Compare each description against your storyboard spec. A "black frame" or "loading screen" for a content beat is a bug.`,
|
|
795
|
+
``
|
|
796
|
+
];
|
|
797
|
+
let sharpFn = null;
|
|
798
|
+
try {
|
|
799
|
+
const s = await import("sharp");
|
|
800
|
+
sharpFn = s.default ?? s;
|
|
801
|
+
} catch {
|
|
802
|
+
}
|
|
803
|
+
const results = await Promise.allSettled(
|
|
804
|
+
paths.map(async (p) => {
|
|
805
|
+
const filename = basename(p);
|
|
806
|
+
const filePath = join(snapshotDir, filename);
|
|
807
|
+
if (!existsSync(filePath)) return { filename, desc: "file not found" };
|
|
808
|
+
const raw = readFileSync(filePath);
|
|
809
|
+
let imageData;
|
|
810
|
+
let mimeType = "image/png";
|
|
811
|
+
if (sharpFn) {
|
|
812
|
+
imageData = await sharpFn(raw).resize(960).jpeg().toBuffer();
|
|
813
|
+
mimeType = "image/jpeg";
|
|
814
|
+
} else {
|
|
815
|
+
if (raw.length > 38e5)
|
|
816
|
+
return {
|
|
817
|
+
filename,
|
|
818
|
+
desc: "file too large for Gemini \u2014 install sharp to enable auto-resize"
|
|
819
|
+
};
|
|
820
|
+
imageData = raw;
|
|
821
|
+
}
|
|
822
|
+
const base64 = imageData.toString("base64");
|
|
823
|
+
const response = await ai.models.generateContent({
|
|
824
|
+
model,
|
|
825
|
+
contents: [
|
|
826
|
+
{
|
|
827
|
+
role: "user",
|
|
828
|
+
parts: [{ inlineData: { mimeType, data: base64 } }, { text: customQuestion }]
|
|
829
|
+
}
|
|
830
|
+
],
|
|
831
|
+
config: { maxOutputTokens: 250 }
|
|
832
|
+
});
|
|
833
|
+
return { filename, desc: response.text?.trim() || "no description" };
|
|
834
|
+
})
|
|
835
|
+
);
|
|
836
|
+
for (const result of results) {
|
|
837
|
+
if (result.status === "fulfilled") {
|
|
838
|
+
descriptions.push(`## ${result.value.filename}`, `${result.value.desc}`, ``);
|
|
839
|
+
} else {
|
|
840
|
+
const errMsg = normalizeErrorMessage(result.reason);
|
|
841
|
+
descriptions.push(`## (error)`, `Gemini call failed: ${errMsg.slice(0, 120)}`, ``);
|
|
842
|
+
}
|
|
843
|
+
}
|
|
844
|
+
const descPath = join(snapshotDir, "descriptions.md");
|
|
845
|
+
writeFileSync(descPath, descriptions.join("\n"));
|
|
846
|
+
console.log(` ${c.dim("descriptions.md")} (Gemini frame analysis)`);
|
|
847
|
+
}
|
|
848
|
+
} catch (descErr) {
|
|
849
|
+
const msg = normalizeErrorMessage(descErr);
|
|
850
|
+
console.log(` ${c.dim(`--describe failed: ${msg}`)}`);
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
} catch (err) {
|
|
854
|
+
const msg = normalizeErrorMessage(err);
|
|
855
|
+
console.error(`
|
|
856
|
+
${c.error("\u2717")} Snapshot failed: ${msg}`);
|
|
857
|
+
failCommand();
|
|
858
|
+
}
|
|
859
|
+
}
|
|
860
|
+
});
|
|
861
|
+
export {
|
|
862
|
+
computeSnapshotTimes,
|
|
863
|
+
containingSourceFrameIndex,
|
|
864
|
+
snapshot_default as default,
|
|
865
|
+
examples,
|
|
866
|
+
extractVideoFrameToBuffer,
|
|
867
|
+
formatSnapshotTimestamp,
|
|
868
|
+
parseZoomScale,
|
|
869
|
+
recaptureSnapshotComposite,
|
|
870
|
+
requireSnapshotFfmpeg,
|
|
871
|
+
resolveSnapshotVideoClipStart,
|
|
872
|
+
resolveSnapshotVideoFrameTime,
|
|
873
|
+
resolveSnapshotVideoRateSpec,
|
|
874
|
+
tailFrameTime
|
|
875
|
+
};
|