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