framefields 2.1.3 → 2.2.0-beta.1

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 (258) hide show
  1. package/README.md +48 -618
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-CfBpzxn9.d.mts → audio-1QquqDJs.d.mts} +3 -3
  5. package/dist/{audio-CfBpzxn9.d.mts.map → audio-1QquqDJs.d.mts.map} +1 -1
  6. package/dist/{audio-DqaHxtG3.mjs → audio-BYqbtdH8.mjs} +3 -3
  7. package/dist/{audio-DqaHxtG3.mjs.map → audio-BYqbtdH8.mjs.map} +1 -1
  8. package/dist/{dist-BgFYDCoL.mjs → dist-BLbXEC6V.mjs} +2 -2
  9. package/dist/{dist-BgFYDCoL.mjs.map → dist-BLbXEC6V.mjs.map} +1 -1
  10. package/dist/{dist-Cog5jyVI.mjs → dist-DQlYw4eG.mjs} +44 -4
  11. package/dist/dist-DQlYw4eG.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +35 -35
  14. package/dist/{effects-CXrmO68D.mjs → effects-DgpPr38s.mjs} +2 -2
  15. package/dist/{effects-CXrmO68D.mjs.map → effects-DgpPr38s.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-BUVSUWXJ.mjs → fonts-DakFEiDw.mjs} +2 -2
  18. package/dist/{fonts-BUVSUWXJ.mjs.map → fonts-DakFEiDw.mjs.map} +1 -1
  19. package/dist/{gpu-Bj08zUc5.mjs → gpu-AbcLcr1f.mjs} +2 -2
  20. package/dist/{gpu-Bj08zUc5.mjs.map → gpu-AbcLcr1f.mjs.map} +1 -1
  21. package/dist/{index-Cpkzy5XR.d.mts → index--1jnkoBj.d.mts} +20 -2
  22. package/dist/index--1jnkoBj.d.mts.map +1 -0
  23. package/dist/{index-BzQc812z.d.mts → index-BqzHDFkU.d.mts} +3 -3
  24. package/dist/{index-BzQc812z.d.mts.map → index-BqzHDFkU.d.mts.map} +1 -1
  25. package/dist/{index-DpWia6iH.d.mts → index-CaZfxDXx.d.mts} +27 -3
  26. package/dist/index-CaZfxDXx.d.mts.map +1 -0
  27. package/dist/{index-Fciq8bcC.d.mts → index-D6_KcajH.d.mts} +2 -2
  28. package/dist/{index-Fciq8bcC.d.mts.map → index-D6_KcajH.d.mts.map} +1 -1
  29. package/dist/{index-D__HdInU.d.mts → index-DLbtJPrc.d.mts} +23 -12
  30. package/dist/index-DLbtJPrc.d.mts.map +1 -0
  31. package/dist/{index--0vVZDPM.d.mts → index-DgJIBC_N.d.mts} +3 -3
  32. package/dist/{index--0vVZDPM.d.mts.map → index-DgJIBC_N.d.mts.map} +1 -1
  33. package/dist/index.d.mts +16 -9
  34. package/dist/index.d.mts.map +1 -1
  35. package/dist/index.mjs +50 -50
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/preview/index.d.mts +2 -2
  38. package/dist/preview/index.mjs +10 -10
  39. package/dist/{preview-BOqCRCgp.mjs → preview-BQ3BhcVX.mjs} +2 -2
  40. package/dist/{preview-BOqCRCgp.mjs.map → preview-BQ3BhcVX.mjs.map} +1 -1
  41. package/dist/preview-engine/audio.mjs +1 -1
  42. package/dist/preview-engine/{chunk-JJ5EF3EY.mjs → chunk-2W4BMOAZ.mjs} +1 -1
  43. package/dist/preview-engine/chunk-7OMK352W.mjs +1 -0
  44. package/dist/preview-engine/chunk-FJH5A2PV.mjs +1 -0
  45. package/dist/preview-engine/{chunk-USM33CF5.mjs → chunk-HFUA47QH.mjs} +1 -1
  46. package/dist/preview-engine/chunk-K7M5EIFC.mjs +98 -0
  47. package/dist/preview-engine/{chunk-5DOD2NVY.mjs → chunk-MOW55DX2.mjs} +1 -1
  48. package/dist/preview-engine/chunk-VUFDQJ2B.mjs +1 -0
  49. package/dist/preview-engine/{chunk-ZIIFTWDH.mjs → chunk-XETMNJVV.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-AE2336RK.mjs → chunk-Z457JJCO.mjs} +1 -1
  51. package/dist/preview-engine/effects.mjs +1 -1
  52. package/dist/preview-engine/framefields.mjs +21 -21
  53. package/dist/preview-engine/player.mjs +1 -1
  54. package/dist/preview-engine/{renderers-57WDL6XN.mjs → renderers-HVTQ2B3H.mjs} +1 -1
  55. package/dist/preview-engine/{renderers-BH5MXUTT.mjs → renderers-OZYUGZG7.mjs} +1 -1
  56. package/dist/preview-engine/{renderers-2SVWAB42.mjs → renderers-UHYNEWQD.mjs} +1 -1
  57. package/dist/preview-engine/signals.mjs +1 -1
  58. package/dist/{program-D8JoVobr.mjs → program-Cc_2_YXn.mjs} +2 -2
  59. package/dist/{program-D8JoVobr.mjs.map → program-Cc_2_YXn.mjs.map} +1 -1
  60. package/dist/renderer/index.d.mts +3 -3
  61. package/dist/renderer/index.mjs +3 -3
  62. package/dist/{renderer-B9ProG0Z.mjs → renderer-2DjggBBS.mjs} +2 -2
  63. package/dist/{renderer-B9ProG0Z.mjs.map → renderer-2DjggBBS.mjs.map} +1 -1
  64. package/dist/{renderer-CBBhVrwO.mjs → renderer-4GYrnTfw.mjs} +2 -2
  65. package/dist/{renderer-CBBhVrwO.mjs.map → renderer-4GYrnTfw.mjs.map} +1 -1
  66. package/dist/renderer-9ETXaINw.mjs +5 -0
  67. package/dist/renderer-B3MVDN_e.mjs +5 -0
  68. package/dist/{renderer-CZ7-42SE.mjs → renderer-B4cnT3ce.mjs} +3 -3
  69. package/dist/{renderer-CZ7-42SE.mjs.map → renderer-B4cnT3ce.mjs.map} +1 -1
  70. package/dist/{renderer-0dD1VQsz.mjs → renderer-B5PFBOjv.mjs} +3 -3
  71. package/dist/{renderer-0dD1VQsz.mjs.map → renderer-B5PFBOjv.mjs.map} +1 -1
  72. package/dist/renderer-B6iUuWcx.mjs +6 -0
  73. package/dist/renderer-B8IdU-7S.mjs +5 -0
  74. package/dist/renderer-BEGJCxuL.mjs +5 -0
  75. package/dist/{renderer-BlTPu9QT.mjs → renderer-BEzUirF0.mjs} +2 -2
  76. package/dist/{renderer-BlTPu9QT.mjs.map → renderer-BEzUirF0.mjs.map} +1 -1
  77. package/dist/{renderer-ByGPFIu2.mjs → renderer-BKd2nRnO.mjs} +2 -2
  78. package/dist/{renderer-ByGPFIu2.mjs.map → renderer-BKd2nRnO.mjs.map} +1 -1
  79. package/dist/renderer-BLAkNFx7.mjs +5 -0
  80. package/dist/{renderer--2bwnzBi.mjs → renderer-BN0CzoG_.mjs} +2 -2
  81. package/dist/{renderer--2bwnzBi.mjs.map → renderer-BN0CzoG_.mjs.map} +1 -1
  82. package/dist/{renderer-aw8EsrS9.mjs → renderer-BNcsS03m.mjs} +2 -2
  83. package/dist/{renderer-aw8EsrS9.mjs.map → renderer-BNcsS03m.mjs.map} +1 -1
  84. package/dist/{renderer-Bs_f_App.d.mts → renderer-BO-7bYa5.d.mts} +2 -2
  85. package/dist/{renderer-Bs_f_App.d.mts.map → renderer-BO-7bYa5.d.mts.map} +1 -1
  86. package/dist/{renderer--JBbEfTc.mjs → renderer-BPMywsr4.mjs} +3 -3
  87. package/dist/{renderer--JBbEfTc.mjs.map → renderer-BPMywsr4.mjs.map} +1 -1
  88. package/dist/renderer-BVNhv2ft.mjs +5 -0
  89. package/dist/renderer-BaXTEIe0.mjs +5 -0
  90. package/dist/{renderer-BeuG4dyz.mjs → renderer-Bfrwo_It.mjs} +2 -2
  91. package/dist/{renderer-BeuG4dyz.mjs.map → renderer-Bfrwo_It.mjs.map} +1 -1
  92. package/dist/{renderer-DT1bySqu.mjs → renderer-BhxQzrHF.mjs} +2 -2
  93. package/dist/{renderer-DT1bySqu.mjs.map → renderer-BhxQzrHF.mjs.map} +1 -1
  94. package/dist/renderer-BjeA7s36.mjs +5 -0
  95. package/dist/renderer-BtGNxEay.mjs +5 -0
  96. package/dist/renderer-BvZg2RJG.mjs +5 -0
  97. package/dist/{renderer-BaYEXoS3.mjs → renderer-C2eBC0FB.mjs} +3 -3
  98. package/dist/{renderer-BaYEXoS3.mjs.map → renderer-C2eBC0FB.mjs.map} +1 -1
  99. package/dist/{renderer-B7jZuO6k.mjs → renderer-C4UqxwcT.mjs} +2 -2
  100. package/dist/{renderer-B7jZuO6k.mjs.map → renderer-C4UqxwcT.mjs.map} +1 -1
  101. package/dist/{renderer-Bm0W9qgc.mjs → renderer-C6u-XrH-.mjs} +3 -3
  102. package/dist/{renderer-Bm0W9qgc.mjs.map → renderer-C6u-XrH-.mjs.map} +1 -1
  103. package/dist/{renderer-BNyDJZzl.mjs → renderer-CB87_0vL.mjs} +3 -3
  104. package/dist/{renderer-BNyDJZzl.mjs.map → renderer-CB87_0vL.mjs.map} +1 -1
  105. package/dist/{renderer-FSCTtHrt.mjs → renderer-CD38wGmN.mjs} +2 -2
  106. package/dist/{renderer-FSCTtHrt.mjs.map → renderer-CD38wGmN.mjs.map} +1 -1
  107. package/dist/{renderer-ClIXn9ZU.mjs → renderer-CGZqCmf2.mjs} +2 -2
  108. package/dist/{renderer-ClIXn9ZU.mjs.map → renderer-CGZqCmf2.mjs.map} +1 -1
  109. package/dist/{renderer-CVD0oPsf.mjs → renderer-CHkqgIOL.mjs} +2 -2
  110. package/dist/{renderer-CVD0oPsf.mjs.map → renderer-CHkqgIOL.mjs.map} +1 -1
  111. package/dist/{renderer-Dj_K1f1T.mjs → renderer-CK0u3Psf.mjs} +3 -3
  112. package/dist/{renderer-Dj_K1f1T.mjs.map → renderer-CK0u3Psf.mjs.map} +1 -1
  113. package/dist/renderer-CLW6tUUn.mjs +5 -0
  114. package/dist/{renderer-BJ_GtjUk.mjs → renderer-CO4theVJ.mjs} +2 -2
  115. package/dist/{renderer-KcV0gCO5.mjs → renderer-CPW9o3Lc.mjs} +3 -3
  116. package/dist/{renderer-KcV0gCO5.mjs.map → renderer-CPW9o3Lc.mjs.map} +1 -1
  117. package/dist/renderer-CS-ojgJk.mjs +5 -0
  118. package/dist/{renderer-BwBc5xNu.mjs → renderer-CSfLMXN8.mjs} +3 -3
  119. package/dist/{renderer-BwBc5xNu.mjs.map → renderer-CSfLMXN8.mjs.map} +1 -1
  120. package/dist/{renderer-0fRv8mc5.mjs → renderer-CSoyJ8GH.mjs} +2 -2
  121. package/dist/{renderer-0fRv8mc5.mjs.map → renderer-CSoyJ8GH.mjs.map} +1 -1
  122. package/dist/renderer-CUQtKECw.mjs +5 -0
  123. package/dist/renderer-CV-l8wMq.mjs +5 -0
  124. package/dist/renderer-CV7_ALA5.mjs +5 -0
  125. package/dist/renderer-CVR6T6Lp.mjs +5 -0
  126. package/dist/{renderer-B-QXAPY0.mjs → renderer-CZ9gHx-4.mjs} +2 -2
  127. package/dist/{renderer-B-QXAPY0.mjs.map → renderer-CZ9gHx-4.mjs.map} +1 -1
  128. package/dist/renderer-CZKFEf_6.mjs +3 -0
  129. package/dist/{renderer-C-BjN5HM.mjs → renderer-CciB_sav.mjs} +3 -3
  130. package/dist/{renderer-C-BjN5HM.mjs.map → renderer-CciB_sav.mjs.map} +1 -1
  131. package/dist/{renderer-hIbXvzPu.mjs → renderer-ClWgdN2v.mjs} +2 -2
  132. package/dist/renderer-CtUF95UW.mjs +5 -0
  133. package/dist/{renderer-BJD6Ouon.mjs → renderer-Cv1wmjhA.mjs} +2 -2
  134. package/dist/{renderer-BJD6Ouon.mjs.map → renderer-Cv1wmjhA.mjs.map} +1 -1
  135. package/dist/{renderer-CJnIeI0m.mjs → renderer-Cxh7j423.mjs} +3 -3
  136. package/dist/{renderer-CJnIeI0m.mjs.map → renderer-Cxh7j423.mjs.map} +1 -1
  137. package/dist/{renderer-cjiONTY_.mjs → renderer-D0enmulV.mjs} +2 -2
  138. package/dist/{renderer-cjiONTY_.mjs.map → renderer-D0enmulV.mjs.map} +1 -1
  139. package/dist/renderer-D8ymQoTB.mjs +5 -0
  140. package/dist/renderer-D9x3UE1Y.mjs +5 -0
  141. package/dist/renderer-DAEXqa2Q.mjs +5 -0
  142. package/dist/renderer-DDhU9Goq.mjs +5 -0
  143. package/dist/{renderer-CgFs_3gW.mjs → renderer-DEQ09sg7.mjs} +2 -2
  144. package/dist/{renderer-CgFs_3gW.mjs.map → renderer-DEQ09sg7.mjs.map} +1 -1
  145. package/dist/{renderer-CATBdL9s.mjs → renderer-DRpIQFAK.mjs} +2 -2
  146. package/dist/{renderer-CATBdL9s.mjs.map → renderer-DRpIQFAK.mjs.map} +1 -1
  147. package/dist/{renderer-Dd9NUd_I.mjs → renderer-DT3QVVht.mjs} +2 -2
  148. package/dist/{renderer-Dd9NUd_I.mjs.map → renderer-DT3QVVht.mjs.map} +1 -1
  149. package/dist/{renderer-BqCx28Zb.mjs → renderer-DU3216cx.mjs} +3 -3
  150. package/dist/{renderer-BqCx28Zb.mjs.map → renderer-DU3216cx.mjs.map} +1 -1
  151. package/dist/{renderer-BXZo84vM.mjs → renderer-DU6i7shO.mjs} +2 -2
  152. package/dist/{renderer-BXZo84vM.mjs.map → renderer-DU6i7shO.mjs.map} +1 -1
  153. package/dist/renderer-DcCKath2.mjs +5 -0
  154. package/dist/{renderer-CmEvkdNL.mjs → renderer-DfSRmz7q.mjs} +3 -3
  155. package/dist/{renderer-CmEvkdNL.mjs.map → renderer-DfSRmz7q.mjs.map} +1 -1
  156. package/dist/renderer-DiBphLzn.mjs +5 -0
  157. package/dist/renderer-Diq9Z7gZ.mjs +5 -0
  158. package/dist/renderer-DjZiO7iA.mjs +5 -0
  159. package/dist/{renderer-Ba7Rc8DE.mjs → renderer-DkGODUgE.mjs} +3 -3
  160. package/dist/{renderer-Ba7Rc8DE.mjs.map → renderer-DkGODUgE.mjs.map} +1 -1
  161. package/dist/{renderer-DKmV8F6L.mjs → renderer-DlqDnh-8.mjs} +2 -2
  162. package/dist/{renderer-DKmV8F6L.mjs.map → renderer-DlqDnh-8.mjs.map} +1 -1
  163. package/dist/{renderer-CMOAtGdC.mjs → renderer-Dnm_SVy6.mjs} +3 -3
  164. package/dist/{renderer-CMOAtGdC.mjs.map → renderer-Dnm_SVy6.mjs.map} +1 -1
  165. package/dist/{renderer-Cun5J3z9.mjs → renderer-DppnY7RT.mjs} +3 -3
  166. package/dist/{renderer-Cun5J3z9.mjs.map → renderer-DppnY7RT.mjs.map} +1 -1
  167. package/dist/{renderer-CmpV4YNd.mjs → renderer-DqhZTIiC.mjs} +2 -2
  168. package/dist/{renderer-CmpV4YNd.mjs.map → renderer-DqhZTIiC.mjs.map} +1 -1
  169. package/dist/renderer-Dtj6o-74.mjs +5 -0
  170. package/dist/renderer-Duaam6bJ.mjs +5 -0
  171. package/dist/{renderer-CxE5__5p.mjs → renderer-DwCg5pXn.mjs} +2 -2
  172. package/dist/{renderer-CxE5__5p.mjs.map → renderer-DwCg5pXn.mjs.map} +1 -1
  173. package/dist/{renderer-B8Wjov5-.mjs → renderer-Dyh8c41v.mjs} +2 -2
  174. package/dist/{renderer-B6x_Mmpf.mjs → renderer-DzDZlez7.mjs} +247 -63
  175. package/dist/renderer-DzDZlez7.mjs.map +1 -0
  176. package/dist/renderer-FHqZe3K1.mjs +5 -0
  177. package/dist/renderer-FTKfOejk.mjs +5 -0
  178. package/dist/{renderer-BPDita2c.mjs → renderer-FgcNOe1R.mjs} +5 -5
  179. package/dist/{renderer-BPDita2c.mjs.map → renderer-FgcNOe1R.mjs.map} +1 -1
  180. package/dist/{renderer-58bVJfZx.mjs → renderer-L7UTxwZT.mjs} +2 -2
  181. package/dist/{renderer-58bVJfZx.mjs.map → renderer-L7UTxwZT.mjs.map} +1 -1
  182. package/dist/renderer-LmbkN82X.mjs +5 -0
  183. package/dist/{renderer-C-AzyBir.mjs → renderer-PbJk25JW.mjs} +3 -3
  184. package/dist/{renderer-C-AzyBir.mjs.map → renderer-PbJk25JW.mjs.map} +1 -1
  185. package/dist/renderer-SDspl6p-.mjs +5 -0
  186. package/dist/renderer-SWVUDypd.mjs +5 -0
  187. package/dist/renderer-WhpTBwDM.mjs +5 -0
  188. package/dist/renderer-WrpQEVdv.mjs +5 -0
  189. package/dist/{renderer-mp1NN5zk.mjs → renderer-dc39dBVA.mjs} +283 -79
  190. package/dist/renderer-dc39dBVA.mjs.map +1 -0
  191. package/dist/{renderer-Br1OuXr_.mjs → renderer-dj3f8cMg.mjs} +3 -3
  192. package/dist/{renderer-Br1OuXr_.mjs.map → renderer-dj3f8cMg.mjs.map} +1 -1
  193. package/dist/{renderer-BcFdZx4j.mjs → renderer-dwTzrQ2G.mjs} +3 -3
  194. package/dist/{renderer-BcFdZx4j.mjs.map → renderer-dwTzrQ2G.mjs.map} +1 -1
  195. package/dist/{renderer-Cd5BLFnS.mjs → renderer-egZPy7vq.mjs} +2 -2
  196. package/dist/{renderer-Cd5BLFnS.mjs.map → renderer-egZPy7vq.mjs.map} +1 -1
  197. package/dist/{renderer-ChO8NNw9.mjs → renderer-gwV6hyYm.mjs} +2 -2
  198. package/dist/{renderer-ChO8NNw9.mjs.map → renderer-gwV6hyYm.mjs.map} +1 -1
  199. package/dist/{renderer-pNxZ_lV2.mjs → renderer-lXmtdrdI.mjs} +2 -2
  200. package/dist/{renderer-pNxZ_lV2.mjs.map → renderer-lXmtdrdI.mjs.map} +1 -1
  201. package/dist/{renderer-D_2Y_tdA.mjs → renderer-n2kYIGtb.mjs} +2 -2
  202. package/dist/{renderer-D_2Y_tdA.mjs.map → renderer-n2kYIGtb.mjs.map} +1 -1
  203. package/dist/renderer-r4ney0FZ.mjs +5 -0
  204. package/dist/{renderer-Bos8nRhT.mjs → renderer-sHDPBywo.mjs} +2 -2
  205. package/dist/{renderer-Bos8nRhT.mjs.map → renderer-sHDPBywo.mjs.map} +1 -1
  206. package/dist/{renderer-D9mf-msP.mjs → renderer-scbJx-Dx.mjs} +2 -2
  207. package/dist/{renderers-CP8CFWDs-ZKjdDfYg.mjs → renderers-CP8CFWDs-B8HIr3kj.mjs} +2 -2
  208. package/dist/{renderers-CP8CFWDs-ZKjdDfYg.mjs.map → renderers-CP8CFWDs-B8HIr3kj.mjs.map} +1 -1
  209. package/dist/signals/index.d.mts +5 -5
  210. package/dist/signals/index.mjs +4 -4
  211. package/package.json +58 -55
  212. package/dist/dist-Cog5jyVI.mjs.map +0 -1
  213. package/dist/index-Cpkzy5XR.d.mts.map +0 -1
  214. package/dist/index-D__HdInU.d.mts.map +0 -1
  215. package/dist/index-DpWia6iH.d.mts.map +0 -1
  216. package/dist/preview-engine/chunk-3GNP7TJH.mjs +0 -98
  217. package/dist/preview-engine/chunk-CYY366IE.mjs +0 -1
  218. package/dist/preview-engine/chunk-NI577OMQ.mjs +0 -1
  219. package/dist/preview-engine/chunk-VRGREB3V.mjs +0 -1
  220. package/dist/renderer-3MuT2oZO.mjs +0 -5
  221. package/dist/renderer-AX_fHrXM.mjs +0 -5
  222. package/dist/renderer-B2-LQreV.mjs +0 -5
  223. package/dist/renderer-B2QhkksW.mjs +0 -5
  224. package/dist/renderer-B5CoE2Cv.mjs +0 -5
  225. package/dist/renderer-B6Au6f82.mjs +0 -5
  226. package/dist/renderer-B6qAMLXh.mjs +0 -5
  227. package/dist/renderer-B6x_Mmpf.mjs.map +0 -1
  228. package/dist/renderer-BEfvyxL_.mjs +0 -5
  229. package/dist/renderer-BH4j4urG.mjs +0 -5
  230. package/dist/renderer-BH4zfzus.mjs +0 -5
  231. package/dist/renderer-BRjW_pgJ.mjs +0 -6
  232. package/dist/renderer-BVo6W_BO.mjs +0 -5
  233. package/dist/renderer-BbxBM7Vh.mjs +0 -5
  234. package/dist/renderer-C07CnYVd.mjs +0 -5
  235. package/dist/renderer-C2Z3vJCu.mjs +0 -5
  236. package/dist/renderer-C31qkFvm.mjs +0 -5
  237. package/dist/renderer-C3FV8cYm.mjs +0 -5
  238. package/dist/renderer-CQXszrAF.mjs +0 -5
  239. package/dist/renderer-CWK41ajp.mjs +0 -5
  240. package/dist/renderer-C_U225ub.mjs +0 -5
  241. package/dist/renderer-C_nPzKwZ.mjs +0 -5
  242. package/dist/renderer-Cd6I_dsC.mjs +0 -5
  243. package/dist/renderer-Ceb06HuN.mjs +0 -5
  244. package/dist/renderer-D3P5SLcx.mjs +0 -5
  245. package/dist/renderer-D9R8QXS7.mjs +0 -5
  246. package/dist/renderer-D9SJ4Fg9.mjs +0 -5
  247. package/dist/renderer-DGAypVNj.mjs +0 -5
  248. package/dist/renderer-DLAAfwg0.mjs +0 -5
  249. package/dist/renderer-DTkBPkBu.mjs +0 -5
  250. package/dist/renderer-DbaTMTuo.mjs +0 -5
  251. package/dist/renderer-DsxhQdCp.mjs +0 -5
  252. package/dist/renderer-GSFP7v2z.mjs +0 -3
  253. package/dist/renderer-Hf1pCqoN.mjs +0 -5
  254. package/dist/renderer-V0UuIniZ.mjs +0 -5
  255. package/dist/renderer-VCnMXWqE.mjs +0 -5
  256. package/dist/renderer-lifu3xIt.mjs +0 -5
  257. package/dist/renderer-mPDgLBi4.mjs +0 -5
  258. package/dist/renderer-mp1NN5zk.mjs.map +0 -1
@@ -190,7 +190,7 @@ const COCO_CLASSES = [
190
190
  ];
191
191
 
192
192
  //#endregion
193
- //#region ../vision/dist/src-C2sA_wDT.mjs
193
+ //#region ../vision/dist/src-BjTNynFj.mjs
194
194
  function computeIoU(boxA, boxB) {
195
195
  const xA = Math.max(boxA.originX, boxB.originX);
196
196
  const yA = Math.max(boxA.originY, boxB.originY);
@@ -1534,27 +1534,42 @@ var WebGPUProvider = class {
1534
1534
  const ORT_WEBGPU_SPECIFIER = "onnxruntime-web/webgpu";
1535
1535
  const WEBGPU_SPECIFIER = "webgpu";
1536
1536
  let nodeWebGPUReady;
1537
+ /** CPU rasterizers (lavapipe, llvmpipe, SwiftShader): slower than the CPU EP. */
1538
+ const SOFTWARE_ADAPTER = /llvmpipe|lavapipe|swiftshader|software/i;
1537
1539
  /**
1538
- * Ensure `globalThis.navigator.gpu` exists. In the renderer this is already the
1539
- * Dawn device; otherwise imports the `webgpu` (Dawn) package and installs its
1540
- * globals plus an adapter, which is what onnxruntime-web's WebGPU EP needs.
1540
+ * Ensure `globalThis.navigator.gpu` exists and has a hardware adapter that
1541
+ * onnxruntime-web's WebGPU EP can use. In the renderer this is already the Dawn
1542
+ * device; otherwise imports the `webgpu` (Dawn) package and installs its
1543
+ * globals. Rejects when the only adapter is a software rasterizer.
1541
1544
  */
1542
1545
  function ensureNodeWebGPU() {
1543
1546
  if (!nodeWebGPUReady) {
1544
1547
  nodeWebGPUReady = (async () => {
1545
1548
  const g = globalThis;
1546
- if (g.navigator?.gpu) return;
1547
- const { create, globals } = await import(
1548
- /* @vite-ignore */
1549
- WEBGPU_SPECIFIER
1549
+ if (!g.navigator?.gpu) {
1550
+ const { create, globals } = await import(
1551
+ /* @vite-ignore */
1552
+ WEBGPU_SPECIFIER
1550
1553
  );
1551
- Object.assign(globalThis, globals);
1552
- const nav = g.navigator ??= {};
1553
- Object.defineProperty(nav, "gpu", {
1554
- value: create([]),
1555
- configurable: true,
1556
- writable: true
1557
- });
1554
+ Object.assign(globalThis, globals);
1555
+ g.navigator ??= {};
1556
+ Object.defineProperty(g.navigator, "gpu", {
1557
+ value: create([]),
1558
+ configurable: true,
1559
+ writable: true
1560
+ });
1561
+ }
1562
+ const adapter = await (g.navigator?.gpu).requestAdapter({ powerPreference: "high-performance" });
1563
+ if (!adapter) throw new Error("No WebGPU adapter.");
1564
+ const info = adapter.info ?? {};
1565
+ const name = [
1566
+ info.vendor,
1567
+ info.architecture,
1568
+ info.device,
1569
+ info.description
1570
+ ].filter(Boolean).join(" ");
1571
+ if (adapter.isFallbackAdapter === true || info.isFallbackAdapter === true || SOFTWARE_ADAPTER.test(name)) throw new Error(`WebGPU adapter is a software rasterizer (${name}).`);
1572
+ patchSupportedFeatures(adapter.features);
1558
1573
  })();
1559
1574
  nodeWebGPUReady.catch(() => {
1560
1575
  nodeWebGPUReady = void 0;
@@ -1562,6 +1577,36 @@ function ensureNodeWebGPU() {
1562
1577
  }
1563
1578
  return nodeWebGPUReady;
1564
1579
  }
1580
+ /**
1581
+ * Dawn's Node `GPUSupportedFeatures` has `has`/`keys`/`size` but no `forEach`,
1582
+ * which onnxruntime-web's WebGPU build calls on adapter and device features
1583
+ * (they share the class). Adds the missing set-like methods once.
1584
+ */
1585
+ function patchSupportedFeatures(features) {
1586
+ const proto = Object.getPrototypeOf(features);
1587
+ if (!proto || typeof proto.keys !== "function") return;
1588
+ if (typeof proto.forEach !== "function") Object.defineProperty(proto, "forEach", {
1589
+ value(callback, thisArg) {
1590
+ for (const key of this.keys()) callback.call(thisArg, key, key, this);
1591
+ },
1592
+ configurable: true,
1593
+ writable: true
1594
+ });
1595
+ if (typeof proto.values !== "function") Object.defineProperty(proto, "values", {
1596
+ value() {
1597
+ return this.keys();
1598
+ },
1599
+ configurable: true,
1600
+ writable: true
1601
+ });
1602
+ if (typeof proto.entries !== "function") Object.defineProperty(proto, "entries", {
1603
+ *value() {
1604
+ for (const key of this.keys()) yield [key, key];
1605
+ },
1606
+ configurable: true,
1607
+ writable: true
1608
+ });
1609
+ }
1565
1610
  var NodeWebGPUProvider = class {
1566
1611
  kind = "webgpu";
1567
1612
  _inner;
@@ -1573,6 +1618,7 @@ var NodeWebGPUProvider = class {
1573
1618
  ORT_WEBGPU_SPECIFIER
1574
1619
  );
1575
1620
  if (mod.env?.wasm) mod.env.wasm.numThreads = 1;
1621
+ if (mod.env?.webgpu) mod.env.webgpu.powerPreference = "high-performance";
1576
1622
  return mod;
1577
1623
  });
1578
1624
  this._inner = new WebGPUProvider({
@@ -1586,41 +1632,113 @@ var NodeWebGPUProvider = class {
1586
1632
  }
1587
1633
  };
1588
1634
  let defaultProvider;
1635
+ function requestedVisionBackend() {
1636
+ const value = typeof process !== "undefined" ? process.env.FRAMEFIELDS_VISION_PROVIDER?.trim().toLowerCase() : void 0;
1637
+ return value === "webgpu" || value === "cuda" || value === "cpu" ? value : "auto";
1638
+ }
1589
1639
  /**
1590
1640
  * Prefers the GPU (onnxruntime-web's WebGPU EP on the process's WebGPU device —
1591
1641
  * the Dawn device the renderer already creates, or one this ensures) and falls
1592
1642
  * back to the CPU provider (onnxruntime-node) when a WebGPU session cannot be
1593
- * created: no device, no Dawn, or the EP unavailable. The choice is made on the
1594
- * first session and reused for the runner's lifetime.
1643
+ * created: no hardware adapter, no Dawn, or onnxruntime-web not installed. The
1644
+ * choice is made on the first session and kept.
1645
+ *
1646
+ * `FRAMEFIELDS_VISION_PROVIDER` forces one backend instead: `webgpu`, `cpu`, or
1647
+ * `cuda` (onnxruntime-node's CUDA EP on Linux x64; needs the CUDA 12 and cuDNN 9
1648
+ * libraries). A forced backend that fails throws instead of falling back.
1595
1649
  */
1596
1650
  var AutoSessionProvider = class {
1597
1651
  _resolved;
1652
+ _resolving;
1598
1653
  get kind() {
1599
1654
  return this._resolved?.kind ?? "webgpu";
1600
1655
  }
1601
1656
  async createSession(modelBytes) {
1602
- if (!this._resolved) {
1603
- const webgpu = new NodeWebGPUProvider({ wasmFallback: false });
1604
- try {
1605
- const session = await webgpu.createSession(modelBytes);
1606
- this._resolved = webgpu;
1607
- return session;
1608
- } catch {
1609
- this._resolved = new NodeSessionProvider();
1610
- }
1657
+ if (this._resolved) return this._resolved.createSession(modelBytes);
1658
+ if (!this._resolving) {
1659
+ this._resolving = this.resolve(modelBytes);
1660
+ this._resolving.catch(() => {
1661
+ this._resolving = void 0;
1662
+ });
1663
+ const { provider: provider$1, first } = await this._resolving;
1664
+ this._resolved = provider$1;
1665
+ if (first) return first;
1666
+ return provider$1.createSession(modelBytes);
1667
+ }
1668
+ const { provider } = await this._resolving;
1669
+ return provider.createSession(modelBytes);
1670
+ }
1671
+ async resolve(modelBytes) {
1672
+ const backend = requestedVisionBackend();
1673
+ if (backend === "cpu") return { provider: new NodeSessionProvider() };
1674
+ if (backend === "cuda") return { provider: new NodeSessionProvider({ executionProviders: ["cuda", "cpu"] }) };
1675
+ const webgpu = new NodeWebGPUProvider({ wasmFallback: false });
1676
+ try {
1677
+ return {
1678
+ provider: webgpu,
1679
+ first: await webgpu.createSession(modelBytes)
1680
+ };
1681
+ } catch (err) {
1682
+ if (backend === "webgpu") throw err;
1683
+ return { provider: new NodeSessionProvider() };
1611
1684
  }
1612
- return this._resolved.createSession(modelBytes);
1613
1685
  }
1614
1686
  };
1687
+ let processProvider;
1615
1688
  /**
1616
1689
  * The provider for a runner created without one: GPU if possible, otherwise CPU.
1690
+ * One per process, so the GPU probe runs once however many runners there are.
1617
1691
  */
1618
1692
  function createDefaultSessionProvider() {
1619
- return defaultProvider?.() ?? new AutoSessionProvider();
1693
+ if (defaultProvider) return defaultProvider();
1694
+ processProvider ??= new AutoSessionProvider();
1695
+ return processProvider;
1696
+ }
1697
+ /**
1698
+ * CPUs this process may use: the affinity mask, capped by a cgroup CPU quota
1699
+ * (containers). ONNX Runtime sizes its thread pool from the host's cores, which
1700
+ * oversubscribes a container limited to fewer CPUs than the host has.
1701
+ */
1702
+ async function availableCpus() {
1703
+ const os$1 = await import("node:os");
1704
+ const cpus = typeof os$1.availableParallelism === "function" ? os$1.availableParallelism() : os$1.cpus().length;
1705
+ const quota = await cgroupCpuQuota();
1706
+ return Math.max(1, quota !== void 0 ? Math.min(cpus, quota) : cpus);
1707
+ }
1708
+ /** cgroup v2 `cpu.max` or v1 `cpu.cfs_quota_us`, in CPUs (rounded up); undefined when unlimited. */
1709
+ async function cgroupCpuQuota() {
1710
+ if (typeof process === "undefined" || process.platform !== "linux") return;
1711
+ const { readFile: readFile$1 } = await import("node:fs/promises");
1712
+ const read = (path$1) => readFile$1(path$1, "utf8").then((text) => text.trim(), () => void 0);
1713
+ const toCpus = (quota, period) => quota > 0 && period > 0 ? Math.ceil(quota / period) : void 0;
1714
+ const v2 = await read("/sys/fs/cgroup/cpu.max");
1715
+ if (v2 !== void 0) {
1716
+ const [quota, period] = v2.split(/\s+/);
1717
+ return quota === "max" ? void 0 : toCpus(Number(quota), Number(period));
1718
+ }
1719
+ const v1Quota = await read("/sys/fs/cgroup/cpu/cpu.cfs_quota_us");
1720
+ const v1Period = await read("/sys/fs/cgroup/cpu/cpu.cfs_period_us");
1721
+ if (v1Quota === void 0 || v1Period === void 0) return void 0;
1722
+ return toCpus(Number(v1Quota), Number(v1Period));
1723
+ }
1724
+ /**
1725
+ * Intra-op threads for CPU sessions: `FRAMEFIELDS_VISION_THREADS` when set,
1726
+ * else the available CPUs on Linux (where containers cap them), else ONNX
1727
+ * Runtime's own default (undefined).
1728
+ */
1729
+ async function cpuSessionThreads() {
1730
+ const env = typeof process !== "undefined" ? Number.parseInt(process.env.FRAMEFIELDS_VISION_THREADS ?? "", 10) : NaN;
1731
+ if (Number.isFinite(env) && env > 0) return env;
1732
+ if (typeof process === "undefined" || process.platform !== "linux") return;
1733
+ return availableCpus();
1620
1734
  }
1621
1735
  /** onnxruntime-node provider. The native module is imported lazily on first session. */
1622
1736
  var NodeSessionProvider = class {
1623
1737
  kind = "node";
1738
+ _executionProviders;
1739
+ constructor(options = {}) {
1740
+ this._executionProviders = options.executionProviders ?? ["cpu"];
1741
+ }
1624
1742
  ortPromise;
1625
1743
  async ort() {
1626
1744
  if (!this.ortPromise) this.ortPromise = import("onnxruntime-node").catch((err) => {
@@ -1631,9 +1749,14 @@ var NodeSessionProvider = class {
1631
1749
  }
1632
1750
  async createSession(modelBytes) {
1633
1751
  const ort = await this.ort();
1752
+ const threads = await cpuSessionThreads();
1634
1753
  const session = await ort.InferenceSession.create(modelBytes, {
1635
- executionProviders: ["cpu"],
1636
- graphOptimizationLevel: "all"
1754
+ executionProviders: [...this._executionProviders],
1755
+ graphOptimizationLevel: "all",
1756
+ ...threads !== void 0 ? {
1757
+ intraOpNumThreads: threads,
1758
+ interOpNumThreads: 1
1759
+ } : {}
1637
1760
  });
1638
1761
  return {
1639
1762
  run: async (input) => {
@@ -1652,6 +1775,7 @@ var NodeSessionProvider = class {
1652
1775
  };
1653
1776
  }
1654
1777
  };
1778
+ const MAX_INSTANCE_PASSES = 4;
1655
1779
  /**
1656
1780
  * Lazy vision runner.
1657
1781
  *
@@ -1666,38 +1790,57 @@ var VisionRunner = class VisionRunner$1 {
1666
1790
  classes;
1667
1791
  maskThreshold;
1668
1792
  featherRadius;
1669
- _store;
1670
- _provider;
1671
- _sessions = /* @__PURE__ */ new Map();
1672
- _tensorScratch = /* @__PURE__ */ new Map();
1673
- /** One RTMDet-Ins pass per frame buffer, shared by detect() and segment(). */
1674
- _instancePass;
1675
- constructor(options) {
1793
+ _core;
1794
+ /** False for derived runners: their sessions belong to the runner they came from. */
1795
+ _ownsCore;
1796
+ constructor(options, core) {
1676
1797
  this.variant = options.variant ?? "s";
1677
1798
  this.confidence = options.confidence ?? .3;
1678
1799
  this.classes = options.classes;
1679
1800
  this.maskThreshold = options.maskThreshold ?? .5;
1680
1801
  this.featherRadius = options.featherRadius;
1681
- this._store = options.store ?? new VisionModelStore({
1682
- modelsDir: options.modelsDir,
1683
- baseUrl: options.baseUrl,
1684
- timeoutMs: options.timeoutMs,
1685
- onProgress: options.onProgress
1686
- });
1687
- this._provider = options.provider ?? createDefaultSessionProvider();
1802
+ this._ownsCore = core === void 0;
1803
+ this._core = core ?? {
1804
+ store: options.store ?? new VisionModelStore({
1805
+ modelsDir: options.modelsDir,
1806
+ baseUrl: options.baseUrl,
1807
+ timeoutMs: options.timeoutMs,
1808
+ onProgress: options.onProgress
1809
+ }),
1810
+ provider: options.provider ?? createDefaultSessionProvider(),
1811
+ sessions: /* @__PURE__ */ new Map(),
1812
+ tensorScratch: /* @__PURE__ */ new Map(),
1813
+ runQueue: /* @__PURE__ */ new Map(),
1814
+ instancePasses: []
1815
+ };
1688
1816
  }
1689
1817
  /** Cheap: no downloads, no sessions, no side effects. */
1690
1818
  static create(options = {}) {
1691
1819
  return new VisionRunner$1(options);
1692
1820
  }
1821
+ /**
1822
+ * A runner with other decode options (confidence, classes, mask threshold,
1823
+ * feather) that shares this runner's models, sessions and per-frame RTMDet-Ins
1824
+ * pass — e.g. one per layer, without loading a model twice. Its `close()` is a
1825
+ * no-op; closing this runner releases the shared sessions.
1826
+ */
1827
+ derive(options) {
1828
+ return new VisionRunner$1({
1829
+ variant: this.variant,
1830
+ confidence: options.confidence ?? this.confidence,
1831
+ classes: "classes" in options ? options.classes : this.classes,
1832
+ maskThreshold: options.maskThreshold ?? this.maskThreshold,
1833
+ featherRadius: "featherRadius" in options ? options.featherRadius : this.featherRadius
1834
+ }, this._core);
1835
+ }
1693
1836
  get modelsDir() {
1694
- return this._store.modelsDir;
1837
+ return this._core.store.modelsDir;
1695
1838
  }
1696
1839
  /** Every registry model keyed to its current download state (downloaded → "ready"). */
1697
1840
  get downloadStatus() {
1698
1841
  const statuses = /* @__PURE__ */ new Map();
1699
1842
  for (const key of Object.keys(VISION_MODELS)) statuses.set(key, "pending");
1700
- for (const [key, status] of this._store.statuses()) statuses.set(key, status);
1843
+ for (const [key, status] of this._core.store.statuses()) statuses.set(key, status);
1701
1844
  return statuses;
1702
1845
  }
1703
1846
  /** The model serving `task` (matte depends on frame aspect; defaults to square). */
@@ -1714,7 +1857,7 @@ var VisionRunner = class VisionRunner$1 {
1714
1857
  keys.add("selfie-square");
1715
1858
  keys.add("selfie-landscape");
1716
1859
  } else keys.add(this.modelKeyFor(task));
1717
- await this._store.preload([...keys]);
1860
+ await this._core.store.preload([...keys]);
1718
1861
  await Promise.all([...keys].map((key) => this.session(key)));
1719
1862
  }
1720
1863
  /** COCO-80 boxes (sorted by score, source pixels). Masks are not decoded. */
@@ -1761,13 +1904,19 @@ var VisionRunner = class VisionRunner$1 {
1761
1904
  });
1762
1905
  }
1763
1906
  close() {
1764
- for (const promise of this._sessions.values()) promise.then((session) => session.release()).catch(() => void 0);
1765
- this._sessions.clear();
1766
- this._instancePass = void 0;
1767
- this._store.clearMemoryCache();
1907
+ if (!this._ownsCore) return;
1908
+ const core = this._core;
1909
+ for (const promise of core.sessions.values()) promise.then((session) => session.release()).catch(() => void 0);
1910
+ core.sessions.clear();
1911
+ core.runQueue.clear();
1912
+ core.instancePasses.length = 0;
1913
+ core.store.clearMemoryCache();
1768
1914
  }
1769
1915
  instancePass(image) {
1770
- if (this._instancePass?.frame === image.data) return this._instancePass.result;
1916
+ const passes = this._core.instancePasses;
1917
+ const content = contentKey(image);
1918
+ const byContent = passes.find((pass$1) => pass$1.content === content);
1919
+ if (byContent) return byContent.result;
1771
1920
  const key = this.modelKeyFor("segment");
1772
1921
  const result = this.infer(key, image).then(({ outputs, transform }) => {
1773
1922
  const dets = output(outputs, "dets", key);
@@ -1784,12 +1933,15 @@ var VisionRunner = class VisionRunner$1 {
1784
1933
  }
1785
1934
  };
1786
1935
  });
1787
- this._instancePass = {
1788
- frame: image.data,
1936
+ const pass = {
1937
+ content,
1789
1938
  result
1790
1939
  };
1940
+ passes.push(pass);
1941
+ if (passes.length > MAX_INSTANCE_PASSES) passes.shift();
1791
1942
  result.catch(() => {
1792
- if (this._instancePass?.result === result) this._instancePass = void 0;
1943
+ const index = passes.indexOf(pass);
1944
+ if (index >= 0) passes.splice(index, 1);
1793
1945
  });
1794
1946
  return result;
1795
1947
  }
@@ -1805,15 +1957,30 @@ var VisionRunner = class VisionRunner$1 {
1805
1957
  ...this.featherRadius !== void 0 ? { featherRadius: this.featherRadius } : {}
1806
1958
  };
1807
1959
  }
1808
- async infer(key, image) {
1960
+ /**
1961
+ * Runs one model on one image. Runs of the same model are queued: they share
1962
+ * the input scratch buffer, and one run already uses the session's threads.
1963
+ */
1964
+ infer(key, image) {
1965
+ const queue = this._core.runQueue;
1966
+ const run = (queue.get(key) ?? Promise.resolve()).then(() => this.inferNow(key, image), () => this.inferNow(key, image));
1967
+ const tail = run.catch(() => void 0);
1968
+ queue.set(key, tail);
1969
+ tail.then(() => {
1970
+ if (queue.get(key) === tail) queue.delete(key);
1971
+ });
1972
+ return run;
1973
+ }
1974
+ async inferNow(key, image) {
1809
1975
  const session = await this.session(key);
1810
1976
  const desc = VISION_MODELS[key];
1811
1977
  const spec = preprocessSpec(desc.family, desc.input);
1812
1978
  const size = 3 * spec.width * spec.height;
1813
- let scratch = this._tensorScratch.get(key);
1979
+ const scratchByKey = this._core.tensorScratch;
1980
+ let scratch = scratchByKey.get(key);
1814
1981
  if (!scratch || scratch.length < size) {
1815
1982
  scratch = new Float32Array(size);
1816
- this._tensorScratch.set(key, scratch);
1983
+ scratchByKey.set(key, scratch);
1817
1984
  }
1818
1985
  const { tensor, transform } = imageToTensor(image, spec, scratch);
1819
1986
  return {
@@ -1831,18 +1998,34 @@ var VisionRunner = class VisionRunner$1 {
1831
1998
  };
1832
1999
  }
1833
2000
  session(key) {
1834
- let promise = this._sessions.get(key);
2001
+ const { sessions, store, provider } = this._core;
2002
+ let promise = sessions.get(key);
1835
2003
  if (!promise) {
1836
- promise = this._store.ensure(key).then((bytes) => this._provider.createSession(bytes)).catch((err) => {
1837
- this._sessions.delete(key);
1838
- this._store.evict(key);
2004
+ promise = store.ensure(key).then((bytes) => provider.createSession(bytes)).catch((err) => {
2005
+ sessions.delete(key);
2006
+ store.evict(key);
1839
2007
  throw err;
1840
2008
  });
1841
- this._sessions.set(key, promise);
2009
+ sessions.set(key, promise);
1842
2010
  }
1843
2011
  return promise;
1844
2012
  }
1845
2013
  };
2014
+ /** Size plus a 64-bit hash of the pixels: equal keys mean the same picture. */
2015
+ function contentKey(image) {
2016
+ const { data } = image;
2017
+ const words = data.byteOffset % 4 === 0 ? data.byteLength >>> 2 : 0;
2018
+ const view = new Uint32Array(data.buffer, data.byteOffset, words);
2019
+ let h1 = 2166136261;
2020
+ let h2 = 16777619 ^ data.byteLength;
2021
+ for (let i = 0; i < words; i++) {
2022
+ const v = view[i];
2023
+ h1 = Math.imul(h1 ^ v, 2654435761);
2024
+ h2 = Math.imul(h2 ^ v, 2246822519) ^ h1 >>> 15;
2025
+ }
2026
+ for (let i = words * 4; i < data.length; i++) h1 = Math.imul(h1 ^ data[i], 2654435761);
2027
+ return `${image.width}x${image.height}:${(h1 >>> 0).toString(36)}:${(h2 >>> 0).toString(36)}`;
2028
+ }
1846
2029
  function output(outputs, name, key) {
1847
2030
  const tensor = outputs[name];
1848
2031
  if (!tensor) throw new Error(`Vision model '${key}' returned no '${name}' output (got: ${Object.keys(outputs).join(", ") || "none"}). Expected the ${VISION_MODELS[key].source}.`);
@@ -3014,7 +3197,7 @@ var VisionNode = class VisionNode$1 {
3014
3197
  };
3015
3198
 
3016
3199
  //#endregion
3017
- //#region ../../nodes/node-vision/dist/renderers-ClCaeCNB.mjs
3200
+ //#region ../../nodes/node-vision/dist/renderers-BcBWZ-Rc.mjs
3018
3201
  let scratchValues = new Uint8Array(0);
3019
3202
  let scratchLengths = new Uint32Array(0);
3020
3203
  function encodeMask(mask, width, height) {
@@ -3287,7 +3470,13 @@ var MatteCompositor = class {
3287
3470
  pass.end();
3288
3471
  }
3289
3472
  };
3290
- let sharedRunner = null;
3473
+ /**
3474
+ * Runners by model options (variant, models dir, mirror), each with the runners
3475
+ * derived from it by decode options — layers that differ only in classes or
3476
+ * confidence share sessions instead of reloading the models.
3477
+ */
3478
+ const sharedRunners = /* @__PURE__ */ new Map();
3479
+ const MAX_SHARED_RUNNERS = 4;
3291
3480
  let sharedSkeletonRenderer = null;
3292
3481
  let sharedCompositor = null;
3293
3482
  let sharedCompositorFormat = null;
@@ -3384,27 +3573,42 @@ function selectSubject(selected, nodeKey, frame) {
3384
3573
  /**
3385
3574
  * Lazy shared runner — `create()` is a pure constructor (zero I/O); the first frame that
3386
3575
  * requests a task triggers that task's model download at inference time (never at init).
3387
- * Recreated only when an option that changes inference changes.
3576
+ * Nodes with the same model options share sessions; decode options (classes,
3577
+ * confidence, …) get a derived runner over the same sessions.
3388
3578
  */
3389
3579
  function getSharedRunner(op) {
3390
- const options = {
3580
+ const modelOptions = {
3391
3581
  variant: op.variant,
3392
- confidence: op.confidence,
3393
- classes: op.classes,
3394
- maskThreshold: op.maskThreshold,
3395
- featherRadius: op.featherRadius,
3396
3582
  modelsDir: op.modelsDir,
3397
3583
  baseUrl: op.baseUrl
3398
3584
  };
3399
- const key = JSON.stringify(options);
3400
- if (sharedRunner?.key !== key) {
3401
- sharedRunner?.runner.close();
3402
- sharedRunner = {
3403
- key,
3404
- runner: VisionRunner.create(options)
3585
+ const modelKey = JSON.stringify(modelOptions);
3586
+ let entry = sharedRunners.get(modelKey);
3587
+ if (!entry) {
3588
+ if (sharedRunners.size >= MAX_SHARED_RUNNERS) {
3589
+ const [oldestKey, oldest] = sharedRunners.entries().next().value;
3590
+ oldest.runner.close();
3591
+ sharedRunners.delete(oldestKey);
3592
+ }
3593
+ entry = {
3594
+ runner: VisionRunner.create(modelOptions),
3595
+ derived: /* @__PURE__ */ new Map()
3405
3596
  };
3597
+ sharedRunners.set(modelKey, entry);
3598
+ }
3599
+ const decodeOptions = {
3600
+ confidence: op.confidence,
3601
+ classes: op.classes,
3602
+ maskThreshold: op.maskThreshold,
3603
+ featherRadius: op.featherRadius
3604
+ };
3605
+ const decodeKey = JSON.stringify(decodeOptions);
3606
+ let runner = entry.derived.get(decodeKey);
3607
+ if (!runner) {
3608
+ runner = entry.runner.derive(decodeOptions);
3609
+ entry.derived.set(decodeKey, runner);
3406
3610
  }
3407
- return sharedRunner.runner;
3611
+ return runner;
3408
3612
  }
3409
3613
  function getObjectTracker(nodeKey, op) {
3410
3614
  let tracker = objectTrackers.get(nodeKey);
@@ -3955,4 +4159,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer })
3955
4159
 
3956
4160
  //#endregion
3957
4161
  export { PoseSkeletonRenderer as a, TemporalObjectTracker as c, VisionRunner as d, analyzeSequence as f, COCO_CLASSES as h, COCO17_KEYPOINT_NAMES as i, VisionBundle as l, pinNodeToObject as m, COCO17_BONES as n, SegmentationTexturePool as o, pinNodeToLandmark as p, COCO17_KEYPOINTS as r, SpatialLandmarkTransformer as s, renderers_default as t, VisionNode as u };
3958
- //# sourceMappingURL=renderer-mp1NN5zk.mjs.map
4162
+ //# sourceMappingURL=renderer-dc39dBVA.mjs.map