framefields 2.8.1 → 2.9.2

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 (432) hide show
  1. package/README.md +30 -1
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-vatRe308.mjs → audio-BfQg37MW.mjs} +3 -3
  4. package/dist/{audio-vatRe308.mjs.map → audio-BfQg37MW.mjs.map} +1 -1
  5. package/dist/cli/check-worker.mjs +44 -44
  6. package/dist/components/index.d.mts +2 -2
  7. package/dist/components/index.mjs +43 -43
  8. package/dist/{dist-CFe1fC9l.mjs → dist-C1cCW7Bt.mjs} +8 -1
  9. package/dist/{dist-CFe1fC9l.mjs.map → dist-C1cCW7Bt.mjs.map} +1 -1
  10. package/dist/{dist-BbwtlSZO.mjs → dist-C8Xq3zgx.mjs} +2 -2
  11. package/dist/{dist-BbwtlSZO.mjs.map → dist-C8Xq3zgx.mjs.map} +1 -1
  12. package/dist/effects/index.d.mts +1 -1
  13. package/dist/effects/index.mjs +35 -35
  14. package/dist/{effects-CCyfjbhZ.mjs → effects-CemgqEPv.mjs} +2 -2
  15. package/dist/{effects-CCyfjbhZ.mjs.map → effects-CemgqEPv.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-C1mgtkCa.mjs → fonts-BW0pPcvJ.mjs} +2 -2
  18. package/dist/{fonts-C1mgtkCa.mjs.map → fonts-BW0pPcvJ.mjs.map} +1 -1
  19. package/dist/{gpu-CU2tEKJJ.mjs → gpu-CMaa63nz.mjs} +2 -2
  20. package/dist/{gpu-CU2tEKJJ.mjs.map → gpu-CMaa63nz.mjs.map} +1 -1
  21. package/dist/{index-BwRrsP_V.d.mts → index-Bnh42ouE.d.mts} +71 -10
  22. package/dist/index-Bnh42ouE.d.mts.map +1 -0
  23. package/dist/index-CFoAmh7q.d.mts.map +1 -1
  24. package/dist/{index-UDDAfHAF.d.mts → index-CQ-bbZk3.d.mts} +64 -13
  25. package/dist/index-CQ-bbZk3.d.mts.map +1 -0
  26. package/dist/index-D5UDyVMb.d.mts.map +1 -1
  27. package/dist/index.d.mts +3 -3
  28. package/dist/index.mjs +50 -50
  29. package/dist/preview/index.mjs +10 -10
  30. package/dist/{preview-WXbsf6Dv.mjs → preview-DvP8AZuV.mjs} +2 -2
  31. package/dist/{preview-WXbsf6Dv.mjs.map → preview-DvP8AZuV.mjs.map} +1 -1
  32. package/dist/preview-engine/audio.mjs +1 -1
  33. package/dist/preview-engine/{chunk-JGDZQCNU.mjs → chunk-2B722GXM.mjs} +1 -1
  34. package/dist/preview-engine/{chunk-GFW3D464.mjs → chunk-2DWY7UBV.mjs} +1 -1
  35. package/dist/preview-engine/{chunk-72DYOIMP.mjs → chunk-2PYTDN2C.mjs} +1 -1
  36. package/dist/preview-engine/{chunk-PF3SXQNV.mjs → chunk-34DL53D5.mjs} +1 -1
  37. package/dist/preview-engine/{chunk-GLXJOXBE.mjs → chunk-34RJ7GAS.mjs} +1 -1
  38. package/dist/preview-engine/{chunk-6OY4YLTC.mjs → chunk-35HMRW4I.mjs} +1 -1
  39. package/dist/preview-engine/{chunk-W26U6BP2.mjs → chunk-4WYM72ZN.mjs} +1 -1
  40. package/dist/preview-engine/{chunk-EQ4VBUWM.mjs → chunk-5AWAOMBR.mjs} +1 -1
  41. package/dist/preview-engine/{chunk-J4SHMCTG.mjs → chunk-6R3UJBL5.mjs} +1 -1
  42. package/dist/preview-engine/{chunk-VHGC72XP.mjs → chunk-73CNXGAK.mjs} +1 -1
  43. package/dist/preview-engine/{chunk-KYOPOCO5.mjs → chunk-AHQCDTD6.mjs} +1 -1
  44. package/dist/preview-engine/{chunk-ADV2TIKA.mjs → chunk-BEYA25UZ.mjs} +1 -1
  45. package/dist/preview-engine/{chunk-RBDIRBEI.mjs → chunk-BJV2LBII.mjs} +1 -1
  46. package/dist/preview-engine/{chunk-LBJBBEKP.mjs → chunk-BVDWS3D2.mjs} +1 -1
  47. package/dist/preview-engine/chunk-BXPM5SJ3.mjs +1 -0
  48. package/dist/preview-engine/{chunk-NIPWL6Z5.mjs → chunk-C4M3B2Q2.mjs} +1 -1
  49. package/dist/preview-engine/{chunk-LLUFOFF4.mjs → chunk-CC4NNNIY.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-NX66555S.mjs → chunk-CN2VLYLB.mjs} +1 -1
  51. package/dist/preview-engine/chunk-D73ZKPFN.mjs +138 -0
  52. package/dist/preview-engine/{chunk-SK7PUBTC.mjs → chunk-DMSZXG56.mjs} +1 -1
  53. package/dist/preview-engine/{chunk-WC257OBY.mjs → chunk-DVZITDQS.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-LLB3AGBQ.mjs → chunk-EJJITH6U.mjs} +1 -1
  55. package/dist/preview-engine/{chunk-COZG35ZR.mjs → chunk-FTCEG3SF.mjs} +1 -1
  56. package/dist/preview-engine/{chunk-57LES7TL.mjs → chunk-GA4HNR44.mjs} +1 -1
  57. package/dist/preview-engine/{chunk-S4WNCEMO.mjs → chunk-GIICZZQI.mjs} +1 -1
  58. package/dist/preview-engine/{chunk-RTHU7REC.mjs → chunk-GRJJVSOV.mjs} +1 -1
  59. package/dist/preview-engine/{chunk-RGDM6PQ5.mjs → chunk-GZWA5QJS.mjs} +1 -1
  60. package/dist/preview-engine/{chunk-LZNNM5OB.mjs → chunk-H7BSN7V7.mjs} +1 -1
  61. package/dist/preview-engine/{chunk-JXUENEQO.mjs → chunk-HOV6DDBZ.mjs} +1 -1
  62. package/dist/preview-engine/{chunk-C6XLAJLL.mjs → chunk-JSYG6OWZ.mjs} +1 -1
  63. package/dist/preview-engine/{chunk-GZVPVOHB.mjs → chunk-K3C6GUQD.mjs} +1 -1
  64. package/dist/preview-engine/chunk-KOVN277Z.mjs +1 -0
  65. package/dist/preview-engine/chunk-KXLXP66K.mjs +1974 -0
  66. package/dist/preview-engine/{chunk-Y6TWMUJC.mjs → chunk-LVYVXVZO.mjs} +1 -1
  67. package/dist/preview-engine/{chunk-NKAVHU7H.mjs → chunk-MIEH74UH.mjs} +7 -7
  68. package/dist/preview-engine/{chunk-AVDHZNIZ.mjs → chunk-OH5W5EL6.mjs} +1 -1
  69. package/dist/preview-engine/{chunk-22F33PPP.mjs → chunk-P5FKRQFU.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-7X2AUKTU.mjs → chunk-PM2W4VLT.mjs} +1 -1
  71. package/dist/preview-engine/{chunk-PYX6Q2EJ.mjs → chunk-QCSVT73T.mjs} +1 -1
  72. package/dist/preview-engine/{chunk-523CTDOC.mjs → chunk-RJIAES3X.mjs} +1 -1
  73. package/dist/preview-engine/{chunk-DPQN7WYQ.mjs → chunk-S2ABWY5G.mjs} +1 -1
  74. package/dist/preview-engine/{chunk-G7JJ6HVL.mjs → chunk-SF37HXAH.mjs} +1 -1
  75. package/dist/preview-engine/{chunk-OKLYIQ5F.mjs → chunk-SPJPM43P.mjs} +1 -1
  76. package/dist/preview-engine/{chunk-UOTMBWBJ.mjs → chunk-TNJEZKXM.mjs} +1 -1
  77. package/dist/preview-engine/chunk-ULOFDFHJ.mjs +1 -0
  78. package/dist/preview-engine/{chunk-DISKQ5MH.mjs → chunk-UXYM2G6J.mjs} +1 -1
  79. package/dist/preview-engine/{chunk-U5YNECNG.mjs → chunk-VN36PRVD.mjs} +1 -1
  80. package/dist/preview-engine/{chunk-PMOKPVSD.mjs → chunk-VVE2QHVG.mjs} +1 -1
  81. package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
  82. package/dist/preview-engine/{chunk-PEUQRSIM.mjs → chunk-Y5K5LVOR.mjs} +1 -1
  83. package/dist/preview-engine/chunk-YGKO4NIU.mjs +1 -0
  84. package/dist/preview-engine/{chunk-PSEMCJBH.mjs → chunk-ZJ5SWTCW.mjs} +1 -1
  85. package/dist/preview-engine/chunk-ZY47XIRK.mjs +5 -0
  86. package/dist/preview-engine/components.mjs +1 -1
  87. package/dist/preview-engine/effects.mjs +1 -1
  88. package/dist/preview-engine/framefields.mjs +1 -1
  89. package/dist/preview-engine/player.mjs +1 -1
  90. package/dist/preview-engine/renderers-3BOQOUEU.mjs +1 -0
  91. package/dist/preview-engine/renderers-3M2FESR2.mjs +1 -0
  92. package/dist/preview-engine/{renderers-FEEIDQF3.mjs → renderers-4F7WLQD5.mjs} +1 -1
  93. package/dist/preview-engine/{renderers-OP6MKYRM.mjs → renderers-5KANN7XF.mjs} +1 -1
  94. package/dist/preview-engine/{renderers-TVRR7PGN.mjs → renderers-5TO2SXFR.mjs} +1 -1
  95. package/dist/preview-engine/{renderers-DR7UZ3QR.mjs → renderers-5UZ3YFBD.mjs} +1 -1
  96. package/dist/preview-engine/renderers-6LHIWKMZ.mjs +1 -0
  97. package/dist/preview-engine/{renderers-7F2KF5RE.mjs → renderers-6Z7DWAPH.mjs} +1 -1
  98. package/dist/preview-engine/renderers-77PDUMYI.mjs +1 -0
  99. package/dist/preview-engine/{renderers-3J3NCOAI.mjs → renderers-7C5RA3R5.mjs} +1 -1
  100. package/dist/preview-engine/{renderers-KPCQGBIY.mjs → renderers-7XHO6M3B.mjs} +1 -1
  101. package/dist/preview-engine/{renderers-KJAOPYAU.mjs → renderers-A24KZK2Q.mjs} +1 -1
  102. package/dist/preview-engine/renderers-A43VCJ7X.mjs +1 -0
  103. package/dist/preview-engine/renderers-AKY464RY.mjs +1 -0
  104. package/dist/preview-engine/renderers-C5UO6PL5.mjs +1 -0
  105. package/dist/preview-engine/renderers-C64QSZO4.mjs +1 -0
  106. package/dist/preview-engine/renderers-CIRCR6NG.mjs +1 -0
  107. package/dist/preview-engine/renderers-CIWOPETY.mjs +1 -0
  108. package/dist/preview-engine/renderers-CUMVIVHI.mjs +1 -0
  109. package/dist/preview-engine/renderers-CZEZCELP.mjs +1 -0
  110. package/dist/preview-engine/{renderers-R3YVLWKV.mjs → renderers-ENMY4DKF.mjs} +1 -1
  111. package/dist/preview-engine/{renderers-AAENCA7X.mjs → renderers-FSI5KNGZ.mjs} +1 -1
  112. package/dist/preview-engine/renderers-FSQMWHQM.mjs +1 -0
  113. package/dist/preview-engine/renderers-FZEW5C23.mjs +1 -0
  114. package/dist/preview-engine/renderers-HCET2IML.mjs +1 -0
  115. package/dist/preview-engine/{renderers-LBX7GPDU.mjs → renderers-IHGAWLUF.mjs} +1 -1
  116. package/dist/preview-engine/renderers-IUOOC6K7.mjs +1 -0
  117. package/dist/preview-engine/{renderers-VXMR47WZ.mjs → renderers-KC6ZSKCW.mjs} +1 -1
  118. package/dist/preview-engine/renderers-KYYJLVIJ.mjs +1 -0
  119. package/dist/preview-engine/renderers-L4GE7WV3.mjs +1 -0
  120. package/dist/preview-engine/renderers-L6YDX6GS.mjs +1 -0
  121. package/dist/preview-engine/renderers-LRAFWKCO.mjs +1 -0
  122. package/dist/preview-engine/renderers-LU3XZWEB.mjs +1 -0
  123. package/dist/preview-engine/{renderers-4YYGKLDK.mjs → renderers-MD3PRFZL.mjs} +1 -1
  124. package/dist/preview-engine/renderers-MDHPQY6D.mjs +1 -0
  125. package/dist/preview-engine/renderers-MOEC2XZZ.mjs +1 -0
  126. package/dist/preview-engine/{renderers-RGDTRVZM.mjs → renderers-NCGH2WWJ.mjs} +1 -1
  127. package/dist/preview-engine/renderers-ND2WV4K3.mjs +1 -0
  128. package/dist/preview-engine/renderers-NJ5CWVVH.mjs +1 -0
  129. package/dist/preview-engine/renderers-NKXYPR3V.mjs +1 -0
  130. package/dist/preview-engine/{renderers-WVQQZQ6Y.mjs → renderers-NUAI4TO5.mjs} +1 -1
  131. package/dist/preview-engine/renderers-NWR66CGK.mjs +1 -0
  132. package/dist/preview-engine/renderers-O22WTBRM.mjs +1 -0
  133. package/dist/preview-engine/renderers-PBBA7LQB.mjs +1 -0
  134. package/dist/preview-engine/{renderers-BL7Z3FTF.mjs → renderers-PIIEUKFE.mjs} +1 -1
  135. package/dist/preview-engine/renderers-PPZK6VEW.mjs +1 -0
  136. package/dist/preview-engine/renderers-Q6LJRZ7R.mjs +1 -0
  137. package/dist/preview-engine/{renderers-7TNEKJZS.mjs → renderers-QA2HKUJJ.mjs} +1 -1
  138. package/dist/preview-engine/renderers-RMEACSRL.mjs +1 -0
  139. package/dist/preview-engine/{renderers-AWRIELVX.mjs → renderers-RN2MHIFK.mjs} +1 -1
  140. package/dist/preview-engine/renderers-SEIAUKJF.mjs +1 -0
  141. package/dist/preview-engine/renderers-SP42LCSI.mjs +1 -0
  142. package/dist/preview-engine/{renderers-OE55O27K.mjs → renderers-T74CQCEN.mjs} +1 -1
  143. package/dist/preview-engine/renderers-T7SZA3BX.mjs +1 -0
  144. package/dist/preview-engine/{renderers-ZUQ2ZBYY.mjs → renderers-TGJSOKDY.mjs} +1 -1
  145. package/dist/preview-engine/renderers-TSBV4KPE.mjs +1 -0
  146. package/dist/preview-engine/{renderers-2SE5BLLB.mjs → renderers-U4M7ZCV4.mjs} +1 -1
  147. package/dist/preview-engine/{renderers-YEI4K4W4.mjs → renderers-V3AQO7AR.mjs} +1 -1
  148. package/dist/preview-engine/renderers-VADTDAHD.mjs +1 -0
  149. package/dist/preview-engine/renderers-VNNWI5C3.mjs +1 -0
  150. package/dist/preview-engine/{renderers-YYMRKHAA.mjs → renderers-WEYAHOBK.mjs} +1 -1
  151. package/dist/preview-engine/renderers-WZ75MLP3.mjs +1 -0
  152. package/dist/preview-engine/renderers-XB5R4UQA.mjs +1 -0
  153. package/dist/preview-engine/{renderers-YIVPMPQS.mjs → renderers-Y22VSOXF.mjs} +1 -1
  154. package/dist/preview-engine/{renderers-Y53D5CQ7.mjs → renderers-YBIUZDGQ.mjs} +1 -1
  155. package/dist/preview-engine/renderers-YESJR4O7.mjs +1 -0
  156. package/dist/preview-engine/renderers-YKSRZRRT.mjs +1 -0
  157. package/dist/preview-engine/{renderers-V4VML5IG.mjs → renderers-ZACSHGNZ.mjs} +1 -1
  158. package/dist/preview-engine/signals.mjs +1 -1
  159. package/dist/preview-engine/src-4IUYUKIZ.mjs +8 -0
  160. package/dist/{program-Cq4gP9Dd.mjs → program-CKpKkllV.mjs} +2 -2
  161. package/dist/{program-Cq4gP9Dd.mjs.map → program-CKpKkllV.mjs.map} +1 -1
  162. package/dist/renderer/index.mjs +2 -2
  163. package/dist/renderer--Ac-dg4A.mjs +5 -0
  164. package/dist/renderer--N7TMqzU.mjs +5 -0
  165. package/dist/{renderer-CXWAdRqn.mjs → renderer--fkmiVjl.mjs} +2 -2
  166. package/dist/{renderer-CXWAdRqn.mjs.map → renderer--fkmiVjl.mjs.map} +1 -1
  167. package/dist/{renderer-CZyJ72JZ.mjs → renderer-1r-Uq-Ae.mjs} +2 -2
  168. package/dist/{renderer-CZyJ72JZ.mjs.map → renderer-1r-Uq-Ae.mjs.map} +1 -1
  169. package/dist/renderer-2ecmdOae.mjs +5 -0
  170. package/dist/{renderer-D8CMakyz.mjs → renderer-8QIwXh7O.mjs} +3 -3
  171. package/dist/{renderer-D8CMakyz.mjs.map → renderer-8QIwXh7O.mjs.map} +1 -1
  172. package/dist/{renderer-B4iCFvJh.mjs → renderer-B-ur0Ej8.mjs} +3 -3
  173. package/dist/{renderer-B4iCFvJh.mjs.map → renderer-B-ur0Ej8.mjs.map} +1 -1
  174. package/dist/{renderer-BD25uND8.mjs → renderer-B2P1vgb7.mjs} +418 -187
  175. package/dist/renderer-B2P1vgb7.mjs.map +1 -0
  176. package/dist/{renderer-BZKkT-6Q.mjs → renderer-B2jjxsjO.mjs} +2 -2
  177. package/dist/{renderer-BZKkT-6Q.mjs.map → renderer-B2jjxsjO.mjs.map} +1 -1
  178. package/dist/{renderer-DEcbSNQd.mjs → renderer-B39I6CQw.mjs} +3 -3
  179. package/dist/{renderer-DEcbSNQd.mjs.map → renderer-B39I6CQw.mjs.map} +1 -1
  180. package/dist/{renderer-DIPyUVX2.mjs → renderer-B522Dkdk.mjs} +3 -3
  181. package/dist/{renderer-DIPyUVX2.mjs.map → renderer-B522Dkdk.mjs.map} +1 -1
  182. package/dist/renderer-B5RJp5g-.mjs +5 -0
  183. package/dist/renderer-B7xyT1Vb.mjs +5 -0
  184. package/dist/{renderer-CeX7uUXB.mjs → renderer-BAYTI6jj.mjs} +2 -2
  185. package/dist/{renderer-CeX7uUXB.mjs.map → renderer-BAYTI6jj.mjs.map} +1 -1
  186. package/dist/{renderer-DoRazdp_.mjs → renderer-BAusZ6Vu.mjs} +2 -2
  187. package/dist/{renderer-DoRazdp_.mjs.map → renderer-BAusZ6Vu.mjs.map} +1 -1
  188. package/dist/renderer-BBeArN_x.mjs +5 -0
  189. package/dist/renderer-BCAZDu-r.mjs +5 -0
  190. package/dist/{renderer-D41gHat4.mjs → renderer-BF0hx_iJ.mjs} +3 -3
  191. package/dist/{renderer-D41gHat4.mjs.map → renderer-BF0hx_iJ.mjs.map} +1 -1
  192. package/dist/renderer-BJnhik7Y.mjs +5 -0
  193. package/dist/{renderer-BeQrWrOa.mjs → renderer-BPWDsufX.mjs} +2 -2
  194. package/dist/{renderer-BeQrWrOa.mjs.map → renderer-BPWDsufX.mjs.map} +1 -1
  195. package/dist/{renderer-CxEBV-w0.mjs → renderer-BXJXziIt.mjs} +2 -2
  196. package/dist/{renderer-CxEBV-w0.mjs.map → renderer-BXJXziIt.mjs.map} +1 -1
  197. package/dist/{renderer-Ce8VPaog.mjs → renderer-BdyopiLC.mjs} +2 -2
  198. package/dist/{renderer-Ce8VPaog.mjs.map → renderer-BdyopiLC.mjs.map} +1 -1
  199. package/dist/{renderer-Bkqg-U2F.mjs → renderer-Bfk6A7UO.mjs} +3 -3
  200. package/dist/{renderer-Bkqg-U2F.mjs.map → renderer-Bfk6A7UO.mjs.map} +1 -1
  201. package/dist/{renderer-CAagaRag.mjs → renderer-BgO6BA_z.mjs} +2 -2
  202. package/dist/{renderer-CAagaRag.mjs.map → renderer-BgO6BA_z.mjs.map} +1 -1
  203. package/dist/{renderer-DlZwbO-A.mjs → renderer-BlPqTEii.mjs} +2 -2
  204. package/dist/{renderer-DlZwbO-A.mjs.map → renderer-BlPqTEii.mjs.map} +1 -1
  205. package/dist/{renderer-BEuU7qlG.mjs → renderer-BlvGcyAN.mjs} +2 -2
  206. package/dist/{renderer-BEuU7qlG.mjs.map → renderer-BlvGcyAN.mjs.map} +1 -1
  207. package/dist/{renderer-BrWOcJ9Q.mjs → renderer-BpIF1QIE.mjs} +3 -3
  208. package/dist/{renderer-BrWOcJ9Q.mjs.map → renderer-BpIF1QIE.mjs.map} +1 -1
  209. package/dist/renderer-BxRW8MZO.mjs +5 -0
  210. package/dist/renderer-C-lfsEAN.mjs +5 -0
  211. package/dist/{renderer-eAVNsuX8.mjs → renderer-C41U1tK6.mjs} +5 -5
  212. package/dist/{renderer-eAVNsuX8.mjs.map → renderer-C41U1tK6.mjs.map} +1 -1
  213. package/dist/renderer-C6nOFN4-.mjs +5 -0
  214. package/dist/{renderer-CjklM-KD.mjs → renderer-C7L8Ceqr.mjs} +2 -2
  215. package/dist/{renderer-CjklM-KD.mjs.map → renderer-C7L8Ceqr.mjs.map} +1 -1
  216. package/dist/{renderer-xLQ_nkmy.mjs → renderer-C7eFJf0_.mjs} +3 -3
  217. package/dist/{renderer-xLQ_nkmy.mjs.map → renderer-C7eFJf0_.mjs.map} +1 -1
  218. package/dist/renderer-C84TSQmS.mjs +5 -0
  219. package/dist/renderer-C8_6YofT.mjs +5 -0
  220. package/dist/{renderer-DsAoxQ8O.mjs → renderer-CCycwCEB.mjs} +2 -2
  221. package/dist/{renderer-DsAoxQ8O.mjs.map → renderer-CCycwCEB.mjs.map} +1 -1
  222. package/dist/{renderer-Cjx3x7xM.mjs → renderer-CHr7MiYW.mjs} +3 -3
  223. package/dist/{renderer-Cjx3x7xM.mjs.map → renderer-CHr7MiYW.mjs.map} +1 -1
  224. package/dist/renderer-COb3tOPG.mjs +5 -0
  225. package/dist/{renderer-DSpTGqUU.mjs → renderer-CQvmbRQ5.mjs} +3 -3
  226. package/dist/{renderer-DSpTGqUU.mjs.map → renderer-CQvmbRQ5.mjs.map} +1 -1
  227. package/dist/renderer-CSCIzaLy.mjs +5 -0
  228. package/dist/{renderer-D7Kk7VxM.mjs → renderer-CYC32bDW.mjs} +3 -3
  229. package/dist/{renderer-D7Kk7VxM.mjs.map → renderer-CYC32bDW.mjs.map} +1 -1
  230. package/dist/{renderer-Ci9x2WUd.mjs → renderer-CcvvoKiZ.mjs} +3 -3
  231. package/dist/{renderer-Ci9x2WUd.mjs.map → renderer-CcvvoKiZ.mjs.map} +1 -1
  232. package/dist/{renderer-DTgO5LPf.mjs → renderer-CiQhD8Gg.mjs} +3 -3
  233. package/dist/{renderer-DTgO5LPf.mjs.map → renderer-CiQhD8Gg.mjs.map} +1 -1
  234. package/dist/renderer-CmI4c8MS.mjs +5 -0
  235. package/dist/{renderer-BlVmbzPs.mjs → renderer-CpUJBOfb.mjs} +2 -2
  236. package/dist/renderer-CqVltdX9.mjs +5 -0
  237. package/dist/{renderer-LY2MiIj0.mjs → renderer-CwFqqpWY.mjs} +3 -3
  238. package/dist/{renderer-LY2MiIj0.mjs.map → renderer-CwFqqpWY.mjs.map} +1 -1
  239. package/dist/renderer-D-FpMzLY.mjs +5 -0
  240. package/dist/renderer-D-Oyn9mG.mjs +5 -0
  241. package/dist/renderer-D2QrkA8_.mjs +5 -0
  242. package/dist/{renderer-D7Cu9OZx.mjs → renderer-D47AEJE_.mjs} +2 -2
  243. package/dist/{renderer-D7Cu9OZx.mjs.map → renderer-D47AEJE_.mjs.map} +1 -1
  244. package/dist/renderer-D5bjOx83.mjs +3 -0
  245. package/dist/{renderer-DPn2DhMU.mjs → renderer-D61B9bXF.mjs} +2 -2
  246. package/dist/{renderer-DPn2DhMU.mjs.map → renderer-D61B9bXF.mjs.map} +1 -1
  247. package/dist/renderer-D64r4iN-.mjs +5 -0
  248. package/dist/{renderer-CUq2qgyc.mjs → renderer-D7Al3_-5.mjs} +3 -3
  249. package/dist/{renderer-CUq2qgyc.mjs.map → renderer-D7Al3_-5.mjs.map} +1 -1
  250. package/dist/{renderer-CyWRvKUI.mjs → renderer-D7r6onRT.mjs} +2 -2
  251. package/dist/{renderer-CyWRvKUI.mjs.map → renderer-D7r6onRT.mjs.map} +1 -1
  252. package/dist/{renderer-DxHICEk3.mjs → renderer-D8bBHrWC.mjs} +3 -3
  253. package/dist/{renderer-DxHICEk3.mjs.map → renderer-D8bBHrWC.mjs.map} +1 -1
  254. package/dist/renderer-DCq6YkgP.mjs +5 -0
  255. package/dist/{renderer-Dk45W8Zd.mjs → renderer-DDEkFbVI.mjs} +3 -3
  256. package/dist/{renderer-Dk45W8Zd.mjs.map → renderer-DDEkFbVI.mjs.map} +1 -1
  257. package/dist/renderer-DDHG3GdR.mjs +5 -0
  258. package/dist/{renderer-BWlMAacF.mjs → renderer-DEmYyaqj.mjs} +2 -2
  259. package/dist/{renderer-BWlMAacF.mjs.map → renderer-DEmYyaqj.mjs.map} +1 -1
  260. package/dist/{renderer-DRGa6tlX.mjs → renderer-DF-yvIrV.mjs} +2 -2
  261. package/dist/{renderer-DRGa6tlX.mjs.map → renderer-DF-yvIrV.mjs.map} +1 -1
  262. package/dist/{renderer-C-5RNIeX.mjs → renderer-DFzI3yI_.mjs} +2 -2
  263. package/dist/{renderer-C-5RNIeX.mjs.map → renderer-DFzI3yI_.mjs.map} +1 -1
  264. package/dist/{renderer-AMBVtZ_G.mjs → renderer-DIw3UtEU.mjs} +3 -3
  265. package/dist/{renderer-AMBVtZ_G.mjs.map → renderer-DIw3UtEU.mjs.map} +1 -1
  266. package/dist/renderer-DMdNfcud.mjs +6 -0
  267. package/dist/{renderer-DnPzvIHK.mjs → renderer-DMvmf3T2.mjs} +2 -2
  268. package/dist/{renderer-Gw1ICOJ3.mjs → renderer-DNQvOrkY.mjs} +3 -3
  269. package/dist/{renderer-Gw1ICOJ3.mjs.map → renderer-DNQvOrkY.mjs.map} +1 -1
  270. package/dist/{renderer-CP2FOWyJ.mjs → renderer-DO-KbpYZ.mjs} +3 -3
  271. package/dist/{renderer-CP2FOWyJ.mjs.map → renderer-DO-KbpYZ.mjs.map} +1 -1
  272. package/dist/{renderer-BeFiQfzV.mjs → renderer-DPAD6fL1.mjs} +70 -70
  273. package/dist/{renderer-BeFiQfzV.mjs.map → renderer-DPAD6fL1.mjs.map} +1 -1
  274. package/dist/{renderer-cg06hb82.mjs → renderer-DTqDy2m9.mjs} +3 -3
  275. package/dist/{renderer-cg06hb82.mjs.map → renderer-DTqDy2m9.mjs.map} +1 -1
  276. package/dist/{renderer-BXAgUuAq.mjs → renderer-DVCJjVn7.mjs} +2 -2
  277. package/dist/{renderer-BXAgUuAq.mjs.map → renderer-DVCJjVn7.mjs.map} +1 -1
  278. package/dist/{renderer-D6X9vWkN.mjs → renderer-DX41niRU.mjs} +2 -2
  279. package/dist/{renderer-D6X9vWkN.mjs.map → renderer-DX41niRU.mjs.map} +1 -1
  280. package/dist/{renderer-D3K9FEQk.mjs → renderer-DXEWbnRF.mjs} +3 -3
  281. package/dist/{renderer-D3K9FEQk.mjs.map → renderer-DXEWbnRF.mjs.map} +1 -1
  282. package/dist/renderer-DZQXZ4lK.mjs +5 -0
  283. package/dist/{renderer-CiMIftlS.mjs → renderer-DbRZe0Re.mjs} +3 -3
  284. package/dist/{renderer-CiMIftlS.mjs.map → renderer-DbRZe0Re.mjs.map} +1 -1
  285. package/dist/renderer-DczJJLA1.mjs +5 -0
  286. package/dist/renderer-DfqJj9oe.mjs +5 -0
  287. package/dist/renderer-DgO9ihVJ.mjs +5 -0
  288. package/dist/renderer-DhgnQZYb.mjs +5 -0
  289. package/dist/{renderer-CrgfMDbh.mjs → renderer-DiY70S8S.mjs} +3 -3
  290. package/dist/{renderer-CrgfMDbh.mjs.map → renderer-DiY70S8S.mjs.map} +1 -1
  291. package/dist/renderer-DjxKjHMf.mjs +5 -0
  292. package/dist/{renderer-Br4UZvfL.mjs → renderer-DkRSZg5g.mjs} +3 -3
  293. package/dist/{renderer-Br4UZvfL.mjs.map → renderer-DkRSZg5g.mjs.map} +1 -1
  294. package/dist/{renderer-CCSzKnvs.mjs → renderer-DmkWrWAk.mjs} +2 -2
  295. package/dist/{renderer-CCSzKnvs.mjs.map → renderer-DmkWrWAk.mjs.map} +1 -1
  296. package/dist/{renderer-D2JOseb1.mjs → renderer-DpruWmZU.mjs} +2 -2
  297. package/dist/{renderer-D2JOseb1.mjs.map → renderer-DpruWmZU.mjs.map} +1 -1
  298. package/dist/renderer-DqLA5cdR.mjs +5 -0
  299. package/dist/{renderer-DxbFjINv.mjs → renderer-DqvoMLca.mjs} +3 -3
  300. package/dist/{renderer-DxbFjINv.mjs.map → renderer-DqvoMLca.mjs.map} +1 -1
  301. package/dist/renderer-Dudp6ZlH.mjs +5 -0
  302. package/dist/{renderer-COQc1jn6.mjs → renderer-EaLUCobW.mjs} +2 -2
  303. package/dist/{renderer-COQc1jn6.mjs.map → renderer-EaLUCobW.mjs.map} +1 -1
  304. package/dist/{renderer-BioUC9zE.mjs → renderer-GBmWjBvy.mjs} +2 -2
  305. package/dist/{renderer-BioUC9zE.mjs.map → renderer-GBmWjBvy.mjs.map} +1 -1
  306. package/dist/{renderer-BNzT34UV.mjs → renderer-Lth37j17.mjs} +2 -2
  307. package/dist/{renderer-D-17HVPb.mjs → renderer-SSBL4M1o.mjs} +3 -3
  308. package/dist/{renderer-D-17HVPb.mjs.map → renderer-SSBL4M1o.mjs.map} +1 -1
  309. package/dist/{renderer-C8rxyjaE.mjs → renderer-SWr3vbrV.mjs} +2 -2
  310. package/dist/{renderer-C8rxyjaE.mjs.map → renderer-SWr3vbrV.mjs.map} +1 -1
  311. package/dist/{renderer-LwrcnEtI.mjs → renderer-WCZu2Rf5.mjs} +3 -3
  312. package/dist/{renderer-LwrcnEtI.mjs.map → renderer-WCZu2Rf5.mjs.map} +1 -1
  313. package/dist/{renderer-BIGILDEA.mjs → renderer-Xv6GfNUI.mjs} +2 -2
  314. package/dist/{renderer-BIGILDEA.mjs.map → renderer-Xv6GfNUI.mjs.map} +1 -1
  315. package/dist/renderer-_jC5KIT1.mjs +5 -0
  316. package/dist/{renderer-DveQQCi8.mjs → renderer-bAKUeHF3.mjs} +3 -3
  317. package/dist/{renderer-DveQQCi8.mjs.map → renderer-bAKUeHF3.mjs.map} +1 -1
  318. package/dist/renderer-cTgAuVmJ.mjs +5 -0
  319. package/dist/{renderer-DGPaKIFf.mjs → renderer-cod5Ona9.mjs} +2 -2
  320. package/dist/{renderer-DgLt0TPo.mjs → renderer-g_vrrAQU.mjs} +2 -2
  321. package/dist/{renderer-DgLt0TPo.mjs.map → renderer-g_vrrAQU.mjs.map} +1 -1
  322. package/dist/{renderer-uorPCWdC.mjs → renderer-hSCfnvaK.mjs} +3 -3
  323. package/dist/{renderer-uorPCWdC.mjs.map → renderer-hSCfnvaK.mjs.map} +1 -1
  324. package/dist/{renderer-BGPnCRFI.mjs → renderer-ktWXVYka.mjs} +3 -3
  325. package/dist/{renderer-BGPnCRFI.mjs.map → renderer-ktWXVYka.mjs.map} +1 -1
  326. package/dist/renderer-nVKDvDLO.mjs +5 -0
  327. package/dist/{renderer-U-12BOhe.mjs → renderer-oKRF4A0M.mjs} +2 -2
  328. package/dist/{renderer-U-12BOhe.mjs.map → renderer-oKRF4A0M.mjs.map} +1 -1
  329. package/dist/{renderer-CsilJwL-.mjs → renderer-pHWEHDnM.mjs} +3 -3
  330. package/dist/{renderer-CsilJwL-.mjs.map → renderer-pHWEHDnM.mjs.map} +1 -1
  331. package/dist/renderer-pZ6_pUo1.mjs +5 -0
  332. package/dist/{renderer-BD00i68i.mjs → renderer-sCovEubT.mjs} +3 -3
  333. package/dist/{renderer-BD00i68i.mjs.map → renderer-sCovEubT.mjs.map} +1 -1
  334. package/dist/{renderer-BdbGTz7z.mjs → renderer-sYSkIUfo.mjs} +3 -3
  335. package/dist/{renderer-BdbGTz7z.mjs.map → renderer-sYSkIUfo.mjs.map} +1 -1
  336. package/dist/{renderer-BLU0PQTB.mjs → renderer-zXPVLRlD.mjs} +3 -3
  337. package/dist/{renderer-BLU0PQTB.mjs.map → renderer-zXPVLRlD.mjs.map} +1 -1
  338. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs → renderers-CP8CFWDs-DH2oktaC.mjs} +2 -2
  339. package/dist/{renderers-CP8CFWDs-ywy4xljX.mjs.map → renderers-CP8CFWDs-DH2oktaC.mjs.map} +1 -1
  340. package/dist/signals/index.mjs +4 -4
  341. package/dist/{src-B0KFNjj4.mjs → src-DFEqficI.mjs} +445 -35
  342. package/dist/src-DFEqficI.mjs.map +1 -0
  343. package/package.json +67 -58
  344. package/dist/index-BwRrsP_V.d.mts.map +0 -1
  345. package/dist/index-UDDAfHAF.d.mts.map +0 -1
  346. package/dist/preview-engine/chunk-3U2A3RW4.mjs +0 -5
  347. package/dist/preview-engine/chunk-6E3JSPJN.mjs +0 -1
  348. package/dist/preview-engine/chunk-F4F2UDRX.mjs +0 -1
  349. package/dist/preview-engine/chunk-KFNVUGNN.mjs +0 -1974
  350. package/dist/preview-engine/chunk-PYSBWKIJ.mjs +0 -1
  351. package/dist/preview-engine/chunk-U2IFQMS3.mjs +0 -174
  352. package/dist/preview-engine/renderers-2GMY2ZNK.mjs +0 -1
  353. package/dist/preview-engine/renderers-2QJNKL7Q.mjs +0 -1
  354. package/dist/preview-engine/renderers-3OYU6O6F.mjs +0 -1
  355. package/dist/preview-engine/renderers-433Y2PCK.mjs +0 -1
  356. package/dist/preview-engine/renderers-4AGPGEL4.mjs +0 -1
  357. package/dist/preview-engine/renderers-54DBHGUW.mjs +0 -1
  358. package/dist/preview-engine/renderers-5M2O55U3.mjs +0 -1
  359. package/dist/preview-engine/renderers-6FVMDEAY.mjs +0 -1
  360. package/dist/preview-engine/renderers-6R7ZJ7DU.mjs +0 -1
  361. package/dist/preview-engine/renderers-75GCMFOD.mjs +0 -1
  362. package/dist/preview-engine/renderers-7LWLUCVQ.mjs +0 -1
  363. package/dist/preview-engine/renderers-BLDENIEV.mjs +0 -1
  364. package/dist/preview-engine/renderers-CDB3YK3R.mjs +0 -1
  365. package/dist/preview-engine/renderers-D6D4XDFY.mjs +0 -1
  366. package/dist/preview-engine/renderers-DJVFQZYU.mjs +0 -1
  367. package/dist/preview-engine/renderers-DMXSV7VO.mjs +0 -1
  368. package/dist/preview-engine/renderers-EBMASIOE.mjs +0 -1
  369. package/dist/preview-engine/renderers-F262HDFS.mjs +0 -1
  370. package/dist/preview-engine/renderers-FMXKIF22.mjs +0 -1
  371. package/dist/preview-engine/renderers-GJKSZ6DR.mjs +0 -1
  372. package/dist/preview-engine/renderers-GR3RLYDZ.mjs +0 -1
  373. package/dist/preview-engine/renderers-GT3W2QIA.mjs +0 -1
  374. package/dist/preview-engine/renderers-IHC7HUK3.mjs +0 -1
  375. package/dist/preview-engine/renderers-J56ZGEVM.mjs +0 -1
  376. package/dist/preview-engine/renderers-KYM6352U.mjs +0 -1
  377. package/dist/preview-engine/renderers-LFXX6TWI.mjs +0 -1
  378. package/dist/preview-engine/renderers-NAHUPFPU.mjs +0 -1
  379. package/dist/preview-engine/renderers-NM3FZLHH.mjs +0 -1
  380. package/dist/preview-engine/renderers-NNB4BTJA.mjs +0 -1
  381. package/dist/preview-engine/renderers-OYVQW6QI.mjs +0 -1
  382. package/dist/preview-engine/renderers-P5RIFU3C.mjs +0 -1
  383. package/dist/preview-engine/renderers-QB7HJUTS.mjs +0 -1
  384. package/dist/preview-engine/renderers-QRQVOCDC.mjs +0 -1
  385. package/dist/preview-engine/renderers-QVFHJTZA.mjs +0 -1
  386. package/dist/preview-engine/renderers-R3WQIE4L.mjs +0 -1
  387. package/dist/preview-engine/renderers-SQBVOLG7.mjs +0 -1
  388. package/dist/preview-engine/renderers-TLXMYEDI.mjs +0 -1
  389. package/dist/preview-engine/renderers-X4S3WELJ.mjs +0 -1
  390. package/dist/preview-engine/renderers-XT7U25I7.mjs +0 -1
  391. package/dist/preview-engine/renderers-XVGLMBB3.mjs +0 -1
  392. package/dist/preview-engine/renderers-YUWU3TQZ.mjs +0 -1
  393. package/dist/preview-engine/renderers-ZNUD5OVO.mjs +0 -1
  394. package/dist/renderer-01zxT4CK.mjs +0 -5
  395. package/dist/renderer-35LHkj36.mjs +0 -5
  396. package/dist/renderer-B0OIdCGj.mjs +0 -5
  397. package/dist/renderer-B3IPtkK9.mjs +0 -5
  398. package/dist/renderer-BD25uND8.mjs.map +0 -1
  399. package/dist/renderer-BMC39abo.mjs +0 -5
  400. package/dist/renderer-BQj3nlAI.mjs +0 -5
  401. package/dist/renderer-BnBvSmp_.mjs +0 -5
  402. package/dist/renderer-BsDSpTpL.mjs +0 -5
  403. package/dist/renderer-BtW6_gvE.mjs +0 -5
  404. package/dist/renderer-By8U44Rt.mjs +0 -5
  405. package/dist/renderer-C3lDmxuX.mjs +0 -5
  406. package/dist/renderer-C6SZAE_x.mjs +0 -5
  407. package/dist/renderer-CA3IVeZj.mjs +0 -5
  408. package/dist/renderer-CFoCH_mO.mjs +0 -5
  409. package/dist/renderer-CLhZqJF8.mjs +0 -6
  410. package/dist/renderer-CYJXQS8E.mjs +0 -5
  411. package/dist/renderer-C_vj6_WJ.mjs +0 -5
  412. package/dist/renderer-CeqfC6OR.mjs +0 -5
  413. package/dist/renderer-CkZCGMAc.mjs +0 -5
  414. package/dist/renderer-Clxju1r9.mjs +0 -5
  415. package/dist/renderer-Cvz22ZSh.mjs +0 -3
  416. package/dist/renderer-CyWtKBF7.mjs +0 -5
  417. package/dist/renderer-D27STGoB.mjs +0 -5
  418. package/dist/renderer-D78Aq9YK.mjs +0 -5
  419. package/dist/renderer-DHEffABL.mjs +0 -5
  420. package/dist/renderer-DUuNCgzW.mjs +0 -5
  421. package/dist/renderer-DVD5pzRq.mjs +0 -5
  422. package/dist/renderer-Dsp6xDw5.mjs +0 -5
  423. package/dist/renderer-DuC-BFXR.mjs +0 -5
  424. package/dist/renderer-DuWs_Wsv.mjs +0 -5
  425. package/dist/renderer-OSgsiIrW.mjs +0 -5
  426. package/dist/renderer-OZaMFYtZ.mjs +0 -5
  427. package/dist/renderer-T79TmHET.mjs +0 -5
  428. package/dist/renderer-UhsC9oTU.mjs +0 -5
  429. package/dist/renderer-WYZV1jWf.mjs +0 -5
  430. package/dist/renderer-Y7evDjHH.mjs +0 -5
  431. package/dist/renderer-mcePkmUe.mjs +0 -5
  432. package/dist/src-B0KFNjj4.mjs.map +0 -1
@@ -1,12 +1,12 @@
1
1
  import { G as ProgrammaticSignal, K as Signal, Mt as frameArraySignal, N as MediaSignalRecorder, St as createVirtualMedia, pt as appendOperation, rn as mediaSourceTime, tn as mediaSourceRange, y as Effect$1, yn as resolveFrameRequest } from "./dist-BlIrsfcn.mjs";
2
- import { F as getPrimitiveGeometry, K as mediaDecoderCache, N as generateExtrudedTextGeometry, Z as parseSvgPathToSegments, _ as buildShapeSvgPath, gt as Path3D, p as SlugFontCache, q as parseColor$1, z as inputStore } from "./dist-CFe1fC9l.mjs";
3
- import { a as preflightMediaTime, n as decodeAudioSource } from "./dist-BbwtlSZO.mjs";
4
- import { t as FontManager } from "./fonts-C1mgtkCa.mjs";
2
+ import { F as getPrimitiveGeometry, K as mediaDecoderCache, N as generateExtrudedTextGeometry, Z as parseSvgPathToSegments, _ as buildShapeSvgPath, gt as Path3D, p as SlugFontCache, q as parseColor$1, z as inputStore } from "./dist-C1cCW7Bt.mjs";
3
+ import { a as preflightMediaTime, n as decodeAudioSource } from "./dist-C8Xq3zgx.mjs";
4
+ import { t as FontManager } from "./fonts-BW0pPcvJ.mjs";
5
5
  import { s as TensorPipeline } from "./dist-Buaaj-Ul.mjs";
6
- import { a as COCO17_KEYPOINT_NAMES, d as VisionNode, f as VisionRunner, g as pinNodeToObject, h as pinNodeToLandmark, m as mergeSubjectMask, n as CLIP_SUBJECT, p as analyzeSequence, u as VisionBundle } from "./renderer-BD25uND8.mjs";
7
- import { G as mediaSignalSampler, K as mergeAnimationTracks, N as collectNodeOps, P as compositorToProgram, W as lintComposition, f as LayerAnimation, q as sampleMediaTimeSignal } from "./program-Cq4gP9Dd.mjs";
8
- import { C as effectFactories, H as Dither, I as ColorBalance, K as Iridescence, L as ColorKey, M as CRT, R as Contour, S as Vision, T as Ascii, Y as LayerStyle, _ as SelectiveColor, a as CustomEffect, at as Posterize, b as TileOffset, c as GradientMap, d as Levels, et as OpArt, f as Modulate, g as SSAO, h as Relight3D, ht as Vignette, i as Curves, it as Pixelate, l as HalftoneScreen, m as PBRGlass, nt as Painterly, o as DepthOfField, ot as ProceduralVFX, p as MotionBlur, pt as Toon, q as Kaleidoscope, r as Crop, s as FilmGrain, st as RGBSplit, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "./effects-CCyfjbhZ.mjs";
9
- import { a as HeadlessMediaRenderer, n as renderFrameGrid } from "./renderer-BeFiQfzV.mjs";
6
+ import { _ as pinNodeToObject, a as COCO17_KEYPOINT_NAMES, d as VisionNode, f as VisionRunner, g as pinNodeToLandmark, h as mergeSubjectMask, m as maskObject, n as CLIP_SUBJECT, p as analyzeSequence, u as VisionBundle } from "./renderer-B2P1vgb7.mjs";
7
+ import { G as mediaSignalSampler, K as mergeAnimationTracks, N as collectNodeOps, P as compositorToProgram, W as lintComposition, f as LayerAnimation, q as sampleMediaTimeSignal } from "./program-CKpKkllV.mjs";
8
+ import { C as effectFactories, H as Dither, I as ColorBalance, K as Iridescence, L as ColorKey, M as CRT, R as Contour, S as Vision, T as Ascii, Y as LayerStyle, _ as SelectiveColor, a as CustomEffect, at as Posterize, b as TileOffset, c as GradientMap, d as Levels, et as OpArt, f as Modulate, g as SSAO, h as Relight3D, ht as Vignette, i as Curves, it as Pixelate, l as HalftoneScreen, m as PBRGlass, nt as Painterly, o as DepthOfField, ot as ProceduralVFX, p as MotionBlur, pt as Toon, q as Kaleidoscope, r as Crop, s as FilmGrain, st as RGBSplit, t as ApplyLUT, u as HighPass, v as ShadowsHighlights, w as Blur, x as UnsharpMask, y as TemporalDeflicker } from "./effects-CemgqEPv.mjs";
9
+ import { a as HeadlessMediaRenderer, n as renderFrameGrid } from "./renderer-DPAD6fL1.mjs";
10
10
  import { z, z as z$2 } from "zod";
11
11
  import path from "node:path";
12
12
  import fs from "node:fs/promises";
@@ -1337,6 +1337,19 @@ function translatePath(d, dx, dy) {
1337
1337
  /** Frames looked back over to bridge a gap where the person is lost. */
1338
1338
  const HOLD = 24;
1339
1339
  const CACHE_VERSION = 1;
1340
+ let visionSam;
1341
+ let clipVisionIds = 0;
1342
+ /**
1343
+ * SAM lives in `@framefields/vision-sam`, an optional peer (SAM 3's weights are under Meta's SAM License), so it
1344
+ * is imported only when a clip asks for `sam2` or `sam3`.
1345
+ */
1346
+ function loadVisionSam() {
1347
+ visionSam ??= import("@framefields/vision-sam").catch((cause) => {
1348
+ visionSam = void 0;
1349
+ throw new Error("Prompted sam2/sam3 tracking needs the optional @framefields/vision-sam package. Install it next to framefields.", { cause });
1350
+ });
1351
+ return visionSam;
1352
+ }
1340
1353
  /**
1341
1354
  * Vision results for one clip, computed per frame on demand and shared by
1342
1355
  * everything that reads the clip: physics, layout, signals. Unlike the
@@ -1367,6 +1380,20 @@ var ClipVision = class {
1367
1380
  cell;
1368
1381
  queue = Promise.resolve();
1369
1382
  runner;
1383
+ sam2Tracker;
1384
+ sam2Frame = -1;
1385
+ sam3Tracker;
1386
+ sam3Frame = -1;
1387
+ sam;
1388
+ /** Clips walk their source independently, so each owns a decoder (requests to one supersede). */
1389
+ decoderId = `clip-vision#${++clipVisionIds}#`;
1390
+ signalBundle;
1391
+ publishedSignals = /* @__PURE__ */ new Set();
1392
+ signalMaskFrame = -1;
1393
+ /** Masks of `signalMaskFrame` by track ID (0: all tracks merged). */
1394
+ signalMasks = /* @__PURE__ */ new Map();
1395
+ /** Prompted track count per source frame, including frames where every track is absent. */
1396
+ trackCounts = /* @__PURE__ */ new Map();
1370
1397
  cacheLoaded;
1371
1398
  unsaved = 0;
1372
1399
  unsavedSubjects = 0;
@@ -1380,13 +1407,80 @@ var ClipVision = class {
1380
1407
  /** @internal Use `comp.vision(source, options)`. */
1381
1408
  constructor(source, fps, options = {}) {
1382
1409
  this.source = source;
1383
- this.options = options;
1410
+ if (options.sam2 && options.sam3) throw new Error("Choose one prompted backend: sam2 or sam3.");
1411
+ this.options = options.sam2 ? {
1412
+ ...options,
1413
+ sam2: {
1414
+ ...options.sam2,
1415
+ prompts: options.sam2.prompts.map((prompt) => ({
1416
+ ...prompt,
1417
+ points: prompt.points.map((point) => ({ ...point }))
1418
+ }))
1419
+ }
1420
+ } : options.sam3 ? {
1421
+ ...options,
1422
+ sam3: {
1423
+ ...options.sam3,
1424
+ prompts: (options.sam3.prompts ?? (options.sam3.text ? [{
1425
+ frame: 0,
1426
+ text: options.sam3.text
1427
+ }] : [])).map((prompt) => ({
1428
+ ...prompt,
1429
+ ...prompt.points ? { points: prompt.points.map((point) => ({ ...point })) } : {}
1430
+ }))
1431
+ }
1432
+ } : options;
1384
1433
  this.compositionFps = fps;
1385
1434
  this.fps = options.fps ?? fps;
1386
1435
  this.startFrame = Math.round(options.startFrame ?? 0);
1387
1436
  this.trimStartSec = options.trimStartSec ?? 0;
1388
- this.smoothing = Math.max(0, Math.round(options.smoothing ?? 2));
1437
+ this.smoothing = Math.max(0, Math.round(options.smoothing ?? (options.sam2 || options.sam3 ? 0 : 2)));
1389
1438
  this.cell = Math.max(1, Math.round(options.maskCell ?? 8));
1439
+ if (options.sam2 || options.sam3) this.wantSubjects = true;
1440
+ }
1441
+ /** @internal Explicit selections must never fall back to another detected subject. */
1442
+ get exact() {
1443
+ return this.options.sam2 !== void 0 || this.options.sam3 !== void 0;
1444
+ }
1445
+ /** Object, mask and optional pose signals on the composition clock, in source geometry. */
1446
+ get signals() {
1447
+ this.keepSubjects();
1448
+ this.signalBundle ??= new VisionBundle({
1449
+ fps: this.compositionFps,
1450
+ totalFrames: Number.MAX_SAFE_INTEGER,
1451
+ maskSource: (frame) => this.trackIds(frame).flatMap((id) => {
1452
+ const mask = this.maskAt(frame, id);
1453
+ return mask && mask.area > 0 ? [mask] : [];
1454
+ }),
1455
+ matteSource: (frame) => {
1456
+ const mask = this.maskAt(frame);
1457
+ return mask ? {
1458
+ mask: mask.mask,
1459
+ width: mask.width,
1460
+ height: mask.height,
1461
+ coverage: mask.coverage
1462
+ } : void 0;
1463
+ }
1464
+ });
1465
+ return this.signalBundle;
1466
+ }
1467
+ decoder() {
1468
+ return mediaDecoderCache.getVideo(this.source, true, this.decoderId);
1469
+ }
1470
+ /** Free inference sessions and the decoder. Analysed frames remain readable; later frames replay memory. */
1471
+ release() {
1472
+ mediaDecoderCache.clearNode(this.decoderId);
1473
+ this.sam2Tracker?.release();
1474
+ this.sam2Tracker = void 0;
1475
+ this.sam2Frame = -1;
1476
+ this.sam3Tracker?.release();
1477
+ this.sam3Tracker = void 0;
1478
+ this.sam3Frame = -1;
1479
+ this.runner?.close();
1480
+ this.runner = void 0;
1481
+ this.signalMaskFrame = -1;
1482
+ this.signalMasks.clear();
1483
+ this.publishedSignals.clear();
1390
1484
  }
1391
1485
  /** The tracked person in source pixels; `.place()` maps it into the composition. */
1392
1486
  get person() {
@@ -1400,13 +1494,22 @@ var ClipVision = class {
1400
1494
  */
1401
1495
  ready(frame, toFrame = frame) {
1402
1496
  const [from, to] = this.window(frame, toFrame);
1403
- this.queue = this.queue.then(() => this.compute(from, to));
1404
- return this.queue;
1497
+ const run$1 = this.queue.then(async () => {
1498
+ try {
1499
+ await this.compute(from, to);
1500
+ } catch (error) {
1501
+ this.release();
1502
+ throw error;
1503
+ }
1504
+ if (this.signalBundle) this.publishSignals(Math.min(frame, toFrame), Math.max(frame, toFrame));
1505
+ });
1506
+ this.queue = run$1.catch(() => void 0);
1507
+ return run$1;
1405
1508
  }
1406
1509
  /** True when composition frame `frame` can be read synchronously. */
1407
1510
  isReady(frame) {
1408
1511
  const [from, to] = this.window(frame, frame);
1409
- for (let c = from; c <= to; c++) if (!this.results.has(c)) return false;
1512
+ for (let c = from; c <= to; c++) if (!this.analysed(c)) return false;
1410
1513
  return true;
1411
1514
  }
1412
1515
  /**
@@ -1423,9 +1526,8 @@ var ClipVision = class {
1423
1526
  * subjects kept, null when it holds no subject.
1424
1527
  */
1425
1528
  subject(frame, fps) {
1426
- const c = frame * this.fps / fps;
1427
- if (!this.options.timeRemap && Math.abs(c - Math.round(c)) > 1e-6) return void 0;
1428
- const sourceFrame = this.options.timeRemap ? Math.floor(c + 1e-6) : Math.round(c);
1529
+ const sourceFrame = this.sourceFrame(frame, fps);
1530
+ if (sourceFrame === void 0) return void 0;
1429
1531
  const s = this.subjects.get(sourceFrame);
1430
1532
  if (s === void 0) return s;
1431
1533
  if (s === null || !this.sourceWidth) return null;
@@ -1433,7 +1535,7 @@ var ClipVision = class {
1433
1535
  const height = this.sourceHeight;
1434
1536
  return {
1435
1537
  category: s.category,
1436
- mask: decodeRuns(s, width * height),
1538
+ mask: subjectAlpha(s, width * height),
1437
1539
  width,
1438
1540
  height,
1439
1541
  area: s.area,
@@ -1441,6 +1543,45 @@ var ClipVision = class {
1441
1543
  detectionIndex: -1
1442
1544
  };
1443
1545
  }
1546
+ /**
1547
+ * @internal The pose matched to the subject at a source frame of the clip
1548
+ * (`frame` at `fps`), normalized to the source size, for a render-time
1549
+ * skeleton: undefined until that frame and its smoothing window are
1550
+ * analysed, null when no pose matched there.
1551
+ */
1552
+ pose(frame, fps) {
1553
+ const c = this.sourceFrame(frame, fps);
1554
+ if (c === void 0 || !this.tracksPose || !this.sourceWidth) return;
1555
+ for (let g = c - this.smoothing; g <= c + this.smoothing; g++) if (!this.results.has(Math.max(0, g))) return void 0;
1556
+ if (!this.results.get(c)?.kp) return null;
1557
+ const width = this.sourceWidth;
1558
+ const height = this.sourceHeight;
1559
+ return {
1560
+ width,
1561
+ height,
1562
+ keypoints: Array.from({ length: 17 }, (_, k) => {
1563
+ const [x, y, visibility] = this.keypoint(k, c);
1564
+ return {
1565
+ x: x / width,
1566
+ y: y / height,
1567
+ visibility
1568
+ };
1569
+ })
1570
+ };
1571
+ }
1572
+ /** Whether frames carry keypoints: on by default, opt-in for prompted (SAM) clips. */
1573
+ get tracksPose() {
1574
+ return this.exact ? this.options.pose === true : this.options.pose ?? true;
1575
+ }
1576
+ /**
1577
+ * The analysed source frame a render-time read at `frame` (at `fps`) maps to;
1578
+ * undefined for an unprompted clip read between its analysed frames.
1579
+ */
1580
+ sourceFrame(frame, fps) {
1581
+ const c = frame * this.fps / fps;
1582
+ if (!this.exact && !this.options.timeRemap && Math.abs(c - Math.round(c)) > 1e-6) return void 0;
1583
+ return this.options.timeRemap || this.exact ? Math.floor(c + 1e-6) : Math.round(c);
1584
+ }
1444
1585
  /** Composition frame → clip frame (fractional). */
1445
1586
  clipFrame(frame) {
1446
1587
  if (this.options.timeRemap) return mediaSourceTime(this.options.timeRemap, this.localFrame(frame), this.compositionFps) * this.fps;
@@ -1459,7 +1600,17 @@ var ClipVision = class {
1459
1600
  analysed(c) {
1460
1601
  return this.results.has(c) && (!this.wantSubjects || this.subjects.has(c));
1461
1602
  }
1603
+ /** Loads `@framefields/vision-sam` and validates the prompts once, on first use. */
1604
+ prompted() {
1605
+ this.sam ??= loadVisionSam().then((sam) => {
1606
+ if (this.options.sam2) sam.validateSam2Prompts(this.options.sam2.prompts);
1607
+ if (this.options.sam3) sam.validateSam3Prompts(this.options.sam3);
1608
+ return sam;
1609
+ });
1610
+ return this.sam;
1611
+ }
1462
1612
  async compute(from, to) {
1613
+ if (this.exact) await this.prompted();
1463
1614
  this.cacheLoaded ??= this.loadCache();
1464
1615
  await this.cacheLoaded;
1465
1616
  if (this.wantSubjects) {
@@ -1469,7 +1620,15 @@ var ClipVision = class {
1469
1620
  let missing = false;
1470
1621
  for (let c = from; c <= to; c++) if (!this.analysed(c)) missing = true;
1471
1622
  if (!missing) return;
1472
- const wantPose = this.options.pose ?? true;
1623
+ if (this.options.sam2) {
1624
+ await this.computeSam2(to);
1625
+ return;
1626
+ }
1627
+ if (this.options.sam3) {
1628
+ await this.computeSam3(to);
1629
+ return;
1630
+ }
1631
+ const wantPose = this.tracksPose;
1473
1632
  const wantMask = this.options.mask ?? true;
1474
1633
  this.runner ??= VisionRunner.create({
1475
1634
  modelsDir: this.options.modelsDir,
@@ -1477,7 +1636,7 @@ var ClipVision = class {
1477
1636
  ...this.options.confidence !== void 0 && { confidence: this.options.confidence },
1478
1637
  ...this.options.variant !== void 0 && { variant: this.options.variant }
1479
1638
  });
1480
- const decoder = mediaDecoderCache.getVideo(this.source, true, "clip-vision");
1639
+ const decoder = this.decoder();
1481
1640
  for (let c = from; c <= to; c++) {
1482
1641
  if (this.analysed(c)) continue;
1483
1642
  const image = await decodedPixels(await decoder.getFrame(c / this.fps));
@@ -1532,6 +1691,221 @@ var ClipVision = class {
1532
1691
  if (this.unsaved > 0) await this.saveCache();
1533
1692
  if (this.unsavedSubjects > 0) await this.saveSubjects();
1534
1693
  }
1694
+ async computeSam2(to) {
1695
+ const settings = this.options.sam2;
1696
+ if (!settings) return;
1697
+ const first = settings.prompts[0]?.frame ?? 0;
1698
+ for (let frame = 0; frame < Math.min(first, to + 1); frame++) {
1699
+ this.results.set(frame, {
1700
+ kp: null,
1701
+ mask: null,
1702
+ score: 0
1703
+ });
1704
+ this.subjects.set(frame, null);
1705
+ }
1706
+ if (to < first) return;
1707
+ const decoder = this.decoder();
1708
+ if (!this.sam2Tracker) {
1709
+ const frameCount = Math.max(1, Math.ceil(await decoder.durationSec() * this.fps - 1e-6));
1710
+ if (settings.prompts.some((prompt) => prompt.frame >= frameCount)) throw new Error("SAM 2 prompt frames must be inside the source video.");
1711
+ const { Sam2Tracker } = await this.prompted();
1712
+ this.sam2Tracker = await Sam2Tracker.create({
1713
+ modelsDir: this.options.modelsDir,
1714
+ baseUrl: this.options.baseUrl,
1715
+ frameCount,
1716
+ model: settings.model
1717
+ });
1718
+ this.sam2Frame = first - 1;
1719
+ }
1720
+ for (let frame = this.sam2Frame + 1; frame <= to; frame++) {
1721
+ const image = await decodedPixels(await decoder.getFrame(frame / this.fps));
1722
+ if (!image) throw new Error(`Cannot decode SAM 2 source frame ${frame}.`);
1723
+ if (!this.sourceWidth) this.setSize(image.width, image.height);
1724
+ const prompt = settings.prompts.find((item) => item.frame === frame);
1725
+ const result$1 = await this.sam2Tracker.process(image, frame, prompt?.points);
1726
+ const kp = this.tracksPose ? await this.matchedPose(image, result$1.mask) : null;
1727
+ this.storeSamFrame(frame, result$1.width, result$1.height, [result$1], kp);
1728
+ if (this.unsaved >= 24) {
1729
+ await this.saveCache();
1730
+ await this.saveSubjects();
1731
+ }
1732
+ }
1733
+ await this.saveCache();
1734
+ await this.saveSubjects();
1735
+ }
1736
+ async computeSam3(to) {
1737
+ const settings = this.options.sam3;
1738
+ if (!settings) return;
1739
+ const first = settings.prompts[0]?.frame ?? 0;
1740
+ for (let frame = 0; frame < Math.min(first, to + 1); frame++) {
1741
+ this.results.set(frame, {
1742
+ kp: null,
1743
+ mask: null,
1744
+ score: 0
1745
+ });
1746
+ this.subjects.set(frame, null);
1747
+ }
1748
+ if (to < first) return;
1749
+ const decoder = this.decoder();
1750
+ if (!this.sam3Tracker) {
1751
+ const frameCount = Math.max(1, Math.ceil(await decoder.durationSec() * this.fps - 1e-6));
1752
+ if (settings.prompts.some((prompt) => prompt.frame >= frameCount)) throw new Error("SAM 3 prompt frames must be inside the source video.");
1753
+ const { Sam3Tracker } = await this.prompted();
1754
+ this.sam3Tracker = await Sam3Tracker.create({
1755
+ modelsDir: this.options.modelsDir,
1756
+ baseUrl: this.options.baseUrl,
1757
+ frameCount,
1758
+ textThreshold: settings.textThreshold,
1759
+ maxObjects: settings.maxObjects,
1760
+ merge: settings.merge,
1761
+ redetect: settings.redetect,
1762
+ precision: settings.precision,
1763
+ acceptLicense: this.options.acceptSamLicense ?? this.options.sam3?.acceptLicense
1764
+ });
1765
+ this.sam3Frame = first - 1;
1766
+ }
1767
+ for (let frame = this.sam3Frame + 1; frame <= to; frame++) {
1768
+ const image = await decodedPixels(await decoder.getFrame(frame / this.fps));
1769
+ if (!image) throw new Error(`Cannot decode SAM 3 source frame ${frame}.`);
1770
+ if (!this.sourceWidth) this.setSize(image.width, image.height);
1771
+ const prompt = settings.prompts.find((item) => item.frame === frame);
1772
+ const result$1 = await this.sam3Tracker.process(image, frame, prompt);
1773
+ const kp = this.tracksPose ? await this.matchedPose(image, unionMask(result$1.objects, image)) : null;
1774
+ this.storeSamFrame(frame, result$1.width, result$1.height, result$1.objects, kp);
1775
+ if (this.unsaved >= 24) {
1776
+ await this.saveCache();
1777
+ await this.saveSubjects();
1778
+ }
1779
+ }
1780
+ await this.saveCache();
1781
+ await this.saveSubjects();
1782
+ }
1783
+ /** Stores a prompted frame: every track's mask as one label map, the union as the subject. */
1784
+ storeSamFrame(frame, width, height, objects, kp) {
1785
+ const labels = new Uint8Array(width * height);
1786
+ const order = [...objects.keys()].sort((a, b) => (objects[a]?.score ?? 0) - (objects[b]?.score ?? 0));
1787
+ for (const index of order) {
1788
+ const mask = objects[index]?.mask;
1789
+ if (!mask) continue;
1790
+ for (let i = 0; i < mask.length; i++) if ((mask[i] ?? 0) >= 128) labels[i] = index + 1;
1791
+ }
1792
+ const union = Uint8Array.from(labels, (id) => id ? 255 : 0);
1793
+ const grid = new Uint8Array(this.cellW * this.cellH);
1794
+ downsampleMean(union, width, height, this.cell, grid, this.cellW, this.cellH);
1795
+ let area$1 = 0;
1796
+ for (const id of labels) if (id) area$1++;
1797
+ const scores = objects.map((o) => 1 / (1 + Math.exp(-o.score)));
1798
+ this.results.set(frame, {
1799
+ kp,
1800
+ mask: grid,
1801
+ score: Math.max(0, ...scores)
1802
+ });
1803
+ this.subjects.set(frame, area$1 > 0 ? {
1804
+ category: this.samCategory(),
1805
+ area: area$1,
1806
+ scores,
1807
+ ...encodeRuns(labels)
1808
+ } : null);
1809
+ this.trackCounts.set(frame, objects.length);
1810
+ this.blurred.delete(frame);
1811
+ if (this.options.sam3) this.sam3Frame = frame;
1812
+ else this.sam2Frame = frame;
1813
+ this.unsaved++;
1814
+ this.unsavedSubjects++;
1815
+ }
1816
+ samCategory() {
1817
+ return this.options.sam2?.category ?? this.options.sam3?.category ?? "object";
1818
+ }
1819
+ async matchedPose(image, mask) {
1820
+ this.runner ??= VisionRunner.create({
1821
+ modelsDir: this.options.modelsDir,
1822
+ baseUrl: this.options.baseUrl,
1823
+ variant: this.options.variant
1824
+ });
1825
+ const { people } = await this.runner.pose(image);
1826
+ const match = people.map((person) => ({
1827
+ person,
1828
+ overlap: person.keypoints.reduce((sum, point) => {
1829
+ const x = Math.max(0, Math.min(image.width - 1, Math.round(point.x)));
1830
+ return sum + (mask[Math.max(0, Math.min(image.height - 1, Math.round(point.y))) * image.width + x] ?? 0) / 255 * point.visibility;
1831
+ }, 0)
1832
+ })).sort((a, b) => b.overlap - a.overlap)[0];
1833
+ if (!match || match.overlap < 2) return null;
1834
+ return Float32Array.from(match.person.keypoints.flatMap((point) => [
1835
+ point.x,
1836
+ point.y,
1837
+ point.visibility
1838
+ ]));
1839
+ }
1840
+ /** Track IDs at a composition frame: every prompted track, else the one subject. */
1841
+ trackIds(frame) {
1842
+ const c = Math.max(0, Math.floor(this.clipFrame(frame)));
1843
+ const count = this.subjects.get(c)?.scores?.length ?? this.trackCounts.get(c) ?? 1;
1844
+ return Array.from({ length: count }, (_, i) => i + 1);
1845
+ }
1846
+ /** The subject (all tracks merged) or, with `id`, one track's mask, in source pixels. */
1847
+ maskAt(frame, id) {
1848
+ const c = Math.max(0, Math.floor(this.clipFrame(frame)));
1849
+ if (this.signalMaskFrame !== c) {
1850
+ this.signalMaskFrame = c;
1851
+ this.signalMasks.clear();
1852
+ }
1853
+ const hit = this.signalMasks.get(id ?? 0);
1854
+ if (hit) return hit;
1855
+ if (!this.results.has(c) || !this.sourceWidth) return void 0;
1856
+ const stored = this.subjects.get(c);
1857
+ const size$1 = this.sourceWidth * this.sourceHeight;
1858
+ const data = stored ? subjectAlpha(stored, size$1, id) : new Uint8Array(size$1);
1859
+ let area$1 = stored?.area ?? 0;
1860
+ if (id !== void 0 && stored?.scores) {
1861
+ area$1 = 0;
1862
+ for (const alpha of data) if (alpha) area$1++;
1863
+ }
1864
+ const mask = {
1865
+ category: stored?.category ?? this.samCategory(),
1866
+ mask: data,
1867
+ width: this.sourceWidth,
1868
+ height: this.sourceHeight,
1869
+ area: area$1,
1870
+ coverage: area$1 / size$1,
1871
+ detectionIndex: (id ?? 1) - 1,
1872
+ trackId: id ?? 1
1873
+ };
1874
+ this.signalMasks.set(id ?? 0, mask);
1875
+ return mask;
1876
+ }
1877
+ publishSignals(from, to) {
1878
+ const bundle = this.signalBundle;
1879
+ if (!bundle || !this.sourceWidth) return;
1880
+ bundle.setFrameSize(this.sourceWidth, this.sourceHeight);
1881
+ for (let frame = from; frame <= to; frame++) {
1882
+ if (this.publishedSignals.has(frame)) continue;
1883
+ this.publishedSignals.add(frame);
1884
+ const c = Math.max(0, Math.floor(this.clipFrame(frame)));
1885
+ const mask = this.maskAt(frame);
1886
+ if (!mask) continue;
1887
+ const before = bundle.getObjectResult(frame - 1).objects;
1888
+ const scores = this.subjects.get(c)?.scores;
1889
+ const objects = this.trackIds(frame).flatMap((id) => {
1890
+ const track = this.maskAt(frame, id);
1891
+ if (!track) return [];
1892
+ return [maskObject(track, frame, this.compositionFps, scores?.[id - 1] ?? this.results.get(c)?.score ?? 1, before.find((object$1) => object$1.trackId === id))];
1893
+ });
1894
+ bundle.setObjectResult(frame, objects);
1895
+ const object = objects[0] ?? maskObject(mask, frame, this.compositionFps, 0);
1896
+ const kp = this.results.get(c)?.kp;
1897
+ bundle.setPoseResult(frame, { people: kp ? [{
1898
+ score: object.score,
1899
+ boundingBox: object.boundingBox,
1900
+ trackId: 1,
1901
+ keypoints: Array.from({ length: 17 }, (_, i) => ({
1902
+ x: (kp[i * 3] ?? 0) / mask.width,
1903
+ y: (kp[i * 3 + 1] ?? 0) / mask.height,
1904
+ visibility: kp[i * 3 + 2] ?? 0
1905
+ }))
1906
+ }] : [] });
1907
+ }
1908
+ }
1535
1909
  setSize(width, height) {
1536
1910
  this.sourceWidth = width;
1537
1911
  this.sourceHeight = height;
@@ -1591,7 +1965,7 @@ var ClipVision = class {
1591
1965
  c = Math.max(0, c);
1592
1966
  if (this.blurred.has(c)) return this.blurred.get(c) ?? null;
1593
1967
  this.mustHave(c);
1594
- const mask = bridgedMask(this.results, c, this.smoothing);
1968
+ const mask = this.exact ? this.results.get(c)?.mask ?? null : bridgedMask(this.results, c, this.smoothing);
1595
1969
  const grid = mask ? boxBlur(mask, this.cellW, this.cellH, 2) : null;
1596
1970
  this.blurred.set(c, grid);
1597
1971
  return grid;
@@ -1624,17 +1998,28 @@ var ClipVision = class {
1624
1998
  const stat = fs$1.statSync(this.source);
1625
1999
  const dir = this.options.cacheDir ?? process.env.FRAMEFIELDS_VISION_CACHE_DIR ?? path$1.join(os.homedir(), ".cache", "framefields", "vision");
1626
2000
  const o = this.options;
2001
+ const sam = this.exact ? await this.prompted() : void 0;
1627
2002
  const key = JSON.stringify([
1628
2003
  CACHE_VERSION,
1629
2004
  path$1.resolve(this.source),
1630
2005
  stat.size,
1631
2006
  stat.mtimeMs,
1632
2007
  this.fps,
1633
- o.pose ?? true,
2008
+ this.tracksPose,
1634
2009
  o.mask ?? true,
1635
2010
  this.cell,
1636
2011
  o.variant ?? "s",
1637
- o.confidence ?? null
2012
+ o.confidence ?? null,
2013
+ ...o.sam2 ? [[
2014
+ sam?.sam2Revision(o.sam2.model),
2015
+ o.sam2,
2016
+ 3
2017
+ ]] : [],
2018
+ ...o.sam3 && sam ? [[
2019
+ sam.sam3Revision(await sam.sam3Precision(void 0, o.sam3.precision)),
2020
+ o.sam3,
2021
+ 3
2022
+ ]] : []
1638
2023
  ]);
1639
2024
  const hash = crypto.createHash("sha256").update(key).digest("hex").slice(0, 24);
1640
2025
  fs$1.mkdirSync(dir, { recursive: true });
@@ -1655,6 +2040,7 @@ var ClipVision = class {
1655
2040
  this.setSize(json.width, json.height);
1656
2041
  for (const [c, r] of Object.entries(json.frames)) this.results.set(Number(c), {
1657
2042
  kp: r.kp ? Float32Array.from(r.kp) : null,
2043
+ score: r.score,
1658
2044
  mask: r.mask ? new Uint8Array(Buffer.from(r.mask, "base64")) : null
1659
2045
  });
1660
2046
  } catch {}
@@ -1666,7 +2052,8 @@ var ClipVision = class {
1666
2052
  const frames = {};
1667
2053
  for (const [c, r] of this.results) frames[c] = {
1668
2054
  kp: r.kp ? Array.from(r.kp, (v) => Math.round(v * 100) / 100) : null,
1669
- mask: r.mask ? Buffer.from(r.mask).toString("base64") : null
2055
+ mask: r.mask ? Buffer.from(r.mask).toString("base64") : null,
2056
+ score: r.score
1670
2057
  };
1671
2058
  const fs$1 = await import("node:fs");
1672
2059
  const tmp = `${file}.${process.pid}.tmp`;
@@ -1697,6 +2084,7 @@ var ClipVision = class {
1697
2084
  this.subjects.set(Number(c), s && {
1698
2085
  category: s.category,
1699
2086
  area: s.area,
2087
+ ...s.scores && { scores: s.scores },
1700
2088
  values: new Uint8Array(Buffer.from(s.values, "base64")),
1701
2089
  lengths: new Uint32Array(lengths.buffer.slice(lengths.byteOffset, lengths.byteOffset + lengths.byteLength))
1702
2090
  });
@@ -1711,6 +2099,7 @@ var ClipVision = class {
1711
2099
  for (const [c, s] of this.subjects) frames[c] = s && {
1712
2100
  category: s.category,
1713
2101
  area: s.area,
2102
+ ...s.scores && { scores: s.scores },
1714
2103
  values: Buffer.from(s.values).toString("base64"),
1715
2104
  lengths: Buffer.from(s.lengths.buffer, s.lengths.byteOffset, s.lengths.byteLength).toString("base64")
1716
2105
  };
@@ -1993,6 +2382,18 @@ function boxBlur(src, w, h, r) {
1993
2382
  }
1994
2383
  return dst;
1995
2384
  }
2385
+ /** A stored subject as 0/255 alpha: label maps merge every track, or keep track `id` only. */
2386
+ function subjectAlpha(stored, size$1, id) {
2387
+ const values = decodeRuns(stored, size$1);
2388
+ if (!stored.scores) return values;
2389
+ return values.map((label) => (id === void 0 ? label > 0 : label === id) ? 255 : 0);
2390
+ }
2391
+ /** Every track's mask merged, for matching one pose to the whole selection. */
2392
+ function unionMask(objects, image) {
2393
+ const union = new Uint8Array(image.width * image.height);
2394
+ for (const { mask } of objects) for (let i = 0; i < union.length; i++) union[i] = Math.max(union[i] ?? 0, mask[i] ?? 0);
2395
+ return union;
2396
+ }
1996
2397
 
1997
2398
  //#endregion
1998
2399
  //#region src/media-signals.ts
@@ -8199,16 +8600,17 @@ var Composition = class Composition {
8199
8600
  * frame — physics, particles — always find every frame before it.
8200
8601
  */
8201
8602
  async prepareVision(frame) {
8202
- this.linkClipMattes();
8603
+ this.linkClipLayers();
8203
8604
  await Promise.all([...this._clipVision.values()].map((clip) => clip.ready(0, frame)));
8204
8605
  }
8205
8606
  /**
8206
- * Points matte-family `withVision` layers at the `comp.vision` clip they
8207
- * show, so the cutout reuses that clip's per-frame subject instead of
8208
- * segmenting the frame again during render. Only layers whose settings
8209
- * would give the same subject are linked; the rest keep their own pass.
8607
+ * Points matte-family and skeleton `withVision` layers at the `comp.vision`
8608
+ * clip they show, so the cutout reuses that clip's per-frame subject and the
8609
+ * skeleton draws its matched pose, instead of analysing the frame again
8610
+ * during render. Only layers whose settings would give the same subject are
8611
+ * linked; the rest keep their own pass.
8210
8612
  */
8211
- linkClipMattes() {
8613
+ linkClipLayers() {
8212
8614
  if (this._clipVision.size === 0) return;
8213
8615
  let layers;
8214
8616
  const walk = (node) => {
@@ -8220,13 +8622,13 @@ var Composition = class Composition {
8220
8622
  return [op.id, op];
8221
8623
  }));
8222
8624
  const layer = layers.get(n.id);
8223
- const clip = this.clipForMatte(n.src ?? n.inputHandleId, n.vision, {
8625
+ const clip = this.clipForLayer(n.src ?? n.inputHandleId, n.vision, {
8224
8626
  trimStartSec: n.trimStartSec,
8225
8627
  startFrame: layer?.startFrame ?? n.startFrame,
8226
8628
  timeRemap: layer?.timeRemap
8227
8629
  });
8228
8630
  if (clip) {
8229
- clip.keepSubjects();
8631
+ if (n.vision.mode !== "skeleton") clip.keepSubjects();
8230
8632
  Object.defineProperty(n.vision, CLIP_SUBJECT, {
8231
8633
  value: clip,
8232
8634
  enumerable: false,
@@ -8238,13 +8640,21 @@ var Composition = class Composition {
8238
8640
  };
8239
8641
  for (const child of this.children) walk(child);
8240
8642
  }
8241
- clipForMatte(source, v, layer) {
8643
+ /** The `comp.vision` clip a matte or skeleton layer of the same source reads instead of analysing. */
8644
+ clipForLayer(source, v, layer) {
8242
8645
  const mode = v.mode ?? "passthrough";
8243
- if (mode !== "matte" && mode !== "mask" && mode !== "crop") return;
8244
- if (v.matteSource === "selfie" || v.keyBackground === true || v.classes !== void 0 || v.enablePose === true || v.enableMatte === true || v.visionBundle !== void 0 || (v.maskThreshold ?? .5) !== .5 || v.featherRadius !== void 0) return;
8646
+ const skeleton = mode === "skeleton";
8647
+ if (mode !== "matte" && mode !== "mask" && mode !== "crop" && !skeleton) return;
8648
+ if (v.classes !== void 0 || v.enableMatte === true || v.visionBundle !== void 0 || !skeleton && (v.matteSource === "selfie" || v.keyBackground === true || v.enablePose === true || (v.maskThreshold ?? .5) !== .5 || v.featherRadius !== void 0)) return;
8245
8649
  for (const clip of this._clipVision.values()) {
8246
8650
  const o = clip.options;
8247
- if (clip.source === source && clip.startFrame === (layer.startFrame ?? 0) && clip.trimStartSec === (layer.trimStartSec ?? 0) && remapKey(o.timeRemap) === remapKey(layer.timeRemap) && (o.variant ?? "s") === (v.variant ?? "s") && (o.confidence ?? .3) === (v.confidence ?? .3)) return clip;
8651
+ if (clip.source === source && clip.startFrame === (layer.startFrame ?? 0) && clip.trimStartSec === (layer.trimStartSec ?? 0) && remapKey(o.timeRemap) === remapKey(layer.timeRemap) && (o.variant ?? "s") === (v.variant ?? "s") && (o.confidence ?? .3) === (v.confidence ?? .3)) {
8652
+ if (skeleton && !clip.tracksPose) {
8653
+ if (clip.exact) throw new Error("A skeleton layer of a prompted comp.vision clip needs `pose: true` on that clip.");
8654
+ continue;
8655
+ }
8656
+ return clip;
8657
+ }
8248
8658
  }
8249
8659
  }
8250
8660
  /**
@@ -9457,4 +9867,4 @@ const Effect = Object.assign(Effect$1, effectFactories, {
9457
9867
 
9458
9868
  //#endregion
9459
9869
  export { glyphAnimator as $, wordRanges as $t, boilKeys as A, squigglePath as At, defineTheme as B, themes as Bt, audioLevelsSchema as C, span as Cn, scaleFrames as Ct, basePropsSchema as D, FRAMEFIELDS_AI_PROXY_URL as Dn, springKeys as Dt, bandEdges as E, ApiError as En, springAt as Et, constantExpression as F, surfaceFill as Ft, elevationStyle as G, transparent as Gt, drawOnKeys as H, toPathData as Ht, contrastRatio as I, targetPoint as It, evaluateEase as J, windowExpression as Jt, ellipsePath as K, typingFrames as Kt, cover as L, targetSchema as Lt, boxPath as M, staggerRanks as Mt, catmullRom as N, stepExpression as Nt, beats as O, ValidationError as On, springSettleFrames as Ot, chain as P, supersede as Pt, frameSpan as Q, wobblePoints as Qt, defineComponent as R, textLayout as Rt, ascending as S, size as Sn, safeArea as St, bakeSamples as T, sup as Tn, smoothRelease as Tt, ease as U, toSeconds as Ut, dist as V, toFrames as Vt, elevate as W, transformPathData as Wt, exitAnimation as X, withDefaults as Xt, evaluateGlyphExpression as Y, withAlpha as Yt, findRange as Z, within as Zt, after as _, italic as _n, resampleBands as _t, Media as a, PhysicsWorld2D as an, last as at, arcPath as b, parseMarkup as bn, rng as bt, section as c, Layer3D as cn, lineShift as ct, analyzeAudio as d, PersonTrack as dn, offsetCues as dt, Styles as en, hashRng as et, KeyBook as f, DEFAULT_CHART_COLORS as fn, parseColor as ft, UNIT_INDEX as g, color as gn, rendererChars as gt, Track as h, code as hn, rangeRects as ht, Light as i, PhysicsBody2D as in, isLight as it, boundsOf as j, staggerOffsets as jt, bind as k, ai as kn, springTrack as kt, bindComponent as l, Particles as ln, luminance as lt, SAFE_INSETS as m, bold as mn, quantize as mt, Effect as n, PhysicsBody3D as nn, holdFirstKeys as nt, blurRegion as o, Lighting as on, lerp2 as ot, MOTION_PRESETS as p, accent as pn, pulseKeys as pt, enterAnimation as q, valueAt as qt, Layer as r, PhysicsWorld3D as rn, inkOn as rt, editTrackedRegion as s, Transition as sn, linePath as st, Composition as t, Physics as tn, hashString as tt, z$2 as u, ClipVision as un, mix as ut, analyzeChannels as v, mark as vn, resolveMotion as vt, bakeFunction as w, sub as wn, scheduleExpression as wt, arrowPaths as x, rich as xn, round as xt, anchorPoint as y, normalizeTextSpans as yn, resolveTarget as yt, defineMeta as z, themeFrames as zt };
9460
- //# sourceMappingURL=src-B0KFNjj4.mjs.map
9870
+ //# sourceMappingURL=src-DFEqficI.mjs.map