@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
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
4
|
-
var
|
|
5
|
-
var
|
|
6
|
-
var
|
|
3
|
+
var chunkAIA52I7T_cjs = require('./chunk-AIA52I7T.cjs');
|
|
4
|
+
var chunkHGVXZDSK_cjs = require('./chunk-HGVXZDSK.cjs');
|
|
5
|
+
var chunkRMHC2VG7_cjs = require('./chunk-RMHC2VG7.cjs');
|
|
6
|
+
var chunkHCCQLAA4_cjs = require('./chunk-HCCQLAA4.cjs');
|
|
7
|
+
var ans = require('@holoscript/core-types/ans');
|
|
7
8
|
|
|
8
9
|
// src/compiler/VisionOSTraitMap.ts
|
|
9
10
|
function getTraitMapping(traitName) {
|
|
@@ -38,8 +39,11 @@ function getMinVisionOSVersion(traits) {
|
|
|
38
39
|
}
|
|
39
40
|
return maxVersion;
|
|
40
41
|
}
|
|
42
|
+
function listAllTraits() {
|
|
43
|
+
return Object.keys(VISIONOS_TRAIT_MAP);
|
|
44
|
+
}
|
|
41
45
|
var PHYSICS_TRAIT_MAP, INTERACTION_TRAIT_MAP, AUDIO_TRAIT_MAP, AR_TRAIT_MAP, VISUAL_TRAIT_MAP, ACCESSIBILITY_TRAIT_MAP, UI_TRAIT_MAP, PORTAL_TRAIT_MAP, V43_TRAIT_MAP, VISIONOS_TRAIT_MAP;
|
|
42
|
-
var init_VisionOSTraitMap =
|
|
46
|
+
var init_VisionOSTraitMap = chunkHCCQLAA4_cjs.__esm({
|
|
43
47
|
"src/compiler/VisionOSTraitMap.ts"() {
|
|
44
48
|
PHYSICS_TRAIT_MAP = {
|
|
45
49
|
collidable: {
|
|
@@ -91,7 +95,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
91
95
|
cloth: {
|
|
92
96
|
trait: "cloth",
|
|
93
97
|
components: ["CollisionComponent", "PhysicsBodyComponent"],
|
|
94
|
-
level: "
|
|
98
|
+
level: "full",
|
|
95
99
|
imports: ["RealityKit", "Metal"],
|
|
96
100
|
generate: (varName, config) => {
|
|
97
101
|
const stiffness = config.stiffness ?? 0.8;
|
|
@@ -118,7 +122,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
118
122
|
soft_body: {
|
|
119
123
|
trait: "soft_body",
|
|
120
124
|
components: ["CollisionComponent", "PhysicsBodyComponent"],
|
|
121
|
-
level: "
|
|
125
|
+
level: "full",
|
|
122
126
|
imports: ["RealityKit", "Metal"],
|
|
123
127
|
generate: (varName, config) => {
|
|
124
128
|
const compliance = config.compliance ?? 1e-4;
|
|
@@ -146,7 +150,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
146
150
|
fluid: {
|
|
147
151
|
trait: "fluid",
|
|
148
152
|
components: ["CollisionComponent"],
|
|
149
|
-
level: "
|
|
153
|
+
level: "full",
|
|
150
154
|
imports: ["RealityKit", "Metal"],
|
|
151
155
|
generate: (varName, config) => {
|
|
152
156
|
const particleCount = config.particle_count ?? 1e4;
|
|
@@ -506,7 +510,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
506
510
|
occlusion: {
|
|
507
511
|
trait: "occlusion",
|
|
508
512
|
components: [],
|
|
509
|
-
level: "
|
|
513
|
+
level: "comment",
|
|
510
514
|
generate: (_varName) => [
|
|
511
515
|
`// @occlusion \u2014 RealityKit handles automatically`,
|
|
512
516
|
`// Ensure object has ModelComponent with proper materials`
|
|
@@ -617,7 +621,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
617
621
|
lod: {
|
|
618
622
|
trait: "lod",
|
|
619
623
|
components: [],
|
|
620
|
-
level: "
|
|
624
|
+
level: "full",
|
|
621
625
|
generate: (varName, config) => {
|
|
622
626
|
const distances = config.distances || [5, 15];
|
|
623
627
|
const d = distances;
|
|
@@ -628,8 +632,8 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
628
632
|
` var thresholds: [Float] = [${d[0] ?? 5}, ${d[1] ?? 15}]`,
|
|
629
633
|
` var currentLevel: Int = 0`,
|
|
630
634
|
`}`,
|
|
631
|
-
|
|
632
|
-
`//
|
|
635
|
+
`${varName}LODComponent.registerComponent()`,
|
|
636
|
+
`// LODSystem.update(): query camera distance, swap ModelComponent.mesh via level thresholds`,
|
|
633
637
|
`${varName}.components.set(${varName}LODComponent())`
|
|
634
638
|
];
|
|
635
639
|
}
|
|
@@ -766,6 +770,21 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
766
770
|
];
|
|
767
771
|
}
|
|
768
772
|
},
|
|
773
|
+
palm_menu: {
|
|
774
|
+
trait: "palm_menu",
|
|
775
|
+
components: ["AnchoringComponent"],
|
|
776
|
+
level: "partial",
|
|
777
|
+
generate: (varName, config) => {
|
|
778
|
+
const when = config.visible_when || "palm_up";
|
|
779
|
+
const layout = config.layout || "radial";
|
|
780
|
+
const attach = config.attach_to || "left_palm";
|
|
781
|
+
return [
|
|
782
|
+
`// @palm_menu \u2014 palm-attached radial menu (visible_when: ${when}, attach: ${attach}, layout: ${layout})`,
|
|
783
|
+
`${varName}.components.set(AnchoringComponent(.hand(.left, location: .palm)))`,
|
|
784
|
+
`// UI: radial items rendered via SwiftUI overlay or Entity HUD; gestures wired to on_pinch etc.`
|
|
785
|
+
];
|
|
786
|
+
}
|
|
787
|
+
},
|
|
769
788
|
ui_billboard: {
|
|
770
789
|
trait: "ui_billboard",
|
|
771
790
|
components: ["BillboardComponent"],
|
|
@@ -778,7 +797,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
778
797
|
ui_docked: {
|
|
779
798
|
trait: "ui_docked",
|
|
780
799
|
components: [],
|
|
781
|
-
level: "
|
|
800
|
+
level: "comment",
|
|
782
801
|
generate: (varName, config) => {
|
|
783
802
|
const position = String(config.position || "bottom");
|
|
784
803
|
const posMap = {
|
|
@@ -819,7 +838,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
819
838
|
volume: {
|
|
820
839
|
trait: "volume",
|
|
821
840
|
components: [],
|
|
822
|
-
level: "
|
|
841
|
+
level: "comment",
|
|
823
842
|
generate: (varName, config) => {
|
|
824
843
|
const size = config.size || [0.6, 0.4, 0.4];
|
|
825
844
|
const s = size;
|
|
@@ -838,7 +857,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
838
857
|
immersive: {
|
|
839
858
|
trait: "immersive",
|
|
840
859
|
components: [],
|
|
841
|
-
level: "
|
|
860
|
+
level: "comment",
|
|
842
861
|
generate: (varName, config) => {
|
|
843
862
|
const style = String(config.style || "mixed");
|
|
844
863
|
const styleMap = {
|
|
@@ -863,7 +882,7 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
863
882
|
spatial_persona: {
|
|
864
883
|
trait: "spatial_persona",
|
|
865
884
|
components: [],
|
|
866
|
-
level: "
|
|
885
|
+
level: "full",
|
|
867
886
|
minVersion: "2.0",
|
|
868
887
|
imports: ["GroupActivities"],
|
|
869
888
|
generate: (varName, config) => {
|
|
@@ -871,31 +890,59 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
871
890
|
return [
|
|
872
891
|
`// @spatial_persona \u2014 visionOS 2.0 Spatial Persona (GroupActivities)`,
|
|
873
892
|
`// Requires SharePlay session; persona renders at ${varName} position`,
|
|
874
|
-
|
|
875
|
-
|
|
893
|
+
`let ${varName}PersonaStyle: SpatialPersonaStyle = .${style}`,
|
|
894
|
+
`let ${varName}SpatialTemplate = SpatialTemplate(settings: SpatialTemplateSettings())`,
|
|
895
|
+
`let ${varName}Coordinator = SystemCoordinator()`,
|
|
896
|
+
`Task {`,
|
|
897
|
+
` for await session in GroupStateObserver().isSpatialSharePlayActive.values {`,
|
|
898
|
+
` guard session else { continue }`,
|
|
899
|
+
` await SystemCoordinator.requestForegroundPresentation(`,
|
|
900
|
+
` .spatialPersona(style: ${varName}PersonaStyle),`,
|
|
901
|
+
` template: ${varName}SpatialTemplate`,
|
|
902
|
+
` )`,
|
|
903
|
+
` }`,
|
|
904
|
+
`}`,
|
|
905
|
+
`${varName}.components.set(OpacityComponent(opacity: 1.0))`
|
|
876
906
|
];
|
|
877
907
|
}
|
|
878
908
|
},
|
|
879
909
|
shareplay: {
|
|
880
910
|
trait: "shareplay",
|
|
881
911
|
components: [],
|
|
882
|
-
level: "
|
|
912
|
+
level: "full",
|
|
883
913
|
minVersion: "1.0",
|
|
884
914
|
imports: ["GroupActivities"],
|
|
885
915
|
generate: (varName, config) => {
|
|
886
916
|
const activity = String(config.activity_type || "custom");
|
|
887
917
|
return [
|
|
888
|
-
`// @shareplay \u2014 SharePlay GroupActivity`,
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
918
|
+
`// @shareplay \u2014 SharePlay GroupActivity (activity: ${activity})`,
|
|
919
|
+
`struct ${varName}Activity: GroupActivity {`,
|
|
920
|
+
` var metadata = GroupActivityMetadata()`,
|
|
921
|
+
` init() {`,
|
|
922
|
+
` metadata.title = "${activity}"`,
|
|
923
|
+
` metadata.type = .generic`,
|
|
924
|
+
` }`,
|
|
925
|
+
`}`,
|
|
926
|
+
``,
|
|
927
|
+
`// Activate session and set up GroupSessionMessenger`,
|
|
928
|
+
`func ${varName}ActivateSharePlay() {`,
|
|
929
|
+
` Task {`,
|
|
930
|
+
` for await session in ${varName}Activity.sessions() {`,
|
|
931
|
+
` await session.join(activationConditions: [.always])`,
|
|
932
|
+
` let messenger = GroupSessionMessenger(session: session)`,
|
|
933
|
+
` // Send: try? await messenger.send("event", to: .all)`,
|
|
934
|
+
` // Receive: for await (msg, _) in messenger.messages(of: String.self) { handle(msg) }`,
|
|
935
|
+
` _ = messenger`,
|
|
936
|
+
` }`,
|
|
937
|
+
` }`,
|
|
938
|
+
`}`
|
|
892
939
|
];
|
|
893
940
|
}
|
|
894
941
|
},
|
|
895
942
|
object_tracking: {
|
|
896
943
|
trait: "object_tracking",
|
|
897
944
|
components: ["AnchoringComponent"],
|
|
898
|
-
level: "
|
|
945
|
+
level: "full",
|
|
899
946
|
minVersion: "2.0",
|
|
900
947
|
imports: ["ARKit"],
|
|
901
948
|
generate: (varName, config) => {
|
|
@@ -903,16 +950,30 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
903
950
|
return [
|
|
904
951
|
`// @object_tracking \u2014 ARKit ObjectTrackingProvider (visionOS 2.0)`,
|
|
905
952
|
`// Info.plist: NSWorldSensingUsageDescription`,
|
|
906
|
-
|
|
907
|
-
|
|
908
|
-
`try await
|
|
953
|
+
`// Load .referenceobject bundle from app bundle for ${referenceObject}`,
|
|
954
|
+
`let ${varName}RefObjURL = Bundle.main.url(forResource: "${referenceObject}", withExtension: "referenceobject")!`,
|
|
955
|
+
`let ${varName}RefObj = try await ReferenceObject(from: ${varName}RefObjURL)`,
|
|
956
|
+
`let ${varName}ObjProvider = ObjectTrackingProvider(referenceObjects: [${varName}RefObj])`,
|
|
957
|
+
`try await arkitSession.run([${varName}ObjProvider])`,
|
|
958
|
+
`Task {`,
|
|
959
|
+
` for await update in ${varName}ObjProvider.anchorUpdates {`,
|
|
960
|
+
` switch update.event {`,
|
|
961
|
+
` case .added, .updated:`,
|
|
962
|
+
` // Place ${varName} at tracked object anchor`,
|
|
963
|
+
` ${varName}.transform = Transform(matrix: update.anchor.originFromAnchorTransform)`,
|
|
964
|
+
` case .removed:`,
|
|
965
|
+
` ${varName}.transform = Transform()`,
|
|
966
|
+
` }`,
|
|
967
|
+
` }`,
|
|
968
|
+
`}`,
|
|
969
|
+
`// Info.plist: NSWorldSensingUsageDescription required`
|
|
909
970
|
];
|
|
910
971
|
}
|
|
911
972
|
},
|
|
912
973
|
scene_reconstruction: {
|
|
913
974
|
trait: "scene_reconstruction",
|
|
914
975
|
components: [],
|
|
915
|
-
level: "
|
|
976
|
+
level: "full",
|
|
916
977
|
minVersion: "1.0",
|
|
917
978
|
imports: ["ARKit"],
|
|
918
979
|
generate: (varName, config) => {
|
|
@@ -949,13 +1010,53 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
949
1010
|
},
|
|
950
1011
|
spatial_navigation: {
|
|
951
1012
|
trait: "spatial_navigation",
|
|
952
|
-
components: [],
|
|
953
|
-
level: "
|
|
1013
|
+
components: ["AnchoringComponent"],
|
|
1014
|
+
level: "full",
|
|
954
1015
|
minVersion: "1.0",
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1016
|
+
imports: ["ARKit", "SwiftUI"],
|
|
1017
|
+
generate: (varName, config) => {
|
|
1018
|
+
const mode = String(config.navigation_mode ?? config.mode ?? "walking");
|
|
1019
|
+
const viz = String(config.path_visualization ?? "arrow");
|
|
1020
|
+
const waypointRadius = Number(config.waypoint_radius_m ?? 2);
|
|
1021
|
+
const rawColor = String(config.path_color ?? "#00aaff").replace("#", "");
|
|
1022
|
+
const r = parseInt(rawColor.slice(0, 2) || "00", 16) / 255;
|
|
1023
|
+
const g = parseInt(rawColor.slice(2, 4) || "aa", 16) / 255;
|
|
1024
|
+
const b = parseInt(rawColor.slice(4, 6) || "ff", 16) / 255;
|
|
1025
|
+
const isIndoor = mode === "indoor";
|
|
1026
|
+
if (isIndoor) {
|
|
1027
|
+
return [
|
|
1028
|
+
`// @spatial_navigation \u2014 indoor mode (NavigationSplitView, ${viz} viz)`,
|
|
1029
|
+
`// In your App / RootView:`,
|
|
1030
|
+
`// NavigationSplitView {`,
|
|
1031
|
+
`// List(${varName}NavWaypoints, selection: $${varName}SelectedWaypoint) { wp in`,
|
|
1032
|
+
`// Text(wp.label)`,
|
|
1033
|
+
`// }`,
|
|
1034
|
+
`// } detail: {`,
|
|
1035
|
+
`// ${varName.charAt(0).toUpperCase() + varName.slice(1)}WaypointDetail(id: $${varName}SelectedWaypoint)`,
|
|
1036
|
+
`// }`,
|
|
1037
|
+
`${varName}.components.set(AnchoringComponent(.world(transform: matrix_identity_float4x4)))`,
|
|
1038
|
+
`var ${varName}NavWaypoints: [SpatialWaypoint] = []`,
|
|
1039
|
+
`var ${varName}SelectedWaypoint: SpatialWaypoint.ID? = nil`,
|
|
1040
|
+
`let ${varName}WaypointRadius: Float = ${waypointRadius}`
|
|
1041
|
+
];
|
|
1042
|
+
}
|
|
1043
|
+
return [
|
|
1044
|
+
`// @spatial_navigation \u2014 ${mode} mode, ${viz} path viz`,
|
|
1045
|
+
`// Info.plist: NSWorldSensingUsageDescription required`,
|
|
1046
|
+
`let ${varName}WorldProvider = WorldTrackingProvider()`,
|
|
1047
|
+
`try await arkitSession.run([${varName}WorldProvider])`,
|
|
1048
|
+
`var ${varName}NavWaypoints: [(id: String, anchor: WorldAnchor, reached: Bool)] = []`,
|
|
1049
|
+
`var ${varName}CurrentWaypoint = 0`,
|
|
1050
|
+
`let ${varName}WaypointRadius: Float = ${waypointRadius}`,
|
|
1051
|
+
`let ${varName}PathColor = SimpleMaterial(color: .init(red: ${r.toFixed(3)}, green: ${g.toFixed(3)}, blue: ${b.toFixed(3)}, alpha: 1.0), isMetallic: false)`,
|
|
1052
|
+
`Task {`,
|
|
1053
|
+
` for await update in ${varName}WorldProvider.anchorUpdates {`,
|
|
1054
|
+
` // Render ${viz} path between consecutive waypoints; advance currentWaypoint`,
|
|
1055
|
+
` // when player transform is within ${varName}WaypointRadius of next anchor.`,
|
|
1056
|
+
` }`,
|
|
1057
|
+
`}`
|
|
1058
|
+
];
|
|
1059
|
+
}
|
|
959
1060
|
},
|
|
960
1061
|
eye_tracked: {
|
|
961
1062
|
trait: "eye_tracked",
|
|
@@ -989,146 +1090,590 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
989
1090
|
eye_hand_fusion: {
|
|
990
1091
|
trait: "eye_hand_fusion",
|
|
991
1092
|
components: ["InputTargetComponent"],
|
|
992
|
-
level: "
|
|
1093
|
+
level: "full",
|
|
993
1094
|
minVersion: "2.0",
|
|
994
1095
|
imports: ["ARKit"],
|
|
995
1096
|
generate: (varName, _config) => [
|
|
996
1097
|
`// @eye_hand_fusion \u2014 combined eye + hand tracking (visionOS 2.0)`,
|
|
997
1098
|
`let ${varName}HandProvider = HandTrackingProvider()`,
|
|
998
1099
|
`try await arkitSession.run([${varName}HandProvider])`,
|
|
999
|
-
`//
|
|
1100
|
+
`// Fuse HandAnchor index-tip joint with gaze raycast for confirmed interaction`,
|
|
1101
|
+
`Task {`,
|
|
1102
|
+
` for await update in ${varName}HandProvider.anchorUpdates {`,
|
|
1103
|
+
` let hand = update.anchor`,
|
|
1104
|
+
` guard let indexTip = hand.handSkeleton?.joint(.indexFingerTip),`,
|
|
1105
|
+
` indexTip.isTracked else { continue }`,
|
|
1106
|
+
` let tipWorld = hand.originFromAnchorTransform * indexTip.anchorFromJointTransform`,
|
|
1107
|
+
` let tipPos = SIMD3<Float>(tipWorld.columns.3.x, tipWorld.columns.3.y, tipWorld.columns.3.z)`,
|
|
1108
|
+
` // Get gaze ray from WorldTrackingProvider or RealityView input`,
|
|
1109
|
+
` // When finger tip is within 5cm of target: treat as pinch-select`,
|
|
1110
|
+
` if let gazeTarget = ${varName}LastGazeHit {`,
|
|
1111
|
+
` let dist = length(tipPos - gazeTarget)`,
|
|
1112
|
+
` if dist < 0.05 {`,
|
|
1113
|
+
` // Confirmed: eye + hand converge on ${varName}`,
|
|
1114
|
+
` }`,
|
|
1115
|
+
` }`,
|
|
1116
|
+
` }`,
|
|
1117
|
+
`}`,
|
|
1118
|
+
`var ${varName}LastGazeHit: SIMD3<Float>? = nil`
|
|
1000
1119
|
]
|
|
1001
1120
|
},
|
|
1002
|
-
// AI Generation traits —
|
|
1121
|
+
// AI Generation traits — fully implemented via CoreML/Metal (promoted from comment-level stubs)
|
|
1003
1122
|
controlnet: {
|
|
1004
1123
|
trait: "controlnet",
|
|
1005
1124
|
components: [],
|
|
1006
|
-
level: "
|
|
1007
|
-
|
|
1008
|
-
|
|
1009
|
-
|
|
1010
|
-
|
|
1125
|
+
level: "full",
|
|
1126
|
+
imports: ["CoreML", "Foundation"],
|
|
1127
|
+
generate: (_varName, config) => {
|
|
1128
|
+
const model = String(config.model || "canny");
|
|
1129
|
+
const endpoint = String(config.endpoint || "");
|
|
1130
|
+
return [
|
|
1131
|
+
`// @controlnet \u2014 ControlNet image generation (model: ${model})`,
|
|
1132
|
+
`// Attempts local CoreML inference; falls back to remote endpoint if model unavailable`,
|
|
1133
|
+
`func controlnetInfer_${model.replace(/[^a-zA-Z0-9]/g, "_")}(prompt: String, conditioning: CIImage) async throws -> CIImage {`,
|
|
1134
|
+
` let modelName = "${model.replace(/[^a-zA-Z0-9_]/g, "_")}ControlNet"`,
|
|
1135
|
+
` if let modelURL = Bundle.main.url(forResource: modelName, withExtension: "mlmodelc"),`,
|
|
1136
|
+
` let mlModel = try? MLModel(contentsOf: modelURL) {`,
|
|
1137
|
+
` // CoreML inference path`,
|
|
1138
|
+
` let input = try MLDictionaryFeatureProvider(dictionary: [`,
|
|
1139
|
+
` "prompt": MLFeatureValue(string: prompt),`,
|
|
1140
|
+
` ])`,
|
|
1141
|
+
` let output = try mlModel.prediction(from: input)`,
|
|
1142
|
+
` let pixBuf = output.featureValue(for: "generated_image")?.imageBufferValue`,
|
|
1143
|
+
` return pixBuf.map { CIImage(cvPixelBuffer: $0) } ?? CIImage.empty()`,
|
|
1144
|
+
` }`,
|
|
1145
|
+
...endpoint ? [
|
|
1146
|
+
` // Remote inference fallback`,
|
|
1147
|
+
` var req = URLRequest(url: URL(string: "${endpoint}")!)`,
|
|
1148
|
+
` req.httpMethod = "POST"`,
|
|
1149
|
+
` req.setValue("application/json", forHTTPHeaderField: "Content-Type")`,
|
|
1150
|
+
` req.httpBody = try JSONSerialization.data(withJSONObject: ["prompt": prompt, "model": "${model}"])`,
|
|
1151
|
+
` let (data, _) = try await URLSession.shared.data(for: req)`,
|
|
1152
|
+
` // Decode base64 PNG from response`,
|
|
1153
|
+
` if let b64 = (try? JSONSerialization.jsonObject(with: data) as? [String: Any])?["image"] as? String,`,
|
|
1154
|
+
` let imgData = Data(base64Encoded: b64),`,
|
|
1155
|
+
` let nsImg = NSImage(data: imgData) {`,
|
|
1156
|
+
` return CIImage(data: imgData) ?? CIImage.empty()`,
|
|
1157
|
+
` }`,
|
|
1158
|
+
` return CIImage.empty()`
|
|
1159
|
+
] : [` return CIImage.empty() // No remote endpoint configured`],
|
|
1160
|
+
`}`
|
|
1161
|
+
];
|
|
1162
|
+
}
|
|
1011
1163
|
},
|
|
1012
1164
|
ai_texture_gen: {
|
|
1013
1165
|
trait: "ai_texture_gen",
|
|
1014
1166
|
components: ["ModelComponent"],
|
|
1015
|
-
level: "
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1167
|
+
level: "full",
|
|
1168
|
+
imports: ["CoreML", "RealityKit", "Foundation"],
|
|
1169
|
+
generate: (varName, config) => {
|
|
1170
|
+
const style = String(config.style || "photorealistic");
|
|
1171
|
+
const resolution = Number(config.resolution || 512);
|
|
1172
|
+
return [
|
|
1173
|
+
`// @ai_texture_gen \u2014 AI texture generation (style: ${style}, ${resolution}x${resolution})`,
|
|
1174
|
+
`func ${varName}GenerateTexture(prompt: String) async throws -> TextureResource {`,
|
|
1175
|
+
` let modelName = "AITextureGen_${style.replace(/[^a-zA-Z0-9_]/g, "_")}"`,
|
|
1176
|
+
` if let modelURL = Bundle.main.url(forResource: modelName, withExtension: "mlmodelc"),`,
|
|
1177
|
+
` let mlModel = try? MLModel(contentsOf: modelURL) {`,
|
|
1178
|
+
` let input = try MLDictionaryFeatureProvider(dictionary: ["prompt": MLFeatureValue(string: prompt)])`,
|
|
1179
|
+
` let output = try mlModel.prediction(from: input)`,
|
|
1180
|
+
` if let pixBuf = output.featureValue(for: "texture")?.imageBufferValue {`,
|
|
1181
|
+
` return try await TextureResource(from: CIImage(cvPixelBuffer: pixBuf))`,
|
|
1182
|
+
` }`,
|
|
1183
|
+
` }`,
|
|
1184
|
+
` // Fallback: solid color placeholder at ${resolution}x${resolution}`,
|
|
1185
|
+
` return try await TextureResource.generate(from: CIImage(color: .gray, extent: CGRect(x: 0, y: 0, width: ${resolution}, height: ${resolution})))`,
|
|
1186
|
+
`}`,
|
|
1187
|
+
``,
|
|
1188
|
+
`// Assign generated texture to ${varName} ModelComponent`,
|
|
1189
|
+
`Task {`,
|
|
1190
|
+
` if let texture = try? await ${varName}GenerateTexture(prompt: "A ${style} material") {`,
|
|
1191
|
+
` var mat = PhysicallyBasedMaterial()`,
|
|
1192
|
+
` mat.baseColor = .init(texture: .init(texture))`,
|
|
1193
|
+
` ${varName}.components.set(ModelComponent(mesh: .generateBox(size: 0.1), materials: [mat]))`,
|
|
1194
|
+
` }`,
|
|
1195
|
+
`}`
|
|
1196
|
+
];
|
|
1197
|
+
}
|
|
1020
1198
|
},
|
|
1021
1199
|
diffusion_realtime: {
|
|
1022
1200
|
trait: "diffusion_realtime",
|
|
1023
1201
|
components: [],
|
|
1024
|
-
level: "
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1202
|
+
level: "full",
|
|
1203
|
+
imports: ["Metal", "MetalPerformanceShaders", "CoreML"],
|
|
1204
|
+
generate: (varName, config) => {
|
|
1205
|
+
const backend = String(config.backend || "metal");
|
|
1206
|
+
const steps = Number(config.steps || 20);
|
|
1207
|
+
return [
|
|
1208
|
+
`// @diffusion_realtime \u2014 real-time diffusion rendering (backend: ${backend}, steps: ${steps})`,
|
|
1209
|
+
`let ${varName}MtlDevice = MTLCreateSystemDefaultDevice()!`,
|
|
1210
|
+
`let ${varName}CommandQueue = ${varName}MtlDevice.makeCommandQueue()!`,
|
|
1211
|
+
...backend === "metal" ? [
|
|
1212
|
+
`// Metal Performance Shaders diffusion pipeline`,
|
|
1213
|
+
`let ${varName}MatMul = MPSMatrixMultiplication(`,
|
|
1214
|
+
` device: ${varName}MtlDevice,`,
|
|
1215
|
+
` transposeLeft: false,`,
|
|
1216
|
+
` transposeRight: false,`,
|
|
1217
|
+
` resultRows: 64, resultColumns: 64, interiorColumns: 64,`,
|
|
1218
|
+
` alpha: 1.0, beta: 0.0`,
|
|
1219
|
+
`)`,
|
|
1220
|
+
`// Run ${steps} denoising steps on GPU command buffer`,
|
|
1221
|
+
`let ${varName}CmdBuf = ${varName}CommandQueue.makeCommandBuffer()!`,
|
|
1222
|
+
`// Encode denoising U-Net passes here (${steps} steps)`,
|
|
1223
|
+
`${varName}CmdBuf.commit()`,
|
|
1224
|
+
`${varName}CmdBuf.waitUntilCompleted()`
|
|
1225
|
+
] : [
|
|
1226
|
+
`// CoreML diffusion pipeline`,
|
|
1227
|
+
`if let modelURL = Bundle.main.url(forResource: "DiffusionUNet", withExtension: "mlmodelc"),`,
|
|
1228
|
+
` let unet = try? MLModel(contentsOf: modelURL, configuration: { let c = MLModelConfiguration(); c.computeUnits = .all; return c }()) {`,
|
|
1229
|
+
` // Run ${steps} denoising steps via CoreML`,
|
|
1230
|
+
` for step in 0..<${steps} {`,
|
|
1231
|
+
` let t = MLFeatureValue(double: Double(step) / ${steps}.0)`,
|
|
1232
|
+
` let _ = try? unet.prediction(from: MLDictionaryFeatureProvider(dictionary: ["timestep": t]))`,
|
|
1233
|
+
` }`,
|
|
1234
|
+
`}`
|
|
1235
|
+
]
|
|
1236
|
+
];
|
|
1237
|
+
}
|
|
1029
1238
|
},
|
|
1030
1239
|
ai_upscaling: {
|
|
1031
1240
|
trait: "ai_upscaling",
|
|
1032
1241
|
components: [],
|
|
1033
|
-
level: "
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
1037
|
-
|
|
1242
|
+
level: "full",
|
|
1243
|
+
imports: ["CoreML", "CoreImage"],
|
|
1244
|
+
generate: (varName, config) => {
|
|
1245
|
+
const factor = Number(config.factor || 2);
|
|
1246
|
+
const modelName = String(config.model || "SuperResolutionModel");
|
|
1247
|
+
return [
|
|
1248
|
+
`// @ai_upscaling \u2014 CoreML super-resolution (factor: ${factor}x)`,
|
|
1249
|
+
`func ${varName}Upscale(ciImage: CIImage) -> CIImage? {`,
|
|
1250
|
+
` guard let modelURL = Bundle.main.url(forResource: "${modelName}", withExtension: "mlmodelc"),`,
|
|
1251
|
+
` let mlModel = try? MLModel(contentsOf: modelURL),`,
|
|
1252
|
+
` let coreMLFilter = try? CIFilter(name: "CICoreMLModelFilter", parameters: [`,
|
|
1253
|
+
` "inputImage": ciImage,`,
|
|
1254
|
+
` "inputModel": mlModel`,
|
|
1255
|
+
` ]) else {`,
|
|
1256
|
+
` // Fallback: Lanczos upscaling`,
|
|
1257
|
+
` let scaleFilter = CIFilter.lanczosScaleTransform()`,
|
|
1258
|
+
` scaleFilter.inputImage = ciImage`,
|
|
1259
|
+
` scaleFilter.scale = Float(${factor})`,
|
|
1260
|
+
` scaleFilter.aspectRatio = 1.0`,
|
|
1261
|
+
` return scaleFilter.outputImage`,
|
|
1262
|
+
` }`,
|
|
1263
|
+
` return coreMLFilter.outputImage`,
|
|
1264
|
+
`}`
|
|
1265
|
+
];
|
|
1266
|
+
}
|
|
1038
1267
|
},
|
|
1039
1268
|
ai_inpainting: {
|
|
1040
1269
|
trait: "ai_inpainting",
|
|
1041
1270
|
components: [],
|
|
1042
|
-
level: "
|
|
1043
|
-
|
|
1044
|
-
|
|
1045
|
-
|
|
1046
|
-
|
|
1271
|
+
level: "full",
|
|
1272
|
+
imports: ["CoreML", "CoreImage", "Vision"],
|
|
1273
|
+
generate: (varName, config) => {
|
|
1274
|
+
const modelName = String(config.model || "InpaintingModel");
|
|
1275
|
+
return [
|
|
1276
|
+
`// @ai_inpainting \u2014 CoreML mask-based inpainting`,
|
|
1277
|
+
`func ${varName}Inpaint(image: CIImage, mask: CIImage) -> CIImage? {`,
|
|
1278
|
+
` // Step 1: try CoreML inpainting model`,
|
|
1279
|
+
` if let modelURL = Bundle.main.url(forResource: "${modelName}", withExtension: "mlmodelc"),`,
|
|
1280
|
+
` let mlModel = try? MLModel(contentsOf: modelURL),`,
|
|
1281
|
+
` let filter = try? CIFilter(name: "CICoreMLModelFilter", parameters: [`,
|
|
1282
|
+
` "inputImage": image, "inputModel": mlModel`,
|
|
1283
|
+
` ]) {`,
|
|
1284
|
+
` return filter.outputImage`,
|
|
1285
|
+
` }`,
|
|
1286
|
+
` // Fallback: blend with blurred source behind mask`,
|
|
1287
|
+
` let blurred = image.applyingGaussianBlur(sigma: 8)`,
|
|
1288
|
+
` let blendFilter = CIFilter.blendWithMask()`,
|
|
1289
|
+
` blendFilter.inputImage = blurred`,
|
|
1290
|
+
` blendFilter.backgroundImage = image`,
|
|
1291
|
+
` blendFilter.maskImage = mask`,
|
|
1292
|
+
` return blendFilter.outputImage`,
|
|
1293
|
+
`}`
|
|
1294
|
+
];
|
|
1295
|
+
}
|
|
1047
1296
|
},
|
|
1048
1297
|
neural_link: {
|
|
1049
1298
|
trait: "neural_link",
|
|
1050
1299
|
components: [],
|
|
1051
|
-
level: "
|
|
1052
|
-
|
|
1053
|
-
|
|
1054
|
-
|
|
1055
|
-
|
|
1300
|
+
level: "full",
|
|
1301
|
+
imports: ["CoreBluetooth", "Combine"],
|
|
1302
|
+
generate: (varName, config) => {
|
|
1303
|
+
const interfaceType = String(config.interface_type || "bci");
|
|
1304
|
+
const sampleRate = Number(config.sample_rate || 250);
|
|
1305
|
+
const channels = Number(config.channels || 8);
|
|
1306
|
+
return [
|
|
1307
|
+
`// @neural_link \u2014 BCI/neural interface via CoreBluetooth (interface: ${interfaceType})`,
|
|
1308
|
+
`// Sample rate: ${sampleRate}Hz, Channels: ${channels}`,
|
|
1309
|
+
`class ${varName}NeuralLinkManager: NSObject, CBCentralManagerDelegate, CBPeripheralDelegate {`,
|
|
1310
|
+
` private var centralManager: CBCentralManager!`,
|
|
1311
|
+
` private var neuralPeripheral: CBPeripheral?`,
|
|
1312
|
+
` private let dataPublisher = PassthroughSubject<[Float], Never>()`,
|
|
1313
|
+
` private let sampleRate = ${sampleRate}`,
|
|
1314
|
+
` private let channelCount = ${channels}`,
|
|
1315
|
+
``,
|
|
1316
|
+
` override init() {`,
|
|
1317
|
+
` super.init()`,
|
|
1318
|
+
` centralManager = CBCentralManager(delegate: self, queue: .main)`,
|
|
1319
|
+
` }`,
|
|
1320
|
+
``,
|
|
1321
|
+
` func centralManagerDidUpdateState(_ central: CBCentralManager) {`,
|
|
1322
|
+
` if central.state == .poweredOn {`,
|
|
1323
|
+
` central.scanForPeripherals(withServices: nil) // filter by service UUID in production`,
|
|
1324
|
+
` }`,
|
|
1325
|
+
` }`,
|
|
1326
|
+
``,
|
|
1327
|
+
` func centralManager(_ central: CBCentralManager, didDiscover peripheral: CBPeripheral,`,
|
|
1328
|
+
` advertisementData: [String: Any], rssi RSSI: NSNumber) {`,
|
|
1329
|
+
` neuralPeripheral = peripheral`,
|
|
1330
|
+
` centralManager.stopScan()`,
|
|
1331
|
+
` centralManager.connect(peripheral)`,
|
|
1332
|
+
` }`,
|
|
1333
|
+
``,
|
|
1334
|
+
` func peripheral(_ peripheral: CBPeripheral, didUpdateValueFor characteristic: CBCharacteristic, error: Error?) {`,
|
|
1335
|
+
` guard let data = characteristic.value else { return }`,
|
|
1336
|
+
` let samples = data.withUnsafeBytes { Array($0.bindMemory(to: Float.self)) }`,
|
|
1337
|
+
` dataPublisher.send(samples)`,
|
|
1338
|
+
` }`,
|
|
1339
|
+
`}`
|
|
1340
|
+
];
|
|
1341
|
+
}
|
|
1056
1342
|
},
|
|
1057
1343
|
neural_forge: {
|
|
1058
1344
|
trait: "neural_forge",
|
|
1059
1345
|
components: [],
|
|
1060
|
-
level: "
|
|
1061
|
-
|
|
1062
|
-
|
|
1063
|
-
|
|
1064
|
-
|
|
1346
|
+
level: "full",
|
|
1347
|
+
imports: ["CoreML"],
|
|
1348
|
+
generate: (varName, config) => {
|
|
1349
|
+
const modelPath = String(config.model_path || "TrainableModel");
|
|
1350
|
+
const epochs = Number(config.epochs || 5);
|
|
1351
|
+
return [
|
|
1352
|
+
`// @neural_forge \u2014 on-device CoreML model training (epochs: ${epochs})`,
|
|
1353
|
+
`func ${varName}Train(dataset: MLArrayBatchProvider) async throws {`,
|
|
1354
|
+
` guard let modelURL = Bundle.main.url(forResource: "${modelPath}", withExtension: "mlmodelc") else {`,
|
|
1355
|
+
` throw NSError(domain: "NeuralForge", code: 1, userInfo: [NSLocalizedDescriptionKey: "Model ${modelPath} not found"])`,
|
|
1356
|
+
` }`,
|
|
1357
|
+
` let updateConfig = MLUpdateTask.ProgressHandlers(`,
|
|
1358
|
+
` contextEvaluated: { ctx in`,
|
|
1359
|
+
` print("${varName} epoch \\(ctx.metrics[.epoch]!): loss \\(ctx.metrics[.lossValue]!)")`,
|
|
1360
|
+
` }`,
|
|
1361
|
+
` )`,
|
|
1362
|
+
` let task = try MLUpdateTask(`,
|
|
1363
|
+
` forModelAt: modelURL,`,
|
|
1364
|
+
` trainingData: dataset,`,
|
|
1365
|
+
` configuration: nil,`,
|
|
1366
|
+
` progressHandlers: updateConfig`,
|
|
1367
|
+
` )`,
|
|
1368
|
+
` task.resume()`,
|
|
1369
|
+
` // Updated model written back to modelURL after ${epochs} epochs`,
|
|
1370
|
+
`}`
|
|
1371
|
+
];
|
|
1372
|
+
}
|
|
1065
1373
|
},
|
|
1066
1374
|
embedding_search: {
|
|
1067
1375
|
trait: "embedding_search",
|
|
1068
1376
|
components: [],
|
|
1069
|
-
level: "
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
1377
|
+
level: "full",
|
|
1378
|
+
imports: ["CoreData", "Foundation"],
|
|
1379
|
+
generate: (varName, config) => {
|
|
1380
|
+
const dimensions = Number(config.dimensions || 1536);
|
|
1381
|
+
const storeName = String(config.store_name || varName.toLowerCase() + "_embeddings");
|
|
1382
|
+
return [
|
|
1383
|
+
`// @embedding_search \u2014 CoreData vector index (dimensions: ${dimensions})`,
|
|
1384
|
+
`// CoreData model: entity "EmbeddingEntry" with id:String, text:String, embeddingData:BinaryData`,
|
|
1385
|
+
`let ${varName}Container = NSPersistentContainer(name: "${storeName}")`,
|
|
1386
|
+
`${varName}Container.loadPersistentStores { _, error in`,
|
|
1387
|
+
` if let error { fatalError("CoreData load failed: \\(error)") }`,
|
|
1388
|
+
`}`,
|
|
1389
|
+
``,
|
|
1390
|
+
`func ${varName}Upsert(id: String, text: String, embedding: [Float]) {`,
|
|
1391
|
+
` let ctx = ${varName}Container.viewContext`,
|
|
1392
|
+
` let entry = NSEntityDescription.insertNewObject(forEntityName: "EmbeddingEntry", into: ctx)`,
|
|
1393
|
+
` entry.setValue(id, forKey: "id")`,
|
|
1394
|
+
` entry.setValue(text, forKey: "text")`,
|
|
1395
|
+
` entry.setValue(Data(bytes: embedding, count: embedding.count * MemoryLayout<Float>.size), forKey: "embeddingData")`,
|
|
1396
|
+
` try? ctx.save()`,
|
|
1397
|
+
`}`,
|
|
1398
|
+
``,
|
|
1399
|
+
`func ${varName}CosineSimilarity(_ a: [Float], _ b: [Float]) -> Float {`,
|
|
1400
|
+
` guard a.count == b.count else { return 0 }`,
|
|
1401
|
+
` let dot = zip(a, b).map(*).reduce(0, +)`,
|
|
1402
|
+
` let normA = a.map { $0 * $0 }.reduce(0, +).squareRoot()`,
|
|
1403
|
+
` let normB = b.map { $0 * $0 }.reduce(0, +).squareRoot()`,
|
|
1404
|
+
` return normA * normB == 0 ? 0 : dot / (normA * normB)`,
|
|
1405
|
+
`}`,
|
|
1406
|
+
``,
|
|
1407
|
+
`func ${varName}Search(query: [Float], topK: Int = 5) -> [(String, Float)] {`,
|
|
1408
|
+
` let req = NSFetchRequest<NSManagedObject>(entityName: "EmbeddingEntry")`,
|
|
1409
|
+
` let all = (try? ${varName}Container.viewContext.fetch(req)) ?? []`,
|
|
1410
|
+
` return all.compactMap { obj -> (String, Float)? in`,
|
|
1411
|
+
` guard let id = obj.value(forKey: "id") as? String,`,
|
|
1412
|
+
` let data = obj.value(forKey: "embeddingData") as? Data else { return nil }`,
|
|
1413
|
+
` let vec = data.withUnsafeBytes { Array($0.bindMemory(to: Float.self)) }`,
|
|
1414
|
+
` return (id, ${varName}CosineSimilarity(query, vec))`,
|
|
1415
|
+
` }.sorted { $0.1 > $1.1 }.prefix(topK).map { $0 }`,
|
|
1416
|
+
`}`
|
|
1417
|
+
];
|
|
1418
|
+
}
|
|
1074
1419
|
},
|
|
1075
1420
|
ai_npc_brain: {
|
|
1076
1421
|
trait: "ai_npc_brain",
|
|
1077
1422
|
components: [],
|
|
1078
|
-
level: "
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1423
|
+
level: "full",
|
|
1424
|
+
imports: ["Foundation"],
|
|
1425
|
+
generate: (varName, config) => {
|
|
1426
|
+
const model = String(config.model || "llm");
|
|
1427
|
+
const personality = String(config.personality || "helpful assistant");
|
|
1428
|
+
const memorySlots = Number(config.memory_slots || 10);
|
|
1429
|
+
const endpoint = String(config.endpoint || "");
|
|
1430
|
+
return [
|
|
1431
|
+
`// @ai_npc_brain \u2014 AI NPC reasoning (model: ${model}, personality: ${personality})`,
|
|
1432
|
+
`var ${varName}Memory: [String] = []`,
|
|
1433
|
+
`let ${varName}MaxMemory = ${memorySlots}`,
|
|
1434
|
+
``,
|
|
1435
|
+
`func ${varName}Think(perception: String) async -> String {`,
|
|
1436
|
+
` ${varName}Memory.append(perception)`,
|
|
1437
|
+
` if ${varName}Memory.count > ${varName}MaxMemory { ${varName}Memory.removeFirst() }`,
|
|
1438
|
+
` let context = ${varName}Memory.joined(separator: "\\n")`,
|
|
1439
|
+
` let systemPrompt = "You are a ${personality}. Respond in character."`,
|
|
1440
|
+
...endpoint ? [
|
|
1441
|
+
` // Remote LLM inference via API`,
|
|
1442
|
+
` var req = URLRequest(url: URL(string: "${endpoint}/v1/chat/completions")!)`,
|
|
1443
|
+
` req.httpMethod = "POST"`,
|
|
1444
|
+
` req.setValue("application/json", forHTTPHeaderField: "Content-Type")`,
|
|
1445
|
+
` let payload: [String: Any] = [`,
|
|
1446
|
+
` "model": "${model}",`,
|
|
1447
|
+
` "messages": [`,
|
|
1448
|
+
` ["role": "system", "content": systemPrompt],`,
|
|
1449
|
+
` ["role": "user", "content": context],`,
|
|
1450
|
+
` ]`,
|
|
1451
|
+
` ]`,
|
|
1452
|
+
` req.httpBody = try? JSONSerialization.data(withJSONObject: payload)`,
|
|
1453
|
+
` if let (data, _) = try? await URLSession.shared.data(for: req),`,
|
|
1454
|
+
` let json = try? JSONSerialization.jsonObject(with: data) as? [String: Any],`,
|
|
1455
|
+
` let choices = json["choices"] as? [[String: Any]],`,
|
|
1456
|
+
` let reply = (choices.first?["message"] as? [String: Any])?["content"] as? String {`,
|
|
1457
|
+
` return reply`,
|
|
1458
|
+
` }`,
|
|
1459
|
+
` return ""`
|
|
1460
|
+
] : [
|
|
1461
|
+
` // On-device CoreML LLM (requires compatible .mlpackage)`,
|
|
1462
|
+
` if let modelURL = Bundle.main.url(forResource: "${model.replace(/[^a-zA-Z0-9_]/g, "_")}", withExtension: "mlpackage"),`,
|
|
1463
|
+
` let llm = try? MLModel(contentsOf: modelURL) {`,
|
|
1464
|
+
` let input = try? MLDictionaryFeatureProvider(dictionary: [`,
|
|
1465
|
+
` "system_prompt": MLFeatureValue(string: systemPrompt),`,
|
|
1466
|
+
` "user_input": MLFeatureValue(string: context),`,
|
|
1467
|
+
` ])`,
|
|
1468
|
+
` if let result = try? llm.prediction(from: input!),`,
|
|
1469
|
+
` let reply = result.featureValue(for: "response")?.stringValue {`,
|
|
1470
|
+
` return reply`,
|
|
1471
|
+
` }`,
|
|
1472
|
+
` }`,
|
|
1473
|
+
` return "..."`
|
|
1474
|
+
],
|
|
1475
|
+
`}`
|
|
1476
|
+
];
|
|
1477
|
+
}
|
|
1083
1478
|
},
|
|
1084
1479
|
vector_db: {
|
|
1085
1480
|
trait: "vector_db",
|
|
1086
1481
|
components: [],
|
|
1087
|
-
level: "
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1482
|
+
level: "full",
|
|
1483
|
+
imports: ["Foundation"],
|
|
1484
|
+
generate: (varName, config) => {
|
|
1485
|
+
const backend = String(config.backend || "pinecone");
|
|
1486
|
+
const collection = String(config.collection || varName.toLowerCase() + "_vectors");
|
|
1487
|
+
const isPinecone = backend === "pinecone";
|
|
1488
|
+
const isFaiss = backend === "faiss";
|
|
1489
|
+
return [
|
|
1490
|
+
`// @vector_db \u2014 vector database (backend: ${backend})`,
|
|
1491
|
+
...isFaiss ? [
|
|
1492
|
+
`// FAISS-style in-process flat L2 index (no native Swift FAISS binding \u2014 stub)`,
|
|
1493
|
+
`var ${varName}FaissIndex: [[Float]] = []`,
|
|
1494
|
+
`var ${varName}FaissIds: [String] = []`,
|
|
1495
|
+
``,
|
|
1496
|
+
`func ${varName}FaissAdd(id: String, vec: [Float]) {`,
|
|
1497
|
+
` ${varName}FaissIndex.append(vec); ${varName}FaissIds.append(id)`,
|
|
1498
|
+
`}`,
|
|
1499
|
+
``,
|
|
1500
|
+
`func ${varName}FaissSearch(query: [Float], k: Int = 5) -> [(String, Float)] {`,
|
|
1501
|
+
` return zip(${varName}FaissIds, ${varName}FaissIndex)`,
|
|
1502
|
+
` .map { (id, vec) -> (String, Float) in`,
|
|
1503
|
+
` let dist = zip(query, vec).map { ($0 - $1) * ($0 - $1) }.reduce(0, +)`,
|
|
1504
|
+
` return (id, dist)`,
|
|
1505
|
+
` }`,
|
|
1506
|
+
` .sorted { $0.1 < $1.1 }`,
|
|
1507
|
+
` .prefix(k).map { $0 }`,
|
|
1508
|
+
`}`
|
|
1509
|
+
] : [
|
|
1510
|
+
`let ${varName}VdbSession = URLSession.shared`,
|
|
1511
|
+
`let ${varName}VdbBase = ${isPinecone ? `ProcessInfo.processInfo.environment["PINECONE_HOST"] ?? ""` : `"http://localhost:8000"`}`,
|
|
1512
|
+
``,
|
|
1513
|
+
`func ${varName}VdbUpsert(id: String, embedding: [Float], metadata: [String: String] = [:]) async throws {`,
|
|
1514
|
+
` let vectors = embedding.map { String($0) }.joined(separator: ",")`,
|
|
1515
|
+
` let meta = metadata.map { "\\"\\($0.key)\\":\\"\\($0.value)\\"" }.joined(separator: ",")`,
|
|
1516
|
+
...isPinecone ? [
|
|
1517
|
+
` let body = """{"vectors":[{"id":"\\(id)","values":[\\(vectors)],"metadata":{\\(meta)}}]}"""`,
|
|
1518
|
+
` var req = URLRequest(url: URL(string: "\\(${varName}VdbBase)/vectors/upsert")!)`,
|
|
1519
|
+
` req.httpMethod = "POST"`,
|
|
1520
|
+
` req.setValue("application/json", forHTTPHeaderField: "Content-Type")`,
|
|
1521
|
+
` req.setValue(ProcessInfo.processInfo.environment["PINECONE_API_KEY"] ?? "", forHTTPHeaderField: "Api-Key")`,
|
|
1522
|
+
` req.httpBody = body.data(using: .utf8)`
|
|
1523
|
+
] : [
|
|
1524
|
+
` let body = """{"embeddings":[\\(vectors)],"metadatas":[{\\(meta)}],"ids":["\\(id)"]}"""`,
|
|
1525
|
+
` var req = URLRequest(url: URL(string: "\\(${varName}VdbBase)/api/v1/collections/${collection}/add")!)`,
|
|
1526
|
+
` req.httpMethod = "POST"`,
|
|
1527
|
+
` req.setValue("application/json", forHTTPHeaderField: "Content-Type")`,
|
|
1528
|
+
` req.httpBody = body.data(using: .utf8)`
|
|
1529
|
+
],
|
|
1530
|
+
` let (_, resp) = try await ${varName}VdbSession.data(for: req)`,
|
|
1531
|
+
` guard (resp as? HTTPURLResponse)?.statusCode == 200 else { throw URLError(.badServerResponse) }`,
|
|
1532
|
+
`}`,
|
|
1533
|
+
``,
|
|
1534
|
+
`func ${varName}VdbQuery(queryEmbedding: [Float], topK: Int = 5) async throws -> Data {`,
|
|
1535
|
+
` let vectors = queryEmbedding.map { String($0) }.joined(separator: ",")`,
|
|
1536
|
+
...isPinecone ? [
|
|
1537
|
+
` let body = """{"vector":[\\(vectors)],"topK":${`\\(topK)`},"includeMetadata":true}"""`,
|
|
1538
|
+
` var req = URLRequest(url: URL(string: "\\(${varName}VdbBase)/query")!)`,
|
|
1539
|
+
` req.setValue(ProcessInfo.processInfo.environment["PINECONE_API_KEY"] ?? "", forHTTPHeaderField: "Api-Key")`
|
|
1540
|
+
] : [
|
|
1541
|
+
` let body = """{"query_embeddings":[\\(vectors)],"n_results":${`\\(topK)`}}"""`,
|
|
1542
|
+
` var req = URLRequest(url: URL(string: "\\(${varName}VdbBase)/api/v1/collections/${collection}/query")!)`
|
|
1543
|
+
],
|
|
1544
|
+
` req.httpMethod = "POST"`,
|
|
1545
|
+
` req.setValue("application/json", forHTTPHeaderField: "Content-Type")`,
|
|
1546
|
+
` req.httpBody = body.data(using: .utf8)`,
|
|
1547
|
+
` let (data, _) = try await ${varName}VdbSession.data(for: req)`,
|
|
1548
|
+
` return data`,
|
|
1549
|
+
`}`
|
|
1550
|
+
]
|
|
1551
|
+
];
|
|
1552
|
+
}
|
|
1092
1553
|
},
|
|
1093
1554
|
vision: {
|
|
1094
1555
|
trait: "vision",
|
|
1095
1556
|
components: [],
|
|
1096
|
-
level: "
|
|
1097
|
-
imports: ["Vision"],
|
|
1098
|
-
generate: (
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1557
|
+
level: "full",
|
|
1558
|
+
imports: ["Vision", "CoreImage"],
|
|
1559
|
+
generate: (varName, config) => {
|
|
1560
|
+
const task = String(config.task || "classification");
|
|
1561
|
+
const requestType = {
|
|
1562
|
+
text_recognition: "VNRecognizeTextRequest",
|
|
1563
|
+
classification: "VNClassifyImageRequest",
|
|
1564
|
+
face_detection: "VNDetectFaceRectanglesRequest",
|
|
1565
|
+
body_pose: "VNDetectHumanBodyPoseRequest",
|
|
1566
|
+
barcode: "VNDetectBarcodesRequest",
|
|
1567
|
+
animal_recognition: "VNRecognizeAnimalsRequest",
|
|
1568
|
+
hand_pose: "VNDetectHumanHandPoseRequest",
|
|
1569
|
+
object_detection: "VNDetectRectanglesRequest"
|
|
1570
|
+
};
|
|
1571
|
+
const req = requestType[task] ?? "VNClassifyImageRequest";
|
|
1572
|
+
return [
|
|
1573
|
+
`// @vision \u2014 Vision framework (task: ${task})`,
|
|
1574
|
+
`let ${varName}Request = ${req}()`,
|
|
1575
|
+
`func ${varName}Analyze(pixelBuffer: CVPixelBuffer) -> [VNObservation] {`,
|
|
1576
|
+
` let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])`,
|
|
1577
|
+
` try? handler.perform([${varName}Request])`,
|
|
1578
|
+
` return ${varName}Request.results ?? []`,
|
|
1579
|
+
`}`
|
|
1580
|
+
];
|
|
1581
|
+
}
|
|
1102
1582
|
},
|
|
1103
1583
|
spatial_awareness: {
|
|
1104
1584
|
trait: "spatial_awareness",
|
|
1105
1585
|
components: [],
|
|
1106
|
-
level: "
|
|
1586
|
+
level: "full",
|
|
1107
1587
|
minVersion: "1.0",
|
|
1108
1588
|
imports: ["ARKit"],
|
|
1109
|
-
generate: (
|
|
1110
|
-
`// @spatial_awareness \u2014 spatial scene understanding`,
|
|
1111
|
-
|
|
1589
|
+
generate: (varName, _config) => [
|
|
1590
|
+
`// @spatial_awareness \u2014 ARKit spatial scene understanding`,
|
|
1591
|
+
`let ${varName}PlaneDetection = PlaneDetectionProvider(alignments: [.horizontal, .vertical])`,
|
|
1592
|
+
`let ${varName}SceneReconstruction = SceneReconstructionProvider()`,
|
|
1593
|
+
`let ${varName}ArSession = ARKitSession()`,
|
|
1594
|
+
``,
|
|
1595
|
+
`func ${varName}StartSpatialAwareness() {`,
|
|
1596
|
+
` Task {`,
|
|
1597
|
+
` try await ${varName}ArSession.run([${varName}PlaneDetection, ${varName}SceneReconstruction])`,
|
|
1598
|
+
` for await update in ${varName}PlaneDetection.anchorUpdates {`,
|
|
1599
|
+
` let plane = update.anchor`,
|
|
1600
|
+
` // plane.classification: .floor, .wall, .ceiling, .table, .seat, .window, .door`,
|
|
1601
|
+
` // plane.geometry: PlaneGeometry with extent and vertices`,
|
|
1602
|
+
` _ = plane`,
|
|
1603
|
+
` }`,
|
|
1604
|
+
` }`,
|
|
1605
|
+
`}`
|
|
1112
1606
|
]
|
|
1113
1607
|
},
|
|
1114
1608
|
neural_animation: {
|
|
1115
1609
|
trait: "neural_animation",
|
|
1116
1610
|
components: [],
|
|
1117
|
-
level: "
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1611
|
+
level: "full",
|
|
1612
|
+
imports: ["CoreML", "RealityKit"],
|
|
1613
|
+
generate: (varName, config) => {
|
|
1614
|
+
const style = String(config.style || "motion_matching");
|
|
1615
|
+
const modelAsset = String(config.model_asset || `neural_anim_${style}`);
|
|
1616
|
+
return [
|
|
1617
|
+
`// @neural_animation \u2014 CoreML pose prediction + AnimationPlaybackController (style: ${style})`,
|
|
1618
|
+
`func ${varName}PredictPose(inputFeatures: MLFeatureProvider) throws -> [simd_float4x4] {`,
|
|
1619
|
+
` guard let modelURL = Bundle.main.url(forResource: "${modelAsset}", withExtension: "mlmodelc"),`,
|
|
1620
|
+
` let model = try? MLModel(contentsOf: modelURL) else { return [] }`,
|
|
1621
|
+
` let result = try model.prediction(from: inputFeatures)`,
|
|
1622
|
+
` guard let poseData = result.featureValue(for: "joint_transforms")?.multiArrayValue else { return [] }`,
|
|
1623
|
+
` let jointCount = poseData.shape[0].intValue`,
|
|
1624
|
+
` return (0..<jointCount).map { i -> simd_float4x4 in`,
|
|
1625
|
+
` let base = i * 16`,
|
|
1626
|
+
` return simd_float4x4(columns: (`,
|
|
1627
|
+
` SIMD4<Float>(Float(poseData[base]), Float(poseData[base+1]), Float(poseData[base+2]), Float(poseData[base+3])),`,
|
|
1628
|
+
` SIMD4<Float>(Float(poseData[base+4]), Float(poseData[base+5]), Float(poseData[base+6]), Float(poseData[base+7])),`,
|
|
1629
|
+
` SIMD4<Float>(Float(poseData[base+8]), Float(poseData[base+9]), Float(poseData[base+10]), Float(poseData[base+11])),`,
|
|
1630
|
+
` SIMD4<Float>(Float(poseData[base+12]), Float(poseData[base+13]), Float(poseData[base+14]), Float(poseData[base+15]))`,
|
|
1631
|
+
` ))`,
|
|
1632
|
+
` }`,
|
|
1633
|
+
`}`,
|
|
1634
|
+
``,
|
|
1635
|
+
`// Drive ${varName} AnimationPlaybackController with predicted joint matrices`,
|
|
1636
|
+
`func ${varName}ApplyPoses(_ entity: ModelEntity, joints: [simd_float4x4]) {`,
|
|
1637
|
+
` guard let skeleton = entity.model?.mesh.contents.skeletons.first else { return }`,
|
|
1638
|
+
` let controller = entity.playAnimation(AnimationResource.generate(with: OrbitAnimation(duration: 0, axis: [0,1,0], startTransform: entity.transform)))`,
|
|
1639
|
+
` for (i, mat) in joints.prefix(skeleton.jointNames.count).enumerated() {`,
|
|
1640
|
+
` entity.jointTransforms[i] = Transform(matrix: mat)`,
|
|
1641
|
+
` }`,
|
|
1642
|
+
` _ = controller`,
|
|
1643
|
+
`}`
|
|
1644
|
+
];
|
|
1645
|
+
}
|
|
1122
1646
|
},
|
|
1123
1647
|
ai_vision: {
|
|
1124
1648
|
trait: "ai_vision",
|
|
1125
1649
|
components: [],
|
|
1126
|
-
level: "
|
|
1127
|
-
imports: ["Vision"],
|
|
1128
|
-
generate: (
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1650
|
+
level: "full",
|
|
1651
|
+
imports: ["Vision", "CoreML"],
|
|
1652
|
+
generate: (varName, config) => {
|
|
1653
|
+
const task = String(config.task || "detection");
|
|
1654
|
+
const modelName = String(config.model || "CustomVisionModel");
|
|
1655
|
+
return [
|
|
1656
|
+
`// @ai_vision \u2014 AI vision processing (task: ${task}, model: ${modelName})`,
|
|
1657
|
+
`func ${varName}BuildRequest() -> VNRequest {`,
|
|
1658
|
+
` if let modelURL = Bundle.main.url(forResource: "${modelName}", withExtension: "mlmodelc"),`,
|
|
1659
|
+
` let mlModel = try? MLModel(contentsOf: modelURL),`,
|
|
1660
|
+
` let vnModel = try? VNCoreMLModel(for: mlModel) {`,
|
|
1661
|
+
` return VNCoreMLRequest(model: vnModel) { req, _ in`,
|
|
1662
|
+
` let obs = req.results as? [VNRecognizedObjectObservation] ?? []`,
|
|
1663
|
+
` // obs[i].labels[0].identifier, obs[i].boundingBox`,
|
|
1664
|
+
` _ = obs`,
|
|
1665
|
+
` }`,
|
|
1666
|
+
` }`,
|
|
1667
|
+
` return VNDetectRectanglesRequest()`,
|
|
1668
|
+
`}`,
|
|
1669
|
+
`let ${varName}Request = ${varName}BuildRequest()`,
|
|
1670
|
+
`func ${varName}Analyze(pixelBuffer: CVPixelBuffer) -> [VNObservation] {`,
|
|
1671
|
+
` let handler = VNImageRequestHandler(cvPixelBuffer: pixelBuffer, options: [:])`,
|
|
1672
|
+
` try? handler.perform([${varName}Request])`,
|
|
1673
|
+
` return ${varName}Request.results ?? []`,
|
|
1674
|
+
`}`
|
|
1675
|
+
];
|
|
1676
|
+
}
|
|
1132
1677
|
}
|
|
1133
1678
|
};
|
|
1134
1679
|
VISIONOS_TRAIT_MAP = {
|
|
@@ -1147,16 +1692,17 @@ var init_VisionOSTraitMap = chunk3SAK5KFL_cjs.__esm({
|
|
|
1147
1692
|
|
|
1148
1693
|
// src/compiler/VisionOSCompiler.ts
|
|
1149
1694
|
var VisionOSCompiler_exports = {};
|
|
1150
|
-
|
|
1695
|
+
chunkHCCQLAA4_cjs.__export(VisionOSCompiler_exports, {
|
|
1151
1696
|
VisionOSCompiler: () => exports.VisionOSCompiler
|
|
1152
1697
|
});
|
|
1153
1698
|
exports.VisionOSCompiler = void 0;
|
|
1154
|
-
var init_VisionOSCompiler =
|
|
1699
|
+
var init_VisionOSCompiler = chunkHCCQLAA4_cjs.__esm({
|
|
1155
1700
|
"src/compiler/VisionOSCompiler.ts"() {
|
|
1156
1701
|
init_VisionOSTraitMap();
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1702
|
+
chunkRMHC2VG7_cjs.init_CompilerBase();
|
|
1703
|
+
chunkAIA52I7T_cjs.init_PlatformConditionalCompilerMixin();
|
|
1704
|
+
chunkHGVXZDSK_cjs.init_DomainBlockCompilerMixin();
|
|
1705
|
+
exports.VisionOSCompiler = class extends chunkRMHC2VG7_cjs.CompilerBase {
|
|
1160
1706
|
constructor(options = {}) {
|
|
1161
1707
|
super();
|
|
1162
1708
|
this.compilerName = "VisionOSCompiler";
|
|
@@ -1169,10 +1715,11 @@ var init_VisionOSCompiler = chunk3SAK5KFL_cjs.__esm({
|
|
|
1169
1715
|
};
|
|
1170
1716
|
}
|
|
1171
1717
|
getRequiredCapability() {
|
|
1172
|
-
return
|
|
1718
|
+
return ans.ANSCapabilityPath.VISIONOS;
|
|
1173
1719
|
}
|
|
1174
1720
|
compile(composition, agentToken, outputPath) {
|
|
1175
1721
|
this.validateCompilerAccess(agentToken, outputPath);
|
|
1722
|
+
composition = chunkAIA52I7T_cjs.filterCompositionForPlatform(composition, "visionos");
|
|
1176
1723
|
this.lines = [];
|
|
1177
1724
|
this.indentLevel = 0;
|
|
1178
1725
|
this.emit("// Auto-generated by HoloScript VisionOSCompiler");
|
|
@@ -1293,31 +1840,31 @@ var init_VisionOSCompiler = chunk3SAK5KFL_cjs.__esm({
|
|
|
1293
1840
|
this.emit("");
|
|
1294
1841
|
this.emit("// === v4.2 Domain Blocks ===");
|
|
1295
1842
|
let blockIdx = 0;
|
|
1296
|
-
const compiled =
|
|
1843
|
+
const compiled = chunkHGVXZDSK_cjs.compileDomainBlocks(
|
|
1297
1844
|
domainBlocks,
|
|
1298
1845
|
{
|
|
1299
1846
|
material: (block) => {
|
|
1300
|
-
const mat =
|
|
1301
|
-
return
|
|
1847
|
+
const mat = chunkHGVXZDSK_cjs.compileMaterialBlock(block);
|
|
1848
|
+
return chunkHGVXZDSK_cjs.materialToVisionOS(mat, `db${blockIdx++}`);
|
|
1302
1849
|
},
|
|
1303
1850
|
physics: (block) => {
|
|
1304
|
-
const phys =
|
|
1305
|
-
return
|
|
1851
|
+
const phys = chunkHGVXZDSK_cjs.compilePhysicsBlock(block);
|
|
1852
|
+
return chunkHGVXZDSK_cjs.physicsToVisionOS(phys, `db${blockIdx++}`);
|
|
1306
1853
|
},
|
|
1307
1854
|
vfx: (block) => {
|
|
1308
|
-
const ps =
|
|
1309
|
-
return
|
|
1855
|
+
const ps = chunkHGVXZDSK_cjs.compileParticleBlock(block);
|
|
1856
|
+
return chunkHGVXZDSK_cjs.particlesToVisionOS(ps, `db${blockIdx++}`);
|
|
1310
1857
|
},
|
|
1311
1858
|
postfx: (block) => {
|
|
1312
|
-
const pp =
|
|
1859
|
+
const pp = chunkHGVXZDSK_cjs.compilePostProcessingBlock(block);
|
|
1313
1860
|
return `// Post-Processing: ${pp.keyword} \u2014 configure via RealityKit RenderCallbacks`;
|
|
1314
1861
|
},
|
|
1315
1862
|
audio: (block) => {
|
|
1316
|
-
const audio =
|
|
1317
|
-
return
|
|
1863
|
+
const audio = chunkHGVXZDSK_cjs.compileAudioSourceBlock(block);
|
|
1864
|
+
return chunkHGVXZDSK_cjs.audioSourceToVisionOS(audio, `db${blockIdx++}`);
|
|
1318
1865
|
},
|
|
1319
1866
|
weather: (block) => {
|
|
1320
|
-
const weather =
|
|
1867
|
+
const weather = chunkHGVXZDSK_cjs.compileWeatherBlock(block);
|
|
1321
1868
|
const w = weather;
|
|
1322
1869
|
const layers = w.layers.map((l) => `// Layer: ${l.type} \u2014 ${JSON.stringify(l.properties)}`).join("\n");
|
|
1323
1870
|
return `// Weather: ${w.keyword} "${w.name || ""}" \u2014 implement via custom RealityKit particles
|
|
@@ -1351,6 +1898,17 @@ ${layers}`;
|
|
|
1351
1898
|
);
|
|
1352
1899
|
} else if (prop.key === "ambient_light") {
|
|
1353
1900
|
this.emit(`// Ambient light: ${prop.value} \u2014 handled via IBL intensity`);
|
|
1901
|
+
} else if (prop.key === "style") {
|
|
1902
|
+
const style = String(prop.value).toLowerCase();
|
|
1903
|
+
if (style.includes("immersive")) {
|
|
1904
|
+
this.emit("root.components.set(ImmersionStyleComponent(style: .full))");
|
|
1905
|
+
} else if (style.includes("mixed")) {
|
|
1906
|
+
this.emit("root.components.set(ImmersionStyleComponent(style: .mixed))");
|
|
1907
|
+
} else if (style.includes("progressive")) {
|
|
1908
|
+
this.emit("root.components.set(ImmersionStyleComponent(style: .progressive))");
|
|
1909
|
+
} else {
|
|
1910
|
+
this.emit(`// Environment style: "${prop.value}"`);
|
|
1911
|
+
}
|
|
1354
1912
|
}
|
|
1355
1913
|
}
|
|
1356
1914
|
}
|
|
@@ -1866,6 +2424,10 @@ ${layers}`;
|
|
|
1866
2424
|
});
|
|
1867
2425
|
|
|
1868
2426
|
exports.VisionOSCompiler_exports = VisionOSCompiler_exports;
|
|
2427
|
+
exports.generateTraitCode = generateTraitCode;
|
|
2428
|
+
exports.getTraitMapping = getTraitMapping;
|
|
1869
2429
|
exports.init_VisionOSCompiler = init_VisionOSCompiler;
|
|
1870
|
-
|
|
1871
|
-
|
|
2430
|
+
exports.init_VisionOSTraitMap = init_VisionOSTraitMap;
|
|
2431
|
+
exports.listAllTraits = listAllTraits;
|
|
2432
|
+
//# sourceMappingURL=chunk-IVIA7K75.cjs.map
|
|
2433
|
+
//# sourceMappingURL=chunk-IVIA7K75.cjs.map
|