@hypersoniclabs/helix-cli 0.1.7 → 0.1.23

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 +627 -6
  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 +61 -0
  577. package/dist/character/fbx.js +360 -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 +853 -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 +10 -0
  604. package/dist/character/meshyToHelixMap.js +92 -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 +8 -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 +53 -16
  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 +66 -22
  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 +42 -0
  971. package/dist/itemSetVersion.js +94 -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 +2001 -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 +30 -0
  1554. package/dist/visualQa/vehicleInspection.js +189 -0
  1555. package/dist/visualQa/vehicleInspection.js.map +1 -0
  1556. package/dist/visualQa/vehicleLamps.d.ts +118 -0
  1557. package/dist/visualQa/vehicleLamps.js +374 -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
@@ -1,31 +1,55 @@
1
1
  "use strict";
2
- // PORTED from helix-web-engine-new/tools/character-pipeline — the source of truth for the character
3
- // pipeline. SYNC OBLIGATION: fix bugs there first, then mirror the change here; do not diverge.
2
+ // CANONICAL HELIX character conversion implementation. Shared conversion fixes belong here and are
3
+ // exposed through Bridge; runtime repositories consume the CLI contract instead of owning a fork.
4
4
  // This file folds the engine tool's four drivers (retarget-cli, conform-cli, retarget-clip-cli,
5
5
  // package-cli) into the one `helix character import` flow; the stage code itself is ported verbatim.
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.CANONICAL_BODY_FILENAME = void 0;
7
+ exports.DEFAULT_FACE_DETAIL = exports.CANONICAL_BODY_FILENAME = void 0;
8
+ exports.retainHighestDetailSourceLods = retainHighestDetailSourceLods;
9
+ exports.faceTriShareForLevel = faceTriShareForLevel;
8
10
  exports.findCanonicalBody = findCanonicalBody;
11
+ exports.selectDefaultBoneMap = selectDefaultBoneMap;
12
+ exports.prepareCharacterSource = prepareCharacterSource;
13
+ exports.retargetAnimation = retargetAnimation;
14
+ exports.assertCanonicalCharacterGeometry = assertCanonicalCharacterGeometry;
9
15
  exports.importCharacter = importCharacter;
16
+ const node_crypto_1 = require("node:crypto");
10
17
  const node_fs_1 = require("node:fs");
11
18
  const node_path_1 = require("node:path");
12
19
  const core_1 = require("@gltf-transform/core");
13
20
  const extensions_1 = require("@gltf-transform/extensions");
14
21
  const functions_1 = require("@gltf-transform/functions");
22
+ const meshoptimizer_1 = require("meshoptimizer");
15
23
  const install_1 = require("../install");
16
24
  const esm_1 = require("./esm");
17
25
  const meshyToHelixMap_1 = require("./meshyToHelixMap");
26
+ const metahumanToHelixMap_1 = require("./metahumanToHelixMap");
18
27
  const retarget_1 = require("./stages/retarget");
19
28
  const conform_1 = require("./stages/conform");
29
+ const addonPushOut_1 = require("./addonPushOut");
30
+ const poseAwareFit_1 = require("./stages/poseAwareFit");
31
+ const mat4_1 = require("./mat4");
32
+ const sanitizeMaterials_1 = require("./stages/sanitizeMaterials");
33
+ const limbBridge_1 = require("./stages/limbBridge");
20
34
  const canonicalSkeleton_1 = require("./canonicalSkeleton");
21
35
  const retargetClip_1 = require("./stages/retargetClip");
22
36
  const simplifyMesh_1 = require("./stages/simplifyMesh");
23
37
  const weldedSimplify_1 = require("./stages/weldedSimplify");
24
38
  const bakeTexture_1 = require("./stages/bakeTexture");
25
39
  const splitFacePrimitive_1 = require("./stages/splitFacePrimitive");
40
+ const faceRegion_1 = require("./stages/faceRegion");
26
41
  const mergeLods_1 = require("./stages/mergeLods");
42
+ const slotBudgets_1 = require("./slotBudgets");
27
43
  const resizeTextures_1 = require("./stages/resizeTextures");
44
+ const unifyMaterial_1 = require("./stages/unifyMaterial");
45
+ const joinPerMesh_1 = require("./stages/joinPerMesh");
28
46
  const ktx2_1 = require("./stages/ktx2");
47
+ const fbx_1 = require("./fbx");
48
+ const unrealMaterialSidecar_1 = require("./unrealMaterialSidecar");
49
+ const untrustedSource_1 = require("./untrustedSource");
50
+ const importTrust_1 = require("./importTrust");
51
+ const faceManifest_1 = require("./faceManifest");
52
+ const helixPalette_1 = require("./helixPalette");
29
53
  exports.CANONICAL_BODY_FILENAME = 'body-m-default.web.glb';
30
54
  const DEFAULT_CLIP_NAME = 'locomotion.warriorWalk';
31
55
  /** Canonical bones the conform cannot approximate from neighbours — the map must cover every one
@@ -37,7 +61,7 @@ const REQUIRED_TARGETS = [
37
61
  'thigh_l', 'calf_l', 'foot_l', 'thigh_r', 'calf_r', 'foot_r',
38
62
  ];
39
63
  /** Throws a diagnosis-quality error when the source rig is not what the bone map expects. */
40
- function assertMapCoverage(body, boneMap, log) {
64
+ function assertFullCharacterMapCoverage(body, boneMap, log) {
41
65
  const coverage = (0, retarget_1.checkMapCoverage)(body, boneMap);
42
66
  if (coverage.sourceJoints === 0) {
43
67
  throw new Error('character import: the source GLB has no skinned character (no skin joints found) — export the character WITH its rig');
@@ -60,6 +84,143 @@ function assertMapCoverage(body, boneMap, log) {
60
84
  log(`⚠ ${coverage.extra.length} source bone(s) not covered by the map (kept as-is; their deformation is unverified): [${coverage.extra.join(', ')}]`);
61
85
  }
62
86
  }
87
+ function mappedTargetForJoint(joint, boneMap) {
88
+ let current = joint;
89
+ while (current !== null) {
90
+ const target = boneMap.map[current.getName()];
91
+ if (target !== undefined)
92
+ return target;
93
+ current = current.listParents().find((parent) => parent.propertyType === core_1.PropertyType.NODE) ?? null;
94
+ }
95
+ return null;
96
+ }
97
+ /** Add-ons may intentionally carry only the local rig subset their vertices use. They still have to
98
+ * be a lossless subset of helix-humanoid@1: every source joint must resolve through a mapped ancestor,
99
+ * every positive influence must resolve, and at least one deforming influence must target anatomy
100
+ * below the root. This admits modular MetaHuman garments without treating arbitrary partial rigs as
101
+ * characters or silently collapsing an incompatible rig onto the root. */
102
+ function assertAddonMapCoverage(body, boneMap, log) {
103
+ const coverage = (0, retarget_1.checkMapCoverage)(body, boneMap);
104
+ if (coverage.sourceJoints === 0) {
105
+ throw new Error('character add-on import: the source GLB has no skinned add-on (no skin joints found) — export the add-on WITH its rig');
106
+ }
107
+ if (coverage.matched.length === 0) {
108
+ const sample = coverage.extra.slice(0, 8).join(', ') + (coverage.extra.length > 8 ? ', …' : '');
109
+ throw new Error(`character add-on import: the source rig matches none of the '${boneMap.name}' bone map. Source joints: [${sample}]`);
110
+ }
111
+ const canonicalJoints = new Set((0, canonicalSkeleton_1.vendoredCanonicalSkeleton)().jointNames);
112
+ const unresolved = new Set();
113
+ const invalidTargets = new Set();
114
+ const targetByJoint = new Map();
115
+ for (const skin of body.getRoot().listSkins()) {
116
+ for (const joint of skin.listJoints()) {
117
+ const target = mappedTargetForJoint(joint, boneMap);
118
+ if (target === null)
119
+ unresolved.add(joint.getName());
120
+ else if (!canonicalJoints.has(target))
121
+ invalidTargets.add(target);
122
+ else
123
+ targetByJoint.set(joint, target);
124
+ }
125
+ }
126
+ if (unresolved.size > 0) {
127
+ throw new Error(`character add-on import: incompatible partial rig — joint(s) have no mapped ancestor in '${boneMap.name}': [${[...unresolved].join(', ')}]`);
128
+ }
129
+ if (invalidTargets.size > 0) {
130
+ throw new Error(`character add-on import: bone map targets are not in helix-humanoid@1: [${[...invalidTargets].join(', ')}]`);
131
+ }
132
+ let positiveInfluences = 0;
133
+ const deformingTargets = new Set();
134
+ for (const node of body.getRoot().listNodes()) {
135
+ const skin = node.getSkin();
136
+ const mesh = node.getMesh();
137
+ if (skin === null || mesh === null)
138
+ continue;
139
+ const joints = skin.listJoints();
140
+ for (const primitive of mesh.listPrimitives()) {
141
+ for (const semantic of primitive.listSemantics().filter((name) => name.startsWith('JOINTS_'))) {
142
+ const set = semantic.slice('JOINTS_'.length);
143
+ const jointIndices = primitive.getAttribute(semantic)?.getArray();
144
+ const weights = primitive.getAttribute(`WEIGHTS_${set}`)?.getArray();
145
+ if (jointIndices === null || jointIndices === undefined || weights === null || weights === undefined) {
146
+ throw new Error(`character add-on import: skin attribute set ${set} must provide both JOINTS_${set} and WEIGHTS_${set}`);
147
+ }
148
+ if (jointIndices.length !== weights.length) {
149
+ throw new Error(`character add-on import: JOINTS_${set} and WEIGHTS_${set} have different lengths`);
150
+ }
151
+ for (let index = 0; index < jointIndices.length; index++) {
152
+ if (weights[index] <= 0)
153
+ continue;
154
+ const joint = joints[jointIndices[index]];
155
+ if (joint === undefined) {
156
+ throw new Error(`character add-on import: JOINTS_${set} references missing skin joint ${jointIndices[index]}`);
157
+ }
158
+ const target = targetByJoint.get(joint);
159
+ if (target === undefined) {
160
+ throw new Error(`character add-on import: weighted joint '${joint.getName()}' is not compatible with helix-humanoid@1`);
161
+ }
162
+ positiveInfluences++;
163
+ if (target !== 'root')
164
+ deformingTargets.add(target);
165
+ }
166
+ }
167
+ }
168
+ }
169
+ if (positiveInfluences === 0) {
170
+ throw new Error('character add-on import: the source rig has no positive skin weights');
171
+ }
172
+ if (deformingTargets.size === 0) {
173
+ throw new Error('character add-on import: the source mesh has no deforming influence mapped below the canonical root');
174
+ }
175
+ if (coverage.extra.length > 0) {
176
+ log(`⚠ ${coverage.extra.length} source bone(s) fold through a mapped ancestor: [${coverage.extra.join(', ')}]`);
177
+ }
178
+ }
179
+ function assertMapCoverage(body, boneMap, scope, log) {
180
+ if (scope === 'addon')
181
+ assertAddonMapCoverage(body, boneMap, log);
182
+ else
183
+ assertFullCharacterMapCoverage(body, boneMap, log);
184
+ }
185
+ function sourceLodIdentity(node) {
186
+ for (const name of [node.getName(), node.getMesh()?.getName() ?? '']) {
187
+ const match = /^(.*?)(?:[_ .-]LOD)(\d+)$/i.exec(name.trim());
188
+ if (match !== null && match[1].length > 0) {
189
+ return { base: match[1].toLowerCase(), level: Number.parseInt(match[2], 10) };
190
+ }
191
+ }
192
+ return null;
193
+ }
194
+ /** Unreal exports often contain authored LOD0..N meshes in one scene. HELIX generates its own
195
+ * three deterministic LODs, so retaining every authored level duplicates the character in each
196
+ * output scene and makes modular composition ambiguous. Keep authored LOD0 for each explicitly
197
+ * numbered mesh family and leave unnumbered meshes untouched. A family without LOD0 is untouched
198
+ * as well, avoiding guesses about incomplete or nonstandard sources. */
199
+ async function retainHighestDetailSourceLods(document) {
200
+ const tagged = document.getRoot().listNodes()
201
+ .filter((node) => node.getMesh() !== null)
202
+ .map((node) => ({ node, identity: sourceLodIdentity(node) }))
203
+ .filter((entry) => entry.identity !== null);
204
+ const familiesWithLod0 = new Set(tagged.filter(({ identity }) => identity.level === 0).map(({ identity }) => identity.base));
205
+ const removed = tagged.filter(({ identity }) => identity.level > 0 && familiesWithLod0.has(identity.base));
206
+ if (removed.length === 0)
207
+ return { retained: [], removed: [] };
208
+ const retained = tagged.filter(({ identity }) => identity.level === 0 && familiesWithLod0.has(identity.base));
209
+ for (const { node } of removed)
210
+ node.dispose();
211
+ await document.transform((0, functions_1.prune)({ keepSolidTextures: true }));
212
+ return {
213
+ retained: retained.map(({ node }) => node.getName()),
214
+ removed: removed.map(({ node }) => node.getName()),
215
+ };
216
+ }
217
+ exports.DEFAULT_FACE_DETAIL = { triShare: 0.2, texelBoost: 2.25, maxAtlasShare: 0.25, minLevelTris: 4000 };
218
+ /** The face's triangle reserve for one LOD level (0 = area-blind), given the resolved face-detail options. */
219
+ function faceTriShareForLevel(targetTris, faceDetail) {
220
+ if (faceDetail === null || targetTris < faceDetail.minLevelTris)
221
+ return 0;
222
+ return faceDetail.triShare;
223
+ }
63
224
  /**
64
225
  * Finds the canonical helix body GLB inside the world's installed packs. First-party installs copy
65
226
  * whole bundles (code AND assets) into <world>/helix_modules/<id>/; consumer installs are code-only
@@ -89,6 +250,220 @@ function findCanonicalBody(cwd) {
89
250
  }
90
251
  return null;
91
252
  }
253
+ async function readCharacterSource(io, path, log, fbxCache) {
254
+ if (!/\.fbx$/i.test(path))
255
+ return io.read(path);
256
+ const key = (0, node_path_1.resolve)(path);
257
+ let bytes = fbxCache.get(key);
258
+ if (bytes === undefined) {
259
+ log(`fbx: ${(0, node_path_1.basename)(path)} -> deterministic in-process GLB`);
260
+ bytes = await (0, fbx_1.convertFbxToGlb)(path);
261
+ fbxCache.set(key, bytes);
262
+ }
263
+ return io.readBinary(bytes);
264
+ }
265
+ function selectDefaultBoneMap(source, scope = 'character') {
266
+ const metahuman = (0, retarget_1.checkMapCoverage)(source, metahumanToHelixMap_1.METAHUMAN_TO_HELIX_MAP);
267
+ const hasMetaHumanBody = REQUIRED_TARGETS.every((target) => metahuman.coveredTargets.has(target)) && metahuman.coveredTargets.has('spine_01');
268
+ if (hasMetaHumanBody)
269
+ return metahumanToHelixMap_1.METAHUMAN_TO_HELIX_MAP;
270
+ const candidates = [
271
+ ...(scope === 'addon' ? [metahumanToHelixMap_1.METAHUMAN_TO_HELIX_MAP] : []),
272
+ meshyToHelixMap_1.MESHY_TO_HELIX_MAP,
273
+ meshyToHelixMap_1.MIXAMO_TO_HELIX_MAP,
274
+ meshyToHelixMap_1.MIXAMO_FBX_TO_HELIX_MAP,
275
+ ];
276
+ return candidates
277
+ .map((candidate) => ({ candidate, matches: (0, retarget_1.checkMapCoverage)(source, candidate).matched.length }))
278
+ .reduce((best, current) => current.matches > best.matches ? current : best)
279
+ .candidate;
280
+ }
281
+ async function hashBoundedCharacterSource(path) {
282
+ const hash = (0, node_crypto_1.createHash)('sha256');
283
+ let sizeBytes = 0;
284
+ for await (const chunk of (0, node_fs_1.createReadStream)(path)) {
285
+ sizeBytes += chunk.length;
286
+ if (sizeBytes > untrustedSource_1.CHARACTER_SOURCE_LIMITS.maxBytes) {
287
+ throw new Error(`character import preflight: source is more than ${untrustedSource_1.CHARACTER_SOURCE_LIMITS.maxBytes} bytes; limit is ${untrustedSource_1.CHARACTER_SOURCE_LIMITS.maxBytes}`);
288
+ }
289
+ hash.update(chunk);
290
+ }
291
+ return { sha256: hash.digest('hex'), sizeBytes };
292
+ }
293
+ /**
294
+ * Normalizes an accepted character source into the self-contained GLB consumed
295
+ * by the hardened preflight. FBX conversion is deterministic and the exact
296
+ * temporary directory is removed before the expensive import stages begin.
297
+ * Receipts continue to identify and hash the original source file.
298
+ */
299
+ /** Floor for the iterative aggregate-shrink below, matching the LOD bake's own mip-chain floor (`Math.max(128, texCap >> level)`). */
300
+ const MIN_TEXTURE_EDGE_CAP = 128;
301
+ /**
302
+ * Structurally validates `tempPath` (deferring both the per-image AND the whole-file/aggregate byte
303
+ * ceilings — see `preflightGeneratedCharacterSourceForDownscale`), then downscales any embedded
304
+ * texture whose longest edge exceeds `textureEdgeCap` before re-running the FULL gate (both ceilings
305
+ * enforced) on the result. Safe to call unconditionally: `resizeTextures` is a no-op per texture that
306
+ * is already within the cap, so an already-compliant GLB round-trips unchanged (mtime aside).
307
+ *
308
+ * A single pass at `textureEdgeCap` clears the per-image ceiling outright (every texture ends up
309
+ * under it), but a garment with several materials — each carrying several maps — can still sum past
310
+ * the 128MB AGGREGATE ceiling even once every individual texture is compliant. When that happens,
311
+ * keep halving the edge cap (same mip-chain convention as the LOD bake's own `texSize = Math.max(128,
312
+ * texCap >> level)`) and re-downscaling until the aggregate fits or the floor is reached, rather than
313
+ * stopping once each texture merely clears its own per-image cap. Only retries while a pass actually
314
+ * shrank something (`resized.length > 0`) — an unresized pass means no texture is left above the
315
+ * current cap, so a smaller cap cannot help and the final gate's failure is the real answer.
316
+ */
317
+ async function downscaleOversizedTexturesAndRegate(tempPath, textureEdgeCap) {
318
+ const io = new core_1.NodeIO();
319
+ let cap = textureEdgeCap;
320
+ for (;;) {
321
+ (0, untrustedSource_1.preflightGeneratedCharacterSourceForDownscale)(tempPath);
322
+ const document = await io.readBinary((0, node_fs_1.readFileSync)(tempPath));
323
+ const { resized } = await (0, resizeTextures_1.resizeTextures)(document, cap);
324
+ if (resized.length > 0) {
325
+ (0, node_fs_1.writeFileSync)(tempPath, await io.writeBinary(document));
326
+ }
327
+ try {
328
+ return (0, untrustedSource_1.preflightGeneratedCharacterSource)(tempPath);
329
+ }
330
+ catch (error) {
331
+ if (resized.length === 0 || cap <= MIN_TEXTURE_EDGE_CAP)
332
+ throw error;
333
+ cap = Math.max(MIN_TEXTURE_EDGE_CAP, cap >> 1);
334
+ }
335
+ }
336
+ }
337
+ async function prepareCharacterSource(sourcePath, outputDir, convertFbx = fbx_1.convertFbxToGlb,
338
+ /**
339
+ * Downscale target for any embedded texture that exceeds the per-image 32MB ceiling, applied
340
+ * before that ceiling is enforced (see `downscaleOversizedTexturesAndRegate`). Defaults to 1024px,
341
+ * matching this module's own default publish resolution (`ImportCharacterOptions.texSize`) — the
342
+ * caller-visible slot-type distinction (1024 for most add-on slots, 2048 for a genuine
343
+ * `character.outfit@1` full-outfit slot) is NOT threaded down to this function: `importCharacter`
344
+ * already forwards its own resolved `texSize`/`texCap` here, so a caller that wants the 2048 cap for
345
+ * an outfit slot gets it automatically by passing `texSize: 2048`; the Bridge add-on entry point
346
+ * (`executeCharacterAddon`) does not do that today and so gets this 1024 default. That is a
347
+ * genuinely tighter cap than the platform's own 2048px wearable/add-on publish ceiling for a
348
+ * `character.outfit@1` item, but a correct and safe default for every slot type: it matches the
349
+ * pipeline's own existing default final-publish resolution (`ImportCharacterOptions.texSize`), so
350
+ * this pre-pass never produces a texture larger than what an unblocked item would already ship at
351
+ * today.
352
+ */
353
+ textureEdgeCap = 1024) {
354
+ if (!/\.fbx$/i.test(sourcePath)) {
355
+ const glb = (0, untrustedSource_1.preflightCharacterSource)(sourcePath);
356
+ return {
357
+ glb,
358
+ original: { sha256: glb.sha256, sizeBytes: glb.sizeBytes },
359
+ convertedFromFbx: false,
360
+ materialSidecar: null,
361
+ };
362
+ }
363
+ const sourceSize = (0, node_fs_1.statSync)(sourcePath).size;
364
+ if (sourceSize > untrustedSource_1.CHARACTER_SOURCE_LIMITS.maxBytes) {
365
+ throw new Error(`character import preflight: source is ${sourceSize} bytes; limit is ${untrustedSource_1.CHARACTER_SOURCE_LIMITS.maxBytes}`);
366
+ }
367
+ const original = await hashBoundedCharacterSource(sourcePath);
368
+ const converted = await convertFbx(sourcePath);
369
+ const tempDir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)(outputDir, '.helix-fbx-preflight-'));
370
+ const tempPath = (0, node_path_1.join)(tempDir, 'source.glb');
371
+ try {
372
+ (0, node_fs_1.writeFileSync)(tempPath, converted);
373
+ // Downscale any texture the raw FBX conversion itself embedded over the target edge cap
374
+ // (rare — three's GLTFExporter usually carries only whatever preview art the FBX had) before
375
+ // the per-image ceiling is enforced.
376
+ const convertedPreflight = await downscaleOversizedTexturesAndRegate(tempPath, textureEdgeCap);
377
+ let materialSidecar = null;
378
+ if (!(0, node_fs_1.existsSync)((0, unrealMaterialSidecar_1.unrealMaterialSidecarPath)(sourcePath))) {
379
+ return {
380
+ glb: convertedPreflight,
381
+ original,
382
+ convertedFromFbx: true,
383
+ materialSidecar,
384
+ };
385
+ }
386
+ // Do not let glTF-Transform parse converter output before the structural
387
+ // gate. Sidecar application rewrites the GLB, so gate that result again.
388
+ const io = new core_1.NodeIO();
389
+ const document = await io.readBinary(convertedPreflight.bytes);
390
+ materialSidecar = await (0, unrealMaterialSidecar_1.applyUnrealMaterialSidecar)(document, sourcePath);
391
+ (0, node_fs_1.writeFileSync)(tempPath, await io.writeBinary(document));
392
+ // The sidecar embeds real full-resolution art from the Unreal texture cache — this is where a
393
+ // real Unreal export actually exceeds the 32MB-per-image ceiling (a raw multi-K Albedo/Normal/ORM
394
+ // TGA baked straight into the source), so downscale again here, before the ceiling is enforced.
395
+ return {
396
+ glb: await downscaleOversizedTexturesAndRegate(tempPath, textureEdgeCap),
397
+ original,
398
+ convertedFromFbx: true,
399
+ materialSidecar,
400
+ };
401
+ }
402
+ finally {
403
+ (0, node_fs_1.rmSync)(tempDir, { recursive: true, force: true });
404
+ }
405
+ }
406
+ function mergeClipMeta(metaPath, meta) {
407
+ let metas = [];
408
+ try {
409
+ metas = JSON.parse((0, node_fs_1.readFileSync)(metaPath, 'utf8'));
410
+ }
411
+ catch {
412
+ // A fresh output directory has no clip-meta.json yet.
413
+ }
414
+ const name = meta.name;
415
+ metas = metas.filter((entry) => entry.name !== name);
416
+ metas.push(meta);
417
+ (0, node_fs_1.writeFileSync)(metaPath, JSON.stringify(metas, null, 2));
418
+ }
419
+ /**
420
+ * Retargets one raw FBX/GLB directly to the platform clip format without
421
+ * requiring a separate body-conversion run.
422
+ */
423
+ async function retargetAnimation(opts) {
424
+ const log = opts.onProgress ?? ((message) => console.log(message));
425
+ const cwd = opts.cwd ?? process.cwd();
426
+ if (!(0, node_fs_1.existsSync)(opts.animation)) {
427
+ throw new Error(`retarget-animation: source not found: ${opts.animation}`);
428
+ }
429
+ if (opts.canonical !== undefined && !(0, node_fs_1.existsSync)(opts.canonical)) {
430
+ throw new Error(`retarget-animation: canonical body GLB not found: ${opts.canonical}`);
431
+ }
432
+ await meshoptimizer_1.MeshoptDecoder.ready;
433
+ const io = new core_1.NodeIO()
434
+ .registerExtensions(extensions_1.ALL_EXTENSIONS)
435
+ .registerDependencies({ 'meshopt.decoder': meshoptimizer_1.MeshoptDecoder });
436
+ const cache = new Map();
437
+ const source = await readCharacterSource(io, opts.animation, log, cache);
438
+ const boneMap = opts.map !== undefined
439
+ ? JSON.parse((0, node_fs_1.readFileSync)(opts.map, 'utf8'))
440
+ : selectDefaultBoneMap(source);
441
+ assertMapCoverage(source, boneMap, 'character', log);
442
+ const canonicalPath = opts.canonical ?? findCanonicalBody(cwd);
443
+ const canon = canonicalPath !== null
444
+ ? (0, conform_1.extractCanonicalSkeleton)(await io.read(canonicalPath))
445
+ : (0, canonicalSkeleton_1.vendoredCanonicalSkeleton)();
446
+ const clipName = opts.clipName ?? DEFAULT_CLIP_NAME;
447
+ const result = (0, retargetClip_1.retargetClip)(source, canon, boneMap, clipName, {
448
+ loop: opts.loop ?? false,
449
+ });
450
+ const clipPath = (0, node_path_1.resolve)(cwd, opts.output ?? (0, node_path_1.join)('character-out', 'anims', `${clipName}.glb`));
451
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(clipPath), { recursive: true });
452
+ await io.write(clipPath, result.document);
453
+ const metaPath = (0, node_path_1.join)((0, node_path_1.dirname)(clipPath), 'clip-meta.json');
454
+ mergeClipMeta(metaPath, result.meta);
455
+ log(`retarget-animation: ${(0, node_path_1.basename)(opts.animation)} -> ${clipPath}`);
456
+ log(` ${result.frames} frames · ${result.meta.duration}s · ${result.animatedBones.length} animated bones`);
457
+ log(` clip-meta -> ${metaPath}`);
458
+ return {
459
+ name: clipName,
460
+ path: clipPath,
461
+ metaPath,
462
+ frames: result.frames,
463
+ duration: result.meta.duration,
464
+ animatedBones: result.animatedBones,
465
+ };
466
+ }
92
467
  function sceneTris(doc) {
93
468
  return doc.getRoot().listScenes().map((scene) => {
94
469
  let tris = 0;
@@ -129,25 +504,152 @@ function assertSkinnedLods(doc) {
129
504
  throw new Error(`package: LOD${i} decimated to 0 triangles — --lod-tris target is too aggressive`);
130
505
  });
131
506
  }
507
+ const IDENTITY_4 = [1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1];
508
+ /**
509
+ * World-space geometry postcondition for runtime character packages.
510
+ *
511
+ * Measures what a glTF renderer draws at rest: each vertex skinned by its joints
512
+ * (`Σ weight · jointWorld · IBM · position`). The skinned mesh node's own transform is ignored by
513
+ * glTF skinning, so measuring `nodeWorld · position` instead can report a correct character at the
514
+ * wrong scale — or pass one that renders at the wrong scale.
515
+ */
516
+ function assertCanonicalCharacterGeometry(doc, scope) {
517
+ const min = [Infinity, Infinity, Infinity];
518
+ const max = [-Infinity, -Infinity, -Infinity];
519
+ let vertices = 0;
520
+ const scratch = [];
521
+ const influence = [];
522
+ const weight = [];
523
+ for (const scene of doc.getRoot().listScenes()) {
524
+ scene.traverse((node) => {
525
+ const skin = node.getSkin();
526
+ if (skin === null || node.getMesh() === null)
527
+ return;
528
+ const nodeWorld = node.getWorldMatrix();
529
+ const inverseBinds = skin.getInverseBindMatrices();
530
+ const jointBinds = skin.listJoints().map((joint, index) => (0, mat4_1.mul4)(joint.getWorldMatrix(), inverseBinds === null ? IDENTITY_4 : inverseBinds.getElement(index, new Array(16).fill(0))));
531
+ for (const primitive of node.getMesh().listPrimitives()) {
532
+ const position = primitive.getAttribute('POSITION');
533
+ if (position === null)
534
+ continue;
535
+ const sets = primitive.listSemantics().filter((semantic) => semantic.startsWith('JOINTS_'))
536
+ .map((semantic) => [primitive.getAttribute(semantic), primitive.getAttribute(semantic.replace('JOINTS_', 'WEIGHTS_'))])
537
+ .filter(([joints, weights]) => joints !== null && weights !== null);
538
+ for (let index = 0; index < position.getCount(); index++) {
539
+ position.getElement(index, scratch);
540
+ const source = [scratch[0], scratch[1], scratch[2]];
541
+ const point = [0, 0, 0];
542
+ let total = 0;
543
+ for (const [joints, weights] of sets) {
544
+ joints.getElement(index, influence);
545
+ weights.getElement(index, weight);
546
+ for (let component = 0; component < influence.length; component++) {
547
+ const w = weight[component];
548
+ const bind = jointBinds[influence[component]];
549
+ if (w <= 0 || bind === undefined)
550
+ continue;
551
+ const skinned = (0, mat4_1.transformPoint)(bind, source);
552
+ point[0] += w * skinned[0];
553
+ point[1] += w * skinned[1];
554
+ point[2] += w * skinned[2];
555
+ total += w;
556
+ }
557
+ }
558
+ if (total > 0) {
559
+ point[0] /= total;
560
+ point[1] /= total;
561
+ point[2] /= total;
562
+ }
563
+ else {
564
+ // An unweighted vertex is malformed skin data; measure it where the node places it.
565
+ const placed = (0, mat4_1.transformPoint)(nodeWorld, source);
566
+ point[0] = placed[0];
567
+ point[1] = placed[1];
568
+ point[2] = placed[2];
569
+ }
570
+ for (let axis = 0; axis < 3; axis++) {
571
+ min[axis] = Math.min(min[axis], point[axis]);
572
+ max[axis] = Math.max(max[axis], point[axis]);
573
+ }
574
+ vertices++;
575
+ }
576
+ }
577
+ });
578
+ }
579
+ if (vertices === 0 || [...min, ...max].some((value) => !Number.isFinite(value))) {
580
+ throw new Error('package: canonical character geometry bounds are empty or non-finite');
581
+ }
582
+ const size = [
583
+ max[0] - min[0], max[1] - min[1], max[2] - min[2],
584
+ ];
585
+ const maxAbs = Math.max(...min.map(Math.abs), ...max.map(Math.abs));
586
+ const maxSpan = Math.max(...size);
587
+ if (maxAbs > 5 || maxSpan > 5 || maxSpan <= 1e-6) {
588
+ throw new Error(`package: ${scope} geometry is not in canonical meter scale ` +
589
+ `(bounds ${size.map((value) => value.toFixed(3)).join(' x ')}, max |coordinate| ${maxAbs.toFixed(3)})`);
590
+ }
591
+ if (scope === 'character' && (size[1] < 0.5 || size[1] < size[2] * 1.2)) {
592
+ throw new Error(`package: character geometry is not Y-up humanoid space ` +
593
+ `(bounds ${size.map((value) => value.toFixed(3)).join(' x ')})`);
594
+ }
595
+ return { min, max, size };
596
+ }
132
597
  /**
133
598
  * Converts an external biped character GLB into a helix-humanoid@1 drop-in, chaining the engine
134
599
  * pipeline's stages: rename the rig (retargetSkeleton) -> embed the canonical skeleton at the source's
135
600
  * proportions (conformToHelixRest) -> LODs (rebake route for micro-chart atlases) -> merge -> resize ->
136
601
  * KTX2 -> <out>/<name>.web.glb. With `anim`, also retargets the clip -> <out>/anims/<clipName>.glb.
137
602
  */
603
+ /** Largest world-space scale of any node instancing `mesh` (the same weight gltf-transform's scene-grouped unwrap uses). */
604
+ function meshWorldScale(mesh) {
605
+ let scale = 0;
606
+ for (const parent of mesh.listParents()) {
607
+ if (parent.propertyType !== core_1.PropertyType.NODE)
608
+ continue;
609
+ for (const axis of parent.getWorldScale())
610
+ if (Number.isFinite(axis))
611
+ scale = Math.max(scale, Math.abs(axis));
612
+ }
613
+ return scale > 0 ? scale : 1;
614
+ }
615
+ /** Attempts at re-packaging a slot-budgeted add-on whose combined LOD triangles landed over its ceiling. */
616
+ const MAX_BUDGET_ATTEMPTS = 3;
138
617
  async function importCharacter(opts) {
139
618
  const log = opts.onProgress ?? ((message) => console.log(message));
140
619
  const cwd = opts.cwd ?? process.cwd();
141
- const lodTris = opts.lodTris ?? [10_000, 5000, 1500];
142
- const texCap = opts.texSize ?? 1024;
620
+ const slotBudget = (opts.rigScope ?? 'character') === 'addon' && opts.slotType !== undefined ? (0, slotBudgets_1.characterAddOnBudget)(opts.slotType) : null;
621
+ const explicitLodTris = opts.lodTris !== undefined;
622
+ const lodTris = opts.lodTris ?? (slotBudget !== null ? (0, slotBudgets_1.slotAwareLodTris)(slotBudget.slotType) : [...slotBudgets_1.DEFAULT_LOD_TRIS]);
623
+ const texCap = Math.min(opts.texSize ?? 1024, slotBudget?.maxTextureEdge ?? Infinity);
624
+ const maxMaterials = slotBudget === null ? opts.maxMaterials : Math.min(opts.maxMaterials ?? Infinity, slotBudget.maxMaterials);
143
625
  const error = opts.simplifyError ?? 0.02;
144
626
  const lockBorder = opts.lockBorder ?? false;
145
627
  const weld = opts.weld ?? true;
628
+ // Ceiling for the seam-weld fallback's error-budget escalation below (10x the pipeline's own
629
+ // 0.02 default) — generous enough to unstick the real-world floor cases without becoming an
630
+ // unbounded "just keep relaxing until it works" loop.
631
+ const WELD_FALLBACK_MAX_ERROR = 0.2;
632
+ const faceDetail = opts.faceDetail === false || (opts.faceDetail === undefined && (opts.rigScope ?? 'character') !== 'character')
633
+ ? null
634
+ : { ...exports.DEFAULT_FACE_DETAIL, ...(opts.faceDetail ?? {}) };
146
635
  if (lodTris.length === 0)
147
636
  throw new Error('character import: --lod-tris needs at least one triangle target');
148
637
  if (!(0, node_fs_1.existsSync)(opts.body))
149
- throw new Error(`character import: body GLB not found: ${opts.body}`);
150
- const boneMap = opts.map !== undefined ? JSON.parse((0, node_fs_1.readFileSync)(opts.map, 'utf8')) : meshyToHelixMap_1.MESHY_TO_HELIX_MAP;
638
+ throw new Error(`character import: body source not found: ${opts.body}`);
639
+ const outDir = (0, node_path_1.resolve)(cwd, opts.output ?? './character-out');
640
+ const name = (0, importTrust_1.validateCharacterOutputName)(opts.name ?? (0, node_path_1.basename)(opts.body).replace(/\.(fbx|glb|gltf)$/i, ''));
641
+ (0, node_fs_1.mkdirSync)(outDir, { recursive: true });
642
+ const prepared = await prepareCharacterSource(opts.body, outDir, fbx_1.convertFbxToGlb, texCap);
643
+ const preflight = prepared.glb;
644
+ if (prepared.convertedFromFbx)
645
+ log(`fbx: ${(0, node_path_1.basename)(opts.body)} -> deterministic in-process GLB`);
646
+ if (prepared.materialSidecar !== null) {
647
+ log(`materials: applied ${prepared.materialSidecar.appliedSlots.length} Unreal slot(s) from `
648
+ + `${(0, node_path_1.basename)(prepared.materialSidecar.sidecarPath)} · verified ${prepared.materialSidecar.verifiedTextureCount} texture(s)`);
649
+ }
650
+ log(`source preflight: ${prepared.original.sizeBytes} bytes, sha256 ${prepared.original.sha256}, ${preflight.counts.nodes} nodes, ${preflight.counts.primitives} primitives`);
651
+ const provenance = opts.provenance !== undefined ? (0, importTrust_1.validateProvenance)(opts.provenance) : null;
652
+ let boneMap = opts.map !== undefined ? JSON.parse((0, node_fs_1.readFileSync)(opts.map, 'utf8')) : meshyToHelixMap_1.MESHY_TO_HELIX_MAP;
151
653
  // Canonical skeleton: explicit --canonical > the world's installed pack > the embedded
152
654
  // helix-humanoid@1 snapshot. The snapshot makes the command fully STANDALONE (no engine checkout,
153
655
  // no installed assets) — the skeleton is a frozen contract, so the embedded copy is authoritative
@@ -155,19 +657,36 @@ async function importCharacter(opts) {
155
657
  const canonicalPath = opts.canonical ?? findCanonicalBody(cwd);
156
658
  if (opts.canonical !== undefined && !(0, node_fs_1.existsSync)(opts.canonical))
157
659
  throw new Error(`character import: canonical body GLB not found: ${opts.canonical}`);
158
- const outDir = (0, node_path_1.resolve)(cwd, opts.output ?? './character-out');
159
- const name = opts.name ?? (0, node_path_1.basename)(opts.body).replace(/\.(glb|gltf)$/i, '');
160
- (0, node_fs_1.mkdirSync)(outDir, { recursive: true });
161
- const io = new core_1.NodeIO().registerExtensions(extensions_1.ALL_EXTENSIONS);
162
- const canon = canonicalPath !== null ? (0, conform_1.extractCanonicalSkeleton)(await io.read(canonicalPath)) : (0, canonicalSkeleton_1.vendoredCanonicalSkeleton)();
660
+ await meshoptimizer_1.MeshoptDecoder.ready;
661
+ const io = new core_1.NodeIO()
662
+ .registerExtensions(extensions_1.ALL_EXTENSIONS)
663
+ .registerDependencies({ 'meshopt.decoder': meshoptimizer_1.MeshoptDecoder });
664
+ const canon = canonicalPath !== null
665
+ ? (0, conform_1.extractCanonicalSkeleton)(await io.read(canonicalPath), {
666
+ includeRootWorld: opts.fit === 'host-aligned',
667
+ // An add-on's skeleton must be the HOST's skeleton in the host's frame, including a `root_offset`
668
+ // wrapper the host hoists above its root (Base Female: (0, -0.0331, -0.0049) m). Dropping it left every
669
+ // female add-on's rig 33 mm above the host's, and the engine (host bones x the PART's inverse binds)
670
+ // rendered each part 33 mm low and 5 mm back of where its mesh was authored.
671
+ hoistRootOffset: opts.rigScope === 'addon',
672
+ })
673
+ : (0, canonicalSkeleton_1.vendoredCanonicalSkeleton)();
163
674
  const canonSource = canonicalPath !== null ? (0, node_path_1.basename)(canonicalPath) : 'embedded helix-humanoid@1 snapshot';
164
675
  log(`canonical skeleton: ${canon.jointNames.length} joints, ${canon.nodes.length} subtree nodes, root '${canon.skeletonRootName}' (${canonSource})`);
165
- log(`bone map: ${boneMap.name} (${Object.keys(boneMap.map).length} bones, drop [${(boneMap.drop ?? []).join(', ')}])`);
166
676
  // 1. Rename the source rig onto helix bone names (drops the map's childless leaf helpers).
167
677
  // Preflight FIRST: fail with a diagnosis while the rig still has its source names.
168
- const body = await io.read(opts.body);
169
- assertMapCoverage(body, boneMap, log);
170
- const ret = (0, retarget_1.retargetSkeleton)(body, boneMap);
678
+ const body = await io.readBinary(preflight.bytes);
679
+ const sourceLods = await retainHighestDetailSourceLods(body);
680
+ if (sourceLods.removed.length > 0) {
681
+ log(`source LODs: retained authored LOD0 [${sourceLods.retained.join(', ')}], ` +
682
+ `removed ${sourceLods.removed.length} lower-detail variant(s) before HELIX LOD generation`);
683
+ }
684
+ const rigScope = opts.rigScope ?? 'character';
685
+ if (opts.map === undefined)
686
+ boneMap = selectDefaultBoneMap(body, rigScope);
687
+ log(`bone map: ${boneMap.name} (${Object.keys(boneMap.map).length} bones, drop [${(boneMap.drop ?? []).join(', ')}])`);
688
+ assertMapCoverage(body, boneMap, rigScope, log);
689
+ const ret = (0, retarget_1.retargetSkeleton)(body, boneMap, { requireAnchors: rigScope === 'character' });
171
690
  log(`retarget: renamed ${Object.keys(ret.renamed).length}, dropped [${ret.dropped.join(', ')}], unmapped [${ret.unmapped.join(', ')}]`);
172
691
  // 2. Conform (embed): fit the canonical skeleton into the source proportions and rebind the mesh.
173
692
  // conformToHelixRest resolves joints by their CURRENT names; after the rename those are helix names,
@@ -177,15 +696,61 @@ async function importCharacter(opts) {
177
696
  ...boneMap,
178
697
  map: { ...boneMap.map, ...Object.fromEntries(Object.values(boneMap.map).map((helix) => [helix, helix])) },
179
698
  };
180
- const conf = (0, conform_1.conformToHelixRest)(body, canon, conformMap);
699
+ const conf = (0, conform_1.conformToHelixRest)(body, canon, conformMap, {
700
+ mode: opts.fit === 'canonical' ? 'repose' : opts.fit === 'host-aligned' ? 'preserve' : 'embed',
701
+ anatomicalAnchorJoints: ret.anatomicalAnchorJoints,
702
+ });
181
703
  log(`conform: ${(0, node_path_1.basename)(opts.body)} [mode: ${conf.mode}]`);
182
- log(` ${conf.mode === 'embed' ? 'embedded canonical skeleton into' : 're-posed'} ${conf.verticesProcessed} verts · ${conf.jointsRebuilt} canonical joints`);
704
+ if (conf.unitScale !== 1)
705
+ log(` ⚠ unit-normalized: source joint worlds scaled by ${conf.unitScale} to match the mesh's units (cm-scale rig)`);
706
+ log(` ${conf.mode === 'embed' ? 'embedded canonical skeleton into' : conf.mode === 'preserve' ? 'preserved host-aligned geometry for' : 're-posed'} ${conf.verticesProcessed} verts · ${conf.jointsRebuilt} canonical joints · ${conf.restAimed} rests aimed at source segments`);
707
+ const san = await (0, sanitizeMaterials_1.sanitizeBakedEmissive)(body);
708
+ if (san.emissiveStripped > 0)
709
+ log(` stripped baked emissive on ${san.emissiveStripped} material(s)${san.blackEmissiveStripped > 0 ? ` (${san.blackEmissiveStripped} flat-black emissive map)` : ''}${san.metallicZeroed > 0 ? ` · metallic → 0 on ${san.metallicZeroed}` : ''}`);
710
+ if (san.metadataStripped > 0)
711
+ log(` stripped untrusted material metadata on ${san.metadataStripped} material(s)`);
712
+ // 2a. Limb bridges (full characters): an A-pose mesher can fuse a resting hand to the thigh; cut the bridge
713
+ // here, on the full-resolution conformed mesh, so every LOD below decimates the repaired surface.
714
+ const limbBridgeOptions = rigScope === 'character' && opts.limbBridges !== false ? (opts.limbBridges ?? {}) : null;
715
+ const limbBridgeReport = limbBridgeOptions !== null
716
+ ? (0, limbBridge_1.repairLimbBridges)(body, { ...limbBridgeOptions, sampleLuma: limbBridgeOptions.sampleLuma ?? await (0, limbBridge_1.baseColorLumaSamplers)(body) })
717
+ : null;
718
+ if (limbBridgeReport !== null)
719
+ for (const line of (0, limbBridge_1.describeLimbBridgeReport)(limbBridgeReport))
720
+ log(` ${line}`);
721
+ // 2b. Push-out (add-ons only): the conformed garment now sits in the SAME rest-pose space as the host
722
+ // body it was fit against (that is what `fit: 'canonical'` + `canonical: <host.glb>` means), so a
723
+ // second, independent host-body read can serve as the poke-through reference here — a hem, cuff or
724
+ // waistband too tight for `bodyRegionHide.ts`'s region hide gets a small push clear of the skin instead
725
+ // of relying on the creator to notice. No host GLB (a plain character import, or an addon conformed
726
+ // without an explicit `--canonical`) means nothing to push away from, so this is skipped rather than
727
+ // guessed at.
728
+ let pushOutReport = null;
729
+ if (rigScope === 'addon' && opts.pushOut !== false && canonicalPath !== null) {
730
+ const hostDocument = await io.read(canonicalPath);
731
+ pushOutReport = (0, addonPushOut_1.pushGarmentOutOfBody)(body, hostDocument, opts.pushOut ?? {});
732
+ if (pushOutReport.verticesPushed > 0) {
733
+ log(`push-out: ${pushOutReport.verticesPushed}/${pushOutReport.verticesAtRisk} at-risk vert(s) moved clear `
734
+ + `of the body (max correction ${(pushOutReport.maxCorrectionMeters * 1000).toFixed(1)}mm)`
735
+ + `${pushOutReport.verticesClamped > 0 ? `, ${pushOutReport.verticesClamped} clamped at the max` : ''}`);
736
+ }
737
+ else if (pushOutReport.verticesAtRisk > 0) {
738
+ log('push-out: at-risk vertex(es) found but none needed moving (already at or beyond the target offset)');
739
+ }
740
+ }
183
741
  // 3. Package (the engine package-cli flow). The conformed doc is serialized once so each LOD level
184
742
  // decimates a fresh copy, exactly like package-cli re-reading its --body input per level.
185
743
  const conformedBytes = await io.writeBinary(body);
186
744
  const source = await io.readBinary(conformedBytes);
187
745
  const seams = (0, weldedSimplify_1.analyzeSeams)(source);
188
- const bake = opts.bake ?? seams.microChartAtlas;
746
+ const bakeableBaseColor = (0, bakeTexture_1.hasBakeableBaseColorTexture)(source);
747
+ if (opts.bake === true && !bakeableBaseColor) {
748
+ throw new Error('character import: --bake requires at least one embedded base-color texture with image data');
749
+ }
750
+ const bake = opts.bake === true || (opts.bake === undefined && seams.microChartAtlas && bakeableBaseColor);
751
+ if (opts.bake === undefined && seams.microChartAtlas && !bakeableBaseColor) {
752
+ log(`atlas: micro-chart (${seams.charts} charts / ${seams.tris} tris), but no bakeable base-color texture -> non-bake path`);
753
+ }
189
754
  let watlas = null;
190
755
  if (bake) {
191
756
  log(`atlas: ${seams.charts} charts / ${seams.tris} tris (${seams.verts} verts, ${seams.positions} positions) -> ${opts.bake === true ? 'bake forced' : 'micro-chart, rebake route'}`);
@@ -196,66 +761,219 @@ async function importCharacter(opts) {
196
761
  // On the plain (non-bake) route, levels sharing a mode produce byte-identical textures that
197
762
  // merge-lods dedup still collapses; a mixed chain keeps one texture per distinct encoding.
198
763
  const ktxModes = opts.ktxModes !== undefined && opts.ktxModes.length > 0 ? opts.ktxModes : ['uastc', 'etc1s'];
764
+ const ktx2Enabled = opts.ktx2 ?? true;
199
765
  const modeFor = (level) => ktxModes[Math.min(level, ktxModes.length - 1)];
200
766
  const kb = (n) => Math.round(n / 1024);
201
767
  const textureSizes = [];
202
- const lods = [];
203
768
  let ktxBefore = 0, ktxAfter = 0;
204
- let encoder = 'basis-wasm';
205
- for (const [level, target] of lodTris.entries()) {
206
- let doc = await io.readBinary(conformedBytes);
207
- if (bake) {
208
- const w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error);
209
- await doc.transform((0, functions_1.unwrap)({ watlas: watlas, overwrite: true }));
210
- const texSize = Math.max(128, texCap >> level); // halve per level, like a mip chain
211
- const b = await (0, bakeTexture_1.bakeBaseColor)(doc, source, texSize);
212
- log(`lod: ${w.before} -> ${w.after} tris (target ${target}) rebaked ${texSize}px (${b.sampled} texels, ${b.far} far)`);
213
- textureSizes.push(texSize);
214
- }
215
- else {
216
- const r = await (0, simplifyMesh_1.simplifyToTarget)(doc, target, error, lockBorder);
217
- const missed = r.after > target * 1.15;
218
- if (missed && weld && level > 0) {
219
- doc = await io.readBinary(conformedBytes);
220
- const w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error);
221
- log(`lod: ${w.before} -> ${w.after} tris (target ${target}) seam-weld fallback, uv-coherent ${(w.uvCoherence * 100).toFixed(0)}%`);
769
+ let encoder = ktx2Enabled ? 'basis-wasm' : 'skipped';
770
+ // LOD generation → merge → post-merge passes, as one re-runnable step: when a slot budget applies and the
771
+ // packaged result lands over the slot's COMBINED triangle ceiling, the ladder is rescaled and this runs
772
+ // again (see the loop below) instead of shipping a file the server will refuse.
773
+ // Every LOD re-checks its own decimated surface BEFORE it is unwrapped and baked: the full-resolution cut
774
+ // leaves the two sides joined through unowned (pelvis/torso) vertices, and decimation can collapse those into
775
+ // a new arm<->leg triangle. The same stage, same gate, so LOD1/LOD2 never walk worse than LOD0.
776
+ const repairLodBridges = async (doc, level) => {
777
+ if (limbBridgeOptions === null)
778
+ return;
779
+ const report = (0, limbBridge_1.repairLimbBridges)(doc, { ...limbBridgeOptions, sampleLuma: limbBridgeOptions.sampleLuma ?? await (0, limbBridge_1.baseColorLumaSamplers)(doc) });
780
+ for (const line of (0, limbBridge_1.describeLimbBridgeReport)(report))
781
+ log(` lod${level} ${line}`);
782
+ };
783
+ const packageLevels = async (targets) => {
784
+ textureSizes.length = 0;
785
+ ktxBefore = 0;
786
+ ktxAfter = 0;
787
+ const lods = [];
788
+ // Snapshot of each level's geometry BEFORE encodeKtx2 mutates its textures to KTX2-compressed
789
+ // binaries below (still plain PNG/JPEG) — the seam-weld fallback's "retarget from the previous
790
+ // level" floor needs a document `resizeTextures`'/sharp's PNG decode can still read; `lods[]`
791
+ // itself is unusable for that once a level's own encodeKtx2 has already run on it.
792
+ const preKtxLods = [];
793
+ for (const [level, target] of targets.entries()) {
794
+ let doc = await io.readBinary(conformedBytes);
795
+ if (bake) {
796
+ const faceShare = faceTriShareForLevel(target, faceDetail);
797
+ const w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error, faceShare > 0 ? { share: faceShare } : undefined);
798
+ await repairLodBridges(doc, level);
799
+ // One atlas for the whole level: every primitive's charts are packed together, because the bake
800
+ // writes all of them into the same images. Per-mesh atlases would overlap in [0,1]. With face detail the
801
+ // face rides in its own primitive for the unwrap only (charts never cross primitives), scaled up so the
802
+ // packer gives it more texels, then folds back into the body after the bake.
803
+ const faceSplits = faceDetail !== null ? (0, faceRegion_1.splitFaceForUnwrap)(doc) : [];
804
+ let faceScale = 1;
805
+ if (faceSplits.length > 0) {
806
+ const faceArea = faceSplits.reduce((sum, split) => sum + split.faceAreaShare, 0) / faceSplits.length;
807
+ faceScale = (0, faceRegion_1.faceChartScale)(faceArea, faceDetail.texelBoost, faceDetail.maxAtlasShare);
808
+ const faces = new Set(faceSplits.map((split) => split.face));
809
+ const prims = doc.getRoot().listMeshes().flatMap((mesh) => mesh.listPrimitives().map((prim) => ({ prim, scale: meshWorldScale(mesh) })));
810
+ await watlas.Initialize();
811
+ (0, functions_1.unwrapPrimitives)(prims.map(({ prim }) => prim), {
812
+ watlas: watlas, overwrite: true, texcoord: 0,
813
+ weights: prims.map(({ prim, scale }) => scale * (faces.has(prim) ? faceScale : 1)),
814
+ });
815
+ }
816
+ else {
817
+ await doc.transform((0, functions_1.unwrap)({ watlas: watlas, overwrite: true, groupBy: 'scene' }));
818
+ }
819
+ const texSize = Math.max(128, texCap >> level); // halve per level, like a mip chain
820
+ const b = await (0, bakeTexture_1.bakeMaterials)(doc, source, texSize);
821
+ (0, faceRegion_1.rejoinFaceSplits)(doc, faceSplits);
822
+ log(`lod: ${w.before} -> ${w.after} tris (target ${target}) rebaked ${texSize}px [${b.slots.join('+')}] (${b.sampled} texels, ${b.far} far)`);
823
+ if (w.face !== undefined)
824
+ log(` face detail: ${w.face.before} -> ${w.face.after} face tris (budget ${w.face.budget}), face charts x${faceScale.toFixed(2)} texel density`);
825
+ textureSizes.push(texSize);
222
826
  }
223
827
  else {
224
- log(`lod: ${r.before} -> ${r.after} tris (target ${target})${missed ? ' ⚠ floored above target' : ''}`);
225
- if (missed)
226
- log(` seam-locked mesh (micro-chart atlas / disconnected islands). Try --bake, raise --simplify-error, or accept the floor.`);
828
+ const r = await (0, simplifyMesh_1.simplifyToTarget)(doc, target, error, lockBorder);
829
+ const missed = r.after > target * 1.15;
830
+ if (missed && weld && level > 0) {
831
+ doc = await io.readBinary(conformedBytes);
832
+ let w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, error);
833
+ // weldedSimplify itself can floor: on a geometrically complex mesh pushed to an aggressive
834
+ // target, meshopt's quadric collapse stops the moment the NEXT edge collapse would exceed
835
+ // `error`, which can mean near-zero reduction at this stage's default (the same `error`
836
+ // budget the plain attempt above already missed with). Real failure: Male Orangekombes and
837
+ // Male Panda Bag 2's LOD2 (target 1500) came back 51812 -> 51812 — completely unreduced, so
838
+ // LOD2 shipped LARGER than LOD0/LOD1. Escalate the error budget — the same relaxation the
839
+ // pilot's own decimate3.mjs scratch tool used by hand (0.05, later found up to 0.2 needed for
840
+ // some meshes) — and retry until the target is met or the ceiling is reached.
841
+ let relaxedError = error;
842
+ while (w.after > target * 1.15 && relaxedError < WELD_FALLBACK_MAX_ERROR) {
843
+ relaxedError = Math.min(WELD_FALLBACK_MAX_ERROR, relaxedError * 2.5);
844
+ doc = await io.readBinary(conformedBytes);
845
+ w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, relaxedError);
846
+ }
847
+ // Belt-and-suspenders floor: whatever error-budget relaxation achieves, a LOD level must
848
+ // never ship with MORE triangles than the level before it (the actual defect: LOD2 > LOD0).
849
+ // Re-target from the PREVIOUS level's own already-simplified geometry when that happens —
850
+ // meshopt's simplify never increases triangle count, so decimating an already-lower-poly mesh
851
+ // can only tie or improve on it, guaranteeing a monotonically non-increasing LOD chain by
852
+ // construction regardless of how this mesh behaves under any error budget.
853
+ const previousLodTris = level > 0 ? sceneTris(preKtxLods[level - 1]).reduce((a, b) => a + b, 0) : Infinity;
854
+ if (w.after > previousLodTris) {
855
+ const previousBytes = await io.writeBinary(preKtxLods[level - 1]);
856
+ doc = await io.readBinary(previousBytes);
857
+ w = await (0, weldedSimplify_1.weldedSimplify)(doc, target, WELD_FALLBACK_MAX_ERROR);
858
+ log(`lod: retargeted from LOD${level - 1}'s own geometry (${previousLodTris} tris) — seam-weld fallback still exceeded it`);
859
+ }
860
+ log(`lod: ${w.before} -> ${w.after} tris (target ${target}) seam-weld fallback${relaxedError !== error ? ` (error ${relaxedError.toFixed(3)})` : ''}, uv-coherent ${(w.uvCoherence * 100).toFixed(0)}%`);
861
+ if (w.after > target * 1.15)
862
+ log(` ⚠ floored above target even after seam-weld relaxation`);
863
+ }
864
+ else {
865
+ log(`lod: ${r.before} -> ${r.after} tris (target ${target})${missed ? ' ⚠ floored above target' : ''}`);
866
+ if (missed)
867
+ log(` seam-locked mesh (micro-chart atlas / disconnected islands). Try --bake, raise --simplify-error, or accept the floor.`);
868
+ }
869
+ await repairLodBridges(doc, level);
870
+ const resized = await (0, resizeTextures_1.resizeTextures)(doc, texCap);
871
+ if (level === 0 && resized.resized.length > 0)
872
+ log(`resize-textures: ${resized.resized.join('; ')}`);
227
873
  }
228
- const resized = await (0, resizeTextures_1.resizeTextures)(doc, texCap);
229
- if (level === 0 && resized.resized.length > 0)
230
- log(`resize-textures: ${resized.resized.join('; ')}`);
874
+ preKtxLods.push(await io.readBinary(await io.writeBinary(doc)));
875
+ if (ktx2Enabled) {
876
+ const ktx = await (0, ktx2_1.encodeKtx2)(doc, { mode: modeFor(level), ...(opts.ktxQuality !== undefined && { quality: opts.ktxQuality }) });
877
+ const before = ktx.encoded.reduce((s, e) => s + e.before, 0), after = ktx.encoded.reduce((s, e) => s + e.after, 0);
878
+ ktxBefore += before;
879
+ ktxAfter += after;
880
+ encoder = ktx.encoder;
881
+ log(`ktx2 lod${level} (${ktx.mode}, ${ktx.encoder}): ${ktx.encoded.length} texture(s), ${kb(before)}KB -> ${kb(after)}KB`);
882
+ }
883
+ else if (level === 0) {
884
+ log('ktx2: skipped (ktx2: false) — textures stay png/jpeg');
885
+ }
886
+ lods.push(doc);
231
887
  }
232
- const ktx = await (0, ktx2_1.encodeKtx2)(doc, { mode: modeFor(level), ...(opts.ktxQuality !== undefined && { quality: opts.ktxQuality }) });
233
- const before = ktx.encoded.reduce((s, e) => s + e.before, 0), after = ktx.encoded.reduce((s, e) => s + e.after, 0);
234
- ktxBefore += before;
235
- ktxAfter += after;
236
- encoder = ktx.encoder;
237
- log(`ktx2 lod${level} (${ktx.mode}, ${ktx.encoder}): ${ktx.encoded.length} texture(s), ${kb(before)}KB -> ${kb(after)}KB`);
238
- lods.push(doc);
239
- }
240
- if (!bake)
241
- textureSizes.push(texCap);
242
- const merged = await (0, mergeLods_1.mergeLods)(lods);
243
- log(`merge-lods: ${lods.length} LODs -> scenes [${merged.scenes.join(', ')}], textures ${merged.texturesBefore} -> ${merged.texturesAfter}`);
244
- const out = merged.document;
245
- // AFTER merge-lods: its material dedup would fold the face's cloned material back into the body's.
246
- if (opts.splitFace ?? true) {
247
- const s = (0, splitFacePrimitive_1.splitFacePrimitive)(out);
248
- if (s.split)
249
- log(`split-face: ${s.faceTris} head tris -> 'FaceMesh' per level (${s.headJoints} head-subtree joints), bodies keep ${s.bodyTris}`);
250
- else
251
- log(`⚠ split-face: no head-weighted triangles found — first-person mode cannot hide this character's head`);
888
+ if (!bake)
889
+ textureSizes.push(texCap);
890
+ const merged = await (0, mergeLods_1.mergeLods)(lods);
891
+ log(`merge-lods: ${lods.length} LODs -> scenes [${merged.scenes.join(', ')}], textures ${merged.texturesBefore} -> ${merged.texturesAfter}`);
892
+ const packaged = merged.document;
893
+ // AFTER merge-lods: its material dedup would fold the face's cloned material back into the body's.
894
+ if (opts.splitFace ?? true) {
895
+ const s = (0, splitFacePrimitive_1.splitFacePrimitive)(packaged);
896
+ if (s.split)
897
+ log(`split-face: ${s.faceTris} head tris -> 'FaceMesh' per level (${s.headJoints} head-subtree joints), bodies keep ${s.bodyTris}`);
898
+ else
899
+ log(`⚠ split-face: no head-weighted triangles found — first-person mode cannot hide this character's head`);
900
+ }
901
+ if (maxMaterials !== undefined) {
902
+ // The rebake route re-unwraps and re-bakes every LOD into its OWN atlas, so a lower LOD's UVs only make sense
903
+ // against its own texture: unify within each LOD scene, never across them (see `shareAcrossScenes`).
904
+ const unified = await (0, unifyMaterial_1.unifyDominantMaterial)(packaged, { maxMaterials, shareAcrossScenes: !bake });
905
+ if (unified.dominant !== null) {
906
+ log(`unify-material: ${unified.materialsBefore} -> ${unified.materialsAfter} materials (over the ${maxMaterials}-material cap) — rebound ${unified.rebound} primitive(s) onto '${unified.dominant}'`);
907
+ if (unified.cutoutsPromoted > 0)
908
+ log(` unify-material: kept the alpha cutout of ${unified.cutoutsPromoted} primitive(s) by promoting the shared atlas material to MASK`);
909
+ if (unified.cutoutsFlattened > 0)
910
+ log(`⚠ unify-material: ${unified.cutoutsFlattened} cutout/blend primitive(s) were folded into an opaque material that does not share their texture — they now draw SOLID (stitching/lace/mesh panels will look like slabs); raise the material cap or fix the source`);
911
+ if (unified.crossSceneFallback)
912
+ log(`⚠ unify-material: one material per LOD still exceeds the ${maxMaterials}-material cap, so lower LODs were rebound onto another LOD's material${bake ? ' — on the rebake route their UVs index a DIFFERENT atlas, so they will sample the wrong texels' : ''}`);
913
+ const joined = (0, joinPerMesh_1.joinPrimitivesPerMesh)(packaged);
914
+ if (joined.meshesJoined > 0)
915
+ log(`join-per-mesh: ${joined.primitivesBefore} -> ${joined.primitivesAfter} primitives across ${joined.meshesJoined} LOD mesh(es)`);
916
+ }
917
+ }
918
+ return packaged;
919
+ };
920
+ if (slotBudget !== null) {
921
+ log(`slot budget: ${slotBudget.slotType} ${slotBudget.tiered ? '' : '(untiered → flat add-on ceiling) '}`
922
+ + `≤ ${slotBudget.maxTriangles} tris combined across LODs, ≤ ${slotBudget.maxMaterials} material(s), ≤ ${slotBudget.maxTextureEdge}px`
923
+ + ` — LOD targets ${lodTris.join('/')}${explicitLodTris ? ' (explicit)' : ' (slot-aware)'}`);
924
+ }
925
+ let targets = lodTris;
926
+ let out;
927
+ for (let attempt = 1;; attempt++) {
928
+ out = await packageLevels(targets);
929
+ if (slotBudget === null)
930
+ break;
931
+ const combined = sceneTris(out).reduce((sum, tris) => sum + tris, 0);
932
+ if (combined <= slotBudget.maxTriangles) {
933
+ log(`slot budget: ${combined} tris combined ≤ ${slotBudget.maxTriangles} (${slotBudget.slotType})`);
934
+ break;
935
+ }
936
+ const over = `${combined} tris combined across LODs is over ${slotBudget.slotType}'s ${slotBudget.maxTriangles} ceiling (the server refuses this at publish)`;
937
+ if (explicitLodTris)
938
+ throw new Error(`character import: ${over} — the explicit LOD targets ${lodTris.join('/')} are too high for this slot; lower them or omit them to use the slot-aware ladder`);
939
+ if (attempt >= MAX_BUDGET_ATTEMPTS)
940
+ throw new Error(`character import: ${over} after ${attempt} rescaled attempts — this mesh floors above its slot's budget (try bake: true or a higher simplify error)`);
941
+ const scale = (slotBudget.maxTriangles * slotBudgets_1.LOD_BUDGET_HEADROOM) / combined;
942
+ targets = targets.map((tris) => Math.max(1, Math.floor(tris * scale)));
943
+ log(`slot budget: ${over} — rescaling LOD targets ×${scale.toFixed(3)} to ${targets.join('/')} and re-packaging`);
944
+ }
945
+ const materialCount = out.getRoot().listMaterials().length;
946
+ if (slotBudget !== null && materialCount > slotBudget.maxMaterials) {
947
+ throw new Error(`character import: ${materialCount} materials is over ${slotBudget.slotType}'s ${slotBudget.maxMaterials}-material ceiling after unify-material`);
252
948
  }
253
949
  assertSkinnedLods(out); // every LOD must still be a valid, non-empty skinned mesh
950
+ (0, mergeLods_1.assertSelfContainedLodScenes)(out); // …and loadable: each scene's skins bind to bones in that scene (see mergeLods)
254
951
  await out.transform((0, functions_1.prune)({ keepSolidTextures: true }));
255
- const modes = lodTris.map((_, level) => modeFor(level));
952
+ // Pose-aware fit (add-ons only), on the PACKAGED document so every LOD level is fitted and the gate judges
953
+ // exactly what ships. Runs after the LOD merge on purpose: decimating a fitted LOD0 would reintroduce the
954
+ // coarse chords that cut into the body, which is most of what the fit exists to fix.
955
+ let poseFitReport = null;
956
+ if (rigScope === 'addon' && opts.poseFit && canonicalPath !== null) {
957
+ poseFitReport = (0, poseAwareFit_1.poseAwareFit)(out, await io.read(canonicalPath), { ...opts.poseFit, onProgress: opts.poseFit.onProgress ?? log });
958
+ log(`pose-fit: ${poseFitReport.outcome}${poseFitReport.reason ? ` — ${poseFitReport.reason}` : ''}`);
959
+ }
960
+ const geometryBounds = assertCanonicalCharacterGeometry(out, rigScope);
961
+ log(`geometry: canonical ${rigScope} bounds ${geometryBounds.size.map((value) => value.toFixed(3)).join(' x ')}m`);
962
+ const face = opts.faceMap !== undefined ? (0, faceManifest_1.readFaceManifest)(opts.faceMap) : (0, faceManifest_1.detectFaceManifest)(out);
963
+ (0, faceManifest_1.attachFaceManifest)(out, face);
964
+ const faceMode = (0, faceManifest_1.faceCapability)(face);
965
+ log(`face: ${faceMode}${opts.faceMap !== undefined ? ` (explicit ${(0, node_path_1.basename)(opts.faceMap)})` : ' (safe-name detection)'}`);
966
+ const palette = opts.palette === undefined
967
+ ? null
968
+ : (0, helixPalette_1.applyHelixPaletteSelection)(out, (0, helixPalette_1.resolveHelixPaletteSelection)(opts.palette.path, opts.palette.selection));
969
+ if (palette !== null) {
970
+ log(`palette: ${palette.familyId}@${palette.familyVersion} -> ${palette.appliedMaterialCount} material(s) `
971
+ + `(authored textures preserved; assets ${palette.assetsState})`);
972
+ }
973
+ const modes = ktx2Enabled ? lodTris.map((_, level) => modeFor(level)) : [];
256
974
  const bodyPath = (0, node_path_1.join)(outDir, `${name}.web.glb`);
257
975
  await io.write(bodyPath, out);
258
- log(`\npackage: ${(0, node_path_1.basename)(opts.body)} -> ${bodyPath} | LOD tris ${sceneTris(out).join(' / ')} | ${texCap}px KTX2 (${modes.join('/')})`);
976
+ log(`\npackage: ${(0, node_path_1.basename)(opts.body)} -> ${bodyPath} | LOD tris ${sceneTris(out).join(' / ')} | ${texCap}px ${ktx2Enabled ? `KTX2 (${modes.join('/')})` : 'png/jpeg (ktx2 skipped)'}`);
259
977
  // 4. Optional clip retarget (the engine retarget-clip-cli flow) — works on the RAW source anim + map.
260
978
  let clip = null;
261
979
  if (opts.anim !== undefined) {
@@ -269,25 +987,84 @@ async function importCharacter(opts) {
269
987
  log(` ${r.frames} frames · ${r.meta.duration}s · ${r.animatedBones.length} animated bones: ${r.animatedBones.join(', ')}`);
270
988
  // Merge into clip-meta.json (so it can be loaded like the platform clip set).
271
989
  const metaPath = (0, node_path_1.join)(animsDir, 'clip-meta.json');
272
- let metas = [];
273
- try {
274
- metas = JSON.parse((0, node_fs_1.readFileSync)(metaPath, 'utf8'));
275
- }
276
- catch { /* fresh */ }
277
- metas = metas.filter((m) => m.name !== r.meta.name);
278
- metas.push(r.meta);
279
- (0, node_fs_1.writeFileSync)(metaPath, JSON.stringify(metas, null, 2));
990
+ mergeClipMeta(metaPath, r.meta);
280
991
  log(` clip-meta -> ${metaPath}`);
281
992
  clip = { name: clipName, path: clipPath, metaPath, frames: r.frames, duration: r.meta.duration, animatedBones: r.animatedBones };
282
993
  }
994
+ const outputBytes = (0, node_fs_1.readFileSync)(bodyPath);
995
+ const receiptPath = (0, node_path_1.join)(outDir, `${name}.avatar-import.json`);
996
+ (0, node_fs_1.writeFileSync)(receiptPath, JSON.stringify({
997
+ contract: 'helix/avatar-import-receipt@1',
998
+ source: {
999
+ file: (0, node_path_1.basename)(opts.body),
1000
+ sha256: prepared.original.sha256,
1001
+ sizeBytes: prepared.original.sizeBytes,
1002
+ counts: preflight.counts,
1003
+ provenance,
1004
+ },
1005
+ output: {
1006
+ file: (0, node_path_1.basename)(bodyPath),
1007
+ sha256: (0, node_crypto_1.createHash)('sha256').update(outputBytes).digest('hex'),
1008
+ sizeBytes: outputBytes.length,
1009
+ skeleton: 'helix-humanoid@1',
1010
+ face: { capability: faceMode, manifest: face },
1011
+ lodTriangles: sceneTris(out),
1012
+ },
1013
+ transforms: {
1014
+ boneMap: { name: boneMap.name, version: boneMap.version },
1015
+ retargetedBones: Object.keys(ret.renamed).length,
1016
+ conformed: { mode: conf.mode, unitScale: conf.unitScale, restAimed: conf.restAimed, verticesProcessed: conf.verticesProcessed, jointsRebuilt: conf.jointsRebuilt },
1017
+ textureSizes,
1018
+ ktx2: { encoder, modes, before: ktxBefore, after: ktxAfter },
1019
+ splitFace: opts.splitFace ?? true,
1020
+ unrealMaterialSidecar: prepared.materialSidecar === null ? null : {
1021
+ schemaVersion: prepared.materialSidecar.schemaVersion,
1022
+ file: (0, node_path_1.basename)(prepared.materialSidecar.sidecarPath),
1023
+ sourceMeshAssetPath: prepared.materialSidecar.sourceMeshAssetPath,
1024
+ appliedSlots: prepared.materialSidecar.appliedSlots,
1025
+ preservedMaterialCount: prepared.materialSidecar.preservedMaterialCount,
1026
+ verifiedTextureCount: prepared.materialSidecar.verifiedTextureCount,
1027
+ createdTextureCount: prepared.materialSidecar.createdTextureCount,
1028
+ },
1029
+ helixPalette: palette,
1030
+ limbBridges: limbBridgeReport === null ? null : {
1031
+ mode: limbBridgeReport.mode,
1032
+ removedTriangles: limbBridgeReport.removedTriangles,
1033
+ fillTriangles: limbBridgeReport.fillTriangles,
1034
+ verticesReweighted: limbBridgeReport.verticesReweighted,
1035
+ units: limbBridgeReport.units.filter((u) => u.bridgeTriangles > 0 || u.reassignedPieces.length > 0).map((u) => ({
1036
+ mesh: u.mesh, bridgeTriangles: u.bridgeTriangles, outcome: u.outcome, reason: u.reason,
1037
+ clusters: u.clusters.map((c) => ({ arm: c.arm, leg: c.leg, triangles: c.triangles, refused: c.refused })),
1038
+ stretchBefore: u.stretchBefore, stretchAfter: u.stretchAfter,
1039
+ })),
1040
+ },
1041
+ pushOut: pushOutReport,
1042
+ poseFit: poseFitReport === null ? null : {
1043
+ outcome: poseFitReport.outcome,
1044
+ reason: poseFitReport.reason,
1045
+ settings: poseFitReport.settings,
1046
+ before: poseFitReport.before && { totalViolations: poseFitReport.before.totalViolations, totalExposedViolations: poseFitReport.before.totalExposedViolations },
1047
+ after: poseFitReport.after && { totalViolations: poseFitReport.after.totalViolations, totalExposedViolations: poseFitReport.after.totalExposedViolations },
1048
+ applied: poseFitReport.applied,
1049
+ },
1050
+ },
1051
+ limits: untrustedSource_1.CHARACTER_SOURCE_LIMITS,
1052
+ }, null, 2));
1053
+ log(`receipt: ${receiptPath}`);
283
1054
  return {
284
1055
  bodyPath,
285
1056
  lodTris: sceneTris(out),
286
1057
  textureSizes,
287
1058
  retarget: { renamed: Object.keys(ret.renamed).length, unmapped: ret.unmapped, dropped: ret.dropped },
288
- conform: { mode: conf.mode, verticesProcessed: conf.verticesProcessed, jointsRebuilt: conf.jointsRebuilt },
1059
+ conform: { mode: conf.mode, unitScale: conf.unitScale, restAimed: conf.restAimed, verticesProcessed: conf.verticesProcessed, jointsRebuilt: conf.jointsRebuilt },
289
1060
  ktx2: { encoder, modes, before: ktxBefore, after: ktxAfter },
290
1061
  clip,
1062
+ receiptPath,
1063
+ face: { capability: faceMode, manifest: face },
1064
+ palette,
1065
+ limbBridges: limbBridgeReport,
1066
+ pushOut: pushOutReport,
1067
+ poseFit: poseFitReport,
291
1068
  };
292
1069
  }
293
1070
  //# sourceMappingURL=importCharacter.js.map