@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.
Files changed (1715) hide show
  1. package/README.md +631 -8
  2. package/assets/bridge/metahuman-eye-baked.png +0 -0
  3. package/assets/item-def-sounds/Common/A_DryShot.ogg +0 -0
  4. package/assets/item-def-sounds/Common/A_LMG_CloseCoverA.ogg +0 -0
  5. package/assets/item-def-sounds/Common/A_LMG_CloseCoverB.ogg +0 -0
  6. package/assets/item-def-sounds/Common/A_LMG_InsertMag.ogg +0 -0
  7. package/assets/item-def-sounds/Common/A_LMG_RemoveMag.ogg +0 -0
  8. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_001.ogg +0 -0
  9. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_002.ogg +0 -0
  10. package/assets/item-def-sounds/Common/A_Pistol_InsertMag_003.ogg +0 -0
  11. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_001.ogg +0 -0
  12. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_002.ogg +0 -0
  13. package/assets/item-def-sounds/Common/A_Pistol_RemoveMag_003.ogg +0 -0
  14. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_001.ogg +0 -0
  15. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_002.ogg +0 -0
  16. package/assets/item-def-sounds/Common/A_Rifle_ChargingHandle_003.ogg +0 -0
  17. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_001.ogg +0 -0
  18. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_002.ogg +0 -0
  19. package/assets/item-def-sounds/Common/A_Rifle_InsertMag_003.ogg +0 -0
  20. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_001.ogg +0 -0
  21. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_002.ogg +0 -0
  22. package/assets/item-def-sounds/Common/A_Rifle_RemoveMag_003.ogg +0 -0
  23. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_001.ogg +0 -0
  24. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_002.ogg +0 -0
  25. package/assets/item-def-sounds/Common/A_SMG_ChargingHandle_003.ogg +0 -0
  26. package/assets/item-def-sounds/Common/A_Sniper_ChargingHandle.ogg +0 -0
  27. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_001.ogg +0 -0
  28. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_002.ogg +0 -0
  29. package/assets/item-def-sounds/Common/A_Sniper_RemoveMag_003.ogg +0 -0
  30. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_01.ogg +0 -0
  31. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_02.ogg +0 -0
  32. package/assets/item-def-sounds/Explosions/Explosions_Grenade_Punch-Close_03.ogg +0 -0
  33. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_001.ogg +0 -0
  34. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_002.ogg +0 -0
  35. package/assets/item-def-sounds/LMG/A_LWS-32_Shot_003.ogg +0 -0
  36. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_001.ogg +0 -0
  37. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_002.ogg +0 -0
  38. package/assets/item-def-sounds/Pistol/A_Gaston_Shot_003.ogg +0 -0
  39. package/assets/item-def-sounds/Rifle/A_KAL_Shot_001.ogg +0 -0
  40. package/assets/item-def-sounds/Rifle/A_KAL_Shot_002.ogg +0 -0
  41. package/assets/item-def-sounds/Rifle/A_KAL_Shot_003.ogg +0 -0
  42. package/assets/item-def-sounds/SMG/A_Bison_InsertMag.ogg +0 -0
  43. package/assets/item-def-sounds/SMG/A_Bison_RemoveMag.ogg +0 -0
  44. package/assets/item-def-sounds/SMG/A_Bison_Shot_001.ogg +0 -0
  45. package/assets/item-def-sounds/SMG/A_Bison_Shot_002.ogg +0 -0
  46. package/assets/item-def-sounds/SMG/A_Bison_Shot_003.ogg +0 -0
  47. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_001.ogg +0 -0
  48. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_002.ogg +0 -0
  49. package/assets/item-def-sounds/Shotgun/A_DB-12_Shot_003.ogg +0 -0
  50. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_001.ogg +0 -0
  51. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_002.ogg +0 -0
  52. package/assets/item-def-sounds/Sniper/A_CS-446_Shot_003.ogg +0 -0
  53. package/bridge-plugins/helix.bridge.unreal/bin/unreal-skeletal-mesh-extract.js +812 -0
  54. package/bridge-plugins/helix.bridge.unreal/bridge-plugin.json +40 -0
  55. package/bridge-plugins/helix.bridge.unreal/test/exporter.test.js +418 -0
  56. package/bridge-plugins/helix.bridge.unreal/test/handler.test.js +417 -0
  57. package/bridge-plugins/helix.bridge.unreal/unreal/export_skeletal_mesh.py +384 -0
  58. package/bridge-recipes/cyberpunk/cyberpunk-female-bone-map.json +476 -0
  59. package/bridge-recipes/sims4/README.md +43 -0
  60. package/bridge-recipes/sims4/sims4-female-bone-map.json +65 -0
  61. package/bridge-recipes/unreal/character-customizer/README.md +58 -0
  62. package/bridge-recipes/unreal/character-customizer/all.json +13 -0
  63. package/bridge-recipes/unreal/character-customizer/base-male-body.json +6 -0
  64. package/bridge-recipes/unreal/character-customizer/base-male-head.json +6 -0
  65. package/bridge-recipes/unreal/character-customizer/beard.addon.json +1 -0
  66. package/bridge-recipes/unreal/character-customizer/beard.json +6 -0
  67. package/bridge-recipes/unreal/character-customizer/bottom.addon.json +1 -0
  68. package/bridge-recipes/unreal/character-customizer/bottom.json +6 -0
  69. package/bridge-recipes/unreal/character-customizer/eyewear.addon.json +1 -0
  70. package/bridge-recipes/unreal/character-customizer/eyewear.json +6 -0
  71. package/bridge-recipes/unreal/character-customizer/footwear.addon.json +1 -0
  72. package/bridge-recipes/unreal/character-customizer/footwear.json +6 -0
  73. package/bridge-recipes/unreal/character-customizer/hair.addon.json +1 -0
  74. package/bridge-recipes/unreal/character-customizer/hair.json +6 -0
  75. package/bridge-recipes/unreal/character-customizer/test/recipes.test.js +74 -0
  76. package/bridge-recipes/unreal/character-customizer/top.addon.json +1 -0
  77. package/bridge-recipes/unreal/character-customizer/top.json +6 -0
  78. package/bridge-recipes/unreal/helix-character-creator-female/README.md +57 -0
  79. package/bridge-recipes/unreal/helix-character-creator-female/all.json +18 -0
  80. package/bridge-recipes/unreal/helix-character-creator-female/back.addon.json +1 -0
  81. package/bridge-recipes/unreal/helix-character-creator-female/back.json +1 -0
  82. package/bridge-recipes/unreal/helix-character-creator-female/base-female-face.json +1 -0
  83. package/bridge-recipes/unreal/helix-character-creator-female/base-female.json +1 -0
  84. package/bridge-recipes/unreal/helix-character-creator-female/bottom.addon.json +1 -0
  85. package/bridge-recipes/unreal/helix-character-creator-female/bottom.json +1 -0
  86. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.addon.json +1 -0
  87. package/bridge-recipes/unreal/helix-character-creator-female/eyewear.json +1 -0
  88. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.addon.json +1 -0
  89. package/bridge-recipes/unreal/helix-character-creator-female/female-basic-t-shirt.json +1 -0
  90. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-hair.json +23 -0
  91. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-nebula-urbanghost.json +7 -0
  92. package/bridge-recipes/unreal/helix-character-creator-female/female-batch-singles.json +19 -0
  93. package/bridge-recipes/unreal/helix-character-creator-female/female-batch5.json +19 -0
  94. package/bridge-recipes/unreal/helix-character-creator-female/female-batch6.json +19 -0
  95. package/bridge-recipes/unreal/helix-character-creator-female/female-batch7.json +11 -0
  96. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.addon.json +1 -0
  97. package/bridge-recipes/unreal/helix-character-creator-female/female-cap-2.json +1 -0
  98. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.addon.json +1 -0
  99. package/bridge-recipes/unreal/helix-character-creator-female/female-cap.json +1 -0
  100. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.addon.json +1 -0
  101. package/bridge-recipes/unreal/helix-character-creator-female/female-cargo-pants.json +1 -0
  102. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.addon.json +1 -0
  103. package/bridge-recipes/unreal/helix-character-creator-female/female-carnival-mask-3.json +1 -0
  104. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.addon.json +1 -0
  105. package/bridge-recipes/unreal/helix-character-creator-female/female-chain.json +1 -0
  106. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.addon.json +1 -0
  107. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-pants.json +1 -0
  108. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.addon.json +1 -0
  109. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-shoes.json +1 -0
  110. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.addon.json +1 -0
  111. package/bridge-recipes/unreal/helix-character-creator-female/female-clare-top.json +1 -0
  112. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.addon.json +1 -0
  113. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit-2.json +1 -0
  114. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.addon.json +1 -0
  115. package/bridge-recipes/unreal/helix-character-creator-female/female-compression-bodysuit.json +1 -0
  116. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.addon.json +1 -0
  117. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-hole-mask-2.json +1 -0
  118. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.addon.json +1 -0
  119. package/bridge-recipes/unreal/helix-character-creator-female/female-eye-patch.json +1 -0
  120. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.addon.json +1 -0
  121. package/bridge-recipes/unreal/helix-character-creator-female/female-firefight-outfit.json +1 -0
  122. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.addon.json +1 -0
  123. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-pants.json +1 -0
  124. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.addon.json +1 -0
  125. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-sneakers.json +1 -0
  126. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.addon.json +1 -0
  127. package/bridge-recipes/unreal/helix-character-creator-female/female-fruity-top.json +1 -0
  128. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.addon.json +1 -0
  129. package/bridge-recipes/unreal/helix-character-creator-female/female-gamer-mask.json +1 -0
  130. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.addon.json +1 -0
  131. package/bridge-recipes/unreal/helix-character-creator-female/female-guy-fawkes-mask.json +1 -0
  132. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.addon.json +1 -0
  133. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a1.json +1 -0
  134. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.addon.json +1 -0
  135. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a10.json +1 -0
  136. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.addon.json +1 -0
  137. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a11.json +1 -0
  138. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.addon.json +1 -0
  139. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a12.json +1 -0
  140. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.addon.json +1 -0
  141. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a13.json +1 -0
  142. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.addon.json +1 -0
  143. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a14.json +1 -0
  144. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.addon.json +1 -0
  145. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a15.json +1 -0
  146. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.addon.json +1 -0
  147. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a16.json +1 -0
  148. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.addon.json +1 -0
  149. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a17.json +1 -0
  150. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.addon.json +1 -0
  151. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a18.json +1 -0
  152. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.addon.json +1 -0
  153. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a19.json +1 -0
  154. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.addon.json +1 -0
  155. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a2.json +1 -0
  156. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.addon.json +1 -0
  157. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a20.json +1 -0
  158. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.addon.json +1 -0
  159. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a21.json +1 -0
  160. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.addon.json +1 -0
  161. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a3.json +1 -0
  162. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.addon.json +1 -0
  163. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a4.json +1 -0
  164. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.addon.json +1 -0
  165. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a5.json +1 -0
  166. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.addon.json +1 -0
  167. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a6.json +1 -0
  168. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.addon.json +1 -0
  169. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a7.json +1 -0
  170. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.addon.json +1 -0
  171. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a8.json +1 -0
  172. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.addon.json +1 -0
  173. package/bridge-recipes/unreal/helix-character-creator-female/female-hair-a9.json +1 -0
  174. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.addon.json +1 -0
  175. package/bridge-recipes/unreal/helix-character-creator-female/female-high-waist-tailored-trousers.json +1 -0
  176. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.addon.json +1 -0
  177. package/bridge-recipes/unreal/helix-character-creator-female/female-hogwarts-pants.json +1 -0
  178. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.addon.json +1 -0
  179. package/bridge-recipes/unreal/helix-character-creator-female/female-hoody.json +1 -0
  180. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.addon.json +1 -0
  181. package/bridge-recipes/unreal/helix-character-creator-female/female-jacket-6.json +1 -0
  182. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.addon.json +1 -0
  183. package/bridge-recipes/unreal/helix-character-creator-female/female-joker-mask.json +1 -0
  184. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.addon.json +1 -0
  185. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes-brown.json +1 -0
  186. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.addon.json +1 -0
  187. package/bridge-recipes/unreal/helix-character-creator-female/female-kombes.json +1 -0
  188. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.addon.json +1 -0
  189. package/bridge-recipes/unreal/helix-character-creator-female/female-marshmallow-mask.json +1 -0
  190. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.addon.json +1 -0
  191. package/bridge-recipes/unreal/helix-character-creator-female/female-maska.json +1 -0
  192. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.addon.json +1 -0
  193. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-pants.json +1 -0
  194. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.addon.json +1 -0
  195. package/bridge-recipes/unreal/helix-character-creator-female/female-nebula-executive-shoes.json +1 -0
  196. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.addon.json +1 -0
  197. package/bridge-recipes/unreal/helix-character-creator-female/female-ninza-costume.json +1 -0
  198. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.addon.json +1 -0
  199. package/bridge-recipes/unreal/helix-character-creator-female/female-orange-kombes.json +1 -0
  200. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.addon.json +1 -0
  201. package/bridge-recipes/unreal/helix-character-creator-female/female-panama.json +1 -0
  202. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.addon.json +1 -0
  203. package/bridge-recipes/unreal/helix-character-creator-female/female-panda-bag-2.json +1 -0
  204. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.addon.json +1 -0
  205. package/bridge-recipes/unreal/helix-character-creator-female/female-pantslow.json +1 -0
  206. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.addon.json +1 -0
  207. package/bridge-recipes/unreal/helix-character-creator-female/female-paper-bag-mask.json +1 -0
  208. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.addon.json +1 -0
  209. package/bridge-recipes/unreal/helix-character-creator-female/female-pig-mask.json +1 -0
  210. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.addon.json +1 -0
  211. package/bridge-recipes/unreal/helix-character-creator-female/female-police-uniform.json +1 -0
  212. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.addon.json +1 -0
  213. package/bridge-recipes/unreal/helix-character-creator-female/female-prison-outfit.json +1 -0
  214. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.addon.json +1 -0
  215. package/bridge-recipes/unreal/helix-character-creator-female/female-short-b4low.json +1 -0
  216. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.addon.json +1 -0
  217. package/bridge-recipes/unreal/helix-character-creator-female/female-short-swimming.json +1 -0
  218. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.addon.json +1 -0
  219. package/bridge-recipes/unreal/helix-character-creator-female/female-shortlow.json +1 -0
  220. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.addon.json +1 -0
  221. package/bridge-recipes/unreal/helix-character-creator-female/female-shorts-b3.json +1 -0
  222. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.addon.json +1 -0
  223. package/bridge-recipes/unreal/helix-character-creator-female/female-sterile-gloves.json +1 -0
  224. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.addon.json +1 -0
  225. package/bridge-recipes/unreal/helix-character-creator-female/female-surgeon-mask.json +1 -0
  226. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.addon.json +1 -0
  227. package/bridge-recipes/unreal/helix-character-creator-female/female-swat.json +1 -0
  228. package/bridge-recipes/unreal/helix-character-creator-female/female-top.addon.json +1 -0
  229. package/bridge-recipes/unreal/helix-character-creator-female/female-top.json +1 -0
  230. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.addon.json +1 -0
  231. package/bridge-recipes/unreal/helix-character-creator-female/female-topx1.json +1 -0
  232. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.addon.json +1 -0
  233. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-hoodie.json +1 -0
  234. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.addon.json +1 -0
  235. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-mask.json +1 -0
  236. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.addon.json +1 -0
  237. package/bridge-recipes/unreal/helix-character-creator-female/female-urban-ghost-pants.json +1 -0
  238. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.addon.json +1 -0
  239. package/bridge-recipes/unreal/helix-character-creator-female/female-warehouse-uniform.json +1 -0
  240. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.addon.json +1 -0
  241. package/bridge-recipes/unreal/helix-character-creator-female/female-wide-top.json +1 -0
  242. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.addon.json +1 -0
  243. package/bridge-recipes/unreal/helix-character-creator-female/female-wolf-set.json +1 -0
  244. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.addon.json +1 -0
  245. package/bridge-recipes/unreal/helix-character-creator-female/female-woman-mask-3.json +1 -0
  246. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.addon.json +1 -0
  247. package/bridge-recipes/unreal/helix-character-creator-female/female-women-out-2.json +1 -0
  248. package/bridge-recipes/unreal/helix-character-creator-female/footwear.addon.json +1 -0
  249. package/bridge-recipes/unreal/helix-character-creator-female/footwear.json +1 -0
  250. package/bridge-recipes/unreal/helix-character-creator-female/gloves.addon.json +1 -0
  251. package/bridge-recipes/unreal/helix-character-creator-female/gloves.json +1 -0
  252. package/bridge-recipes/unreal/helix-character-creator-female/hair.addon.json +1 -0
  253. package/bridge-recipes/unreal/helix-character-creator-female/hair.json +1 -0
  254. package/bridge-recipes/unreal/helix-character-creator-female/headwear.addon.json +1 -0
  255. package/bridge-recipes/unreal/helix-character-creator-female/headwear.json +1 -0
  256. package/bridge-recipes/unreal/helix-character-creator-female/mask.addon.json +1 -0
  257. package/bridge-recipes/unreal/helix-character-creator-female/mask.json +1 -0
  258. package/bridge-recipes/unreal/helix-character-creator-female/neck.addon.json +1 -0
  259. package/bridge-recipes/unreal/helix-character-creator-female/neck.json +1 -0
  260. package/bridge-recipes/unreal/helix-character-creator-female/outfit.addon.json +1 -0
  261. package/bridge-recipes/unreal/helix-character-creator-female/outfit.json +1 -0
  262. package/bridge-recipes/unreal/helix-character-creator-female/top.addon.json +1 -0
  263. package/bridge-recipes/unreal/helix-character-creator-female/top.json +1 -0
  264. package/bridge-recipes/unreal/helix-character-creator-male/README.md +15 -0
  265. package/bridge-recipes/unreal/helix-character-creator-male/all.json +18 -0
  266. package/bridge-recipes/unreal/helix-character-creator-male/back.addon.json +1 -0
  267. package/bridge-recipes/unreal/helix-character-creator-male/back.json +1 -0
  268. package/bridge-recipes/unreal/helix-character-creator-male/base-male-face.json +6 -0
  269. package/bridge-recipes/unreal/helix-character-creator-male/base-male.json +6 -0
  270. package/bridge-recipes/unreal/helix-character-creator-male/bottom.addon.json +1 -0
  271. package/bridge-recipes/unreal/helix-character-creator-male/bottom.json +1 -0
  272. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.addon.json +1 -0
  273. package/bridge-recipes/unreal/helix-character-creator-male/eyewear.json +1 -0
  274. package/bridge-recipes/unreal/helix-character-creator-male/footwear.addon.json +1 -0
  275. package/bridge-recipes/unreal/helix-character-creator-male/footwear.json +1 -0
  276. package/bridge-recipes/unreal/helix-character-creator-male/gloves.addon.json +1 -0
  277. package/bridge-recipes/unreal/helix-character-creator-male/gloves.json +1 -0
  278. package/bridge-recipes/unreal/helix-character-creator-male/hair.addon.json +1 -0
  279. package/bridge-recipes/unreal/helix-character-creator-male/hair.json +1 -0
  280. package/bridge-recipes/unreal/helix-character-creator-male/headwear.addon.json +1 -0
  281. package/bridge-recipes/unreal/helix-character-creator-male/headwear.json +1 -0
  282. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-hair.json +23 -0
  283. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-nebula-urbanghost.json +7 -0
  284. package/bridge-recipes/unreal/helix-character-creator-male/male-batch-uniforms.json +10 -0
  285. package/bridge-recipes/unreal/helix-character-creator-male/male-batch6-slot2.json +7 -0
  286. package/bridge-recipes/unreal/helix-character-creator-male/male-batch7-slot3.json +6 -0
  287. package/bridge-recipes/unreal/helix-character-creator-male/male-batch8-combined.json +11 -0
  288. package/bridge-recipes/unreal/helix-character-creator-male/male-boots-25.addon.json +1 -0
  289. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.addon.json +1 -0
  290. package/bridge-recipes/unreal/helix-character-creator-male/male-cargo-pants.json +1 -0
  291. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.addon.json +1 -0
  292. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-2.json +1 -0
  293. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.addon.json +1 -0
  294. package/bridge-recipes/unreal/helix-character-creator-male/male-carnival-mask-3.json +1 -0
  295. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.addon.json +1 -0
  296. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-pants.json +1 -0
  297. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.addon.json +1 -0
  298. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-shoes.json +1 -0
  299. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.addon.json +1 -0
  300. package/bridge-recipes/unreal/helix-character-creator-male/male-clare-top.json +1 -0
  301. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.addon.json +1 -0
  302. package/bridge-recipes/unreal/helix-character-creator-male/male-diamond-hands.json +1 -0
  303. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.addon.json +1 -0
  304. package/bridge-recipes/unreal/helix-character-creator-male/male-doctor-outfit.json +1 -0
  305. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.addon.json +1 -0
  306. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask-2.json +1 -0
  307. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.addon.json +1 -0
  308. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-hole-mask.json +1 -0
  309. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.addon.json +1 -0
  310. package/bridge-recipes/unreal/helix-character-creator-male/male-eye-patch.json +1 -0
  311. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.addon.json +1 -0
  312. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants-2.json +1 -0
  313. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-cargo-pants.addon.json +1 -0
  314. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.addon.json +1 -0
  315. package/bridge-recipes/unreal/helix-character-creator-male/male-fb-puffy.json +1 -0
  316. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.addon.json +1 -0
  317. package/bridge-recipes/unreal/helix-character-creator-male/male-firefight-outfit.json +1 -0
  318. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.addon.json +1 -0
  319. package/bridge-recipes/unreal/helix-character-creator-male/male-gamer-mask-2.json +1 -0
  320. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.addon.json +1 -0
  321. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a1.json +1 -0
  322. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.addon.json +1 -0
  323. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a10.json +1 -0
  324. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.addon.json +1 -0
  325. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a11.json +1 -0
  326. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.addon.json +1 -0
  327. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a12.json +1 -0
  328. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.addon.json +1 -0
  329. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a13.json +1 -0
  330. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.addon.json +1 -0
  331. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a14.json +1 -0
  332. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.addon.json +1 -0
  333. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a15.json +1 -0
  334. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.addon.json +1 -0
  335. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a16.json +1 -0
  336. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.addon.json +1 -0
  337. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a17.json +1 -0
  338. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.addon.json +1 -0
  339. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a18.json +1 -0
  340. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.addon.json +1 -0
  341. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a19.json +1 -0
  342. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.addon.json +1 -0
  343. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a2.json +1 -0
  344. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.addon.json +1 -0
  345. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a20.json +1 -0
  346. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.addon.json +1 -0
  347. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a21.json +1 -0
  348. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.addon.json +1 -0
  349. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a3.json +1 -0
  350. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.addon.json +1 -0
  351. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a4.json +1 -0
  352. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.addon.json +1 -0
  353. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a5.json +1 -0
  354. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.addon.json +1 -0
  355. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a6.json +1 -0
  356. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.addon.json +1 -0
  357. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a7.json +1 -0
  358. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.addon.json +1 -0
  359. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a8.json +1 -0
  360. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.addon.json +1 -0
  361. package/bridge-recipes/unreal/helix-character-creator-male/male-hair-a9.json +1 -0
  362. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.addon.json +1 -0
  363. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown-v2.json +1 -0
  364. package/bridge-recipes/unreal/helix-character-creator-male/male-kombes-brown.addon.json +1 -0
  365. package/bridge-recipes/unreal/helix-character-creator-male/male-man-mask-3.addon.json +1 -0
  366. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.addon.json +1 -0
  367. package/bridge-recipes/unreal/helix-character-creator-male/male-marshmallow-mask.json +1 -0
  368. package/bridge-recipes/unreal/helix-character-creator-male/male-mikejack-jacket.addon.json +1 -0
  369. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.addon.json +1 -0
  370. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-coat.json +1 -0
  371. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.addon.json +1 -0
  372. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-pants.json +1 -0
  373. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.addon.json +1 -0
  374. package/bridge-recipes/unreal/helix-character-creator-male/male-nebula-executive-shoes.json +1 -0
  375. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.addon.json +1 -0
  376. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-gloves.json +1 -0
  377. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.addon.json +1 -0
  378. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-mantle.json +1 -0
  379. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.addon.json +1 -0
  380. package/bridge-recipes/unreal/helix-character-creator-male/male-neo-arcane-heir-tunic.json +1 -0
  381. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.addon.json +1 -0
  382. package/bridge-recipes/unreal/helix-character-creator-male/male-orangekombes.json +1 -0
  383. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.addon.json +1 -0
  384. package/bridge-recipes/unreal/helix-character-creator-male/male-out2-boots.json +1 -0
  385. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.addon.json +1 -0
  386. package/bridge-recipes/unreal/helix-character-creator-male/male-panda-bag-2.json +1 -0
  387. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.addon.json +1 -0
  388. package/bridge-recipes/unreal/helix-character-creator-male/male-pants-2.json +1 -0
  389. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.addon.json +1 -0
  390. package/bridge-recipes/unreal/helix-character-creator-male/male-paper-bag-mask.json +1 -0
  391. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.addon.json +1 -0
  392. package/bridge-recipes/unreal/helix-character-creator-male/male-pig-mask.json +1 -0
  393. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.addon.json +1 -0
  394. package/bridge-recipes/unreal/helix-character-creator-male/male-police-uniform.json +1 -0
  395. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.addon.json +1 -0
  396. package/bridge-recipes/unreal/helix-character-creator-male/male-prison-outfit.json +1 -0
  397. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.addon.json +1 -0
  398. package/bridge-recipes/unreal/helix-character-creator-male/male-puffer-jacket.json +1 -0
  399. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.addon.json +1 -0
  400. package/bridge-recipes/unreal/helix-character-creator-male/male-pullover-hoodie.json +1 -0
  401. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.addon.json +1 -0
  402. package/bridge-recipes/unreal/helix-character-creator-male/male-robber-mask.json +1 -0
  403. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.addon.json +1 -0
  404. package/bridge-recipes/unreal/helix-character-creator-male/male-short-swimming.json +1 -0
  405. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.addon.json +1 -0
  406. package/bridge-recipes/unreal/helix-character-creator-male/male-sinth-ascetic-jacket.json +1 -0
  407. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.addon.json +1 -0
  408. package/bridge-recipes/unreal/helix-character-creator-male/male-sip-cap.json +1 -0
  409. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.addon.json +1 -0
  410. package/bridge-recipes/unreal/helix-character-creator-male/male-socks.json +1 -0
  411. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.addon.json +1 -0
  412. package/bridge-recipes/unreal/helix-character-creator-male/male-surgeon-mask.json +1 -0
  413. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.addon.json +1 -0
  414. package/bridge-recipes/unreal/helix-character-creator-male/male-tech-hoodie.json +1 -0
  415. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.addon.json +1 -0
  416. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-hoodie.json +1 -0
  417. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.addon.json +1 -0
  418. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-mask.json +1 -0
  419. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.addon.json +1 -0
  420. package/bridge-recipes/unreal/helix-character-creator-male/male-urban-ghost-pants.json +1 -0
  421. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.addon.json +1 -0
  422. package/bridge-recipes/unreal/helix-character-creator-male/male-warehouse-uniform.json +1 -0
  423. package/bridge-recipes/unreal/helix-character-creator-male/mask.addon.json +1 -0
  424. package/bridge-recipes/unreal/helix-character-creator-male/mask.json +1 -0
  425. package/bridge-recipes/unreal/helix-character-creator-male/neck.addon.json +1 -0
  426. package/bridge-recipes/unreal/helix-character-creator-male/neck.json +1 -0
  427. package/bridge-recipes/unreal/helix-character-creator-male/outfit.addon.json +1 -0
  428. package/bridge-recipes/unreal/helix-character-creator-male/outfit.json +1 -0
  429. package/bridge-recipes/unreal/helix-character-creator-male/palette-pilot.json +1 -0
  430. package/bridge-recipes/unreal/helix-character-creator-male/test/recipes.test.js +122 -0
  431. package/bridge-recipes/unreal/helix-character-creator-male/top.addon.json +1 -0
  432. package/bridge-recipes/unreal/helix-character-creator-male/top.json +1 -0
  433. package/bridge-recipes/unreal/helix-character-creator-male/variants/bottom-nopalette.addon.json +1 -0
  434. package/bridge-recipes/unreal/helix-character-creator-male/variants/headwear-nopalette.addon.json +1 -0
  435. package/bridge-recipes/unreal/helix-character-creator-male/variants/neck-nopalette.addon.json +1 -0
  436. package/dist/ability.d.ts +2 -2
  437. package/dist/ability.js +6 -5
  438. package/dist/ability.js.map +1 -1
  439. package/dist/achievement.d.ts +123 -0
  440. package/dist/achievement.js +400 -0
  441. package/dist/achievement.js.map +1 -0
  442. package/dist/api.d.ts +19 -1
  443. package/dist/api.js +80 -6
  444. package/dist/api.js.map +1 -1
  445. package/dist/assets.d.ts +595 -0
  446. package/dist/assets.js +1121 -0
  447. package/dist/assets.js.map +1 -0
  448. package/dist/audioCommand.d.ts +65 -0
  449. package/dist/audioCommand.js +181 -0
  450. package/dist/audioCommand.js.map +1 -0
  451. package/dist/bakeBodyRegionsCli.d.ts +19 -0
  452. package/dist/bakeBodyRegionsCli.js +25 -0
  453. package/dist/bakeBodyRegionsCli.js.map +1 -0
  454. package/dist/bakeLighting.d.ts +173 -0
  455. package/dist/bakeLighting.js +452 -0
  456. package/dist/bakeLighting.js.map +1 -0
  457. package/dist/bridge/bridge.testutil.d.ts +105 -0
  458. package/dist/bridge/bridge.testutil.js +259 -0
  459. package/dist/bridge/bridge.testutil.js.map +1 -0
  460. package/dist/bridge/characterAddon.d.ts +47 -0
  461. package/dist/bridge/characterAddon.js +146 -0
  462. package/dist/bridge/characterAddon.js.map +1 -0
  463. package/dist/bridge/detect.d.ts +4 -0
  464. package/dist/bridge/detect.js +154 -0
  465. package/dist/bridge/detect.js.map +1 -0
  466. package/dist/bridge/execute.d.ts +3 -0
  467. package/dist/bridge/execute.js +206 -0
  468. package/dist/bridge/execute.js.map +1 -0
  469. package/dist/bridge/glb.d.ts +60 -0
  470. package/dist/bridge/glb.js +81 -0
  471. package/dist/bridge/glb.js.map +1 -0
  472. package/dist/bridge/hash.d.ts +6 -0
  473. package/dist/bridge/hash.js +40 -0
  474. package/dist/bridge/hash.js.map +1 -0
  475. package/dist/bridge/index.d.ts +11 -0
  476. package/dist/bridge/index.js +28 -0
  477. package/dist/bridge/index.js.map +1 -0
  478. package/dist/bridge/internal/artifacts.d.ts +5 -0
  479. package/dist/bridge/internal/artifacts.js +31 -0
  480. package/dist/bridge/internal/artifacts.js.map +1 -0
  481. package/dist/bridge/internal/builtInExecution.d.ts +4 -0
  482. package/dist/bridge/internal/builtInExecution.js +514 -0
  483. package/dist/bridge/internal/builtInExecution.js.map +1 -0
  484. package/dist/bridge/internal/externalExecution.d.ts +12 -0
  485. package/dist/bridge/internal/externalExecution.js +261 -0
  486. package/dist/bridge/internal/externalExecution.js.map +1 -0
  487. package/dist/bridge/internal/outputReservation.d.ts +13 -0
  488. package/dist/bridge/internal/outputReservation.js +151 -0
  489. package/dist/bridge/internal/outputReservation.js.map +1 -0
  490. package/dist/bridge/internal/snapshots.d.ts +32 -0
  491. package/dist/bridge/internal/snapshots.js +562 -0
  492. package/dist/bridge/internal/snapshots.js.map +1 -0
  493. package/dist/bridge/management.d.ts +40 -0
  494. package/dist/bridge/management.js +333 -0
  495. package/dist/bridge/management.js.map +1 -0
  496. package/dist/bridge/manifest.d.ts +8 -0
  497. package/dist/bridge/manifest.js +192 -0
  498. package/dist/bridge/manifest.js.map +1 -0
  499. package/dist/bridge/metahuman.d.ts +26 -0
  500. package/dist/bridge/metahuman.js +332 -0
  501. package/dist/bridge/metahuman.js.map +1 -0
  502. package/dist/bridge/planner.d.ts +9 -0
  503. package/dist/bridge/planner.js +246 -0
  504. package/dist/bridge/planner.js.map +1 -0
  505. package/dist/bridge/plugins.d.ts +17 -0
  506. package/dist/bridge/plugins.js +307 -0
  507. package/dist/bridge/plugins.js.map +1 -0
  508. package/dist/bridge/resolution.d.ts +8 -0
  509. package/dist/bridge/resolution.js +55 -0
  510. package/dist/bridge/resolution.js.map +1 -0
  511. package/dist/bridge/types.d.ts +247 -0
  512. package/dist/bridge/types.js +60 -0
  513. package/dist/bridge/types.js.map +1 -0
  514. package/dist/bridge/validate.d.ts +12 -0
  515. package/dist/bridge/validate.js +370 -0
  516. package/dist/bridge/validate.js.map +1 -0
  517. package/dist/bridge/zipSource.d.ts +27 -0
  518. package/dist/bridge/zipSource.js +90 -0
  519. package/dist/bridge/zipSource.js.map +1 -0
  520. package/dist/browser/hostSlots.d.ts +57 -0
  521. package/dist/browser/hostSlots.js +371 -0
  522. package/dist/browser/hostSlots.js.map +1 -0
  523. package/dist/browser/launch.d.ts +25 -0
  524. package/dist/browser/launch.js +74 -0
  525. package/dist/browser/launch.js.map +1 -0
  526. package/dist/browser/nonSystemChrome.d.ts +15 -0
  527. package/dist/browser/nonSystemChrome.js +91 -0
  528. package/dist/browser/nonSystemChrome.js.map +1 -0
  529. package/dist/builds/index.d.ts +54 -0
  530. package/dist/builds/index.js +215 -0
  531. package/dist/builds/index.js.map +1 -0
  532. package/dist/bundle.d.ts +35 -2
  533. package/dist/bundle.js +437 -20
  534. package/dist/bundle.js.map +1 -1
  535. package/dist/canary/cli.d.ts +17 -0
  536. package/dist/canary/cli.js +95 -0
  537. package/dist/canary/cli.js.map +1 -0
  538. package/dist/canary/index.d.ts +4 -0
  539. package/dist/canary/index.js +21 -0
  540. package/dist/canary/index.js.map +1 -0
  541. package/dist/canary/inventory.d.ts +46 -0
  542. package/dist/canary/inventory.js +499 -0
  543. package/dist/canary/inventory.js.map +1 -0
  544. package/dist/canary/pacifica.d.ts +51 -0
  545. package/dist/canary/pacifica.js +247 -0
  546. package/dist/canary/pacifica.js.map +1 -0
  547. package/dist/canary/plan.d.ts +115 -0
  548. package/dist/canary/plan.js +479 -0
  549. package/dist/canary/plan.js.map +1 -0
  550. package/dist/character/addonPushOut.d.ts +66 -0
  551. package/dist/character/addonPushOut.js +211 -0
  552. package/dist/character/addonPushOut.js.map +1 -0
  553. package/dist/character/avatarPreflight.d.ts +92 -0
  554. package/dist/character/avatarPreflight.js +261 -0
  555. package/dist/character/avatarPreflight.js.map +1 -0
  556. package/dist/character/bakeBodyRegions.d.ts +80 -0
  557. package/dist/character/bakeBodyRegions.js +190 -0
  558. package/dist/character/bakeBodyRegions.js.map +1 -0
  559. package/dist/character/baseColorGuard.d.ts +62 -0
  560. package/dist/character/baseColorGuard.js +141 -0
  561. package/dist/character/baseColorGuard.js.map +1 -0
  562. package/dist/character/bodyGeometryGuard.d.ts +243 -0
  563. package/dist/character/bodyGeometryGuard.js +417 -0
  564. package/dist/character/bodyGeometryGuard.js.map +1 -0
  565. package/dist/character/bodyRegionHide.d.ts +57 -0
  566. package/dist/character/bodyRegionHide.js +97 -0
  567. package/dist/character/bodyRegionHide.js.map +1 -0
  568. package/dist/character/composeBaseMale.d.ts +25 -0
  569. package/dist/character/composeBaseMale.js +712 -0
  570. package/dist/character/composeBaseMale.js.map +1 -0
  571. package/dist/character/esm.js +3 -1
  572. package/dist/character/esm.js.map +1 -1
  573. package/dist/character/faceManifest.d.ts +53 -0
  574. package/dist/character/faceManifest.js +256 -0
  575. package/dist/character/faceManifest.js.map +1 -0
  576. package/dist/character/fbx.d.ts +70 -0
  577. package/dist/character/fbx.js +396 -0
  578. package/dist/character/fbx.js.map +1 -0
  579. package/dist/character/fitGarmentFile.d.ts +39 -0
  580. package/dist/character/fitGarmentFile.js +53 -0
  581. package/dist/character/fitGarmentFile.js.map +1 -0
  582. package/dist/character/helixPalette.d.ts +68 -0
  583. package/dist/character/helixPalette.js +183 -0
  584. package/dist/character/helixPalette.js.map +1 -0
  585. package/dist/character/hideCoverage.d.ts +135 -0
  586. package/dist/character/hideCoverage.js +450 -0
  587. package/dist/character/hideCoverage.js.map +1 -0
  588. package/dist/character/imageLimits.d.ts +3 -0
  589. package/dist/character/imageLimits.js +7 -0
  590. package/dist/character/imageLimits.js.map +1 -0
  591. package/dist/character/importCharacter.d.ts +188 -10
  592. package/dist/character/importCharacter.js +854 -76
  593. package/dist/character/importCharacter.js.map +1 -1
  594. package/dist/character/importTrust.d.ts +11 -0
  595. package/dist/character/importTrust.js +56 -0
  596. package/dist/character/importTrust.js.map +1 -0
  597. package/dist/character/ktx2Decode.d.ts +11 -0
  598. package/dist/character/ktx2Decode.js +87 -0
  599. package/dist/character/ktx2Decode.js.map +1 -0
  600. package/dist/character/mat4.d.ts +7 -0
  601. package/dist/character/mat4.js +25 -2
  602. package/dist/character/mat4.js.map +1 -1
  603. package/dist/character/meshyToHelixMap.d.ts +14 -0
  604. package/dist/character/meshyToHelixMap.js +155 -3
  605. package/dist/character/meshyToHelixMap.js.map +1 -1
  606. package/dist/character/metahumanToHelixMap.d.ts +2 -0
  607. package/dist/character/metahumanToHelixMap.js +34 -0
  608. package/dist/character/metahumanToHelixMap.js.map +1 -0
  609. package/dist/character/normalMapGuard.d.ts +59 -0
  610. package/dist/character/normalMapGuard.js +139 -0
  611. package/dist/character/normalMapGuard.js.map +1 -0
  612. package/dist/character/quat.js +2 -2
  613. package/dist/character/quat.js.map +1 -1
  614. package/dist/character/reframeSkeletonFile.d.ts +19 -0
  615. package/dist/character/reframeSkeletonFile.js +45 -0
  616. package/dist/character/reframeSkeletonFile.js.map +1 -0
  617. package/dist/character/repairLodSkeletonsFile.d.ts +25 -0
  618. package/dist/character/repairLodSkeletonsFile.js +49 -0
  619. package/dist/character/repairLodSkeletonsFile.js.map +1 -0
  620. package/dist/character/restFrameGuard.d.ts +52 -0
  621. package/dist/character/restFrameGuard.js +90 -0
  622. package/dist/character/restFrameGuard.js.map +1 -0
  623. package/dist/character/slotBudgets.d.ts +37 -0
  624. package/dist/character/slotBudgets.generated.d.ts +15 -0
  625. package/dist/character/slotBudgets.generated.js +110 -0
  626. package/dist/character/slotBudgets.generated.js.map +1 -0
  627. package/dist/character/slotBudgets.js +45 -0
  628. package/dist/character/slotBudgets.js.map +1 -0
  629. package/dist/character/stages/atlasMaterials.d.ts +53 -0
  630. package/dist/character/stages/atlasMaterials.js +246 -0
  631. package/dist/character/stages/atlasMaterials.js.map +1 -0
  632. package/dist/character/stages/bakeTexture.d.ts +28 -7
  633. package/dist/character/stages/bakeTexture.js +586 -108
  634. package/dist/character/stages/bakeTexture.js.map +1 -1
  635. package/dist/character/stages/conform.d.ts +54 -9
  636. package/dist/character/stages/conform.js +686 -113
  637. package/dist/character/stages/conform.js.map +1 -1
  638. package/dist/character/stages/earClearance.d.ts +105 -0
  639. package/dist/character/stages/earClearance.js +480 -0
  640. package/dist/character/stages/earClearance.js.map +1 -0
  641. package/dist/character/stages/faceRegion.d.ts +55 -0
  642. package/dist/character/stages/faceRegion.js +183 -0
  643. package/dist/character/stages/faceRegion.js.map +1 -0
  644. package/dist/character/stages/firstPersonHide.d.ts +42 -0
  645. package/dist/character/stages/firstPersonHide.js +140 -0
  646. package/dist/character/stages/firstPersonHide.js.map +1 -0
  647. package/dist/character/stages/joinPerMesh.d.ts +18 -0
  648. package/dist/character/stages/joinPerMesh.js +46 -0
  649. package/dist/character/stages/joinPerMesh.js.map +1 -0
  650. package/dist/character/stages/ktx2.d.ts +6 -4
  651. package/dist/character/stages/ktx2.js +81 -29
  652. package/dist/character/stages/ktx2.js.map +1 -1
  653. package/dist/character/stages/limbBridge.d.ts +114 -0
  654. package/dist/character/stages/limbBridge.js +1286 -0
  655. package/dist/character/stages/limbBridge.js.map +1 -0
  656. package/dist/character/stages/mergeLods.d.ts +19 -0
  657. package/dist/character/stages/mergeLods.js +58 -2
  658. package/dist/character/stages/mergeLods.js.map +1 -1
  659. package/dist/character/stages/poseAwareFit.d.ts +192 -0
  660. package/dist/character/stages/poseAwareFit.js +417 -0
  661. package/dist/character/stages/poseAwareFit.js.map +1 -0
  662. package/dist/character/stages/poseFit/math.d.ts +141 -0
  663. package/dist/character/stages/poseFit/math.js +514 -0
  664. package/dist/character/stages/poseFit/math.js.map +1 -0
  665. package/dist/character/stages/poseFit/measure.d.ts +88 -0
  666. package/dist/character/stages/poseFit/measure.js +148 -0
  667. package/dist/character/stages/poseFit/measure.js.map +1 -0
  668. package/dist/character/stages/poseFit/model.d.ts +46 -0
  669. package/dist/character/stages/poseFit/model.js +147 -0
  670. package/dist/character/stages/poseFit/model.js.map +1 -0
  671. package/dist/character/stages/poseFit/offsetField.d.ts +76 -0
  672. package/dist/character/stages/poseFit/offsetField.js +249 -0
  673. package/dist/character/stages/poseFit/offsetField.js.map +1 -0
  674. package/dist/character/stages/poseFit/posing.d.ts +52 -0
  675. package/dist/character/stages/poseFit/posing.js +330 -0
  676. package/dist/character/stages/poseFit/posing.js.map +1 -0
  677. package/dist/character/stages/poseFit/testRig.d.ts +31 -0
  678. package/dist/character/stages/poseFit/testRig.js +85 -0
  679. package/dist/character/stages/poseFit/testRig.js.map +1 -0
  680. package/dist/character/stages/reframeSkeletonToHost.d.ts +35 -0
  681. package/dist/character/stages/reframeSkeletonToHost.js +111 -0
  682. package/dist/character/stages/reframeSkeletonToHost.js.map +1 -0
  683. package/dist/character/stages/report.js +0 -2
  684. package/dist/character/stages/report.js.map +1 -1
  685. package/dist/character/stages/resizeTextures.js +4 -4
  686. package/dist/character/stages/resizeTextures.js.map +1 -1
  687. package/dist/character/stages/retarget.d.ts +26 -2
  688. package/dist/character/stages/retarget.js +52 -4
  689. package/dist/character/stages/retarget.js.map +1 -1
  690. package/dist/character/stages/retargetClip.d.ts +6 -2
  691. package/dist/character/stages/retargetClip.js +109 -17
  692. package/dist/character/stages/retargetClip.js.map +1 -1
  693. package/dist/character/stages/sanitizeMaterials.d.ts +39 -0
  694. package/dist/character/stages/sanitizeMaterials.js +136 -0
  695. package/dist/character/stages/sanitizeMaterials.js.map +1 -0
  696. package/dist/character/stages/simplifyMesh.js +6 -3
  697. package/dist/character/stages/simplifyMesh.js.map +1 -1
  698. package/dist/character/stages/splitFacePrimitive.js +0 -2
  699. package/dist/character/stages/splitFacePrimitive.js.map +1 -1
  700. package/dist/character/stages/splitSharedLodSkeletons.d.ts +31 -0
  701. package/dist/character/stages/splitSharedLodSkeletons.js +104 -0
  702. package/dist/character/stages/splitSharedLodSkeletons.js.map +1 -0
  703. package/dist/character/stages/unifyMaterial.d.ts +66 -0
  704. package/dist/character/stages/unifyMaterial.js +136 -0
  705. package/dist/character/stages/unifyMaterial.js.map +1 -0
  706. package/dist/character/stages/vrmDynamics.d.ts +144 -0
  707. package/dist/character/stages/vrmDynamics.js +421 -0
  708. package/dist/character/stages/vrmDynamics.js.map +1 -0
  709. package/dist/character/stages/vrmFace.d.ts +82 -0
  710. package/dist/character/stages/vrmFace.js +280 -0
  711. package/dist/character/stages/vrmFace.js.map +1 -0
  712. package/dist/character/stages/weldedSimplify.d.ts +15 -1
  713. package/dist/character/stages/weldedSimplify.js +90 -9
  714. package/dist/character/stages/weldedSimplify.js.map +1 -1
  715. package/dist/character/testutil/meshyBridgeFixture.d.ts +33 -0
  716. package/dist/character/testutil/meshyBridgeFixture.js +219 -0
  717. package/dist/character/testutil/meshyBridgeFixture.js.map +1 -0
  718. package/dist/character/testutil/meshyHead.d.ts +19 -0
  719. package/dist/character/testutil/meshyHead.js +99 -0
  720. package/dist/character/testutil/meshyHead.js.map +1 -0
  721. package/dist/character/testutil/meshyRig.d.ts +17 -0
  722. package/dist/character/testutil/meshyRig.js +117 -0
  723. package/dist/character/testutil/meshyRig.js.map +1 -0
  724. package/dist/character/testutil/slotBudgetExpectations.d.ts +11 -0
  725. package/dist/character/testutil/slotBudgetExpectations.js +21 -0
  726. package/dist/character/testutil/slotBudgetExpectations.js.map +1 -0
  727. package/dist/character/testutil/syntheticRig.d.ts +12 -1
  728. package/dist/character/testutil/syntheticRig.js +88 -3
  729. package/dist/character/testutil/syntheticRig.js.map +1 -1
  730. package/dist/character/unrealMaterialSidecar.d.ts +94 -0
  731. package/dist/character/unrealMaterialSidecar.js +879 -0
  732. package/dist/character/unrealMaterialSidecar.js.map +1 -0
  733. package/dist/character/untrustedSource.d.ts +54 -0
  734. package/dist/character/untrustedSource.js +181 -0
  735. package/dist/character/untrustedSource.js.map +1 -0
  736. package/dist/character/vrmCharacter.d.ts +156 -0
  737. package/dist/character/vrmCharacter.js +678 -0
  738. package/dist/character/vrmCharacter.js.map +1 -0
  739. package/dist/config.d.ts +5 -0
  740. package/dist/config.js +72 -24
  741. package/dist/config.js.map +1 -1
  742. package/dist/continuum/adminPackagePinCommand.d.ts +14 -0
  743. package/dist/continuum/adminPackagePinCommand.js +46 -0
  744. package/dist/continuum/adminPackagePinCommand.js.map +1 -0
  745. package/dist/continuum/adminPackagePublishCommand.d.ts +13 -0
  746. package/dist/continuum/adminPackagePublishCommand.js +22 -0
  747. package/dist/continuum/adminPackagePublishCommand.js.map +1 -0
  748. package/dist/continuum/authoring.d.ts +52 -0
  749. package/dist/continuum/authoring.js +143 -0
  750. package/dist/continuum/authoring.js.map +1 -0
  751. package/dist/continuum/characterMigrationGenerator.d.ts +17 -0
  752. package/dist/continuum/characterMigrationGenerator.js +242 -0
  753. package/dist/continuum/characterMigrationGenerator.js.map +1 -0
  754. package/dist/continuum/cli.d.ts +69 -0
  755. package/dist/continuum/cli.js +145 -0
  756. package/dist/continuum/cli.js.map +1 -0
  757. package/dist/continuum/cliAuthority.d.ts +17 -0
  758. package/dist/continuum/cliAuthority.js +28 -0
  759. package/dist/continuum/cliAuthority.js.map +1 -0
  760. package/dist/continuum/client.d.ts +103 -0
  761. package/dist/continuum/client.js +190 -0
  762. package/dist/continuum/client.js.map +1 -0
  763. package/dist/continuum/homeScenePackage.d.ts +159 -0
  764. package/dist/continuum/homeScenePackage.js +267 -0
  765. package/dist/continuum/homeScenePackage.js.map +1 -0
  766. package/dist/continuum/homeScenePackageCommand.d.ts +44 -0
  767. package/dist/continuum/homeScenePackageCommand.js +107 -0
  768. package/dist/continuum/homeScenePackageCommand.js.map +1 -0
  769. package/dist/continuum/identity.d.ts +4 -0
  770. package/dist/continuum/identity.js +20 -0
  771. package/dist/continuum/identity.js.map +1 -0
  772. package/dist/continuum/index.d.ts +11 -0
  773. package/dist/continuum/index.js +28 -0
  774. package/dist/continuum/index.js.map +1 -0
  775. package/dist/continuum/missingNormals.d.ts +48 -0
  776. package/dist/continuum/missingNormals.js +99 -0
  777. package/dist/continuum/missingNormals.js.map +1 -0
  778. package/dist/continuum/objectUpload.d.ts +64 -0
  779. package/dist/continuum/objectUpload.js +375 -0
  780. package/dist/continuum/objectUpload.js.map +1 -0
  781. package/dist/continuum/pull.d.ts +22 -0
  782. package/dist/continuum/pull.js +47 -0
  783. package/dist/continuum/pull.js.map +1 -0
  784. package/dist/continuum/sourceBundle.d.ts +18 -0
  785. package/dist/continuum/sourceBundle.js +160 -0
  786. package/dist/continuum/sourceBundle.js.map +1 -0
  787. package/dist/continuum/state.d.ts +41 -0
  788. package/dist/continuum/state.js +198 -0
  789. package/dist/continuum/state.js.map +1 -0
  790. package/dist/continuum/types.d.ts +156 -0
  791. package/dist/continuum/types.js +6 -0
  792. package/dist/continuum/types.js.map +1 -0
  793. package/dist/continuum/workflow.d.ts +62 -0
  794. package/dist/continuum/workflow.js +592 -0
  795. package/dist/continuum/workflow.js.map +1 -0
  796. package/dist/cs2/areas.d.ts +41 -0
  797. package/dist/cs2/areas.js +82 -0
  798. package/dist/cs2/areas.js.map +1 -0
  799. package/dist/cs2/binary.d.ts +10 -0
  800. package/dist/cs2/binary.js +59 -0
  801. package/dist/cs2/binary.js.map +1 -0
  802. package/dist/cs2/cityLegacy.d.ts +29 -0
  803. package/dist/cs2/cityLegacy.js +48 -0
  804. package/dist/cs2/cityLegacy.js.map +1 -0
  805. package/dist/cs2/convert/areas.d.ts +32 -0
  806. package/dist/cs2/convert/areas.js +96 -0
  807. package/dist/cs2/convert/areas.js.map +1 -0
  808. package/dist/cs2/convert/glb.d.ts +48 -0
  809. package/dist/cs2/convert/glb.js +178 -0
  810. package/dist/cs2/convert/glb.js.map +1 -0
  811. package/dist/cs2/convert/markings.d.ts +96 -0
  812. package/dist/cs2/convert/markings.js +329 -0
  813. package/dist/cs2/convert/markings.js.map +1 -0
  814. package/dist/cs2/convert/nodeSeams.d.ts +20 -0
  815. package/dist/cs2/convert/nodeSeams.js +164 -0
  816. package/dist/cs2/convert/nodeSeams.js.map +1 -0
  817. package/dist/cs2/convert/roadBake.d.ts +112 -0
  818. package/dist/cs2/convert/roadBake.js +290 -0
  819. package/dist/cs2/convert/roadBake.js.map +1 -0
  820. package/dist/cs2/convert/roads.d.ts +110 -0
  821. package/dist/cs2/convert/roads.js +419 -0
  822. package/dist/cs2/convert/roads.js.map +1 -0
  823. package/dist/cs2/convert/terrain.d.ts +67 -0
  824. package/dist/cs2/convert/terrain.js +141 -0
  825. package/dist/cs2/convert/terrain.js.map +1 -0
  826. package/dist/cs2/convert/terrainConform.d.ts +58 -0
  827. package/dist/cs2/convert/terrainConform.js +284 -0
  828. package/dist/cs2/convert/terrainConform.js.map +1 -0
  829. package/dist/cs2/convert/treeRoadClearance.d.ts +17 -0
  830. package/dist/cs2/convert/treeRoadClearance.js +78 -0
  831. package/dist/cs2/convert/treeRoadClearance.js.map +1 -0
  832. package/dist/cs2/convert/trees.d.ts +33 -0
  833. package/dist/cs2/convert/trees.js +68 -0
  834. package/dist/cs2/convert/trees.js.map +1 -0
  835. package/dist/cs2/csm2.d.ts +58 -0
  836. package/dist/cs2/csm2.js +188 -0
  837. package/dist/cs2/csm2.js.map +1 -0
  838. package/dist/cs2/fixtures.d.ts +5 -0
  839. package/dist/cs2/fixtures.js +15 -0
  840. package/dist/cs2/fixtures.js.map +1 -0
  841. package/dist/cs2/impostors.d.ts +31 -0
  842. package/dist/cs2/impostors.js +42 -0
  843. package/dist/cs2/impostors.js.map +1 -0
  844. package/dist/cs2/index.d.ts +22 -0
  845. package/dist/cs2/index.js +191 -0
  846. package/dist/cs2/index.js.map +1 -0
  847. package/dist/cs2/inspect.d.ts +81 -0
  848. package/dist/cs2/inspect.js +181 -0
  849. package/dist/cs2/inspect.js.map +1 -0
  850. package/dist/cs2/lods.d.ts +22 -0
  851. package/dist/cs2/lods.js +136 -0
  852. package/dist/cs2/lods.js.map +1 -0
  853. package/dist/cs2/materials.d.ts +43 -0
  854. package/dist/cs2/materials.js +137 -0
  855. package/dist/cs2/materials.js.map +1 -0
  856. package/dist/cs2/placements.d.ts +57 -0
  857. package/dist/cs2/placements.js +116 -0
  858. package/dist/cs2/placements.js.map +1 -0
  859. package/dist/cs2/roadPieces.d.ts +79 -0
  860. package/dist/cs2/roadPieces.js +263 -0
  861. package/dist/cs2/roadPieces.js.map +1 -0
  862. package/dist/cs2/roads.d.ts +92 -0
  863. package/dist/cs2/roads.js +329 -0
  864. package/dist/cs2/roads.js.map +1 -0
  865. package/dist/cs2/terrain.d.ts +37 -0
  866. package/dist/cs2/terrain.js +91 -0
  867. package/dist/cs2/terrain.js.map +1 -0
  868. package/dist/cs2/types.d.ts +444 -0
  869. package/dist/cs2/types.js +22 -0
  870. package/dist/cs2/types.js.map +1 -0
  871. package/dist/cs2/water.d.ts +26 -0
  872. package/dist/cs2/water.js +58 -0
  873. package/dist/cs2/water.js.map +1 -0
  874. package/dist/currency.d.ts +94 -0
  875. package/dist/currency.js +425 -0
  876. package/dist/currency.js.map +1 -0
  877. package/dist/dev/devServer.d.ts +53 -0
  878. package/dist/dev/devServer.js +228 -0
  879. package/dist/dev/devServer.js.map +1 -0
  880. package/dist/dev/shellPage.d.ts +3 -0
  881. package/dist/dev/shellPage.js +297 -0
  882. package/dist/dev/shellPage.js.map +1 -0
  883. package/dist/dev/state.d.ts +84 -0
  884. package/dist/dev/state.js +265 -0
  885. package/dist/dev/state.js.map +1 -0
  886. package/dist/device.d.ts +104 -0
  887. package/dist/device.js +2744 -0
  888. package/dist/device.js.map +1 -0
  889. package/dist/deviceActionValidation.d.ts +21 -0
  890. package/dist/deviceActionValidation.js +460 -0
  891. package/dist/deviceActionValidation.js.map +1 -0
  892. package/dist/distribution.d.ts +69 -0
  893. package/dist/distribution.js +138 -0
  894. package/dist/distribution.js.map +1 -0
  895. package/dist/enginePins.d.ts +45 -0
  896. package/dist/enginePins.js +134 -0
  897. package/dist/enginePins.js.map +1 -0
  898. package/dist/gesture/axisReference.d.ts +22 -0
  899. package/dist/gesture/axisReference.js +32 -0
  900. package/dist/gesture/axisReference.js.map +1 -0
  901. package/dist/gesture/capture.d.ts +84 -0
  902. package/dist/gesture/capture.js +303 -0
  903. package/dist/gesture/capture.js.map +1 -0
  904. package/dist/gesture/harnessPage.d.ts +23 -0
  905. package/dist/gesture/harnessPage.js +153 -0
  906. package/dist/gesture/harnessPage.js.map +1 -0
  907. package/dist/gesture/inspect.d.ts +189 -0
  908. package/dist/gesture/inspect.js +678 -0
  909. package/dist/gesture/inspect.js.map +1 -0
  910. package/dist/gesture/rig.d.ts +12 -0
  911. package/dist/gesture/rig.js +111 -0
  912. package/dist/gesture/rig.js.map +1 -0
  913. package/dist/gesture/worldRuntime.d.ts +65 -0
  914. package/dist/gesture/worldRuntime.js +110 -0
  915. package/dist/gesture/worldRuntime.js.map +1 -0
  916. package/dist/glb/draw-calls.d.ts +60 -0
  917. package/dist/glb/draw-calls.js +160 -0
  918. package/dist/glb/draw-calls.js.map +1 -0
  919. package/dist/glb/glb-summary.d.ts +68 -0
  920. package/dist/glb/glb-summary.js +450 -0
  921. package/dist/glb/glb-summary.js.map +1 -0
  922. package/dist/glb/index.d.ts +12 -0
  923. package/dist/glb/index.js +24 -0
  924. package/dist/glb/index.js.map +1 -0
  925. package/dist/glb/smooth-normals.d.ts +98 -0
  926. package/dist/glb/smooth-normals.js +395 -0
  927. package/dist/glb/smooth-normals.js.map +1 -0
  928. package/dist/index.d.ts +1 -1
  929. package/dist/index.js +6786 -128
  930. package/dist/index.js.map +1 -1
  931. package/dist/init.d.ts +35 -1
  932. package/dist/init.js +1115 -47
  933. package/dist/init.js.map +1 -1
  934. package/dist/install.d.ts +16 -5
  935. package/dist/install.js +123 -23
  936. package/dist/install.js.map +1 -1
  937. package/dist/interactable.d.ts +154 -0
  938. package/dist/interactable.js +1219 -0
  939. package/dist/interactable.js.map +1 -0
  940. package/dist/item.d.ts +217 -0
  941. package/dist/item.js +892 -0
  942. package/dist/item.js.map +1 -0
  943. package/dist/itemDef/distribute.d.ts +17 -0
  944. package/dist/itemDef/distribute.js +29 -0
  945. package/dist/itemDef/distribute.js.map +1 -0
  946. package/dist/itemDef/emoteRules.d.ts +85 -0
  947. package/dist/itemDef/emoteRules.js +368 -0
  948. package/dist/itemDef/emoteRules.js.map +1 -0
  949. package/dist/itemDef/gunConfigRules.d.ts +24 -0
  950. package/dist/itemDef/gunConfigRules.js +300 -0
  951. package/dist/itemDef/gunConfigRules.js.map +1 -0
  952. package/dist/itemDef/inspect.d.ts +19 -0
  953. package/dist/itemDef/inspect.js +144 -0
  954. package/dist/itemDef/inspect.js.map +1 -0
  955. package/dist/itemDef/scaffold.d.ts +41 -0
  956. package/dist/itemDef/scaffold.js +303 -0
  957. package/dist/itemDef/scaffold.js.map +1 -0
  958. package/dist/itemDef/tables.d.ts +81 -0
  959. package/dist/itemDef/tables.js +226 -0
  960. package/dist/itemDef/tables.js.map +1 -0
  961. package/dist/itemDef/validate.d.ts +30 -0
  962. package/dist/itemDef/validate.js +175 -0
  963. package/dist/itemDef/validate.js.map +1 -0
  964. package/dist/itemPublishVersion.d.ts +46 -0
  965. package/dist/itemPublishVersion.js +242 -0
  966. package/dist/itemPublishVersion.js.map +1 -0
  967. package/dist/itemSearch.d.ts +128 -0
  968. package/dist/itemSearch.js +140 -0
  969. package/dist/itemSearch.js.map +1 -0
  970. package/dist/itemSetVersion.d.ts +77 -0
  971. package/dist/itemSetVersion.js +170 -0
  972. package/dist/itemSetVersion.js.map +1 -0
  973. package/dist/itemThumbnail.d.ts +40 -0
  974. package/dist/itemThumbnail.js +116 -0
  975. package/dist/itemThumbnail.js.map +1 -0
  976. package/dist/lib.d.ts +571 -7
  977. package/dist/lib.js +1178 -15
  978. package/dist/lib.js.map +1 -1
  979. package/dist/looks.d.ts +103 -0
  980. package/dist/looks.js +102 -0
  981. package/dist/looks.js.map +1 -0
  982. package/dist/materials/availability.d.ts +8 -0
  983. package/dist/materials/availability.js +22 -0
  984. package/dist/materials/availability.js.map +1 -0
  985. package/dist/materials/identity.d.ts +30 -0
  986. package/dist/materials/identity.js +68 -0
  987. package/dist/materials/identity.js.map +1 -0
  988. package/dist/materials/pins.d.ts +23 -0
  989. package/dist/materials/pins.js +93 -0
  990. package/dist/materials/pins.js.map +1 -0
  991. package/dist/mesh/surfaceBvh.d.ts +13 -0
  992. package/dist/mesh/surfaceBvh.js +197 -0
  993. package/dist/mesh/surfaceBvh.js.map +1 -0
  994. package/dist/module-validation.d.ts +2 -0
  995. package/dist/module-validation.js +24 -0
  996. package/dist/module-validation.js.map +1 -0
  997. package/dist/money.d.ts +183 -0
  998. package/dist/money.js +299 -0
  999. package/dist/money.js.map +1 -0
  1000. package/dist/npc/capture.d.ts +41 -0
  1001. package/dist/npc/capture.js +99 -0
  1002. package/dist/npc/capture.js.map +1 -0
  1003. package/dist/npc/format.d.ts +2 -0
  1004. package/dist/npc/format.js +102 -0
  1005. package/dist/npc/format.js.map +1 -0
  1006. package/dist/npc/inspect.d.ts +23 -0
  1007. package/dist/npc/inspect.js +54 -0
  1008. package/dist/npc/inspect.js.map +1 -0
  1009. package/dist/npc/metrics.d.ts +132 -0
  1010. package/dist/npc/metrics.js +214 -0
  1011. package/dist/npc/metrics.js.map +1 -0
  1012. package/dist/npc/session.d.ts +35 -0
  1013. package/dist/npc/session.js +172 -0
  1014. package/dist/npc/session.js.map +1 -0
  1015. package/dist/pack/locomotionReference.d.ts +40 -0
  1016. package/dist/pack/locomotionReference.js +132 -0
  1017. package/dist/pack/locomotionReference.js.map +1 -0
  1018. package/dist/pack/scaffold.d.ts +15 -0
  1019. package/dist/pack/scaffold.js +144 -0
  1020. package/dist/pack/scaffold.js.map +1 -0
  1021. package/dist/pack/validate.d.ts +67 -0
  1022. package/dist/pack/validate.js +317 -0
  1023. package/dist/pack/validate.js.map +1 -0
  1024. package/dist/package.d.ts +14 -1
  1025. package/dist/package.js +106 -7
  1026. package/dist/package.js.map +1 -1
  1027. package/dist/paletteShowcase.d.ts +183 -0
  1028. package/dist/paletteShowcase.js +454 -0
  1029. package/dist/paletteShowcase.js.map +1 -0
  1030. package/dist/paletteShowcaseProfiles.d.ts +112 -0
  1031. package/dist/paletteShowcaseProfiles.js +121 -0
  1032. package/dist/paletteShowcaseProfiles.js.map +1 -0
  1033. package/dist/paths.d.ts +4 -0
  1034. package/dist/paths.js +11 -0
  1035. package/dist/paths.js.map +1 -0
  1036. package/dist/placementRequest.d.ts +37 -0
  1037. package/dist/placementRequest.js +220 -0
  1038. package/dist/placementRequest.js.map +1 -0
  1039. package/dist/placements/assets.d.ts +7 -0
  1040. package/dist/placements/assets.js +114 -0
  1041. package/dist/placements/assets.js.map +1 -0
  1042. package/dist/placements/attachFoliageLods.d.ts +4 -0
  1043. package/dist/placements/attachFoliageLods.js +70 -0
  1044. package/dist/placements/attachFoliageLods.js.map +1 -0
  1045. package/dist/placements/attachImpostors.d.ts +3 -0
  1046. package/dist/placements/attachImpostors.js +51 -0
  1047. package/dist/placements/attachImpostors.js.map +1 -0
  1048. package/dist/placements/authored.d.ts +11 -0
  1049. package/dist/placements/authored.js +65 -0
  1050. package/dist/placements/authored.js.map +1 -0
  1051. package/dist/placements/bake.d.ts +2 -0
  1052. package/dist/placements/bake.js +235 -0
  1053. package/dist/placements/bake.js.map +1 -0
  1054. package/dist/placements/captureHost.d.ts +4 -0
  1055. package/dist/placements/captureHost.js +125 -0
  1056. package/dist/placements/captureHost.js.map +1 -0
  1057. package/dist/placements/foliageCapture.d.ts +2 -0
  1058. package/dist/placements/foliageCapture.js +98 -0
  1059. package/dist/placements/foliageCapture.js.map +1 -0
  1060. package/dist/placements/foliageCards.d.ts +17 -0
  1061. package/dist/placements/foliageCards.js +120 -0
  1062. package/dist/placements/foliageCards.js.map +1 -0
  1063. package/dist/placements/foliageLods.d.ts +8 -0
  1064. package/dist/placements/foliageLods.js +240 -0
  1065. package/dist/placements/foliageLods.js.map +1 -0
  1066. package/dist/placements/foliageTexture.d.ts +4 -0
  1067. package/dist/placements/foliageTexture.js +91 -0
  1068. package/dist/placements/foliageTexture.js.map +1 -0
  1069. package/dist/placements/impostorCapture.d.ts +2 -0
  1070. package/dist/placements/impostorCapture.js +111 -0
  1071. package/dist/placements/impostorCapture.js.map +1 -0
  1072. package/dist/placements/impostors.d.ts +18 -0
  1073. package/dist/placements/impostors.js +279 -0
  1074. package/dist/placements/impostors.js.map +1 -0
  1075. package/dist/placements/source.d.ts +53 -0
  1076. package/dist/placements/source.js +111 -0
  1077. package/dist/placements/source.js.map +1 -0
  1078. package/dist/product.d.ts +84 -0
  1079. package/dist/product.js +285 -0
  1080. package/dist/product.js.map +1 -0
  1081. package/dist/publications.d.ts +116 -0
  1082. package/dist/publications.js +180 -0
  1083. package/dist/publications.js.map +1 -0
  1084. package/dist/publishDuplicateGuard.d.ts +92 -0
  1085. package/dist/publishDuplicateGuard.js +128 -0
  1086. package/dist/publishDuplicateGuard.js.map +1 -0
  1087. package/dist/realizability.d.ts +36 -0
  1088. package/dist/realizability.js +269 -0
  1089. package/dist/realizability.js.map +1 -0
  1090. package/dist/resolve.d.ts +7 -1
  1091. package/dist/resolve.js +77 -11
  1092. package/dist/resolve.js.map +1 -1
  1093. package/dist/sceneElements/compiler.d.ts +21 -0
  1094. package/dist/sceneElements/compiler.js +976 -0
  1095. package/dist/sceneElements/compiler.js.map +1 -0
  1096. package/dist/sceneElements/continuum.d.ts +54 -0
  1097. package/dist/sceneElements/continuum.js +451 -0
  1098. package/dist/sceneElements/continuum.js.map +1 -0
  1099. package/dist/sceneElements/devices.d.ts +12 -0
  1100. package/dist/sceneElements/devices.js +212 -0
  1101. package/dist/sceneElements/devices.js.map +1 -0
  1102. package/dist/sceneElements/meshCells.d.ts +49 -0
  1103. package/dist/sceneElements/meshCells.js +174 -0
  1104. package/dist/sceneElements/meshCells.js.map +1 -0
  1105. package/dist/sceneElements/types.d.ts +261 -0
  1106. package/dist/sceneElements/types.js +3 -0
  1107. package/dist/sceneElements/types.js.map +1 -0
  1108. package/dist/sceneHlod/approximate.d.ts +23 -0
  1109. package/dist/sceneHlod/approximate.js +171 -0
  1110. package/dist/sceneHlod/approximate.js.map +1 -0
  1111. package/dist/sceneHlod/artifact.d.ts +3 -0
  1112. package/dist/sceneHlod/artifact.js +29 -0
  1113. package/dist/sceneHlod/artifact.js.map +1 -0
  1114. package/dist/sceneHlod/bakeSurface.d.ts +2 -0
  1115. package/dist/sceneHlod/bakeSurface.js +59 -0
  1116. package/dist/sceneHlod/bakeSurface.js.map +1 -0
  1117. package/dist/sceneHlod/basisEncoder.d.ts +3 -0
  1118. package/dist/sceneHlod/basisEncoder.js +68 -0
  1119. package/dist/sceneHlod/basisEncoder.js.map +1 -0
  1120. package/dist/sceneHlod/cellArtifact.d.ts +17 -0
  1121. package/dist/sceneHlod/cellArtifact.js +78 -0
  1122. package/dist/sceneHlod/cellArtifact.js.map +1 -0
  1123. package/dist/sceneHlod/commands.d.ts +2 -0
  1124. package/dist/sceneHlod/commands.js +114 -0
  1125. package/dist/sceneHlod/commands.js.map +1 -0
  1126. package/dist/sceneHlod/complete.d.ts +78 -0
  1127. package/dist/sceneHlod/complete.js +261 -0
  1128. package/dist/sceneHlod/complete.js.map +1 -0
  1129. package/dist/sceneHlod/completePrototype.d.ts +39 -0
  1130. package/dist/sceneHlod/completePrototype.js +121 -0
  1131. package/dist/sceneHlod/completePrototype.js.map +1 -0
  1132. package/dist/sceneHlod/geometry.d.ts +6 -0
  1133. package/dist/sceneHlod/geometry.js +101 -0
  1134. package/dist/sceneHlod/geometry.js.map +1 -0
  1135. package/dist/sceneHlod/imageSampling.d.ts +11 -0
  1136. package/dist/sceneHlod/imageSampling.js +100 -0
  1137. package/dist/sceneHlod/imageSampling.js.map +1 -0
  1138. package/dist/sceneHlod/refinement.d.ts +46 -0
  1139. package/dist/sceneHlod/refinement.js +204 -0
  1140. package/dist/sceneHlod/refinement.js.map +1 -0
  1141. package/dist/sceneHlod/scene.d.ts +80 -0
  1142. package/dist/sceneHlod/scene.js +264 -0
  1143. package/dist/sceneHlod/scene.js.map +1 -0
  1144. package/dist/sceneHlod/sharedAtlas.d.ts +37 -0
  1145. package/dist/sceneHlod/sharedAtlas.js +84 -0
  1146. package/dist/sceneHlod/sharedAtlas.js.map +1 -0
  1147. package/dist/sceneHlod/source.d.ts +17 -0
  1148. package/dist/sceneHlod/source.js +241 -0
  1149. package/dist/sceneHlod/source.js.map +1 -0
  1150. package/dist/sceneHlod/textureCodec.d.ts +4 -0
  1151. package/dist/sceneHlod/textureCodec.js +66 -0
  1152. package/dist/sceneHlod/textureCodec.js.map +1 -0
  1153. package/dist/sceneHlod/transfer.d.ts +8 -0
  1154. package/dist/sceneHlod/transfer.js +147 -0
  1155. package/dist/sceneHlod/transfer.js.map +1 -0
  1156. package/dist/sceneHlod/types.d.ts +69 -0
  1157. package/dist/sceneHlod/types.js +3 -0
  1158. package/dist/sceneHlod/types.js.map +1 -0
  1159. package/dist/sceneImport/archive.d.ts +30 -0
  1160. package/dist/sceneImport/archive.js +336 -0
  1161. package/dist/sceneImport/archive.js.map +1 -0
  1162. package/dist/sceneImport/bistroMaterialBake.d.ts +20 -0
  1163. package/dist/sceneImport/bistroMaterialBake.js +169 -0
  1164. package/dist/sceneImport/bistroMaterialBake.js.map +1 -0
  1165. package/dist/sceneImport/bistroTexturePlan.d.ts +6 -0
  1166. package/dist/sceneImport/bistroTexturePlan.js +23 -0
  1167. package/dist/sceneImport/bistroTexturePlan.js.map +1 -0
  1168. package/dist/sceneImport/compiler.d.ts +36 -0
  1169. package/dist/sceneImport/compiler.js +251 -0
  1170. package/dist/sceneImport/compiler.js.map +1 -0
  1171. package/dist/sceneImport/composeMounts.d.ts +159 -0
  1172. package/dist/sceneImport/composeMounts.js +687 -0
  1173. package/dist/sceneImport/composeMounts.js.map +1 -0
  1174. package/dist/sceneImport/defaultMaterials.d.ts +45 -0
  1175. package/dist/sceneImport/defaultMaterials.js +121 -0
  1176. package/dist/sceneImport/defaultMaterials.js.map +1 -0
  1177. package/dist/sceneImport/externalTextures.d.ts +44 -0
  1178. package/dist/sceneImport/externalTextures.js +146 -0
  1179. package/dist/sceneImport/externalTextures.js.map +1 -0
  1180. package/dist/sceneImport/fbx.d.ts +101 -0
  1181. package/dist/sceneImport/fbx.js +307 -0
  1182. package/dist/sceneImport/fbx.js.map +1 -0
  1183. package/dist/sceneImport/glbSplit.d.ts +24 -0
  1184. package/dist/sceneImport/glbSplit.js +95 -0
  1185. package/dist/sceneImport/glbSplit.js.map +1 -0
  1186. package/dist/sceneImport/gltfIo.d.ts +32 -0
  1187. package/dist/sceneImport/gltfIo.js +39 -0
  1188. package/dist/sceneImport/gltfIo.js.map +1 -0
  1189. package/dist/sceneImport/helsinkiTiles.d.ts +31 -0
  1190. package/dist/sceneImport/helsinkiTiles.js +52 -0
  1191. package/dist/sceneImport/helsinkiTiles.js.map +1 -0
  1192. package/dist/sceneImport/materials/binding.d.ts +16 -0
  1193. package/dist/sceneImport/materials/binding.js +42 -0
  1194. package/dist/sceneImport/materials/binding.js.map +1 -0
  1195. package/dist/sceneImport/materials/catalog.d.ts +36 -0
  1196. package/dist/sceneImport/materials/catalog.js +233 -0
  1197. package/dist/sceneImport/materials/catalog.js.map +1 -0
  1198. package/dist/sceneImport/materials/index.d.ts +4 -0
  1199. package/dist/sceneImport/materials/index.js +21 -0
  1200. package/dist/sceneImport/materials/index.js.map +1 -0
  1201. package/dist/sceneImport/materials/matcher.d.ts +33 -0
  1202. package/dist/sceneImport/materials/matcher.js +127 -0
  1203. package/dist/sceneImport/materials/matcher.js.map +1 -0
  1204. package/dist/sceneImport/materials/recipe.d.ts +30 -0
  1205. package/dist/sceneImport/materials/recipe.js +134 -0
  1206. package/dist/sceneImport/materials/recipe.js.map +1 -0
  1207. package/dist/sceneImport/multiAsset.d.ts +79 -0
  1208. package/dist/sceneImport/multiAsset.js +535 -0
  1209. package/dist/sceneImport/multiAsset.js.map +1 -0
  1210. package/dist/sceneImport/multiAssetSpawn.d.ts +40 -0
  1211. package/dist/sceneImport/multiAssetSpawn.js +98 -0
  1212. package/dist/sceneImport/multiAssetSpawn.js.map +1 -0
  1213. package/dist/sceneImport/obj.d.ts +41 -0
  1214. package/dist/sceneImport/obj.js +276 -0
  1215. package/dist/sceneImport/obj.js.map +1 -0
  1216. package/dist/sceneImport/package.d.ts +104 -0
  1217. package/dist/sceneImport/package.js +1004 -0
  1218. package/dist/sceneImport/package.js.map +1 -0
  1219. package/dist/sceneImport/packageReader.d.ts +10 -0
  1220. package/dist/sceneImport/packageReader.js +250 -0
  1221. package/dist/sceneImport/packageReader.js.map +1 -0
  1222. package/dist/sceneImport/proxy.d.ts +100 -0
  1223. package/dist/sceneImport/proxy.js +334 -0
  1224. package/dist/sceneImport/proxy.js.map +1 -0
  1225. package/dist/sceneImport/publish.d.ts +47 -0
  1226. package/dist/sceneImport/publish.js +98 -0
  1227. package/dist/sceneImport/publish.js.map +1 -0
  1228. package/dist/sceneImport/semantic.d.ts +75 -0
  1229. package/dist/sceneImport/semantic.js +296 -0
  1230. package/dist/sceneImport/semantic.js.map +1 -0
  1231. package/dist/sceneImport/spawnProbe.d.ts +55 -0
  1232. package/dist/sceneImport/spawnProbe.js +159 -0
  1233. package/dist/sceneImport/spawnProbe.js.map +1 -0
  1234. package/dist/sceneImport/streamLayout.d.ts +96 -0
  1235. package/dist/sceneImport/streamLayout.js +203 -0
  1236. package/dist/sceneImport/streamLayout.js.map +1 -0
  1237. package/dist/sceneImport/textureDecode.d.ts +21 -0
  1238. package/dist/sceneImport/textureDecode.js +292 -0
  1239. package/dist/sceneImport/textureDecode.js.map +1 -0
  1240. package/dist/sceneImport/types.d.ts +84 -0
  1241. package/dist/sceneImport/types.js +58 -0
  1242. package/dist/sceneImport/types.js.map +1 -0
  1243. package/dist/scenePerformance.d.ts +162 -0
  1244. package/dist/scenePerformance.js +905 -0
  1245. package/dist/scenePerformance.js.map +1 -0
  1246. package/dist/screenshot/captureScreenshots.d.ts +36 -0
  1247. package/dist/screenshot/captureScreenshots.js +229 -0
  1248. package/dist/screenshot/captureScreenshots.js.map +1 -0
  1249. package/dist/screenshot/encodeImagePreview.d.ts +5 -0
  1250. package/dist/screenshot/encodeImagePreview.js +42 -0
  1251. package/dist/screenshot/encodeImagePreview.js.map +1 -0
  1252. package/dist/screenshot/publishThumbnail.d.ts +4 -0
  1253. package/dist/screenshot/publishThumbnail.js +56 -0
  1254. package/dist/screenshot/publishThumbnail.js.map +1 -0
  1255. package/dist/screenshot/staticServe.d.ts +14 -0
  1256. package/dist/screenshot/staticServe.js +120 -0
  1257. package/dist/screenshot/staticServe.js.map +1 -0
  1258. package/dist/source-archive.d.ts +101 -0
  1259. package/dist/source-archive.js +309 -0
  1260. package/dist/source-archive.js.map +1 -0
  1261. package/dist/stdioBlocking.d.ts +1 -0
  1262. package/dist/stdioBlocking.js +9 -0
  1263. package/dist/stdioBlocking.js.map +1 -0
  1264. package/dist/terrain/bake.d.ts +40 -0
  1265. package/dist/terrain/bake.js +318 -0
  1266. package/dist/terrain/bake.js.map +1 -0
  1267. package/dist/terrain/generate.d.ts +21 -0
  1268. package/dist/terrain/generate.js +239 -0
  1269. package/dist/terrain/generate.js.map +1 -0
  1270. package/dist/terrain/grid.d.ts +48 -0
  1271. package/dist/terrain/grid.js +133 -0
  1272. package/dist/terrain/grid.js.map +1 -0
  1273. package/dist/terrain/import.d.ts +40 -0
  1274. package/dist/terrain/import.js +252 -0
  1275. package/dist/terrain/import.js.map +1 -0
  1276. package/dist/terrain/index.d.ts +11 -0
  1277. package/dist/terrain/index.js +88 -0
  1278. package/dist/terrain/index.js.map +1 -0
  1279. package/dist/terrain/inspect.d.ts +35 -0
  1280. package/dist/terrain/inspect.js +115 -0
  1281. package/dist/terrain/inspect.js.map +1 -0
  1282. package/dist/terrain/island.d.ts +31 -0
  1283. package/dist/terrain/island.js +128 -0
  1284. package/dist/terrain/island.js.map +1 -0
  1285. package/dist/terrain/noise.d.ts +79 -0
  1286. package/dist/terrain/noise.js +162 -0
  1287. package/dist/terrain/noise.js.map +1 -0
  1288. package/dist/terrain/normals.d.ts +21 -0
  1289. package/dist/terrain/normals.js +55 -0
  1290. package/dist/terrain/normals.js.map +1 -0
  1291. package/dist/terrain/presets/alpine.json +20 -0
  1292. package/dist/terrain/presets/coast.json +20 -0
  1293. package/dist/terrain/presets/desert.json +22 -0
  1294. package/dist/terrain/presets/forest.json +20 -0
  1295. package/dist/terrain/presets/meadow.json +20 -0
  1296. package/dist/terrain/presets/volcanic.json +22 -0
  1297. package/dist/terrain/presets.d.ts +29 -0
  1298. package/dist/terrain/presets.js +128 -0
  1299. package/dist/terrain/presets.js.map +1 -0
  1300. package/dist/terrain/source.d.ts +42 -0
  1301. package/dist/terrain/source.js +241 -0
  1302. package/dist/terrain/source.js.map +1 -0
  1303. package/dist/terrain/tile.d.ts +92 -0
  1304. package/dist/terrain/tile.js +268 -0
  1305. package/dist/terrain/tile.js.map +1 -0
  1306. package/dist/textureAudit.d.ts +23 -0
  1307. package/dist/textureAudit.js +192 -0
  1308. package/dist/textureAudit.js.map +1 -0
  1309. package/dist/tsconfig.build.tsbuildinfo +1 -1
  1310. package/dist/unreal/avatarMode.d.ts +21 -0
  1311. package/dist/unreal/avatarMode.js +33 -0
  1312. package/dist/unreal/avatarMode.js.map +1 -0
  1313. package/dist/unreal/delivery.d.ts +46 -0
  1314. package/dist/unreal/delivery.js +89 -0
  1315. package/dist/unreal/delivery.js.map +1 -0
  1316. package/dist/unreal/doctor.d.ts +50 -0
  1317. package/dist/unreal/doctor.js +102 -0
  1318. package/dist/unreal/doctor.js.map +1 -0
  1319. package/dist/unreal/package.d.ts +80 -0
  1320. package/dist/unreal/package.js +273 -0
  1321. package/dist/unreal/package.js.map +1 -0
  1322. package/dist/unreal/release.d.ts +41 -0
  1323. package/dist/unreal/release.js +122 -0
  1324. package/dist/unreal/release.js.map +1 -0
  1325. package/dist/unreal.d.ts +30 -0
  1326. package/dist/unreal.js +362 -0
  1327. package/dist/unreal.js.map +1 -0
  1328. package/dist/unrealCandidate.d.ts +213 -0
  1329. package/dist/unrealCandidate.js +765 -0
  1330. package/dist/unrealCandidate.js.map +1 -0
  1331. package/dist/unrealManifest.d.ts +74 -0
  1332. package/dist/unrealManifest.js +354 -0
  1333. package/dist/unrealManifest.js.map +1 -0
  1334. package/dist/unrealPublish.d.ts +111 -0
  1335. package/dist/unrealPublish.js +331 -0
  1336. package/dist/unrealPublish.js.map +1 -0
  1337. package/dist/vault.d.ts +121 -0
  1338. package/dist/vault.js +136 -0
  1339. package/dist/vault.js.map +1 -0
  1340. package/dist/vehicle/addOnDefinition.d.ts +19 -0
  1341. package/dist/vehicle/addOnDefinition.js +21 -0
  1342. package/dist/vehicle/addOnDefinition.js.map +1 -0
  1343. package/dist/vehicle/addon.d.ts +158 -0
  1344. package/dist/vehicle/addon.js +441 -0
  1345. package/dist/vehicle/addon.js.map +1 -0
  1346. package/dist/vehicle/addonDefinitionGuard.d.ts +53 -0
  1347. package/dist/vehicle/addonDefinitionGuard.js +206 -0
  1348. package/dist/vehicle/addonDefinitionGuard.js.map +1 -0
  1349. package/dist/vehicle/addonPublished.d.ts +80 -0
  1350. package/dist/vehicle/addonPublished.js +221 -0
  1351. package/dist/vehicle/addonPublished.js.map +1 -0
  1352. package/dist/vehicle/audio.d.ts +259 -0
  1353. package/dist/vehicle/audio.js +1069 -0
  1354. package/dist/vehicle/audio.js.map +1 -0
  1355. package/dist/vehicle/audioDefects.d.ts +125 -0
  1356. package/dist/vehicle/audioDefects.js +591 -0
  1357. package/dist/vehicle/audioDefects.js.map +1 -0
  1358. package/dist/vehicle/audioDistinct.d.ts +62 -0
  1359. package/dist/vehicle/audioDistinct.js +479 -0
  1360. package/dist/vehicle/audioDistinct.js.map +1 -0
  1361. package/dist/vehicle/audioImport.d.ts +217 -0
  1362. package/dist/vehicle/audioImport.js +610 -0
  1363. package/dist/vehicle/audioImport.js.map +1 -0
  1364. package/dist/vehicle/audioProvenance.d.ts +47 -0
  1365. package/dist/vehicle/audioProvenance.js +364 -0
  1366. package/dist/vehicle/audioProvenance.js.map +1 -0
  1367. package/dist/vehicle/audioReference.d.ts +36 -0
  1368. package/dist/vehicle/audioReference.js +176 -0
  1369. package/dist/vehicle/audioReference.js.map +1 -0
  1370. package/dist/vehicle/audioSlots.d.ts +27 -0
  1371. package/dist/vehicle/audioSlots.js +43 -0
  1372. package/dist/vehicle/audioSlots.js.map +1 -0
  1373. package/dist/vehicle/audioSpectral.d.ts +71 -0
  1374. package/dist/vehicle/audioSpectral.js +534 -0
  1375. package/dist/vehicle/audioSpectral.js.map +1 -0
  1376. package/dist/vehicle/cabinCheck.d.ts +209 -0
  1377. package/dist/vehicle/cabinCheck.js +799 -0
  1378. package/dist/vehicle/cabinCheck.js.map +1 -0
  1379. package/dist/vehicle/drive.d.ts +66 -0
  1380. package/dist/vehicle/drive.js +228 -0
  1381. package/dist/vehicle/drive.js.map +1 -0
  1382. package/dist/vehicle/enginePolicy.d.ts +68 -0
  1383. package/dist/vehicle/enginePolicy.js +209 -0
  1384. package/dist/vehicle/enginePolicy.js.map +1 -0
  1385. package/dist/vehicle/hostFrame.d.ts +78 -0
  1386. package/dist/vehicle/hostFrame.js +136 -0
  1387. package/dist/vehicle/hostFrame.js.map +1 -0
  1388. package/dist/vehicle/inspectionSheets.d.ts +42 -0
  1389. package/dist/vehicle/inspectionSheets.js +173 -0
  1390. package/dist/vehicle/inspectionSheets.js.map +1 -0
  1391. package/dist/vehicle/keyboardLaunch.d.ts +189 -0
  1392. package/dist/vehicle/keyboardLaunch.js +340 -0
  1393. package/dist/vehicle/keyboardLaunch.js.map +1 -0
  1394. package/dist/vehicle/lampCoverage.d.ts +49 -0
  1395. package/dist/vehicle/lampCoverage.js +252 -0
  1396. package/dist/vehicle/lampCoverage.js.map +1 -0
  1397. package/dist/vehicle/mintAddOn.d.ts +110 -0
  1398. package/dist/vehicle/mintAddOn.js +321 -0
  1399. package/dist/vehicle/mintAddOn.js.map +1 -0
  1400. package/dist/vehicle/mintVehicle.d.ts +189 -0
  1401. package/dist/vehicle/mintVehicle.js +417 -0
  1402. package/dist/vehicle/mintVehicle.js.map +1 -0
  1403. package/dist/vehicle/paintHue.d.ts +89 -0
  1404. package/dist/vehicle/paintHue.js +248 -0
  1405. package/dist/vehicle/paintHue.js.map +1 -0
  1406. package/dist/vehicle/panelCoverage.d.ts +37 -0
  1407. package/dist/vehicle/panelCoverage.js +93 -0
  1408. package/dist/vehicle/panelCoverage.js.map +1 -0
  1409. package/dist/vehicle/platform.d.ts +71 -0
  1410. package/dist/vehicle/platform.js +144 -0
  1411. package/dist/vehicle/platform.js.map +1 -0
  1412. package/dist/vehicle/preview.d.ts +339 -0
  1413. package/dist/vehicle/preview.js +854 -0
  1414. package/dist/vehicle/preview.js.map +1 -0
  1415. package/dist/vehicle/previewAddon.d.ts +197 -0
  1416. package/dist/vehicle/previewAddon.js +520 -0
  1417. package/dist/vehicle/previewAddon.js.map +1 -0
  1418. package/dist/vehicle/previewSeats.d.ts +102 -0
  1419. package/dist/vehicle/previewSeats.js +190 -0
  1420. package/dist/vehicle/previewSeats.js.map +1 -0
  1421. package/dist/vehicle/publish.d.ts +78 -0
  1422. package/dist/vehicle/publish.js +111 -0
  1423. package/dist/vehicle/publish.js.map +1 -0
  1424. package/dist/vehicle/recheckListed.d.ts +87 -0
  1425. package/dist/vehicle/recheckListed.js +200 -0
  1426. package/dist/vehicle/recheckListed.js.map +1 -0
  1427. package/dist/vehicle/renditionManifest.d.ts +10 -0
  1428. package/dist/vehicle/renditionManifest.js +56 -0
  1429. package/dist/vehicle/renditionManifest.js.map +1 -0
  1430. package/dist/vehicle/sealCheck.d.ts +30 -0
  1431. package/dist/vehicle/sealCheck.js +59 -0
  1432. package/dist/vehicle/sealCheck.js.map +1 -0
  1433. package/dist/vehicle/simulate.d.ts +219 -0
  1434. package/dist/vehicle/simulate.js +536 -0
  1435. package/dist/vehicle/simulate.js.map +1 -0
  1436. package/dist/vehicle/simulateRuntime.d.ts +76 -0
  1437. package/dist/vehicle/simulateRuntime.js +252 -0
  1438. package/dist/vehicle/simulateRuntime.js.map +1 -0
  1439. package/dist/vehicle/testutil/sourcedAudio.d.ts +13 -0
  1440. package/dist/vehicle/testutil/sourcedAudio.js +96 -0
  1441. package/dist/vehicle/testutil/sourcedAudio.js.map +1 -0
  1442. package/dist/vehicle/validate.d.ts +225 -0
  1443. package/dist/vehicle/validate.js +956 -0
  1444. package/dist/vehicle/validate.js.map +1 -0
  1445. package/dist/vehicle/wheelDesign.d.ts +98 -0
  1446. package/dist/vehicle/wheelDesign.js +276 -0
  1447. package/dist/vehicle/wheelDesign.js.map +1 -0
  1448. package/dist/verifySubPath.d.ts +69 -0
  1449. package/dist/verifySubPath.js +458 -0
  1450. package/dist/verifySubPath.js.map +1 -0
  1451. package/dist/visualQa/animation.d.ts +57 -0
  1452. package/dist/visualQa/animation.js +503 -0
  1453. package/dist/visualQa/animation.js.map +1 -0
  1454. package/dist/visualQa/avatar.d.ts +3 -0
  1455. package/dist/visualQa/avatar.js +443 -0
  1456. package/dist/visualQa/avatar.js.map +1 -0
  1457. package/dist/visualQa/avatarMath.d.ts +180 -0
  1458. package/dist/visualQa/avatarMath.js +318 -0
  1459. package/dist/visualQa/avatarMath.js.map +1 -0
  1460. package/dist/visualQa/avatarPreview.d.ts +26 -0
  1461. package/dist/visualQa/avatarPreview.js +167 -0
  1462. package/dist/visualQa/avatarPreview.js.map +1 -0
  1463. package/dist/visualQa/avatarPreviewMath.d.ts +189 -0
  1464. package/dist/visualQa/avatarPreviewMath.js +696 -0
  1465. package/dist/visualQa/avatarPreviewMath.js.map +1 -0
  1466. package/dist/visualQa/avatarPreviewProbe.d.ts +7 -0
  1467. package/dist/visualQa/avatarPreviewProbe.js +181 -0
  1468. package/dist/visualQa/avatarPreviewProbe.js.map +1 -0
  1469. package/dist/visualQa/avatarProbe.d.ts +1 -0
  1470. package/dist/visualQa/avatarProbe.js +264 -0
  1471. package/dist/visualQa/avatarProbe.js.map +1 -0
  1472. package/dist/visualQa/browser.d.ts +116 -0
  1473. package/dist/visualQa/browser.js +817 -0
  1474. package/dist/visualQa/browser.js.map +1 -0
  1475. package/dist/visualQa/candidate.d.ts +116 -0
  1476. package/dist/visualQa/candidate.js +265 -0
  1477. package/dist/visualQa/candidate.js.map +1 -0
  1478. package/dist/visualQa/checklists.d.ts +31 -0
  1479. package/dist/visualQa/checklists.js +160 -0
  1480. package/dist/visualQa/checklists.js.map +1 -0
  1481. package/dist/visualQa/command.d.ts +110 -0
  1482. package/dist/visualQa/command.js +521 -0
  1483. package/dist/visualQa/command.js.map +1 -0
  1484. package/dist/visualQa/commonAsserts.d.ts +68 -0
  1485. package/dist/visualQa/commonAsserts.js +239 -0
  1486. package/dist/visualQa/commonAsserts.js.map +1 -0
  1487. package/dist/visualQa/contactSheet.d.ts +32 -0
  1488. package/dist/visualQa/contactSheet.js +153 -0
  1489. package/dist/visualQa/contactSheet.js.map +1 -0
  1490. package/dist/visualQa/critic.d.ts +18 -0
  1491. package/dist/visualQa/critic.js +179 -0
  1492. package/dist/visualQa/critic.js.map +1 -0
  1493. package/dist/visualQa/emotePage.d.ts +10 -0
  1494. package/dist/visualQa/emotePage.js +249 -0
  1495. package/dist/visualQa/emotePage.js.map +1 -0
  1496. package/dist/visualQa/evidenceOverlay.d.ts +74 -0
  1497. package/dist/visualQa/evidenceOverlay.js +268 -0
  1498. package/dist/visualQa/evidenceOverlay.js.map +1 -0
  1499. package/dist/visualQa/harness.d.ts +57 -0
  1500. package/dist/visualQa/harness.js +3 -0
  1501. package/dist/visualQa/harness.js.map +1 -0
  1502. package/dist/visualQa/hosted.d.ts +152 -0
  1503. package/dist/visualQa/hosted.js +367 -0
  1504. package/dist/visualQa/hosted.js.map +1 -0
  1505. package/dist/visualQa/labelLimit.d.ts +12 -0
  1506. package/dist/visualQa/labelLimit.js +31 -0
  1507. package/dist/visualQa/labelLimit.js.map +1 -0
  1508. package/dist/visualQa/mirror.d.ts +36 -0
  1509. package/dist/visualQa/mirror.js +98 -0
  1510. package/dist/visualQa/mirror.js.map +1 -0
  1511. package/dist/visualQa/moveUx.d.ts +44 -0
  1512. package/dist/visualQa/moveUx.js +103 -0
  1513. package/dist/visualQa/moveUx.js.map +1 -0
  1514. package/dist/visualQa/pinnedChrome.d.ts +63 -0
  1515. package/dist/visualQa/pinnedChrome.js +214 -0
  1516. package/dist/visualQa/pinnedChrome.js.map +1 -0
  1517. package/dist/visualQa/resolve.d.ts +88 -0
  1518. package/dist/visualQa/resolve.js +248 -0
  1519. package/dist/visualQa/resolve.js.map +1 -0
  1520. package/dist/visualQa/scene.d.ts +14 -0
  1521. package/dist/visualQa/scene.js +688 -0
  1522. package/dist/visualQa/scene.js.map +1 -0
  1523. package/dist/visualQa/shot.d.ts +2 -0
  1524. package/dist/visualQa/shot.js +27 -0
  1525. package/dist/visualQa/shot.js.map +1 -0
  1526. package/dist/visualQa/signIn.d.ts +35 -0
  1527. package/dist/visualQa/signIn.js +144 -0
  1528. package/dist/visualQa/signIn.js.map +1 -0
  1529. package/dist/visualQa/submitBudget.d.ts +25 -0
  1530. package/dist/visualQa/submitBudget.js +82 -0
  1531. package/dist/visualQa/submitBudget.js.map +1 -0
  1532. package/dist/visualQa/types.d.ts +195 -0
  1533. package/dist/visualQa/types.js +12 -0
  1534. package/dist/visualQa/types.js.map +1 -0
  1535. package/dist/visualQa/vehicle.d.ts +130 -0
  1536. package/dist/visualQa/vehicle.js +2002 -0
  1537. package/dist/visualQa/vehicle.js.map +1 -0
  1538. package/dist/visualQa/vehicleAddonProbe.d.ts +1 -0
  1539. package/dist/visualQa/vehicleAddonProbe.js +115 -0
  1540. package/dist/visualQa/vehicleAddonProbe.js.map +1 -0
  1541. package/dist/visualQa/vehicleCabinFit.d.ts +78 -0
  1542. package/dist/visualQa/vehicleCabinFit.js +55 -0
  1543. package/dist/visualQa/vehicleCabinFit.js.map +1 -0
  1544. package/dist/visualQa/vehicleClearance.d.ts +135 -0
  1545. package/dist/visualQa/vehicleClearance.js +299 -0
  1546. package/dist/visualQa/vehicleClearance.js.map +1 -0
  1547. package/dist/visualQa/vehicleDriveAlive.d.ts +55 -0
  1548. package/dist/visualQa/vehicleDriveAlive.js +103 -0
  1549. package/dist/visualQa/vehicleDriveAlive.js.map +1 -0
  1550. package/dist/visualQa/vehicleGrip.d.ts +156 -0
  1551. package/dist/visualQa/vehicleGrip.js +439 -0
  1552. package/dist/visualQa/vehicleGrip.js.map +1 -0
  1553. package/dist/visualQa/vehicleInspection.d.ts +70 -0
  1554. package/dist/visualQa/vehicleInspection.js +318 -0
  1555. package/dist/visualQa/vehicleInspection.js.map +1 -0
  1556. package/dist/visualQa/vehicleLamps.d.ts +120 -0
  1557. package/dist/visualQa/vehicleLamps.js +377 -0
  1558. package/dist/visualQa/vehicleLamps.js.map +1 -0
  1559. package/dist/visualQa/vehicleMath.d.ts +440 -0
  1560. package/dist/visualQa/vehicleMath.js +967 -0
  1561. package/dist/visualQa/vehicleMath.js.map +1 -0
  1562. package/dist/visualQa/vehicleOccupants.d.ts +66 -0
  1563. package/dist/visualQa/vehicleOccupants.js +448 -0
  1564. package/dist/visualQa/vehicleOccupants.js.map +1 -0
  1565. package/dist/visualQa/vehiclePenetration.d.ts +172 -0
  1566. package/dist/visualQa/vehiclePenetration.js +1157 -0
  1567. package/dist/visualQa/vehiclePenetration.js.map +1 -0
  1568. package/dist/visualQa/vehiclePoses.d.ts +25 -0
  1569. package/dist/visualQa/vehiclePoses.js +56 -0
  1570. package/dist/visualQa/vehiclePoses.js.map +1 -0
  1571. package/dist/visualQa/vehiclePosture.d.ts +78 -0
  1572. package/dist/visualQa/vehiclePosture.js +263 -0
  1573. package/dist/visualQa/vehiclePosture.js.map +1 -0
  1574. package/dist/visualQa/vehiclePreview.d.ts +103 -0
  1575. package/dist/visualQa/vehiclePreview.js +312 -0
  1576. package/dist/visualQa/vehiclePreview.js.map +1 -0
  1577. package/dist/visualQa/vehicleProbe.d.ts +3 -0
  1578. package/dist/visualQa/vehicleProbe.js +670 -0
  1579. package/dist/visualQa/vehicleProbe.js.map +1 -0
  1580. package/dist/visualQa/vehicleStance.d.ts +108 -0
  1581. package/dist/visualQa/vehicleStance.js +200 -0
  1582. package/dist/visualQa/vehicleStance.js.map +1 -0
  1583. package/dist/visualQa/viewer.d.ts +6 -0
  1584. package/dist/visualQa/viewer.js +750 -0
  1585. package/dist/visualQa/viewer.js.map +1 -0
  1586. package/dist/visualQa/viewerGeometry.d.ts +116 -0
  1587. package/dist/visualQa/viewerGeometry.js +476 -0
  1588. package/dist/visualQa/viewerGeometry.js.map +1 -0
  1589. package/dist/visualQa/viewerPage.d.ts +11 -0
  1590. package/dist/visualQa/viewerPage.js +414 -0
  1591. package/dist/visualQa/viewerPage.js.map +1 -0
  1592. package/dist/visualQa/webgpuSelfTest.d.ts +52 -0
  1593. package/dist/visualQa/webgpuSelfTest.js +113 -0
  1594. package/dist/visualQa/webgpuSelfTest.js.map +1 -0
  1595. package/dist/visualQa/winChrome.d.ts +92 -0
  1596. package/dist/visualQa/winChrome.js +445 -0
  1597. package/dist/visualQa/winChrome.js.map +1 -0
  1598. package/dist/visualQa/worldWalk.d.ts +59 -0
  1599. package/dist/visualQa/worldWalk.js +523 -0
  1600. package/dist/visualQa/worldWalk.js.map +1 -0
  1601. package/dist/visualQa/worldWalkMath.d.ts +263 -0
  1602. package/dist/visualQa/worldWalkMath.js +873 -0
  1603. package/dist/visualQa/worldWalkMath.js.map +1 -0
  1604. package/dist/visualQa/worldWalkProbe.d.ts +1 -0
  1605. package/dist/visualQa/worldWalkProbe.js +206 -0
  1606. package/dist/visualQa/worldWalkProbe.js.map +1 -0
  1607. package/dist/visualsConfig.d.ts +65 -0
  1608. package/dist/visualsConfig.js +1333 -0
  1609. package/dist/visualsConfig.js.map +1 -0
  1610. package/dist/voiceCommand.d.ts +11 -0
  1611. package/dist/voiceCommand.js +101 -0
  1612. package/dist/voiceCommand.js.map +1 -0
  1613. package/dist/world/analyze.d.ts +51 -0
  1614. package/dist/world/analyze.js +767 -0
  1615. package/dist/world/analyze.js.map +1 -0
  1616. package/dist/world/baseline.d.ts +33 -0
  1617. package/dist/world/baseline.js +111 -0
  1618. package/dist/world/baseline.js.map +1 -0
  1619. package/dist/world/canonicalize.d.ts +7 -0
  1620. package/dist/world/canonicalize.js +110 -0
  1621. package/dist/world/canonicalize.js.map +1 -0
  1622. package/dist/world/diff.d.ts +18 -0
  1623. package/dist/world/diff.js +58 -0
  1624. package/dist/world/diff.js.map +1 -0
  1625. package/dist/world/focus.d.ts +11 -0
  1626. package/dist/world/focus.js +161 -0
  1627. package/dist/world/focus.js.map +1 -0
  1628. package/dist/world/format.d.ts +6 -0
  1629. package/dist/world/format.js +125 -0
  1630. package/dist/world/format.js.map +1 -0
  1631. package/dist/world/readWorldMetrics.d.ts +10 -0
  1632. package/dist/world/readWorldMetrics.js +31 -0
  1633. package/dist/world/readWorldMetrics.js.map +1 -0
  1634. package/dist/world/snapshotTypes.d.ts +59 -0
  1635. package/dist/world/snapshotTypes.js +8 -0
  1636. package/dist/world/snapshotTypes.js.map +1 -0
  1637. package/dist/world/snapshotWorld.d.ts +16 -0
  1638. package/dist/world/snapshotWorld.js +142 -0
  1639. package/dist/world/snapshotWorld.js.map +1 -0
  1640. package/dist/world/wiring.d.ts +21 -0
  1641. package/dist/world/wiring.js +73 -0
  1642. package/dist/world/wiring.js.map +1 -0
  1643. package/dist/world/zones.d.ts +23 -0
  1644. package/dist/world/zones.js +134 -0
  1645. package/dist/world/zones.js.map +1 -0
  1646. package/docs/bridge.md +304 -0
  1647. package/docs/device-hand-reach.md +44 -0
  1648. package/docs/scene-hlod.md +139 -0
  1649. package/docs/vehicle-audio-import.md +299 -0
  1650. package/docs/vehicle-simulate.md +165 -0
  1651. package/docs/visual-qa-candidate-versions.md +71 -0
  1652. package/docs/visual-qa.md +462 -0
  1653. package/package.json +69 -4
  1654. package/plugins/beamng-vehicle/README.md +129 -0
  1655. package/plugins/beamng-vehicle/bin/__pycache__/beamng_abs.cpython-312.pyc +0 -0
  1656. package/plugins/beamng-vehicle/bin/__pycache__/beamng_audio.cpython-312.pyc +0 -0
  1657. package/plugins/beamng-vehicle/bin/__pycache__/beamng_engine.cpython-312.pyc +0 -0
  1658. package/plugins/beamng-vehicle/bin/__pycache__/beamng_expression.cpython-312.pyc +0 -0
  1659. package/plugins/beamng-vehicle/bin/__pycache__/beamng_jbeam.cpython-312.pyc +0 -0
  1660. package/plugins/beamng-vehicle/bin/__pycache__/beamng_materials.cpython-312.pyc +0 -0
  1661. package/plugins/beamng-vehicle/bin/__pycache__/beamng_stock_events.cpython-312.pyc +0 -0
  1662. package/plugins/beamng-vehicle/bin/__pycache__/fmod_studio.cpython-312.pyc +0 -0
  1663. package/plugins/beamng-vehicle/bin/__pycache__/fsb5.cpython-312.pyc +0 -0
  1664. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio.cpython-312.pyc +0 -0
  1665. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_ac.cpython-312.pyc +0 -0
  1666. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_beamng.cpython-312.pyc +0 -0
  1667. package/plugins/beamng-vehicle/bin/__pycache__/sim_audio_fixtures.cpython-312.pyc +0 -0
  1668. package/plugins/beamng-vehicle/bin/__pycache__/test_beamng_engine.cpython-312.pyc +0 -0
  1669. package/plugins/beamng-vehicle/bin/__pycache__/test_sim_audio.cpython-312.pyc +0 -0
  1670. package/plugins/beamng-vehicle/bin/beamng-vehicle.mjs +1295 -0
  1671. package/plugins/beamng-vehicle/bin/beamng_abs.py +408 -0
  1672. package/plugins/beamng-vehicle/bin/beamng_audio.py +394 -0
  1673. package/plugins/beamng-vehicle/bin/beamng_engine.py +184 -0
  1674. package/plugins/beamng-vehicle/bin/beamng_expression.py +373 -0
  1675. package/plugins/beamng-vehicle/bin/beamng_jbeam.py +858 -0
  1676. package/plugins/beamng-vehicle/bin/beamng_materials.py +261 -0
  1677. package/plugins/beamng-vehicle/bin/beamng_stock_events.py +171 -0
  1678. package/plugins/beamng-vehicle/bin/convert-beamng.py +1563 -0
  1679. package/plugins/beamng-vehicle/bin/fmod_studio.py +524 -0
  1680. package/plugins/beamng-vehicle/bin/fsb5.py +304 -0
  1681. package/plugins/beamng-vehicle/bin/index-beamng-common.mjs +16 -0
  1682. package/plugins/beamng-vehicle/bin/index-beamng.py +69 -0
  1683. package/plugins/beamng-vehicle/bin/lower-beamng.py +2399 -0
  1684. package/plugins/beamng-vehicle/bin/sim_audio.py +250 -0
  1685. package/plugins/beamng-vehicle/bin/sim_audio_ac.py +378 -0
  1686. package/plugins/beamng-vehicle/bin/sim_audio_beamng.py +878 -0
  1687. package/plugins/beamng-vehicle/bin/sim_audio_fixtures.py +287 -0
  1688. package/plugins/beamng-vehicle/bin/sim_audio_import.py +135 -0
  1689. package/plugins/beamng-vehicle/bin/test_beamng_engine.py +124 -0
  1690. package/plugins/beamng-vehicle/bin/test_beamng_jbeam.py +383 -0
  1691. package/plugins/beamng-vehicle/bin/test_beamng_precedence.py +134 -0
  1692. package/plugins/beamng-vehicle/bin/test_sim_audio.py +249 -0
  1693. package/plugins/beamng-vehicle/bridge-plugin.json +55 -0
  1694. package/plugins/beamng-vehicle/controller-adapters/beamng-0.39.4-abs.json +52 -0
  1695. package/plugins/beamng-vehicle/lib/common-dependency.mjs +357 -0
  1696. package/plugins/beamng-vehicle/lib/dae-scan.mjs +40 -0
  1697. package/plugins/beamng-vehicle/lib/file-identity.mjs +46 -0
  1698. package/plugins/beamng-vehicle/lib/material-semantics.mjs +312 -0
  1699. package/plugins/beamng-vehicle/lib/palette-contract.mjs +6 -0
  1700. package/plugins/beamng-vehicle/lib/vehicle-qa.mjs +567 -0
  1701. package/plugins/beamng-vehicle/lib/vehicle-source.mjs +247 -0
  1702. package/plugins/beamng-vehicle/profiles/source-compatibility.json +14 -0
  1703. package/plugins/beamng-vehicle/vendor/vehicle-package-v2.mjs +6451 -0
  1704. package/vendor/README.md +63 -0
  1705. package/vendor/ability-manifest.mjs +527 -6
  1706. package/vendor/audits/asset-credits.mjs +96 -0
  1707. package/vendor/audits/check-loaders.mjs +80 -0
  1708. package/vendor/audits/perf-gate.mjs +759 -0
  1709. package/vendor/audits/prove-live.mjs +307 -0
  1710. package/vendor/audits/source-audit.mjs +530 -0
  1711. package/vendor/audits/world-audit.mjs +439 -0
  1712. package/vendor/capture-body.glb +0 -0
  1713. package/vendor/capture-face.glb +0 -0
  1714. package/vendor/installed-index.mjs +1 -1
  1715. package/vendor/vehicle-package-v2.mjs +6451 -0
@@ -0,0 +1,956 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.HOST_MANIFEST_SNIPPET = exports.HOST_SOCKET_NAME_PATTERN = exports.OPTIONAL_LAMP_FUNCTIONS = exports.REQUIRED_LAMP_FUNCTIONS = exports.WHEEL_PIVOT_TOLERANCE_M = exports.GROUND_TO_BODY_ORIGIN_TOLERANCE_M = void 0;
37
+ exports.loadVehicleValidator = loadVehicleValidator;
38
+ exports.computeComponentBuildDigest = computeComponentBuildDigest;
39
+ exports.publishedVehiclePackage = publishedVehiclePackage;
40
+ exports.checkVehiclePackage = checkVehiclePackage;
41
+ exports.walkNodes = walkNodes;
42
+ exports.subtreeBox = subtreeBox;
43
+ exports.glbSceneFacts = glbSceneFacts;
44
+ exports.checkHostManifest = checkHostManifest;
45
+ exports.checkVehicleGlb = checkVehicleGlb;
46
+ exports.checkHostBindNodesOfGlb = checkHostBindNodesOfGlb;
47
+ exports.hostFrameIndexOfGlb = hostFrameIndexOfGlb;
48
+ exports.summarizeIssues = summarizeIssues;
49
+ exports.simulationIssues = simulationIssues;
50
+ exports.cabinIssues = cabinIssues;
51
+ exports.validateVehicle = validateVehicle;
52
+ exports.formatVehicleIssues = formatVehicleIssues;
53
+ exports.assertVehiclePackagePublishable = assertVehiclePackagePublishable;
54
+ exports.readJsonFile = readJsonFile;
55
+ exports.assertVehicleHostManifest = assertVehicleHostManifest;
56
+ exports.vehiclePackageDescriptorHostIssues = vehiclePackageDescriptorHostIssues;
57
+ exports.assertVehiclePackageDescriptorHost = assertVehiclePackageDescriptorHost;
58
+ exports.assertPublishVehiclePackage = assertPublishVehiclePackage;
59
+ /**
60
+ * `helix vehicle validate` — the one-second local gate for a hand-authored Universal Vehicle.
61
+ *
62
+ * WHY THIS EXISTS. A vehicle package that never went through the BeamNG bridge was validated against nothing
63
+ * before publish. `publish` returns ok, and the runtime then silently refuses to spawn the vehicle
64
+ * (`vehiclePackageToTuning` throws on any validator error). The commonest real defect is a wheel node whose
65
+ * ORIGIN is not the hub — geometry baked in vehicle space under a node left at identity — which parks every wheel
66
+ * add-on at the car's centre and was previously caught only by a hosted visual-QA run.
67
+ *
68
+ * Three layers, cheapest first:
69
+ * 1. the package JSON — the engine's own validator (vendored, pinned to an engine commit), the engine publish
70
+ * gate, the backend's structural pin requirements, and the cross-field checks neither of them makes;
71
+ * 2. the model (`--glb`) — wheel resolution, pivots, frame orientation, budgets, articulation nodes, and the add-on
72
+ * host manifest (`asset.extras.HELIX_vehicle`, the only place the backend reads it);
73
+ * 3. the offline drive, only when asked (`simulate`) and only when the package declares `targets`: the platform's
74
+ * own runtime instrument (`simulate.ts`; fetched once, then cached). No auth, no render.
75
+ *
76
+ * Every finding has a stable `code`, a level, the JSON `path` (or glTF node) it is about, and a one-line `fix`.
77
+ */
78
+ const node_fs_1 = require("node:fs");
79
+ const node_path_1 = require("node:path");
80
+ const glb_1 = require("../bridge/glb");
81
+ const esm_1 = require("../character/esm");
82
+ const avatarPreflight_1 = require("../character/avatarPreflight");
83
+ const mat4_1 = require("../character/mat4");
84
+ const lampCoverage_1 = require("./lampCoverage");
85
+ const panelCoverage_1 = require("./panelCoverage");
86
+ const hostFrame_1 = require("./hostFrame");
87
+ const enginePolicy_1 = require("./enginePolicy");
88
+ let vendored;
89
+ /** The vendored engine validator is ESM; this package compiles to CommonJS, hence the dynamic-import indirection. */
90
+ function loadVehicleValidator() {
91
+ vendored ??= (async () => {
92
+ const { pathToFileURL } = await Promise.resolve().then(() => __importStar(require('node:url')));
93
+ const file = (0, node_path_1.join)(__dirname, '..', '..', 'vendor', 'vehicle-package-v2.mjs');
94
+ return (await (0, esm_1.importEsm)(pathToFileURL(file).href));
95
+ })();
96
+ return vendored;
97
+ }
98
+ const isRecord = (value) => typeof value === 'object' && value !== null && !Array.isArray(value);
99
+ const isNonEmptyString = (value) => typeof value === 'string' && value.trim() !== '';
100
+ const sourcedNumber = (value) => {
101
+ if (!isRecord(value))
102
+ return undefined;
103
+ return typeof value.value === 'number' && Number.isFinite(value.value) ? value.value : undefined;
104
+ };
105
+ const fmt = (n) => (Math.round(n * 10_000) / 10_000).toString();
106
+ const fmtVec = (v) => `(${v.map(fmt).join(', ')})`;
107
+ /** Metres. `physics.chassis.groundToBodyOrigin` must equal `wheelRadius + suspension.staticRideHeight` to this. */
108
+ exports.GROUND_TO_BODY_ORIGIN_TOLERANCE_M = 0.005;
109
+ /** Metres. A wheel node's origin must sit this close to the centre of its own geometry. */
110
+ exports.WHEEL_PIVOT_TOLERANCE_M = 0.02;
111
+ const WHEEL_IDS = ['wheel_lf', 'wheel_rf', 'wheel_lr', 'wheel_rr'];
112
+ // ── 1. the package ────────────────────────────────────────────────────────────────────────────────────────────
113
+ /** The same FNV-1a-64 + stable-JSON digest the backend (`vehicle-component-build-contract.ts`) verifies. */
114
+ function stable(value) {
115
+ if (value === null || typeof value !== 'object')
116
+ return JSON.stringify(value) ?? 'null';
117
+ if (Array.isArray(value))
118
+ return `[${value.map(stable).join(',')}]`;
119
+ const record = value;
120
+ return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${stable(record[key])}`).join(',')}}`;
121
+ }
122
+ function fnv1a64(value) {
123
+ let a = 0x811c9dc5;
124
+ let b = 0x01000193;
125
+ for (let index = 0; index < value.length; index += 1) {
126
+ const code = value.charCodeAt(index);
127
+ a = Math.imul(a ^ code, 0x01000193);
128
+ b = Math.imul(b ^ (code + index), 0x85ebca6b);
129
+ }
130
+ return (a >>> 0).toString(16).padStart(8, '0') + (b >>> 0).toString(16).padStart(8, '0');
131
+ }
132
+ /**
133
+ * Recompute `specialty.componentBuild.digest`. The backend's `validateRows` accepts the seven authored row fields
134
+ * AND `carried` / `unsupported`, and digests every accepted row; `dropped` must be empty and is not digested.
135
+ */
136
+ function computeComponentBuildDigest(build) {
137
+ const signals = build.signals;
138
+ if (!Array.isArray(signals))
139
+ return undefined;
140
+ const rows = [];
141
+ for (const field of ['articulators', 'interacts', 'lights', 'materials', 'attachments', 'vfx', 'patterns', 'carried', 'unsupported']) {
142
+ const list = build[field];
143
+ if (list === undefined)
144
+ continue;
145
+ if (!Array.isArray(list))
146
+ return undefined;
147
+ for (const row of list) {
148
+ if (!isRecord(row))
149
+ return undefined;
150
+ rows.push(row);
151
+ }
152
+ }
153
+ const parts = signals.map((signal) => `s:${stable(signal)}`);
154
+ parts.push(...rows.map((row) => `r:${String(row.type)}/${String(row.id)}:${stable(row)}`).sort());
155
+ return fnv1a64(parts.join('\n'));
156
+ }
157
+ /** What `item publish` sends: a v2 package's mesh is rewritten to the universal-item `$self` pin first. */
158
+ function publishedVehiclePackage(pkg) {
159
+ if (pkg.packageVersion !== 2 || !isRecord(pkg.mesh))
160
+ return pkg;
161
+ return { ...pkg, mesh: { ...pkg.mesh, source: 'universal-item', ref: '$self' } };
162
+ }
163
+ /**
164
+ * Checks a+b+c on the package alone. Never throws: an engine validator that crashes on a malformed package is
165
+ * itself reported as an issue, because that crash is exactly what the runtime would hit at spawn.
166
+ */
167
+ function checkVehiclePackage(candidate, engine) {
168
+ const issues = [];
169
+ const add = (code, level, path, message, fix) => {
170
+ issues.push({ code, level, path, message, fix });
171
+ };
172
+ if (!isRecord(candidate)) {
173
+ add('PACKAGE_NOT_OBJECT', 'error', '$', 'a vehicle package must be a JSON object', 'pass the vehicle package JSON object (the file given to `--vehicle-package`)');
174
+ return issues;
175
+ }
176
+ const pkg = candidate;
177
+ // ── backend `pinVehiclePackage` structural requirements ──
178
+ if (pkg.packageVersion !== 1 && pkg.packageVersion !== 2) {
179
+ add('PACKAGE_VERSION_UNSUPPORTED', 'error', 'packageVersion', `packageVersion must be 1 or 2, got ${JSON.stringify(pkg.packageVersion)}`, 'set "packageVersion": 2 (and "schemaVersion": "helix.vehicle-package/2")');
180
+ }
181
+ else if (pkg.packageVersion === 2 && pkg.schemaVersion !== 'helix.vehicle-package/2') {
182
+ add('SCHEMA_VERSION_MISMATCH', 'error', 'schemaVersion', `packageVersion 2 requires schemaVersion "helix.vehicle-package/2", got ${JSON.stringify(pkg.schemaVersion)}`, 'set "schemaVersion": "helix.vehicle-package/2"');
183
+ }
184
+ for (const key of ['id', 'displayName', 'years']) {
185
+ if (!isNonEmptyString(pkg[key])) {
186
+ add('REQUIRED_FIELD_MISSING', 'error', key, `${key} is required and must be a non-empty string`, `add a non-empty "${key}" string`);
187
+ }
188
+ }
189
+ for (const key of ['physics', 'targets', 'audio', 'lights', 'provenance']) {
190
+ if (!isRecord(pkg[key])) {
191
+ add('REQUIRED_BLOCK_MISSING', 'error', key, `${key} must be an object`, `add the "${key}" object (compare with a published package)`);
192
+ }
193
+ }
194
+ for (const key of ['citations', 'vfx']) {
195
+ if (!Array.isArray(pkg[key])) {
196
+ add('REQUIRED_BLOCK_MISSING', 'error', key, `${key} must be an array`, `add "${key}": [] (or its entries)`);
197
+ }
198
+ }
199
+ const mesh = isRecord(pkg.mesh) ? pkg.mesh : undefined;
200
+ if (!mesh) {
201
+ add('REQUIRED_BLOCK_MISSING', 'error', 'mesh', 'mesh must be an object', 'add the "mesh" object with classId, parts and wheelVisuals');
202
+ }
203
+ else {
204
+ if (!isNonEmptyString(mesh.classId)) {
205
+ add('MESH_CLASS_ID_MISSING', 'error', 'mesh.classId', 'mesh.classId must be a non-empty string', 'set mesh.classId to the vehicle class id, e.g. "car"');
206
+ }
207
+ if (!Array.isArray(mesh.parts)) {
208
+ add('MESH_PARTS_MISSING', 'error', 'mesh.parts', 'mesh.parts must be an array', 'add "parts": [] (or the named parts)');
209
+ }
210
+ // ── engine `assertPackagePublishable`, one finding per rule instead of the first throw ──
211
+ if (mesh.wheelVisuals === undefined) {
212
+ add('WHEEL_VISUALS_MISSING', 'error', 'mesh.wheelVisuals', 'mesh.wheelVisuals is not declared; an unresolved mesh can render welded creator wheels plus procedural duplicates', 'set mesh.wheelVisuals to "author-static" (the model has its own wheels) or "procedural"');
213
+ }
214
+ else if (mesh.wheelVisuals !== 'author-static' && mesh.wheelVisuals !== 'procedural') {
215
+ add('WHEEL_VISUALS_INVALID', 'error', 'mesh.wheelVisuals', `mesh.wheelVisuals must be "author-static" or "procedural", got ${JSON.stringify(mesh.wheelVisuals)}`, 'set mesh.wheelVisuals to "author-static" or "procedural"');
216
+ }
217
+ if (mesh.source === 'fixture') {
218
+ add('MESH_SOURCE_FIXTURE', pkg.packageVersion === 2 ? 'warn' : 'error', 'mesh.source', `mesh.source is "fixture" (an internal dev path); the engine refuses to publish it${pkg.packageVersion === 2 ? ', and `item publish` rewrites it to the universal-item $self pin' : ''}`, 'set mesh.source to "universal-item" and mesh.ref to "$self"');
219
+ }
220
+ }
221
+ const provenance = isRecord(pkg.provenance) ? pkg.provenance : undefined;
222
+ if (provenance && provenance.distributable !== true) {
223
+ add('NOT_DISTRIBUTABLE', 'error', 'provenance.distributable', `provenance.distributable is ${JSON.stringify(provenance.distributable)}; a package that is not distributable can never be published${isNonEmptyString(provenance.note) ? ` (${provenance.note})` : ''}`, 'set provenance.distributable to true only if the model and data are cleared for distribution');
224
+ }
225
+ // ── the engine's own validator, as the runtime runs it at spawn ──
226
+ const published = publishedVehiclePackage(pkg);
227
+ try {
228
+ for (const issue of engine.validateEngineVehiclePackage(published)) {
229
+ add('ENGINE_VALIDATOR', issue.level, issue.path, issue.message, issue.level === 'error' ? 'fix the field named in path; the runtime refuses to spawn a package with this error' : 'review the field named in path');
230
+ }
231
+ }
232
+ catch (error) {
233
+ add('ENGINE_VALIDATOR_CRASH', 'error', '$', `the engine validator threw on this package: ${error instanceof Error ? error.message : String(error)}`, 'a required block or field is missing or the wrong type; compare the package with a published one');
234
+ }
235
+ if (!issues.some((i) => i.level === 'error' && (i.code === 'WHEEL_VISUALS_MISSING' || i.code === 'NOT_DISTRIBUTABLE' || i.code === 'MESH_SOURCE_FIXTURE'))) {
236
+ try {
237
+ engine.assertPackagePublishable(published);
238
+ }
239
+ catch (error) {
240
+ if (!issues.some((i) => i.code === 'ENGINE_VALIDATOR_CRASH')) {
241
+ add('PUBLISH_GATE', 'error', '$', error instanceof Error ? error.message : String(error), 'satisfy the engine publish gate named in the message');
242
+ }
243
+ }
244
+ }
245
+ // ── groundToBodyOrigin vs wheelRadius + staticRideHeight ──
246
+ const physics = isRecord(pkg.physics) ? pkg.physics : undefined;
247
+ const chassis = physics && isRecord(physics.chassis) ? physics.chassis : undefined;
248
+ const ground = chassis ? sourcedNumber(chassis.groundToBodyOrigin) : undefined;
249
+ const radius = chassis ? sourcedNumber(chassis.wheelRadius) : undefined;
250
+ const rideHeight = physics && isRecord(physics.suspension) ? sourcedNumber(physics.suspension.staticRideHeight) : undefined;
251
+ if (ground !== undefined && radius !== undefined && rideHeight !== undefined) {
252
+ const expected = radius + rideHeight;
253
+ if (Math.abs(ground - expected) > exports.GROUND_TO_BODY_ORIGIN_TOLERANCE_M) {
254
+ add('GROUND_TO_BODY_ORIGIN_MISMATCH', 'error', 'physics.chassis.groundToBodyOrigin', `groundToBodyOrigin is ${fmt(ground)} m but wheelRadius ${fmt(radius)} + staticRideHeight ${fmt(rideHeight)} = ${fmt(expected)} m (off by ${fmt(Math.abs(ground - expected))} m; tolerance ${exports.GROUND_TO_BODY_ORIGIN_TOLERANCE_M} m)`, `set physics.suspension.staticRideHeight to ${fmt(ground - radius)} — groundToBodyOrigin is LOCKED after the first publish, so change the ride height, never that field`);
255
+ }
256
+ }
257
+ // ── specialty.componentBuild digest ──
258
+ const specialty = isRecord(pkg.specialty) ? pkg.specialty : undefined;
259
+ const build = specialty && isRecord(specialty.componentBuild) ? specialty.componentBuild : undefined;
260
+ if (build) {
261
+ const computed = computeComponentBuildDigest(build);
262
+ if (computed !== undefined && computed !== build.digest) {
263
+ add('COMPONENT_BUILD_DIGEST_MISMATCH', 'error', 'specialty.componentBuild.digest', `declared digest ${JSON.stringify(build.digest)} does not match the computed digest "${computed}"`, `set specialty.componentBuild.digest to "${computed}"`);
264
+ }
265
+ }
266
+ // ── componentActions must be exactly what the component build compiles to (the backend refuses anything else) ──
267
+ if (build && specialty) {
268
+ let compiled;
269
+ try {
270
+ compiled = engine.compileComponentActionProtocol(build);
271
+ }
272
+ catch (error) {
273
+ add('COMPONENT_BUILD_INVALID', 'error', 'specialty.componentBuild', `the component build cannot be compiled: ${error instanceof Error ? error.message : String(error)}`, 'fix the component build rows named in the message');
274
+ }
275
+ if (compiled && compiled.protocol === undefined) {
276
+ add('COMPONENT_BUILD_INVALID', 'error', 'specialty.componentBuild', `the component build does not compile to an action protocol: ${compiled.issues.join('; ')}`, 'fix the interact rows / signals named in the message');
277
+ }
278
+ else if (compiled) {
279
+ const expected = stable(compiled.protocol);
280
+ if (specialty.componentActions === undefined) {
281
+ add('COMPONENT_ACTIONS_MISMATCH', 'error', 'specialty.componentActions', `specialty.componentBuild is present but specialty.componentActions is missing; the compiled protocol is ${expected}`, 'set specialty.componentActions to the compiled protocol quoted in the message');
282
+ }
283
+ else if (stable(specialty.componentActions) !== expected) {
284
+ add('COMPONENT_ACTIONS_MISMATCH', 'error', 'specialty.componentActions', `specialty.componentActions must exactly equal compileComponentActionProtocol(componentBuild); the compiled protocol is ${expected}`, 'replace specialty.componentActions with the compiled protocol quoted in the message');
285
+ }
286
+ }
287
+ }
288
+ // ── articulation panels that can never open ──
289
+ const articulation = mesh && isRecord(mesh.articulation) ? mesh.articulation : undefined;
290
+ const panels = articulation && Array.isArray(articulation.panels) ? articulation.panels : [];
291
+ const componentActions = specialty && isRecord(specialty.componentActions) ? specialty.componentActions : undefined;
292
+ const actions = componentActions && isRecord(componentActions.actions) ? componentActions.actions : {};
293
+ panels.forEach((panel, index) => {
294
+ if (!isRecord(panel) || typeof panel.signal !== 'string')
295
+ return;
296
+ if (!Object.prototype.hasOwnProperty.call(actions, panel.signal)) {
297
+ add('PANEL_SIGNAL_NO_ACTION', 'warn', `mesh.articulation.panels[${index}].signal`, `panel "${String(panel.id)}" signal "${panel.signal}" has no specialty.componentActions.actions entry, so it can never open (the platform default controls declare only enter/exit)`, `declare specialty.componentActions.actions.${panel.signal} (a component action that toggles the signal), or drop the panel`);
298
+ }
299
+ });
300
+ // ── declared seat sockets ──
301
+ const sockets = mesh && isRecord(mesh.sockets) ? mesh.sockets : undefined;
302
+ for (const key of Object.keys(sockets ?? {})) {
303
+ if (!/^seat/i.test(key) || engine.isSeatId(key))
304
+ continue;
305
+ const resolved = engine.resolveSocketName(key);
306
+ const canonical = resolved.id !== undefined && engine.isSeatId(resolved.id) ? resolved.id : undefined;
307
+ add('SEAT_SOCKET_UNKNOWN', 'warn', `mesh.sockets.${key}`, canonical !== undefined
308
+ ? `"${key}" is an alias, not a seat id; the room addresses the seat as "${canonical}"`
309
+ : `"${key}" is not a valid seat id (seat_<dside|pside>_<f|r1|r2…>)`, canonical !== undefined ? `rename mesh.sockets.${key} to "${canonical}"` : 'use seat_dside_f, seat_pside_f, seat_dside_r1, seat_pside_r1 …');
310
+ }
311
+ return issues;
312
+ }
313
+ /** Column-major local matrix of a glTF node (glTF convention, matches `mul4`/`transformPoint`). */
314
+ function localMatrix(node) {
315
+ if (Array.isArray(node.matrix) && node.matrix.length === 16)
316
+ return node.matrix;
317
+ const [tx, ty, tz] = node.translation ?? [0, 0, 0];
318
+ const [x, y, z, w] = node.rotation ?? [0, 0, 0, 1];
319
+ const [sx, sy, sz] = node.scale ?? [1, 1, 1];
320
+ return [
321
+ (1 - 2 * (y * y + z * z)) * sx, (2 * (x * y + z * w)) * sx, (2 * (x * z - y * w)) * sx, 0,
322
+ (2 * (x * y - z * w)) * sy, (1 - 2 * (x * x + z * z)) * sy, (2 * (y * z + x * w)) * sy, 0,
323
+ (2 * (x * z + y * w)) * sz, (2 * (y * z - x * w)) * sz, (1 - 2 * (x * x + y * y)) * sz, 0,
324
+ tx, ty, tz, 1,
325
+ ];
326
+ }
327
+ function growAabb(box, point) {
328
+ if (!box)
329
+ return { min: [...point], max: [...point] };
330
+ for (let axis = 0; axis < 3; axis += 1) {
331
+ if (point[axis] < box.min[axis])
332
+ box.min[axis] = point[axis];
333
+ if (point[axis] > box.max[axis])
334
+ box.max[axis] = point[axis];
335
+ }
336
+ return box;
337
+ }
338
+ const centreOf = (box) => [0, 1, 2].map((a) => (box.min[a] + box.max[a]) / 2);
339
+ const distance = (a, b) => Math.hypot(a[0] - b[0], a[1] - b[1], a[2] - b[2]);
340
+ /** Walk every node reachable from the default scene (or all nodes when there is no scene). */
341
+ function walkNodes(gltf) {
342
+ const nodes = gltf.nodes ?? [];
343
+ const facts = new Map();
344
+ const roots = gltf.scenes?.[gltf.scene ?? 0]?.nodes ?? nodes.map((_, i) => i);
345
+ const identity = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
346
+ const visit = (index, parent, parentWorld) => {
347
+ const node = nodes[index];
348
+ if (!node || facts.has(index))
349
+ return;
350
+ const world = (0, mat4_1.mul4)(parentWorld, localMatrix(node));
351
+ let ownBox;
352
+ if (node.mesh !== undefined) {
353
+ for (const primitive of gltf.meshes?.[node.mesh]?.primitives ?? []) {
354
+ const accessor = gltf.accessors?.[primitive.attributes?.POSITION ?? -1];
355
+ if (!accessor?.min || !accessor.max || accessor.min.length < 3 || accessor.max.length < 3)
356
+ continue;
357
+ for (const x of [accessor.min[0], accessor.max[0]]) {
358
+ for (const y of [accessor.min[1], accessor.max[1]]) {
359
+ for (const z of [accessor.min[2], accessor.max[2]])
360
+ ownBox = growAabb(ownBox, (0, mat4_1.transformPoint)(world, [x, y, z]));
361
+ }
362
+ }
363
+ }
364
+ }
365
+ facts.set(index, { index, name: node.name ?? `node_${index}`, parent, world, ownBox });
366
+ for (const child of node.children ?? [])
367
+ visit(child, index, world);
368
+ };
369
+ for (const root of roots)
370
+ visit(root, undefined, identity);
371
+ return facts;
372
+ }
373
+ function subtreeBox(index, gltf, facts) {
374
+ let box;
375
+ const visit = (i) => {
376
+ const own = facts.get(i)?.ownBox;
377
+ if (own) {
378
+ box = growAabb(box, own.min);
379
+ box = growAabb(box, own.max);
380
+ }
381
+ for (const child of gltf.nodes?.[i]?.children ?? [])
382
+ visit(child);
383
+ };
384
+ visit(index);
385
+ return box;
386
+ }
387
+ const worldOrigin = (facts) => [facts.world[12], facts.world[13], facts.world[14]];
388
+ // ── 2a. lamps (docs/vehicles.md §4) ─────────────────────────────────────────────────────────────────────────────
389
+ // The runtime aims and lights each lamp function through its own node and its own emissive material. Round 3's F40
390
+ // merged headlamps, foglights, taillamps, reverselights and both indicators into the body to dodge a runtime bug:
391
+ // the GLB has no such nodes, so nothing can be lit, aimed or indicated. The required set is the six distinct nodes
392
+ // below; `chmsl` and `numberplate` are optional.
393
+ /** The six lamp functions that MUST each be their own node in the model. */
394
+ exports.REQUIRED_LAMP_FUNCTIONS = ['headlamps', 'foglights', 'taillamps', 'reverselights', 'indicator_l', 'indicator_r'];
395
+ /** Declared-but-absent optional lamps: a warning, not a refusal. */
396
+ exports.OPTIONAL_LAMP_FUNCTIONS = ['chmsl', 'numberplate'];
397
+ /** Node identities that name the body/bodyshell, whose material a merged lamp node would share. */
398
+ const BODY_NODE_KEYS = new Set(['bodyshell', 'body', 'chassis']);
399
+ /**
400
+ * Fold a node name to the identity the lamp checks match on: the engine's own socket id when it has one (so
401
+ * `bodyshell`, `numberplate`, wheels and seats resolve canonically), else the prefix-stripped compact name — the same
402
+ * normalisation `resolveSocketName` applies internally, which the lamp node names (`headlamps`, `indicator_l`, …) are
403
+ * not part of. Mirrors the wheel-resolution path in `checkVehicleGlb`.
404
+ */
405
+ function nodeIdentity(raw, prefix, engine) {
406
+ const id = engine.resolveSocketName(raw, prefix).id;
407
+ if (id !== undefined)
408
+ return id.toLowerCase();
409
+ const tokens = raw
410
+ .replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2').replace(/([a-z0-9])([A-Z])/g, '$1 $2')
411
+ .toLowerCase()
412
+ .split(/[^a-z0-9]+/)
413
+ .filter((token) => token.length > 0);
414
+ const stripped = prefix !== undefined && tokens[0] === prefix ? tokens.slice(1) : tokens;
415
+ return stripped.join('');
416
+ }
417
+ /** A material lights a lamp only if it is emissive: an emissiveTexture, or a non-black emissiveFactor. */
418
+ function isEmissiveMaterial(material) {
419
+ if (!material)
420
+ return false;
421
+ if (material.emissiveTexture !== undefined)
422
+ return true;
423
+ return Array.isArray(material.emissiveFactor) && material.emissiveFactor.some((channel) => typeof channel === 'number' && channel > 0);
424
+ }
425
+ /** Material indices bound by a node's own mesh and (optionally excluded) its subtree — used for the body's materials. */
426
+ function subtreeMaterialIndices(roots, gltf, exclude) {
427
+ const out = new Set();
428
+ const visit = (index) => {
429
+ if (exclude.has(index))
430
+ return;
431
+ const node = gltf.nodes?.[index];
432
+ if (!node)
433
+ return;
434
+ if (node.mesh !== undefined) {
435
+ for (const primitive of gltf.meshes?.[node.mesh]?.primitives ?? []) {
436
+ if (primitive.material !== undefined)
437
+ out.add(primitive.material);
438
+ }
439
+ }
440
+ for (const child of node.children ?? [])
441
+ visit(child);
442
+ };
443
+ for (const root of roots)
444
+ visit(root);
445
+ return out;
446
+ }
447
+ /** World-space bounds of everything the default scene draws, plus that scene's `extras` (where `helixMeshFrame` lives). */
448
+ function glbSceneFacts(glb) {
449
+ const gltf = (0, glb_1.parseGlbJson)(glb);
450
+ const facts = walkNodes(gltf);
451
+ let box;
452
+ for (const fact of facts.values()) {
453
+ if (!fact.ownBox)
454
+ continue;
455
+ box = growAabb(box, fact.ownBox.min);
456
+ box = growAabb(box, fact.ownBox.max);
457
+ }
458
+ const extras = gltf.scenes?.[gltf.scene ?? 0]?.extras;
459
+ return { box, sceneExtras: isRecord(extras) ? extras : undefined, nodeNames: [...facts.values()].map((f) => f.name) };
460
+ }
461
+ // ── 2b. the host manifest ─────────────────────────────────────────────────────────────────────────────────────
462
+ /** Backend `host-manifest.ts` NAME_PATTERN: a socket name outside it is silently dropped from the host surface. */
463
+ exports.HOST_SOCKET_NAME_PATTERN = /^[A-Za-z0-9_.\-*]{1,64}$/;
464
+ const HOST_MANIFEST_KEY = 'HELIX_vehicle';
465
+ /** What to paste: the manifest in `asset.extras`, the only place the backend reads it. */
466
+ exports.HOST_MANIFEST_SNIPPET = '"asset": { "version": "2.0", "extras": { "HELIX_vehicle": { "version": 1, "class": "sports-car", '
467
+ + '"sockets": { "seat_dside_f": [0.34, 0.37, -0.10], "wheel_lf": [0.78, 0.33, 1.22], "exhaust": [0.30, 0.25, -2.10] } } } }';
468
+ const HOST_FIX = `move the block to the glTF asset: ${exports.HOST_MANIFEST_SNIPPET} — Blender writes Scene/Object custom properties to scenes[].extras / nodes[].extras, never to asset.extras, so set it after export `
469
+ + '(gltf-transform: `doc.getRoot().getAsset().extras = { HELIX_vehicle: manifest }`; or edit the JSON chunk). See docs/vehicle-simulate.md#host-manifest';
470
+ /**
471
+ * The add-on host surface. The backend (`src/add-ons/host-manifest.ts` `hostManifestOfGlb`) reads the vehicle's host
472
+ * declaration from glTF `asset.extras.HELIX_vehicle` ONLY; without it the car publishes as a silent non-host (`verification.ok`,
473
+ * a board with no sockets, "0 compatible" in the customizer). The RUNTIME reads scene > document > asset, so a manifest in
474
+ * the scene extras drives fine and is still invisible to the backend — the round-1 F40 defect. These checks make
475
+ * every way to get that wrong an error, before anything is minted.
476
+ */
477
+ function checkHostManifest(glb) {
478
+ const issues = [];
479
+ const add = (code, path, message, fix, level = 'error') => {
480
+ issues.push({ code, level, path, message, fix });
481
+ };
482
+ let gltf;
483
+ try {
484
+ gltf = (0, glb_1.parseGlbJson)(glb);
485
+ }
486
+ catch (error) {
487
+ add('HOST_MANIFEST_UNREADABLE', 'glb', `the GLB JSON chunk cannot be read: ${error instanceof Error ? error.message : String(error)}`, 'export a valid binary glTF (.glb)');
488
+ return issues;
489
+ }
490
+ const asset = isRecord(gltf.asset) ? gltf.asset : undefined;
491
+ const atAsset = asset && isRecord(asset.extras) ? asset.extras[HOST_MANIFEST_KEY] : undefined;
492
+ // Every other place a tool might have put it.
493
+ const elsewhere = [];
494
+ const scenes = Array.isArray(gltf.scenes) ? gltf.scenes : [];
495
+ scenes.forEach((scene, i) => {
496
+ if (isRecord(scene) && isRecord(scene.extras) && scene.extras[HOST_MANIFEST_KEY] !== undefined)
497
+ elsewhere.push({ where: `scenes[${i}].extras.${HOST_MANIFEST_KEY}`, value: scene.extras[HOST_MANIFEST_KEY] });
498
+ });
499
+ if (isRecord(gltf.extras) && gltf.extras[HOST_MANIFEST_KEY] !== undefined)
500
+ elsewhere.push({ where: `extras.${HOST_MANIFEST_KEY} (document root)`, value: gltf.extras[HOST_MANIFEST_KEY] });
501
+ const nodes = Array.isArray(gltf.nodes) ? gltf.nodes : [];
502
+ nodes.forEach((node, i) => {
503
+ if (isRecord(node) && isRecord(node.extras) && node.extras[HOST_MANIFEST_KEY] !== undefined) {
504
+ elsewhere.push({ where: `nodes[${i}${typeof node.name === 'string' ? ` '${node.name}'` : ''}].extras.${HOST_MANIFEST_KEY}`, value: node.extras[HOST_MANIFEST_KEY] });
505
+ }
506
+ });
507
+ if (atAsset === undefined) {
508
+ if (elsewhere.length > 0) {
509
+ add('HOST_MANIFEST_MISPLACED', `glb:${elsewhere[0].where}`, `the vehicle host manifest is at ${elsewhere.map((e) => e.where).join(', ')}, but the backend reads ONLY asset.extras.${HOST_MANIFEST_KEY}: published like this the car is a silent non-host (no sockets, no tunable paths, 0 compatible add-ons) even though it drives`, HOST_FIX);
510
+ }
511
+ else {
512
+ add('HOST_MANIFEST_MISSING', 'glb:asset.extras.HELIX_vehicle', `the vehicle GLB has no asset.extras.${HOST_MANIFEST_KEY}: published like this the car is a silent non-host (no sockets, no tunable paths, 0 compatible add-ons)`, `add the host manifest with the sockets you measured: ${exports.HOST_MANIFEST_SNIPPET}`);
513
+ }
514
+ return issues;
515
+ }
516
+ if (!isRecord(atAsset)) {
517
+ add('HOST_MANIFEST_EMPTY', 'glb:asset.extras.HELIX_vehicle', `asset.extras.${HOST_MANIFEST_KEY} is ${Array.isArray(atAsset) ? 'an array' : typeof atAsset}, not an object`, `make it an object: ${exports.HOST_MANIFEST_SNIPPET}`);
518
+ return issues;
519
+ }
520
+ // The runtime reads scene > document > asset; a different copy elsewhere means the car the runtime drives and the
521
+ // board the backend publishes disagree.
522
+ for (const other of elsewhere) {
523
+ if (JSON.stringify(other.value) !== JSON.stringify(atAsset)) {
524
+ add('HOST_MANIFEST_DIVERGENT', `glb:${other.where}`, `${other.where} differs from asset.extras.${HOST_MANIFEST_KEY}; the runtime reads the scene/document copy first and the backend reads only the asset copy, so the drawn car and its add-on board would disagree`, `delete ${other.where} (or make it byte-identical to the asset copy)`);
525
+ }
526
+ }
527
+ const names = new Set(nodes.map((n) => (isRecord(n) && typeof n.name === 'string' ? n.name : undefined)).filter((n) => n !== undefined));
528
+ const rawSockets = atAsset.sockets;
529
+ let valid = 0;
530
+ if (Array.isArray(rawSockets)) {
531
+ // The backend accepts an array of names; the runtime only reads positions. Names must at least be real nodes.
532
+ rawSockets.forEach((name, i) => {
533
+ if (typeof name !== 'string' || !exports.HOST_SOCKET_NAME_PATTERN.test(name.trim())) {
534
+ add('HOST_MANIFEST_SOCKET_NAME_INVALID', `glb:asset.extras.HELIX_vehicle.sockets[${i}]`, `socket ${JSON.stringify(name)} is not a plain identifier (${exports.HOST_SOCKET_NAME_PATTERN}); the backend drops it`, 'use letters, digits, _ . - * (max 64)');
535
+ }
536
+ else if (!names.has(name.trim())) {
537
+ add('HOST_MANIFEST_SOCKET_NODE_MISSING', `glb:asset.extras.HELIX_vehicle.sockets[${i}]`, `socket '${name}' names no node in the GLB`, `give each socket a position instead: "sockets": { "${name}": [x, y, z] }`);
538
+ }
539
+ else
540
+ valid += 1;
541
+ });
542
+ add('HOST_MANIFEST_SOCKET_INVALID', 'glb:asset.extras.HELIX_vehicle.sockets', 'sockets is an array of names; the runtime reads only { socketId: [x, y, z] } and ignores this form, so the car would not anchor add-ons where the board says it can', 'write sockets as an object of positions in the model frame (+X left, +Y up, +Z forward, metres)');
543
+ }
544
+ else if (isRecord(rawSockets)) {
545
+ for (const [name, value] of Object.entries(rawSockets)) {
546
+ const path = `glb:asset.extras.HELIX_vehicle.sockets.${name}`;
547
+ if (!exports.HOST_SOCKET_NAME_PATTERN.test(name.trim())) {
548
+ add('HOST_MANIFEST_SOCKET_NAME_INVALID', path, `socket name ${JSON.stringify(name)} is not a plain identifier (${exports.HOST_SOCKET_NAME_PATTERN}); the backend drops it from the host surface`, 'rename it with letters, digits, _ . - * (max 64)');
549
+ continue;
550
+ }
551
+ if (!Array.isArray(value) || value.length !== 3 || !value.every((n) => typeof n === 'number' && Number.isFinite(n))) {
552
+ add('HOST_MANIFEST_SOCKET_INVALID', path, `socket '${name}' is ${JSON.stringify(value)}; the runtime ignores anything but [x, y, z] of finite numbers, while the backend still lists it on the board`, `set it to the socket position in the model frame, e.g. "${name}": [0.34, 0.37, -0.10]`);
553
+ continue;
554
+ }
555
+ valid += 1;
556
+ }
557
+ }
558
+ if (valid === 0) {
559
+ add('HOST_MANIFEST_EMPTY', 'glb:asset.extras.HELIX_vehicle.sockets', `asset.extras.${HOST_MANIFEST_KEY} declares no usable socket; the host board would have no sockets and no add-on could anchor to the car`, `declare the sockets you measured: ${exports.HOST_MANIFEST_SNIPPET}`);
560
+ }
561
+ // `socketNodes` binds a socket to real nodes; a name that is not in the scene binds nothing.
562
+ if (atAsset.socketNodes !== undefined) {
563
+ if (!isRecord(atAsset.socketNodes)) {
564
+ add('HOST_MANIFEST_SOCKET_INVALID', 'glb:asset.extras.HELIX_vehicle.socketNodes', 'socketNodes must be an object of { socketId: "node" | ["node", …] }', 'fix or remove socketNodes');
565
+ }
566
+ else {
567
+ for (const [socket, value] of Object.entries(atAsset.socketNodes)) {
568
+ for (const node of (Array.isArray(value) ? value : [value])) {
569
+ if (typeof node !== 'string' || !names.has(node)) {
570
+ add('HOST_MANIFEST_SOCKET_NODE_MISSING', `glb:asset.extras.HELIX_vehicle.socketNodes.${socket}`, `socketNodes.${socket} names ${JSON.stringify(node)}, which is not a node in the GLB`, `use a real node name (the GLB has e.g. ${[...names].slice(0, 10).map((n) => `'${n}'`).join(', ')})`);
571
+ }
572
+ }
573
+ }
574
+ }
575
+ }
576
+ return issues;
577
+ }
578
+ /** Checks that need the model. `pkg` supplies the articulation nodes; it may be anything (checked defensively). */
579
+ function checkVehicleGlb(pkg, glb, engine) {
580
+ const issues = [];
581
+ const add = (code, level, path, message, fix) => {
582
+ issues.push({ code, level, path, message, fix });
583
+ };
584
+ issues.push(...checkHostManifest(glb));
585
+ // Budgets — the existing publish preflight, not a second copy of the limits.
586
+ const preflight = (0, avatarPreflight_1.preflightAvatar)(glb, 'vehicle');
587
+ for (const finding of preflight.findings) {
588
+ add(`VEHICLE_BUDGET_${finding.code.toUpperCase().replace(/-/g, '_')}`, finding.severity === 'error' ? 'error' : 'warn', 'glb', finding.message, 'reduce the model to the vehicle publish budget (90,000 triangles, 48 materials, 2048 px textures, 16 MiB, 24 draw calls)');
589
+ }
590
+ const gltf = (0, glb_1.parseGlbJson)(glb);
591
+ const nodes = gltf.nodes ?? [];
592
+ const facts = walkNodes(gltf);
593
+ const names = [...facts.values()].map((f) => f.name);
594
+ const prefix = engine.detectNodePrefix(names);
595
+ // The host-frame bind contract: a host that offers a lid socket must carry the nodes a bound add-on composes against.
596
+ // A missing one makes the runtime throw while composing the car, so it is never presented and nothing reports why.
597
+ issues.push(...hostBindIssues(gltf, facts, engine));
598
+ // Wheel resolution: by name, through the engine's own socket resolver (steering resolves before wheel rules).
599
+ const byId = new Map();
600
+ for (const fact of facts.values()) {
601
+ const id = engine.resolveSocketName(fact.name, prefix).id;
602
+ if (id === undefined || !WHEEL_IDS.includes(id))
603
+ continue;
604
+ byId.set(id, [...(byId.get(id) ?? []), fact]);
605
+ }
606
+ // A wheel's tyre, rim and brake nodes often nest under one named group: keep the outermost node of each id.
607
+ const outermost = (list) => {
608
+ const set = new Set(list.map((f) => f.index));
609
+ return list.filter((fact) => {
610
+ for (let p = fact.parent; p !== undefined; p = facts.get(p)?.parent)
611
+ if (set.has(p))
612
+ return false;
613
+ return true;
614
+ });
615
+ };
616
+ const found = WHEEL_IDS.filter((id) => (byId.get(id)?.length ?? 0) > 0);
617
+ const missing = WHEEL_IDS.filter((id) => !found.includes(id));
618
+ const resolvedDescription = [...byId.entries()].map(([id, list]) => `${id}=${list.map((f) => `'${f.name}'`).join('+')}`).join(', ');
619
+ const wheelLikeNames = names.filter((name) => /wheel|tyre|tire|rim/i.test(name)).slice(0, 12);
620
+ if (missing.length > 0) {
621
+ add('WHEEL_NODES_MISSING', 'error', 'glb', `${found.length} of 4 wheel nodes resolve by name (found: ${resolvedDescription || 'none'}; missing: ${missing.join(', ')}); the runtime discards a partial set and falls back to a preset${wheelLikeNames.length > 0 ? `; wheel-like node names in the file: ${wheelLikeNames.map((n) => `'${n}'`).join(', ')}` : ''}`, 'name one node per wheel wheel_lf / wheel_rf / wheel_lr / wheel_rr (left = +X, front = +Z); avoid arch, well, liner, flare, guard, fender, cover, hubcap, spare, nut, bolt in those names');
622
+ }
623
+ const hubs = new Map();
624
+ for (const id of found) {
625
+ const list = outermost(byId.get(id));
626
+ let union;
627
+ for (const fact of list) {
628
+ const box = subtreeBox(fact.index, gltf, facts);
629
+ if (!box)
630
+ continue;
631
+ union = growAabb(union, box.min);
632
+ union = growAabb(union, box.max);
633
+ const centre = centreOf(box);
634
+ const origin = worldOrigin(fact);
635
+ const offset = distance(origin, centre);
636
+ if (offset > exports.WHEEL_PIVOT_TOLERANCE_M) {
637
+ add('WHEEL_PIVOT_NOT_AT_HUB', 'error', `glb:node:${fact.name}`, `${id} node '${fact.name}' has its origin at ${fmtVec(origin)} but its geometry is centred at ${fmtVec(centre)} — ${fmt(offset)} m off the hub (limit ${exports.WHEEL_PIVOT_TOLERANCE_M} m); wheel add-ons anchor at the node origin, so they would land ${fmt(offset)} m from the wheel`, `move the node origin to the hub centre ${fmtVec(centre)} (Blender: select the wheel, Object > Set Origin > Origin to Geometry) and re-export`);
638
+ }
639
+ }
640
+ if (union)
641
+ hubs.set(id, centreOf(union));
642
+ else {
643
+ const first = list[0];
644
+ hubs.set(id, worldOrigin(first));
645
+ add('WHEEL_NODE_EMPTY', 'warn', `glb:node:${first.name}`, `${id} node '${first.name}' has no geometry in its subtree, so the pivot cannot be checked and nothing will spin`, 'put the wheel meshes under (or on) the wheel node');
646
+ }
647
+ }
648
+ if (found.length === 4) {
649
+ const origins = new Map(found.map((id) => [id, worldOrigin(outermost(byId.get(id))[0])]));
650
+ for (let i = 0; i < WHEEL_IDS.length; i += 1) {
651
+ for (let j = i + 1; j < WHEEL_IDS.length; j += 1) {
652
+ const a = WHEEL_IDS[i];
653
+ const b = WHEEL_IDS[j];
654
+ if (distance(origins.get(a), origins.get(b)) < 0.001) {
655
+ add('WHEEL_ORIGINS_NOT_DISTINCT', 'error', 'glb', `${a} and ${b} have the same origin ${fmtVec(origins.get(a))}; four wheels cannot share a pivot`, 'give each wheel node its own origin at its hub centre');
656
+ }
657
+ }
658
+ }
659
+ const hub = (id) => hubs.get(id);
660
+ if (!(hub('wheel_lf')[0] > hub('wheel_rf')[0]) || !(hub('wheel_lr')[0] > hub('wheel_rr')[0])) {
661
+ add('WHEEL_FRAME_MIRRORED_X', 'error', 'glb', `left wheels are not at +X: wheel_lf x=${fmt(hub('wheel_lf')[0])}, wheel_rf x=${fmt(hub('wheel_rf')[0])}, wheel_lr x=${fmt(hub('wheel_lr')[0])}, wheel_rr x=${fmt(hub('wheel_rr')[0])}; the model frame is glTF +X LEFT`, 'mirror the model on X (or swap the left/right wheel names) so the left side is +X');
662
+ }
663
+ if (!(hub('wheel_lf')[2] > hub('wheel_lr')[2]) || !(hub('wheel_rf')[2] > hub('wheel_rr')[2])) {
664
+ add('WHEEL_FRAME_FRONT_NOT_PLUS_Z', 'error', 'glb', `front wheels are not at +Z: wheel_lf z=${fmt(hub('wheel_lf')[2])}, wheel_lr z=${fmt(hub('wheel_lr')[2])}, wheel_rf z=${fmt(hub('wheel_rf')[2])}, wheel_rr z=${fmt(hub('wheel_rr')[2])}; the model frame is glTF +Z FORWARD`, 'rotate the model 180 degrees about Y (or swap the front/rear wheel names) so the front is +Z');
665
+ }
666
+ }
667
+ const size = preflight.summary.boundingBox?.sizeMeters;
668
+ if (size && size[0] > size[2]) {
669
+ add('LENGTH_NOT_ALONG_Z', 'warn', 'glb', `the model is ${fmt(size[0])} m along X and ${fmt(size[2])} m along Z; a car's longest horizontal extent should be Z (forward)`, 'rotate the model 90 degrees about Y so the length runs along Z');
670
+ }
671
+ // Lamps: one node per light function, each with its own emissive material (docs/vehicles.md §4).
672
+ const pkgRecord = isRecord(pkg) ? pkg : undefined;
673
+ const lights = pkgRecord && isRecord(pkgRecord.lights) ? pkgRecord.lights : undefined;
674
+ const lamps = lights && Array.isArray(lights.lamps) ? lights.lamps : undefined;
675
+ if (lamps && lamps.length > 0) {
676
+ const identityOf = new Map();
677
+ for (const fact of facts.values()) {
678
+ const key = nodeIdentity(fact.name, prefix, engine);
679
+ identityOf.set(key, [...(identityOf.get(key) ?? []), fact.index]);
680
+ }
681
+ const identity = (name) => nodeIdentity(name, prefix, engine);
682
+ const indicesFor = (name) => identityOf.get(identity(name)) ?? [];
683
+ // 1. Every lamp row's declared node must be a real node (optional lamps only warn when absent).
684
+ const declared = new Set();
685
+ lamps.forEach((row, i) => {
686
+ if (!isRecord(row) || typeof row.node !== 'string' || row.node.trim() === '')
687
+ return;
688
+ const nodeName = row.node.trim();
689
+ if (declared.has(nodeName))
690
+ return;
691
+ declared.add(nodeName);
692
+ if (indicesFor(nodeName).length > 0)
693
+ return;
694
+ if (exports.REQUIRED_LAMP_FUNCTIONS.includes(nodeName))
695
+ return; // named by LAMP_FUNCTION_NODE_MISSING
696
+ if (exports.OPTIONAL_LAMP_FUNCTIONS.includes(nodeName)) {
697
+ add('LAMP_NODE_MISSING', 'warn', `lights.lamps[${i}].node`, `optional lamp node '${nodeName}' is declared but is not in the model`, `add a '${nodeName}' node or drop the lamp row`);
698
+ return;
699
+ }
700
+ add('LAMP_NODE_MISSING', 'error', `lights.lamps[${i}].node`, `lamp '${String(row.id)}' names node '${nodeName}', which is not in the model`, `add a '${nodeName}' node or correct the lamp's node`);
701
+ });
702
+ // 2. The six required functions must each be their own node — the round-3 defect merged them into the body.
703
+ const missingRequired = exports.REQUIRED_LAMP_FUNCTIONS.filter((fn) => indicesFor(fn).length === 0);
704
+ if (missingRequired.length > 0) {
705
+ add('LAMP_FUNCTION_NODE_MISSING', 'error', 'glb', `${missingRequired.length} of 6 required lamp nodes are missing from the model (${missingRequired.join(', ')}); lamp geometry merged into the body cannot be lit, aimed or indicated`, 'give each light function its own node — headlamps, foglights, taillamps, reverselights, indicator_l, indicator_r — with its own emissive material (docs/vehicles.md §4)');
706
+ }
707
+ // 3/4. A required lamp node must not share the body's material, and must carry an emissive material of its own.
708
+ const lampIndices = new Set(exports.REQUIRED_LAMP_FUNCTIONS.flatMap((fn) => indicesFor(fn)));
709
+ const bodyIndices = [...facts.values()]
710
+ .filter((fact) => BODY_NODE_KEYS.has(nodeIdentity(fact.name, prefix, engine)))
711
+ .map((fact) => fact.index);
712
+ const bodyMaterials = subtreeMaterialIndices(bodyIndices, gltf, lampIndices);
713
+ for (const fn of exports.REQUIRED_LAMP_FUNCTIONS) {
714
+ const indices = indicesFor(fn);
715
+ if (indices.length === 0)
716
+ continue;
717
+ const label = facts.get(indices[0])?.name ?? fn;
718
+ const own = subtreeMaterialIndices(indices, gltf, new Set());
719
+ const shared = [...own].filter((material) => bodyMaterials.has(material));
720
+ if (shared.length > 0) {
721
+ add('LAMP_MATERIAL_SHARED', 'error', `glb:node:${label}`, `lamp node '${label}' binds material ${shared.join(', ')}, the same material as the body — lamp geometry merged into the body cannot light or aim on its own`, `give '${fn}' its own emissive material, distinct from the body's`);
722
+ }
723
+ else if (own.size > 0 && ![...own].some((material) => isEmissiveMaterial(gltf.materials?.[material]))) {
724
+ add('LAMP_MATERIAL_NOT_EMISSIVE', 'error', `glb:node:${label}`, `lamp node '${label}' has no emissive material (no emissiveFactor and no emissiveTexture); it would light black or borrow the body's colour`, `give '${fn}' a material with a non-black emissiveFactor (or an emissiveTexture)`);
725
+ }
726
+ }
727
+ }
728
+ // Lamp and panel COVERAGE (lampCoverage.ts / panelCoverage.ts): every lens lights, indicators cover front and rear,
729
+ // and the car opens the lids the real car opens.
730
+ if (lamps && lamps.length > 0) {
731
+ const coverageIdentity = new Map();
732
+ for (const fact of facts.values()) {
733
+ const key = nodeIdentity(fact.name, prefix, engine);
734
+ coverageIdentity.set(key, [...(coverageIdentity.get(key) ?? []), fact.index]);
735
+ }
736
+ issues.push(...(0, lampCoverage_1.checkLampCoverage)({ pkg: isRecord(pkg) ? pkg : undefined, gltf, facts, indicesFor: (name) => coverageIdentity.get(nodeIdentity(name, prefix, engine)) ?? [] }));
737
+ }
738
+ issues.push(...(0, panelCoverage_1.checkPanelCoverage)({ pkg: isRecord(pkg) ? pkg : undefined, gltf, facts, wheelsFound: found.length }));
739
+ // Articulation panel nodes must exist in the model.
740
+ const mesh = pkgRecord && isRecord(pkgRecord.mesh) ? pkgRecord.mesh : undefined;
741
+ const articulation = mesh && isRecord(mesh.articulation) ? mesh.articulation : undefined;
742
+ const panels = articulation && Array.isArray(articulation.panels) ? articulation.panels : [];
743
+ const nodeNames = new Set(nodes.map((node) => node.name).filter((name) => typeof name === 'string'));
744
+ panels.forEach((panel, panelIndex) => {
745
+ if (!isRecord(panel) || !Array.isArray(panel.nodes))
746
+ return;
747
+ panel.nodes.forEach((name, nodeIndex) => {
748
+ if (typeof name === 'string' && !nodeNames.has(name)) {
749
+ add('PANEL_NODE_MISSING', 'error', `mesh.articulation.panels[${panelIndex}].nodes[${nodeIndex}]`, `panel "${String(panel.id)}" names node '${name}', which is not in the GLB`, `rename the node in the model to '${name}' or correct the panel's nodes list`);
750
+ }
751
+ });
752
+ });
753
+ return issues;
754
+ }
755
+ /** The host alone: the lid mount nodes and the host-frame root an offered `boot`/`bonnet` socket needs (`hostFrame.ts`). */
756
+ function hostBindIssues(gltf, facts, engine) {
757
+ const asset = gltf.asset;
758
+ const extras = isRecord(asset) && isRecord(asset.extras) ? asset.extras : undefined;
759
+ return (0, hostFrame_1.checkHostOffersBindableNodes)({ offered: (0, hostFrame_1.offeredSocketKeys)(extras?.[HOST_MANIFEST_KEY]), index: (0, hostFrame_1.buildHostFrameIndex)(facts, engine) });
760
+ }
761
+ /** `hostBindIssues` for a GLB on its own (the rail check reads a published car's bytes). */
762
+ function checkHostBindNodesOfGlb(glb, engine) {
763
+ const gltf = (0, glb_1.parseGlbJson)(glb);
764
+ return hostBindIssues(gltf, walkNodes(gltf), engine);
765
+ }
766
+ /** The host GLB's node index for the host-frame bind contract (`hostFrame.ts`): names, socket nodes, ancestry. */
767
+ function hostFrameIndexOfGlb(glb, engine) {
768
+ return (0, hostFrame_1.buildHostFrameIndex)(walkNodes((0, glb_1.parseGlbJson)(glb)), engine);
769
+ }
770
+ // ── 3. entry points ───────────────────────────────────────────────────────────────────────────────────────────
771
+ function summarizeIssues(issues, engineCommit) {
772
+ const errors = issues.filter((issue) => issue.level === 'error').length;
773
+ return { ok: errors === 0, errors, warnings: issues.length - errors, issues, engineCommit };
774
+ }
775
+ /**
776
+ * The offline drive: when the package declares `targets`, drive it with the platform's own instrument and turn every
777
+ * out-of-tolerance figure into an ERROR. A runtime that cannot be loaded is a WARNING — validation must still work
778
+ * offline with nothing cached — and so is an engine that refuses the package (the engine validator above has already
779
+ * reported why).
780
+ */
781
+ async function simulationIssues(pkg, opts) {
782
+ const { simulateVehicle, targetsFromPackage } = await Promise.resolve().then(() => __importStar(require('./simulate')));
783
+ if (targetsFromPackage(pkg).length === 0)
784
+ return { issues: [], report: null };
785
+ const { loadEngineRuntime } = await Promise.resolve().then(() => __importStar(require('./simulateRuntime')));
786
+ let runtime;
787
+ try {
788
+ runtime = await loadEngineRuntime({ apiUrl: opts.apiUrl, offline: opts.offline, runtime: opts.runtime, range: opts.range });
789
+ }
790
+ catch (error) {
791
+ return { report: null, issues: [{ code: 'SIMULATION_UNAVAILABLE', level: 'warn', path: 'targets', message: `the drive targets were not checked: ${error instanceof Error ? error.message : String(error)}`, fix: 'run `helix vehicle simulate` with network access once (the runtime is then cached), or pass --no-simulate' }] };
792
+ }
793
+ let report;
794
+ try {
795
+ report = await simulateVehicle(pkg, runtime, { skipTurboLag: true });
796
+ }
797
+ catch (error) {
798
+ return { report: null, issues: [{ code: 'SIMULATION_UNAVAILABLE', level: 'warn', path: 'targets', message: `the drive targets were not checked: ${error instanceof Error ? error.message : String(error)}`, fix: 'fix the errors above, then re-run' }] };
799
+ }
800
+ const issues = [];
801
+ const pct = (v) => `${v >= 0 ? '+' : ''}${(v * 100).toFixed(1)}%`;
802
+ for (const c of report.comparisons.filter((row) => !row.pass)) {
803
+ issues.push({
804
+ code: 'SIMULATED_PERFORMANCE_OUT_OF_TOLERANCE', level: 'error', path: c.path,
805
+ message: c.measured === null
806
+ ? `${c.figure}: the engine instrument could not measure it (target ${c.target} ${c.unit})${c.note ? `; ${c.note}` : ''} [engine ${report.runtime.version}]`
807
+ : `${c.figure}: simulated ${+c.measured.toFixed(3)} ${c.unit} vs target ${c.target} ${c.unit} (${pct(c.error ?? 0)}, tolerance ±${+(c.tolerance * 100).toFixed(1)}%)${c.note ? `; ${c.note}` : ''} [engine ${report.runtime.version}, ${report.runtime.source}]`,
808
+ fix: 'tune the physics until `helix vehicle simulate` passes (the target is the real car; never widen a tolerance to hide a miss)',
809
+ });
810
+ }
811
+ for (const failure of report.restFailures) {
812
+ issues.push({ code: 'SIMULATED_REST_POSE_INVALID', level: 'error', path: 'physics.suspension', message: `in the engine instrument the car ${failure} [engine ${report.runtime.version}]`,
813
+ fix: 'check suspension rest length, spring rates and the centre of mass; `helix vehicle simulate` prints the rest pose' });
814
+ }
815
+ // A WARNING, not an error, even on FAIL: a faithful car whose torque exceeds its rear grip in the low gears (a real
816
+ // no-TC supercar) cannot pass without either moving off its real figures or authoring traction control as a declared
817
+ // playability aid — an author's call, not the validator's. `vehicle simulate` still exits 1 on FAIL.
818
+ const kb = report.keyboardLaunch;
819
+ if (kb && kb.verdict !== 'PASS') {
820
+ issues.push({
821
+ code: kb.verdict === 'FAIL' ? 'SIMULATED_KEYBOARD_LAUNCH_UNDRIVABLE' : 'SIMULATED_KEYBOARD_LAUNCH_MARGINAL',
822
+ level: 'warn',
823
+ path: 'simulation.land',
824
+ message: `full-throttle keyboard launch ${kb.verdict}${kb.verdict === 'FAIL' ? ' (not drivable on a keyboard)' : ''}: ${kb.reasons.map((x) => x.replace(/^(FAIL|WARN): /, '')).join('; ')} [engine ${report.runtime.version}]`,
825
+ fix: report.tractionControl?.enabled
826
+ ? 'traction control is on but the car still lets go: lower simulation.land.tractionControl.targetSlip, raise cutRate, set upshiftTorqueRamp: true; then LSD lock/preload, rear tyre grip and load sensitivity — skills/helix-vehicles/references/physics-from-specs.md "Traction control"; re-check with `helix vehicle simulate`'
827
+ : 'make the car stable under full throttle without moving it off its real figures: LSD lock/preload, rear tyre grip and load sensitivity, low-gear torque (real boost build-up via the turbine), launch clutch rpm — or author simulation.land.tractionControl (the real system if the maker fitted one; otherwise a declared playability aid) — skills/helix-vehicles/references/physics-from-specs.md "Drivable on a keyboard" and "Traction control"; re-check with `helix vehicle simulate`',
828
+ });
829
+ }
830
+ issues.push(...report.policy);
831
+ for (const note of report.runtime.warnings)
832
+ issues.push({ code: 'SIMULATION_RUNTIME_NOTE', level: 'warn', path: 'targets', message: note, fix: 'update @helix3/helix-cli' });
833
+ return { issues, report };
834
+ }
835
+ /**
836
+ * The offline cabin check (`cabinCheck.ts`) as validation issues: every FAIL row is an ERROR, every WARN row a warning, each naming the seat,
837
+ * the row and the figure. A runtime that cannot be loaded or a model it cannot read is a WARNING (validation must still work offline with
838
+ * nothing cached), like the drive.
839
+ */
840
+ async function cabinIssues(pkg, glb, opts) {
841
+ const { checkCabin } = await Promise.resolve().then(() => __importStar(require('./cabinCheck')));
842
+ const { loadEngineRuntime } = await Promise.resolve().then(() => __importStar(require('./simulateRuntime')));
843
+ const fix = 'run `helix vehicle cabin-check <dir>` (seconds, offline) and iterate on the cabin geometry; confirm with `helix vehicle preview <dir> --occupants`';
844
+ let report;
845
+ try {
846
+ const runtime = await loadEngineRuntime({ apiUrl: opts.apiUrl, offline: opts.offline, runtime: opts.runtime, range: opts.range });
847
+ report = await checkCabin({ pkg, glb }, runtime);
848
+ }
849
+ catch (error) {
850
+ return { report: null, issues: [{ code: 'CABIN_CHECK_UNAVAILABLE', level: 'warn', path: 'glb:cabin', message: `the cabin was not checked: ${error instanceof Error ? error.message : String(error)}`, fix }] };
851
+ }
852
+ const issues = [];
853
+ for (const seat of report.seats) {
854
+ for (const row of seat.rows) {
855
+ if (row.status !== 'FAIL' && row.status !== 'WARN')
856
+ continue;
857
+ issues.push({ code: row.status === 'FAIL' ? 'CABIN_CHECK_FAIL' : 'CABIN_CHECK_WARN', level: row.status === 'FAIL' ? 'error' : 'warn', path: `cabin:${seat.id}:${row.id}`, message: `${seat.id} ${row.id}: ${row.detail} [engine ${report.engine.version}]`, fix });
858
+ }
859
+ }
860
+ if (report.steering && (report.steering.status === 'FAIL' || report.steering.status === 'WARN')) {
861
+ issues.push({ code: report.steering.status === 'FAIL' ? 'CABIN_CHECK_FAIL' : 'CABIN_CHECK_WARN', level: report.steering.status === 'FAIL' ? 'error' : 'warn', path: 'cabin:steering', message: `steering wheel: ${report.steering.detail} [engine ${report.engine.version}]`, fix });
862
+ }
863
+ return { issues, report };
864
+ }
865
+ /**
866
+ * Run every check. `glb` is optional; without it the model checks are simply not run. `simulate` adds the offline
867
+ * drive (needs the engine runtime: fetched once, then cached); without it nothing touches the network.
868
+ */
869
+ async function validateVehicle(pkg, glb, options = {}) {
870
+ const engine = await loadVehicleValidator();
871
+ const issues = checkVehiclePackage(pkg, engine);
872
+ if (glb)
873
+ issues.push(...checkVehicleGlb(pkg, glb, engine));
874
+ if (!options.simulate && !options.cabin) {
875
+ issues.push(...(0, enginePolicy_1.enginePolicyIssues)(pkg));
876
+ return summarizeIssues(issues, engine.VEHICLE_PACKAGE_V2_SOURCE.commit);
877
+ }
878
+ // A package the engine refuses cannot be driven; its errors are already listed.
879
+ const engineRefuses = issues.some((i) => i.level === 'error' && (i.code === 'ENGINE_VALIDATOR' || i.code === 'ENGINE_VALIDATOR_CRASH' || i.code === 'PACKAGE_NOT_OBJECT'));
880
+ const sim = options.simulate && !engineRefuses ? await simulationIssues(pkg, options.simulate) : { issues: [], report: null };
881
+ issues.push(...sim.issues);
882
+ const cab = options.cabin && glb && !engineRefuses ? await cabinIssues(pkg, glb, options.cabin) : { issues: [], report: null };
883
+ issues.push(...cab.issues);
884
+ // The simulation's own policy findings are already in `sim.issues`; without a report, fall back to the static pass.
885
+ if (!sim.report)
886
+ issues.push(...(0, enginePolicy_1.enginePolicyIssues)(pkg));
887
+ return { ...summarizeIssues(issues, engine.VEHICLE_PACKAGE_V2_SOURCE.commit), simulation: sim.report, ...(options.cabin ? { cabin: cab.report } : {}) };
888
+ }
889
+ /** One block per issue: `✗ CODE path — message` then an indented fix line. */
890
+ function formatVehicleIssues(issues) {
891
+ return issues
892
+ .map((issue) => `${issue.level === 'error' ? '✗' : '⚠'} ${issue.code} ${issue.path} — ${issue.message}\n fix: ${issue.fix}`)
893
+ .join('\n');
894
+ }
895
+ /** Used by `item publish`: errors refuse, warnings are returned for display. */
896
+ async function assertVehiclePackagePublishable(pkg) {
897
+ const result = await validateVehicle(pkg);
898
+ const errors = result.issues.filter((issue) => issue.level === 'error');
899
+ if (errors.length > 0) {
900
+ throw new Error(`--vehicle-package failed the engine/backend contract (${errors.length} error${errors.length === 1 ? '' : 's'}); the runtime would refuse to spawn it or the server would refuse to pin it:\n${formatVehicleIssues(errors)}\n`
901
+ + ' run `helix vehicle validate <vehicle-package.json> --glb <model.glb>` to re-check locally');
902
+ }
903
+ return result.issues;
904
+ }
905
+ function readJsonFile(path) {
906
+ return JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'));
907
+ }
908
+ /** Refuses a vehicle model whose host manifest the backend would not read (a silent non-host). */
909
+ function assertVehicleHostManifest(glb) {
910
+ const errors = checkHostManifest(glb).filter((issue) => issue.level === 'error');
911
+ if (errors.length > 0) {
912
+ throw new Error(`the vehicle model is not an add-on host the backend can read (${errors.length} error${errors.length === 1 ? '' : 's'}); nothing was minted:\n${formatVehicleIssues(errors)}\n`
913
+ + ' run `helix vehicle validate <vehicle-package.json> --glb <model.glb>` to re-check locally');
914
+ }
915
+ }
916
+ /**
917
+ * The Package-first gate: a `vehicle` Package Version descriptor whose drawn model (a GLB object carried as bytes)
918
+ * has no host manifest the backend can read is refused before anything is sealed. Adopted / existing objects carry
919
+ * no bytes here and are not re-checked (their model was judged when it was first sealed).
920
+ */
921
+ function vehiclePackageDescriptorHostIssues(descriptor, objects) {
922
+ if (descriptor.package?.type !== 'vehicle')
923
+ return [];
924
+ const issues = [];
925
+ for (const object of objects) {
926
+ const { mediaType, role } = object.reference;
927
+ const isModel = mediaType === 'model/gltf-binary' && (role === undefined || role.startsWith('vehicle.model'));
928
+ if (!isModel || object.source.kind !== 'inline' || !object.source.bytes)
929
+ continue;
930
+ const label = object.source.filename ?? role ?? 'model';
931
+ for (const issue of checkHostManifest(Buffer.from(object.source.bytes)))
932
+ issues.push({ ...issue, path: `${label}:${issue.path}` });
933
+ }
934
+ return issues;
935
+ }
936
+ function assertVehiclePackageDescriptorHost(descriptor, objects) {
937
+ const errors = vehiclePackageDescriptorHostIssues(descriptor, objects).filter((issue) => issue.level === 'error');
938
+ if (errors.length > 0) {
939
+ throw new Error(`the vehicle model is not an add-on host the backend can read (${errors.length} error${errors.length === 1 ? '' : 's'}); nothing was sealed:\n${formatVehicleIssues(errors)}\n`
940
+ + ' run `helix vehicle validate <vehicle-package.json> --glb <model.glb>` to re-check locally');
941
+ }
942
+ }
943
+ /**
944
+ * The `item publish` gate (publish, `--dry-run`, `--quote`): refuses a vehicle package with errors and a vehicle
945
+ * model with no readable host manifest (when the mesh bytes are given), and returns the package's warnings.
946
+ */
947
+ async function assertPublishVehiclePackage(opts, meshBytes) {
948
+ if (opts.kind !== 'vehicle')
949
+ return [];
950
+ if (meshBytes)
951
+ assertVehicleHostManifest(meshBytes);
952
+ if (opts.vehiclePackage === undefined)
953
+ return [];
954
+ return assertVehiclePackagePublishable(opts.vehiclePackage);
955
+ }
956
+ //# sourceMappingURL=validate.js.map