@holoscript/core 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/README.md +2 -2
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-276GE64O.js +16 -0
  4. package/dist/GLTFPipeline-M7WSSJED.cjs +37 -0
  5. package/dist/HoloScriptPlusParser-7FBIFUFC.js +693 -0
  6. package/dist/HoloScriptPlusParser-A2W7OCN2.cjs +698 -0
  7. package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
  8. package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
  9. package/dist/HoloScriptRuntime-3URVTKPJ.js +10 -0
  10. package/dist/HoloScriptRuntime-SXEAEU2N.cjs +19 -0
  11. package/dist/USDZExporter-3FWJ25JI.cjs +1037 -0
  12. package/dist/USDZExporter-D2HQLQYK.js +1035 -0
  13. package/dist/agents/index.cjs +19 -0
  14. package/dist/agents/index.d.ts +100 -0
  15. package/dist/agents/index.js +17 -0
  16. package/dist/chunk-23J755AR.js +1046 -0
  17. package/dist/chunk-253GBQZY.cjs +627 -0
  18. package/dist/chunk-25IQCHTO.cjs +781 -0
  19. package/dist/chunk-2BSMSUCE.js +1941 -0
  20. package/dist/chunk-2M2DPHKB.js +762 -0
  21. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  22. package/dist/chunk-3AO425MZ.cjs +886 -0
  23. package/dist/chunk-3FOKASKO.cjs +348 -0
  24. package/dist/chunk-3HYYMEXI.cjs +56578 -0
  25. package/dist/chunk-3NFFOWGG.js +4287 -0
  26. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  27. package/dist/chunk-4C57PR42.js +468 -0
  28. package/dist/chunk-4N4SXXWF.js +769 -0
  29. package/dist/chunk-4PDEPEQW.cjs +41 -0
  30. package/dist/chunk-4R6SBXDB.js +45 -0
  31. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  32. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  33. package/dist/chunk-5GLCTO44.js +161 -0
  34. package/dist/chunk-5JEU52DW.js +382 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-62FBK3B7.js +70 -0
  38. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  39. package/dist/chunk-6DPSFNJB.cjs +847 -0
  40. package/dist/chunk-6EX3I5P4.cjs +130 -0
  41. package/dist/chunk-73FELZVJ.cjs +611 -0
  42. package/dist/chunk-7CUEMLDZ.cjs +6445 -0
  43. package/dist/chunk-7HIASF7S.cjs +814 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-AIA52I7T.cjs +543 -0
  46. package/dist/chunk-ANXZFVY2.js +113 -0
  47. package/dist/chunk-AYBXB26F.js +2176 -0
  48. package/dist/chunk-B4TFTDG4.js +449 -0
  49. package/dist/chunk-BE4UJCQT.js +623 -0
  50. package/dist/chunk-BRQJKJGT.cjs +20 -0
  51. package/dist/chunk-C2A5DUMF.cjs +689 -0
  52. package/dist/chunk-C37BHB7N.cjs +636 -0
  53. package/dist/chunk-CBJY23VL.js +126 -0
  54. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  55. package/dist/chunk-CXFDRBQU.cjs +672 -0
  56. package/dist/chunk-D54CNIAJ.cjs +413 -0
  57. package/dist/chunk-DAJXW4KX.js +725 -0
  58. package/dist/chunk-DTGBOSEM.cjs +319 -0
  59. package/dist/chunk-E7JP3BS3.cjs +61 -0
  60. package/dist/chunk-EKBKLK7P.js +1169 -0
  61. package/dist/chunk-EKYL4PE3.cjs +404 -0
  62. package/dist/chunk-EUDQTK7N.cjs +4310 -0
  63. package/dist/chunk-EXKSFGSX.cjs +274 -0
  64. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  65. package/dist/chunk-F43YAA34.js +623 -0
  66. package/dist/chunk-FDSGHPAK.js +130 -0
  67. package/dist/chunk-FEWUHQNM.cjs +144 -0
  68. package/dist/chunk-FGGJQRLZ.js +270 -0
  69. package/dist/chunk-FHP6LXJS.js +415 -0
  70. package/dist/chunk-FJPADH77.cjs +666 -0
  71. package/dist/chunk-FYSPZT4V.cjs +169 -0
  72. package/dist/chunk-GIOYPNTH.js +5575 -0
  73. package/dist/chunk-GJNCFRJU.cjs +125 -0
  74. package/dist/chunk-GMP623FG.cjs +1508 -0
  75. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  76. package/dist/chunk-GQT4TYKY.cjs +4381 -0
  77. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  78. package/dist/chunk-GYZE55MO.js +2007 -0
  79. package/dist/chunk-GZG4KA4E.js +529 -0
  80. package/dist/chunk-H652NHX5.js +600 -0
  81. package/dist/chunk-HCCQLAA4.cjs +74 -0
  82. package/dist/chunk-HINXWAOD.cjs +1049 -0
  83. package/dist/chunk-HYNTS5CP.js +422 -0
  84. package/dist/chunk-HZSPDCXV.cjs +457 -0
  85. package/dist/chunk-HZTDET3N.js +1399 -0
  86. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  87. package/dist/chunk-ILRBGFVD.cjs +72 -0
  88. package/dist/chunk-IPWSXCCN.js +1183 -0
  89. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  90. package/dist/chunk-IVSZDECV.js +882 -0
  91. package/dist/chunk-IVY74O6C.js +247 -0
  92. package/dist/chunk-IZM5VQZD.js +714 -0
  93. package/dist/chunk-J32ZJZJH.js +554 -0
  94. package/dist/chunk-J6M4FPK5.js +421 -0
  95. package/dist/chunk-JC5YBPSF.cjs +984 -0
  96. package/dist/chunk-JCLBKPMX.js +3813 -0
  97. package/dist/chunk-JD7CIZ33.js +1949 -0
  98. package/dist/chunk-JIYN45TV.cjs +2525 -0
  99. package/dist/chunk-JJBE3TIH.cjs +1189 -0
  100. package/dist/chunk-JX7YL6ZE.js +2252 -0
  101. package/dist/chunk-K4VVR7CN.cjs +2433 -0
  102. package/dist/chunk-KEFNV2WM.cjs +2257 -0
  103. package/dist/chunk-KH4CNH66.cjs +424 -0
  104. package/dist/chunk-KJLB4OPV.js +5731 -0
  105. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  106. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  107. package/dist/chunk-KPJL34Y7.cjs +186 -0
  108. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  109. package/dist/chunk-KVRSTFNH.cjs +72 -0
  110. package/dist/chunk-LICPB5HZ.cjs +1409 -0
  111. package/dist/chunk-LM2VU56C.cjs +37 -0
  112. package/dist/chunk-M56JSP4A.js +400 -0
  113. package/dist/chunk-MBOOR7X4.js +18 -0
  114. package/dist/chunk-MGE5Z4GS.js +608 -0
  115. package/dist/chunk-MXFUTKCO.js +56 -0
  116. package/dist/chunk-MYY4PMWX.cjs +264 -0
  117. package/dist/chunk-N75IH2HY.js +258 -0
  118. package/dist/chunk-NBMHU6SW.js +669 -0
  119. package/dist/chunk-NG77ATEW.cjs +778 -0
  120. package/dist/chunk-NGKREZ36.js +6384 -0
  121. package/dist/chunk-NHWSN2SD.cjs +718 -0
  122. package/dist/chunk-NV4VMVXU.js +421 -0
  123. package/dist/chunk-NW5G5FBQ.js +215 -0
  124. package/dist/chunk-NXZFOPVD.cjs +5737 -0
  125. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  126. package/dist/chunk-OIQYIIO3.cjs +473 -0
  127. package/dist/chunk-OL46QLBJ.js +61 -0
  128. package/dist/chunk-OMXII44L.js +5386 -0
  129. package/dist/chunk-OR4Q2BGL.cjs +759 -0
  130. package/dist/chunk-OSYNRVOV.cjs +243 -0
  131. package/dist/chunk-PGANYCAG.cjs +220 -0
  132. package/dist/chunk-PHENW4MQ.js +65 -0
  133. package/dist/chunk-PHVRG4I2.js +844 -0
  134. package/dist/chunk-Q56TT7IL.js +483 -0
  135. package/dist/chunk-QPOQ7VPI.js +1491 -0
  136. package/dist/chunk-QPSKHBJP.js +5963 -0
  137. package/dist/chunk-QXH7QDSZ.js +1989 -0
  138. package/dist/chunk-R75BSDH7.cjs +50 -0
  139. package/dist/chunk-RARB3MBR.js +207 -0
  140. package/dist/chunk-RVBHAXFG.js +56160 -0
  141. package/dist/chunk-S3MDHNKB.cjs +490 -0
  142. package/dist/chunk-S4W6Z2MN.js +2426 -0
  143. package/dist/chunk-S6YWHCKV.cjs +410 -0
  144. package/dist/chunk-SIEXCILW.js +229 -0
  145. package/dist/chunk-SJBGLS25.cjs +2196 -0
  146. package/dist/chunk-SLU6UPJI.cjs +410 -0
  147. package/dist/chunk-SMIWS6DE.cjs +212 -0
  148. package/dist/chunk-T2QCTZMO.js +811 -0
  149. package/dist/chunk-T5J7ZKP3.cjs +4885 -0
  150. package/dist/chunk-TDCNJHWO.js +341 -0
  151. package/dist/chunk-TG7O4WBC.js +406 -0
  152. package/dist/chunk-THCK6ECW.js +2085 -0
  153. package/dist/chunk-TJHVSBP2.js +439 -0
  154. package/dist/chunk-TVHSPJ4N.cjs +606 -0
  155. package/dist/chunk-U44IKGG7.cjs +5390 -0
  156. package/dist/chunk-UJXISJBN.js +487 -0
  157. package/dist/chunk-UM6C3CGK.js +4375 -0
  158. package/dist/chunk-UMABK6SI.js +686 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-V6MKC2FZ.js +979 -0
  162. package/dist/chunk-VECQYRXL.js +474 -0
  163. package/dist/chunk-VJ3L7CHT.cjs +169 -0
  164. package/dist/chunk-VMLKSV26.js +1216 -0
  165. package/dist/chunk-VVKVQZI6.js +55 -0
  166. package/dist/chunk-W6RW64BB.cjs +1219 -0
  167. package/dist/chunk-W7VDOASB.cjs +639 -0
  168. package/dist/chunk-WDT3JTGM.cjs +483 -0
  169. package/dist/chunk-WJIHFLMJ.js +404 -0
  170. package/dist/chunk-WKX5AMOY.js +309 -0
  171. package/dist/chunk-WNNE3PO3.js +34 -0
  172. package/dist/chunk-WRKUDAZJ.js +3038 -0
  173. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  174. package/dist/chunk-WRNEH5MO.js +3169 -0
  175. package/dist/chunk-WRWEX5ZF.js +658 -0
  176. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  177. package/dist/chunk-XHIV6326.cjs +793 -0
  178. package/dist/chunk-XIVIE43A.cjs +729 -0
  179. package/dist/chunk-XJAN7CZG.cjs +432 -0
  180. package/dist/chunk-XKTPFXGA.js +164 -0
  181. package/dist/chunk-XL6INWKT.js +121 -0
  182. package/dist/chunk-XSFNHP2E.js +632 -0
  183. package/dist/chunk-XT6JY5W5.js +9684 -0
  184. package/dist/chunk-XUILI4KB.cjs +430 -0
  185. package/dist/chunk-XUUVDHIF.cjs +3962 -0
  186. package/dist/chunk-YF2I3MV3.js +46 -0
  187. package/dist/chunk-YIMN575O.js +4847 -0
  188. package/dist/chunk-YIVFJNYV.js +176 -0
  189. package/dist/chunk-YKGPCZEE.cjs +237 -0
  190. package/dist/chunk-YN6V7R3L.cjs +327 -0
  191. package/dist/chunk-YQELFNJV.js +39 -0
  192. package/dist/chunk-YYXH45E2.js +426 -0
  193. package/dist/chunk-ZBQXLH2L.js +756 -0
  194. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  195. package/dist/chunk-ZU7NIRT6.js +325 -0
  196. package/dist/chunk-ZZ7RO2UQ.js +1243 -0
  197. package/dist/chunk-ZZEI7MV4.js +778 -0
  198. package/dist/cli/holoscript-runner.cjs +2255 -0
  199. package/dist/cli/holoscript-runner.js +2230 -0
  200. package/dist/codebase/index.cjs +336 -0
  201. package/dist/codebase/index.js +331 -0
  202. package/dist/compiler/agent-inference.cjs +31 -0
  203. package/dist/compiler/agent-inference.js +8 -0
  204. package/dist/compiler/android-xr.cjs +24 -0
  205. package/dist/compiler/android-xr.js +14 -0
  206. package/dist/compiler/android.cjs +24 -0
  207. package/dist/compiler/android.js +14 -0
  208. package/dist/compiler/ar.cjs +23 -0
  209. package/dist/compiler/ar.js +11 -0
  210. package/dist/compiler/babylon.cjs +21 -0
  211. package/dist/compiler/babylon.js +15 -0
  212. package/dist/compiler/business-quest.cjs +43 -0
  213. package/dist/compiler/business-quest.js +4 -0
  214. package/dist/compiler/coco.cjs +27 -0
  215. package/dist/compiler/coco.js +4 -0
  216. package/dist/compiler/context.cjs +25 -0
  217. package/dist/compiler/context.d.ts +28 -0
  218. package/dist/compiler/context.js +8 -0
  219. package/dist/compiler/domain-block-utils.cjs +605 -0
  220. package/dist/compiler/domain-block-utils.js +11 -0
  221. package/dist/compiler/dtdl.cjs +27 -0
  222. package/dist/compiler/dtdl.js +11 -0
  223. package/dist/compiler/gltf-pipeline.cjs +39 -0
  224. package/dist/compiler/gltf-pipeline.js +4 -0
  225. package/dist/compiler/godot.cjs +18 -0
  226. package/dist/compiler/godot.js +12 -0
  227. package/dist/compiler/incremental.cjs +34 -0
  228. package/dist/compiler/incremental.js +9 -0
  229. package/dist/compiler/index.cjs +5860 -0
  230. package/dist/compiler/index.d.ts +322 -21
  231. package/dist/compiler/index.js +5525 -0
  232. package/dist/compiler/ios.cjs +23 -0
  233. package/dist/compiler/ios.js +13 -0
  234. package/dist/compiler/llm-provider-capabilities.cjs +25 -0
  235. package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
  236. package/dist/compiler/llm-provider-capabilities.js +8 -0
  237. package/dist/compiler/multi-layer.cjs +24 -0
  238. package/dist/compiler/multi-layer.js +15 -0
  239. package/dist/compiler/nodetoy.cjs +23 -0
  240. package/dist/compiler/nodetoy.js +4 -0
  241. package/dist/compiler/openxr.cjs +19 -0
  242. package/dist/compiler/openxr.js +13 -0
  243. package/dist/compiler/playcanvas.cjs +19 -0
  244. package/dist/compiler/playcanvas.js +13 -0
  245. package/dist/compiler/r3f.cjs +38 -0
  246. package/dist/compiler/r3f.d.ts +22 -0
  247. package/dist/compiler/r3f.js +16 -0
  248. package/dist/compiler/remotion.cjs +23 -0
  249. package/dist/compiler/remotion.js +4 -0
  250. package/dist/compiler/reproducibility.cjs +39 -0
  251. package/dist/compiler/reproducibility.js +4 -0
  252. package/dist/compiler/sdf.cjs +24 -0
  253. package/dist/compiler/sdf.js +12 -0
  254. package/dist/compiler/semantic-scene.cjs +31 -0
  255. package/dist/compiler/semantic-scene.js +4 -0
  256. package/dist/compiler/state.cjs +21 -0
  257. package/dist/compiler/state.js +11 -0
  258. package/dist/compiler/trait-composition.cjs +30 -0
  259. package/dist/compiler/trait-composition.js +9 -0
  260. package/dist/compiler/unity.cjs +19 -0
  261. package/dist/compiler/unity.js +13 -0
  262. package/dist/compiler/unreal.cjs +23 -0
  263. package/dist/compiler/unreal.js +13 -0
  264. package/dist/compiler/urdf.cjs +52 -0
  265. package/dist/compiler/urdf.js +12 -0
  266. package/dist/compiler/usd-physics.cjs +26 -0
  267. package/dist/compiler/usd-physics.js +9 -0
  268. package/dist/compiler/visionos.cjs +19 -0
  269. package/dist/compiler/visionos.js +13 -0
  270. package/dist/compiler/vrchat.cjs +22 -0
  271. package/dist/compiler/vrchat.js +12 -0
  272. package/dist/compiler/vrr.cjs +24 -0
  273. package/dist/compiler/vrr.js +12 -0
  274. package/dist/compiler/wasm.cjs +36 -0
  275. package/dist/compiler/wasm.js +12 -0
  276. package/dist/compiler/webgpu.cjs +18 -0
  277. package/dist/compiler/webgpu.js +12 -0
  278. package/dist/coordinators/index.cjs +1266 -0
  279. package/dist/coordinators/index.d.ts +72 -1
  280. package/dist/coordinators/index.js +1259 -0
  281. package/dist/debugger.cjs +24 -0
  282. package/dist/debugger.js +11 -0
  283. package/dist/entries/interop.cjs +64 -0
  284. package/dist/entries/interop.js +7 -0
  285. package/dist/entries/scripting.cjs +55 -0
  286. package/dist/entries/scripting.js +10 -0
  287. package/dist/hololand/index.cjs +146 -0
  288. package/dist/hololand/index.d.ts +70 -0
  289. package/dist/hololand/index.js +5 -0
  290. package/dist/index.cjs +43233 -0
  291. package/dist/index.d.ts +976 -21
  292. package/dist/index.js +39995 -0
  293. package/dist/math/tropical-spmv.cjs +45 -0
  294. package/dist/math/tropical-spmv.js +4 -0
  295. package/dist/math/vec3.cjs +57 -0
  296. package/dist/math/vec3.js +4 -0
  297. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  298. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  299. package/dist/paper-0c-spike/index.cjs +150 -0
  300. package/dist/paper-0c-spike/index.js +141 -0
  301. package/dist/parser.cjs +61 -0
  302. package/dist/parser.d.ts +11 -0
  303. package/dist/parser.js +12 -0
  304. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  305. package/dist/playwright-VZPDVUEQ.js +98660 -0
  306. package/dist/reconstruction/index.cjs +153 -0
  307. package/dist/reconstruction/index.d.ts +29 -2
  308. package/dist/reconstruction/index.js +8 -0
  309. package/dist/runtime.cjs +316 -0
  310. package/dist/runtime.d.ts +61 -0
  311. package/dist/runtime.js +31 -0
  312. package/dist/self-improvement/index.cjs +563 -0
  313. package/dist/self-improvement/index.js +545 -0
  314. package/dist/storage/index.cjs +38 -0
  315. package/dist/storage/index.js +5 -0
  316. package/dist/testing.cjs +25 -0
  317. package/dist/testing.d.ts +70 -0
  318. package/dist/testing.js +4 -0
  319. package/dist/traitDocs/traitDocs.cjs +33 -0
  320. package/dist/traitDocs/traitDocs.js +7 -0
  321. package/dist/traits/botanical-lotus.cjs +41 -0
  322. package/dist/traits/botanical-lotus.d.ts +172 -0
  323. package/dist/traits/botanical-lotus.js +4 -0
  324. package/dist/traits/engines/index.cjs +520 -0
  325. package/dist/traits/engines/index.js +380 -0
  326. package/dist/traits/index.cjs +24409 -0
  327. package/dist/traits/index.d.ts +171 -35
  328. package/dist/traits/index.js +21634 -0
  329. package/dist/traits/simulation-solver-factory.cjs +13 -0
  330. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  331. package/dist/traits/simulation-solver-factory.js +4 -0
  332. package/dist/traits/webcam-gaze.cjs +35 -0
  333. package/dist/traits/webcam-gaze.d.ts +17 -0
  334. package/dist/traits/webcam-gaze.js +4 -0
  335. package/dist/type-checker.cjs +19 -0
  336. package/dist/type-checker.js +6 -0
  337. package/dist/world/index.cjs +947 -0
  338. package/dist/world/index.d.ts +147 -0
  339. package/dist/world/index.js +939 -0
  340. package/dist/world-model/index.cjs +1446 -0
  341. package/dist/world-model/index.d.ts +119 -0
  342. package/dist/world-model/index.js +1414 -0
  343. package/dist/wot/index.cjs +29 -0
  344. package/dist/wot/index.js +4 -0
  345. package/package.json +93 -49
@@ -0,0 +1,421 @@
1
+ import { HoloScriptRuntime } from './chunk-3NFFOWGG.js';
2
+ import { HoloScriptCodeParser } from './chunk-URG2SJLK.js';
3
+
4
+ // src/HoloScriptDebugger.ts
5
+ var HoloScriptDebugger = class {
6
+ constructor(runtime) {
7
+ this.breakpoints = /* @__PURE__ */ new Map();
8
+ this.callStack = [];
9
+ this.currentAST = [];
10
+ this.currentNodeIndex = 0;
11
+ this.frameIdCounter = 0;
12
+ this.breakpointIdCounter = 0;
13
+ this.eventHandlers = /* @__PURE__ */ new Map();
14
+ this.state = {
15
+ status: "stopped",
16
+ currentLine: 0,
17
+ currentColumn: 0,
18
+ currentNode: null,
19
+ callStack: [],
20
+ breakpoints: []
21
+ };
22
+ this.runtime = runtime || new HoloScriptRuntime();
23
+ this.parser = new HoloScriptCodeParser();
24
+ }
25
+ /**
26
+ * Load source code for debugging
27
+ */
28
+ loadSource(code, file) {
29
+ const parseResult = this.parser.parse(code);
30
+ if (!parseResult.success) {
31
+ return {
32
+ success: false,
33
+ errors: parseResult.errors.map((e) => `Line ${e.line}: ${e.message}`)
34
+ };
35
+ }
36
+ this.currentAST = parseResult.ast;
37
+ this.currentNodeIndex = 0;
38
+ this.state.status = "stopped";
39
+ this.callStack = [];
40
+ if (file) {
41
+ for (const node of this.currentAST) {
42
+ node.file = file;
43
+ }
44
+ }
45
+ return { success: true };
46
+ }
47
+ /**
48
+ * Set a breakpoint at a line
49
+ */
50
+ setBreakpoint(line, options = {}) {
51
+ const id = `bp_${++this.breakpointIdCounter}`;
52
+ const breakpoint = {
53
+ id,
54
+ line,
55
+ column: options.column,
56
+ condition: options.condition,
57
+ hitCount: 0,
58
+ enabled: options.enabled !== false,
59
+ file: options.file
60
+ };
61
+ this.breakpoints.set(id, breakpoint);
62
+ this.updateBreakpointList();
63
+ return breakpoint;
64
+ }
65
+ /**
66
+ * Remove a breakpoint by ID
67
+ */
68
+ removeBreakpoint(id) {
69
+ const removed = this.breakpoints.delete(id);
70
+ if (removed) {
71
+ this.updateBreakpointList();
72
+ }
73
+ return removed;
74
+ }
75
+ /**
76
+ * Remove all breakpoints at a line
77
+ */
78
+ removeBreakpointsAtLine(line) {
79
+ let removed = 0;
80
+ for (const [id, bp] of this.breakpoints) {
81
+ if (bp.line === line) {
82
+ this.breakpoints.delete(id);
83
+ removed++;
84
+ }
85
+ }
86
+ if (removed > 0) {
87
+ this.updateBreakpointList();
88
+ }
89
+ return removed;
90
+ }
91
+ /**
92
+ * Toggle breakpoint enabled state
93
+ */
94
+ toggleBreakpoint(id) {
95
+ const bp = this.breakpoints.get(id);
96
+ if (bp) {
97
+ bp.enabled = !bp.enabled;
98
+ this.updateBreakpointList();
99
+ return bp.enabled;
100
+ }
101
+ return false;
102
+ }
103
+ /**
104
+ * Get all breakpoints
105
+ */
106
+ getBreakpoints() {
107
+ return Array.from(this.breakpoints.values());
108
+ }
109
+ /**
110
+ * Clear all breakpoints
111
+ */
112
+ clearBreakpoints() {
113
+ this.breakpoints.clear();
114
+ this.updateBreakpointList();
115
+ }
116
+ /**
117
+ * Start debugging from the beginning
118
+ */
119
+ async start() {
120
+ this.currentNodeIndex = 0;
121
+ this.callStack = [];
122
+ this.frameIdCounter = 0;
123
+ this.runtime.reset();
124
+ this.state.status = "running";
125
+ await this.runUntilBreakpoint();
126
+ }
127
+ /**
128
+ * Continue execution until next breakpoint or end
129
+ */
130
+ async continue() {
131
+ if (this.state.status !== "paused") return;
132
+ this.state.status = "running";
133
+ this.currentNodeIndex++;
134
+ await this.runUntilBreakpoint();
135
+ }
136
+ /**
137
+ * Step into the next node
138
+ */
139
+ async stepInto() {
140
+ if (this.state.status !== "paused") return;
141
+ this.state.status = "stepping";
142
+ await this.executeStep("into");
143
+ }
144
+ /**
145
+ * Step over the current node
146
+ */
147
+ async stepOver() {
148
+ if (this.state.status !== "paused") return;
149
+ this.state.status = "stepping";
150
+ await this.executeStep("over");
151
+ }
152
+ /**
153
+ * Step out of the current function
154
+ */
155
+ async stepOut() {
156
+ if (this.state.status !== "paused") return;
157
+ this.state.status = "stepping";
158
+ await this.executeStep("out");
159
+ }
160
+ /**
161
+ * Stop debugging
162
+ */
163
+ stop() {
164
+ this.state.status = "stopped";
165
+ this.callStack = [];
166
+ this.currentNodeIndex = 0;
167
+ this.emitEvent({ type: "state-change", data: { status: "stopped" } });
168
+ }
169
+ /**
170
+ * Pause execution
171
+ */
172
+ pause() {
173
+ if (this.state.status === "running") {
174
+ this.state.status = "paused";
175
+ this.emitEvent({ type: "state-change", data: { status: "paused" } });
176
+ }
177
+ }
178
+ /**
179
+ * Get current debug state
180
+ */
181
+ getState() {
182
+ return { ...this.state };
183
+ }
184
+ /**
185
+ * Get call stack
186
+ */
187
+ getCallStack() {
188
+ return [...this.callStack];
189
+ }
190
+ /**
191
+ * Get variables at a specific stack frame
192
+ */
193
+ getVariables(frameId) {
194
+ if (frameId !== void 0) {
195
+ const frame = this.callStack.find((f) => f.id === frameId);
196
+ return frame?.variables || /* @__PURE__ */ new Map();
197
+ }
198
+ return new Map(this.runtime.getContext().variables);
199
+ }
200
+ /**
201
+ * Evaluate an expression in the current context
202
+ */
203
+ async evaluate(expression) {
204
+ try {
205
+ const varValue = this.runtime.getVariable(expression);
206
+ if (varValue !== void 0) {
207
+ return { value: varValue };
208
+ }
209
+ const parseResult = this.parser.parse(expression);
210
+ if (!parseResult.success) {
211
+ return { value: void 0, error: parseResult.errors[0]?.message };
212
+ }
213
+ const results = await this.runtime.executeProgram(parseResult.ast);
214
+ const lastResult = results[results.length - 1];
215
+ return { value: lastResult?.output };
216
+ } catch (error) {
217
+ return { value: void 0, error: String(error) };
218
+ }
219
+ }
220
+ /**
221
+ * Set a watch expression
222
+ */
223
+ watch(expression) {
224
+ const id = `watch_${Date.now()}`;
225
+ return { id, expression };
226
+ }
227
+ /**
228
+ * Register an event handler
229
+ */
230
+ on(event, handler) {
231
+ if (!this.eventHandlers.has(event)) {
232
+ this.eventHandlers.set(event, []);
233
+ }
234
+ this.eventHandlers.get(event).push(handler);
235
+ }
236
+ /**
237
+ * Remove an event handler
238
+ */
239
+ off(event, handler) {
240
+ const handlers = this.eventHandlers.get(event);
241
+ if (handlers) {
242
+ const index = handlers.indexOf(handler);
243
+ if (index !== -1) {
244
+ handlers.splice(index, 1);
245
+ }
246
+ }
247
+ }
248
+ /**
249
+ * Get the underlying runtime
250
+ */
251
+ getRuntime() {
252
+ return this.runtime;
253
+ }
254
+ // Private methods
255
+ async runUntilBreakpoint() {
256
+ while (this.currentNodeIndex < this.currentAST.length) {
257
+ if (this.state.status === "stopped") break;
258
+ const node = this.currentAST[this.currentNodeIndex];
259
+ if (this.shouldBreakAt(node)) {
260
+ this.state.status = "paused";
261
+ this.updateCurrentState(node);
262
+ const bp = this.findBreakpointAtLine(node.line ?? 0);
263
+ if (bp) {
264
+ bp.hitCount++;
265
+ this.emitEvent({
266
+ type: "breakpoint-hit",
267
+ data: { breakpoint: bp, node, line: node.line ?? 0 }
268
+ });
269
+ }
270
+ return;
271
+ }
272
+ await this.executeNode(node);
273
+ this.currentNodeIndex++;
274
+ }
275
+ this.state.status = "stopped";
276
+ this.emitEvent({ type: "state-change", data: { status: "stopped", reason: "complete" } });
277
+ }
278
+ async executeStep(mode) {
279
+ const startStackDepth = this.callStack.length;
280
+ if (this.currentNodeIndex >= this.currentAST.length) {
281
+ this.state.status = "stopped";
282
+ return;
283
+ }
284
+ const node = this.currentAST[this.currentNodeIndex];
285
+ switch (mode) {
286
+ case "into":
287
+ await this.executeNode(node);
288
+ this.currentNodeIndex++;
289
+ break;
290
+ case "over":
291
+ await this.executeNode(node);
292
+ this.currentNodeIndex++;
293
+ break;
294
+ case "out":
295
+ while (this.currentNodeIndex < this.currentAST.length) {
296
+ await this.executeNode(this.currentAST[this.currentNodeIndex]);
297
+ this.currentNodeIndex++;
298
+ if (this.callStack.length < startStackDepth) {
299
+ break;
300
+ }
301
+ }
302
+ break;
303
+ }
304
+ if (this.currentNodeIndex < this.currentAST.length) {
305
+ this.state.status = "paused";
306
+ this.updateCurrentState(this.currentAST[this.currentNodeIndex]);
307
+ this.emitEvent({
308
+ type: "step-complete",
309
+ data: { mode, node: this.currentAST[this.currentNodeIndex] }
310
+ });
311
+ } else {
312
+ this.state.status = "stopped";
313
+ this.emitEvent({ type: "state-change", data: { status: "stopped", reason: "complete" } });
314
+ }
315
+ }
316
+ async executeNode(node) {
317
+ if (node.type === "function") {
318
+ const funcNode = node;
319
+ this.pushStackFrame(funcNode.name, node);
320
+ }
321
+ try {
322
+ const result = await this.runtime.executeNode(node);
323
+ if (!result.success && result.error) {
324
+ this.emitEvent({
325
+ type: "exception",
326
+ data: { error: result.error, node, line: node.line }
327
+ });
328
+ }
329
+ if (result.output !== void 0) {
330
+ this.emitEvent({
331
+ type: "output",
332
+ data: { output: result.output, node }
333
+ });
334
+ }
335
+ } catch (error) {
336
+ this.emitEvent({
337
+ type: "exception",
338
+ data: { error: String(error), node, line: node.line }
339
+ });
340
+ }
341
+ if (node.type === "function") {
342
+ this.popStackFrame();
343
+ }
344
+ }
345
+ shouldBreakAt(node) {
346
+ const line = node.line;
347
+ for (const bp of this.breakpoints.values()) {
348
+ if (!bp.enabled) continue;
349
+ if (bp.line !== line) continue;
350
+ if (bp.condition) {
351
+ try {
352
+ const value = this.runtime.getVariable(bp.condition);
353
+ if (!value) continue;
354
+ } catch {
355
+ continue;
356
+ }
357
+ }
358
+ return true;
359
+ }
360
+ return false;
361
+ }
362
+ findBreakpointAtLine(line) {
363
+ for (const bp of this.breakpoints.values()) {
364
+ if (bp.line === line && bp.enabled) {
365
+ return bp;
366
+ }
367
+ }
368
+ return null;
369
+ }
370
+ pushStackFrame(name, node) {
371
+ const frame = {
372
+ id: ++this.frameIdCounter,
373
+ name,
374
+ file: node.file,
375
+ line: node.line ?? 0,
376
+ column: node.column ?? 0,
377
+ variables: new Map(this.runtime.getContext().variables),
378
+ node
379
+ };
380
+ this.callStack.push(frame);
381
+ this.state.callStack = [...this.callStack];
382
+ }
383
+ popStackFrame() {
384
+ const frame = this.callStack.pop();
385
+ this.state.callStack = [...this.callStack];
386
+ return frame;
387
+ }
388
+ updateCurrentState(node) {
389
+ this.state.currentLine = node.line ?? 0;
390
+ this.state.currentColumn = node.column ?? 0;
391
+ this.state.currentNode = node;
392
+ }
393
+ updateBreakpointList() {
394
+ this.state.breakpoints = Array.from(this.breakpoints.values());
395
+ }
396
+ emitEvent(event) {
397
+ const handlers = this.eventHandlers.get(event.type) || [];
398
+ for (const handler of handlers) {
399
+ try {
400
+ handler(event);
401
+ } catch (error) {
402
+ console.error("Debug event handler error:", error);
403
+ }
404
+ }
405
+ const allHandlers = this.eventHandlers.get("all") || [];
406
+ for (const handler of allHandlers) {
407
+ try {
408
+ handler(event);
409
+ } catch (error) {
410
+ console.error("Debug event handler error:", error);
411
+ }
412
+ }
413
+ }
414
+ };
415
+ function createDebugger(runtime) {
416
+ return new HoloScriptDebugger(runtime);
417
+ }
418
+
419
+ export { HoloScriptDebugger, createDebugger };
420
+ //# sourceMappingURL=chunk-NV4VMVXU.js.map
421
+ //# sourceMappingURL=chunk-NV4VMVXU.js.map
@@ -0,0 +1,215 @@
1
+ // src/testing/DeterminismHarness.ts
2
+ function getGlobal() {
3
+ return globalThis ?? {};
4
+ }
5
+ function detectRuntime() {
6
+ const g = getGlobal();
7
+ if (typeof g.window !== "undefined" && typeof g.document !== "undefined") {
8
+ return "browser";
9
+ }
10
+ if (typeof g.process !== "undefined" && g.process.versions?.node) {
11
+ return "node";
12
+ }
13
+ return "unknown";
14
+ }
15
+ function detectBrowserFromUserAgent(ua) {
16
+ if (!ua) return {};
17
+ let browser;
18
+ let os;
19
+ if (/Firefox\//.test(ua)) browser = "firefox";
20
+ else if (/Edg\//.test(ua)) browser = "edge";
21
+ else if (/Chrome\//.test(ua)) browser = "chromium";
22
+ else if (/Safari\//.test(ua)) browser = "safari";
23
+ if (/Windows NT/.test(ua)) os = "windows";
24
+ else if (/Mac OS X/.test(ua)) os = "macos";
25
+ else if (/Linux/.test(ua)) os = "linux";
26
+ else if (/Android/.test(ua)) os = "android";
27
+ else if (/iPhone|iPad/.test(ua)) os = "ios";
28
+ return { browser, os };
29
+ }
30
+ async function captureEnvironment(annotations = {}) {
31
+ const runtime = detectRuntime();
32
+ const g = getGlobal();
33
+ const info = { runtime };
34
+ if (Object.keys(annotations).length > 0) info.annotations = { ...annotations };
35
+ if (runtime === "browser") {
36
+ const nav = g.navigator;
37
+ const ua = nav?.userAgent;
38
+ info.browser = { userAgent: ua, ...detectBrowserFromUserAgent(ua) };
39
+ if (nav?.gpu?.requestAdapter) {
40
+ try {
41
+ const adapter = await nav.gpu.requestAdapter();
42
+ let gpuInfo = adapter?.info;
43
+ if (!gpuInfo && adapter?.requestAdapterInfo) {
44
+ gpuInfo = await adapter.requestAdapterInfo();
45
+ }
46
+ if (gpuInfo) {
47
+ info.gpu = {
48
+ vendor: gpuInfo.vendor,
49
+ architecture: gpuInfo.architecture,
50
+ device: gpuInfo.device,
51
+ description: gpuInfo.description,
52
+ backend: "webgpu"
53
+ };
54
+ }
55
+ } catch {
56
+ }
57
+ }
58
+ } else if (runtime === "node") {
59
+ const proc = g.process;
60
+ if (proc) {
61
+ info.node = {
62
+ version: proc.versions?.node ?? "unknown",
63
+ arch: proc.arch ?? "unknown",
64
+ platform: proc.platform ?? "unknown"
65
+ };
66
+ }
67
+ }
68
+ return info;
69
+ }
70
+ function toUint8Array(input) {
71
+ if (input instanceof Uint8Array) return input;
72
+ if (typeof TextEncoder !== "undefined") {
73
+ return new TextEncoder().encode(input);
74
+ }
75
+ const bytes = new Uint8Array(input.length);
76
+ for (let i = 0; i < input.length; i++) bytes[i] = input.charCodeAt(i) & 255;
77
+ return bytes;
78
+ }
79
+ function fnv1a64Hex(bytes) {
80
+ let hash = 0xcbf29ce484222325n;
81
+ const prime = 0x100000001b3n;
82
+ const mask = 0xffffffffffffffffn;
83
+ for (let i = 0; i < bytes.length; i++) {
84
+ hash = (hash ^ BigInt(bytes[i])) & mask;
85
+ hash = hash * prime & mask;
86
+ }
87
+ return hash.toString(16).padStart(16, "0");
88
+ }
89
+ async function hashBytes(input, algo = "sha256") {
90
+ const bytes = toUint8Array(input);
91
+ if (algo === "sha256") {
92
+ const g = getGlobal();
93
+ const subtle = g.crypto?.subtle;
94
+ if (subtle && typeof subtle.digest === "function") {
95
+ try {
96
+ const digest = await subtle.digest("SHA-256", bytes);
97
+ const view = new Uint8Array(digest);
98
+ let hex = "";
99
+ for (let i = 0; i < view.length; i++) hex += view[i].toString(16).padStart(2, "0");
100
+ return `sha256:${hex}`;
101
+ } catch {
102
+ }
103
+ }
104
+ }
105
+ return `fnv1a-64:${fnv1a64Hex(bytes)}`;
106
+ }
107
+ var DeterminismHarness = class {
108
+ constructor(options = {}) {
109
+ this.options = {
110
+ captureOutput: options.captureOutput ?? false,
111
+ hashAlgorithm: options.hashAlgorithm ?? "sha256",
112
+ annotations: options.annotations ?? {}
113
+ };
114
+ }
115
+ /**
116
+ * Run a probe function, capture environment, hash the output,
117
+ * return a structured ProbeResult. Never throws — errors are
118
+ * caught and reported on the result's `error` field with a
119
+ * sentinel outputHash of `error:<message>`.
120
+ */
121
+ async probe(name, fn, annotations = {}) {
122
+ const timestamp = Date.now();
123
+ const mergedAnnotations = { ...this.options.annotations, ...annotations };
124
+ const environment = await captureEnvironment(mergedAnnotations);
125
+ const started = typeof performance !== "undefined" ? performance.now() : timestamp;
126
+ let output;
127
+ let error;
128
+ try {
129
+ output = await fn();
130
+ } catch (err) {
131
+ error = err instanceof Error ? err.message : String(err);
132
+ }
133
+ const ended = typeof performance !== "undefined" ? performance.now() : Date.now();
134
+ const durationMs = Math.max(0, ended - started);
135
+ if (error !== void 0 || output === void 0) {
136
+ return {
137
+ name,
138
+ timestamp,
139
+ environment,
140
+ durationMs,
141
+ outputHash: `error:${error ?? "no-output"}`,
142
+ outputSize: 0,
143
+ error
144
+ };
145
+ }
146
+ const outputHash = await hashBytes(output, this.options.hashAlgorithm);
147
+ const outputSize = output instanceof Uint8Array ? output.byteLength : toUint8Array(output).byteLength;
148
+ const result = {
149
+ name,
150
+ timestamp,
151
+ environment,
152
+ durationMs,
153
+ outputHash,
154
+ outputSize
155
+ };
156
+ if (this.options.captureOutput) result.output = output;
157
+ return result;
158
+ }
159
+ /**
160
+ * Compare a collection of probe results and report whether they
161
+ * agree. Groups results by hash so the caller can see which
162
+ * environments produced which outputs.
163
+ */
164
+ static compareResults(results) {
165
+ if (results.length === 0) {
166
+ return {
167
+ probeName: "(empty)",
168
+ totalResults: 0,
169
+ uniqueHashes: 0,
170
+ divergent: false,
171
+ groups: [],
172
+ summary: "No results supplied to compare."
173
+ };
174
+ }
175
+ const probeName = results[0].name;
176
+ const byHash = /* @__PURE__ */ new Map();
177
+ for (const r of results) {
178
+ const existing = byHash.get(r.outputHash);
179
+ if (existing) existing.push(r);
180
+ else byHash.set(r.outputHash, [r]);
181
+ }
182
+ const groups = Array.from(byHash.entries()).map(([hash, rs]) => ({
183
+ hash,
184
+ results: rs,
185
+ environments: rs.map((r) => describeEnvironment(r.environment))
186
+ }));
187
+ const divergent = groups.length > 1;
188
+ const summary = divergent ? `DIVERGENT: ${groups.length} distinct hashes across ${results.length} runs of "${probeName}".` : `CONVERGENT: all ${results.length} runs of "${probeName}" produced hash ${groups[0].hash}.`;
189
+ return {
190
+ probeName,
191
+ totalResults: results.length,
192
+ uniqueHashes: groups.length,
193
+ divergent,
194
+ groups,
195
+ summary
196
+ };
197
+ }
198
+ };
199
+ function describeEnvironment(env) {
200
+ const parts = [env.runtime];
201
+ if (env.browser?.browser) parts.push(env.browser.browser);
202
+ if (env.browser?.os) parts.push(env.browser.os);
203
+ if (env.node) parts.push(`node ${env.node.version} ${env.node.platform}/${env.node.arch}`);
204
+ if (env.gpu?.vendor) parts.push(`gpu:${env.gpu.vendor}${env.gpu.architecture ? "/" + env.gpu.architecture : ""}`);
205
+ if (env.annotations) {
206
+ for (const [k, v] of Object.entries(env.annotations)) {
207
+ parts.push(`${k}=${v}`);
208
+ }
209
+ }
210
+ return parts.join(" | ");
211
+ }
212
+
213
+ export { DeterminismHarness, captureEnvironment, describeEnvironment, hashBytes };
214
+ //# sourceMappingURL=chunk-NW5G5FBQ.js.map
215
+ //# sourceMappingURL=chunk-NW5G5FBQ.js.map