framefields 2.6.1 → 2.7.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 (471) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-CYrO9q9P.mjs → audio-j3ttoRDX.mjs} +4 -4
  4. package/dist/{audio-CYrO9q9P.mjs.map → audio-j3ttoRDX.mjs.map} +1 -1
  5. package/dist/{audio-B5mdR8vv.d.mts → audio-tL8CcPra.d.mts} +3 -3
  6. package/dist/{audio-B5mdR8vv.d.mts.map → audio-tL8CcPra.d.mts.map} +1 -1
  7. package/dist/components/index.d.mts +10 -10
  8. package/dist/components/index.mjs +44 -44
  9. package/dist/{dist-cC6nOaMR.mjs → dist-BHTd-EC1.mjs} +164 -34
  10. package/dist/dist-BHTd-EC1.mjs.map +1 -0
  11. package/dist/{dist-DSKhnhDk.mjs → dist-BM0ilHvQ.mjs} +115 -21
  12. package/dist/dist-BM0ilHvQ.mjs.map +1 -0
  13. package/dist/{dist-D021IFfp.mjs → dist-BRXsfWKQ.mjs} +444 -8
  14. package/dist/dist-BRXsfWKQ.mjs.map +1 -0
  15. package/dist/{dist-BPOi5xb_.mjs → dist-CPtFZxtu.mjs} +2 -2
  16. package/dist/{dist-BPOi5xb_.mjs.map → dist-CPtFZxtu.mjs.map} +1 -1
  17. package/dist/effects/index.d.mts +4 -4
  18. package/dist/effects/index.mjs +35 -35
  19. package/dist/{effects-Dvdwndk0.mjs → effects-Dy661XS_.mjs} +3 -3
  20. package/dist/{effects-Dvdwndk0.mjs.map → effects-Dy661XS_.mjs.map} +1 -1
  21. package/dist/fonts/index.mjs +2 -2
  22. package/dist/{fonts-B6a4CyoM.mjs → fonts-BcFhAqqO.mjs} +2 -2
  23. package/dist/{fonts-B6a4CyoM.mjs.map → fonts-BcFhAqqO.mjs.map} +1 -1
  24. package/dist/{gpu-CrQADlcf.mjs → gpu-zIhSz_0X.mjs} +2 -2
  25. package/dist/{gpu-CrQADlcf.mjs.map → gpu-zIhSz_0X.mjs.map} +1 -1
  26. package/dist/{index-ocZc12ZS.d.mts → index-B1ENegOQ.d.mts} +224 -2
  27. package/dist/index-B1ENegOQ.d.mts.map +1 -0
  28. package/dist/{index-D-Gnyffj.d.mts → index-CJRTBLZ4.d.mts} +4 -4
  29. package/dist/{index-D-Gnyffj.d.mts.map → index-CJRTBLZ4.d.mts.map} +1 -1
  30. package/dist/{index-BhzlG_1Q.d.mts → index-Cg30slle.d.mts} +2 -2
  31. package/dist/{index-BhzlG_1Q.d.mts.map → index-Cg30slle.d.mts.map} +1 -1
  32. package/dist/{index-B4o6F1JC.d.mts → index-DeeMmoEA.d.mts} +2 -2
  33. package/dist/{index-B4o6F1JC.d.mts.map → index-DeeMmoEA.d.mts.map} +1 -1
  34. package/dist/{index-CWG19cm-.d.mts → index-ePGQ_C7f.d.mts} +39 -16
  35. package/dist/index-ePGQ_C7f.d.mts.map +1 -0
  36. package/dist/{index-o8LxWdwz.d.mts → index-l1yRugLc.d.mts} +3 -3
  37. package/dist/{index-o8LxWdwz.d.mts.map → index-l1yRugLc.d.mts.map} +1 -1
  38. package/dist/{index-3Vdef2KE.d.mts → index-uDZ9Yuv-.d.mts} +5 -8
  39. package/dist/index-uDZ9Yuv-.d.mts.map +1 -0
  40. package/dist/index.d.mts +11 -11
  41. package/dist/index.mjs +53 -53
  42. package/dist/preview/index.d.mts +3 -3
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-OTsGYyOU.mjs → preview-IpdVFuxv.mjs} +3 -2
  45. package/dist/{preview-OTsGYyOU.mjs.map → preview-IpdVFuxv.mjs.map} +1 -1
  46. package/dist/preview-engine/audio.mjs +1 -1
  47. package/dist/preview-engine/{chunk-RF62TV3G.mjs → chunk-25WRUINA.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-MMVFX42U.mjs → chunk-2AEWPT6Y.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-IIOHF7MH.mjs → chunk-2MDTUA3W.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-KWTTANYN.mjs → chunk-2TLABBER.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-MUOJMF7M.mjs → chunk-3QOJVABU.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-RDEQ4LQU.mjs → chunk-4Q3ZUTQC.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-OXXRKNHW.mjs → chunk-5BXCJ2QX.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-JTT3YX7W.mjs → chunk-5R4UF7YK.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-4C26NVQY.mjs → chunk-6THE6J3A.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-SVE3XWO7.mjs → chunk-6VDYWMP5.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-ULPLHKM2.mjs → chunk-7B7QQDPZ.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-ULVX4VYT.mjs → chunk-7ZA36EZE.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-LYSU6S4O.mjs → chunk-AJ6BVUDB.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-J24VHZS6.mjs → chunk-BDXGUSSF.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-B7J72YSP.mjs → chunk-CC5V7UBF.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-JD4TBC6Z.mjs → chunk-CP42LYD7.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-LN3YAWUD.mjs → chunk-DJWDD3OE.mjs} +1 -1
  64. package/dist/preview-engine/{chunk-V3FODTPI.mjs → chunk-DZEWY4PR.mjs} +22 -22
  65. package/dist/preview-engine/{chunk-RKNV5N7D.mjs → chunk-ENGQ55LR.mjs} +1 -1
  66. package/dist/preview-engine/{chunk-AGLAJGQJ.mjs → chunk-FBXKVLTB.mjs} +14 -14
  67. package/dist/preview-engine/{chunk-MJCK5FLZ.mjs → chunk-FMEXTHL7.mjs} +1 -1
  68. package/dist/preview-engine/{chunk-UEQIO6AH.mjs → chunk-FQ7UCMWR.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-TPFDAOW7.mjs → chunk-FRIBHQTM.mjs} +1 -1
  70. package/dist/preview-engine/chunk-FT7HJ6IE.mjs +3 -0
  71. package/dist/preview-engine/{chunk-YEPYVASB.mjs → chunk-G3UOUGIE.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-4JX5LBE2.mjs → chunk-H4GDIVX4.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-LHCEQ77S.mjs → chunk-HU73APZL.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-DDFWN7DI.mjs → chunk-I7QIQURU.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-3KHD67Q3.mjs → chunk-ID344UBN.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-5NT7WWJR.mjs → chunk-IGCXUGHT.mjs} +1 -1
  77. package/dist/preview-engine/{chunk-QPBTLJ5W.mjs → chunk-IK3YA6MC.mjs} +1 -1
  78. package/dist/preview-engine/chunk-J5SKQFJ6.mjs +1 -0
  79. package/dist/preview-engine/{chunk-Q7JN4EHX.mjs → chunk-JOPZNSZJ.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-SQ52PBF3.mjs → chunk-JOSNIMFT.mjs} +1 -1
  81. package/dist/preview-engine/{chunk-SXNCNG4L.mjs → chunk-JR443L5E.mjs} +1 -1
  82. package/dist/preview-engine/{chunk-FZLKPBKS.mjs → chunk-KCAFMWDM.mjs} +1 -1
  83. package/dist/preview-engine/{chunk-QRYCB6E3.mjs → chunk-LAEPNVOE.mjs} +1 -1
  84. package/dist/preview-engine/chunk-MAALUQK3.mjs +1974 -0
  85. package/dist/preview-engine/chunk-MHCXSWK7.mjs +1 -0
  86. package/dist/preview-engine/{chunk-4INGTMZ5.mjs → chunk-MWBARRK2.mjs} +1 -1
  87. package/dist/preview-engine/chunk-MXK2PP6K.mjs +1 -0
  88. package/dist/preview-engine/{chunk-GQIRV466.mjs → chunk-MXPN2GB7.mjs} +1 -1
  89. package/dist/preview-engine/{chunk-W2EZFV4Q.mjs → chunk-NHYB5YC3.mjs} +1 -1
  90. package/dist/preview-engine/{chunk-K3IMPV6T.mjs → chunk-PXSKIGAP.mjs} +6 -6
  91. package/dist/preview-engine/{chunk-SP22JWN2.mjs → chunk-PYM2FBFA.mjs} +1 -1
  92. package/dist/preview-engine/chunk-QDTJ4MOJ.mjs +1 -0
  93. package/dist/preview-engine/{chunk-6PMATELR.mjs → chunk-RQU2GFGH.mjs} +1 -1
  94. package/dist/preview-engine/{chunk-UQD2UE6I.mjs → chunk-RWDPBES3.mjs} +1 -1
  95. package/dist/preview-engine/{chunk-QVW5METG.mjs → chunk-S5ONWSZF.mjs} +1 -1
  96. package/dist/preview-engine/{chunk-2YGR5YCN.mjs → chunk-SIU6JU2R.mjs} +1 -1
  97. package/dist/preview-engine/{chunk-NQZRPPUU.mjs → chunk-SJ3Q4AQP.mjs} +1 -1
  98. package/dist/preview-engine/{chunk-Q6CRERSJ.mjs → chunk-T36SKUWK.mjs} +9 -9
  99. package/dist/preview-engine/chunk-TEBZRQPG.mjs +1 -0
  100. package/dist/preview-engine/{chunk-WDWHOXSA.mjs → chunk-UUDML2SN.mjs} +1 -1
  101. package/dist/preview-engine/{chunk-RHXZXWJ4.mjs → chunk-VAS4IJZR.mjs} +1 -1
  102. package/dist/preview-engine/{chunk-DOCFOSA6.mjs → chunk-WTDK6H46.mjs} +1 -1
  103. package/dist/preview-engine/chunk-XNMEVVQB.mjs +1 -0
  104. package/dist/preview-engine/{chunk-AKT4YQWL.mjs → chunk-YVGT4NK6.mjs} +2 -2
  105. package/dist/preview-engine/{chunk-ZGMA27IG.mjs → chunk-ZR4QFIJR.mjs} +1 -1
  106. package/dist/preview-engine/chunk-ZYTXBBIX.mjs +1 -0
  107. package/dist/preview-engine/components.mjs +1 -1
  108. package/dist/preview-engine/effects.mjs +1 -1
  109. package/dist/preview-engine/fonts.mjs +1 -1
  110. package/dist/preview-engine/framefields.mjs +1 -1
  111. package/dist/preview-engine/player.mjs +2 -2
  112. package/dist/preview-engine/{renderers-FC7G7KU7.mjs → renderers-2AKYMAIK.mjs} +1 -1
  113. package/dist/preview-engine/renderers-363CKEIG.mjs +1 -0
  114. package/dist/preview-engine/{renderers-EJGF3PYQ.mjs → renderers-36L24ZVS.mjs} +1 -1
  115. package/dist/preview-engine/renderers-3FMMVDMA.mjs +1 -0
  116. package/dist/preview-engine/{renderers-56TGEFDK.mjs → renderers-44AANAXR.mjs} +1 -1
  117. package/dist/preview-engine/renderers-4UUU62VV.mjs +1 -0
  118. package/dist/preview-engine/renderers-4ZTZFSAR.mjs +1 -0
  119. package/dist/preview-engine/{renderers-PYDOSDEY.mjs → renderers-5ZSB75GY.mjs} +1 -1
  120. package/dist/preview-engine/renderers-6KDD75BM.mjs +1 -0
  121. package/dist/preview-engine/renderers-7BJRD4G2.mjs +1 -0
  122. package/dist/preview-engine/{renderers-HBIBRZD7.mjs → renderers-AIIHGDJM.mjs} +1 -1
  123. package/dist/preview-engine/{renderers-P2FTCDZ7.mjs → renderers-AU746ORP.mjs} +1 -1
  124. package/dist/preview-engine/renderers-BIF2BETK.mjs +1 -0
  125. package/dist/preview-engine/{renderers-FD3ZT73R.mjs → renderers-BTQCHVHV.mjs} +1 -1
  126. package/dist/preview-engine/{renderers-HMNCIEU3.mjs → renderers-CFHBOAZG.mjs} +1 -1
  127. package/dist/preview-engine/renderers-CU5RW5UA.mjs +1 -0
  128. package/dist/preview-engine/renderers-DK5OBTKE.mjs +1 -0
  129. package/dist/preview-engine/renderers-EAKCDGTY.mjs +1 -0
  130. package/dist/preview-engine/{renderers-FYI6QNUH.mjs → renderers-EGBGC7MU.mjs} +1 -1
  131. package/dist/preview-engine/renderers-EVXCU7G7.mjs +1 -0
  132. package/dist/preview-engine/renderers-EXEYEH3F.mjs +1 -0
  133. package/dist/preview-engine/{renderers-RDHHVXRE.mjs → renderers-EXJDPS3T.mjs} +1 -1
  134. package/dist/preview-engine/renderers-F3WALPWI.mjs +1 -0
  135. package/dist/preview-engine/{renderers-4RVSLTCX.mjs → renderers-FS3EOB4J.mjs} +1 -1
  136. package/dist/preview-engine/{renderers-C3YXNKNM.mjs → renderers-GUL2MXDD.mjs} +1 -1
  137. package/dist/preview-engine/{renderers-EQDINUMT.mjs → renderers-H4HC44B5.mjs} +1 -1
  138. package/dist/preview-engine/renderers-H6565HO4.mjs +1 -0
  139. package/dist/preview-engine/renderers-HT5V6OZ2.mjs +1 -0
  140. package/dist/preview-engine/renderers-HXMOARWO.mjs +1 -0
  141. package/dist/preview-engine/renderers-HZ2Q7BGK.mjs +1 -0
  142. package/dist/preview-engine/renderers-I4N2K2KW.mjs +1 -0
  143. package/dist/preview-engine/renderers-I5J7U6CB.mjs +1 -0
  144. package/dist/preview-engine/renderers-IZV6QXR5.mjs +1 -0
  145. package/dist/preview-engine/renderers-JWGAPHWX.mjs +1 -0
  146. package/dist/preview-engine/renderers-KNDSVQTY.mjs +1 -0
  147. package/dist/preview-engine/renderers-KNDUOO6M.mjs +1 -0
  148. package/dist/preview-engine/renderers-KQAO3QEI.mjs +1 -0
  149. package/dist/preview-engine/{renderers-7SW2AHM2.mjs → renderers-LCSQLXRD.mjs} +1 -1
  150. package/dist/preview-engine/renderers-M34LOEHC.mjs +1 -0
  151. package/dist/preview-engine/renderers-ML6GNCWB.mjs +1 -0
  152. package/dist/preview-engine/renderers-NARG274F.mjs +1 -0
  153. package/dist/preview-engine/renderers-NCFPOSWR.mjs +1 -0
  154. package/dist/preview-engine/{renderers-ZAMSS7QN.mjs → renderers-PCOTECQB.mjs} +1 -1
  155. package/dist/preview-engine/renderers-PG5JHI2S.mjs +1 -0
  156. package/dist/preview-engine/{renderers-LTV5RFDJ.mjs → renderers-Q7MNLQJF.mjs} +1 -1
  157. package/dist/preview-engine/{renderers-GHP7SL5M.mjs → renderers-QXVSJYZL.mjs} +1 -1
  158. package/dist/preview-engine/{renderers-H2UI7YEO.mjs → renderers-R3ERZ3ZY.mjs} +1 -1
  159. package/dist/preview-engine/renderers-RXQKV65L.mjs +1 -0
  160. package/dist/preview-engine/renderers-SA73GD2B.mjs +1 -0
  161. package/dist/preview-engine/renderers-SLIXUHNX.mjs +1 -0
  162. package/dist/preview-engine/renderers-T462JZNA.mjs +1 -0
  163. package/dist/preview-engine/{renderers-LV6LLULR.mjs → renderers-TH2XZAYW.mjs} +1 -1
  164. package/dist/preview-engine/{renderers-ART3EGSZ.mjs → renderers-UHZIERVH.mjs} +1 -1
  165. package/dist/preview-engine/renderers-V7CFVGYK.mjs +1 -0
  166. package/dist/preview-engine/renderers-VY5E7BPK.mjs +1 -0
  167. package/dist/preview-engine/{renderers-ZDMDDWLN.mjs → renderers-WKXGELRG.mjs} +1 -1
  168. package/dist/preview-engine/{renderers-GY4R467B.mjs → renderers-WLDIIFR5.mjs} +1 -1
  169. package/dist/preview-engine/{renderers-NTKSN32T.mjs → renderers-WM6WBRH6.mjs} +1 -1
  170. package/dist/preview-engine/renderers-WT5FQZM7.mjs +228 -0
  171. package/dist/preview-engine/{renderers-YK74777T.mjs → renderers-WTKRLNNR.mjs} +1 -1
  172. package/dist/preview-engine/{renderers-BWRNCXR6.mjs → renderers-X6GKEVP7.mjs} +1 -1
  173. package/dist/preview-engine/renderers-Y47N5EYR.mjs +1 -0
  174. package/dist/preview-engine/renderers-Y4CUVZYI.mjs +1 -0
  175. package/dist/preview-engine/renderers-Y6YC7ZAK.mjs +1 -0
  176. package/dist/preview-engine/renderers-Y6ZYUAQG.mjs +1 -0
  177. package/dist/preview-engine/{renderers-YBTWN76S.mjs → renderers-YRWXYT5A.mjs} +1 -1
  178. package/dist/preview-engine/{renderers-SY435YU3.mjs → renderers-YWC4MXPG.mjs} +1 -1
  179. package/dist/preview-engine/{renderers-7GMW52G3.mjs → renderers-ZWNPYZN6.mjs} +1 -1
  180. package/dist/preview-engine/signals.mjs +1 -1
  181. package/dist/{program-W4CWO2bp.mjs → program-KPBfq9tw.mjs} +95 -21
  182. package/dist/program-KPBfq9tw.mjs.map +1 -0
  183. package/dist/registry/index.json +1 -1
  184. package/dist/registry/lower-third.json +1 -1
  185. package/dist/registry/terminal.json +1 -1
  186. package/dist/registry/text-reveal.json +2 -2
  187. package/dist/registry/title-card.json +1 -1
  188. package/dist/renderer/index.d.mts +2 -2
  189. package/dist/renderer/index.mjs +2 -2
  190. package/dist/{renderer-CX4rvqm9.mjs → renderer-1-FLx8kd.mjs} +3 -3
  191. package/dist/{renderer-CX4rvqm9.mjs.map → renderer-1-FLx8kd.mjs.map} +1 -1
  192. package/dist/{renderer-BIMm7lYG.mjs → renderer-47d3etrX.mjs} +4 -4
  193. package/dist/{renderer-BIMm7lYG.mjs.map → renderer-47d3etrX.mjs.map} +1 -1
  194. package/dist/{renderer-CPtyQrJI.mjs → renderer-6GCG6JxD.mjs} +3 -3
  195. package/dist/{renderer-CPtyQrJI.mjs.map → renderer-6GCG6JxD.mjs.map} +1 -1
  196. package/dist/{renderer-BE6K88VR.mjs → renderer-8BIDdgjt.mjs} +3 -3
  197. package/dist/{renderer-BE6K88VR.mjs.map → renderer-8BIDdgjt.mjs.map} +1 -1
  198. package/dist/renderer-B-5TlncB.mjs +5 -0
  199. package/dist/{renderer-FgP_1OgD.mjs → renderer-B1yzSbvC.mjs} +4 -4
  200. package/dist/{renderer-FgP_1OgD.mjs.map → renderer-B1yzSbvC.mjs.map} +1 -1
  201. package/dist/{renderer-158rymL0.mjs → renderer-B2YiXpp-.mjs} +2 -2
  202. package/dist/{renderer-158rymL0.mjs.map → renderer-B2YiXpp-.mjs.map} +1 -1
  203. package/dist/{renderer-eQP0fvgc.mjs → renderer-B55ljMI_.mjs} +2 -2
  204. package/dist/{renderer-eQP0fvgc.mjs.map → renderer-B55ljMI_.mjs.map} +1 -1
  205. package/dist/{renderer-Duorbrb8.mjs → renderer-B6Tg4UgH.mjs} +4 -4
  206. package/dist/{renderer-Duorbrb8.mjs.map → renderer-B6Tg4UgH.mjs.map} +1 -1
  207. package/dist/{renderer-DmrP4dsn.mjs → renderer-BFnf-8Yt.mjs} +3 -3
  208. package/dist/{renderer-DmrP4dsn.mjs.map → renderer-BFnf-8Yt.mjs.map} +1 -1
  209. package/dist/{renderer-CLP6Lm7y.mjs → renderer-BGHHoPiD.mjs} +2 -2
  210. package/dist/{renderer-BO5u8eFS.mjs → renderer-BHUjPi24.mjs} +2 -2
  211. package/dist/{renderer-BO5u8eFS.mjs.map → renderer-BHUjPi24.mjs.map} +1 -1
  212. package/dist/renderer-BHXtDg5_.mjs +3 -0
  213. package/dist/{renderer-HPBahXjt.mjs → renderer-BIk67-jU.mjs} +2 -2
  214. package/dist/{renderer-HPBahXjt.mjs.map → renderer-BIk67-jU.mjs.map} +1 -1
  215. package/dist/{renderer-C-dcd14F.d.mts → renderer-BLEmr0Lt.d.mts} +2 -2
  216. package/dist/{renderer-C-dcd14F.d.mts.map → renderer-BLEmr0Lt.d.mts.map} +1 -1
  217. package/dist/{renderer-tYmQUp4d.mjs → renderer-BLs5sDdk.mjs} +3 -3
  218. package/dist/{renderer-tYmQUp4d.mjs.map → renderer-BLs5sDdk.mjs.map} +1 -1
  219. package/dist/renderer-BPd3gvEt.mjs +5 -0
  220. package/dist/{renderer-BiH29MS6.mjs → renderer-BXul0Wy6.mjs} +3 -3
  221. package/dist/{renderer-BiH29MS6.mjs.map → renderer-BXul0Wy6.mjs.map} +1 -1
  222. package/dist/{renderer-DVdRzDwX.mjs → renderer-B_1SLBPa.mjs} +3 -3
  223. package/dist/{renderer-DVdRzDwX.mjs.map → renderer-B_1SLBPa.mjs.map} +1 -1
  224. package/dist/renderer-B_ep98BH.mjs +5 -0
  225. package/dist/renderer-Ba_KUbKW.mjs +5 -0
  226. package/dist/{renderer-dX7Fy1NR.mjs → renderer-BbyNUjE_.mjs} +3 -3
  227. package/dist/{renderer-dX7Fy1NR.mjs.map → renderer-BbyNUjE_.mjs.map} +1 -1
  228. package/dist/{renderer-0n4A8P2_.mjs → renderer-BcVr_cIk.mjs} +2 -2
  229. package/dist/{renderer-0n4A8P2_.mjs.map → renderer-BcVr_cIk.mjs.map} +1 -1
  230. package/dist/renderer-BeL2hstU.mjs +5 -0
  231. package/dist/renderer-Bj81osPQ.mjs +5 -0
  232. package/dist/{renderer-ZM2jwJbX.mjs → renderer-BjL7sKGU.mjs} +3 -3
  233. package/dist/{renderer-ZM2jwJbX.mjs.map → renderer-BjL7sKGU.mjs.map} +1 -1
  234. package/dist/{renderer-Bh7d3RSt.mjs → renderer-BjNcuJ4H.mjs} +3 -3
  235. package/dist/{renderer-Bh7d3RSt.mjs.map → renderer-BjNcuJ4H.mjs.map} +1 -1
  236. package/dist/{renderer-Sdsy27LH.mjs → renderer-Br8aDmf0.mjs} +2 -2
  237. package/dist/renderer-BvZQngSm.mjs +5 -0
  238. package/dist/renderer-BxgN8oXx.mjs +5 -0
  239. package/dist/{renderer-BQ-pHSPI.mjs → renderer-ByOvGGzp.mjs} +3 -3
  240. package/dist/{renderer-BQ-pHSPI.mjs.map → renderer-ByOvGGzp.mjs.map} +1 -1
  241. package/dist/{renderer-KkDYCAkn.mjs → renderer-C11qLlrz.mjs} +3 -3
  242. package/dist/{renderer-KkDYCAkn.mjs.map → renderer-C11qLlrz.mjs.map} +1 -1
  243. package/dist/{renderer-D52KWsb8.mjs → renderer-C5dyPQjG.mjs} +3 -3
  244. package/dist/{renderer-D52KWsb8.mjs.map → renderer-C5dyPQjG.mjs.map} +1 -1
  245. package/dist/renderer-C5jDrTBc.mjs +5 -0
  246. package/dist/{renderer-DTKtkgTO.mjs → renderer-C6TbU8U5.mjs} +3 -3
  247. package/dist/{renderer-DTKtkgTO.mjs.map → renderer-C6TbU8U5.mjs.map} +1 -1
  248. package/dist/{renderer-aT6MUYPr.mjs → renderer-C9bcEaBE.mjs} +3 -3
  249. package/dist/{renderer-aT6MUYPr.mjs.map → renderer-C9bcEaBE.mjs.map} +1 -1
  250. package/dist/{renderer-CsxO_wBG.mjs → renderer-CAH00Lub.mjs} +2 -2
  251. package/dist/{renderer-Cb74SQHm.mjs → renderer-CAhsBEpU.mjs} +2 -2
  252. package/dist/{renderer-Cb74SQHm.mjs.map → renderer-CAhsBEpU.mjs.map} +1 -1
  253. package/dist/renderer-CBK4M82Y.mjs +5 -0
  254. package/dist/{renderer-CFSh2eG-.mjs → renderer-CCH0gSF7.mjs} +3 -3
  255. package/dist/{renderer-CFSh2eG-.mjs.map → renderer-CCH0gSF7.mjs.map} +1 -1
  256. package/dist/{renderer-CHvEgLHy.mjs → renderer-CCbOp0BM.mjs} +3 -3
  257. package/dist/{renderer-CHvEgLHy.mjs.map → renderer-CCbOp0BM.mjs.map} +1 -1
  258. package/dist/{renderer-DrrWvz8l.mjs → renderer-CEb5GjcU.mjs} +3 -3
  259. package/dist/{renderer-DrrWvz8l.mjs.map → renderer-CEb5GjcU.mjs.map} +1 -1
  260. package/dist/{renderer-1KfQICGK.mjs → renderer-CIL9zh-a.mjs} +3 -3
  261. package/dist/{renderer-1KfQICGK.mjs.map → renderer-CIL9zh-a.mjs.map} +1 -1
  262. package/dist/{renderer-CEvj79Wg.mjs → renderer-CIbXIFOb.mjs} +4 -4
  263. package/dist/{renderer-CEvj79Wg.mjs.map → renderer-CIbXIFOb.mjs.map} +1 -1
  264. package/dist/renderer-CLHtCctc.mjs +5 -0
  265. package/dist/{renderer-DxOJv_G7.mjs → renderer-CLX33fIK.mjs} +3 -3
  266. package/dist/{renderer-DxOJv_G7.mjs.map → renderer-CLX33fIK.mjs.map} +1 -1
  267. package/dist/{renderer-BcaT2j3R.mjs → renderer-CLXpWDqx.mjs} +2 -2
  268. package/dist/{renderer-BcaT2j3R.mjs.map → renderer-CLXpWDqx.mjs.map} +1 -1
  269. package/dist/renderer-CLin7MNN.mjs +5 -0
  270. package/dist/{renderer-COcFh5bK.mjs → renderer-CLypsmiH.mjs} +3 -3
  271. package/dist/{renderer-COcFh5bK.mjs.map → renderer-CLypsmiH.mjs.map} +1 -1
  272. package/dist/renderer-CN7TypOB.mjs +5 -0
  273. package/dist/renderer-CV5Jfwq7.mjs +5 -0
  274. package/dist/renderer-Ca5E46WK.mjs +5 -0
  275. package/dist/renderer-CdbOtoOU.mjs +5 -0
  276. package/dist/renderer-CeD_bqWj.mjs +5 -0
  277. package/dist/{renderer-BnpMAub0.mjs → renderer-CfEuoZ7b.mjs} +3 -3
  278. package/dist/{renderer-BnpMAub0.mjs.map → renderer-CfEuoZ7b.mjs.map} +1 -1
  279. package/dist/renderer-CfzNNUOd.mjs +5 -0
  280. package/dist/{renderer-0W-Ty55h.mjs → renderer-Cg3h0Mz9.mjs} +3 -3
  281. package/dist/{renderer-0W-Ty55h.mjs.map → renderer-Cg3h0Mz9.mjs.map} +1 -1
  282. package/dist/renderer-Cl8TmdU8.mjs +5 -0
  283. package/dist/{renderer-CoaDDIS6.mjs → renderer-ClHqvIps.mjs} +10 -10
  284. package/dist/renderer-ClHqvIps.mjs.map +1 -0
  285. package/dist/renderer-CosBP_IM.mjs +5 -0
  286. package/dist/renderer-CpwVs5Fh.mjs +5 -0
  287. package/dist/renderer-Cq7baxNb.mjs +5 -0
  288. package/dist/{renderer-B_Oz9L3g.mjs → renderer-CqMz_iXy.mjs} +2 -2
  289. package/dist/{renderer-B_Oz9L3g.mjs.map → renderer-CqMz_iXy.mjs.map} +1 -1
  290. package/dist/{renderer-DORydJHm.mjs → renderer-CqSmfrE1.mjs} +3 -3
  291. package/dist/{renderer-DORydJHm.mjs.map → renderer-CqSmfrE1.mjs.map} +1 -1
  292. package/dist/{renderer-WTvo3wo9.d.mts → renderer-CrhJJKFY.d.mts} +5 -3
  293. package/dist/renderer-CrhJJKFY.d.mts.map +1 -0
  294. package/dist/{renderer-Bt3F1tmP.mjs → renderer-CxxwhUwy.mjs} +3 -3
  295. package/dist/{renderer-Bt3F1tmP.mjs.map → renderer-CxxwhUwy.mjs.map} +1 -1
  296. package/dist/{renderer-Cba208C9.mjs → renderer-D24aiXmB.mjs} +3 -3
  297. package/dist/{renderer-Cba208C9.mjs.map → renderer-D24aiXmB.mjs.map} +1 -1
  298. package/dist/renderer-D6GkxwAx.mjs +5 -0
  299. package/dist/renderer-D7SfGdzX.mjs +5 -0
  300. package/dist/renderer-D7wt09_l.mjs +5 -0
  301. package/dist/{renderer-CdJoOfQw.mjs → renderer-DBslE7fc.mjs} +2 -2
  302. package/dist/{renderer-CdJoOfQw.mjs.map → renderer-DBslE7fc.mjs.map} +1 -1
  303. package/dist/{renderer-Df-rf7RC.mjs → renderer-DE3Ki96C.mjs} +3 -3
  304. package/dist/{renderer-Df-rf7RC.mjs.map → renderer-DE3Ki96C.mjs.map} +1 -1
  305. package/dist/{renderer-DqIrYB0P.mjs → renderer-DJCqc98W.mjs} +3 -3
  306. package/dist/{renderer-DqIrYB0P.mjs.map → renderer-DJCqc98W.mjs.map} +1 -1
  307. package/dist/{renderer-E54Vv1_W.mjs → renderer-DODOyrty.mjs} +3 -3
  308. package/dist/{renderer-E54Vv1_W.mjs.map → renderer-DODOyrty.mjs.map} +1 -1
  309. package/dist/{renderer-DuFwDHHF.mjs → renderer-DRYxcfgi.mjs} +2 -2
  310. package/dist/renderer-DSuDMYqY.mjs +5 -0
  311. package/dist/{renderer-BGDKxfsM.mjs → renderer-DYreml_A.mjs} +3 -3
  312. package/dist/{renderer-BGDKxfsM.mjs.map → renderer-DYreml_A.mjs.map} +1 -1
  313. package/dist/{renderer-BGnMRdUK.mjs → renderer-DZJnNISO.mjs} +2 -2
  314. package/dist/{renderer-BGnMRdUK.mjs.map → renderer-DZJnNISO.mjs.map} +1 -1
  315. package/dist/renderer-DaIstCIs.mjs +5 -0
  316. package/dist/renderer-DbOD3Nc0.mjs +5 -0
  317. package/dist/{renderer-B3gQT1uq.mjs → renderer-DbenSRjl.mjs} +3 -3
  318. package/dist/{renderer-B3gQT1uq.mjs.map → renderer-DbenSRjl.mjs.map} +1 -1
  319. package/dist/{renderer-DGsWlXjl.mjs → renderer-DcXxkxds.mjs} +75 -72
  320. package/dist/renderer-DcXxkxds.mjs.map +1 -0
  321. package/dist/renderer-DdRCA1bn.mjs +6 -0
  322. package/dist/{renderer-PDs21Gsq.mjs → renderer-DdUtL-qF.mjs} +3 -3
  323. package/dist/{renderer-PDs21Gsq.mjs.map → renderer-DdUtL-qF.mjs.map} +1 -1
  324. package/dist/renderer-DfO37haf.mjs +5 -0
  325. package/dist/renderer-DjZwzxZ7.mjs +5 -0
  326. package/dist/renderer-DnAvySNy.mjs +5 -0
  327. package/dist/{renderer-BwnQRuce.mjs → renderer-DnbY04Qk.mjs} +3 -3
  328. package/dist/{renderer-BwnQRuce.mjs.map → renderer-DnbY04Qk.mjs.map} +1 -1
  329. package/dist/renderer-DnvEPm5E.mjs +5 -0
  330. package/dist/{renderer-C_-hWBF1.mjs → renderer-Do9mW_-B.mjs} +3 -3
  331. package/dist/{renderer-C_-hWBF1.mjs.map → renderer-Do9mW_-B.mjs.map} +1 -1
  332. package/dist/{renderer-PDAlUGKG.mjs → renderer-Dqg8qxjq.mjs} +3 -3
  333. package/dist/{renderer-PDAlUGKG.mjs.map → renderer-Dqg8qxjq.mjs.map} +1 -1
  334. package/dist/{renderer-wrXFfvpJ.mjs → renderer-DvkRbmb2.mjs} +3 -3
  335. package/dist/{renderer-wrXFfvpJ.mjs.map → renderer-DvkRbmb2.mjs.map} +1 -1
  336. package/dist/renderer-DwNpKnWf.mjs +5 -0
  337. package/dist/{renderer-Cv6od7Be.mjs → renderer-Dw_xy3zx.mjs} +3 -3
  338. package/dist/{renderer-Cv6od7Be.mjs.map → renderer-Dw_xy3zx.mjs.map} +1 -1
  339. package/dist/renderer-Dx3Dghus.mjs +5 -0
  340. package/dist/{renderer-lP23pU1s.mjs → renderer-DyrNti45.mjs} +3 -3
  341. package/dist/{renderer-lP23pU1s.mjs.map → renderer-DyrNti45.mjs.map} +1 -1
  342. package/dist/renderer-KvaoEwIk.mjs +5 -0
  343. package/dist/{renderer-Cw7R1U43.mjs → renderer-SwUFJ4aA.mjs} +3 -3
  344. package/dist/{renderer-Cw7R1U43.mjs.map → renderer-SwUFJ4aA.mjs.map} +1 -1
  345. package/dist/{renderer-C4Jfgjm5.mjs → renderer-XEoQnDs5.mjs} +3 -3
  346. package/dist/{renderer-C4Jfgjm5.mjs.map → renderer-XEoQnDs5.mjs.map} +1 -1
  347. package/dist/{renderer-BXGr426R.mjs → renderer-Xw9Zn3pD.mjs} +2 -2
  348. package/dist/{renderer-BXGr426R.mjs.map → renderer-Xw9Zn3pD.mjs.map} +1 -1
  349. package/dist/{renderer-BEpA2g1_.mjs → renderer-ZWIDTOLV.mjs} +2 -2
  350. package/dist/{renderer-BEpA2g1_.mjs.map → renderer-ZWIDTOLV.mjs.map} +1 -1
  351. package/dist/{renderer-D36Pjp0B.mjs → renderer-bGhRdKB7.mjs} +2 -2
  352. package/dist/{renderer-D36Pjp0B.mjs.map → renderer-bGhRdKB7.mjs.map} +1 -1
  353. package/dist/{renderer-ZarULMvJ.mjs → renderer-d4weUlVq.mjs} +2 -2
  354. package/dist/{renderer-ZarULMvJ.mjs.map → renderer-d4weUlVq.mjs.map} +1 -1
  355. package/dist/{renderer-YEDoDnsE.mjs → renderer-g7CMgD1v.mjs} +3 -3
  356. package/dist/{renderer-YEDoDnsE.mjs.map → renderer-g7CMgD1v.mjs.map} +1 -1
  357. package/dist/{renderer-CZGpETnc.mjs → renderer-gjLFqdv-.mjs} +4 -4
  358. package/dist/{renderer-CZGpETnc.mjs.map → renderer-gjLFqdv-.mjs.map} +1 -1
  359. package/dist/{renderer-H-Adf8Za.mjs → renderer-gv0u9XmU.mjs} +3 -3
  360. package/dist/{renderer-H-Adf8Za.mjs.map → renderer-gv0u9XmU.mjs.map} +1 -1
  361. package/dist/{renderer-FPYVmSf6.mjs → renderer-jJWwrha1.mjs} +3 -3
  362. package/dist/{renderer-FPYVmSf6.mjs.map → renderer-jJWwrha1.mjs.map} +1 -1
  363. package/dist/{renderer-BKhdqykZ.mjs → renderer-kl_pAczD.mjs} +3 -3
  364. package/dist/{renderer-BKhdqykZ.mjs.map → renderer-kl_pAczD.mjs.map} +1 -1
  365. package/dist/{renderer-BKL3UEzN.mjs → renderer-lrKwPhZi.mjs} +2 -2
  366. package/dist/{renderer-BKL3UEzN.mjs.map → renderer-lrKwPhZi.mjs.map} +1 -1
  367. package/dist/{renderer-C2O4nK9x.mjs → renderer-pnYj1REL.mjs} +3 -3
  368. package/dist/{renderer-C2O4nK9x.mjs.map → renderer-pnYj1REL.mjs.map} +1 -1
  369. package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs → renderers-CP8CFWDs-CDikhBRO.mjs} +3 -3
  370. package/dist/{renderers-CP8CFWDs-CZJ7NRsl.mjs.map → renderers-CP8CFWDs-CDikhBRO.mjs.map} +1 -1
  371. package/dist/signals/index.d.mts +5 -5
  372. package/dist/signals/index.mjs +6 -6
  373. package/dist/{signals-BrNF9l9s.mjs → signals-BeAWA_1Y.mjs} +3 -3
  374. package/dist/{signals-BrNF9l9s.mjs.map → signals-BeAWA_1Y.mjs.map} +1 -1
  375. package/dist/{src-_l81YkMD.mjs → src-LYcH_X8o.mjs} +233 -27
  376. package/dist/src-LYcH_X8o.mjs.map +1 -0
  377. package/package.json +58 -58
  378. package/dist/dist-D021IFfp.mjs.map +0 -1
  379. package/dist/dist-DSKhnhDk.mjs.map +0 -1
  380. package/dist/dist-cC6nOaMR.mjs.map +0 -1
  381. package/dist/index-3Vdef2KE.d.mts.map +0 -1
  382. package/dist/index-CWG19cm-.d.mts.map +0 -1
  383. package/dist/index-ocZc12ZS.d.mts.map +0 -1
  384. package/dist/preview-engine/chunk-3SR6BI4B.mjs +0 -1
  385. package/dist/preview-engine/chunk-5NLDETDV.mjs +0 -1974
  386. package/dist/preview-engine/chunk-ALSOO22Q.mjs +0 -1
  387. package/dist/preview-engine/chunk-NKGXINCU.mjs +0 -1
  388. package/dist/preview-engine/chunk-PJMX2GFY.mjs +0 -1
  389. package/dist/preview-engine/chunk-SIXIF5QZ.mjs +0 -3
  390. package/dist/preview-engine/renderers-4CRXZJ5G.mjs +0 -1
  391. package/dist/preview-engine/renderers-5QF4OLFQ.mjs +0 -1
  392. package/dist/preview-engine/renderers-5SOW6OVE.mjs +0 -1
  393. package/dist/preview-engine/renderers-6M2HPY2J.mjs +0 -1
  394. package/dist/preview-engine/renderers-7HT5NW7W.mjs +0 -1
  395. package/dist/preview-engine/renderers-ATTGUTYY.mjs +0 -1
  396. package/dist/preview-engine/renderers-AYWCRBQC.mjs +0 -1
  397. package/dist/preview-engine/renderers-BA6ZCPI5.mjs +0 -1
  398. package/dist/preview-engine/renderers-BAS7RXTC.mjs +0 -1
  399. package/dist/preview-engine/renderers-CZTCW4FC.mjs +0 -1
  400. package/dist/preview-engine/renderers-D2XEQ2YY.mjs +0 -1
  401. package/dist/preview-engine/renderers-DFIJYBW2.mjs +0 -1
  402. package/dist/preview-engine/renderers-EJN6M6DO.mjs +0 -1
  403. package/dist/preview-engine/renderers-EK3HQUUF.mjs +0 -1
  404. package/dist/preview-engine/renderers-G34C5J27.mjs +0 -1
  405. package/dist/preview-engine/renderers-GKVTNDVH.mjs +0 -1
  406. package/dist/preview-engine/renderers-HZBYQKIQ.mjs +0 -1
  407. package/dist/preview-engine/renderers-IK7ZJJKJ.mjs +0 -1
  408. package/dist/preview-engine/renderers-ISASPH6T.mjs +0 -1
  409. package/dist/preview-engine/renderers-IT5ISWSA.mjs +0 -228
  410. package/dist/preview-engine/renderers-IW5MWDBI.mjs +0 -1
  411. package/dist/preview-engine/renderers-K2PI4WJS.mjs +0 -1
  412. package/dist/preview-engine/renderers-KESHVFL2.mjs +0 -1
  413. package/dist/preview-engine/renderers-KTZZVAB2.mjs +0 -1
  414. package/dist/preview-engine/renderers-KY5CJEOV.mjs +0 -1
  415. package/dist/preview-engine/renderers-M5W6SUQD.mjs +0 -1
  416. package/dist/preview-engine/renderers-MEM3REMI.mjs +0 -1
  417. package/dist/preview-engine/renderers-N36R42RL.mjs +0 -1
  418. package/dist/preview-engine/renderers-O5XMWFPY.mjs +0 -1
  419. package/dist/preview-engine/renderers-QJA35PKC.mjs +0 -1
  420. package/dist/preview-engine/renderers-TJIFTQHV.mjs +0 -1
  421. package/dist/preview-engine/renderers-TN4XN436.mjs +0 -1
  422. package/dist/preview-engine/renderers-UDYLCYCB.mjs +0 -1
  423. package/dist/preview-engine/renderers-WZ7SFIBZ.mjs +0 -1
  424. package/dist/preview-engine/renderers-X6QNDC6R.mjs +0 -1
  425. package/dist/preview-engine/renderers-X6RNTJOV.mjs +0 -1
  426. package/dist/preview-engine/renderers-Y3N7236P.mjs +0 -1
  427. package/dist/preview-engine/renderers-YP3ASXIJ.mjs +0 -1
  428. package/dist/preview-engine/renderers-YVJAG3PD.mjs +0 -1
  429. package/dist/preview-engine/renderers-ZPPZNMKJ.mjs +0 -1
  430. package/dist/program-W4CWO2bp.mjs.map +0 -1
  431. package/dist/renderer-8HnHWqYj.mjs +0 -5
  432. package/dist/renderer-8itujues.mjs +0 -5
  433. package/dist/renderer-BFods-7v.mjs +0 -5
  434. package/dist/renderer-BbQygRwc.mjs +0 -5
  435. package/dist/renderer-Bq_sPaCg.mjs +0 -5
  436. package/dist/renderer-BrkDrvqS.mjs +0 -5
  437. package/dist/renderer-C1diVT5Q.mjs +0 -5
  438. package/dist/renderer-C8E7ajTR.mjs +0 -5
  439. package/dist/renderer-CAz8JW5c.mjs +0 -5
  440. package/dist/renderer-CKfrUdGw.mjs +0 -5
  441. package/dist/renderer-CL0rqBA4.mjs +0 -5
  442. package/dist/renderer-COyavIEv.mjs +0 -5
  443. package/dist/renderer-CUrShvUZ.mjs +0 -5
  444. package/dist/renderer-CWvJ_GaL.mjs +0 -5
  445. package/dist/renderer-Ck0mGIo9.mjs +0 -5
  446. package/dist/renderer-CoaDDIS6.mjs.map +0 -1
  447. package/dist/renderer-CqIXqdf0.mjs +0 -5
  448. package/dist/renderer-Csod6biL.mjs +0 -5
  449. package/dist/renderer-CueO924-.mjs +0 -5
  450. package/dist/renderer-D1vM4obC.mjs +0 -5
  451. package/dist/renderer-DB7QUt90.mjs +0 -5
  452. package/dist/renderer-DGsWlXjl.mjs.map +0 -1
  453. package/dist/renderer-DLMDnKlA.mjs +0 -6
  454. package/dist/renderer-DNs7yWMr.mjs +0 -5
  455. package/dist/renderer-DOrtuoa9.mjs +0 -5
  456. package/dist/renderer-D_JgOawb.mjs +0 -5
  457. package/dist/renderer-DdLo1uoa.mjs +0 -5
  458. package/dist/renderer-DeX3JEZV.mjs +0 -5
  459. package/dist/renderer-DfgZVACG.mjs +0 -5
  460. package/dist/renderer-DoYG7Pn6.mjs +0 -5
  461. package/dist/renderer-Jwqa-BUN.mjs +0 -5
  462. package/dist/renderer-WTvo3wo9.d.mts.map +0 -1
  463. package/dist/renderer-WyaqnVMz.mjs +0 -3
  464. package/dist/renderer-Z2Vs-IqP.mjs +0 -5
  465. package/dist/renderer-ZnyCpdWE.mjs +0 -5
  466. package/dist/renderer-emCnsnTH.mjs +0 -5
  467. package/dist/renderer-ioxa4-Dy.mjs +0 -5
  468. package/dist/renderer-iyIwrDWO.mjs +0 -5
  469. package/dist/renderer-tuudA_RZ.mjs +0 -5
  470. package/dist/renderer-yyn8S821.mjs +0 -5
  471. package/dist/src-_l81YkMD.mjs.map +0 -1
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-BGnMRdUK.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-DORydJHm.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-BcaT2j3R.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-BIMm7lYG.mjs";
4
-
5
- export { renderers_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer-DGsWlXjl.mjs","names":["resolve","HeadlessWebGPURenderer","options","fs"],"sources":["../../renderer/dist/headless-webgpu-renderer-BIYZ_h9V.mjs","../../renderer/dist/index.mjs","../src/renderer/framegrid.ts"],"sourcesContent":["import { createRequire } from \"node:module\";\nimport { preloadCompositionFonts } from \"@framefields/renderers\";\nimport pino from \"pino\";\nimport * as webcodecs from \"@napi-rs/webcodecs\";\nimport { VideoFrame } from \"@napi-rs/webcodecs\";\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { fileURLToPath, pathToFileURL } from \"node:url\";\nimport { audioRegistry, registerWebGPURenderer } from \"@framefields/node-sdk\";\nimport { exec, spawn } from \"node:child_process\";\nimport { randomUUID } from \"node:crypto\";\nimport fs$1 from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { compositionStateStore, drawCompositionTree, mixAudioTracks } from \"@framefields/compositions\";\nimport { getMediaType, takeRenderDiagnostics, updateClockSignals } from \"@framefields/core\";\nimport { NodeSurfaceProvider, SlugFontCache, WebGPUAudioProcessor, clearAllVideoCache, ensureDevice, getRenderer2D, initHeadlessWebGPU, inputStore, lutStore, mediaDecoderCache, shaderStore, textureCache } from \"@framefields/webgpu-renderers\";\nimport { AudioSample, AudioSampleSource, FilePathTarget, Mp3OutputFormat, Mp4OutputFormat, Output, QUALITY_HIGH, QUALITY_LOW, QUALITY_VERY_HIGH, QUALITY_VERY_LOW, VideoSample, VideoSampleSource, WebMOutputFormat } from \"mediabunny\";\nimport sharp from \"sharp\";\nimport { Canvas, Image } from \"skia-canvas\";\nimport { registerMediabunnyServer } from \"@mediabunny/server\";\n\n//#region src/logger.ts\nconst env = typeof process !== \"undefined\" ? process.env : void 0;\n/**\n* \"json\" (pino lines, for log collectors) or \"text\" (one short line each, for\n* people and agents reading a terminal). `FRAMEFIELDS_LOG_FORMAT` picks one;\n* otherwise production is JSON and everything else text.\n*/\nfunction resolveLogFormat(vars = env) {\n\tconst format = vars?.FRAMEFIELDS_LOG_FORMAT?.toLowerCase();\n\tif (format === \"json\" || format === \"text\") return format;\n\treturn vars?.NODE_ENV === \"production\" ? \"json\" : \"text\";\n}\nconst LEVEL_TAGS = {\n\t40: \"warn: \",\n\t50: \"error: \",\n\t60: \"fatal: \"\n};\n/**\n* Turns pino's JSON lines into `[framefields] Rendered 40% (…)`: the message\n* without its `[Component]` prefix, the level only for warnings and errors,\n* and an error's message (its stack reaches the caller with the throw).\n*/\nfunction textLogStream(write = (line) => process.stderr.write(line)) {\n\treturn { write(json) {\n\t\tlet entry;\n\t\ttry {\n\t\t\tentry = JSON.parse(json);\n\t\t} catch {\n\t\t\twrite(json);\n\t\t\treturn;\n\t\t}\n\t\tconst msg = String(entry.msg ?? \"\").replace(/^\\[[^\\]]+\\]\\s*/, \"\");\n\t\twrite(`[framefields] ${LEVEL_TAGS[entry.level ?? 0] ?? \"\"}${msg}${entry.err?.message ? `: ${entry.err.message}` : \"\"}\\n`);\n\t} };\n}\nconst options = {\n\tlevel: env?.LOG_LEVEL || \"info\",\n\ttimestamp: pino.stdTimeFunctions.isoTime,\n\tbase: { component: \"renderer\" }\n};\nconst rendererLogger = resolveLogFormat() === \"text\" ? pino(options, textLogStream()) : pino(options);\n\n//#endregion\n//#region src/asset-preloader.ts\n/**\n* Preloads only the fonts (and emoji) a VirtualMediaData tree's text uses, so\n* typography renders correctly on Node.js without loading its media. Shared\n* with the browser preview; emoji need a font set with\n* `FontManager.registerEmojiFont()`.\n*/\nasync function preloadFonts(media, device = null) {\n\tif (!media) return;\n\tawait preloadCompositionFonts(media, device, (err, what) => rendererLogger.error(err, `[HeadlessMediaRenderer] Failed to preload ${what}`));\n}\n\n//#endregion\n//#region src/dma-staging-ring.ts\n/**\n* Pipelined Asynchronous DMA Staging Ring for WebGPU.\n*\n* Implements double-buffered (or N-buffered) GPU staging buffers to overlap\n* GPU render passes with asynchronous DMA host transfers and WebCodecs hardware encoding.\n* Eliminates GPU stalls by allowing Frame i+1 to execute on the GPU while Frame i\n* is asynchronously mapped and consumed by the hardware video encoder.\n*/\nvar DmaStagingRing = class {\n\twidth;\n\theight;\n\tcapacity;\n\tbytesPerRow;\n\tunpaddedBytesPerRow;\n\tbufferSize;\n\tformat;\n\tdevice;\n\tslots;\n\tisDestroyed = false;\n\tconstructor(device, options$1) {\n\t\tthis.device = device;\n\t\tthis.width = options$1.width;\n\t\tthis.height = options$1.height;\n\t\tthis.capacity = Math.max(2, options$1.capacity ?? 2);\n\t\tthis.format = options$1.format ?? \"rgba8unorm\";\n\t\tthis.unpaddedBytesPerRow = this.width * 4;\n\t\tconst rowAlignment = 256;\n\t\tthis.bytesPerRow = Math.ceil(this.unpaddedBytesPerRow / rowAlignment) * rowAlignment;\n\t\tthis.bufferSize = this.bytesPerRow * this.height;\n\t\tthis.slots = [];\n\t\tfor (let i = 0; i < this.capacity; i++) {\n\t\t\tconst buffer = device.createBuffer({\n\t\t\t\tsize: this.bufferSize,\n\t\t\t\tusage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST\n\t\t\t});\n\t\t\tthis.slots.push({\n\t\t\t\tindex: i,\n\t\t\t\tbuffer,\n\t\t\t\tstatus: \"idle\",\n\t\t\t\tinFlightFrame: null,\n\t\t\t\tmapPromise: null\n\t\t\t});\n\t\t}\n\t}\n\t/**\n\t* Prepares the staging buffer slot for writing by ensuring any prior mapping\n\t* from a previous cycle has been completed and unmapped.\n\t*/\n\tasync prepareSlot(frameIndex) {\n\t\tthis.checkDestroyed();\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) return;\n\t\tif (slot.status === \"mapping\" && slot.mapPromise) await slot.mapPromise;\n\t\tif (slot.status === \"mapped\") {\n\t\t\tslot.buffer.unmap();\n\t\t\tslot.status = \"idle\";\n\t\t\tslot.inFlightFrame = null;\n\t\t\tslot.mapPromise = null;\n\t\t}\n\t}\n\t/**\n\t* Records a GPU-to-buffer DMA copy command into the provided command encoder.\n\t*/\n\tstageTexture(encoder, texture, frameIndex) {\n\t\tthis.checkDestroyed();\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) throw new Error(`Invalid slot index for frame ${frameIndex}`);\n\t\tif (slot.status === \"mapped\" || slot.status === \"mapping\") throw new Error(`Staging buffer slot ${slot.index} is busy (status: ${slot.status}) for frame ${frameIndex}. Call prepareSlot() before staging.`);\n\t\tencoder.copyTextureToBuffer({ texture }, {\n\t\t\tbuffer: slot.buffer,\n\t\t\tbytesPerRow: this.bytesPerRow\n\t\t}, [this.width, this.height]);\n\t\tslot.status = \"rendering\";\n\t\tslot.inFlightFrame = frameIndex;\n\t}\n\t/**\n\t* Initiates asynchronous DMA mapping on the slot for the specified frame.\n\t* Must be called immediately after submitting the command encoder to the device queue.\n\t*/\n\tscheduleMap(frameIndex) {\n\t\tthis.checkDestroyed();\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) throw new Error(`Invalid slot index for frame ${frameIndex}`);\n\t\tslot.status = \"mapping\";\n\t\tconst mapPromise = slot.buffer.mapAsync(GPUMapMode.READ).then(() => {\n\t\t\tslot.status = \"mapped\";\n\t\t});\n\t\tslot.mapPromise = mapPromise;\n\t\treturn mapPromise;\n\t}\n\t/**\n\t* Awaits asynchronous mapping and extracts pixels into a tightly packed Uint8Array.\n\t* The slot remains in the \"mapped\" state until releaseFrame() is called.\n\t*/\n\tasync readFramePixels(frameIndex) {\n\t\tthis.checkDestroyed();\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) throw new Error(`Invalid slot index for frame ${frameIndex}`);\n\t\tif (slot.mapPromise) await slot.mapPromise;\n\t\tif (slot.status !== \"mapped\") throw new Error(`Staging slot ${slot.index} is not mapped (status: ${slot.status}) for frame ${frameIndex}`);\n\t\tconst mappedRange = slot.buffer.getMappedRange();\n\t\tconst sourceView = new Uint8Array(mappedRange);\n\t\tconst output = new Uint8Array(this.unpaddedBytesPerRow * this.height);\n\t\tif (this.bytesPerRow === this.unpaddedBytesPerRow) output.set(sourceView);\n\t\telse for (let y = 0; y < this.height; y++) {\n\t\t\tconst srcOffset = y * this.bytesPerRow;\n\t\t\tconst dstOffset = y * this.unpaddedBytesPerRow;\n\t\t\toutput.set(sourceView.subarray(srcOffset, srcOffset + this.unpaddedBytesPerRow), dstOffset);\n\t\t}\n\t\treturn output;\n\t}\n\t/**\n\t* Awaits asynchronous mapping, extracts pixels, and immediately unmaps the staging buffer,\n\t* returning the slot to \"idle\" state so it can be reused immediately.\n\t*/\n\tasync readAndReleaseFrame(frameIndex) {\n\t\tconst pixels = await this.readFramePixels(frameIndex);\n\t\tthis.releaseFrame(frameIndex);\n\t\treturn pixels;\n\t}\n\t/**\n\t* Directly reads the mapped staging buffer into a WebCodecs VideoFrame,\n\t* bypassing redundant intermediate JS allocations when row pitches align,\n\t* and immediately unmaps the buffer.\n\t*/\n\tasync readFrameToVideoFrame(frameIndex, timestampUs, colorSpace, inspect) {\n\t\tthis.checkDestroyed();\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) throw new Error(`Invalid slot index for frame ${frameIndex}`);\n\t\tif (slot.mapPromise) await slot.mapPromise;\n\t\tif (slot.status !== \"mapped\") throw new Error(`Staging slot ${slot.index} is not mapped (status: ${slot.status}) for frame ${frameIndex}`);\n\t\tconst mappedRange = slot.buffer.getMappedRange();\n\t\tconst sourceView = new Uint8Array(mappedRange);\n\t\tlet pixelData;\n\t\tif (this.bytesPerRow === this.unpaddedBytesPerRow) pixelData = sourceView;\n\t\telse {\n\t\t\tpixelData = new Uint8Array(this.unpaddedBytesPerRow * this.height);\n\t\t\tfor (let y = 0; y < this.height; y++) {\n\t\t\t\tconst srcOffset = y * this.bytesPerRow;\n\t\t\t\tconst dstOffset = y * this.unpaddedBytesPerRow;\n\t\t\t\tpixelData.set(sourceView.subarray(srcOffset, srcOffset + this.unpaddedBytesPerRow), dstOffset);\n\t\t\t}\n\t\t}\n\t\tinspect?.(pixelData);\n\t\tconst vf = new VideoFrame(pixelData, {\n\t\t\tformat: \"RGBA\",\n\t\t\tcodedWidth: this.width,\n\t\t\tcodedHeight: this.height,\n\t\t\ttimestamp: timestampUs,\n\t\t\tcolorSpace: {\n\t\t\t\tprimaries: colorSpace?.primaries ?? \"bt709\",\n\t\t\t\ttransfer: colorSpace?.transfer ?? \"bt709\",\n\t\t\t\tmatrix: colorSpace?.matrix ?? \"bt709\",\n\t\t\t\tfullRange: colorSpace?.fullRange ?? false\n\t\t\t}\n\t\t});\n\t\tthis.releaseFrame(frameIndex);\n\t\treturn vf;\n\t}\n\t/**\n\t* Unmaps the staging buffer for the specified frame and marks the slot idle.\n\t*/\n\treleaseFrame(frameIndex) {\n\t\tconst slot = this.slots[frameIndex % this.capacity];\n\t\tif (!slot) return;\n\t\tif (slot.status === \"mapped\") {\n\t\t\ttry {\n\t\t\t\tslot.buffer.unmap();\n\t\t\t} catch (_) {}\n\t\t\tslot.status = \"idle\";\n\t\t\tslot.inFlightFrame = null;\n\t\t\tslot.mapPromise = null;\n\t\t}\n\t}\n\t/**\n\t* Returns current status info for each slot in the ring.\n\t*/\n\tgetSlotInfos() {\n\t\treturn this.slots.map((slot) => ({\n\t\t\tindex: slot.index,\n\t\t\tstatus: slot.status,\n\t\t\tinFlightFrame: slot.inFlightFrame\n\t\t}));\n\t}\n\t/**\n\t* Destroys all staging buffers and releases resources.\n\t*/\n\tdestroy() {\n\t\tif (this.isDestroyed) return;\n\t\tthis.isDestroyed = true;\n\t\tfor (const slot of this.slots) {\n\t\t\tif (slot.status === \"mapped\") try {\n\t\t\t\tslot.buffer.unmap();\n\t\t\t} catch (_) {}\n\t\t\tslot.status = \"idle\";\n\t\t\tslot.inFlightFrame = null;\n\t\t\tslot.mapPromise = null;\n\t\t}\n\t\tthis.slots.length = 0;\n\t}\n\tcheckDestroyed() {\n\t\tif (this.isDestroyed) throw new Error(\"DmaStagingRing has been destroyed\");\n\t}\n};\n\n//#endregion\n//#region src/generated/node-renderers.ts\nconst BUILTIN_NODE_RENDERERS = [\n\t{\n\t\tpackageName: \"@framefields/node-lut\",\n\t\tops: [\"ApplyLUT\"],\n\t\tload: () => import(\"@framefields/node-lut/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-ascii\",\n\t\tops: [\"Ascii\"],\n\t\tload: () => import(\"@framefields/node-ascii/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-compressor\",\n\t\tops: [\"AudioCompressor\"],\n\t\tload: () => import(\"@framefields/node-audio-compressor/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-delay\",\n\t\tops: [\"AudioDelay\"],\n\t\tload: () => import(\"@framefields/node-audio-delay/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-fade\",\n\t\tops: [\"AudioFade\"],\n\t\tload: () => import(\"@framefields/node-audio-fade/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-noise-gate\",\n\t\tops: [\"AudioNoiseGate\"],\n\t\tload: () => import(\"@framefields/node-audio-noise-gate/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-parametric-eq\",\n\t\tops: [\"AudioParametricEq\"],\n\t\tload: () => import(\"@framefields/node-audio-parametric-eq/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-reverb\",\n\t\tops: [\"AudioReverb\"],\n\t\tload: () => import(\"@framefields/node-audio-reverb/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-audio-signal-extractor\",\n\t\tops: [\"AudioSignalExtractor\"],\n\t\tload: () => import(\"@framefields/node-audio-signal-extractor/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-blur\",\n\t\tops: [\"Blur\"],\n\t\tload: () => import(\"@framefields/node-blur/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-camera-parallax-3d\",\n\t\tops: [\"CameraParallax3D\"],\n\t\tload: () => import(\"@framefields/node-camera-parallax-3d/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-canvas-generator\",\n\t\tops: [\"CanvasGenerator\"],\n\t\tload: () => import(\"@framefields/node-canvas-generator/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-channel-merger\",\n\t\tops: [\"ChannelMerger\"],\n\t\tload: () => import(\"@framefields/node-channel-merger/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-channel-splitter\",\n\t\tops: [\"ChannelSplitter\"],\n\t\tload: () => import(\"@framefields/node-channel-splitter/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-color-balance\",\n\t\tops: [\"ColorBalance\"],\n\t\tload: () => import(\"@framefields/node-color-balance/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-colorkey\",\n\t\tops: [\"ColorKey\"],\n\t\tload: () => import(\"@framefields/node-colorkey/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-compositor\",\n\t\tops: [\"Compositor\"],\n\t\tload: () => import(\"@framefields/node-compositor/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-contour\",\n\t\tops: [\"Contour\"],\n\t\tload: () => import(\"@framefields/node-contour/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-corner-pin\",\n\t\tops: [\"CornerPin\"],\n\t\tload: () => import(\"@framefields/node-corner-pin/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-crop\",\n\t\tops: [\"Crop\"],\n\t\tload: () => import(\"@framefields/node-crop/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-crt\",\n\t\tops: [\"CRT\"],\n\t\tload: () => import(\"@framefields/node-crt/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-curves\",\n\t\tops: [\"Curves\"],\n\t\tload: () => import(\"@framefields/node-curves/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-datamosh\",\n\t\tops: [\"Datamosh\"],\n\t\tload: () => import(\"@framefields/node-datamosh/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-deflicker\",\n\t\tops: [\"TemporalDeflicker\", \"Deflicker\"],\n\t\tload: () => import(\"@framefields/node-deflicker/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-displacement-map\",\n\t\tops: [\"DisplacementMap\"],\n\t\tload: () => import(\"@framefields/node-displacement-map/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-dither\",\n\t\tops: [\"Dither\"],\n\t\tload: () => import(\"@framefields/node-dither/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-extract-frame\",\n\t\tops: [\"ExtractFrame\"],\n\t\tload: () => import(\"@framefields/node-extract-frame/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-extract-lut\",\n\t\tops: [\"ExtractLUT\"],\n\t\tload: () => import(\"@framefields/node-extract-lut/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-film-grain\",\n\t\tops: [\"FilmGrain\"],\n\t\tload: () => import(\"@framefields/node-film-grain/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-flip\",\n\t\tops: [\"Flip\"],\n\t\tload: () => import(\"@framefields/node-flip/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-gooey\",\n\t\tops: [\"Gooey\"],\n\t\tload: () => import(\"@framefields/node-gooey/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-gradient-map\",\n\t\tops: [\"GradientMap\"],\n\t\tload: () => import(\"@framefields/node-gradient-map/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-halftone-screen\",\n\t\tops: [\"HalftoneScreen\"],\n\t\tload: () => import(\"@framefields/node-halftone-screen/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-high-pass\",\n\t\tops: [\"HighPass\"],\n\t\tload: () => import(\"@framefields/node-high-pass/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-iridescence\",\n\t\tops: [\"Iridescence\"],\n\t\tload: () => import(\"@framefields/node-iridescence/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-kaleidoscope\",\n\t\tops: [\"Kaleidoscope\"],\n\t\tload: () => import(\"@framefields/node-kaleidoscope/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-kenburns\",\n\t\tops: [\"KenBurns\"],\n\t\tload: () => import(\"@framefields/node-kenburns/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-layer-style\",\n\t\tops: [\"LayerStyle\"],\n\t\tload: () => import(\"@framefields/node-layer-style/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-levels\",\n\t\tops: [\"Levels\"],\n\t\tload: () => import(\"@framefields/node-levels/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-liquify\",\n\t\tops: [\"Liquify\"],\n\t\tload: () => import(\"@framefields/node-liquify/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-mask-math\",\n\t\tops: [\"MaskMath\"],\n\t\tload: () => import(\"@framefields/node-mask-math/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-mesh-warp\",\n\t\tops: [\"MeshWarp\"],\n\t\tload: () => import(\"@framefields/node-mesh-warp/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-modulate\",\n\t\tops: [\"Modulate\"],\n\t\tload: () => import(\"@framefields/node-modulate/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-noise-generator\",\n\t\tops: [\"NoiseGenerator\"],\n\t\tload: () => import(\"@framefields/node-noise-generator/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-op-art\",\n\t\tops: [\"OpArt\"],\n\t\tload: () => import(\"@framefields/node-op-art/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-paint\",\n\t\tops: [\"Paint\"],\n\t\tload: () => import(\"@framefields/node-paint/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-painterly\",\n\t\tops: [\"Painterly\"],\n\t\tload: () => import(\"@framefields/node-painterly/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-particles\",\n\t\tops: [\"Particles\"],\n\t\tload: () => import(\"@framefields/node-particles/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-patch-heal\",\n\t\tops: [\"PatchHeal\"],\n\t\tload: () => import(\"@framefields/node-patch-heal/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-pixelate\",\n\t\tops: [\"Pixelate\"],\n\t\tload: () => import(\"@framefields/node-pixelate/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-posterize\",\n\t\tops: [\"Posterize\"],\n\t\tload: () => import(\"@framefields/node-posterize/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-procedural-vfx\",\n\t\tops: [\"ProceduralVFX\"],\n\t\tload: () => import(\"@framefields/node-procedural-vfx/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-refine-edge\",\n\t\tops: [\"RefineEdge\"],\n\t\tload: () => import(\"@framefields/node-refine-edge/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-refraction-caustics\",\n\t\tops: [\"RefractionCaustics3D\"],\n\t\tload: () => import(\"@framefields/node-refraction-caustics/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-relight-3d\",\n\t\tops: [\"Relight3D\"],\n\t\tload: () => import(\"@framefields/node-relight-3d/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-resizer-scaler\",\n\t\tops: [\"ResizerScaler\"],\n\t\tload: () => import(\"@framefields/node-resizer-scaler/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-rgb-split\",\n\t\tops: [\"RGBSplit\"],\n\t\tload: () => import(\"@framefields/node-rgb-split/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-rotate\",\n\t\tops: [\"Rotate\"],\n\t\tload: () => import(\"@framefields/node-rotate/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-selective-color\",\n\t\tops: [\"SelectiveColor\"],\n\t\tload: () => import(\"@framefields/node-selective-color/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-shadows-highlights\",\n\t\tops: [\"ShadowsHighlights\"],\n\t\tload: () => import(\"@framefields/node-shadows-highlights/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-shape-generator\",\n\t\tops: [\"ShapeGenerator\"],\n\t\tload: () => import(\"@framefields/node-shape-generator/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-signal-gate\",\n\t\tops: [\"SignalGate\"],\n\t\tload: () => import(\"@framefields/node-signal-gate/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-stereo-panning\",\n\t\tops: [\"StereoPanning\"],\n\t\tload: () => import(\"@framefields/node-stereo-panning/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-tile-offset\",\n\t\tops: [\"TileOffset\"],\n\t\tload: () => import(\"@framefields/node-tile-offset/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-toon\",\n\t\tops: [\"Toon\"],\n\t\tload: () => import(\"@framefields/node-toon/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-trails\",\n\t\tops: [\"Trails\"],\n\t\tload: () => import(\"@framefields/node-trails/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-unsharp-mask\",\n\t\tops: [\"UnsharpMask\"],\n\t\tload: () => import(\"@framefields/node-unsharp-mask/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-vignette\",\n\t\tops: [\"Vignette\"],\n\t\tload: () => import(\"@framefields/node-vignette/renderer\")\n\t},\n\t{\n\t\tpackageName: \"@framefields/node-vision\",\n\t\tops: [\"Vision\"],\n\t\tload: () => import(\"@framefields/node-vision/renderer\")\n\t}\n];\n\n//#endregion\n//#region src/node-manifest.ts\n/**\n* The `framefields` block of a node package's `package.json`.\n*\n* This is the single declaration of a node's op: renderer discovery, the\n* effects generator (`scripts/generate-effects.ts`) and the skill catalog all\n* read it from here. There is deliberately no fallback that derives an op from\n* the package name. See `spec/sync-node.md` §5.1.\n*/\nconst NODE_KINDS = [\n\t\"effect\",\n\t\"audio\",\n\t\"source\",\n\t\"signal\",\n\t\"utility\"\n];\nconst IDENTIFIER = /^[A-Za-z][A-Za-z0-9]*$/;\nvar NodeManifestError = class extends Error {\n\tconstructor(problems) {\n\t\tsuper(`Invalid node manifest(s):\\n${problems.map((p) => ` - ${p}`).join(\"\\n\")}`);\n\t\tthis.problems = problems;\n\t\tthis.name = \"NodeManifestError\";\n\t}\n};\nfunction isRecord(value) {\n\treturn typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n/**\n* Validates one parsed `package.json`. Returns the manifest, or the list of\n* problems that make it unusable. Never throws.\n*/\nfunction parseNodeManifest(pkg, dir, nodePath = dir) {\n\tconst problems = [];\n\tif (!isRecord(pkg)) return { problems: [`${dir}: package.json is not an object`] };\n\tconst block = pkg.framefields;\n\tif (!isRecord(block)) return { problems: [`${dir}: package.json has no \"framefields\" block (expected { \"type\": \"<Op>\", \"kind\": \"<kind>\" })`] };\n\tconst { type, kind, aliases, schema, className, factory, custom } = block;\n\tif (typeof type !== \"string\" || !IDENTIFIER.test(type)) problems.push(`${dir}: framefields.type must be an op identifier`);\n\tif (typeof kind !== \"string\" || !NODE_KINDS.includes(kind)) problems.push(`${dir}: framefields.kind must be one of ${NODE_KINDS.join(\", \")}`);\n\tif (aliases !== void 0 && !(Array.isArray(aliases) && aliases.every((a) => typeof a === \"string\" && IDENTIFIER.test(a)))) problems.push(`${dir}: framefields.aliases must be an array of op identifiers`);\n\tfor (const [key, value] of Object.entries({\n\t\tschema,\n\t\tclassName,\n\t\tfactory\n\t})) if (value !== void 0 && (typeof value !== \"string\" || !IDENTIFIER.test(value))) problems.push(`${dir}: framefields.${key} must be an identifier`);\n\tif (custom !== void 0 && typeof custom !== \"boolean\") problems.push(`${dir}: framefields.custom must be a boolean`);\n\tif (problems.length > 0) return { problems };\n\tconst exportsField = isRecord(pkg.exports) ? pkg.exports[\"./renderer\"] : null;\n\tconst legacy = isRecord(pkg.gatewai) ? pkg.gatewai : {};\n\treturn {\n\t\tproblems,\n\t\tmanifest: {\n\t\t\tdir,\n\t\t\tpath: nodePath,\n\t\t\tpackageName: typeof pkg.name === \"string\" ? pkg.name : dir,\n\t\t\ttype,\n\t\t\tkind,\n\t\t\taliases: aliases ?? [],\n\t\t\tschema,\n\t\t\tclassName,\n\t\t\tfactory,\n\t\t\tcustom: custom === true,\n\t\t\tenabled: legacy.enabled !== false,\n\t\t\trendererExports: isRecord(exportsField) ? exportsField : void 0\n\t\t}\n\t};\n}\n/**\n* Reads every `nodes/node-*` package and returns its manifest, sorted by\n* directory name. Throws a single {@link NodeManifestError} listing every\n* problem: a missing or malformed block, or an op/alias claimed twice.\n*/\nfunction loadNodeManifests(nodesDir) {\n\tconst problems = [];\n\tconst manifests = [];\n\tconst dirs = fs.readdirSync(nodesDir).filter((d) => d.startsWith(\"node-\") && fs.existsSync(path.join(nodesDir, d, \"package.json\"))).sort();\n\tfor (const dir of dirs) {\n\t\tconst nodePath = path.join(nodesDir, dir);\n\t\tlet pkg;\n\t\ttry {\n\t\t\tpkg = JSON.parse(fs.readFileSync(path.join(nodePath, \"package.json\"), \"utf-8\"));\n\t\t} catch (err) {\n\t\t\tproblems.push(`${dir}: package.json is not valid JSON (${String(err)})`);\n\t\t\tcontinue;\n\t\t}\n\t\tconst parsed = parseNodeManifest(pkg, dir, nodePath);\n\t\tproblems.push(...parsed.problems);\n\t\tif (parsed.manifest) manifests.push(parsed.manifest);\n\t}\n\tconst owners = /* @__PURE__ */ new Map();\n\tfor (const manifest of manifests) for (const op of [manifest.type, ...manifest.aliases]) {\n\t\tconst owner = owners.get(op);\n\t\tif (owner) problems.push(`${manifest.dir}: op \"${op}\" is already declared by ${owner}`);\n\t\telse owners.set(op, manifest.dir);\n\t}\n\tif (problems.length > 0) throw new NodeManifestError(problems);\n\treturn manifests;\n}\n\n//#endregion\n//#region src/dynamic-node-discovery.ts\nlet __filename = \"\";\nlet __dirname = \"\";\nif (typeof process !== \"undefined\" && !!process.versions?.node) {\n\t__filename = fileURLToPath(import.meta.url);\n\t__dirname = path.dirname(__filename);\n}\n/** Locates the workspace `nodes/` directory by climbing up from this file. */\nfunction findNodesDir(startDir = __dirname) {\n\tlet nodesDir = path.resolve(startDir, \"../../../nodes\");\n\tlet currentDir = startDir;\n\twhile (true) {\n\t\tif (fs.existsSync(nodesDir)) {\n\t\t\tif (fs.readdirSync(nodesDir).some((d) => d.startsWith(\"node-\") && fs.existsSync(path.join(nodesDir, d, \"package.json\")))) return nodesDir;\n\t\t}\n\t\tconst parentDir = path.dirname(currentDir);\n\t\tif (parentDir === currentDir) return null;\n\t\tcurrentDir = parentDir;\n\t\tnodesDir = path.resolve(currentDir, \"nodes\");\n\t}\n}\n/**\n* Picks the renderer entry file: development source in dev/vitest, otherwise\n* the bundled dist, falling back to source when dist has not been built.\n*/\nfunction resolveRendererEntry(nodePath, rendererExports) {\n\tconst exists = (rel) => !!rel && fs.existsSync(path.join(nodePath, rel));\n\tif ((process.env.NODE_ENV !== \"production\" || Boolean(process.env.VITEST)) && exists(rendererExports.development)) return rendererExports.development;\n\tconst bundled = rendererExports.import || rendererExports.default;\n\tif (exists(bundled)) return bundled;\n\tif (exists(rendererExports.development)) return rendererExports.development;\n}\nasync function registerNode(manifest) {\n\tif (!manifest.rendererExports) return;\n\tconst entry = resolveRendererEntry(manifest.path, manifest.rendererExports);\n\tif (!entry) return;\n\tconst mod = await import(pathToFileURL(path.join(manifest.path, entry)).href);\n\tregisterPlugin([manifest.type, ...manifest.aliases], mod?.default);\n}\nfunction registerPlugin(ops, rendererPlugin) {\n\tif (!rendererPlugin) return;\n\tif (rendererPlugin.WebGPURenderer) for (const op of ops) registerWebGPURenderer(op, rendererPlugin.WebGPURenderer);\n\tif (rendererPlugin.audioProcessor) for (const op of ops) audioRegistry.register(op, rendererPlugin.audioProcessor);\n}\n/**\n* Registers the renderers bundled with this package. They are imported by\n* package name, so they resolve from `node_modules` (or the published bundle)\n* and never depend on a `nodes/` directory on disk.\n*/\nasync function registerBuiltinNodeRenderers() {\n\tconst failed = [];\n\tawait Promise.all(BUILTIN_NODE_RENDERERS.map(async ({ packageName, ops, load }) => {\n\t\ttry {\n\t\t\tregisterPlugin(ops, (await load()).default);\n\t\t} catch (err) {\n\t\t\tfailed.push(packageName);\n\t\t\tconsole.error(`[HeadlessWebGPURenderer] Failed to load renderer ${packageName}:`, err);\n\t\t}\n\t}));\n\tif (failed.length === BUILTIN_NODE_RENDERERS.length) throw new Error(\"[HeadlessWebGPURenderer] No built-in node renderers could be loaded.\");\n}\n/**\n* Registers the built-in node renderers, then any extra nodes found in the\n* directory named by `FRAMEFIELDS_NODES_DIR` (local node development). A node in\n* that directory overrides the built-in renderer for the same op.\n*/\nasync function discoverAndRegisterNodeRenderers() {\n\tif (typeof process === \"undefined\" || !process.versions?.node) return;\n\tawait registerBuiltinNodeRenderers();\n\tconst extraDir = process.env.FRAMEFIELDS_NODES_DIR;\n\tif (!extraDir) return;\n\tconst nodesDir = path.resolve(extraDir);\n\tif (!fs.existsSync(nodesDir)) {\n\t\tconsole.warn(`[HeadlessWebGPURenderer] FRAMEFIELDS_NODES_DIR does not exist: ${nodesDir}`);\n\t\treturn;\n\t}\n\trendererLogger.debug(`[HeadlessWebGPURenderer] Discovering node renderers in: ${nodesDir}`);\n\tconst manifests = loadNodeManifests(nodesDir);\n\tfor (const manifest of manifests) {\n\t\tif (!manifest.enabled) continue;\n\t\ttry {\n\t\t\tawait registerNode(manifest);\n\t\t} catch (err) {\n\t\t\tconsole.error(`[HeadlessWebGPURenderer] Failed to discover renderer for node ${manifest.dir}:`, err);\n\t\t}\n\t}\n}\n\n//#endregion\n//#region src/video-encoders.ts\nlet nodeAv;\n/**\n* node-av as @mediabunny/server loads it, with software encoders as the\n* default. The patch and the HardwareContext instances returned to the server\n* must come from that exact module instance, so the file is resolved from the\n* server package and imported natively (a `require()` can be routed through\n* a loader such as tsx and produce a second copy).\n*/\nfunction loadNodeAv() {\n\tnodeAv ??= (async () => {\n\t\tconst av = await import(pathToFileURL(createRequire(createRequire(import.meta.url).resolve(\"@mediabunny/server\")).resolve(\"node-av\")).href);\n\t\tpreferSoftwareEncoders(av);\n\t\treturn av;\n\t})();\n\treturn nodeAv;\n}\n/**\n* Software encoders to use per codec, best first. @mediabunny/server takes\n* `Codec.findEncoder(id)` as its software encoder, which returns whichever\n* encoder FFmpeg registered first. In node-av's linux-arm64 build that is a\n* hardware encoder (h264_rkmpp, hevc_rkmpp), which fails without Rockchip\n* hardware.\n*/\nconst SOFTWARE_ENCODERS = {\n\tAV_CODEC_ID_H264: [\"libx264\", \"libopenh264\"],\n\tAV_CODEC_ID_HEVC: [\"libx265\"],\n\tAV_CODEC_ID_VP8: [\"libvpx\"],\n\tAV_CODEC_ID_VP9: [\"libvpx-vp9\"],\n\tAV_CODEC_ID_AV1: [\n\t\t\"libsvtav1\",\n\t\t\"libaom-av1\",\n\t\t\"libdav1d\"\n\t]\n};\nlet patched = false;\n/** Makes `Codec.findEncoder` return a software encoder when one exists. */\nfunction preferSoftwareEncoders(av) {\n\tif (patched) return;\n\tpatched = true;\n\tconst byId = /* @__PURE__ */ new Map();\n\tfor (const [constant, names] of Object.entries(SOFTWARE_ENCODERS)) {\n\t\tconst id = av[constant];\n\t\tif (typeof id === \"number\") byId.set(id, names);\n\t}\n\tconst findEncoder = av.Codec.findEncoder.bind(av.Codec);\n\tav.Codec.findEncoder = ((id) => {\n\t\tfor (const name of byId.get(id) ?? []) {\n\t\t\tconst codec = av.Codec.findEncoderByName(name);\n\t\t\tif (codec) return codec;\n\t\t}\n\t\treturn findEncoder(id);\n\t});\n}\n/**\n* Opens the encoder with the settings @mediabunny/server uses and encodes one\n* frame. A hardware encoder can be compiled in and still be unusable: no such\n* hardware (rkmpp on a non-Rockchip board), or a GPU without an encoder block\n* (NVIDIA A100/H100 have no NVENC).\n*/\nasync function encoderWorks(av, codec) {\n\tconst ctx = new av.CodecContext();\n\tconst frame = new av.Frame();\n\tconst packet = new av.Packet();\n\ttry {\n\t\tctx.allocContext3(codec);\n\t\tconst formats = codec.pixelFormats;\n\t\tconst pixelFormat = !formats || formats.includes(av.AV_PIX_FMT_YUV420P) ? av.AV_PIX_FMT_YUV420P : formats[0];\n\t\tctx.width = 256;\n\t\tctx.height = 256;\n\t\tctx.pixelFormat = pixelFormat;\n\t\tctx.timeBase = new av.Rational(1, 1e6);\n\t\tctx.framerate = new av.Rational(30, 1);\n\t\tctx.gopSize = 60;\n\t\tctx.bitRate = 1000000n;\n\t\tif (await ctx.open2() < 0) return false;\n\t\tframe.alloc();\n\t\tframe.format = pixelFormat;\n\t\tframe.width = 256;\n\t\tframe.height = 256;\n\t\tif (frame.getBuffer() < 0) return false;\n\t\tframe.pts = 0n;\n\t\tpacket.alloc();\n\t\tif (await ctx.sendFrame(frame) < 0) return false;\n\t\tif (await ctx.sendFrame(null) < 0) return false;\n\t\tfor (;;) {\n\t\t\tconst ret = await ctx.receivePacket(packet);\n\t\t\tif (ret >= 0) return true;\n\t\t\tif (ret !== av.AVERROR_EAGAIN) return false;\n\t\t}\n\t} catch {\n\t\treturn false;\n\t} finally {\n\t\tpacket.free();\n\t\tframe.free();\n\t\tctx.freeContext();\n\t}\n}\n/** True when the env turns hardware video encoding/decoding off. */\nfunction hardwareDisabled() {\n\tconst value = process.env.FRAMEFIELDS_HW_CODECS?.toLowerCase();\n\treturn value === \"0\" || value === \"off\" || value === \"false\";\n}\n/**\n* Returns the `hardwareContext` option for registerMediabunnyServer: the\n* platform's hardware context for codecs whose hardware encoder actually\n* works (NVENC, VideoToolbox, ...), and null otherwise, so that codec is\n* encoded in software. Each codec is tested once per process.\n*\n* The server calls this before it picks any encoder (unless the encoder is\n* created with \"prefer-software\"), so the software default is patched in by\n* then.\n*/\nfunction hardwareContextResolver(forceSoftware) {\n\tlet hw;\n\tconst verdicts = /* @__PURE__ */ new Map();\n\tconst resolve = async (codecId) => {\n\t\tconst av = await loadNodeAv();\n\t\tif (forceSoftware || hardwareDisabled()) return null;\n\t\tif (hw === void 0) hw = av.HardwareContext.auto();\n\t\tif (!hw) return null;\n\t\tconst encoder = hw.getEncoderCodec(codecId);\n\t\tif (!encoder) return hw;\n\t\tif (await encoderWorks(av, encoder)) {\n\t\t\trendererLogger.info({\n\t\t\t\tencoder: encoder.name,\n\t\t\t\tdevice: hw.deviceTypeName\n\t\t\t}, \"[video-encoders] Using hardware video encoder\");\n\t\t\treturn hw;\n\t\t}\n\t\trendererLogger.warn({\n\t\t\tencoder: encoder.name,\n\t\t\tdevice: hw.deviceTypeName\n\t\t}, \"[video-encoders] Hardware video encoder unusable; encoding in software\");\n\t\treturn null;\n\t};\n\treturn (codecId) => {\n\t\tlet verdict = verdicts.get(codecId);\n\t\tif (!verdict) {\n\t\t\tverdict = resolve(codecId).catch(async (err) => {\n\t\t\t\tawait loadNodeAv();\n\t\t\t\trendererLogger.warn({ err: err instanceof Error ? err.message : String(err) }, \"[video-encoders] Hardware probe failed; encoding in software\");\n\t\t\t\treturn null;\n\t\t\t});\n\t\t\tverdicts.set(codecId, verdict);\n\t\t}\n\t\treturn verdict;\n\t};\n}\n/**\n* Options for registerMediabunnyServer: hardware video codecs when they work,\n* software (libx264, libx265, libvpx, SVT-AV1) otherwise. `forceSoftware`\n* keeps every codec in software (used on AMD). Create encoders with\n* \"prefer-hardware\" so this decides; \"prefer-software\" skips it.\n*/\nfunction videoCodecServerOptions(forceSoftware) {\n\treturn { hardwareContext: hardwareContextResolver(forceSoftware) };\n}\n\n//#endregion\n//#region src/bootstrap-mediabunny.ts\nconst isAMD = () => {\n\tif (process.platform !== \"linux\") return false;\n\ttry {\n\t\tif (fs.existsSync(\"/sys/module/amdgpu\") || fs.existsSync(\"/dev/kfd\")) return true;\n\t\tconst drmDir = \"/sys/class/drm\";\n\t\tif (fs.existsSync(drmDir)) {\n\t\t\tconst files = fs.readdirSync(drmDir);\n\t\t\tfor (const file of files) {\n\t\t\t\tconst vendorPath = `${drmDir}/${file}/device/vendor`;\n\t\t\t\tif (fs.existsSync(vendorPath)) {\n\t\t\t\t\tif (fs.readFileSync(vendorPath, \"utf8\").trim() === \"0x1002\") return true;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t} catch {}\n\treturn false;\n};\nconst bootstrapMediabunny = () => {\n\tregisterMediabunnyServer(videoCodecServerOptions(isAMD()));\n\tfor (const key of Object.keys(webcodecs)) if (typeof globalThis[key] === \"undefined\") globalThis[key] = webcodecs[key];\n};\n\n//#endregion\n//#region src/render-reporter.ts\nconst LOG_PREFIX = \"[HeadlessWebGPURenderer]\";\n/** A milestone reached sooner than this after the last line is not logged. */\nconst MIN_LOG_GAP_MS = 1e3;\n/**\n* Quiet time before the first \"still …\" line of a phase. Each one doubles it\n* up to the cap, so a long phase adds a few lines rather than one a minute.\n*/\nconst HEARTBEAT_FIRST_MS = 1e4;\nconst HEARTBEAT_MAX_MS = 5 * 6e4;\nconst ACTIVITY = {\n\tprepare: \"preparing\",\n\trender: \"rendering\",\n\taudio: \"mixing audio\",\n\t\"audio-encode\": \"encoding audio\",\n\tmux: \"muxing\",\n\tconvert: \"converting to GIF\",\n\tdone: \"finishing\"\n};\n/**\n* Reports a render's progress to the log and to `onProgress`.\n*\n* The log stays short whatever the length of the film, so it fits an agent's\n* context: one line per phase, frame lines only at percent milestones, and a\n* \"still …\" line when a phase goes quiet, backing off from 10 s to 5 min.\n* `onProgress` gets every update; the \"still …\" lines are log-only, so a stall\n* detector fed by `onProgress` still sees a hang.\n*/\nvar RenderReporter = class {\n\trenderId;\n\ttotalFrames;\n\tonProgress;\n\tmilestonePercent;\n\tlog;\n\tnow;\n\tstartedAt;\n\tphaseMs = /* @__PURE__ */ new Map();\n\tphase = \"prepare\";\n\tphaseStartedAt;\n\tframe = 0;\n\tphaseProgress;\n\tdetail;\n\tlastMilestone = 0;\n\t/** Last phase or milestone line; \"still …\" lines don't count. */\n\tlastLogAt;\n\theartbeatMs = HEARTBEAT_FIRST_MS;\n\theartbeat;\n\tconstructor(options$1) {\n\t\tthis.renderId = options$1.renderId;\n\t\tthis.totalFrames = options$1.totalFrames;\n\t\tthis.onProgress = options$1.onProgress;\n\t\tthis.milestonePercent = options$1.milestonePercent ?? 10;\n\t\tthis.log = options$1.log ?? rendererLogger;\n\t\tthis.now = options$1.now ?? (() => performance.now());\n\t\tthis.startedAt = this.now();\n\t\tthis.phaseStartedAt = this.startedAt;\n\t\tthis.lastLogAt = this.startedAt;\n\t}\n\t/** Starts a phase: logs `message` and emits a progress event. */\n\tstage(phase, message, fields = {}) {\n\t\tthis.closePhase();\n\t\tthis.phase = phase;\n\t\tthis.phaseProgress = void 0;\n\t\tthis.detail = void 0;\n\t\tthis.heartbeatMs = HEARTBEAT_FIRST_MS;\n\t\tif (phase !== \"render\" && phase !== \"prepare\") this.frame = this.totalFrames;\n\t\tthis.info(message, fields);\n\t\tthis.emit();\n\t}\n\t/** Records a finished frame; logs at each milestone. */\n\tframeDone(frame) {\n\t\tthis.frame = frame;\n\t\tconst percent = frame / this.totalFrames * 100;\n\t\tconst milestone = frame >= this.totalFrames ? 100 : Math.floor(percent / this.milestonePercent) * this.milestonePercent;\n\t\tconst { fps, etaSec } = this.rate();\n\t\tif (milestone > this.lastMilestone) {\n\t\t\tthis.lastMilestone = milestone;\n\t\t\tif (milestone === 100 || this.now() - this.lastLogAt >= MIN_LOG_GAP_MS) {\n\t\t\t\tconst tail = milestone === 100 ? `in ${formatDuration(this.now() - this.phaseStartedAt)}` : `eta ${formatDuration(etaSec * 1e3)}`;\n\t\t\t\tthis.info(`Rendered ${milestone}% (${frame}/${this.totalFrames} frames) · ${fps.toFixed(1)} fps · ${tail}`, {\n\t\t\t\t\tfps: round1(fps),\n\t\t\t\t\tetaSec\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tthis.emit({\n\t\t\tfps: round1(fps),\n\t\t\tetaSec\n\t\t});\n\t}\n\t/** Updates what the current phase is doing; shown in \"still …\" lines. */\n\tupdate(detail, phaseProgress) {\n\t\tthis.detail = detail;\n\t\tthis.phaseProgress = phaseProgress;\n\t\tthis.emit();\n\t}\n\t/** Logs the summary and emits the \"done\" event. */\n\tfinish(fields = {}) {\n\t\tthis.closePhase();\n\t\tthis.phase = \"done\";\n\t\tthis.frame = this.totalFrames;\n\t\tthis.stopHeartbeat();\n\t\tconst total = this.now() - this.startedAt;\n\t\tconst parts = [...this.phaseMs].map(([phase, ms]) => `${phase} ${formatDuration(ms)}`);\n\t\tconst size = fields.bytes !== void 0 ? ` (${formatBytes(fields.bytes)})` : \"\";\n\t\tthis.log.info({\n\t\t\trenderId: this.renderId,\n\t\t\tphase: \"done\",\n\t\t\telapsedMs: Math.round(total),\n\t\t\tphaseMs: Object.fromEntries([...this.phaseMs].map(([phase, ms]) => [phase, Math.round(ms)])),\n\t\t\t...fields\n\t\t}, `${LOG_PREFIX} Done in ${formatDuration(total)}${size}: ${parts.join(\" · \")}`);\n\t\tthis.emit();\n\t}\n\t/** Logs which phase the render stopped in. */\n\tfail(error, aborted) {\n\t\tthis.stopHeartbeat();\n\t\tconst elapsed = formatDuration(this.now() - this.startedAt);\n\t\tconst fields = {\n\t\t\trenderId: this.renderId,\n\t\t\tphase: this.phase,\n\t\t\tframe: this.frame,\n\t\t\ttotalFrames: this.totalFrames,\n\t\t\telapsedMs: Math.round(this.now() - this.startedAt)\n\t\t};\n\t\tif (aborted) this.log.warn(fields, `${LOG_PREFIX} Aborted while ${ACTIVITY[this.phase]} after ${elapsed}`);\n\t\telse this.log.error({\n\t\t\t...fields,\n\t\t\terr: error\n\t\t}, `${LOG_PREFIX} Failed while ${ACTIVITY[this.phase]} after ${elapsed}`);\n\t}\n\t/** Stops the \"still …\" timer. Safe to call more than once. */\n\tdispose() {\n\t\tthis.stopHeartbeat();\n\t}\n\tclosePhase() {\n\t\tconst now = this.now();\n\t\tthis.phaseMs.set(this.phase, (this.phaseMs.get(this.phase) ?? 0) + (now - this.phaseStartedAt));\n\t\tthis.phaseStartedAt = now;\n\t}\n\trate() {\n\t\tconst seconds = Math.max(.001, (this.now() - this.phaseStartedAt) / 1e3);\n\t\tconst fps = this.frame / seconds;\n\t\treturn {\n\t\t\tfps,\n\t\t\tetaSec: Math.round((this.totalFrames - this.frame) / Math.max(fps, .001))\n\t\t};\n\t}\n\tinfo(message, fields = {}) {\n\t\tthis.log.info({\n\t\t\trenderId: this.renderId,\n\t\t\tphase: this.phase,\n\t\t\tframe: this.frame,\n\t\t\ttotalFrames: this.totalFrames,\n\t\t\t...fields\n\t\t}, `${LOG_PREFIX} ${message}`);\n\t\tthis.lastLogAt = this.now();\n\t\tthis.armHeartbeat();\n\t}\n\temit(extra = {}) {\n\t\tthis.onProgress?.({\n\t\t\tphase: this.phase,\n\t\t\tframe: this.frame,\n\t\t\ttotalFrames: this.totalFrames,\n\t\t\telapsedMs: Math.round(this.now() - this.startedAt),\n\t\t\t...this.phaseProgress !== void 0 && { phaseProgress: this.phaseProgress },\n\t\t\t...this.detail !== void 0 && { detail: this.detail },\n\t\t\t...extra\n\t\t});\n\t}\n\tarmHeartbeat() {\n\t\tthis.stopHeartbeat();\n\t\tthis.heartbeat = setTimeout(() => this.beat(), this.heartbeatMs);\n\t\tthis.heartbeat.unref?.();\n\t}\n\tbeat() {\n\t\tconst inPhase = formatDuration(this.now() - this.phaseStartedAt);\n\t\tlet what = \"\";\n\t\tif (this.phase === \"render\") what = ` (frame ${this.frame}/${this.totalFrames})`;\n\t\telse if (this.detail || this.phaseProgress !== void 0) what = ` (${[this.phaseProgress !== void 0 ? `${Math.floor(this.phaseProgress * 100)}%` : \"\", this.detail].filter(Boolean).join(\", \")})`;\n\t\tthis.log.info({\n\t\t\trenderId: this.renderId,\n\t\t\tphase: this.phase,\n\t\t\tframe: this.frame,\n\t\t\ttotalFrames: this.totalFrames\n\t\t}, `${LOG_PREFIX} Still ${ACTIVITY[this.phase]}${what}, ${inPhase} in this phase`);\n\t\tthis.heartbeatMs = Math.min(this.heartbeatMs * 2, HEARTBEAT_MAX_MS);\n\t\tthis.armHeartbeat();\n\t}\n\tstopHeartbeat() {\n\t\tif (this.heartbeat) clearTimeout(this.heartbeat);\n\t\tthis.heartbeat = void 0;\n\t}\n};\n/** \"4.2s\", \"2m 05s\", \"1h 02m\". */\nfunction formatDuration(ms) {\n\tconst s = Math.max(0, ms) / 1e3;\n\tif (s < 60) return `${s.toFixed(1)}s`;\n\tconst total = Math.round(s);\n\tconst h = Math.floor(total / 3600);\n\tconst m = Math.floor(total % 3600 / 60);\n\tconst sec = total % 60;\n\tif (h > 0) return `${h}h ${String(m).padStart(2, \"0\")}m`;\n\treturn `${m}m ${String(sec).padStart(2, \"0\")}s`;\n}\nfunction formatBytes(bytes) {\n\tif (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`;\n\treturn `${(bytes / 1024 / 1024).toFixed(1)} MB`;\n}\nfunction round1(n) {\n\treturn Math.round(n * 10) / 10;\n}\n\n//#endregion\n//#region src/video-qa.ts\nconst DEFAULTS = {\n\tblackPixelThreshold: .1,\n\tblackFrameRatio: .98,\n\tminBlackSec: .5,\n\tminFrozenSec: 2,\n\tsilenceDbfs: -60,\n\tminSilenceSec: 2,\n\tlufsTolerance: 1\n};\nconst SAMPLE_STEP = 4;\nconst FROZEN_DIFF = .25;\n/** Measures frames handed to it in order, as RGBA bytes. */\nvar FrameInspector = class {\n\tblackLuma;\n\tblackRatio;\n\tblack = [];\n\tsameAsPrevious = [];\n\tlumaSum = 0;\n\tprevious = null;\n\tconstructor(options$1 = {}) {\n\t\tthis.blackLuma = (options$1.blackPixelThreshold ?? DEFAULTS.blackPixelThreshold) * 255;\n\t\tthis.blackRatio = options$1.blackFrameRatio ?? DEFAULTS.blackFrameRatio;\n\t}\n\tget frameCount() {\n\t\treturn this.black.length;\n\t}\n\tinspect(rgba, width, height) {\n\t\tconst cols = Math.ceil(width / SAMPLE_STEP);\n\t\tconst rows = Math.ceil(height / SAMPLE_STEP);\n\t\tconst luma = new Uint8Array(cols * rows);\n\t\tlet blackCount = 0;\n\t\tlet sum = 0;\n\t\tlet k = 0;\n\t\tfor (let y = 0; y < height; y += SAMPLE_STEP) {\n\t\t\tlet p = y * width * 4;\n\t\t\tfor (let x = 0; x < width; x += SAMPLE_STEP, p += SAMPLE_STEP * 4) {\n\t\t\t\tconst l = .2126 * rgba[p] + .7152 * rgba[p + 1] + .0722 * rgba[p + 2];\n\t\t\t\tluma[k++] = l;\n\t\t\t\tsum += l;\n\t\t\t\tif (l <= this.blackLuma) blackCount++;\n\t\t\t}\n\t\t}\n\t\tconst n = luma.length;\n\t\tthis.lumaSum += sum / n / 255;\n\t\tthis.black.push(blackCount / n >= this.blackRatio);\n\t\tlet same = false;\n\t\tif (this.previous && this.previous.length === n) {\n\t\t\tlet diff = 0;\n\t\t\tfor (let i = 0; i < n; i++) diff += Math.abs(luma[i] - this.previous[i]);\n\t\t\tsame = diff / n < FROZEN_DIFF;\n\t\t}\n\t\tthis.sameAsPrevious.push(same);\n\t\tthis.previous = luma;\n\t}\n\tstats(expectedFrames, encodedFrames, fps, width, height, options$1 = {}) {\n\t\tconst minBlack = Math.max(1, Math.round((options$1.minBlackSec ?? DEFAULTS.minBlackSec) * fps));\n\t\tconst minFrozen = Math.max(2, Math.round((options$1.minFrozenSec ?? DEFAULTS.minFrozenSec) * fps));\n\t\tconst blackSegments = runs(this.black, minBlack).map(([a, b]) => ({\n\t\t\tstartSec: a / fps,\n\t\t\tendSec: b / fps\n\t\t}));\n\t\tconst frozenSegments = runs(this.sameAsPrevious, minFrozen - 1).map(([a, b]) => ({\n\t\t\tstartSec: (a - 1) / fps,\n\t\t\tendSec: b / fps\n\t\t}));\n\t\treturn {\n\t\t\texpectedFrames,\n\t\t\tencodedFrames,\n\t\t\tfps,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tmeanLuma: this.frameCount > 0 ? this.lumaSum / this.frameCount : 0,\n\t\t\tblackSegments,\n\t\t\tfrozenSegments\n\t\t};\n\t}\n};\n/** [start, end) index ranges where flags hold for at least minLength in a row. */\nfunction runs(flags, minLength) {\n\tconst out = [];\n\tlet start = -1;\n\tfor (let i = 0; i <= flags.length; i++) if (i < flags.length && flags[i]) {\n\t\tif (start < 0) start = i;\n\t} else if (start >= 0) {\n\t\tif (i - start >= minLength) out.push([start, i]);\n\t\tstart = -1;\n\t}\n\treturn out;\n}\nconst toDb = (power) => power > 0 ? 10 * Math.log10(power) : -Infinity;\n/** Measures a mixed audio track (one Float32Array per channel). */\nfunction analyzeAudio(channels, sampleRate, options$1 = {}) {\n\tconst length = channels[0]?.length ?? 0;\n\tlet peak = 0;\n\tlet sumSquares = 0;\n\tlet clipped = 0;\n\tfor (const ch of channels) for (let i = 0; i < length; i++) {\n\t\tconst v = Math.abs(ch[i]);\n\t\tif (v > peak) peak = v;\n\t\tif (v >= .9999) clipped++;\n\t\tsumSquares += v * v;\n\t}\n\tconst total = length * Math.max(1, channels.length);\n\tconst silenceDbfs = options$1.silenceDbfs ?? DEFAULTS.silenceDbfs;\n\tconst window = Math.max(1, Math.round(sampleRate * .1));\n\tconst silent = [];\n\tfor (let start = 0; start < length; start += window) {\n\t\tconst end = Math.min(length, start + window);\n\t\tlet s = 0;\n\t\tfor (const ch of channels) for (let i = start; i < end; i++) s += ch[i] * ch[i];\n\t\tsilent.push(toDb(s / ((end - start) * channels.length)) < silenceDbfs);\n\t}\n\tconst silentSegments = runs(silent, Math.max(1, Math.round((options$1.minSilenceSec ?? DEFAULTS.minSilenceSec) / .1))).map(([a, b]) => ({\n\t\tstartSec: a * window / sampleRate,\n\t\tendSec: Math.min(length, b * window) / sampleRate\n\t}));\n\tconst peakDbfs = 20 * Math.log10(Math.max(peak, 1e-12));\n\treturn {\n\t\tsampleRate,\n\t\tchannels: channels.length,\n\t\tdurationSec: length / sampleRate,\n\t\tpeakDbfs,\n\t\trmsDbfs: toDb(sumSquares / Math.max(1, total)),\n\t\tintegratedLufs: peakDbfs < silenceDbfs ? null : integratedLoudness(channels, sampleRate),\n\t\tclippedSamples: clipped,\n\t\tsilentSegments\n\t};\n}\n/** BS.1770 K-weighting stage 1: +4 dB high shelf around 1.5 kHz (the head). */\nfunction highShelf(sampleRate) {\n\tconst A = 10 ** (4 / 40);\n\tconst w0 = 2 * Math.PI * 1500 / sampleRate;\n\tconst cos = Math.cos(w0);\n\tconst alpha = Math.sin(w0) / (2 / Math.SQRT2);\n\tconst sq = 2 * Math.sqrt(A) * alpha;\n\tconst a0 = A + 1 - (A - 1) * cos + sq;\n\treturn {\n\t\tb0: A * (A + 1 + (A - 1) * cos + sq) / a0,\n\t\tb1: -2 * A * (A - 1 + (A + 1) * cos) / a0,\n\t\tb2: A * (A + 1 + (A - 1) * cos - sq) / a0,\n\t\ta1: 2 * (A - 1 - (A + 1) * cos) / a0,\n\t\ta2: (A + 1 - (A - 1) * cos - sq) / a0\n\t};\n}\n/** BS.1770 K-weighting stage 2: 38 Hz high pass, Q 0.5 (the RLB curve). */\nfunction highPass(sampleRate) {\n\tconst w0 = 2 * Math.PI * 38 / sampleRate;\n\tconst cos = Math.cos(w0);\n\tconst alpha = Math.sin(w0) / (2 * .5);\n\tconst a0 = 1 + alpha;\n\treturn {\n\t\tb0: (1 + cos) / 2 / a0,\n\t\tb1: -(1 + cos) / a0,\n\t\tb2: (1 + cos) / 2 / a0,\n\t\ta1: -2 * cos / a0,\n\t\ta2: (1 - alpha) / a0\n\t};\n}\nfunction filter(input, f) {\n\tconst out = new Float32Array(input.length);\n\tlet x1 = 0;\n\tlet x2 = 0;\n\tlet y1 = 0;\n\tlet y2 = 0;\n\tfor (let i = 0; i < input.length; i++) {\n\t\tconst x = input[i];\n\t\tconst y = f.b0 * x + f.b1 * x1 + f.b2 * x2 - f.a1 * y1 - f.a2 * y2;\n\t\tout[i] = y;\n\t\tx2 = x1;\n\t\tx1 = x;\n\t\ty2 = y1;\n\t\ty1 = y;\n\t}\n\treturn out;\n}\n/**\n* ITU-R BS.1770-4 integrated loudness (LUFS): K-weighted mean square in\n* 400 ms blocks with 75% overlap, gated at -70 LUFS and then at 10 LU below\n* the mean of what passed. Channels weigh 1 (stereo and mono layouts).\n*/\nfunction integratedLoudness(channels, sampleRate) {\n\tconst shelf = highShelf(sampleRate);\n\tconst hp = highPass(sampleRate);\n\tconst weighted = channels.map((ch) => filter(filter(ch, shelf), hp));\n\tconst length = weighted[0]?.length ?? 0;\n\tconst block = Math.round(.4 * sampleRate);\n\tconst hop = Math.round(.1 * sampleRate);\n\tif (length < block) return null;\n\tconst blockPower = [];\n\tfor (let start = 0; start + block <= length; start += hop) {\n\t\tlet power = 0;\n\t\tfor (const ch of weighted) {\n\t\t\tlet s = 0;\n\t\t\tfor (let i = start; i < start + block; i++) s += ch[i] * ch[i];\n\t\t\tpower += s / block;\n\t\t}\n\t\tblockPower.push(power);\n\t}\n\tconst lufs = (power) => -.691 + toDb(power);\n\tconst mean = (xs) => xs.reduce((a, b) => a + b, 0) / xs.length;\n\tconst absolute = blockPower.filter((p) => lufs(p) > -70);\n\tif (absolute.length === 0) return null;\n\tconst relativeGate = lufs(mean(absolute)) - 10;\n\tconst gated = absolute.filter((p) => lufs(p) > relativeGate);\n\treturn gated.length > 0 ? lufs(mean(gated)) : null;\n}\n/** Turn measurements and document diagnostics into a report with issues. */\nfunction buildQaReport(parts) {\n\tconst { video, audio, options: options$1 = {} } = parts;\n\tconst issues = [];\n\tconst at = (s) => `${s.startSec.toFixed(2)}–${s.endSec.toFixed(2)} s`;\n\tif (video) {\n\t\tif (video.encodedFrames !== video.expectedFrames) issues.push({\n\t\t\tseverity: \"error\",\n\t\t\tcode: \"frames_missing\",\n\t\t\tmessage: `${video.encodedFrames} of ${video.expectedFrames} frames were encoded`\n\t\t});\n\t\tfor (const s of video.blackSegments) issues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"black_frames\",\n\t\t\tmessage: `Black frames at ${at(s)}`,\n\t\t\t...s\n\t\t});\n\t\tfor (const s of video.frozenSegments) issues.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"frozen_video\",\n\t\t\tmessage: `Picture does not change at ${at(s)}`,\n\t\t\t...s\n\t\t});\n\t}\n\tif (audio) if (audio.integratedLufs === null) issues.push({\n\t\tseverity: \"info\",\n\t\tcode: \"audio_silent\",\n\t\tmessage: \"The audio track is silent\"\n\t});\n\telse {\n\t\tif (audio.clippedSamples > 0) issues.push({\n\t\t\tseverity: \"warning\",\n\t\t\tcode: \"audio_clipping\",\n\t\t\tmessage: `${audio.clippedSamples} audio sample(s) at or beyond full scale (peak ${audio.peakDbfs.toFixed(1)} dBFS)`\n\t\t});\n\t\tfor (const s of audio.silentSegments) issues.push({\n\t\t\tseverity: \"info\",\n\t\t\tcode: \"audio_silence\",\n\t\t\tmessage: `Silence at ${at(s)}`,\n\t\t\t...s\n\t\t});\n\t\tif (options$1.targetLufs !== void 0) {\n\t\t\tconst off = audio.integratedLufs - options$1.targetLufs;\n\t\t\tconst tolerance = options$1.lufsTolerance ?? DEFAULTS.lufsTolerance;\n\t\t\tif (Math.abs(off) > tolerance) issues.push({\n\t\t\t\tseverity: \"warning\",\n\t\t\t\tcode: \"loudness_off_target\",\n\t\t\t\tmessage: `Integrated loudness ${audio.integratedLufs.toFixed(1)} LUFS is ${Math.abs(off).toFixed(1)} LU ${off > 0 ? \"above\" : \"below\"} the ${options$1.targetLufs} LUFS target`\n\t\t\t});\n\t\t}\n\t}\n\tfor (const d of parts.diagnostics ?? []) issues.push({\n\t\tseverity: d.severity,\n\t\tcode: d.code,\n\t\tmessage: d.message,\n\t\t...d.layerId !== void 0 && { layerId: d.layerId }\n\t});\n\treturn {\n\t\tpassed: !issues.some((i) => i.severity !== \"info\"),\n\t\t...video && { video },\n\t\t...audio && { audio },\n\t\tissues\n\t};\n}\n/** A short human- and agent-readable summary of a report. */\nfunction formatQaReport(report) {\n\tconst lines = [`QA ${report.passed ? \"passed\" : \"FAILED\"}`];\n\tconst v = report.video;\n\tif (v) lines.push(` video: ${v.encodedFrames}/${v.expectedFrames} frames, ${v.width}x${v.height} @ ${v.fps} fps, mean luma ${v.meanLuma.toFixed(2)}`);\n\tconst a = report.audio;\n\tif (a) {\n\t\tconst lufs = a.integratedLufs === null ? \"silent\" : `${a.integratedLufs.toFixed(1)} LUFS`;\n\t\tlines.push(` audio: ${a.durationSec.toFixed(2)} s, ${lufs}, peak ${a.peakDbfs.toFixed(1)} dBFS, rms ${a.rmsDbfs.toFixed(1)} dBFS`);\n\t}\n\tfor (const i of report.issues) lines.push(` ${i.severity.padEnd(7)} ${i.code}: ${i.message}`);\n\treturn lines.join(\"\\n\");\n}\n\n//#endregion\n//#region src/zero-copy-webcodecs-pipeline.ts\n/**\n* High-performance hardware video encoding pipeline integrating WebGPU textures with WebCodecs.\n*\n* Provides:\n* 1. Direct hardware acceleration when running with WebCodecs / OffscreenCanvas.\n* 2. Pipelined asynchronous double-buffered DMA staging ring for headless Node.js (Dawn native),\n* allowing GPU Frame i+1 rendering to overlap concurrently with Frame i hardware encoding.\n*/\nvar ZeroCopyWebCodecsPipeline = class {\n\twidth;\n\theight;\n\tfps;\n\tringCapacity;\n\tdevice;\n\tvideoSource;\n\tstagingRing;\n\tcolorSpace;\n\tdirectCanvasSource;\n\tonFrame;\n\tinFlightFrames = [];\n\tcycleStartTimes = /* @__PURE__ */ new Map();\n\ttotalFramesEnqueued = 0;\n\ttotalFramesEncoded = 0;\n\ttotalGpuSubmitTimeMs = 0;\n\ttotalEncodeTimeMs = 0;\n\ttotalCycleTimeMs = 0;\n\tmaxCycleTimeMs = 0;\n\tminCycleTimeMs = Number.POSITIVE_INFINITY;\n\tpipelineStartTime = 0;\n\tconstructor(device, options$1) {\n\t\tthis.device = device;\n\t\tthis.width = options$1.width;\n\t\tthis.height = options$1.height;\n\t\tthis.fps = options$1.fps;\n\t\tthis.videoSource = options$1.videoSource;\n\t\tthis.ringCapacity = Math.max(2, options$1.ringCapacity ?? 2);\n\t\tthis.colorSpace = options$1.colorSpace;\n\t\tthis.directCanvasSource = options$1.directCanvasSource;\n\t\tthis.onFrame = options$1.onFrame;\n\t\tthis.stagingRing = new DmaStagingRing(device, {\n\t\t\twidth: this.width,\n\t\t\theight: this.height,\n\t\t\tcapacity: this.ringCapacity\n\t\t});\n\t\tthis.pipelineStartTime = performance.now();\n\t}\n\t/**\n\t* Returns true if direct zero-copy from an OffscreenCanvas or texture is active.\n\t*/\n\tcanDirectZeroCopy() {\n\t\treturn this.directCanvasSource !== void 0 && this.directCanvasSource !== null;\n\t}\n\t/**\n\t* Enqueues a rendered GPU texture frame into the pipeline.\n\t*\n\t* Uses double-buffered DMA staging: if the staging ring has reached capacity,\n\t* the oldest in-flight frame is asynchronously consumed and added to the video encoder\n\t* before staging the new frame, guaranteeing constant bounded VRAM usage and zero GPU stalls.\n\t*/\n\tasync enqueueFrame(frameIndex, targetTexture, encoder) {\n\t\tconst cycleStartTime = performance.now();\n\t\tif (this.inFlightFrames.length >= this.ringCapacity) {\n\t\t\tconst oldestFrame = this.inFlightFrames.shift();\n\t\t\tif (oldestFrame !== void 0) await this.consumeAndEncode(oldestFrame);\n\t\t}\n\t\tif (this.canDirectZeroCopy()) {\n\t\t\tconst gpuStart = performance.now();\n\t\t\tthis.device.queue.submit([encoder.finish()]);\n\t\t\tthis.totalGpuSubmitTimeMs += performance.now() - gpuStart;\n\t\t\tthis.cycleStartTimes.set(frameIndex, cycleStartTime);\n\t\t\tthis.totalFramesEnqueued++;\n\t\t\tawait this.consumeAndEncode(frameIndex);\n\t\t} else {\n\t\t\tawait this.stagingRing.prepareSlot(frameIndex);\n\t\t\tthis.stagingRing.stageTexture(encoder, targetTexture, frameIndex);\n\t\t\tconst gpuStart = performance.now();\n\t\t\tthis.device.queue.submit([encoder.finish()]);\n\t\t\tthis.totalGpuSubmitTimeMs += performance.now() - gpuStart;\n\t\t\tthis.stagingRing.scheduleMap(frameIndex);\n\t\t\tthis.inFlightFrames.push(frameIndex);\n\t\t\tthis.cycleStartTimes.set(frameIndex, cycleStartTime);\n\t\t\tthis.totalFramesEnqueued++;\n\t\t}\n\t}\n\t/**\n\t* Drains all remaining in-flight frames in the pipeline, ensuring every enqueued\n\t* frame has been encoded and added to the video sample source.\n\t*/\n\tasync drain() {\n\t\twhile (this.inFlightFrames.length > 0) {\n\t\t\tconst frameIndex = this.inFlightFrames.shift();\n\t\t\tif (frameIndex !== void 0) await this.consumeAndEncode(frameIndex);\n\t\t}\n\t}\n\t/**\n\t* Returns runtime throughput, latency, and pipeline statistics.\n\t*/\n\tgetStats() {\n\t\tconst totalElapsedMs = performance.now() - this.pipelineStartTime;\n\t\tconst throughputFps = totalElapsedMs > 0 ? this.totalFramesEncoded / totalElapsedMs * 1e3 : 0;\n\t\tconst avgSubmit = this.totalFramesEnqueued > 0 ? this.totalGpuSubmitTimeMs / this.totalFramesEnqueued : 0;\n\t\tconst avgEncode = this.totalFramesEncoded > 0 ? this.totalEncodeTimeMs / this.totalFramesEncoded : 0;\n\t\tconst avgCycle = this.totalFramesEncoded > 0 ? this.totalCycleTimeMs / this.totalFramesEncoded : 0;\n\t\treturn {\n\t\t\ttotalFramesEnqueued: this.totalFramesEnqueued,\n\t\t\ttotalFramesEncoded: this.totalFramesEncoded,\n\t\t\taverageGpuSubmitTimeMs: avgSubmit,\n\t\t\taverageEncodeTimeMs: avgEncode,\n\t\t\taverageCycleTimeMs: avgCycle,\n\t\t\tmaxCycleTimeMs: this.maxCycleTimeMs,\n\t\t\tminCycleTimeMs: Number.isFinite(this.minCycleTimeMs) ? this.minCycleTimeMs : 0,\n\t\t\tthroughputFps,\n\t\t\tringCapacity: this.ringCapacity,\n\t\t\tisDirectZeroCopy: this.canDirectZeroCopy()\n\t\t};\n\t}\n\t/**\n\t* Destroys the pipeline and releases all staging buffers.\n\t*/\n\tdestroy() {\n\t\tthis.inFlightFrames.length = 0;\n\t\tthis.cycleStartTimes.clear();\n\t\tthis.stagingRing.destroy();\n\t}\n\tasync consumeAndEncode(frameIndex) {\n\t\tconst encodeStart = performance.now();\n\t\tconst timestampUs = frameIndex / this.fps * 1e6;\n\t\tif (this.canDirectZeroCopy()) {\n\t\t\tconst sample = new VideoSample(this.directCanvasSource, {\n\t\t\t\tduration: 1 / this.fps,\n\t\t\t\ttimestamp: frameIndex / this.fps\n\t\t\t});\n\t\t\ttry {\n\t\t\t\tawait this.videoSource.add(sample);\n\t\t\t} finally {\n\t\t\t\tsample.close();\n\t\t\t}\n\t\t} else {\n\t\t\tconst onFrame = this.onFrame;\n\t\t\tconst vf = await this.stagingRing.readFrameToVideoFrame(frameIndex, timestampUs, this.colorSpace, onFrame && ((rgba) => onFrame(rgba, frameIndex)));\n\t\t\ttry {\n\t\t\t\tconst sample = new VideoSample(vf, {\n\t\t\t\t\tduration: 1 / this.fps,\n\t\t\t\t\ttimestamp: frameIndex / this.fps\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait this.videoSource.add(sample);\n\t\t\t\t} finally {\n\t\t\t\t\tsample.close();\n\t\t\t\t}\n\t\t\t} finally {\n\t\t\t\tvf.close();\n\t\t\t}\n\t\t}\n\t\tconst now = performance.now();\n\t\tthis.totalEncodeTimeMs += now - encodeStart;\n\t\tthis.totalFramesEncoded++;\n\t\tconst cycleStart = this.cycleStartTimes.get(frameIndex);\n\t\tif (cycleStart !== void 0) {\n\t\t\tconst cycleDuration = now - cycleStart;\n\t\t\tthis.cycleStartTimes.delete(frameIndex);\n\t\t\tthis.totalCycleTimeMs += cycleDuration;\n\t\t\tif (cycleDuration > this.maxCycleTimeMs) this.maxCycleTimeMs = cycleDuration;\n\t\t\tif (cycleDuration < this.minCycleTimeMs) this.minCycleTimeMs = cycleDuration;\n\t\t}\n\t}\n};\n\n//#endregion\n//#region src/headless-webgpu-renderer.ts\nglobalThis[Symbol.for(\"framefields.vision.backend\")] = (info) => {\n\trendererLogger.info(info, info.backend === \"webgpu\" ? \"[vision] Inference on the GPU (WebGPU)\" : `[vision] Inference on the ${info.backend.toUpperCase()}`);\n};\nasync function convertMp4ToGif(inputMp4Path, outputGifPath) {\n\treturn new Promise((resolve, reject) => {\n\t\tconst ffmpeg = spawn(\"ffmpeg\", [\n\t\t\t\"-i\",\n\t\t\tinputMp4Path,\n\t\t\t\"-vf\",\n\t\t\t\"split[s0][s1];[s0]palettegen[p];[s1][p]paletteuse\",\n\t\t\t\"-y\",\n\t\t\toutputGifPath\n\t\t]);\n\t\tlet errorOutput = \"\";\n\t\tffmpeg.stderr.on(\"data\", (data) => {\n\t\t\terrorOutput += data.toString();\n\t\t});\n\t\tffmpeg.on(\"close\", async (code) => {\n\t\t\tif (code === 0) resolve();\n\t\t\telse {\n\t\t\t\trendererLogger.error({\n\t\t\t\t\tcode,\n\t\t\t\t\terr: errorOutput\n\t\t\t\t}, \"[convertMp4ToGif] ffmpeg conversion failed\");\n\t\t\t\treject(/* @__PURE__ */ new Error(`ffmpeg exited with code ${code}: ${errorOutput}`));\n\t\t\t}\n\t\t});\n\t\tffmpeg.on(\"error\", (err) => {\n\t\t\trendererLogger.error({ err }, \"[convertMp4ToGif] ffmpeg spawn error\");\n\t\t\treject(err);\n\t\t});\n\t});\n}\nbootstrapMediabunny();\nconst globalObj = globalThis;\nif (typeof globalThis !== \"undefined\") {\n\tglobalObj.__IS_HEADLESS_RENDERER__ = true;\n\tglobalObj.__GATEWAI_DELAYS__ ??= /* @__PURE__ */ new Set();\n}\nif (typeof globalThis.requestAnimationFrame === \"undefined\") {\n\tglobalObj.requestAnimationFrame = (cb) => setTimeout(cb, 0);\n\tglobalObj.cancelAnimationFrame = (id) => clearTimeout(id);\n}\nconst dummyDomElement = {\n\tclientWidth: 1920,\n\tclientHeight: 1080,\n\tgetBoundingClientRect: () => ({\n\t\tx: 0,\n\t\ty: 0,\n\t\tleft: 0,\n\t\ttop: 0,\n\t\tright: 1920,\n\t\tbottom: 1080,\n\t\twidth: 1920,\n\t\theight: 1080\n\t}),\n\tstyle: {},\n\tappendChild: () => {},\n\tremoveChild: () => {},\n\taddEventListener: () => {},\n\tremoveEventListener: () => {},\n\tgetAttribute: () => null\n};\nif (typeof globalThis.OffscreenCanvas === \"undefined\") globalObj.OffscreenCanvas = Canvas;\nif (typeof globalThis.HTMLCanvasElement === \"undefined\") globalObj.HTMLCanvasElement = Canvas;\nif (typeof globalThis.Image === \"undefined\") globalObj.Image = Image;\nif (typeof globalThis.window === \"undefined\") globalObj.window = globalThis;\nif (!globalThis.location) globalObj.location = new URL(\"http://localhost\");\nif (typeof globalThis.IntersectionObserver === \"undefined\") globalObj.IntersectionObserver = class IntersectionObserver {\n\tobserve() {}\n\tunobserve() {}\n\tdisconnect() {}\n};\nif (typeof globalThis.document === \"undefined\") globalObj.document = {\n\tcreateElement: (tag) => {\n\t\tif (tag === \"canvas\") return new Canvas(1, 1);\n\t\treturn { ...dummyDomElement };\n\t},\n\tgetElementsByTagName: () => [],\n\tdocumentElement: dummyDomElement,\n\tbody: dummyDomElement\n};\nelse {\n\tconst docObj = globalThis.document;\n\tif (typeof docObj.getElementsByTagName === \"undefined\") docObj.getElementsByTagName = () => [];\n\tdocObj.documentElement ??= dummyDomElement;\n\tdocObj.body ??= dummyDomElement;\n}\nconst skiaProto = Canvas.prototype;\nif (typeof skiaProto.getBoundingClientRect === \"undefined\") skiaProto.getBoundingClientRect = function() {\n\tconst width = this.width || 512;\n\tconst height = this.height || 512;\n\treturn {\n\t\tx: 0,\n\t\ty: 0,\n\t\tleft: 0,\n\t\ttop: 0,\n\t\tright: width,\n\t\tbottom: height,\n\t\twidth,\n\t\theight\n\t};\n};\nif (!(\"style\" in skiaProto)) Object.defineProperty(skiaProto, \"style\", {\n\tget() {\n\t\tthis._style ??= {};\n\t\treturn this._style;\n\t},\n\tconfigurable: true\n});\nif (!(\"clientWidth\" in skiaProto)) Object.defineProperty(skiaProto, \"clientWidth\", {\n\tget() {\n\t\treturn this.width || 512;\n\t},\n\tconfigurable: true\n});\nif (!(\"clientHeight\" in skiaProto)) Object.defineProperty(skiaProto, \"clientHeight\", {\n\tget() {\n\t\treturn this.height || 512;\n\t},\n\tconfigurable: true\n});\nif (!(\"parentElement\" in skiaProto)) Object.defineProperty(skiaProto, \"parentElement\", {\n\tget() {\n\t\treturn dummyDomElement;\n\t},\n\tconfigurable: true\n});\nif (typeof skiaProto.addEventListener === \"undefined\") skiaProto.addEventListener = () => {};\nif (typeof skiaProto.removeEventListener === \"undefined\") skiaProto.removeEventListener = () => {};\nif (typeof skiaProto.getAttribute === \"undefined\") skiaProto.getAttribute = () => null;\nconst CPU_COUNT = os.cpus().length;\nconst TOTAL_WORKER_BUDGET = Math.max(1, CPU_COUNT - 3);\nconst MAX_CONCURRENT_RENDERS = Math.max(1, Math.min(3, Math.floor(TOTAL_WORKER_BUDGET / 3)));\nconst QUEUE_TIMEOUT_MS = 120 * 6e4;\nvar RenderSemaphore = class {\n\t_running = 0;\n\t_max;\n\t_queue = [];\n\tconstructor(max) {\n\t\tthis._max = max;\n\t}\n\tacquire(timeoutMs = QUEUE_TIMEOUT_MS) {\n\t\tif (this._running < this._max) {\n\t\t\tthis._running++;\n\t\t\treturn Promise.resolve();\n\t\t}\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tconst timer = setTimeout(() => {\n\t\t\t\tconst idx = this._queue.findIndex((e) => e.resolve === resolve);\n\t\t\t\tif (idx !== -1) this._queue.splice(idx, 1);\n\t\t\t\treject(/* @__PURE__ */ new Error(`Render queue timeout after ${timeoutMs}ms (${this._queue.length} queued, ${this._running}/${this._max} active)`));\n\t\t\t}, timeoutMs);\n\t\t\tthis._queue.push({\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t\ttimer\n\t\t\t});\n\t\t});\n\t}\n\trelease() {\n\t\tif (this._queue.length > 0) {\n\t\t\tconst next = this._queue.shift();\n\t\t\tclearTimeout(next.timer);\n\t\t\tnext.resolve();\n\t\t} else this._running--;\n\t}\n\tget stats() {\n\t\treturn {\n\t\t\tactive: this._running,\n\t\t\tqueued: this._queue.length,\n\t\t\tmax: this._max\n\t\t};\n\t}\n};\nconst renderSemaphore = new RenderSemaphore(MAX_CONCURRENT_RENDERS);\n/**\n* Ids for still renders without a caller id. Media caches (video decoders,\n* last-good frames) are keyed by render id, so a fresh id per still would\n* open a new decoder for every frame of a frame-by-frame export. Stills\n* borrow an idle id instead: consecutive stills reuse it (and its decoders);\n* concurrent stills get distinct ones.\n*/\nconst idleStillIds = [];\nconst takeStillId = () => idleStillIds.pop() ?? `img-${randomUUID()}`;\nconst returnStillId = (id) => {\n\tidleStillIds.push(id);\n};\nasync function fileSize(file) {\n\ttry {\n\t\treturn (await fs$1.stat(file)).size;\n\t} catch {\n\t\treturn;\n\t}\n}\nfunction toEvenDimension(n) {\n\tconst v = Math.round(n);\n\treturn v % 2 === 0 ? v : v + 1;\n}\nfunction resolveQuality(quality) {\n\tswitch (quality) {\n\t\tcase \"very_low\": return QUALITY_VERY_LOW;\n\t\tcase \"low\": return QUALITY_LOW;\n\t\tcase \"high\": return QUALITY_HIGH;\n\t\tcase \"very_high\": return QUALITY_VERY_HIGH;\n\t\tdefault: return QUALITY_VERY_HIGH;\n\t}\n}\nlet cachedVramUsage = \"N/A\";\nlet vramProbeInFlight = false;\nfunction refreshVramUsage() {\n\tif (vramProbeInFlight) return;\n\tvramProbeInFlight = true;\n\texec(\"nvidia-smi --query-gpu=memory.used,memory.total --format=csv,noheader,nounits\", {\n\t\tencoding: \"utf-8\",\n\t\ttimeout: 2e3\n\t}, (err, stdout) => {\n\t\tvramProbeInFlight = false;\n\t\tif (err || !stdout) return;\n\t\tconst [used, total] = stdout.trim().split(\",\").map((s) => s.trim());\n\t\tif (used && total) cachedVramUsage = `${used}MB / ${total}MB`;\n\t});\n}\nfunction getVramUsage() {\n\treturn cachedVramUsage;\n}\nconst DEFAULT_RING_CAPACITY = 2;\nconst MIN_RING_CAPACITY = 2;\nconst MAX_RING_CAPACITY = 8;\nfunction resolveRingCapacity(explicit) {\n\tconst fromEnv = Number(process.env.FRAMEFIELDS_RING_CAPACITY);\n\tconst requested = explicit ?? (Number.isFinite(fromEnv) && fromEnv > 0 ? fromEnv : NaN);\n\tif (!Number.isFinite(requested) || requested <= 0) return DEFAULT_RING_CAPACITY;\n\treturn Math.max(MIN_RING_CAPACITY, Math.min(MAX_RING_CAPACITY, Math.floor(requested)));\n}\nvar NodeSurfacePool = class {\n\tidle = [];\n\tmaxIdle = 2;\n\tacquire(device, width, height) {\n\t\tconst index = this.idle.findIndex((entry) => entry.device === device && entry.surface.width === width && entry.surface.height === height);\n\t\tif (index >= 0) {\n\t\t\tconst [entry] = this.idle.splice(index, 1);\n\t\t\tif (entry) return entry.surface;\n\t\t}\n\t\tfor (let i = this.idle.length - 1; i >= 0; i--) {\n\t\t\tconst entry = this.idle[i];\n\t\t\tif (entry && entry.device !== device) {\n\t\t\t\tthis.idle.splice(i, 1);\n\t\t\t\ttry {\n\t\t\t\t\tentry.surface.destroy();\n\t\t\t\t} catch {}\n\t\t\t}\n\t\t}\n\t\treturn new NodeSurfaceProvider(device, width, height);\n\t}\n\trelease(device, surface) {\n\t\tif (this.idle.length >= this.maxIdle) {\n\t\t\ttry {\n\t\t\t\tsurface.destroy();\n\t\t\t} catch {}\n\t\t\treturn;\n\t\t}\n\t\tthis.idle.push({\n\t\t\tdevice,\n\t\t\tsurface\n\t\t});\n\t}\n\tdestroy() {\n\t\tfor (const entry of this.idle.splice(0)) try {\n\t\t\tentry.surface.destroy();\n\t\t} catch {}\n\t}\n};\nconst nodeSurfacePool = new NodeSurfacePool();\nfunction formatLutAsCube(lut) {\n\tconst lines = [\n\t\t\"# Created by Gatewai\",\n\t\tlut.type === \"3D\" ? `LUT_3D_SIZE ${lut.size}` : `LUT_1D_SIZE ${lut.size}`,\n\t\t\"\"\n\t];\n\tfor (const p of lut.points) lines.push(`${p[0].toFixed(6)} ${p[1].toFixed(6)} ${p[2].toFixed(6)}`);\n\treturn lines.join(\"\\n\");\n}\nvar HeadlessWebGPURenderer = class HeadlessWebGPURenderer {\n\tstatic isInitialized = false;\n\tstatic initPromise = null;\n\tstatic initFailureCount = 0;\n\tstatic MAX_INIT_FAILURES = 3;\n\tstatic nextRetryAt = 0;\n\tstatic initialize() {\n\t\tif (HeadlessWebGPURenderer.isInitialized) return Promise.resolve();\n\t\tif (HeadlessWebGPURenderer.initFailureCount >= HeadlessWebGPURenderer.MAX_INIT_FAILURES) return Promise.reject(/* @__PURE__ */ new Error(\"GPU initialization permanently failed — circuit breaker open\"));\n\t\tif (Date.now() < HeadlessWebGPURenderer.nextRetryAt) return Promise.reject(/* @__PURE__ */ new Error(\"GPU initialization in backoff period\"));\n\t\tif (HeadlessWebGPURenderer.initPromise) return HeadlessWebGPURenderer.initPromise;\n\t\tHeadlessWebGPURenderer.initPromise = (async () => {\n\t\t\ttry {\n\t\t\t\trendererLogger.debug(\"[HeadlessWebGPURenderer] Initializing headless WebGPU…\");\n\t\t\t\tawait initHeadlessWebGPU();\n\t\t\t\trendererLogger.debug(\"[HeadlessWebGPURenderer] Scanning node renderers…\");\n\t\t\t\tawait discoverAndRegisterNodeRenderers();\n\t\t\t\tHeadlessWebGPURenderer.isInitialized = true;\n\t\t\t\tHeadlessWebGPURenderer.initPromise = null;\n\t\t\t\tHeadlessWebGPURenderer.initFailureCount = 0;\n\t\t\t\tHeadlessWebGPURenderer.nextRetryAt = 0;\n\t\t\t\trendererLogger.debug(\"[HeadlessWebGPURenderer] Initialization complete.\");\n\t\t\t} catch (error) {\n\t\t\t\tHeadlessWebGPURenderer.initFailureCount++;\n\t\t\t\tHeadlessWebGPURenderer.nextRetryAt = Date.now() + 5e3 * 2 ** HeadlessWebGPURenderer.initFailureCount;\n\t\t\t\tHeadlessWebGPURenderer.initPromise = null;\n\t\t\t\trendererLogger.error({\n\t\t\t\t\terr: error instanceof Error ? error.message : String(error),\n\t\t\t\t\tfailureCount: HeadlessWebGPURenderer.initFailureCount,\n\t\t\t\t\tnextRetryAt: new Date(HeadlessWebGPURenderer.nextRetryAt).toISOString()\n\t\t\t\t}, \"[HeadlessWebGPURenderer] Initialization failed\");\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t})();\n\t\treturn HeadlessWebGPURenderer.initPromise;\n\t}\n\tasync renderImage(virtualMedia, frame = 0, fps = 24, options$1 = {}) {\n\t\tawait HeadlessWebGPURenderer.initialize();\n\t\tconst width = toEvenDimension(virtualMedia.metadata.width ?? 0);\n\t\tconst height = toEvenDimension(virtualMedia.metadata.height ?? 0);\n\t\tif (!width || !height) throw new Error(`Invalid dimensions: ${width}x${height}`);\n\t\tconst pooledId = options$1.renderId ? void 0 : takeStillId();\n\t\tconst renderId = options$1.renderId ?? pooledId;\n\t\trendererLogger.debug({\n\t\t\trenderId,\n\t\t\tframe,\n\t\t\t...renderSemaphore.stats\n\t\t}, \"[HeadlessWebGPURenderer] Acquiring slot for image render\");\n\t\tawait renderSemaphore.acquire();\n\t\tlet surface;\n\t\tlet renderer;\n\t\tconst device = await ensureDevice();\n\t\ttry {\n\t\t\tawait preloadFonts(virtualMedia, device);\n\t\t\tsurface = nodeSurfacePool.acquire(device, width, height);\n\t\t\trenderer = getRenderer2D(device, surface.colorFormat);\n\t\t\tconst ctx = {\n\t\t\t\tdevice,\n\t\t\t\trenderer,\n\t\t\t\tsurface\n\t\t\t};\n\t\t\tupdateClockSignals(frame, fps, virtualMedia.metadata.durationMs ?? void 0);\n\t\t\tif (frame === 0 || lutStore.hasPending(device) || SlugFontCache.hasPending()) {\n\t\t\t\tconst preEncoder = device.createCommandEncoder();\n\t\t\t\tconst dummyTex = renderer.getTemporaryTexture(width, height);\n\t\t\t\tconst dummyView = dummyTex.createView();\n\t\t\t\trenderer.beginFrame(preEncoder, dummyView, {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t}, width, height, \"clear\").end();\n\t\t\t\tawait drawCompositionTree(ctx, preEncoder, dummyView, dummyTex, width, height, virtualMedia, {\n\t\t\t\t\tframe,\n\t\t\t\t\tcompositionFrame: frame,\n\t\t\t\t\tfps,\n\t\t\t\t\tisHeadless: true,\n\t\t\t\t\trenderId,\n\t\t\t\t\tvirtualMedia,\n\t\t\t\t\tcontainerWidth: width,\n\t\t\t\t\tcontainerHeight: height,\n\t\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t\t});\n\t\t\t\tdevice.queue.submit([preEncoder.finish()]);\n\t\t\t\tawait lutStore.awaitAllPending(device);\n\t\t\t}\n\t\t\tcompositionStateStore.setState(renderId, frame, fps, true);\n\t\t\tconst encoder = device.createCommandEncoder();\n\t\t\tconst targetView = surface.getCurrentTextureView();\n\t\t\tconst targetTexture = surface.getCurrentTexture();\n\t\t\trenderer.beginFrame(encoder, targetView, {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}, width, height, \"clear\").end();\n\t\t\tawait drawCompositionTree(ctx, encoder, targetView, targetTexture, width, height, virtualMedia, {\n\t\t\t\tframe,\n\t\t\t\tcompositionFrame: frame,\n\t\t\t\tfps,\n\t\t\t\tisHeadless: true,\n\t\t\t\trenderId,\n\t\t\t\tvirtualMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height,\n\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t});\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tconst pixels = await surface.readPixels();\n\t\t\tconst pixelsArr = new Uint8Array(pixels.buffer, pixels.byteOffset, pixels.byteLength);\n\t\t\tif (options$1.format === \"rgba\") return Buffer.from(pixelsArr);\n\t\t\treturn await sharp(Buffer.from(pixelsArr), { raw: {\n\t\t\t\twidth,\n\t\t\t\theight,\n\t\t\t\tchannels: 4\n\t\t\t} }).png().toBuffer();\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tclearAllVideoCache();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tshaderStore.clear(renderId);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tmediaDecoderCache.tick();\n\t\t\t} catch {}\n\t\t\tif (pooledId) returnStillId(pooledId);\n\t\t\tif (surface) nodeSurfacePool.release(device, surface);\n\t\t\ttry {\n\t\t\t\ttextureCache.destroy();\n\t\t\t} catch {}\n\t\t\trenderSemaphore.release();\n\t\t\trendererLogger.debug({\n\t\t\t\trenderId,\n\t\t\t\t...renderSemaphore.stats\n\t\t\t}, \"[HeadlessWebGPURenderer] Image render slot released\");\n\t\t}\n\t}\n\t/**\n\t* Renders a single frame to a PNG buffer at a specified timestamp in milliseconds or frame index.\n\t*/\n\tasync renderFrame(source, options$1 = {}) {\n\t\tconst vm = typeof source === \"object\" && source !== null && \"toVirtualMedia\" in source ? source.toVirtualMedia() : source;\n\t\tconst fps = options$1.fps ?? (vm.metadata?.fps || 30);\n\t\tconst frame = options$1.atMs !== void 0 ? Math.round(options$1.atMs / 1e3 * fps) : options$1.frame ?? 0;\n\t\treturn this.renderImage(vm, frame, fps, {\n\t\t\trenderId: options$1.renderId,\n\t\t\tformat: options$1.format\n\t\t});\n\t}\n\t/**\n\t* Mixes the composition's full audio timeline (clips, effects, synthesized\n\t* tracks) to stereo PCM, exactly as `renderVideo` muxes it.\n\t*/\n\tasync renderAudio(virtualMedia, options$1 = {}) {\n\t\tawait HeadlessWebGPURenderer.initialize();\n\t\tconst fps = options$1.fps ?? (virtualMedia.metadata?.fps || 30);\n\t\tawait renderSemaphore.acquire();\n\t\ttry {\n\t\t\tconst device = await ensureDevice();\n\t\t\treturn await mixAudioTracks(virtualMedia, fps, options$1.sampleRate ?? 48e3, device, `aud-${randomUUID()}`);\n\t\t} finally {\n\t\t\trenderSemaphore.release();\n\t\t}\n\t}\n\tasync renderLut(virtualMedia, frame = 0, fps = 24) {\n\t\tawait HeadlessWebGPURenderer.initialize();\n\t\tconst width = 32;\n\t\tconst height = 32;\n\t\tconst renderId = `lut-${randomUUID()}`;\n\t\trendererLogger.debug({\n\t\t\trenderId,\n\t\t\tframe,\n\t\t\t...renderSemaphore.stats\n\t\t}, \"[HeadlessWebGPURenderer] Acquiring slot for LUT render\");\n\t\tawait renderSemaphore.acquire();\n\t\tlet surface;\n\t\tlet renderer;\n\t\tconst device = await ensureDevice();\n\t\tlet lutData = null;\n\t\tconst lutSub = lutStore.onChange((key) => {\n\t\t\tconst raw = lutStore.getRawData(key);\n\t\t\tif (raw) lutData = raw;\n\t\t});\n\t\ttry {\n\t\t\tawait preloadFonts(virtualMedia, device);\n\t\t\tsurface = new NodeSurfaceProvider(device, width, height);\n\t\t\trenderer = getRenderer2D(device, surface.colorFormat);\n\t\t\tconst ctx = {\n\t\t\t\tdevice,\n\t\t\t\trenderer,\n\t\t\t\tsurface\n\t\t\t};\n\t\t\tif (frame === 0 || lutStore.hasPending(device) || SlugFontCache.hasPending()) {\n\t\t\t\tconst preEncoder = device.createCommandEncoder();\n\t\t\t\tconst dummyTex = renderer.getTemporaryTexture(width, height);\n\t\t\t\tconst dummyView = dummyTex.createView();\n\t\t\t\trenderer.beginFrame(preEncoder, dummyView, {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t}, width, height, \"clear\").end();\n\t\t\t\tawait drawCompositionTree(ctx, preEncoder, dummyView, dummyTex, width, height, virtualMedia, {\n\t\t\t\t\tframe,\n\t\t\t\t\tcompositionFrame: frame,\n\t\t\t\t\tfps,\n\t\t\t\t\tisHeadless: true,\n\t\t\t\t\trenderId,\n\t\t\t\t\tvirtualMedia,\n\t\t\t\t\tcontainerWidth: width,\n\t\t\t\t\tcontainerHeight: height,\n\t\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t\t});\n\t\t\t\tdevice.queue.submit([preEncoder.finish()]);\n\t\t\t\tawait lutStore.awaitAllPending(device);\n\t\t\t}\n\t\t\tcompositionStateStore.setState(renderId, frame, fps, true);\n\t\t\tconst encoder = device.createCommandEncoder();\n\t\t\tconst targetView = surface.getCurrentTextureView();\n\t\t\tconst targetTexture = surface.getCurrentTexture();\n\t\t\trenderer.beginFrame(encoder, targetView, {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}, width, height, \"clear\").end();\n\t\t\tawait drawCompositionTree(ctx, encoder, targetView, targetTexture, width, height, virtualMedia, {\n\t\t\t\tframe,\n\t\t\t\tcompositionFrame: frame,\n\t\t\t\tfps,\n\t\t\t\tisHeadless: true,\n\t\t\t\trenderId,\n\t\t\t\tvirtualMedia,\n\t\t\t\tcontainerWidth: width,\n\t\t\t\tcontainerHeight: height,\n\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t});\n\t\t\tdevice.queue.submit([encoder.finish()]);\n\t\t\tawait lutStore.awaitAllPending(device);\n\t\t\tif (!lutData) lutData = lutStore.getAnyRawData();\n\t\t\tif (!lutData) throw new Error(\"No LUT data generated during rendering\");\n\t\t\tconst cubeContent = formatLutAsCube(lutData);\n\t\t\treturn Buffer.from(cubeContent, \"utf-8\");\n\t\t} finally {\n\t\t\ttry {\n\t\t\t\tlutSub();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tmediaDecoderCache.clearNode(renderId);\n\t\t\t\tclearAllVideoCache();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tshaderStore.clear(renderId);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tsurface?.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttextureCache.destroy();\n\t\t\t} catch {}\n\t\t\trenderSemaphore.release();\n\t\t\trendererLogger.debug({\n\t\t\t\trenderId,\n\t\t\t\t...renderSemaphore.stats\n\t\t\t}, \"[HeadlessWebGPURenderer] LUT render slot released\");\n\t\t}\n\t}\n\tasync resolveMediaDuration(virtualMedia, fps) {\n\t\tlet maxDurationMs = 0;\n\t\tconst queue = [virtualMedia];\n\t\tconst sources = /* @__PURE__ */ new Set();\n\t\twhile (queue.length > 0) {\n\t\t\tconst current = queue.shift();\n\t\t\tif (current.metadata?.durationMs && current.metadata.durationMs > maxDurationMs) maxDurationMs = current.metadata.durationMs;\n\t\t\tconst op = current.operation;\n\t\t\tif (op) {\n\t\t\t\tif (typeof op.source === \"string\") sources.add(op.source);\n\t\t\t\tif (typeof op.url === \"string\") sources.add(op.url);\n\t\t\t\tif (typeof op.inputHandleId === \"string\") sources.add(op.inputHandleId);\n\t\t\t\tif (Array.isArray(op.layout)) for (const node of op.layout) {\n\t\t\t\t\tif (node.inputHandleId) sources.add(node.inputHandleId);\n\t\t\t\t\tif (node.src) sources.add(node.src);\n\t\t\t\t\tif (typeof node.durationFrames === \"number\") {\n\t\t\t\t\t\tconst durMs = ((typeof node.startFrame === \"number\" ? node.startFrame : 0) + node.durationFrames) / fps * 1e3;\n\t\t\t\t\t\tif (durMs > maxDurationMs) maxDurationMs = durMs;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (current.children) queue.push(...current.children);\n\t\t}\n\t\tfor (const src of sources) try {\n\t\t\tconst sec = await (await inputStore.acquire(src)).computeDuration();\n\t\t\tif (Number.isFinite(sec) && sec > 0) {\n\t\t\t\tconst ms = Math.round(sec * 1e3);\n\t\t\t\tif (ms > maxDurationMs) maxDurationMs = ms;\n\t\t\t}\n\t\t} catch (_) {}\n\t\treturn maxDurationMs > 0 ? maxDurationMs : 1e3;\n\t}\n\tasync renderVideo(virtualMedia, options$1) {\n\t\tawait HeadlessWebGPURenderer.initialize();\n\t\tconst codecOption = options$1?.codec ?? \"h264\";\n\t\tconst isMp3 = codecOption === \"mp3\";\n\t\tconst isWebM = codecOption === \"vp8\" || codecOption === \"vp9\" || codecOption === \"opus\";\n\t\tconst mediaType = getMediaType(virtualMedia);\n\t\tconst isLut = mediaType === \"LUT\" || virtualMedia.operation?.dataType === \"LUT\";\n\t\tconst isAudioOnly = isMp3 || codecOption === \"aac\" || codecOption === \"opus\" || mediaType === \"Audio\";\n\t\tconst fps = virtualMedia.metadata.fps ?? (isAudioOnly || isLut ? 24 : void 0);\n\t\tif (!fps) {\n\t\t\tconst dataType = mediaType ?? virtualMedia.dataType ?? \"Unknown\";\n\t\t\tconst op = virtualMedia.operation?.op ?? virtualMedia.op ?? \"Unknown\";\n\t\t\tthrow new Error(`FPS is missing from virtualMedia metadata (dataType: \"${dataType}\", operation: \"${op}\")`);\n\t\t}\n\t\tconst width = toEvenDimension(virtualMedia.metadata.width ?? (isAudioOnly ? 1280 : 0));\n\t\tconst height = toEvenDimension(virtualMedia.metadata.height ?? (isAudioOnly ? 720 : 0));\n\t\tif (!width || !height) throw new Error(`Invalid dimensions: ${width}x${height}`);\n\t\tlet durationMs = virtualMedia.metadata.durationMs;\n\t\tif (!durationMs || durationMs <= 0) {\n\t\t\tdurationMs = await this.resolveMediaDuration(virtualMedia, fps);\n\t\t\tvirtualMedia.metadata.durationMs = durationMs;\n\t\t}\n\t\tconst totalFrames = Math.max(1, Math.round(durationMs / 1e3 * fps));\n\t\tconst renderId = `vid-${randomUUID()}`;\n\t\tconst qaOptions = options$1?.qa === true ? {} : options$1?.qa ? options$1.qa : void 0;\n\t\tconst inspector = qaOptions ? new FrameInspector(qaOptions) : void 0;\n\t\tlet videoQa;\n\t\tlet audioQa;\n\t\tconst videoCodec = codecOption === \"vp9\" ? \"vp9\" : codecOption === \"vp8\" ? \"vp8\" : \"avc\";\n\t\tconst audioCodec = options$1?.audioCodec ?? (isMp3 ? \"mp3\" : isWebM ? \"opus\" : \"aac\");\n\t\tconst quality = resolveQuality(options$1?.quality);\n\t\trendererLogger.debug({\n\t\t\trenderId,\n\t\t\ttotalFrames,\n\t\t\tfps,\n\t\t\twidth,\n\t\t\theight,\n\t\t\tcodec: codecOption,\n\t\t\t...renderSemaphore.stats\n\t\t}, \"[HeadlessWebGPURenderer] Acquiring slot for video render (inline)\");\n\t\tif (renderSemaphore.stats.active >= renderSemaphore.stats.max) rendererLogger.info({\n\t\t\trenderId,\n\t\t\t...renderSemaphore.stats\n\t\t}, `[HeadlessWebGPURenderer] Waiting for a render slot (${renderSemaphore.stats.active} running, ${renderSemaphore.stats.queued} queued)`);\n\t\tawait renderSemaphore.acquire();\n\t\tconst reporter = new RenderReporter({\n\t\t\trenderId,\n\t\t\ttotalFrames,\n\t\t\tonProgress: options$1?.onProgress\n\t\t});\n\t\tconst seconds = `${(durationMs / 1e3).toFixed(1)}s`;\n\t\treporter.stage(\"prepare\", isAudioOnly ? `Preparing ${seconds} of audio (${audioCodec})` : `Preparing ${totalFrames} frames (${seconds}) at ${width}x${height}, ${fps} fps, ${codecOption}`, {\n\t\t\twidth,\n\t\t\theight,\n\t\t\tfps,\n\t\t\tdurationMs,\n\t\t\tcodec: codecOption\n\t\t});\n\t\tlet lastCpuUsage = process.cpuUsage();\n\t\tlet lastCpuTime = process.hrtime.bigint();\n\t\tconst getCpuUsage = () => {\n\t\t\tconst curCpuUsage = process.cpuUsage();\n\t\t\tconst curCpuTime = process.hrtime.bigint();\n\t\t\tconst userDiff = curCpuUsage.user - lastCpuUsage.user;\n\t\t\tconst sysDiff = curCpuUsage.system - lastCpuUsage.system;\n\t\t\tconst timeDiff = Number(curCpuTime - lastCpuTime) / 1e3;\n\t\t\tlastCpuUsage = curCpuUsage;\n\t\t\tlastCpuTime = curCpuTime;\n\t\t\tif (timeDiff === 0) return \"0.0%\";\n\t\t\tconst cpus = os.cpus().length || 1;\n\t\t\treturn `${((userDiff + sysDiff) / timeDiff * 100 / cpus).toFixed(1)}%`;\n\t\t};\n\t\tconst getRamUsage = () => {\n\t\t\tconst mem = process.memoryUsage();\n\t\t\tconst freeMem = os.freemem();\n\t\t\tconst totalMem = os.totalmem();\n\t\t\tconst usedMem = totalMem - freeMem;\n\t\t\tconst heapUsedMb = Math.round(mem.heapUsed / 1024 / 1024);\n\t\t\tconst heapTotalMb = Math.round(mem.heapTotal / 1024 / 1024);\n\t\t\treturn `Process: ${Math.round(mem.rss / 1024 / 1024)}MB RSS (${heapUsedMb}MB/${heapTotalMb}MB Heap), System: ${Math.round(usedMem / 1024 / 1024)}MB/${Math.round(totalMem / 1024 / 1024)}MB`;\n\t\t};\n\t\tlet statsInterval;\n\t\tif (process.env.NODE_ENV === \"production\") statsInterval = setInterval(() => {\n\t\t\trefreshVramUsage();\n\t\t\trendererLogger.info({\n\t\t\t\trenderId,\n\t\t\t\tcpu: getCpuUsage(),\n\t\t\t\tram: getRamUsage(),\n\t\t\t\tvram: getVramUsage(),\n\t\t\t\trenderQueue: renderSemaphore.stats\n\t\t\t}, \"[HeadlessWebGPURenderer] Performance Stats\");\n\t\t}, 5e3);\n\t\tconst tempDir = os.tmpdir();\n\t\tconst extension = isMp3 ? \"mp3\" : isWebM ? \"webm\" : \"mp4\";\n\t\tconst tempFilePath = path.join(tempDir, `render-${renderId}.${extension}`);\n\t\tconst tempGifPath = path.join(tempDir, `render-${renderId}.gif`);\n\t\tconst target = new FilePathTarget(tempFilePath);\n\t\tconst output = new Output({\n\t\t\tformat: isMp3 ? new Mp3OutputFormat() : isWebM ? new WebMOutputFormat() : new Mp4OutputFormat(),\n\t\t\ttarget\n\t\t});\n\t\tlet videoSource;\n\t\tif (!isAudioOnly) {\n\t\t\tvideoSource = new VideoSampleSource({\n\t\t\t\tcodec: videoCodec,\n\t\t\t\tbitrate: quality,\n\t\t\t\tlatencyMode: \"realtime\",\n\t\t\t\thardwareAcceleration: \"prefer-hardware\"\n\t\t\t});\n\t\t\toutput.addVideoTrack(videoSource);\n\t\t}\n\t\tconst audioSource = new AudioSampleSource({\n\t\t\tcodec: audioCodec,\n\t\t\tbitrate: quality\n\t\t});\n\t\toutput.addAudioTrack(audioSource);\n\t\tlet outputStarted = false;\n\t\tlet outputFinalized = false;\n\t\tlet surface;\n\t\tlet renderer;\n\t\tlet pipeline;\n\t\ttry {\n\t\t\tconst device = await ensureDevice();\n\t\t\tawait output.start();\n\t\t\toutputStarted = true;\n\t\t\tawait preloadFonts(virtualMedia, device);\n\t\t\tif (!isAudioOnly && videoSource) {\n\t\t\t\tsurface = new NodeSurfaceProvider(device, width, height);\n\t\t\t\trenderer = getRenderer2D(device, surface.colorFormat);\n\t\t\t\tpipeline = new ZeroCopyWebCodecsPipeline(device, {\n\t\t\t\t\twidth,\n\t\t\t\t\theight,\n\t\t\t\t\tfps,\n\t\t\t\t\tvideoSource,\n\t\t\t\t\tringCapacity: resolveRingCapacity(options$1?.ringCapacity),\n\t\t\t\t\tonFrame: inspector ? (rgba) => inspector.inspect(rgba, width, height) : void 0\n\t\t\t\t});\n\t\t\t\tconst ctx = surface && renderer ? {\n\t\t\t\t\tdevice,\n\t\t\t\t\trenderer,\n\t\t\t\t\tsurface\n\t\t\t\t} : null;\n\t\t\t\tconst prePass = async (frame) => {\n\t\t\t\t\tif (!ctx || !renderer) return;\n\t\t\t\t\tconst preEncoder = device.createCommandEncoder();\n\t\t\t\t\tconst dummyTex = renderer.getTemporaryTexture(width, height);\n\t\t\t\t\tconst dummyView = dummyTex.createView();\n\t\t\t\t\trenderer.beginFrame(preEncoder, dummyView, {\n\t\t\t\t\t\tr: 0,\n\t\t\t\t\t\tg: 0,\n\t\t\t\t\t\tb: 0,\n\t\t\t\t\t\ta: 0\n\t\t\t\t\t}, width, height, \"clear\").end();\n\t\t\t\t\tawait drawCompositionTree(ctx, preEncoder, dummyView, dummyTex, width, height, virtualMedia, {\n\t\t\t\t\t\tframe,\n\t\t\t\t\t\tcompositionFrame: frame,\n\t\t\t\t\t\tfps,\n\t\t\t\t\t\tisHeadless: true,\n\t\t\t\t\t\trenderId,\n\t\t\t\t\t\tvirtualMedia,\n\t\t\t\t\t\tcontainerWidth: width,\n\t\t\t\t\t\tcontainerHeight: height,\n\t\t\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t\t\t});\n\t\t\t\t\tdevice.queue.submit([preEncoder.finish()]);\n\t\t\t\t\tawait lutStore.awaitAllPending(device);\n\t\t\t\t};\n\t\t\t\tawait prePass(0);\n\t\t\t\treporter.stage(\"render\", `Rendering ${totalFrames} frames`);\n\t\t\t\tfor (let i = 0; i < totalFrames; i++) {\n\t\t\t\t\toptions$1?.signal?.throwIfAborted();\n\t\t\t\t\tif (ctx && surface && renderer && pipeline) {\n\t\t\t\t\t\tif (i > 0 && (lutStore.hasPending(device) || SlugFontCache.hasPending())) {\n\t\t\t\t\t\t\tupdateClockSignals(i, fps, durationMs);\n\t\t\t\t\t\t\tawait prePass(i);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcompositionStateStore.setState(renderId, i, fps, true);\n\t\t\t\t\t\tupdateClockSignals(i, fps, durationMs);\n\t\t\t\t\t\tmediaDecoderCache.tick();\n\t\t\t\t\t\tconst encoder = device.createCommandEncoder();\n\t\t\t\t\t\tconst targetView = surface.getCurrentTextureView();\n\t\t\t\t\t\tconst targetTexture = surface.getCurrentTexture();\n\t\t\t\t\t\trenderer.beginFrame(encoder, targetView, {\n\t\t\t\t\t\t\tr: 0,\n\t\t\t\t\t\t\tg: 0,\n\t\t\t\t\t\t\tb: 0,\n\t\t\t\t\t\t\ta: 0\n\t\t\t\t\t\t}, width, height, \"clear\").end();\n\t\t\t\t\t\tawait drawCompositionTree(ctx, encoder, targetView, targetTexture, width, height, virtualMedia, {\n\t\t\t\t\t\t\tframe: i,\n\t\t\t\t\t\t\tcompositionFrame: i,\n\t\t\t\t\t\t\tfps,\n\t\t\t\t\t\t\tisHeadless: true,\n\t\t\t\t\t\t\trenderId,\n\t\t\t\t\t\t\tvirtualMedia,\n\t\t\t\t\t\t\tcontainerWidth: width,\n\t\t\t\t\t\t\tcontainerHeight: height,\n\t\t\t\t\t\t\tisVideoMode: virtualMedia.operation?.dataType === \"Video\"\n\t\t\t\t\t\t});\n\t\t\t\t\t\tawait pipeline.enqueueFrame(i, targetTexture, encoder);\n\t\t\t\t\t\tif (i + 1 < totalFrames) reporter.frameDone(i + 1);\n\t\t\t\t\t} else throw new Error(\"Invalid render context state\");\n\t\t\t\t}\n\t\t\t\tif (pipeline) {\n\t\t\t\t\tawait pipeline.drain();\n\t\t\t\t\treporter.frameDone(totalFrames);\n\t\t\t\t\tconst pipelineStats = pipeline.getStats();\n\t\t\t\t\tif (inspector && qaOptions) videoQa = inspector.stats(totalFrames, pipelineStats.totalFramesEncoded, fps, width, height, qaOptions);\n\t\t\t\t\trendererLogger.debug({\n\t\t\t\t\t\trenderId,\n\t\t\t\t\t\ttotalFrames,\n\t\t\t\t\t\t...pipelineStats\n\t\t\t\t\t}, `[HeadlessWebGPURenderer] All frames rendered and encoded (avg cycle: ${pipelineStats.averageCycleTimeMs.toFixed(2)}ms, throughput: ${pipelineStats.throughputFps.toFixed(1)} fps)`);\n\t\t\t\t}\n\t\t\t}\n\t\t\toptions$1?.signal?.throwIfAborted();\n\t\t\treporter.stage(\"audio\", \"Mixing audio\");\n\t\t\tconst { channels, sampleRate } = await mixAudioTracks(virtualMedia, fps, 48e3, device, renderId, { onProgress: ({ done, total, source }) => reporter.update(total > 0 ? `${done}/${total} clips${source ? `: ${source}` : \"\"}` : \"no audio clips\", total > 0 ? done / total : void 0) });\n\t\t\tconst numChannels = channels.length;\n\t\t\tif (numChannels === 0) throw new Error(\"mixAudioTracks returned no channels\");\n\t\t\tif (qaOptions) audioQa = analyzeAudio(channels, sampleRate, qaOptions);\n\t\t\tconst totalSamples = channels[0].length;\n\t\t\tconst chunkSize = Math.round(.1 * sampleRate);\n\t\t\treporter.stage(\"audio-encode\", `Encoding ${(totalSamples / sampleRate).toFixed(1)}s of audio (${audioCodec})`);\n\t\t\tfor (let offset = 0; offset < totalSamples; offset += chunkSize) {\n\t\t\t\tconst currentChunk = Math.min(chunkSize, totalSamples - offset);\n\t\t\t\tconst interleaved = new Float32Array(currentChunk * numChannels);\n\t\t\t\tfor (let i = 0; i < currentChunk; i++) for (let ch = 0; ch < numChannels; ch++) interleaved[i * numChannels + ch] = channels[ch]?.[offset + i] ?? 0;\n\t\t\t\tconst sample = new AudioSample({\n\t\t\t\t\tdata: interleaved,\n\t\t\t\t\tformat: \"f32\",\n\t\t\t\t\tnumberOfChannels: numChannels,\n\t\t\t\t\tsampleRate,\n\t\t\t\t\ttimestamp: offset / sampleRate\n\t\t\t\t});\n\t\t\t\ttry {\n\t\t\t\t\tawait audioSource.add(sample);\n\t\t\t\t} finally {\n\t\t\t\t\tsample.close();\n\t\t\t\t}\n\t\t\t\tconst written = offset + currentChunk;\n\t\t\t\treporter.update(`${(written / sampleRate).toFixed(1)}s/${(totalSamples / sampleRate).toFixed(1)}s`, written / totalSamples);\n\t\t\t}\n\t\t\toptions$1?.signal?.throwIfAborted();\n\t\t\treporter.stage(\"mux\", `Muxing ${extension}`);\n\t\t\tawait output.finalize();\n\t\t\toutputFinalized = true;\n\t\t\tconst qa = qaOptions ? buildQaReport({\n\t\t\t\tvideo: videoQa,\n\t\t\t\taudio: audioQa,\n\t\t\t\tdiagnostics: takeRenderDiagnostics(renderId),\n\t\t\t\toptions: qaOptions\n\t\t\t}) : void 0;\n\t\t\tconst cleanup = async () => {\n\t\t\t\ttry {\n\t\t\t\t\tawait fs$1.unlink(tempFilePath).catch(() => {});\n\t\t\t\t\tif (codecOption === \"gif\") await fs$1.unlink(tempGifPath).catch(() => {});\n\t\t\t\t} catch {}\n\t\t\t};\n\t\t\tif (codecOption === \"gif\") {\n\t\t\t\treporter.stage(\"convert\", \"Converting to GIF (ffmpeg)\");\n\t\t\t\tawait convertMp4ToGif(tempFilePath, tempGifPath);\n\t\t\t\treporter.finish({ bytes: await fileSize(tempGifPath) });\n\t\t\t\treturn {\n\t\t\t\t\tfilePath: tempGifPath,\n\t\t\t\t\tcleanup,\n\t\t\t\t\t...qa && { qa }\n\t\t\t\t};\n\t\t\t}\n\t\t\treporter.finish({ bytes: await fileSize(tempFilePath) });\n\t\t\treturn {\n\t\t\t\tfilePath: tempFilePath,\n\t\t\t\tcleanup,\n\t\t\t\t...qa && { qa }\n\t\t\t};\n\t\t} catch (error) {\n\t\t\treporter.fail(error, options$1?.signal?.aborted === true);\n\t\t\tif (outputStarted && !outputFinalized) try {\n\t\t\t\tawait output.finalize();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tawait fs$1.unlink(tempFilePath).catch(() => {});\n\t\t\t\tif (codecOption === \"gif\") await fs$1.unlink(tempGifPath).catch(() => {});\n\t\t\t} catch {}\n\t\t\tthrow error;\n\t\t} finally {\n\t\t\treporter.dispose();\n\t\t\tif (statsInterval) clearInterval(statsInterval);\n\t\t\ttry {\n\t\t\t\trenderer?.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tpipeline?.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tsurface?.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tmediaDecoderCache.clearNode(renderId);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tclearAllVideoCache();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\ttextureCache.destroy();\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tWebGPUAudioProcessor.clearCache(renderId);\n\t\t\t} catch {}\n\t\t\ttry {\n\t\t\t\tshaderStore.clear(renderId);\n\t\t\t} catch {}\n\t\t\ttakeRenderDiagnostics(renderId);\n\t\t\trenderSemaphore.release();\n\t\t\trendererLogger.debug({\n\t\t\t\trenderId,\n\t\t\t\t...renderSemaphore.stats\n\t\t\t}, \"[HeadlessWebGPURenderer] Video render slot released\");\n\t\t}\n\t}\n};\nconst HeadlessMediaRenderer = HeadlessWebGPURenderer;\n\n//#endregion\nexport { preloadFonts as _, FrameInspector as a, textLogStream as b, formatQaReport as c, findNodesDir as d, NODE_KINDS as f, DmaStagingRing as g, parseNodeManifest as h, ZeroCopyWebCodecsPipeline as i, integratedLoudness as l, loadNodeManifests as m, HeadlessWebGPURenderer as n, analyzeAudio as o, NodeManifestError as p, renderSemaphore as r, buildQaReport as s, HeadlessMediaRenderer as t, discoverAndRegisterNodeRenderers as u, rendererLogger as v, resolveLogFormat as y };\n//# sourceMappingURL=headless-webgpu-renderer-BIYZ_h9V.mjs.map","import { _ as preloadFonts, a as FrameInspector, b as textLogStream, c as formatQaReport, d as findNodesDir, f as NODE_KINDS, g as DmaStagingRing, h as parseNodeManifest, i as ZeroCopyWebCodecsPipeline, l as integratedLoudness, m as loadNodeManifests, n as HeadlessWebGPURenderer, o as analyzeAudio, p as NodeManifestError, r as renderSemaphore, s as buildQaReport, t as HeadlessMediaRenderer, u as discoverAndRegisterNodeRenderers, v as rendererLogger, y as resolveLogFormat } from \"./headless-webgpu-renderer-BIYZ_h9V.mjs\";\nimport { SlugFontCache, clearAllVideoCache, clearHeadlessFonts, inputStore, lutStore, mediaDecoderCache, textureCache } from \"@framefields/webgpu-renderers\";\n\n//#region src/job-reset.ts\n/**\n* Drops every cache keyed by a file path or URL: media inputs and decoders,\n* textures, LUTs, fonts and downloaded font files. A long-lived worker calls this between jobs,\n* because the next checkout may hold different bytes at the same path. The\n* GPU device and compiled pipelines stay warm.\n*/\nfunction resetRenderCaches() {\n\tclearAllVideoCache();\n\tmediaDecoderCache.destroy();\n\ttextureCache.destroy();\n\tinputStore.clear();\n\tlutStore.destroy();\n\tSlugFontCache.destroy();\n\tclearHeadlessFonts();\n}\n\n//#endregion\nexport { DmaStagingRing, FrameInspector, HeadlessMediaRenderer, HeadlessWebGPURenderer, NODE_KINDS, NodeManifestError, ZeroCopyWebCodecsPipeline, analyzeAudio, buildQaReport, discoverAndRegisterNodeRenderers, findNodesDir, formatQaReport, integratedLoudness, loadNodeManifests, parseNodeManifest, preloadFonts, renderSemaphore, rendererLogger, resetRenderCaches, resolveLogFormat, textLogStream };\n//# sourceMappingURL=index.mjs.map","import fs from \"node:fs/promises\";\nimport type { VirtualMediaData } from \"@framefields/core\";\nimport { Canvas, loadImage } from \"skia-canvas\";\nimport { HeadlessMediaRenderer } from \"./index.js\";\n\nexport interface FrameSamplePoint {\n\tframe: number;\n\ttimeMs: number;\n}\n\nexport interface FrameGridOptions {\n\t/**\n\t * Start frame index for sampling (inclusive). Defaults to 0.\n\t */\n\tstartFrame?: number;\n\n\t/**\n\t * End frame index for sampling (inclusive). Defaults to startFrame + 30.\n\t */\n\tendFrame?: number;\n\n\t/**\n\t * Step interval between sampled frames. Must be >= 1. Defaults to 5.\n\t */\n\tstepFrames?: number;\n\n\t/**\n\t * Explicit list of frame indices to sample. Overrides startFrame/endFrame/stepFrames.\n\t */\n\tframes?: number[];\n\n\t/**\n\t * Start time in milliseconds (alternative to startFrame).\n\t */\n\tstartMs?: number;\n\n\t/**\n\t * End time in milliseconds (alternative to endFrame).\n\t */\n\tendMs?: number;\n\n\t/**\n\t * Step interval in milliseconds (alternative to stepFrames).\n\t */\n\tstepMs?: number;\n\n\t/**\n\t * Explicit list of timestamps in milliseconds to sample.\n\t */\n\ttimesMs?: number[];\n\n\t/**\n\t * Frames per second override. If omitted, reads from media/composition metadata or defaults to 24.\n\t */\n\tfps?: number;\n\n\t/**\n\t * Number of columns in the grid. If omitted, calculated automatically to preserve balance.\n\t */\n\tcolumns?: number;\n\n\t/**\n\t * Width in pixels for each individual thumbnail cell.\n\t * Clamped to [120, 960]. Defaults to 320.\n\t */\n\tcellWidth?: number;\n\n\t/**\n\t * Explicit height for each cell. If omitted, computed from aspect ratio.\n\t */\n\tcellHeight?: number;\n\n\t/**\n\t * Gap in pixels between cells. Defaults to 12.\n\t */\n\tgap?: number;\n\n\t/**\n\t * Outer padding in pixels around the grid. Defaults to 16.\n\t */\n\tpadding?: number;\n\n\t/**\n\t * Background color for the grid canvas. Defaults to \"#090a0f\".\n\t */\n\tbackgroundColor?: string;\n\n\t/**\n\t * Whether to render frame number & millisecond badges on each cell. Defaults to true.\n\t */\n\tshowLabels?: boolean;\n\n\t/**\n\t * Whether to render the metadata header banner at the top of the grid. Defaults to true.\n\t */\n\tshowHeader?: boolean;\n\n\t/**\n\t * Custom header title text.\n\t */\n\theaderText?: string;\n\n\t/**\n\t * Optional file path to write the generated grid image directly to disk.\n\t */\n\toutputPath?: string;\n\n\t/**\n\t * Safety limit for total sampled frames to prevent memory exhaustion or oversized images.\n\t * Defaults to 64. Hard maximum is 120.\n\t */\n\tmaxFrames?: number;\n\n\t/**\n\t * Maximum allowed width for the generated image canvas. Defaults to 4096.\n\t */\n\tmaxGridWidth?: number;\n\n\t/**\n\t * Maximum allowed height for the generated image canvas. Defaults to 4096.\n\t */\n\tmaxGridHeight?: number;\n\n\t/**\n\t * Optional shared HeadlessMediaRenderer instance.\n\t */\n\trenderer?: HeadlessMediaRenderer;\n}\n\n/**\n * Resolves and validates the list of sample points from the provided options.\n */\nexport function resolveSamplePoints(\n\toptions: FrameGridOptions,\n\tdefaultFps = 24,\n\tdurationMs?: number,\n): { samples: FrameSamplePoint[]; fps: number } {\n\tconst fps = options.fps ?? defaultFps;\n\tif (fps <= 0) {\n\t\tthrow new Error(`[FrameGrid] Invalid fps: ${fps}. Must be > 0.`);\n\t}\n\n\tconst samples: FrameSamplePoint[] = [];\n\n\tif (Array.isArray(options.frames) && options.frames.length > 0) {\n\t\tfor (const f of options.frames) {\n\t\t\tif (typeof f !== \"number\" || f < 0 || !Number.isFinite(f)) {\n\t\t\t\tthrow new Error(`[FrameGrid] Invalid frame index in frames list: ${f}`);\n\t\t\t}\n\t\t\tsamples.push({\n\t\t\t\tframe: Math.round(f),\n\t\t\t\ttimeMs: Math.round((f / fps) * 1000),\n\t\t\t});\n\t\t}\n\t} else if (Array.isArray(options.timesMs) && options.timesMs.length > 0) {\n\t\tfor (const ms of options.timesMs) {\n\t\t\tif (typeof ms !== \"number\" || ms < 0 || !Number.isFinite(ms)) {\n\t\t\t\tthrow new Error(`[FrameGrid] Invalid timestamp in timesMs list: ${ms}`);\n\t\t\t}\n\t\t\tsamples.push({\n\t\t\t\tframe: Math.round((ms / 1000) * fps),\n\t\t\t\ttimeMs: Math.round(ms),\n\t\t\t});\n\t\t}\n\t} else if (\n\t\toptions.startMs !== undefined ||\n\t\toptions.endMs !== undefined ||\n\t\toptions.stepMs !== undefined\n\t) {\n\t\tconst startMs = options.startMs ?? 0;\n\t\tconst endMs = options.endMs ?? durationMs ?? startMs + 1000;\n\t\tconst stepMs = options.stepMs ?? Math.round((5 / fps) * 1000);\n\n\t\tif (startMs < 0 || endMs < startMs) {\n\t\t\tthrow new Error(\n\t\t\t\t`[FrameGrid] Invalid millisecond range: startMs=${startMs}, endMs=${endMs}. startMs must be <= endMs.`,\n\t\t\t);\n\t\t}\n\t\tif (stepMs <= 0) {\n\t\t\tthrow new Error(`[FrameGrid] Invalid stepMs: ${stepMs}. Must be > 0.`);\n\t\t}\n\n\t\tfor (let ms = startMs; ms <= endMs; ms += stepMs) {\n\t\t\tsamples.push({\n\t\t\t\tframe: Math.round((ms / 1000) * fps),\n\t\t\t\ttimeMs: Math.round(ms),\n\t\t\t});\n\t\t}\n\t} else {\n\t\tconst startFrame = options.startFrame ?? 0;\n\t\tconst endFrame =\n\t\t\toptions.endFrame ??\n\t\t\t(durationMs\n\t\t\t\t? Math.min(startFrame + 30, Math.floor((durationMs / 1000) * fps))\n\t\t\t\t: startFrame + 30);\n\t\tconst stepFrames = options.stepFrames ?? 5;\n\n\t\tif (startFrame < 0 || endFrame < startFrame) {\n\t\t\tthrow new Error(\n\t\t\t\t`[FrameGrid] Invalid frame range: startFrame=${startFrame}, endFrame=${endFrame}. startFrame must be <= endFrame.`,\n\t\t\t);\n\t\t}\n\t\tif (stepFrames <= 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`[FrameGrid] Invalid stepFrames: ${stepFrames}. Must be > 0.`,\n\t\t\t);\n\t\t}\n\n\t\tfor (let f = startFrame; f <= endFrame; f += stepFrames) {\n\t\t\tsamples.push({\n\t\t\t\tframe: Math.round(f),\n\t\t\t\ttimeMs: Math.round((f / fps) * 1000),\n\t\t\t});\n\t\t}\n\t}\n\n\tconst maxFramesLimit = Math.min(options.maxFrames ?? 64, 120);\n\tif (samples.length > maxFramesLimit) {\n\t\tthrow new Error(\n\t\t\t`[FrameGrid] Requested ${samples.length} frames exceeds the safety threshold of ${maxFramesLimit}. ` +\n\t\t\t\t`Increase stepFrames/stepMs or narrow the start/end range to prevent oversized images.`,\n\t\t);\n\t}\n\n\tif (samples.length === 0) {\n\t\tthrow new Error(\"[FrameGrid] Zero frames were resolved for sampling.\");\n\t}\n\n\treturn { samples, fps };\n}\n\n/**\n * Computes grid layout dimensions, ensuring resulting canvas does not exceed size limits.\n */\nexport function computeGridLayout(\n\tnumSamples: number,\n\taspectRatio: number,\n\toptions: FrameGridOptions,\n): {\n\tcolumns: number;\n\trows: number;\n\tcellWidth: number;\n\tcellHeight: number;\n\ttotalWidth: number;\n\ttotalHeight: number;\n\theaderHeight: number;\n\tgap: number;\n\tpadding: number;\n} {\n\tconst gap = options.gap ?? 12;\n\tconst padding = options.padding ?? 16;\n\tconst showHeader = options.showHeader ?? true;\n\tconst headerHeight = showHeader ? 54 : 0;\n\tconst maxGridWidth = options.maxGridWidth ?? 4096;\n\tconst maxGridHeight = options.maxGridHeight ?? 4096;\n\n\tlet columns = options.columns;\n\tif (!columns || columns <= 0) {\n\t\tif (numSamples <= 4) columns = numSamples;\n\t\telse if (numSamples <= 9) columns = 3;\n\t\telse if (numSamples <= 16) columns = 4;\n\t\telse if (numSamples <= 25) columns = 5;\n\t\telse columns = 6;\n\t}\n\tcolumns = Math.min(columns, numSamples);\n\tconst rows = Math.ceil(numSamples / columns);\n\n\tlet cellWidth = Math.max(120, Math.min(options.cellWidth ?? 320, 960));\n\tlet cellHeight =\n\t\toptions.cellHeight ??\n\t\tMath.round(cellWidth / (aspectRatio > 0 ? aspectRatio : 16 / 9));\n\n\tlet totalWidth = columns * cellWidth + (columns - 1) * gap + padding * 2;\n\tlet totalHeight =\n\t\trows * cellHeight + (rows - 1) * gap + padding * 2 + headerHeight;\n\n\t// Downscale thumbnail size if the unconstrained canvas exceeds max dimensions\n\tif (totalWidth > maxGridWidth || totalHeight > maxGridHeight) {\n\t\tconst scaleFactor = Math.min(\n\t\t\t(maxGridWidth - (columns - 1) * gap - padding * 2) /\n\t\t\t\t(columns * cellWidth),\n\t\t\t(maxGridHeight - (rows - 1) * gap - padding * 2 - headerHeight) /\n\t\t\t\t(rows * cellHeight),\n\t\t);\n\n\t\tif (scaleFactor < 0.25) {\n\t\t\tthrow new Error(\n\t\t\t\t`[FrameGrid] Cannot fit ${numSamples} cells (${columns}x${rows}) into max dimensions ` +\n\t\t\t\t\t`[${maxGridWidth}x${maxGridHeight}]. Reduce cell count or decrease cellWidth.`,\n\t\t\t);\n\t\t}\n\n\t\tcellWidth = Math.max(100, Math.floor(cellWidth * scaleFactor));\n\t\tcellHeight = Math.round(\n\t\t\tcellWidth / (aspectRatio > 0 ? aspectRatio : 16 / 9),\n\t\t);\n\n\t\ttotalWidth = columns * cellWidth + (columns - 1) * gap + padding * 2;\n\t\ttotalHeight =\n\t\t\trows * cellHeight + (rows - 1) * gap + padding * 2 + headerHeight;\n\t}\n\n\treturn {\n\t\tcolumns,\n\t\trows,\n\t\tcellWidth,\n\t\tcellHeight,\n\t\ttotalWidth,\n\t\ttotalHeight,\n\t\theaderHeight,\n\t\tgap,\n\t\tpadding,\n\t};\n}\n\nexport type FrameGridRenderable = {\n\ttoVirtualMedia(): VirtualMediaData;\n\trenderFrame(options: {\n\t\tframe?: number;\n\t\tatMs?: number;\n\t\tfps?: number;\n\t\trenderer?: HeadlessMediaRenderer;\n\t}): Promise<Buffer>;\n\tfps?: number;\n\tdurationMs?: number;\n\twidth?: number;\n\theight?: number;\n};\n\n/**\n * Renders a sequence of frames from a Composition or Media pipeline into a unified image grid (contact sheet).\n * Ideal for visual inspection of kinetic motion, transitions, easing, and layout stability.\n */\nexport async function renderFrameGrid(\n\ttarget: FrameGridRenderable,\n\toptions: FrameGridOptions = {},\n): Promise<Buffer> {\n\tconst defaultFps = target.fps ?? 24;\n\tconst durationMs = target.durationMs;\n\tconst { samples, fps } = resolveSamplePoints(options, defaultFps, durationMs);\n\n\tconst compWidth = target.width ?? 1920;\n\tconst compHeight = target.height ?? 1080;\n\tconst aspectRatio =\n\t\tcompWidth > 0 && compHeight > 0 ? compWidth / compHeight : 16 / 9;\n\n\tconst layout = computeGridLayout(samples.length, aspectRatio, options);\n\tconst renderer = options.renderer ?? new HeadlessMediaRenderer();\n\n\t// Render each frame sequentially to manage GPU resources cleanly\n\tconst frameBuffers: Buffer[] = [];\n\tfor (const sample of samples) {\n\t\tconst buf = await target.renderFrame({\n\t\t\tframe: sample.frame,\n\t\t\tatMs: sample.timeMs,\n\t\t\tfps,\n\t\t\trenderer,\n\t\t});\n\t\tframeBuffers.push(buf);\n\t}\n\n\t// Composite into a single grid canvas using skia-canvas\n\tconst canvas = new Canvas(layout.totalWidth, layout.totalHeight);\n\tconst ctx = canvas.getContext(\"2d\");\n\n\t// Fill background\n\tctx.fillStyle = options.backgroundColor ?? \"#090a0f\";\n\tctx.fillRect(0, 0, layout.totalWidth, layout.totalHeight);\n\n\t// Header banner\n\tif (options.showHeader !== false && layout.headerHeight > 0) {\n\t\tconst title =\n\t\t\toptions.headerText ??\n\t\t\t`FrameGrid Conformance Review | Frames ${samples[0].frame}–${samples[samples.length - 1].frame} (Count: ${samples.length})`;\n\t\tconst subtitle = `${compWidth}×${compHeight} @ ${fps} FPS | Cell: ${layout.cellWidth}×${layout.cellHeight}px | Step: ${\n\t\t\toptions.stepFrames\n\t\t\t\t? `${options.stepFrames}f`\n\t\t\t\t: options.stepMs\n\t\t\t\t\t? `${options.stepMs}ms`\n\t\t\t\t\t: \"Custom\"\n\t\t}`;\n\n\t\tctx.fillStyle = \"#f8fafc\";\n\t\tctx.font = \"bold 15px sans-serif\";\n\t\tctx.fillText(title, layout.padding, layout.padding + 18);\n\n\t\tctx.fillStyle = \"#94a3b8\";\n\t\tctx.font = \"12px sans-serif\";\n\t\tctx.fillText(subtitle, layout.padding, layout.padding + 36);\n\n\t\t// Subtle divider line\n\t\tctx.strokeStyle = \"#1e2433\";\n\t\tctx.lineWidth = 1;\n\t\tctx.beginPath();\n\t\tctx.moveTo(layout.padding, layout.padding + 46);\n\t\tctx.lineTo(layout.totalWidth - layout.padding, layout.padding + 46);\n\t\tctx.stroke();\n\t}\n\n\tconst showLabels = options.showLabels ?? true;\n\n\t// Draw each sampled cell\n\tfor (let i = 0; i < samples.length; i++) {\n\t\tconst sample = samples[i];\n\t\tconst col = i % layout.columns;\n\t\tconst row = Math.floor(i / layout.columns);\n\n\t\tconst x = layout.padding + col * (layout.cellWidth + layout.gap);\n\t\tconst y =\n\t\t\tlayout.padding +\n\t\t\tlayout.headerHeight +\n\t\t\trow * (layout.cellHeight + layout.gap);\n\n\t\tconst img = await loadImage(frameBuffers[i]);\n\t\tctx.drawImage(img, x, y, layout.cellWidth, layout.cellHeight);\n\n\t\t// Subtle cell border\n\t\tctx.strokeStyle = \"#262b3d\";\n\t\tctx.lineWidth = 1;\n\t\tctx.strokeRect(x, y, layout.cellWidth, layout.cellHeight);\n\n\t\t// Sleek metadata pill badge\n\t\tif (showLabels) {\n\t\t\tconst label = `F:${sample.frame} • ${sample.timeMs}ms`;\n\n\t\t\tctx.font = \"bold 11px sans-serif\";\n\t\t\tconst textWidth = ctx.measureText(label).width;\n\t\t\tconst badgeW = textWidth + 14;\n\t\t\tconst badgeH = 20;\n\t\t\tconst badgeX = x + 6;\n\t\t\tconst badgeY = y + 6;\n\n\t\t\t// Badge backdrop\n\t\t\tctx.fillStyle = \"#090a0fee\";\n\t\t\tctx.beginPath();\n\t\t\tctx.roundRect(badgeX, badgeY, badgeW, badgeH, 4);\n\t\t\tctx.fill();\n\n\t\t\t// Badge border\n\t\t\tctx.strokeStyle = \"#6366f155\";\n\t\t\tctx.lineWidth = 1;\n\t\t\tctx.stroke();\n\n\t\t\t// Badge text\n\t\t\tctx.fillStyle = \"#e2e8f0\";\n\t\t\tctx.fillText(label, badgeX + 7, badgeY + 14);\n\t\t}\n\t}\n\n\tconst gridBuffer = await canvas.toBuffer(\"png\");\n\n\tif (options.outputPath) {\n\t\tawait fs.writeFile(options.outputPath, gridBuffer);\n\t}\n\n\treturn gridBuffer;\n}\n"],"mappings":"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"}
@@ -1,6 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderers-CP8CFWDs-CZJ7NRsl.mjs";
4
- import "./renderer-B7fX0C62.mjs";
5
-
6
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-BnpMAub0.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { n as renderers_default, t as WebGPURenderer } from "./renderer-lP23pU1s.mjs";
4
-
5
- export { WebGPURenderer, renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-CdJoOfQw.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-CPtyQrJI.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-YEDoDnsE.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-aT6MUYPr.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-DqIrYB0P.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { n as renderers_default, t as WebGPURenderer } from "./renderer-Cw7R1U43.mjs";
4
-
5
- export { WebGPURenderer, renderers_default as default };
@@ -1 +0,0 @@
1
- {"version":3,"file":"renderer-WTvo3wo9.d.mts","names":["MediaOperation","NodeInputConnection","NodeOperation","SignalData","VirtualMediaData","isSignal","resolveBoolean","resolveNumber","resolveParam","resolveString","RenderContextValue","WebGPUNodeRendererArgs","WebGPUNodeRenderer","Parameters","FULLSCREEN_QUAD_WGSL","PREMULTIPLIED_BLEND","GPUBlendState","STRAIGHT_ALPHA_BLEND","FragmentBinding","GPUBindGroupLayoutEntry","Omit","fragmentBindGroupLayout","GPUDevice","GPUBindGroupLayout","texturesLayout","perDevice","T","FullscreenPipelineOptions","GPUShaderModule","GPUPipelineLayout","GPUTextureFormat","createFullscreenPipeline","GPURenderPipeline","DrawChildToTextureOptions","NodeRenderProps","Partial","GPUTexture","drawChildToTexture","GPUTextureView","Promise","beginTargetPass","GPURenderPassEncoder","drawTextureToTarget","signalTiming","NodeSignalData","SignalTextureContext","signalTextureView","drawFullscreenPass","GPUCommandEncoder","GPUBindGroup","Point2D","solveHomography","GPUCommandEncoder$1","globalThis","GPURenderPassEncoder$1","GPUTextureView$1","GPUTexture$1","TOperation","Record","EffectReach","WebGPUNodeRenderFn","AudioProcessorContext","AudioProcessor","Float32Array","resolveFrameNumber","unwrapFrameParam","NodeOperationInputs","HandleParam","SD","resolveHandleParam","resolveSignalField","isHandleConnected","NodeRendererPlugin","defineRenderer","Readonly","WebGPURegistry","webgpuRegistry","registerWebGPURenderer","effectReach","TextureSourceOp","AudioProcessorRegistry","audioRegistry","$","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","U","V","W","X","Y","Z","_","a","b","c","d","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","resolveString","C","registerWebGPURenderer","D","resolveNumber","E","resolveHandleParam","M","webgpuRegistry","N","Point2D","O","resolveParam","P","solveHomography","S","isSignal","T","resolveFrameNumber","U","WebGPUNodeRendererArgs","_","WebGPURegistry","a","GPURenderPassEncoder","b","effectReach","c","HandleParam","d","NodeOperation","f","NodeOperationInputs","g","WebGPUNodeRenderer","h","TextureSourceOp","i","GPUCommandEncoder","j","unwrapFrameParam","k","resolveSignalField","l","MediaOperation","m","NodeRendererPlugin","n","AudioProcessorContext","o","GPUTexture","p","NodeRenderProps","r","EffectReach","s","GPUTextureView","t","AudioProcessor","u","NodeInputConnection","v","audioRegistry","w","resolveBoolean","x","isHandleConnected","y","defineRenderer","_framefields_core0","FileDataSchema","MultiOutputGenericSchema","SingleOutputGenericSchema","VirtualMediaDataSchema","createOutputItemSchema","z","FieldMeta","FieldOptions","ConfigBuilder","TKey","TType","TShape","ZodRawShape","Record","ZodTypeAny","core","$strip","ZodObject","configBuilder","COMPOSITE_OPERATIONS","GlobalCompositeOperation","ZodEnum","ColorSchema","ZodString","ZodOptional","PercentageSchema","ZodNumber","DimensionSchema","AnimationSchema","ZodArray","StrokeSchema","ZodDefault","ImageResultSchema","ZodLiteral","OutputItem","$ZodTypeInternals","ZodType","ZodTuple","ImageResult","infer","VideoResultSchema","VideoResult","AudioResultSchema","AudioResult","TextResultSchema","TextResult","NumberResultSchema","NumberResult","SignalResultSchema","SignalResult","OperationInputsSchema","ZodBoolean","ZodUnknown","ZodNullable","ZodRecord"],"sources":["../../node-sdk/dist/index-J6jlqDT9.d.mts","../../node-sdk/dist/index.d.mts"],"sourcesContent":["import { MediaOperation, NodeInputConnection, NodeOperation, SignalData, VirtualMediaData, isSignal, resolveBoolean, resolveNumber, resolveParam, resolveString } from \"@framefields/core\";\nimport { RenderContextValue } from \"@framefields/webgpu-renderers\";\n\n//#region renderer/gpu.d.ts\n/** The argument object every WebGPU node renderer receives. */\ntype WebGPUNodeRendererArgs = Parameters<WebGPUNodeRenderer>[0];\n/**\n * Full-screen quad vertex stage: a 4-vertex triangle strip (draw(4)) that\n * hands `in.uv` (0,0 top-left → 1,1 bottom-right) to an `fs` reading `VSOut`.\n */\ndeclare const FULLSCREEN_QUAD_WGSL = \"\\nstruct VSOut {\\n @builtin(position) pos : vec4<f32>,\\n @location(0) uv : vec2<f32>,\\n};\\n\\n@vertex fn vs(@builtin(vertex_index) vi: u32) -> VSOut {\\n var pos = array<vec2<f32>, 4>(\\n vec2<f32>(-1.0, 1.0),\\n vec2<f32>(1.0, 1.0),\\n vec2<f32>(-1.0, -1.0),\\n vec2<f32>(1.0, -1.0)\\n );\\n var uv = array<vec2<f32>, 4>(\\n vec2<f32>(0.0, 0.0),\\n vec2<f32>(1.0, 0.0),\\n vec2<f32>(0.0, 1.0),\\n vec2<f32>(1.0, 1.0)\\n );\\n return VSOut(vec4<f32>(pos[vi], 0.0, 1.0), uv[vi]);\\n}\\n\";\n/** Premultiplied-alpha \"over\" blending. */\ndeclare const PREMULTIPLIED_BLEND: GPUBlendState;\n/** Straight-alpha color over a premultiplied-alpha accumulation. */\ndeclare const STRAIGHT_ALPHA_BLEND: GPUBlendState;\n/**\n * One bind-group entry, visible to the fragment stage unless it says\n * otherwise: `\"uniform\"` buffer, `\"texture\"` (filterable float 2D) or\n * `\"sampler\"` (filtering), or any other entry minus its binding index.\n */\ntype FragmentBinding = \"uniform\" | \"texture\" | \"sampler\" | Omit<GPUBindGroupLayoutEntry, \"binding\" | \"visibility\"> | Omit<GPUBindGroupLayoutEntry, \"binding\">;\n/** A bind group layout whose entries are bound at 0, 1, 2… in order. */\ndeclare function fragmentBindGroupLayout(device: GPUDevice, bindings: FragmentBinding[], label?: string): GPUBindGroupLayout;\n/** `count` float textures followed by one filtering sampler. */\ndeclare function texturesLayout(device: GPUDevice, count: number): GPUBindGroupLayout;\n/** Memoizes `create` per GPUDevice (resources can't cross devices). */\ndeclare function perDevice<T>(create: (device: GPUDevice) => T): (device: GPUDevice) => T;\ninterface FullscreenPipelineOptions {\n label?: string;\n module: GPUShaderModule;\n layouts: GPUBindGroupLayout[] | GPUPipelineLayout;\n format: GPUTextureFormat;\n blend?: GPUBlendState;\n /** Defaults to \"vs\". */\n vertexEntryPoint?: string;\n /** Defaults to \"fs\". */\n fragmentEntryPoint?: string;\n}\n/** A triangle-strip pipeline drawing one full-screen quad (`draw(4)`). */\ndeclare function createFullscreenPipeline(device: GPUDevice, options: FullscreenPipelineOptions): GPURenderPipeline;\ninterface DrawChildToTextureOptions {\n /** Defaults to the target's size. */\n width?: number;\n height?: number;\n /** Props for the child; defaults to the node's props with the child as media. */\n props?: Partial<NodeRenderProps>;\n /** Textures still in use that the temporary texture must not alias. */\n exclude?: GPUTexture[];\n}\n/**\n * Renders `child` into a cleared temporary texture with an identity\n * transform and a full-size scissor, and returns that texture.\n */\ndeclare function drawChildToTexture(args: WebGPUNodeRendererArgs, child: VirtualMediaData, options?: DrawChildToTextureOptions): Promise<{\n texture: GPUTexture;\n view: GPUTextureView;\n}>;\n/**\n * Opens a \"load\" pass on the node's target and makes it the node's current\n * pass (the caller hands it back to the compositor).\n */\ndeclare function beginTargetPass(args: WebGPUNodeRendererArgs, width?: number, height?: number): GPURenderPassEncoder;\n/** Draws `texture` over the whole target at `opacity` (the node's output). */\ndeclare function drawTextureToTarget(args: WebGPUNodeRendererArgs, texture: GPUTexture, opacity?: number): void;\n/** Clock a signal texture is evaluated at, in seconds. */\ndeclare function signalTiming(props: NodeRenderProps, frame: number, fps: number, fallbackDurationSeconds?: number): {\n elapsedSeconds: number;\n durationSeconds: number;\n};\ntype NodeSignalData = SignalData & {\n nodeId?: string;\n};\ninterface SignalTextureContext {\n args: WebGPUNodeRendererArgs;\n width: number;\n height: number;\n frame: number;\n fps: number;\n elapsedSeconds: number;\n durationSeconds: number;\n}\n/**\n * The texture a bound parameter samples: its own GPU binding, the signal's\n * texture (cached under `sd.nodeId`, else `fallbackId`), or a 1×1 dummy.\n */\ndeclare function signalTextureView(sc: SignalTextureContext, param: {\n hasStaticSig: boolean;\n sd: NodeSignalData | null;\n gpuTextureView?: GPUTextureView;\n}, fallbackId: string): GPUTextureView;\n/** Clears `target` to transparent and draws one full-screen quad into it. */\ndeclare function drawFullscreenPass(encoder: GPUCommandEncoder, target: GPUTextureView, pipeline: GPURenderPipeline, bindGroups: GPUBindGroup[]): void;\n//#endregion\n//#region renderer/homography.d.ts\ninterface Point2D {\n x: number;\n y: number;\n}\n/**\n * Computes an 8-parameter 3x3 homography matrix mapping destination coordinates (quad)\n * to normalized source coordinates (unit square [0, 1]^2).\n *\n * The homography H maps destination (x, y) to source (u, v):\n * u = (h00*x + h01*y + h02) / (h20*x + h21*y + h22)\n * v = (h10*x + h11*y + h12) / (h20*x + h21*y + h22)\n *\n * Resulting array: [h00, h01, h02, h10, h11, h12, h20, h21, 1.0]\n */\ndeclare function solveHomography(dstPoints: Point2D[], srcPoints?: Point2D[]): number[];\n//#endregion\n//#region renderer/index.d.ts\ntype GPUCommandEncoder$1 = globalThis.GPUCommandEncoder;\ntype GPURenderPassEncoder$1 = globalThis.GPURenderPassEncoder;\ntype GPUTextureView$1 = globalThis.GPUTextureView;\ntype GPUTexture$1 = globalThis.GPUTexture;\ninterface NodeRenderProps<TOperation extends MediaOperation = MediaOperation> {\n renderId: string;\n virtualMedia: VirtualMediaData<TOperation>;\n volume?: number;\n playbackRateOverride?: number;\n trimStartOverride?: number;\n trimEndOverride?: number;\n containerWidth: number;\n containerHeight: number;\n opacity?: number;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n timestampSec?: number;\n renderingContext?: \"visual\" | \"audio\";\n inheritedSeekOffset?: number;\n inheritedClockOffset?: number;\n isHeadless?: boolean;\n forceWait?: boolean;\n isVideoMode?: boolean;\n isPlaying?: boolean;\n excludeTextures?: GPUTexture$1[];\n /** Signal values that override the node's own (text animators read them). */\n signals?: Record<string, unknown>;\n renderChild?: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>) => unknown;\n}\n/**\n * How far an effect draws past the pixels it is given, px, for one of its\n * operations; `null` when it isn't local (it reads or writes pixels anywhere,\n * like a mirror or a portal) or can't tell (a size driven by a signal).\n */\ntype EffectReach = (operation: Record<string, unknown>) => number | null;\n/**\n * A node's GPU renderer. An effect renderer may carry `reach`: a compositor\n * then runs it over the layer's own region plus that margin instead of the\n * whole target. Without it the effect always gets the whole target.\n */\ntype WebGPUNodeRenderer<TOperation extends MediaOperation = MediaOperation> = WebGPUNodeRenderFn<TOperation> & {\n reach?: EffectReach;\n};\ntype WebGPUNodeRenderFn<TOperation extends MediaOperation> = (args: {\n ctx: RenderContextValue;\n encoder: GPUCommandEncoder$1;\n pass: GPURenderPassEncoder$1;\n targetView: GPUTextureView$1;\n targetTexture: GPUTexture$1;\n targetWidth: number;\n targetHeight: number;\n props: NodeRenderProps<TOperation>;\n drawChild: (child: VirtualMediaData, overrides?: Partial<NodeRenderProps>, targetViewOverride?: GPUTextureView$1, targetTextureOverride?: GPUTexture$1, targetWidthOverride?: number, targetHeightOverride?: number) => Promise<void>;\n}) => Promise<void> | void;\ninterface AudioProcessorContext {\n device?: GPUDevice;\n frame?: number;\n compositionFrame?: number;\n fps?: number;\n elapsedMs?: number;\n durationMs?: number;\n renderId?: string;\n}\ntype AudioProcessor<TOperation extends MediaOperation = MediaOperation> = (channels: Float32Array[], sampleRate: number, virtualMedia: VirtualMediaData<TOperation>, ctx?: AudioProcessorContext) => void | Promise<void>;\n/**\n * A numeric node parameter at `frame`: a number, a signal-like `get(ctx)` or\n * `{ value }`, a `(ctx) => number` function, or anything `Number()` accepts;\n * `fallback` when none of those yields a finite number.\n */\ndeclare function resolveFrameNumber(val: unknown, fallback: number, frame: number, fps: number): number;\n/**\n * A static node parameter at `frame`: calls `get(ctx)` / `(frame, fps)`\n * functions and reads `{ value }` wrappers, keeping a signal's GPU texture\n * binding when it has one. Anything else is returned as-is.\n */\ndeclare function unwrapFrameParam(raw: unknown, frame: number, fps: number): {\n value: unknown;\n gpuTextureView?: GPUTextureView$1;\n};\n/** The `inputs` map node operations carry: one entry per connected handle. */\ntype NodeOperationInputs = Record<string, {\n connectionValid: boolean;\n outputItem: {\n type: string;\n data: unknown;\n } | null;\n}>;\ninterface HandleParam<SD> {\n val: number;\n /** The value comes from a signal (`sd`) sampled on the GPU. */\n hasStaticSig: boolean;\n sd: SD | null;\n handleId: string | null | undefined;\n}\n/**\n * A numeric parameter fed through `handleId`: a connected Number (clamped), a\n * connected Signal (sampled on the GPU, `val` stays `fallbackVal`), or else\n * `fallbackVal` clamped to [clampMin, clampMax].\n */\ndeclare function resolveHandleParam<SD>(inputs: NodeOperationInputs | undefined, handleId: string | null | undefined, fallbackVal: number, clampMin: number, clampMax: number): HandleParam<SD>;\n/**\n * A numeric field `fieldName` of a node operation, fed through its\n * `${fieldName}HandleId` input: a connected Signal/Numeric (`sd`, sampled on\n * the GPU; `value` is its offset), a connected Number, or the operation's own\n * value — each clamped to [minVal, maxVal].\n */\ndeclare function resolveSignalField<SD>(op: {\n inputs?: NodeOperationInputs;\n}, fieldName: string, defaultValue: number, minVal?: number, maxVal?: number): {\n hasSignal: boolean;\n sd: SD | null;\n value: number;\n};\n/**\n * Whether the handle whose id is stored at `op[handleIdKey]` has a valid\n * Signal or Number connection.\n */\ndeclare function isHandleConnected(op: Record<string, unknown>, handleIdKey: string): boolean;\ninterface NodeRendererPlugin {\n WebGPURenderer?: WebGPUNodeRenderer;\n audioProcessor?: AudioProcessor;\n}\ndeclare function defineRenderer(plugin: NodeRendererPlugin): Readonly<NodeRendererPlugin>;\ndeclare class WebGPURegistry {\n private renderers;\n register(op: string, renderer: WebGPUNodeRenderer): void;\n get(op: string): WebGPUNodeRenderer | undefined;\n has(op: string): boolean;\n}\ndeclare const webgpuRegistry: WebGPURegistry;\ndeclare function registerWebGPURenderer(op: string, renderer: WebGPUNodeRenderer): void;\n/**\n * How far an operation's effect draws past its pixels, from its registered\n * renderer; `null` when unknown: no renderer, no `reach`, or no answer.\n */\ndeclare function effectReach(operation: Record<string, unknown>): number | null;\ninterface TextureSourceOp {\n op: \"TextureSource\";\n sourceTexture: GPUTexture$1;\n opacity?: number;\n dataType?: \"Image\";\n}\ndeclare class AudioProcessorRegistry {\n private processors;\n register(opType: string, processor: AudioProcessor): void;\n get(opType: string): AudioProcessor | null;\n}\ndeclare const audioRegistry: AudioProcessorRegistry;\n//#endregion\nexport { texturesLayout as $, resolveString as A, PREMULTIPLIED_BLEND as B, registerWebGPURenderer as C, resolveNumber as D, resolveHandleParam as E, DrawChildToTextureOptions as F, createFullscreenPipeline as G, SignalTextureContext as H, FULLSCREEN_QUAD_WGSL as I, drawTextureToTarget as J, drawChildToTexture as K, FragmentBinding as L, webgpuRegistry as M, Point2D as N, resolveParam as O, solveHomography as P, signalTiming as Q, FullscreenPipelineOptions as R, isSignal as S, resolveFrameNumber as T, WebGPUNodeRendererArgs as U, STRAIGHT_ALPHA_BLEND as V, beginTargetPass as W, perDevice as X, fragmentBindGroupLayout as Y, signalTextureView as Z, WebGPURegistry as _, GPURenderPassEncoder$1 as a, effectReach as b, HandleParam as c, NodeOperation as d, NodeOperationInputs as f, WebGPUNodeRenderer as g, TextureSourceOp as h, GPUCommandEncoder$1 as i, unwrapFrameParam as j, resolveSignalField as k, MediaOperation as l, NodeRendererPlugin as m, AudioProcessorContext as n, GPUTexture$1 as o, NodeRenderProps as p, drawFullscreenPass as q, EffectReach as r, GPUTextureView$1 as s, AudioProcessor as t, NodeInputConnection as u, audioRegistry as v, resolveBoolean as w, isHandleConnected as x, defineRenderer as y, NodeSignalData as z };\n//# sourceMappingURL=index-J6jlqDT9.d.mts.map","import { A as resolveString, C as registerWebGPURenderer, D as resolveNumber, E as resolveHandleParam, M as webgpuRegistry, N as Point2D, O as resolveParam, P as solveHomography, S as isSignal, T as resolveFrameNumber, U as WebGPUNodeRendererArgs, _ as WebGPURegistry, a as GPURenderPassEncoder, b as effectReach, c as HandleParam, d as NodeOperation, f as NodeOperationInputs, g as WebGPUNodeRenderer, h as TextureSourceOp, i as GPUCommandEncoder, j as unwrapFrameParam, k as resolveSignalField, l as MediaOperation, m as NodeRendererPlugin, n as AudioProcessorContext, o as GPUTexture, p as NodeRenderProps, r as EffectReach, s as GPUTextureView, t as AudioProcessor, u as NodeInputConnection, v as audioRegistry, w as resolveBoolean, x as isHandleConnected, y as defineRenderer } from \"./index-J6jlqDT9.mjs\";\nimport * as _framefields_core0 from \"@framefields/core\";\nimport { FileDataSchema, MultiOutputGenericSchema, SingleOutputGenericSchema, VirtualMediaDataSchema, createOutputItemSchema } from \"@framefields/core\";\nimport { z } from \"zod\";\n\n//#region shared/config-builder.d.ts\n\n/**\n * Per-field metadata, attached to the field's zod schema with `.meta()`.\n *\n * It is readable from the schema itself (`z.globalRegistry.get(schema)`) and\n * from `z.toJSONSchema(schema)`, which is what `scripts/generate-effects.mts`\n * uses to emit the authoring classes. Raw `z.object` configs can call\n * `.meta({...})` with these keys directly; `configBuilder().field()` is sugar\n * for the same thing. See `spec/sync-node.md` §5.2.\n */\ninterface FieldMeta {\n label?: string;\n description?: string;\n dataTypes?: string[];\n /** Editor: the node shows an input handle for this field. */\n bindable?: boolean;\n /**\n * Authoring: the prop is typed `EffectProp<T>` (value, signal or frame\n * function). Defaults to `bindable`. Set it explicitly where the two differ.\n */\n signal?: boolean;\n /** Editor wiring only. Excluded from the generated authoring surface. */\n editorOnly?: boolean;\n /** Escape hatch for a value zod cannot type, e.g. a GPU texture handle. */\n tsType?: {\n name: string;\n from: string;\n };\n}\n/** @deprecated Use {@link FieldMeta}. */\ntype FieldOptions = FieldMeta;\ndeclare class ConfigBuilder<TShape extends z.ZodRawShape = Record<string, never>> {\n private shape;\n private options;\n constructor(shape?: TShape, options?: {\n strict?: boolean;\n });\n field<TKey extends string, TType extends z.ZodTypeAny>(key: TKey, schema: TType, options?: FieldMeta): ConfigBuilder<TShape & { [K in TKey]: TType }>;\n build(): {\n schema: z.ZodObject<{ -readonly [P in keyof TShape]: TShape[P] }, z.core.$strip>;\n };\n}\ndeclare function configBuilder(options?: {\n strict?: boolean;\n}): ConfigBuilder<{}>;\n//#endregion\n//#region shared/schemas.d.ts\ndeclare const COMPOSITE_OPERATIONS: readonly [\"source-over\", \"source-in\", \"source-out\", \"source-atop\", \"destination-over\", \"destination-in\", \"destination-out\", \"destination-atop\", \"lighter\", \"copy\", \"xor\", \"multiply\", \"screen\", \"overlay\", \"darken\", \"lighten\", \"color-dodge\", \"color-burn\", \"hard-light\", \"soft-light\", \"difference\", \"exclusion\", \"hue\", \"saturation\", \"color\", \"luminosity\"];\ndeclare const GlobalCompositeOperation: z.ZodEnum<{\n \"source-over\": \"source-over\";\n \"source-in\": \"source-in\";\n \"source-out\": \"source-out\";\n \"source-atop\": \"source-atop\";\n \"destination-over\": \"destination-over\";\n \"destination-in\": \"destination-in\";\n \"destination-out\": \"destination-out\";\n \"destination-atop\": \"destination-atop\";\n lighter: \"lighter\";\n copy: \"copy\";\n xor: \"xor\";\n multiply: \"multiply\";\n screen: \"screen\";\n overlay: \"overlay\";\n darken: \"darken\";\n lighten: \"lighten\";\n \"color-dodge\": \"color-dodge\";\n \"color-burn\": \"color-burn\";\n \"hard-light\": \"hard-light\";\n \"soft-light\": \"soft-light\";\n difference: \"difference\";\n exclusion: \"exclusion\";\n hue: \"hue\";\n saturation: \"saturation\";\n color: \"color\";\n luminosity: \"luminosity\";\n}>;\ndeclare const ColorSchema: z.ZodOptional<z.ZodString>;\ndeclare const PercentageSchema: z.ZodNumber;\ndeclare const DimensionSchema: z.ZodOptional<z.ZodNumber>;\ndeclare const AnimationSchema: z.ZodObject<{\n animations: z.ZodOptional<z.ZodArray<z.ZodObject<{\n id: z.ZodString;\n type: z.ZodEnum<{\n \"fade-in\": \"fade-in\";\n \"fade-out\": \"fade-out\";\n \"slide-in-left\": \"slide-in-left\";\n \"slide-in-right\": \"slide-in-right\";\n \"slide-in-top\": \"slide-in-top\";\n \"slide-in-bottom\": \"slide-in-bottom\";\n \"zoom-in\": \"zoom-in\";\n \"zoom-out\": \"zoom-out\";\n \"rotate-cw\": \"rotate-cw\";\n \"rotate-ccw\": \"rotate-ccw\";\n bounce: \"bounce\";\n shake: \"shake\";\n }>;\n value: z.ZodNumber;\n }, z.core.$strip>>>;\n}, z.core.$strip>;\ndeclare const StrokeSchema: z.ZodObject<{\n stroke: z.ZodOptional<z.ZodString>;\n strokeWidth: z.ZodOptional<z.ZodNumber>;\n strokeAlign: z.ZodDefault<z.ZodOptional<z.ZodEnum<{\n inside: \"inside\";\n center: \"center\";\n outside: \"outside\";\n }>>>;\n strokeRadius: z.ZodOptional<z.ZodNumber>;\n}, z.core.$strip>;\ndeclare const ImageResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Image\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Image\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype ImageResult = z.infer<typeof ImageResultSchema>;\ndeclare const VideoResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Video\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Video\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype VideoResult = z.infer<typeof VideoResultSchema>;\ndeclare const AudioResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Audio\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Audio\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype AudioResult = z.infer<typeof AudioResultSchema>;\ndeclare const TextResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Text\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Text\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype TextResult = z.infer<typeof TextResultSchema>;\ndeclare const NumberResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Number\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Number\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype NumberResult = z.infer<typeof NumberResultSchema>;\ndeclare const SignalResultSchema: z.ZodObject<{\n selectedOutputIndex: z.ZodLiteral<0>;\n outputs: z.ZodTuple<[z.ZodObject<{\n items: z.ZodTuple<[z.ZodType<_framefields_core0.OutputItem<\"Signal\">, unknown, z.core.$ZodTypeInternals<_framefields_core0.OutputItem<\"Signal\">, unknown>>], null>;\n }, z.core.$strip>], null>;\n}, z.core.$strip>;\ntype SignalResult = z.infer<typeof SignalResultSchema>;\n/** The `inputs` map an operation carries: one entry per connected handle. */\ndeclare const OperationInputsSchema: z.ZodRecord<z.ZodString, z.ZodObject<{\n connectionValid: z.ZodBoolean;\n outputItem: z.ZodOptional<z.ZodNullable<z.ZodObject<{\n type: z.ZodString;\n data: z.ZodUnknown;\n }, z.core.$strip>>>;\n}, z.core.$strip>>;\n//#endregion\nexport { AnimationSchema, AudioProcessor, AudioProcessorContext, AudioResult, AudioResultSchema, COMPOSITE_OPERATIONS, ColorSchema, ConfigBuilder, DimensionSchema, EffectReach, FieldMeta, FieldOptions, FileDataSchema, GPUCommandEncoder, GPURenderPassEncoder, GPUTexture, GPUTextureView, GlobalCompositeOperation, HandleParam, ImageResult, ImageResultSchema, MediaOperation, MultiOutputGenericSchema, NodeInputConnection, NodeOperation, NodeOperationInputs, NodeRenderProps, NodeRendererPlugin, NumberResult, NumberResultSchema, OperationInputsSchema, PercentageSchema, Point2D, SignalResult, SignalResultSchema, SingleOutputGenericSchema, StrokeSchema, TextResult, TextResultSchema, TextureSourceOp, VideoResult, VideoResultSchema, VirtualMediaDataSchema, WebGPUNodeRenderer, WebGPUNodeRendererArgs, WebGPURegistry, audioRegistry, configBuilder, createOutputItemSchema, defineRenderer, effectReach, isHandleConnected, isSignal, registerWebGPURenderer, resolveBoolean, resolveFrameNumber, resolveHandleParam, resolveNumber, resolveParam, resolveSignalField, resolveString, solveHomography, unwrapFrameParam, webgpuRegistry };\n//# sourceMappingURL=index.d.mts.map"],"mappings":";;;;;;;KA+GKoD,mBAAAA,GAAsBC,UAAAA,CAAWL;KACjCM,sBAAAA,GAAyBD,UAAAA,CAAWZ;KACpCc,gBAAAA,GAAmBF,UAAAA,CAAWf;KAC9BkB,YAAAA,GAAeH,UAAAA,CAAWjB;UACrBF,mCAAmClC,iBAAiBA;;gBAE9CI,iBAAiBqD;;;;;;;;;;;;;;;;;;;;;oBAqBbD;;YAERE;wBACYtD,8BAA8B+B,QAAQD;;;;;;;KAOzDyB,WAAAA,eAA0BD;;;;;;KAM1B9C,sCAAsCZ,iBAAiBA,kBAAkB4D,mBAAmBH;UACvFE;;KAELC,sCAAsC5D;OACpCU;WACI0C;QACHE;cACMC;iBACGC;;;SAGRtB,gBAAgBuB;qBACJrD,8BAA8B+B,QAAQD,uCAAuCqB,0CAA0CC,8EAA8EjB;MACpNA;UACIsB,qBAAAA;WACCvC;;;;;;;;KAQNwC,kCAAkC9D,iBAAiBA,6BAA6B+D,kDAAkD3D,iBAAiBqD,mBAAmBI,iCAAiCtB;;;;;;;UAuDlMiC,kBAAAA;mBACS5D;mBACAkD;;;;;cCpFL+L,oBAAoB3C,CAAAA,CAAEY;uBACbZ,CAAAA,CAAE4B;WACd5B,CAAAA,CAAEgC,UAAUhC,CAAAA,CAAEY;WACdZ,CAAAA,CAAEgC,UAAUhC,CAAAA,CAAE+B,QAAQrC,+BAAkDM,CAAAA,CAAEU,IAAAA,CAAKoB,kBAAkBpC;KACvGM,CAAAA,CAAEU,IAAAA,CAAKC;GACTX,CAAAA,CAAEU,IAAAA,CAAKC"}
@@ -1,3 +0,0 @@
1
- import { t as renderers_default } from "./renderer-Duorbrb8.mjs";
2
-
3
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-DmrP4dsn.mjs";
4
-
5
- export { renderers_default as default };
@@ -1,5 +0,0 @@
1
- import "./chunk-D7gtBK74.mjs";
2
- import "./dist-cC6nOaMR.mjs";
3
- import { t as renderers_default } from "./renderer-BEpA2g1_.mjs";
4
-
5
- export { renderers_default as default };