@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,389 @@
1
+ import { fetchMedia } from "../../../scripts/lib/media-fetch.mjs";
2
+ // tts.mjs — multi-provider TTS for the media audio engine. The provider chain,
3
+ // auto-detected from env, is the one documented in ../SKILL.md:
4
+ //
5
+ // 1. HeyGen (Starfish) — $HEYGEN_API_KEY / $HYPERFRAMES_API_KEY / ~/.heygen.
6
+ // Direct v3 REST (NOT `hyperframes tts`, which in the published build is
7
+ // Kokoro-only and silently ignores a HeyGen key). Returns word_timestamps
8
+ // in the same call, so no separate transcribe pass.
9
+ // 2. ElevenLabs — $ELEVENLABS_API_KEY + `pip install elevenlabs`. No
10
+ // word timings → caller chains transcribeWav().
11
+ // 3. Kokoro-82M (local) — always available, via the published `hyperframes tts`
12
+ // CLI. No word timings → caller chains transcribeWav().
13
+ //
14
+ // "HeyGen available" is decided by CREDENTIAL presence (heygenCredential), never
15
+ // by the CLI — see the note above.
16
+
17
+ import { spawn, spawnSync } from "node:child_process";
18
+ import { existsSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
19
+ import { tmpdir } from "node:os";
20
+ import { dirname, join } from "node:path";
21
+ import { heygenAuthHeaders, heygenCredential, heygenJSON, heygenMessage } from "./heygen.mjs";
22
+ import { pythonInvocation } from "./python.mjs";
23
+ import { synthesizeGemini } from "./gemini-tts.mjs";
24
+ import { geminiConfigured } from "./gemini-auth.mjs";
25
+
26
+ // ── provider detection ────────────────────────────────────────────────────────
27
+ export function heygenAvailable() {
28
+ return heygenCredential() !== null;
29
+ }
30
+ export function elevenlabsAvailable() {
31
+ if (!process.env.ELEVENLABS_API_KEY) return false;
32
+ const { cmd, args } = pythonInvocation(["-c", "import elevenlabs"]);
33
+ const r = spawnSync(cmd, args, {
34
+ stdio: "ignore",
35
+ });
36
+ return r.status === 0;
37
+ }
38
+
39
+ // First available provider wins; an explicit choice is honored (and validated).
40
+ export function pickProvider(userProvider) {
41
+ if (userProvider) {
42
+ if (!["heygen", "elevenlabs", "kokoro", "gemini"].includes(userProvider))
43
+ throw new Error(`invalid provider "${userProvider}" (heygen | elevenlabs | kokoro | gemini)`);
44
+ if (userProvider === "gemini" && !geminiConfigured())
45
+ throw new Error(
46
+ "provider=gemini needs GEMINI_API_KEY or GOOGLE_API_KEY, or service-account credentials (GOOGLE_APPLICATION_CREDENTIALS or GCS_CREDS)",
47
+ );
48
+ // heygenAuthHeaders owns the reason and its fix: no credential, or a credentials path that cannot be read.
49
+ if (userProvider === "heygen" && !heygenAvailable()) heygenAuthHeaders();
50
+ if (userProvider === "elevenlabs" && !process.env.ELEVENLABS_API_KEY)
51
+ throw new Error("provider=elevenlabs but $ELEVENLABS_API_KEY is not set");
52
+ return userProvider;
53
+ }
54
+ return heygenAvailable() ? "heygen" : elevenlabsAvailable() ? "elevenlabs" : "kokoro";
55
+ }
56
+
57
+ // ── voice resolution ──────────────────────────────────────────────────────────
58
+ // HeyGen /v3/voices/speech only accepts STARFISH voice_ids; auto-pick the first
59
+ // English public starfish voice when none is pinned. ElevenLabs/Kokoro have
60
+ // their own defaults.
61
+ export async function resolveVoiceId({ provider, userVoice, lang = "en" }) {
62
+ if (userVoice) return userVoice;
63
+ if (provider === "gemini") return "Kore";
64
+ if (provider === "elevenlabs") return "21m00Tcm4TlvDq8ikWAM"; // Rachel
65
+ if (provider === "kokoro") {
66
+ if (lang === "en") return "am_michael";
67
+ throw new Error("Kokoro non-English needs an explicit --voice (see references/tts.md)");
68
+ }
69
+ // heygen — pin a fixed English default so the choice is deterministic. The old
70
+ // "first English voice the API returns" drifts whenever HeyGen re-sorts the
71
+ // public catalog. Marcia (mature, low female). Override with --voice / request.voice.
72
+ if (lang === "en") return "05f19352e8f74b0392a8f411eba40de1"; // Marcia · English · female
73
+ // Non-English: no fixed default — fall back to the first matching catalog voice.
74
+ const payload = await heygenJSON(`/voices?engine=starfish&type=public&limit=50`, {
75
+ headers: heygenAuthHeaders(),
76
+ });
77
+ const voices = payload.data ?? payload.voices ?? [];
78
+ const pick = voices.find((v) => v.language === "English") ?? voices[0];
79
+ if (!pick) throw new Error("no public starfish voice to default to — pass --voice");
80
+ return pick.voice_id;
81
+ }
82
+
83
+ // ── helpers ─────────────────────────────────────────────────────────────────
84
+ export function withWordIds(words) {
85
+ return (words ?? []).map((w, i) => ({
86
+ id: `w${i}`,
87
+ text: w.text,
88
+ start: w.start,
89
+ end: w.end,
90
+ }));
91
+ }
92
+
93
+ // `ffmpeg -i <file>` prints a `Duration: HH:MM:SS.ms` line to stderr even
94
+ // though it exits non-zero with no output requested. Parsing pulled out as
95
+ // a pure function so the ENOENT fallback below can be tested without
96
+ // depending on whether ffprobe/ffmpeg are actually installed on the
97
+ // machine running the tests.
98
+ export function parseFfmpegDurationBanner(stderrText) {
99
+ const match = /Duration:\s*(\d+):(\d+):(\d+(?:\.\d+)?)/.exec(stderrText ?? "");
100
+ if (!match) return NaN;
101
+ const [, hours, minutes, seconds] = match;
102
+ return Number(hours) * 3600 + Number(minutes) * 60 + Number(seconds);
103
+ }
104
+
105
+ // Some "essentials"-style ffmpeg distributions (common on Windows) ship
106
+ // ffmpeg.exe without ffprobe.exe. ffprobeDuration's caller (audio.mjs)
107
+ // otherwise reads a spurious NaN as "the WAV file is corrupt" and drops an
108
+ // already-successfully-synthesized TTS line, rather than "the tool for
109
+ // measuring it is missing".
110
+ function ffmpegDurationFallback(absPath) {
111
+ const r = spawnSync("ffmpeg", ["-i", absPath], { encoding: "utf8" });
112
+ return parseFfmpegDurationBanner(r.stderr);
113
+ }
114
+
115
+ export function ffprobeDuration(absPath) {
116
+ const r = spawnSync(
117
+ "ffprobe",
118
+ ["-v", "error", "-show_entries", "format=duration", "-of", "default=nw=1:nk=1", "--", absPath],
119
+ { encoding: "utf8" },
120
+ );
121
+ if (r.error?.code === "ENOENT") return ffmpegDurationFallback(absPath);
122
+ if (r.status !== 0) return NaN;
123
+ return parseFloat(String(r.stdout).trim());
124
+ }
125
+
126
+ export function resolveNpxCliFromNpmExecPath(
127
+ npmExecPath = process.env.npm_execpath,
128
+ pathExists = existsSync,
129
+ ) {
130
+ if (!npmExecPath) return null;
131
+ const fileName = npmExecPath.replace(/\\/g, "/").split("/").pop()?.toLowerCase();
132
+ const npxCliPath =
133
+ fileName === "npx-cli.js" ? npmExecPath : join(dirname(npmExecPath), "npx-cli.js");
134
+ return pathExists(npxCliPath) ? npxCliPath : null;
135
+ }
136
+
137
+ export function resolveNpxCliPath(
138
+ npmExecPath = process.env.npm_execpath,
139
+ nodeExecPath = process.env.npm_node_execpath || process.execPath,
140
+ pathExists = existsSync,
141
+ ) {
142
+ const fromNpm = resolveNpxCliFromNpmExecPath(npmExecPath, pathExists);
143
+ if (fromNpm) return fromNpm;
144
+ const besideNode = join(dirname(nodeExecPath), "node_modules", "npm", "bin", "npx-cli.js");
145
+ return pathExists(besideNode) ? besideNode : null;
146
+ }
147
+
148
+ export function resolveSpawnCommand(
149
+ cmd,
150
+ args,
151
+ opts = {},
152
+ platform = process.platform,
153
+ env = process.env,
154
+ pathExists = existsSync,
155
+ ) {
156
+ if (cmd !== "npx" || platform !== "win32") {
157
+ return { cmd, args, opts: { stdio: "ignore", ...opts } };
158
+ }
159
+
160
+ // On Windows, npx resolves to npx.cmd, which Node cannot execute directly.
161
+ // Avoid `shell:true` and the .cmd shim entirely by invoking npm's JS CLI with
162
+ // node, preserving request-provided values as argv data instead of shell text.
163
+ const nodeExecPath = env.npm_node_execpath || process.execPath;
164
+ const npxCliPath = resolveNpxCliPath(env.npm_execpath, nodeExecPath, pathExists);
165
+ if (!npxCliPath) return null;
166
+ return {
167
+ cmd: nodeExecPath,
168
+ args: [npxCliPath, ...args.map((arg) => String(arg))],
169
+ opts: { stdio: "ignore", windowsHide: true, ...opts },
170
+ };
171
+ }
172
+
173
+ // `platform`/`spawnFn` params (default process.platform / the real spawn)
174
+ // exist so tests can exercise the win32 branch without mocking node:child_process
175
+ // (its ESM exports are non-configurable, so mock.method can't patch it).
176
+ // One-shot so a whole batch of TTS lines doesn't repeat the same diagnostic.
177
+ let _warnedNpxResolution = false;
178
+ /** Test-only: reset the one-shot npx-resolution warning latch. */
179
+ export function _resetNpxResolutionWarnForTests() {
180
+ _warnedNpxResolution = false;
181
+ }
182
+
183
+ export function spawnP(
184
+ cmd,
185
+ args,
186
+ opts = {},
187
+ platform = process.platform,
188
+ spawnFn = spawn,
189
+ env = process.env,
190
+ pathExists = existsSync,
191
+ ) {
192
+ const resolved = resolveSpawnCommand(cmd, args, opts, platform, env, pathExists);
193
+ if (!resolved) {
194
+ // resolveSpawnCommand only returns null for the npx-on-win32 case where
195
+ // neither npm's configured CLI nor the beside-node fallback exists. Without
196
+ // this, every call silently returns status:-1 and stdio:"ignore" hides why.
197
+ if (!_warnedNpxResolution) {
198
+ _warnedNpxResolution = true;
199
+ const reason = env.npm_execpath
200
+ ? `npm_execpath (${env.npm_execpath}) and the beside-node npm fallback could not be found`
201
+ : "npm_execpath is unset and the beside-node npm fallback could not be found";
202
+ console.error(
203
+ `[media-use] Cannot run "${cmd}" on Windows: ${reason}. ` +
204
+ `Every "${cmd}" call is being skipped. Install npm with Node, or run via ` +
205
+ `\`npx\`/\`npm run\` with a valid npm_execpath.`,
206
+ );
207
+ }
208
+ return Promise.resolve({ status: -1 });
209
+ }
210
+ return new Promise((resolve) => {
211
+ const p = spawnFn(resolved.cmd, resolved.args, resolved.opts);
212
+ p.on("exit", (code) => resolve({ status: code ?? -1 }));
213
+ p.on("error", () => resolve({ status: -1 }));
214
+ });
215
+ }
216
+
217
+ // mp3/whatever bytes → wav 44.1k mono at destWav (ffmpeg detects true format).
218
+ function transcodeToWav(bytes, destWav) {
219
+ const td = mkdtempSync(join(tmpdir(), "hf-tts-"));
220
+ const tmp = join(td, "a.mp3");
221
+ writeFileSync(tmp, bytes);
222
+ mkdirSync(dirname(destWav), { recursive: true });
223
+ const ff = spawnSync(
224
+ "ffmpeg",
225
+ ["-y", "-loglevel", "error", "-i", tmp, "-ar", "44100", "-ac", "1", destWav],
226
+ { stdio: "ignore" },
227
+ );
228
+ rmSync(td, { recursive: true, force: true });
229
+ return ff.status === 0 && existsSync(destWav);
230
+ }
231
+
232
+ const ELEVENLABS_PY = `
233
+ import os, sys
234
+ from elevenlabs.client import ElevenLabs
235
+ from elevenlabs import save
236
+ client = ElevenLabs(api_key=os.environ["ELEVENLABS_API_KEY"])
237
+ text = open(sys.argv[1]).read()
238
+ audio = client.text_to_speech.convert(
239
+ text=text, voice_id=sys.argv[2],
240
+ model_id="eleven_multilingual_v2", output_format="mp3_44100_128",
241
+ )
242
+ save(audio, sys.argv[3])
243
+ `;
244
+
245
+ // ── synthesize one line ───────────────────────────────────────────────────────
246
+ // Writes wav at wavAbs. Returns { ok, words, error } — words is the raw
247
+ // [{text,start,end}] array for HeyGen (native), or null for ElevenLabs/Kokoro
248
+ // (caller must transcribeWav). Never throws; failures return { ok:false, error }
249
+ // where `error` states WHY (so the caller can surface it, not a bare "TTS failed").
250
+ export async function synthesizeOne({
251
+ provider,
252
+ text,
253
+ voiceId,
254
+ lang = "en",
255
+ speed = 1.0,
256
+ model,
257
+ style,
258
+ wavAbs,
259
+ hyperframesDir,
260
+ }) {
261
+ if (provider === "heygen") return synthesizeHeygen({ text, voiceId, lang, speed, wavAbs });
262
+ if (provider === "gemini")
263
+ return synthesizeGemini({ text, voiceId, model, style, speed, wavAbs });
264
+ if (provider === "elevenlabs") {
265
+ // The Python helper writes straight to wavAbs; unlike heygen (transcodeToWav)
266
+ // and kokoro (the `hyperframes tts` CLI), it does NOT create the parent dir,
267
+ // so on a fresh project (no assets/voice/ yet) the save fails and the line is
268
+ // silently dropped as "TTS failed - omitted". Create it first, like the other
269
+ // providers do. Guarded so a mkdir failure (EACCES/EROFS) returns
270
+ // { ok:false } like the rest of this branch rather than throwing (the
271
+ // function's contract is "never throws; failures return { ok:false }").
272
+ try {
273
+ mkdirSync(dirname(wavAbs), { recursive: true });
274
+ } catch {
275
+ return { ok: false, words: null };
276
+ }
277
+ const { cmd, args } = pythonInvocation([
278
+ "-c",
279
+ ELEVENLABS_PY,
280
+ writeTmpText(text),
281
+ voiceId,
282
+ wavAbs,
283
+ ]);
284
+ const r = await spawnP(cmd, args, {});
285
+ return synthResult(r, wavAbs, "elevenlabs (python)");
286
+ }
287
+ // kokoro — via the published CLI; --output is relative to the project dir.
288
+ const wavRel = relTo(hyperframesDir, wavAbs);
289
+ const args = ["hyperframes", "tts", writeTmpText(text), "--voice", voiceId, "--output", wavRel];
290
+ if (lang !== "en") args.push("--lang", lang);
291
+ if (speed !== 1) args.push("--speed", String(speed));
292
+ const r = await spawnP("npx", args, { cwd: hyperframesDir });
293
+ return synthResult(r, wavAbs, "kokoro (npx hyperframes tts)");
294
+ }
295
+
296
+ // Shape a spawn result into { ok, words, error }, naming why on failure so the
297
+ // caller surfaces it instead of a bare "TTS failed".
298
+ export function synthResult(r, wavAbs, label) {
299
+ if (r.status === 0 && existsSync(wavAbs)) return { ok: true, words: null };
300
+ const why =
301
+ r.status !== 0 ? `${label} exited with status ${r.status}` : `${label} produced no wav file`;
302
+ return { ok: false, words: null, error: why };
303
+ }
304
+
305
+ // `deps` is injectable for tests; production uses the real network/ffmpeg impls.
306
+ // Every failure path returns an `error` string so the caller can surface WHY a
307
+ // line was dropped instead of the bare "TTS failed" that hid the real cause
308
+ // (e.g. an HTTP 402 plan_upgrade_required thrown by heygenJSON was swallowed).
309
+ export async function synthesizeHeygen({ text, voiceId, lang, speed, wavAbs }, deps = {}) {
310
+ const requestJSON = deps.heygenJSON ?? heygenJSON;
311
+ const authHeaders = deps.heygenAuthHeaders ?? heygenAuthHeaders;
312
+ const fetchImpl = deps.fetch ?? fetch;
313
+ const transcode = deps.transcodeToWav ?? transcodeToWav;
314
+ try {
315
+ const body = { text, voice_id: voiceId, speed };
316
+ if (lang !== "en") body.language = lang;
317
+ const payload = await requestJSON(`/voices/speech`, {
318
+ method: "POST",
319
+ headers: authHeaders(),
320
+ body,
321
+ });
322
+ const inner = payload.data ?? payload;
323
+ if (!inner.audio_url) {
324
+ return { ok: false, words: null, error: "HeyGen /voices/speech returned no audio_url" };
325
+ }
326
+ const res = await fetchMedia(inner.audio_url, { fetchImpl });
327
+ if (!res.ok) {
328
+ return { ok: false, words: null, error: `audio_url fetch failed: HTTP ${res.status}` };
329
+ }
330
+ const bytes = Buffer.from(await res.arrayBuffer());
331
+ // .wav output → transcode to 44.1k mono; .mp3 → raw bytes (no ffmpeg). The
332
+ // engine always asks for .wav; the standalone heygen-tts CLI may ask for .mp3.
333
+ if (wavAbs.endsWith(".wav")) {
334
+ if (!transcode(bytes, wavAbs)) {
335
+ return {
336
+ ok: false,
337
+ words: null,
338
+ error: "wav transcode failed (ffmpeg)",
339
+ };
340
+ }
341
+ } else {
342
+ mkdirSync(dirname(wavAbs), { recursive: true });
343
+ writeFileSync(wavAbs, bytes);
344
+ }
345
+ const words = Array.isArray(inner.word_timestamps)
346
+ ? inner.word_timestamps
347
+ .filter((w) => w && typeof w.word === "string" && isFinite(w.start) && isFinite(w.end))
348
+ .filter((w) => !/^<.*>$/.test(w.word.trim())) // drop <start>/<end> sentinels
349
+ .map((w) => ({ text: w.word, start: w.start, end: w.end }))
350
+ : [];
351
+ return { ok: true, words };
352
+ } catch (e) {
353
+ return { ok: false, words: null, error: heygenMessage(e) };
354
+ }
355
+ }
356
+
357
+ // ElevenLabs/Kokoro have no word timings — run Whisper over the wav. Returns the
358
+ // flat [{id,text,start,end}] word array, or null. Each call uses a throwaway
359
+ // --dir so parallel scenes don't collide on transcript.json.
360
+ export async function transcribeWav({ wavRel, lang = "en", hyperframesDir }) {
361
+ const model = lang === "en" ? "small.en" : "small";
362
+ const td = mkdtempSync(join(tmpdir(), "hf-trans-"));
363
+ const args = ["hyperframes", "transcribe", wavRel, "--model", model, "--dir", td];
364
+ if (lang !== "en") args.push("--language", lang);
365
+ const r = await spawnP("npx", args, { cwd: hyperframesDir });
366
+ let words = null;
367
+ if (r.status === 0) {
368
+ const src = join(td, "transcript.json");
369
+ if (existsSync(src)) {
370
+ try {
371
+ const arr = JSON.parse(readFileSync(src, "utf8"));
372
+ if (Array.isArray(arr) && arr.length) words = arr;
373
+ } catch {}
374
+ }
375
+ }
376
+ rmSync(td, { recursive: true, force: true });
377
+ return words;
378
+ }
379
+
380
+ // ── tiny local utils ──────────────────────────────────────────────────────────
381
+ function writeTmpText(text) {
382
+ const td = mkdtempSync(join(tmpdir(), "hf-txt-"));
383
+ const p = join(td, "line.txt");
384
+ writeFileSync(p, text);
385
+ return p;
386
+ }
387
+ function relTo(base, abs) {
388
+ return abs.startsWith(base + "/") ? abs.slice(base.length + 1) : abs;
389
+ }
@@ -0,0 +1,158 @@
1
+ import { test } from "node:test";
2
+ import assert from "node:assert/strict";
3
+ import { EventEmitter } from "node:events";
4
+ import {
5
+ resolveNpxCliFromNpmExecPath,
6
+ resolveNpxCliPath,
7
+ resolveSpawnCommand,
8
+ spawnP,
9
+ _resetNpxResolutionWarnForTests,
10
+ } from "./tts.mjs";
11
+
12
+ // Regression: on Windows, npx resolves to npx.cmd, which spawn() cannot exec
13
+ // without shell:true — it fails ENOENT, silently swallowed as ok:false by the
14
+ // caller. spawnP takes injectable platform/spawnFn params so this doesn't
15
+ // need to touch the real process.platform or mock node:child_process (whose
16
+ // ESM exports are non-configurable).
17
+ function fakeSpawn(captured) {
18
+ return (cmd, args, opts) => {
19
+ captured.push({ cmd, args, opts });
20
+ const p = new EventEmitter();
21
+ setImmediate(() => p.emit("exit", 0));
22
+ return p;
23
+ };
24
+ }
25
+
26
+ const envWithNpxCli = {
27
+ npm_execpath: "/opt/node/lib/node_modules/npm/bin/npm-cli.js",
28
+ npm_node_execpath: "/opt/node/bin/node",
29
+ };
30
+ const npxCliPath = "/opt/node/lib/node_modules/npm/bin/npx-cli.js";
31
+ const pathExists = (path) => path === npxCliPath;
32
+
33
+ test("resolveNpxCliFromNpmExecPath finds npx-cli next to npm-cli", () => {
34
+ assert.equal(resolveNpxCliFromNpmExecPath(envWithNpxCli.npm_execpath, pathExists), npxCliPath);
35
+ });
36
+
37
+ test("resolveNpxCliPath finds npx-cli beside node when npm_execpath is unset", () => {
38
+ const node = "C:/Program Files/nodejs/node.exe";
39
+ const expected = "C:/Program Files/nodejs/node_modules/npm/bin/npx-cli.js";
40
+ assert.equal(
41
+ resolveNpxCliPath(undefined, node, (path) => path === expected),
42
+ expected,
43
+ );
44
+ });
45
+
46
+ test("resolveSpawnCommand routes npx through node+npx-cli on win32 without shell:true", () => {
47
+ const resolved = resolveSpawnCommand(
48
+ "npx",
49
+ ["hyperframes", "tts", "C:\\Users\\Test User\\line.txt", "--voice", "am_michael"],
50
+ {},
51
+ "win32",
52
+ envWithNpxCli,
53
+ pathExists,
54
+ );
55
+ assert.ok(resolved);
56
+ assert.equal(resolved.cmd, envWithNpxCli.npm_node_execpath);
57
+ assert.deepEqual(resolved.args, [
58
+ npxCliPath,
59
+ "hyperframes",
60
+ "tts",
61
+ "C:\\Users\\Test User\\line.txt",
62
+ "--voice",
63
+ "am_michael",
64
+ ]);
65
+ assert.equal(resolved.opts.shell, undefined);
66
+ });
67
+
68
+ test("resolveSpawnCommand preserves Windows npx shell metacharacters as argv data", () => {
69
+ const resolved = resolveSpawnCommand(
70
+ "npx",
71
+ ["hyperframes", "tts", "hello & calc"],
72
+ {},
73
+ "win32",
74
+ envWithNpxCli,
75
+ pathExists,
76
+ );
77
+ assert.ok(resolved);
78
+ assert.deepEqual(resolved.args, [npxCliPath, "hyperframes", "tts", "hello & calc"]);
79
+ });
80
+
81
+ test("spawnP uses the resolved node+npx-cli command for npx on win32", async () => {
82
+ const captured = [];
83
+ await spawnP(
84
+ "npx",
85
+ ["hyperframes", "tts"],
86
+ {},
87
+ "win32",
88
+ fakeSpawn(captured),
89
+ envWithNpxCli,
90
+ pathExists,
91
+ );
92
+ assert.equal(captured.length, 1);
93
+ assert.equal(captured[0].cmd, envWithNpxCli.npm_node_execpath);
94
+ assert.deepEqual(captured[0].args, [npxCliPath, "hyperframes", "tts"]);
95
+ assert.equal(captured[0].opts.shell, undefined);
96
+ });
97
+
98
+ test("spawnP does not enable shell for npx on darwin/linux", async () => {
99
+ const captured = [];
100
+ await spawnP("npx", ["hyperframes", "tts"], {}, "darwin", fakeSpawn(captured));
101
+ assert.equal(captured[0].cmd, "npx");
102
+ assert.deepEqual(captured[0].args, ["hyperframes", "tts"]);
103
+ assert.equal(captured[0].opts.shell, undefined);
104
+ });
105
+
106
+ test("spawnP does not enable shell for non-npx commands even on win32", async () => {
107
+ const captured = [];
108
+ await spawnP("python3", ["-c", "pass"], {}, "win32", fakeSpawn(captured));
109
+ assert.equal(captured[0].cmd, "python3");
110
+ assert.deepEqual(captured[0].args, ["-c", "pass"]);
111
+ assert.equal(captured[0].opts.shell, undefined);
112
+ });
113
+
114
+ test("spawnP resolves npx beside node when npm_execpath is unset on win32", async () => {
115
+ _resetNpxResolutionWarnForTests();
116
+ const captured = [];
117
+ const node = "C:/Program Files/nodejs/node.exe";
118
+ const npxCli = "C:/Program Files/nodejs/node_modules/npm/bin/npx-cli.js";
119
+ const result = await spawnP(
120
+ "npx",
121
+ ["hyperframes", "tts"],
122
+ {},
123
+ "win32",
124
+ fakeSpawn(captured),
125
+ { npm_node_execpath: node },
126
+ (path) => path === npxCli,
127
+ );
128
+ assert.equal(result.status, 0);
129
+ assert.equal(captured.length, 1);
130
+ assert.equal(captured[0].cmd, node);
131
+ assert.deepEqual(captured[0].args, [npxCli, "hyperframes", "tts"]);
132
+ });
133
+
134
+ test("spawnP warns once with an accurate diagnostic when neither npx path exists", async () => {
135
+ _resetNpxResolutionWarnForTests();
136
+ const errors = [];
137
+ const originalError = console.error;
138
+ console.error = (message) => errors.push(String(message));
139
+ try {
140
+ const env = { npm_execpath: "C:/missing/npm-cli.js", npm_node_execpath: "C:/node/node.exe" };
141
+ const missing = () => false;
142
+ assert.equal(
143
+ (await spawnP("npx", ["hyperframes", "tts"], {}, "win32", fakeSpawn([]), env, missing))
144
+ .status,
145
+ -1,
146
+ );
147
+ assert.equal(
148
+ (await spawnP("npx", ["hyperframes", "tts"], {}, "win32", fakeSpawn([]), env, missing))
149
+ .status,
150
+ -1,
151
+ );
152
+ } finally {
153
+ console.error = originalError;
154
+ }
155
+ assert.equal(errors.length, 1);
156
+ assert.match(errors[0], /npm_execpath \(C:\/missing\/npm-cli\.js\)/);
157
+ assert.doesNotMatch(errors[0], /npm_execpath is not set/);
158
+ });