@holoscript/core 6.0.3 → 6.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +40 -40
- package/bin/holoscript.cjs +3 -0
- package/dist/GLTFPipeline-SFIORFJU.js +16 -0
- package/dist/GLTFPipeline-VNNDPONV.cjs +37 -0
- package/dist/{HoloScriptPlusParser-BZR5DELQ.js → HoloScriptPlusParser-7FBIFUFC.js} +6 -5
- package/dist/{HoloScriptPlusParser-SBMYDNXO.cjs → HoloScriptPlusParser-A2W7OCN2.cjs} +17 -16
- package/dist/HoloScriptPlusParser-F2Z56FJR.js +10 -0
- package/dist/HoloScriptPlusParser-WKHRIH6T.cjs +27 -0
- package/dist/{USDZExporter-MHEHXZB4.cjs → USDZExporter-3FWJ25JI.cjs} +344 -16
- package/dist/{USDZExporter-YA55ZS35.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-XSUZMPVQ.cjs → chunk-27MPVJVZ.cjs} +64 -28
- package/dist/{chunk-W76ETJTI.js → chunk-2A7FURVO.js} +44 -8
- package/dist/{chunk-C7BNX4XJ.js → chunk-2B7WVIDZ.js} +11 -8
- package/dist/chunk-2BSMSUCE.js +1941 -0
- package/dist/chunk-2HLIGOKU.cjs +5546 -0
- package/dist/{chunk-GC3YU46J.js → chunk-2M2DPHKB.js} +4 -4
- package/dist/{chunk-A6GO3DPZ.cjs → chunk-2YSNA2F2.cjs} +321 -49
- package/dist/{chunk-ZL6VJ6SN.js → chunk-33XCOVE3.js} +5 -5
- package/dist/chunk-3FOKASKO.cjs +348 -0
- package/dist/{chunk-XSF76QRU.js → chunk-4C57PR42.js} +3 -3
- package/dist/chunk-4N4SXXWF.js +769 -0
- package/dist/chunk-4PDEPEQW.cjs +41 -0
- package/dist/chunk-4R6SBXDB.js +45 -0
- package/dist/chunk-4SY77NA4.cjs +413 -0
- package/dist/{chunk-74YCHHTE.js → chunk-4UUKPCY4.js} +670 -116
- package/dist/{chunk-VZNKJZTT.cjs → chunk-52ULD552.cjs} +178 -113
- package/dist/{chunk-65RFOWZI.js → chunk-5CKA5SXU.js} +441 -23
- 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-EJA7G2C4.cjs → chunk-5WUNN6ZN.cjs} +2 -2
- package/dist/{chunk-ELLQPFAF.js → chunk-6ASWLXXN.js} +24 -10
- package/dist/chunk-6CTRH7HT.cjs +1985 -0
- package/dist/{chunk-ARNKA274.cjs → chunk-6EX3I5P4.cjs} +6 -6
- package/dist/chunk-6FGQNDR4.js +5731 -0
- package/dist/{chunk-X4YVN7H3.cjs → chunk-6KMK2UXT.cjs} +152 -56
- package/dist/{chunk-KUJRR4FJ.js → chunk-6L4VE27M.js} +36 -24
- package/dist/{chunk-RT7LJRSF.cjs → chunk-6S6TKNEA.cjs} +7357 -8312
- package/dist/chunk-77V4GTCA.js +596 -0
- package/dist/{chunk-XH7SE4HH.cjs → chunk-7AD52FRS.cjs} +19 -19
- package/dist/chunk-7OPW2KO7.cjs +639 -0
- package/dist/chunk-A6KINLZJ.js +236 -0
- package/dist/chunk-AIA52I7T.cjs +543 -0
- package/dist/chunk-AIX25INK.cjs +602 -0
- package/dist/{chunk-WN3YF33G.cjs → chunk-AO4I2Z7M.cjs} +15 -17
- package/dist/{chunk-TSWTWZ42.cjs → chunk-BPICAGBV.cjs} +376 -209
- package/dist/chunk-BRQJKJGT.cjs +20 -0
- package/dist/{chunk-3FXV5S25.cjs → chunk-C37BHB7N.cjs} +6 -3
- package/dist/{chunk-XNMEH2BI.js → chunk-CBJY23VL.js} +3 -3
- package/dist/chunk-CIWWXYHZ.cjs +50 -0
- package/dist/{chunk-NTMZSDXM.cjs → chunk-DIL6DDDN.cjs} +101 -45
- package/dist/chunk-DMXC24WV.js +404 -0
- package/dist/{chunk-SPDELRRV.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-7N3JIJMT.js → chunk-EMMC5CSQ.js} +12 -8
- package/dist/{chunk-EUFLX2PI.js → chunk-EOBB6A4B.js} +7263 -8214
- package/dist/chunk-EOFNVCM6.js +325 -0
- package/dist/{chunk-NKRKT6V2.js → chunk-ER4GATIU.js} +11 -10
- 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-HBZYCASG.js → chunk-FXKTYFYA.js} +203 -36
- package/dist/chunk-GCMWDSBZ.cjs +729 -0
- package/dist/chunk-GJNCFRJU.cjs +125 -0
- package/dist/{chunk-I3XGTIHM.cjs → chunk-GMP623FG.cjs} +16 -13
- package/dist/{chunk-CNVM7J3M.js → chunk-GN3KDX4W.js} +149 -53
- package/dist/{chunk-WFJIDI2N.cjs → chunk-GQYKQSTC.cjs} +10 -10
- package/dist/chunk-GTU2Z2WW.cjs +262 -0
- package/dist/chunk-GZG4KA4E.js +529 -0
- package/dist/{chunk-DIEDKX5B.cjs → chunk-H3MGK7TX.cjs} +45 -33
- package/dist/{chunk-DN7UFU63.cjs → chunk-H5DZIHJP.cjs} +14 -17
- package/dist/{chunk-DH5G2JUA.cjs → chunk-HANL7K2Q.cjs} +66 -53
- package/dist/{chunk-EGIZHYJP.cjs → chunk-HCCQLAA4.cjs} +2 -13
- package/dist/{chunk-HHS6FMOU.cjs → chunk-HGVXZDSK.cjs} +178 -29
- package/dist/{chunk-LBPEZQAF.js → chunk-HRODTEEO.js} +30 -10
- package/dist/{chunk-ZGTGVSTZ.js → chunk-HYNTS5CP.js} +2 -2
- package/dist/{chunk-RE3OKSYF.cjs → chunk-HZCQO4JM.cjs} +6 -6
- package/dist/{chunk-NCUHGRTZ.js → chunk-I2O7TW6B.js} +12 -8
- package/dist/chunk-IHESJZSW.js +4490 -0
- package/dist/{chunk-7H5UNJZD.cjs → chunk-IRWWS72C.cjs} +64 -22
- package/dist/{chunk-EMO7HAKJ.cjs → chunk-IVIA7K75.cjs} +691 -133
- package/dist/chunk-IVY74O6C.js +247 -0
- package/dist/chunk-J32ZJZJH.js +554 -0
- package/dist/chunk-JD7CIZ33.js +1949 -0
- package/dist/{chunk-7X2IEJIE.cjs → chunk-JIYN45TV.cjs} +41 -42
- package/dist/{chunk-XDXZM3ZP.cjs → chunk-KHPCJRI3.cjs} +24 -21
- package/dist/chunk-KKFZ3B6J.cjs +557 -0
- package/dist/chunk-KPJL34Y7.cjs +186 -0
- package/dist/{chunk-7KPI4EKH.cjs → chunk-KQTPCYTG.cjs} +130 -50
- package/dist/{chunk-F5LVGHNT.js → chunk-KX76JUQY.js} +3 -3
- package/dist/chunk-L4LFINPO.js +623 -0
- package/dist/{chunk-2UX5LRAP.cjs → chunk-L63H3SQ4.cjs} +46 -32
- package/dist/{chunk-NLPSZT4C.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-PQLGZKMC.cjs → chunk-MJVIRCUV.cjs} +31 -27
- package/dist/{chunk-AC4BSHFV.js → chunk-MSMIFMBL.js} +135 -18
- package/dist/{chunk-56IF4NTA.js → chunk-MXFUTKCO.js} +18 -18
- package/dist/{chunk-NRUB55IT.cjs → chunk-MXJ5SS53.cjs} +450 -32
- package/dist/chunk-MXWNGCRS.js +2176 -0
- package/dist/chunk-MYY4PMWX.cjs +264 -0
- package/dist/chunk-N75IH2HY.js +258 -0
- package/dist/chunk-NG77ATEW.cjs +778 -0
- package/dist/chunk-NW5G5FBQ.js +215 -0
- package/dist/{chunk-4FCZDTD5.js → chunk-OEFY723R.js} +29 -16
- package/dist/chunk-OEV5RMZO.cjs +3042 -0
- package/dist/{chunk-VSXOIUCF.cjs → chunk-OIQYIIO3.cjs} +7 -7
- package/dist/{chunk-32TWR3HE.js → chunk-OL46QLBJ.js} +3 -12
- package/dist/chunk-OPZ7XDDI.js +487 -0
- package/dist/chunk-OSYNRVOV.cjs +243 -0
- package/dist/{chunk-HUFNKFA6.js → chunk-P7YIA5LN.js} +93 -13
- package/dist/chunk-PGANYCAG.cjs +220 -0
- package/dist/{chunk-CO2VM2DK.js → chunk-QAVXL2IH.js} +62 -20
- package/dist/{chunk-BO2OKHIY.js → chunk-QCCBXSCE.js} +1640 -1311
- package/dist/{chunk-WYH4GVZ5.js → chunk-QPOQ7VPI.js} +16 -13
- package/dist/{chunk-V42NTCFH.js → chunk-QTPMJRGS.js} +2331 -17
- package/dist/{chunk-FEFHPUEM.cjs → chunk-QWNQ523V.cjs} +1705 -1382
- package/dist/{chunk-VK5AXKO3.js → chunk-R3IVNY6P.js} +166 -101
- package/dist/chunk-R75BSDH7.cjs +50 -0
- package/dist/{chunk-AIUXRS74.cjs → chunk-RMHC2VG7.cjs} +2358 -41
- package/dist/chunk-RUXGBKPS.cjs +4517 -0
- package/dist/{chunk-PLMYCCA4.js → chunk-S5IFXW6E.js} +113 -9
- package/dist/{chunk-27LWW5FU.cjs → chunk-S6YWHCKV.cjs} +5 -5
- package/dist/{chunk-SUCBB66F.js → chunk-SIEXCILW.js} +3 -3
- package/dist/{chunk-CLYEIWA5.cjs → chunk-SLU6UPJI.cjs} +5 -3
- package/dist/{chunk-H6WMMLQK.cjs → chunk-T5J7ZKP3.cjs} +454 -61
- 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-BU5ZAFMC.js → chunk-U4NBQJBY.js} +11 -13
- package/dist/{chunk-Y5MUAYTO.js → chunk-UD3DSHZM.js} +10 -13
- package/dist/chunk-UDMYRFDZ.js +3038 -0
- package/dist/{chunk-PPULB4GG.cjs → chunk-UOIGFQXC.cjs} +90 -68
- package/dist/{chunk-EPWRXL6S.js → chunk-URG2SJLK.js} +41 -42
- package/dist/{chunk-VJVCD5T5.cjs → chunk-V73NPPTM.cjs} +152 -35
- package/dist/chunk-VECQYRXL.js +474 -0
- package/dist/chunk-VEXPG4WN.js +1989 -0
- package/dist/{chunk-4SMUJFHL.js → chunk-VMLKSV26.js} +9 -6
- package/dist/{chunk-HKCVM6OK.cjs → chunk-VSK7W3O5.cjs} +47 -27
- package/dist/chunk-VVKVQZI6.js +55 -0
- package/dist/{chunk-KDB6BUMB.js → chunk-W55Z7QIX.js} +172 -25
- package/dist/{chunk-BY3B7ZYV.cjs → chunk-W6P2GBHH.cjs} +3 -3
- package/dist/{chunk-PBA6NXCT.cjs → chunk-W6RW64BB.cjs} +11 -8
- package/dist/chunk-WDT3JTGM.cjs +483 -0
- package/dist/{chunk-26TLYBFD.js → chunk-WKX5AMOY.js} +3 -3
- package/dist/chunk-WNNE3PO3.js +34 -0
- package/dist/chunk-WRLUBRKS.cjs +1943 -0
- package/dist/chunk-WRNEH5MO.js +3169 -0
- package/dist/{chunk-54FHG2MX.js → chunk-WRWEX5ZF.js} +7 -4
- package/dist/chunk-X3GJPRVK.cjs +3246 -0
- package/dist/{chunk-4KJ2R7VP.cjs → chunk-XFXGA5IW.cjs} +126 -22
- package/dist/{chunk-L3Z2HIWJ.cjs → chunk-XHIV6326.cjs} +4 -4
- package/dist/chunk-XJAN7CZG.cjs +432 -0
- package/dist/chunk-XL6INWKT.js +121 -0
- package/dist/{chunk-KYM4XRFG.js → chunk-XMWZG36H.js} +4 -4
- package/dist/{chunk-BKIGPPVM.js → chunk-XSFNHP2E.js} +6 -3
- package/dist/{chunk-ODGMVILH.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-CMYAWUX3.js → chunk-YIMN575O.js} +445 -53
- package/dist/chunk-YIVFJNYV.js +176 -0
- package/dist/{chunk-V2ILLPHK.cjs → chunk-YKGPCZEE.cjs} +10 -10
- package/dist/chunk-YQELFNJV.js +39 -0
- package/dist/chunk-YSCKYJOB.cjs +2196 -0
- package/dist/chunk-Z5XMPRNC.cjs +5390 -0
- package/dist/{chunk-3FYZOR7S.cjs → chunk-ZDSYWBIE.cjs} +18 -18
- package/dist/{chunk-CQDOF3G7.cjs → chunk-ZKSS47EV.cjs} +24 -19
- package/dist/chunk-ZUL5AVTX.cjs +1993 -0
- package/dist/chunk-ZXBZVXDW.js +5386 -0
- package/dist/{chunk-AW7WAELW.js → chunk-ZZ7RO2UQ.js} +314 -46
- package/dist/cli/holoscript-runner.cjs +203 -206
- package/dist/cli/holoscript-runner.js +147 -150
- package/dist/codebase/index.cjs +1 -1
- package/dist/codebase/index.d.ts +25 -0
- package/dist/codebase/index.js +1 -1
- package/dist/compiler/agent-inference.cjs +10 -8
- package/dist/compiler/agent-inference.js +6 -4
- package/dist/compiler/android-xr.cjs +12 -8
- package/dist/compiler/android-xr.js +10 -6
- package/dist/compiler/android.cjs +12 -9
- package/dist/compiler/android.js +10 -7
- package/dist/compiler/ar.cjs +9 -7
- package/dist/compiler/ar.js +7 -5
- package/dist/compiler/babylon.cjs +12 -9
- package/dist/compiler/babylon.js +11 -8
- 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 +161 -151
- package/dist/compiler/domain-block-utils.js +7 -5
- package/dist/compiler/dtdl.cjs +10 -8
- package/dist/compiler/dtdl.js +7 -5
- package/dist/compiler/gltf-pipeline.cjs +9 -9
- package/dist/compiler/gltf-pipeline.js +2 -2
- package/dist/compiler/godot.cjs +9 -7
- package/dist/compiler/godot.js +8 -6
- package/dist/compiler/incremental.cjs +12 -8
- package/dist/compiler/incremental.js +7 -3
- package/dist/compiler/index.cjs +5152 -814
- package/dist/compiler/index.d.ts +404 -21
- package/dist/compiler/index.js +5063 -859
- package/dist/compiler/ios.cjs +11 -9
- package/dist/compiler/ios.js +9 -7
- 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 -17
- package/dist/compiler/multi-layer.js +13 -10
- package/dist/compiler/nodetoy.cjs +5 -5
- package/dist/compiler/nodetoy.js +2 -2
- package/dist/compiler/openxr.cjs +10 -7
- package/dist/compiler/openxr.js +9 -6
- package/dist/compiler/playcanvas.cjs +10 -8
- package/dist/compiler/playcanvas.js +9 -7
- package/dist/compiler/r3f.cjs +17 -14
- package/dist/compiler/r3f.d.ts +22 -0
- package/dist/compiler/r3f.js +12 -9
- 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 -8
- package/dist/compiler/sdf.js +8 -6
- package/dist/compiler/semantic-scene.cjs +7 -7
- package/dist/compiler/semantic-scene.js +2 -2
- package/dist/compiler/state.cjs +9 -6
- package/dist/compiler/state.js +7 -4
- package/dist/compiler/trait-composition.cjs +11 -8
- package/dist/compiler/trait-composition.js +7 -4
- package/dist/compiler/unity.cjs +10 -7
- package/dist/compiler/unity.js +9 -6
- package/dist/compiler/unreal.cjs +11 -8
- package/dist/compiler/unreal.js +9 -6
- package/dist/compiler/urdf.cjs +20 -14
- package/dist/compiler/urdf.js +8 -6
- package/dist/compiler/usd-physics.cjs +10 -8
- package/dist/compiler/usd-physics.js +7 -5
- package/dist/compiler/visionos.cjs +10 -7
- package/dist/compiler/visionos.js +9 -6
- package/dist/compiler/vrchat.cjs +10 -8
- package/dist/compiler/vrchat.js +8 -6
- package/dist/compiler/vrr.cjs +10 -8
- package/dist/compiler/vrr.js +8 -6
- package/dist/compiler/wasm.cjs +13 -11
- package/dist/compiler/wasm.js +8 -6
- package/dist/compiler/webgpu.cjs +9 -7
- package/dist/compiler/webgpu.js +8 -6
- package/dist/constants.d.ts +4 -0
- 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.d.ts +9 -0
- package/dist/entries/interop.js +5 -3
- package/dist/entries/scripting.cjs +18 -17
- package/dist/entries/scripting.d.ts +7 -0
- package/dist/entries/scripting.js +8 -7
- 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 +21396 -39967
- package/dist/index.d.ts +1496 -40
- package/dist/index.js +21066 -40142
- 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-FSKBTE3W.cjs +1265 -0
- package/dist/ml-dsa-Z7JDKW4L.js +1265 -0
- 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 -10
- package/dist/parser.d.ts +11 -0
- package/dist/parser.js +10 -7
- package/dist/{playwright-7DTEQCBD.cjs → playwright-3AT3AKTV.cjs} +1985 -1985
- package/dist/{playwright-BIZXMLD2.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.d.ts +0 -48
- package/dist/self-improvement/index.js +545 -0
- package/dist/storage/index.cjs +10 -9
- package/dist/storage/index.d.ts +24 -0
- 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 +33 -0
- 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.d.ts +111 -0
- package/dist/traits/engines/index.js +380 -0
- package/dist/traits/index.cjs +14387 -4320
- package/dist/traits/index.d.ts +197 -0
- package/dist/traits/index.js +16455 -6958
- 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 +7 -7
- package/dist/wot/index.js +2 -2
- package/package.json +150 -23
- package/dist/GLTFPipeline-3KLWWUQO.cjs +0 -34
- package/dist/GLTFPipeline-LYII2ZVQ.js +0 -13
- package/dist/chunk-3KEU5QYY.cjs +0 -175
- package/dist/chunk-6OQBLABR.js +0 -5240
- package/dist/chunk-6WNCRE6F.js +0 -126
- package/dist/chunk-C2QHVHZF.js +0 -4066
- package/dist/chunk-CN4NOESF.cjs +0 -416
- package/dist/chunk-DXVCEFZB.js +0 -2027
- package/dist/chunk-ENV7K6XA.js +0 -282
- package/dist/chunk-H7XMORZI.js +0 -2731
- package/dist/chunk-HAN4V3PF.cjs +0 -2037
- package/dist/chunk-HF4OFY25.cjs +0 -4097
- package/dist/chunk-LER4WXW5.cjs +0 -286
- package/dist/chunk-M6FU6S22.js +0 -2911
- package/dist/chunk-MWEFR6YQ.js +0 -1857
- package/dist/chunk-PJMOXFPR.cjs +0 -1861
- package/dist/chunk-QHVVVN47.cjs +0 -2033
- package/dist/chunk-QWKUKVRE.js +0 -2026
- package/dist/chunk-UITWA6DV.cjs +0 -2829
- package/dist/chunk-UQW6SLM5.js +0 -172
- package/dist/chunk-WUXIRGZP.cjs +0 -2915
- package/dist/chunk-X67XRI2T.js +0 -410
- package/dist/chunk-Y7VK5TH3.cjs +0 -129
- package/dist/chunk-YCMQQQ5U.cjs +0 -5244
- package/dist/post-quantum-JTTAAGO3.cjs +0 -6
- package/dist/post-quantum-RVPVDEPI.js +0 -4
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
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';
|
|
4
6
|
|
|
5
7
|
// src/compiler/VisionOSTraitMap.ts
|
|
6
8
|
function getTraitMapping(traitName) {
|
|
@@ -35,6 +37,9 @@ function getMinVisionOSVersion(traits) {
|
|
|
35
37
|
}
|
|
36
38
|
return maxVersion;
|
|
37
39
|
}
|
|
40
|
+
function listAllTraits() {
|
|
41
|
+
return Object.keys(VISIONOS_TRAIT_MAP);
|
|
42
|
+
}
|
|
38
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;
|
|
39
44
|
var init_VisionOSTraitMap = __esm({
|
|
40
45
|
"src/compiler/VisionOSTraitMap.ts"() {
|
|
@@ -88,7 +93,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
88
93
|
cloth: {
|
|
89
94
|
trait: "cloth",
|
|
90
95
|
components: ["CollisionComponent", "PhysicsBodyComponent"],
|
|
91
|
-
level: "
|
|
96
|
+
level: "full",
|
|
92
97
|
imports: ["RealityKit", "Metal"],
|
|
93
98
|
generate: (varName, config) => {
|
|
94
99
|
const stiffness = config.stiffness ?? 0.8;
|
|
@@ -115,7 +120,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
115
120
|
soft_body: {
|
|
116
121
|
trait: "soft_body",
|
|
117
122
|
components: ["CollisionComponent", "PhysicsBodyComponent"],
|
|
118
|
-
level: "
|
|
123
|
+
level: "full",
|
|
119
124
|
imports: ["RealityKit", "Metal"],
|
|
120
125
|
generate: (varName, config) => {
|
|
121
126
|
const compliance = config.compliance ?? 1e-4;
|
|
@@ -143,7 +148,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
143
148
|
fluid: {
|
|
144
149
|
trait: "fluid",
|
|
145
150
|
components: ["CollisionComponent"],
|
|
146
|
-
level: "
|
|
151
|
+
level: "full",
|
|
147
152
|
imports: ["RealityKit", "Metal"],
|
|
148
153
|
generate: (varName, config) => {
|
|
149
154
|
const particleCount = config.particle_count ?? 1e4;
|
|
@@ -503,7 +508,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
503
508
|
occlusion: {
|
|
504
509
|
trait: "occlusion",
|
|
505
510
|
components: [],
|
|
506
|
-
level: "
|
|
511
|
+
level: "comment",
|
|
507
512
|
generate: (_varName) => [
|
|
508
513
|
`// @occlusion \u2014 RealityKit handles automatically`,
|
|
509
514
|
`// Ensure object has ModelComponent with proper materials`
|
|
@@ -614,7 +619,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
614
619
|
lod: {
|
|
615
620
|
trait: "lod",
|
|
616
621
|
components: [],
|
|
617
|
-
level: "
|
|
622
|
+
level: "full",
|
|
618
623
|
generate: (varName, config) => {
|
|
619
624
|
const distances = config.distances || [5, 15];
|
|
620
625
|
const d = distances;
|
|
@@ -625,8 +630,8 @@ var init_VisionOSTraitMap = __esm({
|
|
|
625
630
|
` var thresholds: [Float] = [${d[0] ?? 5}, ${d[1] ?? 15}]`,
|
|
626
631
|
` var currentLevel: Int = 0`,
|
|
627
632
|
`}`,
|
|
628
|
-
|
|
629
|
-
`//
|
|
633
|
+
`${varName}LODComponent.registerComponent()`,
|
|
634
|
+
`// LODSystem.update(): query camera distance, swap ModelComponent.mesh via level thresholds`,
|
|
630
635
|
`${varName}.components.set(${varName}LODComponent())`
|
|
631
636
|
];
|
|
632
637
|
}
|
|
@@ -763,6 +768,21 @@ var init_VisionOSTraitMap = __esm({
|
|
|
763
768
|
];
|
|
764
769
|
}
|
|
765
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
|
+
},
|
|
766
786
|
ui_billboard: {
|
|
767
787
|
trait: "ui_billboard",
|
|
768
788
|
components: ["BillboardComponent"],
|
|
@@ -775,7 +795,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
775
795
|
ui_docked: {
|
|
776
796
|
trait: "ui_docked",
|
|
777
797
|
components: [],
|
|
778
|
-
level: "
|
|
798
|
+
level: "comment",
|
|
779
799
|
generate: (varName, config) => {
|
|
780
800
|
const position = String(config.position || "bottom");
|
|
781
801
|
const posMap = {
|
|
@@ -816,7 +836,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
816
836
|
volume: {
|
|
817
837
|
trait: "volume",
|
|
818
838
|
components: [],
|
|
819
|
-
level: "
|
|
839
|
+
level: "comment",
|
|
820
840
|
generate: (varName, config) => {
|
|
821
841
|
const size = config.size || [0.6, 0.4, 0.4];
|
|
822
842
|
const s = size;
|
|
@@ -835,7 +855,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
835
855
|
immersive: {
|
|
836
856
|
trait: "immersive",
|
|
837
857
|
components: [],
|
|
838
|
-
level: "
|
|
858
|
+
level: "comment",
|
|
839
859
|
generate: (varName, config) => {
|
|
840
860
|
const style = String(config.style || "mixed");
|
|
841
861
|
const styleMap = {
|
|
@@ -860,7 +880,7 @@ var init_VisionOSTraitMap = __esm({
|
|
|
860
880
|
spatial_persona: {
|
|
861
881
|
trait: "spatial_persona",
|
|
862
882
|
components: [],
|
|
863
|
-
level: "
|
|
883
|
+
level: "full",
|
|
864
884
|
minVersion: "2.0",
|
|
865
885
|
imports: ["GroupActivities"],
|
|
866
886
|
generate: (varName, config) => {
|
|
@@ -868,31 +888,59 @@ var init_VisionOSTraitMap = __esm({
|
|
|
868
888
|
return [
|
|
869
889
|
`// @spatial_persona \u2014 visionOS 2.0 Spatial Persona (GroupActivities)`,
|
|
870
890
|
`// Requires SharePlay session; persona renders at ${varName} position`,
|
|
871
|
-
|
|
872
|
-
|
|
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))`
|
|
873
904
|
];
|
|
874
905
|
}
|
|
875
906
|
},
|
|
876
907
|
shareplay: {
|
|
877
908
|
trait: "shareplay",
|
|
878
909
|
components: [],
|
|
879
|
-
level: "
|
|
910
|
+
level: "full",
|
|
880
911
|
minVersion: "1.0",
|
|
881
912
|
imports: ["GroupActivities"],
|
|
882
913
|
generate: (varName, config) => {
|
|
883
914
|
const activity = String(config.activity_type || "custom");
|
|
884
915
|
return [
|
|
885
|
-
`// @shareplay \u2014 SharePlay GroupActivity`,
|
|
886
|
-
|
|
887
|
-
|
|
888
|
-
|
|
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
|
+
`}`
|
|
889
937
|
];
|
|
890
938
|
}
|
|
891
939
|
},
|
|
892
940
|
object_tracking: {
|
|
893
941
|
trait: "object_tracking",
|
|
894
942
|
components: ["AnchoringComponent"],
|
|
895
|
-
level: "
|
|
943
|
+
level: "full",
|
|
896
944
|
minVersion: "2.0",
|
|
897
945
|
imports: ["ARKit"],
|
|
898
946
|
generate: (varName, config) => {
|
|
@@ -900,16 +948,30 @@ var init_VisionOSTraitMap = __esm({
|
|
|
900
948
|
return [
|
|
901
949
|
`// @object_tracking \u2014 ARKit ObjectTrackingProvider (visionOS 2.0)`,
|
|
902
950
|
`// Info.plist: NSWorldSensingUsageDescription`,
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
`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`
|
|
906
968
|
];
|
|
907
969
|
}
|
|
908
970
|
},
|
|
909
971
|
scene_reconstruction: {
|
|
910
972
|
trait: "scene_reconstruction",
|
|
911
973
|
components: [],
|
|
912
|
-
level: "
|
|
974
|
+
level: "full",
|
|
913
975
|
minVersion: "1.0",
|
|
914
976
|
imports: ["ARKit"],
|
|
915
977
|
generate: (varName, config) => {
|
|
@@ -946,13 +1008,53 @@ var init_VisionOSTraitMap = __esm({
|
|
|
946
1008
|
},
|
|
947
1009
|
spatial_navigation: {
|
|
948
1010
|
trait: "spatial_navigation",
|
|
949
|
-
components: [],
|
|
950
|
-
level: "
|
|
1011
|
+
components: ["AnchoringComponent"],
|
|
1012
|
+
level: "full",
|
|
951
1013
|
minVersion: "1.0",
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
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
|
+
}
|
|
956
1058
|
},
|
|
957
1059
|
eye_tracked: {
|
|
958
1060
|
trait: "eye_tracked",
|
|
@@ -986,146 +1088,590 @@ var init_VisionOSTraitMap = __esm({
|
|
|
986
1088
|
eye_hand_fusion: {
|
|
987
1089
|
trait: "eye_hand_fusion",
|
|
988
1090
|
components: ["InputTargetComponent"],
|
|
989
|
-
level: "
|
|
1091
|
+
level: "full",
|
|
990
1092
|
minVersion: "2.0",
|
|
991
1093
|
imports: ["ARKit"],
|
|
992
1094
|
generate: (varName, _config) => [
|
|
993
1095
|
`// @eye_hand_fusion \u2014 combined eye + hand tracking (visionOS 2.0)`,
|
|
994
1096
|
`let ${varName}HandProvider = HandTrackingProvider()`,
|
|
995
1097
|
`try await arkitSession.run([${varName}HandProvider])`,
|
|
996
|
-
`//
|
|
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`
|
|
997
1117
|
]
|
|
998
1118
|
},
|
|
999
|
-
// AI Generation traits —
|
|
1119
|
+
// AI Generation traits — fully implemented via CoreML/Metal (promoted from comment-level stubs)
|
|
1000
1120
|
controlnet: {
|
|
1001
1121
|
trait: "controlnet",
|
|
1002
1122
|
components: [],
|
|
1003
|
-
level: "
|
|
1004
|
-
|
|
1005
|
-
|
|
1006
|
-
|
|
1007
|
-
|
|
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
|
+
}
|
|
1008
1161
|
},
|
|
1009
1162
|
ai_texture_gen: {
|
|
1010
1163
|
trait: "ai_texture_gen",
|
|
1011
1164
|
components: ["ModelComponent"],
|
|
1012
|
-
level: "
|
|
1013
|
-
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
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
|
+
}
|
|
1017
1196
|
},
|
|
1018
1197
|
diffusion_realtime: {
|
|
1019
1198
|
trait: "diffusion_realtime",
|
|
1020
1199
|
components: [],
|
|
1021
|
-
level: "
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
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
|
+
}
|
|
1026
1236
|
},
|
|
1027
1237
|
ai_upscaling: {
|
|
1028
1238
|
trait: "ai_upscaling",
|
|
1029
1239
|
components: [],
|
|
1030
|
-
level: "
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
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
|
+
}
|
|
1035
1265
|
},
|
|
1036
1266
|
ai_inpainting: {
|
|
1037
1267
|
trait: "ai_inpainting",
|
|
1038
1268
|
components: [],
|
|
1039
|
-
level: "
|
|
1040
|
-
|
|
1041
|
-
|
|
1042
|
-
|
|
1043
|
-
|
|
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
|
+
}
|
|
1044
1294
|
},
|
|
1045
1295
|
neural_link: {
|
|
1046
1296
|
trait: "neural_link",
|
|
1047
1297
|
components: [],
|
|
1048
|
-
level: "
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
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
|
+
}
|
|
1053
1340
|
},
|
|
1054
1341
|
neural_forge: {
|
|
1055
1342
|
trait: "neural_forge",
|
|
1056
1343
|
components: [],
|
|
1057
|
-
level: "
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
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
|
+
}
|
|
1062
1371
|
},
|
|
1063
1372
|
embedding_search: {
|
|
1064
1373
|
trait: "embedding_search",
|
|
1065
1374
|
components: [],
|
|
1066
|
-
level: "
|
|
1067
|
-
|
|
1068
|
-
|
|
1069
|
-
|
|
1070
|
-
|
|
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
|
+
}
|
|
1071
1417
|
},
|
|
1072
1418
|
ai_npc_brain: {
|
|
1073
1419
|
trait: "ai_npc_brain",
|
|
1074
1420
|
components: [],
|
|
1075
|
-
level: "
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
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
|
+
}
|
|
1080
1476
|
},
|
|
1081
1477
|
vector_db: {
|
|
1082
1478
|
trait: "vector_db",
|
|
1083
1479
|
components: [],
|
|
1084
|
-
level: "
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
|
|
1088
|
-
|
|
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
|
+
}
|
|
1089
1551
|
},
|
|
1090
1552
|
vision: {
|
|
1091
1553
|
trait: "vision",
|
|
1092
1554
|
components: [],
|
|
1093
|
-
level: "
|
|
1094
|
-
imports: ["Vision"],
|
|
1095
|
-
generate: (
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
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
|
+
}
|
|
1099
1580
|
},
|
|
1100
1581
|
spatial_awareness: {
|
|
1101
1582
|
trait: "spatial_awareness",
|
|
1102
1583
|
components: [],
|
|
1103
|
-
level: "
|
|
1584
|
+
level: "full",
|
|
1104
1585
|
minVersion: "1.0",
|
|
1105
1586
|
imports: ["ARKit"],
|
|
1106
|
-
generate: (
|
|
1107
|
-
`// @spatial_awareness \u2014 spatial scene understanding`,
|
|
1108
|
-
|
|
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
|
+
`}`
|
|
1109
1604
|
]
|
|
1110
1605
|
},
|
|
1111
1606
|
neural_animation: {
|
|
1112
1607
|
trait: "neural_animation",
|
|
1113
1608
|
components: [],
|
|
1114
|
-
level: "
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
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
|
+
}
|
|
1119
1644
|
},
|
|
1120
1645
|
ai_vision: {
|
|
1121
1646
|
trait: "ai_vision",
|
|
1122
1647
|
components: [],
|
|
1123
|
-
level: "
|
|
1124
|
-
imports: ["Vision"],
|
|
1125
|
-
generate: (
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
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
|
+
}
|
|
1129
1675
|
}
|
|
1130
1676
|
};
|
|
1131
1677
|
VISIONOS_TRAIT_MAP = {
|
|
@@ -1152,7 +1698,7 @@ var init_VisionOSCompiler = __esm({
|
|
|
1152
1698
|
"src/compiler/VisionOSCompiler.ts"() {
|
|
1153
1699
|
init_VisionOSTraitMap();
|
|
1154
1700
|
init_CompilerBase();
|
|
1155
|
-
|
|
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
|
}
|
|
@@ -1364,9 +1922,7 @@ ${layers}`;
|
|
|
1364
1922
|
const rkType = typeMap[light.lightType];
|
|
1365
1923
|
if (rkType) {
|
|
1366
1924
|
this.emit(`let ${varName} = Entity()`);
|
|
1367
|
-
this.emit(
|
|
1368
|
-
`${varName}.name = "${this.escapeStringValue(light.name, "Swift")}"`
|
|
1369
|
-
);
|
|
1925
|
+
this.emit(`${varName}.name = "${this.escapeStringValue(light.name, "Swift")}"`);
|
|
1370
1926
|
const colorProp = light.properties.find((p) => p.key === "color");
|
|
1371
1927
|
const intensityProp = light.properties.find((p) => p.key === "intensity");
|
|
1372
1928
|
const posProp = light.properties.find((p) => p.key === "position");
|
|
@@ -1693,9 +2249,7 @@ ${layers}`;
|
|
|
1693
2249
|
this.emit(`// VStack {`);
|
|
1694
2250
|
if (obj.children) {
|
|
1695
2251
|
for (const child of obj.children) {
|
|
1696
|
-
this.emit(
|
|
1697
|
-
`// // Child: ${this.escapeStringValue(child.name, "Swift")}`
|
|
1698
|
-
);
|
|
2252
|
+
this.emit(`// // Child: ${this.escapeStringValue(child.name, "Swift")}`);
|
|
1699
2253
|
}
|
|
1700
2254
|
}
|
|
1701
2255
|
this.emit(`// }`);
|
|
@@ -1867,6 +2421,6 @@ ${layers}`;
|
|
|
1867
2421
|
}
|
|
1868
2422
|
});
|
|
1869
2423
|
|
|
1870
|
-
export { VisionOSCompiler, VisionOSCompiler_exports, init_VisionOSCompiler };
|
|
1871
|
-
//# sourceMappingURL=chunk-
|
|
1872
|
-
//# 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
|