@holoscript/core 6.0.4 → 6.1.2
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.
- package/LICENSE +21 -0
- package/README.md +3 -3
- package/bin/holoscript.cjs +3 -0
- package/dist/GLTFPipeline-SFIORFJU.js +16 -0
- package/dist/GLTFPipeline-VNNDPONV.cjs +37 -0
- package/dist/{HoloScriptPlusParser-BN6KVRCM.js → HoloScriptPlusParser-7FBIFUFC.js} +6 -5
- package/dist/{HoloScriptPlusParser-NC5FE6AL.cjs → HoloScriptPlusParser-A2W7OCN2.cjs} +17 -16
- package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
- package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
- package/dist/{USDZExporter-UWGWNMMD.cjs → USDZExporter-3FWJ25JI.cjs} +344 -16
- package/dist/{USDZExporter-NTMBNTDB.js → USDZExporter-D2HQLQYK.js} +344 -16
- package/dist/agents/index.cjs +19 -0
- package/dist/agents/index.d.ts +100 -0
- package/dist/agents/index.js +17 -0
- package/dist/chunk-22W6NGYN.js +725 -0
- package/dist/{chunk-5OEOHAAW.cjs → chunk-27MPVJVZ.cjs} +64 -28
- package/dist/{chunk-RVYPEYPX.js → chunk-2A7FURVO.js} +44 -8
- package/dist/{chunk-XCWFGZAA.js → chunk-2B7WVIDZ.js} +11 -8
- package/dist/{chunk-NDQNIJEH.js → chunk-2BSMSUCE.js} +250 -24
- package/dist/chunk-2HLIGOKU.cjs +5546 -0
- package/dist/{chunk-EONILVMF.js → chunk-2M2DPHKB.js} +4 -4
- package/dist/{chunk-G7CT3EMP.cjs → chunk-2YSNA2F2.cjs} +319 -47
- package/dist/{chunk-IWI6J7FX.js → chunk-33XCOVE3.js} +5 -5
- package/dist/chunk-3FOKASKO.cjs +348 -0
- package/dist/{chunk-DXJQDCFL.js → chunk-4C57PR42.js} +3 -3
- package/dist/{chunk-MPXBVFHQ.js → chunk-4N4SXXWF.js} +4 -3
- package/dist/chunk-4PDEPEQW.cjs +41 -0
- package/dist/chunk-4R6HPSHJ.js +2176 -0
- package/dist/chunk-4R6SBXDB.js +45 -0
- package/dist/chunk-4SY77NA4.cjs +413 -0
- package/dist/{chunk-YCXFCXDS.js → chunk-4UUKPCY4.js} +668 -110
- package/dist/{chunk-LGGRPKTV.cjs → chunk-52ULD552.cjs} +114 -35
- package/dist/{chunk-L4G4RLXX.js → chunk-5CKA5SXU.js} +438 -22
- package/dist/chunk-5FSKKMR7.cjs +2092 -0
- package/dist/{chunk-FF3Q7ADR.js → chunk-5JEU52DW.js} +5 -3
- package/dist/chunk-5N54COB6.cjs +327 -0
- package/dist/chunk-5S7RKFGR.cjs +446 -0
- package/dist/{chunk-KED34ILP.js → chunk-6ASWLXXN.js} +21 -9
- package/dist/chunk-6CTRH7HT.cjs +1985 -0
- package/dist/{chunk-CAUCGUEA.cjs → chunk-6EX3I5P4.cjs} +6 -6
- package/dist/chunk-6FGQNDR4.js +5731 -0
- package/dist/{chunk-72EQECGT.cjs → chunk-6KMK2UXT.cjs} +122 -46
- package/dist/{chunk-G4VZTCIB.js → chunk-6L4VE27M.js} +33 -23
- package/dist/{chunk-ATSKSYVE.cjs → chunk-6S6TKNEA.cjs} +6478 -1738
- package/dist/chunk-77V4GTCA.js +596 -0
- package/dist/{chunk-ZP4D3CSX.cjs → chunk-7AD52FRS.cjs} +16 -16
- package/dist/chunk-A6KINLZJ.js +236 -0
- package/dist/chunk-AIA52I7T.cjs +543 -0
- package/dist/chunk-AIX25INK.cjs +602 -0
- package/dist/{chunk-B5TCIAPQ.cjs → chunk-AO4I2Z7M.cjs} +17 -18
- package/dist/{chunk-Q5SJOGHQ.cjs → chunk-BPICAGBV.cjs} +324 -199
- package/dist/chunk-BRQJKJGT.cjs +20 -0
- package/dist/{chunk-3FXV5S25.cjs → chunk-C37BHB7N.cjs} +6 -3
- package/dist/{chunk-XUTX5CBW.js → chunk-CBJY23VL.js} +3 -3
- package/dist/chunk-CIWWXYHZ.cjs +50 -0
- package/dist/{chunk-XXINBTZK.cjs → chunk-DIL6DDDN.cjs} +101 -45
- package/dist/chunk-DMXC24WV.js +404 -0
- package/dist/{chunk-PMGODDJA.cjs → chunk-DTGBOSEM.cjs} +12 -12
- package/dist/chunk-E7JP3BS3.cjs +61 -0
- package/dist/{chunk-HJJLD366.js → chunk-EKBKLK7P.js} +3 -3
- package/dist/chunk-EKYL4PE3.cjs +404 -0
- package/dist/{chunk-UPJBDCVF.js → chunk-EMMC5CSQ.js} +12 -8
- package/dist/{chunk-GGHSW2NN.js → chunk-EOBB6A4B.js} +6389 -1718
- package/dist/chunk-EOFNVCM6.js +325 -0
- package/dist/{chunk-FHQVYCH2.js → chunk-ER4GATIU.js} +7 -7
- package/dist/{chunk-N5FTS757.cjs → chunk-EXKSFGSX.cjs} +7 -148
- package/dist/{chunk-LK5IAVH6.cjs → chunk-EXUP2BUM.cjs} +27 -27
- package/dist/chunk-FDSGHPAK.js +130 -0
- package/dist/chunk-FEWUHQNM.cjs +144 -0
- package/dist/{chunk-5TOFIR6L.js → chunk-FGGJQRLZ.js} +5 -142
- package/dist/chunk-FHP6LXJS.js +415 -0
- package/dist/{chunk-7LCYLPW2.cjs → chunk-FJPADH77.cjs} +7 -4
- package/dist/{chunk-T36DDXSF.js → chunk-FXKTYFYA.js} +150 -25
- package/dist/chunk-G2LS3RFO.js +623 -0
- package/dist/chunk-GCMWDSBZ.cjs +729 -0
- package/dist/chunk-GJNCFRJU.cjs +125 -0
- package/dist/{chunk-Q4QX3AET.cjs → chunk-GMP623FG.cjs} +16 -13
- package/dist/{chunk-XD6IYDUX.js → chunk-GN3KDX4W.js} +119 -43
- package/dist/{chunk-QLEAOI3Q.cjs → chunk-GQYKQSTC.cjs} +10 -10
- package/dist/chunk-GTU2Z2WW.cjs +262 -0
- package/dist/chunk-GZG4KA4E.js +529 -0
- package/dist/{chunk-BND3ST2K.cjs → chunk-H3MGK7TX.cjs} +42 -32
- package/dist/{chunk-XRKWN5PL.cjs → chunk-H5DZIHJP.cjs} +14 -18
- package/dist/{chunk-Z34RLXRA.cjs → chunk-HANL7K2Q.cjs} +65 -50
- package/dist/{chunk-3SAK5KFL.cjs → chunk-HCCQLAA4.cjs} +2 -11
- package/dist/{chunk-LXJ4667L.cjs → chunk-HGVXZDSK.cjs} +108 -20
- package/dist/{chunk-3FJCK5XA.js → chunk-HRODTEEO.js} +30 -10
- package/dist/{chunk-HQUEA5R6.cjs → chunk-HZCQO4JM.cjs} +6 -6
- package/dist/{chunk-S565K7NK.js → chunk-I2O7TW6B.js} +12 -8
- package/dist/chunk-IHESJZSW.js +4490 -0
- package/dist/{chunk-FSF7EQVA.cjs → chunk-IRWWS72C.cjs} +63 -22
- package/dist/{chunk-5O6TQC6M.cjs → chunk-IVIA7K75.cjs} +689 -127
- package/dist/chunk-IVY74O6C.js +247 -0
- package/dist/chunk-J32ZJZJH.js +554 -0
- package/dist/chunk-J56PTA46.cjs +639 -0
- package/dist/chunk-JD7CIZ33.js +1949 -0
- package/dist/{chunk-T7LEXZUZ.cjs → chunk-JIYN45TV.cjs} +14 -15
- package/dist/{chunk-FFKU7BTK.cjs → chunk-KHPCJRI3.cjs} +24 -21
- package/dist/chunk-KKFZ3B6J.cjs +557 -0
- package/dist/chunk-KPJL34Y7.cjs +186 -0
- package/dist/{chunk-HE7ULERA.cjs → chunk-KQTPCYTG.cjs} +128 -44
- package/dist/{chunk-OFKWH2IP.js → chunk-KX76JUQY.js} +3 -3
- package/dist/{chunk-33LSUQDD.cjs → chunk-L63H3SQ4.cjs} +43 -31
- package/dist/{chunk-K6EKD26I.js → chunk-LAOCQJ2M.js} +64 -8
- package/dist/chunk-LM2VU56C.cjs +37 -0
- package/dist/chunk-M56JSP4A.js +400 -0
- package/dist/chunk-MBOOR7X4.js +18 -0
- package/dist/{chunk-XWPNTWDN.cjs → chunk-MJVIRCUV.cjs} +31 -27
- package/dist/{chunk-SDAMZIRE.js → chunk-MSMIFMBL.js} +135 -18
- package/dist/{chunk-56IF4NTA.js → chunk-MXFUTKCO.js} +18 -18
- package/dist/{chunk-6UEHYZ7V.cjs → chunk-MXJ5SS53.cjs} +447 -31
- package/dist/chunk-MYY4PMWX.cjs +264 -0
- package/dist/chunk-N75IH2HY.js +258 -0
- package/dist/{chunk-GVUR45UF.cjs → chunk-NG77ATEW.cjs} +7 -6
- package/dist/chunk-NW5G5FBQ.js +215 -0
- package/dist/{chunk-E3FWRT3Z.js → chunk-OEFY723R.js} +28 -13
- package/dist/chunk-OEV5RMZO.cjs +3042 -0
- package/dist/{chunk-X4ZF6CNE.cjs → chunk-OIQYIIO3.cjs} +7 -7
- package/dist/{chunk-2CWOLHTE.js → chunk-OL46QLBJ.js} +3 -11
- package/dist/chunk-OPZ7XDDI.js +487 -0
- package/dist/chunk-OSYNRVOV.cjs +243 -0
- package/dist/{chunk-TEWCN33Y.js → chunk-P7YIA5LN.js} +91 -7
- package/dist/chunk-PGANYCAG.cjs +220 -0
- package/dist/{chunk-CS2EMTGF.js → chunk-QAVXL2IH.js} +62 -21
- package/dist/{chunk-T4NKMBDL.js → chunk-QCCBXSCE.js} +1666 -756
- package/dist/{chunk-F4IULT7N.js → chunk-QPOQ7VPI.js} +16 -13
- package/dist/{chunk-6XSERL6L.js → chunk-QTPMJRGS.js} +3108 -2827
- package/dist/{chunk-F3HH56EB.cjs → chunk-QWNQ523V.cjs} +1730 -823
- package/dist/{chunk-R7MA7QWV.js → chunk-R3IVNY6P.js} +102 -23
- package/dist/chunk-R75BSDH7.cjs +50 -0
- package/dist/chunk-RAXUF5DF.cjs +2196 -0
- package/dist/{chunk-BF2235SI.cjs → chunk-RMHC2VG7.cjs} +2876 -2592
- package/dist/chunk-RUXGBKPS.cjs +4517 -0
- package/dist/{chunk-UERJ3YJV.js → chunk-S5IFXW6E.js} +113 -9
- package/dist/{chunk-27LWW5FU.cjs → chunk-S6YWHCKV.cjs} +5 -5
- package/dist/{chunk-WB4Z63GG.js → chunk-SIEXCILW.js} +3 -3
- package/dist/{chunk-CLYEIWA5.cjs → chunk-SLU6UPJI.cjs} +5 -3
- package/dist/{chunk-LZ266PCM.cjs → chunk-T5J7ZKP3.cjs} +446 -60
- package/dist/chunk-TDCNJHWO.js +341 -0
- package/dist/{chunk-IHOUYQIA.js → chunk-TG7O4WBC.js} +5 -5
- package/dist/chunk-THCK6ECW.js +2085 -0
- package/dist/chunk-TJHVSBP2.js +439 -0
- package/dist/chunk-TK74TR4H.js +5541 -0
- package/dist/{chunk-CDPGV4DN.js → chunk-U4NBQJBY.js} +14 -15
- package/dist/{chunk-NOZZ46QU.js → chunk-UD3DSHZM.js} +10 -14
- package/dist/chunk-UDMYRFDZ.js +3038 -0
- package/dist/{chunk-WDW67DZB.cjs → chunk-UOIGFQXC.cjs} +90 -68
- package/dist/{chunk-BU7VWW2K.js → chunk-URG2SJLK.js} +14 -15
- package/dist/{chunk-EQV4R3EV.cjs → chunk-V73NPPTM.cjs} +152 -35
- package/dist/chunk-VECQYRXL.js +474 -0
- package/dist/chunk-VEXPG4WN.js +1989 -0
- package/dist/{chunk-LDP5OK6G.js → chunk-VMLKSV26.js} +5 -5
- package/dist/{chunk-5BGSECRJ.cjs → chunk-VSK7W3O5.cjs} +47 -27
- package/dist/chunk-VVKVQZI6.js +55 -0
- package/dist/{chunk-YQK5JNFK.js → chunk-W55Z7QIX.js} +103 -15
- package/dist/{chunk-KSGXLT74.cjs → chunk-W6P2GBHH.cjs} +3 -3
- package/dist/{chunk-IBDG74G2.cjs → chunk-W6RW64BB.cjs} +7 -7
- package/dist/chunk-WDT3JTGM.cjs +483 -0
- package/dist/{chunk-HPS76H7Q.js → chunk-WKX5AMOY.js} +3 -3
- package/dist/chunk-WNNE3PO3.js +34 -0
- package/dist/{chunk-XG23EUQX.cjs → chunk-WRLUBRKS.cjs} +538 -312
- package/dist/{chunk-IFNQFCTM.js → chunk-WRNEH5MO.js} +79 -8
- package/dist/{chunk-54FHG2MX.js → chunk-WRWEX5ZF.js} +7 -4
- package/dist/{chunk-KCQ5NDYC.cjs → chunk-X3GJPRVK.cjs} +154 -80
- package/dist/{chunk-7AGYRWKW.cjs → chunk-XFXGA5IW.cjs} +126 -22
- package/dist/{chunk-TQSZUOW5.cjs → chunk-XHIV6326.cjs} +4 -4
- package/dist/chunk-XJAN7CZG.cjs +432 -0
- package/dist/chunk-XL6INWKT.js +121 -0
- package/dist/{chunk-E3UALNFA.js → chunk-XMWZG36H.js} +4 -4
- package/dist/{chunk-BKIGPPVM.js → chunk-XSFNHP2E.js} +6 -3
- package/dist/{chunk-H5Z7NASB.js → chunk-XT6JY5W5.js} +25 -3
- package/dist/chunk-XXZJEFKW.cjs +490 -0
- package/dist/chunk-Y3MWXQSB.cjs +5737 -0
- package/dist/chunk-YF2I3MV3.js +46 -0
- package/dist/{chunk-V3NN3HPP.js → chunk-YIMN575O.js} +437 -52
- package/dist/chunk-YIVFJNYV.js +176 -0
- package/dist/{chunk-MD6KDHVE.cjs → chunk-YKGPCZEE.cjs} +10 -10
- package/dist/chunk-YQELFNJV.js +39 -0
- package/dist/chunk-Z5XMPRNC.cjs +5390 -0
- package/dist/{chunk-3FYZOR7S.cjs → chunk-ZDSYWBIE.cjs} +18 -18
- package/dist/{chunk-6TZPZCOJ.cjs → chunk-ZKSS47EV.cjs} +24 -19
- package/dist/chunk-ZUL5AVTX.cjs +1993 -0
- package/dist/chunk-ZXBZVXDW.js +5386 -0
- package/dist/{chunk-DMG7C4H2.js → chunk-ZZ7RO2UQ.js} +312 -44
- package/dist/cli/holoscript-runner.cjs +200 -204
- package/dist/cli/holoscript-runner.js +144 -148
- package/dist/codebase/index.cjs +1 -1
- package/dist/codebase/index.js +1 -1
- package/dist/compiler/agent-inference.cjs +10 -7
- package/dist/compiler/agent-inference.js +6 -3
- package/dist/compiler/android-xr.cjs +12 -7
- package/dist/compiler/android-xr.js +10 -5
- package/dist/compiler/android.cjs +12 -8
- package/dist/compiler/android.js +10 -6
- package/dist/compiler/ar.cjs +9 -6
- package/dist/compiler/ar.js +7 -4
- package/dist/compiler/babylon.cjs +12 -8
- package/dist/compiler/babylon.js +11 -7
- package/dist/compiler/business-quest.cjs +43 -0
- package/dist/compiler/business-quest.js +4 -0
- package/dist/compiler/coco.cjs +1 -1
- package/dist/compiler/coco.js +1 -1
- package/dist/compiler/context.cjs +25 -0
- package/dist/compiler/context.d.ts +28 -0
- package/dist/compiler/context.js +8 -0
- package/dist/compiler/domain-block-utils.cjs +155 -152
- package/dist/compiler/domain-block-utils.js +7 -4
- package/dist/compiler/dtdl.cjs +10 -7
- package/dist/compiler/dtdl.js +7 -4
- package/dist/compiler/gltf-pipeline.cjs +9 -9
- package/dist/compiler/gltf-pipeline.js +2 -2
- package/dist/compiler/godot.cjs +9 -6
- package/dist/compiler/godot.js +8 -5
- package/dist/compiler/incremental.cjs +12 -7
- package/dist/compiler/incremental.js +7 -2
- package/dist/compiler/index.cjs +3550 -268
- package/dist/compiler/index.d.ts +404 -21
- package/dist/compiler/index.js +3280 -138
- package/dist/compiler/ios.cjs +11 -8
- package/dist/compiler/ios.js +9 -6
- package/dist/compiler/llm-provider-capabilities.cjs +25 -0
- package/dist/compiler/llm-provider-capabilities.d.ts +43 -0
- package/dist/compiler/llm-provider-capabilities.js +8 -0
- package/dist/compiler/multi-layer.cjs +14 -10
- package/dist/compiler/multi-layer.js +13 -9
- package/dist/compiler/nodetoy.cjs +5 -5
- package/dist/compiler/nodetoy.js +2 -2
- package/dist/compiler/openxr.cjs +10 -6
- package/dist/compiler/openxr.js +9 -5
- package/dist/compiler/playcanvas.cjs +10 -7
- package/dist/compiler/playcanvas.js +9 -6
- package/dist/compiler/r3f.cjs +17 -13
- package/dist/compiler/r3f.d.ts +22 -0
- package/dist/compiler/r3f.js +12 -8
- package/dist/compiler/remotion.cjs +1 -1
- package/dist/compiler/remotion.js +1 -1
- package/dist/compiler/reproducibility.cjs +1 -1
- package/dist/compiler/reproducibility.js +1 -1
- package/dist/compiler/sdf.cjs +10 -7
- package/dist/compiler/sdf.js +8 -5
- package/dist/compiler/semantic-scene.cjs +1 -1
- package/dist/compiler/semantic-scene.js +1 -1
- package/dist/compiler/state.cjs +9 -5
- package/dist/compiler/state.js +7 -3
- package/dist/compiler/trait-composition.cjs +11 -7
- package/dist/compiler/trait-composition.js +7 -3
- package/dist/compiler/unity.cjs +10 -6
- package/dist/compiler/unity.js +9 -5
- package/dist/compiler/unreal.cjs +11 -7
- package/dist/compiler/unreal.js +9 -5
- package/dist/compiler/urdf.cjs +20 -13
- package/dist/compiler/urdf.js +8 -5
- package/dist/compiler/usd-physics.cjs +10 -7
- package/dist/compiler/usd-physics.js +7 -4
- package/dist/compiler/visionos.cjs +10 -6
- package/dist/compiler/visionos.js +9 -5
- package/dist/compiler/vrchat.cjs +10 -7
- package/dist/compiler/vrchat.js +8 -5
- package/dist/compiler/vrr.cjs +10 -7
- package/dist/compiler/vrr.js +8 -5
- package/dist/compiler/wasm.cjs +13 -10
- package/dist/compiler/wasm.js +8 -5
- package/dist/compiler/webgpu.cjs +9 -6
- package/dist/compiler/webgpu.js +8 -5
- package/dist/constants.d.ts +3 -2
- package/dist/coordinators/index.cjs +1266 -0
- package/dist/coordinators/index.d.ts +260 -0
- package/dist/coordinators/index.js +1259 -0
- package/dist/debugger.cjs +9 -7
- package/dist/debugger.js +7 -5
- package/dist/entries/interop.cjs +23 -21
- package/dist/entries/interop.js +5 -3
- package/dist/entries/scripting.cjs +18 -18
- package/dist/entries/scripting.js +8 -8
- package/dist/hololand/index.cjs +146 -0
- package/dist/hololand/index.d.ts +70 -0
- package/dist/hololand/index.js +5 -0
- package/dist/index.cjs +20332 -18121
- package/dist/index.d.ts +1477 -40
- package/dist/index.js +19451 -17638
- package/dist/math/tropical-spmv.cjs +45 -0
- package/dist/math/tropical-spmv.js +4 -0
- package/dist/math/vec3.cjs +14 -14
- package/dist/math/vec3.js +2 -2
- package/dist/{ml-dsa-PHCWUBPX.cjs → ml-dsa-FSKBTE3W.cjs} +177 -90
- package/dist/{ml-dsa-WYLJHJO6.js → ml-dsa-Z7JDKW4L.js} +158 -71
- package/dist/paper-0c-spike/index.cjs +150 -0
- package/dist/paper-0c-spike/index.d.ts +29 -0
- package/dist/paper-0c-spike/index.js +141 -0
- package/dist/parser.cjs +45 -11
- package/dist/parser.d.ts +11 -0
- package/dist/parser.js +10 -8
- package/dist/{playwright-RL6GY4F7.cjs → playwright-3AT3AKTV.cjs} +1985 -1985
- package/dist/{playwright-5OSAPTNH.js → playwright-VZPDVUEQ.js} +3 -3
- package/dist/reconstruction/index.cjs +153 -0
- package/dist/reconstruction/index.d.ts +105 -0
- package/dist/reconstruction/index.js +8 -0
- package/dist/runtime.cjs +7 -5
- package/dist/runtime.js +6 -4
- package/dist/self-improvement/index.cjs +563 -0
- package/dist/self-improvement/index.js +545 -0
- package/dist/storage/index.cjs +10 -9
- package/dist/storage/index.js +3 -2
- package/dist/testing.cjs +25 -0
- package/dist/testing.d.ts +70 -0
- package/dist/testing.js +4 -0
- package/dist/tools/index.d.ts +22 -1
- package/dist/traitDocs/traitDocs.cjs +33 -0
- package/dist/traitDocs/traitDocs.d.ts +69 -0
- package/dist/traitDocs/traitDocs.js +7 -0
- package/dist/traits/botanical-lotus.cjs +41 -0
- package/dist/traits/botanical-lotus.d.ts +172 -0
- package/dist/traits/botanical-lotus.js +4 -0
- package/dist/traits/engines/index.cjs +520 -0
- package/dist/traits/engines/index.js +380 -0
- package/dist/traits/index.cjs +17630 -7881
- package/dist/traits/index.d.ts +197 -0
- package/dist/traits/index.js +16573 -7193
- package/dist/traits/simulation-solver-factory.cjs +13 -0
- package/dist/traits/simulation-solver-factory.d.ts +23 -0
- package/dist/traits/simulation-solver-factory.js +4 -0
- package/dist/traits/webcam-gaze.cjs +35 -0
- package/dist/traits/webcam-gaze.d.ts +17 -0
- package/dist/traits/webcam-gaze.js +4 -0
- package/dist/type-checker.cjs +6 -5
- package/dist/type-checker.js +4 -3
- package/dist/world/index.cjs +947 -0
- package/dist/world/index.d.ts +147 -0
- package/dist/world/index.js +939 -0
- package/dist/world-model/index.cjs +1446 -0
- package/dist/world-model/index.d.ts +119 -0
- package/dist/world-model/index.js +1414 -0
- package/dist/wot/index.cjs +29 -0
- package/dist/wot/index.js +4 -0
- package/package.json +153 -61
- package/dist/GLTFPipeline-DEN36VNK.js +0 -12
- package/dist/GLTFPipeline-YPCAK236.cjs +0 -33
- package/dist/chunk-4XSNJCLC.cjs +0 -1859
- package/dist/chunk-A7PIMZGU.js +0 -263
- package/dist/chunk-BWFJEM5A.js +0 -5419
- package/dist/chunk-CBJSLA2E.cjs +0 -5423
- package/dist/chunk-K3JDKWGI.cjs +0 -270
- package/dist/chunk-LSW7P7ML.js +0 -3675
- package/dist/chunk-MEASWI2Y.js +0 -126
- package/dist/chunk-NCUKG4SK.cjs +0 -3075
- package/dist/chunk-Q5JT3YML.cjs +0 -129
- package/dist/chunk-QGKNANZ3.js +0 -3071
- package/dist/chunk-S2N5TNMA.js +0 -1855
- package/dist/chunk-TSH3MSQU.cjs +0 -129
- package/dist/chunk-WGMEAYBG.js +0 -126
- package/dist/chunk-X6SEAXAX.cjs +0 -3681
|
@@ -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
|