@hypersoniclabs/helix-cli 0.1.7 → 0.1.24-helix3.438
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 +631 -8
- package/assets/bridge/metahuman-eye-baked.png +0 -0
- package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
- package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
- package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
- package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
- package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
- package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
- package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
- package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
- package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
- package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
- package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
- package/bridge-recipes/sims4/README.md +43 -0
- package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
- package/bridge-recipes/unreal/character-customizer/README.md +58 -0
- package/bridge-recipes/unreal/character-customizer/all.json +13 -0
- package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
- package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
- package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
- package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
- package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
- package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
- package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
- package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
- package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
- package/bridge-recipes/unreal/character-customizer/top.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
- package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
- package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
- package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
- package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
- package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
- package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
- package/dist/ability.d.ts +2 -2
- package/dist/ability.js +6 -5
- package/dist/ability.js.map +1 -1
- package/dist/achievement.d.ts +123 -0
- package/dist/achievement.js +400 -0
- package/dist/achievement.js.map +1 -0
- package/dist/api.d.ts +19 -1
- package/dist/api.js +80 -6
- package/dist/api.js.map +1 -1
- package/dist/assets.d.ts +595 -0
- package/dist/assets.js +1121 -0
- package/dist/assets.js.map +1 -0
- package/dist/audioCommand.d.ts +65 -0
- package/dist/audioCommand.js +181 -0
- package/dist/audioCommand.js.map +1 -0
- package/dist/bakeBodyRegionsCli.d.ts +19 -0
- package/dist/bakeBodyRegionsCli.js +25 -0
- package/dist/bakeBodyRegionsCli.js.map +1 -0
- package/dist/bakeLighting.d.ts +173 -0
- package/dist/bakeLighting.js +452 -0
- package/dist/bakeLighting.js.map +1 -0
- package/dist/bridge/bridge.testutil.d.ts +105 -0
- package/dist/bridge/bridge.testutil.js +259 -0
- package/dist/bridge/bridge.testutil.js.map +1 -0
- package/dist/bridge/characterAddon.d.ts +47 -0
- package/dist/bridge/characterAddon.js +146 -0
- package/dist/bridge/characterAddon.js.map +1 -0
- package/dist/bridge/detect.d.ts +4 -0
- package/dist/bridge/detect.js +154 -0
- package/dist/bridge/detect.js.map +1 -0
- package/dist/bridge/execute.d.ts +3 -0
- package/dist/bridge/execute.js +206 -0
- package/dist/bridge/execute.js.map +1 -0
- package/dist/bridge/glb.d.ts +60 -0
- package/dist/bridge/glb.js +81 -0
- package/dist/bridge/glb.js.map +1 -0
- package/dist/bridge/hash.d.ts +6 -0
- package/dist/bridge/hash.js +40 -0
- package/dist/bridge/hash.js.map +1 -0
- package/dist/bridge/index.d.ts +11 -0
- package/dist/bridge/index.js +28 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/internal/artifacts.d.ts +5 -0
- package/dist/bridge/internal/artifacts.js +31 -0
- package/dist/bridge/internal/artifacts.js.map +1 -0
- package/dist/bridge/internal/builtInExecution.d.ts +4 -0
- package/dist/bridge/internal/builtInExecution.js +514 -0
- package/dist/bridge/internal/builtInExecution.js.map +1 -0
- package/dist/bridge/internal/externalExecution.d.ts +12 -0
- package/dist/bridge/internal/externalExecution.js +261 -0
- package/dist/bridge/internal/externalExecution.js.map +1 -0
- package/dist/bridge/internal/outputReservation.d.ts +13 -0
- package/dist/bridge/internal/outputReservation.js +151 -0
- package/dist/bridge/internal/outputReservation.js.map +1 -0
- package/dist/bridge/internal/snapshots.d.ts +32 -0
- package/dist/bridge/internal/snapshots.js +562 -0
- package/dist/bridge/internal/snapshots.js.map +1 -0
- package/dist/bridge/management.d.ts +40 -0
- package/dist/bridge/management.js +333 -0
- package/dist/bridge/management.js.map +1 -0
- package/dist/bridge/manifest.d.ts +8 -0
- package/dist/bridge/manifest.js +192 -0
- package/dist/bridge/manifest.js.map +1 -0
- package/dist/bridge/metahuman.d.ts +26 -0
- package/dist/bridge/metahuman.js +332 -0
- package/dist/bridge/metahuman.js.map +1 -0
- package/dist/bridge/planner.d.ts +9 -0
- package/dist/bridge/planner.js +246 -0
- package/dist/bridge/planner.js.map +1 -0
- package/dist/bridge/plugins.d.ts +17 -0
- package/dist/bridge/plugins.js +307 -0
- package/dist/bridge/plugins.js.map +1 -0
- package/dist/bridge/resolution.d.ts +8 -0
- package/dist/bridge/resolution.js +55 -0
- package/dist/bridge/resolution.js.map +1 -0
- package/dist/bridge/types.d.ts +247 -0
- package/dist/bridge/types.js +60 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/validate.d.ts +12 -0
- package/dist/bridge/validate.js +370 -0
- package/dist/bridge/validate.js.map +1 -0
- package/dist/bridge/zipSource.d.ts +27 -0
- package/dist/bridge/zipSource.js +90 -0
- package/dist/bridge/zipSource.js.map +1 -0
- package/dist/browser/hostSlots.d.ts +57 -0
- package/dist/browser/hostSlots.js +371 -0
- package/dist/browser/hostSlots.js.map +1 -0
- package/dist/browser/launch.d.ts +25 -0
- package/dist/browser/launch.js +74 -0
- package/dist/browser/launch.js.map +1 -0
- package/dist/browser/nonSystemChrome.d.ts +15 -0
- package/dist/browser/nonSystemChrome.js +91 -0
- package/dist/browser/nonSystemChrome.js.map +1 -0
- package/dist/builds/index.d.ts +54 -0
- package/dist/builds/index.js +215 -0
- package/dist/builds/index.js.map +1 -0
- package/dist/bundle.d.ts +35 -2
- package/dist/bundle.js +437 -20
- package/dist/bundle.js.map +1 -1
- package/dist/canary/cli.d.ts +17 -0
- package/dist/canary/cli.js +95 -0
- package/dist/canary/cli.js.map +1 -0
- package/dist/canary/index.d.ts +4 -0
- package/dist/canary/index.js +21 -0
- package/dist/canary/index.js.map +1 -0
- package/dist/canary/inventory.d.ts +46 -0
- package/dist/canary/inventory.js +499 -0
- package/dist/canary/inventory.js.map +1 -0
- package/dist/canary/pacifica.d.ts +51 -0
- package/dist/canary/pacifica.js +247 -0
- package/dist/canary/pacifica.js.map +1 -0
- package/dist/canary/plan.d.ts +115 -0
- package/dist/canary/plan.js +479 -0
- package/dist/canary/plan.js.map +1 -0
- package/dist/character/addonPushOut.d.ts +66 -0
- package/dist/character/addonPushOut.js +211 -0
- package/dist/character/addonPushOut.js.map +1 -0
- package/dist/character/avatarPreflight.d.ts +92 -0
- package/dist/character/avatarPreflight.js +261 -0
- package/dist/character/avatarPreflight.js.map +1 -0
- package/dist/character/bakeBodyRegions.d.ts +80 -0
- package/dist/character/bakeBodyRegions.js +190 -0
- package/dist/character/bakeBodyRegions.js.map +1 -0
- package/dist/character/baseColorGuard.d.ts +62 -0
- package/dist/character/baseColorGuard.js +141 -0
- package/dist/character/baseColorGuard.js.map +1 -0
- package/dist/character/bodyGeometryGuard.d.ts +243 -0
- package/dist/character/bodyGeometryGuard.js +417 -0
- package/dist/character/bodyGeometryGuard.js.map +1 -0
- package/dist/character/bodyRegionHide.d.ts +57 -0
- package/dist/character/bodyRegionHide.js +97 -0
- package/dist/character/bodyRegionHide.js.map +1 -0
- package/dist/character/composeBaseMale.d.ts +25 -0
- package/dist/character/composeBaseMale.js +712 -0
- package/dist/character/composeBaseMale.js.map +1 -0
- package/dist/character/esm.js +3 -1
- package/dist/character/esm.js.map +1 -1
- package/dist/character/faceManifest.d.ts +53 -0
- package/dist/character/faceManifest.js +256 -0
- package/dist/character/faceManifest.js.map +1 -0
- package/dist/character/fbx.d.ts +70 -0
- package/dist/character/fbx.js +396 -0
- package/dist/character/fbx.js.map +1 -0
- package/dist/character/fitGarmentFile.d.ts +39 -0
- package/dist/character/fitGarmentFile.js +53 -0
- package/dist/character/fitGarmentFile.js.map +1 -0
- package/dist/character/helixPalette.d.ts +68 -0
- package/dist/character/helixPalette.js +183 -0
- package/dist/character/helixPalette.js.map +1 -0
- package/dist/character/hideCoverage.d.ts +135 -0
- package/dist/character/hideCoverage.js +450 -0
- package/dist/character/hideCoverage.js.map +1 -0
- package/dist/character/imageLimits.d.ts +3 -0
- package/dist/character/imageLimits.js +7 -0
- package/dist/character/imageLimits.js.map +1 -0
- package/dist/character/importCharacter.d.ts +188 -10
- package/dist/character/importCharacter.js +854 -76
- package/dist/character/importCharacter.js.map +1 -1
- package/dist/character/importTrust.d.ts +11 -0
- package/dist/character/importTrust.js +56 -0
- package/dist/character/importTrust.js.map +1 -0
- package/dist/character/ktx2Decode.d.ts +11 -0
- package/dist/character/ktx2Decode.js +87 -0
- package/dist/character/ktx2Decode.js.map +1 -0
- package/dist/character/mat4.d.ts +7 -0
- package/dist/character/mat4.js +25 -2
- package/dist/character/mat4.js.map +1 -1
- package/dist/character/meshyToHelixMap.d.ts +14 -0
- package/dist/character/meshyToHelixMap.js +155 -3
- package/dist/character/meshyToHelixMap.js.map +1 -1
- package/dist/character/metahumanToHelixMap.d.ts +2 -0
- package/dist/character/metahumanToHelixMap.js +34 -0
- package/dist/character/metahumanToHelixMap.js.map +1 -0
- package/dist/character/normalMapGuard.d.ts +59 -0
- package/dist/character/normalMapGuard.js +139 -0
- package/dist/character/normalMapGuard.js.map +1 -0
- package/dist/character/quat.js +2 -2
- package/dist/character/quat.js.map +1 -1
- package/dist/character/reframeSkeletonFile.d.ts +19 -0
- package/dist/character/reframeSkeletonFile.js +45 -0
- package/dist/character/reframeSkeletonFile.js.map +1 -0
- package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
- package/dist/character/repairLodSkeletonsFile.js +49 -0
- package/dist/character/repairLodSkeletonsFile.js.map +1 -0
- package/dist/character/restFrameGuard.d.ts +52 -0
- package/dist/character/restFrameGuard.js +90 -0
- package/dist/character/restFrameGuard.js.map +1 -0
- package/dist/character/slotBudgets.d.ts +37 -0
- package/dist/character/slotBudgets.generated.d.ts +15 -0
- package/dist/character/slotBudgets.generated.js +110 -0
- package/dist/character/slotBudgets.generated.js.map +1 -0
- package/dist/character/slotBudgets.js +45 -0
- package/dist/character/slotBudgets.js.map +1 -0
- package/dist/character/stages/atlasMaterials.d.ts +53 -0
- package/dist/character/stages/atlasMaterials.js +246 -0
- package/dist/character/stages/atlasMaterials.js.map +1 -0
- package/dist/character/stages/bakeTexture.d.ts +28 -7
- package/dist/character/stages/bakeTexture.js +586 -108
- package/dist/character/stages/bakeTexture.js.map +1 -1
- package/dist/character/stages/conform.d.ts +54 -9
- package/dist/character/stages/conform.js +686 -113
- package/dist/character/stages/conform.js.map +1 -1
- package/dist/character/stages/earClearance.d.ts +105 -0
- package/dist/character/stages/earClearance.js +480 -0
- package/dist/character/stages/earClearance.js.map +1 -0
- package/dist/character/stages/faceRegion.d.ts +55 -0
- package/dist/character/stages/faceRegion.js +183 -0
- package/dist/character/stages/faceRegion.js.map +1 -0
- package/dist/character/stages/firstPersonHide.d.ts +42 -0
- package/dist/character/stages/firstPersonHide.js +140 -0
- package/dist/character/stages/firstPersonHide.js.map +1 -0
- package/dist/character/stages/joinPerMesh.d.ts +18 -0
- package/dist/character/stages/joinPerMesh.js +46 -0
- package/dist/character/stages/joinPerMesh.js.map +1 -0
- package/dist/character/stages/ktx2.d.ts +6 -4
- package/dist/character/stages/ktx2.js +81 -29
- package/dist/character/stages/ktx2.js.map +1 -1
- package/dist/character/stages/limbBridge.d.ts +114 -0
- package/dist/character/stages/limbBridge.js +1286 -0
- package/dist/character/stages/limbBridge.js.map +1 -0
- package/dist/character/stages/mergeLods.d.ts +19 -0
- package/dist/character/stages/mergeLods.js +58 -2
- package/dist/character/stages/mergeLods.js.map +1 -1
- package/dist/character/stages/poseAwareFit.d.ts +192 -0
- package/dist/character/stages/poseAwareFit.js +417 -0
- package/dist/character/stages/poseAwareFit.js.map +1 -0
- package/dist/character/stages/poseFit/math.d.ts +141 -0
- package/dist/character/stages/poseFit/math.js +514 -0
- package/dist/character/stages/poseFit/math.js.map +1 -0
- package/dist/character/stages/poseFit/measure.d.ts +88 -0
- package/dist/character/stages/poseFit/measure.js +148 -0
- package/dist/character/stages/poseFit/measure.js.map +1 -0
- package/dist/character/stages/poseFit/model.d.ts +46 -0
- package/dist/character/stages/poseFit/model.js +147 -0
- package/dist/character/stages/poseFit/model.js.map +1 -0
- package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
- package/dist/character/stages/poseFit/offsetField.js +249 -0
- package/dist/character/stages/poseFit/offsetField.js.map +1 -0
- package/dist/character/stages/poseFit/posing.d.ts +52 -0
- package/dist/character/stages/poseFit/posing.js +330 -0
- package/dist/character/stages/poseFit/posing.js.map +1 -0
- package/dist/character/stages/poseFit/testRig.d.ts +31 -0
- package/dist/character/stages/poseFit/testRig.js +85 -0
- package/dist/character/stages/poseFit/testRig.js.map +1 -0
- package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
- package/dist/character/stages/reframeSkeletonToHost.js +111 -0
- package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
- package/dist/character/stages/report.js +0 -2
- package/dist/character/stages/report.js.map +1 -1
- package/dist/character/stages/resizeTextures.js +4 -4
- package/dist/character/stages/resizeTextures.js.map +1 -1
- package/dist/character/stages/retarget.d.ts +26 -2
- package/dist/character/stages/retarget.js +52 -4
- package/dist/character/stages/retarget.js.map +1 -1
- package/dist/character/stages/retargetClip.d.ts +6 -2
- package/dist/character/stages/retargetClip.js +109 -17
- package/dist/character/stages/retargetClip.js.map +1 -1
- package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
- package/dist/character/stages/sanitizeMaterials.js +136 -0
- package/dist/character/stages/sanitizeMaterials.js.map +1 -0
- package/dist/character/stages/simplifyMesh.js +6 -3
- package/dist/character/stages/simplifyMesh.js.map +1 -1
- package/dist/character/stages/splitFacePrimitive.js +0 -2
- package/dist/character/stages/splitFacePrimitive.js.map +1 -1
- package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
- package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
- package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
- package/dist/character/stages/unifyMaterial.d.ts +66 -0
- package/dist/character/stages/unifyMaterial.js +136 -0
- package/dist/character/stages/unifyMaterial.js.map +1 -0
- package/dist/character/stages/vrmDynamics.d.ts +144 -0
- package/dist/character/stages/vrmDynamics.js +421 -0
- package/dist/character/stages/vrmDynamics.js.map +1 -0
- package/dist/character/stages/vrmFace.d.ts +82 -0
- package/dist/character/stages/vrmFace.js +280 -0
- package/dist/character/stages/vrmFace.js.map +1 -0
- package/dist/character/stages/weldedSimplify.d.ts +15 -1
- package/dist/character/stages/weldedSimplify.js +90 -9
- package/dist/character/stages/weldedSimplify.js.map +1 -1
- package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
- package/dist/character/testutil/meshyBridgeFixture.js +219 -0
- package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
- package/dist/character/testutil/meshyHead.d.ts +19 -0
- package/dist/character/testutil/meshyHead.js +99 -0
- package/dist/character/testutil/meshyHead.js.map +1 -0
- package/dist/character/testutil/meshyRig.d.ts +17 -0
- package/dist/character/testutil/meshyRig.js +117 -0
- package/dist/character/testutil/meshyRig.js.map +1 -0
- package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
- package/dist/character/testutil/slotBudgetExpectations.js +21 -0
- package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
- package/dist/character/testutil/syntheticRig.d.ts +12 -1
- package/dist/character/testutil/syntheticRig.js +88 -3
- package/dist/character/testutil/syntheticRig.js.map +1 -1
- package/dist/character/unrealMaterialSidecar.d.ts +94 -0
- package/dist/character/unrealMaterialSidecar.js +879 -0
- package/dist/character/unrealMaterialSidecar.js.map +1 -0
- package/dist/character/untrustedSource.d.ts +54 -0
- package/dist/character/untrustedSource.js +181 -0
- package/dist/character/untrustedSource.js.map +1 -0
- package/dist/character/vrmCharacter.d.ts +156 -0
- package/dist/character/vrmCharacter.js +678 -0
- package/dist/character/vrmCharacter.js.map +1 -0
- package/dist/config.d.ts +5 -0
- package/dist/config.js +72 -24
- package/dist/config.js.map +1 -1
- package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
- package/dist/continuum/adminPackagePinCommand.js +46 -0
- package/dist/continuum/adminPackagePinCommand.js.map +1 -0
- package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
- package/dist/continuum/adminPackagePublishCommand.js +22 -0
- package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
- package/dist/continuum/authoring.d.ts +52 -0
- package/dist/continuum/authoring.js +143 -0
- package/dist/continuum/authoring.js.map +1 -0
- package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
- package/dist/continuum/characterMigrationGenerator.js +242 -0
- package/dist/continuum/characterMigrationGenerator.js.map +1 -0
- package/dist/continuum/cli.d.ts +69 -0
- package/dist/continuum/cli.js +145 -0
- package/dist/continuum/cli.js.map +1 -0
- package/dist/continuum/cliAuthority.d.ts +17 -0
- package/dist/continuum/cliAuthority.js +28 -0
- package/dist/continuum/cliAuthority.js.map +1 -0
- package/dist/continuum/client.d.ts +103 -0
- package/dist/continuum/client.js +190 -0
- package/dist/continuum/client.js.map +1 -0
- package/dist/continuum/homeScenePackage.d.ts +159 -0
- package/dist/continuum/homeScenePackage.js +267 -0
- package/dist/continuum/homeScenePackage.js.map +1 -0
- package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
- package/dist/continuum/homeScenePackageCommand.js +107 -0
- package/dist/continuum/homeScenePackageCommand.js.map +1 -0
- package/dist/continuum/identity.d.ts +4 -0
- package/dist/continuum/identity.js +20 -0
- package/dist/continuum/identity.js.map +1 -0
- package/dist/continuum/index.d.ts +11 -0
- package/dist/continuum/index.js +28 -0
- package/dist/continuum/index.js.map +1 -0
- package/dist/continuum/missingNormals.d.ts +48 -0
- package/dist/continuum/missingNormals.js +99 -0
- package/dist/continuum/missingNormals.js.map +1 -0
- package/dist/continuum/objectUpload.d.ts +64 -0
- package/dist/continuum/objectUpload.js +375 -0
- package/dist/continuum/objectUpload.js.map +1 -0
- package/dist/continuum/pull.d.ts +22 -0
- package/dist/continuum/pull.js +47 -0
- package/dist/continuum/pull.js.map +1 -0
- package/dist/continuum/sourceBundle.d.ts +18 -0
- package/dist/continuum/sourceBundle.js +160 -0
- package/dist/continuum/sourceBundle.js.map +1 -0
- package/dist/continuum/state.d.ts +41 -0
- package/dist/continuum/state.js +198 -0
- package/dist/continuum/state.js.map +1 -0
- package/dist/continuum/types.d.ts +156 -0
- package/dist/continuum/types.js +6 -0
- package/dist/continuum/types.js.map +1 -0
- package/dist/continuum/workflow.d.ts +62 -0
- package/dist/continuum/workflow.js +592 -0
- package/dist/continuum/workflow.js.map +1 -0
- package/dist/cs2/areas.d.ts +41 -0
- package/dist/cs2/areas.js +82 -0
- package/dist/cs2/areas.js.map +1 -0
- package/dist/cs2/binary.d.ts +10 -0
- package/dist/cs2/binary.js +59 -0
- package/dist/cs2/binary.js.map +1 -0
- package/dist/cs2/cityLegacy.d.ts +29 -0
- package/dist/cs2/cityLegacy.js +48 -0
- package/dist/cs2/cityLegacy.js.map +1 -0
- package/dist/cs2/convert/areas.d.ts +32 -0
- package/dist/cs2/convert/areas.js +96 -0
- package/dist/cs2/convert/areas.js.map +1 -0
- package/dist/cs2/convert/glb.d.ts +48 -0
- package/dist/cs2/convert/glb.js +178 -0
- package/dist/cs2/convert/glb.js.map +1 -0
- package/dist/cs2/convert/markings.d.ts +96 -0
- package/dist/cs2/convert/markings.js +329 -0
- package/dist/cs2/convert/markings.js.map +1 -0
- package/dist/cs2/convert/nodeSeams.d.ts +20 -0
- package/dist/cs2/convert/nodeSeams.js +164 -0
- package/dist/cs2/convert/nodeSeams.js.map +1 -0
- package/dist/cs2/convert/roadBake.d.ts +112 -0
- package/dist/cs2/convert/roadBake.js +290 -0
- package/dist/cs2/convert/roadBake.js.map +1 -0
- package/dist/cs2/convert/roads.d.ts +110 -0
- package/dist/cs2/convert/roads.js +419 -0
- package/dist/cs2/convert/roads.js.map +1 -0
- package/dist/cs2/convert/terrain.d.ts +67 -0
- package/dist/cs2/convert/terrain.js +141 -0
- package/dist/cs2/convert/terrain.js.map +1 -0
- package/dist/cs2/convert/terrainConform.d.ts +58 -0
- package/dist/cs2/convert/terrainConform.js +284 -0
- package/dist/cs2/convert/terrainConform.js.map +1 -0
- package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
- package/dist/cs2/convert/treeRoadClearance.js +78 -0
- package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
- package/dist/cs2/convert/trees.d.ts +33 -0
- package/dist/cs2/convert/trees.js +68 -0
- package/dist/cs2/convert/trees.js.map +1 -0
- package/dist/cs2/csm2.d.ts +58 -0
- package/dist/cs2/csm2.js +188 -0
- package/dist/cs2/csm2.js.map +1 -0
- package/dist/cs2/fixtures.d.ts +5 -0
- package/dist/cs2/fixtures.js +15 -0
- package/dist/cs2/fixtures.js.map +1 -0
- package/dist/cs2/impostors.d.ts +31 -0
- package/dist/cs2/impostors.js +42 -0
- package/dist/cs2/impostors.js.map +1 -0
- package/dist/cs2/index.d.ts +22 -0
- package/dist/cs2/index.js +191 -0
- package/dist/cs2/index.js.map +1 -0
- package/dist/cs2/inspect.d.ts +81 -0
- package/dist/cs2/inspect.js +181 -0
- package/dist/cs2/inspect.js.map +1 -0
- package/dist/cs2/lods.d.ts +22 -0
- package/dist/cs2/lods.js +136 -0
- package/dist/cs2/lods.js.map +1 -0
- package/dist/cs2/materials.d.ts +43 -0
- package/dist/cs2/materials.js +137 -0
- package/dist/cs2/materials.js.map +1 -0
- package/dist/cs2/placements.d.ts +57 -0
- package/dist/cs2/placements.js +116 -0
- package/dist/cs2/placements.js.map +1 -0
- package/dist/cs2/roadPieces.d.ts +79 -0
- package/dist/cs2/roadPieces.js +263 -0
- package/dist/cs2/roadPieces.js.map +1 -0
- package/dist/cs2/roads.d.ts +92 -0
- package/dist/cs2/roads.js +329 -0
- package/dist/cs2/roads.js.map +1 -0
- package/dist/cs2/terrain.d.ts +37 -0
- package/dist/cs2/terrain.js +91 -0
- package/dist/cs2/terrain.js.map +1 -0
- package/dist/cs2/types.d.ts +444 -0
- package/dist/cs2/types.js +22 -0
- package/dist/cs2/types.js.map +1 -0
- package/dist/cs2/water.d.ts +26 -0
- package/dist/cs2/water.js +58 -0
- package/dist/cs2/water.js.map +1 -0
- package/dist/currency.d.ts +94 -0
- package/dist/currency.js +425 -0
- package/dist/currency.js.map +1 -0
- package/dist/dev/devServer.d.ts +53 -0
- package/dist/dev/devServer.js +228 -0
- package/dist/dev/devServer.js.map +1 -0
- package/dist/dev/shellPage.d.ts +3 -0
- package/dist/dev/shellPage.js +297 -0
- package/dist/dev/shellPage.js.map +1 -0
- package/dist/dev/state.d.ts +84 -0
- package/dist/dev/state.js +265 -0
- package/dist/dev/state.js.map +1 -0
- package/dist/device.d.ts +104 -0
- package/dist/device.js +2744 -0
- package/dist/device.js.map +1 -0
- package/dist/deviceActionValidation.d.ts +21 -0
- package/dist/deviceActionValidation.js +460 -0
- package/dist/deviceActionValidation.js.map +1 -0
- package/dist/distribution.d.ts +69 -0
- package/dist/distribution.js +138 -0
- package/dist/distribution.js.map +1 -0
- package/dist/enginePins.d.ts +45 -0
- package/dist/enginePins.js +134 -0
- package/dist/enginePins.js.map +1 -0
- package/dist/gesture/axisReference.d.ts +22 -0
- package/dist/gesture/axisReference.js +32 -0
- package/dist/gesture/axisReference.js.map +1 -0
- package/dist/gesture/capture.d.ts +84 -0
- package/dist/gesture/capture.js +303 -0
- package/dist/gesture/capture.js.map +1 -0
- package/dist/gesture/harnessPage.d.ts +23 -0
- package/dist/gesture/harnessPage.js +153 -0
- package/dist/gesture/harnessPage.js.map +1 -0
- package/dist/gesture/inspect.d.ts +189 -0
- package/dist/gesture/inspect.js +678 -0
- package/dist/gesture/inspect.js.map +1 -0
- package/dist/gesture/rig.d.ts +12 -0
- package/dist/gesture/rig.js +111 -0
- package/dist/gesture/rig.js.map +1 -0
- package/dist/gesture/worldRuntime.d.ts +65 -0
- package/dist/gesture/worldRuntime.js +110 -0
- package/dist/gesture/worldRuntime.js.map +1 -0
- package/dist/glb/draw-calls.d.ts +60 -0
- package/dist/glb/draw-calls.js +160 -0
- package/dist/glb/draw-calls.js.map +1 -0
- package/dist/glb/glb-summary.d.ts +68 -0
- package/dist/glb/glb-summary.js +450 -0
- package/dist/glb/glb-summary.js.map +1 -0
- package/dist/glb/index.d.ts +12 -0
- package/dist/glb/index.js +24 -0
- package/dist/glb/index.js.map +1 -0
- package/dist/glb/smooth-normals.d.ts +98 -0
- package/dist/glb/smooth-normals.js +395 -0
- package/dist/glb/smooth-normals.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +6786 -128
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts +35 -1
- package/dist/init.js +1115 -47
- package/dist/init.js.map +1 -1
- package/dist/install.d.ts +16 -5
- package/dist/install.js +123 -23
- package/dist/install.js.map +1 -1
- package/dist/interactable.d.ts +154 -0
- package/dist/interactable.js +1219 -0
- package/dist/interactable.js.map +1 -0
- package/dist/item.d.ts +217 -0
- package/dist/item.js +892 -0
- package/dist/item.js.map +1 -0
- package/dist/itemDef/distribute.d.ts +17 -0
- package/dist/itemDef/distribute.js +29 -0
- package/dist/itemDef/distribute.js.map +1 -0
- package/dist/itemDef/emoteRules.d.ts +85 -0
- package/dist/itemDef/emoteRules.js +368 -0
- package/dist/itemDef/emoteRules.js.map +1 -0
- package/dist/itemDef/gunConfigRules.d.ts +24 -0
- package/dist/itemDef/gunConfigRules.js +300 -0
- package/dist/itemDef/gunConfigRules.js.map +1 -0
- package/dist/itemDef/inspect.d.ts +19 -0
- package/dist/itemDef/inspect.js +144 -0
- package/dist/itemDef/inspect.js.map +1 -0
- package/dist/itemDef/scaffold.d.ts +41 -0
- package/dist/itemDef/scaffold.js +303 -0
- package/dist/itemDef/scaffold.js.map +1 -0
- package/dist/itemDef/tables.d.ts +81 -0
- package/dist/itemDef/tables.js +226 -0
- package/dist/itemDef/tables.js.map +1 -0
- package/dist/itemDef/validate.d.ts +30 -0
- package/dist/itemDef/validate.js +175 -0
- package/dist/itemDef/validate.js.map +1 -0
- package/dist/itemPublishVersion.d.ts +46 -0
- package/dist/itemPublishVersion.js +242 -0
- package/dist/itemPublishVersion.js.map +1 -0
- package/dist/itemSearch.d.ts +128 -0
- package/dist/itemSearch.js +140 -0
- package/dist/itemSearch.js.map +1 -0
- package/dist/itemSetVersion.d.ts +77 -0
- package/dist/itemSetVersion.js +170 -0
- package/dist/itemSetVersion.js.map +1 -0
- package/dist/itemThumbnail.d.ts +40 -0
- package/dist/itemThumbnail.js +116 -0
- package/dist/itemThumbnail.js.map +1 -0
- package/dist/lib.d.ts +571 -7
- package/dist/lib.js +1178 -15
- package/dist/lib.js.map +1 -1
- package/dist/looks.d.ts +103 -0
- package/dist/looks.js +102 -0
- package/dist/looks.js.map +1 -0
- package/dist/materials/availability.d.ts +8 -0
- package/dist/materials/availability.js +22 -0
- package/dist/materials/availability.js.map +1 -0
- package/dist/materials/identity.d.ts +30 -0
- package/dist/materials/identity.js +68 -0
- package/dist/materials/identity.js.map +1 -0
- package/dist/materials/pins.d.ts +23 -0
- package/dist/materials/pins.js +93 -0
- package/dist/materials/pins.js.map +1 -0
- package/dist/mesh/surfaceBvh.d.ts +13 -0
- package/dist/mesh/surfaceBvh.js +197 -0
- package/dist/mesh/surfaceBvh.js.map +1 -0
- package/dist/module-validation.d.ts +2 -0
- package/dist/module-validation.js +24 -0
- package/dist/module-validation.js.map +1 -0
- package/dist/money.d.ts +183 -0
- package/dist/money.js +299 -0
- package/dist/money.js.map +1 -0
- package/dist/npc/capture.d.ts +41 -0
- package/dist/npc/capture.js +99 -0
- package/dist/npc/capture.js.map +1 -0
- package/dist/npc/format.d.ts +2 -0
- package/dist/npc/format.js +102 -0
- package/dist/npc/format.js.map +1 -0
- package/dist/npc/inspect.d.ts +23 -0
- package/dist/npc/inspect.js +54 -0
- package/dist/npc/inspect.js.map +1 -0
- package/dist/npc/metrics.d.ts +132 -0
- package/dist/npc/metrics.js +214 -0
- package/dist/npc/metrics.js.map +1 -0
- package/dist/npc/session.d.ts +35 -0
- package/dist/npc/session.js +172 -0
- package/dist/npc/session.js.map +1 -0
- package/dist/pack/locomotionReference.d.ts +40 -0
- package/dist/pack/locomotionReference.js +132 -0
- package/dist/pack/locomotionReference.js.map +1 -0
- package/dist/pack/scaffold.d.ts +15 -0
- package/dist/pack/scaffold.js +144 -0
- package/dist/pack/scaffold.js.map +1 -0
- package/dist/pack/validate.d.ts +67 -0
- package/dist/pack/validate.js +317 -0
- package/dist/pack/validate.js.map +1 -0
- package/dist/package.d.ts +14 -1
- package/dist/package.js +106 -7
- package/dist/package.js.map +1 -1
- package/dist/paletteShowcase.d.ts +183 -0
- package/dist/paletteShowcase.js +454 -0
- package/dist/paletteShowcase.js.map +1 -0
- package/dist/paletteShowcaseProfiles.d.ts +112 -0
- package/dist/paletteShowcaseProfiles.js +121 -0
- package/dist/paletteShowcaseProfiles.js.map +1 -0
- package/dist/paths.d.ts +4 -0
- package/dist/paths.js +11 -0
- package/dist/paths.js.map +1 -0
- package/dist/placementRequest.d.ts +37 -0
- package/dist/placementRequest.js +220 -0
- package/dist/placementRequest.js.map +1 -0
- package/dist/placements/assets.d.ts +7 -0
- package/dist/placements/assets.js +114 -0
- package/dist/placements/assets.js.map +1 -0
- package/dist/placements/attachFoliageLods.d.ts +4 -0
- package/dist/placements/attachFoliageLods.js +70 -0
- package/dist/placements/attachFoliageLods.js.map +1 -0
- package/dist/placements/attachImpostors.d.ts +3 -0
- package/dist/placements/attachImpostors.js +51 -0
- package/dist/placements/attachImpostors.js.map +1 -0
- package/dist/placements/authored.d.ts +11 -0
- package/dist/placements/authored.js +65 -0
- package/dist/placements/authored.js.map +1 -0
- package/dist/placements/bake.d.ts +2 -0
- package/dist/placements/bake.js +235 -0
- package/dist/placements/bake.js.map +1 -0
- package/dist/placements/captureHost.d.ts +4 -0
- package/dist/placements/captureHost.js +125 -0
- package/dist/placements/captureHost.js.map +1 -0
- package/dist/placements/foliageCapture.d.ts +2 -0
- package/dist/placements/foliageCapture.js +98 -0
- package/dist/placements/foliageCapture.js.map +1 -0
- package/dist/placements/foliageCards.d.ts +17 -0
- package/dist/placements/foliageCards.js +120 -0
- package/dist/placements/foliageCards.js.map +1 -0
- package/dist/placements/foliageLods.d.ts +8 -0
- package/dist/placements/foliageLods.js +240 -0
- package/dist/placements/foliageLods.js.map +1 -0
- package/dist/placements/foliageTexture.d.ts +4 -0
- package/dist/placements/foliageTexture.js +91 -0
- package/dist/placements/foliageTexture.js.map +1 -0
- package/dist/placements/impostorCapture.d.ts +2 -0
- package/dist/placements/impostorCapture.js +111 -0
- package/dist/placements/impostorCapture.js.map +1 -0
- package/dist/placements/impostors.d.ts +18 -0
- package/dist/placements/impostors.js +279 -0
- package/dist/placements/impostors.js.map +1 -0
- package/dist/placements/source.d.ts +53 -0
- package/dist/placements/source.js +111 -0
- package/dist/placements/source.js.map +1 -0
- package/dist/product.d.ts +84 -0
- package/dist/product.js +285 -0
- package/dist/product.js.map +1 -0
- package/dist/publications.d.ts +116 -0
- package/dist/publications.js +180 -0
- package/dist/publications.js.map +1 -0
- package/dist/publishDuplicateGuard.d.ts +92 -0
- package/dist/publishDuplicateGuard.js +128 -0
- package/dist/publishDuplicateGuard.js.map +1 -0
- package/dist/realizability.d.ts +36 -0
- package/dist/realizability.js +269 -0
- package/dist/realizability.js.map +1 -0
- package/dist/resolve.d.ts +7 -1
- package/dist/resolve.js +77 -11
- package/dist/resolve.js.map +1 -1
- package/dist/sceneElements/compiler.d.ts +21 -0
- package/dist/sceneElements/compiler.js +976 -0
- package/dist/sceneElements/compiler.js.map +1 -0
- package/dist/sceneElements/continuum.d.ts +54 -0
- package/dist/sceneElements/continuum.js +451 -0
- package/dist/sceneElements/continuum.js.map +1 -0
- package/dist/sceneElements/devices.d.ts +12 -0
- package/dist/sceneElements/devices.js +212 -0
- package/dist/sceneElements/devices.js.map +1 -0
- package/dist/sceneElements/meshCells.d.ts +49 -0
- package/dist/sceneElements/meshCells.js +174 -0
- package/dist/sceneElements/meshCells.js.map +1 -0
- package/dist/sceneElements/types.d.ts +261 -0
- package/dist/sceneElements/types.js +3 -0
- package/dist/sceneElements/types.js.map +1 -0
- package/dist/sceneHlod/approximate.d.ts +23 -0
- package/dist/sceneHlod/approximate.js +171 -0
- package/dist/sceneHlod/approximate.js.map +1 -0
- package/dist/sceneHlod/artifact.d.ts +3 -0
- package/dist/sceneHlod/artifact.js +29 -0
- package/dist/sceneHlod/artifact.js.map +1 -0
- package/dist/sceneHlod/bakeSurface.d.ts +2 -0
- package/dist/sceneHlod/bakeSurface.js +59 -0
- package/dist/sceneHlod/bakeSurface.js.map +1 -0
- package/dist/sceneHlod/basisEncoder.d.ts +3 -0
- package/dist/sceneHlod/basisEncoder.js +68 -0
- package/dist/sceneHlod/basisEncoder.js.map +1 -0
- package/dist/sceneHlod/cellArtifact.d.ts +17 -0
- package/dist/sceneHlod/cellArtifact.js +78 -0
- package/dist/sceneHlod/cellArtifact.js.map +1 -0
- package/dist/sceneHlod/commands.d.ts +2 -0
- package/dist/sceneHlod/commands.js +114 -0
- package/dist/sceneHlod/commands.js.map +1 -0
- package/dist/sceneHlod/complete.d.ts +78 -0
- package/dist/sceneHlod/complete.js +261 -0
- package/dist/sceneHlod/complete.js.map +1 -0
- package/dist/sceneHlod/completePrototype.d.ts +39 -0
- package/dist/sceneHlod/completePrototype.js +121 -0
- package/dist/sceneHlod/completePrototype.js.map +1 -0
- package/dist/sceneHlod/geometry.d.ts +6 -0
- package/dist/sceneHlod/geometry.js +101 -0
- package/dist/sceneHlod/geometry.js.map +1 -0
- package/dist/sceneHlod/imageSampling.d.ts +11 -0
- package/dist/sceneHlod/imageSampling.js +100 -0
- package/dist/sceneHlod/imageSampling.js.map +1 -0
- package/dist/sceneHlod/refinement.d.ts +46 -0
- package/dist/sceneHlod/refinement.js +204 -0
- package/dist/sceneHlod/refinement.js.map +1 -0
- package/dist/sceneHlod/scene.d.ts +80 -0
- package/dist/sceneHlod/scene.js +264 -0
- package/dist/sceneHlod/scene.js.map +1 -0
- package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
- package/dist/sceneHlod/sharedAtlas.js +84 -0
- package/dist/sceneHlod/sharedAtlas.js.map +1 -0
- package/dist/sceneHlod/source.d.ts +17 -0
- package/dist/sceneHlod/source.js +241 -0
- package/dist/sceneHlod/source.js.map +1 -0
- package/dist/sceneHlod/textureCodec.d.ts +4 -0
- package/dist/sceneHlod/textureCodec.js +66 -0
- package/dist/sceneHlod/textureCodec.js.map +1 -0
- package/dist/sceneHlod/transfer.d.ts +8 -0
- package/dist/sceneHlod/transfer.js +147 -0
- package/dist/sceneHlod/transfer.js.map +1 -0
- package/dist/sceneHlod/types.d.ts +69 -0
- package/dist/sceneHlod/types.js +3 -0
- package/dist/sceneHlod/types.js.map +1 -0
- package/dist/sceneImport/archive.d.ts +30 -0
- package/dist/sceneImport/archive.js +336 -0
- package/dist/sceneImport/archive.js.map +1 -0
- package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
- package/dist/sceneImport/bistroMaterialBake.js +169 -0
- package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
- package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
- package/dist/sceneImport/bistroTexturePlan.js +23 -0
- package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
- package/dist/sceneImport/compiler.d.ts +36 -0
- package/dist/sceneImport/compiler.js +251 -0
- package/dist/sceneImport/compiler.js.map +1 -0
- package/dist/sceneImport/composeMounts.d.ts +159 -0
- package/dist/sceneImport/composeMounts.js +687 -0
- package/dist/sceneImport/composeMounts.js.map +1 -0
- package/dist/sceneImport/defaultMaterials.d.ts +45 -0
- package/dist/sceneImport/defaultMaterials.js +121 -0
- package/dist/sceneImport/defaultMaterials.js.map +1 -0
- package/dist/sceneImport/externalTextures.d.ts +44 -0
- package/dist/sceneImport/externalTextures.js +146 -0
- package/dist/sceneImport/externalTextures.js.map +1 -0
- package/dist/sceneImport/fbx.d.ts +101 -0
- package/dist/sceneImport/fbx.js +307 -0
- package/dist/sceneImport/fbx.js.map +1 -0
- package/dist/sceneImport/glbSplit.d.ts +24 -0
- package/dist/sceneImport/glbSplit.js +95 -0
- package/dist/sceneImport/glbSplit.js.map +1 -0
- package/dist/sceneImport/gltfIo.d.ts +32 -0
- package/dist/sceneImport/gltfIo.js +39 -0
- package/dist/sceneImport/gltfIo.js.map +1 -0
- package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
- package/dist/sceneImport/helsinkiTiles.js +52 -0
- package/dist/sceneImport/helsinkiTiles.js.map +1 -0
- package/dist/sceneImport/materials/binding.d.ts +16 -0
- package/dist/sceneImport/materials/binding.js +42 -0
- package/dist/sceneImport/materials/binding.js.map +1 -0
- package/dist/sceneImport/materials/catalog.d.ts +36 -0
- package/dist/sceneImport/materials/catalog.js +233 -0
- package/dist/sceneImport/materials/catalog.js.map +1 -0
- package/dist/sceneImport/materials/index.d.ts +4 -0
- package/dist/sceneImport/materials/index.js +21 -0
- package/dist/sceneImport/materials/index.js.map +1 -0
- package/dist/sceneImport/materials/matcher.d.ts +33 -0
- package/dist/sceneImport/materials/matcher.js +127 -0
- package/dist/sceneImport/materials/matcher.js.map +1 -0
- package/dist/sceneImport/materials/recipe.d.ts +30 -0
- package/dist/sceneImport/materials/recipe.js +134 -0
- package/dist/sceneImport/materials/recipe.js.map +1 -0
- package/dist/sceneImport/multiAsset.d.ts +79 -0
- package/dist/sceneImport/multiAsset.js +535 -0
- package/dist/sceneImport/multiAsset.js.map +1 -0
- package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
- package/dist/sceneImport/multiAssetSpawn.js +98 -0
- package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
- package/dist/sceneImport/obj.d.ts +41 -0
- package/dist/sceneImport/obj.js +276 -0
- package/dist/sceneImport/obj.js.map +1 -0
- package/dist/sceneImport/package.d.ts +104 -0
- package/dist/sceneImport/package.js +1004 -0
- package/dist/sceneImport/package.js.map +1 -0
- package/dist/sceneImport/packageReader.d.ts +10 -0
- package/dist/sceneImport/packageReader.js +250 -0
- package/dist/sceneImport/packageReader.js.map +1 -0
- package/dist/sceneImport/proxy.d.ts +100 -0
- package/dist/sceneImport/proxy.js +334 -0
- package/dist/sceneImport/proxy.js.map +1 -0
- package/dist/sceneImport/publish.d.ts +47 -0
- package/dist/sceneImport/publish.js +98 -0
- package/dist/sceneImport/publish.js.map +1 -0
- package/dist/sceneImport/semantic.d.ts +75 -0
- package/dist/sceneImport/semantic.js +296 -0
- package/dist/sceneImport/semantic.js.map +1 -0
- package/dist/sceneImport/spawnProbe.d.ts +55 -0
- package/dist/sceneImport/spawnProbe.js +159 -0
- package/dist/sceneImport/spawnProbe.js.map +1 -0
- package/dist/sceneImport/streamLayout.d.ts +96 -0
- package/dist/sceneImport/streamLayout.js +203 -0
- package/dist/sceneImport/streamLayout.js.map +1 -0
- package/dist/sceneImport/textureDecode.d.ts +21 -0
- package/dist/sceneImport/textureDecode.js +292 -0
- package/dist/sceneImport/textureDecode.js.map +1 -0
- package/dist/sceneImport/types.d.ts +84 -0
- package/dist/sceneImport/types.js +58 -0
- package/dist/sceneImport/types.js.map +1 -0
- package/dist/scenePerformance.d.ts +162 -0
- package/dist/scenePerformance.js +905 -0
- package/dist/scenePerformance.js.map +1 -0
- package/dist/screenshot/captureScreenshots.d.ts +36 -0
- package/dist/screenshot/captureScreenshots.js +229 -0
- package/dist/screenshot/captureScreenshots.js.map +1 -0
- package/dist/screenshot/encodeImagePreview.d.ts +5 -0
- package/dist/screenshot/encodeImagePreview.js +42 -0
- package/dist/screenshot/encodeImagePreview.js.map +1 -0
- package/dist/screenshot/publishThumbnail.d.ts +4 -0
- package/dist/screenshot/publishThumbnail.js +56 -0
- package/dist/screenshot/publishThumbnail.js.map +1 -0
- package/dist/screenshot/staticServe.d.ts +14 -0
- package/dist/screenshot/staticServe.js +120 -0
- package/dist/screenshot/staticServe.js.map +1 -0
- package/dist/source-archive.d.ts +101 -0
- package/dist/source-archive.js +309 -0
- package/dist/source-archive.js.map +1 -0
- package/dist/stdioBlocking.d.ts +1 -0
- package/dist/stdioBlocking.js +9 -0
- package/dist/stdioBlocking.js.map +1 -0
- package/dist/terrain/bake.d.ts +40 -0
- package/dist/terrain/bake.js +318 -0
- package/dist/terrain/bake.js.map +1 -0
- package/dist/terrain/generate.d.ts +21 -0
- package/dist/terrain/generate.js +239 -0
- package/dist/terrain/generate.js.map +1 -0
- package/dist/terrain/grid.d.ts +48 -0
- package/dist/terrain/grid.js +133 -0
- package/dist/terrain/grid.js.map +1 -0
- package/dist/terrain/import.d.ts +40 -0
- package/dist/terrain/import.js +252 -0
- package/dist/terrain/import.js.map +1 -0
- package/dist/terrain/index.d.ts +11 -0
- package/dist/terrain/index.js +88 -0
- package/dist/terrain/index.js.map +1 -0
- package/dist/terrain/inspect.d.ts +35 -0
- package/dist/terrain/inspect.js +115 -0
- package/dist/terrain/inspect.js.map +1 -0
- package/dist/terrain/island.d.ts +31 -0
- package/dist/terrain/island.js +128 -0
- package/dist/terrain/island.js.map +1 -0
- package/dist/terrain/noise.d.ts +79 -0
- package/dist/terrain/noise.js +162 -0
- package/dist/terrain/noise.js.map +1 -0
- package/dist/terrain/normals.d.ts +21 -0
- package/dist/terrain/normals.js +55 -0
- package/dist/terrain/normals.js.map +1 -0
- package/dist/terrain/presets/alpine.json +20 -0
- package/dist/terrain/presets/coast.json +20 -0
- package/dist/terrain/presets/desert.json +22 -0
- package/dist/terrain/presets/forest.json +20 -0
- package/dist/terrain/presets/meadow.json +20 -0
- package/dist/terrain/presets/volcanic.json +22 -0
- package/dist/terrain/presets.d.ts +29 -0
- package/dist/terrain/presets.js +128 -0
- package/dist/terrain/presets.js.map +1 -0
- package/dist/terrain/source.d.ts +42 -0
- package/dist/terrain/source.js +241 -0
- package/dist/terrain/source.js.map +1 -0
- package/dist/terrain/tile.d.ts +92 -0
- package/dist/terrain/tile.js +268 -0
- package/dist/terrain/tile.js.map +1 -0
- package/dist/textureAudit.d.ts +23 -0
- package/dist/textureAudit.js +192 -0
- package/dist/textureAudit.js.map +1 -0
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/dist/unreal/avatarMode.d.ts +21 -0
- package/dist/unreal/avatarMode.js +33 -0
- package/dist/unreal/avatarMode.js.map +1 -0
- package/dist/unreal/delivery.d.ts +46 -0
- package/dist/unreal/delivery.js +89 -0
- package/dist/unreal/delivery.js.map +1 -0
- package/dist/unreal/doctor.d.ts +50 -0
- package/dist/unreal/doctor.js +102 -0
- package/dist/unreal/doctor.js.map +1 -0
- package/dist/unreal/package.d.ts +80 -0
- package/dist/unreal/package.js +273 -0
- package/dist/unreal/package.js.map +1 -0
- package/dist/unreal/release.d.ts +41 -0
- package/dist/unreal/release.js +122 -0
- package/dist/unreal/release.js.map +1 -0
- package/dist/unreal.d.ts +30 -0
- package/dist/unreal.js +362 -0
- package/dist/unreal.js.map +1 -0
- package/dist/unrealCandidate.d.ts +213 -0
- package/dist/unrealCandidate.js +765 -0
- package/dist/unrealCandidate.js.map +1 -0
- package/dist/unrealManifest.d.ts +74 -0
- package/dist/unrealManifest.js +354 -0
- package/dist/unrealManifest.js.map +1 -0
- package/dist/unrealPublish.d.ts +111 -0
- package/dist/unrealPublish.js +331 -0
- package/dist/unrealPublish.js.map +1 -0
- package/dist/vault.d.ts +121 -0
- package/dist/vault.js +136 -0
- package/dist/vault.js.map +1 -0
- package/dist/vehicle/addOnDefinition.d.ts +19 -0
- package/dist/vehicle/addOnDefinition.js +21 -0
- package/dist/vehicle/addOnDefinition.js.map +1 -0
- package/dist/vehicle/addon.d.ts +158 -0
- package/dist/vehicle/addon.js +441 -0
- package/dist/vehicle/addon.js.map +1 -0
- package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
- package/dist/vehicle/addonDefinitionGuard.js +206 -0
- package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
- package/dist/vehicle/addonPublished.d.ts +80 -0
- package/dist/vehicle/addonPublished.js +221 -0
- package/dist/vehicle/addonPublished.js.map +1 -0
- package/dist/vehicle/audio.d.ts +259 -0
- package/dist/vehicle/audio.js +1069 -0
- package/dist/vehicle/audio.js.map +1 -0
- package/dist/vehicle/audioDefects.d.ts +125 -0
- package/dist/vehicle/audioDefects.js +591 -0
- package/dist/vehicle/audioDefects.js.map +1 -0
- package/dist/vehicle/audioDistinct.d.ts +62 -0
- package/dist/vehicle/audioDistinct.js +479 -0
- package/dist/vehicle/audioDistinct.js.map +1 -0
- package/dist/vehicle/audioImport.d.ts +217 -0
- package/dist/vehicle/audioImport.js +610 -0
- package/dist/vehicle/audioImport.js.map +1 -0
- package/dist/vehicle/audioProvenance.d.ts +47 -0
- package/dist/vehicle/audioProvenance.js +364 -0
- package/dist/vehicle/audioProvenance.js.map +1 -0
- package/dist/vehicle/audioReference.d.ts +36 -0
- package/dist/vehicle/audioReference.js +176 -0
- package/dist/vehicle/audioReference.js.map +1 -0
- package/dist/vehicle/audioSlots.d.ts +27 -0
- package/dist/vehicle/audioSlots.js +43 -0
- package/dist/vehicle/audioSlots.js.map +1 -0
- package/dist/vehicle/audioSpectral.d.ts +71 -0
- package/dist/vehicle/audioSpectral.js +534 -0
- package/dist/vehicle/audioSpectral.js.map +1 -0
- package/dist/vehicle/cabinCheck.d.ts +209 -0
- package/dist/vehicle/cabinCheck.js +799 -0
- package/dist/vehicle/cabinCheck.js.map +1 -0
- package/dist/vehicle/drive.d.ts +66 -0
- package/dist/vehicle/drive.js +228 -0
- package/dist/vehicle/drive.js.map +1 -0
- package/dist/vehicle/enginePolicy.d.ts +68 -0
- package/dist/vehicle/enginePolicy.js +209 -0
- package/dist/vehicle/enginePolicy.js.map +1 -0
- package/dist/vehicle/hostFrame.d.ts +78 -0
- package/dist/vehicle/hostFrame.js +136 -0
- package/dist/vehicle/hostFrame.js.map +1 -0
- package/dist/vehicle/inspectionSheets.d.ts +42 -0
- package/dist/vehicle/inspectionSheets.js +173 -0
- package/dist/vehicle/inspectionSheets.js.map +1 -0
- package/dist/vehicle/keyboardLaunch.d.ts +189 -0
- package/dist/vehicle/keyboardLaunch.js +340 -0
- package/dist/vehicle/keyboardLaunch.js.map +1 -0
- package/dist/vehicle/lampCoverage.d.ts +49 -0
- package/dist/vehicle/lampCoverage.js +252 -0
- package/dist/vehicle/lampCoverage.js.map +1 -0
- package/dist/vehicle/mintAddOn.d.ts +110 -0
- package/dist/vehicle/mintAddOn.js +321 -0
- package/dist/vehicle/mintAddOn.js.map +1 -0
- package/dist/vehicle/mintVehicle.d.ts +189 -0
- package/dist/vehicle/mintVehicle.js +417 -0
- package/dist/vehicle/mintVehicle.js.map +1 -0
- package/dist/vehicle/paintHue.d.ts +89 -0
- package/dist/vehicle/paintHue.js +248 -0
- package/dist/vehicle/paintHue.js.map +1 -0
- package/dist/vehicle/panelCoverage.d.ts +37 -0
- package/dist/vehicle/panelCoverage.js +93 -0
- package/dist/vehicle/panelCoverage.js.map +1 -0
- package/dist/vehicle/platform.d.ts +71 -0
- package/dist/vehicle/platform.js +144 -0
- package/dist/vehicle/platform.js.map +1 -0
- package/dist/vehicle/preview.d.ts +339 -0
- package/dist/vehicle/preview.js +854 -0
- package/dist/vehicle/preview.js.map +1 -0
- package/dist/vehicle/previewAddon.d.ts +197 -0
- package/dist/vehicle/previewAddon.js +520 -0
- package/dist/vehicle/previewAddon.js.map +1 -0
- package/dist/vehicle/previewSeats.d.ts +102 -0
- package/dist/vehicle/previewSeats.js +190 -0
- package/dist/vehicle/previewSeats.js.map +1 -0
- package/dist/vehicle/publish.d.ts +78 -0
- package/dist/vehicle/publish.js +111 -0
- package/dist/vehicle/publish.js.map +1 -0
- package/dist/vehicle/recheckListed.d.ts +87 -0
- package/dist/vehicle/recheckListed.js +200 -0
- package/dist/vehicle/recheckListed.js.map +1 -0
- package/dist/vehicle/renditionManifest.d.ts +10 -0
- package/dist/vehicle/renditionManifest.js +56 -0
- package/dist/vehicle/renditionManifest.js.map +1 -0
- package/dist/vehicle/sealCheck.d.ts +30 -0
- package/dist/vehicle/sealCheck.js +59 -0
- package/dist/vehicle/sealCheck.js.map +1 -0
- package/dist/vehicle/simulate.d.ts +219 -0
- package/dist/vehicle/simulate.js +536 -0
- package/dist/vehicle/simulate.js.map +1 -0
- package/dist/vehicle/simulateRuntime.d.ts +76 -0
- package/dist/vehicle/simulateRuntime.js +252 -0
- package/dist/vehicle/simulateRuntime.js.map +1 -0
- package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
- package/dist/vehicle/testutil/sourcedAudio.js +96 -0
- package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
- package/dist/vehicle/validate.d.ts +225 -0
- package/dist/vehicle/validate.js +956 -0
- package/dist/vehicle/validate.js.map +1 -0
- package/dist/vehicle/wheelDesign.d.ts +98 -0
- package/dist/vehicle/wheelDesign.js +276 -0
- package/dist/vehicle/wheelDesign.js.map +1 -0
- package/dist/verifySubPath.d.ts +69 -0
- package/dist/verifySubPath.js +458 -0
- package/dist/verifySubPath.js.map +1 -0
- package/dist/visualQa/animation.d.ts +57 -0
- package/dist/visualQa/animation.js +503 -0
- package/dist/visualQa/animation.js.map +1 -0
- package/dist/visualQa/avatar.d.ts +3 -0
- package/dist/visualQa/avatar.js +443 -0
- package/dist/visualQa/avatar.js.map +1 -0
- package/dist/visualQa/avatarMath.d.ts +180 -0
- package/dist/visualQa/avatarMath.js +318 -0
- package/dist/visualQa/avatarMath.js.map +1 -0
- package/dist/visualQa/avatarPreview.d.ts +26 -0
- package/dist/visualQa/avatarPreview.js +167 -0
- package/dist/visualQa/avatarPreview.js.map +1 -0
- package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
- package/dist/visualQa/avatarPreviewMath.js +696 -0
- package/dist/visualQa/avatarPreviewMath.js.map +1 -0
- package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
- package/dist/visualQa/avatarPreviewProbe.js +181 -0
- package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
- package/dist/visualQa/avatarProbe.d.ts +1 -0
- package/dist/visualQa/avatarProbe.js +264 -0
- package/dist/visualQa/avatarProbe.js.map +1 -0
- package/dist/visualQa/browser.d.ts +116 -0
- package/dist/visualQa/browser.js +817 -0
- package/dist/visualQa/browser.js.map +1 -0
- package/dist/visualQa/candidate.d.ts +116 -0
- package/dist/visualQa/candidate.js +265 -0
- package/dist/visualQa/candidate.js.map +1 -0
- package/dist/visualQa/checklists.d.ts +31 -0
- package/dist/visualQa/checklists.js +160 -0
- package/dist/visualQa/checklists.js.map +1 -0
- package/dist/visualQa/command.d.ts +110 -0
- package/dist/visualQa/command.js +521 -0
- package/dist/visualQa/command.js.map +1 -0
- package/dist/visualQa/commonAsserts.d.ts +68 -0
- package/dist/visualQa/commonAsserts.js +239 -0
- package/dist/visualQa/commonAsserts.js.map +1 -0
- package/dist/visualQa/contactSheet.d.ts +32 -0
- package/dist/visualQa/contactSheet.js +153 -0
- package/dist/visualQa/contactSheet.js.map +1 -0
- package/dist/visualQa/critic.d.ts +18 -0
- package/dist/visualQa/critic.js +179 -0
- package/dist/visualQa/critic.js.map +1 -0
- package/dist/visualQa/emotePage.d.ts +10 -0
- package/dist/visualQa/emotePage.js +249 -0
- package/dist/visualQa/emotePage.js.map +1 -0
- package/dist/visualQa/evidenceOverlay.d.ts +74 -0
- package/dist/visualQa/evidenceOverlay.js +268 -0
- package/dist/visualQa/evidenceOverlay.js.map +1 -0
- package/dist/visualQa/harness.d.ts +57 -0
- package/dist/visualQa/harness.js +3 -0
- package/dist/visualQa/harness.js.map +1 -0
- package/dist/visualQa/hosted.d.ts +152 -0
- package/dist/visualQa/hosted.js +367 -0
- package/dist/visualQa/hosted.js.map +1 -0
- package/dist/visualQa/labelLimit.d.ts +12 -0
- package/dist/visualQa/labelLimit.js +31 -0
- package/dist/visualQa/labelLimit.js.map +1 -0
- package/dist/visualQa/mirror.d.ts +36 -0
- package/dist/visualQa/mirror.js +98 -0
- package/dist/visualQa/mirror.js.map +1 -0
- package/dist/visualQa/moveUx.d.ts +44 -0
- package/dist/visualQa/moveUx.js +103 -0
- package/dist/visualQa/moveUx.js.map +1 -0
- package/dist/visualQa/pinnedChrome.d.ts +63 -0
- package/dist/visualQa/pinnedChrome.js +214 -0
- package/dist/visualQa/pinnedChrome.js.map +1 -0
- package/dist/visualQa/resolve.d.ts +88 -0
- package/dist/visualQa/resolve.js +248 -0
- package/dist/visualQa/resolve.js.map +1 -0
- package/dist/visualQa/scene.d.ts +14 -0
- package/dist/visualQa/scene.js +688 -0
- package/dist/visualQa/scene.js.map +1 -0
- package/dist/visualQa/shot.d.ts +2 -0
- package/dist/visualQa/shot.js +27 -0
- package/dist/visualQa/shot.js.map +1 -0
- package/dist/visualQa/signIn.d.ts +35 -0
- package/dist/visualQa/signIn.js +144 -0
- package/dist/visualQa/signIn.js.map +1 -0
- package/dist/visualQa/submitBudget.d.ts +25 -0
- package/dist/visualQa/submitBudget.js +82 -0
- package/dist/visualQa/submitBudget.js.map +1 -0
- package/dist/visualQa/types.d.ts +195 -0
- package/dist/visualQa/types.js +12 -0
- package/dist/visualQa/types.js.map +1 -0
- package/dist/visualQa/vehicle.d.ts +130 -0
- package/dist/visualQa/vehicle.js +2002 -0
- package/dist/visualQa/vehicle.js.map +1 -0
- package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
- package/dist/visualQa/vehicleAddonProbe.js +115 -0
- package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
- package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
- package/dist/visualQa/vehicleCabinFit.js +55 -0
- package/dist/visualQa/vehicleCabinFit.js.map +1 -0
- package/dist/visualQa/vehicleClearance.d.ts +135 -0
- package/dist/visualQa/vehicleClearance.js +299 -0
- package/dist/visualQa/vehicleClearance.js.map +1 -0
- package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
- package/dist/visualQa/vehicleDriveAlive.js +103 -0
- package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
- package/dist/visualQa/vehicleGrip.d.ts +156 -0
- package/dist/visualQa/vehicleGrip.js +439 -0
- package/dist/visualQa/vehicleGrip.js.map +1 -0
- package/dist/visualQa/vehicleInspection.d.ts +70 -0
- package/dist/visualQa/vehicleInspection.js +318 -0
- package/dist/visualQa/vehicleInspection.js.map +1 -0
- package/dist/visualQa/vehicleLamps.d.ts +120 -0
- package/dist/visualQa/vehicleLamps.js +377 -0
- package/dist/visualQa/vehicleLamps.js.map +1 -0
- package/dist/visualQa/vehicleMath.d.ts +440 -0
- package/dist/visualQa/vehicleMath.js +967 -0
- package/dist/visualQa/vehicleMath.js.map +1 -0
- package/dist/visualQa/vehicleOccupants.d.ts +66 -0
- package/dist/visualQa/vehicleOccupants.js +448 -0
- package/dist/visualQa/vehicleOccupants.js.map +1 -0
- package/dist/visualQa/vehiclePenetration.d.ts +172 -0
- package/dist/visualQa/vehiclePenetration.js +1157 -0
- package/dist/visualQa/vehiclePenetration.js.map +1 -0
- package/dist/visualQa/vehiclePoses.d.ts +25 -0
- package/dist/visualQa/vehiclePoses.js +56 -0
- package/dist/visualQa/vehiclePoses.js.map +1 -0
- package/dist/visualQa/vehiclePosture.d.ts +78 -0
- package/dist/visualQa/vehiclePosture.js +263 -0
- package/dist/visualQa/vehiclePosture.js.map +1 -0
- package/dist/visualQa/vehiclePreview.d.ts +103 -0
- package/dist/visualQa/vehiclePreview.js +312 -0
- package/dist/visualQa/vehiclePreview.js.map +1 -0
- package/dist/visualQa/vehicleProbe.d.ts +3 -0
- package/dist/visualQa/vehicleProbe.js +670 -0
- package/dist/visualQa/vehicleProbe.js.map +1 -0
- package/dist/visualQa/vehicleStance.d.ts +108 -0
- package/dist/visualQa/vehicleStance.js +200 -0
- package/dist/visualQa/vehicleStance.js.map +1 -0
- package/dist/visualQa/viewer.d.ts +6 -0
- package/dist/visualQa/viewer.js +750 -0
- package/dist/visualQa/viewer.js.map +1 -0
- package/dist/visualQa/viewerGeometry.d.ts +116 -0
- package/dist/visualQa/viewerGeometry.js +476 -0
- package/dist/visualQa/viewerGeometry.js.map +1 -0
- package/dist/visualQa/viewerPage.d.ts +11 -0
- package/dist/visualQa/viewerPage.js +414 -0
- package/dist/visualQa/viewerPage.js.map +1 -0
- package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
- package/dist/visualQa/webgpuSelfTest.js +113 -0
- package/dist/visualQa/webgpuSelfTest.js.map +1 -0
- package/dist/visualQa/winChrome.d.ts +92 -0
- package/dist/visualQa/winChrome.js +445 -0
- package/dist/visualQa/winChrome.js.map +1 -0
- package/dist/visualQa/worldWalk.d.ts +59 -0
- package/dist/visualQa/worldWalk.js +523 -0
- package/dist/visualQa/worldWalk.js.map +1 -0
- package/dist/visualQa/worldWalkMath.d.ts +263 -0
- package/dist/visualQa/worldWalkMath.js +873 -0
- package/dist/visualQa/worldWalkMath.js.map +1 -0
- package/dist/visualQa/worldWalkProbe.d.ts +1 -0
- package/dist/visualQa/worldWalkProbe.js +206 -0
- package/dist/visualQa/worldWalkProbe.js.map +1 -0
- package/dist/visualsConfig.d.ts +65 -0
- package/dist/visualsConfig.js +1333 -0
- package/dist/visualsConfig.js.map +1 -0
- package/dist/voiceCommand.d.ts +11 -0
- package/dist/voiceCommand.js +101 -0
- package/dist/voiceCommand.js.map +1 -0
- package/dist/world/analyze.d.ts +51 -0
- package/dist/world/analyze.js +767 -0
- package/dist/world/analyze.js.map +1 -0
- package/dist/world/baseline.d.ts +33 -0
- package/dist/world/baseline.js +111 -0
- package/dist/world/baseline.js.map +1 -0
- package/dist/world/canonicalize.d.ts +7 -0
- package/dist/world/canonicalize.js +110 -0
- package/dist/world/canonicalize.js.map +1 -0
- package/dist/world/diff.d.ts +18 -0
- package/dist/world/diff.js +58 -0
- package/dist/world/diff.js.map +1 -0
- package/dist/world/focus.d.ts +11 -0
- package/dist/world/focus.js +161 -0
- package/dist/world/focus.js.map +1 -0
- package/dist/world/format.d.ts +6 -0
- package/dist/world/format.js +125 -0
- package/dist/world/format.js.map +1 -0
- package/dist/world/readWorldMetrics.d.ts +10 -0
- package/dist/world/readWorldMetrics.js +31 -0
- package/dist/world/readWorldMetrics.js.map +1 -0
- package/dist/world/snapshotTypes.d.ts +59 -0
- package/dist/world/snapshotTypes.js +8 -0
- package/dist/world/snapshotTypes.js.map +1 -0
- package/dist/world/snapshotWorld.d.ts +16 -0
- package/dist/world/snapshotWorld.js +142 -0
- package/dist/world/snapshotWorld.js.map +1 -0
- package/dist/world/wiring.d.ts +21 -0
- package/dist/world/wiring.js +73 -0
- package/dist/world/wiring.js.map +1 -0
- package/dist/world/zones.d.ts +23 -0
- package/dist/world/zones.js +134 -0
- package/dist/world/zones.js.map +1 -0
- package/docs/bridge.md +304 -0
- package/docs/device-hand-reach.md +44 -0
- package/docs/scene-hlod.md +139 -0
- package/docs/vehicle-audio-import.md +299 -0
- package/docs/vehicle-simulate.md +165 -0
- package/docs/visual-qa-candidate-versions.md +71 -0
- package/docs/visual-qa.md +462 -0
- package/package.json +69 -4
- package/plugins/beamng-vehicle/README.md +129 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
- package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
- package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
- package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
- package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
- package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
- package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
- package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
- package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
- package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
- package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
- package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
- package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
- package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
- package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
- package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
- package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
- package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
- package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
- package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
- package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
- package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
- package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
- package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
- package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
- package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
- package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
- package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
- package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
- package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
- package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
- package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
- package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
- package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
- package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
- package/vendor/README.md +63 -0
- package/vendor/ability-manifest.mjs +527 -6
- package/vendor/audits/asset-credits.mjs +96 -0
- package/vendor/audits/check-loaders.mjs +80 -0
- package/vendor/audits/perf-gate.mjs +759 -0
- package/vendor/audits/prove-live.mjs +307 -0
- package/vendor/audits/source-audit.mjs +530 -0
- package/vendor/audits/world-audit.mjs +439 -0
- package/vendor/capture-body.glb +0 -0
- package/vendor/capture-face.glb +0 -0
- package/vendor/installed-index.mjs +1 -1
- package/vendor/vehicle-package-v2.mjs +6451 -0
package/dist/item.js
ADDED
|
@@ -0,0 +1,892 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// Pure, network-free helpers behind `helix item …` — the Character-Creator slot
|
|
3
|
+
// table, the kind rules, the file sniffing, and the payload builder. Kept apart
|
|
4
|
+
// from the HTTP flow in lib.ts on purpose (the same split as
|
|
5
|
+
// mediaContentTypeFromExtension / assertMediaSizeOk / assertMediaSlotWritable):
|
|
6
|
+
// every rule below is testable without mocking a server.
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.TUNE_ONLY_VEHICLE_SLOT_TYPES = exports.MAX_CLIP_SET_OPS = exports.MAX_ADD_ON_OPS = exports.CLIP_SET_SLOT_TYPES = exports.MESH_CONTENT_TYPE = exports.UPLOADABLE_ITEM_KINDS = exports.CC_GENDERS = exports.CC_WEARABLE_SLOTS = exports.CC_WEARABLE_SLOT_GROUPS = void 0;
|
|
9
|
+
exports.isCcWearableSlot = isCcWearableSlot;
|
|
10
|
+
exports.isCcGender = isCcGender;
|
|
11
|
+
exports.ccGendersAreRequiredForKind = ccGendersAreRequiredForKind;
|
|
12
|
+
exports.ccGendersAreAllowedForKind = ccGendersAreAllowedForKind;
|
|
13
|
+
exports.parseGenders = parseGenders;
|
|
14
|
+
exports.renderCcGenderList = renderCcGenderList;
|
|
15
|
+
exports.assertCcGenders = assertCcGenders;
|
|
16
|
+
exports.isUploadableItemKind = isUploadableItemKind;
|
|
17
|
+
exports.normalizeItemKind = normalizeItemKind;
|
|
18
|
+
exports.describeUploadableItemKinds = describeUploadableItemKinds;
|
|
19
|
+
exports.ccSlotIsRequiredForKind = ccSlotIsRequiredForKind;
|
|
20
|
+
exports.ccSlotIsAllowedForKind = ccSlotIsAllowedForKind;
|
|
21
|
+
exports.renderCcSlotTable = renderCcSlotTable;
|
|
22
|
+
exports.assertCcSlot = assertCcSlot;
|
|
23
|
+
exports.meshContentTypeFromExtension = meshContentTypeFromExtension;
|
|
24
|
+
exports.thumbnailContentTypeFromExtension = thumbnailContentTypeFromExtension;
|
|
25
|
+
exports.assertLooksLikeGlb = assertLooksLikeGlb;
|
|
26
|
+
exports.meshSizeWarning = meshSizeWarning;
|
|
27
|
+
exports.maxOpsForSlot = maxOpsForSlot;
|
|
28
|
+
exports.isTuneOnlyVehiclePart = isTuneOnlyVehiclePart;
|
|
29
|
+
exports.isMeshlessItem = isMeshlessItem;
|
|
30
|
+
exports.parseJsonOrFile = parseJsonOrFile;
|
|
31
|
+
exports.parseJsonObjectOrFile = parseJsonObjectOrFile;
|
|
32
|
+
exports.parseJsonArrayOrFile = parseJsonArrayOrFile;
|
|
33
|
+
exports.validateAddOnContract = validateAddOnContract;
|
|
34
|
+
exports.parseTags = parseTags;
|
|
35
|
+
exports.buildItemPayload = buildItemPayload;
|
|
36
|
+
const node_fs_1 = require("node:fs");
|
|
37
|
+
const node_path_1 = require("node:path");
|
|
38
|
+
const distribution_1 = require("./distribution");
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
// Character-Creator cosmetic slots
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
//
|
|
43
|
+
// !! MIRROR — KEEP IN LOCKSTEP WITH THE BACKEND !!
|
|
44
|
+
//
|
|
45
|
+
// AUTHORITY: helix-backend-api → src/universal-items/cc-wearable-slot.ts
|
|
46
|
+
// (`CC_WEARABLE_SLOTS`). The UE Character Creator taxonomy is the
|
|
47
|
+
// origin; the backend is the copy every client must agree with.
|
|
48
|
+
//
|
|
49
|
+
// This list is a LOCAL FAST PATH, never the authority. It exists so a bad tag is
|
|
50
|
+
// caught before a 30 MB mesh is uploaded and a publish fee is charged — nothing
|
|
51
|
+
// more. Two properties keep a stale copy harmless:
|
|
52
|
+
//
|
|
53
|
+
// 1. the CLI never invents a tag: `--slot` is matched EXACTLY against this
|
|
54
|
+
// table, so a typo fails locally with the full list;
|
|
55
|
+
// 2. the server is always the last word: its 400 enumerates every valid tag
|
|
56
|
+
// and is surfaced verbatim (ApiError.render()), so a CLI missing a
|
|
57
|
+
// NEWLY-added slot tells the user the real list instead of guessing.
|
|
58
|
+
//
|
|
59
|
+
// When the backend adds or renames a slot, edit THIS table in the same PR wave.
|
|
60
|
+
// `item.spec.ts` pins the exact tag list, so any edit is a deliberate,
|
|
61
|
+
// reviewed diff rather than a silent drift.
|
|
62
|
+
//
|
|
63
|
+
// (Why not import it from @hypersoniclabs/helix-manifest, the one package this
|
|
64
|
+
// CLI and the backend already share? See docs/../PR notes: helix-manifest is the
|
|
65
|
+
// Instant *world bundle* contract — the backend's universal-items module has no
|
|
66
|
+
// dependency edge to it — and the CLI's publish script rewrites
|
|
67
|
+
// `file:../helix-manifest` to `^<latest PUBLISHED version>`, so a CLI release
|
|
68
|
+
// that beat a manifest release would compile locally and ship with the export
|
|
69
|
+
// `undefined` at runtime. A silently-undefined validation table is worse than a
|
|
70
|
+
// visibly-mirrored one.)
|
|
71
|
+
/** The five CC slot groups, in the order `helix item list-slots` prints them. */
|
|
72
|
+
exports.CC_WEARABLE_SLOT_GROUPS = [
|
|
73
|
+
{
|
|
74
|
+
group: 'Clothing',
|
|
75
|
+
summary: 'wearable garments',
|
|
76
|
+
slots: [
|
|
77
|
+
'Cosmetic.Slot.Clothing.Top',
|
|
78
|
+
'Cosmetic.Slot.Clothing.Bottoms',
|
|
79
|
+
'Cosmetic.Slot.Clothing.Set',
|
|
80
|
+
'Cosmetic.Slot.Clothing.Backpack',
|
|
81
|
+
'Cosmetic.Slot.Clothing.Socks',
|
|
82
|
+
'Cosmetic.Slot.Clothing.Shoes',
|
|
83
|
+
'Cosmetic.Slot.Clothing.Underwear.Top',
|
|
84
|
+
'Cosmetic.Slot.Clothing.Underwear.Bottom',
|
|
85
|
+
'Cosmetic.Slot.Clothing.Underwear.Leg',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
group: 'Accessory',
|
|
90
|
+
summary: 'attached props, grouped by body zone',
|
|
91
|
+
slots: [
|
|
92
|
+
'Cosmetic.Slot.Accessory.Head.Hat',
|
|
93
|
+
'Cosmetic.Slot.Accessory.Face.Mask',
|
|
94
|
+
'Cosmetic.Slot.Accessory.Face.Eyewear',
|
|
95
|
+
'Cosmetic.Slot.Accessory.Neck.Necklace',
|
|
96
|
+
'Cosmetic.Slot.Accessory.Ears.Earrings',
|
|
97
|
+
'Cosmetic.Slot.Accessory.Hands.Gloves',
|
|
98
|
+
'Cosmetic.Slot.Accessory.Hands.Nails',
|
|
99
|
+
],
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
group: 'Appearance',
|
|
103
|
+
summary: 'non-mesh visual layers',
|
|
104
|
+
slots: [
|
|
105
|
+
'Cosmetic.Slot.Appearance.Hair.Main',
|
|
106
|
+
'Cosmetic.Slot.Appearance.Hair.Facial.Beard',
|
|
107
|
+
'Cosmetic.Slot.Appearance.Hair.Facial.Mustache',
|
|
108
|
+
'Cosmetic.Slot.Appearance.Eyes.Eyebrows',
|
|
109
|
+
'Cosmetic.Slot.Appearance.Eyes.Eyelashes',
|
|
110
|
+
'Cosmetic.Slot.Appearance.Eyes.Iris',
|
|
111
|
+
'Cosmetic.Slot.Appearance.Skin.BodyTattoo',
|
|
112
|
+
'Cosmetic.Slot.Appearance.Skin.FaceTattoo',
|
|
113
|
+
'Cosmetic.Slot.Appearance.Makeup.Lipstick',
|
|
114
|
+
'Cosmetic.Slot.Appearance.Makeup.Eyeliner',
|
|
115
|
+
'Cosmetic.Slot.Appearance.Makeup.Eyeshadow',
|
|
116
|
+
'Cosmetic.Slot.Appearance.Makeup.Blush',
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
group: 'Body',
|
|
121
|
+
summary: 'modular base meshes',
|
|
122
|
+
slots: [
|
|
123
|
+
'Cosmetic.Slot.Body.Head',
|
|
124
|
+
'Cosmetic.Slot.Body.Upper',
|
|
125
|
+
'Cosmetic.Slot.Body.Lower',
|
|
126
|
+
'Cosmetic.Slot.Body.Hands',
|
|
127
|
+
'Cosmetic.Slot.Body.Feet',
|
|
128
|
+
],
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
group: 'Custom',
|
|
132
|
+
summary: 'a custom full-body mesh that overrides the modular body',
|
|
133
|
+
slots: ['Cosmetic.Slot.Custom'],
|
|
134
|
+
},
|
|
135
|
+
];
|
|
136
|
+
/** Every CC slot tag, flattened in group order. Derived — never a second literal. */
|
|
137
|
+
exports.CC_WEARABLE_SLOTS = exports.CC_WEARABLE_SLOT_GROUPS.flatMap((g) => g.slots);
|
|
138
|
+
const CC_WEARABLE_SLOT_SET = new Set(exports.CC_WEARABLE_SLOTS);
|
|
139
|
+
/** True if `tag` is a known CC wearable slot tag. Casing is EXACT. */
|
|
140
|
+
function isCcWearableSlot(tag) {
|
|
141
|
+
return typeof tag === 'string' && CC_WEARABLE_SLOT_SET.has(tag);
|
|
142
|
+
}
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
// Character-Creator genders
|
|
145
|
+
// ---------------------------------------------------------------------------
|
|
146
|
+
//
|
|
147
|
+
// !! MIRROR — KEEP IN LOCKSTEP WITH THE BACKEND !!
|
|
148
|
+
//
|
|
149
|
+
// AUTHORITY: helix-backend-api → src/universal-items/cc-gender.ts
|
|
150
|
+
// (`CC_GENDERS`), stored as `universal_items.cc_genders` and sent
|
|
151
|
+
// on the wire as `genders`. The UE `EHCharacterCosmeticsGender`
|
|
152
|
+
// enum is the origin; the backend is the copy every client agrees
|
|
153
|
+
// with.
|
|
154
|
+
//
|
|
155
|
+
// Same contract as the slot table above: a LOCAL FAST PATH so a bad value fails
|
|
156
|
+
// before a mesh is uploaded and a non-refundable publish fee is charged, never
|
|
157
|
+
// the authority. `item.spec.ts` pins the exact values so drift arrives only as a
|
|
158
|
+
// reviewed diff.
|
|
159
|
+
//
|
|
160
|
+
// TWO values, and there is NO third. Unreal's enum is Male/Female (its `None` is
|
|
161
|
+
// documented as internal, and the legacy `All` is gone), so there is no
|
|
162
|
+
// "unisex"/"fits everyone" token to reach for — a garment that fits every body
|
|
163
|
+
// declares EVERY gender it fits: male,female. The CLI deliberately does NOT
|
|
164
|
+
// invent a `both`/`all` alias: the moment the CLI's vocabulary diverges from the
|
|
165
|
+
// wire's, the server's own error messages (which name `male` and `female`) stop
|
|
166
|
+
// matching what the creator typed. `both` is instead rejected BY NAME with the
|
|
167
|
+
// spelling that works.
|
|
168
|
+
//
|
|
169
|
+
// A single row carrying {male, female} is the deliberate web equivalent of
|
|
170
|
+
// Unreal's two entries sharing one mesh: the web runtime ships ONE GLB worn by
|
|
171
|
+
// every body, so a scalar would force the row to lie about one of the two
|
|
172
|
+
// renditions.
|
|
173
|
+
exports.CC_GENDERS = ['male', 'female'];
|
|
174
|
+
const CC_GENDER_SET = new Set(exports.CC_GENDERS);
|
|
175
|
+
/** True if `value` is a known CC gender. Casing is EXACT (lowercase). */
|
|
176
|
+
function isCcGender(value) {
|
|
177
|
+
return typeof value === 'string' && CC_GENDER_SET.has(value);
|
|
178
|
+
}
|
|
179
|
+
/** A wearable cannot be exported to the Character Creator without a gender. */
|
|
180
|
+
function ccGendersAreRequiredForKind(kind) {
|
|
181
|
+
return kind === 'wearable';
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Only wearables (required) and avatars (optional — an avatar is a
|
|
185
|
+
* `Cosmetic.Slot.Body.*` modular mesh, gendered like anything else) are authored
|
|
186
|
+
* per gender. A gender on a home item is meaningless and is rejected rather than
|
|
187
|
+
* silently stored. Deliberately the SAME kind rule as the slot.
|
|
188
|
+
*/
|
|
189
|
+
function ccGendersAreAllowedForKind(kind) {
|
|
190
|
+
return kind === 'wearable' || kind === 'avatar';
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* Misspellings that mean "every body", each mapped to the phrasing that works.
|
|
194
|
+
* These exist because the value a creator reaches for first does not exist, and
|
|
195
|
+
* a bare "unknown gender" error would leave them guessing at a third token
|
|
196
|
+
* instead of learning that the answer is to name both.
|
|
197
|
+
*/
|
|
198
|
+
const NO_SUCH_UNIVERSAL_GENDER = new Set([
|
|
199
|
+
'both',
|
|
200
|
+
'all',
|
|
201
|
+
'any',
|
|
202
|
+
'unisex',
|
|
203
|
+
'neutral',
|
|
204
|
+
'none',
|
|
205
|
+
'universal',
|
|
206
|
+
]);
|
|
207
|
+
/**
|
|
208
|
+
* Split a `--gender male,female` value the way `parseTags` splits tags: trimmed,
|
|
209
|
+
* empties dropped, deduped, then ordered by `CC_GENDERS` so `female,male` and
|
|
210
|
+
* `male,female` produce the SAME array. Two publishes that mean the same thing
|
|
211
|
+
* must send the same value, or a `genders = {male,female}` filter silently
|
|
212
|
+
* misses half the catalogue.
|
|
213
|
+
*
|
|
214
|
+
* Values are NOT lowercased — mirroring the backend's `normalizeCcGenders`.
|
|
215
|
+
* `Male` is not a CC gender, and quietly repairing it here would hide a client
|
|
216
|
+
* sending UE's enum casing verbatim. Unknown values are kept so the validator
|
|
217
|
+
* can reject them BY NAME.
|
|
218
|
+
*/
|
|
219
|
+
function parseGenders(value) {
|
|
220
|
+
const seen = new Set();
|
|
221
|
+
for (const raw of value.split(',')) {
|
|
222
|
+
const part = raw.trim();
|
|
223
|
+
if (part)
|
|
224
|
+
seen.add(part);
|
|
225
|
+
}
|
|
226
|
+
const known = exports.CC_GENDERS.filter((g) => seen.has(g));
|
|
227
|
+
const unknown = [...seen].filter((v) => !isCcGender(v));
|
|
228
|
+
return [...known, ...unknown];
|
|
229
|
+
}
|
|
230
|
+
/** The valid genders, rendered for a terminal (also printed by `list-slots`). */
|
|
231
|
+
function renderCcGenderList() {
|
|
232
|
+
return (`${exports.CC_GENDERS.join(', ')} (lowercase, comma-separated for more than one)\n` +
|
|
233
|
+
' A garment that fits every body declares BOTH: --gender male,female.\n' +
|
|
234
|
+
' There is no "unisex"/"all"/"both" value — Unreal requires a gender on\n' +
|
|
235
|
+
' every entry, accessories and tattoos included.');
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Validate the (kind, genders) pair the way the backend does, and throw the same
|
|
239
|
+
* three failures. Mirrors `validateCcGendersForKind` in helix-backend-api.
|
|
240
|
+
*
|
|
241
|
+
* `undefined` and `[]` are the SAME thing — "no genders declared" — because the
|
|
242
|
+
* column is `NOT NULL DEFAULT '{}'`: an omitted field and an explicit empty list
|
|
243
|
+
* both land as `{}` server-side and must fail identically for a wearable.
|
|
244
|
+
*/
|
|
245
|
+
function assertCcGenders(kind, genders) {
|
|
246
|
+
const list = parseGenders((genders ?? []).join(','));
|
|
247
|
+
const unknown = list.filter((g) => !isCcGender(g));
|
|
248
|
+
if (unknown.length > 0) {
|
|
249
|
+
// A creator who typed "both"/"unisex" does not need the vocabulary — they
|
|
250
|
+
// need the ONE sentence that says the value they want does not exist and
|
|
251
|
+
// what to write instead. Repeating the full list under it buries that.
|
|
252
|
+
const universal = unknown.find((g) => NO_SUCH_UNIVERSAL_GENDER.has(g.toLowerCase()));
|
|
253
|
+
if (universal !== undefined) {
|
|
254
|
+
throw new Error(`There is no "${universal}" Character-Creator gender. A garment that fits every ` +
|
|
255
|
+
'body names every gender it fits: --gender male,female.');
|
|
256
|
+
}
|
|
257
|
+
throw new Error(`Unknown Character-Creator gender ${unknown.map((g) => `"${g}"`).join(', ')} ` +
|
|
258
|
+
'(matching is exact, and lowercase).\n' +
|
|
259
|
+
`Valid genders: ${renderCcGenderList()}`);
|
|
260
|
+
}
|
|
261
|
+
if (list.length === 0 && ccGendersAreRequiredForKind(kind)) {
|
|
262
|
+
throw new Error('A wearable must declare the Character-Creator gender(s) it is authored for — pass --gender.\n' +
|
|
263
|
+
`Valid genders: ${renderCcGenderList()}`);
|
|
264
|
+
}
|
|
265
|
+
if (list.length > 0 && !ccGendersAreAllowedForKind(kind)) {
|
|
266
|
+
throw new Error(`Character-Creator genders are meaningless for kind "${kind}" — only wearables ` +
|
|
267
|
+
'(required) and avatars (optional) are authored per gender. Drop --gender.');
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
// ---------------------------------------------------------------------------
|
|
271
|
+
// Item kinds
|
|
272
|
+
// ---------------------------------------------------------------------------
|
|
273
|
+
/**
|
|
274
|
+
* The kinds `POST /universal-items/upload` accepts. Everything else in the
|
|
275
|
+
* backend's UniversalItemKind enum (emote / prop / bundle / achievement) is not
|
|
276
|
+
* an uploadable mesh and is rejected server-side, so the CLI never offers it.
|
|
277
|
+
*/
|
|
278
|
+
exports.UPLOADABLE_ITEM_KINDS = [
|
|
279
|
+
'wearable',
|
|
280
|
+
'avatar',
|
|
281
|
+
// Add-ons use the same verified mesh upload path as wearables. Their
|
|
282
|
+
// compatibility contract is carried by `fits`/`ops`, not by a CC slot.
|
|
283
|
+
'add_on',
|
|
284
|
+
'home_item',
|
|
285
|
+
'home_shell',
|
|
286
|
+
// A vehicle verifies and optimises on exactly the home-item path server-side
|
|
287
|
+
// (static mesh, same limits). It is listed here because the alternative is
|
|
288
|
+
// what actually happened: with no vehicle kind to publish into, the three
|
|
289
|
+
// hero vehicles were published as `home_item` and shoppers saw cars filed
|
|
290
|
+
// under Furniture and labelled "Prop".
|
|
291
|
+
'vehicle',
|
|
292
|
+
];
|
|
293
|
+
function isUploadableItemKind(k) {
|
|
294
|
+
return (typeof k === 'string' &&
|
|
295
|
+
exports.UPLOADABLE_ITEM_KINDS.includes(k));
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Friendly, CURRENT product names for the two wire values above whose names
|
|
299
|
+
* predate the rename (see helixgame.com's `lib/items/types.ts` label map —
|
|
300
|
+
* `home_item: "Props"`, `home_shell: "Homes"`, CH-1638). This is display and
|
|
301
|
+
* input-vocabulary ONLY: the wire value a creator's `home_item`/`home_shell`
|
|
302
|
+
* item is stored and served under is unchanged, and so is
|
|
303
|
+
* `UniversalItemKind` in helix-backend-api (which separately, and
|
|
304
|
+
* deliberately, ALSO has a distinct `Prop = 'prop'` kind for art/collectible
|
|
305
|
+
* items — do not confuse the two; this alias never reaches the wire as
|
|
306
|
+
* anything but `home_item` / `home_shell`).
|
|
307
|
+
*/
|
|
308
|
+
const ITEM_KIND_LABELS = {
|
|
309
|
+
wearable: 'wearable',
|
|
310
|
+
avatar: 'avatar',
|
|
311
|
+
add_on: 'add_on',
|
|
312
|
+
home_item: 'prop',
|
|
313
|
+
home_shell: 'home',
|
|
314
|
+
vehicle: 'vehicle',
|
|
315
|
+
};
|
|
316
|
+
/**
|
|
317
|
+
* Friendly-name → wire-value aliases accepted anywhere a `--kind` is typed.
|
|
318
|
+
* The wire values (`home_item`, `home_shell`, …) remain valid input too —
|
|
319
|
+
* back-compat for scripts/docs already using them.
|
|
320
|
+
*/
|
|
321
|
+
const ITEM_KIND_ALIASES = {
|
|
322
|
+
prop: 'home_item',
|
|
323
|
+
home: 'home_shell',
|
|
324
|
+
};
|
|
325
|
+
/**
|
|
326
|
+
* Resolve a user-typed `--kind` value (current product name, legacy wire
|
|
327
|
+
* value, or garbage) to the wire value the backend's `UniversalItemKind`
|
|
328
|
+
* expects — the ONLY thing that ever leaves this function is one of
|
|
329
|
+
* `UPLOADABLE_ITEM_KINDS`'s existing members, or the input unchanged if it
|
|
330
|
+
* matches neither an alias nor a wire value (left for `isUploadableItemKind`
|
|
331
|
+
* to reject with the full accepted list).
|
|
332
|
+
*/
|
|
333
|
+
function normalizeItemKind(value) {
|
|
334
|
+
return ITEM_KIND_ALIASES[value] ?? value;
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Human-facing list of accepted `--kind` values, leading with the current
|
|
338
|
+
* product name and showing the underlying wire value alongside it (so
|
|
339
|
+
* `grep`ing for `home_item`/`home_shell` still finds this string). Used by
|
|
340
|
+
* the `--kind` option help and every "unsupported kind" error so the two
|
|
341
|
+
* never drift apart.
|
|
342
|
+
*/
|
|
343
|
+
function describeUploadableItemKinds() {
|
|
344
|
+
return exports.UPLOADABLE_ITEM_KINDS.map((wire) => {
|
|
345
|
+
const label = ITEM_KIND_LABELS[wire];
|
|
346
|
+
return label === wire ? wire : `${label} (${wire})`;
|
|
347
|
+
}).join(' | ');
|
|
348
|
+
}
|
|
349
|
+
/** A wearable cannot be equipped without a slot, so it cannot be published without one. */
|
|
350
|
+
function ccSlotIsRequiredForKind(kind) {
|
|
351
|
+
return kind === 'wearable';
|
|
352
|
+
}
|
|
353
|
+
/**
|
|
354
|
+
* Only wearables (required) and avatars (optional — a full-body avatar maps to
|
|
355
|
+
* `Cosmetic.Slot.Body.*` or `Cosmetic.Slot.Custom`) occupy a cosmetic slot. A
|
|
356
|
+
* slot on a home item is meaningless and is rejected rather than stored.
|
|
357
|
+
*/
|
|
358
|
+
function ccSlotIsAllowedForKind(kind) {
|
|
359
|
+
return kind === 'wearable' || kind === 'avatar';
|
|
360
|
+
}
|
|
361
|
+
/** The grouped tag list, rendered for a terminal (also the body of `list-slots`). */
|
|
362
|
+
function renderCcSlotTable() {
|
|
363
|
+
return exports.CC_WEARABLE_SLOT_GROUPS.map((g) => `${g.group} — ${g.summary}\n${g.slots.map((s) => ` ${s}`).join('\n')}`).join('\n\n');
|
|
364
|
+
}
|
|
365
|
+
/**
|
|
366
|
+
* Validate the (kind, slot) pair the way the backend does, and throw the same
|
|
367
|
+
* three failures with the full tag list attached. Mirrors
|
|
368
|
+
* `validateCcSlotForKind` in helix-backend-api.
|
|
369
|
+
*/
|
|
370
|
+
function assertCcSlot(kind, slot) {
|
|
371
|
+
const tag = slot === undefined || slot === null || slot === '' ? null : slot;
|
|
372
|
+
if (tag !== null && !isCcWearableSlot(tag)) {
|
|
373
|
+
throw new Error(`Unknown Character-Creator slot tag "${tag}" (matching is exact, including case).\n` +
|
|
374
|
+
`Valid tags:\n${renderCcSlotTable()}`);
|
|
375
|
+
}
|
|
376
|
+
if (tag === null && ccSlotIsRequiredForKind(kind)) {
|
|
377
|
+
throw new Error('A wearable must declare the Character-Creator slot it occupies — pass --slot.\n' +
|
|
378
|
+
`Valid tags:\n${renderCcSlotTable()}`);
|
|
379
|
+
}
|
|
380
|
+
if (tag !== null && !ccSlotIsAllowedForKind(kind)) {
|
|
381
|
+
throw new Error(`A Character-Creator cosmetic slot is meaningless for kind "${kind}" — only ` +
|
|
382
|
+
'wearables (required) and avatars (optional) occupy one. Drop --slot.');
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// ---------------------------------------------------------------------------
|
|
386
|
+
// File sniffing — mesh + thumbnail
|
|
387
|
+
// ---------------------------------------------------------------------------
|
|
388
|
+
exports.MESH_CONTENT_TYPE = 'model/gltf-binary';
|
|
389
|
+
const THUMBNAIL_CONTENT_TYPES = {
|
|
390
|
+
'.png': 'image/png',
|
|
391
|
+
'.jpg': 'image/jpeg',
|
|
392
|
+
'.jpeg': 'image/jpeg',
|
|
393
|
+
'.webp': 'image/webp',
|
|
394
|
+
};
|
|
395
|
+
const lowerExtension = (file) => {
|
|
396
|
+
const base = file.slice(Math.max(file.lastIndexOf('/'), file.lastIndexOf('\\')) + 1);
|
|
397
|
+
const dot = base.lastIndexOf('.');
|
|
398
|
+
return dot <= 0 ? '' : base.slice(dot).toLowerCase();
|
|
399
|
+
};
|
|
400
|
+
/**
|
|
401
|
+
* Content type for the `mesh` part. Binary glTF only — a `.gltf` is a JSON
|
|
402
|
+
* document whose buffers/textures live in sibling files, so it cannot be
|
|
403
|
+
* uploaded as one part at all; say that instead of letting the server guess.
|
|
404
|
+
*/
|
|
405
|
+
function meshContentTypeFromExtension(file) {
|
|
406
|
+
const ext = lowerExtension(file);
|
|
407
|
+
if (ext === '.glb')
|
|
408
|
+
return exports.MESH_CONTENT_TYPE;
|
|
409
|
+
if (ext === '.gltf') {
|
|
410
|
+
throw new Error(`"${file}" is a .gltf — a JSON glTF references its buffers and textures as separate ` +
|
|
411
|
+
'files, so it cannot be uploaded as a single mesh. Export (or pack) it as a .glb.');
|
|
412
|
+
}
|
|
413
|
+
throw new Error(`unsupported mesh file type "${ext || file}" — upload a binary glTF (.glb)`);
|
|
414
|
+
}
|
|
415
|
+
/** Content type for the optional `thumbnail` part — png/jpg/jpeg/webp only. */
|
|
416
|
+
function thumbnailContentTypeFromExtension(file) {
|
|
417
|
+
const ext = lowerExtension(file);
|
|
418
|
+
const contentType = THUMBNAIL_CONTENT_TYPES[ext];
|
|
419
|
+
if (!contentType) {
|
|
420
|
+
throw new Error(`unsupported thumbnail file type "${ext || file}" — use png, jpg/jpeg, or webp`);
|
|
421
|
+
}
|
|
422
|
+
return contentType;
|
|
423
|
+
}
|
|
424
|
+
/**
|
|
425
|
+
* Prove the bytes really are a binary glTF before spending an upload on them:
|
|
426
|
+
* a GLB starts with the ASCII magic `glTF` followed by a uint32 version. Catches
|
|
427
|
+
* the two mistakes a renamed export makes — a JSON .gltf saved as .glb, and a
|
|
428
|
+
* zip/FBX with the extension swapped.
|
|
429
|
+
*/
|
|
430
|
+
function assertLooksLikeGlb(bytes, file) {
|
|
431
|
+
if (bytes.byteLength === 0)
|
|
432
|
+
throw new Error(`"${file}" is empty`);
|
|
433
|
+
if (bytes.byteLength < 12) {
|
|
434
|
+
throw new Error(`"${file}" is too small to be a binary glTF (${bytes.byteLength} bytes)`);
|
|
435
|
+
}
|
|
436
|
+
const magic = String.fromCharCode(bytes[0], bytes[1], bytes[2], bytes[3]);
|
|
437
|
+
if (magic !== 'glTF') {
|
|
438
|
+
throw new Error(`"${file}" is not a binary glTF — it starts with ${JSON.stringify(magic)}, not "glTF". ` +
|
|
439
|
+
'Re-export as .glb (binary), not .gltf (JSON) or a zipped archive.');
|
|
440
|
+
}
|
|
441
|
+
const version = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength).getUint32(4, true);
|
|
442
|
+
if (version !== 2) {
|
|
443
|
+
throw new Error(`"${file}" is glTF version ${version}; HELIX accepts glTF 2.0 (.glb).`);
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* ADVISORY mesh-size ceilings — the backend's SHIPPED DEFAULTS, mirrored so a
|
|
448
|
+
* 300 MB export fails in a second instead of after a long upload.
|
|
449
|
+
*
|
|
450
|
+
* These are advisory on purpose and produce a WARNING, never a hard failure:
|
|
451
|
+
* every one of them is an env-overridable server setting
|
|
452
|
+
* (`WEARABLE_MAX_FILE_BYTES`, `AVATAR_MAX_FILE_BYTES`, …), so a CLI that
|
|
453
|
+
* REFUSED at these numbers would be wrong the moment an environment raises one.
|
|
454
|
+
* The server owns the verdict; this only tells you early what it will probably
|
|
455
|
+
* say — and that `--allow-oversize` exists.
|
|
456
|
+
*/
|
|
457
|
+
const ADVISORY_MAX_MESH_BYTES = {
|
|
458
|
+
wearable: 6 * 1024 * 1024,
|
|
459
|
+
avatar: 24 * 1024 * 1024,
|
|
460
|
+
// The backend deliberately applies the wearable ceiling: several add-ons
|
|
461
|
+
// can be mounted on one already-rendered host.
|
|
462
|
+
add_on: 6 * 1024 * 1024,
|
|
463
|
+
home_item: 12 * 1024 * 1024,
|
|
464
|
+
home_shell: 12 * 1024 * 1024,
|
|
465
|
+
// Mirrors VEHICLE_MAX_FILE_BYTES (helix-backend-api src/config.ts): the server
|
|
466
|
+
// verifies a vehicle through vehicleLimits(), 16 MiB — not the 8 MiB furniture
|
|
467
|
+
// ceiling a vehicle used to inherit. Advising a different number here makes the
|
|
468
|
+
// CLI's early warning disagree with the verdict that follows.
|
|
469
|
+
vehicle: 16 * 1024 * 1024,
|
|
470
|
+
};
|
|
471
|
+
const mib = (bytes) => `${(bytes / 1024 / 1024).toFixed(1)} MiB`;
|
|
472
|
+
/** A warning string when the mesh is over the advisory ceiling, else null. */
|
|
473
|
+
function meshSizeWarning(size, kind, allowOversize) {
|
|
474
|
+
const max = ADVISORY_MAX_MESH_BYTES[kind];
|
|
475
|
+
if (size <= max)
|
|
476
|
+
return null;
|
|
477
|
+
return (`mesh is ${mib(size)}; the ${kind} limit ships at ${mib(max)} — the server has the final say` +
|
|
478
|
+
(allowOversize
|
|
479
|
+
? ' (--allow-oversize requested, so the relaxed ceiling applies).'
|
|
480
|
+
: '. If this asset is deliberately heavy, re-run with --allow-oversize.'));
|
|
481
|
+
}
|
|
482
|
+
const HOST_KINDS = ['vehicle', 'character'];
|
|
483
|
+
const HELIX_CHARACTER_SKELETON = 'helix-humanoid@1';
|
|
484
|
+
const ADD_ON_OPS = ['tune', 'hide', 'mount', 'patch'];
|
|
485
|
+
/**
|
|
486
|
+
* The slots whose add-ons ARE their ops — a clip-set pins one Vault animation version per pointer and ships no
|
|
487
|
+
* geometry, so it is the only add-on that publishes with no mesh.
|
|
488
|
+
* SYNC OBLIGATION: mirrored from the backend's `archetype: 'clip-set'` rows (helix-backend-api
|
|
489
|
+
* src/add-ons/character-slot-pack.ts + vehicle-slot-pack.ts); the slot registry there is authoritative.
|
|
490
|
+
*/
|
|
491
|
+
exports.CLIP_SET_SLOT_TYPES = [
|
|
492
|
+
'character.locomotion@1',
|
|
493
|
+
'character.voice@1',
|
|
494
|
+
'vehicle.exhaust_note@1',
|
|
495
|
+
'vehicle.blowoff@1',
|
|
496
|
+
];
|
|
497
|
+
/**
|
|
498
|
+
* The server's per-add-on op cap: 32 for every mesh archetype, 64 for a clip-set (a pack's ops are its content).
|
|
499
|
+
* SYNC OBLIGATION: helix-backend-api src/add-ons/vehicle-slot-pack.ts MAX_OPS_PER_ADD_ON / MAX_OPS_BY_ARCHETYPE.
|
|
500
|
+
*/
|
|
501
|
+
exports.MAX_ADD_ON_OPS = 32;
|
|
502
|
+
exports.MAX_CLIP_SET_OPS = 64;
|
|
503
|
+
function maxOpsForSlot(slotType) {
|
|
504
|
+
return typeof slotType === 'string' && exports.CLIP_SET_SLOT_TYPES.includes(slotType) ? exports.MAX_CLIP_SET_OPS : exports.MAX_ADD_ON_OPS;
|
|
505
|
+
}
|
|
506
|
+
/**
|
|
507
|
+
* Vehicle slots whose part may be PURE TUNING and so publish with no mesh (an ECU, gearbox, sway bars, brakes,
|
|
508
|
+
* coilovers, a tyre compound...): every vehicle `hardware` slot with tunable paths, plus the tyre slot. The add-on
|
|
509
|
+
* must carry at least one op and every op must be a `tune`.
|
|
510
|
+
* SYNC OBLIGATION: mirrored from helix-backend-api src/add-ons/vehicle-slot-pack.ts TUNE_ONLY_VEHICLE_SLOT_TYPES
|
|
511
|
+
* (the server is authoritative and refuses anything else).
|
|
512
|
+
*/
|
|
513
|
+
exports.TUNE_ONLY_VEHICLE_SLOT_TYPES = [
|
|
514
|
+
'vehicle.arb@1',
|
|
515
|
+
'vehicle.brakes@1',
|
|
516
|
+
'vehicle.driveline@1',
|
|
517
|
+
'vehicle.ecu@1',
|
|
518
|
+
'vehicle.engine@1',
|
|
519
|
+
'vehicle.exhaust@1',
|
|
520
|
+
'vehicle.induction@1',
|
|
521
|
+
'vehicle.intake@1',
|
|
522
|
+
'vehicle.steering@1',
|
|
523
|
+
'vehicle.suspension@1',
|
|
524
|
+
'vehicle.transmission@1',
|
|
525
|
+
'vehicle.tyre@1',
|
|
526
|
+
];
|
|
527
|
+
/** Is this a tune-only vehicle part: a mesh-optional slot and every op (at least one) a `tune`? */
|
|
528
|
+
function isTuneOnlyVehiclePart(input) {
|
|
529
|
+
const slotType = input.fits?.slotType;
|
|
530
|
+
const ops = input.ops ?? [];
|
|
531
|
+
return input.kind === 'add_on' && typeof slotType === 'string' && exports.TUNE_ONLY_VEHICLE_SLOT_TYPES.includes(slotType)
|
|
532
|
+
&& ops.length > 0 && ops.every((op) => op.v === 'tune');
|
|
533
|
+
}
|
|
534
|
+
/** Does this payload describe an add-on that legitimately arrives without a mesh? */
|
|
535
|
+
function isMeshlessItem(input) {
|
|
536
|
+
const slotType = input.fits?.slotType;
|
|
537
|
+
return input.kind === 'add_on' && typeof slotType === 'string'
|
|
538
|
+
&& (exports.CLIP_SET_SLOT_TYPES.includes(slotType) || isTuneOnlyVehiclePart(input));
|
|
539
|
+
}
|
|
540
|
+
function isObject(value) {
|
|
541
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
542
|
+
}
|
|
543
|
+
/** Parse either inline JSON or a JSON file path for a CLI metadata flag. */
|
|
544
|
+
function parseJsonOrFile(value, flag) {
|
|
545
|
+
const trimmed = value.trim();
|
|
546
|
+
let source = trimmed;
|
|
547
|
+
let description = 'inline JSON';
|
|
548
|
+
if (!trimmed.startsWith('{') && !trimmed.startsWith('[')) {
|
|
549
|
+
const path = (0, node_path_1.resolve)(value);
|
|
550
|
+
if (!(0, node_fs_1.existsSync)(path)) {
|
|
551
|
+
throw new Error(`${flag} must be inline JSON or an existing JSON file (not found: ${path})`);
|
|
552
|
+
}
|
|
553
|
+
source = (0, node_fs_1.readFileSync)(path, 'utf8');
|
|
554
|
+
description = path;
|
|
555
|
+
}
|
|
556
|
+
try {
|
|
557
|
+
return JSON.parse(source);
|
|
558
|
+
}
|
|
559
|
+
catch (error) {
|
|
560
|
+
throw new Error(`${flag} is not valid JSON (${description}): ${error instanceof Error ? error.message : String(error)}`);
|
|
561
|
+
}
|
|
562
|
+
}
|
|
563
|
+
function parseJsonObjectOrFile(value, flag) {
|
|
564
|
+
const parsed = parseJsonOrFile(value, flag);
|
|
565
|
+
if (!isObject(parsed))
|
|
566
|
+
throw new Error(`${flag} must contain a JSON object`);
|
|
567
|
+
return parsed;
|
|
568
|
+
}
|
|
569
|
+
function parseJsonArrayOrFile(value, flag) {
|
|
570
|
+
const parsed = parseJsonOrFile(value, flag);
|
|
571
|
+
if (!Array.isArray(parsed) || parsed.some((entry) => !isObject(entry))) {
|
|
572
|
+
throw new Error(`${flag} must contain a JSON array of objects`);
|
|
573
|
+
}
|
|
574
|
+
return parsed;
|
|
575
|
+
}
|
|
576
|
+
function stringArray(value, pointer) {
|
|
577
|
+
if (!Array.isArray(value) || value.some((entry) => typeof entry !== 'string')) {
|
|
578
|
+
throw new Error(`${pointer} must be an array of strings`);
|
|
579
|
+
}
|
|
580
|
+
return value;
|
|
581
|
+
}
|
|
582
|
+
function assertFits(fits) {
|
|
583
|
+
if (typeof fits.slotType !== 'string' || fits.slotType.trim() === '') {
|
|
584
|
+
throw new Error('--fits.slotType is required and must be a non-empty string');
|
|
585
|
+
}
|
|
586
|
+
if (fits.slotType.length > 96)
|
|
587
|
+
throw new Error('--fits.slotType exceeds 96 characters');
|
|
588
|
+
if (!isObject(fits.requires))
|
|
589
|
+
throw new Error('--fits.requires is required and must be an object');
|
|
590
|
+
const requires = fits.requires;
|
|
591
|
+
for (const key of ['sockets', 'paths', 'pointers', 'nodes']) {
|
|
592
|
+
stringArray(requires[key], `--fits.requires.${key}`);
|
|
593
|
+
}
|
|
594
|
+
if (!(requires.skeleton === null || typeof requires.skeleton === 'string')) {
|
|
595
|
+
throw new Error('--fits.requires.skeleton must be a string or null');
|
|
596
|
+
}
|
|
597
|
+
if (fits.only !== undefined) {
|
|
598
|
+
if (!isObject(fits.only))
|
|
599
|
+
throw new Error('--fits.only must be an object');
|
|
600
|
+
for (const key of ['items', 'tags', 'creators']) {
|
|
601
|
+
if (fits.only[key] !== undefined)
|
|
602
|
+
stringArray(fits.only[key], `--fits.only.${key}`);
|
|
603
|
+
}
|
|
604
|
+
for (const [index, tag] of (fits.only.tags ?? []).entries()) {
|
|
605
|
+
if (tag.includes('*'))
|
|
606
|
+
throw new Error(`--fits.only.tags[${index}] may not contain a wildcard`);
|
|
607
|
+
}
|
|
608
|
+
for (const [index, creator] of (fits.only.creators ?? []).entries()) {
|
|
609
|
+
const id = creator.startsWith('grp:') ? creator.slice(4) : creator;
|
|
610
|
+
if (!/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(id)) {
|
|
611
|
+
throw new Error(`--fits.only.creators[${index}] must be a user UUID or grp:<group UUID>`);
|
|
612
|
+
}
|
|
613
|
+
}
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function assertOps(ops, fits) {
|
|
617
|
+
// The server caps a mesh archetype at 32 and a clip-set at 64 (a pack's ops are its content, and the
|
|
618
|
+
// locomotion vocabulary alone is 38 names). Refuse locally at the cap the server will apply to THIS slot.
|
|
619
|
+
const maxOps = maxOpsForSlot(fits.slotType);
|
|
620
|
+
if (ops.length > maxOps) {
|
|
621
|
+
throw new Error(`--ops may contain at most ${maxOps} operations for ${String(fits.slotType)} (got ${ops.length})`);
|
|
622
|
+
}
|
|
623
|
+
const requires = fits.requires;
|
|
624
|
+
for (const [index, op] of ops.entries()) {
|
|
625
|
+
const pointer = `--ops[${index}]`;
|
|
626
|
+
if (!ADD_ON_OPS.includes(op.v)) {
|
|
627
|
+
throw new Error(`${pointer}.v must be tune, hide, mount, or patch`);
|
|
628
|
+
}
|
|
629
|
+
if (op.v === 'tune') {
|
|
630
|
+
if (typeof op.path !== 'string' || !requires.paths.includes(op.path)) {
|
|
631
|
+
throw new Error(`${pointer}.path must name a path declared in --fits.requires.paths`);
|
|
632
|
+
}
|
|
633
|
+
if (!['set', 'mul', 'add'].includes(String(op.op))) {
|
|
634
|
+
throw new Error(`${pointer}.op must be set, mul, or add`);
|
|
635
|
+
}
|
|
636
|
+
if (op.value === undefined)
|
|
637
|
+
throw new Error(`${pointer}.value is required`);
|
|
638
|
+
}
|
|
639
|
+
else if (op.v === 'hide') {
|
|
640
|
+
const nodes = stringArray(op.nodes, `${pointer}.nodes`);
|
|
641
|
+
const required = requires.nodes;
|
|
642
|
+
if (nodes.some((node) => !required.some((glob) => globCovers(glob, node)))) {
|
|
643
|
+
throw new Error(`${pointer}.nodes must be declared in --fits.requires.nodes`);
|
|
644
|
+
}
|
|
645
|
+
}
|
|
646
|
+
else if (op.v === 'mount') {
|
|
647
|
+
if (!isObject(op.row) || typeof op.row.type !== 'string' || typeof op.row.id !== 'string') {
|
|
648
|
+
throw new Error(`${pointer}.row must contain string type and id fields`);
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
else {
|
|
652
|
+
if (typeof op.at !== 'string')
|
|
653
|
+
throw new Error(`${pointer}.at must be a string`);
|
|
654
|
+
const pointers = requires.pointers;
|
|
655
|
+
if (!pointers.some((glob) => globCovers(glob, op.at))) {
|
|
656
|
+
throw new Error(`${pointer}.at must be declared in --fits.requires.pointers`);
|
|
657
|
+
}
|
|
658
|
+
if (op.op !== 'set' && op.op !== 'remove') {
|
|
659
|
+
throw new Error(`${pointer}.op must be set or remove`);
|
|
660
|
+
}
|
|
661
|
+
if (op.op === 'set' && op.value === undefined) {
|
|
662
|
+
throw new Error(`${pointer}.value is required for a set patch`);
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
/**
|
|
668
|
+
* Validate the Universal Item add-on contract used by both item publication
|
|
669
|
+
* and Bridge-generated character add-ons. Keeping this as the single runtime
|
|
670
|
+
* validator prevents Bridge profiles from accepting operations that the item
|
|
671
|
+
* publisher would later reject.
|
|
672
|
+
*/
|
|
673
|
+
function validateAddOnContract(fits, ops = []) {
|
|
674
|
+
if (!isObject(fits))
|
|
675
|
+
throw new Error('--fits must be an object');
|
|
676
|
+
if (!Array.isArray(ops) || ops.some((entry) => !isObject(entry))) {
|
|
677
|
+
throw new Error('--ops must be an array of objects');
|
|
678
|
+
}
|
|
679
|
+
const validatedOps = ops;
|
|
680
|
+
assertFits(fits);
|
|
681
|
+
assertOps(validatedOps, fits);
|
|
682
|
+
return { fits, ops: validatedOps };
|
|
683
|
+
}
|
|
684
|
+
function globCovers(glob, value) {
|
|
685
|
+
const escaped = glob.replace(/[.+?^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*');
|
|
686
|
+
return new RegExp(`^${escaped}$`).test(value);
|
|
687
|
+
}
|
|
688
|
+
function assertHostSurface(surface) {
|
|
689
|
+
let measured = 0;
|
|
690
|
+
for (const key of ['sockets', 'nodes', 'materialSlots', 'paths']) {
|
|
691
|
+
const values = stringArray(surface[key] ?? [], `--host-surface.${key}`);
|
|
692
|
+
if (key === 'sockets' || key === 'nodes' || key === 'paths')
|
|
693
|
+
measured += values.length;
|
|
694
|
+
}
|
|
695
|
+
if (!(surface.skeleton === undefined || surface.skeleton === null || typeof surface.skeleton === 'string')) {
|
|
696
|
+
throw new Error('--host-surface.skeleton must be a string or null');
|
|
697
|
+
}
|
|
698
|
+
if (measured === 0) {
|
|
699
|
+
throw new Error('--host-surface must measure at least one socket, node, or path');
|
|
700
|
+
}
|
|
701
|
+
}
|
|
702
|
+
function assertAddOnAndHostFields(input) {
|
|
703
|
+
const hasOps = input.ops !== undefined;
|
|
704
|
+
if (input.kind === 'add_on') {
|
|
705
|
+
if (!input.fits)
|
|
706
|
+
throw new Error('An add_on must declare compatibility with --fits');
|
|
707
|
+
if (input.hostKind !== undefined || input.hostSurface !== undefined || input.includeStandardSlots !== undefined) {
|
|
708
|
+
throw new Error('An add_on cannot declare --host-kind, --host-surface or --include-standard-slots');
|
|
709
|
+
}
|
|
710
|
+
validateAddOnContract(input.fits, input.ops ?? []);
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
if (input.fits !== undefined || hasOps) {
|
|
714
|
+
throw new Error(`Only an add_on may declare --fits or --ops (kind is "${input.kind}")`);
|
|
715
|
+
}
|
|
716
|
+
if (input.hostKind === undefined) {
|
|
717
|
+
if (input.hostSurface !== undefined || input.slots !== undefined || input.includeStandardSlots !== undefined) {
|
|
718
|
+
throw new Error('--host-surface, --slots and --include-standard-slots require --host-kind');
|
|
719
|
+
}
|
|
720
|
+
return;
|
|
721
|
+
}
|
|
722
|
+
if (!HOST_KINDS.includes(input.hostKind)) {
|
|
723
|
+
throw new Error(`--host-kind must be one of ${HOST_KINDS.join(' | ')}`);
|
|
724
|
+
}
|
|
725
|
+
if (!input.hostSurface)
|
|
726
|
+
throw new Error('--host-kind requires --host-surface');
|
|
727
|
+
assertHostSurface(input.hostSurface);
|
|
728
|
+
if (input.hostKind === 'character') {
|
|
729
|
+
if (input.kind !== 'avatar') {
|
|
730
|
+
throw new Error('--host-kind character requires --kind avatar');
|
|
731
|
+
}
|
|
732
|
+
if (input.hostSurface.skeleton !== HELIX_CHARACTER_SKELETON) {
|
|
733
|
+
throw new Error(`--host-kind character requires --host-surface.skeleton=${HELIX_CHARACTER_SKELETON}`);
|
|
734
|
+
}
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
function assertVehiclePackage(input) {
|
|
738
|
+
if (input.kind !== 'vehicle') {
|
|
739
|
+
if (input.vehiclePackage !== undefined) {
|
|
740
|
+
throw new Error(`Only a vehicle may declare --vehicle-package (kind is "${input.kind}")`);
|
|
741
|
+
}
|
|
742
|
+
return;
|
|
743
|
+
}
|
|
744
|
+
const pkg = input.vehiclePackage;
|
|
745
|
+
if (!pkg)
|
|
746
|
+
throw new Error('A vehicle must declare an authored --vehicle-package');
|
|
747
|
+
if (pkg.packageVersion !== 1 && pkg.packageVersion !== 2) {
|
|
748
|
+
throw new Error('--vehicle-package.packageVersion must be 1 or 2');
|
|
749
|
+
}
|
|
750
|
+
if (pkg.packageVersion === 2 && pkg.schemaVersion !== 'helix.vehicle-package/2') {
|
|
751
|
+
throw new Error('--vehicle-package.schemaVersion must be helix.vehicle-package/2 for packageVersion 2');
|
|
752
|
+
}
|
|
753
|
+
if (typeof pkg.id !== 'string' || pkg.id.trim() === '') {
|
|
754
|
+
throw new Error('--vehicle-package.id must be a non-empty string');
|
|
755
|
+
}
|
|
756
|
+
if (!isObject(pkg.mesh))
|
|
757
|
+
throw new Error('--vehicle-package.mesh must be an object');
|
|
758
|
+
if (pkg.packageVersion === 1 && pkg.mesh.source !== 'universal-item') {
|
|
759
|
+
throw new Error('--vehicle-package.mesh.source must be "universal-item"');
|
|
760
|
+
}
|
|
761
|
+
if (pkg.packageVersion === 1 && pkg.mesh.ref !== '$self') {
|
|
762
|
+
throw new Error('--vehicle-package.mesh.ref must be "$self" so the server can pin the published item');
|
|
763
|
+
}
|
|
764
|
+
}
|
|
765
|
+
function vehiclePackageForPublish(value) {
|
|
766
|
+
if (!value)
|
|
767
|
+
return undefined;
|
|
768
|
+
if (value.packageVersion !== 2)
|
|
769
|
+
return value;
|
|
770
|
+
const mesh = value.mesh;
|
|
771
|
+
return {
|
|
772
|
+
...structuredClone(value),
|
|
773
|
+
mesh: { ...structuredClone(mesh), source: 'universal-item', ref: '$self' },
|
|
774
|
+
};
|
|
775
|
+
}
|
|
776
|
+
/** Split a `--tags a,b,c` value: trimmed, empties dropped, order-preserving dedupe. */
|
|
777
|
+
function parseTags(value) {
|
|
778
|
+
const seen = new Set();
|
|
779
|
+
const out = [];
|
|
780
|
+
for (const raw of value.split(',')) {
|
|
781
|
+
const tag = raw.trim();
|
|
782
|
+
if (!tag || seen.has(tag.toLowerCase()))
|
|
783
|
+
continue;
|
|
784
|
+
seen.add(tag.toLowerCase());
|
|
785
|
+
out.push(tag);
|
|
786
|
+
}
|
|
787
|
+
return out;
|
|
788
|
+
}
|
|
789
|
+
/**
|
|
790
|
+
* Build the JSON object sent as the multipart `payload` field, applying every
|
|
791
|
+
* local rule first. Keys the caller did not set are OMITTED, never sent as
|
|
792
|
+
* null — the backend defaults `category`/`usage` from `kind`, and sending a
|
|
793
|
+
* guess would override a default the server owns.
|
|
794
|
+
*/
|
|
795
|
+
function buildItemPayload(input) {
|
|
796
|
+
if (!isUploadableItemKind(input.kind)) {
|
|
797
|
+
throw new Error(`unsupported --kind "${input.kind}" — uploads accept ${describeUploadableItemKinds()}`);
|
|
798
|
+
}
|
|
799
|
+
if (input.category === 'device' && input.kind !== 'home_item') {
|
|
800
|
+
throw new Error('--category device requires --kind prop (home_item)');
|
|
801
|
+
}
|
|
802
|
+
assertCcSlot(input.kind, input.slot);
|
|
803
|
+
assertCcGenders(input.kind, input.genders);
|
|
804
|
+
assertAddOnAndHostFields(input);
|
|
805
|
+
assertVehiclePackage(input);
|
|
806
|
+
const title = input.title?.trim() ?? '';
|
|
807
|
+
if (!title)
|
|
808
|
+
throw new Error('--title is required');
|
|
809
|
+
if (title.length > 100)
|
|
810
|
+
throw new Error(`--title is ${title.length} characters; the limit is 100`);
|
|
811
|
+
const slug = input.slug?.trim();
|
|
812
|
+
if (slug !== undefined) {
|
|
813
|
+
if (!slug)
|
|
814
|
+
throw new Error('--slug cannot be empty (omit it to have one derived from the title)');
|
|
815
|
+
if (slug.length > 80)
|
|
816
|
+
throw new Error(`--slug is ${slug.length} characters; the limit is 80`);
|
|
817
|
+
if (!/^[a-z0-9]+(?:-[a-z0-9]+)*$/.test(slug)) {
|
|
818
|
+
throw new Error(`--slug "${slug}" must be lowercase letters, digits and single hyphens`);
|
|
819
|
+
}
|
|
820
|
+
}
|
|
821
|
+
const edition = (0, distribution_1.editionFields)(input.collectibleSupply);
|
|
822
|
+
const initialDistribution = input.initialDistribution
|
|
823
|
+
? (0, distribution_1.buildItemDistribution)(input.initialDistribution)
|
|
824
|
+
: undefined;
|
|
825
|
+
// ── THE ADD-ON VISIBILITY GATE ──────────────────────────────────────────────
|
|
826
|
+
//
|
|
827
|
+
// A published add-on with no ACTIVE MARKETPLACE distribution is live, fits its
|
|
828
|
+
// base, and is still unfindable: the customizer's compatibility shelf keeps an
|
|
829
|
+
// unowned tile only when the row carries a `distributionId` (helixgame.com
|
|
830
|
+
// `components/addons/equip-surface.tsx`, `shopRowAcquirable`), and that id is
|
|
831
|
+
// `deriveMarketplaceDistributions(item)[0]?.id` — active, in-window,
|
|
832
|
+
// `channel = 'marketplace'` rows only. A WORLD-channel route does NOT satisfy
|
|
833
|
+
// it, so a world-only add-on is just as invisible in the shelf as one with no
|
|
834
|
+
// route at all. Confirmed live 2026-09-29: 16 published character add-ons with
|
|
835
|
+
// no marketplace route rendered as "90 compatible" while eight of them were
|
|
836
|
+
// silently absent from the rail.
|
|
837
|
+
//
|
|
838
|
+
// So an add-on must EITHER carry a marketplace route OR be explicitly declared
|
|
839
|
+
// deliberately unlisted (`--no-marketplace`). Refusing here — rather than
|
|
840
|
+
// publishing and warning — is the point: the broken state is invisible to its
|
|
841
|
+
// own creator, so a warning on an otherwise-successful publish is exactly the
|
|
842
|
+
// signal that gets missed. This runs in `planItemPublish`, so `--dry-run` and
|
|
843
|
+
// `--quote` refuse too, before any byte is uploaded and before a fee moves.
|
|
844
|
+
if (input.noMarketplace === true && initialDistribution?.channel === 'marketplace') {
|
|
845
|
+
throw new Error('--no-marketplace says this add-on is deliberately unlisted, so it cannot also carry a Marketplace route');
|
|
846
|
+
}
|
|
847
|
+
if (input.kind === 'add_on' &&
|
|
848
|
+
input.noMarketplace !== true &&
|
|
849
|
+
initialDistribution?.channel !== 'marketplace') {
|
|
850
|
+
throw new Error('an add-on with no Marketplace route publishes as a live but UNFINDABLE item — it fits its base, '
|
|
851
|
+
+ "yet no player can see or acquire it in the customizer's compatibility list.\n"
|
|
852
|
+
+ ' Give it one: --distribution-price-lix 0 (free Claim) or --distribution-price-lix <n> (sale)\n'
|
|
853
|
+
+ ' Or, if it is deliberately unlisted (world-only, or not for sale): --no-marketplace');
|
|
854
|
+
}
|
|
855
|
+
const tags = input.tags ?? [];
|
|
856
|
+
if (tags.length > 24)
|
|
857
|
+
throw new Error(`--tags carries ${tags.length} entries; the limit is 24`);
|
|
858
|
+
for (const tag of tags) {
|
|
859
|
+
if (tag.length > 40)
|
|
860
|
+
throw new Error(`tag "${tag}" is ${tag.length} characters; the limit is 40`);
|
|
861
|
+
}
|
|
862
|
+
const description = input.description?.trim();
|
|
863
|
+
// Canonical order, so `--gender female,male` and `--gender male,female` send
|
|
864
|
+
// byte-identical payloads.
|
|
865
|
+
const genders = parseGenders((input.genders ?? []).join(','));
|
|
866
|
+
return {
|
|
867
|
+
kind: input.kind,
|
|
868
|
+
...(input.category ? { category: input.category } : {}),
|
|
869
|
+
title,
|
|
870
|
+
...(slug !== undefined ? { slug } : {}),
|
|
871
|
+
...(description ? { description } : {}),
|
|
872
|
+
...(input.slot ? { slot: input.slot } : {}),
|
|
873
|
+
// The wire field is `genders`. NOT `ccGenders` — see the type above.
|
|
874
|
+
...(genders.length ? { genders } : {}),
|
|
875
|
+
...(tags.length ? { tags } : {}),
|
|
876
|
+
...edition,
|
|
877
|
+
...(initialDistribution ? { initialDistribution } : {}),
|
|
878
|
+
...(input.allowOversize ? { allowOversize: true } : {}),
|
|
879
|
+
...(input.fits ? { fits: input.fits } : {}),
|
|
880
|
+
...(input.ops ? { ops: input.ops } : {}),
|
|
881
|
+
...(input.hostKind ? { hostKind: input.hostKind } : {}),
|
|
882
|
+
...(input.hostSurface ? { hostSurface: input.hostSurface } : {}),
|
|
883
|
+
...(input.slots ? { slots: structuredClone(input.slots) } : {}),
|
|
884
|
+
...(input.includeStandardSlots !== undefined
|
|
885
|
+
? { includeStandardSlots: input.includeStandardSlots }
|
|
886
|
+
: {}),
|
|
887
|
+
...(input.vehiclePackage
|
|
888
|
+
? { vehiclePackage: vehiclePackageForPublish(input.vehiclePackage) }
|
|
889
|
+
: {}),
|
|
890
|
+
};
|
|
891
|
+
}
|
|
892
|
+
//# sourceMappingURL=item.js.map
|