@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.
Files changed (586) hide show
  1. package/LICENSE +190 -0
  2. package/NOTICE +54 -0
  3. package/README.md +23 -0
  4. package/bin/ignix-editor.mjs +8 -0
  5. package/package.json +53 -0
  6. package/patches/index.mjs +53 -0
  7. package/scripts/build-ffmpeg-macos.sh +35 -0
  8. package/scripts/build-whisper-macos.sh +21 -0
  9. package/scripts/vendor.mjs +41 -0
  10. package/skills/ignix-editor/SKILL.md +132 -0
  11. package/src/audio.mjs +31 -0
  12. package/src/binaries.json +46 -0
  13. package/src/binaries.mjs +83 -0
  14. package/src/cli.mjs +254 -0
  15. package/src/prepare.mjs +74 -0
  16. package/src/runtime/ignix-frame.js +92 -0
  17. package/src/transcribe.mjs +71 -0
  18. package/src/validate.mjs +71 -0
  19. package/templates/blank/index.html +41 -0
  20. package/vendor/hyperframes/README.md +181 -0
  21. package/vendor/hyperframes/UPSTREAM.json +12 -0
  22. package/vendor/hyperframes/bin/hyperframes-localize-fonts.mjs +12 -0
  23. package/vendor/hyperframes/bin/hyperframes.mjs +11 -0
  24. package/vendor/hyperframes/dist/add-LR3ZR2A5.js +79 -0
  25. package/vendor/hyperframes/dist/agentPromptGenerator-VIIPZCJ3.js +143 -0
  26. package/vendor/hyperframes/dist/animatedGifPrep-P2T6YM7Z.js +34 -0
  27. package/vendor/hyperframes/dist/asset-BE2DOV72.js +26 -0
  28. package/vendor/hyperframes/dist/assetCataloger-VBLPHX24.js +340 -0
  29. package/vendor/hyperframes/dist/auth-RCQB2ZT7.js +60 -0
  30. package/vendor/hyperframes/dist/autoUpdate-RJAX3DAZ.js +268 -0
  31. package/vendor/hyperframes/dist/backgroundChecks-H2LCUIMJ.js +61 -0
  32. package/vendor/hyperframes/dist/backgroundChecksWorker.js +26 -0
  33. package/vendor/hyperframes/dist/batchRender-FT7AP7XH.js +355 -0
  34. package/vendor/hyperframes/dist/beat-analyzer.global.js +338 -0
  35. package/vendor/hyperframes/dist/beats-Y2EOP72P.js +309 -0
  36. package/vendor/hyperframes/dist/benchmark-MZ7GY3JW.js +231 -0
  37. package/vendor/hyperframes/dist/browser-HUTAMRQE.js +237 -0
  38. package/vendor/hyperframes/dist/bundleWithLocalizedFonts-5QOPOB5D.js +52 -0
  39. package/vendor/hyperframes/dist/capture-RLZA6EMR.js +4079 -0
  40. package/vendor/hyperframes/dist/capture-SZZ4IYJK.js +290 -0
  41. package/vendor/hyperframes/dist/captureFile-LYOJOUIE.js +15 -0
  42. package/vendor/hyperframes/dist/captureTimeout-PA4FYWT5.js +27 -0
  43. package/vendor/hyperframes/dist/catalog-KYU55EWR.js +1001 -0
  44. package/vendor/hyperframes/dist/check-TCG4PXLR.js +1697 -0
  45. package/vendor/hyperframes/dist/checkBrowser-RPMO4OW5.js +1032 -0
  46. package/vendor/hyperframes/dist/chunk-2EAXUCCE.js +88 -0
  47. package/vendor/hyperframes/dist/chunk-2EGFTPWD.js +1077 -0
  48. package/vendor/hyperframes/dist/chunk-2PSPARWP.js +6058 -0
  49. package/vendor/hyperframes/dist/chunk-2YN64IN5.js +5747 -0
  50. package/vendor/hyperframes/dist/chunk-3GXQPCJC.js +682 -0
  51. package/vendor/hyperframes/dist/chunk-3ZP5DXE7.js +15 -0
  52. package/vendor/hyperframes/dist/chunk-4NWOGZZS.js +1990 -0
  53. package/vendor/hyperframes/dist/chunk-4PFZPP2N.js +587 -0
  54. package/vendor/hyperframes/dist/chunk-4THIAPBL.js +128 -0
  55. package/vendor/hyperframes/dist/chunk-4YYJOFKS.js +28 -0
  56. package/vendor/hyperframes/dist/chunk-54HJ63Q2.js +29 -0
  57. package/vendor/hyperframes/dist/chunk-5ETJX6WM.js +89 -0
  58. package/vendor/hyperframes/dist/chunk-5IAKAQA7.js +389 -0
  59. package/vendor/hyperframes/dist/chunk-5Z63TBTX.js +37 -0
  60. package/vendor/hyperframes/dist/chunk-6BEFEWFB.js +25 -0
  61. package/vendor/hyperframes/dist/chunk-6CSYCFQV.js +68 -0
  62. package/vendor/hyperframes/dist/chunk-6CTIGJY7.js +154 -0
  63. package/vendor/hyperframes/dist/chunk-7HG4BFIN.js +93 -0
  64. package/vendor/hyperframes/dist/chunk-7JZ4FXP2.js +118 -0
  65. package/vendor/hyperframes/dist/chunk-A2Z4Z4VL.js +2961 -0
  66. package/vendor/hyperframes/dist/chunk-AMKC3AXA.js +25 -0
  67. package/vendor/hyperframes/dist/chunk-AVUUN2XD.js +4847 -0
  68. package/vendor/hyperframes/dist/chunk-AWDFDFI3.js +46 -0
  69. package/vendor/hyperframes/dist/chunk-AWNBM3MZ.js +94 -0
  70. package/vendor/hyperframes/dist/chunk-BXCMXMJQ.js +73 -0
  71. package/vendor/hyperframes/dist/chunk-BZ56MTDX.js +6 -0
  72. package/vendor/hyperframes/dist/chunk-CFKU7HTK.js +171 -0
  73. package/vendor/hyperframes/dist/chunk-CWPVM2QV.js +308 -0
  74. package/vendor/hyperframes/dist/chunk-DPVXBVLL.js +31292 -0
  75. package/vendor/hyperframes/dist/chunk-DQBY7FRR.js +397 -0
  76. package/vendor/hyperframes/dist/chunk-E6RPWJVC.js +213 -0
  77. package/vendor/hyperframes/dist/chunk-EISRN4E6.js +294 -0
  78. package/vendor/hyperframes/dist/chunk-EOVYQ3IG.js +143 -0
  79. package/vendor/hyperframes/dist/chunk-F3WZGU7C.js +479 -0
  80. package/vendor/hyperframes/dist/chunk-FCSIGXXP.js +366 -0
  81. package/vendor/hyperframes/dist/chunk-FI4I7CME.js +56 -0
  82. package/vendor/hyperframes/dist/chunk-FLWXXDNS.js +15 -0
  83. package/vendor/hyperframes/dist/chunk-GK4AIFIH.js +11171 -0
  84. package/vendor/hyperframes/dist/chunk-GMECXFAN.js +57 -0
  85. package/vendor/hyperframes/dist/chunk-GULOKZLI.js +155 -0
  86. package/vendor/hyperframes/dist/chunk-H4YZZ2VQ.js +68 -0
  87. package/vendor/hyperframes/dist/chunk-H6QMKUYA.js +477 -0
  88. package/vendor/hyperframes/dist/chunk-HBBJFK6I.js +273 -0
  89. package/vendor/hyperframes/dist/chunk-HRUGC23L.js +212 -0
  90. package/vendor/hyperframes/dist/chunk-HVW7ABXD.js +19 -0
  91. package/vendor/hyperframes/dist/chunk-HW6OYASV.js +344 -0
  92. package/vendor/hyperframes/dist/chunk-HWKCIWQT.js +3578 -0
  93. package/vendor/hyperframes/dist/chunk-I465DBM6.js +1214 -0
  94. package/vendor/hyperframes/dist/chunk-IGLEPPTN.js +24 -0
  95. package/vendor/hyperframes/dist/chunk-IGNAAHS3.js +433 -0
  96. package/vendor/hyperframes/dist/chunk-IHFUKJOR.js +85 -0
  97. package/vendor/hyperframes/dist/chunk-IQ3OUQ5Z.js +213 -0
  98. package/vendor/hyperframes/dist/chunk-ISN5GRYI.js +20 -0
  99. package/vendor/hyperframes/dist/chunk-IUZFXWSV.js +446 -0
  100. package/vendor/hyperframes/dist/chunk-JH556Q42.js +647 -0
  101. package/vendor/hyperframes/dist/chunk-JTHMTOMQ.js +601 -0
  102. package/vendor/hyperframes/dist/chunk-K2EQN4VU.js +405 -0
  103. package/vendor/hyperframes/dist/chunk-K2FTXJYH.js +16044 -0
  104. package/vendor/hyperframes/dist/chunk-K4WIOZFP.js +32 -0
  105. package/vendor/hyperframes/dist/chunk-K4WKGXRC.js +18 -0
  106. package/vendor/hyperframes/dist/chunk-KBJUXVOJ.js +172 -0
  107. package/vendor/hyperframes/dist/chunk-KC5XXX3X.js +590 -0
  108. package/vendor/hyperframes/dist/chunk-KNU5COPB.js +29 -0
  109. package/vendor/hyperframes/dist/chunk-KZI44OPA.js +185 -0
  110. package/vendor/hyperframes/dist/chunk-L3YOGIPG.js +48 -0
  111. package/vendor/hyperframes/dist/chunk-LAOCA3MQ.js +189 -0
  112. package/vendor/hyperframes/dist/chunk-LCSMOLGX.js +312 -0
  113. package/vendor/hyperframes/dist/chunk-LFGJWOVA.js +61 -0
  114. package/vendor/hyperframes/dist/chunk-LHSR3M4M.js +498 -0
  115. package/vendor/hyperframes/dist/chunk-LYNI3FOL.js +123 -0
  116. package/vendor/hyperframes/dist/chunk-M2WBOQ2Q.js +54 -0
  117. package/vendor/hyperframes/dist/chunk-MRF4AMKD.js +104 -0
  118. package/vendor/hyperframes/dist/chunk-MWB3ZIFM.js +852 -0
  119. package/vendor/hyperframes/dist/chunk-NGKM64BP.js +39 -0
  120. package/vendor/hyperframes/dist/chunk-NXMYHJAL.js +43 -0
  121. package/vendor/hyperframes/dist/chunk-OAF4XJOW.js +192 -0
  122. package/vendor/hyperframes/dist/chunk-OFQWTKPW.js +117 -0
  123. package/vendor/hyperframes/dist/chunk-P6LJ4Y32.js +4662 -0
  124. package/vendor/hyperframes/dist/chunk-PBN6GBJE.js +108 -0
  125. package/vendor/hyperframes/dist/chunk-PDAMK4Q5.js +28 -0
  126. package/vendor/hyperframes/dist/chunk-PFCFR3KZ.js +20 -0
  127. package/vendor/hyperframes/dist/chunk-PJ3HDUCY.js +108 -0
  128. package/vendor/hyperframes/dist/chunk-PMRBLBUP.js +152 -0
  129. package/vendor/hyperframes/dist/chunk-PPQUYWTW.js +240 -0
  130. package/vendor/hyperframes/dist/chunk-Q5X2B5WT.js +29 -0
  131. package/vendor/hyperframes/dist/chunk-Q7IU7MOR.js +351 -0
  132. package/vendor/hyperframes/dist/chunk-QC4FJVLM.js +371 -0
  133. package/vendor/hyperframes/dist/chunk-QNYYOUU3.js +1318 -0
  134. package/vendor/hyperframes/dist/chunk-RDNNAKEP.js +161 -0
  135. package/vendor/hyperframes/dist/chunk-RMHUQGRK.js +657 -0
  136. package/vendor/hyperframes/dist/chunk-RQVDTPGD.js +6 -0
  137. package/vendor/hyperframes/dist/chunk-RVCWIIZ7.js +68 -0
  138. package/vendor/hyperframes/dist/chunk-S3D6GE5W.js +72 -0
  139. package/vendor/hyperframes/dist/chunk-S3S4TGEH.js +424 -0
  140. package/vendor/hyperframes/dist/chunk-S7NPLFWV.js +11395 -0
  141. package/vendor/hyperframes/dist/chunk-SHB5VDMH.js +51 -0
  142. package/vendor/hyperframes/dist/chunk-TCLGPL65.js +860 -0
  143. package/vendor/hyperframes/dist/chunk-THXFSPLV.js +40 -0
  144. package/vendor/hyperframes/dist/chunk-TJSTGSAW.js +354 -0
  145. package/vendor/hyperframes/dist/chunk-TQFG7HTI.js +1024 -0
  146. package/vendor/hyperframes/dist/chunk-TVCRUG2S.js +265 -0
  147. package/vendor/hyperframes/dist/chunk-TWWSYAKJ.js +24 -0
  148. package/vendor/hyperframes/dist/chunk-U7CZBDMV.js +27 -0
  149. package/vendor/hyperframes/dist/chunk-UEZXMWG3.js +139 -0
  150. package/vendor/hyperframes/dist/chunk-UYEZTK4U.js +61 -0
  151. package/vendor/hyperframes/dist/chunk-VC76R6W2.js +27 -0
  152. package/vendor/hyperframes/dist/chunk-VFCKXTBB.js +159 -0
  153. package/vendor/hyperframes/dist/chunk-VWG7OQKU.js +22 -0
  154. package/vendor/hyperframes/dist/chunk-VXVRPIJA.js +105 -0
  155. package/vendor/hyperframes/dist/chunk-WBLXWOYK.js +15 -0
  156. package/vendor/hyperframes/dist/chunk-WERLJGIC.js +20 -0
  157. package/vendor/hyperframes/dist/chunk-WMQNIQDJ.js +2057 -0
  158. package/vendor/hyperframes/dist/chunk-WPHMNO44.js +4528 -0
  159. package/vendor/hyperframes/dist/chunk-X5HWXQPU.js +113 -0
  160. package/vendor/hyperframes/dist/chunk-X7MTZ4T2.js +6 -0
  161. package/vendor/hyperframes/dist/chunk-XH4DSOS5.js +59 -0
  162. package/vendor/hyperframes/dist/chunk-XS4EJSKU.js +23 -0
  163. package/vendor/hyperframes/dist/chunk-XT5P4QMO.js +181 -0
  164. package/vendor/hyperframes/dist/chunk-XT7X6QCP.js +6 -0
  165. package/vendor/hyperframes/dist/chunk-XUHOIDKG.js +6 -0
  166. package/vendor/hyperframes/dist/chunk-XUXGIA7H.js +485 -0
  167. package/vendor/hyperframes/dist/chunk-XZABUQTX.js +113 -0
  168. package/vendor/hyperframes/dist/chunk-Y6W4DVPS.js +356 -0
  169. package/vendor/hyperframes/dist/chunk-YEIFI443.js +44 -0
  170. package/vendor/hyperframes/dist/chunk-YQZNILVH.js +375 -0
  171. package/vendor/hyperframes/dist/chunk-Z27A7NUB.js +65 -0
  172. package/vendor/hyperframes/dist/chunk-Z6B37SNM.js +3081 -0
  173. package/vendor/hyperframes/dist/chunk-ZJUKFZ2P.js +10954 -0
  174. package/vendor/hyperframes/dist/chunk-ZKDMAOFU.js +32 -0
  175. package/vendor/hyperframes/dist/chunk-ZMXUQLI2.js +17219 -0
  176. package/vendor/hyperframes/dist/chunk-ZTZ7NCJT.js +58 -0
  177. package/vendor/hyperframes/dist/chunk-ZTZA4UWZ.js +108 -0
  178. package/vendor/hyperframes/dist/clean-W57E5YQ3.js +293 -0
  179. package/vendor/hyperframes/dist/cli.js +495 -0
  180. package/vendor/hyperframes/dist/cloud-FFTJGZ24.js +70 -0
  181. package/vendor/hyperframes/dist/cloudrun-AJUTHUEA.js +763 -0
  182. package/vendor/hyperframes/dist/colors-HKWSZCGK.js +15 -0
  183. package/vendor/hyperframes/dist/commands/contrast-audit.browser.js +459 -0
  184. package/vendor/hyperframes/dist/commands/layout-audit.browser.js +2102 -0
  185. package/vendor/hyperframes/dist/commands/motion-sample.browser.js +74 -0
  186. package/vendor/hyperframes/dist/commands/motion-signature.browser.js +374 -0
  187. package/vendor/hyperframes/dist/compare-AYCTT55F.js +421 -0
  188. package/vendor/hyperframes/dist/compiler-QO36EXLS.js +121 -0
  189. package/vendor/hyperframes/dist/component-VFFR2O7T.js +176 -0
  190. package/vendor/hyperframes/dist/compositions-QTVN3U2A.js +228 -0
  191. package/vendor/hyperframes/dist/contactSheet-27SRU7A4.js +22 -0
  192. package/vendor/hyperframes/dist/delete-ZAKYCB7I.js +114 -0
  193. package/vendor/hyperframes/dist/deploy-MX76RZ36.js +101 -0
  194. package/vendor/hyperframes/dist/destroy-H2TZBYHH.js +42 -0
  195. package/vendor/hyperframes/dist/deterministicFonts-HAEMV4TM.js +50 -0
  196. package/vendor/hyperframes/dist/dist-EWXJGN63.js +129 -0
  197. package/vendor/hyperframes/dist/dist-FNNGCKFS.js +29 -0
  198. package/vendor/hyperframes/dist/dist-S3PJNPXQ.js +392 -0
  199. package/vendor/hyperframes/dist/docker/Dockerfile.render +65 -0
  200. package/vendor/hyperframes/dist/docs/compositions.md +67 -0
  201. package/vendor/hyperframes/dist/docs/data-attributes.md +27 -0
  202. package/vendor/hyperframes/dist/docs/examples.md +19 -0
  203. package/vendor/hyperframes/dist/docs/gsap.md +26 -0
  204. package/vendor/hyperframes/dist/docs/rendering.md +35 -0
  205. package/vendor/hyperframes/dist/docs/troubleshooting.md +29 -0
  206. package/vendor/hyperframes/dist/docs-QAPJEGLS.js +131 -0
  207. package/vendor/hyperframes/dist/doctor-AI7C3FON.js +67 -0
  208. package/vendor/hyperframes/dist/dom-IROKGVJI.js +14 -0
  209. package/vendor/hyperframes/dist/dotEnv-AECLXQSO.js +14 -0
  210. package/vendor/hyperframes/dist/events-7LALYNKZ.js +92 -0
  211. package/vendor/hyperframes/dist/events-FQY3HGKZ.js +88 -0
  212. package/vendor/hyperframes/dist/feedback-WCMDMSTK.js +472 -0
  213. package/vendor/hyperframes/dist/ffmpeg-QIUFEFTY.js +35 -0
  214. package/vendor/hyperframes/dist/figma-64WY462P.js +63 -0
  215. package/vendor/hyperframes/dist/fontData.generated-NXAOI4GH.js +13 -0
  216. package/vendor/hyperframes/dist/fontLocalizeCli.js +132 -0
  217. package/vendor/hyperframes/dist/get-FPOMJMZB.js +103 -0
  218. package/vendor/hyperframes/dist/gpuPolicy-2ZUZE5D6.js +38 -0
  219. package/vendor/hyperframes/dist/grade-compare-E2CKPST4.js +647 -0
  220. package/vendor/hyperframes/dist/gsapParser-DIYYX6JT.js +2846 -0
  221. package/vendor/hyperframes/dist/gsapParserAcorn-E3GEIRZB.js +28 -0
  222. package/vendor/hyperframes/dist/help-YRQIDDML.js +197 -0
  223. package/vendor/hyperframes/dist/history-PP5NDRV3.js +571 -0
  224. package/vendor/hyperframes/dist/hyperframe-runtime.js +1081 -0
  225. package/vendor/hyperframes/dist/hyperframe.manifest.json +22 -0
  226. package/vendor/hyperframes/dist/hyperframe.runtime.iife.js +1081 -0
  227. package/vendor/hyperframes/dist/hyperframes-player.global.js +474 -0
  228. package/vendor/hyperframes/dist/hyperframes-slideshow.global.js +149 -0
  229. package/vendor/hyperframes/dist/info-SEX3B7JL.js +153 -0
  230. package/vendor/hyperframes/dist/init-U3AKHO5B.js +1147 -0
  231. package/vendor/hyperframes/dist/inspect-Q3K6EDEK.js +97 -0
  232. package/vendor/hyperframes/dist/installer-K6O5WF44.js +37 -0
  233. package/vendor/hyperframes/dist/keyframes-DC64JCI3.js +2602 -0
  234. package/vendor/hyperframes/dist/lambda-D7UMN4DJ.js +451 -0
  235. package/vendor/hyperframes/dist/layout-XSPPDHOO.js +86 -0
  236. package/vendor/hyperframes/dist/lib-TPG2ZMAX.js +128 -0
  237. package/vendor/hyperframes/dist/lint-7DQZE7L3.js +164 -0
  238. package/vendor/hyperframes/dist/lintProject-OHBBM3DJ.js +27 -0
  239. package/vendor/hyperframes/dist/list-4K5MVDQX.js +162 -0
  240. package/vendor/hyperframes/dist/login-NTX4OWXL.js +377 -0
  241. package/vendor/hyperframes/dist/logout-Q654A3SI.js +100 -0
  242. package/vendor/hyperframes/dist/manager-67P2XFXQ.js +34 -0
  243. package/vendor/hyperframes/dist/manager-CT3D67CG.js +38 -0
  244. package/vendor/hyperframes/dist/manager-GFN75DM4.js +30 -0
  245. package/vendor/hyperframes/dist/media-treatment-5FYAOPNL.js +972 -0
  246. package/vendor/hyperframes/dist/media-use-4XXGABIL.js +113 -0
  247. package/vendor/hyperframes/dist/models-C4E4IWJD.js +137 -0
  248. package/vendor/hyperframes/dist/motionShot-S4MIGMT5.js +614 -0
  249. package/vendor/hyperframes/dist/normalize-O76AC4HE.js +333 -0
  250. package/vendor/hyperframes/dist/normalize-audio-CSFTXLXD.js +276 -0
  251. package/vendor/hyperframes/dist/open-2ZD6BHZG.js +115 -0
  252. package/vendor/hyperframes/dist/pipeline-TNGWUZQC.js +54 -0
  253. package/vendor/hyperframes/dist/play-CTMUXX6E.js +349 -0
  254. package/vendor/hyperframes/dist/policies-FSDZVS2E.js +292 -0
  255. package/vendor/hyperframes/dist/preflight-SMNV6RW2.js +45 -0
  256. package/vendor/hyperframes/dist/present-WQVHV5CR.js +350 -0
  257. package/vendor/hyperframes/dist/preview-JOJXTH75.js +1820 -0
  258. package/vendor/hyperframes/dist/producer-ECLEN5RP.js +13 -0
  259. package/vendor/hyperframes/dist/progress-FBIEEB7Y.js +73 -0
  260. package/vendor/hyperframes/dist/projectConfig-HYJMJ5BY.js +56 -0
  261. package/vendor/hyperframes/dist/publication-HQ5Y3KBM.js +29 -0
  262. package/vendor/hyperframes/dist/publish-VHDYQASC.js +430 -0
  263. package/vendor/hyperframes/dist/refresh-K24ETHMA.js +53 -0
  264. package/vendor/hyperframes/dist/remove-background-W2YX2NVH.js +253 -0
  265. package/vendor/hyperframes/dist/render-AO5VX3YI.js +177 -0
  266. package/vendor/hyperframes/dist/render-LNO62LEL.js +2367 -0
  267. package/vendor/hyperframes/dist/render-TTQI7TGN.js +796 -0
  268. package/vendor/hyperframes/dist/render-batch-YH7CTWNY.js +284 -0
  269. package/vendor/hyperframes/dist/renderCancellation-JPIHE47X.js +35 -0
  270. package/vendor/hyperframes/dist/renderSetupWorker.js +79 -0
  271. package/vendor/hyperframes/dist/resolver-IZ647GBZ.js +38 -0
  272. package/vendor/hyperframes/dist/runtimeVersion.js +18 -0
  273. package/vendor/hyperframes/dist/screenshotCapture-ECBTLCU6.js +179 -0
  274. package/vendor/hyperframes/dist/shaderTransitionWorker.js +44 -0
  275. package/vendor/hyperframes/dist/sherpa-KKLNW6U2.js +314 -0
  276. package/vendor/hyperframes/dist/sherpaWorker.js +77 -0
  277. package/vendor/hyperframes/dist/sites-TNVKZS73.js +52 -0
  278. package/vendor/hyperframes/dist/skill-ZHVLH7KX.js +15 -0
  279. package/vendor/hyperframes/dist/skills/hyperframes/SKILL.md +152 -0
  280. package/vendor/hyperframes/dist/skills/hyperframes/references/brief-contract.md +108 -0
  281. package/vendor/hyperframes/dist/skills/hyperframes/references/brief-format.md +72 -0
  282. package/vendor/hyperframes/dist/skills/hyperframes/references/capability-menu.md +47 -0
  283. package/vendor/hyperframes/dist/skills/hyperframes/references/frame-worker-core.md +80 -0
  284. package/vendor/hyperframes/dist/skills/hyperframes/references/intent-interview.md +73 -0
  285. package/vendor/hyperframes/dist/skills/hyperframes/references/pitch-round.md +40 -0
  286. package/vendor/hyperframes/dist/skills/hyperframes/references/plugin-installation.md +43 -0
  287. package/vendor/hyperframes/dist/skills/hyperframes/references/production-loop.md +26 -0
  288. package/vendor/hyperframes/dist/skills/hyperframes/references/review-loop.md +37 -0
  289. package/vendor/hyperframes/dist/skills/hyperframes/references/route-briefs.md +11 -0
  290. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/embedded-captions.md +11 -0
  291. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/faceless-explainer.md +12 -0
  292. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/general-video.md +12 -0
  293. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/motion-graphics.md +11 -0
  294. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/music-to-video.md +12 -0
  295. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/pr-to-video.md +28 -0
  296. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/product-launch-video.md +13 -0
  297. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/remotion-to-hyperframes.md +9 -0
  298. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/slideshow.md +11 -0
  299. package/vendor/hyperframes/dist/skills/hyperframes/references/routes/talking-head-recut.md +11 -0
  300. package/vendor/hyperframes/dist/skills/hyperframes/references/script-format.md +52 -0
  301. package/vendor/hyperframes/dist/skills/hyperframes/references/skill-lifecycle.md +35 -0
  302. package/vendor/hyperframes/dist/skills/hyperframes/references/storyboard-format.md +99 -0
  303. package/vendor/hyperframes/dist/skills/hyperframes/references/subagent-dispatch.md +35 -0
  304. package/vendor/hyperframes/dist/skills/hyperframes/references/workflow-catalog.md +10 -0
  305. package/vendor/hyperframes/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
  306. package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
  307. package/vendor/hyperframes/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
  308. package/vendor/hyperframes/dist/skills/hyperframes-cli/SKILL.md +189 -0
  309. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/beats.md +19 -0
  310. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloud.md +163 -0
  311. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/cloudrun.md +62 -0
  312. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/compare-and-batch.md +105 -0
  313. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/doctor-browser.md +57 -0
  314. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/init-and-scaffold.md +74 -0
  315. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lambda.md +185 -0
  316. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +132 -0
  317. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/preview-render.md +193 -0
  318. package/vendor/hyperframes/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +134 -0
  319. package/vendor/hyperframes/dist/skills/media-use/SKILL.md +100 -0
  320. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/CREDITS.md +35 -0
  321. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/chime.mp3 +0 -0
  322. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click-soft.mp3 +0 -0
  323. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/click.mp3 +0 -0
  324. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/error.mp3 +0 -0
  325. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-1.mp3 +0 -0
  326. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-2.mp3 +0 -0
  327. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/glitch-3.mp3 +0 -0
  328. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-1.mp3 +0 -0
  329. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/impact-bass-2.mp3 +0 -0
  330. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/key-press.mp3 +0 -0
  331. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/manifest.json +97 -0
  332. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/notification.mp3 +0 -0
  333. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/ping.mp3 +0 -0
  334. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/pop.mp3 +0 -0
  335. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/riser.mp3 +0 -0
  336. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/sparkle.mp3 +0 -0
  337. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/typing.mp3 +0 -0
  338. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-cinematic.mp3 +0 -0
  339. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh-short.mp3 +0 -0
  340. package/vendor/hyperframes/dist/skills/media-use/audio/assets/sfx/whoosh.mp3 +0 -0
  341. package/vendor/hyperframes/dist/skills/media-use/audio/references/bgm.md +76 -0
  342. package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/authoring.md +163 -0
  343. package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/motion.md +87 -0
  344. package/vendor/hyperframes/dist/skills/media-use/audio/references/captions/transcript-handling.md +97 -0
  345. package/vendor/hyperframes/dist/skills/media-use/audio/references/remove-background.md +143 -0
  346. package/vendor/hyperframes/dist/skills/media-use/audio/references/requirements.md +29 -0
  347. package/vendor/hyperframes/dist/skills/media-use/audio/references/sfx.md +42 -0
  348. package/vendor/hyperframes/dist/skills/media-use/audio/references/transcribe.md +52 -0
  349. package/vendor/hyperframes/dist/skills/media-use/audio/references/tts-to-captions.md +35 -0
  350. package/vendor/hyperframes/dist/skills/media-use/audio/references/tts.md +260 -0
  351. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.mjs +311 -0
  352. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/audio.test.mjs +159 -0
  353. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +131 -0
  354. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.mjs +122 -0
  355. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-tts.test.mjs +38 -0
  356. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.mjs +98 -0
  357. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/heygen-voice.test.mjs +233 -0
  358. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
  359. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
  360. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
  361. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.mjs +257 -0
  362. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/bgm.test.mjs +74 -0
  363. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.mjs +14 -0
  364. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/concurrency.test.mjs +41 -0
  365. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
  366. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
  367. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
  368. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
  369. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
  370. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
  371. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.mjs +197 -0
  372. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/heygen.test.mjs +185 -0
  373. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.mjs +114 -0
  374. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/media-record.test.mjs +205 -0
  375. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.mjs +77 -0
  376. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/python.test.mjs +136 -0
  377. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.mjs +165 -0
  378. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/sfx.test.mjs +121 -0
  379. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.mjs +389 -0
  380. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.spawn.test.mjs +158 -0
  381. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lib/tts.test.mjs +230 -0
  382. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/lyria-recipe.py +136 -0
  383. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.mjs +175 -0
  384. package/vendor/hyperframes/dist/skills/media-use/audio/scripts/wait-bgm.test.mjs +108 -0
  385. package/vendor/hyperframes/dist/skills/media-use/luts/README.md +28 -0
  386. package/vendor/hyperframes/dist/skills/media-use/luts/index.json +57 -0
  387. package/vendor/hyperframes/dist/skills/media-use/references/audio.md +20 -0
  388. package/vendor/hyperframes/dist/skills/media-use/references/grading.md +160 -0
  389. package/vendor/hyperframes/dist/skills/media-use/references/media-treatment-recipes.md +929 -0
  390. package/vendor/hyperframes/dist/skills/media-use/references/media-treatments.md +202 -0
  391. package/vendor/hyperframes/dist/skills/media-use/references/memory.md +37 -0
  392. package/vendor/hyperframes/dist/skills/media-use/references/meta.md +61 -0
  393. package/vendor/hyperframes/dist/skills/media-use/references/operations.md +327 -0
  394. package/vendor/hyperframes/dist/skills/media-use/references/resolve.md +150 -0
  395. package/vendor/hyperframes/dist/skills/media-use/references/setup-providers.md +80 -0
  396. package/vendor/hyperframes/dist/skills/media-use/references/telemetry-dashboard.md +49 -0
  397. package/vendor/hyperframes/dist/skills/media-use/scripts/audio-duck.mjs +113 -0
  398. package/vendor/hyperframes/dist/skills/media-use/scripts/compatibility.test.mjs +96 -0
  399. package/vendor/hyperframes/dist/skills/media-use/scripts/dither.mjs +328 -0
  400. package/vendor/hyperframes/dist/skills/media-use/scripts/dither.test.mjs +176 -0
  401. package/vendor/hyperframes/dist/skills/media-use/scripts/eval.mjs +369 -0
  402. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.mjs +128 -0
  403. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/adopt.test.mjs +95 -0
  404. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bgm-provider.mjs +20 -0
  405. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/brand-provider.mjs +59 -0
  406. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +119 -0
  407. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +139 -0
  408. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cache.mjs +148 -0
  409. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.mjs +91 -0
  410. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/candidates.test.mjs +155 -0
  411. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.mjs +161 -0
  412. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/codex-provider.test.mjs +34 -0
  413. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.d.mts +3 -0
  414. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.mjs +45 -0
  415. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/config-lock.test.mjs +79 -0
  416. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/coverage.test.mjs +136 -0
  417. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.mjs +181 -0
  418. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-build.test.mjs +80 -0
  419. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.mjs +198 -0
  420. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cube-validate.test.mjs +125 -0
  421. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.mjs +184 -0
  422. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/cutlist.test.mjs +162 -0
  423. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.mjs +95 -0
  424. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/duck.test.mjs +153 -0
  425. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.mjs +230 -0
  426. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/error-diffusion.test.mjs +102 -0
  427. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ff-binaries.mjs +37 -0
  428. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.mjs +72 -0
  429. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/freeze.test.mjs +138 -0
  430. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.mjs +265 -0
  431. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/grade-analyzer.test.mjs +285 -0
  432. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.mjs +191 -0
  433. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-cli.test.mjs +301 -0
  434. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.mjs +45 -0
  435. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-search.test.mjs +49 -0
  436. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.mjs +138 -0
  437. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +435 -0
  438. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/image-provider.mjs +44 -0
  439. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/index-gen.mjs +63 -0
  440. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-media-search.mjs +32 -0
  441. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.mjs +318 -0
  442. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-models.test.mjs +220 -0
  443. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.mjs +78 -0
  444. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/local-run.test.mjs +121 -0
  445. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.mjs +244 -0
  446. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/logo-provider.test.mjs +298 -0
  447. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.mjs +94 -0
  448. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +316 -0
  449. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.mjs +271 -0
  450. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +199 -0
  451. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.d.mts +19 -0
  452. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.mjs +279 -0
  453. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/manifest.test.mjs +397 -0
  454. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/match.mjs +47 -0
  455. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
  456. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-fetch.test.mjs +197 -0
  457. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.mjs +20 -0
  458. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-home.test.mjs +61 -0
  459. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.d.mts +9 -0
  460. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/media-search.mjs +107 -0
  461. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.mjs +128 -0
  462. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/mflux-provider.test.mjs +174 -0
  463. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.mjs +49 -0
  464. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/misses.test.mjs +89 -0
  465. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.mjs +31 -0
  466. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/npx-sync.test.mjs +50 -0
  467. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.mjs +27 -0
  468. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/parakeet-words.test.mjs +44 -0
  469. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.mjs +180 -0
  470. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/prefs-store.test.mjs +189 -0
  471. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.mjs +41 -0
  472. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/probe.test.mjs +148 -0
  473. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/providers.mjs +5 -0
  474. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.mjs +367 -0
  475. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/recipe-store.test.mjs +367 -0
  476. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.mjs +212 -0
  477. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/registry.test.mjs +262 -0
  478. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.mjs +24 -0
  479. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/search.test.mjs +32 -0
  480. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/sfx-provider.mjs +23 -0
  481. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.mjs +132 -0
  482. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/specs.test.mjs +157 -0
  483. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.mjs +117 -0
  484. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/stats.test.mjs +165 -0
  485. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/svg-sanitize.mjs +21 -0
  486. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.mjs +210 -0
  487. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/telemetry.test.mjs +437 -0
  488. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/test-home.test.mjs +10 -0
  489. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
  490. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/transcriptCutFade.test.mjs +33 -0
  491. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.mjs +94 -0
  492. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/tts-local-provider.test.mjs +72 -0
  493. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.mjs +57 -0
  494. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/usage.test.mjs +54 -0
  495. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.mjs +57 -0
  496. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/voice-provider.test.mjs +46 -0
  497. package/vendor/hyperframes/dist/skills/media-use/scripts/lib/words.mjs +18 -0
  498. package/vendor/hyperframes/dist/skills/media-use/scripts/prefs.mjs +70 -0
  499. package/vendor/hyperframes/dist/skills/media-use/scripts/recipe.mjs +103 -0
  500. package/vendor/hyperframes/dist/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
  501. package/vendor/hyperframes/dist/skills/media-use/scripts/resolve.mjs +1369 -0
  502. package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.mjs +194 -0
  503. package/vendor/hyperframes/dist/skills/media-use/scripts/transcribe.test.mjs +112 -0
  504. package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.mjs +270 -0
  505. package/vendor/hyperframes/dist/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
  506. package/vendor/hyperframes/dist/skills-MJ2J4GEM.js +808 -0
  507. package/vendor/hyperframes/dist/skillsUpdateCheck-TKTYQN5R.js +26 -0
  508. package/vendor/hyperframes/dist/slideshow-EJ4IMY6P.js +24 -0
  509. package/vendor/hyperframes/dist/snapshot-KIVDUUMN.js +875 -0
  510. package/vendor/hyperframes/dist/src-6YQBJGWR.js +202 -0
  511. package/vendor/hyperframes/dist/src-PVYUYV3M.js +471 -0
  512. package/vendor/hyperframes/dist/state-KAXGHF77.js +26 -0
  513. package/vendor/hyperframes/dist/staticProjectServer-7EU666GS.js +49 -0
  514. package/vendor/hyperframes/dist/status-YM52BQ6S.js +311 -0
  515. package/vendor/hyperframes/dist/studio/assets/hyperframes-player-Cp8e_Zst.js +473 -0
  516. package/vendor/hyperframes/dist/studio/assets/index-BX3KHhGX.js +71 -0
  517. package/vendor/hyperframes/dist/studio/assets/index-CASEBNy2.js +1 -0
  518. package/vendor/hyperframes/dist/studio/assets/index-D11atkBt.css +1 -0
  519. package/vendor/hyperframes/dist/studio/assets/index-DMTt9nTf.js +531 -0
  520. package/vendor/hyperframes/dist/studio/assets/index-oE1pOdAy.js +399 -0
  521. package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js +948 -0
  522. package/vendor/hyperframes/dist/studio/chunk-5VSXRGIX.js.map +1 -0
  523. package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js +938 -0
  524. package/vendor/hyperframes/dist/studio/chunk-7UQWVN52.js.map +1 -0
  525. package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js +190 -0
  526. package/vendor/hyperframes/dist/studio/chunk-EEXSYY5F.js.map +1 -0
  527. package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js +1441 -0
  528. package/vendor/hyperframes/dist/studio/chunk-FOEID72M.js.map +1 -0
  529. package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js +10 -0
  530. package/vendor/hyperframes/dist/studio/chunk-PZ5AY32C.js.map +1 -0
  531. package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js +1103 -0
  532. package/vendor/hyperframes/dist/studio/chunk-TDWGXBUT.js.map +1 -0
  533. package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js +47 -0
  534. package/vendor/hyperframes/dist/studio/domEditingLayers-IEVLO54Z.js.map +1 -0
  535. package/vendor/hyperframes/dist/studio/favicon.svg +14 -0
  536. package/vendor/hyperframes/dist/studio/icons/timeline/audio.svg +7 -0
  537. package/vendor/hyperframes/dist/studio/icons/timeline/captions.svg +5 -0
  538. package/vendor/hyperframes/dist/studio/icons/timeline/composition.svg +12 -0
  539. package/vendor/hyperframes/dist/studio/icons/timeline/image.svg +18 -0
  540. package/vendor/hyperframes/dist/studio/icons/timeline/music.svg +10 -0
  541. package/vendor/hyperframes/dist/studio/icons/timeline/text.svg +3 -0
  542. package/vendor/hyperframes/dist/studio/index.css +165 -0
  543. package/vendor/hyperframes/dist/studio/index.css.map +1 -0
  544. package/vendor/hyperframes/dist/studio/index.d.ts +4296 -0
  545. package/vendor/hyperframes/dist/studio/index.html +23 -0
  546. package/vendor/hyperframes/dist/studio/index.js +99693 -0
  547. package/vendor/hyperframes/dist/studio/index.js.map +1 -0
  548. package/vendor/hyperframes/dist/studio/player.d.ts +30 -0
  549. package/vendor/hyperframes/dist/studio/player.js +10 -0
  550. package/vendor/hyperframes/dist/studio/player.js.map +1 -0
  551. package/vendor/hyperframes/dist/studio/styles/tailwind-preset.d.ts +39 -0
  552. package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js +50 -0
  553. package/vendor/hyperframes/dist/studio/styles/tailwind-preset.js.map +1 -0
  554. package/vendor/hyperframes/dist/studio/styles.css +1 -0
  555. package/vendor/hyperframes/dist/studio/ui.d.ts +296 -0
  556. package/vendor/hyperframes/dist/studio/ui.js +66 -0
  557. package/vendor/hyperframes/dist/studio/ui.js.map +1 -0
  558. package/vendor/hyperframes/dist/studio-api-PNQZRPX5.js +136 -0
  559. package/vendor/hyperframes/dist/studioSelectionClient-IUUPKUHZ.js +25 -0
  560. package/vendor/hyperframes/dist/studioServer-UWRBPIOJ.js +1457 -0
  561. package/vendor/hyperframes/dist/synthesize-K62TIZWI.js +182 -0
  562. package/vendor/hyperframes/dist/system-EZYZNUFD.js +44 -0
  563. package/vendor/hyperframes/dist/telemetry-2YC4SGQU.js +144 -0
  564. package/vendor/hyperframes/dist/telemetry-QMYM4WME.js +95 -0
  565. package/vendor/hyperframes/dist/templates/_shared/AGENTS.md +107 -0
  566. package/vendor/hyperframes/dist/templates/_shared/CLAUDE.md +107 -0
  567. package/vendor/hyperframes/dist/templates/blank/index.html +55 -0
  568. package/vendor/hyperframes/dist/templates/from-file/index.html +75 -0
  569. package/vendor/hyperframes/dist/templates/warm-grain/compositions/captions.html +154 -0
  570. package/vendor/hyperframes/dist/templates/warm-grain/compositions/graphics.html +162 -0
  571. package/vendor/hyperframes/dist/templates/warm-grain/compositions/intro.html +87 -0
  572. package/vendor/hyperframes/dist/templates/warm-grain/index.html +264 -0
  573. package/vendor/hyperframes/dist/templates/warm-grain/registry-item.json +34 -0
  574. package/vendor/hyperframes/dist/timeline-77Z3BBQM.js +1377 -0
  575. package/vendor/hyperframes/dist/tokens-OBGTYE4Z.js +92 -0
  576. package/vendor/hyperframes/dist/transcribe-7NVFHCGA.js +387 -0
  577. package/vendor/hyperframes/dist/transcribe-BNSJRR4M.js +62 -0
  578. package/vendor/hyperframes/dist/tts-P3LIPIL5.js +234 -0
  579. package/vendor/hyperframes/dist/updateCheck-UDWIJ4ZQ.js +39 -0
  580. package/vendor/hyperframes/dist/upgrade-CT3CPO3E.js +231 -0
  581. package/vendor/hyperframes/dist/urlDownloader-H6WRI2UE.js +39 -0
  582. package/vendor/hyperframes/dist/usage-EC3KFUIJ.js +2139 -0
  583. package/vendor/hyperframes/dist/validate-65QDZJWZ.js +70 -0
  584. package/vendor/hyperframes/dist/video-FGSGKRSV.js +261 -0
  585. package/vendor/hyperframes/dist/workspaceBuildCheck-TOLGAI4T.js +133 -0
  586. package/vendor/hyperframes/package.json +80 -0
@@ -0,0 +1,257 @@
1
+ // bgm.mjs — background music for the media audio engine. Two routes, gated the
2
+ // same way as TTS/SFX:
3
+ //
4
+ // retrieve (default when HeyGen is configured) — search HeyGen's music library
5
+ // by mood, download the top track. Synchronous. assets/bgm/track.mp3.
6
+ // generate (the alternative; the automatic choice when HeyGen is absent) —
7
+ // Lyria (cloud, $GEMINI_API_KEY/$GOOGLE_API_KEY + google-genai) preferred,
8
+ // else local MusicGen (facebook/musicgen-small via transformers). Spawned
9
+ // DETACHED so the engine can return while audio renders; the caller marks
10
+ // bgm_pending and runs wait-bgm.mjs before assembling. assets/bgm/track.wav.
11
+ //
12
+ // Missing/failed BGM never blocks a render.
13
+
14
+ import { spawn, spawnSync } from "node:child_process";
15
+ import { existsSync, mkdirSync, openSync, closeSync, rmSync } from "node:fs";
16
+ import { join } from "node:path";
17
+ import { downloadTo, searchSounds } from "./heygen.mjs";
18
+ import { agentWritePath } from "./media-record.mjs";
19
+ import { pythonInvocation } from "./python.mjs";
20
+
21
+ const r3 = (x) => Number(x.toFixed(3));
22
+ const lyriaKey = () => process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY || "";
23
+
24
+ import { bgmDefaultVolume } from "./bgm-volume.mjs";
25
+ export { BGM_BED_VOLUME, BGM_SILENT_VOLUME, bgmDefaultVolume } from "./bgm-volume.mjs";
26
+
27
+ const BGM_PY_DEPS = ["transformers", "torch", "soundfile", "numpy"];
28
+ const BGM_PY_PROBE =
29
+ "import transformers, soundfile, torch, numpy; from transformers import MusicgenForConditionalGeneration";
30
+ const LYRIA_PY_DEPS = ["google-genai", "python-dotenv"];
31
+ const LYRIA_PY_PROBE = "import google.genai";
32
+
33
+ function pyOk(probe) {
34
+ const { cmd, args } = pythonInvocation(["-c", probe]);
35
+ return spawnSync(cmd, args, { stdio: "ignore" }).status === 0;
36
+ }
37
+ // `python -m pip`, not a bare `pip` binary: a Homebrew/system Python often
38
+ // exposes only `python3`/`pip3` on PATH, so a plain `pip` spawn silently
39
+ // no-ops (ENOENT) and the documented "auto-installed on demand" path never
40
+ // actually installs. `-m pip` also guarantees the packages land in the SAME
41
+ // interpreter pyOk() probes — a bare `pip`/`pip3` could resolve to a
42
+ // different Python installation than `python3` if more than one is on PATH.
43
+ function pipInstall(deps) {
44
+ const { cmd, args } = pythonInvocation(["-m", "pip", "install", "-q", ...deps]);
45
+ return spawnSync(cmd, args, { stdio: "ignore" }).status === 0;
46
+ }
47
+
48
+ // ── retrieval (HeyGen music library) ──────────────────────────────────────────
49
+ export async function retrieveBgm({ query, headers, hyperframesDir, hasVoice, anomalies }) {
50
+ const q = query || "calm cinematic underscore";
51
+ const results = await searchSounds(q, "music", headers, { limit: 5 });
52
+ if (!results.length) return null;
53
+ const top = results[0];
54
+ const rel = agentWritePath(hyperframesDir, "assets/bgm/track.mp3", { anomalies });
55
+ await downloadTo(top.audio_url, join(hyperframesDir, rel));
56
+ return {
57
+ path: rel,
58
+ volume: bgmDefaultVolume(hasVoice),
59
+ query: q,
60
+ mode: "retrieve",
61
+ duration_s: typeof top.duration === "number" ? r3(top.duration) : null,
62
+ };
63
+ }
64
+
65
+ // ── mood inference (for the generate path's prompt) ──────────────────────────
66
+ // Industry base → archetype shape → emotional-arc tiebreaker. Exported so a
67
+ // workflow adapter can build a rich prompt from its own narrative metadata; the
68
+ // engine also calls it when generate has only a plain mood query.
69
+ export function inferBgmPrompt({ blob = "", archetype = "", arc = "", userPrompt = "" } = {}) {
70
+ if (userPrompt) return userPrompt;
71
+ const b = String(blob).toLowerCase();
72
+ let base;
73
+ let bpm;
74
+ if (/\b(crypto|nft|web3|defi|token|blockchain|exchange|wallet|dao)\b/.test(b)) {
75
+ base = "atmospheric electronic, deep bass, futuristic synths, restrained percussion";
76
+ bpm = 100;
77
+ } else if (/\b(finance|fintech|bank|payment|invest|wealth|insurance|treasury)\b/.test(b)) {
78
+ base = "calm cinematic, soft strings, subtle piano, restrained percussion";
79
+ bpm = 92;
80
+ } else if (/\b(creative|agency|design|studio|art|brand|marketing|content)\b/.test(b)) {
81
+ base = "playful electronic, warm pads, light percussion";
82
+ bpm = 115;
83
+ } else {
84
+ base = "uplifting corporate tech, bright modern piano with synth pads";
85
+ bpm = 108;
86
+ }
87
+ const at = String(archetype).toLowerCase();
88
+ const ar = String(arc).toLowerCase();
89
+ if (/\bpas\b|pain.agitate|pain.+solve/.test(at))
90
+ return `${base}, starts with subtle tension then builds to resolution, BPM ${bpm}, transitions from MINOR to MAJOR`;
91
+ if (/\bbab\b|before.after|future.pac|vision/.test(at))
92
+ return `${base}, cinematic and aspirational, steady build with rising energy, BPM ${bpm}, MAJOR`;
93
+ if (/cascade|feature.benefit/.test(at))
94
+ return `${base}, energetic and driving, consistent momentum, BPM ${Math.min(bpm + 10, 128)}, MAJOR`;
95
+ if (/demo.loop|question.+answer/.test(at))
96
+ return `${base}, clean and focused, minimal arrangement, BPM ${Math.max(bpm - 8, 88)}`;
97
+ if (/frustrat|anxiety|overwhelm|tension/.test(ar) && /relief|excite|triumph/.test(ar))
98
+ return `${base}, builds from understated tension to uplifting resolution, BPM ${bpm}, MINOR to MAJOR`;
99
+ if (/excit|awe|power|triumph/.test(ar))
100
+ return `${base}, energetic and confident, BPM ${bpm}, MAJOR`;
101
+ if (/trust|ease|clarity|reassur/.test(ar))
102
+ return `${base}, warm and reassuring, BPM ${Math.max(bpm - 5, 85)}`;
103
+ return `${base}, BPM ${bpm}, MAJOR`;
104
+ }
105
+
106
+ // ── generation (Lyria → MusicGen, detached) ──────────────────────────────────
107
+ // Returns a bgmMeta the caller folds into audio_meta:
108
+ // { path, mode, volume, provider, pid, log, target_duration_s, seed_duration_s,
109
+ // loop_count, pending:true } on success, or { disabled:true, reason }.
110
+ export function generateBgmDetached({
111
+ prompt,
112
+ durationS,
113
+ hyperframesDir,
114
+ lyriaRecipe,
115
+ seedSeconds = 28,
116
+ hasVoice,
117
+ anomalies,
118
+ }) {
119
+ const rel = agentWritePath(hyperframesDir, "assets/bgm/track.wav", { anomalies });
120
+ const abs = join(hyperframesDir, rel);
121
+ mkdirSync(join(hyperframesDir, "assets", "bgm"), { recursive: true });
122
+ const log = join(hyperframesDir, "assets", "bgm", `bgm-${Date.now()}.log`);
123
+ const targetS = Math.max(1, durationS);
124
+ const baseMeta = { path: rel, mode: null, volume: bgmDefaultVolume(hasVoice), pending: true };
125
+
126
+ const lyriaConfigured = !!lyriaKey() && !!lyriaRecipe && existsSync(lyriaRecipe);
127
+
128
+ // Make a backend runnable: prefer Lyria when configured (install google-genai
129
+ // on demand), else ensure local MusicGen deps. Installs are synchronous here —
130
+ // generation itself is detached, so the engine still returns promptly.
131
+ if (lyriaConfigured && !pyOk(LYRIA_PY_PROBE)) pipInstall(LYRIA_PY_DEPS);
132
+ const useLyria = lyriaConfigured && pyOk(LYRIA_PY_PROBE);
133
+ if (!useLyria && !pyOk(BGM_PY_PROBE)) pipInstall(BGM_PY_DEPS);
134
+
135
+ const fd = openSync(log, "w");
136
+ if (useLyria) {
137
+ const { cmd, args } = pythonInvocation([
138
+ lyriaRecipe,
139
+ "--output",
140
+ abs,
141
+ "--duration",
142
+ String(targetS),
143
+ "--prompt",
144
+ prompt,
145
+ ]);
146
+ rmSync(abs, { force: true }); // wait-bgm takes any file here as the finished track
147
+ const proc = spawn(cmd, args, { detached: true, stdio: ["ignore", fd, fd] });
148
+ proc.unref();
149
+ closeSync(fd);
150
+ return {
151
+ ...baseMeta,
152
+ mode: "detached-single",
153
+ provider: "lyria",
154
+ pid: proc.pid,
155
+ log,
156
+ target_duration_s: r3(targetS),
157
+ };
158
+ }
159
+
160
+ if (pyOk(BGM_PY_PROBE)) {
161
+ const seedS = Math.min(Math.max(seedSeconds, 10), 30);
162
+ const loops = targetS > seedS ? Math.ceil(targetS / seedS) : 1;
163
+ const script = musicgenScript({ prompt, abs, targetS, seedS });
164
+ const { cmd, args } = pythonInvocation(["-c", script]);
165
+ rmSync(abs, { force: true });
166
+ const proc = spawn(cmd, args, { detached: true, stdio: ["ignore", fd, fd] });
167
+ proc.unref();
168
+ closeSync(fd);
169
+ return {
170
+ ...baseMeta,
171
+ mode: targetS > seedS ? "detached-seed-loop" : "detached-seed-trim",
172
+ provider: "musicgen",
173
+ pid: proc.pid,
174
+ log,
175
+ target_duration_s: r3(targetS),
176
+ seed_duration_s: seedS,
177
+ loop_count: loops,
178
+ };
179
+ }
180
+
181
+ closeSync(fd);
182
+ return {
183
+ disabled: true,
184
+ reason: lyriaConfigured
185
+ ? `Lyria configured but google-genai uninstallable, and local MusicGen unavailable (pip install ${BGM_PY_DEPS.join(" ")})`
186
+ : `no Lyria key/recipe and local MusicGen deps unavailable (pip install ${BGM_PY_DEPS.join(" ")})`,
187
+ };
188
+ }
189
+
190
+ // Inline MusicGen: generate ONE seed clip (≤30s to stay under the decoder's
191
+ // positional limit), then trim it down or crossfade-loop it up to the target.
192
+ function musicgenScript({ prompt, abs, targetS, seedS }) {
193
+ return `
194
+ import math, os, sys, traceback
195
+ from pathlib import Path
196
+ import numpy as np
197
+ import soundfile as sf
198
+ from transformers import MusicgenForConditionalGeneration, AutoProcessor
199
+
200
+ prompt = ${JSON.stringify(prompt)}
201
+ out_path = ${JSON.stringify(abs)}
202
+ target_s = float(${targetS.toFixed(3)})
203
+ seed_s = float(${seedS.toFixed(3)})
204
+ token_rate = 50
205
+ crossfade_s = 0.3
206
+
207
+ def apply_fade(arr, sr, fade_in_s=0.08, fade_out_s=0.5):
208
+ n_in = min(int(round(fade_in_s * sr)), arr.shape[0] // 2)
209
+ n_out = min(int(round(fade_out_s * sr)), arr.shape[0] // 2)
210
+ if n_in > 1: arr[:n_in] *= np.linspace(0.0, 1.0, n_in, dtype="float32")
211
+ if n_out > 1: arr[-n_out:] *= np.linspace(1.0, 0.0, n_out, dtype="float32")
212
+ return arr
213
+
214
+ def loop_crossfade(seed, target_len, xf):
215
+ if seed.shape[0] >= target_len: return seed[:target_len]
216
+ xf = min(xf, seed.shape[0] // 2)
217
+ if xf < 1:
218
+ reps = int(math.ceil(target_len / seed.shape[0]))
219
+ return np.tile(seed, reps)[:target_len]
220
+ t = np.linspace(0.0, 1.0, xf, dtype="float32")
221
+ fade_out = np.cos(t * (math.pi / 2)); fade_in = np.sin(t * (math.pi / 2))
222
+ out = seed.copy()
223
+ while out.shape[0] < target_len:
224
+ tail = out[-xf:] * fade_out; head = seed[:xf] * fade_in
225
+ out = np.concatenate([out[:-xf], tail + head, seed[xf:]])
226
+ return out[:target_len]
227
+
228
+ try:
229
+ Path(os.path.dirname(out_path)).mkdir(parents=True, exist_ok=True)
230
+ processor = AutoProcessor.from_pretrained("facebook/musicgen-small")
231
+ model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-small")
232
+ model.eval()
233
+ sr = int(model.config.audio_encoder.sampling_rate)
234
+ gen_s = min(seed_s, target_s)
235
+ tokens = max(1, int(math.ceil(gen_s * token_rate)))
236
+ print(f"[musicgen] seed dur={gen_s:.2f}s tokens={tokens}", flush=True)
237
+ inputs = processor(text=[prompt], padding=True, return_tensors="pt")
238
+ audio = model.generate(**inputs, max_new_tokens=tokens)
239
+ seed = audio[0, 0].detach().cpu().numpy().astype("float32")
240
+ peak = float(np.max(np.abs(seed)))
241
+ if peak > 1e-6: seed = seed * (0.89 / peak)
242
+ want = max(1, int(round(target_s * sr)))
243
+ if seed.shape[0] >= want:
244
+ final = seed[:want].copy()
245
+ else:
246
+ final = loop_crossfade(seed, want, int(round(crossfade_s * sr)))
247
+ if final.shape[0] < want: final = np.pad(final, (0, want - final.shape[0]))
248
+ else: final = final[:want]
249
+ final = apply_fade(final, sr)
250
+ peak = float(np.max(np.abs(final)))
251
+ if peak > 1.0: final = final / peak
252
+ sf.write(out_path, final, sr)
253
+ print(f"[musicgen] wrote {out_path} samples={final.shape[0]} sr={sr}", flush=True)
254
+ except Exception:
255
+ traceback.print_exc(); sys.exit(1)
256
+ `;
257
+ }
@@ -0,0 +1,74 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { existsSync, mkdirSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { appendRecord } from "../../../scripts/lib/manifest.mjs";
7
+ import {
8
+ BGM_BED_VOLUME,
9
+ BGM_SILENT_VOLUME,
10
+ bgmDefaultVolume,
11
+ generateBgmDetached,
12
+ } from "./bgm.mjs";
13
+
14
+ // Regression: narrated pipelines used to ship BGM at 0.8 (≈ -2 dB), ~16 dB
15
+ // hotter than a music bed under a voice should be. The default under narration
16
+ // must be a proper bed (≈ -18 dB); a silent film keeps the louder default.
17
+
18
+ const dbfs = (linear) => 20 * Math.log10(linear);
19
+
20
+ test("BGM under narration is a bed near -18 dB", () => {
21
+ assert.equal(bgmDefaultVolume(true), BGM_BED_VOLUME);
22
+ assert.equal(BGM_BED_VOLUME, 0.12);
23
+ const db = dbfs(BGM_BED_VOLUME);
24
+ assert.ok(db < -17 && db > -19, `bed should be ≈ -18 dB, got ${db.toFixed(1)} dB`);
25
+ });
26
+
27
+ test("a silent film (no voice) keeps BGM forward", () => {
28
+ assert.equal(bgmDefaultVolume(false), BGM_SILENT_VOLUME);
29
+ assert.equal(BGM_SILENT_VOLUME, 0.9);
30
+ });
31
+
32
+ test("the narrated default is well below the voice (≈ 0 dBFS)", () => {
33
+ // Voice sits at data-volume="1" (0 dBFS); the bed must be ~16+ dB under it.
34
+ const separation = dbfs(1) - dbfs(bgmDefaultVolume(true));
35
+ assert.ok(
36
+ separation >= 16,
37
+ `bed should sit ≥16 dB under the voice, got ${separation.toFixed(1)} dB`,
38
+ );
39
+ });
40
+
41
+ test(
42
+ "generating music again clears the engine's old track, so waiting cannot mistake it for the new one",
43
+ { skip: process.platform === "win32" && "the fake python is a shell script" },
44
+ (t) => {
45
+ const dir = mkdtempSync(join(tmpdir(), "hf-bgm-"));
46
+ const path = process.env.PATH;
47
+ t.after(() => {
48
+ process.env.PATH = path;
49
+ rmSync(dir, { recursive: true, force: true });
50
+ });
51
+ mkdirSync(join(dir, "bin"));
52
+ for (const name of ["python3", "python"])
53
+ writeFileSync(join(dir, "bin", name), "#!/bin/sh\nexit 0\n", { mode: 0o755 });
54
+ process.env.PATH = `${join(dir, "bin")}:${path}`;
55
+ mkdirSync(join(dir, "assets/bgm"), { recursive: true });
56
+ writeFileSync(join(dir, "assets/bgm/track.wav"), "last run's track");
57
+ appendRecord(dir, {
58
+ id: "bgm_001",
59
+ type: "bgm",
60
+ path: "assets/bgm/track.wav",
61
+ source: "generated",
62
+ });
63
+
64
+ const gen = generateBgmDetached({
65
+ prompt: "calm",
66
+ durationS: 5,
67
+ hyperframesDir: dir,
68
+ anomalies: [],
69
+ });
70
+
71
+ assert.equal(gen.path, "assets/bgm/track.wav");
72
+ assert.equal(existsSync(join(dir, "assets/bgm/track.wav")), false);
73
+ },
74
+ );
@@ -0,0 +1,14 @@
1
+ // mapWithConcurrency — run `fn` over `items` with at most `limit` in flight at
2
+ // once. Preserves input order in the result array regardless of completion order.
3
+ export async function mapWithConcurrency(items, limit, fn) {
4
+ const results = new Array(items.length);
5
+ let next = 0;
6
+ async function worker() {
7
+ while (next < items.length) {
8
+ const i = next++;
9
+ results[i] = await fn(items[i], i);
10
+ }
11
+ }
12
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, worker));
13
+ return results;
14
+ }
@@ -0,0 +1,41 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { mapWithConcurrency } from "./concurrency.mjs";
4
+
5
+ // Regression: audio.mjs used a bare Promise.all(lines.map(synthLine)) to
6
+ // synthesize every TTS line at once, spawning one Kokoro/whisper model load
7
+ // per line concurrently. Two independent reports of this overwhelming a
8
+ // machine (OOM, and cold-start contention causing spurious failures).
9
+ // mapWithConcurrency is the extracted cap; test it in isolation since
10
+ // audio.mjs itself is a script (runs CLI/exit side effects on import).
11
+ test("processes every item and preserves input order regardless of completion order", async () => {
12
+ const order = [5, 1, 3, 2, 4];
13
+ const results = await mapWithConcurrency(order, 2, async (n) => {
14
+ await new Promise((r) => setTimeout(r, n));
15
+ return n * 10;
16
+ });
17
+ assert.deepEqual(results, [50, 10, 30, 20, 40]);
18
+ });
19
+
20
+ test("never runs more than `limit` at once", async () => {
21
+ let inFlight = 0;
22
+ let maxInFlight = 0;
23
+ const items = Array.from({ length: 10 }, (_, i) => i);
24
+ await mapWithConcurrency(items, 3, async () => {
25
+ inFlight++;
26
+ maxInFlight = Math.max(maxInFlight, inFlight);
27
+ await new Promise((r) => setTimeout(r, 5));
28
+ inFlight--;
29
+ });
30
+ assert.equal(maxInFlight, 3);
31
+ });
32
+
33
+ test("limit larger than the item count runs everything without hanging", async () => {
34
+ const results = await mapWithConcurrency([1, 2], 10, async (n) => n * 2);
35
+ assert.deepEqual(results, [2, 4]);
36
+ });
37
+
38
+ test("empty input resolves to an empty array", async () => {
39
+ const results = await mapWithConcurrency([], 4, async (n) => n);
40
+ assert.deepEqual(results, []);
41
+ });
@@ -0,0 +1,43 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { pythonInvocation } from "./python.mjs";
4
+
5
+ export function geminiConfigured() {
6
+ return Boolean(
7
+ process.env.GEMINI_API_KEY ||
8
+ process.env.GOOGLE_API_KEY ||
9
+ process.env.GOOGLE_APPLICATION_CREDENTIALS ||
10
+ process.env.GCS_CREDS,
11
+ );
12
+ }
13
+
14
+ export function geminiAuth({ run = spawnSync } = {}) {
15
+ const key = process.env.GEMINI_API_KEY || process.env.GOOGLE_API_KEY;
16
+ if (key) return { headers: { "x-goog-api-key": key }, secret: key };
17
+ if (!geminiConfigured()) {
18
+ throw new Error(
19
+ "Gemini TTS needs GEMINI_API_KEY or GOOGLE_API_KEY, or service-account credentials (GOOGLE_APPLICATION_CREDENTIALS or GCS_CREDS)",
20
+ );
21
+ }
22
+ const { cmd, args } = pythonInvocation([
23
+ fileURLToPath(new URL("./gemini-auth.py", import.meta.url)),
24
+ ]);
25
+ const result = run(cmd, args, { encoding: "utf8", timeout: 60_000, maxBuffer: 1024 * 1024 });
26
+ let data;
27
+ try {
28
+ data = JSON.parse(result.stdout);
29
+ } catch {
30
+ throw new Error(
31
+ "Gemini service-account authentication failed; check Python and install google-auth requests",
32
+ );
33
+ }
34
+ if (result.status !== 0 || !data.token) {
35
+ // Do not echo subprocess output: it could contain credentials.
36
+ throw new Error(
37
+ "Gemini service-account authentication failed; check service-account JSON, permissions, and Python packages google-auth requests",
38
+ );
39
+ }
40
+ const headers = { Authorization: `Bearer ${data.token}` };
41
+ if (data.project) headers["x-goog-user-project"] = data.project;
42
+ return { headers, secret: data.token };
43
+ }
@@ -0,0 +1,52 @@
1
+ """Obtain Gemini OAuth headers without persisting credentials or tokens."""
2
+
3
+ import json
4
+ import os
5
+ import sys
6
+
7
+ # Keep the credential subprocess protocol UTF-8 on every platform.
8
+ for _stream in (sys.stdout, sys.stderr):
9
+ if hasattr(_stream, "reconfigure"):
10
+ _stream.reconfigure(encoding="utf-8", errors=_stream.errors)
11
+
12
+
13
+ def authenticate():
14
+ try:
15
+ from google.auth.transport.requests import Request
16
+ from google.oauth2 import service_account
17
+ except ImportError:
18
+ return {"error": "Service-account auth needs Python packages: pip install google-auth requests"}
19
+
20
+ try:
21
+ path = os.environ.get("GOOGLE_APPLICATION_CREDENTIALS")
22
+ if path:
23
+ with open(path, encoding="utf-8") as source:
24
+ info = json.load(source)
25
+ else:
26
+ info = json.loads(os.environ["GCS_CREDS"])
27
+ if info.get("type") != "service_account":
28
+ return {"error": "Gemini requires service-account JSON, not user ADC credentials"}
29
+ # Only exchange credentials with Google's OAuth server.
30
+ info["token_uri"] = "https://oauth2.googleapis.com/token"
31
+ credentials = service_account.Credentials.from_service_account_info(
32
+ info,
33
+ scopes=[
34
+ "https://www.googleapis.com/auth/generative-language.retriever",
35
+ ],
36
+ )
37
+ credentials.refresh(Request())
38
+ project = (
39
+ os.environ.get("GOOGLE_CLOUD_PROJECT")
40
+ or os.environ.get("GCLOUD_PROJECT_ID")
41
+ or info.get("project_id")
42
+ )
43
+ return {"token": credentials.token, "project": project}
44
+ except Exception:
45
+ # Library exceptions can contain credential data. Never forward them.
46
+ return {"error": "Gemini service-account authentication failed; check credentials, permissions, and network access"}
47
+
48
+
49
+ if __name__ == "__main__":
50
+ result = authenticate()
51
+ print(json.dumps(result))
52
+ sys.exit(1 if "error" in result else 0)
@@ -0,0 +1,86 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ import { pythonInvocation } from "./python.mjs";
4
+ import { test } from "node:test";
5
+ import assert from "node:assert/strict";
6
+ import { geminiAuth, geminiConfigured } from "./gemini-auth.mjs";
7
+ import { pickProvider } from "./tts.mjs";
8
+
9
+ function env(t) {
10
+ const saved = { ...process.env };
11
+ for (const key of [
12
+ "GEMINI_API_KEY",
13
+ "GOOGLE_API_KEY",
14
+ "GOOGLE_APPLICATION_CREDENTIALS",
15
+ "GCS_CREDS",
16
+ ])
17
+ delete process.env[key];
18
+ t.after(() => {
19
+ process.env = saved;
20
+ });
21
+ }
22
+
23
+ test("API keys take precedence over service accounts without invoking Python", (t) => {
24
+ env(t);
25
+ process.env.GEMINI_API_KEY = "gemini-key";
26
+ process.env.GOOGLE_API_KEY = "google-key";
27
+ process.env.GCS_CREDS = "private-json";
28
+ const run = () => assert.fail("must not spawn Python");
29
+ assert.deepEqual(geminiAuth({ run }).headers, { "x-goog-api-key": "gemini-key" });
30
+ delete process.env.GEMINI_API_KEY;
31
+ assert.deepEqual(geminiAuth({ run }).headers, { "x-goog-api-key": "google-key" });
32
+ });
33
+
34
+ test("service-account configuration selects Gemini and returns scoped helper headers", (t) => {
35
+ env(t);
36
+ assert.equal(geminiConfigured(), false);
37
+ assert.throws(() => geminiAuth(), /needs GEMINI_API_KEY/);
38
+ for (const key of ["GOOGLE_APPLICATION_CREDENTIALS", "GCS_CREDS"]) {
39
+ process.env[key] = "credential-source";
40
+ assert.equal(pickProvider("gemini"), "gemini");
41
+ const auth = geminiAuth({
42
+ run: (_, args, options) => {
43
+ assert.ok(args.at(-1).endsWith("gemini-auth.py"));
44
+ assert.ok(!args.includes("credential-source"));
45
+ assert.equal(options.timeout, 60000);
46
+ return {
47
+ status: 0,
48
+ stdout: JSON.stringify({ token: "access-token", project: "quota-project" }),
49
+ };
50
+ },
51
+ });
52
+ assert.deepEqual(auth.headers, {
53
+ Authorization: "Bearer access-token",
54
+ "x-goog-user-project": "quota-project",
55
+ });
56
+ delete process.env[key];
57
+ }
58
+ });
59
+
60
+ test("failed, malformed, or missing Python output cannot leak secrets or fall back", (t) => {
61
+ env(t);
62
+ process.env.GCS_CREDS = "private-json";
63
+ for (const result of [
64
+ { status: 1, stdout: '{"error":"private-json"}', stderr: "private-json" },
65
+ { status: null, stdout: "private-json", error: new Error("private-json") },
66
+ { status: 0, stdout: "{}" },
67
+ ]) {
68
+ assert.throws(
69
+ () => geminiAuth({ run: () => result }),
70
+ (error) => {
71
+ assert.match(error.message, /authentication failed/);
72
+ assert.ok(!error.message.includes("private-json"));
73
+ return true;
74
+ },
75
+ );
76
+ }
77
+ });
78
+
79
+ // Keep the Python credential-boundary suite reachable from the normal Node CI runner.
80
+ test("Python service-account boundary validates credentials, scope, transport and errors", () => {
81
+ const { cmd, args } = pythonInvocation([
82
+ fileURLToPath(new URL("./gemini-auth_test.py", import.meta.url)),
83
+ ]);
84
+ const result = spawnSync(cmd, args, { encoding: "utf8", timeout: 30_000 });
85
+ assert.equal(result.status, 0, result.stderr || result.error?.message);
86
+ });
@@ -0,0 +1,90 @@
1
+ """Credential-boundary tests; stub Google's transport, never use real secrets."""
2
+
3
+ import importlib.util
4
+ import json
5
+ import os
6
+ import sys
7
+ from pathlib import Path
8
+ import tempfile
9
+ import types
10
+ import unittest
11
+ from unittest.mock import Mock, patch
12
+
13
+
14
+ # Keep the credential subprocess protocol UTF-8 on every platform.
15
+ for _stream in (sys.stdout, sys.stderr):
16
+ if hasattr(_stream, "reconfigure"):
17
+ _stream.reconfigure(encoding="utf-8", errors=_stream.errors)
18
+
19
+ spec = importlib.util.spec_from_file_location("gemini_auth", Path(__file__).with_name("gemini-auth.py"))
20
+ auth = importlib.util.module_from_spec(spec)
21
+ spec.loader.exec_module(auth)
22
+
23
+
24
+ class AuthenticationTests(unittest.TestCase):
25
+ def setUp(self):
26
+ self.info = {"type": "service_account", "project_id": "account-project", "token_uri": "https://untrusted.invalid/token"}
27
+ self.credentials = Mock(token="fixture-token")
28
+ self.factory = Mock(return_value=self.credentials)
29
+ self.request = Mock(return_value=object())
30
+ transport = types.ModuleType("google.auth.transport.requests")
31
+ transport.Request = self.request
32
+ oauth = types.ModuleType("google.oauth2")
33
+ oauth.service_account = types.SimpleNamespace(Credentials=types.SimpleNamespace(from_service_account_info=self.factory))
34
+ modules = {name: types.ModuleType(name) for name in ("google", "google.auth", "google.auth.transport")}
35
+ modules.update({"google.auth.transport.requests": transport, "google.oauth2": oauth})
36
+ self.addCleanup(patch.stopall)
37
+ patch.dict("sys.modules", modules).start()
38
+ patch.dict(os.environ, {"GCS_CREDS": json.dumps(self.info)}, clear=True).start()
39
+
40
+ def test_scope_endpoint_and_refresh(self):
41
+ self.assertEqual(auth.authenticate(), {"token": "fixture-token", "project": "account-project"})
42
+ info = self.factory.call_args.args[0]
43
+ self.assertEqual(info["token_uri"], "https://oauth2.googleapis.com/token")
44
+ self.assertEqual(self.factory.call_args.kwargs["scopes"], ["https://www.googleapis.com/auth/generative-language.retriever"])
45
+ self.credentials.refresh.assert_called_once_with(self.request.return_value)
46
+
47
+ def test_file_takes_precedence_over_json_environment(self):
48
+ with tempfile.TemporaryDirectory() as directory:
49
+ path = Path(directory) / "service.json"
50
+ path.write_text(json.dumps({**self.info, "project_id": "file-project"}), encoding="utf-8")
51
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = str(path)
52
+ os.environ["GCS_CREDS"] = "invalid-json"
53
+ self.assertEqual(auth.authenticate()["project"], "file-project")
54
+
55
+ def test_quota_project_precedence(self):
56
+ os.environ["GCLOUD_PROJECT_ID"] = "alias-project"
57
+ self.assertEqual(auth.authenticate()["project"], "alias-project")
58
+ os.environ["GOOGLE_CLOUD_PROJECT"] = "explicit-project"
59
+ self.assertEqual(auth.authenticate()["project"], "explicit-project")
60
+
61
+ def test_user_adc_is_rejected_before_exchange(self):
62
+ os.environ["GCS_CREDS"] = json.dumps({"type": "authorized_user"})
63
+ self.assertIn("service-account JSON", auth.authenticate()["error"])
64
+ self.factory.assert_not_called()
65
+
66
+ def test_invalid_json_or_missing_file_does_not_fall_back(self):
67
+ os.environ["GCS_CREDS"] = "private-invalid-json"
68
+ self.assertIn("error", auth.authenticate())
69
+ os.environ["GCS_CREDS"] = json.dumps(self.info)
70
+ os.environ["GOOGLE_APPLICATION_CREDENTIALS"] = "/missing/service-account-fixture.json"
71
+ self.assertIn("error", auth.authenticate())
72
+ self.factory.assert_not_called()
73
+
74
+ def test_library_errors_are_redacted(self):
75
+ for boundary in (self.factory, self.credentials.refresh):
76
+ with self.subTest(boundary=boundary):
77
+ boundary.side_effect = RuntimeError("private-key-and-token")
78
+ result = auth.authenticate()
79
+ self.assertIn("error", result)
80
+ self.assertNotIn("private-key-and-token", json.dumps(result))
81
+ boundary.side_effect = None
82
+
83
+ def test_missing_dependency_has_actionable_error(self):
84
+ with patch.dict("sys.modules", {"google.auth.transport.requests": None}):
85
+ self.assertIn("pip install google-auth requests", auth.authenticate()["error"])
86
+ self.factory.assert_not_called()
87
+
88
+
89
+ if __name__ == "__main__":
90
+ unittest.main()