@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
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# Visual QA of a candidate version: `--package-version`
|
|
2
|
+
|
|
3
|
+
The backend refuses to move a listed item to a new Package Version until **that new version** has a passing visual-QA
|
|
4
|
+
run (`VISUAL_QA_REQUIRED`). A plain `helix item visual-qa <id>` renders the item's *current* pin, so on its own it can
|
|
5
|
+
never produce that run. `--package-version` renders the candidate instead:
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
helix item visual-qa <item-id> --package-version 1.0.12 --vehicle-package vehicle-definition.json --local-critic
|
|
9
|
+
helix item visual-qa <item-id> --package-version 1.0.4 --submit # an add-on, wearable or avatar
|
|
10
|
+
helix item visual-qa <item-id> --package-version 1.0.2 --submit # a Prop or Device
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
| Category | Route to the candidate | Needs |
|
|
14
|
+
|---|---|---|
|
|
15
|
+
| vehicle | Try Now session with `trial.packageVersion` + `trial.vehiclePackage` | `--vehicle-package <file>` (the move's vehicle package JSON; a `{ "vehiclePackage": … }` wrapper is accepted) |
|
|
16
|
+
| avatar | Try Now session with `trial.packageVersion` | — |
|
|
17
|
+
| vehicle add-on, character add-on, wearable | customiser: `GET …/universal-items/<host>/add-ons?previewItemId=&previewPackageVersion=` and `GET …/universal-items/<add-on>?previewPackageVersion=` | — |
|
|
18
|
+
| Prop, Device | item viewer: `GET …/universal-items/<item>?previewPackageVersion=` under the CLI creator login | — |
|
|
19
|
+
| animation, scene | refused: their routes only show the pinned version | — |
|
|
20
|
+
|
|
21
|
+
Only the item's creator, an admin, or the hosted runner holding the job's lease can open a candidate; the CLI renders as
|
|
22
|
+
your `helix login` unless `--storage-state` says otherwise. A `--package-version` equal to the item's pin is the normal
|
|
23
|
+
run.
|
|
24
|
+
|
|
25
|
+
## Moving the item once it passed
|
|
26
|
+
|
|
27
|
+
`--submit` on a passing candidate prints the next command; run it to make the version the one owners resolve:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
helix item set-version <item-id> --package-version 1.0.12 --reason "fixed the cuff seam"
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The pin (`packageId`, `version`, `manifestCid`) comes from the public Package API, and the request is
|
|
34
|
+
`POST /api/v1/universal-items/<id>/versions`. If the gate still refuses (422) the server's message is printed first,
|
|
35
|
+
then its `remedy` and any hosted render it queued. `helix item visual-qa <id> --status` lists the item's
|
|
36
|
+
`pendingVersions` (sealed, not current) with each one's latest run. A `--package-version` the package does not have
|
|
37
|
+
fails with the sealed versions listed; a non-creator gets a first-line explanation that only the creator, an admin or
|
|
38
|
+
the hosted runner can render an unreleased version.
|
|
39
|
+
|
|
40
|
+
## How it stays honest
|
|
41
|
+
|
|
42
|
+
- **Identity is the candidate's.** The version is read from the item's own pinned package
|
|
43
|
+
(`GET /api/v1/continuum/public/packages/<packageId>/versions/<v>`; it must be sealed), so the bundle's
|
|
44
|
+
`packageVersion`, `manifestCid`, root document and model CID describe the candidate. An item with no pin is refused.
|
|
45
|
+
- **The server names what it served.** The Try Now response's `trial.candidate` (`packageId`, `packageVersion`,
|
|
46
|
+
`packageVersionId`, `manifestCid`, `vehicleChecksum`, `modelCid`) must agree with the sealed version; it then fills the
|
|
47
|
+
bundle's `packageVersionId` and, for a vehicle, `vehicleChecksum` — minted server-side after preparing the vehicle
|
|
48
|
+
package, so it is unknown until then. The backend only accepts a non-current vehicle run whose
|
|
49
|
+
`bundle.item.vehicleChecksum` is the checksum it minted in that trial.
|
|
50
|
+
- **The runtime must agree.** The vehicle route still checks that the runtime served exactly that checksum, and every
|
|
51
|
+
route still requires the candidate model's CID among the fetched assets. A Prop or Device candidate also requires the
|
|
52
|
+
item viewer's returned Package ID, Version and manifest CID to equal the sealed Version. The evidence records the
|
|
53
|
+
definition/root and model CIDs; a Device must have a matching `helix.device/1` definition Version and web GLB.
|
|
54
|
+
- **It never falls back.** No `trial.candidate` (backend refused or not deployed), a session that was never requested,
|
|
55
|
+
a customiser that never listed add-ons, a preview request that was refused, or a response built from another version
|
|
56
|
+
is a harness error, so the run fails closed instead of judging the current version under the candidate's name.
|
|
57
|
+
|
|
58
|
+
`bundle.json` records what was seen under `facts.candidate` (`sessions`, `previews`, the sealed root/model CIDs and bound identity).
|
|
59
|
+
|
|
60
|
+
## Mechanics
|
|
61
|
+
|
|
62
|
+
Command code sets a module-level candidate config in `src/visualQa/browser.ts` (`setCandidate`) around the render
|
|
63
|
+
route; every browser the route opens installs Playwright routes that rewrite those requests and read their responses
|
|
64
|
+
before the page sees them. The routes themselves are unchanged. The pure parts (flag checks, body/URL rewrites,
|
|
65
|
+
response → identity) are in `src/visualQa/candidate.ts`.
|
|
66
|
+
|
|
67
|
+
## Hosted runs
|
|
68
|
+
|
|
69
|
+
A refused version move queues a hosted job whose claim carries `target.packageVersion` and, for vehicles,
|
|
70
|
+
`target.vehiclePackage`; the runner passes both to the same harness. `--hosted` itself still queues the current version,
|
|
71
|
+
so `--package-version` is not combined with it.
|
|
@@ -0,0 +1,462 @@
|
|
|
1
|
+
# Visual QA: `helix item visual-qa`
|
|
2
|
+
|
|
3
|
+
A universal item is judged **rendered, in the real HELIX runtime**, before it can be listed. Every earlier gate
|
|
4
|
+
(triangle and draw-call budgets, skeleton validity, bind checks) is structural or numeric; none of them looks at
|
|
5
|
+
the result, and a car with its wheels sunk into the arches passed all of them.
|
|
6
|
+
|
|
7
|
+
```
|
|
8
|
+
helix item visual-qa <item-id> --submit # render, measure, record the verdict the listing gate checks
|
|
9
|
+
helix item visual-qa <item-id> --local-critic # dry run: render, measure and run the vision critic locally
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## What it renders
|
|
13
|
+
|
|
14
|
+
| Category | Route | Frames |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| vehicle | hosted test-grounds world (`?tryItem=`), live runtime | front, rear, both sides, both 3/4s, each wheel close-up, cabin, each door/lid open, steering at full lock, moving, then **every declared seat with an occupant in it** (`occupant.<seat>.*`: side through the glass, 3/4 front through the windscreen, a cutaway with that seat's door panel hidden, a head-to-roof close, hips and feet; the driver also with its door opened by its real key) |
|
|
17
|
+
| avatar | hosted test-grounds world (`?tryItem=`, plus `&tryInstance=` with the owner's copy when the item is not Published), live runtime; the avatar is the local player | front, an unlit **base-colour reference** of the same front view (`reference.albedo`), back, both sides, both 3/4s, head, torso and feet close-ups, the walk **paused mid-stride** (`motion.stride.*`: side, front 3/4, legs from the side and the front), then walking away (followed from behind) and towards the camera; then the **world walk** frames (`walk.*`, `subject` = the avatar); then (avatar@3) the **Marketplace item page's walk**, paused with each arm swung fully back, from the true left side, true right side and back (`motion.preview.{left,right,back}.{a,b}`) |
|
|
18
|
+
| vehicle add-on | marketplace customiser on each declared host, this part alone | 3/4 front/rear, side, part close-up, each corner for wheels |
|
|
19
|
+
| character add-on, wearable | customiser on each declared base, individually; then the **world walk**: worn on each declared base in the hosted test grounds (a Try Now draft) and walked | front, back, side, close-up; then per base `walk.front`, `walk.side`, `walk.back`, `walk.turn`, `walk.close` (group `walk`, `subject` = base id) |
|
|
20
|
+
| prop | public item viewer | front, 3/4, side, top |
|
|
21
|
+
| animation (emote) | the emote's item page, played on Base Male and Base Female (the page's "equipped avatar" request is answered with each base's pinned model; the mixer is frozen and the clip seeked) | start, 25 %, 50 %, 75 %, end of the clip, per base |
|
|
22
|
+
| scene (Home) | the Home walk-through a visitor opens (`/marketplace/homes/<id>/preview?debug=1`) | arrival, the four directions from the spawn, an overview from outside, up to three interior / walk-in standpoints probed from the live scene |
|
|
23
|
+
|
|
24
|
+
Tune-only add-ons with no model have nothing to render and are exempt.
|
|
25
|
+
|
|
26
|
+
The public item viewer and customiser measure the model's scene-level Group container. Studio lighting and
|
|
27
|
+
contact-shadow meshes sit outside that container; authored model and mesh names never decide what is measured.
|
|
28
|
+
An empty or ambiguous model container fails closed instead of treating stage geometry as the item.
|
|
29
|
+
|
|
30
|
+
## What it measures
|
|
31
|
+
|
|
32
|
+
Asserts are numeric, taken from the live scene graph on the **drawn** geometry (index-referenced vertices of
|
|
33
|
+
visible meshes, never accessor min/max or node origins):
|
|
34
|
+
|
|
35
|
+
- every item: frame not blank, no NaN/collapsed/invisible meshes, textured, size inside the category envelope;
|
|
36
|
+
- avatars (route `avatar@2`, still stage 1 of `avatar@3`): the Try Now player is a rigged, skinned mesh; its lowest drawn vertex sits on the ground plane at rest and through a held-W walk; held W moves it and swings its legs (the locomotion animation drives this skeleton); toes point at the engine's forward and the drawn height matches the declared body height (those two warn). Then whether it LOOKS right and DEFORMS right, every one blocking:
|
|
37
|
+
- `avatar.materials_resolved` — every drawn primitive has a material, every map it samples decoded, the base-colour textures the GLB declares reached the renderer, and the model bytes did not fail to load;
|
|
38
|
+
- `avatar.no_emissive_washout` — no material emits a flat colour (emissive >= 0.5 with no emissive map) over more than 25 % of the drawn surface (the "Cream Hoodie Girl" defect: Meshy's emissiveFactor 1 kept, its emissive map dropped, so the whole body glows white);
|
|
39
|
+
- `avatar.colour_matches_albedo` — the same front view is rendered twice more with the avatar re-shaded (unlit base colour, then a flat magenta mask that marks its pixels; restored at once). Over the avatar's own pixels the lit render must not be > 35 luma brighter than its base colour while keeping < 50 % of its chroma or < 65 % of its contrast (washed out), nor black, nor flat. Good avatars measure -68..+20; metal is darker lit than its albedo, which is fine;
|
|
40
|
+
- `avatar.limbs_untwisted` — at every walk sample each limb bone's twist about its own axis away from its bind pose stays under 50-55 deg (Base Male/Female: <= 28, worst good avatar 33, a rest-roll mismatch 107-132) and no knee bent more than 6 cm bends backwards (> 110 deg from forward; humanoids measure <= 37, Unitree G1's robot knee 62);
|
|
41
|
+
- `avatar.skin_intact` — at every walk sample < 3 % of the skinned surface (area-weighted, sampled triangles) collapses below 15 % / stretches over 4x its rest area, and < 1.5 % has an edge stretched over 3x (torn or candy-wrapper joints).
|
|
42
|
+
Calibration (14 published avatars, Base Male/Female, both Cream Hoodie Girl items and six broken fixtures) is in `src/visualQa/avatar.spec.ts`;
|
|
43
|
+
- avatars, route `avatar@3` (2026-10-06): a second stage on the **Marketplace item page** (`/items/<id>`, the production
|
|
44
|
+
viewer: the shared walk clip retargeted by the Marketplace's own retargeter, plus the platform DynamicsLayer). The page's
|
|
45
|
+
own AnimationMixer is found (an `Object.prototype` hook on `_accuIndex`), held at 16 phases of one walk cycle (the
|
|
46
|
+
viewer's pause, at chosen times), and at each the posed vertices the page draws are read (`SkinnedMesh.getVertexPosition`).
|
|
47
|
+
Added after **Cream Hoodie Anime Girl 1.0.6** passed avatar@2 while, in this walk seen from the side, its forearms
|
|
48
|
+
walked inside the hoodie, the hoodie's side tore open as an arm swung back, a strand hung at the waist and its back hair
|
|
49
|
+
stood off as a slab. Every one blocking; anything it could not read is `not measured` (a failure):
|
|
50
|
+
- `avatar.preview.arms_clear` — the forearm/hand surface more than 3 cm inside the torso/hips (nearest torso vertex's
|
|
51
|
+
posed normal, within 10 cm), averaged over the walk cycle, stays under 13 % (good max 8.5 %, Pastel Cyberpunk, whose
|
|
52
|
+
arms are bound at 20 deg; Cream Hoodie 1.0.6 18 %);
|
|
53
|
+
- `avatar.preview.surface_closed` — boundary vertices of one connected surface that touch at rest (< 2 cm) but lie
|
|
54
|
+
7+ edges apart (the two sides of a slit) never part by more than 5 cm (good max 0.8 cm; 1.0.6 36 cm);
|
|
55
|
+
- `avatar.preview.silhouette` — geometry that is neither torso nor limb (hair and ears hung from the head; capes, coat
|
|
56
|
+
tails, accessories on their own bones) never stands more than 35 cm (at 1.70 m) behind or beside the torso's own
|
|
57
|
+
outline between the hips and the neck (good max 28 cm, Kemonomimi's flaring hair and cape). Cream Hoodie 1.0.6's back
|
|
58
|
+
hair reads 22 cm, inside that envelope: a slab is told from a flaring cape by its look, which is the critic's to judge
|
|
59
|
+
on the side frames below; this assert catches gross outliers;
|
|
60
|
+
- `avatar.mesh.no_strands` — no thin fragment floats free (> 2 cm from every other surface) of the rest mesh;
|
|
61
|
+
- `avatar.bind_pose` — each upper arm is bound at least 17 deg from straight down (standard 36; the walk adducts the arm
|
|
62
|
+
~24 deg from the clip's A-pose, so 1.0.6's 13-15 deg walks the arms into the body) and every other canonical bone
|
|
63
|
+
within its envelope of Base Female's bind direction;
|
|
64
|
+
- `avatar.preview.posture` — neck and torso lean through the walk within 25 / 15 deg of Base Female's.
|
|
65
|
+
Frames for the critic: `motion.preview.{left,right,back}.{a,b}` — the walk paused where the left (`a`) and right (`b`)
|
|
66
|
+
arm swings furthest back, from the avatar's true left side, true right side and back. A candidate version's item read
|
|
67
|
+
is rewritten (`previewPackageVersion`) exactly as for a Prop. Calibration and the broken Base Male fixtures
|
|
68
|
+
(`scripts/make-avatar-gate-fixtures.mjs`: arms-low, head-forward, strand, slab) are in `src/visualQa/avatarPreviewMath.spec.ts`.
|
|
69
|
+
On an avatar, `wear.walk.no_holes` / `wear.walk.no_poke_through` with no separate outfit to measure are reported
|
|
70
|
+
`not measured` (warn), never a pass, and are not required: the preview asserts measure tears and buried limbs on any avatar;
|
|
71
|
+
- vehicles: drawn wheels at the physics hubs, tyre-to-arch clearance and no body poke-through, ride height,
|
|
72
|
+
wheels spin with speed, steering wheel and front wheels turn, every panel reaches its declared open angle,
|
|
73
|
+
every seat addressable;
|
|
74
|
+
- vehicle occupants (route `vehicle@2`, engine >= 0.3.169): the account's own avatar is walked to each declared seat's
|
|
75
|
+
door and seated with the real E key, one after another (the runtime has no seat-switch key and a Try Now room
|
|
76
|
+
takes one player), and measured on the DRAWN occupant (skinned vertices) against the DRAWN car (triangles around
|
|
77
|
+
the seat): `vehicle.occupants.head_clearance` (crown to the first surface above the skull, >= 10 mm),
|
|
78
|
+
`.hips_on_seat` (not hovering over the cushion, not through the floor pan under it; `.hips_sink_depth` warns
|
|
79
|
+
when the buttocks sit more than 10 cm into the cushion volume), `.feet_on_floor` (soles within -50..+300 mm of the
|
|
80
|
+
floor or pedal below), `.hands_on_wheel` (driver: nearest finger/hand bone to the steering wheel <= 70 mm),
|
|
81
|
+
and the posture checks read off the drawn bones and skull (`vehiclePosture.ts`): `.torso_angle` (hip -> neck base 5..32 deg from
|
|
82
|
+
vertical), `.knees_up` (thigh -25..+35 deg of horizontal) and `.head_in_wings` (car within 60 mm of the skull below the crown
|
|
83
|
+
on two or more of back/left/right),
|
|
84
|
+
`.boarded` (an occupant could be seated in every declared seat) and `.engine_current` (the engine the page
|
|
85
|
+
resolved is >= 0.3.169). The cutaway frames hide only the seat's own door panel, for that frame, and restore it;
|
|
86
|
+
their captions say so. `HELIX_VQA_VEHICLE_ONLY=occupants` skips the other phases for debugging (such a run
|
|
87
|
+
records a harness error and can never be submitted as a verdict);
|
|
88
|
+
- vehicle occupant CLIPPING, measured (`vehicle.occupants.penetration`, block; `vehicle.occupants.near_contact`, warn):
|
|
89
|
+
every skinned vertex of the seated occupant (skin and clothes) against the car's drawn triangles around the seat.
|
|
90
|
+
A vertex is through a surface when that surface lies between it and the bone its largest skin weight belongs to
|
|
91
|
+
(no normals, no closed meshes needed; the depth window is a limb's radius, so nothing on the far side of the car
|
|
92
|
+
counts); depth is its distance behind that surface, never more than to the nearest surface of the same mesh. What a
|
|
93
|
+
vertex cannot see is measured the other way round, as cabin surface sampled every 5 mm INSIDE a limb's drawn
|
|
94
|
+
surface: a small closed object between skin and bone (a steering rim through a knee, a pedal pad inside a sole), and a
|
|
95
|
+
wall a bone itself goes through (a floor through the shin of a foot sunk 11 cm). Hips, torso, thighs, upper arms and
|
|
96
|
+
the head against the occupant's OWN seat are support (`hips_sink_depth` judges those), found geometrically so a seat
|
|
97
|
+
baked into `bodyshell` works; a hand inside its own thigh is measured against the thigh's drawn surface. Tails,
|
|
98
|
+
skirts, coat flaps, hair and ears (secondary/spring bones) are the avatar's and are not judged. A cluster (3 cm-
|
|
99
|
+
connected points through one mesh) FAILS with >= 3 points deeper than 8 mm and >= 4 cm² of it deeper than 8 mm, or
|
|
100
|
+
deeper than 25 mm over >= 1.5 cm² (a part swallowed deeper than a finger is thick); a hand on the wheel and a sole on
|
|
101
|
+
a pedal are meant to touch and fail only beyond 20 mm. Everything else is a near-contact. Area is projected onto the
|
|
102
|
+
penetrated surface, each vertex standing for the patch its mesh spacing gives it (less at the edge of a region, so a
|
|
103
|
+
lone vertex spike stays small). `facts.occupants.seats[].measure.penetration` and the asserts' `measured.clusters`
|
|
104
|
+
carry the table: seat, body part (head/torso/arm/hand/hip/thigh/knee/leg/foot), cabin part
|
|
105
|
+
(roof/pillar/door/glass/seat/dash/wheel/pedals/floor/console/self/other, from the mesh name, or from where a
|
|
106
|
+
generically named triangle sits), mesh, max depth, area. Calibration (must-fail / must-pass fixtures cut from live
|
|
107
|
+
pulls): `src/visualQa/vehiclePenetration.spec.ts`;
|
|
108
|
+
- add-ons: each instance lands at its socket (a wheel set is four distinct wheels at four hubs), not at the host origin;
|
|
109
|
+
- wearables: on-body bounds for the slot, not floating;
|
|
110
|
+
- wearables, character add-ons and avatars, while WALKING (the world walk below, per base): `wear.walk.no_holes` and
|
|
111
|
+
`wear.walk.no_poke_through` (block, `subject` = base id);
|
|
112
|
+
- animations (per base body): the clip's tracks bind to the base's skeleton, the drawn skin really moves, the pose leaves
|
|
113
|
+
the bind pose (no T-pose), every key and skinned vertex is finite, the skin neither collapses nor explodes, the lowest
|
|
114
|
+
point stays near the floor; the pinned clip's bytes are hashed against the pinned CID;
|
|
115
|
+
- scenes: the scene document the runtime streams hashes to the pinned root document (a legacy home-shell fails this), the
|
|
116
|
+
visitor spawns at the declared spawn point and stands still on something, stays on the floor at standpoints probed from
|
|
117
|
+
the live scene (a missing floor collider drops them), and the drawn extent agrees with the declared placement bounds.
|
|
118
|
+
|
|
119
|
+
### World walk (wearables, character add-ons, avatars)
|
|
120
|
+
|
|
121
|
+
An owner-proxy review of the catalogue (2026-10-03) wore and walked items that had PASSED the gate and found about 30 %
|
|
122
|
+
still broken in motion: holes opening in skirts as the legs move, feet coming out through shoes and gown hems, models that
|
|
123
|
+
did not match their titles. The customiser's idle pose shows none of it, so every worn item is also worn and walked in the
|
|
124
|
+
real runtime, on each declared base (an avatar: the avatar itself, in the same Try Now session as its own route).
|
|
125
|
+
|
|
126
|
+
How it is worn: the sanctioned Try Now draft, the same request helixgame.com's customiser builds
|
|
127
|
+
(`lib/iwp/trial-launch.ts`): `trial = { itemId: <base>, draft: { slots: { <slotId>: { kind: 'catalog', itemId } },
|
|
128
|
+
appearance } }`, kept in the tab's sessionStorage (`helix:item-trial:v1:<key>`, bound to the signed-in account) and opened
|
|
129
|
+
as `/play/universal-item-test-grounds?tryItem=<base>&tryDraft=<key>`. The backend composes it
|
|
130
|
+
(`AddOnsService.resolveTrialCompositionWithManager`); nothing is bought, equipped or saved, and the account needs no copy.
|
|
131
|
+
The slot comes from the base's add-ons list. The session answer names the composed add-on's model URL, which must carry
|
|
132
|
+
the version's model CID (else a harness error), and the base model, whose index buffers rebuild the triangles the item
|
|
133
|
+
hides. The item's meshes are found by the composer's `compaddon:<slotId>|` prefix or the item GLB's node names.
|
|
134
|
+
|
|
135
|
+
The walk is driven with the real keys: Alt (the engine's walk tier; a bare W runs) + W forward with the camera pinned
|
|
136
|
+
behind, W + D to turn, then S back towards the engine camera. Eight poses are snapshotted on the way (the bones' local
|
|
137
|
+
transforms), then replayed and held by the pinned camera for the frames, the hole renders and the geometry pulls. Measured
|
|
138
|
+
(`src/visualQa/worldWalkMath.ts`):
|
|
139
|
+
|
|
140
|
+
- `wear.walk.no_holes` — see-through holes. The runtime hides the body a garment covers by collapsing those triangles
|
|
141
|
+
(helix-web-engine-new `regionHide.ts`), so wherever the garment fails to cover a hidden region the player sees through
|
|
142
|
+
the body. Each pose is rendered twice from two directions (front/back or the sides, alternating): `p1` draws the hidden
|
|
143
|
+
triangles again (rebuilt from the base model's own index buffers), plus the drawn skin that sits deep inside the
|
|
144
|
+
garment's rest coverage (more than 5 cm from any skin it leaves bare, so a hem or a slit uncovering the band next to it
|
|
145
|
+
in a normal stride does not count), in flat magenta over everything flat (the item green, the rest grey, the world
|
|
146
|
+
hidden); `p2` the item alone, front faces only. A magenta pixel the item's outer faces do not cover is a hole (hidden
|
|
147
|
+
body poking out of the garment is invisible in the real render and does not count). A pose view fails when its largest
|
|
148
|
+
8-connected hole is at least 120 px AND 0.4 % of the item's own pixels. Measured: Cassandra Goth Dress (legs hidden,
|
|
149
|
+
walking out of the gown) 6 900-7 100 px / 12-14 %; a 22 cm hole cut in Pullover Hoodie's back 4 600-4 800 px /
|
|
150
|
+
12-13 %; every control at most 25 px.
|
|
151
|
+
- `wear.walk.no_poke_through` — body through the garment, two ways. (1) A drawn vertex the garment COVERED at rest (a
|
|
152
|
+
garment surface within 15 cm outside it, none between it and its bone) is through when, in a walk pose, a garment surface
|
|
153
|
+
lies between it and the closest point on its own bone (the parent's segment included, so the skin over a bent knee is
|
|
154
|
+
anchored across the limb, not along it) and it is out in the open: no garment straight over it within 8 cm and at most
|
|
155
|
+
half of its outward hemisphere meets the garment within 15 cm (loose trousers' shell 8-10 cm off a knee whose skin
|
|
156
|
+
crossed an inner layer reads 0.78; a thigh out through a skirt panel 0.27). What an item is built to sit inside (an
|
|
157
|
+
ear's root in the skull) is never covered at rest, so it never counts. (2) A joint that has left the garment: its
|
|
158
|
+
root-to-joint bone chain changed garment-crossing parity since the rest pose (crossings within 4 cm of the garment's
|
|
159
|
+
own open edges — a cuff, a hem — are a bone grazing an opening and do not count), it was enclosed at rest and now at
|
|
160
|
+
most half of 26 directions meet the garment within 30 cm, down by at least 0.25 (a shin out through a gown's front
|
|
161
|
+
panel, leaving the foot floating): its drawn, uncovered vertices count, at the distance back to the crossing. Hands and
|
|
162
|
+
fingers never count as a joint leaving (an arm swinging into a skirt), and through a surface fail only beyond 20 mm.
|
|
163
|
+
Clustered (3 cm); a cluster fails with >= 3 points deeper than 8 mm covering >= 4 cm².
|
|
164
|
+
|
|
165
|
+
Calibration (must-fail / must-pass, live walks): `src/visualQa/worldWalkMath.spec.ts`. The critic gets the walk frames and
|
|
166
|
+
two walk questions (`wear.walk.covered`, `wear.walk.follows`), and every category now asks `item.matches_title` (is what the
|
|
167
|
+
frames show the thing the title names, with its defining feature: a wedge on wedge sandals, curls on curly hair). The
|
|
168
|
+
backend requires the walk asserts for these categories behind `VISUAL_QA_WORLD_WALK`.
|
|
169
|
+
|
|
170
|
+
A candidate version (`--package-version`) is asked for as `{ kind: 'catalog', itemId, packageVersion }` in the draft
|
|
171
|
+
slot. helix3's backend accepts it (backend #1693), so a candidate walk composes the candidate through the same path and is
|
|
172
|
+
measured like any other; the candidate's route is recorded as `customiser-preview + test-grounds walk`. If a backend still
|
|
173
|
+
refuses it (a 4xx), the stage records the refusal in `facts.worldWalk.<base>.skipped` and the walk asserts are absent, so a
|
|
174
|
+
server that requires them fails the run closed rather than judging the current version in the candidate's place.
|
|
175
|
+
|
|
176
|
+
A hole pass that drew no item at all — 0 item pixels in every pose view — is a missing measurement, not a pass: `no_holes`
|
|
177
|
+
fails closed with `not measured: the item was never drawn in the walk pass` and the run re-renders (a first-run race that
|
|
178
|
+
left the item out of the hole pass once measured nothing and reported a false pass; the identical version re-rendered drew
|
|
179
|
+
30k-60k item pixels per view and failed). `no_poke_through` fails closed the same way when the item has no drawn triangles.
|
|
180
|
+
|
|
181
|
+
`--no-world-walk` (or `HELIX_VQA_WORLD_WALK=0`) skips the stage. Debug: `HELIX_VQA_WALK_GAIT=run` walks at the run gait,
|
|
182
|
+
`HELIX_VQA_WALK_DEBUG=1` writes the `p1`/`p2` renders (`walk-debug/`), `HELIX_VQA_WALK_DUMP=1` the pulls the calibration
|
|
183
|
+
fixtures are cut from (`walk-dump/`). Cost per base: about 20 s of rendering after the page is presented (a full base,
|
|
184
|
+
browser launch to close, is listed in `facts.worldWalk.<base>.timings`).
|
|
185
|
+
|
|
186
|
+
### Every declared rendition (vehicles)
|
|
187
|
+
|
|
188
|
+
A vehicle package declares its model renditions as manifest variants (`vehicle.model.web.low` = `target-mobile-low`,
|
|
189
|
+
`vehicle.model.web.medium` = `target-balanced`, ...), and the runtime draws whichever one the player's Graphics tier
|
|
190
|
+
selects (`mesh.visual.tiers[tier].renditionId`). The default pass renders `target-balanced` with every frame. Then each
|
|
191
|
+
other declared rendition gets its own load of the car in the same runtime, served that rendition's sealed bytes at the
|
|
192
|
+
model URL the runtime requests (a headless QA browser resolves the balanced tier, and a forced `low` Graphics setting
|
|
193
|
+
was measured not to reach the vehicle spawn). The bytes are fetched from the rendition's own artifact
|
|
194
|
+
(`mesh.visual.renditions[].artifactRef`) and must hash to its manifest CID, and the pass must see the runtime take them
|
|
195
|
+
(`facts.renditions.passes[].substitution.served`); anything else is a harness error. Such a pass takes no regular
|
|
196
|
+
frames (one small diagnostic frame beside the bundle, never in `bundle.frames`), only EVIDENCE frames of what it
|
|
197
|
+
measured wrong (below), skips steering, cabin view and drive, and
|
|
198
|
+
measures wheels at the hubs, arch clearance, articulation, seats, every occupant assert, NaN/invisible, textures and
|
|
199
|
+
scale. Every vehicle assert carries `rendition: '<variant id>'`, the default ones too. `facts.renditions.passes` records
|
|
200
|
+
each pass's tier, wall time, drawn triangles, substitution and assert results. Measured: the Subaru 1.0.18
|
|
201
|
+
`target-mobile-low` puts both rear tyres 4.9 / 5.3 cm into the arches (`vehicle.wheels.arch_clearance` fails with
|
|
202
|
+
`rendition: 'target-mobile-low'`) while `target-balanced` clears them; the extra pass costs about 80 s of rendering.
|
|
203
|
+
|
|
204
|
+
### Evidence frames
|
|
205
|
+
|
|
206
|
+
A measured failure carries its own picture, in the bundle (group `evidence`), shown to the critic and on the contact
|
|
207
|
+
sheet. The measured geometry is DRAWN OVER the render, projected through the live camera, so the clash is in the
|
|
208
|
+
picture even where it is buried (a pedal pad inside a foot draws nothing a camera can see):
|
|
209
|
+
|
|
210
|
+
- `evidence.penetration.<seat>.<n>` (`evidence.<rendition>.penetration.<seat>.<n>` on another rendition): one per failing
|
|
211
|
+
`vehicle.occupants.penetration` cluster, the worst 3 of the pass, one per (seat, body part, cabin part). Only the occupant
|
|
212
|
+
and the clashing cabin mesh are drawn (every other mesh of the car is hidden for that frame and restored); the camera
|
|
213
|
+
stands outside both, on the side where the body comes through the surface, in the view the occupant's other parts
|
|
214
|
+
least occlude. Over it: the clashing mesh's triangles around the clash in translucent cyan, and every point where the
|
|
215
|
+
measure found the occupant and the part overlapping in red. A legend and the caption give depth and area.
|
|
216
|
+
- `evidence.<rendition>.wheel.<w>`: on a non-default rendition, each wheel that fails `at_hubs` or `arch_clearance`
|
|
217
|
+
there, low and square-on, with the measured cross-section over it: the tyre's circle (white), the body cut across the
|
|
218
|
+
tread where it reaches deepest (yellow), and the tyre sector the body reaches into in any of five planes across the
|
|
219
|
+
tread, filled red.
|
|
220
|
+
|
|
221
|
+
The critic is told that cutaway frames hide parts on purpose and that the colours are the measurement drawn over the
|
|
222
|
+
render. `facts.penetrationEvidence`, `facts.wheelEvidence` and `facts.occupants.seats[].penetrationEvidence` list them.
|
|
223
|
+
The contact sheet wraps every caption and assert reason instead of cutting it.
|
|
224
|
+
|
|
225
|
+
### The critic's location rule
|
|
226
|
+
|
|
227
|
+
A failing `vehicle.occupant.*` check must name WHERE: `location` = { seat (from the frame id), bodyPart, cabinPart, frame }.
|
|
228
|
+
The server counts `vehicle.occupant.no_clipping` as failed only when at least two failing votes name the same (seat, body
|
|
229
|
+
part, cabin part) and one of them names a frame the bundle carries; otherwise the failing votes are recorded as warnings
|
|
230
|
+
on the run, never as a reason. A light touch that does not visibly pass through the surface is not a fail. The measured
|
|
231
|
+
`vehicle.occupants.penetration` is independent of the critic and blocks on its own. `--local-critic` asks for the same
|
|
232
|
+
`location` field but makes a single call (no votes).
|
|
233
|
+
|
|
234
|
+
### Harness reliability
|
|
235
|
+
|
|
236
|
+
A browser that crashes under load (`Target crashed`, `Page crashed`, `Frame was detached`) says nothing about the item: the
|
|
237
|
+
route is rendered once more from a fresh browser and `facts.retry` records the first attempt. A run that still ends with a
|
|
238
|
+
harness error is `error`; the local critic is not called for it. A browser that HANGS (a browser-slot wait on a loaded box,
|
|
239
|
+
a renderer that never answers) is bounded by a watchdog: the local CLI aborts its own browsers after
|
|
240
|
+
`HELIX_VQA_RENDER_TIMEOUT_SECONDS` (default 900) and records the render as a harness error, so a run never sits silent with
|
|
241
|
+
an empty bundle.
|
|
242
|
+
|
|
243
|
+
Debug only (each records a harness error, so the run can never be submitted): `HELIX_VQA_RENDITION_ONLY=<variant id>`
|
|
244
|
+
renders just that rendition; `HELIX_VQA_ENGINE_RUNTIME=<version>` serves another humanoid-character runtime version
|
|
245
|
+
(e.g. `0.3.169`) to reproduce an engine-era defect; `HELIX_VQA_ENGINE_BUNDLE=<path>` serves a LOCAL humanoid-character build
|
|
246
|
+
(`systems/humanoid-character/dist/index.js`) in its place, the pre-release proof of an engine change on the real page; `HELIX_VQA_OWN_AVATAR=1` seats this account's own avatar instead of the platform default (vehicle occupants are
|
|
247
|
+
the platform default avatar from `GET /universal-items/avatar/default` by default, so a car's verdict does not depend on what
|
|
248
|
+
the submitter wears); `HELIX_VQA_EQUIPPED_AVATAR=<json>` seats a stated composition (to bisect an avatar defect); `HELIX_VQA_DEBUG_PARK_AT_WALL=1` ends the drive parked nose-on against
|
|
249
|
+
the scenery ahead instead of back at the start (the F40 round-1 end state, to prove the exterior cameras stay clear on their
|
|
250
|
+
own); `HELIX_VQA_DEBUG_ROUTES=<json>` serves local files for matching URLs
|
|
251
|
+
(`[{ "match", "file", "type" }]`, a candidate GLB in place of the pinned one); `HELIX_VQA_DUMP_GEOMETRY=1` writes the wheel and occupant pulls
|
|
252
|
+
(`occupant-<seat>.json`, and `rendition.<id>/` for the other renditions) that the calibration fixtures are cut from
|
|
253
|
+
(`scripts/vqa-penetration-fixtures.mjs`).
|
|
254
|
+
|
|
255
|
+
The backend then runs a **vision critic** (Claude, Opus 5.5) over the frames with a per-category checklist; every
|
|
256
|
+
check must pass. The verdict **fails closed**: a harness error, an unmeasured required assert, a critic refusal,
|
|
257
|
+
an unanswered check or `cannot_judge` is never a pass.
|
|
258
|
+
|
|
259
|
+
### Proving an assert: fixtures in the real runtime
|
|
260
|
+
|
|
261
|
+
`HELIX_VQA_FIXTURE_MODEL=<sha256 hex>=<file.glb>` answers every request for that content hash with a local file, so a deliberately
|
|
262
|
+
broken copy of a good avatar is drawn by the real runtime through the real route (e.g. Base Male `7a93cdb1…` with its calves'
|
|
263
|
+
rest roll turned 120 deg). Such a run always carries a harness error (`fixture substitution active`), so its verdict is `error`,
|
|
264
|
+
and `--submit` refuses it: it proves what an assert catches and can never pass anything.
|
|
265
|
+
|
|
266
|
+
## A vehicle: every check it must pass
|
|
267
|
+
|
|
268
|
+
This is the whole list the backend judges a vehicle run on (`helix-backend-api`
|
|
269
|
+
`src/continuum/visual-qa/visual-qa.checklists.ts` and `visual-qa.verdict.ts`). A run PASSES only if the harness reported
|
|
270
|
+
no error, every REQUIRED assert is present with severity `block` and passed, no other `block` assert failed, and the
|
|
271
|
+
vision critic ran and answered `pass` to every one of its checks. `warn` asserts never block.
|
|
272
|
+
|
|
273
|
+
**Required measured asserts** (missing = fail):
|
|
274
|
+
|
|
275
|
+
| Assert | Passes when |
|
|
276
|
+
|---|---|
|
|
277
|
+
| `vehicle.wheels.at_hubs` | each drawn wheel centre is on its physics hub, one drawn wheel per physics wheel, no two on one hub |
|
|
278
|
+
| `vehicle.wheels.arch_clearance` | no body surface inside a tyre (> 10 mm), tyre top clear of the arch, body >= 5 cm above the contact plane |
|
|
279
|
+
| `vehicle.wheels.spin_with_speed` | coasting, each drawn wheel turns distance / ITS OWN rolling radius (ratio 0.8-1.25), sampled over >= 1 s and >= 3 rad |
|
|
280
|
+
| `vehicle.steering.wheel_rotates` | at full lock the front wheels yaw >= 10 deg (within 4 deg of the physics steer) and the steering wheel >= 30 deg |
|
|
281
|
+
| `vehicle.articulation.reaches_limits` | every declared panel opens to its hinge limit (5 deg) and closes again (2 deg), attached nodes rigid |
|
|
282
|
+
| `vehicle.lamps.each_function_lights` | every lamp function lights in its state (emissive read per state on the meshes the lamp rows resolve to); each indicator blinks and, per side and on hazards, reaches the front and rear quarter of the car. Emitted only when the package has lamp rows |
|
|
283
|
+
| `vehicle.seats.addressable` | every declared seat is in the runtime's seat evidence and the driver seat boards |
|
|
284
|
+
| `frame.non_empty` | no frame is flat (luma stdev < 6, or mean < 4 / > 251) |
|
|
285
|
+
| `scene.no_nan_or_invisible` | no NaN or zero-scale mesh, something visible, < 50 % invisible materials, >= 12 drawn triangles |
|
|
286
|
+
| `render.textured` | not every material is untextured default white/light grey |
|
|
287
|
+
| `scale.sane_for_category` | largest drawn dimension 1.2-30 m |
|
|
288
|
+
| `vehicle.occupants.penetration` | on an occupant run (every current harness): no occupant surface through the cabin (> 8 mm over >= 4 cm², or > 25 mm over >= 1.5 cm²) |
|
|
289
|
+
|
|
290
|
+
`vehicle.wheels.at_hubs`, `.arch_clearance`, `.articulation.reaches_limits`, `.occupants.penetration`,
|
|
291
|
+
`scene.no_nan_or_invisible`, `render.textured` and `scale.sane_for_category` are required again on EVERY other declared
|
|
292
|
+
rendition (above).
|
|
293
|
+
|
|
294
|
+
**Blocking whenever present** (the harness always records them on an occupant run): `vehicle.occupants.engine_current`
|
|
295
|
+
(engine >= 0.3.169), `.boarded`, `.head_clearance` (crown >= 10 mm under the lining), `.hips_on_seat` (<= 120 mm over the
|
|
296
|
+
cushion, <= 20 mm through the base), `.feet_on_floor` (sole -50..+300 mm of the floor or pedal), `.hands_on_wheel`
|
|
297
|
+
(driver, <= 70 mm), `.torso_angle`, `.knees_up`, `.head_in_wings` (posture; see above). Warn only: `vehicle.wheels.radius_matches_physics` (drawn tyre within 3 cm of the radius that wheel
|
|
298
|
+
rolls on), `vehicle.occupants.hips_sink_depth`, `vehicle.occupants.near_contact`, `render.flat_shaded`.
|
|
299
|
+
|
|
300
|
+
**The vision critic** (every check must be `pass`; `cannot_judge` fails): `item.matches_title`, `frame.nonempty` (the
|
|
301
|
+
item is clearly visible; no frame shows only the environment), `render.textured`, `render.intact`, `scale.plausible`,
|
|
302
|
+
`vehicle.wheels.seated`, `vehicle.wheels.count`, `vehicle.ride_height`, `vehicle.symmetry`, `vehicle.cabin`,
|
|
303
|
+
`vehicle.articulation`, `vehicle.steering`, `vehicle.motion`, and on a run with occupant frames
|
|
304
|
+
`vehicle.occupant.head_clearance`, `vehicle.occupant.seat_contact`, `vehicle.occupant.no_clipping` (only counted when two
|
|
305
|
+
failing votes name the same seat, body part and cabin part) and `vehicle.occupant.hands_on_wheel`.
|
|
306
|
+
|
|
307
|
+
### A local PASS is not a gate result
|
|
308
|
+
|
|
309
|
+
Only `--submit` (and a hosted run, `--hosted`) runs the vision critic and records a verdict. A local run without
|
|
310
|
+
`--submit` measures every assert above and prints PASS when they pass, but **no critic has looked at a frame**, so a local
|
|
311
|
+
PASS says nothing about the critic's checks (F40 round 1: five local PASSes, then the hosted critic failed
|
|
312
|
+
`frame.nonempty` on every one). `--local-critic` runs the critic once locally (no votes); it is a dry run, never a
|
|
313
|
+
verdict. The listing gate reads only the server's recorded run.
|
|
314
|
+
|
|
315
|
+
### When the gate blocks a car that is right
|
|
316
|
+
|
|
317
|
+
The harness is software and can be wrong. If a check fails on something the car does not actually do (a frame of a wall,
|
|
318
|
+
a measurement of a part that is not there, a camera inside scenery), the creator **reports it** (the run id, the frame or
|
|
319
|
+
assert, why it is the harness) and **never changes the car to get past it**: accuracy to the real vehicle wins over a gate
|
|
320
|
+
artefact. F40 round 1 raised a correct 1.124 m body by 36 mm to lift an occupant camera over a test-grounds wall; the
|
|
321
|
+
camera was the bug, the car was not, and the raise was itself a defect. A harness fix is then followed by a re-queue of
|
|
322
|
+
the same version (`helix item visual-qa <id> --hosted --retry`).
|
|
323
|
+
|
|
324
|
+
### The drive and the exterior cameras stay clear of the test grounds
|
|
325
|
+
|
|
326
|
+
The test grounds are small and walled (about 29 m between the north and south walls). The drive
|
|
327
|
+
(`vehicle.wheels.spin_with_speed`) therefore plans against the grounds' own scenery: before it moves it measures the clear
|
|
328
|
+
distance from each bumper along the car's heading to the first scenery box (effects that write no depth do not count;
|
|
329
|
+
`facts.drive.trace[phase=start].clearAheadM/clearBehindM` and the box names), backs up at most 14 m and never within 1.5 m
|
|
330
|
+
of what is behind, stops with the foot brake (the pedal against the motion, as a player does, plus the handbrake),
|
|
331
|
+
releases the throttle early enough to settle, coast and still stop 1.5 m short of what is ahead (`releasedFor: room`),
|
|
332
|
+
lifts the throttle whenever a driven wheel slips more than 25 % (the driver's own traction control: a wheel released
|
|
333
|
+
spinning keeps pushing the car on), samples the coast once every wheel rolls within 6 % of road speed or 0.5 s after
|
|
334
|
+
the release (`slip-settled`), takes the chase frame during the coast, ends the 1.3 s sample early and brakes if the car would otherwise pass
|
|
335
|
+
that margin (`stoppedForRoom`, said in the assert), keeps only the free part of the coast (`impactAtS` if the car met
|
|
336
|
+
something), and finally drives back to where it started, closed loop on position, at most 14 s (`facts.drive.end`:
|
|
337
|
+
`returned`, `endAlongM`, `endFromStartM`, the clearance there). The occupant phase then has the space the car spawned in.
|
|
338
|
+
|
|
339
|
+
Every exterior occupant frame (`side`, `front34`, `door_open`, `cutaway`, `head_roof`, `hips`, `feet`) is taken with its
|
|
340
|
+
near plane pushed to just short of the car and its occupant (the LIVE drawn bounds, so an open door counts), so anything
|
|
341
|
+
between the lens and the car is clipped and no part of the car is; any scenery box still crossing a sight line to the
|
|
342
|
+
car is hidden for that frame only and restored. `facts.occupants.seats[].frames.<id>` records the near plane and the
|
|
343
|
+
scenery hidden. This is generic: a camera pinned in the body frame is clear for any ride height and any length (before
|
|
344
|
+
the fix, the `front34` camera of any car whose occupant camera sat below the grounds' 1.25 m north wall framed concrete).
|
|
345
|
+
|
|
346
|
+
Each wheel's spin and drawn radius are judged against the radius THAT wheel rolls on: its axle's tyre on the v2 land
|
|
347
|
+
solver (`simulation.land.tyreByAxle[min(axle, n-1)].radius`), else its contact's. A staggered car (F40: 245 front
|
|
348
|
+
0.3139 m, 335 rear 0.3332 m) is measured as staggered; one chassis-wide `wheelRadius` is never used for it.
|
|
349
|
+
|
|
350
|
+
### The car still drives with its sound on (`vehicle.drive.responds_with_audio`)
|
|
351
|
+
|
|
352
|
+
R34 1.0.9 went live with an audio block missing `engineGainDb`, `exhaustGainDb`, `muffling` and `min`/`maxLoadMix`; with an
|
|
353
|
+
add-on fitted the missing gain became NaN, `AudioParam.setValueAtTime(NaN)` threw inside the World's frame loop and the
|
|
354
|
+
car froze in Try Now, while hosted visual QA passed it. The drive now holds full throttle as the seated driver with the
|
|
355
|
+
World's AudioContext running and FAILS when, under throttle: the speed stays at ~0 (peak < 0.5 m/s and < 25 cm travelled),
|
|
356
|
+
the vehicle state stops changing for 0.8 s (frozen), any non-finite number appears in `controller.getState()` or the
|
|
357
|
+
entity's telemetry, any non-finite value is written to an `AudioParam` (`browser.ts` `installHooks` records every
|
|
358
|
+
AudioContext and every non-finite write, then passes the write through unchanged), or the page throws. A drive without a
|
|
359
|
+
running AudioContext, or with `no-audio-host`, is a harness error, never a pass. `facts.driveAlive` holds the samples'
|
|
360
|
+
summary, the AudioContexts, the AudioParam write count and the composed `sound` rows (add-ons' audio deltas). A vehicle
|
|
361
|
+
run requires the assert; an add-on preview (`helix vehicle preview --addon`) drives too, with the add-ons fitted, since
|
|
362
|
+
an add-on's audio delta is what triggered the freeze. Debug proofs (never submissions): `HELIX_VQA_FAULT_AUDIO_NAN=1`
|
|
363
|
+
makes every audio write carry NaN from the throttle on; `HELIX_VQA_ENGINE_CORE=<version>` serves an exact engine-core
|
|
364
|
+
in place of the promoted one where a World loads it.
|
|
365
|
+
|
|
366
|
+
### Bundle size and the frame cap
|
|
367
|
+
|
|
368
|
+
The gauntlet renders a fixed set of views per seat, so a bigger car makes more frames (the 4-seat Subaru: 81). The
|
|
369
|
+
backend's cap is the inspection set at the largest realistic car (helix-backend-api `visual-qa.frame-budget.ts`: 9 seats,
|
|
370
|
+
6 wheels, 8 panels, 3 rendition passes, 4 add-ons and the night set = 218). `--submit` checks the count before uploading
|
|
371
|
+
(a clear refusal, never a raw 422) and, when the frames are over the 21 MB base64 budget inside the route's 25 MB body,
|
|
372
|
+
re-encodes every frame a little smaller (JPEG quality, then long edge) rather than dropping any (`submitBudget.ts`).
|
|
373
|
+
|
|
374
|
+
### A vehicle version that draws bytes it does not seal
|
|
375
|
+
|
|
376
|
+
The engine draws `mesh.visual.tiers[tier].renditionId` → that rendition's `artifactRef`, not the manifest's
|
|
377
|
+
`vehicle.model.web.*` variant. Subaru 1.0.22 sealed its lamp-fixed GLB as `target-balanced` while its root still drew the
|
|
378
|
+
1.0.21 GLB for `target-balanced` and `target-desktop-high`, so `--package-version 1.0.22` (correctly) drew the old car. The
|
|
379
|
+
vehicle route now fails fast, before rendering, when the sealed root or the `--vehicle-package` names a rendition whose
|
|
380
|
+
digest contradicts the Version's variant of the same id (`vehicle/renditionManifest.ts`); `helix continuum
|
|
381
|
+
publish-package` refuses to seal such a root, and the backend refuses it on the candidate trial and the version move.
|
|
382
|
+
|
|
383
|
+
## The gate
|
|
384
|
+
|
|
385
|
+
`--submit` posts the bundle to `POST /api/v1/universal-items/:id/visual-qa`. The backend validates that the
|
|
386
|
+
bundle names the item's exact package version (package id, version and manifest CID), recomputes the verdict,
|
|
387
|
+
stores frames and a contact sheet, and records the run against that version. Public Marketplace/Vault
|
|
388
|
+
listings, active Marketplace/World distributions, and moving a public item to a new version are refused with
|
|
389
|
+
`VISUAL_QA_REQUIRED` until that version has a passing run. A new version always needs a new run. Admins can
|
|
390
|
+
record an audited override, but only on top of a recorded harness run of that exact version whose measurements all passed (the
|
|
391
|
+
override can overrule the vision critic, never a missing or failed measurement or a harness error), and **never for an avatar**:
|
|
392
|
+
a whole avatar is held (not visible to anyone but its creator) until a real run passes. See the backend's
|
|
393
|
+
`docs/architecture/visual-qa-gate.md` §"Override".
|
|
394
|
+
|
|
395
|
+
## Requirements
|
|
396
|
+
|
|
397
|
+
- Nothing to install by hand: the harness renders on a **Chrome for Testing build matching current stable**, resolved
|
|
398
|
+
from Google's [last-known-good endpoint](https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json)
|
|
399
|
+
and downloaded on first use into its own cache (`~/Library/Caches/helix/vqa-chrome` on macOS, `~/.cache/helix/vqa-chrome`
|
|
400
|
+
on Linux, `%LOCALAPPDATA%\helix\vqa-chrome` for Windows renders; `HELIX_VQA_CHROME_CACHE` moves it). The pin is
|
|
401
|
+
re-resolved after 14 days; `node dist/visualQa/pinnedChrome.js --refresh` (or `--windows --refresh` from WSL) does it
|
|
402
|
+
now. Never Playwright's bundled Chromium (a pre-stable build: chromium-1243 = 153.0.8010.12 cannot compile what three
|
|
403
|
+
r185 emits for every lit material) and never your own Chrome or profile. `HELIX_VQA_CHROME` / `--chrome` still
|
|
404
|
+
override, and the bundle says so. Headless always, throwaway profile, a GPU when present.
|
|
405
|
+
- **WebGPU self-test.** Before any render, every browser compiles a control shader and the `v.xy.x` swizzle repro through
|
|
406
|
+
module + render-pipeline creation. A build whose compiler fails the repro is refused with a harness error naming it
|
|
407
|
+
(`broken WebGPU shader compiler in <build>; use a Chrome-for-Testing build matching stable`); so is a browser with no
|
|
408
|
+
WebGPU adapter. The hosted worker runs the same check before it claims a job. No `--enable-unsafe-webgpu` on macOS or
|
|
409
|
+
Windows: stable ships WebGPU on there, and the flag changes what the compiler accepts (it hid that very bug).
|
|
410
|
+
- Every bundle records `harness.browser` = `{ name, version, executablePath, channel, userAgent, webgpu }` — the full
|
|
411
|
+
four-part version (the UA string reduces it to `153.0.0.0`) and where the build came from (`pinned-cft`,
|
|
412
|
+
`env-override`, `explicit`, `remote-cdp`). The contact sheet header shows it.
|
|
413
|
+
- Vehicles, avatars and the customiser need a signed-in account: pass a Playwright storage state with
|
|
414
|
+
`--storage-state` or `HELIX_VQA_STORAGE_STATE`.
|
|
415
|
+
- `--local-critic` needs `ANTHROPIC_API_KEY` (or `OPENROUTER_API_KEY`).
|
|
416
|
+
|
|
417
|
+
Outputs land in `./visual-qa/<item>-<timestamp>/`: every frame, `bundle.json`, `contact-sheet.jpg`, and with
|
|
418
|
+
`--submit`, `server-verdict.json`. Exit code 0 = pass, 1 = fail, 2 = harness error.
|
|
419
|
+
|
|
420
|
+
## Hosted rendering
|
|
421
|
+
|
|
422
|
+
A publisher does not need Chrome, a GPU or a QA login: the platform renders the item on a dedicated GPU runner.
|
|
423
|
+
|
|
424
|
+
```
|
|
425
|
+
helix item visual-qa <item-id> --hosted # queue a render of the current version and wait (exit 0 pass, 1 fail, 2 error)
|
|
426
|
+
helix item visual-qa <item-id> --hosted --no-wait # queue it and return
|
|
427
|
+
helix item visual-qa <item-id> --hosted --retry # re-queue after a failed/errored hosted run of this version
|
|
428
|
+
helix item visual-qa <item-id> --status # read-only: hosted job state, contact sheet URL, pass/fail of the current version
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
A refused listing (`VISUAL_QA_REQUIRED`), a deferred Marketplace publish and the Dreamer verification all queue a
|
|
432
|
+
hosted run for you and name it (`hostedRun: { jobId, status }`); `--status` follows it. Jobs are per
|
|
433
|
+
`(item, Package Version, manifest)`; a new version needs a new run. States: `queued` → `rendering` →
|
|
434
|
+
`passed` | `failed` (a run was recorded) | `error` (the runner could not produce a judged run after its attempts).
|
|
435
|
+
|
|
436
|
+
### The runner
|
|
437
|
+
|
|
438
|
+
`helix item visual-qa --hosted-worker` is the runner side: it signs in as the platform's visual-QA bot account
|
|
439
|
+
(`HELIX_VQA_BOT_EMAIL`, `HELIX_VQA_BOT_PASSWORD`; a user account with claim/heartbeat/fail rights and read access, nothing
|
|
440
|
+
else), then loops claim → render with the same harness as the local command → submit against the job's lease. A
|
|
441
|
+
heartbeat extends the lease while it renders; a render with harness errors is reported with `/fail` (the job is
|
|
442
|
+
retried until its attempts run out), never submitted as a verdict. Each render has a hard 900 s watchdog.
|
|
443
|
+
Flags: `--max-jobs`, `--max-minutes`, `--idle-exit-minutes` (keep polling an empty queue; default exit at once),
|
|
444
|
+
`--poll-seconds`, `--render-timeout`, `--worker`.
|
|
445
|
+
|
|
446
|
+
It runs as `.github/workflows/visual-qa-hosted.yml` on a dedicated self-hosted runner, `vrpc-vqa`
|
|
447
|
+
(labels `self-hosted, vrpc, vqa-gpu`, a systemd service on the VRPC box), so a long render never blocks CI on the
|
|
448
|
+
other runners (CI targets `helix-ci`). The schedule fires every 5 minutes, a `repository_dispatch` of type
|
|
449
|
+
`visual-qa-job` or a manual dispatch starts one on demand, and a single-slot concurrency group keeps one worker alive.
|
|
450
|
+
The worker polls an empty queue for ~9 minutes, so a queued job starts within seconds.
|
|
451
|
+
|
|
452
|
+
### Rendering through Windows Chrome (the real GPU)
|
|
453
|
+
|
|
454
|
+
Inside WSL the only Chrome is Linux's and renders on SwiftShader (CPU). With `HELIX_VQA_WINDOWS_CHROME=1` the
|
|
455
|
+
harness starts a **Windows** Chrome for Testing (the pinned current-stable build under `%LOCALAPPDATA%\helix\vqa-chrome`,
|
|
456
|
+
installed from WSL on first use; the workflow refreshes it each run) through WSL interop: headless,
|
|
457
|
+
throwaway profile, `--remote-debugging-port=0`, D3D11 ANGLE, `--force_high_performance_gpu`, WebGPU on, then
|
|
458
|
+
`connectOverCDP` (mirrored networking shares 127.0.0.1). `bundle.harness.renderer` records the adapter actually in
|
|
459
|
+
use (`webgpu:nvidia/lovelace`, `ANGLE (NVIDIA GeForce RTX 4080 …)`), never one inferred from flags. The wrapper records the
|
|
460
|
+
Windows pid it started and only ever kills that tree (`taskkill /T /F /PID`); a pid file lets a later run reap a
|
|
461
|
+
launch whose owner died, after checking the pid still carries our profile directory. `HELIX_VQA_CDP_URL` instead
|
|
462
|
+
attaches to an already-running headless Chromium; `HELIX_VQA_WIN_CHROME` names a specific `chrome.exe`.
|