@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,121 @@
|
|
|
1
|
+
import { strict as assert } from "node:assert";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { runLocalModel } from "./local-run.mjs";
|
|
4
|
+
|
|
5
|
+
const strongCpu = { ramMB: 16000, gpu: { present: false, vramMB: 0 }, appleSilicon: false };
|
|
6
|
+
const tiny = { ramMB: 512, gpu: { present: false, vramMB: 0 }, appleSilicon: false };
|
|
7
|
+
const ok = () => {}; // which/exec that succeed
|
|
8
|
+
|
|
9
|
+
test("recommends the CLI path when no local tier fits the machine", () => {
|
|
10
|
+
const r = runLocalModel("tts", { specs: tiny, which: ok, exec: ok });
|
|
11
|
+
assert.equal(r.recommend, "cli");
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
test("recommends install when the tool is not on PATH", () => {
|
|
15
|
+
const r = runLocalModel("tts", {
|
|
16
|
+
specs: strongCpu,
|
|
17
|
+
which: () => {
|
|
18
|
+
throw new Error("not found");
|
|
19
|
+
},
|
|
20
|
+
exec: ok,
|
|
21
|
+
vars: { text: "hi", out: "/tmp/v.wav" },
|
|
22
|
+
});
|
|
23
|
+
assert.equal(r.recommend, "install");
|
|
24
|
+
assert.equal(r.model, "kokoro");
|
|
25
|
+
assert.match(r.command, /pip install kokoro/);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
test("runs the model and returns the output path when installed", () => {
|
|
29
|
+
let ran = "";
|
|
30
|
+
const r = runLocalModel("tts", {
|
|
31
|
+
specs: strongCpu,
|
|
32
|
+
which: ok,
|
|
33
|
+
exec: (cmd) => {
|
|
34
|
+
ran = cmd;
|
|
35
|
+
},
|
|
36
|
+
vars: { text: "hello world", voice: "af_heart", out: "/tmp/v.wav" },
|
|
37
|
+
});
|
|
38
|
+
assert.equal(r.model, "kokoro");
|
|
39
|
+
assert.equal(r.out, "/tmp/v.wav");
|
|
40
|
+
assert.match(ran, /hello world/, "invoke template filled with vars");
|
|
41
|
+
assert.match(ran, /\/tmp\/v\.wav/);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
test("a failing run degrades to an install recommendation, never throws", () => {
|
|
45
|
+
const r = runLocalModel("upscale", {
|
|
46
|
+
specs: strongCpu,
|
|
47
|
+
which: ok,
|
|
48
|
+
exec: () => {
|
|
49
|
+
throw new Error("boom");
|
|
50
|
+
},
|
|
51
|
+
vars: { in: "a.png", out: "b.png" },
|
|
52
|
+
});
|
|
53
|
+
assert.equal(r.recommend, "install");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
test("a tier whose tool is missing demotes to the next tier that fits", () => {
|
|
57
|
+
// 64GB + GPU fits BOTH tts tiers, so the ladder has two rungs: fish-speech
|
|
58
|
+
// (its own binary) above Kokoro (`python -m kokoro`). fish-speech absent must
|
|
59
|
+
// not cost the user Kokoro.
|
|
60
|
+
const strongGpu = { ramMB: 64000, gpu: { present: true, vramMB: 24000 } };
|
|
61
|
+
let ran = "";
|
|
62
|
+
const r = runLocalModel("tts", {
|
|
63
|
+
specs: strongGpu,
|
|
64
|
+
which: (bin) => {
|
|
65
|
+
if (bin === "fish-speech") throw new Error("not found");
|
|
66
|
+
},
|
|
67
|
+
exec: (cmd) => {
|
|
68
|
+
ran = cmd;
|
|
69
|
+
},
|
|
70
|
+
vars: { text: "hello", voice: "af_heart", out: "/tmp/v.wav" },
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
assert.equal(r.model, "kokoro", "demoted past the missing fish-speech binary");
|
|
74
|
+
assert.equal(r.tier, "medium");
|
|
75
|
+
assert.match(ran, /kokoro/);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
test("every fitting tier failing reports the last tier's install command", () => {
|
|
79
|
+
const strongGpu = { ramMB: 64000, gpu: { present: true, vramMB: 24000 } };
|
|
80
|
+
const r = runLocalModel("tts", {
|
|
81
|
+
specs: strongGpu,
|
|
82
|
+
which: ok,
|
|
83
|
+
exec: () => {
|
|
84
|
+
throw new Error("boom");
|
|
85
|
+
},
|
|
86
|
+
vars: { text: "hi", out: "/tmp/v.wav" },
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
assert.equal(r.recommend, "install");
|
|
90
|
+
assert.equal(r.model, "kokoro", "the smallest fitting tier is the actionable one");
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
test("the install recommendation states the download size", () => {
|
|
94
|
+
// nothing today tells the user what they are agreeing to before a tool
|
|
95
|
+
// starts pulling weights, so the size travels in the payload AND in the
|
|
96
|
+
// text a caller shows them
|
|
97
|
+
const r = runLocalModel("tts", {
|
|
98
|
+
specs: strongCpu,
|
|
99
|
+
which: () => {
|
|
100
|
+
throw new Error("not found");
|
|
101
|
+
},
|
|
102
|
+
});
|
|
103
|
+
|
|
104
|
+
assert.equal(r.recommend, "install");
|
|
105
|
+
assert.equal(typeof r.sizeMB, "number");
|
|
106
|
+
assert.ok(r.sizeMB > 0);
|
|
107
|
+
assert.match(r.reason, /GB to download/);
|
|
108
|
+
});
|
|
109
|
+
|
|
110
|
+
test("a failed run still reports the tier's size", () => {
|
|
111
|
+
const r = runLocalModel("tts", {
|
|
112
|
+
specs: strongCpu,
|
|
113
|
+
which: ok,
|
|
114
|
+
exec: () => {
|
|
115
|
+
throw new Error("boom");
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
assert.equal(r.recommend, "install");
|
|
120
|
+
assert.equal(typeof r.sizeMB, "number");
|
|
121
|
+
});
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { fetchMedia, readCappedBody } from "./media-fetch.mjs";
|
|
2
|
+
// Official brand marks — the `logo` type's provider tiers, tried in registry
|
|
3
|
+
// order.
|
|
4
|
+
//
|
|
5
|
+
// 1. thesvg: one pinned manifest matched locally ("Next.js", "nextjs", "next js" hit one
|
|
6
|
+
// entry); default full-color mark; skips licenses outside THESVG_ACCEPTED_LICENSES.
|
|
7
|
+
// 2. github avatar: known orgs only; guessing a login risks a same-named personal account.
|
|
8
|
+
// 3. domain favicon: DuckDuckGo ip3 last resort; under ~500B is its globe placeholder.
|
|
9
|
+
//
|
|
10
|
+
// HeyGen asset search is deliberately absent: for brand queries it returns
|
|
11
|
+
// generic look-alike icons (0/3 in testing) — worse than a miss. A total miss
|
|
12
|
+
// falls through to resolve's normal failure path (`no provider could resolve
|
|
13
|
+
// logo`, exit 1).
|
|
14
|
+
|
|
15
|
+
import { mkdtempSync, writeFileSync } from "node:fs";
|
|
16
|
+
import { tmpdir } from "node:os";
|
|
17
|
+
import { join } from "node:path";
|
|
18
|
+
|
|
19
|
+
// Bump by pointing at a newer glincker/thesvg commit; the manifest and every
|
|
20
|
+
// icon URL resolve against the same pin, so a resolve is reproducible.
|
|
21
|
+
const THESVG_REV = "e5957fa742c1ebf6da07ac40665bdd01d8add35f";
|
|
22
|
+
const THESVG_CDN = `https://cdn.jsdelivr.net/gh/glincker/thesvg@${THESVG_REV}`;
|
|
23
|
+
const THESVG_MANIFEST = `${THESVG_CDN}/src/data/icons.json`;
|
|
24
|
+
const FAVICON_MIN_BYTES = 500;
|
|
25
|
+
// ponytail: the manifest is ~3.3MB today; 20MB leaves headroom without trusting an
|
|
26
|
+
// unbounded body from a CDN edge.
|
|
27
|
+
const MAX_MANIFEST_BYTES = 20 * 1024 * 1024;
|
|
28
|
+
|
|
29
|
+
// When several entries share a normalized name (e.g. "slack" and the
|
|
30
|
+
// "slack-badge" auth button), the brand mark wins over cloud/infra and badge
|
|
31
|
+
// collections.
|
|
32
|
+
const THESVG_COLLECTION_RANK = ["brands", "community", "aws", "azure", "gcp", "k8s", "auth-badges"];
|
|
33
|
+
|
|
34
|
+
// The ten SPDX ids theSVG's submission form accepts and verifies before merge
|
|
35
|
+
// (thesvg.org LICENSING.md §5); anything else routes through their unaudited
|
|
36
|
+
// "Other/custom" path.
|
|
37
|
+
const THESVG_ACCEPTED_LICENSES = new Set([
|
|
38
|
+
"CC0-1.0",
|
|
39
|
+
"Unlicense",
|
|
40
|
+
"MIT",
|
|
41
|
+
"Apache-2.0",
|
|
42
|
+
"BSD-3-Clause",
|
|
43
|
+
"ISC",
|
|
44
|
+
"CC-BY-4.0",
|
|
45
|
+
"CC-BY-SA-4.0",
|
|
46
|
+
"CC-BY-ND-4.0",
|
|
47
|
+
"MPL-2.0",
|
|
48
|
+
]);
|
|
49
|
+
|
|
50
|
+
// Known GitHub orgs. Only mapped entities resolve at this tier — a brand name
|
|
51
|
+
// is NOT a GitHub login, and guessing hits same-named personal accounts.
|
|
52
|
+
const GITHUB_ORGS = {
|
|
53
|
+
slack: "slackhq",
|
|
54
|
+
meta: "facebook",
|
|
55
|
+
google: "google",
|
|
56
|
+
microsoft: "microsoft",
|
|
57
|
+
aws: "aws",
|
|
58
|
+
vercel: "vercel",
|
|
59
|
+
nextjs: "vercel",
|
|
60
|
+
alibaba: "alibaba",
|
|
61
|
+
heygen: "heygen-com",
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
// Favicon domains that aren't `<entity>.com`.
|
|
65
|
+
const FAVICON_DOMAINS = {
|
|
66
|
+
cocacola: "coca-cola.com",
|
|
67
|
+
aws: "aws.amazon.com",
|
|
68
|
+
nextjs: "nextjs.org",
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
const norm = (s) =>
|
|
72
|
+
String(s)
|
|
73
|
+
.toLowerCase()
|
|
74
|
+
.replace(/[^a-z0-9]/g, "");
|
|
75
|
+
|
|
76
|
+
/** The brand entity for a query: --entity wins; else the intent minus filler. */
|
|
77
|
+
export function entityFrom(intent, entity) {
|
|
78
|
+
if (entity) return entity.toLowerCase().trim();
|
|
79
|
+
return String(intent)
|
|
80
|
+
.toLowerCase()
|
|
81
|
+
.replace(/\b(logo|logos|icon|brand|official|mark)\b/g, "")
|
|
82
|
+
.trim()
|
|
83
|
+
.replace(/\s+/g, " ");
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** Exact match after stripping case/spacing/punctuation — "Next.js" ≡ "nextjs". */
|
|
87
|
+
export function titleMatches(title, entity) {
|
|
88
|
+
return norm(title) === norm(entity);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Best theSVG entry for an entity, or null: slug > title > alias, ties to the brands
|
|
92
|
+
* collection; entries outside THESVG_ACCEPTED_LICENSES are never returned. */
|
|
93
|
+
export function thesvgMatch(icons, entity) {
|
|
94
|
+
const want = norm(entity);
|
|
95
|
+
if (!want || !Array.isArray(icons)) return null;
|
|
96
|
+
const collectionRank = (icon) => {
|
|
97
|
+
const i = THESVG_COLLECTION_RANK.indexOf(icon.collection);
|
|
98
|
+
return i === -1 ? THESVG_COLLECTION_RANK.length : i;
|
|
99
|
+
};
|
|
100
|
+
let best = null;
|
|
101
|
+
let bestScore = Infinity;
|
|
102
|
+
for (const icon of icons) {
|
|
103
|
+
if (!icon || typeof icon.slug !== "string" || !icon.variants?.default) continue;
|
|
104
|
+
if (!THESVG_ACCEPTED_LICENSES.has(icon.license)) continue;
|
|
105
|
+
let field;
|
|
106
|
+
if (norm(icon.slug) === want) field = 0;
|
|
107
|
+
else if (titleMatches(icon.title, want)) field = 1;
|
|
108
|
+
else if ((icon.aliases || []).some((a) => titleMatches(a, want))) field = 2;
|
|
109
|
+
else continue;
|
|
110
|
+
const score = field * 100 + collectionRank(icon);
|
|
111
|
+
if (score < bestScore) {
|
|
112
|
+
best = icon;
|
|
113
|
+
bestScore = score;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return best;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
export function githubOrgFor(entity) {
|
|
120
|
+
return GITHUB_ORGS[norm(entity)] || null;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
export function faviconDomainFor(entity) {
|
|
124
|
+
return FAVICON_DOMAINS[norm(entity)] || `${norm(entity)}.com`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
async function fetchJson(url) {
|
|
128
|
+
const res = await fetchMedia(url, { signal: AbortSignal.timeout(10_000) });
|
|
129
|
+
if (!res.ok) return null;
|
|
130
|
+
const body = await readCappedBody(res, MAX_MANIFEST_BYTES, "fetchJson");
|
|
131
|
+
return JSON.parse(body.toString("utf8"));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
async function urlExists(url) {
|
|
135
|
+
const res = await fetchMedia(url, { method: "HEAD", signal: AbortSignal.timeout(10_000) });
|
|
136
|
+
return res.ok;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// One manifest per process: a multi-logo resolve pays the download once. A
|
|
140
|
+
// failed load is not cached, so the next call retries.
|
|
141
|
+
let thesvgManifest = null;
|
|
142
|
+
|
|
143
|
+
async function loadThesvgManifest() {
|
|
144
|
+
if (!thesvgManifest) {
|
|
145
|
+
thesvgManifest = fetchJson(THESVG_MANIFEST).then((icons) => {
|
|
146
|
+
if (!Array.isArray(icons)) throw new Error("theSVG manifest: unexpected shape");
|
|
147
|
+
return icons;
|
|
148
|
+
});
|
|
149
|
+
thesvgManifest.catch(() => {
|
|
150
|
+
thesvgManifest = null;
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return thesvgManifest;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Test hook: drop the memoized manifest. */
|
|
157
|
+
export function resetThesvgManifest() {
|
|
158
|
+
thesvgManifest = null;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export async function thesvgSearch(intent, ctx = {}) {
|
|
162
|
+
const entity = entityFrom(intent, ctx.entity);
|
|
163
|
+
let icons;
|
|
164
|
+
try {
|
|
165
|
+
icons = await loadThesvgManifest();
|
|
166
|
+
} catch {
|
|
167
|
+
return null; // network down or bad payload — let the next tier try its own host
|
|
168
|
+
}
|
|
169
|
+
const hit = thesvgMatch(icons, entity);
|
|
170
|
+
if (!hit) return null;
|
|
171
|
+
// theSVG also ships mono, light/dark and wordmark variants; default is the full-color mark.
|
|
172
|
+
const route = hit.variants.default;
|
|
173
|
+
return {
|
|
174
|
+
url: `${THESVG_CDN}/public${route.startsWith("/") ? "" : "/"}${route}`,
|
|
175
|
+
ext: ".svg",
|
|
176
|
+
source: "search",
|
|
177
|
+
metadata: {
|
|
178
|
+
description: `${hit.title} logo (official mark)`,
|
|
179
|
+
provider: "thesvg",
|
|
180
|
+
provenance: {
|
|
181
|
+
entity,
|
|
182
|
+
slug: hit.slug,
|
|
183
|
+
variant: "default",
|
|
184
|
+
variants: Object.keys(hit.variants),
|
|
185
|
+
collection: hit.collection,
|
|
186
|
+
license: hit.license,
|
|
187
|
+
pinned: `glincker/thesvg@${THESVG_REV}`,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
export async function githubAvatarSearch(intent, ctx = {}) {
|
|
194
|
+
const entity = entityFrom(intent, ctx.entity);
|
|
195
|
+
const org = githubOrgFor(entity);
|
|
196
|
+
if (!org) return null;
|
|
197
|
+
const url = `https://github.com/${org}.png?size=460`;
|
|
198
|
+
try {
|
|
199
|
+
if (!(await urlExists(url))) return null;
|
|
200
|
+
} catch {
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
return {
|
|
204
|
+
url,
|
|
205
|
+
ext: ".png",
|
|
206
|
+
source: "search",
|
|
207
|
+
metadata: {
|
|
208
|
+
description: `${entity} logo (GitHub org avatar)`,
|
|
209
|
+
provider: "github.avatar",
|
|
210
|
+
provenance: { entity, org },
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
export async function faviconSearch(intent, ctx = {}) {
|
|
216
|
+
const entity = entityFrom(intent, ctx.entity);
|
|
217
|
+
const domain = faviconDomainFor(entity);
|
|
218
|
+
const url = `https://icons.duckduckgo.com/ip3/${domain}.ico`;
|
|
219
|
+
let body;
|
|
220
|
+
try {
|
|
221
|
+
const res = await fetchMedia(url, { signal: AbortSignal.timeout(10_000) });
|
|
222
|
+
if (!res.ok) return null;
|
|
223
|
+
body = Buffer.from(await res.arrayBuffer());
|
|
224
|
+
} catch {
|
|
225
|
+
return null;
|
|
226
|
+
}
|
|
227
|
+
if (body.byteLength < FAVICON_MIN_BYTES) return null; // DDG placeholder, not a logo
|
|
228
|
+
// Hand the verified bytes over as a local file: the freeze step copies it
|
|
229
|
+
// instead of re-downloading, so the size check is authoritative over what
|
|
230
|
+
// gets frozen and the favicon tier costs one network round-trip, not two.
|
|
231
|
+
const bytes = body.byteLength;
|
|
232
|
+
const tmp = join(mkdtempSync(join(tmpdir(), "media-use-logo-")), `${domain}.ico`);
|
|
233
|
+
writeFileSync(tmp, body);
|
|
234
|
+
return {
|
|
235
|
+
localPath: tmp,
|
|
236
|
+
ext: ".ico",
|
|
237
|
+
source: "search",
|
|
238
|
+
metadata: {
|
|
239
|
+
description: `${entity} favicon (small raster — chip-size use only)`,
|
|
240
|
+
provider: "favicon.ddg",
|
|
241
|
+
provenance: { entity, domain, bytes, low_res: true },
|
|
242
|
+
},
|
|
243
|
+
};
|
|
244
|
+
}
|
|
@@ -0,0 +1,298 @@
|
|
|
1
|
+
import test from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import { readFileSync } from "node:fs";
|
|
4
|
+
import {
|
|
5
|
+
entityFrom,
|
|
6
|
+
titleMatches,
|
|
7
|
+
thesvgMatch,
|
|
8
|
+
githubOrgFor,
|
|
9
|
+
faviconDomainFor,
|
|
10
|
+
thesvgSearch,
|
|
11
|
+
resetThesvgManifest,
|
|
12
|
+
githubAvatarSearch,
|
|
13
|
+
faviconSearch,
|
|
14
|
+
} from "./logo-provider.mjs";
|
|
15
|
+
import { getProviders, runProviders } from "./registry.mjs";
|
|
16
|
+
|
|
17
|
+
test("entityFrom strips filler words from the intent; --entity wins", () => {
|
|
18
|
+
assert.equal(entityFrom("LinkedIn logo"), "linkedin");
|
|
19
|
+
assert.equal(entityFrom("official Slack brand mark"), "slack");
|
|
20
|
+
assert.equal(entityFrom("anything", "Notion"), "notion");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
test("titleMatches ignores case, spacing, punctuation — and rejects lookalikes", () => {
|
|
24
|
+
assert.ok(titleMatches("Next.js", "nextjs"));
|
|
25
|
+
assert.ok(titleMatches("Coca-Cola", "coca cola"));
|
|
26
|
+
assert.ok(!titleMatches("Slackware", "slack"));
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
// A slice of the real theSVG manifest shape (src/data/icons.json).
|
|
30
|
+
const ICONS = [
|
|
31
|
+
{
|
|
32
|
+
slug: "nextdotjs",
|
|
33
|
+
title: "Next.js",
|
|
34
|
+
aliases: [],
|
|
35
|
+
collection: "brands",
|
|
36
|
+
license: "CC0-1.0",
|
|
37
|
+
variants: { default: "/icons/nextdotjs/default.svg", mono: "/icons/nextdotjs/mono.svg" },
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
slug: "slack-badge",
|
|
41
|
+
title: "Slack",
|
|
42
|
+
aliases: [],
|
|
43
|
+
collection: "auth-badges",
|
|
44
|
+
license: "CC0-1.0",
|
|
45
|
+
variants: { default: "/icons/slack-badge/default.svg" },
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
slug: "slack",
|
|
49
|
+
title: "Slack",
|
|
50
|
+
aliases: [],
|
|
51
|
+
collection: "brands",
|
|
52
|
+
license: "CC0-1.0",
|
|
53
|
+
variants: { default: "/icons/slack/default.svg", wordmark: "/icons/slack/wordmark.svg" },
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
slug: "aws",
|
|
57
|
+
title: "AWS",
|
|
58
|
+
aliases: ["Amazon Web Services"],
|
|
59
|
+
collection: "brands",
|
|
60
|
+
license: "MIT",
|
|
61
|
+
variants: { default: "/icons/aws/color.svg", mono: "/icons/aws/mono.svg" },
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
slug: "coca-cola",
|
|
65
|
+
title: "Coca-Cola",
|
|
66
|
+
aliases: [],
|
|
67
|
+
collection: "brands",
|
|
68
|
+
license: "CC0-1.0",
|
|
69
|
+
variants: { default: "/icons/coca-cola/default.svg" },
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
slug: "slackware",
|
|
73
|
+
title: "Slackware",
|
|
74
|
+
aliases: [],
|
|
75
|
+
collection: "brands",
|
|
76
|
+
license: "CC0-1.0",
|
|
77
|
+
variants: { default: "/icons/slackware/default.svg" },
|
|
78
|
+
},
|
|
79
|
+
// Mirrors the real manifest's Microsoft entries verbatim (theSVG's own
|
|
80
|
+
// "needs maintainer review" wording) — never a valid match.
|
|
81
|
+
{
|
|
82
|
+
slug: "power-bi",
|
|
83
|
+
title: "Power BI",
|
|
84
|
+
aliases: [],
|
|
85
|
+
collection: "brands",
|
|
86
|
+
license:
|
|
87
|
+
"Microsoft proprietary product icon; no express redistribution license supplied; maintainer review required",
|
|
88
|
+
variants: { default: "/icons/power-bi/default.svg" },
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
slug: "acme-unresolved",
|
|
92
|
+
title: "Acme Unresolved",
|
|
93
|
+
aliases: [],
|
|
94
|
+
collection: "brands",
|
|
95
|
+
license: "brand-use",
|
|
96
|
+
variants: { default: "/icons/acme-unresolved/default.svg" },
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
test("thesvgMatch finds entries by normalized slug, title, or alias", () => {
|
|
101
|
+
assert.equal(thesvgMatch(ICONS, "nextjs").slug, "nextdotjs", "title Next.js ≡ nextjs");
|
|
102
|
+
assert.equal(thesvgMatch(ICONS, "coca cola").slug, "coca-cola");
|
|
103
|
+
assert.equal(thesvgMatch(ICONS, "amazon web services").slug, "aws", "alias hit");
|
|
104
|
+
assert.equal(thesvgMatch(ICONS, "zzzbrand"), null);
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
test("thesvgMatch prefers the brand mark over an auth badge with the same title", () => {
|
|
108
|
+
assert.equal(thesvgMatch(ICONS, "slack").slug, "slack");
|
|
109
|
+
});
|
|
110
|
+
|
|
111
|
+
test("thesvgMatch never returns a lookalike", () => {
|
|
112
|
+
assert.equal(thesvgMatch(ICONS, "slackwa"), null);
|
|
113
|
+
assert.equal(thesvgMatch(ICONS, ""), null);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
test("thesvgMatch skips an entry outside theSVG's ten accepted SPDX licenses", () => {
|
|
117
|
+
assert.equal(
|
|
118
|
+
thesvgMatch(ICONS, "power bi"),
|
|
119
|
+
null,
|
|
120
|
+
"Microsoft's own 'needs maintainer review' text",
|
|
121
|
+
);
|
|
122
|
+
assert.equal(
|
|
123
|
+
thesvgMatch(ICONS, "acme unresolved"),
|
|
124
|
+
null,
|
|
125
|
+
"brand-use is not on the accepted list",
|
|
126
|
+
);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
test("thesvgMatch falls through to a lower-ranked accepted entry when the top match is unlicensed", () => {
|
|
130
|
+
const icons = [
|
|
131
|
+
{
|
|
132
|
+
slug: "acme",
|
|
133
|
+
title: "Acme",
|
|
134
|
+
aliases: [],
|
|
135
|
+
collection: "brands",
|
|
136
|
+
license: "Proprietary",
|
|
137
|
+
variants: { default: "/icons/acme/default.svg" },
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
slug: "acme-community",
|
|
141
|
+
title: "Acme",
|
|
142
|
+
aliases: [],
|
|
143
|
+
collection: "community",
|
|
144
|
+
license: "CC0-1.0",
|
|
145
|
+
variants: { default: "/icons/acme-community/default.svg" },
|
|
146
|
+
},
|
|
147
|
+
];
|
|
148
|
+
assert.equal(thesvgMatch(icons, "acme").slug, "acme-community");
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test("github avatar tier never guesses an org", () => {
|
|
152
|
+
assert.equal(githubOrgFor("slack"), "slackhq");
|
|
153
|
+
assert.equal(githubOrgFor("heygen"), "heygen-com");
|
|
154
|
+
assert.equal(githubOrgFor("some-random-startup"), null);
|
|
155
|
+
});
|
|
156
|
+
|
|
157
|
+
test("favicon domain defaults to <entity>.com with explicit overrides", () => {
|
|
158
|
+
assert.equal(faviconDomainFor("cocacola"), "coca-cola.com");
|
|
159
|
+
assert.equal(faviconDomainFor("stripe"), "stripe.com");
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
// --- async tiers, network mocked -------------------------------------------
|
|
163
|
+
// The 54-brand stress test is a manual snapshot; these pin the same behavior
|
|
164
|
+
// as CI gates: descriptor shape, alias retry, error→null fallthrough, the
|
|
165
|
+
// placeholder filter, and the real cascade order under a mocked network.
|
|
166
|
+
|
|
167
|
+
const json = (data) => new Response(JSON.stringify(data), { status: 200 });
|
|
168
|
+
const status = (code) => new Response(null, { status: code });
|
|
169
|
+
const bin = (n) => new Response(new Uint8Array(n), { status: 200 });
|
|
170
|
+
|
|
171
|
+
test("thesvgSearch returns a pinned CDN url for the default variant", async (t) => {
|
|
172
|
+
resetThesvgManifest();
|
|
173
|
+
t.mock.method(globalThis, "fetch", async () => json(ICONS));
|
|
174
|
+
const res = await thesvgSearch("AWS logo", {});
|
|
175
|
+
assert.match(
|
|
176
|
+
res.url,
|
|
177
|
+
/^https:\/\/cdn\.jsdelivr\.net\/gh\/glincker\/thesvg@[0-9a-f]{40}\/public\/icons\/aws\/color\.svg$/,
|
|
178
|
+
);
|
|
179
|
+
assert.equal(res.ext, ".svg");
|
|
180
|
+
assert.equal(res.metadata.provider, "thesvg");
|
|
181
|
+
assert.equal(res.metadata.provenance.slug, "aws");
|
|
182
|
+
assert.deepEqual(res.metadata.provenance.variants, ["default", "mono"]);
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
test("thesvgSearch fetches the manifest once per process", async (t) => {
|
|
186
|
+
resetThesvgManifest();
|
|
187
|
+
const fetchMock = t.mock.method(globalThis, "fetch", async () => json(ICONS));
|
|
188
|
+
await thesvgSearch("slack logo", {});
|
|
189
|
+
await thesvgSearch("nextjs logo", {});
|
|
190
|
+
assert.equal(await thesvgSearch("zzzbrand logo", {}), null);
|
|
191
|
+
assert.equal(fetchMock.mock.callCount(), 1);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
test("thesvgSearch returns null when the network is down, then retries next call", async (t) => {
|
|
195
|
+
resetThesvgManifest();
|
|
196
|
+
let down = true;
|
|
197
|
+
t.mock.method(globalThis, "fetch", async () => {
|
|
198
|
+
if (down) throw new Error("network down");
|
|
199
|
+
return json(ICONS);
|
|
200
|
+
});
|
|
201
|
+
assert.equal(await thesvgSearch("figma logo", {}), null);
|
|
202
|
+
down = false;
|
|
203
|
+
assert.equal((await thesvgSearch("slack logo", {})).metadata.provenance.slug, "slack");
|
|
204
|
+
});
|
|
205
|
+
|
|
206
|
+
test("thesvgSearch treats a non-array manifest as a miss", async (t) => {
|
|
207
|
+
resetThesvgManifest();
|
|
208
|
+
t.mock.method(globalThis, "fetch", async () => json({ error: "unexpected shape" }));
|
|
209
|
+
assert.equal(await thesvgSearch("slack logo", {}), null);
|
|
210
|
+
});
|
|
211
|
+
|
|
212
|
+
test("thesvgSearch rejects a manifest body over the size cap instead of buffering it whole", async (t) => {
|
|
213
|
+
resetThesvgManifest();
|
|
214
|
+
t.mock.method(globalThis, "fetch", async () => ({
|
|
215
|
+
ok: true,
|
|
216
|
+
status: 200,
|
|
217
|
+
headers: { get: () => null },
|
|
218
|
+
// 4 × 6MB > the 20MB cap, no content-length header (matches jsDelivr).
|
|
219
|
+
body: (async function* () {
|
|
220
|
+
for (let i = 0; i < 4; i++) yield new Uint8Array(6 * 1024 * 1024);
|
|
221
|
+
})(),
|
|
222
|
+
}));
|
|
223
|
+
assert.equal(await thesvgSearch("slack logo", {}), null);
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
test("faviconSearch rejects DDG's sub-500B placeholder with null", async (t) => {
|
|
227
|
+
t.mock.method(globalThis, "fetch", async () => bin(120));
|
|
228
|
+
assert.equal(await faviconSearch("someco logo", {}), null);
|
|
229
|
+
});
|
|
230
|
+
|
|
231
|
+
test("faviconSearch hands verified bytes over as a local file — one fetch, no re-download", async (t) => {
|
|
232
|
+
const fetchMock = t.mock.method(globalThis, "fetch", async () => bin(600));
|
|
233
|
+
const res = await faviconSearch("someco logo", {});
|
|
234
|
+
assert.ok(res.localPath, "returns a localPath, not a url");
|
|
235
|
+
assert.equal(readFileSync(res.localPath).byteLength, 600, "frozen bytes are the verified bytes");
|
|
236
|
+
assert.equal(fetchMock.mock.callCount(), 1, "single network round-trip");
|
|
237
|
+
assert.equal(res.metadata.provenance.low_res, true);
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
test("githubAvatarSearch never touches the network for an unmapped entity", async (t) => {
|
|
241
|
+
const fetchMock = t.mock.method(globalThis, "fetch", async () => status(200));
|
|
242
|
+
assert.equal(await githubAvatarSearch("some-random-startup logo", {}), null);
|
|
243
|
+
assert.equal(fetchMock.mock.callCount(), 0);
|
|
244
|
+
});
|
|
245
|
+
|
|
246
|
+
test("the real logo cascade resolves a theSVG brand on tier 1", async (t) => {
|
|
247
|
+
resetThesvgManifest();
|
|
248
|
+
t.mock.method(globalThis, "fetch", async (url) => {
|
|
249
|
+
if (String(url).includes("glincker/thesvg")) return json(ICONS);
|
|
250
|
+
throw new Error(`unexpected fetch: ${url}`);
|
|
251
|
+
});
|
|
252
|
+
const res = await runProviders(getProviders("logo"), "search", "Next.js logo", {});
|
|
253
|
+
assert.equal(res.metadata.provider, "thesvg");
|
|
254
|
+
assert.ok(res.url.endsWith("/public/icons/nextdotjs/default.svg"));
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
test("the real logo cascade falls through tier by tier to the first hit", async (t) => {
|
|
258
|
+
resetThesvgManifest();
|
|
259
|
+
t.mock.method(globalThis, "fetch", async (url) => {
|
|
260
|
+
const u = String(url);
|
|
261
|
+
if (u.includes("glincker/thesvg")) return json(ICONS); // tier 1: no entry
|
|
262
|
+
// tier 2 (github) is never called: entity is unmapped
|
|
263
|
+
if (u.includes("duckduckgo")) return bin(600); // tier 3: real favicon
|
|
264
|
+
throw new Error(`unexpected fetch: ${u}`);
|
|
265
|
+
});
|
|
266
|
+
const res = await runProviders(getProviders("logo"), "search", "zzzbrand logo", {
|
|
267
|
+
entity: "zzzbrand",
|
|
268
|
+
});
|
|
269
|
+
assert.ok(res, "cascade must land on the favicon tier");
|
|
270
|
+
assert.equal(res.metadata.provider, "favicon.ddg");
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("githubAvatarSearch rejects private HEAD redirects", async (t) => {
|
|
274
|
+
const seen = [];
|
|
275
|
+
t.mock.method(globalThis, "fetch", async (url, options) => {
|
|
276
|
+
seen.push(url);
|
|
277
|
+
assert.equal(options.method, "HEAD");
|
|
278
|
+
assert.ok(options.signal);
|
|
279
|
+
return options.redirect === "manual"
|
|
280
|
+
? new Response(null, { status: 302, headers: { location: "http://127.0.0.1/private" } })
|
|
281
|
+
: new Response(null, { status: 200 });
|
|
282
|
+
});
|
|
283
|
+
assert.equal(await githubAvatarSearch("vercel logo"), null);
|
|
284
|
+
assert.equal(seen.length, 1);
|
|
285
|
+
assert.ok(!seen[0].includes("127.0.0.1"));
|
|
286
|
+
});
|
|
287
|
+
|
|
288
|
+
test("thesvgSearch rejects a manifest redirect to a private host", async (t) => {
|
|
289
|
+
resetThesvgManifest();
|
|
290
|
+
const seen = [];
|
|
291
|
+
t.mock.method(globalThis, "fetch", async (url, options) => {
|
|
292
|
+
seen.push(url);
|
|
293
|
+
assert.equal(options.redirect, "manual");
|
|
294
|
+
return new Response(null, { status: 302, headers: { location: "http://127.0.0.1/private" } });
|
|
295
|
+
});
|
|
296
|
+
assert.equal(await thesvgSearch("vercel logo"), null);
|
|
297
|
+
assert.equal(seen.length, 1);
|
|
298
|
+
});
|