@holoscript/core 7.0.0 → 8.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (350) hide show
  1. package/README.md +4 -4
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-N6B6PJ6G.cjs +38 -0
  4. package/dist/GLTFPipeline-P3WMNYCN.js +17 -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-CBYJX3LZ.js +10 -0
  10. package/dist/HoloScriptRuntime-VJ374RER.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-2BSMSUCE.js +1941 -0
  17. package/dist/chunk-2IWC4FP7.cjs +1189 -0
  18. package/dist/chunk-2M2DPHKB.js +762 -0
  19. package/dist/chunk-2X7NGX3M.js +2426 -0
  20. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  21. package/dist/chunk-3FOKASKO.cjs +348 -0
  22. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  23. package/dist/chunk-4C57PR42.js +468 -0
  24. package/dist/chunk-4GU5GCIY.js +1384 -0
  25. package/dist/chunk-4N4SXXWF.js +769 -0
  26. package/dist/chunk-4PDEPEQW.cjs +41 -0
  27. package/dist/chunk-4R6SBXDB.js +45 -0
  28. package/dist/chunk-4SDKXQ4C.js +811 -0
  29. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  30. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  31. package/dist/chunk-5GLCTO44.js +161 -0
  32. package/dist/chunk-5H2G27PK.cjs +627 -0
  33. package/dist/chunk-5JEU52DW.js +382 -0
  34. package/dist/chunk-5NWINHR5.cjs +689 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  38. package/dist/chunk-6EX3I5P4.cjs +130 -0
  39. package/dist/chunk-6Q7RC2MK.cjs +1418 -0
  40. package/dist/chunk-7H33U5SM.cjs +413 -0
  41. package/dist/chunk-7M3PNU2M.cjs +672 -0
  42. package/dist/chunk-7T25IEZ2.js +449 -0
  43. package/dist/chunk-7V4JI5TB.cjs +6947 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-ADADVMXY.js +404 -0
  46. package/dist/chunk-AIA52I7T.cjs +543 -0
  47. package/dist/chunk-ALC6K7GL.cjs +4402 -0
  48. package/dist/chunk-ANXZFVY2.js +113 -0
  49. package/dist/chunk-AOVGZ25K.cjs +56583 -0
  50. package/dist/chunk-AVJHHUC5.cjs +718 -0
  51. package/dist/chunk-BGY3SDG3.js +4396 -0
  52. package/dist/chunk-BOVPWH4H.js +3857 -0
  53. package/dist/chunk-BRQJKJGT.cjs +20 -0
  54. package/dist/chunk-C37BHB7N.cjs +636 -0
  55. package/dist/chunk-CBJY23VL.js +126 -0
  56. package/dist/chunk-CCATWPXM.js +778 -0
  57. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  58. package/dist/chunk-CMT5NMMS.js +669 -0
  59. package/dist/chunk-CR4FMIWL.cjs +1049 -0
  60. package/dist/chunk-CR7XRXRN.cjs +639 -0
  61. package/dist/chunk-CSD27UNQ.js +2176 -0
  62. package/dist/chunk-D3STJ56J.js +714 -0
  63. package/dist/chunk-DAJXW4KX.js +725 -0
  64. package/dist/chunk-DHO2YRIM.js +756 -0
  65. package/dist/chunk-DTGBOSEM.cjs +319 -0
  66. package/dist/chunk-E6XXE66V.js +2252 -0
  67. package/dist/chunk-E7JP3BS3.cjs +61 -0
  68. package/dist/chunk-EKBKLK7P.js +1169 -0
  69. package/dist/chunk-EKYL4PE3.cjs +404 -0
  70. package/dist/chunk-EXKSFGSX.cjs +274 -0
  71. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  72. package/dist/chunk-FDSGHPAK.js +130 -0
  73. package/dist/chunk-FEWUHQNM.cjs +144 -0
  74. package/dist/chunk-FFAOS5HQ.js +70 -0
  75. package/dist/chunk-FGGJQRLZ.js +270 -0
  76. package/dist/chunk-FHP6LXJS.js +415 -0
  77. package/dist/chunk-FJPADH77.cjs +666 -0
  78. package/dist/chunk-FL33V6U7.js +421 -0
  79. package/dist/chunk-FYSPZT4V.cjs +169 -0
  80. package/dist/chunk-GIOYPNTH.js +5575 -0
  81. package/dist/chunk-GJNCFRJU.cjs +125 -0
  82. package/dist/chunk-GMP623FG.cjs +1508 -0
  83. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  84. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  85. package/dist/chunk-GYZE55MO.js +2007 -0
  86. package/dist/chunk-GZG4KA4E.js +529 -0
  87. package/dist/chunk-H652NHX5.js +600 -0
  88. package/dist/chunk-HCCQLAA4.cjs +74 -0
  89. package/dist/chunk-HKEXJUWS.cjs +4007 -0
  90. package/dist/chunk-HNDK4IQU.cjs +5737 -0
  91. package/dist/chunk-HR2OSYVQ.js +56165 -0
  92. package/dist/chunk-HYNTS5CP.js +422 -0
  93. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  94. package/dist/chunk-ILRBGFVD.cjs +72 -0
  95. package/dist/chunk-IUDGEUDO.cjs +1409 -0
  96. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  97. package/dist/chunk-IVY74O6C.js +247 -0
  98. package/dist/chunk-IWC5DM2M.cjs +611 -0
  99. package/dist/chunk-J32ZJZJH.js +554 -0
  100. package/dist/chunk-J52VSAQ7.js +6884 -0
  101. package/dist/chunk-J6M4FPK5.js +421 -0
  102. package/dist/chunk-J7XZV333.js +844 -0
  103. package/dist/chunk-JBNDTXXV.cjs +2433 -0
  104. package/dist/chunk-JC5YBPSF.cjs +984 -0
  105. package/dist/chunk-JD7CIZ33.js +1949 -0
  106. package/dist/chunk-JIBL5LRK.js +4287 -0
  107. package/dist/chunk-JIYN45TV.cjs +2525 -0
  108. package/dist/chunk-K574J76X.cjs +457 -0
  109. package/dist/chunk-KHDZJE5D.cjs +2196 -0
  110. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  111. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  112. package/dist/chunk-KPJL34Y7.cjs +186 -0
  113. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  114. package/dist/chunk-L5LKKENW.cjs +424 -0
  115. package/dist/chunk-LHAXPADA.js +882 -0
  116. package/dist/chunk-LM2VU56C.cjs +37 -0
  117. package/dist/chunk-M56JSP4A.js +400 -0
  118. package/dist/chunk-MBOOR7X4.js +18 -0
  119. package/dist/chunk-MQWAT42R.cjs +4310 -0
  120. package/dist/chunk-MXFUTKCO.js +56 -0
  121. package/dist/chunk-MYY4PMWX.cjs +264 -0
  122. package/dist/chunk-N75IH2HY.js +258 -0
  123. package/dist/chunk-NCWCUZNS.cjs +72 -0
  124. package/dist/chunk-NG77ATEW.cjs +778 -0
  125. package/dist/chunk-NW5G5FBQ.js +215 -0
  126. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  127. package/dist/chunk-OH2FAIVU.js +608 -0
  128. package/dist/chunk-OIQYIIO3.cjs +473 -0
  129. package/dist/chunk-OL46QLBJ.js +61 -0
  130. package/dist/chunk-OMXII44L.js +5386 -0
  131. package/dist/chunk-OSYNRVOV.cjs +243 -0
  132. package/dist/chunk-PGANYCAG.cjs +220 -0
  133. package/dist/chunk-PHENW4MQ.js +65 -0
  134. package/dist/chunk-PY37LNDP.js +686 -0
  135. package/dist/chunk-Q56TT7IL.js +483 -0
  136. package/dist/chunk-QD32ADK6.js +1046 -0
  137. package/dist/chunk-QPOQ7VPI.js +1491 -0
  138. package/dist/chunk-QPSKHBJP.js +5963 -0
  139. package/dist/chunk-QXH7QDSZ.js +1989 -0
  140. package/dist/chunk-R24NNAEG.js +1399 -0
  141. package/dist/chunk-R75BSDH7.cjs +50 -0
  142. package/dist/chunk-RARB3MBR.js +207 -0
  143. package/dist/chunk-ROHLEP2W.cjs +847 -0
  144. package/dist/chunk-S3MDHNKB.cjs +490 -0
  145. package/dist/chunk-S6YWHCKV.cjs +410 -0
  146. package/dist/chunk-SIEXCILW.js +229 -0
  147. package/dist/chunk-SLU6UPJI.cjs +410 -0
  148. package/dist/chunk-SMIWS6DE.cjs +212 -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-TWUXUCEW.cjs +781 -0
  156. package/dist/chunk-U44IKGG7.cjs +5390 -0
  157. package/dist/chunk-UFZZ7TSN.cjs +886 -0
  158. package/dist/chunk-UJXISJBN.js +487 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-UWJHCOH2.js +623 -0
  162. package/dist/chunk-V6MKC2FZ.js +979 -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-WKX5AMOY.js +309 -0
  168. package/dist/chunk-WNNE3PO3.js +34 -0
  169. package/dist/chunk-WRKUDAZJ.js +3038 -0
  170. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  171. package/dist/chunk-WRNEH5MO.js +3169 -0
  172. package/dist/chunk-WRWEX5ZF.js +658 -0
  173. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  174. package/dist/chunk-X3UVCWNL.cjs +2257 -0
  175. package/dist/chunk-XB274MW5.cjs +814 -0
  176. package/dist/chunk-XHIV6326.cjs +793 -0
  177. package/dist/chunk-XIVIE43A.cjs +729 -0
  178. package/dist/chunk-XJAN7CZG.cjs +432 -0
  179. package/dist/chunk-XKTPFXGA.js +164 -0
  180. package/dist/chunk-XL6INWKT.js +121 -0
  181. package/dist/chunk-XSFNHP2E.js +632 -0
  182. package/dist/chunk-XT6JY5W5.js +9684 -0
  183. package/dist/chunk-XUILI4KB.cjs +430 -0
  184. package/dist/chunk-YF2I3MV3.js +46 -0
  185. package/dist/chunk-YIMN575O.js +4847 -0
  186. package/dist/chunk-YIVFJNYV.js +176 -0
  187. package/dist/chunk-YKGPCZEE.cjs +237 -0
  188. package/dist/chunk-YN2YWTXW.js +5731 -0
  189. package/dist/chunk-YN6V7R3L.cjs +327 -0
  190. package/dist/chunk-YQELFNJV.js +39 -0
  191. package/dist/chunk-YVD3CSO3.js +1183 -0
  192. package/dist/chunk-YVOAF4ML.js +623 -0
  193. package/dist/chunk-YWOBW2PV.cjs +759 -0
  194. package/dist/chunk-YYXH45E2.js +426 -0
  195. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  196. package/dist/chunk-ZU7NIRT6.js +325 -0
  197. package/dist/chunk-ZZ7RO2UQ.js +1243 -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 +609 -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 +5408 -0
  230. package/dist/compiler/index.d.ts +334 -21
  231. package/dist/compiler/index.js +5069 -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.d.ts +69 -0
  241. package/dist/compiler/nodetoy.js +4 -0
  242. package/dist/compiler/openxr.cjs +19 -0
  243. package/dist/compiler/openxr.js +13 -0
  244. package/dist/compiler/playcanvas.cjs +19 -0
  245. package/dist/compiler/playcanvas.js +13 -0
  246. package/dist/compiler/r3f.cjs +39 -0
  247. package/dist/compiler/r3f.d.ts +22 -0
  248. package/dist/compiler/r3f.js +17 -0
  249. package/dist/compiler/remotion.cjs +23 -0
  250. package/dist/compiler/remotion.js +4 -0
  251. package/dist/compiler/reproducibility.cjs +39 -0
  252. package/dist/compiler/reproducibility.js +4 -0
  253. package/dist/compiler/sdf.cjs +24 -0
  254. package/dist/compiler/sdf.js +12 -0
  255. package/dist/compiler/semantic-scene.cjs +31 -0
  256. package/dist/compiler/semantic-scene.js +4 -0
  257. package/dist/compiler/state.cjs +21 -0
  258. package/dist/compiler/state.js +11 -0
  259. package/dist/compiler/trait-composition.cjs +30 -0
  260. package/dist/compiler/trait-composition.js +9 -0
  261. package/dist/compiler/unity.cjs +19 -0
  262. package/dist/compiler/unity.js +13 -0
  263. package/dist/compiler/unreal.cjs +23 -0
  264. package/dist/compiler/unreal.js +13 -0
  265. package/dist/compiler/urdf.cjs +52 -0
  266. package/dist/compiler/urdf.js +12 -0
  267. package/dist/compiler/usd-physics.cjs +26 -0
  268. package/dist/compiler/usd-physics.js +9 -0
  269. package/dist/compiler/visionos.cjs +19 -0
  270. package/dist/compiler/visionos.js +13 -0
  271. package/dist/compiler/vrchat.cjs +22 -0
  272. package/dist/compiler/vrchat.js +12 -0
  273. package/dist/compiler/vrr.cjs +24 -0
  274. package/dist/compiler/vrr.js +12 -0
  275. package/dist/compiler/wasm.cjs +36 -0
  276. package/dist/compiler/wasm.js +12 -0
  277. package/dist/compiler/webgpu.cjs +18 -0
  278. package/dist/compiler/webgpu.js +12 -0
  279. package/dist/coordinators/index.cjs +1266 -0
  280. package/dist/coordinators/index.d.ts +72 -1
  281. package/dist/coordinators/index.js +1259 -0
  282. package/dist/debugger.cjs +24 -0
  283. package/dist/debugger.js +11 -0
  284. package/dist/dist-ACXG6IH5.cjs +3113 -0
  285. package/dist/dist-VD4L6V7Q.js +3076 -0
  286. package/dist/entries/interop.cjs +64 -0
  287. package/dist/entries/interop.js +7 -0
  288. package/dist/entries/scripting.cjs +55 -0
  289. package/dist/entries/scripting.js +10 -0
  290. package/dist/hololand/index.cjs +146 -0
  291. package/dist/hololand/index.d.ts +70 -0
  292. package/dist/hololand/index.js +5 -0
  293. package/dist/index.cjs +44660 -0
  294. package/dist/index.d.ts +978 -21
  295. package/dist/index.js +41422 -0
  296. package/dist/math/tropical-spmv.cjs +45 -0
  297. package/dist/math/tropical-spmv.js +4 -0
  298. package/dist/math/vec3.cjs +57 -0
  299. package/dist/math/vec3.js +4 -0
  300. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  301. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  302. package/dist/paper-0c-spike/index.cjs +150 -0
  303. package/dist/paper-0c-spike/index.js +141 -0
  304. package/dist/parser.cjs +61 -0
  305. package/dist/parser.d.ts +11 -0
  306. package/dist/parser.js +12 -0
  307. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  308. package/dist/playwright-VZPDVUEQ.js +98660 -0
  309. package/dist/reconstruction/index.cjs +153 -0
  310. package/dist/reconstruction/index.d.ts +29 -2
  311. package/dist/reconstruction/index.js +8 -0
  312. package/dist/runtime.cjs +316 -0
  313. package/dist/runtime.d.ts +61 -0
  314. package/dist/runtime.js +31 -0
  315. package/dist/self-improvement/index.cjs +563 -0
  316. package/dist/self-improvement/index.js +545 -0
  317. package/dist/src-4ROC227P.cjs +2094 -0
  318. package/dist/src-HCCCSYP7.js +2073 -0
  319. package/dist/storage/index.cjs +38 -0
  320. package/dist/storage/index.js +5 -0
  321. package/dist/testing.cjs +25 -0
  322. package/dist/testing.d.ts +70 -0
  323. package/dist/testing.js +4 -0
  324. package/dist/traitDocs/traitDocs.cjs +33 -0
  325. package/dist/traitDocs/traitDocs.js +7 -0
  326. package/dist/traits/botanical-lotus.cjs +177 -0
  327. package/dist/traits/botanical-lotus.d.ts +502 -0
  328. package/dist/traits/botanical-lotus.js +7 -0
  329. package/dist/traits/engines/index.cjs +520 -0
  330. package/dist/traits/engines/index.js +380 -0
  331. package/dist/traits/index.cjs +24548 -0
  332. package/dist/traits/index.d.ts +171 -35
  333. package/dist/traits/index.js +21638 -0
  334. package/dist/traits/simulation-solver-factory.cjs +13 -0
  335. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  336. package/dist/traits/simulation-solver-factory.js +4 -0
  337. package/dist/traits/webcam-gaze.cjs +35 -0
  338. package/dist/traits/webcam-gaze.d.ts +17 -0
  339. package/dist/traits/webcam-gaze.js +4 -0
  340. package/dist/type-checker.cjs +19 -0
  341. package/dist/type-checker.js +6 -0
  342. package/dist/world/index.cjs +947 -0
  343. package/dist/world/index.d.ts +147 -0
  344. package/dist/world/index.js +939 -0
  345. package/dist/world-model/index.cjs +1446 -0
  346. package/dist/world-model/index.d.ts +119 -0
  347. package/dist/world-model/index.js +1414 -0
  348. package/dist/wot/index.cjs +29 -0
  349. package/dist/wot/index.js +4 -0
  350. package/package.json +93 -49
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ var chunkCIWWXYHZ_cjs = require('./chunk-CIWWXYHZ.cjs');
4
+
5
+ // src/reconstruction/simulationContractBinding.ts
6
+ function assertHoloMapManifestContract(m) {
7
+ if (m.version !== "1.0.0") {
8
+ throw new Error(`HoloMap manifest version ${m.version} is not v1.0 contract`);
9
+ }
10
+ if (m.simulationContract.kind !== chunkCIWWXYHZ_cjs.HOLOMAP_SIMULATION_CONTRACT_KIND) {
11
+ throw new Error(`Unexpected SimulationContract kind: ${m.simulationContract.kind}`);
12
+ }
13
+ if (!m.simulationContract.replayFingerprint || m.simulationContract.replayFingerprint.length < 8) {
14
+ throw new Error("HoloMap manifest missing replayFingerprint");
15
+ }
16
+ }
17
+
18
+ exports.assertHoloMapManifestContract = assertHoloMapManifestContract;
19
+ //# sourceMappingURL=chunk-BRQJKJGT.cjs.map
20
+ //# sourceMappingURL=chunk-BRQJKJGT.cjs.map
@@ -0,0 +1,636 @@
1
+ 'use strict';
2
+
3
+ var chunkE7JP3BS3_cjs = require('./chunk-E7JP3BS3.cjs');
4
+
5
+ // src/traits/traitConstraints.ts
6
+ var BUILTIN_CONSTRAINTS = [
7
+ // =============================================================================
8
+ // PHYSICS & INTERACTION REQUIREMENTS
9
+ // =============================================================================
10
+ {
11
+ type: "requires",
12
+ source: "physics",
13
+ targets: ["collidable"],
14
+ message: "Physics enabled objects must be collidable."
15
+ },
16
+ {
17
+ type: "requires",
18
+ source: "grabbable",
19
+ targets: ["physics"],
20
+ message: "Grabbable objects require physics to handle movement and collisions."
21
+ },
22
+ {
23
+ type: "requires",
24
+ source: "throwable",
25
+ targets: ["grabbable"],
26
+ message: "Throwable objects must be grabbable first."
27
+ },
28
+ {
29
+ type: "requires",
30
+ source: "stackable",
31
+ targets: ["physics", "collidable"],
32
+ message: "Stackable objects require physics and collision detection."
33
+ },
34
+ {
35
+ type: "requires",
36
+ source: "breakable",
37
+ targets: ["physics", "collidable"],
38
+ message: "Breakable objects require physics and collision to detect impacts."
39
+ },
40
+ {
41
+ type: "requires",
42
+ source: "snappable",
43
+ targets: ["grabbable"],
44
+ message: "Snappable objects must be grabbable to snap to positions."
45
+ },
46
+ // =============================================================================
47
+ // CONFLICT RULES
48
+ // =============================================================================
49
+ {
50
+ type: "conflicts",
51
+ source: "static",
52
+ targets: ["physics", "grabbable", "throwable", "scalable", "rotatable"],
53
+ message: "Static objects cannot have physics or be interactive (grabbable/throwable/scalable/rotatable)."
54
+ },
55
+ {
56
+ type: "conflicts",
57
+ source: "kinematic",
58
+ targets: ["physics"],
59
+ message: "Kinematic objects handle their own motion and conflict with physics simulation."
60
+ },
61
+ {
62
+ type: "conflicts",
63
+ source: "invisible",
64
+ targets: ["hoverable", "pointable"],
65
+ message: "Invisible objects cannot have hover or pointer visual feedback."
66
+ },
67
+ // =============================================================================
68
+ // PLATFORM EXCLUSIVITY
69
+ // =============================================================================
70
+ {
71
+ type: "conflicts",
72
+ source: "vr_only",
73
+ targets: ["ar_only"],
74
+ message: "An object cannot be marked as both VR-only and AR-only."
75
+ },
76
+ {
77
+ type: "conflicts",
78
+ source: "desktop_only",
79
+ targets: ["vr_only", "ar_only"],
80
+ message: "Desktop-only objects cannot also be VR-only or AR-only."
81
+ },
82
+ // =============================================================================
83
+ // MATERIAL & MESH DEPENDENCIES
84
+ // =============================================================================
85
+ {
86
+ type: "requires",
87
+ source: "cloth",
88
+ targets: ["mesh"],
89
+ message: "Cloth physics requires a mesh to deform."
90
+ },
91
+ {
92
+ type: "requires",
93
+ source: "soft_body",
94
+ targets: ["mesh"],
95
+ message: "Soft body physics requires a mesh."
96
+ },
97
+ {
98
+ type: "requires",
99
+ source: "particle_emitter",
100
+ targets: ["visible"],
101
+ message: "Particle emitters must be visible to render particles."
102
+ },
103
+ // =============================================================================
104
+ // AUDIO REQUIREMENTS
105
+ // =============================================================================
106
+ {
107
+ type: "requires",
108
+ source: "spatial_audio",
109
+ targets: ["audio"],
110
+ message: "Spatial audio requires an audio source."
111
+ },
112
+ {
113
+ type: "requires",
114
+ source: "audio_zone",
115
+ targets: ["collidable"],
116
+ message: "Audio zones require collision bounds to detect entry/exit."
117
+ },
118
+ // =============================================================================
119
+ // INTERACTION EXCLUSIVITY (one-of rules)
120
+ // =============================================================================
121
+ {
122
+ type: "oneof",
123
+ source: "interaction_mode",
124
+ targets: ["grabbable", "clickable", "draggable"],
125
+ message: "Objects should have one primary interaction mode to avoid conflicts."
126
+ },
127
+ // =============================================================================
128
+ // ANIMATION REQUIREMENTS
129
+ // =============================================================================
130
+ {
131
+ type: "requires",
132
+ source: "animated",
133
+ targets: ["mesh"],
134
+ message: "Animated trait requires a mesh with animation data."
135
+ },
136
+ // =============================================================================
137
+ // NETWORKING REQUIREMENTS
138
+ // =============================================================================
139
+ {
140
+ type: "requires",
141
+ source: "networked",
142
+ targets: ["physics"],
143
+ message: "Networked objects require physics for state synchronization."
144
+ },
145
+ {
146
+ type: "conflicts",
147
+ source: "local_only",
148
+ targets: ["networked"],
149
+ message: "Local-only objects cannot be networked."
150
+ },
151
+ // =============================================================================
152
+ // UI TRAIT CONSTRAINTS
153
+ // =============================================================================
154
+ {
155
+ type: "conflicts",
156
+ source: "ui_floating",
157
+ targets: ["ui_anchored", "ui_docked"],
158
+ message: "UI panels cannot be both floating and anchored/docked."
159
+ },
160
+ {
161
+ type: "conflicts",
162
+ source: "ui_anchored",
163
+ targets: ["ui_floating", "ui_docked"],
164
+ message: "UI panels cannot be both anchored and floating/docked."
165
+ },
166
+ {
167
+ type: "conflicts",
168
+ source: "ui_hand_menu",
169
+ targets: ["ui_anchored", "ui_docked"],
170
+ message: "Hand menus cannot be anchored to world or docked."
171
+ },
172
+ {
173
+ type: "requires",
174
+ source: "ui_keyboard",
175
+ targets: ["ui_input"],
176
+ message: "Keyboard trait requires an input element to target."
177
+ },
178
+ {
179
+ type: "oneof",
180
+ source: "ui_position_mode",
181
+ targets: ["ui_floating", "ui_anchored", "ui_docked", "ui_hand_menu"],
182
+ message: "UI element can only have one positioning mode."
183
+ },
184
+ // =============================================================================
185
+ // SPATIAL CONSTRAINT TRAIT REQUIREMENTS
186
+ // =============================================================================
187
+ // spatial_adjacent requires collidable bounds for distance measurement
188
+ {
189
+ type: "requires",
190
+ source: "spatial_adjacent",
191
+ targets: ["collidable"],
192
+ message: "spatial_adjacent requires collidable bounds to measure distance between entities.",
193
+ suggestion: "Add @collidable to provide bounds for spatial adjacency checking."
194
+ },
195
+ // spatial_contains requires collidable bounds to define the container volume
196
+ {
197
+ type: "requires",
198
+ source: "spatial_contains",
199
+ targets: ["collidable"],
200
+ message: "spatial_contains requires collidable bounds to define the container volume.",
201
+ suggestion: "Add @collidable to define the bounding volume for containment checking."
202
+ },
203
+ // spatial_reachable requires spatial_awareness for runtime path validation
204
+ {
205
+ type: "requires",
206
+ source: "spatial_reachable",
207
+ targets: ["spatial_awareness"],
208
+ message: "spatial_reachable requires spatial_awareness for runtime path and obstacle detection.",
209
+ suggestion: "Add @spatial_awareness to enable spatial context for reachability checks."
210
+ },
211
+ // spatial_contains conflicts with static (containers may need dynamic bounds)
212
+ {
213
+ type: "conflicts",
214
+ source: "spatial_contains",
215
+ targets: ["invisible"],
216
+ message: "spatial_contains containers cannot be invisible; contained entities need visible boundary reference.",
217
+ suggestion: "Remove @invisible or use @spatial_adjacent instead for invisible reference points."
218
+ },
219
+ // Only one spatial constraint enforcement mode per entity
220
+ {
221
+ type: "oneof",
222
+ source: "spatial_constraint_mode",
223
+ targets: ["spatial_adjacent", "spatial_contains"],
224
+ message: "An entity should declare either spatial_adjacent or spatial_contains, not both. Use spatial_adjacent for proximity or spatial_contains for enclosure.",
225
+ suggestion: 'Choose the most appropriate spatial relationship: @spatial_adjacent for "near" or @spatial_contains for "inside".'
226
+ },
227
+ // =============================================================================
228
+ // SPATIOTEMPORAL CONSTRAINT TRAIT REQUIREMENTS
229
+ // =============================================================================
230
+ // spatial_temporal_adjacent requires collidable for distance measurement
231
+ {
232
+ type: "requires",
233
+ source: "spatial_temporal_adjacent",
234
+ targets: ["collidable"],
235
+ message: "spatial_temporal_adjacent requires collidable bounds to measure distance and track duration.",
236
+ suggestion: "Add @collidable to provide bounds for temporal adjacency checking."
237
+ },
238
+ // spatial_temporal_adjacent conflicts with plain spatial_adjacent on same entity
239
+ {
240
+ type: "conflicts",
241
+ source: "spatial_temporal_adjacent",
242
+ targets: ["spatial_adjacent"],
243
+ message: "spatial_temporal_adjacent supersedes spatial_adjacent. Use one or the other.",
244
+ suggestion: "Remove @spatial_adjacent if duration-based adjacency is desired, or remove @spatial_temporal_adjacent for simple distance checking."
245
+ },
246
+ // spatial_temporal_reachable requires spatial_awareness
247
+ {
248
+ type: "requires",
249
+ source: "spatial_temporal_reachable",
250
+ targets: ["spatial_awareness"],
251
+ message: "spatial_temporal_reachable requires spatial_awareness for velocity tracking and obstacle prediction.",
252
+ suggestion: "Add @spatial_awareness to enable spatial context for velocity-predicted reachability."
253
+ },
254
+ // spatial_temporal_reachable conflicts with plain spatial_reachable
255
+ {
256
+ type: "conflicts",
257
+ source: "spatial_temporal_reachable",
258
+ targets: ["spatial_reachable"],
259
+ message: "spatial_temporal_reachable supersedes spatial_reachable. Use one or the other.",
260
+ suggestion: "Remove @spatial_reachable if velocity-predicted reachability is desired, or remove @spatial_temporal_reachable for static reachability."
261
+ },
262
+ // spatial_trajectory requires physics for velocity/acceleration data
263
+ {
264
+ type: "requires",
265
+ source: "spatial_trajectory",
266
+ targets: ["physics"],
267
+ message: "spatial_trajectory requires physics for velocity and acceleration data to predict trajectories.",
268
+ suggestion: "Add @physics to enable trajectory prediction from velocity data."
269
+ },
270
+ // spatial_trajectory requires collidable for bounds checking
271
+ {
272
+ type: "requires",
273
+ source: "spatial_trajectory",
274
+ targets: ["collidable"],
275
+ message: "spatial_trajectory requires collidable bounds for keep_in/keep_out region checking.",
276
+ suggestion: "Add @collidable to provide bounds for trajectory constraint checking."
277
+ },
278
+ // =============================================================================
279
+ // ROBOTICS / URDF ROBOT MODEL CONSTRAINTS
280
+ // =============================================================================
281
+ {
282
+ type: "conflicts",
283
+ source: "urdf_robot",
284
+ targets: ["cloth", "soft_body", "fluid"],
285
+ message: "URDF robot models use rigid body joints and cannot have cloth, soft body, or fluid physics."
286
+ },
287
+ {
288
+ type: "conflicts",
289
+ source: "urdf_robot",
290
+ targets: ["particle_emitter"],
291
+ message: "URDF robot models define their own visual hierarchy and conflict with particle emitters."
292
+ },
293
+ // =============================================================================
294
+ // CULTURAL PROFILE TRAIT CONSTRAINTS
295
+ // =============================================================================
296
+ // norm_compliant requires cultural_profile — agents must declare cultural identity
297
+ // before they can be subject to norm compliance checking
298
+ {
299
+ type: "requires",
300
+ source: "norm_compliant",
301
+ targets: ["cultural_profile"],
302
+ message: "Norm compliance requires a cultural_profile to define the agent's cultural identity.",
303
+ suggestion: "Add @cultural_profile with cooperation_index, cultural_family, prompt_dialect, and norm_set."
304
+ },
305
+ // cultural_memory requires cultural_profile — cultural memory storage needs
306
+ // a cultural identity context to organize episodic and stigmergic memories
307
+ {
308
+ type: "requires",
309
+ source: "cultural_memory",
310
+ targets: ["cultural_profile"],
311
+ message: "Cultural memory requires a cultural_profile to contextualize memory storage.",
312
+ suggestion: "Add @cultural_profile before using @cultural_memory on an agent."
313
+ },
314
+ // cultural_profile conflicts with isolationist + networked combination
315
+ // (isolationist agents should not be networked — contradicts their nature)
316
+ {
317
+ type: "conflicts",
318
+ source: "cultural_trace",
319
+ targets: ["invisible"],
320
+ message: "Cultural traces (stigmergic markers) must be visible for other agents to perceive them.",
321
+ suggestion: "Remove @invisible from objects bearing @cultural_trace, or use a visible marker."
322
+ },
323
+ // =============================================================================
324
+ // v6 UNIVERSAL SERVICE DOMAIN CONSTRAINTS
325
+ // =============================================================================
326
+ // Endpoint requires service — endpoints belong to a service context
327
+ {
328
+ type: "requires",
329
+ source: "endpoint",
330
+ targets: ["service"],
331
+ message: "Endpoints must belong to a service context.",
332
+ suggestion: "Wrap this endpoint in a service block or add @service trait."
333
+ },
334
+ // Handler requires http or route — handlers need an HTTP binding
335
+ {
336
+ type: "requires",
337
+ source: "handler",
338
+ targets: ["http"],
339
+ message: "Handlers require an HTTP binding to receive requests.",
340
+ suggestion: "Add @http trait with method and path properties."
341
+ },
342
+ // CORS requires http — CORS is HTTP-specific
343
+ {
344
+ type: "requires",
345
+ source: "cors",
346
+ targets: ["http"],
347
+ message: "CORS is an HTTP-specific concern and requires an HTTP binding.",
348
+ suggestion: "Add @http to enable CORS headers on HTTP responses."
349
+ },
350
+ // Rate limit requires http — rate limiting is HTTP-specific
351
+ {
352
+ type: "requires",
353
+ source: "rate_limit",
354
+ targets: ["http"],
355
+ message: "Rate limiting requires HTTP request context.",
356
+ suggestion: "Add @http to enable request-based rate limiting."
357
+ },
358
+ // Auth requires service or http — auth middleware needs service context
359
+ {
360
+ type: "requires",
361
+ source: "auth",
362
+ targets: ["http"],
363
+ message: "Auth middleware requires an HTTP context for token validation.",
364
+ suggestion: "Add @http to enable authentication on HTTP endpoints."
365
+ },
366
+ // Gateway conflicts with proxy — different service patterns
367
+ {
368
+ type: "conflicts",
369
+ source: "gateway",
370
+ targets: ["proxy"],
371
+ message: "Gateway and proxy are mutually exclusive service patterns.",
372
+ suggestion: "Use @gateway for API aggregation or @proxy for transparent forwarding, not both."
373
+ },
374
+ // Load balancer conflicts with gateway — different infra layers
375
+ {
376
+ type: "conflicts",
377
+ source: "load_balancer",
378
+ targets: ["gateway"],
379
+ message: "Load balancer and gateway operate at different infrastructure layers.",
380
+ suggestion: "Use @load_balancer for L4/L7 traffic distribution or @gateway for API aggregation."
381
+ },
382
+ // Service position mode — only one service architecture pattern
383
+ {
384
+ type: "oneof",
385
+ source: "service_architecture_mode",
386
+ targets: ["gateway", "proxy", "load_balancer", "middleware"],
387
+ message: "Only one service architecture pattern per entity.",
388
+ suggestion: "Choose one: @gateway, @proxy, @load_balancer, or @middleware."
389
+ },
390
+ // =============================================================================
391
+ // v6 UNIVERSAL DATA DOMAIN CONSTRAINTS
392
+ // =============================================================================
393
+ // Data index requires data_model — index needs a model to index
394
+ {
395
+ type: "requires",
396
+ source: "data_index",
397
+ targets: ["data_model"],
398
+ message: "Data indexes require a data model to define the indexed columns.",
399
+ suggestion: "Define a data_model block before creating indexes on it."
400
+ },
401
+ // Data trigger requires data_model — trigger needs a model
402
+ {
403
+ type: "requires",
404
+ source: "data_trigger",
405
+ targets: ["data_model"],
406
+ message: "Data triggers must reference a data model table.",
407
+ suggestion: "Define a data_model block to provide the table for this trigger."
408
+ },
409
+ // Stored procedure requires data_model — SP needs model context
410
+ {
411
+ type: "requires",
412
+ source: "stored_procedure",
413
+ targets: ["data_model"],
414
+ message: "Stored procedures operate on data models.",
415
+ suggestion: "Define a data_model block that this stored procedure targets."
416
+ },
417
+ // Data view requires data_model — views derive from models
418
+ {
419
+ type: "requires",
420
+ source: "data_view",
421
+ targets: ["data_model"],
422
+ message: "Data views are derived from data models.",
423
+ suggestion: "Define a data_model block as the source for this view."
424
+ },
425
+ // Migration conflicts with seed — different lifecycle phases
426
+ {
427
+ type: "conflicts",
428
+ source: "migration",
429
+ targets: ["seed"],
430
+ message: "Migrations and seeds are different lifecycle phases and should be separate blocks.",
431
+ suggestion: "Define migrations and seeds in separate blocks for clear ordering."
432
+ },
433
+ // =============================================================================
434
+ // v6 UNIVERSAL PIPELINE DOMAIN CONSTRAINTS
435
+ // =============================================================================
436
+ // Consumer requires queue or topic — consumers need a message source
437
+ {
438
+ type: "requires",
439
+ source: "consumer",
440
+ targets: ["queue"],
441
+ message: "Consumers require a queue or topic to consume messages from.",
442
+ suggestion: "Define a queue block and reference it from this consumer."
443
+ },
444
+ // Producer requires queue or topic — producers need a message target
445
+ {
446
+ type: "requires",
447
+ source: "producer",
448
+ targets: ["queue"],
449
+ message: "Producers require a queue or topic to publish messages to.",
450
+ suggestion: "Define a queue block and reference it from this producer."
451
+ },
452
+ // Dead letter requires queue — DLQ needs a primary queue
453
+ {
454
+ type: "requires",
455
+ source: "dead_letter",
456
+ targets: ["queue"],
457
+ message: "Dead letter queues require a primary queue to catch failed messages from.",
458
+ suggestion: "Define a queue block as the source for this dead letter queue."
459
+ },
460
+ // Stage requires pipeline — stages belong to pipelines
461
+ {
462
+ type: "requires",
463
+ source: "stage",
464
+ targets: ["pipeline"],
465
+ message: "Stages must belong to a pipeline.",
466
+ suggestion: "Wrap this stage in a pipeline block."
467
+ },
468
+ // Worker conflicts with scheduler — different execution models
469
+ {
470
+ type: "conflicts",
471
+ source: "worker",
472
+ targets: ["scheduler"],
473
+ message: "Workers process jobs continuously while schedulers trigger at intervals.",
474
+ suggestion: "Use @worker for continuous processing or @scheduler for cron-based execution."
475
+ },
476
+ // Consumer conflicts with producer on same entity — pick one direction
477
+ {
478
+ type: "conflicts",
479
+ source: "consumer",
480
+ targets: ["producer"],
481
+ message: "An entity should be either a consumer or a producer, not both.",
482
+ suggestion: "Split into separate consumer and producer blocks for clear message flow direction."
483
+ },
484
+ // =============================================================================
485
+ // v6 UNIVERSAL CONTAINER/INFRA DOMAIN CONSTRAINTS
486
+ // =============================================================================
487
+ // Serverless conflicts with container — different deployment models
488
+ {
489
+ type: "conflicts",
490
+ source: "serverless",
491
+ targets: ["container"],
492
+ message: "Serverless and container are mutually exclusive deployment models.",
493
+ suggestion: "Choose @serverless for FaaS or @container for long-running services."
494
+ },
495
+ // Horizontal scaling requires service — scaling needs a service to scale
496
+ {
497
+ type: "requires",
498
+ source: "horizontal_scaling",
499
+ targets: ["service"],
500
+ message: "Horizontal scaling requires a service to replicate.",
501
+ suggestion: "Add @service to define the scalable unit."
502
+ },
503
+ // =============================================================================
504
+ // v6 UNIVERSAL OBSERVABILITY DOMAIN CONSTRAINTS
505
+ // =============================================================================
506
+ // Tracing requires service or handler — tracing needs a service context
507
+ {
508
+ type: "requires",
509
+ source: "tracing",
510
+ targets: ["service"],
511
+ message: "Distributed tracing requires a service context for span propagation.",
512
+ suggestion: "Add @service to enable trace context propagation."
513
+ },
514
+ // Alerting requires metric — alerts need metrics to alert on
515
+ {
516
+ type: "requires",
517
+ source: "alerting",
518
+ targets: ["metric"],
519
+ message: "Alerting rules require metrics to evaluate thresholds against.",
520
+ suggestion: "Add @metric to define the values that trigger alerts."
521
+ },
522
+ // Health check requires service — health checks monitor services
523
+ {
524
+ type: "requires",
525
+ source: "health_check",
526
+ targets: ["service"],
527
+ message: "Health checks require a service to monitor.",
528
+ suggestion: "Add @service to define the monitored service endpoint."
529
+ },
530
+ // =============================================================================
531
+ // v6 UNIVERSAL RESILIENCE DOMAIN CONSTRAINTS (v5.4)
532
+ // =============================================================================
533
+ // Circuit breaker requires service — wraps service calls
534
+ {
535
+ type: "requires",
536
+ source: "circuit_breaker",
537
+ targets: ["service"],
538
+ message: "Circuit breakers wrap service calls to prevent cascade failures.",
539
+ suggestion: "Add @service to define the protected service endpoint."
540
+ },
541
+ // Retry requires service or pipeline — retries need a callable context
542
+ {
543
+ type: "requires",
544
+ source: "retry",
545
+ targets: ["service"],
546
+ message: "Retry policies require a service or pipeline context.",
547
+ suggestion: "Add @service to define the endpoint with retry behavior."
548
+ },
549
+ // Timeout requires service — timeouts bound service call duration
550
+ {
551
+ type: "requires",
552
+ source: "timeout",
553
+ targets: ["service"],
554
+ message: "Timeout policies require a service context to bound request duration.",
555
+ suggestion: "Add @service to define the endpoint with timeout behavior."
556
+ },
557
+ // Bulkhead requires service — isolates concurrent requests
558
+ {
559
+ type: "requires",
560
+ source: "bulkhead",
561
+ targets: ["service"],
562
+ message: "Bulkhead isolation requires a service context for concurrency partitioning.",
563
+ suggestion: "Add @service to define the endpoint with bulkhead isolation."
564
+ },
565
+ // Middleware requires service — middleware wraps service endpoints
566
+ {
567
+ type: "requires",
568
+ source: "middleware",
569
+ targets: ["service"],
570
+ message: "Middleware requires a service context to wrap endpoints.",
571
+ suggestion: "Add @service to define the service where middleware is applied."
572
+ },
573
+ // Migration requires db — database migrations need a connection
574
+ {
575
+ type: "requires",
576
+ source: "migration",
577
+ targets: ["db"],
578
+ message: "Database migrations require a database connection (@db).",
579
+ suggestion: "Add @db to define the database connection for migrations."
580
+ },
581
+ // Saga requires db — distributed transactions need persistence
582
+ {
583
+ type: "requires",
584
+ source: "saga",
585
+ targets: ["db"],
586
+ message: "Sagas require database access for transaction state management.",
587
+ suggestion: "Add @db for the saga coordinator state store."
588
+ },
589
+ // Circuit breaker conflicts with fallback at same level
590
+ {
591
+ type: "conflicts",
592
+ source: "circuit_breaker",
593
+ targets: ["bulkhead"],
594
+ message: "Circuit breaker and bulkhead should be applied at different granularity levels.",
595
+ suggestion: "Apply @circuit_breaker at the service level and @bulkhead at the endpoint level, or vice versa."
596
+ }
597
+ ];
598
+
599
+ // src/traits/constraintConfig.ts
600
+ chunkE7JP3BS3_cjs.init_safeJsonParse();
601
+ function loadConstraintsFromConfig(config) {
602
+ if (!config || typeof config !== "object") return [];
603
+ const raw = config;
604
+ if (!Array.isArray(raw.traitConstraints)) return [];
605
+ const valid = [];
606
+ for (const entry of raw.traitConstraints) {
607
+ if (!entry || typeof entry !== "object") continue;
608
+ const { type, source, targets, message, suggestion } = entry;
609
+ if ((type === "requires" || type === "conflicts" || type === "oneof") && typeof source === "string" && source.length > 0 && Array.isArray(targets) && targets.length > 0 && targets.every((t) => typeof t === "string")) {
610
+ valid.push({
611
+ type,
612
+ source,
613
+ targets,
614
+ message: typeof message === "string" ? message : void 0,
615
+ suggestion: typeof suggestion === "string" ? suggestion : void 0
616
+ });
617
+ }
618
+ }
619
+ return valid;
620
+ }
621
+ async function loadConstraintsFromFile(configPath = "holoscript.config.json") {
622
+ try {
623
+ const { readFileSync } = await import('fs');
624
+ const raw = readFileSync(configPath, "utf-8");
625
+ const parsed = chunkE7JP3BS3_cjs.readJson(raw);
626
+ return loadConstraintsFromConfig(parsed);
627
+ } catch {
628
+ return [];
629
+ }
630
+ }
631
+
632
+ exports.BUILTIN_CONSTRAINTS = BUILTIN_CONSTRAINTS;
633
+ exports.loadConstraintsFromConfig = loadConstraintsFromConfig;
634
+ exports.loadConstraintsFromFile = loadConstraintsFromFile;
635
+ //# sourceMappingURL=chunk-C37BHB7N.cjs.map
636
+ //# sourceMappingURL=chunk-C37BHB7N.cjs.map