@holoscript/core 7.0.0 → 8.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (345) hide show
  1. package/README.md +2 -2
  2. package/bin/holoscript.cjs +3 -0
  3. package/dist/GLTFPipeline-276GE64O.js +16 -0
  4. package/dist/GLTFPipeline-M7WSSJED.cjs +37 -0
  5. package/dist/HoloScriptPlusParser-7FBIFUFC.js +693 -0
  6. package/dist/HoloScriptPlusParser-A2W7OCN2.cjs +698 -0
  7. package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
  8. package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
  9. package/dist/HoloScriptRuntime-3URVTKPJ.js +10 -0
  10. package/dist/HoloScriptRuntime-SXEAEU2N.cjs +19 -0
  11. package/dist/USDZExporter-3FWJ25JI.cjs +1037 -0
  12. package/dist/USDZExporter-D2HQLQYK.js +1035 -0
  13. package/dist/agents/index.cjs +19 -0
  14. package/dist/agents/index.d.ts +100 -0
  15. package/dist/agents/index.js +17 -0
  16. package/dist/chunk-23J755AR.js +1046 -0
  17. package/dist/chunk-253GBQZY.cjs +627 -0
  18. package/dist/chunk-25IQCHTO.cjs +781 -0
  19. package/dist/chunk-2BSMSUCE.js +1941 -0
  20. package/dist/chunk-2M2DPHKB.js +762 -0
  21. package/dist/chunk-2YSNA2F2.cjs +1274 -0
  22. package/dist/chunk-3AO425MZ.cjs +886 -0
  23. package/dist/chunk-3FOKASKO.cjs +348 -0
  24. package/dist/chunk-3HYYMEXI.cjs +56578 -0
  25. package/dist/chunk-3NFFOWGG.js +4287 -0
  26. package/dist/chunk-3WZEJHUQ.cjs +116 -0
  27. package/dist/chunk-4C57PR42.js +468 -0
  28. package/dist/chunk-4N4SXXWF.js +769 -0
  29. package/dist/chunk-4PDEPEQW.cjs +41 -0
  30. package/dist/chunk-4R6SBXDB.js +45 -0
  31. package/dist/chunk-4V2E7U7Q.cjs +2015 -0
  32. package/dist/chunk-5FSKKMR7.cjs +2092 -0
  33. package/dist/chunk-5GLCTO44.js +161 -0
  34. package/dist/chunk-5JEU52DW.js +382 -0
  35. package/dist/chunk-5S7RKFGR.cjs +446 -0
  36. package/dist/chunk-5WUNN6ZN.cjs +428 -0
  37. package/dist/chunk-62FBK3B7.js +70 -0
  38. package/dist/chunk-6CTRH7HT.cjs +1985 -0
  39. package/dist/chunk-6DPSFNJB.cjs +847 -0
  40. package/dist/chunk-6EX3I5P4.cjs +130 -0
  41. package/dist/chunk-73FELZVJ.cjs +611 -0
  42. package/dist/chunk-7CUEMLDZ.cjs +6445 -0
  43. package/dist/chunk-7HIASF7S.cjs +814 -0
  44. package/dist/chunk-A6KINLZJ.js +236 -0
  45. package/dist/chunk-AIA52I7T.cjs +543 -0
  46. package/dist/chunk-ANXZFVY2.js +113 -0
  47. package/dist/chunk-AYBXB26F.js +2176 -0
  48. package/dist/chunk-B4TFTDG4.js +449 -0
  49. package/dist/chunk-BE4UJCQT.js +623 -0
  50. package/dist/chunk-BRQJKJGT.cjs +20 -0
  51. package/dist/chunk-C2A5DUMF.cjs +689 -0
  52. package/dist/chunk-C37BHB7N.cjs +636 -0
  53. package/dist/chunk-CBJY23VL.js +126 -0
  54. package/dist/chunk-CIWWXYHZ.cjs +50 -0
  55. package/dist/chunk-CXFDRBQU.cjs +672 -0
  56. package/dist/chunk-D54CNIAJ.cjs +413 -0
  57. package/dist/chunk-DAJXW4KX.js +725 -0
  58. package/dist/chunk-DTGBOSEM.cjs +319 -0
  59. package/dist/chunk-E7JP3BS3.cjs +61 -0
  60. package/dist/chunk-EKBKLK7P.js +1169 -0
  61. package/dist/chunk-EKYL4PE3.cjs +404 -0
  62. package/dist/chunk-EUDQTK7N.cjs +4310 -0
  63. package/dist/chunk-EXKSFGSX.cjs +274 -0
  64. package/dist/chunk-EXUP2BUM.cjs +1173 -0
  65. package/dist/chunk-F43YAA34.js +623 -0
  66. package/dist/chunk-FDSGHPAK.js +130 -0
  67. package/dist/chunk-FEWUHQNM.cjs +144 -0
  68. package/dist/chunk-FGGJQRLZ.js +270 -0
  69. package/dist/chunk-FHP6LXJS.js +415 -0
  70. package/dist/chunk-FJPADH77.cjs +666 -0
  71. package/dist/chunk-FYSPZT4V.cjs +169 -0
  72. package/dist/chunk-GIOYPNTH.js +5575 -0
  73. package/dist/chunk-GJNCFRJU.cjs +125 -0
  74. package/dist/chunk-GMP623FG.cjs +1508 -0
  75. package/dist/chunk-GQHQOPXZ.cjs +5580 -0
  76. package/dist/chunk-GQT4TYKY.cjs +4381 -0
  77. package/dist/chunk-GTU2Z2WW.cjs +262 -0
  78. package/dist/chunk-GYZE55MO.js +2007 -0
  79. package/dist/chunk-GZG4KA4E.js +529 -0
  80. package/dist/chunk-H652NHX5.js +600 -0
  81. package/dist/chunk-HCCQLAA4.cjs +74 -0
  82. package/dist/chunk-HINXWAOD.cjs +1049 -0
  83. package/dist/chunk-HYNTS5CP.js +422 -0
  84. package/dist/chunk-HZSPDCXV.cjs +457 -0
  85. package/dist/chunk-HZTDET3N.js +1399 -0
  86. package/dist/chunk-I6XZ5DZF.cjs +488 -0
  87. package/dist/chunk-ILRBGFVD.cjs +72 -0
  88. package/dist/chunk-IPWSXCCN.js +1183 -0
  89. package/dist/chunk-IUTY5WQ2.cjs +424 -0
  90. package/dist/chunk-IVSZDECV.js +882 -0
  91. package/dist/chunk-IVY74O6C.js +247 -0
  92. package/dist/chunk-IZM5VQZD.js +714 -0
  93. package/dist/chunk-J32ZJZJH.js +554 -0
  94. package/dist/chunk-J6M4FPK5.js +421 -0
  95. package/dist/chunk-JC5YBPSF.cjs +984 -0
  96. package/dist/chunk-JCLBKPMX.js +3813 -0
  97. package/dist/chunk-JD7CIZ33.js +1949 -0
  98. package/dist/chunk-JIYN45TV.cjs +2525 -0
  99. package/dist/chunk-JJBE3TIH.cjs +1189 -0
  100. package/dist/chunk-JX7YL6ZE.js +2252 -0
  101. package/dist/chunk-K4VVR7CN.cjs +2433 -0
  102. package/dist/chunk-KEFNV2WM.cjs +2257 -0
  103. package/dist/chunk-KH4CNH66.cjs +424 -0
  104. package/dist/chunk-KJLB4OPV.js +5731 -0
  105. package/dist/chunk-KKFZ3B6J.cjs +557 -0
  106. package/dist/chunk-KKP7JKN4.cjs +6002 -0
  107. package/dist/chunk-KPJL34Y7.cjs +186 -0
  108. package/dist/chunk-KQCN6AKJ.cjs +3042 -0
  109. package/dist/chunk-KVRSTFNH.cjs +72 -0
  110. package/dist/chunk-LICPB5HZ.cjs +1409 -0
  111. package/dist/chunk-LM2VU56C.cjs +37 -0
  112. package/dist/chunk-M56JSP4A.js +400 -0
  113. package/dist/chunk-MBOOR7X4.js +18 -0
  114. package/dist/chunk-MGE5Z4GS.js +608 -0
  115. package/dist/chunk-MXFUTKCO.js +56 -0
  116. package/dist/chunk-MYY4PMWX.cjs +264 -0
  117. package/dist/chunk-N75IH2HY.js +258 -0
  118. package/dist/chunk-NBMHU6SW.js +669 -0
  119. package/dist/chunk-NG77ATEW.cjs +778 -0
  120. package/dist/chunk-NGKREZ36.js +6384 -0
  121. package/dist/chunk-NHWSN2SD.cjs +718 -0
  122. package/dist/chunk-NV4VMVXU.js +421 -0
  123. package/dist/chunk-NW5G5FBQ.js +215 -0
  124. package/dist/chunk-NXZFOPVD.cjs +5737 -0
  125. package/dist/chunk-OBIYPYYS.cjs +1993 -0
  126. package/dist/chunk-OIQYIIO3.cjs +473 -0
  127. package/dist/chunk-OL46QLBJ.js +61 -0
  128. package/dist/chunk-OMXII44L.js +5386 -0
  129. package/dist/chunk-OR4Q2BGL.cjs +759 -0
  130. package/dist/chunk-OSYNRVOV.cjs +243 -0
  131. package/dist/chunk-PGANYCAG.cjs +220 -0
  132. package/dist/chunk-PHENW4MQ.js +65 -0
  133. package/dist/chunk-PHVRG4I2.js +844 -0
  134. package/dist/chunk-Q56TT7IL.js +483 -0
  135. package/dist/chunk-QPOQ7VPI.js +1491 -0
  136. package/dist/chunk-QPSKHBJP.js +5963 -0
  137. package/dist/chunk-QXH7QDSZ.js +1989 -0
  138. package/dist/chunk-R75BSDH7.cjs +50 -0
  139. package/dist/chunk-RARB3MBR.js +207 -0
  140. package/dist/chunk-RVBHAXFG.js +56160 -0
  141. package/dist/chunk-S3MDHNKB.cjs +490 -0
  142. package/dist/chunk-S4W6Z2MN.js +2426 -0
  143. package/dist/chunk-S6YWHCKV.cjs +410 -0
  144. package/dist/chunk-SIEXCILW.js +229 -0
  145. package/dist/chunk-SJBGLS25.cjs +2196 -0
  146. package/dist/chunk-SLU6UPJI.cjs +410 -0
  147. package/dist/chunk-SMIWS6DE.cjs +212 -0
  148. package/dist/chunk-T2QCTZMO.js +811 -0
  149. package/dist/chunk-T5J7ZKP3.cjs +4885 -0
  150. package/dist/chunk-TDCNJHWO.js +341 -0
  151. package/dist/chunk-TG7O4WBC.js +406 -0
  152. package/dist/chunk-THCK6ECW.js +2085 -0
  153. package/dist/chunk-TJHVSBP2.js +439 -0
  154. package/dist/chunk-TVHSPJ4N.cjs +606 -0
  155. package/dist/chunk-U44IKGG7.cjs +5390 -0
  156. package/dist/chunk-UJXISJBN.js +487 -0
  157. package/dist/chunk-UM6C3CGK.js +4375 -0
  158. package/dist/chunk-UMABK6SI.js +686 -0
  159. package/dist/chunk-UOIGFQXC.cjs +9750 -0
  160. package/dist/chunk-URG2SJLK.js +2521 -0
  161. package/dist/chunk-V6MKC2FZ.js +979 -0
  162. package/dist/chunk-VECQYRXL.js +474 -0
  163. package/dist/chunk-VJ3L7CHT.cjs +169 -0
  164. package/dist/chunk-VMLKSV26.js +1216 -0
  165. package/dist/chunk-VVKVQZI6.js +55 -0
  166. package/dist/chunk-W6RW64BB.cjs +1219 -0
  167. package/dist/chunk-W7VDOASB.cjs +639 -0
  168. package/dist/chunk-WDT3JTGM.cjs +483 -0
  169. package/dist/chunk-WJIHFLMJ.js +404 -0
  170. package/dist/chunk-WKX5AMOY.js +309 -0
  171. package/dist/chunk-WNNE3PO3.js +34 -0
  172. package/dist/chunk-WRKUDAZJ.js +3038 -0
  173. package/dist/chunk-WRLUBRKS.cjs +1943 -0
  174. package/dist/chunk-WRNEH5MO.js +3169 -0
  175. package/dist/chunk-WRWEX5ZF.js +658 -0
  176. package/dist/chunk-X3GJPRVK.cjs +3246 -0
  177. package/dist/chunk-XHIV6326.cjs +793 -0
  178. package/dist/chunk-XIVIE43A.cjs +729 -0
  179. package/dist/chunk-XJAN7CZG.cjs +432 -0
  180. package/dist/chunk-XKTPFXGA.js +164 -0
  181. package/dist/chunk-XL6INWKT.js +121 -0
  182. package/dist/chunk-XSFNHP2E.js +632 -0
  183. package/dist/chunk-XT6JY5W5.js +9684 -0
  184. package/dist/chunk-XUILI4KB.cjs +430 -0
  185. package/dist/chunk-XUUVDHIF.cjs +3962 -0
  186. package/dist/chunk-YF2I3MV3.js +46 -0
  187. package/dist/chunk-YIMN575O.js +4847 -0
  188. package/dist/chunk-YIVFJNYV.js +176 -0
  189. package/dist/chunk-YKGPCZEE.cjs +237 -0
  190. package/dist/chunk-YN6V7R3L.cjs +327 -0
  191. package/dist/chunk-YQELFNJV.js +39 -0
  192. package/dist/chunk-YYXH45E2.js +426 -0
  193. package/dist/chunk-ZBQXLH2L.js +756 -0
  194. package/dist/chunk-ZDSYWBIE.cjs +69 -0
  195. package/dist/chunk-ZU7NIRT6.js +325 -0
  196. package/dist/chunk-ZZ7RO2UQ.js +1243 -0
  197. package/dist/chunk-ZZEI7MV4.js +778 -0
  198. package/dist/cli/holoscript-runner.cjs +2255 -0
  199. package/dist/cli/holoscript-runner.js +2230 -0
  200. package/dist/codebase/index.cjs +336 -0
  201. package/dist/codebase/index.js +331 -0
  202. package/dist/compiler/agent-inference.cjs +31 -0
  203. package/dist/compiler/agent-inference.js +8 -0
  204. package/dist/compiler/android-xr.cjs +24 -0
  205. package/dist/compiler/android-xr.js +14 -0
  206. package/dist/compiler/android.cjs +24 -0
  207. package/dist/compiler/android.js +14 -0
  208. package/dist/compiler/ar.cjs +23 -0
  209. package/dist/compiler/ar.js +11 -0
  210. package/dist/compiler/babylon.cjs +21 -0
  211. package/dist/compiler/babylon.js +15 -0
  212. package/dist/compiler/business-quest.cjs +43 -0
  213. package/dist/compiler/business-quest.js +4 -0
  214. package/dist/compiler/coco.cjs +27 -0
  215. package/dist/compiler/coco.js +4 -0
  216. package/dist/compiler/context.cjs +25 -0
  217. package/dist/compiler/context.d.ts +28 -0
  218. package/dist/compiler/context.js +8 -0
  219. package/dist/compiler/domain-block-utils.cjs +605 -0
  220. package/dist/compiler/domain-block-utils.js +11 -0
  221. package/dist/compiler/dtdl.cjs +27 -0
  222. package/dist/compiler/dtdl.js +11 -0
  223. package/dist/compiler/gltf-pipeline.cjs +39 -0
  224. package/dist/compiler/gltf-pipeline.js +4 -0
  225. package/dist/compiler/godot.cjs +18 -0
  226. package/dist/compiler/godot.js +12 -0
  227. package/dist/compiler/incremental.cjs +34 -0
  228. package/dist/compiler/incremental.js +9 -0
  229. package/dist/compiler/index.cjs +5860 -0
  230. package/dist/compiler/index.d.ts +322 -21
  231. package/dist/compiler/index.js +5525 -0
  232. package/dist/compiler/ios.cjs +23 -0
  233. package/dist/compiler/ios.js +13 -0
  234. package/dist/compiler/llm-provider-capabilities.cjs +25 -0
  235. package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
  236. package/dist/compiler/llm-provider-capabilities.js +8 -0
  237. package/dist/compiler/multi-layer.cjs +24 -0
  238. package/dist/compiler/multi-layer.js +15 -0
  239. package/dist/compiler/nodetoy.cjs +23 -0
  240. package/dist/compiler/nodetoy.js +4 -0
  241. package/dist/compiler/openxr.cjs +19 -0
  242. package/dist/compiler/openxr.js +13 -0
  243. package/dist/compiler/playcanvas.cjs +19 -0
  244. package/dist/compiler/playcanvas.js +13 -0
  245. package/dist/compiler/r3f.cjs +38 -0
  246. package/dist/compiler/r3f.d.ts +22 -0
  247. package/dist/compiler/r3f.js +16 -0
  248. package/dist/compiler/remotion.cjs +23 -0
  249. package/dist/compiler/remotion.js +4 -0
  250. package/dist/compiler/reproducibility.cjs +39 -0
  251. package/dist/compiler/reproducibility.js +4 -0
  252. package/dist/compiler/sdf.cjs +24 -0
  253. package/dist/compiler/sdf.js +12 -0
  254. package/dist/compiler/semantic-scene.cjs +31 -0
  255. package/dist/compiler/semantic-scene.js +4 -0
  256. package/dist/compiler/state.cjs +21 -0
  257. package/dist/compiler/state.js +11 -0
  258. package/dist/compiler/trait-composition.cjs +30 -0
  259. package/dist/compiler/trait-composition.js +9 -0
  260. package/dist/compiler/unity.cjs +19 -0
  261. package/dist/compiler/unity.js +13 -0
  262. package/dist/compiler/unreal.cjs +23 -0
  263. package/dist/compiler/unreal.js +13 -0
  264. package/dist/compiler/urdf.cjs +52 -0
  265. package/dist/compiler/urdf.js +12 -0
  266. package/dist/compiler/usd-physics.cjs +26 -0
  267. package/dist/compiler/usd-physics.js +9 -0
  268. package/dist/compiler/visionos.cjs +19 -0
  269. package/dist/compiler/visionos.js +13 -0
  270. package/dist/compiler/vrchat.cjs +22 -0
  271. package/dist/compiler/vrchat.js +12 -0
  272. package/dist/compiler/vrr.cjs +24 -0
  273. package/dist/compiler/vrr.js +12 -0
  274. package/dist/compiler/wasm.cjs +36 -0
  275. package/dist/compiler/wasm.js +12 -0
  276. package/dist/compiler/webgpu.cjs +18 -0
  277. package/dist/compiler/webgpu.js +12 -0
  278. package/dist/coordinators/index.cjs +1266 -0
  279. package/dist/coordinators/index.d.ts +72 -1
  280. package/dist/coordinators/index.js +1259 -0
  281. package/dist/debugger.cjs +24 -0
  282. package/dist/debugger.js +11 -0
  283. package/dist/entries/interop.cjs +64 -0
  284. package/dist/entries/interop.js +7 -0
  285. package/dist/entries/scripting.cjs +55 -0
  286. package/dist/entries/scripting.js +10 -0
  287. package/dist/hololand/index.cjs +146 -0
  288. package/dist/hololand/index.d.ts +70 -0
  289. package/dist/hololand/index.js +5 -0
  290. package/dist/index.cjs +43233 -0
  291. package/dist/index.d.ts +976 -21
  292. package/dist/index.js +39995 -0
  293. package/dist/math/tropical-spmv.cjs +45 -0
  294. package/dist/math/tropical-spmv.js +4 -0
  295. package/dist/math/vec3.cjs +57 -0
  296. package/dist/math/vec3.js +4 -0
  297. package/dist/ml-dsa-FSKBTE3W.cjs +1265 -0
  298. package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
  299. package/dist/paper-0c-spike/index.cjs +150 -0
  300. package/dist/paper-0c-spike/index.js +141 -0
  301. package/dist/parser.cjs +61 -0
  302. package/dist/parser.d.ts +11 -0
  303. package/dist/parser.js +12 -0
  304. package/dist/playwright-3AT3AKTV.cjs +98673 -0
  305. package/dist/playwright-VZPDVUEQ.js +98660 -0
  306. package/dist/reconstruction/index.cjs +153 -0
  307. package/dist/reconstruction/index.d.ts +29 -2
  308. package/dist/reconstruction/index.js +8 -0
  309. package/dist/runtime.cjs +316 -0
  310. package/dist/runtime.d.ts +61 -0
  311. package/dist/runtime.js +31 -0
  312. package/dist/self-improvement/index.cjs +563 -0
  313. package/dist/self-improvement/index.js +545 -0
  314. package/dist/storage/index.cjs +38 -0
  315. package/dist/storage/index.js +5 -0
  316. package/dist/testing.cjs +25 -0
  317. package/dist/testing.d.ts +70 -0
  318. package/dist/testing.js +4 -0
  319. package/dist/traitDocs/traitDocs.cjs +33 -0
  320. package/dist/traitDocs/traitDocs.js +7 -0
  321. package/dist/traits/botanical-lotus.cjs +41 -0
  322. package/dist/traits/botanical-lotus.d.ts +172 -0
  323. package/dist/traits/botanical-lotus.js +4 -0
  324. package/dist/traits/engines/index.cjs +520 -0
  325. package/dist/traits/engines/index.js +380 -0
  326. package/dist/traits/index.cjs +24409 -0
  327. package/dist/traits/index.d.ts +171 -35
  328. package/dist/traits/index.js +21634 -0
  329. package/dist/traits/simulation-solver-factory.cjs +13 -0
  330. package/dist/traits/simulation-solver-factory.d.ts +23 -0
  331. package/dist/traits/simulation-solver-factory.js +4 -0
  332. package/dist/traits/webcam-gaze.cjs +35 -0
  333. package/dist/traits/webcam-gaze.d.ts +17 -0
  334. package/dist/traits/webcam-gaze.js +4 -0
  335. package/dist/type-checker.cjs +19 -0
  336. package/dist/type-checker.js +6 -0
  337. package/dist/world/index.cjs +947 -0
  338. package/dist/world/index.d.ts +147 -0
  339. package/dist/world/index.js +939 -0
  340. package/dist/world-model/index.cjs +1446 -0
  341. package/dist/world-model/index.d.ts +119 -0
  342. package/dist/world-model/index.js +1414 -0
  343. package/dist/wot/index.cjs +29 -0
  344. package/dist/wot/index.js +4 -0
  345. package/package.json +93 -49
@@ -0,0 +1,947 @@
1
+ 'use strict';
2
+
3
+ require('../chunk-HCCQLAA4.cjs');
4
+
5
+ // src/world/WorldGeneratorAdapter.ts
6
+ var WorldAdapterRegistry = class {
7
+ constructor() {
8
+ this.adapters = /* @__PURE__ */ new Map();
9
+ }
10
+ register(adapter) {
11
+ this.adapters.set(adapter.id, adapter);
12
+ }
13
+ get(engineId) {
14
+ const adapter = this.adapters.get(engineId);
15
+ if (!adapter) {
16
+ throw new Error(
17
+ `[WorldAdapterRegistry] No adapter registered for engine '${engineId}'. Registered: ${[...this.adapters.keys()].join(", ") || "(none)"}`
18
+ );
19
+ }
20
+ return adapter;
21
+ }
22
+ has(engineId) {
23
+ return this.adapters.has(engineId);
24
+ }
25
+ list() {
26
+ return [...this.adapters.keys()];
27
+ }
28
+ };
29
+ var worldAdapterRegistry = new WorldAdapterRegistry();
30
+
31
+ // src/world/adapters/SovereignWorldAdapter.ts
32
+ var QUALITY_MAP = {
33
+ low: "draft",
34
+ medium: "standard",
35
+ high: "high",
36
+ ultra: "ultra"
37
+ };
38
+ var FORMAT_MAP = {
39
+ "3dgs": "splat",
40
+ mesh: "mesh",
41
+ both: "both",
42
+ neural_field: "neural_field"
43
+ };
44
+ var DEFAULT_BASE_URL = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_BASE_URL || "https://api.holoscript.net/sovereign";
45
+ var DEFAULT_API_KEY = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_API_KEY || "";
46
+ var DEFAULT_TIMEOUT_MS = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS ? parseInt(process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS, 10) : 3e5;
47
+ var SovereignWorldAdapter = class {
48
+ constructor(options = {}) {
49
+ this.id = "sovereign-3d";
50
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\/$/, "");
51
+ this.apiKey = options.apiKey ?? DEFAULT_API_KEY;
52
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
53
+ this.pollIntervalMs = options.pollIntervalMs ?? 2e3;
54
+ }
55
+ // ---------------------------------------------------------------------------
56
+ // PUBLIC API
57
+ // ---------------------------------------------------------------------------
58
+ async generate(req) {
59
+ const jobId = await this.submitJob(req);
60
+ return this.waitForCompletion(jobId);
61
+ }
62
+ async getProgress(generationId) {
63
+ const job = await this.fetchJob(generationId);
64
+ return job.progress ?? (job.status === "done" ? 1 : 0);
65
+ }
66
+ async cancel(generationId) {
67
+ await this.request(`/api/jobs/${generationId}/cancel`, { method: "POST" });
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // PRIVATE HELPERS
71
+ // ---------------------------------------------------------------------------
72
+ async submitJob(req) {
73
+ const inputImages = req.input_images?.join(",") ?? req.input_image;
74
+ const payload = {
75
+ prompt: req.prompt,
76
+ output_format: FORMAT_MAP[req.format] ?? "splat",
77
+ quality_preset: QUALITY_MAP[req.quality] ?? "standard",
78
+ ...inputImages ? { input_images: inputImages } : {},
79
+ ...req.seed !== void 0 ? { seed: req.seed } : {},
80
+ ...req.navEnabled !== void 0 ? { nav_enabled: req.navEnabled } : {},
81
+ ...req.interactiveMode !== void 0 ? { interactive_mode: req.interactiveMode } : {}
82
+ };
83
+ const response = await this.request("/api/generate", {
84
+ method: "POST",
85
+ body: JSON.stringify(payload)
86
+ });
87
+ if (!response.job_id) {
88
+ throw new Error("[SovereignWorldAdapter] /api/generate did not return a job_id");
89
+ }
90
+ return response.job_id;
91
+ }
92
+ async waitForCompletion(jobId) {
93
+ const deadline = Date.now() + this.timeoutMs;
94
+ while (Date.now() < deadline) {
95
+ const job = await this.fetchJob(jobId);
96
+ if (job.status === "done") {
97
+ return this.mapResult(job);
98
+ }
99
+ if (job.status === "error") {
100
+ throw new Error(
101
+ `[SovereignWorldAdapter] Job ${jobId} failed: ${job.error ?? "unknown error"}`
102
+ );
103
+ }
104
+ await this.sleep(this.pollIntervalMs);
105
+ }
106
+ throw new Error(
107
+ `[SovereignWorldAdapter] Job ${jobId} timed out after ${this.timeoutMs}ms`
108
+ );
109
+ }
110
+ async fetchJob(jobId) {
111
+ return this.request(`/api/jobs/${jobId}`);
112
+ }
113
+ mapResult(job) {
114
+ if (!job.asset_url) {
115
+ throw new Error(
116
+ `[SovereignWorldAdapter] Job ${job.job_id} completed but returned no asset_url`
117
+ );
118
+ }
119
+ const rawMeta = job.metadata ?? {};
120
+ const bounds = rawMeta.bounds ?? [-10, 0, -10, 10, 5, 10];
121
+ const metadata = {
122
+ format: job.asset_url.endsWith(".glb") ? "mesh" : "3dgs",
123
+ bounds,
124
+ ...rawMeta.agent_start ? { agentStart: rawMeta.agent_start } : {},
125
+ ...rawMeta.waypoints ? { waypoints: rawMeta.waypoints } : {},
126
+ ...rawMeta.splat_count ? { splatCount: rawMeta.splat_count } : {},
127
+ ...rawMeta.triangle_count ? { triangleCount: rawMeta.triangle_count } : {},
128
+ ...rawMeta.generation_ms ? { generationMs: rawMeta.generation_ms } : {}
129
+ };
130
+ return {
131
+ generationId: job.job_id,
132
+ assetUrl: job.asset_url,
133
+ ...job.navmesh_url ? { navmeshUrl: job.navmesh_url } : {},
134
+ ...job.point_cloud_url ? { pointCloudUrl: job.point_cloud_url } : {},
135
+ metadata
136
+ };
137
+ }
138
+ async request(path, init = {}) {
139
+ const url = `${this.baseUrl}${path}`;
140
+ const headers = {
141
+ "Content-Type": "application/json",
142
+ ...this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
143
+ };
144
+ const res = await fetch(url, { ...init, headers: { ...headers, ...init.headers ?? {} } });
145
+ if (!res.ok) {
146
+ const text = await res.text().catch(() => "");
147
+ throw new Error(
148
+ `[SovereignWorldAdapter] HTTP ${res.status} at ${path}${text ? ": " + text : ""}`
149
+ );
150
+ }
151
+ return res.json();
152
+ }
153
+ sleep(ms) {
154
+ return new Promise((resolve) => setTimeout(resolve, ms));
155
+ }
156
+ };
157
+
158
+ // src/world/adapters/Sovereign3DAdapter.ts
159
+ var QUALITY_MAP2 = {
160
+ low: "draft",
161
+ medium: "standard",
162
+ high: "high",
163
+ ultra: "ultra"
164
+ };
165
+ var FORMAT_MAP2 = {
166
+ "3dgs": "splat",
167
+ mesh: "mesh",
168
+ both: "both",
169
+ neural_field: "neural_field"
170
+ };
171
+ var DEFAULT_BASE_URL2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_BASE_URL || "https://api.holoscript.net/sovereign";
172
+ var DEFAULT_API_KEY2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_API_KEY || "";
173
+ var DEFAULT_TIMEOUT_MS2 = typeof process !== "undefined" && process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS ? parseInt(process.env.HOLOSCRIPT_SOVEREIGN_TIMEOUT_MS, 10) : 3e5;
174
+ var Sovereign3DAdapter = class {
175
+ constructor(options = {}) {
176
+ this.id = "sovereign-3d";
177
+ this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL2).replace(/\/$/, "");
178
+ this.apiKey = options.apiKey ?? DEFAULT_API_KEY2;
179
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS2;
180
+ this.pollIntervalMs = options.pollIntervalMs ?? 2e3;
181
+ this.mockMode = Boolean(options.mockMode);
182
+ this.mockLatencyMs = Math.max(0, options.mockLatencyMs ?? 10);
183
+ }
184
+ // ---------------------------------------------------------------------------
185
+ // PUBLIC API
186
+ // ---------------------------------------------------------------------------
187
+ async generate(req) {
188
+ if (this.mockMode) {
189
+ await this.sleep(this.mockLatencyMs);
190
+ return this.mockResult(req);
191
+ }
192
+ const jobId = await this.submitJob(req);
193
+ return this.waitForCompletion(jobId);
194
+ }
195
+ async getProgress(generationId) {
196
+ if (this.mockMode || generationId.startsWith("mock_")) {
197
+ return 1;
198
+ }
199
+ const job = await this.fetchJob(generationId);
200
+ return job.progress ?? (job.status === "done" ? 1 : 0);
201
+ }
202
+ async cancel(generationId) {
203
+ if (this.mockMode || generationId.startsWith("mock_")) return;
204
+ await this.request(`/api/jobs/${generationId}/cancel`, { method: "POST" });
205
+ }
206
+ // ---------------------------------------------------------------------------
207
+ // PRIVATE HELPERS
208
+ // ---------------------------------------------------------------------------
209
+ async submitJob(req) {
210
+ const inputImages = req.input_images?.join(",") ?? req.input_image;
211
+ const payload = {
212
+ prompt: req.prompt,
213
+ output_format: FORMAT_MAP2[req.format] ?? "splat",
214
+ quality_preset: QUALITY_MAP2[req.quality] ?? "standard",
215
+ ...inputImages ? { input_images: inputImages } : {},
216
+ ...req.seed !== void 0 ? { seed: req.seed } : {},
217
+ ...req.navEnabled !== void 0 ? { nav_enabled: req.navEnabled } : {},
218
+ ...req.interactiveMode !== void 0 ? { interactive_mode: req.interactiveMode } : {}
219
+ };
220
+ const response = await this.request("/api/generate", {
221
+ method: "POST",
222
+ body: JSON.stringify(payload)
223
+ });
224
+ if (!response.job_id) {
225
+ throw new Error("[Sovereign3DAdapter] /api/generate did not return a job_id");
226
+ }
227
+ return response.job_id;
228
+ }
229
+ async waitForCompletion(jobId) {
230
+ const deadline = Date.now() + this.timeoutMs;
231
+ while (Date.now() < deadline) {
232
+ const job = await this.fetchJob(jobId);
233
+ if (job.status === "done") {
234
+ return this.mapResult(job);
235
+ }
236
+ if (job.status === "error") {
237
+ throw new Error(
238
+ `[Sovereign3DAdapter] Job ${jobId} failed: ${job.error ?? "unknown error"}`
239
+ );
240
+ }
241
+ await this.sleep(this.pollIntervalMs);
242
+ }
243
+ throw new Error(
244
+ `[Sovereign3DAdapter] Job ${jobId} timed out after ${this.timeoutMs}ms`
245
+ );
246
+ }
247
+ async fetchJob(jobId) {
248
+ return this.request(`/api/jobs/${jobId}`);
249
+ }
250
+ mapResult(job) {
251
+ if (!job.asset_url) {
252
+ throw new Error(
253
+ `[Sovereign3DAdapter] Job ${job.job_id} completed but returned no asset_url`
254
+ );
255
+ }
256
+ const rawMeta = job.metadata ?? {};
257
+ const bounds = rawMeta.bounds ?? [-10, 0, -10, 10, 5, 10];
258
+ const metadata = {
259
+ format: job.asset_url.endsWith(".glb") ? "mesh" : job.asset_url.includes("neural") ? "neural_field" : "3dgs",
260
+ bounds,
261
+ ...rawMeta.agent_start ? { agentStart: rawMeta.agent_start } : {},
262
+ ...rawMeta.waypoints ? { waypoints: rawMeta.waypoints } : {},
263
+ ...rawMeta.splat_count ? { splatCount: rawMeta.splat_count } : {},
264
+ ...rawMeta.triangle_count ? { triangleCount: rawMeta.triangle_count } : {},
265
+ ...rawMeta.generation_ms ? { generationMs: rawMeta.generation_ms } : {}
266
+ };
267
+ return {
268
+ generationId: job.job_id,
269
+ assetUrl: job.asset_url,
270
+ ...job.navmesh_url ? { navmeshUrl: job.navmesh_url } : {},
271
+ ...job.point_cloud_url ? { pointCloudUrl: job.point_cloud_url } : {},
272
+ metadata
273
+ };
274
+ }
275
+ async request(path, init = {}) {
276
+ const url = `${this.baseUrl}${path}`;
277
+ const headers = {
278
+ "Content-Type": "application/json",
279
+ ...this.apiKey ? { Authorization: `Bearer ${this.apiKey}` } : {}
280
+ };
281
+ const res = await fetch(url, { ...init, headers: { ...headers, ...init.headers ?? {} } });
282
+ if (!res.ok) {
283
+ const text = await res.text().catch(() => "");
284
+ throw new Error(
285
+ `[Sovereign3DAdapter] HTTP ${res.status} at ${path}${text ? ": " + text : ""}`
286
+ );
287
+ }
288
+ return res.json();
289
+ }
290
+ mockResult(req) {
291
+ const generationId = `mock_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
292
+ const basePath = `${this.baseUrl}/mock/${generationId}`;
293
+ const metadata = {
294
+ format: req.format,
295
+ bounds: [-20, 0, -20, 20, 12, 20],
296
+ agentStart: [0, 0, 0],
297
+ waypoints: [
298
+ [0, 0, 0],
299
+ [5, 0, 5],
300
+ [10, 0, 0]
301
+ ],
302
+ splatCount: req.format === "mesh" ? void 0 : 25e4,
303
+ triangleCount: req.format === "3dgs" ? void 0 : 12e4,
304
+ generationMs: this.mockLatencyMs
305
+ };
306
+ const assetUrl = req.format === "mesh" ? `${basePath}/world.glb` : req.format === "neural_field" ? `${basePath}/world.neural` : `${basePath}/world.splat`;
307
+ return {
308
+ generationId,
309
+ assetUrl,
310
+ ...req.navEnabled ? { navmeshUrl: `${basePath}/navmesh.glb` } : {},
311
+ ...req.format === "both" ? { pointCloudUrl: `${basePath}/world.ply` } : {},
312
+ metadata
313
+ };
314
+ }
315
+ sleep(ms) {
316
+ return new Promise((resolve) => setTimeout(resolve, ms));
317
+ }
318
+ };
319
+
320
+ // src/world/adapters/SovereignGeneratorAdapter.ts
321
+ var DEFAULT_LOCAL_ENDPOINT = typeof process !== "undefined" && process.env.BRITTNEY_LOCAL_ENDPOINT || typeof process !== "undefined" && process.env.OLLAMA_HOST || "http://localhost:11434";
322
+ var DEFAULT_LOCAL_MODEL = typeof process !== "undefined" && process.env.BRITTNEY_MODEL || "brittney-qwen-v23:latest";
323
+ var DEFAULT_CLOUD_ENDPOINT = typeof process !== "undefined" && process.env.BRITTNEY_SERVICE_URL || "";
324
+ var DEFAULT_CLOUD_API_KEY = typeof process !== "undefined" && process.env.BRITTNEY_API_KEY || "";
325
+ var DEFAULT_CLOUD_MODEL = "brittney-standard";
326
+ var DEFAULT_MAX_TOKENS = 4096;
327
+ var DEFAULT_TIMEOUT_MS3 = 12e4;
328
+ var SOVEREIGN_GENERATE_SYSTEM_PROMPT = `You are a HoloScript code generator running locally (sovereign, no cloud).
329
+ Output ONLY valid HoloScript code, no markdown, no explanation.
330
+
331
+ HoloScript syntax:
332
+ object "Name" {
333
+ geometry: "cube" | "sphere" | "cylinder" | "plane" | "cone"
334
+ position: [x, y, z]
335
+ rotation: [x, y, z]
336
+ scale: [x, y, z] | number
337
+ @color(red) @emissive(cyan) @grabbable @physics @collidable
338
+ @clickable @hoverable @networked @persistent @animated
339
+ }
340
+
341
+ composition "SceneName" {
342
+ environment {
343
+ skybox: "default"
344
+ ambient_light: 0.5
345
+ }
346
+ object "Obj1" { ... }
347
+ }
348
+
349
+ Traits available: @grabbable, @throwable, @clickable, @hoverable, @draggable,
350
+ @scalable, @physics, @collidable, @gravity, @glowing, @emissive, @transparent,
351
+ @reflective, @animated, @billboard, @networked, @synced, @persistent, @owned,
352
+ @host_only, @stackable, @attachable, @equippable, @consumable, @destructible,
353
+ @anchor, @tracked, @world_locked, @hand_tracked, @eye_tracked, @spatial_audio,
354
+ @ambient, @voice_activated, @state, @reactive, @observable, @computed,
355
+ @shareable, @collaborative, @trigger, @pointable`;
356
+ var SOVEREIGN_SUGGEST_SYSTEM_PROMPT = `You are a HoloScript trait suggestion engine running locally (sovereign, no cloud).
357
+ Given a natural language description of an object or scene, suggest appropriate HoloScript traits.
358
+
359
+ Available traits: @grabbable, @throwable, @clickable, @hoverable, @draggable, @scalable,
360
+ @physics, @collidable, @gravity, @glowing, @emissive, @transparent, @reflective,
361
+ @animated, @billboard, @networked, @synced, @persistent, @owned, @host_only,
362
+ @stackable, @attachable, @equippable, @consumable, @destructible, @anchor,
363
+ @tracked, @world_locked, @hand_tracked, @eye_tracked, @spatial_audio, @ambient,
364
+ @voice_activated, @state, @reactive, @observable, @computed, @shareable,
365
+ @collaborative, @trigger, @pointable, @state, @reactive
366
+
367
+ Output JSON only: { "traits": ["@trait1", "@trait2"], "reasoning": { "@trait1": "reason", "@trait2": "reason" }, "confidence": 0.85 }`;
368
+ var TRAIT_KEYWORDS = {
369
+ "pick up": ["@grabbable"],
370
+ grab: ["@grabbable"],
371
+ hold: ["@grabbable", "@holdable"],
372
+ throw: ["@grabbable", "@throwable"],
373
+ click: ["@clickable"],
374
+ point: ["@pointable"],
375
+ hover: ["@hoverable"],
376
+ drag: ["@draggable"],
377
+ scale: ["@scalable"],
378
+ resize: ["@scalable"],
379
+ collide: ["@collidable"],
380
+ bounce: ["@collidable", "@physics"],
381
+ physics: ["@physics", "@collidable"],
382
+ fall: ["@physics", "@gravity"],
383
+ gravity: ["@gravity"],
384
+ trigger: ["@trigger"],
385
+ glow: ["@glowing"],
386
+ light: ["@emissive"],
387
+ transparent: ["@transparent"],
388
+ "see through": ["@transparent"],
389
+ reflect: ["@reflective"],
390
+ mirror: ["@reflective"],
391
+ animate: ["@animated"],
392
+ spin: ["@animated"],
393
+ rotate: ["@animated"],
394
+ billboard: ["@billboard"],
395
+ "face camera": ["@billboard"],
396
+ multiplayer: ["@networked", "@synced"],
397
+ sync: ["@networked", "@synced"],
398
+ network: ["@networked"],
399
+ save: ["@persistent"],
400
+ persist: ["@persistent"],
401
+ own: ["@owned"],
402
+ host: ["@host_only"],
403
+ stack: ["@stackable"],
404
+ attach: ["@attachable"],
405
+ equip: ["@equippable"],
406
+ wear: ["@equippable"],
407
+ consume: ["@consumable"],
408
+ eat: ["@consumable"],
409
+ drink: ["@consumable"],
410
+ destroy: ["@destructible"],
411
+ break: ["@destructible"],
412
+ anchor: ["@anchor"],
413
+ track: ["@tracked"],
414
+ "world lock": ["@world_locked"],
415
+ "hand track": ["@hand_tracked"],
416
+ "eye track": ["@eye_tracked"],
417
+ sound: ["@spatial_audio"],
418
+ audio: ["@spatial_audio"],
419
+ ambient: ["@ambient"],
420
+ voice: ["@voice_activated"],
421
+ speak: ["@voice_activated"],
422
+ state: ["@state", "@reactive"],
423
+ react: ["@reactive"],
424
+ observe: ["@observable"],
425
+ compute: ["@computed"],
426
+ share: ["@shareable"],
427
+ collaborate: ["@collaborative"],
428
+ tweet: ["@tweetable"]
429
+ };
430
+ var SovereignGeneratorAdapter = class {
431
+ constructor(options = {}) {
432
+ this.id = "sovereign-generator";
433
+ this.localEndpoint = (options.localEndpoint ?? DEFAULT_LOCAL_ENDPOINT).replace(/\/$/, "");
434
+ this.cloudEndpoint = (options.cloudEndpoint ?? DEFAULT_CLOUD_ENDPOINT).replace(/\/$/, "");
435
+ this.cloudApiKey = options.cloudApiKey ?? DEFAULT_CLOUD_API_KEY;
436
+ this.localModel = options.localModel ?? DEFAULT_LOCAL_MODEL;
437
+ this.cloudModel = options.cloudModel ?? DEFAULT_CLOUD_MODEL;
438
+ this.maxTokens = options.maxTokens ?? DEFAULT_MAX_TOKENS;
439
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS3;
440
+ this.offlineOnly = options.offlineOnly ?? false;
441
+ this.mockMode = options.mockMode ?? false;
442
+ this.mockLatencyMs = Math.max(0, options.mockLatencyMs ?? 5);
443
+ }
444
+ // ---------------------------------------------------------------------------
445
+ // PUBLIC API — suggestTraits
446
+ // ---------------------------------------------------------------------------
447
+ /**
448
+ * Suggest HoloScript traits for a natural language description.
449
+ *
450
+ * Resolution order:
451
+ * 1. Local Brittney (Ollama/WebLLM) — sovereign, offline-capable
452
+ * 2. Cloud Brittney — if online and not offlineOnly
453
+ * 3. Keyword fallback — deterministic, no LLM needed
454
+ */
455
+ async suggestTraits(description, context) {
456
+ if (this.mockMode) {
457
+ await this.sleep(this.mockLatencyMs);
458
+ return this.keywordSuggestTraits(description, context, "mock");
459
+ }
460
+ try {
461
+ const localResult = await this.localSuggestTraits(description, context);
462
+ if (localResult) {
463
+ return { ...localResult, metadata: { source: "sovereign-local" } };
464
+ }
465
+ } catch {
466
+ }
467
+ if (!this.offlineOnly && this.cloudEndpoint) {
468
+ try {
469
+ const cloudResult = await this.cloudSuggestTraits(description, context);
470
+ if (cloudResult) {
471
+ return { ...cloudResult, metadata: { source: "sovereign-cloud" } };
472
+ }
473
+ } catch {
474
+ }
475
+ }
476
+ return this.keywordSuggestTraits(description, context, "keyword-fallback");
477
+ }
478
+ // ---------------------------------------------------------------------------
479
+ // PUBLIC API — generateObject
480
+ // ---------------------------------------------------------------------------
481
+ /**
482
+ * Generate a HoloScript object from natural language.
483
+ *
484
+ * Resolution order mirrors suggestTraits:
485
+ * 1. Local Brittney (sovereign)
486
+ * 2. Cloud Brittney
487
+ * 3. Keyword/template fallback
488
+ */
489
+ async generateObject(description) {
490
+ if (this.mockMode) {
491
+ await this.sleep(this.mockLatencyMs);
492
+ return this.templateGenerateObject(description, "mock");
493
+ }
494
+ try {
495
+ const localResult = await this.localGenerate(description, "object");
496
+ if (localResult) {
497
+ return {
498
+ code: localResult,
499
+ metadata: {
500
+ description,
501
+ traits: this.extractTraitsFromCode(localResult),
502
+ geometry: this.extractGeometryFromCode(localResult),
503
+ source: "sovereign-local"
504
+ }
505
+ };
506
+ }
507
+ } catch {
508
+ }
509
+ if (!this.offlineOnly && this.cloudEndpoint) {
510
+ try {
511
+ const cloudResult = await this.cloudGenerate(description, "object");
512
+ if (cloudResult) {
513
+ return {
514
+ code: cloudResult,
515
+ metadata: {
516
+ description,
517
+ traits: this.extractTraitsFromCode(cloudResult),
518
+ geometry: this.extractGeometryFromCode(cloudResult),
519
+ source: "sovereign-cloud"
520
+ }
521
+ };
522
+ }
523
+ } catch {
524
+ }
525
+ }
526
+ return this.templateGenerateObject(description, "keyword-fallback");
527
+ }
528
+ // ---------------------------------------------------------------------------
529
+ // PUBLIC API — generateScene
530
+ // ---------------------------------------------------------------------------
531
+ /**
532
+ * Generate a complete HoloScript composition from natural language.
533
+ */
534
+ async generateScene(description) {
535
+ if (this.mockMode) {
536
+ await this.sleep(this.mockLatencyMs);
537
+ return this.templateGenerateScene(description, "mock");
538
+ }
539
+ try {
540
+ const localResult = await this.localGenerate(description, "scene");
541
+ if (localResult) {
542
+ return {
543
+ code: localResult,
544
+ metadata: {
545
+ description,
546
+ objectCount: this.countObjects(localResult),
547
+ traits: this.extractTraitsFromCode(localResult),
548
+ source: "sovereign-local"
549
+ }
550
+ };
551
+ }
552
+ } catch {
553
+ }
554
+ if (!this.offlineOnly && this.cloudEndpoint) {
555
+ try {
556
+ const cloudResult = await this.cloudGenerate(description, "scene");
557
+ if (cloudResult) {
558
+ return {
559
+ code: cloudResult,
560
+ metadata: {
561
+ description,
562
+ objectCount: this.countObjects(cloudResult),
563
+ traits: this.extractTraitsFromCode(cloudResult),
564
+ source: "sovereign-cloud"
565
+ }
566
+ };
567
+ }
568
+ } catch {
569
+ }
570
+ }
571
+ return this.templateGenerateScene(description, "keyword-fallback");
572
+ }
573
+ // ---------------------------------------------------------------------------
574
+ // LOCAL BRITTNEY (Ollama / WebLLM)
575
+ // ---------------------------------------------------------------------------
576
+ async localSuggestTraits(description, context) {
577
+ const prompt = context ? `Description: "${description}"
578
+ Context: "${context}"` : `Description: "${description}"`;
579
+ const body = {
580
+ model: this.localModel,
581
+ messages: [
582
+ { role: "system", content: SOVEREIGN_SUGGEST_SYSTEM_PROMPT },
583
+ { role: "user", content: prompt }
584
+ ],
585
+ stream: false,
586
+ options: { num_predict: 512 }
587
+ };
588
+ const controller = new AbortController();
589
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
590
+ try {
591
+ const response = await fetch(`${this.localEndpoint}/v1/chat/completions`, {
592
+ method: "POST",
593
+ headers: { "Content-Type": "application/json" },
594
+ body: JSON.stringify(body),
595
+ signal: controller.signal
596
+ });
597
+ if (!response.ok) return null;
598
+ const data = await response.json();
599
+ const content = data?.choices?.[0]?.message?.content;
600
+ if (!content) return null;
601
+ return this.parseTraitSuggestion(content);
602
+ } finally {
603
+ clearTimeout(timeout);
604
+ }
605
+ }
606
+ async localGenerate(description, kind) {
607
+ const prompt = kind === "scene" ? `Generate a HoloScript composition for: ${description}` : `Generate a HoloScript object for: ${description}`;
608
+ const body = {
609
+ model: this.localModel,
610
+ messages: [
611
+ { role: "system", content: SOVEREIGN_GENERATE_SYSTEM_PROMPT },
612
+ { role: "user", content: prompt }
613
+ ],
614
+ stream: false,
615
+ options: { num_predict: this.maxTokens }
616
+ };
617
+ const controller = new AbortController();
618
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
619
+ try {
620
+ const response = await fetch(`${this.localEndpoint}/v1/chat/completions`, {
621
+ method: "POST",
622
+ headers: { "Content-Type": "application/json" },
623
+ body: JSON.stringify(body),
624
+ signal: controller.signal
625
+ });
626
+ if (!response.ok) return null;
627
+ const data = await response.json();
628
+ const content = data?.choices?.[0]?.message?.content;
629
+ if (!content) return null;
630
+ return this.stripCodeFences(content);
631
+ } finally {
632
+ clearTimeout(timeout);
633
+ }
634
+ }
635
+ // ---------------------------------------------------------------------------
636
+ // CLOUD BRITTNEY
637
+ // ---------------------------------------------------------------------------
638
+ async cloudSuggestTraits(description, context) {
639
+ const prompt = context ? `Description: "${description}"
640
+ Context: "${context}"` : `Description: "${description}"`;
641
+ const body = {
642
+ model: this.cloudModel,
643
+ messages: [
644
+ { role: "system", content: SOVEREIGN_SUGGEST_SYSTEM_PROMPT },
645
+ { role: "user", content: prompt }
646
+ ],
647
+ stream: false,
648
+ max_tokens: 512
649
+ };
650
+ const headers = {
651
+ "Content-Type": "application/json",
652
+ ...this.cloudApiKey ? { Authorization: `Bearer ${this.cloudApiKey}` } : {}
653
+ };
654
+ const controller = new AbortController();
655
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
656
+ try {
657
+ const response = await fetch(`${this.cloudEndpoint}/v1/chat/completions`, {
658
+ method: "POST",
659
+ headers,
660
+ body: JSON.stringify(body),
661
+ signal: controller.signal
662
+ });
663
+ if (!response.ok) return null;
664
+ const data = await response.json();
665
+ const content = data?.choices?.[0]?.message?.content;
666
+ if (!content) return null;
667
+ return this.parseTraitSuggestion(content);
668
+ } finally {
669
+ clearTimeout(timeout);
670
+ }
671
+ }
672
+ async cloudGenerate(description, kind) {
673
+ const prompt = kind === "scene" ? `Generate a HoloScript composition for: ${description}` : `Generate a HoloScript object for: ${description}`;
674
+ const body = {
675
+ model: this.cloudModel,
676
+ messages: [
677
+ { role: "system", content: SOVEREIGN_GENERATE_SYSTEM_PROMPT },
678
+ { role: "user", content: prompt }
679
+ ],
680
+ stream: false,
681
+ max_tokens: this.maxTokens
682
+ };
683
+ const headers = {
684
+ "Content-Type": "application/json",
685
+ ...this.cloudApiKey ? { Authorization: `Bearer ${this.cloudApiKey}` } : {}
686
+ };
687
+ const controller = new AbortController();
688
+ const timeout = setTimeout(() => controller.abort(), this.timeoutMs);
689
+ try {
690
+ const response = await fetch(`${this.cloudEndpoint}/v1/chat/completions`, {
691
+ method: "POST",
692
+ headers,
693
+ body: JSON.stringify(body),
694
+ signal: controller.signal
695
+ });
696
+ if (!response.ok) return null;
697
+ const data = await response.json();
698
+ const content = data?.choices?.[0]?.message?.content;
699
+ if (!content) return null;
700
+ return this.stripCodeFences(content);
701
+ } finally {
702
+ clearTimeout(timeout);
703
+ }
704
+ }
705
+ // ---------------------------------------------------------------------------
706
+ // KEYWORD / TEMPLATE FALLBACK — deterministic, no LLM
707
+ // ---------------------------------------------------------------------------
708
+ keywordSuggestTraits(description, context, source) {
709
+ const lowerDesc = (description + " " + (context || "")).toLowerCase();
710
+ const suggestedTraits = /* @__PURE__ */ new Set();
711
+ const reasoning = {};
712
+ for (const [keyword, traits2] of Object.entries(TRAIT_KEYWORDS)) {
713
+ if (lowerDesc.includes(keyword)) {
714
+ for (const trait of traits2) {
715
+ if (!suggestedTraits.has(trait)) {
716
+ suggestedTraits.add(trait);
717
+ reasoning[trait] = `Suggested because description mentions "${keyword}"`;
718
+ }
719
+ }
720
+ }
721
+ }
722
+ if (suggestedTraits.size === 0) {
723
+ suggestedTraits.add("@pointable");
724
+ reasoning["@pointable"] = "Default trait for interactive objects";
725
+ }
726
+ if (suggestedTraits.has("@physics") && !suggestedTraits.has("@collidable")) {
727
+ suggestedTraits.add("@collidable");
728
+ reasoning["@collidable"] = "Required for physics interactions";
729
+ }
730
+ const traits = Array.from(suggestedTraits);
731
+ const confidence = Math.min(0.95, 0.5 + traits.length * 0.1);
732
+ return {
733
+ traits,
734
+ reasoning,
735
+ confidence,
736
+ metadata: { source }
737
+ };
738
+ }
739
+ templateGenerateObject(description, source) {
740
+ const { traits } = this.keywordSuggestTraits(
741
+ description,
742
+ void 0,
743
+ source === "mock" ? "mock" : "keyword-fallback"
744
+ );
745
+ const code = `object "Generated" {
746
+ // Generated from: ${description}
747
+ geometry: "cube"
748
+ position: [0, 1, 0]
749
+ ${traits.length > 0 ? " " + traits.join("\n ") : ""}
750
+ }`;
751
+ return {
752
+ code,
753
+ metadata: {
754
+ description,
755
+ traits,
756
+ geometry: "cube",
757
+ source
758
+ }
759
+ };
760
+ }
761
+ templateGenerateScene(description, source) {
762
+ const { traits } = this.keywordSuggestTraits(
763
+ description,
764
+ void 0,
765
+ source === "mock" ? "mock" : "keyword-fallback"
766
+ );
767
+ const code = `composition "Generated Scene" {
768
+ // Generated from: ${description}
769
+ environment {
770
+ skybox: "default"
771
+ ambient_light: 0.5
772
+ }
773
+
774
+ object "Object1" {
775
+ geometry: "cube"
776
+ position: [0, 1, 0]
777
+ ${traits.length > 0 ? " " + traits.join("\n ") : ""}
778
+ }
779
+ }`;
780
+ return {
781
+ code,
782
+ metadata: {
783
+ description,
784
+ objectCount: 1,
785
+ traits,
786
+ source
787
+ }
788
+ };
789
+ }
790
+ // ---------------------------------------------------------------------------
791
+ // PARSING UTILITIES
792
+ // ---------------------------------------------------------------------------
793
+ parseTraitSuggestion(content) {
794
+ try {
795
+ const stripped = this.stripCodeFences(content).trim();
796
+ const jsonMatch = stripped.match(/\{[\s\S]*\}/);
797
+ if (!jsonMatch) return null;
798
+ const parsed = JSON.parse(jsonMatch[0]);
799
+ if (!Array.isArray(parsed.traits)) return null;
800
+ return {
801
+ traits: parsed.traits.filter((t) => typeof t === "string"),
802
+ reasoning: parsed.reasoning ?? {},
803
+ confidence: typeof parsed.confidence === "number" ? parsed.confidence : 0.7
804
+ };
805
+ } catch {
806
+ return null;
807
+ }
808
+ }
809
+ stripCodeFences(code) {
810
+ return code.replace(/^```(?:holoscript|hs|holo)?\s*\n?/m, "").replace(/\n?```\s*$/m, "").trim();
811
+ }
812
+ extractTraitsFromCode(code) {
813
+ const traitPattern = /@[\w]+/g;
814
+ const matches = code.match(traitPattern);
815
+ return matches ? [...new Set(matches)] : [];
816
+ }
817
+ extractGeometryFromCode(code) {
818
+ const geoMatch = code.match(/geometry:\s*"(\w+)"/);
819
+ return geoMatch?.[1] ?? "unknown";
820
+ }
821
+ countObjects(code) {
822
+ const objectMatches = code.match(/\bobject\s+"/g);
823
+ return objectMatches ? objectMatches.length : 1;
824
+ }
825
+ sleep(ms) {
826
+ return new Promise((resolve) => setTimeout(resolve, ms));
827
+ }
828
+ };
829
+
830
+ // src/world/WorldGeneratorService.ts
831
+ var WorldGeneratorService = class {
832
+ constructor(registry = worldAdapterRegistry) {
833
+ this.emitters = /* @__PURE__ */ new Set();
834
+ this.defaultAdaptersRegistered = false;
835
+ this.registry = registry;
836
+ }
837
+ /**
838
+ * Register the built-in sovereign adapter (SovereignWorldAdapter — Brittney v43+).
839
+ * Call once during scene/runtime bootstrap.
840
+ */
841
+ registerDefaultAdapters() {
842
+ if (this.defaultAdaptersRegistered) return;
843
+ this.registry.register(new Sovereign3DAdapter({
844
+ // HOLOSCRIPT_SOVEREIGN_MOCK=true enables deterministic mock output when the
845
+ // live sovereign service (wss://api.hololand.io) is offline or not yet deployed.
846
+ mockMode: Boolean(process.env.HOLOSCRIPT_SOVEREIGN_MOCK)
847
+ }));
848
+ this.defaultAdaptersRegistered = true;
849
+ }
850
+ /**
851
+ * Bind to an event emitter (TraitContext-like).
852
+ * The service starts listening for 'world:generate' events on this emitter.
853
+ * Returns an unsubscribe function.
854
+ */
855
+ bindEventEmitter(emitter) {
856
+ const listener = (data) => {
857
+ void this.handleGenerateEvent(emitter, data);
858
+ };
859
+ emitter.on("world:generate", listener);
860
+ this.emitters.add(emitter);
861
+ return () => {
862
+ emitter.off?.("world:generate", listener);
863
+ this.emitters.delete(emitter);
864
+ };
865
+ }
866
+ // ---------------------------------------------------------------------------
867
+ // CORE HANDLER
868
+ // ---------------------------------------------------------------------------
869
+ async handleGenerateEvent(emitter, event) {
870
+ const { nodeId, engine } = event;
871
+ if (!this.registry.has(engine)) {
872
+ const errEvent = {
873
+ nodeId,
874
+ error: `No adapter registered for engine '${engine}'. Available: ${this.registry.list().join(", ")}`
875
+ };
876
+ emitter.emit("world:generation_error", errEvent);
877
+ return;
878
+ }
879
+ const adapter = this.registry.get(engine);
880
+ const request = {
881
+ prompt: event.prompt,
882
+ format: event.format,
883
+ quality: event.quality,
884
+ ...event.input_image ? { input_image: event.input_image } : {},
885
+ ...event.input_images ? { input_images: event.input_images } : {},
886
+ ...event.seed !== void 0 ? { seed: event.seed } : {},
887
+ ...event.navEnabled !== void 0 ? { navEnabled: event.navEnabled } : {},
888
+ ...event.interactiveMode !== void 0 ? { interactiveMode: event.interactiveMode } : {}
889
+ };
890
+ try {
891
+ const generationPromise = adapter.generate(request);
892
+ emitter.emit("world:generation_started", {
893
+ nodeId,
894
+ engine,
895
+ generationId: "pending"
896
+ });
897
+ let progressInterval;
898
+ if (adapter.getProgress) {
899
+ const getProgress = adapter.getProgress.bind(adapter);
900
+ progressInterval = setInterval(() => {
901
+ void getProgress("pending").then((progress) => {
902
+ emitter.emit("world:generation_progress", {
903
+ nodeId,
904
+ progress
905
+ });
906
+ }).catch(() => {
907
+ });
908
+ }, 3e3);
909
+ }
910
+ const result = await generationPromise;
911
+ if (progressInterval !== void 0) {
912
+ clearInterval(progressInterval);
913
+ }
914
+ emitter.emit("world:generation_progress", {
915
+ nodeId,
916
+ progress: 1
917
+ });
918
+ const completeEvent = {
919
+ nodeId,
920
+ assetUrl: result.assetUrl,
921
+ generationId: result.generationId,
922
+ metadata: result.metadata,
923
+ ...result.navmeshUrl ? { navmeshUrl: result.navmeshUrl } : {},
924
+ ...result.pointCloudUrl ? { pointCloudUrl: result.pointCloudUrl } : {}
925
+ };
926
+ emitter.emit("world:generation_complete", completeEvent);
927
+ } catch (err) {
928
+ const message = err instanceof Error ? err.message : String(err);
929
+ const errEvent = {
930
+ nodeId,
931
+ error: message
932
+ };
933
+ emitter.emit("world:generation_error", errEvent);
934
+ }
935
+ }
936
+ };
937
+ var worldGeneratorService = new WorldGeneratorService();
938
+
939
+ exports.Sovereign3DAdapter = Sovereign3DAdapter;
940
+ exports.SovereignGeneratorAdapter = SovereignGeneratorAdapter;
941
+ exports.SovereignWorldAdapter = SovereignWorldAdapter;
942
+ exports.WorldAdapterRegistry = WorldAdapterRegistry;
943
+ exports.WorldGeneratorService = WorldGeneratorService;
944
+ exports.worldAdapterRegistry = worldAdapterRegistry;
945
+ exports.worldGeneratorService = worldGeneratorService;
946
+ //# sourceMappingURL=index.cjs.map
947
+ //# sourceMappingURL=index.cjs.map