@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,939 @@
1
+ import '../chunk-OL46QLBJ.js';
2
+
3
+ // src/world/WorldGeneratorAdapter.ts
4
+ var WorldAdapterRegistry = class {
5
+ constructor() {
6
+ this.adapters = /* @__PURE__ */ new Map();
7
+ }
8
+ register(adapter) {
9
+ this.adapters.set(adapter.id, adapter);
10
+ }
11
+ get(engineId) {
12
+ const adapter = this.adapters.get(engineId);
13
+ if (!adapter) {
14
+ throw new Error(
15
+ `[WorldAdapterRegistry] No adapter registered for engine '${engineId}'. Registered: ${[...this.adapters.keys()].join(", ") || "(none)"}`
16
+ );
17
+ }
18
+ return adapter;
19
+ }
20
+ has(engineId) {
21
+ return this.adapters.has(engineId);
22
+ }
23
+ list() {
24
+ return [...this.adapters.keys()];
25
+ }
26
+ };
27
+ var worldAdapterRegistry = new WorldAdapterRegistry();
28
+
29
+ // src/world/adapters/SovereignWorldAdapter.ts
30
+ var QUALITY_MAP = {
31
+ low: "draft",
32
+ medium: "standard",
33
+ high: "high",
34
+ ultra: "ultra"
35
+ };
36
+ var FORMAT_MAP = {
37
+ "3dgs": "splat",
38
+ mesh: "mesh",
39
+ both: "both",
40
+ neural_field: "neural_field"
41
+ };
42
+ var DEFAULT_BASE_URL = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_BASE_URL || "https://api.holoscript.net/sovereign";
43
+ var DEFAULT_API_KEY = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_API_KEY || "";
44
+ var DEFAULT_TIMEOUT_MS = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS ? parseInt(process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS, 10) : 3e5;
45
+ var SovereignWorldAdapter = class {
46
+ constructor(options = {}) {
47
+ this.id = "sovereign-3d";
48
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
49
+ this.apiKey = options.apiKey ?? DEFAULT_API_KEY;
50
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
51
+ this.pollIntervalMs = options.pollIntervalMs ?? 2e3;
52
+ }
53
+ // ---------------------------------------------------------------------------
54
+ // PUBLIC API
55
+ // ---------------------------------------------------------------------------
56
+ async generate(req) {
57
+ const jobId = await this.submitJob(req);
58
+ return this.waitForCompletion(jobId);
59
+ }
60
+ async getProgress(generationId) {
61
+ const job = await this.fetchJob(generationId);
62
+ return job.progress ?? (job.status === "done" ? 1 : 0);
63
+ }
64
+ async cancel(generationId) {
65
+ await this.request(`/api/jobs/${generationId}/cancel`, { method: "POST" });
66
+ }
67
+ // ---------------------------------------------------------------------------
68
+ // PRIVATE HELPERS
69
+ // ---------------------------------------------------------------------------
70
+ async submitJob(req) {
71
+ const inputImages = req.input_images?.join(",") ?? req.input_image;
72
+ const payload = {
73
+ prompt: req.prompt,
74
+ output_format: FORMAT_MAP[req.format] ?? "splat",
75
+ quality_preset: QUALITY_MAP[req.quality] ?? "standard",
76
+ ...inputImages ? { input_images: inputImages } : {},
77
+ ...req.seed !== void 0 ? { seed: req.seed } : {},
78
+ ...req.navEnabled !== void 0 ? { nav_enabled: req.navEnabled } : {},
79
+ ...req.interactiveMode !== void 0 ? { interactive_mode: req.interactiveMode } : {}
80
+ };
81
+ const response = await this.request("/api/generate", {
82
+ method: "POST",
83
+ body: JSON.stringify(payload)
84
+ });
85
+ if (!response.job_id) {
86
+ throw new Error("[SovereignWorldAdapter] /api/generate did not return a job_id");
87
+ }
88
+ return response.job_id;
89
+ }
90
+ async waitForCompletion(jobId) {
91
+ const deadline = Date.now() + this.timeoutMs;
92
+ while (Date.now() < deadline) {
93
+ const job = await this.fetchJob(jobId);
94
+ if (job.status === "done") {
95
+ return this.mapResult(job);
96
+ }
97
+ if (job.status === "error") {
98
+ throw new Error(
99
+ `[SovereignWorldAdapter] Job ${jobId} failed: ${job.error ?? "unknown error"}`
100
+ );
101
+ }
102
+ await this.sleep(this.pollIntervalMs);
103
+ }
104
+ throw new Error(
105
+ `[SovereignWorldAdapter] Job ${jobId} timed out after ${this.timeoutMs}ms`
106
+ );
107
+ }
108
+ async fetchJob(jobId) {
109
+ return this.request(`/api/jobs/${jobId}`);
110
+ }
111
+ mapResult(job) {
112
+ if (!job.asset_url) {
113
+ throw new Error(
114
+ `[SovereignWorldAdapter] Job ${job.job_id} completed but returned no asset_url`
115
+ );
116
+ }
117
+ const rawMeta = job.metadata ?? {};
118
+ const bounds = rawMeta.bounds ?? [-10, 0, -10, 10, 5, 10];
119
+ const metadata = {
120
+ format: job.asset_url.endsWith(".glb") ? "mesh" : "3dgs",
121
+ bounds,
122
+ ...rawMeta.agent_start ? { agentStart: rawMeta.agent_start } : {},
123
+ ...rawMeta.waypoints ? { waypoints: rawMeta.waypoints } : {},
124
+ ...rawMeta.splat_count ? { splatCount: rawMeta.splat_count } : {},
125
+ ...rawMeta.triangle_count ? { triangleCount: rawMeta.triangle_count } : {},
126
+ ...rawMeta.generation_ms ? { generationMs: rawMeta.generation_ms } : {}
127
+ };
128
+ return {
129
+ generationId: job.job_id,
130
+ assetUrl: job.asset_url,
131
+ ...job.navmesh_url ? { navmeshUrl: job.navmesh_url } : {},
132
+ ...job.point_cloud_url ? { pointCloudUrl: job.point_cloud_url } : {},
133
+ metadata
134
+ };
135
+ }
136
+ async request(path, init = {}) {
137
+ const url = `${this.baseUrl}${path}`;
138
+ const headers = {
139
+ "Content-Type": "application/json",
140
+ ...this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
141
+ };
142
+ const res = await fetch(url, { ...init, headers: { ...headers, ...init.headers ?? {} } });
143
+ if (!res.ok) {
144
+ const text = await res.text().catch(() => "");
145
+ throw new Error(
146
+ `[SovereignWorldAdapter] HTTP ${res.status} at ${path}${text ? ": " + text : ""}`
147
+ );
148
+ }
149
+ return res.json();
150
+ }
151
+ sleep(ms) {
152
+ return new Promise((resolve) => setTimeout(resolve, ms));
153
+ }
154
+ };
155
+
156
+ // src/world/adapters/Sovereign3DAdapter.ts
157
+ var QUALITY_MAP2 = {
158
+ low: "draft",
159
+ medium: "standard",
160
+ high: "high",
161
+ ultra: "ultra"
162
+ };
163
+ var FORMAT_MAP2 = {
164
+ "3dgs": "splat",
165
+ mesh: "mesh",
166
+ both: "both",
167
+ neural_field: "neural_field"
168
+ };
169
+ var DEFAULT_BASE_URL2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_BASE_URL || "https://api.holoscript.net/sovereign";
170
+ var DEFAULT_API_KEY2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_API_KEY || "";
171
+ var DEFAULT_TIMEOUT_MS2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS ? parseInt(process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS, 10) : 3e5;
172
+ var Sovereign3DAdapter = class {
173
+ constructor(options = {}) {
174
+ this.id = "sovereign-3d";
175
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL2).replace(/\/$/, "");
176
+ this.apiKey = options.apiKey ?? DEFAULT_API_KEY2;
177
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS2;
178
+ this.pollIntervalMs = options.pollIntervalMs ?? 2e3;
179
+ this.mockMode = Boolean(options.mockMode);
180
+ this.mockLatencyMs = Math.max(0, options.mockLatencyMs ?? 10);
181
+ }
182
+ // ---------------------------------------------------------------------------
183
+ // PUBLIC API
184
+ // ---------------------------------------------------------------------------
185
+ async generate(req) {
186
+ if (this.mockMode) {
187
+ await this.sleep(this.mockLatencyMs);
188
+ return this.mockResult(req);
189
+ }
190
+ const jobId = await this.submitJob(req);
191
+ return this.waitForCompletion(jobId);
192
+ }
193
+ async getProgress(generationId) {
194
+ if (this.mockMode || generationId.startsWith("mock_")) {
195
+ return 1;
196
+ }
197
+ const job = await this.fetchJob(generationId);
198
+ return job.progress ?? (job.status === "done" ? 1 : 0);
199
+ }
200
+ async cancel(generationId) {
201
+ if (this.mockMode || generationId.startsWith("mock_")) return;
202
+ await this.request(`/api/jobs/${generationId}/cancel`, { method: "POST" });
203
+ }
204
+ // ---------------------------------------------------------------------------
205
+ // PRIVATE HELPERS
206
+ // ---------------------------------------------------------------------------
207
+ async submitJob(req) {
208
+ const inputImages = req.input_images?.join(",") ?? req.input_image;
209
+ const payload = {
210
+ prompt: req.prompt,
211
+ output_format: FORMAT_MAP2[req.format] ?? "splat",
212
+ quality_preset: QUALITY_MAP2[req.quality] ?? "standard",
213
+ ...inputImages ? { input_images: inputImages } : {},
214
+ ...req.seed !== void 0 ? { seed: req.seed } : {},
215
+ ...req.navEnabled !== void 0 ? { nav_enabled: req.navEnabled } : {},
216
+ ...req.interactiveMode !== void 0 ? { interactive_mode: req.interactiveMode } : {}
217
+ };
218
+ const response = await this.request("/api/generate", {
219
+ method: "POST",
220
+ body: JSON.stringify(payload)
221
+ });
222
+ if (!response.job_id) {
223
+ throw new Error("[Sovereign3DAdapter] /api/generate did not return a job_id");
224
+ }
225
+ return response.job_id;
226
+ }
227
+ async waitForCompletion(jobId) {
228
+ const deadline = Date.now() + this.timeoutMs;
229
+ while (Date.now() < deadline) {
230
+ const job = await this.fetchJob(jobId);
231
+ if (job.status === "done") {
232
+ return this.mapResult(job);
233
+ }
234
+ if (job.status === "error") {
235
+ throw new Error(
236
+ `[Sovereign3DAdapter] Job ${jobId} failed: ${job.error ?? "unknown error"}`
237
+ );
238
+ }
239
+ await this.sleep(this.pollIntervalMs);
240
+ }
241
+ throw new Error(
242
+ `[Sovereign3DAdapter] Job ${jobId} timed out after ${this.timeoutMs}ms`
243
+ );
244
+ }
245
+ async fetchJob(jobId) {
246
+ return this.request(`/api/jobs/${jobId}`);
247
+ }
248
+ mapResult(job) {
249
+ if (!job.asset_url) {
250
+ throw new Error(
251
+ `[Sovereign3DAdapter] Job ${job.job_id} completed but returned no asset_url`
252
+ );
253
+ }
254
+ const rawMeta = job.metadata ?? {};
255
+ const bounds = rawMeta.bounds ?? [-10, 0, -10, 10, 5, 10];
256
+ const metadata = {
257
+ format: job.asset_url.endsWith(".glb") ? "mesh" : job.asset_url.includes("neural") ? "neural_field" : "3dgs",
258
+ bounds,
259
+ ...rawMeta.agent_start ? { agentStart: rawMeta.agent_start } : {},
260
+ ...rawMeta.waypoints ? { waypoints: rawMeta.waypoints } : {},
261
+ ...rawMeta.splat_count ? { splatCount: rawMeta.splat_count } : {},
262
+ ...rawMeta.triangle_count ? { triangleCount: rawMeta.triangle_count } : {},
263
+ ...rawMeta.generation_ms ? { generationMs: rawMeta.generation_ms } : {}
264
+ };
265
+ return {
266
+ generationId: job.job_id,
267
+ assetUrl: job.asset_url,
268
+ ...job.navmesh_url ? { navmeshUrl: job.navmesh_url } : {},
269
+ ...job.point_cloud_url ? { pointCloudUrl: job.point_cloud_url } : {},
270
+ metadata
271
+ };
272
+ }
273
+ async request(path, init = {}) {
274
+ const url = `${this.baseUrl}${path}`;
275
+ const headers = {
276
+ "Content-Type": "application/json",
277
+ ...this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
278
+ };
279
+ const res = await fetch(url, { ...init, headers: { ...headers, ...init.headers ?? {} } });
280
+ if (!res.ok) {
281
+ const text = await res.text().catch(() => "");
282
+ throw new Error(
283
+ `[Sovereign3DAdapter] HTTP ${res.status} at ${path}${text ? ": " + text : ""}`
284
+ );
285
+ }
286
+ return res.json();
287
+ }
288
+ mockResult(req) {
289
+ const generationId = `mock_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
290
+ const basePath = `${this.baseUrl}/mock/${generationId}`;
291
+ const metadata = {
292
+ format: req.format,
293
+ bounds: [-20, 0, -20, 20, 12, 20],
294
+ agentStart: [0, 0, 0],
295
+ waypoints: [
296
+ [0, 0, 0],
297
+ [5, 0, 5],
298
+ [10, 0, 0]
299
+ ],
300
+ splatCount: req.format === "mesh" ? void 0 : 25e4,
301
+ triangleCount: req.format === "3dgs" ? void 0 : 12e4,
302
+ generationMs: this.mockLatencyMs
303
+ };
304
+ const assetUrl = req.format === "mesh" ? `${basePath}/world.glb` : req.format === "neural_field" ? `${basePath}/world.neural` : `${basePath}/world.splat`;
305
+ return {
306
+ generationId,
307
+ assetUrl,
308
+ ...req.navEnabled ? { navmeshUrl: `${basePath}/navmesh.glb` } : {},
309
+ ...req.format === "both" ? { pointCloudUrl: `${basePath}/world.ply` } : {},
310
+ metadata
311
+ };
312
+ }
313
+ sleep(ms) {
314
+ return new Promise((resolve) => setTimeout(resolve, ms));
315
+ }
316
+ };
317
+
318
+ // src/world/adapters/SovereignGeneratorAdapter.ts
319
+ var DEFAULT_LOCAL_ENDPOINT = typeof process !== "undefined" && process.env.BRITTNEY_LOCAL_ENDPOINT || typeof process !== "undefined" && process.env.OLLAMA_HOST || "http://localhost:11434";
320
+ var DEFAULT_LOCAL_MODEL = typeof process !== "undefined" && process.env.BRITTNEY_MODEL || "brittney-qwen-v23:latest";
321
+ var DEFAULT_CLOUD_ENDPOINT = typeof process !== "undefined" && process.env.BRITTNEY_SERVICE_URL || "";
322
+ var DEFAULT_CLOUD_API_KEY = typeof process !== "undefined" && process.env.BRITTNEY_API_KEY || "";
323
+ var DEFAULT_CLOUD_MODEL = "brittney-standard";
324
+ var DEFAULT_MAX_TOKENS = 4096;
325
+ var DEFAULT_TIMEOUT_MS3 = 12e4;
326
+ var SOVEREIGN_GENERATE_SYSTEM_PROMPT = `You are a HoloScript code generator running locally (sovereign, no cloud).
327
+ Output ONLY valid HoloScript code, no markdown, no explanation.
328
+
329
+ HoloScript syntax:
330
+ object "Name" {
331
+ geometry: "cube" | "sphere" | "cylinder" | "plane" | "cone"
332
+ position: [x, y, z]
333
+ rotation: [x, y, z]
334
+ scale: [x, y, z] | number
335
+ @color(red) @emissive(cyan) @grabbable @physics @collidable
336
+ @clickable @hoverable @networked @persistent @animated
337
+ }
338
+
339
+ composition "SceneName" {
340
+ environment {
341
+ skybox: "default"
342
+ ambient_light: 0.5
343
+ }
344
+ object "Obj1" { ... }
345
+ }
346
+
347
+ Traits available: @grabbable, @throwable, @clickable, @hoverable, @draggable,
348
+ @scalable, @physics, @collidable, @gravity, @glowing, @emissive, @transparent,
349
+ @reflective, @animated, @billboard, @networked, @synced, @persistent, @owned,
350
+ @host_only, @stackable, @attachable, @equippable, @consumable, @destructible,
351
+ @anchor, @tracked, @world_locked, @hand_tracked, @eye_tracked, @spatial_audio,
352
+ @ambient, @voice_activated, @state, @reactive, @observable, @computed,
353
+ @shareable, @collaborative, @trigger, @pointable`;
354
+ var SOVEREIGN_SUGGEST_SYSTEM_PROMPT = `You are a HoloScript trait suggestion engine running locally (sovereign, no cloud).
355
+ Given a natural language description of an object or scene, suggest appropriate HoloScript traits.
356
+
357
+ Available traits: @grabbable, @throwable, @clickable, @hoverable, @draggable, @scalable,
358
+ @physics, @collidable, @gravity, @glowing, @emissive, @transparent, @reflective,
359
+ @animated, @billboard, @networked, @synced, @persistent, @owned, @host_only,
360
+ @stackable, @attachable, @equippable, @consumable, @destructible, @anchor,
361
+ @tracked, @world_locked, @hand_tracked, @eye_tracked, @spatial_audio, @ambient,
362
+ @voice_activated, @state, @reactive, @observable, @computed, @shareable,
363
+ @collaborative, @trigger, @pointable, @state, @reactive
364
+
365
+ Output JSON only: { "traits": ["@trait1", "@trait2"], "reasoning": { "@trait1": "reason", "@trait2": "reason" }, "confidence": 0.85 }`;
366
+ var TRAIT_KEYWORDS = {
367
+ "pick up": ["@grabbable"],
368
+ grab: ["@grabbable"],
369
+ hold: ["@grabbable", "@holdable"],
370
+ throw: ["@grabbable", "@throwable"],
371
+ click: ["@clickable"],
372
+ point: ["@pointable"],
373
+ hover: ["@hoverable"],
374
+ drag: ["@draggable"],
375
+ scale: ["@scalable"],
376
+ resize: ["@scalable"],
377
+ collide: ["@collidable"],
378
+ bounce: ["@collidable", "@physics"],
379
+ physics: ["@physics", "@collidable"],
380
+ fall: ["@physics", "@gravity"],
381
+ gravity: ["@gravity"],
382
+ trigger: ["@trigger"],
383
+ glow: ["@glowing"],
384
+ light: ["@emissive"],
385
+ transparent: ["@transparent"],
386
+ "see through": ["@transparent"],
387
+ reflect: ["@reflective"],
388
+ mirror: ["@reflective"],
389
+ animate: ["@animated"],
390
+ spin: ["@animated"],
391
+ rotate: ["@animated"],
392
+ billboard: ["@billboard"],
393
+ "face camera": ["@billboard"],
394
+ multiplayer: ["@networked", "@synced"],
395
+ sync: ["@networked", "@synced"],
396
+ network: ["@networked"],
397
+ save: ["@persistent"],
398
+ persist: ["@persistent"],
399
+ own: ["@owned"],
400
+ host: ["@host_only"],
401
+ stack: ["@stackable"],
402
+ attach: ["@attachable"],
403
+ equip: ["@equippable"],
404
+ wear: ["@equippable"],
405
+ consume: ["@consumable"],
406
+ eat: ["@consumable"],
407
+ drink: ["@consumable"],
408
+ destroy: ["@destructible"],
409
+ break: ["@destructible"],
410
+ anchor: ["@anchor"],
411
+ track: ["@tracked"],
412
+ "world lock": ["@world_locked"],
413
+ "hand track": ["@hand_tracked"],
414
+ "eye track": ["@eye_tracked"],
415
+ sound: ["@spatial_audio"],
416
+ audio: ["@spatial_audio"],
417
+ ambient: ["@ambient"],
418
+ voice: ["@voice_activated"],
419
+ speak: ["@voice_activated"],
420
+ state: ["@state", "@reactive"],
421
+ react: ["@reactive"],
422
+ observe: ["@observable"],
423
+ compute: ["@computed"],
424
+ share: ["@shareable"],
425
+ collaborate: ["@collaborative"],
426
+ tweet: ["@tweetable"]
427
+ };
428
+ var SovereignGeneratorAdapter = class {
429
+ constructor(options = {}) {
430
+ this.id = "sovereign-generator";
431
+ this.localEndpoint = (options.localEndpoint ?? DEFAULT_LOCAL_ENDPOINT).replace(/\/$/, "");
432
+ this.cloudEndpoint = (options.cloudEndpoint ?? DEFAULT_CLOUD_ENDPOINT).replace(/\/$/, "");
433
+ this.cloudApiKey = options.cloudApiKey ?? DEFAULT_CLOUD_API_KEY;
434
+ this.localModel = options.localModel ?? DEFAULT_LOCAL_MODEL;
435
+ this.cloudModel = options.cloudModel ?? DEFAULT_CLOUD_MODEL;
436
+ this.maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
437
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS3;
438
+ this.offlineOnly = options.offlineOnly ?? false;
439
+ this.mockMode = options.mockMode ?? false;
440
+ this.mockLatencyMs = Math.max(0, options.mockLatencyMs ?? 5);
441
+ }
442
+ // ---------------------------------------------------------------------------
443
+ // PUBLIC API — suggestTraits
444
+ // ---------------------------------------------------------------------------
445
+ /**
446
+ * Suggest HoloScript traits for a natural language description.
447
+ *
448
+ * Resolution order:
449
+ * 1. Local Brittney (Ollama/WebLLM) — sovereign, offline-capable
450
+ * 2. Cloud Brittney — if online and not offlineOnly
451
+ * 3. Keyword fallback — deterministic, no LLM needed
452
+ */
453
+ async suggestTraits(description, context) {
454
+ if (this.mockMode) {
455
+ await this.sleep(this.mockLatencyMs);
456
+ return this.keywordSuggestTraits(description, context, "mock");
457
+ }
458
+ try {
459
+ const localResult = await this.localSuggestTraits(description, context);
460
+ if (localResult) {
461
+ return { ...localResult, metadata: { source: "sovereign-local" } };
462
+ }
463
+ } catch {
464
+ }
465
+ if (!this.offlineOnly && this.cloudEndpoint) {
466
+ try {
467
+ const cloudResult = await this.cloudSuggestTraits(description, context);
468
+ if (cloudResult) {
469
+ return { ...cloudResult, metadata: { source: "sovereign-cloud" } };
470
+ }
471
+ } catch {
472
+ }
473
+ }
474
+ return this.keywordSuggestTraits(description, context, "keyword-fallback");
475
+ }
476
+ // ---------------------------------------------------------------------------
477
+ // PUBLIC API — generateObject
478
+ // ---------------------------------------------------------------------------
479
+ /**
480
+ * Generate a HoloScript object from natural language.
481
+ *
482
+ * Resolution order mirrors suggestTraits:
483
+ * 1. Local Brittney (sovereign)
484
+ * 2. Cloud Brittney
485
+ * 3. Keyword/template fallback
486
+ */
487
+ async generateObject(description) {
488
+ if (this.mockMode) {
489
+ await this.sleep(this.mockLatencyMs);
490
+ return this.templateGenerateObject(description, "mock");
491
+ }
492
+ try {
493
+ const localResult = await this.localGenerate(description, "object");
494
+ if (localResult) {
495
+ return {
496
+ code: localResult,
497
+ metadata: {
498
+ description,
499
+ traits: this.extractTraitsFromCode(localResult),
500
+ geometry: this.extractGeometryFromCode(localResult),
501
+ source: "sovereign-local"
502
+ }
503
+ };
504
+ }
505
+ } catch {
506
+ }
507
+ if (!this.offlineOnly && this.cloudEndpoint) {
508
+ try {
509
+ const cloudResult = await this.cloudGenerate(description, "object");
510
+ if (cloudResult) {
511
+ return {
512
+ code: cloudResult,
513
+ metadata: {
514
+ description,
515
+ traits: this.extractTraitsFromCode(cloudResult),
516
+ geometry: this.extractGeometryFromCode(cloudResult),
517
+ source: "sovereign-cloud"
518
+ }
519
+ };
520
+ }
521
+ } catch {
522
+ }
523
+ }
524
+ return this.templateGenerateObject(description, "keyword-fallback");
525
+ }
526
+ // ---------------------------------------------------------------------------
527
+ // PUBLIC API — generateScene
528
+ // ---------------------------------------------------------------------------
529
+ /**
530
+ * Generate a complete HoloScript composition from natural language.
531
+ */
532
+ async generateScene(description) {
533
+ if (this.mockMode) {
534
+ await this.sleep(this.mockLatencyMs);
535
+ return this.templateGenerateScene(description, "mock");
536
+ }
537
+ try {
538
+ const localResult = await this.localGenerate(description, "scene");
539
+ if (localResult) {
540
+ return {
541
+ code: localResult,
542
+ metadata: {
543
+ description,
544
+ objectCount: this.countObjects(localResult),
545
+ traits: this.extractTraitsFromCode(localResult),
546
+ source: "sovereign-local"
547
+ }
548
+ };
549
+ }
550
+ } catch {
551
+ }
552
+ if (!this.offlineOnly && this.cloudEndpoint) {
553
+ try {
554
+ const cloudResult = await this.cloudGenerate(description, "scene");
555
+ if (cloudResult) {
556
+ return {
557
+ code: cloudResult,
558
+ metadata: {
559
+ description,
560
+ objectCount: this.countObjects(cloudResult),
561
+ traits: this.extractTraitsFromCode(cloudResult),
562
+ source: "sovereign-cloud"
563
+ }
564
+ };
565
+ }
566
+ } catch {
567
+ }
568
+ }
569
+ return this.templateGenerateScene(description, "keyword-fallback");
570
+ }
571
+ // ---------------------------------------------------------------------------
572
+ // LOCAL BRITTNEY (Ollama / WebLLM)
573
+ // ---------------------------------------------------------------------------
574
+ async localSuggestTraits(description, context) {
575
+ const prompt = context ? `Description: "${description}"
576
+ Context: "${context}"` : `Description: "${description}"`;
577
+ const body = {
578
+ model: this.localModel,
579
+ messages: [
580
+ { role: "system", content: SOVEREIGN_SUGGEST_SYSTEM_PROMPT },
581
+ { role: "user", content: prompt }
582
+ ],
583
+ stream: false,
584
+ options: { num_predict: 512 }
585
+ };
586
+ const controller = new AbortController();
587
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
588
+ try {
589
+ const response = await fetch(`${this.localEndpoint}/v1/chat/completions`, {
590
+ method: "POST",
591
+ headers: { "Content-Type": "application/json" },
592
+ body: JSON.stringify(body),
593
+ signal: controller.signal
594
+ });
595
+ if (!response.ok) return null;
596
+ const data = await response.json();
597
+ const content = data?.choices?.[0]?.message?.content;
598
+ if (!content) return null;
599
+ return this.parseTraitSuggestion(content);
600
+ } finally {
601
+ clearTimeout(timeout);
602
+ }
603
+ }
604
+ async localGenerate(description, kind) {
605
+ const prompt = kind === "scene" ? `Generate a HoloScript composition for: ${description}` : `Generate a HoloScript object for: ${description}`;
606
+ const body = {
607
+ model: this.localModel,
608
+ messages: [
609
+ { role: "system", content: SOVEREIGN_GENERATE_SYSTEM_PROMPT },
610
+ { role: "user", content: prompt }
611
+ ],
612
+ stream: false,
613
+ options: { num_predict: this.maxTokens }
614
+ };
615
+ const controller = new AbortController();
616
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
617
+ try {
618
+ const response = await fetch(`${this.localEndpoint}/v1/chat/completions`, {
619
+ method: "POST",
620
+ headers: { "Content-Type": "application/json" },
621
+ body: JSON.stringify(body),
622
+ signal: controller.signal
623
+ });
624
+ if (!response.ok) return null;
625
+ const data = await response.json();
626
+ const content = data?.choices?.[0]?.message?.content;
627
+ if (!content) return null;
628
+ return this.stripCodeFences(content);
629
+ } finally {
630
+ clearTimeout(timeout);
631
+ }
632
+ }
633
+ // ---------------------------------------------------------------------------
634
+ // CLOUD BRITTNEY
635
+ // ---------------------------------------------------------------------------
636
+ async cloudSuggestTraits(description, context) {
637
+ const prompt = context ? `Description: "${description}"
638
+ Context: "${context}"` : `Description: "${description}"`;
639
+ const body = {
640
+ model: this.cloudModel,
641
+ messages: [
642
+ { role: "system", content: SOVEREIGN_SUGGEST_SYSTEM_PROMPT },
643
+ { role: "user", content: prompt }
644
+ ],
645
+ stream: false,
646
+ max_tokens: 512
647
+ };
648
+ const headers = {
649
+ "Content-Type": "application/json",
650
+ ...this.cloudApiKey ? { Authorization: `Bearer ${this.cloudApiKey}` } : {}
651
+ };
652
+ const controller = new AbortController();
653
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
654
+ try {
655
+ const response = await fetch(`${this.cloudEndpoint}/v1/chat/completions`, {
656
+ method: "POST",
657
+ headers,
658
+ body: JSON.stringify(body),
659
+ signal: controller.signal
660
+ });
661
+ if (!response.ok) return null;
662
+ const data = await response.json();
663
+ const content = data?.choices?.[0]?.message?.content;
664
+ if (!content) return null;
665
+ return this.parseTraitSuggestion(content);
666
+ } finally {
667
+ clearTimeout(timeout);
668
+ }
669
+ }
670
+ async cloudGenerate(description, kind) {
671
+ const prompt = kind === "scene" ? `Generate a HoloScript composition for: ${description}` : `Generate a HoloScript object for: ${description}`;
672
+ const body = {
673
+ model: this.cloudModel,
674
+ messages: [
675
+ { role: "system", content: SOVEREIGN_GENERATE_SYSTEM_PROMPT },
676
+ { role: "user", content: prompt }
677
+ ],
678
+ stream: false,
679
+ max_tokens: this.maxTokens
680
+ };
681
+ const headers = {
682
+ "Content-Type": "application/json",
683
+ ...this.cloudApiKey ? { Authorization: `Bearer ${this.cloudApiKey}` } : {}
684
+ };
685
+ const controller = new AbortController();
686
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
687
+ try {
688
+ const response = await fetch(`${this.cloudEndpoint}/v1/chat/completions`, {
689
+ method: "POST",
690
+ headers,
691
+ body: JSON.stringify(body),
692
+ signal: controller.signal
693
+ });
694
+ if (!response.ok) return null;
695
+ const data = await response.json();
696
+ const content = data?.choices?.[0]?.message?.content;
697
+ if (!content) return null;
698
+ return this.stripCodeFences(content);
699
+ } finally {
700
+ clearTimeout(timeout);
701
+ }
702
+ }
703
+ // ---------------------------------------------------------------------------
704
+ // KEYWORD / TEMPLATE FALLBACK — deterministic, no LLM
705
+ // ---------------------------------------------------------------------------
706
+ keywordSuggestTraits(description, context, source) {
707
+ const lowerDesc = (description + " " + (context || "")).toLowerCase();
708
+ const suggestedTraits = /* @__PURE__ */ new Set();
709
+ const reasoning = {};
710
+ for (const [keyword, traits2] of Object.entries(TRAIT_KEYWORDS)) {
711
+ if (lowerDesc.includes(keyword)) {
712
+ for (const trait of traits2) {
713
+ if (!suggestedTraits.has(trait)) {
714
+ suggestedTraits.add(trait);
715
+ reasoning[trait] = `Suggested because description mentions "${keyword}"`;
716
+ }
717
+ }
718
+ }
719
+ }
720
+ if (suggestedTraits.size === 0) {
721
+ suggestedTraits.add("@pointable");
722
+ reasoning["@pointable"] = "Default trait for interactive objects";
723
+ }
724
+ if (suggestedTraits.has("@physics") && !suggestedTraits.has("@collidable")) {
725
+ suggestedTraits.add("@collidable");
726
+ reasoning["@collidable"] = "Required for physics interactions";
727
+ }
728
+ const traits = Array.from(suggestedTraits);
729
+ const confidence = Math.min(0.95, 0.5 + traits.length * 0.1);
730
+ return {
731
+ traits,
732
+ reasoning,
733
+ confidence,
734
+ metadata: { source }
735
+ };
736
+ }
737
+ templateGenerateObject(description, source) {
738
+ const { traits } = this.keywordSuggestTraits(
739
+ description,
740
+ void 0,
741
+ source === "mock" ? "mock" : "keyword-fallback"
742
+ );
743
+ const code = `object "Generated" {
744
+ // Generated from: ${description}
745
+ geometry: "cube"
746
+ position: [0, 1, 0]
747
+ ${traits.length > 0 ? " " + traits.join("\n ") : ""}
748
+ }`;
749
+ return {
750
+ code,
751
+ metadata: {
752
+ description,
753
+ traits,
754
+ geometry: "cube",
755
+ source
756
+ }
757
+ };
758
+ }
759
+ templateGenerateScene(description, source) {
760
+ const { traits } = this.keywordSuggestTraits(
761
+ description,
762
+ void 0,
763
+ source === "mock" ? "mock" : "keyword-fallback"
764
+ );
765
+ const code = `composition "Generated Scene" {
766
+ // Generated from: ${description}
767
+ environment {
768
+ skybox: "default"
769
+ ambient_light: 0.5
770
+ }
771
+
772
+ object "Object1" {
773
+ geometry: "cube"
774
+ position: [0, 1, 0]
775
+ ${traits.length > 0 ? " " + traits.join("\n ") : ""}
776
+ }
777
+ }`;
778
+ return {
779
+ code,
780
+ metadata: {
781
+ description,
782
+ objectCount: 1,
783
+ traits,
784
+ source
785
+ }
786
+ };
787
+ }
788
+ // ---------------------------------------------------------------------------
789
+ // PARSING UTILITIES
790
+ // ---------------------------------------------------------------------------
791
+ parseTraitSuggestion(content) {
792
+ try {
793
+ const stripped = this.stripCodeFences(content).trim();
794
+ const jsonMatch = stripped.match(/\{[\s\S]*\}/);
795
+ if (!jsonMatch) return null;
796
+ const parsed = JSON.parse(jsonMatch[0]);
797
+ if (!Array.isArray(parsed.traits)) return null;
798
+ return {
799
+ traits: parsed.traits.filter((t) => typeof t === "string"),
800
+ reasoning: parsed.reasoning ?? {},
801
+ confidence: typeof parsed.confidence === "number" ? parsed.confidence : 0.7
802
+ };
803
+ } catch {
804
+ return null;
805
+ }
806
+ }
807
+ stripCodeFences(code) {
808
+ return code.replace(/^```(?:holoscript|hs|holo)?\s*\n?/m, "").replace(/\n?```\s*$/m, "").trim();
809
+ }
810
+ extractTraitsFromCode(code) {
811
+ const traitPattern = /@[\w]+/g;
812
+ const matches = code.match(traitPattern);
813
+ return matches ? [...new Set(matches)] : [];
814
+ }
815
+ extractGeometryFromCode(code) {
816
+ const geoMatch = code.match(/geometry:\s*"(\w+)"/);
817
+ return geoMatch?.[1] ?? "unknown";
818
+ }
819
+ countObjects(code) {
820
+ const objectMatches = code.match(/\bobject\s+"/g);
821
+ return objectMatches ? objectMatches.length : 1;
822
+ }
823
+ sleep(ms) {
824
+ return new Promise((resolve) => setTimeout(resolve, ms));
825
+ }
826
+ };
827
+
828
+ // src/world/WorldGeneratorService.ts
829
+ var WorldGeneratorService = class {
830
+ constructor(registry = worldAdapterRegistry) {
831
+ this.emitters = /* @__PURE__ */ new Set();
832
+ this.defaultAdaptersRegistered = false;
833
+ this.registry = registry;
834
+ }
835
+ /**
836
+ * Register the built-in sovereign adapter (SovereignWorldAdapter — Brittney v43+).
837
+ * Call once during scene/runtime bootstrap.
838
+ */
839
+ registerDefaultAdapters() {
840
+ if (this.defaultAdaptersRegistered) return;
841
+ this.registry.register(new Sovereign3DAdapter({
842
+ // HOLOSCRIPT_SOVEREIGN_MOCK=true enables deterministic mock output when the
843
+ // live sovereign service (wss://api.hololand.io) is offline or not yet deployed.
844
+ mockMode: Boolean(process.env.HOLOSCRIPT_SOVEREIGN_MOCK)
845
+ }));
846
+ this.defaultAdaptersRegistered = true;
847
+ }
848
+ /**
849
+ * Bind to an event emitter (TraitContext-like).
850
+ * The service starts listening for 'world:generate' events on this emitter.
851
+ * Returns an unsubscribe function.
852
+ */
853
+ bindEventEmitter(emitter) {
854
+ const listener = (data) => {
855
+ void this.handleGenerateEvent(emitter, data);
856
+ };
857
+ emitter.on("world:generate", listener);
858
+ this.emitters.add(emitter);
859
+ return () => {
860
+ emitter.off?.("world:generate", listener);
861
+ this.emitters.delete(emitter);
862
+ };
863
+ }
864
+ // ---------------------------------------------------------------------------
865
+ // CORE HANDLER
866
+ // ---------------------------------------------------------------------------
867
+ async handleGenerateEvent(emitter, event) {
868
+ const { nodeId, engine } = event;
869
+ if (!this.registry.has(engine)) {
870
+ const errEvent = {
871
+ nodeId,
872
+ error: `No adapter registered for engine '${engine}'. Available: ${this.registry.list().join(", ")}`
873
+ };
874
+ emitter.emit("world:generation_error", errEvent);
875
+ return;
876
+ }
877
+ const adapter = this.registry.get(engine);
878
+ const request = {
879
+ prompt: event.prompt,
880
+ format: event.format,
881
+ quality: event.quality,
882
+ ...event.input_image ? { input_image: event.input_image } : {},
883
+ ...event.input_images ? { input_images: event.input_images } : {},
884
+ ...event.seed !== void 0 ? { seed: event.seed } : {},
885
+ ...event.navEnabled !== void 0 ? { navEnabled: event.navEnabled } : {},
886
+ ...event.interactiveMode !== void 0 ? { interactiveMode: event.interactiveMode } : {}
887
+ };
888
+ try {
889
+ const generationPromise = adapter.generate(request);
890
+ emitter.emit("world:generation_started", {
891
+ nodeId,
892
+ engine,
893
+ generationId: "pending"
894
+ });
895
+ let progressInterval;
896
+ if (adapter.getProgress) {
897
+ const getProgress = adapter.getProgress.bind(adapter);
898
+ progressInterval = setInterval(() => {
899
+ void getProgress("pending").then((progress) => {
900
+ emitter.emit("world:generation_progress", {
901
+ nodeId,
902
+ progress
903
+ });
904
+ }).catch(() => {
905
+ });
906
+ }, 3e3);
907
+ }
908
+ const result = await generationPromise;
909
+ if (progressInterval !== void 0) {
910
+ clearInterval(progressInterval);
911
+ }
912
+ emitter.emit("world:generation_progress", {
913
+ nodeId,
914
+ progress: 1
915
+ });
916
+ const completeEvent = {
917
+ nodeId,
918
+ assetUrl: result.assetUrl,
919
+ generationId: result.generationId,
920
+ metadata: result.metadata,
921
+ ...result.navmeshUrl ? { navmeshUrl: result.navmeshUrl } : {},
922
+ ...result.pointCloudUrl ? { pointCloudUrl: result.pointCloudUrl } : {}
923
+ };
924
+ emitter.emit("world:generation_complete", completeEvent);
925
+ } catch (err) {
926
+ const message = err instanceof Error ? err.message : String(err);
927
+ const errEvent = {
928
+ nodeId,
929
+ error: message
930
+ };
931
+ emitter.emit("world:generation_error", errEvent);
932
+ }
933
+ }
934
+ };
935
+ var worldGeneratorService = new WorldGeneratorService();
936
+
937
+ export { Sovereign3DAdapter, SovereignGeneratorAdapter, SovereignWorldAdapter, WorldAdapterRegistry, WorldGeneratorService, worldAdapterRegistry, worldGeneratorService };
938
+ //# sourceMappingURL=index.js.map
939
+ //# sourceMappingURL=index.js.map