@cimplify/sdk 0.108.0 → 0.110.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 (608) hide show
  1. package/LICENSE +21 -0
  2. package/dist/advanced.d.mts +4 -3
  3. package/dist/advanced.d.ts +4 -3
  4. package/dist/advanced.js +24 -24
  5. package/dist/advanced.mjs +5 -5
  6. package/dist/animation-4EXBXRVX.js +27 -0
  7. package/dist/animation-6DICNWUP.mjs +6 -0
  8. package/dist/audio-DhvyjqdA.d.mts +249 -0
  9. package/dist/audio-m0w8cnxq.d.ts +249 -0
  10. package/dist/avatars.d.mts +110 -0
  11. package/dist/avatars.d.ts +110 -0
  12. package/dist/avatars.js +82 -0
  13. package/dist/avatars.mjs +5 -0
  14. package/dist/backend-gUCzs5Kg.d.mts +3866 -0
  15. package/dist/backend-gUCzs5Kg.d.ts +3866 -0
  16. package/dist/{catalogue-B4eLL8Mi.d.ts → catalogue-CPTMyBUz.d.mts} +109 -221
  17. package/dist/catalogue-DzrTXP3v.d.mts +541 -0
  18. package/dist/catalogue-DzrTXP3v.d.ts +541 -0
  19. package/dist/{catalogue-OT89_Ifs.d.mts → catalogue-OTuS5zp-.d.ts} +109 -221
  20. package/dist/chunk-22BD3RHN.mjs +1809 -0
  21. package/dist/chunk-25T4JHEA.mjs +21 -0
  22. package/dist/chunk-2AQ237Y4.js +508 -0
  23. package/dist/chunk-2IC4H6OV.mjs +48 -0
  24. package/dist/chunk-2LHLG4OB.mjs +71 -0
  25. package/dist/chunk-2O2CG465.js +1709 -0
  26. package/dist/chunk-2Q4DTHXK.js +316 -0
  27. package/dist/chunk-2QTQ6BUH.mjs +46 -0
  28. package/dist/chunk-2UN4SFLR.mjs +100 -0
  29. package/dist/chunk-2V75I7K3.js +454 -0
  30. package/dist/chunk-2V7IL4HC.js +10 -0
  31. package/dist/chunk-34XBXUMW.js +296 -0
  32. package/dist/chunk-3C4C654I.js +71 -0
  33. package/dist/chunk-3DAD2LDF.mjs +72 -0
  34. package/dist/chunk-3GXH2NFD.mjs +4 -0
  35. package/dist/chunk-3O47ZFW3.js +961 -0
  36. package/dist/chunk-3OY3VYNF.mjs +11 -0
  37. package/dist/chunk-3S6WPBZL.js +2936 -0
  38. package/dist/chunk-3TUOUP5T.js +399 -0
  39. package/dist/chunk-3VEH23I5.mjs +1380 -0
  40. package/dist/chunk-3ZYSAW2T.mjs +263 -0
  41. package/dist/chunk-4ANVF274.js +103 -0
  42. package/dist/chunk-4C7I3ELN.js +388 -0
  43. package/dist/chunk-4DYKAYFO.mjs +8 -0
  44. package/dist/chunk-4ZDR72SG.js +329 -0
  45. package/dist/chunk-52YS45RR.js +1066 -0
  46. package/dist/chunk-5325XSCH.js +107 -0
  47. package/dist/chunk-5AD5X6AV.js +13 -0
  48. package/dist/chunk-5BYDGGWO.mjs +197 -0
  49. package/dist/chunk-5C3C7VDM.mjs +55 -0
  50. package/dist/chunk-5HFMY3D7.js +660 -0
  51. package/dist/chunk-5LH2QN3T.js +1862 -0
  52. package/dist/chunk-5PJEXSOW.js +44 -0
  53. package/dist/chunk-5SXDH3Y7.js +90 -0
  54. package/dist/chunk-5YFBGGCK.mjs +502 -0
  55. package/dist/chunk-5YWN6H5Q.mjs +133 -0
  56. package/dist/chunk-66QP3SMN.js +402 -0
  57. package/dist/chunk-6DAEZKIG.mjs +385 -0
  58. package/dist/chunk-6DATW7TB.mjs +420 -0
  59. package/dist/{chunk-JRGK3NXR.mjs → chunk-6ETDAU62.mjs} +72 -212
  60. package/dist/chunk-6H254EVP.mjs +178 -0
  61. package/dist/chunk-6PFNJPBJ.mjs +820 -0
  62. package/dist/chunk-6PJWXIFX.mjs +357 -0
  63. package/dist/chunk-6SWKWCMS.js +80 -0
  64. package/dist/chunk-6VVXXX7S.js +808 -0
  65. package/dist/chunk-6WUBSMTX.js +1403 -0
  66. package/dist/chunk-73SGZLAQ.mjs +35 -0
  67. package/dist/chunk-76L2V6KD.mjs +4 -0
  68. package/dist/chunk-7AAIAVAA.js +1531 -0
  69. package/dist/chunk-7ARSJPV3.mjs +93 -0
  70. package/dist/chunk-7BHW5GTC.mjs +1234 -0
  71. package/dist/chunk-7DQSDKDU.js +6 -0
  72. package/dist/chunk-7IQQQENP.mjs +401 -0
  73. package/dist/chunk-7KFTYENS.js +11357 -0
  74. package/dist/chunk-7SM6XSPZ.js +3171 -0
  75. package/dist/chunk-7SXOHAIR.mjs +28 -0
  76. package/dist/chunk-A2MAX6S4.js +90 -0
  77. package/dist/chunk-A33OORT7.mjs +1530 -0
  78. package/dist/{chunk-U6ACF76H.mjs → chunk-A36JRXXH.mjs} +1075 -1845
  79. package/dist/chunk-A7BU3BK4.js +52 -0
  80. package/dist/chunk-A7MQSN2V.mjs +77 -0
  81. package/dist/chunk-A7V4L2IT.mjs +416 -0
  82. package/dist/chunk-AABEK6XU.js +226 -0
  83. package/dist/chunk-AGV33FWC.mjs +5005 -0
  84. package/dist/chunk-AHNR3BXI.js +108 -0
  85. package/dist/chunk-AQ5RLBU2.mjs +286 -0
  86. package/dist/chunk-AQOE6WCG.js +1270 -0
  87. package/dist/chunk-ATAWRACV.mjs +62 -0
  88. package/dist/chunk-ATCURNUV.js +14 -0
  89. package/dist/chunk-AWPV33OO.js +6 -0
  90. package/dist/chunk-AYJPHKYV.js +337 -0
  91. package/dist/chunk-AZ5BGWHB.js +162 -0
  92. package/dist/chunk-AZAXD44P.js +1373 -0
  93. package/dist/chunk-BBGKQIJJ.mjs +406 -0
  94. package/dist/chunk-BP4JLSUA.js +1453 -0
  95. package/dist/{chunk-SUCE7FWA.mjs → chunk-BTUSVHIE.mjs} +539 -978
  96. package/dist/chunk-BU6OK542.mjs +818 -0
  97. package/dist/chunk-CVSRWM6W.js +418 -0
  98. package/dist/chunk-CYBMFMJD.mjs +247 -0
  99. package/dist/chunk-DDJLDOUX.mjs +217 -0
  100. package/dist/{chunk-V32BCG7M.js → chunk-DFZWHNRG.js} +75 -215
  101. package/dist/chunk-DJ2C7AVG.js +644 -0
  102. package/dist/chunk-DS2VU4WW.mjs +102 -0
  103. package/dist/chunk-DSAG7T5P.js +7290 -0
  104. package/dist/chunk-E2QPPH7I.js +327 -0
  105. package/dist/chunk-E65WCTIG.mjs +1187 -0
  106. package/dist/{chunk-33VCYWVL.mjs → chunk-E6QQKDNE.mjs} +30 -42
  107. package/dist/chunk-ECDK6QBF.mjs +981 -0
  108. package/dist/chunk-EIB4OWVQ.mjs +620 -0
  109. package/dist/chunk-EQUZYCGO.js +250 -0
  110. package/dist/chunk-F3UJ6ZRM.mjs +313 -0
  111. package/dist/chunk-F63N2ZTQ.js +7023 -0
  112. package/dist/chunk-F6XRYEM3.mjs +26 -0
  113. package/dist/chunk-FE6VCE4K.js +5030 -0
  114. package/dist/chunk-FLWD6GRR.js +1372 -0
  115. package/dist/chunk-FQBFWJBS.mjs +110 -0
  116. package/dist/chunk-FXVJ2HFU.js +26 -0
  117. package/dist/chunk-FZMQMQBW.js +312 -0
  118. package/dist/chunk-G3EEC44R.js +53 -0
  119. package/dist/{chunk-KG3WT4PR.mjs → chunk-GCKWKLZF.mjs} +73 -104
  120. package/dist/chunk-GCX7TY4D.mjs +6826 -0
  121. package/dist/chunk-GDB6TCSD.js +450 -0
  122. package/dist/chunk-GDCV4IWO.mjs +21 -0
  123. package/dist/chunk-GDZT5LZ5.js +170 -0
  124. package/dist/chunk-GHPUYD4I.mjs +213 -0
  125. package/dist/chunk-GHS6MIL6.mjs +1432 -0
  126. package/dist/chunk-GPS2THCL.mjs +11 -0
  127. package/dist/{chunk-EV2EVOYS.js → chunk-GTJWQAGU.js} +31 -42
  128. package/dist/chunk-GVTI6UJQ.mjs +130 -0
  129. package/dist/chunk-GXKI64OT.mjs +1138 -0
  130. package/dist/chunk-GYDYF2WX.js +275 -0
  131. package/dist/chunk-GYLP6UG4.mjs +705 -0
  132. package/dist/chunk-H3OQKK6X.js +1158 -0
  133. package/dist/chunk-H5DFSCJ6.js +40 -0
  134. package/dist/chunk-HAGEIC2L.mjs +186 -0
  135. package/dist/chunk-HAJ4JRFO.js +293 -0
  136. package/dist/chunk-HDR72GB6.js +188 -0
  137. package/dist/chunk-HF5HPS4T.mjs +40 -0
  138. package/dist/chunk-HK6LOFDS.js +218 -0
  139. package/dist/chunk-HMWYTXCY.mjs +143 -0
  140. package/dist/chunk-HPCSRCMA.js +89 -0
  141. package/dist/chunk-HSEO6TPU.js +247 -0
  142. package/dist/chunk-I5FOHCLH.js +132 -0
  143. package/dist/chunk-IDLW4NWA.mjs +85 -0
  144. package/dist/chunk-IIDZ5WUX.js +61 -0
  145. package/dist/chunk-IR74FJHU.js +2332 -0
  146. package/dist/chunk-IRVFYAKP.mjs +100 -0
  147. package/dist/{chunk-XBL3TMPC.mjs → chunk-IZDWAL53.mjs} +1795 -3287
  148. package/dist/chunk-J2KZXIU3.js +51 -0
  149. package/dist/chunk-J2U6PJSO.js +91 -0
  150. package/dist/chunk-J5AJNY2N.js +283 -0
  151. package/dist/chunk-J6KQZ4FO.mjs +821 -0
  152. package/dist/{chunk-OWW5GUSB.js → chunk-JGBCIKJV.js} +7 -6
  153. package/dist/chunk-JKGTBMU7.mjs +25 -0
  154. package/dist/chunk-JR3TNEQC.js +422 -0
  155. package/dist/chunk-JURRXY2J.mjs +29 -0
  156. package/dist/chunk-K3HW5I2A.mjs +317 -0
  157. package/dist/chunk-K46SMZ66.mjs +103 -0
  158. package/dist/chunk-K4UDGE3Z.mjs +6 -0
  159. package/dist/chunk-KDQOR4QQ.mjs +350 -0
  160. package/dist/chunk-KDTVOLHI.mjs +288 -0
  161. package/dist/chunk-KGHJH5KJ.mjs +35 -0
  162. package/dist/chunk-KIZOA5LX.mjs +140 -0
  163. package/dist/chunk-KK6HYVBI.mjs +242 -0
  164. package/dist/chunk-KMKWGXMK.js +856 -0
  165. package/dist/chunk-KPA6K5IB.js +80 -0
  166. package/dist/chunk-KU7O4IXU.mjs +260 -0
  167. package/dist/chunk-KVFNRJOR.mjs +11142 -0
  168. package/dist/chunk-KZJRSXHK.js +2432 -0
  169. package/dist/chunk-LHWPRUJL.js +79 -0
  170. package/dist/chunk-LIV3KXJG.mjs +369 -0
  171. package/dist/chunk-LKV4LACG.js +21 -0
  172. package/dist/chunk-LUY45X3U.mjs +263 -0
  173. package/dist/chunk-LYEZZEEF.mjs +17 -0
  174. package/dist/chunk-M5EXQZYY.mjs +1519 -0
  175. package/dist/chunk-ME6HGG4I.mjs +1338 -0
  176. package/dist/chunk-MEXP6DA6.js +31 -0
  177. package/dist/chunk-MG52AW3H.js +902 -0
  178. package/dist/chunk-MIPO6F72.js +334 -0
  179. package/dist/{chunk-5QW7CQBA.js → chunk-MKIJQL5Q.js} +211 -321
  180. package/dist/chunk-MN3YETVN.mjs +17 -0
  181. package/dist/chunk-MOBSBXVE.mjs +2391 -0
  182. package/dist/chunk-MOMOZEUM.mjs +88 -0
  183. package/dist/chunk-MRFUNRAP.js +62 -0
  184. package/dist/chunk-MTIHEW2M.js +433 -0
  185. package/dist/chunk-N4RGGDEL.mjs +73 -0
  186. package/dist/chunk-NH654HAT.js +10 -0
  187. package/dist/chunk-NHJUGZUR.mjs +253 -0
  188. package/dist/chunk-NMQT4HG3.mjs +757 -0
  189. package/dist/chunk-NPSYB6DC.mjs +906 -0
  190. package/dist/chunk-NW2GPMSO.js +857 -0
  191. package/dist/chunk-NXKQOQ6L.js +76 -0
  192. package/dist/chunk-NXLAZIJZ.js +309 -0
  193. package/dist/chunk-NYWNA5CF.js +148 -0
  194. package/dist/chunk-NZTKLY2W.js +1442 -0
  195. package/dist/chunk-O2ICABUD.js +36 -0
  196. package/dist/chunk-OIVVQQ22.js +862 -0
  197. package/dist/chunk-OKC2B4O3.mjs +312 -0
  198. package/dist/chunk-OLWFPDBK.js +2220 -0
  199. package/dist/chunk-OMTVH334.js +3779 -0
  200. package/dist/chunk-OQRVEM56.mjs +362 -0
  201. package/dist/chunk-OXMIBOD4.js +337 -0
  202. package/dist/chunk-PBL6YL5L.mjs +288 -0
  203. package/dist/chunk-PDOELNNQ.js +97 -0
  204. package/dist/chunk-PDQJY2GZ.js +136 -0
  205. package/dist/chunk-PKOZXD2Q.js +1274 -0
  206. package/dist/chunk-PPF2BYFL.mjs +2191 -0
  207. package/dist/chunk-PQTQKNKD.js +539 -0
  208. package/dist/chunk-PRSR4FAV.mjs +81 -0
  209. package/dist/chunk-PTRNO5UD.js +95 -0
  210. package/dist/chunk-Q2Y3VMKH.js +2000 -0
  211. package/dist/chunk-QCZOE65N.js +96 -0
  212. package/dist/chunk-QDYFLATW.mjs +52 -0
  213. package/dist/chunk-QQABGCMM.js +22 -0
  214. package/dist/chunk-QS6TRHMR.js +345 -0
  215. package/dist/chunk-R56P64LB.mjs +208 -0
  216. package/dist/chunk-RCQ2MPBV.js +428 -0
  217. package/dist/chunk-RFVRPYR2.mjs +856 -0
  218. package/dist/chunk-RKBLPGPV.js +11521 -0
  219. package/dist/chunk-RM2V4IND.mjs +327 -0
  220. package/dist/chunk-RQXN5A34.mjs +613 -0
  221. package/dist/chunk-RUVGVNOF.mjs +2687 -0
  222. package/dist/chunk-SAFJIGYB.mjs +165 -0
  223. package/dist/chunk-SKQFLBDD.js +263 -0
  224. package/dist/chunk-SMK6JU2F.mjs +2092 -0
  225. package/dist/{chunk-UVRPC2P7.js → chunk-SNNEOS5Z.js} +1984 -3476
  226. package/dist/chunk-SPCRQ6NO.mjs +1246 -0
  227. package/dist/chunk-SWX4SALA.mjs +19 -0
  228. package/dist/{chunk-JVODCGFP.mjs → chunk-SYEO2WV4.mjs} +128 -238
  229. package/dist/chunk-T2QQMX2N.js +10 -0
  230. package/dist/chunk-T3AFF3L7.mjs +57 -0
  231. package/dist/chunk-T6Z2EXYL.js +712 -0
  232. package/dist/chunk-T7LOXGYX.js +118 -0
  233. package/dist/chunk-TJCAE7RC.mjs +1315 -0
  234. package/dist/chunk-TJI3K6RP.js +137 -0
  235. package/dist/chunk-TL2SVO4P.mjs +55 -0
  236. package/dist/chunk-TM63CYGN.mjs +399 -0
  237. package/dist/chunk-TU5RYTYU.mjs +13 -0
  238. package/dist/chunk-TVJZ4GPS.js +1553 -0
  239. package/dist/chunk-TWM6DLYF.js +371 -0
  240. package/dist/chunk-U63OC4TQ.js +30 -0
  241. package/dist/{chunk-L5GKVQVJ.js → chunk-U6BVSJZ6.js} +25 -57
  242. package/dist/chunk-U6UVWEAK.mjs +792 -0
  243. package/dist/chunk-UCEPNO6N.mjs +11048 -0
  244. package/dist/{chunk-ANT574FD.js → chunk-UCR5HRYM.js} +74 -105
  245. package/dist/chunk-UG5BTOTF.mjs +334 -0
  246. package/dist/chunk-UGH37BQW.mjs +157 -0
  247. package/dist/chunk-V7ZRH3PY.mjs +271 -0
  248. package/dist/chunk-VBGHBL3E.mjs +1394 -0
  249. package/dist/chunk-VRBDAS5I.js +920 -0
  250. package/dist/chunk-VVE3Y76O.js +230 -0
  251. package/dist/chunk-W65JIRI4.mjs +1182 -0
  252. package/dist/chunk-WHYKAT7G.js +62 -0
  253. package/dist/{chunk-YOIVZ6OA.mjs → chunk-WIZRUIZB.mjs} +25 -57
  254. package/dist/chunk-WKWTDZS7.js +385 -0
  255. package/dist/chunk-WLMINRC4.mjs +78 -0
  256. package/dist/chunk-WOF3AD3J.js +22 -0
  257. package/dist/chunk-WWKMOA76.js +1262 -0
  258. package/dist/chunk-X5A5FOWW.js +615 -0
  259. package/dist/chunk-X6CN6KQF.mjs +192 -0
  260. package/dist/chunk-XD2PMH46.mjs +517 -0
  261. package/dist/chunk-XJA2NGTI.mjs +88 -0
  262. package/dist/chunk-XJIHN3BY.mjs +8 -0
  263. package/dist/chunk-XK6UDWJS.js +203 -0
  264. package/dist/chunk-XPG3N5CF.mjs +415 -0
  265. package/dist/chunk-XVZ2NKSU.mjs +74 -0
  266. package/dist/chunk-XYP45OLE.js +117 -0
  267. package/dist/chunk-XZSDGZX6.mjs +301 -0
  268. package/dist/chunk-Y2EMGN4T.mjs +120 -0
  269. package/dist/chunk-Y3XWP5XW.mjs +298 -0
  270. package/dist/chunk-Y4K22JL6.js +228 -0
  271. package/dist/chunk-Y65LXQGA.mjs +3164 -0
  272. package/dist/chunk-Y66WVMO5.mjs +87 -0
  273. package/dist/chunk-Y7JWLB25.mjs +7280 -0
  274. package/dist/chunk-YCDXAJKU.js +175 -0
  275. package/dist/chunk-YRDQCCIS.js +152 -0
  276. package/dist/chunk-YV52DGSA.js +111 -0
  277. package/dist/chunk-YXGZQPUD.js +94 -0
  278. package/dist/chunk-Z3A3AFVU.mjs +102 -0
  279. package/dist/chunk-ZCY6YKKP.mjs +475 -0
  280. package/dist/chunk-ZEQHXVU5.js +215 -0
  281. package/dist/chunk-ZF7JCXCI.js +284 -0
  282. package/dist/chunk-ZJBRUH6V.js +29 -0
  283. package/dist/chunk-ZMIL4ZOA.js +365 -0
  284. package/dist/chunk-ZR5ULMN2.mjs +337 -0
  285. package/dist/chunk-ZXREOYOW.js +87 -0
  286. package/dist/{client-BSP9U1O1.d.mts → client-CX_WR0-J.d.mts} +2 -2
  287. package/dist/client-Dytx_ZTC.d.ts +230 -0
  288. package/dist/{client-B878xeAP.d.ts → client-dqOhP9Nc.d.ts} +2 -2
  289. package/dist/client-hTKbCuhG.d.mts +230 -0
  290. package/dist/clock-B-UAjkKa.d.mts +5 -0
  291. package/dist/clock-B-UAjkKa.d.ts +5 -0
  292. package/dist/config-BlXQluJR.d.mts +36 -0
  293. package/dist/config-BlXQluJR.d.ts +36 -0
  294. package/dist/courier-Cnn-edJ4.d.ts +95 -0
  295. package/dist/courier-FmGfkvIN.d.mts +95 -0
  296. package/dist/crowd-DdHFbqKK.d.ts +186 -0
  297. package/dist/crowd-hOVSAmA3.d.mts +186 -0
  298. package/dist/danfo-BEBapFlX.d.mts +146 -0
  299. package/dist/danfo-UQ_PTIIx.d.ts +146 -0
  300. package/dist/{elements-Bty6Qs_N.d.mts → elements-DdsRig-2.d.mts} +1548 -257
  301. package/dist/{elements-Bty6Qs_N.d.ts → elements-DdsRig-2.d.ts} +1548 -257
  302. package/dist/engines/godot.d.mts +56 -0
  303. package/dist/engines/godot.d.ts +56 -0
  304. package/dist/engines/godot.js +28 -0
  305. package/dist/engines/godot.mjs +3 -0
  306. package/dist/engines/wasm.d.mts +11 -0
  307. package/dist/engines/wasm.d.ts +11 -0
  308. package/dist/engines/wasm.js +178 -0
  309. package/dist/engines/wasm.mjs +176 -0
  310. package/dist/fallback-CrG_lTFk.d.mts +270 -0
  311. package/dist/fallback-CrG_lTFk.d.ts +270 -0
  312. package/dist/fallback-KDB4Y2CE.mjs +6 -0
  313. package/dist/fallback-Y26TQENE.js +19 -0
  314. package/dist/features-CZB4rmcD.d.mts +118 -0
  315. package/dist/features-CZB4rmcD.d.ts +118 -0
  316. package/dist/fit-BWiE7rgA.d.mts +44 -0
  317. package/dist/fit-DK0oT7zO.d.ts +44 -0
  318. package/dist/five-a-side-Bv1AOUy3.d.mts +115 -0
  319. package/dist/five-a-side-EC51SJY1.d.ts +115 -0
  320. package/dist/fluid-ARr0qUIL.d.ts +939 -0
  321. package/dist/fluid-DLlEj2cs.d.mts +939 -0
  322. package/dist/game/conformance.d.mts +84 -0
  323. package/dist/game/conformance.d.ts +84 -0
  324. package/dist/game/conformance.js +1025 -0
  325. package/dist/game/conformance.mjs +994 -0
  326. package/dist/game/heap.d.mts +40 -0
  327. package/dist/game/heap.d.ts +40 -0
  328. package/dist/game/heap.js +48 -0
  329. package/dist/game/heap.mjs +7 -0
  330. package/dist/game/kit/canvas.d.mts +240 -0
  331. package/dist/game/kit/canvas.d.ts +240 -0
  332. package/dist/game/kit/canvas.js +3566 -0
  333. package/dist/game/kit/canvas.mjs +1039 -0
  334. package/dist/game/kit/courier.d.mts +17 -0
  335. package/dist/game/kit/courier.d.ts +17 -0
  336. package/dist/game/kit/courier.js +66 -0
  337. package/dist/game/kit/courier.mjs +49 -0
  338. package/dist/game/kit/danfo.d.mts +11 -0
  339. package/dist/game/kit/danfo.d.ts +11 -0
  340. package/dist/game/kit/danfo.js +109 -0
  341. package/dist/game/kit/danfo.mjs +44 -0
  342. package/dist/game/kit/engine.d.mts +29 -0
  343. package/dist/game/kit/engine.d.ts +29 -0
  344. package/dist/game/kit/engine.js +183 -0
  345. package/dist/game/kit/engine.mjs +30 -0
  346. package/dist/game/kit/five-a-side.d.mts +11 -0
  347. package/dist/game/kit/five-a-side.d.ts +11 -0
  348. package/dist/game/kit/five-a-side.js +86 -0
  349. package/dist/game/kit/five-a-side.mjs +41 -0
  350. package/dist/game/kit/frontier.d.mts +344 -0
  351. package/dist/game/kit/frontier.d.ts +344 -0
  352. package/dist/game/kit/frontier.js +435 -0
  353. package/dist/game/kit/frontier.mjs +14 -0
  354. package/dist/game/kit/genesis.d.mts +752 -0
  355. package/dist/game/kit/genesis.d.ts +752 -0
  356. package/dist/game/kit/genesis.js +380 -0
  357. package/dist/game/kit/genesis.mjs +15 -0
  358. package/dist/game/kit/ludo.d.mts +15 -0
  359. package/dist/game/kit/ludo.d.ts +15 -0
  360. package/dist/game/kit/ludo.js +87 -0
  361. package/dist/game/kit/ludo.mjs +42 -0
  362. package/dist/game/kit/runner.d.mts +12 -0
  363. package/dist/game/kit/runner.d.ts +12 -0
  364. package/dist/game/kit/runner.js +83 -0
  365. package/dist/game/kit/runner.mjs +46 -0
  366. package/dist/game/kit/shootout.d.mts +13 -0
  367. package/dist/game/kit/shootout.d.ts +13 -0
  368. package/dist/game/kit/shootout.js +122 -0
  369. package/dist/game/kit/shootout.mjs +57 -0
  370. package/dist/game/kit/slots.d.mts +392 -0
  371. package/dist/game/kit/slots.d.ts +392 -0
  372. package/dist/game/kit/slots.js +215 -0
  373. package/dist/game/kit/slots.mjs +6 -0
  374. package/dist/game/kit/tycoon.d.mts +16 -0
  375. package/dist/game/kit/tycoon.d.ts +16 -0
  376. package/dist/game/kit/tycoon.js +145 -0
  377. package/dist/game/kit/tycoon.mjs +44 -0
  378. package/dist/game/kit/word.d.mts +11 -0
  379. package/dist/game/kit/word.d.ts +11 -0
  380. package/dist/game/kit/word.js +78 -0
  381. package/dist/game/kit/word.mjs +41 -0
  382. package/dist/game/kit/worlds.d.mts +18 -0
  383. package/dist/game/kit/worlds.d.ts +18 -0
  384. package/dist/game/kit/worlds.js +74 -0
  385. package/dist/game/kit/worlds.mjs +49 -0
  386. package/dist/game/kit.d.mts +53 -0
  387. package/dist/game/kit.d.ts +53 -0
  388. package/dist/game/kit.js +2610 -0
  389. package/dist/game/kit.mjs +101 -0
  390. package/dist/game/prepared.d.mts +14 -0
  391. package/dist/game/prepared.d.ts +14 -0
  392. package/dist/game/prepared.js +81 -0
  393. package/dist/game/prepared.mjs +32 -0
  394. package/dist/game-Bx8onkhX.d.mts +1451 -0
  395. package/dist/game-fgQy2YIm.d.ts +1451 -0
  396. package/dist/game-theme-CBTw1b_d.d.mts +35 -0
  397. package/dist/game-theme-Dg-ict5A.d.ts +35 -0
  398. package/dist/game.d.mts +3546 -0
  399. package/dist/game.d.ts +3546 -0
  400. package/dist/game.js +4455 -0
  401. package/dist/game.mjs +50 -0
  402. package/dist/graphics-C6YjWYvP.d.ts +5 -0
  403. package/dist/graphics-Dk2yQnYN.d.mts +5 -0
  404. package/dist/guest-DrsA00XD.d.mts +732 -0
  405. package/dist/guest-wIdfoT05.d.ts +732 -0
  406. package/dist/hit-stop-BKkVwTq7.d.mts +43 -0
  407. package/dist/hit-stop-D-8pPYnM.d.ts +43 -0
  408. package/dist/hot-Crn9XpHJ.d.ts +29 -0
  409. package/dist/hot-DH3nOhQD.d.mts +29 -0
  410. package/dist/{index-CQStGb3B.d.mts → index-6gkHMGAq.d.mts} +2 -2
  411. package/dist/index-B8ybCKJI.d.ts +41 -0
  412. package/dist/{index-DJwXmoaP.d.ts → index-B98Xac8e.d.ts} +2 -2
  413. package/dist/{index-B7oA_1XI.d.ts → index-B_ByTtIT.d.ts} +2 -2
  414. package/dist/index-DHjNHb1c.d.mts +41 -0
  415. package/dist/{index-DhUSTAhT.d.mts → index-DbAN_VQE.d.mts} +2 -2
  416. package/dist/index.d.mts +134 -24
  417. package/dist/index.d.ts +134 -24
  418. package/dist/index.js +407 -248
  419. package/dist/index.mjs +184 -58
  420. package/dist/interactives-authoring.d.mts +231 -0
  421. package/dist/interactives-authoring.d.ts +231 -0
  422. package/dist/interactives-authoring.js +1743 -0
  423. package/dist/interactives-authoring.mjs +1704 -0
  424. package/dist/interactives-canvas.global.js +148 -0
  425. package/dist/interactives-guest.d.mts +20 -0
  426. package/dist/interactives-guest.d.ts +20 -0
  427. package/dist/interactives-guest.js +63 -0
  428. package/dist/interactives-guest.json +1 -0
  429. package/dist/interactives-guest.mjs +61 -0
  430. package/dist/interactives-jsc.global.js +9357 -0
  431. package/dist/interactives-meters.d.mts +93 -0
  432. package/dist/interactives-meters.d.ts +93 -0
  433. package/dist/interactives-meters.js +252 -0
  434. package/dist/interactives-meters.mjs +68 -0
  435. package/dist/interactives-production.d.mts +430 -0
  436. package/dist/interactives-production.d.ts +430 -0
  437. package/dist/interactives-production.js +1231 -0
  438. package/dist/interactives-production.mjs +1170 -0
  439. package/dist/interactives-record.d.mts +112 -0
  440. package/dist/interactives-record.d.ts +112 -0
  441. package/dist/interactives-record.js +302 -0
  442. package/dist/interactives-record.mjs +295 -0
  443. package/dist/interactives-runtime.d.mts +61 -0
  444. package/dist/interactives-runtime.d.ts +61 -0
  445. package/dist/interactives-runtime.js +442 -0
  446. package/dist/interactives-runtime.mjs +25 -0
  447. package/dist/interactives-studio-kernel.global.js +1 -0
  448. package/dist/interactives-studio.d.mts +806 -0
  449. package/dist/interactives-studio.d.ts +806 -0
  450. package/dist/interactives-studio.js +5741 -0
  451. package/dist/interactives-studio.mjs +5651 -0
  452. package/dist/interactives-tick.d.mts +90 -0
  453. package/dist/interactives-tick.d.ts +90 -0
  454. package/dist/interactives-tick.js +203 -0
  455. package/dist/interactives-tick.mjs +6 -0
  456. package/dist/interactives-web.d.mts +762 -0
  457. package/dist/interactives-web.d.ts +762 -0
  458. package/dist/interactives-web.js +5000 -0
  459. package/dist/interactives-web.mjs +4628 -0
  460. package/dist/interactives.d.mts +2430 -0
  461. package/dist/interactives.d.ts +2430 -0
  462. package/dist/interactives.js +5723 -0
  463. package/dist/interactives.mjs +4333 -0
  464. package/dist/juice-CoHxlpKA.d.ts +42 -0
  465. package/dist/juice-DQztFS43.d.mts +42 -0
  466. package/dist/launch-T2f4_Di4.d.mts +151 -0
  467. package/dist/launch-d6oreMzR.d.ts +151 -0
  468. package/dist/library-DXYaMFhi.d.mts +69 -0
  469. package/dist/library-DXYaMFhi.d.ts +69 -0
  470. package/dist/link-BUTqGmyi.d.mts +38 -0
  471. package/dist/link-BUTqGmyi.d.ts +38 -0
  472. package/dist/lint.js +104 -204
  473. package/dist/lint.mjs +103 -203
  474. package/dist/local-D8_I6UeL.d.mts +6967 -0
  475. package/dist/local-VZkqsCzR.d.ts +6967 -0
  476. package/dist/lockstep-BLf6dglI.d.mts +321 -0
  477. package/dist/lockstep-D50Ia0JW.d.ts +321 -0
  478. package/dist/ludo-B8ClkDqr.d.ts +205 -0
  479. package/dist/ludo-BOuohQ-M.d.mts +205 -0
  480. package/dist/mock/cli.mjs +200 -56
  481. package/dist/mock/library.js +200 -56
  482. package/dist/mock/library.mjs +200 -56
  483. package/dist/mock/msw.js +200 -56
  484. package/dist/mock/msw.mjs +200 -56
  485. package/dist/native-BodxSh03.d.mts +16 -0
  486. package/dist/native-DUHMT8gA.d.ts +16 -0
  487. package/dist/network-ZXLD7l1b.d.mts +19 -0
  488. package/dist/network-ZXLD7l1b.d.ts +19 -0
  489. package/dist/online-XeymeM9s.d.ts +381 -0
  490. package/dist/online-d7W_Al9a.d.mts +381 -0
  491. package/dist/params-DxFb5G_U.d.mts +155 -0
  492. package/dist/params-DxFb5G_U.d.ts +155 -0
  493. package/dist/play-BRRlfLhX.d.ts +940 -0
  494. package/dist/play-ClrMd_e8.d.mts +940 -0
  495. package/dist/policy-CCw8tXLm.d.mts +3078 -0
  496. package/dist/policy-CMqOSQIu.d.ts +3078 -0
  497. package/dist/ports-B_0v_P3A.d.mts +13 -0
  498. package/dist/ports-CGU_3e_0.d.ts +13 -0
  499. package/dist/prefetch-BHnicOQj.d.ts +117 -0
  500. package/dist/prefetch-CBXgYacv.d.mts +117 -0
  501. package/dist/{price-CSztR02F.d.mts → price-BOzexBww.d.mts} +1 -1
  502. package/dist/{price-C_vasx9A.d.ts → price-C1h9sPxE.d.ts} +1 -1
  503. package/dist/protocol-C8qbpUbT.d.mts +242 -0
  504. package/dist/protocol-C8qbpUbT.d.ts +242 -0
  505. package/dist/rapier-AZHT4YI7.js +7886 -0
  506. package/dist/rapier-ODEPCQA6.mjs +7792 -0
  507. package/dist/react.d.mts +157 -15
  508. package/dist/react.d.ts +157 -15
  509. package/dist/react.js +5564 -5904
  510. package/dist/react.mjs +5451 -5808
  511. package/dist/runner-CQcLL7By.d.ts +189 -0
  512. package/dist/runner-D46Yj-wE.d.mts +189 -0
  513. package/dist/runtime-BRWfkf_q.d.mts +51 -0
  514. package/dist/runtime-DyuBMkKM.d.ts +51 -0
  515. package/dist/scheduling-D2ajXpMC.d.ts +224 -0
  516. package/dist/scheduling-DSRbbaZb.d.mts +224 -0
  517. package/dist/schema-BrWxzKp6.d.mts +63 -0
  518. package/dist/schema-BrWxzKp6.d.ts +63 -0
  519. package/dist/server/evict.js +34 -37
  520. package/dist/server/evict.mjs +34 -37
  521. package/dist/server/tanstack.d.mts +49 -3
  522. package/dist/server/tanstack.d.ts +49 -3
  523. package/dist/server/tanstack.js +169 -117
  524. package/dist/server/tanstack.mjs +166 -118
  525. package/dist/{server-Dckg4Vdr.d.ts → server-D29IIuDV.d.ts} +136 -130
  526. package/dist/{server-B6dW7-Lj.d.mts → server-DQMWPnc8.d.mts} +136 -130
  527. package/dist/server.d.mts +45 -5
  528. package/dist/server.d.ts +45 -5
  529. package/dist/server.js +171 -227
  530. package/dist/server.mjs +165 -225
  531. package/dist/session-grant-CJ27DwrT.d.mts +19 -0
  532. package/dist/session-grant-CJ27DwrT.d.ts +19 -0
  533. package/dist/shootout-BJZeX6FG.d.ts +140 -0
  534. package/dist/shootout-tcZd1Rxt.d.mts +140 -0
  535. package/dist/state-replica-stMtdkVD.d.mts +42 -0
  536. package/dist/state-replica-stMtdkVD.d.ts +42 -0
  537. package/dist/studio-CowqWqez.d.mts +14 -0
  538. package/dist/studio-CowqWqez.d.ts +14 -0
  539. package/dist/styles.css +1 -1
  540. package/dist/template-AhCdB1kW.d.mts +190 -0
  541. package/dist/template-BkEGVTQj.d.ts +190 -0
  542. package/dist/terrain-BMxEc6Oc.d.ts +429 -0
  543. package/dist/terrain-C-XC1Oui.d.mts +429 -0
  544. package/dist/testing/msw.d.mts +28 -4
  545. package/dist/testing/msw.d.ts +28 -4
  546. package/dist/testing/msw.js +15 -21
  547. package/dist/testing/msw.mjs +15 -21
  548. package/dist/testing/suite.d.mts +6 -5
  549. package/dist/testing/suite.d.ts +6 -5
  550. package/dist/testing/suite.js +89 -124
  551. package/dist/testing/suite.mjs +81 -116
  552. package/dist/testing.d.mts +27 -1227
  553. package/dist/testing.d.ts +27 -1227
  554. package/dist/testing.js +127 -131
  555. package/dist/testing.mjs +19 -23
  556. package/dist/tick-transport-C8QEh8Uw.d.mts +50 -0
  557. package/dist/tick-transport-UjHY3xK1.d.ts +50 -0
  558. package/dist/timeline-protocol-hp6e8zFB.d.mts +47 -0
  559. package/dist/timeline-protocol-hp6e8zFB.d.ts +47 -0
  560. package/dist/tokens-DhanQRQS.d.mts +21 -0
  561. package/dist/tokens-K8yxwd6G.d.ts +21 -0
  562. package/dist/tree-C-Io2Hbx.d.mts +35 -0
  563. package/dist/tree-CP_qSW4H.d.ts +35 -0
  564. package/dist/tycoon-B5KHk2Xx.d.mts +255 -0
  565. package/dist/tycoon-hmHo-3HX.d.ts +255 -0
  566. package/dist/types-BQkxPwZP.d.mts +219 -0
  567. package/dist/types-D_f6UUxM.d.ts +219 -0
  568. package/dist/ui-DwHicuFv.d.mts +563 -0
  569. package/dist/ui-hi7S2YcH.d.ts +563 -0
  570. package/dist/{sign-in-DQlIdqsi.d.mts → url-52ndUruG.d.mts} +15 -1
  571. package/dist/{sign-in-DQlIdqsi.d.ts → url-52ndUruG.d.ts} +15 -1
  572. package/dist/utils.d.mts +3 -3
  573. package/dist/utils.d.ts +3 -3
  574. package/dist/utils.js +37 -37
  575. package/dist/utils.mjs +4 -4
  576. package/dist/vars-Dc_PrhBK.d.mts +511 -0
  577. package/dist/vars-Dc_PrhBK.d.ts +511 -0
  578. package/dist/vm-IUARFFAI.mjs +63 -0
  579. package/dist/vm-N7L6MGGH.js +65 -0
  580. package/dist/weave-delivery-CW-Kstut.d.mts +360 -0
  581. package/dist/weave-delivery-CW-Kstut.d.ts +360 -0
  582. package/dist/web-Dss74a7v.d.ts +883 -0
  583. package/dist/web-f9ZQPoyw.d.mts +883 -0
  584. package/dist/web-transport-C7MkBL0a.d.ts +19 -0
  585. package/dist/web-transport-aYEqXMd9.d.mts +19 -0
  586. package/dist/weight-CPGjsgjV.d.ts +92 -0
  587. package/dist/weight-tF1ODR1p.d.mts +92 -0
  588. package/dist/word-BcX9Jcmv.d.mts +70 -0
  589. package/dist/word-C7sVPLHm.d.ts +70 -0
  590. package/dist/world-PvILHDR1.d.ts +2285 -0
  591. package/dist/world-qekkXjJv.d.mts +2285 -0
  592. package/dist/worlds-Br2Pb0Cs.d.ts +109 -0
  593. package/dist/worlds-D5ydYr7d.d.mts +109 -0
  594. package/engines/c/cimplify.h +108 -0
  595. package/engines/c/cimplify.lib.js +11 -0
  596. package/engines/godot/addons/cimplify/cimplify.gd +97 -0
  597. package/engines/rust/interactives-ctx/Cargo.toml +9 -0
  598. package/engines/rust/interactives-ctx/src/lib.rs +189 -0
  599. package/package.json +189 -3
  600. package/vendor/rapier3d-compat/LICENSE +201 -0
  601. package/vendor/rapier3d-compat/PATCHES.md +61 -0
  602. package/dist/chunk-2P4KXFB6.js +0 -274
  603. package/dist/chunk-3G6RQLXK.mjs +0 -21
  604. package/dist/chunk-3V4DVXV3.mjs +0 -254
  605. package/dist/chunk-EDK3LNM6.js +0 -2436
  606. package/dist/chunk-F7J3HK27.js +0 -4549
  607. package/dist/chunk-U4MW6PYU.mjs +0 -23
  608. package/dist/chunk-XREIZ56K.js +0 -26
@@ -0,0 +1,757 @@
1
+ import { DEFAULT_THEME } from './chunk-RFVRPYR2.mjs';
2
+ import { sha256Into } from './chunk-5YWN6H5Q.mjs';
3
+ import { LAUNCH_FILES, LAUNCH_ITEMS, LAUNCH_RIG } from './chunk-JKGTBMU7.mjs';
4
+
5
+ // src/game/kit/slots/types.ts
6
+ var TemplateSlotError = class extends Error {
7
+ constructor(issues) {
8
+ super(issues.map(describeIssue).join("; ")), this.name = "TemplateSlotError", this.issues = issues;
9
+ }
10
+ };
11
+ function describeIssue(issue) {
12
+ return `${issue.path === "" ? `slot "${issue.slot}"` : `slot "${issue.slot}" at ${issue.path}`}: ${issue.reason}`;
13
+ }
14
+
15
+ // src/game/kit/slots/slots.ts
16
+ var Theme = Object.freeze({ kind: "theme", textContrast: 4.5, accentContrast: 3 });
17
+ function Palette(keys) {
18
+ return Object.freeze({ kind: "palette", keys: Object.freeze([...keys]) });
19
+ }
20
+ function Character(requirements) {
21
+ return Object.freeze({ kind: "character", rig: requirements.rig, clips: Object.freeze([...requirements.clips]) });
22
+ }
23
+ function SceneSlot(scene, requirements) {
24
+ return Object.freeze({ kind: "scene", scene, anchors: Object.freeze({ ...requirements.anchors }), spans: Object.freeze([...requirements.spans ?? []]) });
25
+ }
26
+ function Track(requirements) {
27
+ return Object.freeze(requirements.bpm === void 0 ? { kind: "track", seconds: requirements.seconds, loop: requirements.loop } : { kind: "track", seconds: requirements.seconds, loop: requirements.loop, bpm: requirements.bpm });
28
+ }
29
+ function Params(fields) {
30
+ return Object.freeze({ kind: "params", fields: Object.freeze({ ...fields }) });
31
+ }
32
+ function Int(min, max) {
33
+ return { type: "int", min, max };
34
+ }
35
+ function Num(min, max) {
36
+ return { type: "number", min, max };
37
+ }
38
+ function Bool() {
39
+ return { type: "boolean" };
40
+ }
41
+ function Choice(...options) {
42
+ return { type: "choice", options };
43
+ }
44
+ function anchors(min, max = min, size = {}) {
45
+ return { min, max, ...size };
46
+ }
47
+
48
+ // src/game/kit/slots/check.ts
49
+ var THEME_COLORS = ["surface", "raised", "border", "accent", "on_accent", "text", "muted", "track", "danger", "success", "gold"], THEME_SIZES = ["radius", "padding", "gap", "small", "body", "title", "press_scale", "motion"], HEX_SHORT = 7, HEX_PATTERN = /^#(?:[0-9a-fA-F]{6}|[0-9a-fA-F]{8})$/, BYTE = 255, RGB_MAX = 16777215, RGBA_MAX = 4294967295, BYTE_SHIFT_RED = 16, BYTE_SHIFT_GREEN = 8, SRGB_KNEE = 0.04045, SRGB_LINEAR_SCALE = 12.92, SRGB_OFFSET = 0.055, SRGB_SCALE = 1.055, SRGB_GAMMA = 2.4, LUMA_R = 0.2126, LUMA_G = 0.7152, LUMA_B = 0.0722, CONTRAST_FLARE = 0.05, DECIMALS = 100, ANCHOR_AXES = 3, SIZE_AXES = 2, MAX_ID_LENGTH = 128;
50
+ function isRecord(value) {
51
+ return typeof value == "object" && value !== null && !Array.isArray(value);
52
+ }
53
+ function fmt(value) {
54
+ return String(Math.round(value * (100)) / (100));
55
+ }
56
+ function range(r, unit = "") {
57
+ return `${fmt(r[0])}${unit} to ${fmt(r[1])}${unit}`;
58
+ }
59
+ function within(value, r) {
60
+ return value >= r[0] && value <= r[1];
61
+ }
62
+ function list(items) {
63
+ return items.join(", ");
64
+ }
65
+ function parseColor(value) {
66
+ if (typeof value == "string") {
67
+ if (!HEX_PATTERN.test(value)) return null;
68
+ let hex2 = value.slice(1, (7)), n = Number.parseInt(hex2, 16);
69
+ return [(n >> (16) & (255)) / (255), (n >> (8) & (255)) / (255), (n & (255)) / (255)];
70
+ }
71
+ if (typeof value == "number") {
72
+ if (!Number.isInteger(value) || value < 0 || value > (4294967295)) return null;
73
+ let n = value > (16777215) ? value >>> (8) : value;
74
+ return [(n >> (16) & (255)) / (255), (n >> (8) & (255)) / (255), (n & (255)) / (255)];
75
+ }
76
+ return Array.isArray(value) && value.length === (3) && value.every((c) => typeof c == "number" && c >= 0 && c <= 1) ? [value[0], value[1], value[2]] : null;
77
+ }
78
+ function colorInt(value) {
79
+ let rgb = parseColor(value);
80
+ if (rgb === null) throw new RangeError(colorReason(value));
81
+ return Math.round(rgb[0] * (255)) << (16) | Math.round(rgb[1] * (255)) << (8) | Math.round(rgb[2] * (255));
82
+ }
83
+ function channel(c) {
84
+ return c <= (0.04045) ? c / (12.92) : ((c + (0.055)) / (1.055)) ** (2.4);
85
+ }
86
+ function luminance(rgb) {
87
+ return (0.2126) * channel(rgb[0]) + (0.7152) * channel(rgb[1]) + (0.0722) * channel(rgb[2]);
88
+ }
89
+ function contrastRatio(a, b) {
90
+ let la = luminance(a), lb = luminance(b);
91
+ return (Math.max(la, lb) + (0.05)) / (Math.min(la, lb) + (0.05));
92
+ }
93
+ function colorReason(value) {
94
+ return `${JSON.stringify(value)} is not a colour (use #rrggbb, #rrggbbaa or [r, g, b] from 0 to 1)`;
95
+ }
96
+ var Issues = class {
97
+ constructor(slot) {
98
+ this.slot = slot;
99
+ this.list = [];
100
+ }
101
+ add(path, reason) {
102
+ this.list.push({ slot: this.slot, path, reason });
103
+ }
104
+ };
105
+ function checkId(value, issues) {
106
+ let id = value.id;
107
+ return typeof id != "string" || id.length === 0 || id.length > (128) ? (issues.add("id", `needs an id of 1 to ${(128)} characters`), null) : id;
108
+ }
109
+ function rejectUnknown(value, known, issues, what) {
110
+ for (let key of Object.keys(value)) known.includes(key) || issues.add(key, `${what} has no ${key} (it takes ${list(known)})`);
111
+ }
112
+ function checkTheme(slot, value, issues) {
113
+ if (!isRecord(value))
114
+ return issues.add("", "a theme is an object of game theme values"), null;
115
+ let known = Object.keys(DEFAULT_THEME);
116
+ rejectUnknown(value, known, issues, "a game theme");
117
+ let merged = { ...DEFAULT_THEME, ...value };
118
+ for (let key of THEME_COLORS) parseColor(merged[key]) === null && issues.add(key, colorReason(merged[key]));
119
+ for (let key of THEME_SIZES) {
120
+ let n = merged[key];
121
+ (typeof n != "number" || !Number.isFinite(n) || n < 0) && issues.add(key, `${JSON.stringify(n)} is not a size of zero or more`);
122
+ }
123
+ if ((!Number.isInteger(merged.font) || merged.font < 0) && issues.add("font", `${JSON.stringify(merged.font)} is not a font handle`), merged.panel !== null && !isRecord(merged.panel) && issues.add("panel", "a panel is a nine slice or null"), issues.list.length > 0) return null;
124
+ let text = contrastRatio(parseColor(merged.text), parseColor(merged.surface));
125
+ text < slot.textContrast && issues.add("text", `text on surface has contrast ${fmt(text)}:1; the template needs at least ${fmt(slot.textContrast)}:1 to stay readable`);
126
+ let accent = contrastRatio(parseColor(merged.on_accent), parseColor(merged.accent));
127
+ return accent < slot.accentContrast && issues.add("on_accent", `on_accent on accent has contrast ${fmt(accent)}:1; the template needs at least ${fmt(slot.accentContrast)}:1 for buttons`), issues.list.length > 0 ? null : merged;
128
+ }
129
+ function checkPalette(slot, value, issues) {
130
+ if (!isRecord(value))
131
+ return issues.add("", `a palette is an object of colours named ${list(slot.keys)}`), null;
132
+ rejectUnknown(value, slot.keys, issues, "this palette");
133
+ for (let key of slot.keys)
134
+ key in value ? parseColor(value[key]) === null && issues.add(key, colorReason(value[key])) : issues.add(key, `missing the ${key} colour`);
135
+ return issues.list.length > 0 ? null : value;
136
+ }
137
+ function stringList(value) {
138
+ return Array.isArray(value) && value.every((v) => typeof v == "string") ? value : null;
139
+ }
140
+ function checkCharacter(slot, value, issues) {
141
+ if (!isRecord(value))
142
+ return issues.add("", "a character is an object with an id, a rig and its animation clips"), null;
143
+ rejectUnknown(value, ["id", "rig", "clips", "model", "tint"], issues, "a character"), checkId(value, issues), value.rig !== slot.rig && issues.add("rig", `rig ${JSON.stringify(value.rig)} does not match the ${JSON.stringify(slot.rig)} skeleton the template animates`);
144
+ let clips = stringList(value.clips);
145
+ if (clips === null) issues.add("clips", "clips is a list of animation clip names");
146
+ else {
147
+ let missing = slot.clips.filter((c) => !clips.includes(c));
148
+ missing.length > 0 && issues.add("clips", `missing the ${list(missing)} clip${missing.length === 1 ? "" : "s"} the template plays`);
149
+ }
150
+ return value.model !== void 0 && typeof value.model != "string" && issues.add("model", "model is an asset path or content digest"), value.tint !== void 0 && parseColor(value.tint) === null && issues.add("tint", colorReason(value.tint)), issues.list.length > 0 ? null : value;
151
+ }
152
+ function isVec(value, axes) {
153
+ return Array.isArray(value) && value.length === axes && value.every((c) => typeof c == "number" && Number.isFinite(c));
154
+ }
155
+ function distance(a, b) {
156
+ return Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
157
+ }
158
+ function plural(count, noun) {
159
+ return `${count} ${noun} anchor${count === 1 ? "" : "s"}`;
160
+ }
161
+ function checkScene(slot, value, issues) {
162
+ if (!isRecord(value))
163
+ return issues.add("", "a scene is an object with an id, a kind and anchors"), null;
164
+ if (rejectUnknown(value, ["id", "kind", "anchors", "bounds"], issues, "a scene"), checkId(value, issues), value.kind !== slot.scene)
165
+ return issues.add("kind", `a ${JSON.stringify(value.kind)} scene does not fit; this slot takes a ${JSON.stringify(slot.scene)}`), null;
166
+ if (!Array.isArray(value.anchors))
167
+ return issues.add("anchors", "anchors is a list of { role, position }"), null;
168
+ let anchors2 = [];
169
+ value.anchors.forEach((raw, index) => {
170
+ let path = `anchors[${index}]`;
171
+ if (!isRecord(raw) || typeof raw.role != "string" || !isVec(raw.position, (3))) {
172
+ issues.add(path, "an anchor needs a role and a finite [x, y, z] position");
173
+ return;
174
+ }
175
+ if (raw.size !== void 0 && (!isVec(raw.size, (2)) || raw.size.some((s) => s < 0))) {
176
+ issues.add(`${path}.size`, "size is [width, height] in metres, zero or more");
177
+ return;
178
+ }
179
+ anchors2.push(raw);
180
+ });
181
+ let bounds = value.bounds;
182
+ if (bounds !== void 0)
183
+ if (!isRecord(bounds) || !isVec(bounds.min, (3)) || !isVec(bounds.max, (3))) issues.add("bounds", "bounds is { min: [x, y, z], max: [x, y, z] }");
184
+ else {
185
+ let min = bounds.min, max = bounds.max;
186
+ anchors2.forEach((a, index) => {
187
+ for (let axis = 0; axis < (3); axis++)
188
+ if (a.position[axis] < min[axis] || a.position[axis] > max[axis]) {
189
+ issues.add(`anchors[${index}]`, `the ${a.role} anchor sits outside the scene bounds`);
190
+ return;
191
+ }
192
+ });
193
+ }
194
+ for (let role of Object.keys(slot.anchors)) {
195
+ let rule = slot.anchors[role], matching = anchors2.filter((a) => a.role === role);
196
+ if (matching.length < rule.min || matching.length > rule.max) {
197
+ let need = rule.min === rule.max ? `${rule.min}` : rule.max === Number.MAX_SAFE_INTEGER ? `at least ${rule.min}` : `${rule.min} to ${rule.max}`;
198
+ issues.add("anchors", `has ${plural(matching.length, role)}; the template needs ${need}`);
199
+ continue;
200
+ }
201
+ matching.forEach((a, index) => {
202
+ if (!(rule.width === void 0 && rule.height === void 0)) {
203
+ if (a.size === void 0) {
204
+ issues.add("anchors", `${role} anchor ${index + 1} has no size; the template checks its width and height`);
205
+ return;
206
+ }
207
+ rule.width !== void 0 && !within(a.size[0], rule.width) && issues.add("anchors", `${role} anchor ${index + 1} is ${fmt(a.size[0])} m wide; the template needs ${range(rule.width, " m")}`), rule.height !== void 0 && !within(a.size[1], rule.height) && issues.add("anchors", `${role} anchor ${index + 1} is ${fmt(a.size[1])} m high; the template needs ${range(rule.height, " m")}`);
208
+ }
209
+ });
210
+ }
211
+ for (let span of slot.spans) {
212
+ let from = anchors2.filter((a) => a.role === span.from), to = anchors2.filter((a) => a.role === span.to), same = span.from === span.to;
213
+ for (let i = 0; i < from.length; i++) {
214
+ let a = from[i];
215
+ for (let j = same ? i + 1 : 0; j < to.length; j++) {
216
+ let b = to[j], d = distance(a.position, b.position);
217
+ if (!within(d, span.distance)) {
218
+ issues.add("anchors", `${span.from} to ${span.to} distance is ${fmt(d)} m; the template's rules are built for ${range(span.distance, " m")}`);
219
+ break;
220
+ }
221
+ }
222
+ }
223
+ }
224
+ return issues.list.length > 0 ? null : value;
225
+ }
226
+ function checkTrack(slot, value, issues) {
227
+ return isRecord(value) ? (rejectUnknown(value, ["id", "seconds", "loop", "bpm", "asset"], issues, "a track"), checkId(value, issues), typeof value.seconds != "number" || !Number.isFinite(value.seconds) ? issues.add("seconds", "seconds is the track length") : within(value.seconds, slot.seconds) || issues.add("seconds", `the track is ${fmt(value.seconds)} s long; the template needs ${range(slot.seconds, " s")}`), typeof value.loop != "boolean" ? issues.add("loop", "loop is true or false") : slot.loop && !value.loop && issues.add("loop", "the track does not loop; the template plays it under the whole game"), slot.bpm !== void 0 ? typeof value.bpm != "number" ? issues.add("bpm", `the template syncs to the beat and needs a bpm of ${range(slot.bpm)}`) : within(value.bpm, slot.bpm) || issues.add("bpm", `bpm ${fmt(value.bpm)} is outside the ${range(slot.bpm)} the template syncs to`) : value.bpm !== void 0 && (typeof value.bpm != "number" || value.bpm <= 0) && issues.add("bpm", "bpm is a positive number"), value.asset !== void 0 && typeof value.asset != "string" && issues.add("asset", "asset is an asset path or content digest"), issues.list.length > 0 ? null : value) : (issues.add("", "a track is an object with an id, seconds and loop"), null);
228
+ }
229
+ function checkField(name, field, value, issues) {
230
+ switch (field.type) {
231
+ case "int":
232
+ typeof value != "number" || !Number.isInteger(value) ? issues.add(name, `${JSON.stringify(value)} is not a whole number`) : within(value, [field.min, field.max]) || issues.add(name, `${value} is outside ${range([field.min, field.max])}`);
233
+ return;
234
+ case "number":
235
+ typeof value != "number" || !Number.isFinite(value) ? issues.add(name, `${JSON.stringify(value)} is not a number`) : within(value, [field.min, field.max]) || issues.add(name, `${fmt(value)} is outside ${range([field.min, field.max])}`);
236
+ return;
237
+ case "boolean":
238
+ typeof value != "boolean" && issues.add(name, `${JSON.stringify(value)} is not true or false`);
239
+ return;
240
+ case "choice":
241
+ (typeof value != "string" || !field.options.includes(value)) && issues.add(name, `${JSON.stringify(value)} is not one of ${list(field.options)}`);
242
+ }
243
+ }
244
+ function checkParams(slot, value, issues) {
245
+ if (!isRecord(value))
246
+ return issues.add("", `params are an object of ${list(Object.keys(slot.fields))}`), null;
247
+ let names = Object.keys(slot.fields);
248
+ rejectUnknown(value, names, issues, "these params");
249
+ for (let name of names)
250
+ name in value ? checkField(name, slot.fields[name], value[name], issues) : issues.add(name, `missing ${name}`);
251
+ return issues.list.length > 0 ? null : value;
252
+ }
253
+ function checkSlot(name, slot, value) {
254
+ let issues = new Issues(name), out;
255
+ switch (slot.kind) {
256
+ case "theme":
257
+ out = checkTheme(slot, value, issues);
258
+ break;
259
+ case "palette":
260
+ out = checkPalette(slot, value, issues);
261
+ break;
262
+ case "character":
263
+ out = checkCharacter(slot, value, issues);
264
+ break;
265
+ case "scene":
266
+ out = checkScene(slot, value, issues);
267
+ break;
268
+ case "track":
269
+ out = checkTrack(slot, value, issues);
270
+ break;
271
+ case "params":
272
+ out = checkParams(slot, value, issues);
273
+ break;
274
+ }
275
+ return { issues: issues.list, value: issues.list.length > 0 ? null : out ?? null };
276
+ }
277
+ function describeSlot(slot) {
278
+ switch (slot.kind) {
279
+ case "theme":
280
+ return "a game theme";
281
+ case "palette":
282
+ return `a palette of ${list(slot.keys)}`;
283
+ case "character":
284
+ return `a ${slot.rig} character with ${list(slot.clips)}`;
285
+ case "scene":
286
+ return `a ${slot.scene} scene with ${Object.keys(slot.anchors).join(", ")} anchors`;
287
+ case "track":
288
+ return `a ${slot.loop ? "looping " : ""}track of ${range(slot.seconds, " s")}`;
289
+ case "params":
290
+ return `params ${list(Object.keys(slot.fields))}`;
291
+ }
292
+ }
293
+
294
+ // src/game/kit/slots/presets.ts
295
+ var THEME_PRESETS = Object.freeze({
296
+ default: {},
297
+ neon: {
298
+ surface: "#0a0a1ae6",
299
+ raised: "#1a1438ff",
300
+ border: "#ff2bd666",
301
+ accent: "#00f5d4ff",
302
+ on_accent: "#00140fff",
303
+ text: "#f8f7ffff",
304
+ muted: "#b8a9e6ff",
305
+ track: "#ffffff26",
306
+ danger: "#ff3b6bff",
307
+ success: "#39ff88ff",
308
+ gold: "#ffe600ff"
309
+ },
310
+ midnight: {
311
+ surface: "#0b1020e6",
312
+ raised: "#18213aff",
313
+ border: "#ffffff1a",
314
+ accent: "#5b8cffff",
315
+ on_accent: "#050a1aff",
316
+ text: "#eef2ffff",
317
+ muted: "#9aa6c8ff",
318
+ track: "#ffffff22",
319
+ danger: "#ff5c5cff",
320
+ success: "#4ade80ff",
321
+ gold: "#ffd166ff"
322
+ },
323
+ daylight: {
324
+ surface: "#f7f5efee",
325
+ raised: "#ffffffff",
326
+ border: "#1b1f2a1f",
327
+ accent: "#0f766eff",
328
+ on_accent: "#ffffffff",
329
+ text: "#141821ff",
330
+ muted: "#4d5566ff",
331
+ track: "#1b1f2a1f",
332
+ danger: "#c62828ff",
333
+ success: "#1b873fff",
334
+ gold: "#b7791fff"
335
+ }
336
+ });
337
+
338
+ // src/game/kit/slots/template.ts
339
+ var TEMPLATE_SCHEMA_FORMAT = "cimplify.template/1", ID_PATTERN = /^[a-z0-9][a-z0-9-]{0,63}$/, SLOT_NAME_PATTERN = /^[a-z][a-zA-Z0-9_]{0,31}$/, PRESET_NAME_PATTERN = /^[a-z0-9][a-z0-9-]{0,47}$/;
340
+ function templateRef(id, version) {
341
+ return `${id}@${version}`;
342
+ }
343
+ function slotPresets(t, slot) {
344
+ let own = t.presets[slot] ?? {};
345
+ return t.slots[slot]?.kind === "theme" ? { ...THEME_PRESETS, ...own } : own;
346
+ }
347
+ function template(definition) {
348
+ let issues = [], structural = (slot, reason) => {
349
+ issues.push({ slot, path: "", reason });
350
+ };
351
+ ID_PATTERN.test(definition.id) || structural("", `template id ${JSON.stringify(definition.id)} must be lowercase letters, digits and dashes`), (!Number.isInteger(definition.version) || definition.version < 1) && structural("", "template version is a whole number from 1");
352
+ let names = Object.keys(definition.slots), values = {};
353
+ for (let name of names) {
354
+ SLOT_NAME_PATTERN.test(name) || structural(name, "slot names start with a letter and use letters, digits and underscores");
355
+ let slot = definition.slots[name], check = checkSlot(name, slot, definition.defaults[name]);
356
+ issues.push(...check.issues.map((i) => ({ ...i, reason: `default ${i.reason}` }))), values[name] = check.value;
357
+ }
358
+ for (let name of Object.keys(definition.defaults)) name in definition.slots || structural(name, "has a default but no slot");
359
+ let presets = definition.presets ?? {};
360
+ for (let name of Object.keys(presets)) {
361
+ let slot = definition.slots[name];
362
+ if (slot === void 0) {
363
+ structural(name, "has presets but no slot");
364
+ continue;
365
+ }
366
+ let entries = presets[name] ?? {};
367
+ for (let preset of Object.keys(entries)) {
368
+ PRESET_NAME_PATTERN.test(preset) || structural(name, `preset name ${JSON.stringify(preset)} must be lowercase letters, digits and dashes`);
369
+ let check = checkSlot(name, slot, entries[preset]);
370
+ issues.push(...check.issues.map((i) => ({ ...i, reason: `preset ${preset}: ${i.reason}` })));
371
+ }
372
+ }
373
+ if (issues.length > 0) throw new TemplateSlotError(issues);
374
+ return Object.freeze({
375
+ id: definition.id,
376
+ version: definition.version,
377
+ title: definition.title,
378
+ ref: templateRef(definition.id, definition.version),
379
+ slots: definition.slots,
380
+ defaults: definition.defaults,
381
+ presets: definition.presets ?? {},
382
+ values: Object.freeze(values)
383
+ });
384
+ }
385
+ function json(value) {
386
+ return JSON.parse(JSON.stringify(value));
387
+ }
388
+ function templateSchema(t) {
389
+ let slots = {};
390
+ for (let name of Object.keys(t.slots)) slots[name] = json(t.slots[name]);
391
+ return {
392
+ format: TEMPLATE_SCHEMA_FORMAT,
393
+ id: t.id,
394
+ version: t.version,
395
+ title: t.title,
396
+ slots,
397
+ defaults: json(t.defaults),
398
+ presets: json(t.presets)
399
+ };
400
+ }
401
+ var SLOT_KINDS = ["theme", "palette", "character", "scene", "track", "params"];
402
+ function templateFromSchema(schema) {
403
+ let raw = schema;
404
+ if (raw === null || typeof raw != "object" || raw.format !== TEMPLATE_SCHEMA_FORMAT)
405
+ throw new TemplateSlotError([{ slot: "", path: "", reason: `not a template schema (format must be ${TEMPLATE_SCHEMA_FORMAT})` }]);
406
+ let slots = raw.slots ?? {}, bad = Object.keys(slots).filter((name) => typeof slots[name] != "object" || slots[name] === null || !SLOT_KINDS.includes(String(slots[name].kind)));
407
+ if (bad.length > 0) throw new TemplateSlotError(bad.map((slot) => ({ slot, path: "kind", reason: `slot kind must be one of ${SLOT_KINDS.join(", ")}` })));
408
+ return template({
409
+ id: String(raw.id),
410
+ version: Number(raw.version),
411
+ title: String(raw.title ?? raw.id),
412
+ slots,
413
+ defaults: raw.defaults ?? {},
414
+ presets: raw.presets ?? {}
415
+ });
416
+ }
417
+
418
+ // src/game/kit/slots/catalog.ts
419
+ var RUNNER_RIG = LAUNCH_RIG, RUNNER_CLIPS = ["run", "jump", "land", "stumble"], shootoutSlots = template({
420
+ id: "penalty-shootout",
421
+ version: 1,
422
+ title: "Penalty shootout",
423
+ slots: {
424
+ theme: Theme,
425
+ music: Track({ seconds: [20, 600], loop: true }),
426
+ rules: Params({ kicksPerSeries: Int(1, 10), seriesPauseSeconds: Num(0.5, 5) })
427
+ },
428
+ defaults: {
429
+ theme: {},
430
+ music: { id: "shootout-terrace", seconds: 90, loop: true },
431
+ rules: { kicksPerSeries: 5, seriesPauseSeconds: 1.5 }
432
+ },
433
+ presets: {
434
+ music: {
435
+ drums: { id: "shootout-drums", seconds: 48, loop: true, bpm: 120 },
436
+ anthem: { id: "shootout-anthem", seconds: 150, loop: true, bpm: 96 }
437
+ },
438
+ rules: {
439
+ "sudden-death": { kicksPerSeries: 1, seriesPauseSeconds: 1 },
440
+ marathon: { kicksPerSeries: 10, seriesPauseSeconds: 2 }
441
+ }
442
+ }
443
+ }), runnerSlots = template({
444
+ id: "endless-runner",
445
+ version: 1,
446
+ title: "Endless runner",
447
+ slots: {
448
+ theme: Theme,
449
+ hero: Character({ rig: RUNNER_RIG, clips: RUNNER_CLIPS }),
450
+ music: Track({ seconds: [30, 600], loop: true, bpm: [80, 180] }),
451
+ rules: Params({ startSpeed: Num(4, 14), maxSpeed: Num(12, 30), jumpVelocity: Num(5.5, 10) })
452
+ },
453
+ defaults: {
454
+ theme: {},
455
+ hero: { id: "runner", rig: RUNNER_RIG, clips: RUNNER_CLIPS, tint: "#10b981" },
456
+ music: { id: "runner-groove", seconds: 96, loop: true, bpm: 128 },
457
+ rules: { startSpeed: 9, maxSpeed: 22, jumpVelocity: 7.5 }
458
+ },
459
+ presets: {
460
+ hero: {
461
+ sprinter: { id: "sprinter", rig: RUNNER_RIG, clips: RUNNER_CLIPS, tint: "#f97316" },
462
+ ghost: { id: "ghost", rig: RUNNER_RIG, clips: RUNNER_CLIPS, tint: "#a5b4fc" },
463
+ launch: { id: LAUNCH_ITEMS.baseCharacter, rig: RUNNER_RIG, clips: RUNNER_CLIPS, model: LAUNCH_FILES.baseCharacter }
464
+ },
465
+ music: {
466
+ chiptune: { id: "runner-chiptune", seconds: 64, loop: true, bpm: 150 },
467
+ calm: { id: "runner-calm", seconds: 120, loop: true, bpm: 90 }
468
+ },
469
+ rules: {
470
+ chill: { startSpeed: 6, maxSpeed: 14, jumpVelocity: 7.5 },
471
+ turbo: { startSpeed: 12, maxSpeed: 28, jumpVelocity: 8.5 }
472
+ }
473
+ }
474
+ }), SLOT_TEMPLATES = Object.freeze({
475
+ [shootoutSlots.id]: shootoutSlots,
476
+ [runnerSlots.id]: runnerSlots
477
+ });
478
+
479
+ // src/game/kit/slots/scene-ir.ts
480
+ var SOLVED = "solved", SceneReportError = class extends Error {
481
+ constructor(message) {
482
+ super(message), this.name = "SceneReportError";
483
+ }
484
+ };
485
+ function slotSceneFromReport(kind, report, options = {}) {
486
+ if (report.version !== 1) throw new SceneReportError(`placement report version ${report.version} is not 1`);
487
+ if (report.status !== SOLVED) throw new SceneReportError(`scene ${report.scene} is ${report.status}; only a solved scene can fill a slot`);
488
+ let role = (name) => options.roles?.[name] ?? name, anchors2 = [], top = 0;
489
+ for (let p of report.placements) {
490
+ let meta = options.catalogue?.[p.kind];
491
+ top = Math.max(top, p.at[1] + (meta?.height ?? 0)), anchors2.push(meta === void 0 ? { role: role(p.group), position: p.at } : { role: role(p.group), position: p.at, size: [meta.footprint[0], meta.height] });
492
+ }
493
+ for (let [name, at] of Object.entries(options.points ?? {})) anchors2.push({ role: role(name), position: [at[0], 0, at[1]] });
494
+ let area = options.area;
495
+ return area === void 0 ? { id: report.scene, kind, anchors: anchors2 } : { id: report.scene, kind, anchors: anchors2, bounds: { min: [0, 0, 0], max: [area[0], top, area[1]] } };
496
+ }
497
+
498
+ // src/game/kit/slots/manifest.ts
499
+ var REMIX_FORMAT = 1, DIGEST_PREFIX = "sha256:", INLINE_VALUE_BYTES = 256, MAX_REMIX_DEPTH = 64, SHA256_BYTES = 32, HEX_RADIX = 16, DIGEST_PATTERN = /^sha256:[0-9a-f]{64}$/, RemixError = class extends Error {
500
+ constructor(message) {
501
+ super(message), this.name = "RemixError";
502
+ }
503
+ }, ContentRef = class {
504
+ constructor(digest) {
505
+ this.digest = digest;
506
+ if (!DIGEST_PATTERN.test(digest)) throw new RemixError(`${JSON.stringify(digest)} is not a sha256 content digest`);
507
+ }
508
+ };
509
+ function slotContent(digest) {
510
+ return new ContentRef(digest);
511
+ }
512
+ function canonicalSlotJson(value) {
513
+ if (value === null || typeof value == "boolean" || typeof value == "string") return JSON.stringify(value);
514
+ if (typeof value == "number") {
515
+ if (!Number.isFinite(value)) throw new RemixError("a remix cannot hold a non-finite number");
516
+ return JSON.stringify(value);
517
+ }
518
+ if (Array.isArray(value)) return `[${value.map(canonicalSlotJson).join(",")}]`;
519
+ if (typeof value == "object") {
520
+ let record = value;
521
+ return `{${Object.keys(record).filter((k) => record[k] !== void 0).sort().map((k) => `${JSON.stringify(k)}:${canonicalSlotJson(record[k])}`).join(",")}}`;
522
+ }
523
+ throw new RemixError(`a remix cannot hold a ${typeof value}`);
524
+ }
525
+ var encoder = new TextEncoder();
526
+ function hex(bytes) {
527
+ let out = "";
528
+ for (let i = 0; i < bytes.length; i++) out += bytes[i].toString((16)).padStart(2, "0");
529
+ return out;
530
+ }
531
+ function slotDigest(value) {
532
+ let out = new Uint8Array((32));
533
+ return sha256Into(encoder.encode(canonicalSlotJson(value)), out), DIGEST_PREFIX + hex(out);
534
+ }
535
+ function encodeRemix(manifest) {
536
+ return canonicalSlotJson(manifest);
537
+ }
538
+ function remixDigest(manifest) {
539
+ return slotDigest(manifest);
540
+ }
541
+ function isRecord2(value) {
542
+ return typeof value == "object" && value !== null && !Array.isArray(value);
543
+ }
544
+ function isSlotRef(value) {
545
+ if (typeof value == "string") return value.length > 0;
546
+ if (!isRecord2(value)) return false;
547
+ let keys = Object.keys(value);
548
+ return keys.length !== 1 ? false : keys[0] === "value" ? true : keys[0] === "content" && typeof value.content == "string" && DIGEST_PATTERN.test(value.content);
549
+ }
550
+ function decodeRemix(input) {
551
+ let raw = input;
552
+ if (typeof input == "string")
553
+ try {
554
+ raw = JSON.parse(input);
555
+ } catch {
556
+ throw new RemixError("a remix manifest is JSON");
557
+ }
558
+ if (!isRecord2(raw)) throw new RemixError("a remix manifest is a JSON object");
559
+ let extra = Object.keys(raw).filter((k) => !["remix", "template", "parent", "slots"].includes(k));
560
+ if (extra.length > 0) throw new RemixError(`a remix manifest has no ${extra.join(", ")}`);
561
+ if (raw.remix !== (1)) throw new RemixError(`unsupported remix format ${JSON.stringify(raw.remix)}; this SDK reads format ${(1)}`);
562
+ if (typeof raw.template != "string" || !raw.template.includes("@")) throw new RemixError("a remix names its template as id@version");
563
+ if (raw.parent !== null && (typeof raw.parent != "string" || !DIGEST_PATTERN.test(raw.parent))) throw new RemixError("a remix parent is null or a sha256 manifest digest");
564
+ if (!isRecord2(raw.slots)) throw new RemixError("a remix has a slots object");
565
+ for (let [slot, ref] of Object.entries(raw.slots)) {
566
+ if (!isSlotRef(ref)) throw new RemixError(`slot "${slot}" must be a preset name, { "value": ... } or { "content": "sha256:..." }`);
567
+ canonicalSlotJson(ref);
568
+ }
569
+ return { remix: (1), template: raw.template, parent: raw.parent, slots: raw.slots };
570
+ }
571
+ function chain(manifest, sources) {
572
+ let out = [manifest], seen = /* @__PURE__ */ new Set([remixDigest(manifest)]), parent = manifest.parent;
573
+ for (; parent !== null; ) {
574
+ if (seen.has(parent)) throw new RemixError(`remix lineage loops back to ${parent}`);
575
+ if (out.length > (64)) throw new RemixError(`remix lineage is deeper than ${(64)}`);
576
+ seen.add(parent);
577
+ let found = sources.manifest?.(parent);
578
+ if (found === void 0) throw new RemixError(`parent remix ${parent} is not available`);
579
+ if (remixDigest(found) !== parent) throw new RemixError(`parent remix ${parent} does not match its digest`);
580
+ if (found.template !== manifest.template) throw new RemixError(`parent remix ${parent} remixes ${found.template}, not ${manifest.template}`);
581
+ out.push(found), parent = found.parent;
582
+ }
583
+ return out.reverse();
584
+ }
585
+ function remixLineage(manifest, sources = {}) {
586
+ let ancestors = chain(manifest, sources).slice(0, -1).map(remixDigest).reverse();
587
+ return { template: manifest.template, digest: remixDigest(manifest), ancestors };
588
+ }
589
+ function lookupRef(t, slot, ref, sources, issues) {
590
+ if (typeof ref == "string") {
591
+ let presets = slotPresets(t, slot);
592
+ if (!(ref in presets)) {
593
+ let names = Object.keys(presets);
594
+ issues.push({ slot, path: "", reason: names.length > 0 ? `${JSON.stringify(ref)} is not a preset (choose ${names.join(", ")})` : `${JSON.stringify(ref)} is not a preset; this slot has none, so give a value` });
595
+ return;
596
+ }
597
+ return presets[ref];
598
+ }
599
+ if ("value" in ref) return ref.value;
600
+ let found = sources.content?.(ref.content);
601
+ if (found === void 0) {
602
+ issues.push({ slot, path: "", reason: `content ${ref.content} is not available` });
603
+ return;
604
+ }
605
+ if (slotDigest(found) !== ref.content) {
606
+ issues.push({ slot, path: "", reason: `content ${ref.content} does not match its digest` });
607
+ return;
608
+ }
609
+ return found;
610
+ }
611
+ function applyRefs(t, slots, values, sources, issues) {
612
+ for (let slot of Object.keys(slots)) {
613
+ let type = t.slots[slot];
614
+ if (type === void 0) {
615
+ issues.push({ slot, path: "", reason: `${t.id} has no slot named ${slot} (it has ${Object.keys(t.slots).join(", ")})` });
616
+ continue;
617
+ }
618
+ let raw = lookupRef(t, slot, slots[slot], sources, issues);
619
+ if (raw === void 0) continue;
620
+ let check = checkSlot(slot, type, raw);
621
+ issues.push(...check.issues), check.value !== null && (values[slot] = check.value);
622
+ }
623
+ }
624
+ function resolveRemix(t, manifest, sources = {}) {
625
+ if (manifest.template !== t.ref) throw new RemixError(`this remix is of ${manifest.template}, not ${t.ref}`);
626
+ let values = { ...t.values }, issues = [];
627
+ for (let m of chain(manifest, sources)) applyRefs(t, m.slots, values, sources, issues);
628
+ if (issues.length > 0) throw new TemplateSlotError(issues);
629
+ return Object.freeze(values);
630
+ }
631
+ function remix(t, set, options = {}) {
632
+ let parent = options.parent ?? null, parentDigest = parent === null ? null : remixDigest(parent), content = {}, slots = {};
633
+ for (let slot of Object.keys(set).sort()) {
634
+ let value = set[slot];
635
+ if (value !== void 0)
636
+ if (typeof value == "string") slots[slot] = value;
637
+ else if (value instanceof ContentRef) slots[slot] = { content: value.digest };
638
+ else {
639
+ let text = canonicalSlotJson(value), copy = JSON.parse(text);
640
+ if (t.slots[slot]?.kind === "params" || encoder.encode(text).length <= (256)) slots[slot] = { value: copy };
641
+ else {
642
+ let digest = slotDigest(copy);
643
+ content[digest] = copy, slots[slot] = { content: digest };
644
+ }
645
+ }
646
+ }
647
+ let manifest = { remix: (1), template: t.ref, parent: parentDigest, slots }, given = options.sources ?? {};
648
+ return resolveRemix(t, manifest, {
649
+ manifest: (digest) => parent !== null && digest === parentDigest ? parent : given.manifest?.(digest),
650
+ content: (digest) => content[digest] ?? given.content?.(digest)
651
+ }), { manifest, digest: remixDigest(manifest), content };
652
+ }
653
+ function memoryRemixSources(remixes = []) {
654
+ let manifests = /* @__PURE__ */ new Map(), blobs = /* @__PURE__ */ new Map(), add = (r) => {
655
+ manifests.set(r.digest, r.manifest);
656
+ for (let [digest, value] of Object.entries(r.content)) blobs.set(digest, value);
657
+ };
658
+ for (let r of remixes) add(r);
659
+ return {
660
+ add,
661
+ manifest: (digest) => manifests.get(digest),
662
+ content: (digest) => blobs.get(digest)
663
+ };
664
+ }
665
+
666
+ // src/game/kit/slots/assign.ts
667
+ var TEMPLATE_SLOTS_FLAG = "CIMPLIFY_TEMPLATE_SLOTS";
668
+ function templateSlotsEnabled(env) {
669
+ let value = env[TEMPLATE_SLOTS_FLAG];
670
+ return value !== "0" && value !== "false";
671
+ }
672
+ var FILE_PREFIX = "@";
673
+ function parseJson(text) {
674
+ try {
675
+ return { ok: !0, value: JSON.parse(text) };
676
+ } catch {
677
+ return { ok: false };
678
+ }
679
+ }
680
+ function literal(text) {
681
+ let parsed = parseJson(text);
682
+ return parsed.ok ? parsed.value : text;
683
+ }
684
+ function slotChoices(t, slot) {
685
+ let type = t.slots[slot];
686
+ if (type === void 0) return "";
687
+ let presets = Object.keys(slotPresets(t, slot)), shape = describeSlot(type);
688
+ return presets.length > 0 ? `${shape}; presets: ${presets.join(", ")}` : shape;
689
+ }
690
+ function assignSlots(t, pairs, options = {}) {
691
+ let issues = [], set = {}, params = {}, base = options.base ?? t.values;
692
+ for (let pair of pairs) {
693
+ let eq = pair.indexOf("=");
694
+ if (eq <= 0) {
695
+ issues.push({ slot: pair, path: "", reason: "write slot=value (or params as slot.field=value)" });
696
+ continue;
697
+ }
698
+ let key = pair.slice(0, eq), text = pair.slice(eq + 1), dot = key.indexOf("."), slot = dot < 0 ? key : key.slice(0, dot), type = t.slots[slot];
699
+ if (type === void 0) {
700
+ issues.push({ slot, path: "", reason: `${t.id} has no slot named ${slot} (it has ${Object.keys(t.slots).join(", ")})` });
701
+ continue;
702
+ }
703
+ if (text.startsWith(FILE_PREFIX)) {
704
+ if (options.readFile === void 0) {
705
+ issues.push({ slot, path: "", reason: "cannot read files here" });
706
+ continue;
707
+ }
708
+ try {
709
+ text = options.readFile(text.slice(FILE_PREFIX.length));
710
+ } catch (error) {
711
+ issues.push({ slot, path: "", reason: `could not read ${text.slice(FILE_PREFIX.length)}: ${error.message}` });
712
+ continue;
713
+ }
714
+ }
715
+ if (dot >= 0) {
716
+ let field = key.slice(dot + 1);
717
+ if (type.kind !== "params") {
718
+ issues.push({ slot, path: field, reason: `${slot} is ${describeSlot(type)}, so it takes a whole value, not ${field}` });
719
+ continue;
720
+ }
721
+ if (!(field in type.fields)) {
722
+ issues.push({ slot, path: field, reason: `${slot} has no ${field} (it has ${Object.keys(type.fields).join(", ")})` });
723
+ continue;
724
+ }
725
+ let current = params[slot] ?? { ...base[slot] ?? {} };
726
+ current[field] = literal(text), params[slot] = current;
727
+ continue;
728
+ }
729
+ if (text.startsWith(DIGEST_PREFIX)) {
730
+ try {
731
+ set[slot] = new ContentRef(text);
732
+ } catch (error) {
733
+ issues.push({ slot, path: "", reason: error.message });
734
+ }
735
+ continue;
736
+ }
737
+ let parsed = parseJson(text);
738
+ if (parsed.ok && typeof parsed.value == "object" && parsed.value !== null) {
739
+ set[slot] = type.kind === "params" ? { ...base[slot] ?? {}, ...parsed.value } : parsed.value;
740
+ continue;
741
+ }
742
+ if (type.kind === "params") {
743
+ issues.push({ slot, path: "", reason: `params are set per field, e.g. ${slot}.${Object.keys(type.fields)[0] ?? "field"}=value` });
744
+ continue;
745
+ }
746
+ if (!(text in slotPresets(t, slot))) {
747
+ issues.push({ slot, path: "", reason: `${JSON.stringify(text)} does not fit: the slot takes ${slotChoices(t, slot)}` });
748
+ continue;
749
+ }
750
+ set[slot] = text;
751
+ }
752
+ for (let slot of Object.keys(params)) set[slot] = params[slot];
753
+ if (issues.length > 0) throw new TemplateSlotError(issues);
754
+ return set;
755
+ }
756
+
757
+ export { Bool, Character, Choice, ContentRef, DIGEST_PREFIX, INLINE_VALUE_BYTES, Int, MAX_REMIX_DEPTH, Num, Palette, Params, REMIX_FORMAT, RemixError, SLOT_TEMPLATES, SceneReportError, SceneSlot, TEMPLATE_SCHEMA_FORMAT, TEMPLATE_SLOTS_FLAG, THEME_PRESETS, TemplateSlotError, Theme, Track, anchors, assignSlots, canonicalSlotJson, checkSlot, colorInt, contrastRatio, decodeRemix, describeIssue, describeSlot, encodeRemix, memoryRemixSources, parseColor, remix, remixDigest, remixLineage, resolveRemix, runnerSlots, shootoutSlots, slotChoices, slotContent, slotDigest, slotPresets, slotSceneFromReport, template, templateFromSchema, templateRef, templateSchema, templateSlotsEnabled };