@holoscript/core 8.0.8 → 8.0.10

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 (463) hide show
  1. package/LICENSE +21 -0
  2. package/bin/holoscript.cjs +5 -1
  3. package/dist/GLTFPipeline-L76YTXKA.js +15 -0
  4. package/dist/GLTFPipeline-ZWJN7GI6.cjs +36 -0
  5. package/dist/HoloCompositionParser-K76KTEEE.js +12 -0
  6. package/dist/HoloCompositionParser-UZH6Y4HO.cjs +45 -0
  7. package/dist/HoloScriptCodeParser-2D4ERFUZ.js +6 -0
  8. package/dist/HoloScriptCodeParser-UDRLDA7I.cjs +23 -0
  9. package/dist/HoloScriptPlusParser-FTMCGWXD.js +13 -0
  10. package/dist/HoloScriptPlusParser-LQR5GIKF.cjs +30 -0
  11. package/dist/HoloScriptRuntime-UTRLJI5L.js +12 -0
  12. package/dist/HoloScriptRuntime-YBYXJHJN.cjs +21 -0
  13. package/dist/SceneIRCompiler-63KA3M2F.js +17 -0
  14. package/dist/SceneIRCompiler-KWUFHZ4O.cjs +42 -0
  15. package/dist/{USDZExporter-AUHZODOF.cjs → USDZExporter-ML4UMIGC.cjs} +3 -3
  16. package/dist/{USDZExporter-GXB4AUSG.js → USDZExporter-ZFKLQ76G.js} +3 -3
  17. package/dist/agents/index.cjs +1 -1
  18. package/dist/agents/index.js +1 -1
  19. package/dist/audit/AuditLogger.d.ts +106 -0
  20. package/dist/audit/AuditQueryBuilder.d.ts +79 -0
  21. package/dist/audit/ComplianceReporter.d.ts +90 -0
  22. package/dist/audit/index.d.ts +13 -0
  23. package/dist/{chunk-FGMDMJM7.js → chunk-2BYAUHBO.js} +3 -3
  24. package/dist/{chunk-EDPYCLRC.cjs → chunk-2E6PP5UE.cjs} +83 -59
  25. package/dist/{chunk-GASCWJK5.js → chunk-2EGGAZT3.js} +65 -287
  26. package/dist/{chunk-SIEXCILW.js → chunk-2I3XAGMF.js} +3 -3
  27. package/dist/{chunk-OS533P33.cjs → chunk-2KKOYZYI.cjs} +1074 -1655
  28. package/dist/chunk-2MQKNDNH.js +51 -0
  29. package/dist/{chunk-7DMMMBCY.cjs → chunk-2X3IPCBK.cjs} +10 -10
  30. package/dist/chunk-2ZOTBO25.cjs +202 -0
  31. package/dist/chunk-356N4NPM.cjs +152 -0
  32. package/dist/{chunk-X3GJPRVK.cjs → chunk-36NPLOI4.cjs} +92 -81
  33. package/dist/{chunk-SLU6UPJI.cjs → chunk-37HHY7RH.cjs} +5 -5
  34. package/dist/{chunk-YDPEHCCI.cjs → chunk-3CDDRUER.cjs} +3 -118
  35. package/dist/chunk-3F7ZZWIN.js +1651 -0
  36. package/dist/chunk-3ILD7TKP.cjs +187 -0
  37. package/dist/{chunk-X27QRG4C.cjs → chunk-3IUHTGDD.cjs} +153 -41
  38. package/dist/{chunk-PXNZ6TME.js → chunk-4376VHNJ.js} +60 -36
  39. package/dist/{chunk-YKGPCZEE.cjs → chunk-4FIBOJW6.cjs} +10 -10
  40. package/dist/chunk-4Q7RKQQI.cjs +14195 -0
  41. package/dist/{chunk-YCM6QQRT.cjs → chunk-566ZB4LZ.cjs} +180 -8
  42. package/dist/{chunk-2Y3V22SG.js → chunk-5CURIYGT.js} +3 -3
  43. package/dist/{chunk-QBWNJXNR.js → chunk-5FYMCVBY.js} +5 -5
  44. package/dist/{chunk-ZA34AN3R.js → chunk-5LVFTGKH.js} +841 -12
  45. package/dist/{chunk-Z6PMDS4G.js → chunk-5OUOMBKK.js} +1090 -53
  46. package/dist/chunk-63AUAIL6.js +48 -0
  47. package/dist/chunk-655FATJU.js +110 -0
  48. package/dist/{chunk-TQ377OLB.cjs → chunk-65S62L4D.cjs} +28 -22
  49. package/dist/chunk-6NTAZN5Z.cjs +502 -0
  50. package/dist/chunk-6TRX6AR2.js +9376 -0
  51. package/dist/chunk-6ZCCLKS2.cjs +51 -0
  52. package/dist/{chunk-MDR235RZ.js → chunk-734OB5SK.js} +721 -8
  53. package/dist/{chunk-Q2Q34NF3.js → chunk-77QI552M.js} +6 -6
  54. package/dist/{chunk-WKX5AMOY.js → chunk-7I74JWPW.js} +3 -3
  55. package/dist/{chunk-5FSKKMR7.cjs → chunk-7IDJDMPU.cjs} +232 -4
  56. package/dist/chunk-7VBKRGIZ.cjs +847 -0
  57. package/dist/{chunk-KCPHASCO.js → chunk-AATYYLYK.js} +5 -5
  58. package/dist/{chunk-DTGBOSEM.cjs → chunk-AWXFEAQL.cjs} +12 -12
  59. package/dist/{chunk-THCK6ECW.js → chunk-B3CWTCK2.js} +231 -3
  60. package/dist/chunk-BCP4E7MD.cjs +997 -0
  61. package/dist/chunk-BG7RPYJP.js +91 -0
  62. package/dist/{chunk-VF257YKO.js → chunk-BP4KTMLY.js} +117 -5
  63. package/dist/{chunk-YN6IETRZ.js → chunk-BQJ3YBF3.js} +6424 -987
  64. package/dist/{chunk-7X5PNIQJ.js → chunk-BXSOEQI3.js} +27 -25
  65. package/dist/{chunk-WFKVS2K4.cjs → chunk-C65C5VED.cjs} +1101 -55
  66. package/dist/{chunk-KOUAQL2B.cjs → chunk-CANAL6CT.cjs} +1569 -168
  67. package/dist/{chunk-FDSGHPAK.js → chunk-CBSDJF3B.js} +3 -3
  68. package/dist/{chunk-FEWUHQNM.cjs → chunk-CFVK26P4.cjs} +4 -4
  69. package/dist/{chunk-M7K4LE66.cjs → chunk-CI33NINL.cjs} +4 -4
  70. package/dist/{chunk-2OWDB4FB.js → chunk-CKV5NYAE.js} +6 -6
  71. package/dist/{chunk-LPS5AMQD.cjs → chunk-CM4NHXVO.cjs} +24 -24
  72. package/dist/chunk-D3HSRXYB.js +115 -0
  73. package/dist/{chunk-FNHJRI32.js → chunk-DBH3D2MU.js} +1561 -160
  74. package/dist/{chunk-GW3LKD5C.js → chunk-DJNH4HFW.js} +3 -3
  75. package/dist/{chunk-2GCNOI2U.cjs → chunk-DN6F4DHH.cjs} +9 -3
  76. package/dist/chunk-DQRJ5RJG.js +432 -0
  77. package/dist/{chunk-C7ZBSV2Q.js → chunk-DUG3OQAS.js} +106 -43
  78. package/dist/chunk-ECUYJOJ2.cjs +199 -0
  79. package/dist/chunk-EEMTCAK7.js +182 -0
  80. package/dist/{chunk-3SKLAUDD.cjs → chunk-EI3J6LTW.cjs} +359 -581
  81. package/dist/{chunk-SSSN7VAM.js → chunk-EM2OGPYE.js} +4 -4
  82. package/dist/{chunk-56VOWURB.cjs → chunk-ENZCIQZC.cjs} +522 -453
  83. package/dist/chunk-ESBXUYOC.cjs +836 -0
  84. package/dist/{chunk-L5U4W6JC.js → chunk-ESSEF6U2.js} +4 -4
  85. package/dist/chunk-ET3AN4W3.js +824 -0
  86. package/dist/chunk-EXKSFGSX.cjs +14 -14
  87. package/dist/{chunk-I76GIKN7.cjs → chunk-F3YT6GUF.cjs} +17 -17
  88. package/dist/{chunk-WRWEX5ZF.js → chunk-F75DZBBI.js} +3 -3
  89. package/dist/{chunk-4JGRWHZJ.js → chunk-FG6PYGIZ.js} +12 -6
  90. package/dist/chunk-FGGJQRLZ.js +14 -14
  91. package/dist/{chunk-SXOSDZD6.js → chunk-FWCHPCD4.js} +128 -10
  92. package/dist/{chunk-XW6IXEQH.cjs → chunk-G35CAQ7I.cjs} +5 -5
  93. package/dist/{chunk-7VMGP2FW.js → chunk-G6KACNMO.js} +132 -188
  94. package/dist/{chunk-FJPADH77.cjs → chunk-GAWJJAGT.cjs} +6 -6
  95. package/dist/chunk-GGR7QUKK.cjs +4724 -0
  96. package/dist/chunk-GIBF4BHH.js +14098 -0
  97. package/dist/{chunk-AWB7QYY6.cjs → chunk-GILYQ5VH.cjs} +6 -6
  98. package/dist/{chunk-FWVYAMNW.cjs → chunk-GKFCHGCM.cjs} +4 -4
  99. package/dist/{chunk-Y3ZFVUUU.js → chunk-GLEJ2TLS.js} +3 -3
  100. package/dist/{chunk-3GWWJT7L.js → chunk-GP3OKSKT.js} +13 -13
  101. package/dist/chunk-GTIPOEHN.js +196 -0
  102. package/dist/{chunk-LMJ5EBV7.cjs → chunk-GZPUA2TL.cjs} +16 -15
  103. package/dist/{chunk-IELX2OKI.js → chunk-H4LJ4HEA.js} +3 -115
  104. package/dist/{chunk-ACVWFGBI.cjs → chunk-HCX4SMFK.cjs} +3 -3
  105. package/dist/{chunk-HYNTS5CP.js → chunk-HHRZ6STP.js} +24 -2
  106. package/dist/chunk-HIDEIEFG.js +48 -0
  107. package/dist/{chunk-W6RW64BB.cjs → chunk-HSWBIDZM.cjs} +228 -5
  108. package/dist/{chunk-GSOUNWEL.js → chunk-HVX7QQYK.js} +1035 -1616
  109. package/dist/{chunk-TRCGG42I.cjs → chunk-IFW5IW4L.cjs} +6502 -1019
  110. package/dist/{chunk-F5LKJ6F5.cjs → chunk-IJU6AS67.cjs} +32 -28
  111. package/dist/{chunk-TVANHNJ7.js → chunk-IK6Z2HNC.js} +173 -3
  112. package/dist/{chunk-QGMUTVVH.cjs → chunk-IS7NTKY5.cjs} +20 -20
  113. package/dist/{chunk-YFVQWSNJ.js → chunk-IXWGYWH6.js} +3 -3
  114. package/dist/chunk-J2DAS2PL.js +148 -0
  115. package/dist/chunk-JBQXZIWB.js +148 -0
  116. package/dist/chunk-JBYBMBMW.js +261 -0
  117. package/dist/{chunk-LWUOUCYL.js → chunk-JEJ7TT54.js} +5 -5
  118. package/dist/{chunk-DUCB6LGL.js → chunk-JOTCTHN5.js} +211 -5
  119. package/dist/{chunk-47RUFYKR.js → chunk-K56UVEXV.js} +3 -3
  120. package/dist/{chunk-XSFNHP2E.js → chunk-KB26H447.js} +3 -3
  121. package/dist/{chunk-3NGDZZR4.js → chunk-KEYG7HGY.js} +430 -37
  122. package/dist/{chunk-DY72BMU5.js → chunk-KFVNCW4Q.js} +4 -4
  123. package/dist/chunk-KPGC7SK2.js +192 -0
  124. package/dist/chunk-KROXXBK5.cjs +53 -0
  125. package/dist/{chunk-ZPZAVHXL.cjs → chunk-LB3ZZMKT.cjs} +137 -19
  126. package/dist/chunk-LDYZWNJW.cjs +1654 -0
  127. package/dist/{chunk-UGXHYIWT.cjs → chunk-LHNHO27U.cjs} +28 -28
  128. package/dist/{chunk-ULMSSHCJ.cjs → chunk-LMB555QB.cjs} +405 -38
  129. package/dist/{chunk-CBJY23VL.js → chunk-MD4IVS42.js} +3 -3
  130. package/dist/{chunk-VMLKSV26.js → chunk-MDDWEBCX.js} +226 -3
  131. package/dist/chunk-MUWH4QK5.cjs +94 -0
  132. package/dist/{chunk-T6W3Z3SH.cjs → chunk-N2ILK7BF.cjs} +4 -4
  133. package/dist/{chunk-6EX3I5P4.cjs → chunk-N74QRJGP.cjs} +6 -6
  134. package/dist/chunk-NFFHLX37.cjs +132 -0
  135. package/dist/chunk-NJSYWX7H.js +190 -0
  136. package/dist/{chunk-SH5PPVK7.cjs → chunk-NQN5LFN4.cjs} +165 -221
  137. package/dist/chunk-NTQRFOPP.cjs +56 -0
  138. package/dist/{chunk-YFWRJW4B.js → chunk-NWMJPTVL.js} +51 -55
  139. package/dist/{chunk-63ZGNR2T.cjs → chunk-OC6GV5QH.cjs} +42 -42
  140. package/dist/{chunk-7E7GCQCK.js → chunk-OG3MBHM3.js} +9 -3
  141. package/dist/chunk-OMNHTCS4.cjs +264 -0
  142. package/dist/chunk-OQXB6NNC.cjs +117 -0
  143. package/dist/{chunk-Y57W2CT5.cjs → chunk-OV46CCA2.cjs} +51 -55
  144. package/dist/{chunk-6PRZIHGL.cjs → chunk-OV6HHKLE.cjs} +21 -266
  145. package/dist/{chunk-C37BHB7N.cjs → chunk-P26YYPOO.cjs} +5 -5
  146. package/dist/{chunk-2BZHWUSR.cjs → chunk-P7JEKJTZ.cjs} +16 -16
  147. package/dist/{chunk-NGBXXZLL.cjs → chunk-PDXX5UI4.cjs} +45 -45
  148. package/dist/{chunk-FHQFPYV4.js → chunk-PJFTTSKE.js} +8 -7
  149. package/dist/{chunk-GVFJ6T4S.cjs → chunk-PVODJEJ7.cjs} +721 -8
  150. package/dist/{chunk-ZZ7RO2UQ.js → chunk-Q265VZJ4.js} +3 -3
  151. package/dist/{chunk-E7JP3BS3.cjs → chunk-Q47JEE2C.cjs} +4 -4
  152. package/dist/chunk-QBY7LRN2.js +281 -0
  153. package/dist/{chunk-GH6C2QGW.cjs → chunk-QEDMOGF3.cjs} +857 -16
  154. package/dist/{chunk-5WUNN6ZN.cjs → chunk-QHSAVOOL.cjs} +24 -2
  155. package/dist/chunk-QJNCDVYM.cjs +137 -0
  156. package/dist/chunk-QM7FJB5W.js +4717 -0
  157. package/dist/chunk-QQFB4RT2.cjs +448 -0
  158. package/dist/chunk-QSYBHQAD.cjs +196 -0
  159. package/dist/{chunk-2YSNA2F2.cjs → chunk-QVJMDVYZ.cjs} +5 -5
  160. package/dist/chunk-RAJMAX6D.js +131 -0
  161. package/dist/{chunk-VVKVQZI6.js → chunk-RAN3ECAS.js} +3 -3
  162. package/dist/chunk-RKGUZBOC.js +79 -0
  163. package/dist/{chunk-HLFDZ35S.cjs → chunk-RRQIAJLQ.cjs} +8 -8
  164. package/dist/{chunk-PABONWKI.js → chunk-RXQNRZ5F.js} +3 -3
  165. package/dist/{chunk-7ZHYEITD.cjs → chunk-S4O7CFHQ.cjs} +10 -11
  166. package/dist/chunk-SE7ANBGN.js +128 -0
  167. package/dist/{chunk-X2AVEAZM.cjs → chunk-SJIRCTIS.cjs} +176 -2
  168. package/dist/{chunk-WXQ57LAO.js → chunk-SQXAZHDG.js} +4 -4
  169. package/dist/chunk-SR73L5ZP.cjs +84 -0
  170. package/dist/{chunk-OABEO6HH.js → chunk-SZOLTWWD.js} +2349 -214
  171. package/dist/{chunk-5JEU52DW.js → chunk-TPZ3BN2D.js} +3 -3
  172. package/dist/{chunk-QFU53KRH.js → chunk-TSTFYGGX.js} +4 -5
  173. package/dist/{chunk-EBS32AJI.cjs → chunk-TZCFKZ6Z.cjs} +5 -5
  174. package/dist/chunk-UCVZXQ63.js +724 -0
  175. package/dist/chunk-UGQ3QNV6.js +992 -0
  176. package/dist/chunk-UNMVGZVW.js +142 -0
  177. package/dist/{chunk-TEVX443G.js → chunk-UTUD6GJI.js} +178 -6
  178. package/dist/chunk-UXBYA7DV.cjs +155 -0
  179. package/dist/chunk-V6GXFSK7.cjs +443 -0
  180. package/dist/chunk-VHORVGCG.cjs +761 -0
  181. package/dist/{chunk-B4EKV6HQ.js → chunk-VKCTYLDN.js} +500 -442
  182. package/dist/{chunk-O3MGZDCT.cjs → chunk-VTEXJOSD.cjs} +63 -63
  183. package/dist/chunk-VVAAZITA.cjs +287 -0
  184. package/dist/{chunk-V7AKE5VT.cjs → chunk-W2GA3EQB.cjs} +435 -42
  185. package/dist/chunk-W4GABFCR.js +37 -0
  186. package/dist/chunk-WKEK4NCA.js +490 -0
  187. package/dist/{chunk-5A4TCHOC.cjs → chunk-WNYXT4TE.cjs} +4 -4
  188. package/dist/{chunk-S762UEV5.js → chunk-WTH23ISI.js} +6 -6
  189. package/dist/{chunk-BTKZGHAV.js → chunk-WWNCM473.js} +10 -6
  190. package/dist/{chunk-4YNYPHH3.cjs → chunk-X75H75UY.cjs} +2351 -213
  191. package/dist/{chunk-LYJJI7ZK.cjs → chunk-XCUDDFKC.cjs} +216 -9
  192. package/dist/chunk-YAO4HPJL.cjs +120 -0
  193. package/dist/chunk-YKY2JBER.cjs +9443 -0
  194. package/dist/chunk-YP5CHEYU.cjs +154 -0
  195. package/dist/{chunk-WRNEH5MO.js → chunk-YW3I2FQL.js} +18 -7
  196. package/dist/{chunk-BRNUPDHJ.js → chunk-Z557DVYN.js} +386 -19
  197. package/dist/{chunk-VSACG2AR.js → chunk-Z6LZUYZF.js} +21 -264
  198. package/dist/chunk-ZHPMP447.cjs +43 -0
  199. package/dist/{chunk-LODTHGST.cjs → chunk-ZK7KX5CD.cjs} +133 -70
  200. package/dist/{chunk-CCPSNT6B.cjs → chunk-ZRPALBQB.cjs} +5 -5
  201. package/dist/chunk-ZVFHPMC5.js +824 -0
  202. package/dist/chunk-ZVQMKUGJ.js +443 -0
  203. package/dist/cli/holoscript-runner.cjs +86 -48
  204. package/dist/cli/holoscript-runner.js +54 -16
  205. package/dist/codebase/index.cjs +1 -1
  206. package/dist/codebase/index.js +1 -1
  207. package/dist/compiler/agent-inference.cjs +11 -11
  208. package/dist/compiler/agent-inference.js +9 -6
  209. package/dist/compiler/android-xr.cjs +13 -12
  210. package/dist/compiler/android-xr.js +11 -10
  211. package/dist/compiler/android.cjs +12 -12
  212. package/dist/compiler/android.js +10 -10
  213. package/dist/compiler/business-quest.cjs +10 -10
  214. package/dist/compiler/business-quest.js +2 -2
  215. package/dist/compiler/coco.cjs +1 -1
  216. package/dist/compiler/coco.js +1 -1
  217. package/dist/compiler/context.cjs +9 -9
  218. package/dist/compiler/context.js +6 -6
  219. package/dist/compiler/daimon-seed.cjs +36 -0
  220. package/dist/compiler/daimon-seed.js +12 -0
  221. package/dist/compiler/domain-block-utils.cjs +205 -156
  222. package/dist/compiler/domain-block-utils.js +8 -7
  223. package/dist/compiler/dtdl.cjs +10 -10
  224. package/dist/compiler/dtdl.js +7 -7
  225. package/dist/compiler/gltf-pipeline.cjs +9 -9
  226. package/dist/compiler/gltf-pipeline.js +2 -2
  227. package/dist/compiler/godot.cjs +10 -9
  228. package/dist/compiler/godot.js +9 -8
  229. package/dist/compiler/incremental.cjs +11 -11
  230. package/dist/compiler/incremental.js +6 -6
  231. package/dist/compiler/index.cjs +2585 -3273
  232. package/dist/compiler/index.d.ts +149 -35
  233. package/dist/compiler/index.js +2197 -3102
  234. package/dist/compiler/ios.cjs +11 -11
  235. package/dist/compiler/ios.js +9 -9
  236. package/dist/compiler/llm-provider-capabilities.cjs +9 -9
  237. package/dist/compiler/llm-provider-capabilities.js +6 -6
  238. package/dist/compiler/nodetoy.cjs +1 -1
  239. package/dist/compiler/nodetoy.js +1 -1
  240. package/dist/compiler/openxr.cjs +11 -10
  241. package/dist/compiler/openxr.js +10 -9
  242. package/dist/compiler/remotion.cjs +1 -1
  243. package/dist/compiler/remotion.js +1 -1
  244. package/dist/compiler/reproducibility.cjs +1 -1
  245. package/dist/compiler/reproducibility.js +1 -1
  246. package/dist/compiler/sdf.cjs +11 -10
  247. package/dist/compiler/sdf.js +9 -8
  248. package/dist/compiler/semantic-scene.cjs +7 -7
  249. package/dist/compiler/semantic-scene.js +2 -2
  250. package/dist/compiler/state.cjs +9 -9
  251. package/dist/compiler/state.js +7 -7
  252. package/dist/compiler/trait-composition.cjs +11 -11
  253. package/dist/compiler/trait-composition.js +7 -7
  254. package/dist/compiler/traits/ProvenanceSemiring.d.ts +167 -0
  255. package/dist/compiler/traits/Semiring.d.ts +26 -0
  256. package/dist/compiler/unity.cjs +11 -10
  257. package/dist/compiler/unity.js +10 -9
  258. package/dist/compiler/unreal.cjs +12 -11
  259. package/dist/compiler/unreal.js +10 -9
  260. package/dist/compiler/urdf.cjs +18 -17
  261. package/dist/compiler/urdf.js +9 -8
  262. package/dist/compiler/usd-physics.cjs +11 -10
  263. package/dist/compiler/usd-physics.js +8 -7
  264. package/dist/compiler/visionos.cjs +11 -10
  265. package/dist/compiler/visionos.js +10 -9
  266. package/dist/compiler/vrchat.cjs +11 -10
  267. package/dist/compiler/vrchat.js +9 -8
  268. package/dist/compiler/wasm.cjs +14 -13
  269. package/dist/compiler/wasm.js +9 -8
  270. package/dist/compiler/webgpu.cjs +10 -9
  271. package/dist/compiler/webgpu.js +9 -8
  272. package/dist/constants.cjs +398 -0
  273. package/dist/constants.js +9 -0
  274. package/dist/coordinators/index.cjs +4 -1
  275. package/dist/coordinators/index.js +4 -1
  276. package/dist/debugger.cjs +11 -9
  277. package/dist/debugger.js +9 -7
  278. package/dist/{dist-ACXG6IH5.cjs → dist-GRMOP2UL.cjs} +341 -65
  279. package/dist/{dist-VD4L6V7Q.js → dist-ZBUKU2JG.js} +333 -63
  280. package/dist/entries/interop.cjs +23 -23
  281. package/dist/entries/interop.js +3 -3
  282. package/dist/entries/scripting.cjs +12 -11
  283. package/dist/entries/scripting.js +8 -7
  284. package/dist/evolution/index.cjs +66 -0
  285. package/dist/evolution/index.d.ts +162 -0
  286. package/dist/evolution/index.js +17 -0
  287. package/dist/hololand/index.cjs +41 -37
  288. package/dist/hololand/index.js +3 -3
  289. package/dist/index.cjs +12394 -3224
  290. package/dist/index.d.ts +260 -18
  291. package/dist/index.js +10755 -2182
  292. package/dist/keyword-registry/PluginKeywordRegistry.d.ts +138 -0
  293. package/dist/keyword-registry/index.cjs +29 -0
  294. package/dist/keyword-registry/index.d.ts +1 -0
  295. package/dist/keyword-registry/index.js +4 -0
  296. package/dist/math/tropical-spmv.cjs +11 -11
  297. package/dist/math/tropical-spmv.d.ts +1 -0
  298. package/dist/math/tropical-spmv.js +2 -2
  299. package/dist/math/tropicalSpmv.d.ts +43 -0
  300. package/dist/math/vec3.cjs +1 -1
  301. package/dist/math/vec3.js +1 -1
  302. package/dist/matter/StagedMatter.d.ts +82 -0
  303. package/dist/matter/index.cjs +17 -0
  304. package/dist/matter/index.d.ts +1 -0
  305. package/dist/matter/index.js +4 -0
  306. package/dist/{ml-dsa-Z7JDKW4L.js → ml-dsa-J6VKVT4K.js} +3 -3
  307. package/dist/{ml-dsa-FSKBTE3W.cjs → ml-dsa-MTIK4ZUQ.cjs} +23 -23
  308. package/dist/paper-0c-spike/index.cjs +1 -1
  309. package/dist/paper-0c-spike/index.js +1 -1
  310. package/dist/parameter-envelope/ParameterEnvelope.d.ts +128 -0
  311. package/dist/parameter-envelope/index.cjs +17 -0
  312. package/dist/parameter-envelope/index.d.ts +2 -0
  313. package/dist/parameter-envelope/index.js +4 -0
  314. package/dist/parser/HoloCompositionTypes.d.ts +2013 -0
  315. package/dist/parser/PipelineParser.d.ts +162 -0
  316. package/dist/parser.cjs +36 -20
  317. package/dist/parser.js +13 -9
  318. package/dist/plugin-manifest/ManifestAutoLoader.d.ts +35 -0
  319. package/dist/plugin-manifest/PluginManifest.d.ts +156 -0
  320. package/dist/plugin-manifest/index.cjs +25 -0
  321. package/dist/plugin-manifest/index.d.ts +2 -0
  322. package/dist/plugin-manifest/index.js +4 -0
  323. package/dist/plugin-solver-contract/PluginSolverContract.d.ts +288 -0
  324. package/dist/plugin-solver-contract/index.cjs +41 -0
  325. package/dist/plugin-solver-contract/index.d.ts +1 -0
  326. package/dist/plugin-solver-contract/index.js +4 -0
  327. package/dist/policy/ContentPolicyGate.d.ts +51 -0
  328. package/dist/policy/PolicyPack.d.ts +120 -0
  329. package/dist/policy/blocklist.d.ts +32 -0
  330. package/dist/policy/defaults.d.ts +44 -0
  331. package/dist/policy/index.cjs +106 -0
  332. package/dist/policy/index.d.ts +17 -0
  333. package/dist/policy/index.js +5 -0
  334. package/dist/policy/jsonLogic.d.ts +31 -0
  335. package/dist/policy/types.d.ts +174 -0
  336. package/dist/proof-composition/ProofCompositionLaw.d.ts +93 -0
  337. package/dist/proof-composition/index.cjs +25 -0
  338. package/dist/proof-composition/index.d.ts +1 -0
  339. package/dist/proof-composition/index.js +4 -0
  340. package/dist/receipts/hash-policy.d.ts +85 -0
  341. package/dist/reconstruction/index.cjs +75 -47
  342. package/dist/reconstruction/index.js +5 -5
  343. package/dist/runtime/plugin-trait-registrar.d.ts +36 -0
  344. package/dist/runtime.cjs +81 -79
  345. package/dist/runtime.js +9 -7
  346. package/dist/scene-presets-EDKYZ5GW.js +4 -0
  347. package/dist/scene-presets-NCW2CFRS.cjs +17 -0
  348. package/dist/self-improvement/index.cjs +1 -1
  349. package/dist/self-improvement/index.js +1 -1
  350. package/dist/{src-PT2FERDV.cjs → src-G3D7ZATQ.cjs} +545 -21
  351. package/dist/{src-J6CM4AUR.js → src-UXYA7HM6.js} +539 -16
  352. package/dist/storage/index.cjs +10 -10
  353. package/dist/storage/index.js +3 -3
  354. package/dist/testing.cjs +1 -1
  355. package/dist/testing.js +1 -1
  356. package/dist/tools/index.cjs +3631 -0
  357. package/dist/tools/index.js +3581 -0
  358. package/dist/traitDocs/traitDocs.cjs +9 -9
  359. package/dist/traitDocs/traitDocs.d.ts +1 -0
  360. package/dist/traitDocs/traitDocs.js +3 -3
  361. package/dist/traits/ControlLoopTrait.d.ts +154 -0
  362. package/dist/traits/KinematicChainTrait.d.ts +116 -0
  363. package/dist/traits/SensorSamplingTrait.d.ts +154 -0
  364. package/dist/traits/TraitTypes.d.ts +270 -0
  365. package/dist/traits/TransactionTrait.d.ts +121 -0
  366. package/dist/traits/botanical-lotus.cjs +54 -50
  367. package/dist/traits/botanical-lotus.js +2 -5
  368. package/dist/traits/control-loop.cjs +21 -0
  369. package/dist/traits/control-loop.d.ts +1 -0
  370. package/dist/traits/control-loop.js +4 -0
  371. package/dist/traits/engines/cloth-verlet.d.ts +65 -0
  372. package/dist/traits/engines/index.cjs +19 -19
  373. package/dist/traits/engines/index.d.ts +15 -275
  374. package/dist/traits/engines/index.js +3 -3
  375. package/dist/traits/engines/motion-data-schema.d.ts +119 -0
  376. package/dist/traits/engines/motion-matching.d.ts +102 -0
  377. package/dist/traits/engines/noise.d.ts +25 -0
  378. package/dist/traits/engines/onnx-adapter.d.ts +173 -0
  379. package/dist/traits/engines/onnx-motion-matching.d.ts +163 -0
  380. package/dist/traits/engines/pfnn-network.d.ts +92 -0
  381. package/dist/traits/engines/synthetic-walk-cycle.d.ts +38 -0
  382. package/dist/traits/engines/tensor-ops.d.ts +15 -0
  383. package/dist/traits/index.cjs +2789 -1259
  384. package/dist/traits/index.d.ts +35 -0
  385. package/dist/traits/index.js +1692 -411
  386. package/dist/traits/kinematic-chain.cjs +25 -0
  387. package/dist/traits/kinematic-chain.d.ts +1 -0
  388. package/dist/traits/kinematic-chain.js +4 -0
  389. package/dist/traits/sensor-sampling.cjs +33 -0
  390. package/dist/traits/sensor-sampling.d.ts +1 -0
  391. package/dist/traits/sensor-sampling.js +4 -0
  392. package/dist/traits/simulation-solver-factory.cjs +1 -1
  393. package/dist/traits/simulation-solver-factory.js +1 -1
  394. package/dist/traits/transaction.cjs +29 -0
  395. package/dist/traits/transaction.d.ts +1 -0
  396. package/dist/traits/transaction.js +4 -0
  397. package/dist/traits/webcam-gaze.cjs +1 -1
  398. package/dist/traits/webcam-gaze.js +1 -1
  399. package/dist/type-checker.cjs +7 -6
  400. package/dist/type-checker.js +5 -4
  401. package/dist/types/AdvancedTypeSystem.d.ts +489 -0
  402. package/dist/types/HoloScriptPlus.d.ts +810 -0
  403. package/dist/types/base.d.ts +248 -0
  404. package/dist/types.d.ts +799 -0
  405. package/dist/world/index.cjs +3 -4
  406. package/dist/world/index.js +3 -4
  407. package/dist/world-model/index.cjs +1 -1
  408. package/dist/world-model/index.js +1 -1
  409. package/dist/wot/index.cjs +1 -1
  410. package/dist/wot/index.js +1 -1
  411. package/package.json +135 -69
  412. package/dist/GLTFPipeline-3EJLL3TS.cjs +0 -38
  413. package/dist/GLTFPipeline-3OWJV2VK.js +0 -17
  414. package/dist/HoloScriptPlusParser-ADWRY5OS.cjs +0 -698
  415. package/dist/HoloScriptPlusParser-JLJDXHSC.js +0 -693
  416. package/dist/HoloScriptPlusParser-QCGFPWIL.cjs +0 -27
  417. package/dist/HoloScriptPlusParser-WENAFEFV.js +0 -10
  418. package/dist/HoloScriptRuntime-GGRVEU4T.cjs +0 -19
  419. package/dist/HoloScriptRuntime-GJK6VJPH.js +0 -10
  420. package/dist/chunk-22Q5A6RV.js +0 -979
  421. package/dist/chunk-4C57PR42.js +0 -468
  422. package/dist/chunk-4W5G5QVL.cjs +0 -847
  423. package/dist/chunk-5ET6L4NS.js +0 -487
  424. package/dist/chunk-C4GSLCHE.cjs +0 -7153
  425. package/dist/chunk-F2G6CWFT.js +0 -7089
  426. package/dist/chunk-G6PNEASF.cjs +0 -814
  427. package/dist/chunk-GTA4Q3A3.js +0 -1491
  428. package/dist/chunk-HCCQLAA4.cjs +0 -74
  429. package/dist/chunk-HFSVMKM3.cjs +0 -72
  430. package/dist/chunk-KAIVDEIG.cjs +0 -4539
  431. package/dist/chunk-KQU64CIX.cjs +0 -1508
  432. package/dist/chunk-MSYSQ2AJ.js +0 -4533
  433. package/dist/chunk-NHJLP37F.js +0 -70
  434. package/dist/chunk-NHYRRAGI.cjs +0 -490
  435. package/dist/chunk-OIQYIIO3.cjs +0 -473
  436. package/dist/chunk-OL46QLBJ.js +0 -61
  437. package/dist/chunk-SKZPC5AG.cjs +0 -984
  438. package/dist/chunk-SLHLXUMO.js +0 -445
  439. package/dist/chunk-UOIGFQXC.cjs +0 -9750
  440. package/dist/chunk-UOL6Y5TD.cjs +0 -759
  441. package/dist/chunk-UVFI7XIR.cjs +0 -452
  442. package/dist/chunk-VEPGBETF.js +0 -844
  443. package/dist/chunk-XQ5MWMP2.js +0 -756
  444. package/dist/chunk-XT6JY5W5.js +0 -9684
  445. package/dist/chunk-YRRAUB35.js +0 -811
  446. package/dist/compiler/GasOptimizationAnalyzer.d.ts +0 -73
  447. package/dist/compiler/NFTMarketplaceCompiler.d.ts +0 -23
  448. package/dist/compiler/ar.cjs +0 -23
  449. package/dist/compiler/ar.js +0 -11
  450. package/dist/compiler/babylon.cjs +0 -21
  451. package/dist/compiler/babylon.js +0 -15
  452. package/dist/compiler/multi-layer.cjs +0 -24
  453. package/dist/compiler/multi-layer.js +0 -15
  454. package/dist/compiler/playcanvas.cjs +0 -19
  455. package/dist/compiler/playcanvas.js +0 -13
  456. package/dist/compiler/r3f.cjs +0 -39
  457. package/dist/compiler/r3f.d.ts +0 -22
  458. package/dist/compiler/r3f.js +0 -17
  459. package/dist/compiler/vrr.cjs +0 -24
  460. package/dist/compiler/vrr.js +0 -12
  461. package/dist/parser/NFTMarketplaceTypes.d.ts +0 -191
  462. package/dist/playwright-3AT3AKTV.cjs +0 -98673
  463. package/dist/playwright-VZPDVUEQ.js +0 -98660
@@ -1,5 +1,6 @@
1
- import { init_CompilerBase, init_ANSNamespace, ANSCapabilityPath, escapeStringValue } from './chunk-C7ZBSV2Q.js';
2
- import { __esm } from './chunk-OL46QLBJ.js';
1
+ import { init_PerceptualColorPass, applyPerceptualColorPass } from './chunk-UCVZXQ63.js';
2
+ import { init_CompilerBase, init_ANSNamespace, ANSCapabilityPath, escapeStringValue } from './chunk-DUG3OQAS.js';
3
+ import { __esm } from './chunk-W4GABFCR.js';
3
4
 
4
5
  // src/compiler/DomainBlockCompilerMixin.ts
5
6
  function esc(value, target) {
@@ -44,6 +45,662 @@ function compileMaterialBlock(block) {
44
45
  traits: block.traits || []
45
46
  };
46
47
  }
48
+ function compileMaterialGraphBlock(block) {
49
+ const props = block.properties || {};
50
+ const nodes = [];
51
+ for (const [key, raw] of Object.entries(props)) {
52
+ if (key === "connections") continue;
53
+ const nodeObj = raw && typeof raw === "object" ? raw : {};
54
+ const { type: nodeType, ...params } = nodeObj;
55
+ nodes.push({
56
+ id: key,
57
+ nodeType: typeof nodeType === "string" ? nodeType : "constant",
58
+ params
59
+ });
60
+ }
61
+ const rawConns = Array.isArray(props.connections) ? props.connections : [];
62
+ const edges = [];
63
+ for (const c of rawConns) {
64
+ const from = typeof c.from === "string" ? c.from : "";
65
+ const to = typeof c.to === "string" ? c.to : "";
66
+ if (!from || !to) continue;
67
+ const dot = to.indexOf(".");
68
+ const toNode = dot >= 0 ? to.slice(0, dot) : to;
69
+ const toPort = dot >= 0 ? to.slice(dot + 1) : "in";
70
+ edges.push({ from, toNode, toPort });
71
+ }
72
+ return {
73
+ name: block.name || "unnamed",
74
+ nodes,
75
+ edges,
76
+ traits: block.traits || []
77
+ };
78
+ }
79
+ function sanitizeMgIdent(id) {
80
+ const s = id.replace(/[^A-Za-z0-9_]/g, "_");
81
+ return /^[A-Za-z_]/.test(s) ? s : `n_${s}`;
82
+ }
83
+ function mgHexToVec3(value) {
84
+ const hex = typeof value === "string" ? value : "";
85
+ const m = /^#?([0-9a-fA-F]{6})$/.exec(hex.trim());
86
+ if (!m) return "vec3<f32>(0.5, 0.5, 0.5)";
87
+ const n = parseInt(m[1], 16);
88
+ const r = (n >> 16 & 255) / 255;
89
+ const g = (n >> 8 & 255) / 255;
90
+ const b = (n & 255) / 255;
91
+ return `vec3<f32>(${r.toFixed(4)}, ${g.toFixed(4)}, ${b.toFixed(4)})`;
92
+ }
93
+ function materialGraphToWGSL(graph) {
94
+ const safeName = sanitizeMgIdent(graph.name);
95
+ const fnName = `evalMaterialGraph_${safeName}`;
96
+ const warnings = [];
97
+ const nodeById = new Map(graph.nodes.map((n) => [n.id, n]));
98
+ const inputs = /* @__PURE__ */ new Map();
99
+ for (const n of graph.nodes) inputs.set(n.id, /* @__PURE__ */ new Map());
100
+ for (const e of graph.edges) {
101
+ if (!nodeById.has(e.from)) {
102
+ warnings.push(`edge from unknown node "${e.from}"`);
103
+ continue;
104
+ }
105
+ if (!inputs.has(e.toNode)) {
106
+ warnings.push(`edge to unknown node "${e.toNode}"`);
107
+ continue;
108
+ }
109
+ inputs.get(e.toNode).set(e.toPort, e.from);
110
+ }
111
+ const indeg = /* @__PURE__ */ new Map();
112
+ const adj = /* @__PURE__ */ new Map();
113
+ for (const n of graph.nodes) {
114
+ indeg.set(n.id, 0);
115
+ adj.set(n.id, []);
116
+ }
117
+ for (const e of graph.edges) {
118
+ if (!nodeById.has(e.from) || !nodeById.has(e.toNode)) continue;
119
+ adj.get(e.from).push(e.toNode);
120
+ indeg.set(e.toNode, (indeg.get(e.toNode) || 0) + 1);
121
+ }
122
+ const queue = graph.nodes.filter((n) => (indeg.get(n.id) || 0) === 0).map((n) => n.id);
123
+ const order = [];
124
+ while (queue.length) {
125
+ const id = queue.shift();
126
+ order.push(id);
127
+ for (const next of adj.get(id) || []) {
128
+ indeg.set(next, (indeg.get(next) || 0) - 1);
129
+ if ((indeg.get(next) || 0) === 0) queue.push(next);
130
+ }
131
+ }
132
+ if (order.length < graph.nodes.length) {
133
+ warnings.push("material graph has a cycle; emitting nodes in declaration order");
134
+ for (const n of graph.nodes) if (!order.includes(n.id)) order.push(n.id);
135
+ }
136
+ const values = /* @__PURE__ */ new Map();
137
+ const inPort = (nodeId, port) => {
138
+ const from = inputs.get(nodeId)?.get(port);
139
+ return from ? values.get(from) : void 0;
140
+ };
141
+ const body = [];
142
+ let output = null;
143
+ for (const id of order) {
144
+ const node = nodeById.get(id);
145
+ const v = sanitizeMgIdent(id);
146
+ switch (node.nodeType) {
147
+ case "constant": {
148
+ if (typeof node.params.value === "number") {
149
+ body.push(` let mg_${v} = ${node.params.value.toFixed(4)}; // constant`);
150
+ values.set(id, { ref: `mg_${v}`, type: "f32" });
151
+ } else {
152
+ body.push(` let mg_${v} = ${mgHexToVec3(node.params.value)}; // constant`);
153
+ values.set(id, { ref: `mg_${v}`, type: "vec3" });
154
+ }
155
+ break;
156
+ }
157
+ case "noise": {
158
+ const scale = typeof node.params.scale === "number" ? node.params.scale : 1;
159
+ body.push(` let mg_${v} = mgNoise(uv * ${scale.toFixed(4)}); // noise`);
160
+ values.set(id, { ref: `mg_${v}`, type: "f32" });
161
+ break;
162
+ }
163
+ case "fresnel": {
164
+ const power = typeof node.params.power === "number" ? node.params.power : 5;
165
+ body.push(
166
+ ` let mg_${v} = pow(1.0 - max(dot(N, V), 0.0), ${power.toFixed(4)}); // fresnel`
167
+ );
168
+ values.set(id, { ref: `mg_${v}`, type: "f32" });
169
+ break;
170
+ }
171
+ case "multiply":
172
+ case "add": {
173
+ const a = inPort(id, "a");
174
+ const b = inPort(id, "b");
175
+ const op = node.nodeType === "multiply" ? "*" : "+";
176
+ const asVec = a?.type === "vec3" || b?.type === "vec3";
177
+ if (asVec) {
178
+ body.push(` let mg_${v} = ${mgToVec3(a)} ${op} ${mgToVec3(b)}; // ${node.nodeType}`);
179
+ values.set(id, { ref: `mg_${v}`, type: "vec3" });
180
+ } else {
181
+ body.push(` let mg_${v} = ${mgToF32(a)} ${op} ${mgToF32(b)}; // ${node.nodeType}`);
182
+ values.set(id, { ref: `mg_${v}`, type: "f32" });
183
+ }
184
+ break;
185
+ }
186
+ case "lerp": {
187
+ const a = inPort(id, "a");
188
+ const b = inPort(id, "b");
189
+ const t = inPort(id, "t");
190
+ body.push(
191
+ ` let mg_${v} = mix(${mgToVec3(a)}, ${mgToVec3(b)}, vec3<f32>(${mgToF32(t)})); // lerp`
192
+ );
193
+ values.set(id, { ref: `mg_${v}`, type: "vec3" });
194
+ break;
195
+ }
196
+ case "output": {
197
+ output = { id };
198
+ break;
199
+ }
200
+ default: {
201
+ warnings.push(`unknown node type "${node.nodeType}" (node "${id}") \u2014 treated as black`);
202
+ body.push(` let mg_${v} = vec3<f32>(0.0); // unknown:${esc(node.nodeType, "TypeScript")}`);
203
+ values.set(id, { ref: `mg_${v}`, type: "vec3" });
204
+ }
205
+ }
206
+ }
207
+ const baseColorIn = output ? inPort(output.id, "base_color") : void 0;
208
+ const roughnessIn = output ? inPort(output.id, "roughness") : void 0;
209
+ const metallicIn = output ? inPort(output.id, "metallic") : void 0;
210
+ const emissiveIn = output ? inPort(output.id, "emissive") : void 0;
211
+ const baseColor = baseColorIn ? mgToVec3(baseColorIn) : "vec3<f32>(0.8)";
212
+ const roughness = roughnessIn ? mgToF32(roughnessIn, "0.5") : "0.5";
213
+ const metallic = metallicIn ? mgToF32(metallicIn, "0.0") : "0.0";
214
+ const emissive = emissiveIn ? mgToVec3(emissiveIn) : "vec3<f32>(0.0)";
215
+ const header = [
216
+ `// Material Graph "${esc(graph.name, "TypeScript")}" \u2014 generated by HoloScript TSLCompiler`,
217
+ `// Nodes: ${graph.nodes.length} | Edges: ${graph.edges.length} | topo-ordered: [${order.map((o) => esc(o, "TypeScript")).join(" -> ")}]`,
218
+ ...warnings.map((w) => `// WARNING: ${esc(w, "TypeScript")}`)
219
+ ];
220
+ const wgsl = [
221
+ ...header,
222
+ "",
223
+ "struct MaterialGraphSurface {",
224
+ " baseColor: vec3<f32>,",
225
+ " roughness: f32,",
226
+ " metallic: f32,",
227
+ " emissive: vec3<f32>,",
228
+ "};",
229
+ "",
230
+ "// Cheap value-noise helper (hash-based); replace with a texture sample for AAA fidelity.",
231
+ "fn mgNoise(p: vec2<f32>) -> f32 {",
232
+ " return fract(sin(dot(p, vec2<f32>(12.9898, 78.233))) * 43758.5453);",
233
+ "}",
234
+ "",
235
+ `fn ${fnName}(uv: vec2<f32>, N: vec3<f32>, V: vec3<f32>, time: f32) -> MaterialGraphSurface {`,
236
+ ...body,
237
+ " var surface: MaterialGraphSurface;",
238
+ ` surface.baseColor = ${baseColor};`,
239
+ ` surface.roughness = ${roughness};`,
240
+ ` surface.metallic = ${metallic};`,
241
+ ` surface.emissive = ${emissive};`,
242
+ " return surface;",
243
+ "}"
244
+ ].join("\n");
245
+ return { fnName, wgsl };
246
+ }
247
+ function compileParticleFieldBlock(block) {
248
+ const props = block.properties || {};
249
+ const forces = [];
250
+ let count = 1e3;
251
+ let lifetime = 2;
252
+ for (const [key, raw] of Object.entries(props)) {
253
+ if (key === "count" && typeof raw === "number") {
254
+ count = raw;
255
+ continue;
256
+ }
257
+ if (key === "lifetime" && typeof raw === "number") {
258
+ lifetime = raw;
259
+ continue;
260
+ }
261
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
262
+ const { type, ...params } = raw;
263
+ if (typeof type === "string") forces.push({ id: key, forceType: type, params });
264
+ }
265
+ }
266
+ return { name: block.name || "unnamed", count, lifetime, forces, traits: block.traits || [] };
267
+ }
268
+ function particleFieldToWGSL(field) {
269
+ const safe = sanitizeMgIdent(field.name);
270
+ const fnName = `cs_particle_field_${safe}`;
271
+ const warnings = [];
272
+ const num = (p, k, d) => typeof p[k] === "number" ? p[k] : d;
273
+ const forceLines = [];
274
+ for (const f of field.forces) {
275
+ const p = f.params;
276
+ switch (f.forceType) {
277
+ case "gravity":
278
+ forceLines.push(
279
+ ` accel += vec3<f32>(0.0, ${num(p, "strength", -9.81).toFixed(4)}, 0.0); // gravity:${esc(f.id, "TypeScript")}`
280
+ );
281
+ break;
282
+ case "drag":
283
+ forceLines.push(
284
+ ` accel -= p.vel * ${num(p, "coefficient", 0.1).toFixed(4)}; // drag:${esc(f.id, "TypeScript")}`
285
+ );
286
+ break;
287
+ case "vortex":
288
+ forceLines.push(
289
+ ` accel += normalize(vec3<f32>(-p.pos.z, 0.0, p.pos.x) + vec3<f32>(1e-4)) * ${num(p, "strength", 1).toFixed(4)}; // vortex:${esc(f.id, "TypeScript")}`
290
+ );
291
+ break;
292
+ case "attractor":
293
+ forceLines.push(
294
+ ` accel += -normalize(p.pos + vec3<f32>(1e-4)) * ${num(p, "strength", 1).toFixed(4)}; // attractor:${esc(f.id, "TypeScript")}`
295
+ );
296
+ break;
297
+ case "curl_noise":
298
+ case "turbulence":
299
+ forceLines.push(
300
+ ` accel += pfCurl(p.pos * ${num(p, "scale", 1).toFixed(4)}) * ${num(p, "strength", 1).toFixed(4)}; // ${f.forceType}:${esc(f.id, "TypeScript")}`
301
+ );
302
+ break;
303
+ default:
304
+ warnings.push(`unknown force "${f.forceType}" (node "${f.id}") \u2014 skipped`);
305
+ forceLines.push(` // unknown force ${esc(f.forceType, "TypeScript")}:${esc(f.id, "TypeScript")}`);
306
+ }
307
+ }
308
+ if (forceLines.length === 0) forceLines.push(" // no forces declared \u2014 particles drift inertially");
309
+ const wgsl = [
310
+ `// Particle Field "${esc(field.name, "TypeScript")}" \u2014 generated by HoloScript TSLCompiler`,
311
+ `// count: ${field.count} | lifetime: ${field.lifetime} | forces: [${field.forces.map((f) => `${esc(f.forceType, "TypeScript")}:${esc(f.id, "TypeScript")}`).join(", ")}]`,
312
+ ...warnings.map((w) => `// WARNING: ${esc(w, "TypeScript")}`),
313
+ "",
314
+ `struct ParticleField_${safe} {`,
315
+ " pos: vec3<f32>,",
316
+ " life: f32,",
317
+ " vel: vec3<f32>,",
318
+ " _pad: f32,",
319
+ "};",
320
+ "",
321
+ "// hash-based value noise \u2192 cheap curl approximation for turbulent forces",
322
+ "fn pfHash3(p: vec3<f32>) -> f32 {",
323
+ " return fract(sin(dot(p, vec3<f32>(12.9898, 78.233, 37.719))) * 43758.5453);",
324
+ "}",
325
+ "fn pfCurl(p: vec3<f32>) -> vec3<f32> {",
326
+ " let e = 0.1;",
327
+ " let dx = pfHash3(p + vec3<f32>(e, 0.0, 0.0)) - pfHash3(p - vec3<f32>(e, 0.0, 0.0));",
328
+ " let dy = pfHash3(p + vec3<f32>(0.0, e, 0.0)) - pfHash3(p - vec3<f32>(0.0, e, 0.0));",
329
+ " let dz = pfHash3(p + vec3<f32>(0.0, 0.0, e)) - pfHash3(p - vec3<f32>(0.0, 0.0, e));",
330
+ " return vec3<f32>(dy - dz, dz - dx, dx - dy);",
331
+ "}",
332
+ "",
333
+ `@group(0) @binding(0) var<storage, read> pfIn_${safe}: array<ParticleField_${safe}>;`,
334
+ `@group(0) @binding(1) var<storage, read_write> pfOut_${safe}: array<ParticleField_${safe}>;`,
335
+ `@group(0) @binding(2) var<uniform> pfDt_${safe}: f32;`,
336
+ "",
337
+ "@compute @workgroup_size(64)",
338
+ `fn ${fnName}(@builtin(global_invocation_id) gid: vec3<u32>) {`,
339
+ ` let i = gid.x;`,
340
+ ` if (i >= arrayLength(&pfIn_${safe})) { return; }`,
341
+ ` var p = pfIn_${safe}[i];`,
342
+ ` let dt = pfDt_${safe};`,
343
+ " var accel = vec3<f32>(0.0);",
344
+ ...forceLines,
345
+ " p.vel += accel * dt;",
346
+ " p.pos += p.vel * dt;",
347
+ " p.life -= dt;",
348
+ " if (p.life <= 0.0) {",
349
+ " p.pos = vec3<f32>(0.0);",
350
+ " p.vel = vec3<f32>(0.0, 1.0, 0.0);",
351
+ ` p.life = ${field.lifetime.toFixed(4)};`,
352
+ " }",
353
+ ` pfOut_${safe}[i] = p;`,
354
+ "}"
355
+ ].join("\n");
356
+ return { fnName, wgsl };
357
+ }
358
+ function compileLightFieldBlock(block) {
359
+ const props = block.properties || {};
360
+ const lights = [];
361
+ let ambient = "#000000";
362
+ let bounces = 1;
363
+ let intensity = 1;
364
+ for (const [key, raw] of Object.entries(props)) {
365
+ if (key === "ambient" && typeof raw === "string") {
366
+ ambient = raw;
367
+ continue;
368
+ }
369
+ if (key === "bounces" && typeof raw === "number") {
370
+ bounces = raw;
371
+ continue;
372
+ }
373
+ if (key === "intensity" && typeof raw === "number") {
374
+ intensity = raw;
375
+ continue;
376
+ }
377
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
378
+ const { type, ...params } = raw;
379
+ if (typeof type === "string") lights.push({ id: key, lightType: type, params });
380
+ }
381
+ }
382
+ return { name: block.name || "unnamed", ambient, bounces, intensity, lights, traits: block.traits || [] };
383
+ }
384
+ function lightFieldToWGSL(field) {
385
+ const safe = sanitizeMgIdent(field.name);
386
+ const fnName = `evalLightField_${safe}`;
387
+ const warnings = [];
388
+ const num = (p, k, d) => typeof p[k] === "number" ? p[k] : d;
389
+ const lightBlocks = [];
390
+ for (const l of field.lights) {
391
+ const p = l.params;
392
+ const color = mgHexToVec3(p.color);
393
+ const intensity = num(p, "intensity", 1).toFixed(4);
394
+ switch (l.lightType) {
395
+ case "directional":
396
+ case "sun":
397
+ lightBlocks.push(
398
+ [
399
+ ` { // directional:${esc(l.id, "TypeScript")}`,
400
+ ` let L = normalize(-vec3<f32>(${num(p, "dir_x", 0).toFixed(4)}, ${num(p, "dir_y", -1).toFixed(4)}, ${num(p, "dir_z", 0).toFixed(4)}));`,
401
+ ` let NdotL = max(dot(N, L), 0.0);`,
402
+ ` radiance += albedo * ${color} * ${intensity} * NdotL;`,
403
+ ` }`
404
+ ].join("\n")
405
+ );
406
+ break;
407
+ case "point":
408
+ lightBlocks.push(
409
+ [
410
+ ` { // point:${esc(l.id, "TypeScript")}`,
411
+ ` let d = vec3<f32>(${num(p, "pos_x", 0).toFixed(4)}, ${num(p, "pos_y", 0).toFixed(4)}, ${num(p, "pos_z", 0).toFixed(4)}) - worldPos;`,
412
+ ` let dist = length(d);`,
413
+ ` let L = d / max(dist, 1e-4);`,
414
+ ` let NdotL = max(dot(N, L), 0.0);`,
415
+ ` let atten = 1.0 / (1.0 + (dist * dist) / (${num(p, "range", 10).toFixed(4)} * ${num(p, "range", 10).toFixed(4)}));`,
416
+ ` radiance += albedo * ${color} * ${intensity} * NdotL * atten;`,
417
+ ` }`
418
+ ].join("\n")
419
+ );
420
+ break;
421
+ case "spot":
422
+ lightBlocks.push(
423
+ [
424
+ ` { // spot:${esc(l.id, "TypeScript")}`,
425
+ ` let d = vec3<f32>(${num(p, "pos_x", 0).toFixed(4)}, ${num(p, "pos_y", 5).toFixed(4)}, ${num(p, "pos_z", 0).toFixed(4)}) - worldPos;`,
426
+ ` let dist = length(d);`,
427
+ ` let L = d / max(dist, 1e-4);`,
428
+ ` let spotDir = normalize(vec3<f32>(${num(p, "dir_x", 0).toFixed(4)}, ${num(p, "dir_y", -1).toFixed(4)}, ${num(p, "dir_z", 0).toFixed(4)}));`,
429
+ ` let cone = smoothstep(${Math.cos(num(p, "cone", 30) * Math.PI / 180).toFixed(4)}, 1.0, dot(-L, spotDir));`,
430
+ ` let NdotL = max(dot(N, L), 0.0);`,
431
+ ` let atten = 1.0 / (1.0 + (dist * dist) / (${num(p, "range", 10).toFixed(4)} * ${num(p, "range", 10).toFixed(4)}));`,
432
+ ` radiance += albedo * ${color} * ${intensity} * NdotL * atten * cone;`,
433
+ ` }`
434
+ ].join("\n")
435
+ );
436
+ break;
437
+ case "ambient":
438
+ case "ambient_probe":
439
+ case "sky":
440
+ lightBlocks.push(
441
+ [
442
+ ` { // ambient:${esc(l.id, "TypeScript")}`,
443
+ ` radiance += albedo * ${color} * ${intensity};`,
444
+ ` }`
445
+ ].join("\n")
446
+ );
447
+ break;
448
+ default:
449
+ warnings.push(`unknown light "${l.lightType}" (node "${l.id}") \u2014 skipped`);
450
+ lightBlocks.push(` // unknown light ${esc(l.lightType, "TypeScript")}:${esc(l.id, "TypeScript")}`);
451
+ }
452
+ }
453
+ const giScale = `(${field.intensity.toFixed(4)} * (1.0 + f32(${Math.round(field.bounces)}) * 0.5))`;
454
+ const wgsl = [
455
+ `// Light Field "${esc(field.name, "TypeScript")}" \u2014 generated by HoloScript TSLCompiler`,
456
+ `// ambient: ${esc(field.ambient, "TypeScript")} | bounces: ${field.bounces} | lights: [${field.lights.map((l) => `${esc(l.lightType, "TypeScript")}:${esc(l.id, "TypeScript")}`).join(", ")}]`,
457
+ ...warnings.map((w) => `// WARNING: ${esc(w, "TypeScript")}`),
458
+ "",
459
+ `fn ${fnName}(worldPos: vec3<f32>, N: vec3<f32>, V: vec3<f32>, albedo: vec3<f32>, roughness: f32, metallic: f32) -> vec3<f32> {`,
460
+ " var radiance = vec3<f32>(0.0);",
461
+ " // ambient / GI base \u2014 bounces approximated as an indirect ambient lift",
462
+ ` radiance += albedo * ${mgHexToVec3(field.ambient)} * ${giScale};`,
463
+ ...lightBlocks,
464
+ " return radiance;",
465
+ "}"
466
+ ].join("\n");
467
+ return { fnName, wgsl };
468
+ }
469
+ function compileNavFieldBlock(block) {
470
+ const props = block.properties || {};
471
+ const behaviors = [];
472
+ let agents = 256;
473
+ let maxSpeed = 2;
474
+ for (const [key, raw] of Object.entries(props)) {
475
+ if (key === "agents" && typeof raw === "number") {
476
+ agents = raw;
477
+ continue;
478
+ }
479
+ if ((key === "max_speed" || key === "maxSpeed") && typeof raw === "number") {
480
+ maxSpeed = raw;
481
+ continue;
482
+ }
483
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
484
+ const { type, ...params } = raw;
485
+ if (typeof type === "string") behaviors.push({ id: key, behaviorType: type, params });
486
+ }
487
+ }
488
+ return { name: block.name || "unnamed", agents, maxSpeed, behaviors, traits: block.traits || [] };
489
+ }
490
+ function navFieldToWGSL(field) {
491
+ const safe = sanitizeMgIdent(field.name);
492
+ const fnName = `cs_nav_field_${safe}`;
493
+ const ms = field.maxSpeed.toFixed(4);
494
+ const warnings = [];
495
+ const num = (p, k, d) => typeof p[k] === "number" ? p[k] : d;
496
+ const steerLines = [];
497
+ for (const b of field.behaviors) {
498
+ const p = b.params;
499
+ const w = num(p, "weight", 1).toFixed(4);
500
+ const target = `vec3<f32>(${num(p, "target_x", 0).toFixed(4)}, ${num(p, "target_y", 0).toFixed(4)}, ${num(p, "target_z", 0).toFixed(4)})`;
501
+ switch (b.behaviorType) {
502
+ case "seek":
503
+ steerLines.push(
504
+ ` { let desired = normalize(${target} - a.pos + vec3<f32>(1e-4)) * ${ms}; steer += (desired - a.vel) * ${w}; } // seek:${esc(b.id, "TypeScript")}`
505
+ );
506
+ break;
507
+ case "flee":
508
+ steerLines.push(
509
+ ` { let desired = normalize(a.pos - ${target} + vec3<f32>(1e-4)) * ${ms}; steer += (desired - a.vel) * ${w}; } // flee:${esc(b.id, "TypeScript")}`
510
+ );
511
+ break;
512
+ case "flow":
513
+ steerLines.push(
514
+ ` { let desired = normalize(vec3<f32>(${num(p, "dir_x", 1).toFixed(4)}, ${num(p, "dir_y", 0).toFixed(4)}, ${num(p, "dir_z", 0).toFixed(4)}) + vec3<f32>(1e-4)) * ${ms}; steer += (desired - a.vel) * ${w}; } // flow:${esc(b.id, "TypeScript")}`
515
+ );
516
+ break;
517
+ case "arrive":
518
+ steerLines.push(
519
+ [
520
+ ` { // arrive:${esc(b.id, "TypeScript")}`,
521
+ ` let to = ${target} - a.pos;`,
522
+ ` let dist = length(to);`,
523
+ ` let speed = ${ms} * clamp(dist / ${num(p, "slow_radius", 3).toFixed(4)}, 0.0, 1.0);`,
524
+ ` let desired = normalize(to + vec3<f32>(1e-4)) * speed;`,
525
+ ` steer += (desired - a.vel) * ${w};`,
526
+ ` }`
527
+ ].join("\n")
528
+ );
529
+ break;
530
+ default:
531
+ warnings.push(`unknown behavior "${b.behaviorType}" (node "${b.id}") \u2014 skipped`);
532
+ steerLines.push(` // unknown behavior ${esc(b.behaviorType, "TypeScript")}:${esc(b.id, "TypeScript")}`);
533
+ }
534
+ }
535
+ if (steerLines.length === 0) steerLines.push(" // no behaviors declared \u2014 agents coast");
536
+ const wgsl = [
537
+ `// Nav Field "${esc(field.name, "TypeScript")}" \u2014 generated by HoloScript TSLCompiler`,
538
+ `// agents: ${field.agents} | max_speed: ${field.maxSpeed} | behaviors: [${field.behaviors.map((b) => `${esc(b.behaviorType, "TypeScript")}:${esc(b.id, "TypeScript")}`).join(", ")}]`,
539
+ ...warnings.map((w) => `// WARNING: ${esc(w, "TypeScript")}`),
540
+ "",
541
+ `struct NavAgent_${safe} {`,
542
+ " pos: vec3<f32>,",
543
+ " _pad0: f32,",
544
+ " vel: vec3<f32>,",
545
+ " _pad1: f32,",
546
+ "};",
547
+ "",
548
+ `@group(0) @binding(0) var<storage, read> navIn_${safe}: array<NavAgent_${safe}>;`,
549
+ `@group(0) @binding(1) var<storage, read_write> navOut_${safe}: array<NavAgent_${safe}>;`,
550
+ `@group(0) @binding(2) var<uniform> navDt_${safe}: f32;`,
551
+ "",
552
+ "@compute @workgroup_size(64)",
553
+ `fn ${fnName}(@builtin(global_invocation_id) gid: vec3<u32>) {`,
554
+ ` let i = gid.x;`,
555
+ ` if (i >= arrayLength(&navIn_${safe})) { return; }`,
556
+ ` var a = navIn_${safe}[i];`,
557
+ ` let dt = navDt_${safe};`,
558
+ " var steer = vec3<f32>(0.0);",
559
+ ...steerLines,
560
+ " a.vel += steer * dt;",
561
+ ` let sp = length(a.vel);`,
562
+ ` if (sp > ${ms}) { a.vel = a.vel / sp * ${ms}; }`,
563
+ " a.pos += a.vel * dt;",
564
+ ` navOut_${safe}[i] = a;`,
565
+ "}"
566
+ ].join("\n");
567
+ return { fnName, wgsl };
568
+ }
569
+ function compilePhysicsContractBlock(block) {
570
+ const props = block.properties || {};
571
+ const bodies = [];
572
+ const constraints = [];
573
+ const gravity = [0, -9.81, 0];
574
+ let substeps = 1;
575
+ const numOf = (v, d) => typeof v === "number" ? v : d;
576
+ for (const [key, raw] of Object.entries(props)) {
577
+ if (key === "gravity" && Array.isArray(raw)) {
578
+ gravity[0] = numOf(raw[0], gravity[0]);
579
+ gravity[1] = numOf(raw[1], gravity[1]);
580
+ gravity[2] = numOf(raw[2], gravity[2]);
581
+ continue;
582
+ }
583
+ if (key === "gravity_x" && typeof raw === "number") {
584
+ gravity[0] = raw;
585
+ continue;
586
+ }
587
+ if (key === "gravity_y" && typeof raw === "number") {
588
+ gravity[1] = raw;
589
+ continue;
590
+ }
591
+ if (key === "gravity_z" && typeof raw === "number") {
592
+ gravity[2] = raw;
593
+ continue;
594
+ }
595
+ if (key === "substeps" && typeof raw === "number") {
596
+ substeps = Math.max(1, Math.floor(raw));
597
+ continue;
598
+ }
599
+ if (raw && typeof raw === "object" && !Array.isArray(raw)) {
600
+ const sub = raw;
601
+ const kind = sub.kind;
602
+ if (kind === "body") {
603
+ bodies.push({
604
+ id: key,
605
+ mass: numOf(sub.mass, 1),
606
+ shape: typeof sub.shape === "string" ? sub.shape : "box",
607
+ pos: [numOf(sub.pos_x, 0), numOf(sub.pos_y, 0), numOf(sub.pos_z, 0)]
608
+ });
609
+ } else if (kind === "constraint") {
610
+ const { kind: _k, type, body_a, body_b, ...params } = sub;
611
+ constraints.push({
612
+ id: key,
613
+ constraintType: typeof type === "string" ? type : "distance",
614
+ bodyA: typeof body_a === "string" ? body_a : "",
615
+ bodyB: typeof body_b === "string" ? body_b : "",
616
+ params
617
+ });
618
+ }
619
+ }
620
+ }
621
+ return { name: block.name || "unnamed", gravity, substeps, bodies, constraints, traits: block.traits || [] };
622
+ }
623
+ function physicsContractToWGSL(field) {
624
+ const safe = sanitizeMgIdent(field.name);
625
+ const fnName = `cs_physics_contract_${safe}`;
626
+ const warnings = [];
627
+ const idx = new Map(field.bodies.map((b, i) => [b.id, i]));
628
+ const num = (p, k, d) => typeof p[k] === "number" ? p[k] : d;
629
+ const g = `vec3<f32>(${field.gravity[0].toFixed(4)}, ${field.gravity[1].toFixed(4)}, ${field.gravity[2].toFixed(4)})`;
630
+ const substeps = Math.max(1, field.substeps);
631
+ const constraintLines = [];
632
+ for (const c of field.constraints) {
633
+ const aIdx = idx.get(c.bodyA);
634
+ const bIdx = idx.get(c.bodyB);
635
+ if (aIdx === void 0 || bIdx === void 0) {
636
+ warnings.push(`constraint "${c.id}" (${c.constraintType}) references unknown body \u2014 skipped`);
637
+ constraintLines.push(` // ${esc(c.constraintType, "TypeScript")}:${esc(c.id, "TypeScript")} \u2014 unresolved body ref, skipped`);
638
+ continue;
639
+ }
640
+ const a = `${aIdx}u`;
641
+ const b = `${bIdx}u`;
642
+ const p = c.params;
643
+ if (c.constraintType === "distance" || c.constraintType === "hinge") {
644
+ const rest = (c.constraintType === "hinge" ? num(p, "rest", 0) : num(p, "rest", 1)).toFixed(4);
645
+ const stiff = num(p, "stiffness", 1).toFixed(4);
646
+ const axisNote = c.constraintType === "hinge" ? ` axis (${num(p, "axis_x", 0).toFixed(2)},${num(p, "axis_y", 1).toFixed(2)},${num(p, "axis_z", 0).toFixed(2)}) \u2014 angular limit deferred` : "";
647
+ constraintLines.push(
648
+ [
649
+ ` // ${c.constraintType}:${esc(c.id, "TypeScript")}${axisNote}`,
650
+ ` if (i == ${a}) { let o = physIn_${safe}[${b}]; let d = p.pos - o.pos; let dist = length(d) + 1e-6; let n = d / dist; let C = dist - ${rest}; let w = p.invMass + o.invMass + 1e-6; p.pos -= n * (C * (p.invMass / w) * ${stiff}); }`,
651
+ ` if (i == ${b}) { let o = physIn_${safe}[${a}]; let d = p.pos - o.pos; let dist = length(d) + 1e-6; let n = d / dist; let C = dist - ${rest}; let w = p.invMass + o.invMass + 1e-6; p.pos -= n * (C * (p.invMass / w) * ${stiff}); }`
652
+ ].join("\n")
653
+ );
654
+ } else if (c.constraintType === "fixed") {
655
+ const off = `vec3<f32>(${num(p, "rest_x", 0).toFixed(4)}, ${num(p, "rest_y", 0).toFixed(4)}, ${num(p, "rest_z", 0).toFixed(4)})`;
656
+ constraintLines.push(
657
+ [
658
+ ` // fixed:${esc(c.id, "TypeScript")} \u2014 3-DoF weld (rotational lock deferred)`,
659
+ ` if (i == ${a}) { let o = physIn_${safe}[${b}]; let e = (o.pos - p.pos) - ${off}; let w = p.invMass + o.invMass + 1e-6; p.pos += e * (p.invMass / w); }`,
660
+ ` if (i == ${b}) { let o = physIn_${safe}[${a}]; let e = (p.pos - o.pos) - ${off}; let w = p.invMass + o.invMass + 1e-6; p.pos -= e * (p.invMass / w); }`
661
+ ].join("\n")
662
+ );
663
+ } else {
664
+ warnings.push(`unknown constraint "${c.constraintType}" (node "${c.id}") \u2014 skipped`);
665
+ constraintLines.push(` // unknown constraint ${esc(c.constraintType, "TypeScript")}:${esc(c.id, "TypeScript")} \u2014 skipped`);
666
+ }
667
+ }
668
+ if (constraintLines.length === 0) constraintLines.push(" // no constraints declared \u2014 free integration only");
669
+ const wgsl = [
670
+ `// Physics Contract "${esc(field.name, "TypeScript")}" \u2014 generated by HoloScript TSLCompiler`,
671
+ `// bodies: ${field.bodies.length} | constraints: ${field.constraints.length} | gravity: [${field.gravity.join(", ")}] | substeps: ${substeps}`,
672
+ `// Upload: physIn[i] = { pos, invMass (= mass>0 ? 1/mass : 0), vel, _pad } from the authored body stack.`,
673
+ ...warnings.map((w) => `// WARNING: ${esc(w, "TypeScript")}`),
674
+ "",
675
+ `struct PhysBody_${safe} {`,
676
+ " pos: vec3<f32>,",
677
+ " invMass: f32,",
678
+ " vel: vec3<f32>,",
679
+ " _pad: f32,",
680
+ "};",
681
+ "",
682
+ `@group(0) @binding(0) var<storage, read> physIn_${safe}: array<PhysBody_${safe}>;`,
683
+ `@group(0) @binding(1) var<storage, read_write> physOut_${safe}: array<PhysBody_${safe}>;`,
684
+ `@group(0) @binding(2) var<uniform> physDt_${safe}: f32;`,
685
+ "",
686
+ "@compute @workgroup_size(64)",
687
+ `fn ${fnName}(@builtin(global_invocation_id) gid: vec3<u32>) {`,
688
+ ` let i = gid.x;`,
689
+ ` if (i >= arrayLength(&physIn_${safe})) { return; }`,
690
+ ` var p = physIn_${safe}[i];`,
691
+ ` let subDt = physDt_${safe} / ${substeps}.0;`,
692
+ ` for (var s = 0u; s < ${substeps}u; s = s + 1u) {`,
693
+ " if (p.invMass > 0.0) {",
694
+ ` p.vel += ${g} * subDt;`,
695
+ " p.pos += p.vel * subDt;",
696
+ " }",
697
+ ...constraintLines,
698
+ " }",
699
+ ` physOut_${safe}[i] = p;`,
700
+ "}"
701
+ ].join("\n");
702
+ return { fnName, wgsl };
703
+ }
47
704
  function compilePhysicsBlock(block) {
48
705
  const colliders = [];
49
706
  const forceFields = [];
@@ -2725,6 +3382,102 @@ function iotToUSDA(iot) {
2725
3382
  lines.push("}");
2726
3383
  return lines.join("\n");
2727
3384
  }
3385
+ function stringProperty(props, keys) {
3386
+ for (const key of keys) {
3387
+ const value = props[key];
3388
+ if (typeof value === "string" && value.trim()) return value.trim();
3389
+ }
3390
+ return void 0;
3391
+ }
3392
+ function numberProperty(props, keys) {
3393
+ for (const key of keys) {
3394
+ const value = props[key];
3395
+ if (typeof value === "number" && Number.isFinite(value)) return value;
3396
+ }
3397
+ return void 0;
3398
+ }
3399
+ function booleanProperty(props, keys) {
3400
+ for (const key of keys) {
3401
+ const value = props[key];
3402
+ if (typeof value === "boolean") return value;
3403
+ }
3404
+ return void 0;
3405
+ }
3406
+ function stringArrayProperty(props, keys) {
3407
+ for (const key of keys) {
3408
+ const value = props[key];
3409
+ if (Array.isArray(value) && value.every((entry) => typeof entry === "string")) {
3410
+ return [...value];
3411
+ }
3412
+ }
3413
+ return void 0;
3414
+ }
3415
+ function gradientStopsProperty(props, keys) {
3416
+ for (const key of keys) {
3417
+ const value = props[key];
3418
+ if (!Array.isArray(value)) continue;
3419
+ const stops = [];
3420
+ for (const entry of value) {
3421
+ if (entry && typeof entry === "object" && typeof entry.t === "number" && typeof entry.color === "string") {
3422
+ const stop = entry;
3423
+ stops.push({ t: stop.t, color: stop.color });
3424
+ }
3425
+ }
3426
+ if (stops.length > 0) return stops;
3427
+ }
3428
+ return void 0;
3429
+ }
3430
+ function sampledStopsFromColors(colors) {
3431
+ if (colors.length === 0) return [];
3432
+ if (colors.length === 1) return [{ t: 0, color: colors[0] }];
3433
+ return colors.map((color, index) => ({
3434
+ t: index / (colors.length - 1),
3435
+ color
3436
+ }));
3437
+ }
3438
+ function buildPerceptualColorMetadata(props, traits, fallbackColorMap = "viridis") {
3439
+ const colorMap = stringProperty(props, ["color_map", "colormap", "colorMap"]);
3440
+ const palette = stringArrayProperty(props, ["palette", "colors"]);
3441
+ const gradient = gradientStopsProperty(props, ["gradient", "color_gradient", "colorGradient"]) ?? stringArrayProperty(props, ["gradient", "color_gradient", "colorGradient"]);
3442
+ const enabled = traits.includes("perceptual_color") || booleanProperty(props, ["perceptual_color", "perceptualColor", "scientific"]) === true || colorMap !== void 0 || palette !== void 0 || gradient !== void 0;
3443
+ if (!enabled) return void 0;
3444
+ const input = {
3445
+ colorMap: colorMap ?? (palette || gradient ? void 0 : fallbackColorMap),
3446
+ palette,
3447
+ gradient,
3448
+ steps: numberProperty(props, ["steps", "color_steps", "colorSteps"]),
3449
+ dampening: numberProperty(props, ["dampening", "perceptual_dampening", "perceptualDampening"]),
3450
+ targetDeltaE: numberProperty(props, ["target_delta_e", "targetDeltaE"]),
3451
+ neutralAxis: booleanProperty(props, ["neutral_axis", "neutralAxis"]),
3452
+ scientific: true
3453
+ };
3454
+ const pass = applyPerceptualColorPass(input);
3455
+ const source = pass.colorMap ?? pass.gradient ?? pass.palette;
3456
+ const colors = source?.colors ?? [];
3457
+ const stops = pass.colorMap?.stops ?? pass.gradient?.stops ?? sampledStopsFromColors(colors);
3458
+ return {
3459
+ mapName: pass.colorMap?.name ?? colorMap ?? (palette ? "palette" : gradient ? "gradient" : fallbackColorMap),
3460
+ colors,
3461
+ stops,
3462
+ minDeltaE: source?.minDeltaE ?? 0,
3463
+ maxDeltaE: source?.maxDeltaE ?? 0,
3464
+ meanDeltaE: source?.meanDeltaE ?? 0,
3465
+ warnings: pass.warnings,
3466
+ pass
3467
+ };
3468
+ }
3469
+ function perceptualColorRampFloat32(metadata) {
3470
+ return metadata.colors.map((color) => {
3471
+ const [r, g, b] = hexToRGBTuple(color);
3472
+ return `${r}, ${g}, ${b}, 1.0`;
3473
+ }).join(", ");
3474
+ }
3475
+ function perceptualColorRampLinearColors(metadata) {
3476
+ return metadata.colors.map((color) => {
3477
+ const [r, g, b] = hexToRGBTuple(color);
3478
+ return `FLinearColor(${r}f, ${g}f, ${b}f, 1.0f)`;
3479
+ }).join(", ");
3480
+ }
2728
3481
  function compileDataVizBlock(block) {
2729
3482
  const props = block.properties || {};
2730
3483
  let axes;
@@ -2738,6 +3491,9 @@ function compileDataVizBlock(block) {
2738
3491
  if (props.width != null || props.height != null) {
2739
3492
  dimensions = { width: props.width ?? 400, height: props.height ?? 300 };
2740
3493
  }
3494
+ const traits = block.traits || [];
3495
+ const colorMap = stringProperty(props, ["color_map", "colormap", "colorMap"]);
3496
+ const perceptualColorPass = buildPerceptualColorMetadata(props, traits, colorMap ?? "viridis");
2741
3497
  return {
2742
3498
  name: block.name || "unnamed",
2743
3499
  keyword: block.keyword,
@@ -2747,11 +3503,14 @@ function compileDataVizBlock(block) {
2747
3503
  aggregation: props.aggregation,
2748
3504
  refreshInterval: props.refresh_interval,
2749
3505
  dimensions,
2750
- traits: block.traits || [],
3506
+ colorMap: colorMap ?? perceptualColorPass?.mapName,
3507
+ perceptualColorPass,
3508
+ traits,
2751
3509
  properties: props
2752
3510
  };
2753
3511
  }
2754
3512
  function datavizToR3F(dv) {
3513
+ const perceptual = dv.perceptualColorPass;
2755
3514
  const safeName = dv.name.replace(/[^a-zA-Z0-9_]/g, "_");
2756
3515
  const lines = [];
2757
3516
  lines.push(`// DataViz: ${dv.name} (${dv.keyword})`);
@@ -2765,10 +3524,15 @@ function datavizToR3F(dv) {
2765
3524
  if (dv.refreshInterval) lines.push(` refreshInterval: ${dv.refreshInterval},`);
2766
3525
  if (dv.dimensions)
2767
3526
  lines.push(` dimensions: { width: ${dv.dimensions.width}, height: ${dv.dimensions.height} },`);
3527
+ if (dv.colorMap)
3528
+ lines.push(` colorMap: ${JSON.stringify(dv.colorMap)},`);
3529
+ if (perceptual)
3530
+ lines.push(` perceptualColorPass: ${JSON.stringify(perceptual)},`);
2768
3531
  lines.push("};");
2769
3532
  return lines.join("\n");
2770
3533
  }
2771
3534
  function datavizToUnity(dv) {
3535
+ const perceptual = dv.perceptualColorPass;
2772
3536
  const safeName = dv.name.replace(/[^a-zA-Z0-9_]/g, "_");
2773
3537
  const lines = [];
2774
3538
  lines.push(`// DataViz: ${dv.name}`);
@@ -2782,9 +3546,58 @@ function datavizToUnity(dv) {
2782
3546
  lines.push(` public float width = ${dv.dimensions.width}f;`);
2783
3547
  lines.push(` public float height = ${dv.dimensions.height}f;`);
2784
3548
  }
3549
+ if (dv.colorMap)
3550
+ lines.push(` public string colorMap = "${esc(dv.colorMap, "CSharp")}";`);
3551
+ if (perceptual) {
3552
+ lines.push(
3553
+ ` public string[] perceptualColorRamp = new string[] { ${perceptual.colors.map((color) => `"${color}"`).join(", ")} };`
3554
+ );
3555
+ lines.push(` public float perceptualMinDeltaE = ${perceptual.minDeltaE.toFixed(3)}f;`);
3556
+ lines.push(` public float perceptualMeanDeltaE = ${perceptual.meanDeltaE.toFixed(3)}f;`);
3557
+ }
2785
3558
  lines.push("}");
2786
3559
  return lines.join("\n");
2787
3560
  }
3561
+ function datavizToUnreal(dv, varPrefix) {
3562
+ const perceptual = dv.perceptualColorPass;
3563
+ const lines = [];
3564
+ lines.push(`// DataViz: ${dv.name}`);
3565
+ lines.push(`FString ${varPrefix}DataVizType = TEXT("${esc(dv.keyword, "CSharp")}");`);
3566
+ if (dv.chartType) lines.push(`FString ${varPrefix}ChartType = TEXT("${esc(dv.chartType, "CSharp")}");`);
3567
+ if (dv.dataSource) lines.push(`FString ${varPrefix}DataSource = TEXT("${esc(dv.dataSource, "CSharp")}");`);
3568
+ if (perceptual) {
3569
+ lines.push(`// PerceptualColorPass: ${perceptual.mapName}, ${perceptual.colors.length} stops`);
3570
+ lines.push(`TArray<FLinearColor> ${varPrefix}PerceptualColorRamp = { ${perceptualColorRampLinearColors(perceptual)} };`);
3571
+ lines.push(`float ${varPrefix}PerceptualMinDeltaE = ${perceptual.minDeltaE.toFixed(3)}f;`);
3572
+ }
3573
+ return lines.join("\n");
3574
+ }
3575
+ function datavizToWebGPU(dv, varPrefix) {
3576
+ const perceptual = dv.perceptualColorPass;
3577
+ const lines = [];
3578
+ lines.push(`// DataViz: ${dv.name}`);
3579
+ lines.push(`const ${varPrefix}DataVizConfig = ${JSON.stringify({
3580
+ name: dv.name,
3581
+ type: dv.keyword,
3582
+ chartType: dv.chartType,
3583
+ dataSource: dv.dataSource,
3584
+ axes: dv.axes,
3585
+ aggregation: dv.aggregation,
3586
+ refreshInterval: dv.refreshInterval,
3587
+ dimensions: dv.dimensions,
3588
+ colorMap: dv.colorMap
3589
+ })};`);
3590
+ if (perceptual) {
3591
+ lines.push(`const ${varPrefix}PerceptualColorRamp = new Float32Array([${perceptualColorRampFloat32(perceptual)}]);`);
3592
+ lines.push(`const ${varPrefix}PerceptualColorStats = ${JSON.stringify({
3593
+ minDeltaE: perceptual.minDeltaE,
3594
+ maxDeltaE: perceptual.maxDeltaE,
3595
+ meanDeltaE: perceptual.meanDeltaE,
3596
+ warnings: perceptual.warnings
3597
+ })};`);
3598
+ }
3599
+ return lines.join("\n");
3600
+ }
2788
3601
  function datavizToGodot(dv) {
2789
3602
  const lines = [];
2790
3603
  lines.push(`# DataViz: ${dv.name}`);
@@ -3732,13 +4545,19 @@ function compileSimulationBlock(block) {
3732
4545
  const c = child;
3733
4546
  if (c.traits?.includes("scalar_field_overlay") || c.keyword === "scalar_field_overlay") {
3734
4547
  const p = c.properties || {};
4548
+ const colormap = p.colormap ?? "turbo";
3735
4549
  overlays.push({
3736
4550
  source: p.source ?? "",
3737
- colormap: p.colormap ?? "turbo",
4551
+ colormap,
3738
4552
  range: p.range ?? [0, 1],
3739
4553
  opacity: p.opacity ?? 0.7,
3740
4554
  visible: p.visible ?? true,
3741
- label: p.label ?? ""
4555
+ label: p.label ?? "",
4556
+ perceptualColorPass: buildPerceptualColorMetadata(
4557
+ { ...p, colormap },
4558
+ c.traits || [],
4559
+ colormap
4560
+ )
3742
4561
  });
3743
4562
  }
3744
4563
  }
@@ -3774,9 +4593,16 @@ function simulationEnvironmentToR3FChunks(env) {
3774
4593
  function simulationToR3F(sim) {
3775
4594
  const configExpr = JSON.stringify(sim.config);
3776
4595
  const { visualLines, userDataExpr } = simulationEnvironmentToR3FChunks(sim.environment);
3777
- const overlayJSX = sim.overlays.map(
3778
- (o) => `<ScalarFieldOverlay colormap="${o.colormap}" range={[${o.range.join(", ")}]} opacity={${o.opacity}} visible={${o.visible}} label="${o.label}" />`
3779
- ).join("\n ");
4596
+ const overlayJSX = sim.overlays.map((o) => {
4597
+ const perceptualComment = o.perceptualColorPass ? `{/* PerceptualColorPass ${JSON.stringify({
4598
+ mapName: o.perceptualColorPass.mapName,
4599
+ colors: o.perceptualColorPass.colors,
4600
+ minDeltaE: o.perceptualColorPass.minDeltaE,
4601
+ meanDeltaE: o.perceptualColorPass.meanDeltaE
4602
+ })} */}
4603
+ ` : "";
4604
+ return `${perceptualComment}<ScalarFieldOverlay colormap="${o.colormap}" range={[${o.range.join(", ")}]} opacity={${o.opacity}} visible={${o.visible}} label="${o.label}" />`;
4605
+ }).join("\n ");
3780
4606
  const envVisual = visualLines.length > 0 ? `${visualLines.join("\n ")}
3781
4607
  ` : "";
3782
4608
  const wrapWithGroup = (body) => userDataExpr ? `<group userData={${userDataExpr}}>
@@ -3821,11 +4647,12 @@ function hexToRGBA(hex, alpha) {
3821
4647
  function getRequiredCapability() {
3822
4648
  return ANSCapabilityPath.DOMAIN_BLOCK;
3823
4649
  }
3824
- var PHYSICAL_MATERIAL_KEYS, DOMAIN_BLOCK_COMPILER_MIXIN_CAPABILITY;
4650
+ var PHYSICAL_MATERIAL_KEYS, mgToVec3, mgToF32, DOMAIN_BLOCK_COMPILER_MIXIN_CAPABILITY;
3825
4651
  var init_DomainBlockCompilerMixin = __esm({
3826
4652
  "src/compiler/DomainBlockCompilerMixin.ts"() {
3827
4653
  init_CompilerBase();
3828
4654
  init_ANSNamespace();
4655
+ init_PerceptualColorPass();
3829
4656
  PHYSICAL_MATERIAL_KEYS = [
3830
4657
  "clearcoat",
3831
4658
  "clearcoatRoughness",
@@ -3839,10 +4666,12 @@ var init_DomainBlockCompilerMixin = __esm({
3839
4666
  "attenuationColor",
3840
4667
  "attenuationDistance"
3841
4668
  ];
4669
+ mgToVec3 = (v) => !v ? "vec3<f32>(0.0)" : v.type === "vec3" ? v.ref : `vec3<f32>(${v.ref})`;
4670
+ mgToF32 = (v, fallback = "0.0") => !v ? fallback : v.type === "f32" ? v.ref : `(${v.ref}).x`;
3842
4671
  DOMAIN_BLOCK_COMPILER_MIXIN_CAPABILITY = "/compile/mixin/domain-block";
3843
4672
  }
3844
4673
  });
3845
4674
 
3846
- export { DOMAIN_BLOCK_COMPILER_MIXIN_CAPABILITY, architectureToGodot, architectureToR3F, architectureToUSDA, architectureToUnity, architectureToVRChat, audioSourceToAndroidXR, audioSourceToBabylon, audioSourceToGodot, audioSourceToPlayCanvas, audioSourceToR3F, audioSourceToUSD, audioSourceToUnity, audioSourceToUnreal, audioSourceToVisionOS, compileArchitectureBlock, compileAudioSourceBlock, compileDataVizBlock, compileDomainBlocks, compileEducationBlock, compileHealthcareBlock, compileInputBlock, compileIoTBlock, compileMaterialBlock, compileMusicBlock, compileNarrativeBlock, compileNavigationBlock, compileParticleBlock, compilePaymentBlock, compilePhysicsBlock, compilePostProcessingBlock, compileProceduralBlock, compileRenderingBlock, compileRoboticsBlock, compileSimulationBlock, compileWeatherBlock, compileWeb3Block, datavizToGodot, datavizToR3F, datavizToUSDA, datavizToUnity, datavizToVRChat, educationToGodot, educationToR3F, educationToUSDA, educationToUnity, educationToVRChat, getRequiredCapability, healthcareToGodot, healthcareToR3F, healthcareToUSDA, healthcareToUnity, healthcareToVRChat, init_DomainBlockCompilerMixin, inputToGodot, inputToR3F, inputToUSDA, inputToUnity, inputToVRChat, iotToGodot, iotToR3F, iotToUSDA, iotToUnity, iotToVRChat, isPhysicalMaterial, materialToAndroidXR, materialToBabylon, materialToGLTF, materialToGodot, materialToPlayCanvas, materialToR3F, materialToSDF, materialToUSD, materialToUnity, materialToUnreal, materialToVRChat, materialToVisionOS, materialToWebGPU, musicToGodot, musicToR3F, musicToUSDA, musicToUnity, musicToVRChat, narrativeToGodot, narrativeToR3F, narrativeToUSDA, narrativeToUnity, narrativeToVRChat, navigationToGodot, navigationToR3F, navigationToUSDA, navigationToUnity, navigationToVRChat, particlesToAndroidXR, particlesToBabylon, particlesToGodot, particlesToPlayCanvas, particlesToR3F, particlesToUSD, particlesToUnity, particlesToUnreal, particlesToVisionOS, paymentToGodot, paymentToR3F, paymentToUSDA, paymentToUnity, paymentToVRChat, physicsToAndroidXR, physicsToBabylon, physicsToGodot, physicsToPlayCanvas, physicsToR3F, physicsToSDF, physicsToURDF, physicsToUnity, physicsToUnreal, physicsToVisionOS, postProcessingToBabylon, postProcessingToGodot, postProcessingToR3F, postProcessingToUSD, postProcessingToUnity, postProcessingToUnreal, proceduralToGodot, proceduralToR3F, proceduralToUSDA, proceduralToUnity, proceduralToVRChat, renderingToGodot, renderingToR3F, renderingToUSDA, renderingToUnity, renderingToVRChat, roboticsToGodot, roboticsToR3F, roboticsToUSDA, roboticsToUnity, roboticsToVRChat, simulationToR3F, weatherToAndroidXR, weatherToGodot, weatherToR3F, weatherToUSD, weatherToUnity, weatherToUnreal, web3ToGodot, web3ToR3F, web3ToUSDA, web3ToUnity, web3ToVRChat };
3847
- //# sourceMappingURL=chunk-ZA34AN3R.js.map
3848
- //# sourceMappingURL=chunk-ZA34AN3R.js.map
4675
+ export { DOMAIN_BLOCK_COMPILER_MIXIN_CAPABILITY, architectureToGodot, architectureToR3F, architectureToUSDA, architectureToUnity, architectureToVRChat, audioSourceToAndroidXR, audioSourceToBabylon, audioSourceToGodot, audioSourceToPlayCanvas, audioSourceToR3F, audioSourceToUSD, audioSourceToUnity, audioSourceToUnreal, audioSourceToVisionOS, compileArchitectureBlock, compileAudioSourceBlock, compileDataVizBlock, compileDomainBlocks, compileEducationBlock, compileHealthcareBlock, compileInputBlock, compileIoTBlock, compileLightFieldBlock, compileMaterialBlock, compileMaterialGraphBlock, compileMusicBlock, compileNarrativeBlock, compileNavFieldBlock, compileNavigationBlock, compileParticleBlock, compileParticleFieldBlock, compilePaymentBlock, compilePhysicsBlock, compilePhysicsContractBlock, compilePostProcessingBlock, compileProceduralBlock, compileRenderingBlock, compileRoboticsBlock, compileSimulationBlock, compileWeatherBlock, compileWeb3Block, datavizToGodot, datavizToR3F, datavizToUSDA, datavizToUnity, datavizToUnreal, datavizToVRChat, datavizToWebGPU, educationToGodot, educationToR3F, educationToUSDA, educationToUnity, educationToVRChat, getRequiredCapability, healthcareToGodot, healthcareToR3F, healthcareToUSDA, healthcareToUnity, healthcareToVRChat, init_DomainBlockCompilerMixin, inputToGodot, inputToR3F, inputToUSDA, inputToUnity, inputToVRChat, iotToGodot, iotToR3F, iotToUSDA, iotToUnity, iotToVRChat, isPhysicalMaterial, lightFieldToWGSL, materialGraphToWGSL, materialToAndroidXR, materialToBabylon, materialToGLTF, materialToGodot, materialToPlayCanvas, materialToR3F, materialToSDF, materialToUSD, materialToUnity, materialToUnreal, materialToVRChat, materialToVisionOS, materialToWebGPU, musicToGodot, musicToR3F, musicToUSDA, musicToUnity, musicToVRChat, narrativeToGodot, narrativeToR3F, narrativeToUSDA, narrativeToUnity, narrativeToVRChat, navFieldToWGSL, navigationToGodot, navigationToR3F, navigationToUSDA, navigationToUnity, navigationToVRChat, particleFieldToWGSL, particlesToAndroidXR, particlesToBabylon, particlesToGodot, particlesToPlayCanvas, particlesToR3F, particlesToUSD, particlesToUnity, particlesToUnreal, particlesToVisionOS, paymentToGodot, paymentToR3F, paymentToUSDA, paymentToUnity, paymentToVRChat, physicsContractToWGSL, physicsToAndroidXR, physicsToBabylon, physicsToGodot, physicsToPlayCanvas, physicsToR3F, physicsToSDF, physicsToURDF, physicsToUnity, physicsToUnreal, physicsToVisionOS, postProcessingToBabylon, postProcessingToGodot, postProcessingToR3F, postProcessingToUSD, postProcessingToUnity, postProcessingToUnreal, proceduralToGodot, proceduralToR3F, proceduralToUSDA, proceduralToUnity, proceduralToVRChat, renderingToGodot, renderingToR3F, renderingToUSDA, renderingToUnity, renderingToVRChat, roboticsToGodot, roboticsToR3F, roboticsToUSDA, roboticsToUnity, roboticsToVRChat, simulationToR3F, weatherToAndroidXR, weatherToGodot, weatherToR3F, weatherToUSD, weatherToUnity, weatherToUnreal, web3ToGodot, web3ToR3F, web3ToUSDA, web3ToUnity, web3ToVRChat };
4676
+ //# sourceMappingURL=chunk-5LVFTGKH.js.map
4677
+ //# sourceMappingURL=chunk-5LVFTGKH.js.map