@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,230 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import {
4
+ mkdirSync,
5
+ mkdtempSync,
6
+ readFileSync,
7
+ writeFileSync,
8
+ chmodSync,
9
+ rmSync,
10
+ existsSync,
11
+ } from "node:fs";
12
+ import { join, dirname } from "node:path";
13
+ import { tmpdir } from "node:os";
14
+ import {
15
+ parseFfmpegDurationBanner,
16
+ ffprobeDuration,
17
+ synthesizeOne,
18
+ synthesizeHeygen,
19
+ synthResult,
20
+ pickProvider,
21
+ } from "./tts.mjs";
22
+
23
+ test("parseFfmpegDurationBanner reads ffmpeg's stderr Duration line", () => {
24
+ const stderr = [
25
+ "ffmpeg version 6.0",
26
+ "Input #0, wav, from 'a.wav':",
27
+ " Duration: 00:00:03.42, bitrate: 705 kb/s",
28
+ "At least one output file must be specified",
29
+ ].join("\n");
30
+ assert.equal(parseFfmpegDurationBanner(stderr), 3.42);
31
+ });
32
+
33
+ test("parseFfmpegDurationBanner handles an hours component", () => {
34
+ const stderr = " Duration: 01:02:03.50, start: 0.000000, bitrate: 128 kb/s";
35
+ assert.equal(parseFfmpegDurationBanner(stderr), 3723.5);
36
+ });
37
+
38
+ test("parseFfmpegDurationBanner returns NaN when there is no Duration line", () => {
39
+ assert.ok(Number.isNaN(parseFfmpegDurationBanner("ffmpeg: command not found")));
40
+ assert.ok(Number.isNaN(parseFfmpegDurationBanner("")));
41
+ assert.ok(Number.isNaN(parseFfmpegDurationBanner(undefined)));
42
+ });
43
+
44
+ // Regression for the actual bug: ffprobeDuration used to collapse "ffprobe
45
+ // binary is missing" (ENOENT — the "essentials"-style Windows ffmpeg build
46
+ // with no ffprobe.exe) and "file is genuinely unreadable" into the same NaN,
47
+ // giving audio.mjs no way to tell "measure differently" from "give up".
48
+ //
49
+ // Builds an isolated PATH containing only a fake `ffmpeg` stub (no `ffprobe`
50
+ // at all) so ffprobeDuration's spawnSync("ffprobe", ...) call ENOENTs for
51
+ // real, then verifies it recovers the duration via the ffmpeg fallback
52
+ // instead of returning NaN.
53
+ test("ffprobeDuration falls back to ffmpeg when the ffprobe binary itself is missing", () => {
54
+ const dir = mkdtempSync(join(tmpdir(), "tts-ffprobe-fallback-"));
55
+ const fakeFfmpeg = join(dir, "ffmpeg");
56
+ writeFileSync(
57
+ fakeFfmpeg,
58
+ "#!/bin/sh\necho 'Duration: 00:00:02.50, start: 0.000000, bitrate: 128 kb/s' 1>&2\nexit 1\n",
59
+ );
60
+ chmodSync(fakeFfmpeg, 0o755);
61
+ const originalPath = process.env.PATH;
62
+ try {
63
+ process.env.PATH = dir; // only the fake ffmpeg resolves; no real ffprobe on this PATH
64
+ assert.equal(ffprobeDuration("/does/not/matter.wav"), 2.5);
65
+ } finally {
66
+ process.env.PATH = originalPath;
67
+ rmSync(dir, { recursive: true, force: true });
68
+ }
69
+ });
70
+
71
+ test("ffprobeDuration returns NaN when neither ffprobe nor ffmpeg resolve", () => {
72
+ const dir = mkdtempSync(join(tmpdir(), "tts-no-binaries-"));
73
+ const originalPath = process.env.PATH;
74
+ try {
75
+ process.env.PATH = dir; // empty directory — nothing resolves
76
+ assert.ok(Number.isNaN(ffprobeDuration("/does/not/matter.wav")));
77
+ } finally {
78
+ process.env.PATH = originalPath;
79
+ rmSync(dir, { recursive: true, force: true });
80
+ }
81
+ });
82
+
83
+ test("synthesizeOne(elevenlabs) creates the output dir before writing", async () => {
84
+ const dir = mkdtempSync(join(tmpdir(), "tts-el-mkdir-"));
85
+ const wavAbs = join(dir, "assets", "voice", "line-0.wav"); // nested, not yet created
86
+ const savedKey = process.env.ELEVENLABS_API_KEY;
87
+ try {
88
+ // Unset the key so the Python side fails fast — the mkdir must run before
89
+ // the spawn regardless, which is what this guards.
90
+ delete process.env.ELEVENLABS_API_KEY;
91
+ await synthesizeOne({
92
+ provider: "elevenlabs",
93
+ text: "hi",
94
+ voiceId: "v",
95
+ wavAbs,
96
+ hyperframesDir: dir,
97
+ });
98
+ assert.ok(existsSync(dirname(wavAbs)), "output directory should be created");
99
+ } finally {
100
+ if (savedKey === undefined) delete process.env.ELEVENLABS_API_KEY;
101
+ else process.env.ELEVENLABS_API_KEY = savedKey;
102
+ rmSync(dir, { recursive: true, force: true });
103
+ }
104
+ });
105
+
106
+ test("synthesizeHeygen surfaces a thrown HTTP error (e.g. 402) instead of swallowing it", async () => {
107
+ const res = await synthesizeHeygen(
108
+ { text: "hi", voiceId: "v1", lang: "en", speed: 1, wavAbs: "/tmp/x.wav" },
109
+ {
110
+ heygenAuthHeaders: () => ({}),
111
+ heygenJSON: async () => {
112
+ throw new Error("HeyGen POST /voices/speech → HTTP 402\nplan_upgrade_required");
113
+ },
114
+ },
115
+ );
116
+ assert.equal(res.ok, false);
117
+ assert.match(res.error, /402/);
118
+ assert.match(res.error, /plan_upgrade_required/);
119
+ });
120
+
121
+ test("synthesizeHeygen surfaces a failed audio_url fetch with its status", async () => {
122
+ const res = await synthesizeHeygen(
123
+ { text: "hi", voiceId: "v1", lang: "en", speed: 1, wavAbs: "/tmp/x.wav" },
124
+ {
125
+ heygenAuthHeaders: () => ({}),
126
+ heygenJSON: async () => ({ data: { audio_url: "http://audio.example/x" } }),
127
+ fetch: async () => ({ ok: false, status: 403 }),
128
+ },
129
+ );
130
+ assert.equal(res.ok, false);
131
+ assert.match(res.error, /HTTP 403/);
132
+ });
133
+
134
+ test("synthesizeHeygen reports a missing audio_url", async () => {
135
+ const res = await synthesizeHeygen(
136
+ { text: "hi", voiceId: "v1", lang: "en", speed: 1, wavAbs: "/tmp/x.wav" },
137
+ { heygenAuthHeaders: () => ({}), heygenJSON: async () => ({}) },
138
+ );
139
+ assert.equal(res.ok, false);
140
+ assert.match(res.error, /no audio_url/);
141
+ });
142
+
143
+ test("synthesizeHeygen reports wav transcode failures", async () => {
144
+ const dir = mkdtempSync(join(tmpdir(), "hf-tts-test-"));
145
+ try {
146
+ const res = await synthesizeHeygen(
147
+ { text: "hi", voiceId: "v1", lang: "en", speed: 1, wavAbs: join(dir, "voice.wav") },
148
+ {
149
+ heygenAuthHeaders: () => ({}),
150
+ heygenJSON: async () => ({ data: { audio_url: "http://audio.example/x" } }),
151
+ fetch: async () => ({ ok: true, status: 200, arrayBuffer: async () => new ArrayBuffer(0) }),
152
+ transcodeToWav: () => false,
153
+ },
154
+ );
155
+ assert.equal(res.ok, false);
156
+ assert.equal(res.error, "wav transcode failed (ffmpeg)");
157
+ } finally {
158
+ rmSync(dir, { recursive: true, force: true });
159
+ }
160
+ });
161
+
162
+ test("synthResult names a non-zero subprocess exit", () => {
163
+ const res = synthResult({ status: 2 }, "/tmp/none.wav", "kokoro (npx hyperframes tts)");
164
+ assert.equal(res.ok, false);
165
+ assert.match(res.error, /kokoro .* exited with status 2/);
166
+ });
167
+
168
+ // Kokoro shells out to `npx hyperframes tts`; a fake npx on PATH records the argv
169
+ // synthesizeOne really builds, so a dropped flag fails here. Windows runs npx via
170
+ // node directly, so the stub never resolves there.
171
+ async function kokoroArgv(options) {
172
+ const dir = mkdtempSync(join(tmpdir(), "tts-kokoro-argv-"));
173
+ const argvLog = join(dir, "argv.txt");
174
+ writeFileSync(join(dir, "npx"), `#!/bin/sh\nprintf '%s\\n' "$@" > "${argvLog}"\n`);
175
+ chmodSync(join(dir, "npx"), 0o755);
176
+ const originalPath = process.env.PATH;
177
+ try {
178
+ process.env.PATH = dir;
179
+ await synthesizeOne({
180
+ provider: "kokoro",
181
+ text: "hi",
182
+ voiceId: "am_michael",
183
+ wavAbs: join(dir, "line-0.wav"),
184
+ hyperframesDir: dir,
185
+ ...options,
186
+ });
187
+ return readFileSync(argvLog, "utf8").trim().split("\n");
188
+ } finally {
189
+ process.env.PATH = originalPath;
190
+ rmSync(dir, { recursive: true, force: true });
191
+ }
192
+ }
193
+
194
+ test(
195
+ "synthesizeOne(kokoro) forwards a non-default speed to the CLI",
196
+ { skip: process.platform === "win32" },
197
+ async () => {
198
+ const argv = await kokoroArgv({ speed: 0.8, lang: "es" });
199
+ assert.deepEqual(argv.slice(-4), ["--lang", "es", "--speed", "0.8"]);
200
+ },
201
+ );
202
+
203
+ test(
204
+ "synthesizeOne(kokoro) leaves --speed off at the default",
205
+ { skip: process.platform === "win32" },
206
+ async () => {
207
+ assert.ok(!(await kokoroArgv({})).includes("--speed"));
208
+ },
209
+ );
210
+
211
+ test("pickProvider heygen with an unreadable credentials path says to fix that path", () => {
212
+ const saved = ["HEYGEN_API_KEY", "HYPERFRAMES_API_KEY", "HEYGEN_CONFIG_DIR"].map((k) => [
213
+ k,
214
+ process.env[k],
215
+ ]);
216
+ const dir = mkdtempSync(join(tmpdir(), "tts-cred-"));
217
+ try {
218
+ delete process.env.HEYGEN_API_KEY;
219
+ delete process.env.HYPERFRAMES_API_KEY;
220
+ process.env.HEYGEN_CONFIG_DIR = dir;
221
+ mkdirSync(join(dir, "credentials"));
222
+ assert.throws(() => pickProvider("heygen"), /fix or remove that path/);
223
+ } finally {
224
+ for (const [k, v] of saved) {
225
+ if (v === undefined) delete process.env[k];
226
+ else process.env[k] = v;
227
+ }
228
+ rmSync(dir, { recursive: true, force: true });
229
+ }
230
+ });
@@ -0,0 +1,136 @@
1
+ #!/usr/bin/env python3
2
+ """Generate BGM using Google Lyria RealTime API.
3
+
4
+ Usage:
5
+ python lyria-recipe.py --output <path> --duration <seconds> [tuning flags]
6
+
7
+ Requires:
8
+ $GOOGLE_API_KEY or $GEMINI_API_KEY environment variable (treated as aliases).
9
+ pip install google-genai python-dotenv. audio.mjs Step 4b installs these on
10
+ demand when a key is set but google.genai is not importable; if that install
11
+ fails it falls back to local MusicGen rather than leaving the video with no BGM.
12
+ """
13
+
14
+ from __future__ import annotations
15
+
16
+ import argparse
17
+ import asyncio
18
+ import os
19
+ import sys
20
+ import wave
21
+ from pathlib import Path
22
+
23
+ # Windows sizes stdio to the ANSI code page (cp1252). These scripts emit UTF-8 on
24
+ # every platform; say so rather than depending on the console's code page. Carry
25
+ # `errors` across: reconfigure() resets it to "strict", and CPython deliberately gives
26
+ # stderr "backslashreplace" so the diagnostic path can never itself raise.
27
+ for _stream in (sys.stdout, sys.stderr):
28
+ if hasattr(_stream, "reconfigure"):
29
+ _stream.reconfigure(encoding="utf-8", errors=_stream.errors)
30
+
31
+ DEFAULT_PROMPT = "Uplifting corporate tech, bright and modern, gentle piano with synth pads"
32
+ SAMPLE_RATE = 48000
33
+ CHANNELS = 2
34
+ SAMPLE_WIDTH = 2 # 16-bit
35
+
36
+
37
+ def parse_args() -> argparse.Namespace:
38
+ p = argparse.ArgumentParser(description="Generate BGM via Google Lyria RealTime.")
39
+ p.add_argument("--output", required=True, help="Output WAV path.")
40
+ p.add_argument("--duration", type=float, required=True, help="Target duration in seconds.")
41
+ p.add_argument("--prompt", default=DEFAULT_PROMPT, help="Mood / instrumentation prompt.")
42
+ p.add_argument("--negative-prompt", default=None, help="Styles to exclude (optional).")
43
+ p.add_argument("--bpm", type=int, default=110)
44
+ p.add_argument("--brightness", type=float, default=0.8, help="0-1, higher = brighter mood.")
45
+ p.add_argument("--density", type=float, default=0.5, help="0-1, higher = fuller mix.")
46
+ p.add_argument(
47
+ "--scale",
48
+ default="MAJOR",
49
+ help="MAJOR / MINOR / PENTATONIC / etc. — see google.genai.types.Scale. Pass empty string for none.",
50
+ )
51
+ return p.parse_args()
52
+
53
+
54
+ async def generate_bgm(args: argparse.Namespace) -> dict:
55
+ from google import genai
56
+ from google.genai import types
57
+
58
+ api_key = os.environ.get("GOOGLE_API_KEY") or os.environ.get("GEMINI_API_KEY") or ""
59
+ if not api_key:
60
+ raise RuntimeError("Neither GOOGLE_API_KEY nor GEMINI_API_KEY is set.")
61
+
62
+ client = genai.Client(
63
+ api_key=api_key,
64
+ http_options={"api_version": "v1alpha"},
65
+ )
66
+
67
+ out_path = Path(args.output)
68
+ out_path.parent.mkdir(parents=True, exist_ok=True)
69
+
70
+ target_bytes = int(args.duration * SAMPLE_RATE * CHANNELS * SAMPLE_WIDTH)
71
+
72
+ cfg: dict = {"bpm": args.bpm, "temperature": 1.0}
73
+ if args.density is not None:
74
+ cfg["density"] = args.density
75
+ if args.brightness is not None:
76
+ cfg["brightness"] = args.brightness
77
+ if args.scale:
78
+ scale_enum = getattr(types.Scale, args.scale, None)
79
+ if scale_enum:
80
+ cfg["scale"] = scale_enum
81
+
82
+ prompts = [types.WeightedPrompt(text=args.prompt, weight=1.0)]
83
+ if args.negative_prompt:
84
+ prompts.append(types.WeightedPrompt(text=args.negative_prompt, weight=-1.0))
85
+
86
+ buf = bytearray()
87
+ timeout = args.duration + 8
88
+
89
+ async with client.aio.live.music.connect(
90
+ model="models/lyria-realtime-exp",
91
+ ) as session:
92
+ await session.set_weighted_prompts(prompts=prompts)
93
+ await session.set_music_generation_config(
94
+ config=types.LiveMusicGenerationConfig(**cfg),
95
+ )
96
+ await session.play()
97
+
98
+ async def collect():
99
+ while len(buf) < target_bytes:
100
+ async for msg in session.receive():
101
+ sc = msg.server_content
102
+ if sc and sc.audio_chunks:
103
+ for chunk in sc.audio_chunks:
104
+ buf.extend(chunk.data)
105
+ if len(buf) >= target_bytes:
106
+ return
107
+ await asyncio.sleep(1e-6)
108
+
109
+ try:
110
+ await asyncio.wait_for(collect(), timeout=timeout)
111
+ except TimeoutError:
112
+ print(f"Timeout after {timeout:.0f}s, collected {len(buf)} bytes", file=sys.stderr)
113
+
114
+ audio = bytes(buf[:target_bytes])
115
+ with wave.open(str(out_path), "wb") as wf:
116
+ wf.setnchannels(CHANNELS)
117
+ wf.setsampwidth(SAMPLE_WIDTH)
118
+ wf.setframerate(SAMPLE_RATE)
119
+ wf.writeframes(audio)
120
+
121
+ actual_duration = len(audio) / (SAMPLE_RATE * CHANNELS * SAMPLE_WIDTH)
122
+ print(f"BGM: {out_path} ({actual_duration:.2f}s)")
123
+ return {"file": str(out_path), "duration_sec": round(actual_duration, 2)}
124
+
125
+
126
+ def main() -> None:
127
+ args = parse_args()
128
+ try:
129
+ asyncio.run(generate_bgm(args))
130
+ except RuntimeError as exc:
131
+ print(f"BGM generation failed: {exc}", file=sys.stderr)
132
+ sys.exit(1)
133
+
134
+
135
+ if __name__ == "__main__":
136
+ main()
@@ -0,0 +1,175 @@
1
+ #!/usr/bin/env node
2
+ // Phase 4c pre-assemble helper — wait for detached BGM, then write status.
3
+ //
4
+ // audio.mjs may launch Lyria / MusicGen in a detached process so voice work can
5
+ // keep moving. Before assemble-index.mjs decides whether to emit the BGM audio
6
+ // track, this script gives the background renderer a bounded chance to finish
7
+ // and converts log/process state into a small bgm_status.json file.
8
+ //
9
+ // Always exits 0 for normal pipeline use: missing/failed BGM should not block a
10
+ // voice/captions/SFX render. Structural invocation errors still exit 1.
11
+ //
12
+ // Usage:
13
+ // node wait-bgm.mjs --audio-meta ./audio_meta.json --hyperframes . \
14
+ // [--timeout-ms 120000] [--interval-ms 2000] [--out ./bgm_status.json]
15
+
16
+ import { existsSync, readFileSync, statSync, writeFileSync } from "node:fs";
17
+ import { join, resolve } from "node:path";
18
+ import { recordInManifest } from "./lib/media-record.mjs";
19
+
20
+ const argv = process.argv.slice(2);
21
+ const flag = (name, def) => {
22
+ const i = argv.indexOf(`--${name}`);
23
+ return i >= 0 && i + 1 < argv.length ? argv[i + 1] : def;
24
+ };
25
+
26
+ function die(msg) {
27
+ console.error(`✗ wait-bgm.mjs: ${msg}`);
28
+ process.exit(1);
29
+ }
30
+
31
+ const audioMetaPath = resolve(flag("audio-meta", "./audio_meta.json"));
32
+ const hyperframesDir = resolve(flag("hyperframes", "."));
33
+ const outPath = resolve(flag("out", join(hyperframesDir, "bgm_status.json")));
34
+ const timeoutMs = Math.max(0, Number(flag("timeout-ms", "120000")) || 0);
35
+ const intervalMs = Math.max(250, Number(flag("interval-ms", "2000")) || 2000);
36
+
37
+ function sleep(ms) {
38
+ return new Promise((resolveSleep) => setTimeout(resolveSleep, ms));
39
+ }
40
+
41
+ function isProcessAlive(pid) {
42
+ if (!pid || !Number.isFinite(Number(pid))) return false;
43
+ try {
44
+ process.kill(Number(pid), 0);
45
+ return true;
46
+ } catch {
47
+ return false;
48
+ }
49
+ }
50
+
51
+ function readTail(path, maxChars = 6000) {
52
+ if (!path) return "";
53
+ try {
54
+ const txt = readFileSync(path, "utf8");
55
+ return txt.slice(Math.max(0, txt.length - maxChars));
56
+ } catch (error) {
57
+ if (error.code === "ENOENT" || error.code === "ENOTDIR") return "";
58
+ throw error;
59
+ }
60
+ }
61
+
62
+ function detectFailure(logTail) {
63
+ if (!logTail) return "";
64
+ const lines = logTail.split("\n");
65
+ // Bare "out of range" over-matched benign BGM-renderer logs (e.g. a "sample rate
66
+ // out of range, resampling" notice), mislabelling a healthy track as failed and
67
+ // silently dropping the music. Anchor to the actual crash strings instead:
68
+ // Python "(list) index out of range" and torch "index … out of bounds".
69
+ const idx = lines.findIndex((line) =>
70
+ /(Traceback|IndexError|RuntimeError|Exception|Killed|No space left|Cannot allocate|index out of range|out of bounds)/i.test(
71
+ line,
72
+ ),
73
+ );
74
+ if (idx < 0) return "";
75
+ return lines.slice(idx).join("\n").trim();
76
+ }
77
+
78
+ function writeStatus(status) {
79
+ const payload = {
80
+ generated_at: new Date().toISOString(),
81
+ ...status,
82
+ };
83
+ writeFileSync(outPath, JSON.stringify(payload, null, 2) + "\n");
84
+ return payload;
85
+ }
86
+
87
+ if (!existsSync(audioMetaPath)) die(`audio_meta.json missing at ${audioMetaPath}`);
88
+
89
+ const audioMeta = JSON.parse(readFileSync(audioMetaPath, "utf8"));
90
+ const bgmPath = audioMeta.bgm?.path || "";
91
+ const bgmAbsPath = bgmPath ? join(hyperframesDir, bgmPath) : "";
92
+ const logPath = audioMeta.bgm_log || "";
93
+ const pid = audioMeta.bgm_pid || null;
94
+
95
+ const base = {
96
+ enabled: Boolean(audioMeta.bgm_pending && bgmPath),
97
+ provider: audioMeta.bgm_provider || null,
98
+ mode: audioMeta.bgm_mode || null,
99
+ path: bgmPath || null,
100
+ log: logPath || null,
101
+ pid,
102
+ target_duration_s: audioMeta.bgm_target_duration_s || null,
103
+ seed_duration_s: audioMeta.bgm_seed_duration_s || null,
104
+ loop_count: audioMeta.bgm_loop_count || null,
105
+ timeout_ms: timeoutMs,
106
+ };
107
+
108
+ if (!base.enabled) {
109
+ const status = writeStatus({
110
+ ...base,
111
+ status: "disabled",
112
+ ready: false,
113
+ waited_ms: 0,
114
+ message: "BGM not requested or disabled in audio_meta.json.",
115
+ });
116
+ console.log(`✓ bgm: ${status.status} (${status.message})`);
117
+ process.exit(0);
118
+ }
119
+
120
+ const started = Date.now();
121
+ let lastFailure = "";
122
+ let lastTail = "";
123
+
124
+ while (Date.now() - started <= timeoutMs) {
125
+ if (existsSync(bgmAbsPath)) {
126
+ const size = statSync(bgmAbsPath).size;
127
+ writeStatus({
128
+ ...base,
129
+ status: "ready",
130
+ ready: true,
131
+ waited_ms: Date.now() - started,
132
+ size_bytes: size,
133
+ message: `BGM ready at ${bgmPath}.`,
134
+ });
135
+ console.log(`✓ bgm: ready (${bgmPath}, ${size}B)`);
136
+ const generated = { path: bgmPath, type: "bgm", source: "generated", provider: base.provider };
137
+ for (const anomaly of recordInManifest(hyperframesDir, [generated]))
138
+ console.error(` ${anomaly}`);
139
+ process.exit(0);
140
+ }
141
+
142
+ lastTail = readTail(logPath);
143
+ lastFailure = detectFailure(lastTail);
144
+ const alive = isProcessAlive(pid);
145
+ if (lastFailure || (!alive && logPath && existsSync(logPath))) {
146
+ const message = lastFailure
147
+ ? `BGM renderer failed; see ${logPath}.`
148
+ : `BGM renderer exited without writing ${bgmPath}; see ${logPath}.`;
149
+ const status = writeStatus({
150
+ ...base,
151
+ status: "failed",
152
+ ready: false,
153
+ waited_ms: Date.now() - started,
154
+ process_alive: alive,
155
+ message,
156
+ error_tail: lastFailure || lastTail.slice(-2000),
157
+ });
158
+ console.log(`! bgm: failed (${status.message})`);
159
+ process.exit(0);
160
+ }
161
+
162
+ if (timeoutMs === 0) break;
163
+ await sleep(Math.min(intervalMs, Math.max(0, timeoutMs - (Date.now() - started))));
164
+ }
165
+
166
+ const status = writeStatus({
167
+ ...base,
168
+ status: "timeout",
169
+ ready: false,
170
+ waited_ms: Date.now() - started,
171
+ process_alive: isProcessAlive(pid),
172
+ message: `Timed out waiting for ${bgmPath}; assemble-index will skip BGM if still absent.`,
173
+ log_tail: lastTail.slice(-2000),
174
+ });
175
+ console.log(`! bgm: timeout after ${status.waited_ms}ms (${bgmPath})`);
@@ -0,0 +1,108 @@
1
+ import assert from "node:assert/strict";
2
+ import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { spawnSync } from "node:child_process";
4
+ import { join } from "node:path";
5
+ import { tmpdir } from "node:os";
6
+ import { test } from "node:test";
7
+ import { runInNewContext } from "node:vm";
8
+
9
+ const source = readFileSync(new URL("./wait-bgm.mjs", import.meta.url), "utf8");
10
+ const start = source.indexOf("function readTail(");
11
+ const end = source.indexOf("\nfunction detectFailure(", start);
12
+ function load(read) {
13
+ return runInNewContext(`${source.slice(start, end)}; readTail`, {
14
+ readFileSync: read,
15
+ existsSync: () => true,
16
+ statSync: () => {
17
+ throw new Error("pathname stat must not precede log read");
18
+ },
19
+ });
20
+ }
21
+
22
+ test("reads a log once without a separate pathname check", () => {
23
+ let calls = 0;
24
+ const read = load((path, encoding) => {
25
+ calls++;
26
+ assert.equal(path, "renderer.log");
27
+ assert.equal(encoding, "utf8");
28
+ return "prefix\nRuntimeError: failed";
29
+ });
30
+ assert.equal(read("renderer.log", 20), "RuntimeError: failed");
31
+ assert.equal(calls, 1);
32
+ });
33
+
34
+ test("preserves UTF-16 character tail boundaries and zero-length tails", () => {
35
+ const txt = "🎵日本語".repeat(2000);
36
+ const read = load(() => txt);
37
+ assert.equal(read("log"), txt.slice(-6000));
38
+ assert.equal(read("log", 0), "");
39
+ });
40
+
41
+ for (const code of ["ENOENT", "ENOTDIR"]) {
42
+ test(`a log removed during polling is absent (${code})`, () => {
43
+ const read = load(() => {
44
+ throw Object.assign(new Error(code), { code });
45
+ });
46
+ assert.equal(read("log"), "");
47
+ });
48
+ }
49
+
50
+ test("preserves unexpected read errors", () => {
51
+ const error = Object.assign(new Error("denied"), { code: "EACCES" });
52
+ assert.throws(
53
+ () =>
54
+ load(() => {
55
+ throw error;
56
+ })("log"),
57
+ (caught) => caught === error,
58
+ );
59
+ });
60
+
61
+ test("empty log path does not access the filesystem", () => {
62
+ assert.equal(
63
+ load(() => {
64
+ throw new Error("unexpected read");
65
+ })(""),
66
+ "",
67
+ );
68
+ });
69
+
70
+ test("records locally made music as generated once it is ready", () => {
71
+ const dir = mkdtempSync(join(tmpdir(), "mu-wait-bgm-"));
72
+ try {
73
+ mkdirSync(join(dir, "assets/bgm"), { recursive: true });
74
+ writeFileSync(join(dir, "assets/bgm/track.wav"), "generated music");
75
+ writeFileSync(
76
+ join(dir, "audio_meta.json"),
77
+ JSON.stringify({
78
+ bgm: { path: "assets/bgm/track.wav" },
79
+ bgm_pending: true,
80
+ bgm_provider: "musicgen",
81
+ bgm_mode: "detached-single",
82
+ }),
83
+ );
84
+ const script = new URL("./wait-bgm.mjs", import.meta.url).pathname;
85
+ const args = ["--audio-meta", join(dir, "audio_meta.json"), "--hyperframes", dir];
86
+
87
+ const run = spawnSync(process.execPath, [script, ...args, "--timeout-ms", "1000"], {
88
+ encoding: "utf8",
89
+ });
90
+
91
+ assert.equal(run.status, 0, run.stderr);
92
+ const records = readFileSync(join(dir, ".media/manifest.jsonl"), "utf8")
93
+ .trim()
94
+ .split("\n")
95
+ .map((line) => JSON.parse(line));
96
+ assert.deepEqual(
97
+ records.map(({ path, type, source, provenance }) => [
98
+ path,
99
+ type,
100
+ source,
101
+ provenance.provider,
102
+ ]),
103
+ [["assets/bgm/track.wav", "bgm", "generated", "musicgen"]],
104
+ );
105
+ } finally {
106
+ rmSync(dir, { recursive: true, force: true });
107
+ }
108
+ });
@@ -0,0 +1,28 @@
1
+ # LUT library (authoring)
2
+
3
+ `index.json` is the agent-consumed catalog of color-grade looks. Each entry resolves
4
+ on demand — no `.cube` bodies are committed to the repo.
5
+
6
+ Each look has:
7
+
8
+ - `id`, `description`, `tags`, `intensity` — matching + application metadata.
9
+ - `url` (optional) — a hosted `.cube` downloaded, validated, and frozen at resolve
10
+ time, exactly like bgm/image assets.
11
+ - `params` (optional) — a deterministic `buildCube` spec used offline (`--local-only`)
12
+ or as a fallback if the `url` download/validation fails.
13
+
14
+ An entry needs at least one of `url` or `params`; prefer both (CDN url with a params
15
+ fallback) so resolution is never blocked on the network.
16
+
17
+ ## Hosting a new look (operators)
18
+
19
+ 1. Generate the `.cube` (e.g. `resolve -t lut --params '{...}'` or a graded export).
20
+ 2. Upload it to the public CDN origin bucket:
21
+
22
+ ```
23
+ aws s3 cp <id>.cube s3://heygen-public/luts/<id>.cube
24
+ ```
25
+
26
+ It is then served at `https://static.heygen.ai/luts/<id>.cube` (CloudFront).
27
+
28
+ 3. Add an entry to `index.json` with that `url` (and ideally a `params` fallback).